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

Unified Diff: extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc

Issue 2417693002: Allow MimeHandlerViewGuest be embedded inside OOPIFs (Closed)
Patch Set: Rebased Created 4 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
« no previous file with comments | « extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 {
« no previous file with comments | « extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698