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 1cbe95a796010ccee39e62b0e32e3210eb43dd9b..d18dd66b14e06b8114f2f316b64b679a3a4c55a3 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 |
@@ -81,6 +81,7 @@ MimeHandlerViewContainer::MimeHandlerViewContainer( |
mime_type_(mime_type), |
original_url_(original_url), |
guest_proxy_routing_id_(-1), |
+ guest_loaded_(false), |
weak_factory_(this) { |
DCHECK(!mime_type_.empty()); |
is_embedded_ = !render_frame->GetWebFrame()->document().isPluginDocument(); |
@@ -120,6 +121,8 @@ bool MimeHandlerViewContainer::OnMessageReceived(const IPC::Message& message) { |
IPC_BEGIN_MESSAGE_MAP(MimeHandlerViewContainer, message) |
IPC_MESSAGE_HANDLER(ExtensionMsg_CreateMimeHandlerViewGuestACK, |
OnCreateMimeHandlerViewGuestACK) |
+ IPC_MESSAGE_HANDLER(ExtensionMsg_MimeHandlerViewGuestOnLoadCompleted, |
+ OnMimeHandlerViewGuestOnLoadCompleted) |
IPC_MESSAGE_HANDLER(ExtensionMsg_GuestAttached, OnGuestAttached) |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
@@ -153,12 +156,14 @@ void MimeHandlerViewContainer::didFinishLoading( |
void MimeHandlerViewContainer::PostMessage(v8::Isolate* isolate, |
v8::Handle<v8::Value> message) { |
- content::RenderView* guest_proxy_render_view = |
- content::RenderView::FromRoutingID(guest_proxy_routing_id_); |
- if (!guest_proxy_render_view) |
+ if (!guest_loaded_) { |
+ linked_ptr<ScopedPersistent<v8::Value>> scoped_persistent( |
+ new ScopedPersistent<v8::Value>(isolate, message)); |
+ pending_messages_.push_back(scoped_persistent); |
return; |
- blink::WebFrame* guest_proxy_frame = |
- guest_proxy_render_view->GetWebView()->mainFrame(); |
+ } |
+ |
+ blink::WebFrame* guest_proxy_frame = render_frame()->GetWebFrame(); |
Sam McNally
2014/12/19 03:54:03
Change the other one, not this one.
|
if (!guest_proxy_frame) |
return; |
@@ -186,6 +191,30 @@ void MimeHandlerViewContainer::OnCreateMimeHandlerViewGuestACK( |
render_frame()->AttachGuest(element_instance_id); |
} |
+void MimeHandlerViewContainer::OnMimeHandlerViewGuestOnLoadCompleted( |
+ int /* unused */) { |
+ guest_loaded_ = true; |
+ if (pending_messages_.empty()) |
+ return; |
+ |
+ // Now that the guest has loaded, flush any unsent messages. |
+ content::RenderView* render_view = |
+ content::RenderView::FromRoutingID(render_view_routing_id()); |
+ if (!render_view) |
+ return; |
+ blink::WebFrame* frame = render_view->GetWebView()->mainFrame(); |
+ if (!frame) |
+ return; |
+ |
+ v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
+ v8::HandleScope handle_scope(isolate); |
+ v8::Context::Scope context_scope(frame->mainWorldScriptContext()); |
+ for (const auto& pending_message : pending_messages_) |
+ PostMessage(isolate, pending_message->NewHandle(isolate)); |
+ |
+ pending_messages_.clear(); |
+} |
+ |
void MimeHandlerViewContainer::OnGuestAttached(int /* unused */, |
int guest_proxy_routing_id) { |
// Save the RenderView routing ID of the guest here so it can be used to route |