| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 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_factory.h" | 5 #include "content/browser/indexed_db/indexed_db_factory.h" |
| 6 | 6 |
| 7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
| 8 #include "base/files/scoped_temp_dir.h" | 8 #include "base/files/scoped_temp_dir.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 const base::FilePath& data_directory) { | 42 const base::FilePath& data_directory) { |
| 43 blink::WebIDBDataLoss data_loss = | 43 blink::WebIDBDataLoss data_loss = |
| 44 blink::WebIDBDataLossNone; | 44 blink::WebIDBDataLossNone; |
| 45 std::string data_loss_message; | 45 std::string data_loss_message; |
| 46 bool disk_full; | 46 bool disk_full; |
| 47 scoped_refptr<IndexedDBBackingStore> backing_store = | 47 scoped_refptr<IndexedDBBackingStore> backing_store = |
| 48 OpenBackingStore(origin, | 48 OpenBackingStore(origin, |
| 49 data_directory, | 49 data_directory, |
| 50 &data_loss, | 50 &data_loss, |
| 51 &data_loss_message, | 51 &data_loss_message, |
| 52 &disk_full); | 52 &disk_full, |
| 53 NULL /* task_runner */); |
| 53 EXPECT_EQ(blink::WebIDBDataLossNone, data_loss); | 54 EXPECT_EQ(blink::WebIDBDataLossNone, data_loss); |
| 54 return backing_store; | 55 return backing_store; |
| 55 } | 56 } |
| 56 | 57 |
| 57 void TestCloseBackingStore(IndexedDBBackingStore* backing_store) { | 58 void TestCloseBackingStore(IndexedDBBackingStore* backing_store) { |
| 58 CloseBackingStore(backing_store->origin_url()); | 59 CloseBackingStore(backing_store->origin_url()); |
| 59 } | 60 } |
| 60 | 61 |
| 61 void TestReleaseBackingStore(IndexedDBBackingStore* backing_store, | 62 void TestReleaseBackingStore(IndexedDBBackingStore* backing_store, |
| 62 bool immediate) { | 63 bool immediate) { |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 public: | 183 public: |
| 183 DiskFullFactory() : IndexedDBFactory(NULL) {} | 184 DiskFullFactory() : IndexedDBFactory(NULL) {} |
| 184 | 185 |
| 185 private: | 186 private: |
| 186 virtual ~DiskFullFactory() {} | 187 virtual ~DiskFullFactory() {} |
| 187 virtual scoped_refptr<IndexedDBBackingStore> OpenBackingStore( | 188 virtual scoped_refptr<IndexedDBBackingStore> OpenBackingStore( |
| 188 const GURL& origin_url, | 189 const GURL& origin_url, |
| 189 const base::FilePath& data_directory, | 190 const base::FilePath& data_directory, |
| 190 blink::WebIDBDataLoss* data_loss, | 191 blink::WebIDBDataLoss* data_loss, |
| 191 std::string* data_loss_message, | 192 std::string* data_loss_message, |
| 192 bool* disk_full) OVERRIDE { | 193 bool* disk_full, |
| 194 base::TaskRunner* task_runner) OVERRIDE { |
| 193 *disk_full = true; | 195 *disk_full = true; |
| 194 return scoped_refptr<IndexedDBBackingStore>(); | 196 return scoped_refptr<IndexedDBBackingStore>(); |
| 195 } | 197 } |
| 196 }; | 198 }; |
| 197 | 199 |
| 198 class LookingForQuotaErrorMockCallbacks : public IndexedDBCallbacks { | 200 class LookingForQuotaErrorMockCallbacks : public IndexedDBCallbacks { |
| 199 public: | 201 public: |
| 200 LookingForQuotaErrorMockCallbacks() | 202 LookingForQuotaErrorMockCallbacks() |
| 201 : IndexedDBCallbacks(NULL, 0, 0), error_called_(false) {} | 203 : IndexedDBCallbacks(NULL, 0, 0), error_called_(false) {} |
| 202 virtual void OnError(const IndexedDBDatabaseError& error) OVERRIDE { | 204 virtual void OnError(const IndexedDBDatabaseError& error) OVERRIDE { |
| 203 error_called_ = true; | 205 error_called_ = true; |
| 204 EXPECT_EQ(blink::WebIDBDatabaseExceptionQuotaError, error.code()); | 206 EXPECT_EQ(blink::WebIDBDatabaseExceptionQuotaError, error.code()); |
| 205 } | 207 } |
| 206 | 208 |
| 207 private: | 209 private: |
| 208 virtual ~LookingForQuotaErrorMockCallbacks() { EXPECT_TRUE(error_called_); } | 210 virtual ~LookingForQuotaErrorMockCallbacks() { EXPECT_TRUE(error_called_); } |
| 209 bool error_called_; | 211 bool error_called_; |
| 210 }; | 212 }; |
| 211 | 213 |
| 212 TEST_F(IndexedDBFactoryTest, QuotaErrorOnDiskFull) { | 214 TEST_F(IndexedDBFactoryTest, QuotaErrorOnDiskFull) { |
| 213 const GURL origin("http://localhost:81"); | 215 const GURL origin("http://localhost:81"); |
| 216 base::ScopedTempDir temp_directory; |
| 217 ASSERT_TRUE(temp_directory.CreateUniqueTempDir()); |
| 214 | 218 |
| 215 scoped_refptr<DiskFullFactory> factory = new DiskFullFactory; | 219 scoped_refptr<DiskFullFactory> factory = new DiskFullFactory; |
| 216 scoped_refptr<LookingForQuotaErrorMockCallbacks> callbacks = | 220 scoped_refptr<LookingForQuotaErrorMockCallbacks> callbacks = |
| 217 new LookingForQuotaErrorMockCallbacks; | 221 new LookingForQuotaErrorMockCallbacks; |
| 218 scoped_refptr<IndexedDBDatabaseCallbacks> dummy_database_callbacks = | 222 scoped_refptr<IndexedDBDatabaseCallbacks> dummy_database_callbacks = |
| 219 new IndexedDBDatabaseCallbacks(NULL, 0, 0); | 223 new IndexedDBDatabaseCallbacks(NULL, 0, 0); |
| 220 const base::string16 name(ASCIIToUTF16("name")); | 224 const base::string16 name(ASCIIToUTF16("name")); |
| 221 IndexedDBPendingConnection connection(callbacks, | 225 IndexedDBPendingConnection connection(callbacks, |
| 222 dummy_database_callbacks, | 226 dummy_database_callbacks, |
| 223 0, /* child_process_id */ | 227 0, /* child_process_id */ |
| 224 2, /* transaction_id */ | 228 2, /* transaction_id */ |
| 225 1 /* version */); | 229 1 /* version */); |
| 226 factory->Open( | 230 factory->Open( |
| 227 name, connection, origin, base::FilePath(FILE_PATH_LITERAL("/dummy"))); | 231 name, connection, origin, temp_directory.path(), NULL /* task_runner */); |
| 228 } | 232 } |
| 229 | 233 |
| 230 TEST_F(IndexedDBFactoryTest, BackingStoreReleasedOnForcedClose) { | 234 TEST_F(IndexedDBFactoryTest, BackingStoreReleasedOnForcedClose) { |
| 231 GURL origin("http://localhost:81"); | 235 GURL origin("http://localhost:81"); |
| 232 | 236 |
| 233 base::ScopedTempDir temp_directory; | 237 base::ScopedTempDir temp_directory; |
| 234 ASSERT_TRUE(temp_directory.CreateUniqueTempDir()); | 238 ASSERT_TRUE(temp_directory.CreateUniqueTempDir()); |
| 235 | 239 |
| 236 scoped_refptr<IndexedDBFactory> factory = new IndexedDBFactory(NULL); | 240 scoped_refptr<IndexedDBFactory> factory = new IndexedDBFactory(NULL); |
| 237 | 241 |
| 238 scoped_refptr<MockIndexedDBCallbacks> callbacks(new MockIndexedDBCallbacks()); | 242 scoped_refptr<MockIndexedDBCallbacks> callbacks(new MockIndexedDBCallbacks()); |
| 239 scoped_refptr<MockIndexedDBDatabaseCallbacks> db_callbacks( | 243 scoped_refptr<MockIndexedDBDatabaseCallbacks> db_callbacks( |
| 240 new MockIndexedDBDatabaseCallbacks()); | 244 new MockIndexedDBDatabaseCallbacks()); |
| 241 const int64 transaction_id = 1; | 245 const int64 transaction_id = 1; |
| 242 IndexedDBPendingConnection connection( | 246 IndexedDBPendingConnection connection( |
| 243 callbacks, | 247 callbacks, |
| 244 db_callbacks, | 248 db_callbacks, |
| 245 0, /* child_process_id */ | 249 0, /* child_process_id */ |
| 246 transaction_id, | 250 transaction_id, |
| 247 IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION); | 251 IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION); |
| 248 factory->Open(ASCIIToUTF16("db"), connection, origin, temp_directory.path()); | 252 factory->Open(ASCIIToUTF16("db"), |
| 253 connection, |
| 254 origin, |
| 255 temp_directory.path(), |
| 256 NULL /* task_runner */); |
| 249 | 257 |
| 250 EXPECT_TRUE(callbacks->connection()); | 258 EXPECT_TRUE(callbacks->connection()); |
| 251 | 259 |
| 252 EXPECT_TRUE(factory->IsBackingStoreOpen(origin)); | 260 EXPECT_TRUE(factory->IsBackingStoreOpen(origin)); |
| 253 EXPECT_FALSE(factory->IsBackingStorePendingClose(origin)); | 261 EXPECT_FALSE(factory->IsBackingStorePendingClose(origin)); |
| 254 | 262 |
| 255 callbacks->connection()->ForceClose(); | 263 callbacks->connection()->ForceClose(); |
| 256 | 264 |
| 257 EXPECT_FALSE(factory->IsBackingStoreOpen(origin)); | 265 EXPECT_FALSE(factory->IsBackingStoreOpen(origin)); |
| 258 EXPECT_FALSE(factory->IsBackingStorePendingClose(origin)); | 266 EXPECT_FALSE(factory->IsBackingStorePendingClose(origin)); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 269 scoped_refptr<MockIndexedDBCallbacks> callbacks(new MockIndexedDBCallbacks()); | 277 scoped_refptr<MockIndexedDBCallbacks> callbacks(new MockIndexedDBCallbacks()); |
| 270 scoped_refptr<MockIndexedDBDatabaseCallbacks> db_callbacks( | 278 scoped_refptr<MockIndexedDBDatabaseCallbacks> db_callbacks( |
| 271 new MockIndexedDBDatabaseCallbacks()); | 279 new MockIndexedDBDatabaseCallbacks()); |
| 272 const int64 transaction_id = 1; | 280 const int64 transaction_id = 1; |
| 273 IndexedDBPendingConnection connection( | 281 IndexedDBPendingConnection connection( |
| 274 callbacks, | 282 callbacks, |
| 275 db_callbacks, | 283 db_callbacks, |
| 276 0, /* child_process_id */ | 284 0, /* child_process_id */ |
| 277 transaction_id, | 285 transaction_id, |
| 278 IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION); | 286 IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION); |
| 279 factory->Open(ASCIIToUTF16("db"), connection, origin, temp_directory.path()); | 287 factory->Open(ASCIIToUTF16("db"), |
| 288 connection, |
| 289 origin, |
| 290 temp_directory.path(), |
| 291 NULL /* task_runner */); |
| 280 | 292 |
| 281 EXPECT_TRUE(callbacks->connection()); | 293 EXPECT_TRUE(callbacks->connection()); |
| 282 IndexedDBBackingStore* store = | 294 IndexedDBBackingStore* store = |
| 283 callbacks->connection()->database()->backing_store(); | 295 callbacks->connection()->database()->backing_store(); |
| 284 EXPECT_FALSE(store->HasOneRef()); // Factory and database. | 296 EXPECT_FALSE(store->HasOneRef()); // Factory and database. |
| 285 | 297 |
| 286 EXPECT_TRUE(factory->IsBackingStoreOpen(origin)); | 298 EXPECT_TRUE(factory->IsBackingStoreOpen(origin)); |
| 287 callbacks->connection()->Close(); | 299 callbacks->connection()->Close(); |
| 288 EXPECT_TRUE(store->HasOneRef()); // Factory. | 300 EXPECT_TRUE(store->HasOneRef()); // Factory. |
| 289 EXPECT_TRUE(factory->IsBackingStoreOpen(origin)); | 301 EXPECT_TRUE(factory->IsBackingStoreOpen(origin)); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 308 | 320 |
| 309 scoped_refptr<IndexedDBFactory> factory = new IndexedDBFactory(NULL); | 321 scoped_refptr<IndexedDBFactory> factory = new IndexedDBFactory(NULL); |
| 310 EXPECT_FALSE(factory->IsBackingStoreOpen(origin)); | 322 EXPECT_FALSE(factory->IsBackingStoreOpen(origin)); |
| 311 | 323 |
| 312 const bool expect_connection = false; | 324 const bool expect_connection = false; |
| 313 scoped_refptr<MockIndexedDBCallbacks> callbacks( | 325 scoped_refptr<MockIndexedDBCallbacks> callbacks( |
| 314 new MockIndexedDBCallbacks(expect_connection)); | 326 new MockIndexedDBCallbacks(expect_connection)); |
| 315 factory->DeleteDatabase(ASCIIToUTF16("db"), | 327 factory->DeleteDatabase(ASCIIToUTF16("db"), |
| 316 callbacks, | 328 callbacks, |
| 317 origin, | 329 origin, |
| 318 temp_directory.path()); | 330 temp_directory.path(), |
| 331 NULL /* task_runner */); |
| 319 | 332 |
| 320 EXPECT_TRUE(factory->IsBackingStoreOpen(origin)); | 333 EXPECT_TRUE(factory->IsBackingStoreOpen(origin)); |
| 321 EXPECT_TRUE(factory->IsBackingStorePendingClose(origin)); | 334 EXPECT_TRUE(factory->IsBackingStorePendingClose(origin)); |
| 322 | 335 |
| 323 // Now simulate shutdown, which should stop the timer. | 336 // Now simulate shutdown, which should stop the timer. |
| 324 factory->ContextDestroyed(); | 337 factory->ContextDestroyed(); |
| 325 | 338 |
| 326 EXPECT_FALSE(factory->IsBackingStoreOpen(origin)); | 339 EXPECT_FALSE(factory->IsBackingStoreOpen(origin)); |
| 327 EXPECT_FALSE(factory->IsBackingStorePendingClose(origin)); | 340 EXPECT_FALSE(factory->IsBackingStorePendingClose(origin)); |
| 328 } | 341 } |
| 329 | 342 |
| 330 TEST_F(IndexedDBFactoryTest, GetDatabaseNamesClosesBackingStore) { | 343 TEST_F(IndexedDBFactoryTest, GetDatabaseNamesClosesBackingStore) { |
| 331 GURL origin("http://localhost:81"); | 344 GURL origin("http://localhost:81"); |
| 332 | 345 |
| 333 base::ScopedTempDir temp_directory; | 346 base::ScopedTempDir temp_directory; |
| 334 ASSERT_TRUE(temp_directory.CreateUniqueTempDir()); | 347 ASSERT_TRUE(temp_directory.CreateUniqueTempDir()); |
| 335 | 348 |
| 336 scoped_refptr<IndexedDBFactory> factory = new IndexedDBFactory(NULL); | 349 scoped_refptr<IndexedDBFactory> factory = new IndexedDBFactory(NULL); |
| 337 EXPECT_FALSE(factory->IsBackingStoreOpen(origin)); | 350 EXPECT_FALSE(factory->IsBackingStoreOpen(origin)); |
| 338 | 351 |
| 339 const bool expect_connection = false; | 352 const bool expect_connection = false; |
| 340 scoped_refptr<MockIndexedDBCallbacks> callbacks( | 353 scoped_refptr<MockIndexedDBCallbacks> callbacks( |
| 341 new MockIndexedDBCallbacks(expect_connection)); | 354 new MockIndexedDBCallbacks(expect_connection)); |
| 342 factory->GetDatabaseNames(callbacks, | 355 factory->GetDatabaseNames( |
| 343 origin, | 356 callbacks, origin, temp_directory.path(), NULL /* task_runner */); |
| 344 temp_directory.path()); | |
| 345 | 357 |
| 346 EXPECT_TRUE(factory->IsBackingStoreOpen(origin)); | 358 EXPECT_TRUE(factory->IsBackingStoreOpen(origin)); |
| 347 EXPECT_TRUE(factory->IsBackingStorePendingClose(origin)); | 359 EXPECT_TRUE(factory->IsBackingStorePendingClose(origin)); |
| 348 | 360 |
| 349 // Now simulate shutdown, which should stop the timer. | 361 // Now simulate shutdown, which should stop the timer. |
| 350 factory->ContextDestroyed(); | 362 factory->ContextDestroyed(); |
| 351 | 363 |
| 352 EXPECT_FALSE(factory->IsBackingStoreOpen(origin)); | 364 EXPECT_FALSE(factory->IsBackingStoreOpen(origin)); |
| 353 EXPECT_FALSE(factory->IsBackingStorePendingClose(origin)); | 365 EXPECT_FALSE(factory->IsBackingStorePendingClose(origin)); |
| 354 } | 366 } |
| 355 | 367 |
| 356 TEST_F(IndexedDBFactoryTest, ForceCloseReleasesBackingStore) { | 368 TEST_F(IndexedDBFactoryTest, ForceCloseReleasesBackingStore) { |
| 357 GURL origin("http://localhost:81"); | 369 GURL origin("http://localhost:81"); |
| 358 | 370 |
| 359 base::ScopedTempDir temp_directory; | 371 base::ScopedTempDir temp_directory; |
| 360 ASSERT_TRUE(temp_directory.CreateUniqueTempDir()); | 372 ASSERT_TRUE(temp_directory.CreateUniqueTempDir()); |
| 361 | 373 |
| 362 scoped_refptr<IndexedDBFactory> factory = new IndexedDBFactory(NULL); | 374 scoped_refptr<IndexedDBFactory> factory = new IndexedDBFactory(NULL); |
| 363 | 375 |
| 364 scoped_refptr<MockIndexedDBCallbacks> callbacks(new MockIndexedDBCallbacks()); | 376 scoped_refptr<MockIndexedDBCallbacks> callbacks(new MockIndexedDBCallbacks()); |
| 365 scoped_refptr<MockIndexedDBDatabaseCallbacks> db_callbacks( | 377 scoped_refptr<MockIndexedDBDatabaseCallbacks> db_callbacks( |
| 366 new MockIndexedDBDatabaseCallbacks()); | 378 new MockIndexedDBDatabaseCallbacks()); |
| 367 const int64 transaction_id = 1; | 379 const int64 transaction_id = 1; |
| 368 IndexedDBPendingConnection connection( | 380 IndexedDBPendingConnection connection( |
| 369 callbacks, | 381 callbacks, |
| 370 db_callbacks, | 382 db_callbacks, |
| 371 0, /* child_process_id */ | 383 0, /* child_process_id */ |
| 372 transaction_id, | 384 transaction_id, |
| 373 IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION); | 385 IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION); |
| 374 factory->Open(ASCIIToUTF16("db"), connection, origin, temp_directory.path()); | 386 factory->Open(ASCIIToUTF16("db"), |
| 387 connection, |
| 388 origin, |
| 389 temp_directory.path(), |
| 390 NULL /* task_runner */); |
| 375 | 391 |
| 376 EXPECT_TRUE(callbacks->connection()); | 392 EXPECT_TRUE(callbacks->connection()); |
| 377 EXPECT_TRUE(factory->IsBackingStoreOpen(origin)); | 393 EXPECT_TRUE(factory->IsBackingStoreOpen(origin)); |
| 378 EXPECT_FALSE(factory->IsBackingStorePendingClose(origin)); | 394 EXPECT_FALSE(factory->IsBackingStorePendingClose(origin)); |
| 379 | 395 |
| 380 callbacks->connection()->Close(); | 396 callbacks->connection()->Close(); |
| 381 | 397 |
| 382 EXPECT_TRUE(factory->IsBackingStoreOpen(origin)); | 398 EXPECT_TRUE(factory->IsBackingStoreOpen(origin)); |
| 383 EXPECT_TRUE(factory->IsBackingStorePendingClose(origin)); | 399 EXPECT_TRUE(factory->IsBackingStorePendingClose(origin)); |
| 384 | 400 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 440 | 456 |
| 441 // Open at version 2, then close. | 457 // Open at version 2, then close. |
| 442 { | 458 { |
| 443 scoped_refptr<MockIndexedDBCallbacks> callbacks( | 459 scoped_refptr<MockIndexedDBCallbacks> callbacks( |
| 444 new UpgradeNeededCallbacks()); | 460 new UpgradeNeededCallbacks()); |
| 445 IndexedDBPendingConnection connection(callbacks, | 461 IndexedDBPendingConnection connection(callbacks, |
| 446 db_callbacks, | 462 db_callbacks, |
| 447 0, /* child_process_id */ | 463 0, /* child_process_id */ |
| 448 transaction_id, | 464 transaction_id, |
| 449 db_version); | 465 db_version); |
| 450 factory->Open(db_name, connection, origin, temp_directory.path()); | 466 factory->Open(db_name, |
| 467 connection, |
| 468 origin, |
| 469 temp_directory.path(), |
| 470 NULL /* task_runner */); |
| 451 EXPECT_TRUE(factory->IsDatabaseOpen(origin, db_name)); | 471 EXPECT_TRUE(factory->IsDatabaseOpen(origin, db_name)); |
| 452 | 472 |
| 453 // Pump the message loop so the upgrade transaction can run. | 473 // Pump the message loop so the upgrade transaction can run. |
| 454 base::MessageLoop::current()->RunUntilIdle(); | 474 base::MessageLoop::current()->RunUntilIdle(); |
| 455 EXPECT_TRUE(callbacks->connection()); | 475 EXPECT_TRUE(callbacks->connection()); |
| 456 callbacks->connection()->database()->Commit(transaction_id); | 476 callbacks->connection()->database()->Commit(transaction_id); |
| 457 | 477 |
| 458 callbacks->connection()->Close(); | 478 callbacks->connection()->Close(); |
| 459 EXPECT_FALSE(factory->IsDatabaseOpen(origin, db_name)); | 479 EXPECT_FALSE(factory->IsDatabaseOpen(origin, db_name)); |
| 460 } | 480 } |
| 461 | 481 |
| 462 // Open at version < 2, which will fail; ensure factory doesn't retain | 482 // Open at version < 2, which will fail; ensure factory doesn't retain |
| 463 // the database object. | 483 // the database object. |
| 464 { | 484 { |
| 465 scoped_refptr<IndexedDBCallbacks> callbacks(new ErrorCallbacks()); | 485 scoped_refptr<IndexedDBCallbacks> callbacks(new ErrorCallbacks()); |
| 466 IndexedDBPendingConnection connection(callbacks, | 486 IndexedDBPendingConnection connection(callbacks, |
| 467 db_callbacks, | 487 db_callbacks, |
| 468 0, /* child_process_id */ | 488 0, /* child_process_id */ |
| 469 transaction_id, | 489 transaction_id, |
| 470 db_version - 1); | 490 db_version - 1); |
| 471 factory->Open(db_name, connection, origin, temp_directory.path()); | 491 factory->Open(db_name, |
| 492 connection, |
| 493 origin, |
| 494 temp_directory.path(), |
| 495 NULL /* task_runner */); |
| 472 EXPECT_FALSE(factory->IsDatabaseOpen(origin, db_name)); | 496 EXPECT_FALSE(factory->IsDatabaseOpen(origin, db_name)); |
| 473 } | 497 } |
| 474 | 498 |
| 475 // Terminate all pending-close timers. | 499 // Terminate all pending-close timers. |
| 476 factory->ForceClose(origin); | 500 factory->ForceClose(origin); |
| 477 } | 501 } |
| 478 | 502 |
| 479 } // namespace content | 503 } // namespace content |
| OLD | NEW |