diff options
author | creis@chromium.org <creis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-03 05:16:07 +0000 |
---|---|---|
committer | creis@chromium.org <creis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-03 05:16:07 +0000 |
commit | 2aca9a92da57d6d4f99dffbad58e348bdbfcc5ab (patch) | |
tree | f2c86e5d41bbbe1228b26bc2adb935207eae7ff8 /chrome/browser/extensions/app_process_apitest.cc | |
parent | ef60d78381c5937275a2511517d0f904ab7a350c (diff) | |
download | chromium_src-2aca9a92da57d6d4f99dffbad58e348bdbfcc5ab.zip chromium_src-2aca9a92da57d6d4f99dffbad58e348bdbfcc5ab.tar.gz chromium_src-2aca9a92da57d6d4f99dffbad58e348bdbfcc5ab.tar.bz2 |
Clean up ChromeContentBrowserClient::ShouldSwapProcessesForNavigation.
The current logic forces a BrowsingInstance swap when going to/from
hosted apps, which breaks postMessage. Rely on RenderViewHostManager
to do a SiteInstance swap instead.
BUG=123007
TEST=postMessage works after navigating a hosted app popup cross-process.
Review URL: https://codereview.chromium.org/86973002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@238304 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions/app_process_apitest.cc')
-rw-r--r-- | chrome/browser/extensions/app_process_apitest.cc | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/chrome/browser/extensions/app_process_apitest.cc b/chrome/browser/extensions/app_process_apitest.cc index 6f12316..72e4375 100644 --- a/chrome/browser/extensions/app_process_apitest.cc +++ b/chrome/browser/extensions/app_process_apitest.cc @@ -24,6 +24,7 @@ #include "content/public/browser/notification_service.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/test/browser_test_utils.h" #include "content/public/test/test_navigation_observer.h" @@ -36,6 +37,7 @@ using content::NavigationController; using content::RenderViewHost; +using content::SiteInstance; using content::WebContents; using extensions::Extension; @@ -832,3 +834,48 @@ IN_PROC_BROWSER_TEST_F(AppApiTest, MAYBE_ReloadAppAfterCrash) { &is_installed)); ASSERT_TRUE(is_installed); } + +// Test that a cross-process navigation away from a hosted app stays in the same +// BrowsingInstance, so that postMessage calls to the app's other windows still +// work. +IN_PROC_BROWSER_TEST_F(AppApiTest, SameBrowsingInstanceAfterSwap) { + extensions::ProcessMap* process_map = extensions::ExtensionSystem::Get( + browser()->profile())->extension_service()->process_map(); + + host_resolver()->AddRule("*", "127.0.0.1"); + ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); + + GURL base_url = GetTestBaseURL("app_process"); + + // Load app and start URL (in the app). + const Extension* app = + LoadExtension(test_data_dir_.AppendASCII("app_process")); + ASSERT_TRUE(app); + + 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()->GetID())); + + // Popup window should be in the app's process. + const BrowserList* active_browser_list = + BrowserList::GetInstance(chrome::GetActiveDesktop()); + EXPECT_EQ(2U, active_browser_list->size()); + content::WebContents* popup_contents = + active_browser_list->get(1)->tab_strip_model()->GetActiveWebContents(); + content::WaitForLoadStop(popup_contents); + + SiteInstance* popup_instance = popup_contents->GetSiteInstance(); + EXPECT_EQ(app_instance, popup_instance); + + // Navigate the popup to another process outside the app. + GURL non_app_url(base_url.Resolve("path3/empty.html")); + ui_test_utils::NavigateToURL(active_browser_list->get(1), non_app_url); + SiteInstance* new_instance = popup_contents->GetSiteInstance(); + EXPECT_NE(app_instance, new_instance); + + // It should still be in the same BrowsingInstance, allowing postMessage to + // work. + EXPECT_TRUE(app_instance->IsRelatedSiteInstance(new_instance)); +} |