Chromium Code Reviews| 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) { |