blob: e91fe869f5eac5e1c80d704ca64cd56641a819eb [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.h"
#include <map>
#include <set>
#include "components/guest_view/common/guest_view_constants.h"
#include "components/guest_view/common/guest_view_messages.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/extensions_guest_view_messages.h"
#include "third_party/blink/public/web/web_document.h"
#include "third_party/blink/public/web/web_local_frame.h"
#include "third_party/blink/public/web/web_plugin_document.h"
#include "third_party/blink/public/web/web_remote_frame.h"
#include "third_party/blink/public/web/web_view.h"
namespace extensions {
MimeHandlerViewContainer::MimeHandlerViewContainer(
content::RenderFrame* render_frame,
const content::WebPluginInfo& info,
const std::string& mime_type,
const GURL& original_url)
: GuestViewContainer(render_frame),
MimeHandlerViewContainerBase(render_frame, info, mime_type, original_url),
guest_proxy_routing_id_(-1) {
is_embedded_ = !render_frame->GetWebFrame()->GetDocument().IsPluginDocument();
}
MimeHandlerViewContainer::~MimeHandlerViewContainer() {
}
void MimeHandlerViewContainer::OnReady() {
if (!render_frame() || !is_embedded_)
return;
SendResourceRequest();
}
bool MimeHandlerViewContainer::OnMessage(const IPC::Message& message) {
if (MimeHandlerViewContainerBase::OnHandleMessage(message))
return true;
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(MimeHandlerViewContainer, message)
IPC_MESSAGE_HANDLER(ExtensionsGuestViewMsg_CreateMimeHandlerViewGuestACK,
OnCreateMimeHandlerViewGuestACK)
IPC_MESSAGE_HANDLER(GuestViewMsg_GuestAttached, OnGuestAttached)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
return handled;
}
void MimeHandlerViewContainer::PluginDidFinishLoading() {
DCHECK(!is_embedded_);
CreateMimeHandlerViewGuestIfNecessary();
}
void MimeHandlerViewContainer::OnRenderFrameDestroyed() {
EmbedderRenderFrameWillBeGone();
}
void MimeHandlerViewContainer::PluginDidReceiveData(const char* data,
int data_length) {
view_id_ += std::string(data, data_length);
}
void MimeHandlerViewContainer::DidResizeElement(const gfx::Size& new_size) {
element_size_ = new_size;
CreateMimeHandlerViewGuestIfNecessary();
// Don't try to resize a guest that hasn't been created yet. It is enough to
// initialise |element_size_| here and then we'll send that to the browser
// during guest creation.
if (!guest_created())
return;
render_frame()->Send(new ExtensionsGuestViewHostMsg_ResizeGuest(
render_frame()->GetRoutingID(), element_instance_id(), new_size));
}
v8::Local<v8::Object> MimeHandlerViewContainer::V8ScriptableObject(
v8::Isolate* isolate) {
return GetScriptableObject(isolate);
}
void MimeHandlerViewContainer::OnCreateMimeHandlerViewGuestACK(
int element_instance_id) {
DCHECK_NE(this->element_instance_id(), guest_view::kInstanceIDNone);
DCHECK_EQ(this->element_instance_id(), element_instance_id);
if (!render_frame())
return;
render_frame()->AttachGuest(element_instance_id);
}
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
// PostMessage calls.
guest_proxy_routing_id_ = guest_proxy_routing_id;
}
content::RenderFrame* MimeHandlerViewContainer::GetEmbedderRenderFrame() const {
return render_frame();
}
void MimeHandlerViewContainer::CreateMimeHandlerViewGuestIfNecessary() {
if (!element_size_.has_value())
return;
MimeHandlerViewContainerBase::CreateMimeHandlerViewGuestIfNecessary();
}
blink::WebRemoteFrame* MimeHandlerViewContainer::GetGuestProxyFrame() const {
content::RenderView* guest_proxy_render_view =
content::RenderView::FromRoutingID(guest_proxy_routing_id_);
if (!guest_proxy_render_view)
return nullptr;
return guest_proxy_render_view->GetWebView()->MainFrame()->ToWebRemoteFrame();
}
int32_t MimeHandlerViewContainer::GetInstanceId() const {
return element_instance_id();
}
gfx::Size MimeHandlerViewContainer::GetElementSize() const {
return *element_size_;
}
void MimeHandlerViewContainer::SetShowBeforeUnloadDialog(
bool show_dialog,
SetShowBeforeUnloadDialogCallback callback) {
DCHECK(!is_embedded_);
render_frame()
->GetWebFrame()
->GetDocument()
.To<blink::WebPluginDocument>()
.SetShowBeforeUnloadDialog(show_dialog);
std::move(callback).Run();
}
} // namespace extensions