Chromium Code Reviews| Index: chrome/browser/extensions/process_manager_browsertest.cc |
| diff --git a/chrome/browser/extensions/process_manager_browsertest.cc b/chrome/browser/extensions/process_manager_browsertest.cc |
| index 6a0190913b0711aeecaab644fb485f743d99220c..6b73cb31114ccfeaf924028b21e1687c1cb74c6c 100644 |
| --- a/chrome/browser/extensions/process_manager_browsertest.cc |
| +++ b/chrome/browser/extensions/process_manager_browsertest.cc |
| @@ -21,6 +21,7 @@ |
| #include "chrome/test/base/ui_test_utils.h" |
| #include "content/public/browser/notification_service.h" |
| #include "content/public/browser/render_frame_host.h" |
| +#include "content/public/browser/render_process_host.h" |
| #include "content/public/browser/web_contents.h" |
| #include "content/public/test/browser_test_utils.h" |
| #include "content/public/test/test_utils.h" |
| @@ -527,4 +528,51 @@ IN_PROC_BROWSER_TEST_F(ProcessManagerBrowserTest, KeepaliveOnNetworkRequest) { |
| EXPECT_EQ(baseline_keepalive, pm->GetLazyKeepaliveCount(extension.get())); |
| } |
| +IN_PROC_BROWSER_TEST_F(ProcessManagerBrowserTest, ExtensionProcessReuse) { |
| + content::RenderProcessHost::SetMaxRendererProcessCount(2); |
| + ProcessManager* pm = ProcessManager::Get(profile()); |
| + |
| + std::set<int> processes; |
| + std::set<const Extension*> installed_extensions; |
| + |
| + // Create 3 extensions, which is more than the process limit. |
| + for (int i = 1; i <= 3; i++) { |
|
Devlin
2016/04/07 15:06:37
nit: ++i
ncarter (slow)
2016/04/07 21:41:09
Done.
|
| + const Extension* extension = |
| + CreateExtension(base::StringPrintf("Extension %d", i), true); |
| + installed_extensions.insert(extension); |
| + ExtensionHost* extension_host = |
| + pm->GetBackgroundHostForExtension(extension->id()); |
| + |
| + EXPECT_EQ(GURL("chrome-extension://" + extension->id()), |
|
Devlin
2016/04/07 15:06:37
nit: extension->url()
ncarter (slow)
2016/04/07 21:41:09
Done.
|
| + extension_host->host_contents()->GetSiteInstance()->GetSiteURL()); |
| + |
| + processes.insert(extension_host->render_process_host()->GetID()); |
| + } |
| + |
| + EXPECT_EQ(3U, installed_extensions.size()); |
|
Devlin
2016/04/07 15:06:37
given the number of 3us here, it might be more rea
ncarter (slow)
2016/04/07 21:41:09
Done.
|
| + |
| + if (content::AreAllSitesIsolatedForTesting()) { |
| + EXPECT_EQ(3U, processes.size()) << "Extension process reuse is expected to " |
| + "be disabled in --site-per-process."; |
| + } else { |
| + EXPECT_LT(processes.size(), 3U) |
| + << "Expected extension process reuse, but none happened."; |
| + } |
| + |
| + // Interact with each extension background page by setting and reading back |
| + // the cookie. This would fail for one of the two extensions in a shared |
| + // process, if that process is locked to a single origin. This is a regression |
| + // test for http://crbug.com/600441. |
| + for (const Extension* extension : installed_extensions) { |
| + content::DOMMessageQueue queue; |
| + ExecuteScriptInBackgroundPageNoWait( |
| + extension->id(), |
| + "document.cookie = 'extension_cookie';" |
| + "window.domAutomationController.send(document.cookie);"); |
| + std::string message; |
| + ASSERT_TRUE(queue.WaitForMessage(&message)); |
| + EXPECT_EQ(message, "\"extension_cookie\""); |
| + } |
| +} |
| + |
| } // namespace extensions |