| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "extensions/browser/extension_web_contents_observer.h" | 5 #include "extensions/browser/extension_web_contents_observer.h" |
| 6 | 6 |
| 7 #include "content/public/browser/child_process_security_policy.h" | 7 #include "content/public/browser/child_process_security_policy.h" |
| 8 #include "content/public/browser/navigation_details.h" | 8 #include "content/public/browser/navigation_details.h" |
| 9 #include "content/public/browser/navigation_handle.h" |
| 9 #include "content/public/browser/render_frame_host.h" | 10 #include "content/public/browser/render_frame_host.h" |
| 10 #include "content/public/browser/render_process_host.h" | 11 #include "content/public/browser/render_process_host.h" |
| 11 #include "content/public/browser/render_view_host.h" | 12 #include "content/public/browser/render_view_host.h" |
| 12 #include "content/public/browser/site_instance.h" | 13 #include "content/public/browser/site_instance.h" |
| 13 #include "content/public/browser/web_contents.h" | 14 #include "content/public/browser/web_contents.h" |
| 14 #include "content/public/common/url_constants.h" | 15 #include "content/public/common/url_constants.h" |
| 15 #include "extensions/browser/extension_api_frame_id_map.h" | 16 #include "extensions/browser/extension_api_frame_id_map.h" |
| 16 #include "extensions/browser/extension_prefs.h" | 17 #include "extensions/browser/extension_prefs.h" |
| 17 #include "extensions/browser/extension_registry.h" | 18 #include "extensions/browser/extension_registry.h" |
| 18 #include "extensions/browser/extensions_browser_client.h" | 19 #include "extensions/browser/extensions_browser_client.h" |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 ExtensionApiFrameIdMap::Get()->CacheFrameData(render_frame_host); | 129 ExtensionApiFrameIdMap::Get()->CacheFrameData(render_frame_host); |
| 129 } | 130 } |
| 130 | 131 |
| 131 void ExtensionWebContentsObserver::RenderFrameDeleted( | 132 void ExtensionWebContentsObserver::RenderFrameDeleted( |
| 132 content::RenderFrameHost* render_frame_host) { | 133 content::RenderFrameHost* render_frame_host) { |
| 133 ProcessManager::Get(browser_context_) | 134 ProcessManager::Get(browser_context_) |
| 134 ->UnregisterRenderFrameHost(render_frame_host); | 135 ->UnregisterRenderFrameHost(render_frame_host); |
| 135 ExtensionApiFrameIdMap::Get()->RemoveFrameData(render_frame_host); | 136 ExtensionApiFrameIdMap::Get()->RemoveFrameData(render_frame_host); |
| 136 } | 137 } |
| 137 | 138 |
| 138 void ExtensionWebContentsObserver::DidCommitProvisionalLoadForFrame( | 139 void ExtensionWebContentsObserver::DidFinishNavigation( |
| 139 content::RenderFrameHost* render_frame_host, | 140 content::NavigationHandle* navigation_handle) { |
| 140 const GURL& url, | 141 if (!navigation_handle->HasCommitted()) |
| 141 ui::PageTransition transition_type) { | 142 return; |
| 143 |
| 142 ProcessManager* pm = ProcessManager::Get(browser_context_); | 144 ProcessManager* pm = ProcessManager::Get(browser_context_); |
| 143 | 145 |
| 146 content::RenderFrameHost* render_frame_host = |
| 147 navigation_handle->GetRenderFrameHost(); |
| 144 if (pm->IsRenderFrameHostRegistered(render_frame_host)) { | 148 if (pm->IsRenderFrameHostRegistered(render_frame_host)) { |
| 145 const Extension* frame_extension = | 149 const Extension* frame_extension = |
| 146 GetExtensionFromFrame(render_frame_host, true); | 150 GetExtensionFromFrame(render_frame_host, true); |
| 147 | 151 |
| 148 if (!frame_extension) | 152 if (!frame_extension) |
| 149 pm->UnregisterRenderFrameHost(render_frame_host); | 153 pm->UnregisterRenderFrameHost(render_frame_host); |
| 150 } | 154 } |
| 151 } | 155 } |
| 152 | 156 |
| 153 void ExtensionWebContentsObserver::DidNavigateAnyFrame( | 157 void ExtensionWebContentsObserver::DidNavigateAnyFrame( |
| 154 content::RenderFrameHost* render_frame_host, | 158 content::RenderFrameHost* render_frame_host, |
| 155 const content::LoadCommittedDetails& details, | 159 const content::LoadCommittedDetails& details, |
| 156 const content::FrameNavigateParams& params) { | 160 const content::FrameNavigateParams& params) { |
| 157 if (details.is_in_page) | 161 if (details.is_in_page) |
| 158 return; | 162 return; |
| 159 | 163 |
| 160 const Extension* frame_extension = | 164 const Extension* frame_extension = |
| 161 GetExtensionFromFrame(render_frame_host, true); | 165 GetExtensionFromFrame(render_frame_host, true); |
| 162 ProcessManager* pm = ProcessManager::Get(browser_context_); | 166 ProcessManager* pm = ProcessManager::Get(browser_context_); |
| 163 | 167 |
| 164 if (!frame_extension) { | 168 if (!frame_extension) { |
| 165 // Should have been unregistered by DidCommitProvisionalLoadForFrame. | 169 // Should have been unregistered by DidFinishNavigation. |
| 166 DCHECK(!pm->IsRenderFrameHostRegistered(render_frame_host)); | 170 DCHECK(!pm->IsRenderFrameHostRegistered(render_frame_host)); |
| 167 return; | 171 return; |
| 168 } | 172 } |
| 169 | 173 |
| 170 if (pm->IsRenderFrameHostRegistered(render_frame_host)) { | 174 if (pm->IsRenderFrameHostRegistered(render_frame_host)) { |
| 171 // Notify ProcessManager, because some clients do not just want to know | 175 // Notify ProcessManager, because some clients do not just want to know |
| 172 // whether the frame is in an extension process, but also whether the frame | 176 // whether the frame is in an extension process, but also whether the frame |
| 173 // was navigated. | 177 // was navigated. |
| 174 pm->DidNavigateRenderFrameHost(render_frame_host); | 178 pm->DidNavigateRenderFrameHost(render_frame_host); |
| 175 } else { | 179 } else { |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 // Since this is called for all existing RenderFrameHosts during the | 294 // Since this is called for all existing RenderFrameHosts during the |
| 291 // ExtensionWebContentsObserver's creation, it's possible that not all hosts | 295 // ExtensionWebContentsObserver's creation, it's possible that not all hosts |
| 292 // are ready. | 296 // are ready. |
| 293 // We only initialize the frame if the renderer counterpart is live; otherwise | 297 // We only initialize the frame if the renderer counterpart is live; otherwise |
| 294 // we wait for the RenderFrameCreated notification. | 298 // we wait for the RenderFrameCreated notification. |
| 295 if (render_frame_host->IsRenderFrameLive()) | 299 if (render_frame_host->IsRenderFrameLive()) |
| 296 InitializeRenderFrame(render_frame_host); | 300 InitializeRenderFrame(render_frame_host); |
| 297 } | 301 } |
| 298 | 302 |
| 299 } // namespace extensions | 303 } // namespace extensions |
| OLD | NEW |