| Index: chrome/browser/extensions/extension_functional_browsertest.cc
|
| diff --git a/chrome/browser/extensions/extension_functional_browsertest.cc b/chrome/browser/extensions/extension_functional_browsertest.cc
|
| index 6e83ce5b5b0400eebc8d7450928e42249198b3cf..9e6b5ba6cd418e91294e17282ff20128af44beba 100644
|
| --- a/chrome/browser/extensions/extension_functional_browsertest.cc
|
| +++ b/chrome/browser/extensions/extension_functional_browsertest.cc
|
| @@ -10,8 +10,13 @@
|
| #include "chrome/browser/extensions/extension_service.h"
|
| #include "chrome/browser/extensions/extension_util.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| +#include "chrome/browser/ui/browser.h"
|
| #include "chrome/browser/ui/browser_commands.h"
|
| +#include "chrome/browser/ui/tabs/tab_strip_model.h"
|
| +#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/test/browser_test_utils.h"
|
| #include "content/public/test/test_utils.h"
|
| #include "extensions/browser/extension_registry.h"
|
| #include "extensions/browser/extension_system.h"
|
| @@ -107,4 +112,60 @@ IN_PROC_BROWSER_TEST_F(ExtensionFunctionalTest, MAYBE_TestSetExtensionsState) {
|
| EXPECT_FALSE(util::IsIncognitoEnabled(last_loaded_extension_id(), profile()));
|
| }
|
|
|
| +IN_PROC_BROWSER_TEST_F(ExtensionFunctionalTest,
|
| + FindingUnrelatedExtensionFramesFromAboutBlank) {
|
| + // Load an extension before adding tabs.
|
| + const extensions::Extension* extension =
|
| + LoadExtension(test_data_dir_.AppendASCII("simple_with_file"));
|
| + ASSERT_TRUE(extension);
|
| + GURL extension_url = extension->GetResourceURL("file.html");
|
| +
|
| + // Load the extension in two unrelated tabs.
|
| + ui_test_utils::NavigateToURL(browser(), extension_url);
|
| + ui_test_utils::NavigateToURLWithDisposition(
|
| + browser(), extension_url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
|
| + ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
|
| +
|
| + // Sanity-check test setup: 2 frames share a renderer process, but are not in
|
| + // a related browsing instance.
|
| + content::RenderFrameHost* tab1 =
|
| + browser()->tab_strip_model()->GetWebContentsAt(0)->GetMainFrame();
|
| + content::RenderFrameHost* tab2 =
|
| + browser()->tab_strip_model()->GetWebContentsAt(1)->GetMainFrame();
|
| + 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';"));
|
| +
|
| + // Open a new window from tab1 and store it in tab1_popup.
|
| + content::RenderFrameHost* tab1_popup = nullptr;
|
| + {
|
| + content::WebContentsAddedObserver new_window_observer;
|
| + bool did_create_popup = false;
|
| + ASSERT_TRUE(ExecuteScriptAndExtractBool(
|
| + tab1,
|
| + "window.domAutomationController.send("
|
| + " !!window.open('about:blank', 'new_popup'));",
|
| + &did_create_popup));
|
| + ASSERT_TRUE(did_create_popup);
|
| + content::WebContents* popup_window = new_window_observer.GetWebContents();
|
| + WaitForLoadStop(popup_window);
|
| + tab1_popup = popup_window->GetMainFrame();
|
| + }
|
| + EXPECT_EQ(GURL(url::kAboutBlankURL), tab1_popup->GetLastCommittedURL());
|
| +
|
| + // Verify that |tab1_popup| can find unrelated frames from the same extension
|
| + // (i.e. that it can find |tab2|.
|
| + std::string location_of_opened_window;
|
| + EXPECT_TRUE(ExecuteScriptAndExtractString(
|
| + tab1_popup,
|
| + "var w = window.open('', 'tab2');\n"
|
| + "window.domAutomationController.send(w.location.href);",
|
| + &location_of_opened_window));
|
| + EXPECT_EQ(tab2->GetLastCommittedURL(), location_of_opened_window);
|
| +}
|
| +
|
| } // namespace extensions
|
|
|