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 cdede3d45d67bb34f31870430101b446bf192a2f..0aa6b3ef84a28998124de8510f5944e1fe84df6f 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/browser/guest_view/mime_handler_view/mime_handler_view_constants.h" |
#include "extensions/common/extension_messages.h" |
#include "extensions/common/guest_view/guest_view_constants.h" |
@@ -71,6 +75,12 @@ class ScriptableObject : public gin::Wrappable<ScriptableObject>, |
// static |
gin::WrapperInfo ScriptableObject::kWrapperInfo = { gin::kEmbedderNativeGin }; |
+// Maps from content::RenderFrame to the set of MimeHandlerViewContainers within |
+// it. |
+base::LazyInstance< |
+ std::map<content::RenderFrame*, std::set<MimeHandlerViewContainer*>>> |
+ g_mime_handler_view_container_map = LAZY_INSTANCE_INITIALIZER; |
+ |
} // namespace |
MimeHandlerViewContainer::MimeHandlerViewContainer( |
@@ -85,11 +95,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() { |
@@ -197,6 +223,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())); |
+} |
+ |
void MimeHandlerViewContainer::OnCreateMimeHandlerViewGuestACK( |
int element_instance_id) { |
DCHECK_NE(this->element_instance_id(), guestview::kInstanceIDNone); |