| Index: extensions/renderer/guest_view/guest_view_container.cc
|
| diff --git a/extensions/renderer/guest_view/guest_view_container.cc b/extensions/renderer/guest_view/guest_view_container.cc
|
| index 781027063a16d8079aa3dc2de2d08a7222e5c59d..44ef046739d95fba7337f9199d9d4468c760a110 100644
|
| --- a/extensions/renderer/guest_view/guest_view_container.cc
|
| +++ b/extensions/renderer/guest_view/guest_view_container.cc
|
| @@ -4,110 +4,23 @@
|
|
|
| #include "extensions/renderer/guest_view/guest_view_container.h"
|
|
|
| -#include "content/public/renderer/browser_plugin_delegate.h"
|
| #include "content/public/renderer/render_frame.h"
|
| #include "content/public/renderer/render_view.h"
|
| -#include "extensions/common/extension_messages.h"
|
| #include "extensions/common/guest_view/guest_view_constants.h"
|
| -#include "third_party/WebKit/public/web/WebLocalFrame.h"
|
| -#include "third_party/WebKit/public/web/WebScopedMicrotaskSuppression.h"
|
| -#include "third_party/WebKit/public/web/WebView.h"
|
| -
|
| -namespace {
|
| -typedef std::pair<int, int> GuestViewID;
|
| -typedef std::map<GuestViewID, extensions::GuestViewContainer*>
|
| - GuestViewContainerMap;
|
| -static base::LazyInstance<GuestViewContainerMap> g_guest_view_container_map =
|
| - LAZY_INSTANCE_INITIALIZER;
|
| -} // namespace
|
|
|
| namespace extensions {
|
|
|
| -GuestViewContainer::AttachRequest::AttachRequest(
|
| - int element_instance_id,
|
| - int guest_instance_id,
|
| - scoped_ptr<base::DictionaryValue> params,
|
| - v8::Handle<v8::Function> callback,
|
| - v8::Isolate* isolate)
|
| - : element_instance_id_(element_instance_id),
|
| - guest_instance_id_(guest_instance_id),
|
| - params_(params.Pass()),
|
| - callback_(callback),
|
| - isolate_(isolate) {
|
| -}
|
| -
|
| -GuestViewContainer::AttachRequest::~AttachRequest() {
|
| -}
|
| -
|
| -bool GuestViewContainer::AttachRequest::HasCallback() const {
|
| - return !callback_.IsEmpty();
|
| -}
|
| -
|
| -v8::Handle<v8::Function>
|
| -GuestViewContainer::AttachRequest::GetCallback() const {
|
| - return callback_.NewHandle(isolate_);
|
| -}
|
| -
|
| -GuestViewContainer::GuestViewContainer(
|
| - content::RenderFrame* render_frame,
|
| - const std::string& mime_type)
|
| - : content::BrowserPluginDelegate(render_frame, mime_type),
|
| - content::RenderFrameObserver(render_frame),
|
| - mime_type_(mime_type),
|
| +GuestViewContainer::GuestViewContainer(content::RenderFrame* render_frame)
|
| + : content::RenderFrameObserver(render_frame),
|
| element_instance_id_(guestview::kInstanceIDNone),
|
| - render_view_routing_id_(render_frame->GetRenderView()->GetRoutingID()),
|
| - attached_(false),
|
| - ready_(false) {
|
| -}
|
| -
|
| -GuestViewContainer::~GuestViewContainer() {
|
| - if (element_instance_id_ != guestview::kInstanceIDNone) {
|
| - g_guest_view_container_map.Get().erase(
|
| - GuestViewID(render_view_routing_id_, element_instance_id_));
|
| - }
|
| + render_view_routing_id_(render_frame->GetRenderView()->GetRoutingID()) {
|
| }
|
|
|
| -GuestViewContainer* GuestViewContainer::FromID(int render_view_routing_id,
|
| - int element_instance_id) {
|
| - GuestViewContainerMap* guest_view_containers =
|
| - g_guest_view_container_map.Pointer();
|
| - GuestViewContainerMap::iterator it = guest_view_containers->find(
|
| - GuestViewID(render_view_routing_id, element_instance_id));
|
| - return it == guest_view_containers->end() ? NULL : it->second;
|
| -}
|
| -
|
| -void GuestViewContainer::AttachGuest(linked_ptr<AttachRequest> request) {
|
| - EnqueueAttachRequest(request);
|
| - PerformPendingAttachRequest();
|
| -}
|
| +GuestViewContainer::~GuestViewContainer() {}
|
|
|
| void GuestViewContainer::SetElementInstanceID(int element_instance_id) {
|
| - GuestViewID guest_view_id(render_view_routing_id_, element_instance_id);
|
| DCHECK_EQ(element_instance_id_, guestview::kInstanceIDNone);
|
| - DCHECK(g_guest_view_container_map.Get().find(guest_view_id) ==
|
| - g_guest_view_container_map.Get().end());
|
| element_instance_id_ = element_instance_id;
|
| - g_guest_view_container_map.Get().insert(std::make_pair(guest_view_id, this));
|
| -}
|
| -
|
| -void GuestViewContainer::DidFinishLoading() {
|
| - if (mime_type_.empty())
|
| - return;
|
| -
|
| - DCHECK_NE(element_instance_id_, guestview::kInstanceIDNone);
|
| - render_frame()->Send(new ExtensionHostMsg_CreateMimeHandlerViewGuest(
|
| - routing_id(), html_string_, mime_type_, element_instance_id_));
|
| -}
|
| -
|
| -void GuestViewContainer::DidReceiveData(const char* data, int data_length) {
|
| - std::string value(data, data_length);
|
| - html_string_ += value;
|
| -}
|
| -
|
| -void GuestViewContainer::Ready() {
|
| - ready_ = true;
|
| - CHECK(!pending_response_.get());
|
| - PerformPendingAttachRequest();
|
| }
|
|
|
| void GuestViewContainer::OnDestruct() {
|
| @@ -115,8 +28,9 @@ void GuestViewContainer::OnDestruct() {
|
| // RenderFrameObserver self-destruct here.
|
| }
|
|
|
| -bool GuestViewContainer::OnMessageReceived(const IPC::Message& message) {
|
| - if (!ShouldHandleMessage(message))
|
| +bool GuestViewContainer::OnMessageReceived(
|
| + const IPC::Message& message) {
|
| + if (!HandlesMessage(message))
|
| return false;
|
|
|
| DCHECK_NE(element_instance_id_, guestview::kInstanceIDNone);
|
| @@ -127,114 +41,7 @@ bool GuestViewContainer::OnMessageReceived(const IPC::Message& message) {
|
| if (element_instance_id != element_instance_id_)
|
| return false;
|
|
|
| - bool handled = true;
|
| - IPC_BEGIN_MESSAGE_MAP(GuestViewContainer, message)
|
| - IPC_MESSAGE_HANDLER(ExtensionMsg_CreateMimeHandlerViewGuestACK,
|
| - OnCreateMimeHandlerViewGuestACK)
|
| - IPC_MESSAGE_HANDLER(ExtensionMsg_GuestAttached, OnGuestAttached)
|
| - IPC_MESSAGE_UNHANDLED(handled = false)
|
| - IPC_END_MESSAGE_MAP()
|
| - return handled;
|
| -}
|
| -
|
| -void GuestViewContainer::OnCreateMimeHandlerViewGuestACK(
|
| - int element_instance_id) {
|
| - DCHECK_NE(element_instance_id_, guestview::kInstanceIDNone);
|
| - DCHECK_EQ(element_instance_id_, element_instance_id);
|
| - DCHECK(!mime_type_.empty());
|
| - render_frame()->AttachGuest(element_instance_id);
|
| -}
|
| -
|
| -void GuestViewContainer::OnGuestAttached(int element_instance_id,
|
| - int guest_proxy_routing_id) {
|
| - attached_ = true;
|
| -
|
| - if (!mime_type_.empty()) {
|
| - // MimeHandlerView's creation and attachment is not done via JS API.
|
| - return;
|
| - }
|
| -
|
| - // 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 GuestViewContainer::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;
|
| -}
|
| -
|
| -void GuestViewContainer::EnqueueAttachRequest(
|
| - linked_ptr<AttachRequest> request) {
|
| - pending_requests_.push_back(request);
|
| -}
|
| -
|
| -void GuestViewContainer::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 GuestViewContainer::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 (!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);
|
| -}
|
| -
|
| -// static
|
| -bool GuestViewContainer::ShouldHandleMessage(const IPC::Message& message) {
|
| - switch (message.type()) {
|
| - case ExtensionMsg_CreateMimeHandlerViewGuestACK::ID:
|
| - case ExtensionMsg_GuestAttached::ID:
|
| - return true;
|
| - default:
|
| - break;
|
| - }
|
| - return false;
|
| + return OnMessage(message);
|
| }
|
|
|
| } // namespace extensions
|
|
|