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