| 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 |