| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/stringprintf.h" | 5 #include "base/stringprintf.h" |
| 6 #include "base/utf_string_conversions.h" | 6 #include "base/utf_string_conversions.h" |
| 7 #include "chrome/browser/automation/automation_util.h" | 7 #include "chrome/browser/automation/automation_util.h" |
| 8 #include "chrome/browser/extensions/extension_apitest.h" | 8 #include "chrome/browser/extensions/extension_apitest.h" |
| 9 #include "chrome/browser/extensions/extension_host.h" | 9 #include "chrome/browser/extensions/extension_host.h" |
| 10 #include "chrome/browser/extensions/extension_service.h" | 10 #include "chrome/browser/extensions/extension_service.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 #include "net/base/mock_host_resolver.h" | 23 #include "net/base/mock_host_resolver.h" |
| 24 | 24 |
| 25 using content::ExecuteJavaScript; | 25 using content::ExecuteJavaScript; |
| 26 using content::ExecuteJavaScriptAndExtractString; | 26 using content::ExecuteJavaScriptAndExtractString; |
| 27 using content::NavigationController; | 27 using content::NavigationController; |
| 28 using content::WebContents; | 28 using content::WebContents; |
| 29 using content::RenderViewHost; | 29 using content::RenderViewHost; |
| 30 | 30 |
| 31 namespace { | 31 namespace { |
| 32 | 32 |
| 33 std::string WrapForJavascriptAndExtract(const char* javascript_expression) { | 33 std::wstring WrapForJavascriptAndExtract( |
| 34 return std::string("window.domAutomationController.send(") + | 34 const wchar_t* javascript_expression) { |
| 35 javascript_expression + ")"; | 35 return std::wstring(L"window.domAutomationController.send(") + |
| 36 javascript_expression + L")"; |
| 36 } | 37 } |
| 37 | 38 |
| 38 class IsolatedAppTest : public ExtensionBrowserTest { | 39 class IsolatedAppTest : public ExtensionBrowserTest { |
| 39 public: | 40 public: |
| 40 // Returns whether the given tab's current URL has the given cookie. | 41 // Returns whether the given tab's current URL has the given cookie. |
| 41 bool WARN_UNUSED_RESULT HasCookie(WebContents* contents, std::string cookie) { | 42 bool WARN_UNUSED_RESULT HasCookie(WebContents* contents, std::string cookie) { |
| 42 int value_size; | 43 int value_size; |
| 43 std::string actual_cookie; | 44 std::string actual_cookie; |
| 44 automation_util::GetCookies(contents->GetURL(), contents, &value_size, | 45 automation_util::GetCookies(contents->GetURL(), contents, &value_size, |
| 45 &actual_cookie); | 46 &actual_cookie); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 | 120 |
| 120 // Using JavaScript to navigate to app2 page, | 121 // Using JavaScript to navigate to app2 page, |
| 121 // after the non_app page has finished loading. | 122 // after the non_app page has finished loading. |
| 122 content::WindowedNotificationObserver observer1( | 123 content::WindowedNotificationObserver observer1( |
| 123 content::NOTIFICATION_LOAD_STOP, | 124 content::NOTIFICATION_LOAD_STOP, |
| 124 content::Source<NavigationController>( | 125 content::Source<NavigationController>( |
| 125 &chrome::GetActiveWebContents(browser())->GetController())); | 126 &chrome::GetActiveWebContents(browser())->GetController())); |
| 126 std::string script = base::StringPrintf( | 127 std::string script = base::StringPrintf( |
| 127 "document.location.href=\"%s\";", | 128 "document.location.href=\"%s\";", |
| 128 base_url.Resolve("app2/main.html").spec().c_str()); | 129 base_url.Resolve("app2/main.html").spec().c_str()); |
| 129 EXPECT_TRUE(ExecuteJavaScript(rvh, "", script)); | 130 EXPECT_TRUE(ExecuteJavaScript(rvh, L"", ASCIIToWide(script))); |
| 130 observer1.Wait(); | 131 observer1.Wait(); |
| 131 | 132 |
| 132 // This kind of navigation should not replace previous navigation entry. | 133 // This kind of navigation should not replace previous navigation entry. |
| 133 EXPECT_TRUE(chrome::CanGoBack(browser())); | 134 EXPECT_TRUE(chrome::CanGoBack(browser())); |
| 134 chrome::GoBack(browser(), CURRENT_TAB); | 135 chrome::GoBack(browser(), CURRENT_TAB); |
| 135 EXPECT_FALSE(chrome::CanGoBack(browser())); | 136 EXPECT_FALSE(chrome::CanGoBack(browser())); |
| 136 } | 137 } |
| 137 | 138 |
| 138 // Tests that cookies set within an isolated app are not visible to normal | 139 // Tests that cookies set within an isolated app are not visible to normal |
| 139 // pages or other apps. | 140 // pages or other apps. |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 ASSERT_TRUE(GetInstalledApp(tab0)); | 176 ASSERT_TRUE(GetInstalledApp(tab0)); |
| 176 ASSERT_TRUE(GetInstalledApp(tab1)); | 177 ASSERT_TRUE(GetInstalledApp(tab1)); |
| 177 ASSERT_TRUE(!GetInstalledApp(tab2)); | 178 ASSERT_TRUE(!GetInstalledApp(tab2)); |
| 178 | 179 |
| 179 // Check that tabs see cannot each other's localStorage even though they are | 180 // Check that tabs see cannot each other's localStorage even though they are |
| 180 // in the same origin. | 181 // in the same origin. |
| 181 RenderViewHost* app1_rvh = tab0->GetRenderViewHost(); | 182 RenderViewHost* app1_rvh = tab0->GetRenderViewHost(); |
| 182 RenderViewHost* app2_rvh = tab1->GetRenderViewHost(); | 183 RenderViewHost* app2_rvh = tab1->GetRenderViewHost(); |
| 183 RenderViewHost* non_app_rvh = tab2->GetRenderViewHost(); | 184 RenderViewHost* non_app_rvh = tab2->GetRenderViewHost(); |
| 184 ASSERT_TRUE(ExecuteJavaScript( | 185 ASSERT_TRUE(ExecuteJavaScript( |
| 185 app1_rvh, "", "window.localStorage.setItem('testdata', 'ls_app1');")); | 186 app1_rvh, L"", L"window.localStorage.setItem('testdata', 'ls_app1');")); |
| 186 ASSERT_TRUE(ExecuteJavaScript( | 187 ASSERT_TRUE(ExecuteJavaScript( |
| 187 app2_rvh, "", "window.localStorage.setItem('testdata', 'ls_app2');")); | 188 app2_rvh, L"", L"window.localStorage.setItem('testdata', 'ls_app2');")); |
| 188 ASSERT_TRUE(ExecuteJavaScript( | 189 ASSERT_TRUE(ExecuteJavaScript( |
| 189 non_app_rvh, | 190 non_app_rvh, L"", |
| 190 "", | 191 L"window.localStorage.setItem('testdata', 'ls_normal');")); |
| 191 "window.localStorage.setItem('testdata', 'ls_normal');")); | |
| 192 | 192 |
| 193 const std::string& kRetrieveLocalStorage = | 193 const std::wstring& kRetrieveLocalStorage = |
| 194 WrapForJavascriptAndExtract( | 194 WrapForJavascriptAndExtract( |
| 195 "window.localStorage.getItem('testdata') || 'badval'"); | 195 L"window.localStorage.getItem('testdata') || 'badval'"); |
| 196 std::string result; | 196 std::string result; |
| 197 ASSERT_TRUE(ExecuteJavaScriptAndExtractString( | 197 ASSERT_TRUE(ExecuteJavaScriptAndExtractString( |
| 198 app1_rvh, "", kRetrieveLocalStorage.c_str(), &result)); | 198 app1_rvh, L"", kRetrieveLocalStorage.c_str(), &result)); |
| 199 EXPECT_EQ("ls_app1", result); | 199 EXPECT_EQ("ls_app1", result); |
| 200 ASSERT_TRUE(ExecuteJavaScriptAndExtractString( | 200 ASSERT_TRUE(ExecuteJavaScriptAndExtractString( |
| 201 app2_rvh, "", kRetrieveLocalStorage.c_str(), &result)); | 201 app2_rvh, L"", kRetrieveLocalStorage.c_str(), &result)); |
| 202 EXPECT_EQ("ls_app2", result); | 202 EXPECT_EQ("ls_app2", result); |
| 203 ASSERT_TRUE(ExecuteJavaScriptAndExtractString( | 203 ASSERT_TRUE(ExecuteJavaScriptAndExtractString( |
| 204 non_app_rvh, "", kRetrieveLocalStorage.c_str(), &result)); | 204 non_app_rvh, L"", kRetrieveLocalStorage.c_str(), &result)); |
| 205 EXPECT_EQ("ls_normal", result); | 205 EXPECT_EQ("ls_normal", result); |
| 206 | 206 |
| 207 // Check that each tab sees its own cookie. | 207 // Check that each tab sees its own cookie. |
| 208 EXPECT_TRUE(HasCookie(tab0, "app1=3")); | 208 EXPECT_TRUE(HasCookie(tab0, "app1=3")); |
| 209 EXPECT_TRUE(HasCookie(tab1, "app2=4")); | 209 EXPECT_TRUE(HasCookie(tab1, "app2=4")); |
| 210 EXPECT_TRUE(HasCookie(tab2, "normalPage=5")); | 210 EXPECT_TRUE(HasCookie(tab2, "normalPage=5")); |
| 211 | 211 |
| 212 // Check that app1 tab cannot see the other cookies. | 212 // Check that app1 tab cannot see the other cookies. |
| 213 EXPECT_FALSE(HasCookie(tab0, "app2")); | 213 EXPECT_FALSE(HasCookie(tab0, "app2")); |
| 214 EXPECT_FALSE(HasCookie(tab0, "normalPage")); | 214 EXPECT_FALSE(HasCookie(tab0, "normalPage")); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 | 281 |
| 282 // Check that all tabs share the same localStorage if they have the same | 282 // Check that all tabs share the same localStorage if they have the same |
| 283 // origin. | 283 // origin. |
| 284 RenderViewHost* app1_rvh = | 284 RenderViewHost* app1_rvh = |
| 285 chrome::GetWebContentsAt(browser(), 0)->GetRenderViewHost(); | 285 chrome::GetWebContentsAt(browser(), 0)->GetRenderViewHost(); |
| 286 RenderViewHost* app2_rvh = | 286 RenderViewHost* app2_rvh = |
| 287 chrome::GetWebContentsAt(browser(), 1)->GetRenderViewHost(); | 287 chrome::GetWebContentsAt(browser(), 1)->GetRenderViewHost(); |
| 288 RenderViewHost* non_app_rvh = | 288 RenderViewHost* non_app_rvh = |
| 289 chrome::GetWebContentsAt(browser(), 2)->GetRenderViewHost(); | 289 chrome::GetWebContentsAt(browser(), 2)->GetRenderViewHost(); |
| 290 ASSERT_TRUE(ExecuteJavaScript( | 290 ASSERT_TRUE(ExecuteJavaScript( |
| 291 app1_rvh, "", "window.localStorage.setItem('testdata', 'ls_app1');")); | 291 app1_rvh, L"", L"window.localStorage.setItem('testdata', 'ls_app1');")); |
| 292 ASSERT_TRUE(ExecuteJavaScript( | 292 ASSERT_TRUE(ExecuteJavaScript( |
| 293 app2_rvh, "", "window.localStorage.setItem('testdata', 'ls_app2');")); | 293 app2_rvh, L"", L"window.localStorage.setItem('testdata', 'ls_app2');")); |
| 294 ASSERT_TRUE(ExecuteJavaScript( | 294 ASSERT_TRUE(ExecuteJavaScript( |
| 295 non_app_rvh, | 295 non_app_rvh, L"", |
| 296 "", | 296 L"window.localStorage.setItem('testdata', 'ls_normal');")); |
| 297 "window.localStorage.setItem('testdata', 'ls_normal');")); | |
| 298 | 297 |
| 299 const std::string& kRetrieveLocalStorage = | 298 const std::wstring& kRetrieveLocalStorage = |
| 300 WrapForJavascriptAndExtract("window.localStorage.getItem('testdata')"); | 299 WrapForJavascriptAndExtract(L"window.localStorage.getItem('testdata')"); |
| 301 std::string result; | 300 std::string result; |
| 302 ASSERT_TRUE(ExecuteJavaScriptAndExtractString( | 301 ASSERT_TRUE(ExecuteJavaScriptAndExtractString( |
| 303 app1_rvh, "", kRetrieveLocalStorage.c_str(), &result)); | 302 app1_rvh, L"", kRetrieveLocalStorage.c_str(), &result)); |
| 304 EXPECT_EQ("ls_normal", result); | 303 EXPECT_EQ("ls_normal", result); |
| 305 ASSERT_TRUE(ExecuteJavaScriptAndExtractString( | 304 ASSERT_TRUE(ExecuteJavaScriptAndExtractString( |
| 306 app2_rvh, "", kRetrieveLocalStorage.c_str(), &result)); | 305 app2_rvh, L"", kRetrieveLocalStorage.c_str(), &result)); |
| 307 EXPECT_EQ("ls_normal", result); | 306 EXPECT_EQ("ls_normal", result); |
| 308 ASSERT_TRUE(ExecuteJavaScriptAndExtractString( | 307 ASSERT_TRUE(ExecuteJavaScriptAndExtractString( |
| 309 non_app_rvh, "", kRetrieveLocalStorage.c_str(), &result)); | 308 non_app_rvh, L"", kRetrieveLocalStorage.c_str(), &result)); |
| 310 EXPECT_EQ("ls_normal", result); | 309 EXPECT_EQ("ls_normal", result); |
| 311 } | 310 } |
| 312 | 311 |
| 313 // Tests that subresource and media requests use the app's cookie store. | 312 // Tests that subresource and media requests use the app's cookie store. |
| 314 // See http://crbug.com/141172. | 313 // See http://crbug.com/141172. |
| 315 IN_PROC_BROWSER_TEST_F(IsolatedAppTest, SubresourceCookieIsolation) { | 314 IN_PROC_BROWSER_TEST_F(IsolatedAppTest, SubresourceCookieIsolation) { |
| 316 host_resolver()->AddRule("*", "127.0.0.1"); | 315 host_resolver()->AddRule("*", "127.0.0.1"); |
| 317 ASSERT_TRUE(test_server()->Start()); | 316 ASSERT_TRUE(test_server()->Start()); |
| 318 | 317 |
| 319 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("isolated_apps/app1"))); | 318 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("isolated_apps/app1"))); |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 449 replace_host.SetHostStr(host_str); | 448 replace_host.SetHostStr(host_str); |
| 450 base_url = base_url.ReplaceComponents(replace_host); | 449 base_url = base_url.ReplaceComponents(replace_host); |
| 451 | 450 |
| 452 // Enter some state into sessionStorage three times on the same origin, but | 451 // Enter some state into sessionStorage three times on the same origin, but |
| 453 // for three URLs that correspond to app1, app2, and a non-isolated site. | 452 // for three URLs that correspond to app1, app2, and a non-isolated site. |
| 454 ui_test_utils::NavigateToURLWithDisposition( | 453 ui_test_utils::NavigateToURLWithDisposition( |
| 455 browser(), base_url.Resolve("app1/main.html"), | 454 browser(), base_url.Resolve("app1/main.html"), |
| 456 CURRENT_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); | 455 CURRENT_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
| 457 ASSERT_TRUE(ExecuteJavaScript( | 456 ASSERT_TRUE(ExecuteJavaScript( |
| 458 chrome::GetWebContentsAt(browser(), 0)->GetRenderViewHost(), | 457 chrome::GetWebContentsAt(browser(), 0)->GetRenderViewHost(), |
| 459 "", | 458 L"", |
| 460 "window.sessionStorage.setItem('testdata', 'ss_app1');")); | 459 L"window.sessionStorage.setItem('testdata', 'ss_app1');")); |
| 461 | 460 |
| 462 ui_test_utils::NavigateToURLWithDisposition( | 461 ui_test_utils::NavigateToURLWithDisposition( |
| 463 browser(), base_url.Resolve("app2/main.html"), | 462 browser(), base_url.Resolve("app2/main.html"), |
| 464 CURRENT_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); | 463 CURRENT_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
| 465 ASSERT_TRUE(ExecuteJavaScript( | 464 ASSERT_TRUE(ExecuteJavaScript( |
| 466 chrome::GetWebContentsAt(browser(), 0)->GetRenderViewHost(), | 465 chrome::GetWebContentsAt(browser(), 0)->GetRenderViewHost(), |
| 467 "", | 466 L"", |
| 468 "window.sessionStorage.setItem('testdata', 'ss_app2');")); | 467 L"window.sessionStorage.setItem('testdata', 'ss_app2');")); |
| 469 | 468 |
| 470 ui_test_utils::NavigateToURLWithDisposition( | 469 ui_test_utils::NavigateToURLWithDisposition( |
| 471 browser(), base_url.Resolve("non_app/main.html"), | 470 browser(), base_url.Resolve("non_app/main.html"), |
| 472 CURRENT_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); | 471 CURRENT_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
| 473 ASSERT_TRUE(ExecuteJavaScript( | 472 ASSERT_TRUE(ExecuteJavaScript( |
| 474 chrome::GetWebContentsAt(browser(), 0)->GetRenderViewHost(), | 473 chrome::GetWebContentsAt(browser(), 0)->GetRenderViewHost(), |
| 475 "", | 474 L"", |
| 476 "window.sessionStorage.setItem('testdata', 'ss_normal');")); | 475 L"window.sessionStorage.setItem('testdata', 'ss_normal');")); |
| 477 | 476 |
| 478 // Now, ensure that the sessionStorage is correctly partitioned, and persists | 477 // Now, ensure that the sessionStorage is correctly partitioned, and persists |
| 479 // when we navigate around all over the dang place. | 478 // when we navigate around all over the dang place. |
| 480 const std::string& kRetrieveSessionStorage = | 479 const std::wstring& kRetrieveSessionStorage = |
| 481 WrapForJavascriptAndExtract( | 480 WrapForJavascriptAndExtract( |
| 482 "window.sessionStorage.getItem('testdata') || 'badval'"); | 481 L"window.sessionStorage.getItem('testdata') || 'badval'"); |
| 483 std::string result; | 482 std::string result; |
| 484 ui_test_utils::NavigateToURLWithDisposition( | 483 ui_test_utils::NavigateToURLWithDisposition( |
| 485 browser(), base_url.Resolve("app1/main.html"), | 484 browser(), base_url.Resolve("app1/main.html"), |
| 486 CURRENT_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); | 485 CURRENT_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
| 487 ASSERT_TRUE(ExecuteJavaScriptAndExtractString( | 486 ASSERT_TRUE(ExecuteJavaScriptAndExtractString( |
| 488 chrome::GetWebContentsAt(browser(), 0)->GetRenderViewHost(), | 487 chrome::GetWebContentsAt(browser(), 0)->GetRenderViewHost(), |
| 489 "", kRetrieveSessionStorage.c_str(), &result)); | 488 L"", kRetrieveSessionStorage.c_str(), &result)); |
| 490 EXPECT_EQ("ss_app1", result); | 489 EXPECT_EQ("ss_app1", result); |
| 491 | 490 |
| 492 ui_test_utils::NavigateToURLWithDisposition( | 491 ui_test_utils::NavigateToURLWithDisposition( |
| 493 browser(), base_url.Resolve("app2/main.html"), | 492 browser(), base_url.Resolve("app2/main.html"), |
| 494 CURRENT_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); | 493 CURRENT_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
| 495 ASSERT_TRUE(ExecuteJavaScriptAndExtractString( | 494 ASSERT_TRUE(ExecuteJavaScriptAndExtractString( |
| 496 chrome::GetWebContentsAt(browser(), 0)->GetRenderViewHost(), | 495 chrome::GetWebContentsAt(browser(), 0)->GetRenderViewHost(), |
| 497 "", kRetrieveSessionStorage.c_str(), &result)); | 496 L"", kRetrieveSessionStorage.c_str(), &result)); |
| 498 EXPECT_EQ("ss_app2", result); | 497 EXPECT_EQ("ss_app2", result); |
| 499 | 498 |
| 500 ui_test_utils::NavigateToURLWithDisposition( | 499 ui_test_utils::NavigateToURLWithDisposition( |
| 501 browser(), base_url.Resolve("non_app/main.html"), | 500 browser(), base_url.Resolve("non_app/main.html"), |
| 502 CURRENT_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); | 501 CURRENT_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
| 503 ASSERT_TRUE(ExecuteJavaScriptAndExtractString( | 502 ASSERT_TRUE(ExecuteJavaScriptAndExtractString( |
| 504 chrome::GetWebContentsAt(browser(), 0)->GetRenderViewHost(), | 503 chrome::GetWebContentsAt(browser(), 0)->GetRenderViewHost(), |
| 505 "", kRetrieveSessionStorage.c_str(), &result)); | 504 L"", kRetrieveSessionStorage.c_str(), &result)); |
| 506 EXPECT_EQ("ss_normal", result); | 505 EXPECT_EQ("ss_normal", result); |
| 507 } | 506 } |
| OLD | NEW |