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

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

Issue 765843003: Refactor GuestViewContainer::AttachRequest to allow for other request types (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Avoid a new static 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 3790d56f39d8636c0ee239f98c073134a047c4d0..82204ec1dd596c40244d6f6a57df31e991006c67 100644
--- a/extensions/renderer/guest_view/extensions_guest_view_container.cc
+++ b/extensions/renderer/guest_view/extensions_guest_view_container.cc
@@ -13,8 +13,7 @@
#include "third_party/WebKit/public/web/WebView.h"
namespace {
-typedef std::pair<int, int> GuestViewID;
-typedef std::map<GuestViewID, extensions::ExtensionsGuestViewContainer*>
+typedef std::map<int, extensions::ExtensionsGuestViewContainer*>
ExtensionsGuestViewContainerMap;
static base::LazyInstance<ExtensionsGuestViewContainerMap>
g_guest_view_container_map = LAZY_INSTANCE_INITIALIZER;
@@ -22,31 +21,89 @@ static base::LazyInstance<ExtensionsGuestViewContainerMap>
namespace extensions {
-ExtensionsGuestViewContainer::AttachRequest::AttachRequest(
- int element_instance_id,
- int guest_instance_id,
- scoped_ptr<base::DictionaryValue> params,
+ExtensionsGuestViewContainer::Request::Request(
+ GuestViewContainer* container,
v8::Handle<v8::Function> callback,
v8::Isolate* isolate)
- : element_instance_id_(element_instance_id),
- guest_instance_id_(guest_instance_id),
- params_(params.Pass()),
+ : container_(container),
callback_(callback),
isolate_(isolate) {
}
-ExtensionsGuestViewContainer::AttachRequest::~AttachRequest() {
+ExtensionsGuestViewContainer::Request::~Request() {
}
-bool ExtensionsGuestViewContainer::AttachRequest::HasCallback() const {
+bool ExtensionsGuestViewContainer::Request::HasCallback() const {
return !callback_.IsEmpty();
}
v8::Handle<v8::Function>
-ExtensionsGuestViewContainer::AttachRequest::GetCallback() const {
+ExtensionsGuestViewContainer::Request::GetCallback() const {
return callback_.NewHandle(isolate_);
}
+ExtensionsGuestViewContainer::AttachRequest::AttachRequest(
+ GuestViewContainer* container,
+ int guest_instance_id,
+ scoped_ptr<base::DictionaryValue> params,
+ v8::Handle<v8::Function> callback,
+ v8::Isolate* isolate)
+ : Request(container, callback, isolate),
+ guest_instance_id_(guest_instance_id),
+ params_(params.Pass()) {
+}
+
+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_));
+
+ // Step 2, attach plugin through content/.
+ container()->render_frame()->AttachGuest(container()->element_instance_id());
+}
+
+void ExtensionsGuestViewContainer::AttachRequest::HandleResponse(
+ const IPC::Message& message) {
+ ExtensionMsg_GuestAttached::Param param;
+ if (!ExtensionMsg_GuestAttached::Read(&message, &param))
+ return;
+
+ // If we don't have a callback then there's nothing more to do.
+ if (!HasCallback())
+ return;
+
+ content::RenderView* guest_proxy_render_view =
+ content::RenderView::FromRoutingID(param.b);
+ // 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::Handle<v8::Context> context = callback->CreationContext();
+ if (context.IsEmpty())
+ return;
+
+ blink::WebFrame* frame = guest_proxy_render_view->GetWebView()->mainFrame();
+ v8::Local<v8::Value> window = frame->mainWorldScriptContext()->Global();
+
+ const int argc = 1;
+ v8::Handle<v8::Value> argv[argc] = { window };
+
+ v8::Context::Scope context_scope(context);
+ blink::WebScopedMicrotaskSuppression suppression;
+
+ // Call the AttachGuest API's callback with the guest proxy as the first
+ // parameter.
+ callback->Call(context->Global(), argc, argv);
+}
+
ExtensionsGuestViewContainer::ExtensionsGuestViewContainer(
content::RenderFrame* render_frame)
: GuestViewContainer(render_frame),
@@ -55,127 +112,79 @@ ExtensionsGuestViewContainer::ExtensionsGuestViewContainer(
ExtensionsGuestViewContainer::~ExtensionsGuestViewContainer() {
if (element_instance_id() != guestview::kInstanceIDNone) {
- g_guest_view_container_map.Get().erase(
- GuestViewID(render_view_routing_id(), element_instance_id()));
+ g_guest_view_container_map.Get().erase(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));
+ ExtensionsGuestViewContainerMap::iterator it =
+ guest_view_containers->find(element_instance_id);
return it == guest_view_containers->end() ? NULL : it->second;
}
-void ExtensionsGuestViewContainer::AttachGuest(
- linked_ptr<AttachRequest> request) {
- EnqueueAttachRequest(request);
- PerformPendingAttachRequest();
+void ExtensionsGuestViewContainer::IssueRequest(linked_ptr<Request> request) {
+ EnqueueRequest(request);
+ PerformPendingRequest();
}
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) ==
+ 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(guest_view_id, this));
+ g_guest_view_container_map.Get().insert(
+ std::make_pair(element_instance_id, this));
}
void ExtensionsGuestViewContainer::Ready() {
ready_ = true;
CHECK(!pending_response_.get());
- PerformPendingAttachRequest();
+ PerformPendingRequest();
}
bool ExtensionsGuestViewContainer::HandlesMessage(const IPC::Message& message) {
- return message.type() == ExtensionMsg_GuestAttached::ID;
+ 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;
+ if (message.type() == ExtensionMsg_GuestAttached::ID) {
+ OnHandleCallback(message);
+ return true;
+ }
+ return false;
}
-void ExtensionsGuestViewContainer::OnGuestAttached(int /* unused */,
- int guest_proxy_routing_id) {
+void ExtensionsGuestViewContainer::OnHandleCallback(
+ const IPC::Message& message) {
// Handle the callback for the current request with a pending response.
- HandlePendingResponseCallback(guest_proxy_routing_id);
+ HandlePendingResponseCallback(message);
// 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/.
- render_frame()->AttachGuest(request->element_instance_id());
-
- pending_response_ = request;
+ PerformPendingRequest();
}
-void ExtensionsGuestViewContainer::EnqueueAttachRequest(
- linked_ptr<AttachRequest> request) {
+void ExtensionsGuestViewContainer::EnqueueRequest(linked_ptr<Request> request) {
pending_requests_.push_back(request);
}
-void ExtensionsGuestViewContainer::PerformPendingAttachRequest() {
+void ExtensionsGuestViewContainer::PerformPendingRequest() {
if (!ready_ || pending_requests_.empty() || pending_response_.get())
return;
- linked_ptr<AttachRequest> pending_request = pending_requests_.front();
+ linked_ptr<Request> pending_request = pending_requests_.front();
pending_requests_.pop_front();
- AttachGuestInternal(pending_request);
+ pending_request->PerformRequest();
+ pending_response_ = pending_request;
}
void ExtensionsGuestViewContainer::HandlePendingResponseCallback(
- int guest_proxy_routing_id) {
+ const IPC::Message& message) {
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 (!pending_response->HasCallback())
- return;
-
- content::RenderView* guest_proxy_render_view =
- 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(pending_response->isolate());
- v8::Handle<v8::Function> callback = pending_response->GetCallback();
- v8::Handle<v8::Context> context = callback->CreationContext();
- if (context.IsEmpty())
- return;
-
- blink::WebFrame* frame = guest_proxy_render_view->GetWebView()->mainFrame();
- v8::Local<v8::Value> window = frame->mainWorldScriptContext()->Global();
-
- const int argc = 1;
- v8::Handle<v8::Value> argv[argc] = { window };
-
- v8::Context::Scope context_scope(context);
- blink::WebScopedMicrotaskSuppression suppression;
-
- // Call the AttachGuest API's callback with the guest proxy as the first
- // parameter.
- callback->Call(context->Global(), argc, argv);
+ linked_ptr<Request> pending_response(pending_response_.release());
+ pending_response->HandleResponse(message);
}
} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698