diff options
author | mnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-28 17:37:40 +0000 |
---|---|---|
committer | mnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-28 17:37:40 +0000 |
commit | 2fba276d4c3f693b87e0df88e6ea0f8dcb1a5e8e (patch) | |
tree | 97ad4f0668202c1920a1af430be3b7e2f9d6fa56 /chrome | |
parent | 7ed3d5740a86bf878b94d4c3bf8d9220a0d903d2 (diff) | |
download | chromium_src-2fba276d4c3f693b87e0df88e6ea0f8dcb1a5e8e.zip chromium_src-2fba276d4c3f693b87e0df88e6ea0f8dcb1a5e8e.tar.gz chromium_src-2fba276d4c3f693b87e0df88e6ea0f8dcb1a5e8e.tar.bz2 |
Simple fix to make sure that DevTools run in a separate process in 'process-per-tab' mode.
BUG=69873
TEST=none
Review URL: http://codereview.chromium.org/6335017
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@72969 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/browsing_instance.cc | 4 | ||||
-rw-r--r-- | chrome/browser/renderer_host/test/render_process_host_browsertest.cc | 97 | ||||
-rw-r--r-- | chrome/browser/tab_contents/render_view_context_menu.cc | 5 |
3 files changed, 100 insertions, 6 deletions
diff --git a/chrome/browser/browsing_instance.cc b/chrome/browser/browsing_instance.cc index 72c121b..4266e8c 100644 --- a/chrome/browser/browsing_instance.cc +++ b/chrome/browser/browsing_instance.cc @@ -38,7 +38,9 @@ bool BrowsingInstance::ShouldUseProcessPerSite(const GURL& url) { if (url.SchemeIs(chrome::kExtensionScheme)) return true; - if (DOMUIFactory::UseDOMUIForURL(profile_, url)) + // DevTools pages have DOMUI type but should not reuse the same host. + if (DOMUIFactory::UseDOMUIForURL(profile_, url) && + !url.SchemeIs(chrome::kChromeDevToolsScheme)) return true; // In all other cases, don't use process-per-site logic. diff --git a/chrome/browser/renderer_host/test/render_process_host_browsertest.cc b/chrome/browser/renderer_host/test/render_process_host_browsertest.cc index 46a960c..04a7c5f 100644 --- a/chrome/browser/renderer_host/test/render_process_host_browsertest.cc +++ b/chrome/browser/renderer_host/test/render_process_host_browsertest.cc @@ -3,10 +3,14 @@ // found in the LICENSE file. #include "base/command_line.h" +#include "chrome/browser/debugger/devtools_manager.h" #include "chrome/browser/renderer_host/site_instance.h" #include "chrome/browser/tab_contents/tab_contents.h" #include "chrome/browser/renderer_host/render_process_host.h" +#include "chrome/browser/renderer_host/render_view_host.h" +#include "chrome/browser/renderer_host/render_widget_host.h" #include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/url_constants.h" #include "chrome/test/in_process_browser_test.h" @@ -28,6 +32,32 @@ class RenderProcessHostTest : public InProcessBrowserTest { } return count; } + + RenderViewHost* FindFirstDevToolsHost() { + RenderProcessHost::iterator hosts = RenderProcessHost::AllHostsIterator(); + for (; !hosts.IsAtEnd(); hosts.Advance()) { + RenderProcessHost* render_process_host = hosts.GetCurrentValue(); + DCHECK(render_process_host); + if (!render_process_host->HasConnection()) + continue; + RenderProcessHost::listeners_iterator iter( + render_process_host->ListenersIterator()); + for (; !iter.IsAtEnd(); iter.Advance()) { + const RenderWidgetHost* widget = + static_cast<const RenderWidgetHost*>(iter.GetCurrentValue()); + DCHECK(widget); + if (!widget || !widget->IsRenderView()) + continue; + RenderViewHost* host = const_cast<RenderViewHost*>( + static_cast<const RenderViewHost*>(widget)); + RenderViewHostDelegate* host_delegate = host->delegate(); + GURL url = host_delegate->GetURL(); + if (url.SchemeIs(chrome::kChromeDevToolsScheme)) + return host; + } + } + return NULL; + } }; IN_PROC_BROWSER_TEST_F(RenderProcessHostTest, ProcessPerTab) { @@ -82,6 +112,73 @@ IN_PROC_BROWSER_TEST_F(RenderProcessHostTest, ProcessPerTab) { EXPECT_EQ(host_count, RenderProcessHostCount()); } +// Ensure that DevTools opened to debug DevTools is launched in a separate +// process when --process-per-tab is set. See crbug.com/69873. +IN_PROC_BROWSER_TEST_F(RenderProcessHostTest, DevToolsOnSelfInOwnProcessPPT) { + CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess(); + parsed_command_line.AppendSwitch(switches::kProcessPerTab); + + int tab_count = 1; + int host_count = 1; + + GURL page1("data:text/html,hello world1"); + browser()->ShowSingletonTab(page1, false); + if (browser()->tab_count() == tab_count) + ui_test_utils::WaitForNewTab(browser()); + tab_count++; + host_count++; + EXPECT_EQ(tab_count, browser()->tab_count()); + EXPECT_EQ(host_count, RenderProcessHostCount()); + + // DevTools start in docked mode (no new tab), in a separate process. + browser()->ToggleDevToolsWindow(DEVTOOLS_TOGGLE_ACTION_INSPECT); + host_count++; + EXPECT_EQ(tab_count, browser()->tab_count()); + EXPECT_EQ(host_count, RenderProcessHostCount()); + + RenderViewHost* devtools = FindFirstDevToolsHost(); + DCHECK(devtools); + + // DevTools start in a separate process. + DevToolsManager::GetInstance()->ToggleDevToolsWindow( + devtools, DEVTOOLS_TOGGLE_ACTION_INSPECT); + host_count++; + EXPECT_EQ(tab_count, browser()->tab_count()); + EXPECT_EQ(host_count, RenderProcessHostCount()); +} + +// Ensure that DevTools opened to debug DevTools is launched in a separate +// process. See crbug.com/69873. +IN_PROC_BROWSER_TEST_F(RenderProcessHostTest, DevToolsOnSelfInOwnProcess) { + int tab_count = 1; + int host_count = 1; + + GURL page1("data:text/html,hello world1"); + browser()->ShowSingletonTab(page1, false); + if (browser()->tab_count() == tab_count) + ui_test_utils::WaitForNewTab(browser()); + tab_count++; + host_count++; + EXPECT_EQ(tab_count, browser()->tab_count()); + EXPECT_EQ(host_count, RenderProcessHostCount()); + + // DevTools start in docked mode (no new tab), in a separate process. + browser()->ToggleDevToolsWindow(DEVTOOLS_TOGGLE_ACTION_INSPECT); + host_count++; + EXPECT_EQ(tab_count, browser()->tab_count()); + EXPECT_EQ(host_count, RenderProcessHostCount()); + + RenderViewHost* devtools = FindFirstDevToolsHost(); + DCHECK(devtools); + + // DevTools start in a separate process. + DevToolsManager::GetInstance()->ToggleDevToolsWindow( + devtools, DEVTOOLS_TOGGLE_ACTION_INSPECT); + host_count++; + EXPECT_EQ(tab_count, browser()->tab_count()); + EXPECT_EQ(host_count, RenderProcessHostCount()); +} + // When we hit the max number of renderers, verify that the way we do process // sharing behaves correctly. In particular, this test is verifying that even // when we hit the max process limit, that renderers of each type will wind up diff --git a/chrome/browser/tab_contents/render_view_context_menu.cc b/chrome/browser/tab_contents/render_view_context_menu.cc index 508d8fe..0339888 100644 --- a/chrome/browser/tab_contents/render_view_context_menu.cc +++ b/chrome/browser/tab_contents/render_view_context_menu.cc @@ -1432,11 +1432,6 @@ bool RenderViewContextMenu::IsDevCommandEnabled(int id) const { if (!profile_->GetPrefs()->GetBoolean(prefs::kWebKitJavascriptEnabled) || command_line.HasSwitch(switches::kDisableJavaScript)) return false; - // Don't enable the web inspector on web inspector if there is no process - // per tab flag set. - if (IsDevToolsURL(active_entry->url()) && - !command_line.HasSwitch(switches::kProcessPerTab)) - return false; // Don't enable the web inspector if the developer tools are disabled via // the preference dev-tools-disabled. if (profile_->GetPrefs()->GetBoolean(prefs::kDevToolsDisabled)) |