| Index: chrome/browser/extensions/process_management_browsertest.cc
|
| diff --git a/chrome/browser/extensions/process_management_browsertest.cc b/chrome/browser/extensions/process_management_browsertest.cc
|
| index f0702c845664ff03110221a60a1beca0668908ee..c2691edb3919f4e2579be88d7c6cf3ff9818b6c4 100644
|
| --- a/chrome/browser/extensions/process_management_browsertest.cc
|
| +++ b/chrome/browser/extensions/process_management_browsertest.cc
|
| @@ -26,6 +26,7 @@
|
| #include "content/public/browser/web_contents.h"
|
| #include "content/public/test/browser_test_utils.h"
|
| #include "content/public/test/test_navigation_observer.h"
|
| +#include "content/public/test/test_utils.h"
|
| #include "extensions/browser/extension_host.h"
|
| #include "extensions/browser/process_manager.h"
|
| #include "extensions/browser/process_map.h"
|
| @@ -225,6 +226,54 @@ IN_PROC_BROWSER_TEST_F(ProcessManagementTest, MAYBE_ProcessOverflow) {
|
| EXPECT_EQ(extension1_host, extension2_host);
|
| }
|
|
|
| +// Test that unrelated browsing contexts cannot find each other's windows,
|
| +// even when they end up using the same renderer process (e.g. because of
|
| +// hitting a process limit). See also https://crbug.com/718489.
|
| +IN_PROC_BROWSER_TEST_F(ProcessManagementTest, ProcessReuseVsBrowsingInstance) {
|
| + // Set max renderers to 1 to force reusing a renderer process between two
|
| + // unrelated tabs.
|
| + content::RenderProcessHost::SetMaxRendererProcessCount(1);
|
| +
|
| + // Navigate 2 tabs to a web page (regular web pages can share renderers
|
| + // among themselves without any restrictions, unlike extensions, apps, etc.).
|
| + ASSERT_TRUE(embedded_test_server()->Start());
|
| + GURL url1(embedded_test_server()->GetURL("/title1.html"));
|
| + GURL url2(embedded_test_server()->GetURL("/title2.html"));
|
| + ui_test_utils::NavigateToURL(browser(), url1);
|
| + ui_test_utils::NavigateToURLWithDisposition(
|
| + browser(), url2, WindowOpenDisposition::NEW_FOREGROUND_TAB,
|
| + ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
|
| + content::RenderFrameHost* tab1 =
|
| + browser()->tab_strip_model()->GetWebContentsAt(0)->GetMainFrame();
|
| + content::RenderFrameHost* tab2 =
|
| + browser()->tab_strip_model()->GetWebContentsAt(1)->GetMainFrame();
|
| +
|
| + // Sanity-check test setup: 2 frames share a renderer process, but are not in
|
| + // a related browsing instance.
|
| + if (!content::AreAllSitesIsolatedForTesting())
|
| + EXPECT_EQ(tab1->GetProcess(), tab2->GetProcess());
|
| + EXPECT_FALSE(
|
| + tab1->GetSiteInstance()->IsRelatedSiteInstance(tab2->GetSiteInstance()));
|
| +
|
| + // Name the 2 frames.
|
| + EXPECT_TRUE(content::ExecuteScript(tab1, "window.name = 'tab1';"));
|
| + EXPECT_TRUE(content::ExecuteScript(tab2, "window.name = 'tab2';"));
|
| +
|
| + // Verify that |tab1| cannot find named frames belonging to |tab2| (i.e. that
|
| + // window.open will end up creating a new tab rather than returning the old
|
| + // |tab2| tab).
|
| + content::WebContentsAddedObserver new_contents_observer;
|
| + std::string location_of_opened_window;
|
| + EXPECT_TRUE(ExecuteScriptAndExtractString(
|
| + tab1,
|
| + "var w = window.open('', 'tab2');\n"
|
| + "window.domAutomationController.send(w.location.href);",
|
| + &location_of_opened_window));
|
| + EXPECT_EQ(url::kAboutBlankURL, location_of_opened_window);
|
| + new_contents_observer.GetWebContents();
|
| + EXPECT_EQ(3, browser()->tab_strip_model()->count());
|
| +}
|
| +
|
| // See
|
| #if defined(OS_WIN)
|
| #define MAYBE_ExtensionProcessBalancing DISABLED_ExtensionProcessBalancing
|
|
|