OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 "content/browser/indexed_db/indexed_db_backing_store.h" | 5 #include "content/browser/indexed_db/indexed_db_backing_store.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 12 matching lines...) Expand all Loading... |
23 #include "content/browser/indexed_db/indexed_db_leveldb_coding.h" | 23 #include "content/browser/indexed_db/indexed_db_leveldb_coding.h" |
24 #include "content/browser/indexed_db/indexed_db_value.h" | 24 #include "content/browser/indexed_db/indexed_db_value.h" |
25 #include "content/browser/indexed_db/leveldb/leveldb_factory.h" | 25 #include "content/browser/indexed_db/leveldb/leveldb_factory.h" |
26 #include "content/browser/quota/mock_quota_manager_proxy.h" | 26 #include "content/browser/quota/mock_quota_manager_proxy.h" |
27 #include "content/public/test/mock_special_storage_policy.h" | 27 #include "content/public/test/mock_special_storage_policy.h" |
28 #include "content/public/test/test_browser_thread_bundle.h" | 28 #include "content/public/test/test_browser_thread_bundle.h" |
29 #include "net/url_request/url_request_test_util.h" | 29 #include "net/url_request/url_request_test_util.h" |
30 #include "storage/browser/blob/blob_data_handle.h" | 30 #include "storage/browser/blob/blob_data_handle.h" |
31 #include "storage/browser/quota/special_storage_policy.h" | 31 #include "storage/browser/quota/special_storage_policy.h" |
32 #include "testing/gtest/include/gtest/gtest.h" | 32 #include "testing/gtest/include/gtest/gtest.h" |
| 33 #include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBDatabaseExc
eption.h" |
33 #include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBTypes.h" | 34 #include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBTypes.h" |
34 | 35 |
35 using base::ASCIIToUTF16; | 36 using base::ASCIIToUTF16; |
36 using url::Origin; | 37 using url::Origin; |
37 | 38 |
38 namespace content { | 39 namespace content { |
39 | 40 |
40 namespace { | 41 namespace { |
41 static const size_t kDefaultMaxOpenIteratorsPerDatabase = 50; | 42 static const size_t kDefaultMaxOpenIteratorsPerDatabase = 50; |
42 | 43 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 private: | 75 private: |
75 DISALLOW_COPY_AND_ASSIGN(DefaultLevelDBFactory); | 76 DISALLOW_COPY_AND_ASSIGN(DefaultLevelDBFactory); |
76 }; | 77 }; |
77 | 78 |
78 class TestableIndexedDBBackingStore : public IndexedDBBackingStore { | 79 class TestableIndexedDBBackingStore : public IndexedDBBackingStore { |
79 public: | 80 public: |
80 static scoped_refptr<TestableIndexedDBBackingStore> Open( | 81 static scoped_refptr<TestableIndexedDBBackingStore> Open( |
81 IndexedDBFactory* indexed_db_factory, | 82 IndexedDBFactory* indexed_db_factory, |
82 const Origin& origin, | 83 const Origin& origin, |
83 const base::FilePath& path_base, | 84 const base::FilePath& path_base, |
| 85 const IndexedDBDataFormatVersion& data_format_version, |
84 scoped_refptr<net::URLRequestContextGetter> request_context_getter, | 86 scoped_refptr<net::URLRequestContextGetter> request_context_getter, |
85 LevelDBFactory* leveldb_factory, | 87 LevelDBFactory* leveldb_factory, |
86 base::SequencedTaskRunner* task_runner, | 88 base::SequencedTaskRunner* task_runner, |
87 leveldb::Status* status) { | 89 leveldb::Status* status) { |
88 DCHECK(!path_base.empty()); | 90 DCHECK(!path_base.empty()); |
89 | 91 |
90 std::unique_ptr<LevelDBComparator> comparator = | 92 std::unique_ptr<LevelDBComparator> comparator = |
91 base::MakeUnique<Comparator>(); | 93 base::MakeUnique<Comparator>(); |
92 | 94 |
93 if (!base::CreateDirectory(path_base)) { | 95 if (!base::CreateDirectory(path_base)) { |
94 *status = leveldb::Status::IOError("Unable to create base dir"); | 96 *status = leveldb::Status::IOError("Unable to create base dir"); |
95 return scoped_refptr<TestableIndexedDBBackingStore>(); | 97 return scoped_refptr<TestableIndexedDBBackingStore>(); |
96 } | 98 } |
97 | 99 |
98 const base::FilePath file_path = path_base.AppendASCII("test_db_path"); | 100 const base::FilePath file_path = |
99 const base::FilePath blob_path = path_base.AppendASCII("test_blob_path"); | 101 path_base.Append(IndexedDBContextImpl::GetLevelDBFileName(origin)); |
| 102 const base::FilePath blob_path = |
| 103 path_base.Append(IndexedDBContextImpl::GetBlobStoreFileName(origin)); |
100 | 104 |
101 std::unique_ptr<LevelDBDatabase> db; | 105 std::unique_ptr<LevelDBDatabase> db; |
102 bool is_disk_full = false; | 106 bool is_disk_full = false; |
103 *status = leveldb_factory->OpenLevelDB( | 107 *status = leveldb_factory->OpenLevelDB( |
104 file_path, comparator.get(), &db, &is_disk_full); | 108 file_path, comparator.get(), &db, &is_disk_full); |
105 | 109 |
106 if (!db || !status->ok()) | 110 if (!db || !status->ok()) |
107 return scoped_refptr<TestableIndexedDBBackingStore>(); | 111 return scoped_refptr<TestableIndexedDBBackingStore>(); |
108 | 112 |
109 scoped_refptr<TestableIndexedDBBackingStore> backing_store( | 113 scoped_refptr<TestableIndexedDBBackingStore> backing_store( |
110 new TestableIndexedDBBackingStore(indexed_db_factory, origin, blob_path, | 114 new TestableIndexedDBBackingStore(indexed_db_factory, origin, blob_path, |
| 115 data_format_version, |
111 request_context_getter, std::move(db), | 116 request_context_getter, std::move(db), |
112 std::move(comparator), task_runner)); | 117 std::move(comparator), task_runner)); |
113 | 118 |
114 *status = backing_store->SetUpMetadata(); | 119 *status = backing_store->SetUpMetadata(); |
115 if (!status->ok()) | 120 if (!status->ok()) |
116 return scoped_refptr<TestableIndexedDBBackingStore>(); | 121 return scoped_refptr<TestableIndexedDBBackingStore>(); |
117 | 122 |
118 return backing_store; | 123 return backing_store; |
119 } | 124 } |
120 | 125 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 // Timers don't play nicely with unit tests. | 167 // Timers don't play nicely with unit tests. |
163 void StartJournalCleaningTimer() override { | 168 void StartJournalCleaningTimer() override { |
164 CleanPrimaryJournalIgnoreReturn(); | 169 CleanPrimaryJournalIgnoreReturn(); |
165 } | 170 } |
166 | 171 |
167 private: | 172 private: |
168 TestableIndexedDBBackingStore( | 173 TestableIndexedDBBackingStore( |
169 IndexedDBFactory* indexed_db_factory, | 174 IndexedDBFactory* indexed_db_factory, |
170 const Origin& origin, | 175 const Origin& origin, |
171 const base::FilePath& blob_path, | 176 const base::FilePath& blob_path, |
| 177 const IndexedDBDataFormatVersion& data_format_version, |
172 scoped_refptr<net::URLRequestContextGetter> request_context_getter, | 178 scoped_refptr<net::URLRequestContextGetter> request_context_getter, |
173 std::unique_ptr<LevelDBDatabase> db, | 179 std::unique_ptr<LevelDBDatabase> db, |
174 std::unique_ptr<LevelDBComparator> comparator, | 180 std::unique_ptr<LevelDBComparator> comparator, |
175 base::SequencedTaskRunner* task_runner) | 181 base::SequencedTaskRunner* task_runner) |
176 : IndexedDBBackingStore(indexed_db_factory, | 182 : IndexedDBBackingStore(indexed_db_factory, |
177 origin, | 183 origin, |
178 blob_path, | 184 blob_path, |
| 185 data_format_version, |
179 request_context_getter, | 186 request_context_getter, |
180 std::move(db), | 187 std::move(db), |
181 std::move(comparator), | 188 std::move(comparator), |
182 task_runner), | 189 task_runner), |
183 database_id_(0) {} | 190 database_id_(0) {} |
184 | 191 |
185 int64_t database_id_; | 192 int64_t database_id_; |
186 std::vector<Transaction::WriteDescriptor> writes_; | 193 std::vector<Transaction::WriteDescriptor> writes_; |
187 | 194 |
188 // This is modified in an overridden virtual function that is properly const | 195 // This is modified in an overridden virtual function that is properly const |
189 // in the real implementation, therefore must be mutable here. | 196 // in the real implementation, therefore must be mutable here. |
190 mutable std::vector<int64_t> removals_; | 197 mutable std::vector<int64_t> removals_; |
191 | 198 |
192 DISALLOW_COPY_AND_ASSIGN(TestableIndexedDBBackingStore); | 199 DISALLOW_COPY_AND_ASSIGN(TestableIndexedDBBackingStore); |
193 }; | 200 }; |
194 | 201 |
195 class TestIDBFactory : public IndexedDBFactoryImpl { | 202 class TestIDBFactory : public IndexedDBFactoryImpl { |
196 public: | 203 public: |
197 explicit TestIDBFactory(IndexedDBContextImpl* idb_context) | 204 explicit TestIDBFactory(IndexedDBContextImpl* idb_context) |
198 : IndexedDBFactoryImpl(idb_context) {} | 205 : IndexedDBFactoryImpl(idb_context) {} |
199 | 206 |
200 scoped_refptr<TestableIndexedDBBackingStore> OpenBackingStoreForTest( | 207 scoped_refptr<TestableIndexedDBBackingStore> OpenBackingStoreForTest( |
201 const Origin& origin, | 208 const Origin& origin, |
202 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter) { | 209 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter) { |
203 IndexedDBDataLossInfo data_loss_info; | 210 IndexedDBDataLossInfo data_loss_info; |
204 bool disk_full; | 211 bool disk_full; |
205 leveldb::Status status; | 212 leveldb::Status status; |
206 scoped_refptr<IndexedDBBackingStore> backing_store = OpenBackingStore( | 213 scoped_refptr<IndexedDBBackingStore> backing_store = OpenBackingStore( |
207 origin, context()->data_path(), url_request_context_getter, | 214 origin, context()->data_path(), IndexedDBDataFormatVersion(), |
208 &data_loss_info, &disk_full, &status); | 215 url_request_context_getter, &data_loss_info, &disk_full, &status); |
209 scoped_refptr<TestableIndexedDBBackingStore> testable_store = | 216 scoped_refptr<TestableIndexedDBBackingStore> testable_store = |
210 static_cast<TestableIndexedDBBackingStore*>(backing_store.get()); | 217 static_cast<TestableIndexedDBBackingStore*>(backing_store.get()); |
211 return testable_store; | 218 return testable_store; |
212 } | 219 } |
213 | 220 |
214 protected: | 221 protected: |
215 ~TestIDBFactory() override {} | 222 ~TestIDBFactory() override {} |
216 | 223 |
217 scoped_refptr<IndexedDBBackingStore> OpenBackingStoreHelper( | 224 scoped_refptr<IndexedDBBackingStore> OpenBackingStoreHelper( |
218 const Origin& origin, | 225 const Origin& origin, |
219 const base::FilePath& data_directory, | 226 const base::FilePath& data_directory, |
| 227 const IndexedDBDataFormatVersion& data_format_version, |
220 scoped_refptr<net::URLRequestContextGetter> request_context_getter, | 228 scoped_refptr<net::URLRequestContextGetter> request_context_getter, |
221 IndexedDBDataLossInfo* data_loss_info, | 229 IndexedDBDataLossInfo* data_loss_info, |
222 bool* disk_full, | 230 bool* disk_full, |
223 bool first_time, | 231 bool first_time, |
224 leveldb::Status* status) override { | 232 leveldb::Status* status) override { |
225 DefaultLevelDBFactory leveldb_factory; | 233 DefaultLevelDBFactory leveldb_factory; |
226 return TestableIndexedDBBackingStore::Open( | 234 return TestableIndexedDBBackingStore::Open( |
227 this, origin, data_directory, request_context_getter, &leveldb_factory, | 235 this, origin, data_directory, data_format_version, |
228 context()->TaskRunner(), status); | 236 request_context_getter, &leveldb_factory, context()->TaskRunner(), |
| 237 status); |
229 } | 238 } |
230 | 239 |
231 private: | 240 private: |
232 DISALLOW_COPY_AND_ASSIGN(TestIDBFactory); | 241 DISALLOW_COPY_AND_ASSIGN(TestIDBFactory); |
233 }; | 242 }; |
234 | 243 |
235 class IndexedDBBackingStoreTest : public testing::Test { | 244 class IndexedDBBackingStoreTest : public testing::Test { |
236 public: | 245 public: |
237 IndexedDBBackingStoreTest() {} | 246 IndexedDBBackingStoreTest() {} |
238 void SetUp() override { | 247 void SetUp() override { |
(...skipping 910 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1149 | 1158 |
1150 // Dictionary, message key and more. | 1159 // Dictionary, message key and more. |
1151 ASSERT_TRUE(WriteFile(info_path, "{\"message\":\"foo\",\"bar\":5}")); | 1160 ASSERT_TRUE(WriteFile(info_path, "{\"message\":\"foo\",\"bar\":5}")); |
1152 EXPECT_TRUE( | 1161 EXPECT_TRUE( |
1153 IndexedDBBackingStore::ReadCorruptionInfo(path_base, origin, &message)); | 1162 IndexedDBBackingStore::ReadCorruptionInfo(path_base, origin, &message)); |
1154 EXPECT_FALSE(PathExists(info_path)); | 1163 EXPECT_FALSE(PathExists(info_path)); |
1155 EXPECT_EQ("foo", message); | 1164 EXPECT_EQ("foo", message); |
1156 } | 1165 } |
1157 | 1166 |
1158 } // namespace content | 1167 } // namespace content |
OLD | NEW |