Index: chrome/browser/extensions/app_process_apitest.cc |
diff --git a/chrome/browser/extensions/app_process_apitest.cc b/chrome/browser/extensions/app_process_apitest.cc |
index 6f12316021229f9b5b67242d33d38cceeb1e21c3..72e43751af58317c221733b4d205efceed63cedb 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)); |
+} |