Chromium Code Reviews| Index: content/browser/renderer_host/render_process_host_browsertest.cc |
| diff --git a/content/browser/renderer_host/render_process_host_browsertest.cc b/content/browser/renderer_host/render_process_host_browsertest.cc |
| index 941371c205b6a40ec54b5ee8dc58426208c71266..773b05762fb6b358f3fa305b59cc25c16ce92600 100644 |
| --- a/content/browser/renderer_host/render_process_host_browsertest.cc |
| +++ b/content/browser/renderer_host/render_process_host_browsertest.cc |
| @@ -4,12 +4,15 @@ |
| #include "content/browser/renderer_host/render_process_host_browsertest.h" |
| +#include "base/bind.h" |
| #include "base/command_line.h" |
| +#include "base/process.h" |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/test/base/ui_test_utils.h" |
| #include "content/browser/renderer_host/render_process_host_impl.h" |
| #include "content/browser/tab_contents/tab_contents.h" |
| #include "content/common/test_url_constants.h" |
| +#include "content/public/browser/browser_thread.h" |
| #include "content/public/common/content_switches.h" |
| RenderProcessHostTest::RenderProcessHostTest() { |
| @@ -28,6 +31,26 @@ int RenderProcessHostTest::RenderProcessHostCount() { |
| return count; |
| } |
| +void PostQuit(MessageLoop* loop) { |
| + loop->PostTask(FROM_HERE, new MessageLoop::QuitTask); |
| +} |
| + |
| +void DoNothing() {} |
| + |
| +base::ProcessHandle RenderProcessHostTest::ShowSingletonTab(const GURL& page) { |
| + browser()->ShowSingletonTab(page); |
|
Ben Goodger (Google)
2011/12/02 00:05:04
Can you achieve this by using a different Browser
|
| + TabContents* tc = browser()->GetSelectedTabContents(); |
| + CHECK(tc->GetURL() == page); |
| + |
| + // Ensure that the backgrounding / foregrounding gets a chance to run. |
| + content::BrowserThread::PostTaskAndReply( |
| + content::BrowserThread::PROCESS_LAUNCHER, FROM_HERE, |
| + base::Bind(DoNothing), MessageLoop::QuitClosure()); |
| + MessageLoop::current()->Run(); |
| + |
| + return tc->GetRenderProcessHost()->GetHandle(); |
| +} |
| + |
| IN_PROC_BROWSER_TEST_F(RenderProcessHostTest, ProcessPerTab) { |
| // Set max renderers to 1 to force running out of processes. |
| content::RenderProcessHost::SetMaxRendererProcessCountForTest(1); |
| @@ -84,6 +107,42 @@ IN_PROC_BROWSER_TEST_F(RenderProcessHostTest, ProcessPerTab) { |
| EXPECT_EQ(host_count, RenderProcessHostCount()); |
| } |
| +// We don't change process priorities on Mac or Posix because the user lacks the |
| +// permission to raise a process' priority even after lowering it. |
| +#if defined(OS_WIN) || defined(OS_LINUX) |
| +IN_PROC_BROWSER_TEST_F(RenderProcessHostTest, Backgrounding) { |
| + if (!base::Process::CanBackgroundProcesses()) { |
| + LOG(ERROR) << "Can't background processes"; |
| + return; |
| + } |
| + CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess(); |
| + parsed_command_line.AppendSwitch(switches::kProcessPerTab); |
| + |
| + // Change the first tab to be the new tab page (TYPE_WEBUI). |
| + GURL newtab(chrome::kTestNewTabURL); |
| + ui_test_utils::NavigateToURL(browser(), newtab); |
| + |
| + // Create a new tab. It should be foreground. |
| + GURL page1("data:text/html,hello world1"); |
| + base::ProcessHandle pid1 = ShowSingletonTab(page1); |
| + EXPECT_FALSE(base::Process(pid1).IsProcessBackgrounded()); |
| + |
| + // Create another tab. It should be foreground, and the first tab should |
| + // now be background. |
| + GURL page2("data:text/html,hello world2"); |
| + base::ProcessHandle pid2 = ShowSingletonTab(page2); |
| + EXPECT_NE(pid1, pid2); |
| + EXPECT_TRUE(base::Process(pid1).IsProcessBackgrounded()); |
| + EXPECT_FALSE(base::Process(pid2).IsProcessBackgrounded()); |
| + |
| + // Navigate back to first page. It should be foreground again, and the second |
| + // tab should be background. |
| + EXPECT_EQ(pid1, ShowSingletonTab(page1)); |
| + EXPECT_FALSE(base::Process(pid1).IsProcessBackgrounded()); |
| + EXPECT_TRUE(base::Process(pid2).IsProcessBackgrounded()); |
| +} |
| +#endif |
| + |
| // 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 |