| Index: extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc
|
| diff --git a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc
|
| index 64134dcbc8fdaf18aee0b0a55b3110aac9112d74..049af1623953e9160fd0dae87b20890328141812 100644
|
| --- a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc
|
| +++ b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc
|
| @@ -12,8 +12,11 @@
|
| #include "content/public/browser/host_zoom_map.h"
|
| #include "content/public/browser/navigation_entry.h"
|
| #include "content/public/browser/render_process_host.h"
|
| +#include "content/public/browser/render_widget_host.h"
|
| +#include "content/public/browser/render_widget_host_view.h"
|
| #include "content/public/browser/stream_handle.h"
|
| #include "content/public/browser/stream_info.h"
|
| +#include "content/public/common/child_process_host.h"
|
| #include "content/public/common/url_constants.h"
|
| #include "extensions/browser/api/extensions_api_client.h"
|
| #include "extensions/browser/api/mime_handler_private/mime_handler_private.h"
|
| @@ -76,8 +79,11 @@ GuestViewBase* MimeHandlerViewGuest::Create(WebContents* owner_web_contents) {
|
|
|
| MimeHandlerViewGuest::MimeHandlerViewGuest(WebContents* owner_web_contents)
|
| : GuestView<MimeHandlerViewGuest>(owner_web_contents),
|
| - delegate_(ExtensionsAPIClient::Get()->CreateMimeHandlerViewGuestDelegate(
|
| - this)) {}
|
| + delegate_(
|
| + ExtensionsAPIClient::Get()->CreateMimeHandlerViewGuestDelegate(this)),
|
| + embedder_frame_process_id_(content::ChildProcessHost::kInvalidUniqueID),
|
| + embedder_frame_routing_id_(MSG_ROUTING_NONE),
|
| + embedder_widget_routing_id_(MSG_ROUTING_NONE) {}
|
|
|
| MimeHandlerViewGuest::~MimeHandlerViewGuest() {
|
| }
|
| @@ -86,6 +92,41 @@ bool MimeHandlerViewGuest::CanUseCrossProcessFrames() {
|
| return false;
|
| }
|
|
|
| +content::RenderWidgetHost* MimeHandlerViewGuest::GetOwnerRenderWidgetHost() {
|
| + DCHECK_NE(embedder_widget_routing_id_, MSG_ROUTING_NONE);
|
| + return content::RenderWidgetHost::FromID(embedder_frame_process_id_,
|
| + embedder_widget_routing_id_);
|
| +}
|
| +
|
| +content::SiteInstance* MimeHandlerViewGuest::GetOwnerSiteInstance() {
|
| + DCHECK_NE(embedder_frame_routing_id_, MSG_ROUTING_NONE);
|
| + content::RenderFrameHost* rfh = content::RenderFrameHost::FromID(
|
| + embedder_frame_process_id_, embedder_frame_routing_id_);
|
| + return rfh ? rfh->GetSiteInstance() : nullptr;
|
| +}
|
| +
|
| +bool MimeHandlerViewGuest::CanBeEmbeddedInsideCrossProcessFrames() {
|
| + return true;
|
| +}
|
| +
|
| +void MimeHandlerViewGuest::SetEmbedderFrame(int process_id, int routing_id) {
|
| + DCHECK_NE(MSG_ROUTING_NONE, routing_id);
|
| + DCHECK_EQ(MSG_ROUTING_NONE, embedder_frame_routing_id_);
|
| +
|
| + embedder_frame_process_id_ = process_id;
|
| + embedder_frame_routing_id_ = routing_id;
|
| +
|
| + content::RenderFrameHost* rfh =
|
| + content::RenderFrameHost::FromID(process_id, routing_id);
|
| +
|
| + if (rfh && rfh->GetView()) {
|
| + embedder_widget_routing_id_ =
|
| + rfh->GetView()->GetRenderWidgetHost()->GetRoutingID();
|
| + }
|
| +
|
| + DCHECK_NE(MSG_ROUTING_NONE, embedder_widget_routing_id_);
|
| +}
|
| +
|
| const char* MimeHandlerViewGuest::GetAPINamespace() const {
|
| return "mimeHandlerViewGuestInternal";
|
| }
|
| @@ -240,13 +281,24 @@ bool MimeHandlerViewGuest::SaveFrame(const GURL& url,
|
| return true;
|
| }
|
|
|
| +void MimeHandlerViewGuest::OnRenderFrameHostDeleted(int process_id,
|
| + int routing_id) {
|
| + if (process_id == embedder_frame_process_id_ &&
|
| + routing_id == embedder_frame_routing_id_)
|
| + Destroy();
|
| +}
|
| +
|
| void MimeHandlerViewGuest::DocumentOnLoadCompletedInMainFrame() {
|
| // Assume the embedder WebContents is valid here.
|
| DCHECK(embedder_web_contents());
|
|
|
| - embedder_web_contents()->Send(
|
| - new ExtensionsGuestViewMsg_MimeHandlerViewGuestOnLoadCompleted(
|
| - element_instance_id()));
|
| + // If the guest is embedded inside a cross-process frame and the frame is
|
| + // removed before the guest is properly loaded, then owner RenderWidgetHost
|
| + // will be nullptr.
|
| + if (auto* rwh = GetOwnerRenderWidgetHost()) {
|
| + rwh->Send(new ExtensionsGuestViewMsg_MimeHandlerViewGuestOnLoadCompleted(
|
| + element_instance_id()));
|
| + }
|
| }
|
|
|
| base::WeakPtr<StreamContainer> MimeHandlerViewGuest::GetStream() const {
|
|
|