Index: extensions/renderer/guest_view/extensions_guest_view_container.cc |
diff --git a/extensions/renderer/guest_view/extensions_guest_view_container.cc b/extensions/renderer/guest_view/extensions_guest_view_container.cc |
index 82204ec1dd596c40244d6f6a57df31e991006c67..3790d56f39d8636c0ee239f98c073134a047c4d0 100644 |
--- a/extensions/renderer/guest_view/extensions_guest_view_container.cc |
+++ b/extensions/renderer/guest_view/extensions_guest_view_container.cc |
@@ -13,7 +13,8 @@ |
#include "third_party/WebKit/public/web/WebView.h" |
namespace { |
-typedef std::map<int, extensions::ExtensionsGuestViewContainer*> |
+typedef std::pair<int, int> GuestViewID; |
+typedef std::map<GuestViewID, extensions::ExtensionsGuestViewContainer*> |
ExtensionsGuestViewContainerMap; |
static base::LazyInstance<ExtensionsGuestViewContainerMap> |
g_guest_view_container_map = LAZY_INSTANCE_INITIALIZER; |
@@ -21,71 +22,144 @@ |
namespace extensions { |
-ExtensionsGuestViewContainer::Request::Request( |
- GuestViewContainer* container, |
- v8::Handle<v8::Function> callback, |
- v8::Isolate* isolate) |
- : container_(container), |
- callback_(callback), |
- isolate_(isolate) { |
-} |
- |
-ExtensionsGuestViewContainer::Request::~Request() { |
-} |
- |
-bool ExtensionsGuestViewContainer::Request::HasCallback() const { |
- return !callback_.IsEmpty(); |
-} |
- |
-v8::Handle<v8::Function> |
-ExtensionsGuestViewContainer::Request::GetCallback() const { |
- return callback_.NewHandle(isolate_); |
-} |
- |
ExtensionsGuestViewContainer::AttachRequest::AttachRequest( |
- GuestViewContainer* container, |
+ int element_instance_id, |
int guest_instance_id, |
scoped_ptr<base::DictionaryValue> params, |
v8::Handle<v8::Function> callback, |
v8::Isolate* isolate) |
- : Request(container, callback, isolate), |
+ : element_instance_id_(element_instance_id), |
guest_instance_id_(guest_instance_id), |
- params_(params.Pass()) { |
+ params_(params.Pass()), |
+ callback_(callback), |
+ isolate_(isolate) { |
} |
ExtensionsGuestViewContainer::AttachRequest::~AttachRequest() { |
} |
-void ExtensionsGuestViewContainer::AttachRequest::PerformRequest() { |
- // Step 1, send the attach params to extensions/. |
- container()->render_frame()->Send( |
- new ExtensionHostMsg_AttachGuest(container()->render_view_routing_id(), |
- container()->element_instance_id(), |
- guest_instance_id_, |
- *params_)); |
+bool ExtensionsGuestViewContainer::AttachRequest::HasCallback() const { |
+ return !callback_.IsEmpty(); |
+} |
+ |
+v8::Handle<v8::Function> |
+ExtensionsGuestViewContainer::AttachRequest::GetCallback() const { |
+ return callback_.NewHandle(isolate_); |
+} |
+ |
+ExtensionsGuestViewContainer::ExtensionsGuestViewContainer( |
+ content::RenderFrame* render_frame) |
+ : GuestViewContainer(render_frame), |
+ ready_(false) { |
+} |
+ |
+ExtensionsGuestViewContainer::~ExtensionsGuestViewContainer() { |
+ if (element_instance_id() != guestview::kInstanceIDNone) { |
+ g_guest_view_container_map.Get().erase( |
+ GuestViewID(render_view_routing_id(), element_instance_id())); |
+ } |
+} |
+ |
+ExtensionsGuestViewContainer* ExtensionsGuestViewContainer::FromID( |
+ int render_view_routing_id, |
+ int element_instance_id) { |
+ ExtensionsGuestViewContainerMap* guest_view_containers = |
+ g_guest_view_container_map.Pointer(); |
+ ExtensionsGuestViewContainerMap::iterator it = guest_view_containers->find( |
+ GuestViewID(render_view_routing_id, element_instance_id)); |
+ return it == guest_view_containers->end() ? NULL : it->second; |
+} |
+ |
+void ExtensionsGuestViewContainer::AttachGuest( |
+ linked_ptr<AttachRequest> request) { |
+ EnqueueAttachRequest(request); |
+ PerformPendingAttachRequest(); |
+} |
+ |
+void ExtensionsGuestViewContainer::SetElementInstanceID( |
+ int element_instance_id) { |
+ GuestViewContainer::SetElementInstanceID(element_instance_id); |
+ |
+ GuestViewID guest_view_id(render_view_routing_id(), element_instance_id); |
+ DCHECK(g_guest_view_container_map.Get().find(guest_view_id) == |
+ g_guest_view_container_map.Get().end()); |
+ g_guest_view_container_map.Get().insert(std::make_pair(guest_view_id, this)); |
+} |
+ |
+void ExtensionsGuestViewContainer::Ready() { |
+ ready_ = true; |
+ CHECK(!pending_response_.get()); |
+ PerformPendingAttachRequest(); |
+} |
+ |
+bool ExtensionsGuestViewContainer::HandlesMessage(const IPC::Message& message) { |
+ return message.type() == ExtensionMsg_GuestAttached::ID; |
+} |
+ |
+bool ExtensionsGuestViewContainer::OnMessage(const IPC::Message& message) { |
+ bool handled = false; |
+ IPC_BEGIN_MESSAGE_MAP(ExtensionsGuestViewContainer, message) |
+ IPC_MESSAGE_HANDLER(ExtensionMsg_GuestAttached, OnGuestAttached) |
+ IPC_MESSAGE_UNHANDLED(handled = false) |
+ IPC_END_MESSAGE_MAP() |
+ return handled; |
+} |
+ |
+void ExtensionsGuestViewContainer::OnGuestAttached(int /* unused */, |
+ int guest_proxy_routing_id) { |
+ // Handle the callback for the current request with a pending response. |
+ HandlePendingResponseCallback(guest_proxy_routing_id); |
+ // Perform the subsequent attach request if one exists. |
+ PerformPendingAttachRequest(); |
+} |
+ |
+void ExtensionsGuestViewContainer::AttachGuestInternal( |
+ linked_ptr<AttachRequest> request) { |
+ CHECK(!pending_response_.get()); |
+ // Step 1, send the attach params to chrome/. |
+ render_frame()->Send( |
+ new ExtensionHostMsg_AttachGuest(render_view_routing_id(), |
+ request->element_instance_id(), |
+ request->guest_instance_id(), |
+ *request->attach_params())); |
// Step 2, attach plugin through content/. |
- container()->render_frame()->AttachGuest(container()->element_instance_id()); |
+ render_frame()->AttachGuest(request->element_instance_id()); |
+ |
+ pending_response_ = request; |
} |
-void ExtensionsGuestViewContainer::AttachRequest::HandleResponse( |
- const IPC::Message& message) { |
- ExtensionMsg_GuestAttached::Param param; |
- if (!ExtensionMsg_GuestAttached::Read(&message, ¶m)) |
+void ExtensionsGuestViewContainer::EnqueueAttachRequest( |
+ linked_ptr<AttachRequest> request) { |
+ pending_requests_.push_back(request); |
+} |
+ |
+void ExtensionsGuestViewContainer::PerformPendingAttachRequest() { |
+ if (!ready_ || pending_requests_.empty() || pending_response_.get()) |
return; |
+ linked_ptr<AttachRequest> pending_request = pending_requests_.front(); |
+ pending_requests_.pop_front(); |
+ AttachGuestInternal(pending_request); |
+} |
+ |
+void ExtensionsGuestViewContainer::HandlePendingResponseCallback( |
+ int guest_proxy_routing_id) { |
+ CHECK(pending_response_.get()); |
+ linked_ptr<AttachRequest> pending_response(pending_response_.release()); |
+ |
// If we don't have a callback then there's nothing more to do. |
- if (!HasCallback()) |
+ if (!pending_response->HasCallback()) |
return; |
content::RenderView* guest_proxy_render_view = |
- content::RenderView::FromRoutingID(param.b); |
+ content::RenderView::FromRoutingID(guest_proxy_routing_id); |
// TODO(fsamuel): Should we be reporting an error to JavaScript or DCHECKing? |
if (!guest_proxy_render_view) |
return; |
- v8::HandleScope handle_scope(isolate()); |
- v8::Handle<v8::Function> callback = GetCallback(); |
+ v8::HandleScope handle_scope(pending_response->isolate()); |
+ v8::Handle<v8::Function> callback = pending_response->GetCallback(); |
v8::Handle<v8::Context> context = callback->CreationContext(); |
if (context.IsEmpty()) |
return; |
@@ -104,87 +178,4 @@ |
callback->Call(context->Global(), argc, argv); |
} |
-ExtensionsGuestViewContainer::ExtensionsGuestViewContainer( |
- content::RenderFrame* render_frame) |
- : GuestViewContainer(render_frame), |
- ready_(false) { |
-} |
- |
-ExtensionsGuestViewContainer::~ExtensionsGuestViewContainer() { |
- if (element_instance_id() != guestview::kInstanceIDNone) { |
- g_guest_view_container_map.Get().erase(element_instance_id()); |
- } |
-} |
- |
-ExtensionsGuestViewContainer* ExtensionsGuestViewContainer::FromID( |
- int element_instance_id) { |
- ExtensionsGuestViewContainerMap* guest_view_containers = |
- g_guest_view_container_map.Pointer(); |
- ExtensionsGuestViewContainerMap::iterator it = |
- guest_view_containers->find(element_instance_id); |
- return it == guest_view_containers->end() ? NULL : it->second; |
-} |
- |
-void ExtensionsGuestViewContainer::IssueRequest(linked_ptr<Request> request) { |
- EnqueueRequest(request); |
- PerformPendingRequest(); |
-} |
- |
-void ExtensionsGuestViewContainer::SetElementInstanceID( |
- int element_instance_id) { |
- GuestViewContainer::SetElementInstanceID(element_instance_id); |
- |
- DCHECK(g_guest_view_container_map.Get().find(element_instance_id) == |
- g_guest_view_container_map.Get().end()); |
- g_guest_view_container_map.Get().insert( |
- std::make_pair(element_instance_id, this)); |
-} |
- |
-void ExtensionsGuestViewContainer::Ready() { |
- ready_ = true; |
- CHECK(!pending_response_.get()); |
- PerformPendingRequest(); |
-} |
- |
-bool ExtensionsGuestViewContainer::HandlesMessage(const IPC::Message& message) { |
- return (message.type() == ExtensionMsg_GuestAttached::ID); |
-} |
- |
-bool ExtensionsGuestViewContainer::OnMessage(const IPC::Message& message) { |
- if (message.type() == ExtensionMsg_GuestAttached::ID) { |
- OnHandleCallback(message); |
- return true; |
- } |
- return false; |
-} |
- |
-void ExtensionsGuestViewContainer::OnHandleCallback( |
- const IPC::Message& message) { |
- // Handle the callback for the current request with a pending response. |
- HandlePendingResponseCallback(message); |
- // Perform the subsequent attach request if one exists. |
- PerformPendingRequest(); |
-} |
- |
-void ExtensionsGuestViewContainer::EnqueueRequest(linked_ptr<Request> request) { |
- pending_requests_.push_back(request); |
-} |
- |
-void ExtensionsGuestViewContainer::PerformPendingRequest() { |
- if (!ready_ || pending_requests_.empty() || pending_response_.get()) |
- return; |
- |
- linked_ptr<Request> pending_request = pending_requests_.front(); |
- pending_requests_.pop_front(); |
- pending_request->PerformRequest(); |
- pending_response_ = pending_request; |
-} |
- |
-void ExtensionsGuestViewContainer::HandlePendingResponseCallback( |
- const IPC::Message& message) { |
- CHECK(pending_response_.get()); |
- linked_ptr<Request> pending_response(pending_response_.release()); |
- pending_response->HandleResponse(message); |
-} |
- |
} // namespace extensions |