Chromium Code Reviews| Index: extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.cc |
| diff --git a/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.cc b/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.cc |
| index a7c19b211f5f65efbf0dc4c2eb20f59f8e602e2e..9d7c40d50b742139acddda743b405f090ba8cf34 100644 |
| --- a/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.cc |
| +++ b/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.cc |
| @@ -4,8 +4,12 @@ |
| #include "extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.h" |
| +#include <map> |
| +#include <set> |
| + |
| #include "content/public/renderer/render_frame.h" |
| #include "content/public/renderer/render_view.h" |
| +#include "content/public/renderer/v8_value_converter.h" |
| #include "extensions/common/extension_messages.h" |
| #include "extensions/common/guest_view/guest_view_constants.h" |
| #include "gin/arguments.h" |
| @@ -70,6 +74,10 @@ class ScriptableObject : public gin::Wrappable<ScriptableObject>, |
| // static |
| gin::WrapperInfo ScriptableObject::kWrapperInfo = { gin::kEmbedderNativeGin }; |
| +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.
|
| + std::map<content::RenderFrame*, std::set<MimeHandlerViewContainer*>>> |
| + g_mime_handler_view_container_map = LAZY_INSTANCE_INITIALIZER; |
| + |
| } // namespace |
| MimeHandlerViewContainer::MimeHandlerViewContainer( |
| @@ -84,11 +92,27 @@ MimeHandlerViewContainer::MimeHandlerViewContainer( |
| weak_factory_(this) { |
| DCHECK(!mime_type_.empty()); |
| is_embedded_ = !render_frame->GetWebFrame()->document().isPluginDocument(); |
| + g_mime_handler_view_container_map.Get()[render_frame].insert(this); |
| } |
| MimeHandlerViewContainer::~MimeHandlerViewContainer() { |
| if (loader_) |
| loader_->cancel(); |
| + |
| + g_mime_handler_view_container_map.Get()[render_frame()].erase(this); |
| + if (g_mime_handler_view_container_map.Get()[render_frame()].empty()) |
| + g_mime_handler_view_container_map.Get().erase(render_frame()); |
| +} |
| + |
| +// static |
| +std::vector<MimeHandlerViewContainer*> |
| +MimeHandlerViewContainer::FromRenderFrame(content::RenderFrame* render_frame) { |
| + auto it = g_mime_handler_view_container_map.Get().find(render_frame); |
| + if (it == g_mime_handler_view_container_map.Get().end()) |
| + return std::vector<MimeHandlerViewContainer*>(); |
| + |
| + return std::vector<MimeHandlerViewContainer*>(it->second.begin(), |
| + it->second.end()); |
| } |
| void MimeHandlerViewContainer::Ready() { |
| @@ -191,6 +215,21 @@ void MimeHandlerViewContainer::PostMessage(v8::Isolate* isolate, |
| args); |
| } |
| +void MimeHandlerViewContainer::PostMessageFromValue( |
| + const base::Value& message) { |
| + blink::WebFrame* frame = render_frame()->GetWebFrame(); |
| + if (!frame) |
| + return; |
| + |
| + v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| + v8::HandleScope handle_scope(isolate); |
| + v8::Context::Scope context_scope(frame->mainWorldScriptContext()); |
| + scoped_ptr<content::V8ValueConverter> converter( |
| + content::V8ValueConverter::create()); |
| + PostMessage(isolate, |
| + converter->ToV8Value(&message, frame->mainWorldScriptContext())); |
|
raymes
2015/01/22 00:58:57
nit: maybe make this a function (and reuse it in O
|
| +} |
| + |
| void MimeHandlerViewContainer::OnCreateMimeHandlerViewGuestACK( |
| int element_instance_id) { |
| DCHECK_NE(this->element_instance_id(), guestview::kInstanceIDNone); |