| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/file_path.h" | 5 #include "base/file_path.h" |
| 6 #include "base/file_util.h" | 6 #include "base/file_util.h" |
| 7 #include "content/browser/browser_thread_impl.h" | 7 #include "content/browser/browser_thread_impl.h" |
| 8 #include "content/browser/in_process_webkit/webkit_context.h" | 8 #include "content/browser/in_process_webkit/webkit_context.h" |
| 9 #include "content/test/test_browser_context.h" | 9 #include "content/test/test_browser_context.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
| 11 #include "webkit/quota/mock_special_storage_policy.h" | 11 #include "webkit/quota/mock_special_storage_policy.h" |
| 12 | 12 |
| 13 using content::BrowserContext; |
| 13 using content::BrowserThread; | 14 using content::BrowserThread; |
| 14 using content::BrowserThreadImpl; | 15 using content::BrowserThreadImpl; |
| 15 | 16 |
| 16 class DOMStorageTest : public testing::Test { | 17 class DOMStorageTest : public testing::Test { |
| 17 public: | 18 public: |
| 18 DOMStorageTest() | 19 DOMStorageTest() |
| 19 : message_loop_(MessageLoop::TYPE_IO), | 20 : message_loop_(MessageLoop::TYPE_IO), |
| 20 webkit_thread_(BrowserThread::WEBKIT_DEPRECATED, &message_loop_) { | 21 webkit_thread_(BrowserThread::WEBKIT_DEPRECATED, &message_loop_) { |
| 21 } | 22 } |
| 22 | 23 |
| 23 protected: | 24 protected: |
| 24 MessageLoop message_loop_; | 25 MessageLoop message_loop_; |
| 25 | 26 |
| 26 private: | 27 private: |
| 27 BrowserThreadImpl webkit_thread_; | 28 BrowserThreadImpl webkit_thread_; |
| 28 }; | 29 }; |
| 29 | 30 |
| 30 TEST_F(DOMStorageTest, SessionOnly) { | 31 TEST_F(DOMStorageTest, SessionOnly) { |
| 31 GURL session_only_origin("http://www.sessiononly.com"); | 32 GURL session_only_origin("http://www.sessiononly.com"); |
| 32 scoped_refptr<quota::MockSpecialStoragePolicy> special_storage_policy = | 33 scoped_refptr<quota::MockSpecialStoragePolicy> special_storage_policy = |
| 33 new quota::MockSpecialStoragePolicy; | 34 new quota::MockSpecialStoragePolicy; |
| 34 special_storage_policy->AddSessionOnly(session_only_origin); | 35 special_storage_policy->AddSessionOnly(session_only_origin); |
| 35 | 36 |
| 36 TestBrowserContext browser_context; | 37 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext); |
| 37 | 38 |
| 38 // Create databases for permanent and session-only origins. | 39 // Create databases for permanent and session-only origins. |
| 39 FilePath domstorage_dir = browser_context.GetPath().Append( | 40 FilePath domstorage_dir = browser_context->GetPath().Append( |
| 40 DOMStorageContext::kLocalStorageDirectory); | 41 DOMStorageContext::kLocalStorageDirectory); |
| 41 FilePath::StringType session_only_database( | 42 FilePath::StringType session_only_database( |
| 42 FILE_PATH_LITERAL("http_www.sessiononly.com_0")); | 43 FILE_PATH_LITERAL("http_www.sessiononly.com_0")); |
| 43 FilePath::StringType permanent_database( | 44 FilePath::StringType permanent_database( |
| 44 FILE_PATH_LITERAL("http_www.permanent.com_0")); | 45 FILE_PATH_LITERAL("http_www.permanent.com_0")); |
| 45 session_only_database.append(DOMStorageContext::kLocalStorageExtension); | 46 session_only_database.append(DOMStorageContext::kLocalStorageExtension); |
| 46 permanent_database.append(DOMStorageContext::kLocalStorageExtension); | 47 permanent_database.append(DOMStorageContext::kLocalStorageExtension); |
| 47 FilePath session_only_database_path = | 48 FilePath session_only_database_path = |
| 48 domstorage_dir.Append(session_only_database); | 49 domstorage_dir.Append(session_only_database); |
| 49 FilePath permanent_database_path = | 50 FilePath permanent_database_path = |
| 50 domstorage_dir.Append(permanent_database); | 51 domstorage_dir.Append(permanent_database); |
| 51 | 52 |
| 52 ASSERT_TRUE(file_util::CreateDirectory(domstorage_dir)); | 53 ASSERT_TRUE(file_util::CreateDirectory(domstorage_dir)); |
| 53 | 54 |
| 54 ASSERT_EQ(1, file_util::WriteFile(session_only_database_path, ".", 1)); | 55 ASSERT_EQ(1, file_util::WriteFile(session_only_database_path, ".", 1)); |
| 55 ASSERT_EQ(1, file_util::WriteFile(permanent_database_path, ".", 1)); | 56 ASSERT_EQ(1, file_util::WriteFile(permanent_database_path, ".", 1)); |
| 56 | 57 |
| 57 // Inject MockSpecialStoragePolicy into DOMStorageContext. | 58 // Inject MockSpecialStoragePolicy into DOMStorageContext. |
| 58 browser_context.GetWebKitContext()->dom_storage_context()-> | 59 BrowserContext::GetWebKitContext(browser_context.get())-> |
| 59 special_storage_policy_ = special_storage_policy; | 60 dom_storage_context()->special_storage_policy_ = special_storage_policy; |
| 60 | 61 |
| 61 // Delete the WebKitContext before destroying TestBrowserContext. This way the | 62 // Delete the TestBrowserContext but own the temp dir. This way the |
| 62 // temporary data directory stays alive long enough to conduct the test. | 63 // temporary data directory stays alive long enough to conduct the test. |
| 63 browser_context.webkit_context_ = NULL; | 64 ScopedTempDir temp_dir; |
| 65 ignore_result(temp_dir.Set(browser_context->TakePath())); |
| 66 browser_context.reset(); |
| 64 // Run the message loop to ensure that DOMStorageContext gets destroyed. | 67 // Run the message loop to ensure that DOMStorageContext gets destroyed. |
| 65 message_loop_.RunAllPending(); | 68 message_loop_.RunAllPending(); |
| 66 | 69 |
| 67 // Expected result: the database file for the permanent storage remains but | 70 // Expected result: the database file for the permanent storage remains but |
| 68 // the database for the session only storage was deleted. | 71 // the database for the session only storage was deleted. |
| 69 EXPECT_FALSE(file_util::PathExists(session_only_database_path)); | 72 EXPECT_FALSE(file_util::PathExists(session_only_database_path)); |
| 70 EXPECT_TRUE(file_util::PathExists(permanent_database_path)); | 73 EXPECT_TRUE(file_util::PathExists(permanent_database_path)); |
| 71 } | 74 } |
| 72 | 75 |
| 73 TEST_F(DOMStorageTest, SaveSessionState) { | 76 TEST_F(DOMStorageTest, SaveSessionState) { |
| 74 GURL session_only_origin("http://www.sessiononly.com"); | 77 GURL session_only_origin("http://www.sessiononly.com"); |
| 75 scoped_refptr<quota::MockSpecialStoragePolicy> special_storage_policy = | 78 scoped_refptr<quota::MockSpecialStoragePolicy> special_storage_policy = |
| 76 new quota::MockSpecialStoragePolicy; | 79 new quota::MockSpecialStoragePolicy; |
| 77 special_storage_policy->AddSessionOnly(session_only_origin); | 80 special_storage_policy->AddSessionOnly(session_only_origin); |
| 78 | 81 |
| 79 TestBrowserContext browser_context; | 82 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext); |
| 80 | 83 |
| 81 // Create databases for permanent and session-only origins. | 84 // Create databases for permanent and session-only origins. |
| 82 FilePath domstorage_dir = browser_context.GetPath().Append( | 85 FilePath domstorage_dir = browser_context->GetPath().Append( |
| 83 DOMStorageContext::kLocalStorageDirectory); | 86 DOMStorageContext::kLocalStorageDirectory); |
| 84 FilePath::StringType session_only_database( | 87 FilePath::StringType session_only_database( |
| 85 FILE_PATH_LITERAL("http_www.sessiononly.com_0")); | 88 FILE_PATH_LITERAL("http_www.sessiononly.com_0")); |
| 86 FilePath::StringType permanent_database( | 89 FilePath::StringType permanent_database( |
| 87 FILE_PATH_LITERAL("http_www.permanent.com_0")); | 90 FILE_PATH_LITERAL("http_www.permanent.com_0")); |
| 88 session_only_database.append(DOMStorageContext::kLocalStorageExtension); | 91 session_only_database.append(DOMStorageContext::kLocalStorageExtension); |
| 89 permanent_database.append(DOMStorageContext::kLocalStorageExtension); | 92 permanent_database.append(DOMStorageContext::kLocalStorageExtension); |
| 90 FilePath session_only_database_path = | 93 FilePath session_only_database_path = |
| 91 domstorage_dir.Append(session_only_database); | 94 domstorage_dir.Append(session_only_database); |
| 92 FilePath permanent_database_path = | 95 FilePath permanent_database_path = |
| 93 domstorage_dir.Append(permanent_database); | 96 domstorage_dir.Append(permanent_database); |
| 94 | 97 |
| 95 ASSERT_TRUE(file_util::CreateDirectory(domstorage_dir)); | 98 ASSERT_TRUE(file_util::CreateDirectory(domstorage_dir)); |
| 96 | 99 |
| 97 ASSERT_EQ(1, file_util::WriteFile(session_only_database_path, ".", 1)); | 100 ASSERT_EQ(1, file_util::WriteFile(session_only_database_path, ".", 1)); |
| 98 ASSERT_EQ(1, file_util::WriteFile(permanent_database_path, ".", 1)); | 101 ASSERT_EQ(1, file_util::WriteFile(permanent_database_path, ".", 1)); |
| 99 | 102 |
| 100 // Inject MockSpecialStoragePolicy into DOMStorageContext. | 103 // Inject MockSpecialStoragePolicy into DOMStorageContext. |
| 101 DOMStorageContext* dom_storage_context = | 104 DOMStorageContext* dom_storage_context = |
| 102 browser_context.GetWebKitContext()->dom_storage_context(); | 105 BrowserContext::GetWebKitContext(browser_context.get())-> |
| 106 dom_storage_context(); |
| 103 dom_storage_context->special_storage_policy_ = special_storage_policy; | 107 dom_storage_context->special_storage_policy_ = special_storage_policy; |
| 104 | 108 |
| 105 dom_storage_context->set_clear_local_state_on_exit_(true); | 109 dom_storage_context->set_clear_local_state_on_exit_(true); |
| 106 | 110 |
| 107 // Save session state. This should bypass the destruction-time deletion. | 111 // Save session state. This should bypass the destruction-time deletion. |
| 108 dom_storage_context->SaveSessionState(); | 112 dom_storage_context->SaveSessionState(); |
| 109 | 113 |
| 110 // Delete the WebKitContext before destroying TestBrowserContext. This way the | 114 // Delete the TestBrowserContext but own the temp dir. This way the |
| 111 // temporary data directory stays alive long enough to conduct the test. | 115 // temporary data directory stays alive long enough to conduct the test. |
| 112 browser_context.webkit_context_ = NULL; | 116 ScopedTempDir temp_dir; |
| 117 ignore_result(temp_dir.Set(browser_context->TakePath())); |
| 118 browser_context.reset(); |
| 113 // Run the message loop to ensure that DOMStorageContext gets destroyed. | 119 // Run the message loop to ensure that DOMStorageContext gets destroyed. |
| 114 message_loop_.RunAllPending(); | 120 message_loop_.RunAllPending(); |
| 115 | 121 |
| 116 // Expected result: no database files were deleted because of | 122 // Expected result: no database files were deleted because of |
| 117 // SaveSessionState. | 123 // SaveSessionState. |
| 118 EXPECT_TRUE(file_util::PathExists(session_only_database_path)); | 124 EXPECT_TRUE(file_util::PathExists(session_only_database_path)); |
| 119 EXPECT_TRUE(file_util::PathExists(permanent_database_path)); | 125 EXPECT_TRUE(file_util::PathExists(permanent_database_path)); |
| 120 } | 126 } |
| OLD | NEW |