summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/web_view_browsertest.cc
diff options
context:
space:
mode:
authorajwong@chromium.org <ajwong@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-13 09:11:30 +0000
committerajwong@chromium.org <ajwong@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-13 09:11:30 +0000
commitb471cf41edf3a0bb0e915ad697bf3485bd2da3f5 (patch)
tree619bc3fa1012088e1e9b2e2fb426416f83435fc8 /chrome/browser/extensions/web_view_browsertest.cc
parent4c14b49d4b5194b10c416a9fd9142af5f8ff2ef4 (diff)
downloadchromium_src-b471cf41edf3a0bb0e915ad697bf3485bd2da3f5.zip
chromium_src-b471cf41edf3a0bb0e915ad697bf3485bd2da3f5.tar.gz
chromium_src-b471cf41edf3a0bb0e915ad697bf3485bd2da3f5.tar.bz2
Fix on-disk structure for persistent storage in webview tags.
BUG=159464 Review URL: https://chromiumcodereview.appspot.com/11366140 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@167334 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions/web_view_browsertest.cc')
-rw-r--r--chrome/browser/extensions/web_view_browsertest.cc225
1 files changed, 221 insertions, 4 deletions
diff --git a/chrome/browser/extensions/web_view_browsertest.cc b/chrome/browser/extensions/web_view_browsertest.cc
index 8e68ece..6c6cbaa 100644
--- a/chrome/browser/extensions/web_view_browsertest.cc
+++ b/chrome/browser/extensions/web_view_browsertest.cc
@@ -32,12 +32,23 @@ class WebViewTest : public extensions::PlatformAppBrowserTest {
// the expected process allocation and storage partition assignment.
// The |navigate_to_url| parameter is used to navigate the main browser
// window.
+ //
+ // TODO(ajwong): This function is getting to be too large. Either refactor it
+ // so the test can specify a configuration of WebView tags that we will
+ // dynamically inject JS to generate, or move this test wholesale into
+ // something that RunPlatformAppTest() can execute purely in Javascript. This
+ // won't let us do a white-box examination of the StoragePartition equivalence
+ // directly, but we will be able to view the black box effects which is good
+ // enough. http://crbug.com/160361
void NavigateAndOpenAppForIsolation(
GURL navigate_to_url,
content::WebContents** default_tag_contents1,
content::WebContents** default_tag_contents2,
content::WebContents** named_partition_contents1,
- content::WebContents** named_partition_contents2) {
+ content::WebContents** named_partition_contents2,
+ content::WebContents** persistent_partition_contents1,
+ content::WebContents** persistent_partition_contents2,
+ content::WebContents** persistent_partition_contents3) {
GURL::Replacements replace_host;
std::string host_str("localhost"); // Must stay in scope with replace_host.
replace_host.SetHostStr(host_str);
@@ -56,6 +67,15 @@ class WebViewTest : public extensions::PlatformAppBrowserTest {
GURL tag_url4 = test_server()->GetURL(
"files/extensions/platform_apps/web_view_isolation/storage2.html");
tag_url4 = tag_url4.ReplaceComponents(replace_host);
+ GURL tag_url5 = test_server()->GetURL(
+ "files/extensions/platform_apps/web_view_isolation/storage1.html#p1");
+ tag_url5 = tag_url5.ReplaceComponents(replace_host);
+ GURL tag_url6 = test_server()->GetURL(
+ "files/extensions/platform_apps/web_view_isolation/storage1.html#p2");
+ tag_url6 = tag_url6.ReplaceComponents(replace_host);
+ GURL tag_url7 = test_server()->GetURL(
+ "files/extensions/platform_apps/web_view_isolation/storage1.html#p3");
+ tag_url7 = tag_url7.ReplaceComponents(replace_host);
ui_test_utils::NavigateToURLWithDisposition(
browser(), navigate_to_url, CURRENT_TAB,
@@ -69,11 +89,20 @@ class WebViewTest : public extensions::PlatformAppBrowserTest {
tag_url3, content::NotificationService::AllSources());
ui_test_utils::UrlLoadObserver observer4(
tag_url4, content::NotificationService::AllSources());
+ ui_test_utils::UrlLoadObserver observer5(
+ tag_url5, content::NotificationService::AllSources());
+ ui_test_utils::UrlLoadObserver observer6(
+ tag_url6, content::NotificationService::AllSources());
+ ui_test_utils::UrlLoadObserver observer7(
+ tag_url7, content::NotificationService::AllSources());
LoadAndLaunchPlatformApp("web_view_isolation");
observer1.Wait();
observer2.Wait();
observer3.Wait();
observer4.Wait();
+ observer5.Wait();
+ observer6.Wait();
+ observer7.Wait();
content::Source<content::NavigationController> source1 = observer1.source();
EXPECT_TRUE(source1->GetWebContents()->GetRenderProcessHost()->IsGuest());
@@ -83,6 +112,12 @@ class WebViewTest : public extensions::PlatformAppBrowserTest {
EXPECT_TRUE(source3->GetWebContents()->GetRenderProcessHost()->IsGuest());
content::Source<content::NavigationController> source4 = observer4.source();
EXPECT_TRUE(source4->GetWebContents()->GetRenderProcessHost()->IsGuest());
+ content::Source<content::NavigationController> source5 = observer5.source();
+ EXPECT_TRUE(source5->GetWebContents()->GetRenderProcessHost()->IsGuest());
+ content::Source<content::NavigationController> source6 = observer6.source();
+ EXPECT_TRUE(source6->GetWebContents()->GetRenderProcessHost()->IsGuest());
+ content::Source<content::NavigationController> source7 = observer7.source();
+ EXPECT_TRUE(source7->GetWebContents()->GetRenderProcessHost()->IsGuest());
// Check that the first two tags use the same process and it is different
// than the process used by the other two.
@@ -119,10 +154,41 @@ class WebViewTest : public extensions::PlatformAppBrowserTest {
source3->GetWebContents()->GetRenderProcessHost()->
GetStoragePartition());
+ // Ensure the persistent storage partitions are different.
+ EXPECT_EQ(
+ source5->GetWebContents()->GetRenderProcessHost()->
+ GetStoragePartition(),
+ source6->GetWebContents()->GetRenderProcessHost()->
+ GetStoragePartition());
+ EXPECT_NE(
+ source5->GetWebContents()->GetRenderProcessHost()->
+ GetStoragePartition(),
+ source7->GetWebContents()->GetRenderProcessHost()->
+ GetStoragePartition());
+ EXPECT_NE(
+ source1->GetWebContents()->GetRenderProcessHost()->
+ GetStoragePartition(),
+ source5->GetWebContents()->GetRenderProcessHost()->
+ GetStoragePartition());
+ EXPECT_NE(
+ source1->GetWebContents()->GetRenderProcessHost()->
+ GetStoragePartition(),
+ source7->GetWebContents()->GetRenderProcessHost()->
+ GetStoragePartition());
+
*default_tag_contents1 = source1->GetWebContents();
*default_tag_contents2 = source2->GetWebContents();
*named_partition_contents1 = source3->GetWebContents();
*named_partition_contents2 = source4->GetWebContents();
+ if (persistent_partition_contents1) {
+ *persistent_partition_contents1 = source5->GetWebContents();
+ }
+ if (persistent_partition_contents2) {
+ *persistent_partition_contents2 = source6->GetWebContents();
+ }
+ if (persistent_partition_contents3) {
+ *persistent_partition_contents3 = source7->GetWebContents();
+ }
}
void ExecuteScriptWaitForTitle(content::WebContents* web_contents,
@@ -182,7 +248,7 @@ IN_PROC_BROWSER_TEST_F(WebViewTest, CookieIsolation) {
NavigateAndOpenAppForIsolation(set_cookie_url, &cookie_contents1,
&cookie_contents2, &named_partition_contents1,
- &named_partition_contents2);
+ &named_partition_contents2, NULL, NULL, NULL);
EXPECT_TRUE(content::ExecuteJavaScript(
cookie_contents1->GetRenderViewHost(), std::wstring(), cookie_script1));
@@ -219,6 +285,157 @@ IN_PROC_BROWSER_TEST_F(WebViewTest, CookieIsolation) {
EXPECT_EQ("", cookie_value);
}
+// This tests that in-memory storage partitions are reset on browser restart,
+// but persistent ones maintain state for cookies and HTML5 storage.
+IN_PROC_BROWSER_TEST_F(WebViewTest, PRE_StoragePersistence) {
+ ASSERT_TRUE(StartTestServer());
+ const std::wstring kExpire =
+ L"var expire = new Date(Date.now() + 24 * 60 * 60 * 1000);";
+ std::wstring cookie_script1(kExpire);
+ cookie_script1.append(
+ L"document.cookie = 'inmemory=true; path=/; expires=' + expire + ';';");
+ std::wstring cookie_script2(kExpire);
+ cookie_script2.append(
+ L"document.cookie = 'persist1=true; path=/; expires=' + expire + ';';");
+ std::wstring cookie_script3(kExpire);
+ cookie_script3.append(
+ L"document.cookie = 'persist2=true; path=/; expires=' + expire + ';';");
+
+ // We don't care where the main browser is on this test.
+ GURL blank_url("about:blank");
+
+ // The first two partitions will be used to set cookies and ensure they are
+ // shared. The named partition is used to ensure that cookies are isolated
+ // between partitions within the same app.
+ content::WebContents* cookie_contents1;
+ content::WebContents* cookie_contents2;
+ content::WebContents* named_partition_contents1;
+ content::WebContents* named_partition_contents2;
+ content::WebContents* persistent_partition_contents1;
+ content::WebContents* persistent_partition_contents2;
+ content::WebContents* persistent_partition_contents3;
+ NavigateAndOpenAppForIsolation(blank_url, &cookie_contents1,
+ &cookie_contents2, &named_partition_contents1,
+ &named_partition_contents2,
+ &persistent_partition_contents1,
+ &persistent_partition_contents2,
+ &persistent_partition_contents3);
+
+ // Set the inmemory=true cookie for tags with inmemory partitions.
+ EXPECT_TRUE(content::ExecuteJavaScript(
+ cookie_contents1->GetRenderViewHost(), std::wstring(),
+ cookie_script1));
+ EXPECT_TRUE(content::ExecuteJavaScript(
+ named_partition_contents1->GetRenderViewHost(), std::wstring(),
+ cookie_script1));
+
+ // For the two different persistent storage partitions, set the
+ // two different cookies so we can check that they aren't comingled below.
+ EXPECT_TRUE(content::ExecuteJavaScript(
+ persistent_partition_contents1->GetRenderViewHost(), std::wstring(),
+ cookie_script2));
+
+ EXPECT_TRUE(content::ExecuteJavaScript(
+ persistent_partition_contents3->GetRenderViewHost(), std::wstring(),
+ cookie_script3));
+
+ int cookie_size;
+ std::string cookie_value;
+
+ // Check that all in-memory partitions have a cookie set.
+ automation_util::GetCookies(GURL("http://localhost"),
+ cookie_contents1,
+ &cookie_size, &cookie_value);
+ EXPECT_EQ("inmemory=true", cookie_value);
+ automation_util::GetCookies(GURL("http://localhost"),
+ cookie_contents2,
+ &cookie_size, &cookie_value);
+ EXPECT_EQ("inmemory=true", cookie_value);
+ automation_util::GetCookies(GURL("http://localhost"),
+ named_partition_contents1,
+ &cookie_size, &cookie_value);
+ EXPECT_EQ("inmemory=true", cookie_value);
+ automation_util::GetCookies(GURL("http://localhost"),
+ named_partition_contents2,
+ &cookie_size, &cookie_value);
+ EXPECT_EQ("inmemory=true", cookie_value);
+
+ // Check that all persistent partitions kept their state.
+ automation_util::GetCookies(GURL("http://localhost"),
+ persistent_partition_contents1,
+ &cookie_size, &cookie_value);
+ EXPECT_EQ("persist1=true", cookie_value);
+ automation_util::GetCookies(GURL("http://localhost"),
+ persistent_partition_contents2,
+ &cookie_size, &cookie_value);
+ EXPECT_EQ("persist1=true", cookie_value);
+ automation_util::GetCookies(GURL("http://localhost"),
+ persistent_partition_contents3,
+ &cookie_size, &cookie_value);
+ EXPECT_EQ("persist2=true", cookie_value);
+}
+
+// This is the post-reset portion of the StoragePersistence test. See
+// PRE_StoragePersistence for main comment.
+IN_PROC_BROWSER_TEST_F(WebViewTest, StoragePersistence) {
+ ASSERT_TRUE(StartTestServer());
+
+ // We don't care where the main browser is on this test.
+ GURL blank_url("about:blank");
+
+ // The first two partitions will be used to set cookies and ensure they are
+ // shared. The named partition is used to ensure that cookies are isolated
+ // between partitions within the same app.
+ content::WebContents* cookie_contents1;
+ content::WebContents* cookie_contents2;
+ content::WebContents* named_partition_contents1;
+ content::WebContents* named_partition_contents2;
+ content::WebContents* persistent_partition_contents1;
+ content::WebContents* persistent_partition_contents2;
+ content::WebContents* persistent_partition_contents3;
+ NavigateAndOpenAppForIsolation(blank_url, &cookie_contents1,
+ &cookie_contents2, &named_partition_contents1,
+ &named_partition_contents2,
+ &persistent_partition_contents1,
+ &persistent_partition_contents2,
+ &persistent_partition_contents3);
+
+ int cookie_size;
+ std::string cookie_value;
+
+ // Check that all in-memory partitions lost their state.
+ automation_util::GetCookies(GURL("http://localhost"),
+ cookie_contents1,
+ &cookie_size, &cookie_value);
+ EXPECT_EQ("", cookie_value);
+ automation_util::GetCookies(GURL("http://localhost"),
+ cookie_contents2,
+ &cookie_size, &cookie_value);
+ EXPECT_EQ("", cookie_value);
+ automation_util::GetCookies(GURL("http://localhost"),
+ named_partition_contents1,
+ &cookie_size, &cookie_value);
+ EXPECT_EQ("", cookie_value);
+ automation_util::GetCookies(GURL("http://localhost"),
+ named_partition_contents2,
+ &cookie_size, &cookie_value);
+ EXPECT_EQ("", cookie_value);
+
+ // Check that all persistent partitions kept their state.
+ automation_util::GetCookies(GURL("http://localhost"),
+ persistent_partition_contents1,
+ &cookie_size, &cookie_value);
+ EXPECT_EQ("persist1=true", cookie_value);
+ automation_util::GetCookies(GURL("http://localhost"),
+ persistent_partition_contents2,
+ &cookie_size, &cookie_value);
+ EXPECT_EQ("persist1=true", cookie_value);
+ automation_util::GetCookies(GURL("http://localhost"),
+ persistent_partition_contents3,
+ &cookie_size, &cookie_value);
+ EXPECT_EQ("persist2=true", cookie_value);
+}
+
// This tests DOM storage isolation for packaged apps with webview tags. It
// loads an app with multiple webview tags and each tag sets DOM storage
// entries, which the test checks to ensure proper storage isolation is
@@ -240,7 +457,7 @@ IN_PROC_BROWSER_TEST_F(WebViewTest, DOMStorageIsolation) {
NavigateAndOpenAppForIsolation(regular_url, &default_tag_contents1,
&default_tag_contents2, &storage_contents1,
- &storage_contents2);
+ &storage_contents2, NULL, NULL, NULL);
// Initialize the storage for the first of the two tags that share a storage
// partition.
@@ -321,7 +538,7 @@ IN_PROC_BROWSER_TEST_F(WebViewTest, IndexedDBIsolation) {
NavigateAndOpenAppForIsolation(regular_url, &default_tag_contents1,
&default_tag_contents2, &storage_contents1,
- &storage_contents2);
+ &storage_contents2, NULL, NULL, NULL);
// Initialize the storage for the first of the two tags that share a storage
// partition.