Chromium Code Reviews| 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 |