Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(438)

Unified Diff: extensions/renderer/guest_view/extensions_guest_view_container.cc

Issue 764863003: Revert of Refactor GuestViewContainer::AttachRequest to allow for other request types (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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, &param))
+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

Powered by Google App Engine
This is Rietveld 408576698