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