OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "extensions/renderer/guest_view/mime_handler_view/mime_handler_view_con tainer.h" | 5 #include "extensions/renderer/guest_view/mime_handler_view/mime_handler_view_con tainer.h" |
6 | 6 |
7 #include <map> | |
8 #include <set> | |
9 | |
7 #include "content/public/renderer/render_frame.h" | 10 #include "content/public/renderer/render_frame.h" |
8 #include "content/public/renderer/render_view.h" | 11 #include "content/public/renderer/render_view.h" |
12 #include "content/public/renderer/v8_value_converter.h" | |
9 #include "extensions/common/extension_messages.h" | 13 #include "extensions/common/extension_messages.h" |
10 #include "extensions/common/guest_view/guest_view_constants.h" | 14 #include "extensions/common/guest_view/guest_view_constants.h" |
11 #include "gin/arguments.h" | 15 #include "gin/arguments.h" |
12 #include "gin/dictionary.h" | 16 #include "gin/dictionary.h" |
13 #include "gin/handle.h" | 17 #include "gin/handle.h" |
14 #include "gin/interceptor.h" | 18 #include "gin/interceptor.h" |
15 #include "gin/object_template_builder.h" | 19 #include "gin/object_template_builder.h" |
16 #include "gin/wrappable.h" | 20 #include "gin/wrappable.h" |
17 #include "third_party/WebKit/public/web/WebDocument.h" | 21 #include "third_party/WebKit/public/web/WebDocument.h" |
18 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 22 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
63 return gin::Wrappable<ScriptableObject>::GetObjectTemplateBuilder(isolate) | 67 return gin::Wrappable<ScriptableObject>::GetObjectTemplateBuilder(isolate) |
64 .AddNamedPropertyInterceptor(); | 68 .AddNamedPropertyInterceptor(); |
65 } | 69 } |
66 | 70 |
67 base::WeakPtr<MimeHandlerViewContainer> container_; | 71 base::WeakPtr<MimeHandlerViewContainer> container_; |
68 }; | 72 }; |
69 | 73 |
70 // static | 74 // static |
71 gin::WrapperInfo ScriptableObject::kWrapperInfo = { gin::kEmbedderNativeGin }; | 75 gin::WrapperInfo ScriptableObject::kWrapperInfo = { gin::kEmbedderNativeGin }; |
72 | 76 |
77 base::LazyInstance< | |
raymes
2015/01/22 00:58:57
Please add a comment about what this tracks
Sam McNally
2015/01/22 03:23:29
Done.
| |
78 std::map<content::RenderFrame*, std::set<MimeHandlerViewContainer*>>> | |
79 g_mime_handler_view_container_map = LAZY_INSTANCE_INITIALIZER; | |
80 | |
73 } // namespace | 81 } // namespace |
74 | 82 |
75 MimeHandlerViewContainer::MimeHandlerViewContainer( | 83 MimeHandlerViewContainer::MimeHandlerViewContainer( |
76 content::RenderFrame* render_frame, | 84 content::RenderFrame* render_frame, |
77 const std::string& mime_type, | 85 const std::string& mime_type, |
78 const GURL& original_url) | 86 const GURL& original_url) |
79 : GuestViewContainer(render_frame), | 87 : GuestViewContainer(render_frame), |
80 mime_type_(mime_type), | 88 mime_type_(mime_type), |
81 original_url_(original_url), | 89 original_url_(original_url), |
82 guest_proxy_routing_id_(-1), | 90 guest_proxy_routing_id_(-1), |
83 guest_loaded_(false), | 91 guest_loaded_(false), |
84 weak_factory_(this) { | 92 weak_factory_(this) { |
85 DCHECK(!mime_type_.empty()); | 93 DCHECK(!mime_type_.empty()); |
86 is_embedded_ = !render_frame->GetWebFrame()->document().isPluginDocument(); | 94 is_embedded_ = !render_frame->GetWebFrame()->document().isPluginDocument(); |
95 g_mime_handler_view_container_map.Get()[render_frame].insert(this); | |
87 } | 96 } |
88 | 97 |
89 MimeHandlerViewContainer::~MimeHandlerViewContainer() { | 98 MimeHandlerViewContainer::~MimeHandlerViewContainer() { |
90 if (loader_) | 99 if (loader_) |
91 loader_->cancel(); | 100 loader_->cancel(); |
101 | |
102 g_mime_handler_view_container_map.Get()[render_frame()].erase(this); | |
103 if (g_mime_handler_view_container_map.Get()[render_frame()].empty()) | |
104 g_mime_handler_view_container_map.Get().erase(render_frame()); | |
105 } | |
106 | |
107 // static | |
108 std::vector<MimeHandlerViewContainer*> | |
109 MimeHandlerViewContainer::FromRenderFrame(content::RenderFrame* render_frame) { | |
110 auto it = g_mime_handler_view_container_map.Get().find(render_frame); | |
111 if (it == g_mime_handler_view_container_map.Get().end()) | |
112 return std::vector<MimeHandlerViewContainer*>(); | |
113 | |
114 return std::vector<MimeHandlerViewContainer*>(it->second.begin(), | |
115 it->second.end()); | |
92 } | 116 } |
93 | 117 |
94 void MimeHandlerViewContainer::Ready() { | 118 void MimeHandlerViewContainer::Ready() { |
95 blink::WebFrame* frame = render_frame()->GetWebFrame(); | 119 blink::WebFrame* frame = render_frame()->GetWebFrame(); |
96 blink::WebURLLoaderOptions options; | 120 blink::WebURLLoaderOptions options; |
97 // The embedded plugin is allowed to be cross-origin. | 121 // The embedded plugin is allowed to be cross-origin. |
98 options.crossOriginRequestPolicy = | 122 options.crossOriginRequestPolicy = |
99 blink::WebURLLoaderOptions::CrossOriginRequestPolicyAllow; | 123 blink::WebURLLoaderOptions::CrossOriginRequestPolicyAllow; |
100 DCHECK(!loader_); | 124 DCHECK(!loader_); |
101 loader_.reset(frame->createAssociatedURLLoader(options)); | 125 loader_.reset(frame->createAssociatedURLLoader(options)); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
184 // should already know what is embedded. | 208 // should already know what is embedded. |
185 gin::StringToV8(isolate, "*") | 209 gin::StringToV8(isolate, "*") |
186 }; | 210 }; |
187 guest_proxy_frame->callFunctionEvenIfScriptDisabled( | 211 guest_proxy_frame->callFunctionEvenIfScriptDisabled( |
188 post_message.As<v8::Function>(), | 212 post_message.As<v8::Function>(), |
189 guest_proxy_window, | 213 guest_proxy_window, |
190 arraysize(args), | 214 arraysize(args), |
191 args); | 215 args); |
192 } | 216 } |
193 | 217 |
218 void MimeHandlerViewContainer::PostMessageFromValue( | |
219 const base::Value& message) { | |
220 blink::WebFrame* frame = render_frame()->GetWebFrame(); | |
221 if (!frame) | |
222 return; | |
223 | |
224 v8::Isolate* isolate = v8::Isolate::GetCurrent(); | |
225 v8::HandleScope handle_scope(isolate); | |
226 v8::Context::Scope context_scope(frame->mainWorldScriptContext()); | |
227 scoped_ptr<content::V8ValueConverter> converter( | |
228 content::V8ValueConverter::create()); | |
229 PostMessage(isolate, | |
230 converter->ToV8Value(&message, frame->mainWorldScriptContext())); | |
raymes
2015/01/22 00:58:57
nit: maybe make this a function (and reuse it in O
| |
231 } | |
232 | |
194 void MimeHandlerViewContainer::OnCreateMimeHandlerViewGuestACK( | 233 void MimeHandlerViewContainer::OnCreateMimeHandlerViewGuestACK( |
195 int element_instance_id) { | 234 int element_instance_id) { |
196 DCHECK_NE(this->element_instance_id(), guestview::kInstanceIDNone); | 235 DCHECK_NE(this->element_instance_id(), guestview::kInstanceIDNone); |
197 DCHECK_EQ(this->element_instance_id(), element_instance_id); | 236 DCHECK_EQ(this->element_instance_id(), element_instance_id); |
198 render_frame()->AttachGuest(element_instance_id); | 237 render_frame()->AttachGuest(element_instance_id); |
199 } | 238 } |
200 | 239 |
201 void MimeHandlerViewContainer::OnGuestAttached(int /* unused */, | 240 void MimeHandlerViewContainer::OnGuestAttached(int /* unused */, |
202 int guest_proxy_routing_id) { | 241 int guest_proxy_routing_id) { |
203 // Save the RenderView routing ID of the guest here so it can be used to route | 242 // Save the RenderView routing ID of the guest here so it can be used to route |
(...skipping 24 matching lines...) Expand all Loading... | |
228 void MimeHandlerViewContainer::CreateMimeHandlerViewGuest() { | 267 void MimeHandlerViewContainer::CreateMimeHandlerViewGuest() { |
229 // The loader has completed loading |view_id_| so we can dispose it. | 268 // The loader has completed loading |view_id_| so we can dispose it. |
230 loader_.reset(); | 269 loader_.reset(); |
231 | 270 |
232 DCHECK_NE(element_instance_id(), guestview::kInstanceIDNone); | 271 DCHECK_NE(element_instance_id(), guestview::kInstanceIDNone); |
233 render_frame()->Send(new ExtensionHostMsg_CreateMimeHandlerViewGuest( | 272 render_frame()->Send(new ExtensionHostMsg_CreateMimeHandlerViewGuest( |
234 render_frame()->GetRoutingID(), view_id_, element_instance_id())); | 273 render_frame()->GetRoutingID(), view_id_, element_instance_id())); |
235 } | 274 } |
236 | 275 |
237 } // namespace extensions | 276 } // namespace extensions |
OLD | NEW |