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

Unified Diff: extensions/browser/extension_web_contents_observer.cc

Issue 1413853005: Track all extension frames in ProcessManager, inspect extensionoptions (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add ProcessManagerObserver::OnExtensionFrameNavigated notification Created 5 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/browser/extension_web_contents_observer.cc
diff --git a/extensions/browser/extension_web_contents_observer.cc b/extensions/browser/extension_web_contents_observer.cc
index 665fc0809cca1b3ebcfa428ae79d762d9c8c5caa..26c3b8204c586eee1f5661f38bbe70fdead140f6 100644
--- a/extensions/browser/extension_web_contents_observer.cc
+++ b/extensions/browser/extension_web_contents_observer.cc
@@ -4,6 +4,7 @@
#include "extensions/browser/extension_web_contents_observer.h"
+#include "components/guest_view/browser/guest_view_base.h"
#include "content/public/browser/child_process_security_policy.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
@@ -50,9 +51,17 @@ void ExtensionWebContentsObserver::InitializeRenderFrame(
DCHECK(render_frame_host);
DCHECK(render_frame_host->IsRenderFrameLive());
+ ViewType view_type = GetViewType(web_contents());
+ if (view_type == VIEW_TYPE_INVALID) {
+ // This is expected to happen only for non-extension pages (e.g. devtools)
+ // and GuestViews.
+ DCHECK(guest_view::GuestViewBase::FromWebContents(web_contents()) ||
+ GetExtensionIdFromFrame(render_frame_host).empty());
+ return;
+ }
// Notify the render frame of the view type.
render_frame_host->Send(new ExtensionMsg_NotifyRenderViewType(
- render_frame_host->GetRoutingID(), GetViewType(web_contents())));
+ render_frame_host->GetRoutingID(), view_type));
const Extension* frame_extension = GetExtensionFromFrame(render_frame_host);
if (frame_extension) {
@@ -110,6 +119,35 @@ void ExtensionWebContentsObserver::RenderFrameDeleted(
->UnregisterRenderFrameHost(render_frame_host);
}
+void ExtensionWebContentsObserver::RenderFrameHostChanged(
+ content::RenderFrameHost* old_host,
+ content::RenderFrameHost* new_host) {
ncarter (slow) 2015/11/05 20:03:23 Do not override RenderFrameHostChanged. All you're
+ // If the frame was opened by a non-extension frame, a process swap can occur.
+ // Before the process swap, RenderFrameCreated will be called, but
+ // InitializeRenderFrame will not consider the RenderFrameHost as an extension
+ // frame. Therefore we call this method again to ensure that the frame is
+ // registered if it is an extension frame.
+ if (new_host->IsRenderFrameLive())
+ InitializeRenderFrame(new_host);
+}
+
+void ExtensionWebContentsObserver::DidNavigateAnyFrame(
+ content::RenderFrameHost* render_frame_host,
+ const content::LoadCommittedDetails& details,
+ const content::FrameNavigateParams& params) {
ncarter (slow) 2015/11/05 20:03:23 It should be okay to call GetLastCommittedURL from
+ if (details.is_in_page)
+ return;
+
+ const Extension* frame_extension = GetExtensionFromFrame(render_frame_host);
+ if (frame_extension) {
+ // Notify ProcessManager, because some clients do not just want to know
+ // whether the frame is in an extension process, but also whether the frame
+ // was navigated.
+ ProcessManager::Get(browser_context_)
+ ->DidNavigateRenderFrameHost(render_frame_host);
+ }
+}
+
bool ExtensionWebContentsObserver::OnMessageReceived(
const IPC::Message& message,
content::RenderFrameHost* render_frame_host) {

Powered by Google App Engine
This is Rietveld 408576698