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/browser/guest_view/mime_handler_view/mime_handler_view_cons
tants.h" | 13 #include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_cons
tants.h" |
10 #include "extensions/common/extension_messages.h" | 14 #include "extensions/common/extension_messages.h" |
11 #include "extensions/common/guest_view/guest_view_constants.h" | 15 #include "extensions/common/guest_view/guest_view_constants.h" |
12 #include "gin/arguments.h" | 16 #include "gin/arguments.h" |
13 #include "gin/dictionary.h" | 17 #include "gin/dictionary.h" |
14 #include "gin/handle.h" | 18 #include "gin/handle.h" |
15 #include "gin/interceptor.h" | 19 #include "gin/interceptor.h" |
16 #include "gin/object_template_builder.h" | 20 #include "gin/object_template_builder.h" |
17 #include "gin/wrappable.h" | 21 #include "gin/wrappable.h" |
18 #include "third_party/WebKit/public/web/WebDocument.h" | 22 #include "third_party/WebKit/public/web/WebDocument.h" |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 return gin::Wrappable<ScriptableObject>::GetObjectTemplateBuilder(isolate) | 68 return gin::Wrappable<ScriptableObject>::GetObjectTemplateBuilder(isolate) |
65 .AddNamedPropertyInterceptor(); | 69 .AddNamedPropertyInterceptor(); |
66 } | 70 } |
67 | 71 |
68 base::WeakPtr<MimeHandlerViewContainer> container_; | 72 base::WeakPtr<MimeHandlerViewContainer> container_; |
69 }; | 73 }; |
70 | 74 |
71 // static | 75 // static |
72 gin::WrapperInfo ScriptableObject::kWrapperInfo = { gin::kEmbedderNativeGin }; | 76 gin::WrapperInfo ScriptableObject::kWrapperInfo = { gin::kEmbedderNativeGin }; |
73 | 77 |
| 78 // Maps from content::RenderFrame to the set of MimeHandlerViewContainers within |
| 79 // it. |
| 80 base::LazyInstance< |
| 81 std::map<content::RenderFrame*, std::set<MimeHandlerViewContainer*>>> |
| 82 g_mime_handler_view_container_map = LAZY_INSTANCE_INITIALIZER; |
| 83 |
74 } // namespace | 84 } // namespace |
75 | 85 |
76 MimeHandlerViewContainer::MimeHandlerViewContainer( | 86 MimeHandlerViewContainer::MimeHandlerViewContainer( |
77 content::RenderFrame* render_frame, | 87 content::RenderFrame* render_frame, |
78 const std::string& mime_type, | 88 const std::string& mime_type, |
79 const GURL& original_url) | 89 const GURL& original_url) |
80 : GuestViewContainer(render_frame), | 90 : GuestViewContainer(render_frame), |
81 mime_type_(mime_type), | 91 mime_type_(mime_type), |
82 original_url_(original_url), | 92 original_url_(original_url), |
83 guest_proxy_routing_id_(-1), | 93 guest_proxy_routing_id_(-1), |
84 guest_loaded_(false), | 94 guest_loaded_(false), |
85 weak_factory_(this) { | 95 weak_factory_(this) { |
86 DCHECK(!mime_type_.empty()); | 96 DCHECK(!mime_type_.empty()); |
87 is_embedded_ = !render_frame->GetWebFrame()->document().isPluginDocument(); | 97 is_embedded_ = !render_frame->GetWebFrame()->document().isPluginDocument(); |
| 98 g_mime_handler_view_container_map.Get()[render_frame].insert(this); |
88 } | 99 } |
89 | 100 |
90 MimeHandlerViewContainer::~MimeHandlerViewContainer() { | 101 MimeHandlerViewContainer::~MimeHandlerViewContainer() { |
91 if (loader_) | 102 if (loader_) |
92 loader_->cancel(); | 103 loader_->cancel(); |
| 104 |
| 105 g_mime_handler_view_container_map.Get()[render_frame()].erase(this); |
| 106 if (g_mime_handler_view_container_map.Get()[render_frame()].empty()) |
| 107 g_mime_handler_view_container_map.Get().erase(render_frame()); |
| 108 } |
| 109 |
| 110 // static |
| 111 std::vector<MimeHandlerViewContainer*> |
| 112 MimeHandlerViewContainer::FromRenderFrame(content::RenderFrame* render_frame) { |
| 113 auto it = g_mime_handler_view_container_map.Get().find(render_frame); |
| 114 if (it == g_mime_handler_view_container_map.Get().end()) |
| 115 return std::vector<MimeHandlerViewContainer*>(); |
| 116 |
| 117 return std::vector<MimeHandlerViewContainer*>(it->second.begin(), |
| 118 it->second.end()); |
93 } | 119 } |
94 | 120 |
95 void MimeHandlerViewContainer::Ready() { | 121 void MimeHandlerViewContainer::Ready() { |
96 blink::WebFrame* frame = render_frame()->GetWebFrame(); | 122 blink::WebFrame* frame = render_frame()->GetWebFrame(); |
97 blink::WebURLLoaderOptions options; | 123 blink::WebURLLoaderOptions options; |
98 // The embedded plugin is allowed to be cross-origin. | 124 // The embedded plugin is allowed to be cross-origin. |
99 options.crossOriginRequestPolicy = | 125 options.crossOriginRequestPolicy = |
100 blink::WebURLLoaderOptions::CrossOriginRequestPolicyAllow; | 126 blink::WebURLLoaderOptions::CrossOriginRequestPolicyAllow; |
101 DCHECK(!loader_); | 127 DCHECK(!loader_); |
102 loader_.reset(frame->createAssociatedURLLoader(options)); | 128 loader_.reset(frame->createAssociatedURLLoader(options)); |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 // should already know what is embedded. | 216 // should already know what is embedded. |
191 gin::StringToV8(isolate, "*") | 217 gin::StringToV8(isolate, "*") |
192 }; | 218 }; |
193 guest_proxy_frame->callFunctionEvenIfScriptDisabled( | 219 guest_proxy_frame->callFunctionEvenIfScriptDisabled( |
194 post_message.As<v8::Function>(), | 220 post_message.As<v8::Function>(), |
195 guest_proxy_window, | 221 guest_proxy_window, |
196 arraysize(args), | 222 arraysize(args), |
197 args); | 223 args); |
198 } | 224 } |
199 | 225 |
| 226 void MimeHandlerViewContainer::PostMessageFromValue( |
| 227 const base::Value& message) { |
| 228 blink::WebFrame* frame = render_frame()->GetWebFrame(); |
| 229 if (!frame) |
| 230 return; |
| 231 |
| 232 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 233 v8::HandleScope handle_scope(isolate); |
| 234 v8::Context::Scope context_scope(frame->mainWorldScriptContext()); |
| 235 scoped_ptr<content::V8ValueConverter> converter( |
| 236 content::V8ValueConverter::create()); |
| 237 PostMessage(isolate, |
| 238 converter->ToV8Value(&message, frame->mainWorldScriptContext())); |
| 239 } |
| 240 |
200 void MimeHandlerViewContainer::OnCreateMimeHandlerViewGuestACK( | 241 void MimeHandlerViewContainer::OnCreateMimeHandlerViewGuestACK( |
201 int element_instance_id) { | 242 int element_instance_id) { |
202 DCHECK_NE(this->element_instance_id(), guestview::kInstanceIDNone); | 243 DCHECK_NE(this->element_instance_id(), guestview::kInstanceIDNone); |
203 DCHECK_EQ(this->element_instance_id(), element_instance_id); | 244 DCHECK_EQ(this->element_instance_id(), element_instance_id); |
204 | 245 |
205 if (!render_frame()) | 246 if (!render_frame()) |
206 return; | 247 return; |
207 | 248 |
208 render_frame()->AttachGuest(element_instance_id); | 249 render_frame()->AttachGuest(element_instance_id); |
209 } | 250 } |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 if (!render_frame()) | 288 if (!render_frame()) |
248 return; | 289 return; |
249 | 290 |
250 render_frame()->Send(new ExtensionHostMsg_CreateMimeHandlerViewGuest( | 291 render_frame()->Send(new ExtensionHostMsg_CreateMimeHandlerViewGuest( |
251 render_frame()->GetRoutingID(), | 292 render_frame()->GetRoutingID(), |
252 view_id_, element_instance_id(), | 293 view_id_, element_instance_id(), |
253 element_size_)); | 294 element_size_)); |
254 } | 295 } |
255 | 296 |
256 } // namespace extensions | 297 } // namespace extensions |
OLD | NEW |