#include "base/command_line.h"
#include "base/strings/stringprintf.h"
#include "build/build_config.h"
#include "chrome/browser/extensions/browsertest_util.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/window_controller_list.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/ui/view_ids.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/blocked_content/popup_blocker_tab_helper.h"
#include "components/embedder_support/switches.h"
#include "components/sync/model/string_ordinal.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/site_instance.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_features.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
#include "extensions/browser/extension_host.h"
#include "extensions/browser/extension_system.h"
#include "extensions/browser/install_flag.h"
#include "extensions/browser/process_map.h"
#include "extensions/common/extension.h"
#include "extensions/common/file_util.h"
#include "extensions/common/switches.h"
#include "net/dns/mock_host_resolver.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
using content::NavigationController;
using content::RenderViewHost;
using content::SiteInstance;
using content::WebContents;
using extensions::Extension;
using extensions::WindowControllerList;
class AppApiTest : public extensions::ExtensionApiTest {
protected:
GURL GetTestBaseURL(const std::string& test_directory) {
GURL::Replacements replace_host;
replace_host.SetHostStr("localhost");
GURL base_url = embedded_test_server()->GetURL(
"/extensions/api_test/" + test_directory + "/");
return base_url.ReplaceComponents(replace_host);
}
void SetUpCommandLine(base::CommandLine* command_line) override {
extensions::ExtensionApiTest::SetUpCommandLine(command_line);
base::CommandLine::ForCurrentProcess()->AppendSwitch(
embedder_support::kDisablePopupBlocking);
base::CommandLine::ForCurrentProcess()->AppendSwitch(
extensions::switches::kAllowHTTPBackgroundPage);
}
void SetUpOnMainThread() override {
extensions::ExtensionApiTest::SetUpOnMainThread();
host_resolver()->AddRule("*", "127.0.0.1");
ASSERT_TRUE(StartEmbeddedTestServer());
}
void TestAppInstancesHelper(const std::string& app_name) {
LOG(INFO) << "Start of test.";
extensions::ProcessMap* process_map =
extensions::ProcessMap::Get(profile());
ASSERT_TRUE(LoadExtension(
test_data_dir_.AppendASCII(app_name)));
const Extension* extension = GetSingleLoadedExtension();
GURL base_url = GetTestBaseURL(app_name);
NavigateToURLInNewTab(base_url.Resolve("path1/empty.html"));
LOG(INFO) << "Nav 1.";
EXPECT_TRUE(process_map->Contains(browser()
->tab_strip_model()
->GetWebContentsAt(1)
->GetPrimaryMainFrame()
->GetProcess()
->GetDeprecatedID()));
EXPECT_FALSE(browser()->tab_strip_model()->GetWebContentsAt(1)->GetWebUI());
ui_test_utils::TabAddedWaiter tab_add(browser());
chrome::NewTab(browser());
tab_add.Wait();
LOG(INFO) << "New tab.";
ASSERT_TRUE(ui_test_utils::NavigateToURL(
browser(), base_url.Resolve("path2/empty.html")));
LOG(INFO) << "Nav 2.";
EXPECT_TRUE(process_map->Contains(browser()
->tab_strip_model()
->GetWebContentsAt(2)
->GetPrimaryMainFrame()
->GetProcess()
->GetDeprecatedID()));
EXPECT_FALSE(browser()->tab_strip_model()->GetWebContentsAt(2)->GetWebUI());
ASSERT_EQ(3, browser()->tab_strip_model()->count());
WebContents* tab1 = browser()->tab_strip_model()->GetWebContentsAt(1);
WebContents* tab2 = browser()->tab_strip_model()->GetWebContentsAt(2);
if (!base::FeatureList::IsEnabled(
features::kProcessPerSiteUpToMainFrameThreshold)) {
EXPECT_NE(tab1->GetPrimaryMainFrame()->GetProcess(),
tab2->GetPrimaryMainFrame()->GetProcess());
}
ASSERT_EQ(1u,
extensions::browsertest_util::GetWindowControllerCountInProfile(
profile()));
OpenWindow(tab1, base_url.Resolve("path1/empty.html"), true, true, nullptr);
LOG(INFO) << "WindowOpenHelper 1.";
OpenWindow(tab2, base_url.Resolve("path2/empty.html"), true, true, nullptr);
LOG(INFO) << "End of test.";
UnloadExtension(extension->id());
}
};
class BlockedAppApiTest : public AppApiTest {
protected:
void SetUpCommandLine(base::CommandLine* command_line) override {
extensions::ExtensionApiTest::SetUpCommandLine(command_line);
base::CommandLine::ForCurrentProcess()->AppendSwitch(
extensions::switches::kAllowHTTPBackgroundPage);
}
};
IN_PROC_BROWSER_TEST_F(AppApiTest, AppProcess) {
extensions::ProcessMap* process_map = extensions::ProcessMap::Get(profile());
ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app_process")));
GURL base_url = GetTestBaseURL("app_process");
NavigateToURLInNewTab(base_url.Resolve("path1/empty.html"));
EXPECT_TRUE(process_map->Contains(browser()
->tab_strip_model()
->GetWebContentsAt(1)
->GetPrimaryMainFrame()
->GetProcess()
->GetDeprecatedID()));
EXPECT_FALSE(browser()->tab_strip_model()->GetWebContentsAt(1)->GetWebUI());
NavigateToURLInNewTab(base_url.Resolve("path2/empty.html"));
EXPECT_TRUE(process_map->Contains(browser()
->tab_strip_model()
->GetWebContentsAt(2)
->GetPrimaryMainFrame()
->GetProcess()
->GetDeprecatedID()));
EXPECT_FALSE(browser()->tab_strip_model()->GetWebContentsAt(2)->GetWebUI());
ui_test_utils::TabAddedWaiter tab_add(browser());
chrome::NewTab(browser());
tab_add.Wait();
ASSERT_TRUE(ui_test_utils::NavigateToURL(
browser(), base_url.Resolve("path3/empty.html")));
EXPECT_FALSE(process_map->Contains(browser()
->tab_strip_model()
->GetWebContentsAt(3)
->GetPrimaryMainFrame()
->GetProcess()
->GetDeprecatedID()));
EXPECT_FALSE(browser()->tab_strip_model()->GetWebContentsAt(3)->GetWebUI());
ASSERT_EQ(4, browser()->tab_strip_model()->count());
WebContents* tab = browser()->tab_strip_model()->GetWebContentsAt(1);
EXPECT_EQ(tab->GetPrimaryMainFrame()->GetProcess(),
browser()
->tab_strip_model()
->GetWebContentsAt(2)
->GetPrimaryMainFrame()
->GetProcess());
EXPECT_NE(tab->GetPrimaryMainFrame()->GetProcess(),
browser()
->tab_strip_model()
->GetWebContentsAt(3)
->GetPrimaryMainFrame()
->GetProcess());
ASSERT_EQ(1u, extensions::browsertest_util::GetWindowControllerCountInProfile(
profile()));
OpenWindow(tab, base_url.Resolve("path1/empty.html"), true, true, nullptr);
OpenWindow(tab, base_url.Resolve("path2/empty.html"), true, true, nullptr);
OpenWindow(tab, base_url.Resolve("path3/empty.html"), true, true, nullptr);
const GURL& app_url(base_url.Resolve("path1/empty.html"));
const GURL& non_app_url(base_url.Resolve("path3/empty.html"));
EXPECT_TRUE(NavigateInRenderer(
browser()->tab_strip_model()->GetWebContentsAt(2), non_app_url));
EXPECT_TRUE(NavigateInRenderer(
browser()->tab_strip_model()->GetWebContentsAt(3), app_url));
EXPECT_NE(tab->GetPrimaryMainFrame()->GetProcess(),
browser()
->tab_strip_model()
->GetWebContentsAt(2)
->GetPrimaryMainFrame()
->GetProcess());
EXPECT_EQ(tab->GetPrimaryMainFrame()->GetProcess(),
browser()
->tab_strip_model()
->GetWebContentsAt(3)
->GetPrimaryMainFrame()
->GetProcess());
EXPECT_TRUE(NavigateInRenderer(
browser()->tab_strip_model()->GetWebContentsAt(6), app_url));
EXPECT_EQ(tab->GetPrimaryMainFrame()->GetProcess(),
browser()
->tab_strip_model()
->GetWebContentsAt(6)
->GetPrimaryMainFrame()
->GetProcess());
ASSERT_EQ(true,
content::EvalJs(browser()->tab_strip_model()->GetWebContentsAt(6),
"window.opener != null"));
}
IN_PROC_BROWSER_TEST_F(AppApiTest, AppProcessInstances) {
TestAppInstancesHelper("app_process_instances");
}
IN_PROC_BROWSER_TEST_F(AppApiTest, AppProcessBackgroundInstances) {
TestAppInstancesHelper("app_process_background_instances");
}
IN_PROC_BROWSER_TEST_F(AppApiTest, DISABLED_AppProcessRedirectBack) {
ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app_process")));
GURL base_url = GetTestBaseURL("app_process");
chrome::NewTab(browser());
ASSERT_TRUE(ui_test_utils::NavigateToURL(
browser(), base_url.Resolve("path1/empty.html")));
chrome::NewTab(browser());
ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
browser(), base_url.Resolve("path1/redirect.html"), 2);
ASSERT_EQ(3, browser()->tab_strip_model()->count());
EXPECT_EQ("/extensions/api_test/app_process/path1/empty.html",
browser()
->tab_strip_model()
->GetWebContentsAt(2)
->GetController()
.GetLastCommittedEntry()
->GetURL()
.GetPath());
EXPECT_EQ(browser()
->tab_strip_model()
->GetWebContentsAt(1)
->GetPrimaryMainFrame()
->GetProcess(),
browser()
->tab_strip_model()
->GetWebContentsAt(2)
->GetPrimaryMainFrame()
->GetProcess());
}
IN_PROC_BROWSER_TEST_F(AppApiTest, NavigateIntoAppProcess) {
extensions::ProcessMap* process_map = extensions::ProcessMap::Get(profile());
GURL base_url = GetTestBaseURL("app_process");
LOG(INFO) << "Loading path1/empty.html.";
ASSERT_TRUE(ui_test_utils::NavigateToURL(
browser(), base_url.Resolve("path1/empty.html")));
LOG(INFO) << "Loading path1/empty.html - done.";
WebContents* contents = browser()->tab_strip_model()->GetWebContentsAt(0);
EXPECT_FALSE(process_map->Contains(
contents->GetPrimaryMainFrame()->GetProcess()->GetDeprecatedID()));
LOG(INFO) << "Loading extension.";
const Extension* app =
LoadExtension(test_data_dir_.AppendASCII("app_process"));
LOG(INFO) << "Loading extension - done.";
ASSERT_TRUE(app);
LOG(INFO) << "Loading path1/empty.html.";
ASSERT_TRUE(ui_test_utils::NavigateToURL(
browser(), base_url.Resolve("path1/empty.html")));
LOG(INFO) << "Loading path1/empty.html - done.";
EXPECT_TRUE(process_map->Contains(
contents->GetPrimaryMainFrame()->GetProcess()->GetDeprecatedID()));
LOG(INFO) << "Disabling extension.";
DisableExtension(app->id());
LOG(INFO) << "Disabling extension - done.";
LOG(INFO) << "Loading path1/empty.html.";
ASSERT_TRUE(ui_test_utils::NavigateToURL(
browser(), base_url.Resolve("path1/empty.html")));
LOG(INFO) << "Loading path1/empty.html - done.";
EXPECT_FALSE(process_map->Contains(
contents->GetPrimaryMainFrame()->GetProcess()->GetDeprecatedID()));
}
IN_PROC_BROWSER_TEST_F(AppApiTest, ReloadIntoAppProcess) {
extensions::ProcessMap* process_map = extensions::ProcessMap::Get(profile());
GURL base_url = GetTestBaseURL("app_process");
LOG(INFO) << "Loading extension.";
const Extension* app =
LoadExtension(test_data_dir_.AppendASCII("app_process"));
LOG(INFO) << "Loading extension - done.";
ASSERT_TRUE(app);
LOG(INFO) << "Disabling extension.";
DisableExtension(app->id());
LOG(INFO) << "Disabling extension - done.";
LOG(INFO) << "Navigate to path1/empty.html.";
ASSERT_TRUE(ui_test_utils::NavigateToURL(
browser(), base_url.Resolve("path1/empty.html")));
LOG(INFO) << "Navigate to path1/empty.html - done.";
WebContents* contents = browser()->tab_strip_model()->GetWebContentsAt(0);
content::NavigationController& controller = contents->GetController();
EXPECT_FALSE(process_map->Contains(
contents->GetPrimaryMainFrame()->GetProcess()->GetDeprecatedID()));
EXPECT_EQ(2, controller.GetEntryCount());
LOG(INFO) << "Enabling extension.";
EnableExtension(app->id());
LOG(INFO) << "Enabling extension - done.";
content::LoadStopObserver reload_observer(
browser()->tab_strip_model()->GetActiveWebContents());
LOG(INFO) << "Reloading.";
chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
reload_observer.Wait();
LOG(INFO) << "Reloading - done.";
EXPECT_TRUE(process_map->Contains(
contents->GetPrimaryMainFrame()->GetProcess()->GetDeprecatedID()));
EXPECT_EQ(2, controller.GetEntryCount());
LOG(INFO) << "Disabling extension.";
DisableExtension(app->id());
LOG(INFO) << "Disabling extension - done.";
content::LoadStopObserver reload_observer2(
browser()->tab_strip_model()->GetActiveWebContents());
LOG(INFO) << "Reloading.";
chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
reload_observer2.Wait();
LOG(INFO) << "Reloading - done.";
EXPECT_FALSE(process_map->Contains(
contents->GetPrimaryMainFrame()->GetProcess()->GetDeprecatedID()));
EXPECT_EQ(2, controller.GetEntryCount());
}
IN_PROC_BROWSER_TEST_F(AppApiTest, ReloadIntoAppProcessWithJavaScript) {
extensions::ProcessMap* process_map = extensions::ProcessMap::Get(profile());
GURL base_url = GetTestBaseURL("app_process");
LOG(INFO) << "Loading extension.";
const Extension* app =
LoadExtension(test_data_dir_.AppendASCII("app_process"));
LOG(INFO) << "Loading extension - done.";
ASSERT_TRUE(app);
LOG(INFO) << "Disabling extension.";
DisableExtension(app->id());
LOG(INFO) << "Disabling extension - done.";
LOG(INFO) << "Navigate to path1/empty.html.";
ASSERT_TRUE(ui_test_utils::NavigateToURL(
browser(), base_url.Resolve("path1/empty.html")));
LOG(INFO) << "Navigate to path1/empty.html - done.";
WebContents* contents = browser()->tab_strip_model()->GetWebContentsAt(0);
EXPECT_FALSE(process_map->Contains(
contents->GetPrimaryMainFrame()->GetProcess()->GetDeprecatedID()));
LOG(INFO) << "Enabling extension.";
EnableExtension(app->id());
LOG(INFO) << "Enabling extension - done.";
content::LoadStopObserver js_reload_observer(
browser()->tab_strip_model()->GetActiveWebContents());
LOG(INFO) << "Executing location.reload().";
ASSERT_TRUE(content::ExecJs(contents, "location.reload();"));
js_reload_observer.Wait();
LOG(INFO) << "Executing location.reload() - done.";
EXPECT_TRUE(process_map->Contains(
contents->GetPrimaryMainFrame()->GetProcess()->GetDeprecatedID()));
LOG(INFO) << "Disabling extension.";
DisableExtension(app->id());
LOG(INFO) << "Disabling extension - done.";
content::LoadStopObserver js_reload_observer2(
browser()->tab_strip_model()->GetActiveWebContents());
LOG(INFO) << "Executing location = location.";
ASSERT_TRUE(content::ExecJs(contents, "location = location;"));
js_reload_observer2.Wait();
LOG(INFO) << "Executing location = location - done.";
EXPECT_FALSE(process_map->Contains(
contents->GetPrimaryMainFrame()->GetProcess()->GetDeprecatedID()));
}
IN_PROC_BROWSER_TEST_F(BlockedAppApiTest, OpenAppFromIframe) {
const Extension* app =
LoadExtension(test_data_dir_.AppendASCII("app_process"));
ASSERT_TRUE(app);
ASSERT_TRUE(ui_test_utils::NavigateToURL(
browser(),
GetTestBaseURL("app_process").Resolve("path3/container.html")));
ui_test_utils::WaitForViewVisibility(browser(), VIEW_ID_CONTENT_SETTING_POPUP,
true);
WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
blocked_content::PopupBlockerTabHelper* popup_blocker_tab_helper =
blocked_content::PopupBlockerTabHelper::FromWebContents(tab);
EXPECT_EQ(1u, popup_blocker_tab_helper->GetBlockedPopupsCount());
}
IN_PROC_BROWSER_TEST_F(AppApiTest, ServerRedirectToAppFromExtension) {
LoadExtension(test_data_dir_.AppendASCII("app_process"));
const Extension* launcher =
LoadExtension(test_data_dir_.AppendASCII("app_launcher"));
content::TestNavigationObserver test_navigation_observer(
browser()->tab_strip_model()->GetActiveWebContents(),
2);
test_navigation_observer.StartWatchingNewWebContents();
ASSERT_TRUE(ui_test_utils::NavigateToURL(
browser(), launcher->GetResourceURL("server_redirect.html")));
test_navigation_observer.Wait();
ASSERT_EQ(true, content::EvalJs(
browser()->tab_strip_model()->GetActiveWebContents(),
"chrome.app.isInstalled"));
}
IN_PROC_BROWSER_TEST_F(AppApiTest, ClientRedirectToAppFromExtension) {
LoadExtension(test_data_dir_.AppendASCII("app_process"));
const Extension* launcher =
LoadExtension(test_data_dir_.AppendASCII("app_launcher"));
content::TestNavigationObserver test_navigation_observer(
browser()->tab_strip_model()->GetActiveWebContents(),
3);
test_navigation_observer.StartWatchingNewWebContents();
ASSERT_TRUE(ui_test_utils::NavigateToURL(
browser(), launcher->GetResourceURL("client_redirect.html")));
test_navigation_observer.Wait();
ASSERT_EQ(true, content::EvalJs(
browser()->tab_strip_model()->GetActiveWebContents(),
"chrome.app.isInstalled"));
}
IN_PROC_BROWSER_TEST_F(AppApiTest, OpenWebPopupFromWebIframe) {
extensions::ProcessMap* process_map = extensions::ProcessMap::Get(profile());
GURL base_url = GetTestBaseURL("app_process");
const Extension* app =
LoadExtension(test_data_dir_.AppendASCII("app_process"));
ASSERT_TRUE(app);
ASSERT_TRUE(ui_test_utils::NavigateToURL(
browser(), base_url.Resolve("path1/container.html")));
content::RenderProcessHost* process = browser()
->tab_strip_model()
->GetWebContentsAt(0)
->GetPrimaryMainFrame()
->GetProcess();
EXPECT_TRUE(process_map->Contains(process->GetDeprecatedID()));
const WindowControllerList* active_window_list =
WindowControllerList::GetInstance();
EXPECT_EQ(2U, active_window_list->size());
content::WebContents* popup_contents =
active_window_list->get(1)->GetActiveTab();
ASSERT_TRUE(popup_contents);
EXPECT_TRUE(content::WaitForLoadStop(popup_contents));
content::RenderProcessHost* popup_process =
popup_contents->GetPrimaryMainFrame()->GetProcess();
EXPECT_EQ(process, popup_process);
EXPECT_TRUE(process_map->Contains(popup_process->GetDeprecatedID()));
}
IN_PROC_BROWSER_TEST_F(AppApiTest, ReloadAppAfterCrash) {
extensions::ProcessMap* process_map = extensions::ProcessMap::Get(profile());
ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app_process")));
GURL base_url = GetTestBaseURL("app_process");
ASSERT_TRUE(ui_test_utils::NavigateToURL(
browser(), base_url.Resolve("path1/empty.html")));
WebContents* contents = browser()->tab_strip_model()->GetWebContentsAt(0);
EXPECT_TRUE(process_map->Contains(
contents->GetPrimaryMainFrame()->GetProcess()->GetDeprecatedID()));
ASSERT_EQ(true, content::EvalJs(contents, "chrome.app.isInstalled"));
content::CrashTab(browser()->tab_strip_model()->GetActiveWebContents());
content::LoadStopObserver observer(
browser()->tab_strip_model()->GetActiveWebContents());
chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
observer.Wait();
ASSERT_EQ(true, content::EvalJs(contents, "chrome.app.isInstalled"));
}
IN_PROC_BROWSER_TEST_F(AppApiTest, NavigatePopupFromAppToOutsideApp) {
extensions::ProcessMap* process_map = extensions::ProcessMap::Get(profile());
GURL base_url = GetTestBaseURL("app_process");
const Extension* app =
LoadExtension(test_data_dir_.AppendASCII("app_process"));
ASSERT_TRUE(app);
ASSERT_TRUE(ui_test_utils::NavigateToURL(
browser(), base_url.Resolve("path1/iframe.html")));
content::SiteInstance* app_instance =
browser()->tab_strip_model()->GetWebContentsAt(0)->GetSiteInstance();
EXPECT_TRUE(
process_map->Contains(app_instance->GetProcess()->GetDeprecatedID()));
const WindowControllerList* active_window_list =
WindowControllerList::GetInstance();
EXPECT_EQ(2U, active_window_list->size());
content::WebContents* popup_contents =
active_window_list->get(1)->GetActiveTab();
ASSERT_TRUE(popup_contents);
EXPECT_TRUE(content::WaitForLoadStop(popup_contents));
SiteInstance* popup_instance = popup_contents->GetSiteInstance();
EXPECT_EQ(app_instance, popup_instance);
GURL non_app_url(base_url.Resolve("path3/empty.html"));
{
content::TestNavigationObserver observer(popup_contents);
EXPECT_TRUE(ExecJs(
popup_contents,
base::StringPrintf("location = '%s';", non_app_url.spec().c_str())));
observer.Wait();
}
EXPECT_TRUE(
app_instance->IsRelatedSiteInstance(popup_contents->GetSiteInstance()));
EXPECT_EQ(app_instance, popup_contents->GetSiteInstance());
{
content::TestNavigationObserver observer(popup_contents);
popup_contents->GetController().GoBack();
observer.Wait();
EXPECT_EQ(app_instance, popup_contents->GetSiteInstance());
}
{
content::TestNavigationObserver observer(popup_contents);
ASSERT_TRUE(ui_test_utils::NavigateToURL(
active_window_list->get(1)->GetBrowser(), non_app_url));
observer.Wait();
EXPECT_EQ(app_instance, popup_contents->GetSiteInstance());
EXPECT_TRUE(
app_instance->IsRelatedSiteInstance(popup_contents->GetSiteInstance()));
}
{
content::TestNavigationObserver observer(popup_contents);
popup_contents->GetController().GoBack();
observer.Wait();
EXPECT_EQ(app_instance, popup_contents->GetSiteInstance());
}
{
content::TestNavigationObserver observer(popup_contents);
GURL cross_site_url(
embedded_test_server()->GetURL("foo.com", "/title1.html"));
ASSERT_TRUE(ui_test_utils::NavigateToURL(
active_window_list->get(1)->GetBrowser(), cross_site_url));
observer.Wait();
EXPECT_NE(app_instance, popup_contents->GetSiteInstance());
EXPECT_FALSE(
app_instance->IsRelatedSiteInstance(popup_contents->GetSiteInstance()));
}
}