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) { |