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..1089bf8c1477b30cc31c74220c96b69e9ac8bcd6 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,6 +156,13 @@ void MimeHandlerViewContainer::didFinishLoading( |
| void MimeHandlerViewContainer::PostMessage(v8::Isolate* isolate, |
| v8::Handle<v8::Value> message) { |
| + if (!guest_loaded_) { |
| + linked_ptr<ScopedPersistent<v8::Value>> scoped_persistent( |
| + new ScopedPersistent<v8::Value>(isolate, message)); |
| + pending_messages_.push_back(scoped_persistent); |
| + return; |
| + } |
| + |
| content::RenderView* guest_proxy_render_view = |
| content::RenderView::FromRoutingID(guest_proxy_routing_id_); |
| if (!guest_proxy_render_view) |
| @@ -186,6 +196,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 = |
|
Sam McNally
2014/12/19 03:11:46
Use render_frame()->GetWebFrame().
raymes
2014/12/19 03:21:07
Done.
|
| + 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 (size_t i = 0; i < pending_messages_.size(); ++i) |
| + PostMessage(isolate, pending_messages_[i]->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 |