Index: chrome/browser/extensions/isolated_app_browsertest.cc |
diff --git a/chrome/browser/extensions/isolated_app_browsertest.cc b/chrome/browser/extensions/isolated_app_browsertest.cc |
index 88a74471a64825b99e5ced7d5f30d3cda96e5e4b..a4d0cf5c5d4b949dbb3969221aa9eb3f3f1c1327 100644 |
--- a/chrome/browser/extensions/isolated_app_browsertest.cc |
+++ b/chrome/browser/extensions/isolated_app_browsertest.cc |
@@ -74,12 +74,6 @@ class IsolatedAppTest : public ExtensionBrowserTest { |
// TODO(ajwong): Also test what happens if an app spans multiple sites in its |
// extent. These origins should also be isolated, but still have origin-based |
// separation as you would expect. |
-// |
-// TODO(ajwong): Add test for session storage. In one tab, navigate to a |
-// normal page and set X=ss_normal. Then navigate to an isolated URL in the |
-// same origin and verify X does not exist. Set X=ss_isolated. Navigate back to |
-// a normal webpage, and verify X is still ss_normal. Navigate to the isolate |
-// URL and verify that X is ss_isolated. |
IN_PROC_BROWSER_TEST_F(IsolatedAppTest, CookieIsolation) { |
host_resolver()->AddRule("*", "127.0.0.1"); |
ASSERT_TRUE(test_server()->Start()); |
@@ -109,18 +103,18 @@ IN_PROC_BROWSER_TEST_F(IsolatedAppTest, CookieIsolation) { |
ASSERT_EQ(3, browser()->tab_count()); |
// Ensure first two tabs have installed apps. |
- WebContents* tab1 = chrome::GetWebContentsAt(browser(), 0); |
- WebContents* tab2 = chrome::GetWebContentsAt(browser(), 1); |
- WebContents* tab3 = chrome::GetWebContentsAt(browser(), 2); |
+ WebContents* tab0 = chrome::GetWebContentsAt(browser(), 0); |
+ WebContents* tab1 = chrome::GetWebContentsAt(browser(), 1); |
+ WebContents* tab2 = chrome::GetWebContentsAt(browser(), 2); |
+ ASSERT_TRUE(GetInstalledApp(tab0)); |
ASSERT_TRUE(GetInstalledApp(tab1)); |
- ASSERT_TRUE(GetInstalledApp(tab2)); |
- ASSERT_TRUE(!GetInstalledApp(tab3)); |
+ ASSERT_TRUE(!GetInstalledApp(tab2)); |
// Check that tabs see cannot each other's localStorage even though they are |
// in the same origin. |
- RenderViewHost* app1_rvh = tab1->GetRenderViewHost(); |
- RenderViewHost* app2_rvh = tab2->GetRenderViewHost(); |
- RenderViewHost* non_app_rvh = tab3->GetRenderViewHost(); |
+ RenderViewHost* app1_rvh = tab0->GetRenderViewHost(); |
+ RenderViewHost* app2_rvh = tab1->GetRenderViewHost(); |
+ RenderViewHost* non_app_rvh = tab2->GetRenderViewHost(); |
ASSERT_TRUE(ExecuteJavaScript( |
app1_rvh, L"", L"window.localStorage.setItem('testdata', 'ls_app1');")); |
ASSERT_TRUE(ExecuteJavaScript( |
@@ -129,11 +123,9 @@ IN_PROC_BROWSER_TEST_F(IsolatedAppTest, CookieIsolation) { |
non_app_rvh, L"", |
L"window.localStorage.setItem('testdata', 'ls_normal');")); |
- ASSERT_TRUE(ExecuteJavaScript( |
- app1_rvh, L"", L"window.localStorage.getItem('testdata');")); |
- |
const std::wstring& kRetrieveLocalStorage = |
- WrapForJavascriptAndExtract(L"window.localStorage.getItem('testdata')"); |
+ WrapForJavascriptAndExtract( |
+ L"window.localStorage.getItem('testdata') || 'badval'"); |
std::string result; |
ASSERT_TRUE(ExecuteJavaScriptAndExtractString( |
app1_rvh, L"", kRetrieveLocalStorage.c_str(), &result)); |
@@ -146,40 +138,40 @@ IN_PROC_BROWSER_TEST_F(IsolatedAppTest, CookieIsolation) { |
EXPECT_EQ("ls_normal", result); |
// Check that each tab sees its own cookie. |
- EXPECT_TRUE(HasCookie(tab1, "app1=3")); |
- EXPECT_TRUE(HasCookie(tab2, "app2=4")); |
- EXPECT_TRUE(HasCookie(tab3, "normalPage=5")); |
+ EXPECT_TRUE(HasCookie(tab0, "app1=3")); |
+ EXPECT_TRUE(HasCookie(tab1, "app2=4")); |
+ EXPECT_TRUE(HasCookie(tab2, "normalPage=5")); |
// Check that app1 tab cannot see the other cookies. |
- EXPECT_FALSE(HasCookie(tab1, "app2")); |
- EXPECT_FALSE(HasCookie(tab1, "normalPage")); |
+ EXPECT_FALSE(HasCookie(tab0, "app2")); |
+ EXPECT_FALSE(HasCookie(tab0, "normalPage")); |
// Check that app2 tab cannot see the other cookies. |
- EXPECT_FALSE(HasCookie(tab2, "app1")); |
- EXPECT_FALSE(HasCookie(tab2, "normalPage")); |
+ EXPECT_FALSE(HasCookie(tab1, "app1")); |
+ EXPECT_FALSE(HasCookie(tab1, "normalPage")); |
// Check that normal tab cannot see the other cookies. |
- EXPECT_FALSE(HasCookie(tab3, "app1")); |
- EXPECT_FALSE(HasCookie(tab3, "app2")); |
+ EXPECT_FALSE(HasCookie(tab2, "app1")); |
+ EXPECT_FALSE(HasCookie(tab2, "app2")); |
// Check that the non_app iframe cookie is associated with app1 and not the |
// normal tab. (For now, iframes are always rendered in their parent |
// process, even if they aren't in the app manifest.) |
- EXPECT_TRUE(HasCookie(tab1, "nonAppFrame=6")); |
- EXPECT_FALSE(HasCookie(tab3, "nonAppFrame")); |
+ EXPECT_TRUE(HasCookie(tab0, "nonAppFrame=6")); |
+ EXPECT_FALSE(HasCookie(tab2, "nonAppFrame")); |
// Check that isolation persists even if the tab crashes and is reloaded. |
chrome::SelectNumberedTab(browser(), 0); |
- content::CrashTab(tab1); |
+ content::CrashTab(tab0); |
content::WindowedNotificationObserver observer( |
content::NOTIFICATION_LOAD_STOP, |
content::Source<NavigationController>( |
&chrome::GetActiveWebContents(browser())->GetController())); |
chrome::Reload(browser(), CURRENT_TAB); |
observer.Wait(); |
- EXPECT_TRUE(HasCookie(tab1, "app1=3")); |
- EXPECT_FALSE(HasCookie(tab1, "app2")); |
- EXPECT_FALSE(HasCookie(tab1, "normalPage")); |
+ EXPECT_TRUE(HasCookie(tab0, "app1=3")); |
+ EXPECT_FALSE(HasCookie(tab0, "app2")); |
+ EXPECT_FALSE(HasCookie(tab0, "normalPage")); |
} |
@@ -304,3 +296,76 @@ IN_PROC_BROWSER_TEST_F(IsolatedAppTest, IsolatedAppProcessModel) { |
EXPECT_NE(process_id_1, |
chrome::GetWebContentsAt(browser(), 1)->GetRenderProcessHost()->GetID()); |
} |
+ |
+IN_PROC_BROWSER_TEST_F(IsolatedAppTest, SessionStorage) { |
+ host_resolver()->AddRule("*", "127.0.0.1"); |
+ ASSERT_TRUE(test_server()->Start()); |
+ |
+ ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("isolated_apps/app1"))); |
+ ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("isolated_apps/app2"))); |
+ |
+ // The app under test acts on URLs whose host is "localhost", |
+ // so the URLs we navigate to must have host "localhost". |
+ GURL base_url = test_server()->GetURL( |
+ "files/extensions/isolated_apps/"); |
+ GURL::Replacements replace_host; |
+ std::string host_str("localhost"); // Must stay in scope with replace_host. |
+ replace_host.SetHostStr(host_str); |
+ base_url = base_url.ReplaceComponents(replace_host); |
+ |
+ // Enter some state into sessionStorage three times on the same origin, but |
+ // for three URLs that correspond to app1, app2, and a non-isolated site. |
+ ui_test_utils::NavigateToURLWithDisposition( |
+ browser(), base_url.Resolve("app1/main.html"), |
+ CURRENT_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
+ ASSERT_TRUE(ExecuteJavaScript( |
+ chrome::GetWebContentsAt(browser(), 0)->GetRenderViewHost(), |
+ L"", |
+ L"window.sessionStorage.setItem('testdata', 'ss_app1');")); |
+ |
+ ui_test_utils::NavigateToURLWithDisposition( |
+ browser(), base_url.Resolve("app2/main.html"), |
+ CURRENT_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
+ ASSERT_TRUE(ExecuteJavaScript( |
+ chrome::GetWebContentsAt(browser(), 0)->GetRenderViewHost(), |
+ L"", |
+ L"window.sessionStorage.setItem('testdata', 'ss_app2');")); |
+ |
+ ui_test_utils::NavigateToURLWithDisposition( |
+ browser(), base_url.Resolve("non_app/main.html"), |
+ CURRENT_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
+ ASSERT_TRUE(ExecuteJavaScript( |
+ chrome::GetWebContentsAt(browser(), 0)->GetRenderViewHost(), |
+ L"", |
+ L"window.sessionStorage.setItem('testdata', 'ss_normal');")); |
+ |
+ // Now, ensure that the sessionStorage is correctly partitioned, and persists |
+ // when we navigate around all over the dang place. |
+ const std::wstring& kRetrieveSessionStorage = |
+ WrapForJavascriptAndExtract( |
+ L"window.sessionStorage.getItem('testdata') || 'badval'"); |
+ std::string result; |
+ ui_test_utils::NavigateToURLWithDisposition( |
+ browser(), base_url.Resolve("app1/main.html"), |
+ CURRENT_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
+ ASSERT_TRUE(ExecuteJavaScriptAndExtractString( |
+ chrome::GetWebContentsAt(browser(), 0)->GetRenderViewHost(), |
+ L"", kRetrieveSessionStorage.c_str(), &result)); |
+ EXPECT_EQ("ss_app1", result); |
+ |
+ ui_test_utils::NavigateToURLWithDisposition( |
+ browser(), base_url.Resolve("app2/main.html"), |
+ CURRENT_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
+ ASSERT_TRUE(ExecuteJavaScriptAndExtractString( |
+ chrome::GetWebContentsAt(browser(), 0)->GetRenderViewHost(), |
+ L"", kRetrieveSessionStorage.c_str(), &result)); |
+ EXPECT_EQ("ss_app2", result); |
+ |
+ ui_test_utils::NavigateToURLWithDisposition( |
+ browser(), base_url.Resolve("non_app/main.html"), |
+ CURRENT_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
+ ASSERT_TRUE(ExecuteJavaScriptAndExtractString( |
+ chrome::GetWebContentsAt(browser(), 0)->GetRenderViewHost(), |
+ L"", kRetrieveSessionStorage.c_str(), &result)); |
+ EXPECT_EQ("ss_normal", result); |
+} |