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

Side by Side 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: Cleanup + remove DCHECK Created 5 years 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 unified diff | Download patch
OLDNEW
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/render_frame_host.h" 9 #include "content/public/browser/render_frame_host.h"
9 #include "content/public/browser/render_process_host.h" 10 #include "content/public/browser/render_process_host.h"
10 #include "content/public/browser/render_view_host.h" 11 #include "content/public/browser/render_view_host.h"
11 #include "content/public/browser/site_instance.h" 12 #include "content/public/browser/site_instance.h"
12 #include "content/public/browser/web_contents.h" 13 #include "content/public/browser/web_contents.h"
13 #include "content/public/common/url_constants.h" 14 #include "content/public/common/url_constants.h"
14 #include "extensions/browser/extension_prefs.h" 15 #include "extensions/browser/extension_prefs.h"
15 #include "extensions/browser/extension_registry.h" 16 #include "extensions/browser/extension_registry.h"
16 #include "extensions/browser/extensions_browser_client.h" 17 #include "extensions/browser/extensions_browser_client.h"
17 #include "extensions/browser/mojo/service_registration.h" 18 #include "extensions/browser/mojo/service_registration.h"
(...skipping 25 matching lines...) Expand all
43 } 44 }
44 45
45 ExtensionWebContentsObserver::~ExtensionWebContentsObserver() { 46 ExtensionWebContentsObserver::~ExtensionWebContentsObserver() {
46 } 47 }
47 48
48 void ExtensionWebContentsObserver::InitializeRenderFrame( 49 void ExtensionWebContentsObserver::InitializeRenderFrame(
49 content::RenderFrameHost* render_frame_host) { 50 content::RenderFrameHost* render_frame_host) {
50 DCHECK(render_frame_host); 51 DCHECK(render_frame_host);
51 DCHECK(render_frame_host->IsRenderFrameLive()); 52 DCHECK(render_frame_host->IsRenderFrameLive());
52 53
54 // At the initialization of the render frame, the last committed URL is not
55 // reliable, so do not take it into account in determining whether it is an
56 // extension frame.
57 const Extension* frame_extension =
58 GetExtensionFromFrame(render_frame_host, false);
59 // This observer is attached to every WebContents, so we are also notified of
60 // frames that are not in an extension process.
61 if (!frame_extension)
62 return;
63
53 // Notify the render frame of the view type. 64 // Notify the render frame of the view type.
54 render_frame_host->Send(new ExtensionMsg_NotifyRenderViewType( 65 render_frame_host->Send(new ExtensionMsg_NotifyRenderViewType(
55 render_frame_host->GetRoutingID(), GetViewType(web_contents()))); 66 render_frame_host->GetRoutingID(), GetViewType(web_contents())));
56 67
57 const Extension* frame_extension = GetExtensionFromFrame(render_frame_host); 68 ExtensionsBrowserClient::Get()->RegisterMojoServices(render_frame_host,
58 if (frame_extension) { 69 frame_extension);
59 ExtensionsBrowserClient::Get()->RegisterMojoServices(render_frame_host, 70 ProcessManager::Get(browser_context_)
60 frame_extension); 71 ->RegisterRenderFrameHost(web_contents(), render_frame_host,
61 ProcessManager::Get(browser_context_) 72 frame_extension);
62 ->RegisterRenderFrameHost(web_contents(), render_frame_host,
63 frame_extension);
64 }
65 } 73 }
66 74
67 content::WebContents* ExtensionWebContentsObserver::GetAssociatedWebContents() 75 content::WebContents* ExtensionWebContentsObserver::GetAssociatedWebContents()
68 const { 76 const {
69 return web_contents(); 77 return web_contents();
70 } 78 }
71 79
72 void ExtensionWebContentsObserver::RenderViewCreated( 80 void ExtensionWebContentsObserver::RenderViewCreated(
73 content::RenderViewHost* render_view_host) { 81 content::RenderViewHost* render_view_host) {
74 // TODO(devlin): Most/all of this should move to RenderFrameCreated. 82 // TODO(devlin): Most/all of this should move to RenderFrameCreated.
(...skipping 28 matching lines...) Expand all
103 content::RenderFrameHost* render_frame_host) { 111 content::RenderFrameHost* render_frame_host) {
104 InitializeRenderFrame(render_frame_host); 112 InitializeRenderFrame(render_frame_host);
105 } 113 }
106 114
107 void ExtensionWebContentsObserver::RenderFrameDeleted( 115 void ExtensionWebContentsObserver::RenderFrameDeleted(
108 content::RenderFrameHost* render_frame_host) { 116 content::RenderFrameHost* render_frame_host) {
109 ProcessManager::Get(browser_context_) 117 ProcessManager::Get(browser_context_)
110 ->UnregisterRenderFrameHost(render_frame_host); 118 ->UnregisterRenderFrameHost(render_frame_host);
111 } 119 }
112 120
121 void ExtensionWebContentsObserver::DidCommitProvisionalLoadForFrame(
122 content::RenderFrameHost* render_frame_host,
123 const GURL& url,
124 ui::PageTransition transition_type) {
125 ProcessManager* pm = ProcessManager::Get(browser_context_);
126
127 if (pm->IsRenderFrameHostRegistered(render_frame_host)) {
128 const Extension* frame_extension =
129 GetExtensionFromFrame(render_frame_host, true);
130
131 if (!frame_extension)
132 pm->UnregisterRenderFrameHost(render_frame_host);
133 }
134 }
135
136 void ExtensionWebContentsObserver::DidNavigateAnyFrame(
137 content::RenderFrameHost* render_frame_host,
138 const content::LoadCommittedDetails& details,
139 const content::FrameNavigateParams& params) {
140 if (details.is_in_page)
141 return;
142
143 const Extension* frame_extension =
144 GetExtensionFromFrame(render_frame_host, true);
145 ProcessManager* pm = ProcessManager::Get(browser_context_);
146
147 if (!frame_extension) {
148 // Should have been unregistered by DidCommitProvisionalLoadForFrame.
149 DCHECK(!pm->IsRenderFrameHostRegistered(render_frame_host));
150 return;
151 }
152
153 if (pm->IsRenderFrameHostRegistered(render_frame_host)) {
154 // Notify ProcessManager, because some clients do not just want to know
155 // whether the frame is in an extension process, but also whether the frame
156 // was navigated.
157 pm->DidNavigateRenderFrameHost(render_frame_host);
158 } else {
159 pm->RegisterRenderFrameHost(web_contents(), render_frame_host,
160 frame_extension);
161 }
162 }
163
113 bool ExtensionWebContentsObserver::OnMessageReceived( 164 bool ExtensionWebContentsObserver::OnMessageReceived(
114 const IPC::Message& message, 165 const IPC::Message& message,
115 content::RenderFrameHost* render_frame_host) { 166 content::RenderFrameHost* render_frame_host) {
116 bool handled = true; 167 bool handled = true;
117 IPC_BEGIN_MESSAGE_MAP_WITH_PARAM( 168 IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(
118 ExtensionWebContentsObserver, message, render_frame_host) 169 ExtensionWebContentsObserver, message, render_frame_host)
119 IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnRequest) 170 IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnRequest)
120 IPC_MESSAGE_UNHANDLED(handled = false) 171 IPC_MESSAGE_UNHANDLED(handled = false)
121 IPC_END_MESSAGE_MAP() 172 IPC_END_MESSAGE_MAP()
122 return handled; 173 return handled;
(...skipping 16 matching lines...) Expand all
139 ProcessManager::Get(browser_context_); 190 ProcessManager::Get(browser_context_);
140 const Extension* const extension = 191 const Extension* const extension =
141 process_manager->GetExtensionForWebContents(web_contents()); 192 process_manager->GetExtensionForWebContents(web_contents());
142 if (extension) 193 if (extension)
143 process_manager->DecrementLazyKeepaliveCount(extension); 194 process_manager->DecrementLazyKeepaliveCount(extension);
144 } 195 }
145 } 196 }
146 197
147 std::string ExtensionWebContentsObserver::GetExtensionIdFromFrame( 198 std::string ExtensionWebContentsObserver::GetExtensionIdFromFrame(
148 content::RenderFrameHost* render_frame_host) const { 199 content::RenderFrameHost* render_frame_host) const {
149 content::SiteInstance* site_instance = render_frame_host->GetSiteInstance(); 200 const Extension* extension = GetExtensionFromFrame(render_frame_host, true);
150 GURL url = render_frame_host->GetLastCommittedURL(); 201 return extension ? extension->id() : std::string();
151 if (!url.is_empty()) {
152 if (site_instance->GetSiteURL().GetOrigin() != url.GetOrigin())
153 return std::string();
154 } else {
155 url = site_instance->GetSiteURL();
156 }
157
158 return url.SchemeIs(kExtensionScheme) ? url.host() : std::string();
159 } 202 }
160 203
161 const Extension* ExtensionWebContentsObserver::GetExtensionFromFrame( 204 const Extension* ExtensionWebContentsObserver::GetExtensionFromFrame(
162 content::RenderFrameHost* render_frame_host) const { 205 content::RenderFrameHost* render_frame_host,
163 return ExtensionRegistry::Get( 206 bool verify_url) const {
164 render_frame_host->GetProcess()->GetBrowserContext()) 207 const GURL site_url(render_frame_host->GetSiteInstance()->GetSiteURL());
165 ->enabled_extensions() 208 if (!site_url.SchemeIs(kExtensionScheme))
166 .GetByID(GetExtensionIdFromFrame(render_frame_host)); 209 return nullptr;
210
211 const std::string& extension_id = site_url.host();
212 content::BrowserContext* browser_context =
213 render_frame_host->GetProcess()->GetBrowserContext();
214 const Extension* extension = ExtensionRegistry::Get(browser_context)
215 ->enabled_extensions()
216 .GetByID(extension_id);
217 if (!extension)
218 return nullptr;
219
220 if (verify_url) {
221 const url::Origin& origin(render_frame_host->GetLastCommittedOrigin());
222 // Without site isolation, this check is needed to eliminate non-extension
223 // schemes. With site isolation, this is still needed to exclude sandboxed
224 // extension frames with a unique origin.
225 if (origin.unique() ||
226 site_url != content::SiteInstance::GetSiteForURL(
227 browser_context, GURL(origin.Serialize())))
228 return nullptr;
229 }
230
231 return extension;
167 } 232 }
168 233
169 const Extension* ExtensionWebContentsObserver::GetExtension( 234 const Extension* ExtensionWebContentsObserver::GetExtension(
170 content::RenderViewHost* render_view_host) { 235 content::RenderViewHost* render_view_host) {
171 std::string extension_id = GetExtensionId(render_view_host); 236 std::string extension_id = GetExtensionId(render_view_host);
172 if (extension_id.empty()) 237 if (extension_id.empty())
173 return NULL; 238 return NULL;
174 239
175 // May be null if the extension doesn't exist, for example if somebody typos 240 // May be null if the extension doesn't exist, for example if somebody typos
176 // a chrome-extension:// URL. 241 // a chrome-extension:// URL.
(...skipping 26 matching lines...) Expand all
203 // Since this is called for all existing RenderFrameHosts during the 268 // Since this is called for all existing RenderFrameHosts during the
204 // ExtensionWebContentsObserver's creation, it's possible that not all hosts 269 // ExtensionWebContentsObserver's creation, it's possible that not all hosts
205 // are ready. 270 // are ready.
206 // We only initialize the frame if the renderer counterpart is live; otherwise 271 // We only initialize the frame if the renderer counterpart is live; otherwise
207 // we wait for the RenderFrameCreated notification. 272 // we wait for the RenderFrameCreated notification.
208 if (render_frame_host->IsRenderFrameLive()) 273 if (render_frame_host->IsRenderFrameLive())
209 InitializeRenderFrame(render_frame_host); 274 InitializeRenderFrame(render_frame_host);
210 } 275 }
211 276
212 } // namespace extensions 277 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698