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..3bddd9fc82eb7b553efcc9147ef1709e90fcff39 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,53 @@ IN_PROC_BROWSER_TEST_F(ProcessManagerBrowserTest, KeepaliveOnNetworkRequest) { |
EXPECT_EQ(baseline_keepalive, pm->GetLazyKeepaliveCount(extension.get())); |
} |
+IN_PROC_BROWSER_TEST_F(ProcessManagerBrowserTest, ExtensionProcessReuse) { |
+ const size_t kNumExtensions = 3; |
+ content::RenderProcessHost::SetMaxRendererProcessCount(kNumExtensions - 1); |
+ 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 <= static_cast<int>(kNumExtensions); ++i) { |
+ const Extension* extension = |
+ CreateExtension(base::StringPrintf("Extension %d", i), true); |
+ installed_extensions.insert(extension); |
+ ExtensionHost* extension_host = |
+ pm->GetBackgroundHostForExtension(extension->id()); |
+ |
+ EXPECT_EQ(extension->url(), |
+ extension_host->host_contents()->GetSiteInstance()->GetSiteURL()); |
+ |
+ processes.insert(extension_host->render_process_host()->GetID()); |
+ } |
+ |
+ EXPECT_EQ(kNumExtensions, installed_extensions.size()); |
+ |
+ if (content::AreAllSitesIsolatedForTesting()) { |
+ EXPECT_EQ(kNumExtensions, processes.size()) << "Extension process reuse is " |
+ "expected to be disabled in " |
+ "--site-per-process."; |
+ } else { |
+ EXPECT_LT(processes.size(), kNumExtensions) |
+ << "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 |