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

Side by Side Diff: chrome/browser/tab_contents/render_view_host_manager.cc

Issue 6335014: Ensure that normal URLs are not loaded in the NTP process in process-per-tab. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 10 months 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 | Annotate | Revision Log
« no previous file with comments | « chrome/browser/dom_ui/new_tab_ui_uitest.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 "chrome/browser/tab_contents/render_view_host_manager.h" 5 #include "chrome/browser/tab_contents/render_view_host_manager.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "chrome/browser/dom_ui/dom_ui.h" 9 #include "chrome/browser/dom_ui/dom_ui.h"
10 #include "chrome/browser/dom_ui/dom_ui_factory.h" 10 #include "chrome/browser/dom_ui/dom_ui_factory.h"
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 // True if we are using process-per-site-instance (default) or 285 // True if we are using process-per-site-instance (default) or
286 // process-per-site (kProcessPerSite). 286 // process-per-site (kProcessPerSite).
287 return !CommandLine::ForCurrentProcess()->HasSwitch(switches::kProcessPerTab); 287 return !CommandLine::ForCurrentProcess()->HasSwitch(switches::kProcessPerTab);
288 } 288 }
289 289
290 bool RenderViewHostManager::ShouldSwapProcessesForNavigation( 290 bool RenderViewHostManager::ShouldSwapProcessesForNavigation(
291 const NavigationEntry* cur_entry, 291 const NavigationEntry* cur_entry,
292 const NavigationEntry* new_entry) const { 292 const NavigationEntry* new_entry) const {
293 DCHECK(new_entry); 293 DCHECK(new_entry);
294 294
295 // Check for reasons to swap processes even if we are in a process model that
296 // doesn't usually swap (e.g., process-per-tab).
297
298 // For security, we should transition between processes when one is a DOM UI
299 // page and one isn't. If there's no cur_entry, check the current RVH's
300 // site, which might already be committed to a DOM UI URL (such as the NTP).
301 const GURL& current_url = (cur_entry) ? cur_entry->url() :
302 render_view_host_->site_instance()->site();
303 Profile* profile = delegate_->GetControllerForRenderManager().profile();
304 if (DOMUIFactory::UseDOMUIForURL(profile, current_url)) {
305 // Force swap if it's not an acceptable URL for DOM UI.
306 if (!DOMUIFactory::IsURLAcceptableForDOMUI(profile, new_entry->url()))
307 return true;
308 } else {
309 // Force swap if it's a DOM UI URL.
310 if (DOMUIFactory::UseDOMUIForURL(profile, new_entry->url()))
311 return true;
312 }
313
295 if (!cur_entry) { 314 if (!cur_entry) {
296 // Always choose a new process when navigating to extension URLs. The 315 // Always choose a new process when navigating to extension URLs. The
297 // process grouping logic will combine all of a given extension's pages 316 // process grouping logic will combine all of a given extension's pages
298 // into the same process. 317 // into the same process.
299 if (new_entry->url().SchemeIs(chrome::kExtensionScheme)) 318 if (new_entry->url().SchemeIs(chrome::kExtensionScheme))
300 return true; 319 return true;
301 // When a tab is created, it starts as TYPE_NORMAL. If the new entry is a 320
302 // DOM UI page, it needs to be grouped with other DOM UI pages. This matches
303 // the logic when transitioning between DOM UI and normal pages.
304 Profile* profile = delegate_->GetControllerForRenderManager().profile();
305 if (DOMUIFactory::UseDOMUIForURL(profile, new_entry->url()))
306 return true;
307 return false; 321 return false;
308 } 322 }
309 323
310 // We can't switch a RenderView between view source and non-view source mode 324 // We can't switch a RenderView between view source and non-view source mode
311 // without screwing up the session history sometimes (when navigating between 325 // without screwing up the session history sometimes (when navigating between
312 // "view-source:http://foo.com/" and "http://foo.com/", WebKit doesn't treat 326 // "view-source:http://foo.com/" and "http://foo.com/", WebKit doesn't treat
313 // it as a new navigation). So require a view switch. 327 // it as a new navigation). So require a view switch.
314 if (cur_entry->IsViewSourceMode() != new_entry->IsViewSourceMode()) 328 if (cur_entry->IsViewSourceMode() != new_entry->IsViewSourceMode())
315 return true; 329 return true;
316 330
317 // For security, we should transition between processes when one is a DOM UI
318 // page and one isn't.
319 Profile* profile = delegate_->GetControllerForRenderManager().profile();
320 if (DOMUIFactory::UseDOMUIForURL(profile, cur_entry->url())) {
321 // Force swap if it's not an acceptable URL for DOM UI.
322 if (!DOMUIFactory::IsURLAcceptableForDOMUI(profile, new_entry->url()))
323 return true;
324 } else {
325 // Force swap if it's a DOM UI URL.
326 if (DOMUIFactory::UseDOMUIForURL(profile, new_entry->url()))
327 return true;
328 }
329
330 // Also, we must switch if one is an extension and the other is not the exact 331 // Also, we must switch if one is an extension and the other is not the exact
331 // same extension. 332 // same extension.
332 if (cur_entry->url().SchemeIs(chrome::kExtensionScheme) || 333 if (cur_entry->url().SchemeIs(chrome::kExtensionScheme) ||
333 new_entry->url().SchemeIs(chrome::kExtensionScheme)) { 334 new_entry->url().SchemeIs(chrome::kExtensionScheme)) {
334 if (cur_entry->url().GetOrigin() != new_entry->url().GetOrigin()) 335 if (cur_entry->url().GetOrigin() != new_entry->url().GetOrigin())
335 return true; 336 return true;
336 } 337 }
337 338
338 return false; 339 return false;
339 } 340 }
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after
719 Source<NavigationController>(&delegate_->GetControllerForRenderManager()), 720 Source<NavigationController>(&delegate_->GetControllerForRenderManager()),
720 Details<RenderViewHostSwitchedDetails>(&details)); 721 Details<RenderViewHostSwitchedDetails>(&details));
721 722
722 // This will cause the old RenderViewHost to delete itself. 723 // This will cause the old RenderViewHost to delete itself.
723 old_render_view_host->Shutdown(); 724 old_render_view_host->Shutdown();
724 725
725 // Let the task manager know that we've swapped RenderViewHosts, since it 726 // Let the task manager know that we've swapped RenderViewHosts, since it
726 // might need to update its process groupings. 727 // might need to update its process groupings.
727 delegate_->NotifySwappedFromRenderManager(); 728 delegate_->NotifySwappedFromRenderManager();
728 } 729 }
OLDNEW
« no previous file with comments | « chrome/browser/dom_ui/new_tab_ui_uitest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698