Index: chrome/browser/extensions/api/tabs/tabs_test.cc |
diff --git a/chrome/browser/extensions/api/tabs/tabs_test.cc b/chrome/browser/extensions/api/tabs/tabs_test.cc |
index 55dd8156623ca832e07dea5de04a97c3bd3c6864..8eebd296e598da77e25aad3ac9859526c68e1f88 100644 |
--- a/chrome/browser/extensions/api/tabs/tabs_test.cc |
+++ b/chrome/browser/extensions/api/tabs/tabs_test.cc |
@@ -45,6 +45,7 @@ |
#include "content/public/common/page_zoom.h" |
#include "content/public/common/url_constants.h" |
#include "content/public/test/browser_test_utils.h" |
+#include "content/public/test/test_navigation_observer.h" |
#include "extensions/browser/api_test_utils.h" |
#include "extensions/browser/app_window/app_window.h" |
#include "extensions/browser/app_window/app_window_registry.h" |
@@ -2149,10 +2150,11 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, TemporaryAddressSpoof) { |
EXPECT_EQ(url, second_web_contents->GetVisibleURL()); |
} |
-// Window created by chrome.windows.create should be in the same SiteInstance |
-// and BrowsingInstance as the opener - this is a regression test for |
-// https://crbug.com/597750. |
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, WindowsCreateVsSiteInstance) { |
+// Tests how chrome.windows.create behaves when setSelfAsOpener parameter is |
+// used. setSelfAsOpener was introduced as a fix for https://crbug.com/713888 |
+// and https://crbug.com/718489. This is a (slightly morphed) regression test |
+// for https://crbug.com/597750. |
+IN_PROC_BROWSER_TEST_F(ExtensionApiTest, WindowsCreate_WithOpener) { |
const extensions::Extension* extension = |
LoadExtension(test_data_dir_.AppendASCII("../simple_with_file")); |
ASSERT_TRUE(extension); |
@@ -2167,28 +2169,51 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, WindowsCreateVsSiteInstance) { |
content::WebContents* new_contents = nullptr; |
{ |
content::WebContentsAddedObserver observer; |
- ASSERT_TRUE(content::ExecuteScript(old_contents, |
- "window.name = 'old-contents';\n" |
- "chrome.windows.create({url: '" + |
- extension_url.spec() + "'})")); |
+ std::string script = base::StringPrintf( |
+ R"( window.name = 'old-contents'; |
+ chrome.windows.create({url: '%s', setSelfAsOpener: true}); )", |
+ extension_url.spec().c_str()); |
+ ASSERT_TRUE(content::ExecuteScript(old_contents, script)); |
new_contents = observer.GetWebContents(); |
ASSERT_TRUE(content::WaitForLoadStop(new_contents)); |
} |
- // Verify that the old and new tab are in the same process and SiteInstance. |
- // Note: both test assertions are important - one observed failure mode was |
- // having the same process, but different SiteInstance. |
+ // Navigate the old and the new tab to a web URL. |
+ ASSERT_TRUE(StartEmbeddedTestServer()); |
+ GURL web_url1 = embedded_test_server()->GetURL("/title1.html"); |
+ GURL web_url2 = embedded_test_server()->GetURL("/title2.html"); |
+ { |
+ content::TestNavigationObserver nav_observer(new_contents, 1); |
+ ASSERT_TRUE(content::ExecuteScript( |
+ new_contents, "window.location = '" + web_url1.spec() + "';")); |
+ nav_observer.Wait(); |
+ } |
+ { |
+ content::TestNavigationObserver nav_observer(old_contents, 1); |
+ ASSERT_TRUE(content::ExecuteScript( |
+ old_contents, "window.location = '" + web_url2.spec() + "';")); |
+ nav_observer.Wait(); |
+ } |
+ EXPECT_EQ(web_url1, new_contents->GetMainFrame()->GetLastCommittedURL()); |
+ EXPECT_EQ(web_url2, old_contents->GetMainFrame()->GetLastCommittedURL()); |
+ |
+ // Verify that the old and new tab are in the same process. |
EXPECT_EQ(old_contents->GetMainFrame()->GetProcess(), |
new_contents->GetMainFrame()->GetProcess()); |
- EXPECT_EQ(old_contents->GetMainFrame()->GetSiteInstance(), |
- new_contents->GetMainFrame()->GetSiteInstance()); |
- // Verify that the |new_contents| doesn't have a |window.opener| set. |
- bool window_opener_cast_to_bool = true; |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- new_contents, "window.domAutomationController.send(!!window.opener)", |
- &window_opener_cast_to_bool)); |
- EXPECT_FALSE(window_opener_cast_to_bool); |
+ // Verify the old and new contents are in the same BrowsingInstance. |
+ EXPECT_TRUE( |
+ old_contents->GetMainFrame()->GetSiteInstance()->IsRelatedSiteInstance( |
+ new_contents->GetMainFrame()->GetSiteInstance())); |
+ |
+ // Verify that the |new_contents| has |window.opener| set. |
+ std::string location_of_opener; |
+ EXPECT_TRUE(ExecuteScriptAndExtractString( |
+ new_contents, |
+ "window.domAutomationController.send(window.opener.location.href)", |
+ &location_of_opener)); |
+ EXPECT_EQ(old_contents->GetMainFrame()->GetLastCommittedURL().spec(), |
+ location_of_opener); |
// Verify that |new_contents| can find |old_contents| using window.open/name. |
std::string location_of_other_window; |
@@ -2201,4 +2226,70 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, WindowsCreateVsSiteInstance) { |
location_of_other_window); |
} |
+// Tests how chrome.windows.create behaves when setSelfAsOpener parameter is not |
+// used. setSelfAsOpener was introduced as a fix for https://crbug.com/713888 |
+// and https://crbug.com/718489. |
+IN_PROC_BROWSER_TEST_F(ExtensionApiTest, WindowsCreate_NoOpener) { |
+ const extensions::Extension* extension = |
+ LoadExtension(test_data_dir_.AppendASCII("../simple_with_file")); |
+ ASSERT_TRUE(extension); |
+ |
+ // Navigate a tab to an extension page. |
+ GURL extension_url = extension->GetResourceURL("file.html"); |
+ ui_test_utils::NavigateToURL(browser(), extension_url); |
+ content::WebContents* old_contents = |
+ browser()->tab_strip_model()->GetActiveWebContents(); |
+ |
+ // Execute chrome.windows.create and store the new tab in |new_contents|. |
+ content::WebContents* new_contents = nullptr; |
+ { |
+ content::WebContentsAddedObserver observer; |
+ std::string script = base::StringPrintf( |
+ R"( window.name = 'old-contents'; |
+ chrome.windows.create({url: '%s'}); )", |
+ extension_url.spec().c_str()); |
+ ASSERT_TRUE(content::ExecuteScript(old_contents, script)); |
+ new_contents = observer.GetWebContents(); |
+ ASSERT_TRUE(content::WaitForLoadStop(new_contents)); |
+ } |
+ |
+ // Navigate the new tab to a web URL. |
+ // TODO(lukasza): This part of the test works around not yet fixed |
+ // http://crbug.com/718489 (which means that frames that share the same |
+ // renderer process can find each other even if they are not in the same |
+ // browsing instance). |
+ ASSERT_TRUE(StartEmbeddedTestServer()); |
+ GURL web_url = embedded_test_server()->GetURL("/title1.html"); |
+ { |
+ content::TestNavigationObserver nav_observer(new_contents, 1); |
+ ASSERT_TRUE(content::ExecuteScript( |
+ new_contents, "window.location = '" + web_url.spec() + "';")); |
+ nav_observer.Wait(); |
+ } |
+ EXPECT_EQ(web_url, new_contents->GetMainFrame()->GetLastCommittedURL()); |
+ |
+ // Verify the old and new contents are NOT in the same BrowsingInstance. |
+ EXPECT_FALSE( |
+ old_contents->GetMainFrame()->GetSiteInstance()->IsRelatedSiteInstance( |
+ new_contents->GetMainFrame()->GetSiteInstance())); |
+ |
+ // Verify that the |new_contents| doesn't have |window.opener| set. |
+ bool opener_as_bool; |
+ EXPECT_TRUE(ExecuteScriptAndExtractBool( |
+ new_contents, "window.domAutomationController.send(!!window.opener)", |
+ &opener_as_bool)); |
+ EXPECT_FALSE(opener_as_bool); |
+ |
+ // Verify that |new_contents| can find |old_contents| using window.open/name. |
+ content::WebContentsAddedObserver newly_opened_window_observer; |
+ std::string location_of_opened_window; |
+ EXPECT_TRUE(ExecuteScriptAndExtractString( |
+ new_contents, |
+ "w = window.open('', 'old-contents');" |
+ "window.domAutomationController.send(w.location.href);", |
+ &location_of_opened_window)); |
+ EXPECT_EQ(url::kAboutBlankURL, location_of_opened_window); |
+ ASSERT_TRUE(newly_opened_window_observer.GetWebContents()); |
+} |
+ |
} // namespace extensions |