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 | 5 |
6 #include "webkit/browser/dom_storage/session_storage_database.h" | 6 #include "content/browser/dom_storage/session_storage_database.h" |
7 | 7 |
8 #include <algorithm> | 8 #include <algorithm> |
9 #include <map> | 9 #include <map> |
10 #include <string> | 10 #include <string> |
11 | 11 |
12 #include "base/file_util.h" | 12 #include "base/file_util.h" |
13 #include "base/files/scoped_temp_dir.h" | 13 #include "base/files/scoped_temp_dir.h" |
14 #include "base/logging.h" | 14 #include "base/logging.h" |
15 #include "base/strings/string_number_conversions.h" | 15 #include "base/strings/string_number_conversions.h" |
16 #include "base/strings/utf_string_conversions.h" | 16 #include "base/strings/utf_string_conversions.h" |
| 17 #include "content/common/dom_storage/dom_storage_types.h" |
17 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
18 #include "third_party/leveldatabase/src/include/leveldb/db.h" | 19 #include "third_party/leveldatabase/src/include/leveldb/db.h" |
19 #include "third_party/leveldatabase/src/include/leveldb/iterator.h" | 20 #include "third_party/leveldatabase/src/include/leveldb/iterator.h" |
20 #include "third_party/leveldatabase/src/include/leveldb/options.h" | 21 #include "third_party/leveldatabase/src/include/leveldb/options.h" |
21 #include "url/gurl.h" | 22 #include "url/gurl.h" |
22 #include "webkit/common/dom_storage/dom_storage_types.h" | |
23 | 23 |
24 namespace dom_storage { | 24 namespace content { |
25 | 25 |
26 class SessionStorageDatabaseTest : public testing::Test { | 26 class SessionStorageDatabaseTest : public testing::Test { |
27 public: | 27 public: |
28 SessionStorageDatabaseTest(); | 28 SessionStorageDatabaseTest(); |
29 virtual ~SessionStorageDatabaseTest(); | 29 virtual ~SessionStorageDatabaseTest(); |
30 virtual void SetUp() OVERRIDE; | 30 virtual void SetUp() OVERRIDE; |
31 | 31 |
32 protected: | 32 protected: |
33 typedef std::map<std::string, std::string> DataMap; | 33 typedef std::map<std::string, std::string> DataMap; |
34 | 34 |
35 // Helpers. | 35 // Helpers. |
36 static bool IsNamespaceKey(const std::string& key, | 36 static bool IsNamespaceKey(const std::string& key, |
37 std::string* namespace_id); | 37 std::string* namespace_id); |
38 static bool IsNamespaceOriginKey(const std::string& key, | 38 static bool IsNamespaceOriginKey(const std::string& key, |
39 std::string* namespace_id); | 39 std::string* namespace_id); |
40 static bool IsMapRefCountKey(const std::string& key, | 40 static bool IsMapRefCountKey(const std::string& key, |
41 int64* map_id); | 41 int64* map_id); |
42 static bool IsMapValueKey(const std::string& key, | 42 static bool IsMapValueKey(const std::string& key, |
43 int64* map_id); | 43 int64* map_id); |
44 void ResetDatabase(); | 44 void ResetDatabase(); |
45 void ReadData(DataMap* data) const; | 45 void ReadData(DataMap* data) const; |
46 void CheckDatabaseConsistency() const; | 46 void CheckDatabaseConsistency() const; |
47 void CheckEmptyDatabase() const; | 47 void CheckEmptyDatabase() const; |
48 void DumpData() const; | 48 void DumpData() const; |
49 void CheckAreaData(const std::string& namespace_id, | 49 void CheckAreaData(const std::string& namespace_id, |
50 const GURL& origin, | 50 const GURL& origin, |
51 const ValuesMap& reference) const; | 51 const DOMStorageValuesMap& reference) const; |
52 void CompareValuesMaps(const ValuesMap& map1, const ValuesMap& map2) const; | 52 void CompareValuesMaps(const DOMStorageValuesMap& map1, |
| 53 const DOMStorageValuesMap& map2) const; |
53 void CheckNamespaceIds( | 54 void CheckNamespaceIds( |
54 const std::set<std::string>& expected_namespace_ids) const; | 55 const std::set<std::string>& expected_namespace_ids) const; |
55 void CheckOrigins( | 56 void CheckOrigins( |
56 const std::string& namespace_id, | 57 const std::string& namespace_id, |
57 const std::set<GURL>& expected_origins) const; | 58 const std::set<GURL>& expected_origins) const; |
58 std::string GetMapForArea(const std::string& namespace_id, | 59 std::string GetMapForArea(const std::string& namespace_id, |
59 const GURL& origin) const; | 60 const GURL& origin) const; |
60 int64 GetMapRefCount(const std::string& map_id) const; | 61 int64 GetMapRefCount(const std::string& map_id) const; |
61 | 62 |
62 base::ScopedTempDir temp_dir_; | 63 base::ScopedTempDir temp_dir_; |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 LOG(WARNING) << it->key().ToString() << ": " << value; | 310 LOG(WARNING) << it->key().ToString() << ": " << value; |
310 } else { | 311 } else { |
311 LOG(WARNING) << it->key().ToString() << ": " << it->value().ToString(); | 312 LOG(WARNING) << it->key().ToString() << ": " << it->value().ToString(); |
312 } | 313 } |
313 } | 314 } |
314 LOG(WARNING) << "----"; | 315 LOG(WARNING) << "----"; |
315 } | 316 } |
316 | 317 |
317 void SessionStorageDatabaseTest::CheckAreaData( | 318 void SessionStorageDatabaseTest::CheckAreaData( |
318 const std::string& namespace_id, const GURL& origin, | 319 const std::string& namespace_id, const GURL& origin, |
319 const ValuesMap& reference) const { | 320 const DOMStorageValuesMap& reference) const { |
320 ValuesMap values; | 321 DOMStorageValuesMap values; |
321 db_->ReadAreaValues(namespace_id, origin, &values); | 322 db_->ReadAreaValues(namespace_id, origin, &values); |
322 CompareValuesMaps(values, reference); | 323 CompareValuesMaps(values, reference); |
323 } | 324 } |
324 | 325 |
325 void SessionStorageDatabaseTest::CompareValuesMaps( | 326 void SessionStorageDatabaseTest::CompareValuesMaps( |
326 const ValuesMap& map1, | 327 const DOMStorageValuesMap& map1, |
327 const ValuesMap& map2) const { | 328 const DOMStorageValuesMap& map2) const { |
328 ASSERT_EQ(map2.size(), map1.size()); | 329 ASSERT_EQ(map2.size(), map1.size()); |
329 for (ValuesMap::const_iterator it = map1.begin(); it != map1.end(); ++it) { | 330 for (DOMStorageValuesMap::const_iterator it = map1.begin(); |
| 331 it != map1.end(); ++it) { |
330 base::string16 key = it->first; | 332 base::string16 key = it->first; |
331 ASSERT_TRUE(map2.find(key) != map2.end()); | 333 ASSERT_TRUE(map2.find(key) != map2.end()); |
332 base::NullableString16 val1 = it->second; | 334 base::NullableString16 val1 = it->second; |
333 base::NullableString16 val2 = map2.find(key)->second; | 335 base::NullableString16 val2 = map2.find(key)->second; |
334 EXPECT_EQ(val2.is_null(), val1.is_null()); | 336 EXPECT_EQ(val2.is_null(), val1.is_null()); |
335 EXPECT_EQ(val2.string(), val1.string()); | 337 EXPECT_EQ(val2.string(), val1.string()); |
336 } | 338 } |
337 } | 339 } |
338 | 340 |
339 void SessionStorageDatabaseTest::CheckNamespaceIds( | 341 void SessionStorageDatabaseTest::CheckNamespaceIds( |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 return ref_count; | 381 return ref_count; |
380 } | 382 } |
381 | 383 |
382 TEST_F(SessionStorageDatabaseTest, EmptyDatabaseSanityCheck) { | 384 TEST_F(SessionStorageDatabaseTest, EmptyDatabaseSanityCheck) { |
383 // An empty database should be valid. | 385 // An empty database should be valid. |
384 CheckDatabaseConsistency(); | 386 CheckDatabaseConsistency(); |
385 } | 387 } |
386 | 388 |
387 TEST_F(SessionStorageDatabaseTest, WriteDataForOneOrigin) { | 389 TEST_F(SessionStorageDatabaseTest, WriteDataForOneOrigin) { |
388 // Keep track on what the values should look like. | 390 // Keep track on what the values should look like. |
389 ValuesMap reference; | 391 DOMStorageValuesMap reference; |
390 // Write data. | 392 // Write data. |
391 { | 393 { |
392 ValuesMap changes; | 394 DOMStorageValuesMap changes; |
393 changes[kKey1] = kValue1; | 395 changes[kKey1] = kValue1; |
394 changes[kKey2] = kValue2; | 396 changes[kKey2] = kValue2; |
395 changes[kKey3] = kValue3; | 397 changes[kKey3] = kValue3; |
396 reference[kKey1] = kValue1; | 398 reference[kKey1] = kValue1; |
397 reference[kKey2] = kValue2; | 399 reference[kKey2] = kValue2; |
398 reference[kKey3] = kValue3; | 400 reference[kKey3] = kValue3; |
399 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, changes)); | 401 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, changes)); |
400 } | 402 } |
401 CheckDatabaseConsistency(); | 403 CheckDatabaseConsistency(); |
402 CheckAreaData(kNamespace1, kOrigin1, reference); | 404 CheckAreaData(kNamespace1, kOrigin1, reference); |
403 | 405 |
404 // Overwrite and delete values. | 406 // Overwrite and delete values. |
405 { | 407 { |
406 ValuesMap changes; | 408 DOMStorageValuesMap changes; |
407 changes[kKey1] = kValue4; | 409 changes[kKey1] = kValue4; |
408 changes[kKey3] = kValueNull; | 410 changes[kKey3] = kValueNull; |
409 reference[kKey1] = kValue4; | 411 reference[kKey1] = kValue4; |
410 reference.erase(kKey3); | 412 reference.erase(kKey3); |
411 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, changes)); | 413 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, changes)); |
412 } | 414 } |
413 CheckDatabaseConsistency(); | 415 CheckDatabaseConsistency(); |
414 CheckAreaData(kNamespace1, kOrigin1, reference); | 416 CheckAreaData(kNamespace1, kOrigin1, reference); |
415 | 417 |
416 // Clear data before writing. | 418 // Clear data before writing. |
417 { | 419 { |
418 ValuesMap changes; | 420 DOMStorageValuesMap changes; |
419 changes[kKey2] = kValue2; | 421 changes[kKey2] = kValue2; |
420 reference.erase(kKey1); | 422 reference.erase(kKey1); |
421 reference[kKey2] = kValue2; | 423 reference[kKey2] = kValue2; |
422 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, true, changes)); | 424 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, true, changes)); |
423 } | 425 } |
424 CheckDatabaseConsistency(); | 426 CheckDatabaseConsistency(); |
425 CheckAreaData(kNamespace1, kOrigin1, reference); | 427 CheckAreaData(kNamespace1, kOrigin1, reference); |
426 } | 428 } |
427 | 429 |
428 TEST_F(SessionStorageDatabaseTest, WriteDataForTwoOrigins) { | 430 TEST_F(SessionStorageDatabaseTest, WriteDataForTwoOrigins) { |
429 // Write data. | 431 // Write data. |
430 ValuesMap data1; | 432 DOMStorageValuesMap data1; |
431 data1[kKey1] = kValue1; | 433 data1[kKey1] = kValue1; |
432 data1[kKey2] = kValue2; | 434 data1[kKey2] = kValue2; |
433 data1[kKey3] = kValue3; | 435 data1[kKey3] = kValue3; |
434 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1)); | 436 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1)); |
435 | 437 |
436 ValuesMap data2; | 438 DOMStorageValuesMap data2; |
437 data2[kKey1] = kValue4; | 439 data2[kKey1] = kValue4; |
438 data2[kKey2] = kValue1; | 440 data2[kKey2] = kValue1; |
439 data2[kKey3] = kValue2; | 441 data2[kKey3] = kValue2; |
440 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2)); | 442 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2)); |
441 | 443 |
442 CheckDatabaseConsistency(); | 444 CheckDatabaseConsistency(); |
443 CheckAreaData(kNamespace1, kOrigin1, data1); | 445 CheckAreaData(kNamespace1, kOrigin1, data1); |
444 CheckAreaData(kNamespace1, kOrigin2, data2); | 446 CheckAreaData(kNamespace1, kOrigin2, data2); |
445 } | 447 } |
446 | 448 |
447 TEST_F(SessionStorageDatabaseTest, WriteDataForTwoNamespaces) { | 449 TEST_F(SessionStorageDatabaseTest, WriteDataForTwoNamespaces) { |
448 // Write data. | 450 // Write data. |
449 ValuesMap data11; | 451 DOMStorageValuesMap data11; |
450 data11[kKey1] = kValue1; | 452 data11[kKey1] = kValue1; |
451 data11[kKey2] = kValue2; | 453 data11[kKey2] = kValue2; |
452 data11[kKey3] = kValue3; | 454 data11[kKey3] = kValue3; |
453 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data11)); | 455 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data11)); |
454 ValuesMap data12; | 456 DOMStorageValuesMap data12; |
455 data12[kKey2] = kValue4; | 457 data12[kKey2] = kValue4; |
456 data12[kKey3] = kValue3; | 458 data12[kKey3] = kValue3; |
457 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data12)); | 459 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data12)); |
458 ValuesMap data21; | 460 DOMStorageValuesMap data21; |
459 data21[kKey1] = kValue2; | 461 data21[kKey1] = kValue2; |
460 data21[kKey2] = kValue4; | 462 data21[kKey2] = kValue4; |
461 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace2, kOrigin1, false, data21)); | 463 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace2, kOrigin1, false, data21)); |
462 ValuesMap data22; | 464 DOMStorageValuesMap data22; |
463 data22[kKey2] = kValue1; | 465 data22[kKey2] = kValue1; |
464 data22[kKey3] = kValue2; | 466 data22[kKey3] = kValue2; |
465 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace2, kOrigin2, false, data22)); | 467 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace2, kOrigin2, false, data22)); |
466 CheckDatabaseConsistency(); | 468 CheckDatabaseConsistency(); |
467 CheckAreaData(kNamespace1, kOrigin1, data11); | 469 CheckAreaData(kNamespace1, kOrigin1, data11); |
468 CheckAreaData(kNamespace1, kOrigin2, data12); | 470 CheckAreaData(kNamespace1, kOrigin2, data12); |
469 CheckAreaData(kNamespace2, kOrigin1, data21); | 471 CheckAreaData(kNamespace2, kOrigin1, data21); |
470 CheckAreaData(kNamespace2, kOrigin2, data22); | 472 CheckAreaData(kNamespace2, kOrigin2, data22); |
471 } | 473 } |
472 | 474 |
473 TEST_F(SessionStorageDatabaseTest, ShallowCopy) { | 475 TEST_F(SessionStorageDatabaseTest, ShallowCopy) { |
474 // Write data for a namespace, for 2 origins. | 476 // Write data for a namespace, for 2 origins. |
475 ValuesMap data1; | 477 DOMStorageValuesMap data1; |
476 data1[kKey1] = kValue1; | 478 data1[kKey1] = kValue1; |
477 data1[kKey2] = kValue2; | 479 data1[kKey2] = kValue2; |
478 data1[kKey3] = kValue3; | 480 data1[kKey3] = kValue3; |
479 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1)); | 481 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1)); |
480 ValuesMap data2; | 482 DOMStorageValuesMap data2; |
481 data2[kKey1] = kValue2; | 483 data2[kKey1] = kValue2; |
482 data2[kKey3] = kValue1; | 484 data2[kKey3] = kValue1; |
483 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2)); | 485 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2)); |
484 // Make a shallow copy. | 486 // Make a shallow copy. |
485 EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone)); | 487 EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone)); |
486 // Now both namespaces should have the same data. | 488 // Now both namespaces should have the same data. |
487 CheckDatabaseConsistency(); | 489 CheckDatabaseConsistency(); |
488 CheckAreaData(kNamespace1, kOrigin1, data1); | 490 CheckAreaData(kNamespace1, kOrigin1, data1); |
489 CheckAreaData(kNamespace1, kOrigin2, data2); | 491 CheckAreaData(kNamespace1, kOrigin2, data2); |
490 CheckAreaData(kNamespaceClone, kOrigin1, data1); | 492 CheckAreaData(kNamespaceClone, kOrigin1, data1); |
491 CheckAreaData(kNamespaceClone, kOrigin2, data2); | 493 CheckAreaData(kNamespaceClone, kOrigin2, data2); |
492 // Both the namespaces refer to the same maps. | 494 // Both the namespaces refer to the same maps. |
493 EXPECT_EQ(GetMapForArea(kNamespace1, kOrigin1), | 495 EXPECT_EQ(GetMapForArea(kNamespace1, kOrigin1), |
494 GetMapForArea(kNamespaceClone, kOrigin1)); | 496 GetMapForArea(kNamespaceClone, kOrigin1)); |
495 EXPECT_EQ(GetMapForArea(kNamespace1, kOrigin2), | 497 EXPECT_EQ(GetMapForArea(kNamespace1, kOrigin2), |
496 GetMapForArea(kNamespaceClone, kOrigin2)); | 498 GetMapForArea(kNamespaceClone, kOrigin2)); |
497 EXPECT_EQ(2, GetMapRefCount(GetMapForArea(kNamespace1, kOrigin1))); | 499 EXPECT_EQ(2, GetMapRefCount(GetMapForArea(kNamespace1, kOrigin1))); |
498 EXPECT_EQ(2, GetMapRefCount(GetMapForArea(kNamespace1, kOrigin2))); | 500 EXPECT_EQ(2, GetMapRefCount(GetMapForArea(kNamespace1, kOrigin2))); |
499 } | 501 } |
500 | 502 |
501 TEST_F(SessionStorageDatabaseTest, WriteIntoShallowCopy) { | 503 TEST_F(SessionStorageDatabaseTest, WriteIntoShallowCopy) { |
502 ValuesMap data1; | 504 DOMStorageValuesMap data1; |
503 data1[kKey1] = kValue1; | 505 data1[kKey1] = kValue1; |
504 data1[kKey2] = kValue2; | 506 data1[kKey2] = kValue2; |
505 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1)); | 507 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1)); |
506 EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone)); | 508 EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone)); |
507 | 509 |
508 // Write data into a shallow copy. | 510 // Write data into a shallow copy. |
509 ValuesMap changes; | 511 DOMStorageValuesMap changes; |
510 ValuesMap reference; | 512 DOMStorageValuesMap reference; |
511 changes[kKey1] = kValueNull; | 513 changes[kKey1] = kValueNull; |
512 changes[kKey2] = kValue4; | 514 changes[kKey2] = kValue4; |
513 changes[kKey3] = kValue4; | 515 changes[kKey3] = kValue4; |
514 reference[kKey2] = kValue4; | 516 reference[kKey2] = kValue4; |
515 reference[kKey3] = kValue4; | 517 reference[kKey3] = kValue4; |
516 EXPECT_TRUE(db_->CommitAreaChanges(kNamespaceClone, kOrigin1, false, | 518 EXPECT_TRUE(db_->CommitAreaChanges(kNamespaceClone, kOrigin1, false, |
517 changes)); | 519 changes)); |
518 | 520 |
519 // Values in the original namespace were not changed. | 521 // Values in the original namespace were not changed. |
520 CheckAreaData(kNamespace1, kOrigin1, data1); | 522 CheckAreaData(kNamespace1, kOrigin1, data1); |
521 // But values in the copy were. | 523 // But values in the copy were. |
522 CheckAreaData(kNamespaceClone, kOrigin1, reference); | 524 CheckAreaData(kNamespaceClone, kOrigin1, reference); |
523 | 525 |
524 // The namespaces no longer refer to the same map. | 526 // The namespaces no longer refer to the same map. |
525 EXPECT_NE(GetMapForArea(kNamespace1, kOrigin1), | 527 EXPECT_NE(GetMapForArea(kNamespace1, kOrigin1), |
526 GetMapForArea(kNamespaceClone, kOrigin1)); | 528 GetMapForArea(kNamespaceClone, kOrigin1)); |
527 EXPECT_EQ(1, GetMapRefCount(GetMapForArea(kNamespace1, kOrigin1))); | 529 EXPECT_EQ(1, GetMapRefCount(GetMapForArea(kNamespace1, kOrigin1))); |
528 EXPECT_EQ(1, GetMapRefCount(GetMapForArea(kNamespaceClone, kOrigin1))); | 530 EXPECT_EQ(1, GetMapRefCount(GetMapForArea(kNamespaceClone, kOrigin1))); |
529 } | 531 } |
530 | 532 |
531 TEST_F(SessionStorageDatabaseTest, ManyShallowCopies) { | 533 TEST_F(SessionStorageDatabaseTest, ManyShallowCopies) { |
532 // Write data for a namespace, for 2 origins. | 534 // Write data for a namespace, for 2 origins. |
533 ValuesMap data1; | 535 DOMStorageValuesMap data1; |
534 data1[kKey1] = kValue1; | 536 data1[kKey1] = kValue1; |
535 data1[kKey2] = kValue2; | 537 data1[kKey2] = kValue2; |
536 data1[kKey3] = kValue3; | 538 data1[kKey3] = kValue3; |
537 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1)); | 539 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1)); |
538 ValuesMap data2; | 540 DOMStorageValuesMap data2; |
539 data2[kKey1] = kValue2; | 541 data2[kKey1] = kValue2; |
540 data2[kKey3] = kValue1; | 542 data2[kKey3] = kValue1; |
541 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2)); | 543 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2)); |
542 | 544 |
543 // Make a two shallow copies. | 545 // Make a two shallow copies. |
544 EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone)); | 546 EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone)); |
545 std::string another_clone("another_cloned"); | 547 std::string another_clone("another_cloned"); |
546 EXPECT_TRUE(db_->CloneNamespace(kNamespace1, another_clone)); | 548 EXPECT_TRUE(db_->CloneNamespace(kNamespace1, another_clone)); |
547 | 549 |
548 // Make a shallow copy of a shallow copy. | 550 // Make a shallow copy of a shallow copy. |
(...skipping 24 matching lines...) Expand all Loading... |
573 GetMapForArea(clone_of_clone, kOrigin1)); | 575 GetMapForArea(clone_of_clone, kOrigin1)); |
574 EXPECT_EQ(GetMapForArea(kNamespace1, kOrigin2), | 576 EXPECT_EQ(GetMapForArea(kNamespace1, kOrigin2), |
575 GetMapForArea(clone_of_clone, kOrigin2)); | 577 GetMapForArea(clone_of_clone, kOrigin2)); |
576 | 578 |
577 // Check the ref counts. | 579 // Check the ref counts. |
578 EXPECT_EQ(4, GetMapRefCount(GetMapForArea(kNamespace1, kOrigin1))); | 580 EXPECT_EQ(4, GetMapRefCount(GetMapForArea(kNamespace1, kOrigin1))); |
579 EXPECT_EQ(4, GetMapRefCount(GetMapForArea(kNamespace1, kOrigin2))); | 581 EXPECT_EQ(4, GetMapRefCount(GetMapForArea(kNamespace1, kOrigin2))); |
580 } | 582 } |
581 | 583 |
582 TEST_F(SessionStorageDatabaseTest, DisassociateShallowCopy) { | 584 TEST_F(SessionStorageDatabaseTest, DisassociateShallowCopy) { |
583 ValuesMap data1; | 585 DOMStorageValuesMap data1; |
584 data1[kKey1] = kValue1; | 586 data1[kKey1] = kValue1; |
585 data1[kKey2] = kValue2; | 587 data1[kKey2] = kValue2; |
586 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1)); | 588 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1)); |
587 EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone)); | 589 EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone)); |
588 | 590 |
589 // Disassoaciate the shallow copy. | 591 // Disassoaciate the shallow copy. |
590 EXPECT_TRUE(db_->DeleteArea(kNamespaceClone, kOrigin1)); | 592 EXPECT_TRUE(db_->DeleteArea(kNamespaceClone, kOrigin1)); |
591 CheckDatabaseConsistency(); | 593 CheckDatabaseConsistency(); |
592 | 594 |
593 // Now new data can be written to that map. | 595 // Now new data can be written to that map. |
594 ValuesMap reference; | 596 DOMStorageValuesMap reference; |
595 ValuesMap changes; | 597 DOMStorageValuesMap changes; |
596 changes[kKey1] = kValueNull; | 598 changes[kKey1] = kValueNull; |
597 changes[kKey2] = kValue4; | 599 changes[kKey2] = kValue4; |
598 changes[kKey3] = kValue4; | 600 changes[kKey3] = kValue4; |
599 reference[kKey2] = kValue4; | 601 reference[kKey2] = kValue4; |
600 reference[kKey3] = kValue4; | 602 reference[kKey3] = kValue4; |
601 EXPECT_TRUE(db_->CommitAreaChanges(kNamespaceClone, kOrigin1, false, | 603 EXPECT_TRUE(db_->CommitAreaChanges(kNamespaceClone, kOrigin1, false, |
602 changes)); | 604 changes)); |
603 | 605 |
604 // Values in the original map were not changed. | 606 // Values in the original map were not changed. |
605 CheckAreaData(kNamespace1, kOrigin1, data1); | 607 CheckAreaData(kNamespace1, kOrigin1, data1); |
606 | 608 |
607 // But values in the disassociated map were. | 609 // But values in the disassociated map were. |
608 CheckAreaData(kNamespaceClone, kOrigin1, reference); | 610 CheckAreaData(kNamespaceClone, kOrigin1, reference); |
609 } | 611 } |
610 | 612 |
611 TEST_F(SessionStorageDatabaseTest, DeleteNamespace) { | 613 TEST_F(SessionStorageDatabaseTest, DeleteNamespace) { |
612 ValuesMap data1; | 614 DOMStorageValuesMap data1; |
613 data1[kKey1] = kValue1; | 615 data1[kKey1] = kValue1; |
614 data1[kKey2] = kValue2; | 616 data1[kKey2] = kValue2; |
615 data1[kKey3] = kValue3; | 617 data1[kKey3] = kValue3; |
616 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1)); | 618 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1)); |
617 ValuesMap data2; | 619 DOMStorageValuesMap data2; |
618 data2[kKey2] = kValue4; | 620 data2[kKey2] = kValue4; |
619 data2[kKey3] = kValue3; | 621 data2[kKey3] = kValue3; |
620 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2)); | 622 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2)); |
621 EXPECT_TRUE(db_->DeleteNamespace(kNamespace1)); | 623 EXPECT_TRUE(db_->DeleteNamespace(kNamespace1)); |
622 CheckDatabaseConsistency(); | 624 CheckDatabaseConsistency(); |
623 CheckEmptyDatabase(); | 625 CheckEmptyDatabase(); |
624 } | 626 } |
625 | 627 |
626 TEST_F(SessionStorageDatabaseTest, DeleteNamespaceWithShallowCopy) { | 628 TEST_F(SessionStorageDatabaseTest, DeleteNamespaceWithShallowCopy) { |
627 // Write data for a namespace, for 2 origins. | 629 // Write data for a namespace, for 2 origins. |
628 ValuesMap data1; | 630 DOMStorageValuesMap data1; |
629 data1[kKey1] = kValue1; | 631 data1[kKey1] = kValue1; |
630 data1[kKey2] = kValue2; | 632 data1[kKey2] = kValue2; |
631 data1[kKey3] = kValue3; | 633 data1[kKey3] = kValue3; |
632 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1)); | 634 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1)); |
633 ValuesMap data2; | 635 DOMStorageValuesMap data2; |
634 data2[kKey1] = kValue2; | 636 data2[kKey1] = kValue2; |
635 data2[kKey3] = kValue1; | 637 data2[kKey3] = kValue1; |
636 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2)); | 638 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2)); |
637 | 639 |
638 // Make a shallow copy and delete the original namespace. | 640 // Make a shallow copy and delete the original namespace. |
639 EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone)); | 641 EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone)); |
640 EXPECT_TRUE(db_->DeleteNamespace(kNamespace1)); | 642 EXPECT_TRUE(db_->DeleteNamespace(kNamespace1)); |
641 | 643 |
642 // The original namespace has no data. | 644 // The original namespace has no data. |
643 CheckDatabaseConsistency(); | 645 CheckDatabaseConsistency(); |
644 CheckAreaData(kNamespace1, kOrigin1, ValuesMap()); | 646 CheckAreaData(kNamespace1, kOrigin1, DOMStorageValuesMap()); |
645 CheckAreaData(kNamespace1, kOrigin2, ValuesMap()); | 647 CheckAreaData(kNamespace1, kOrigin2, DOMStorageValuesMap()); |
646 // But the copy persists. | 648 // But the copy persists. |
647 CheckAreaData(kNamespaceClone, kOrigin1, data1); | 649 CheckAreaData(kNamespaceClone, kOrigin1, data1); |
648 CheckAreaData(kNamespaceClone, kOrigin2, data2); | 650 CheckAreaData(kNamespaceClone, kOrigin2, data2); |
649 } | 651 } |
650 | 652 |
651 TEST_F(SessionStorageDatabaseTest, DeleteArea) { | 653 TEST_F(SessionStorageDatabaseTest, DeleteArea) { |
652 // Write data for a namespace, for 2 origins. | 654 // Write data for a namespace, for 2 origins. |
653 ValuesMap data1; | 655 DOMStorageValuesMap data1; |
654 data1[kKey1] = kValue1; | 656 data1[kKey1] = kValue1; |
655 data1[kKey2] = kValue2; | 657 data1[kKey2] = kValue2; |
656 data1[kKey3] = kValue3; | 658 data1[kKey3] = kValue3; |
657 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1)); | 659 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1)); |
658 ValuesMap data2; | 660 DOMStorageValuesMap data2; |
659 data2[kKey1] = kValue2; | 661 data2[kKey1] = kValue2; |
660 data2[kKey3] = kValue1; | 662 data2[kKey3] = kValue1; |
661 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2)); | 663 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2)); |
662 | 664 |
663 EXPECT_TRUE(db_->DeleteArea(kNamespace1, kOrigin2)); | 665 EXPECT_TRUE(db_->DeleteArea(kNamespace1, kOrigin2)); |
664 CheckDatabaseConsistency(); | 666 CheckDatabaseConsistency(); |
665 // The data for the non-deleted origin persists. | 667 // The data for the non-deleted origin persists. |
666 CheckAreaData(kNamespace1, kOrigin1, data1); | 668 CheckAreaData(kNamespace1, kOrigin1, data1); |
667 // The data for the deleted origin is gone. | 669 // The data for the deleted origin is gone. |
668 CheckAreaData(kNamespace1, kOrigin2, ValuesMap()); | 670 CheckAreaData(kNamespace1, kOrigin2, DOMStorageValuesMap()); |
669 } | 671 } |
670 | 672 |
671 TEST_F(SessionStorageDatabaseTest, DeleteAreaWithShallowCopy) { | 673 TEST_F(SessionStorageDatabaseTest, DeleteAreaWithShallowCopy) { |
672 // Write data for a namespace, for 2 origins. | 674 // Write data for a namespace, for 2 origins. |
673 ValuesMap data1; | 675 DOMStorageValuesMap data1; |
674 data1[kKey1] = kValue1; | 676 data1[kKey1] = kValue1; |
675 data1[kKey2] = kValue2; | 677 data1[kKey2] = kValue2; |
676 data1[kKey3] = kValue3; | 678 data1[kKey3] = kValue3; |
677 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1)); | 679 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1)); |
678 ValuesMap data2; | 680 DOMStorageValuesMap data2; |
679 data2[kKey1] = kValue2; | 681 data2[kKey1] = kValue2; |
680 data2[kKey3] = kValue1; | 682 data2[kKey3] = kValue1; |
681 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2)); | 683 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2)); |
682 | 684 |
683 // Make a shallow copy and delete an origin from the original namespace. | 685 // Make a shallow copy and delete an origin from the original namespace. |
684 EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone)); | 686 EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone)); |
685 EXPECT_TRUE(db_->DeleteArea(kNamespace1, kOrigin1)); | 687 EXPECT_TRUE(db_->DeleteArea(kNamespace1, kOrigin1)); |
686 CheckDatabaseConsistency(); | 688 CheckDatabaseConsistency(); |
687 | 689 |
688 // The original namespace has data for only the non-deleted origin. | 690 // The original namespace has data for only the non-deleted origin. |
689 CheckAreaData(kNamespace1, kOrigin1, ValuesMap()); | 691 CheckAreaData(kNamespace1, kOrigin1, DOMStorageValuesMap()); |
690 CheckAreaData(kNamespace1, kOrigin2, data2); | 692 CheckAreaData(kNamespace1, kOrigin2, data2); |
691 // But the copy persists. | 693 // But the copy persists. |
692 CheckAreaData(kNamespaceClone, kOrigin1, data1); | 694 CheckAreaData(kNamespaceClone, kOrigin1, data1); |
693 CheckAreaData(kNamespaceClone, kOrigin2, data2); | 695 CheckAreaData(kNamespaceClone, kOrigin2, data2); |
694 } | 696 } |
695 | 697 |
696 TEST_F(SessionStorageDatabaseTest, WriteRawBytes) { | 698 TEST_F(SessionStorageDatabaseTest, WriteRawBytes) { |
697 // Write data which is not valid utf8 and contains null bytes. | 699 // Write data which is not valid utf8 and contains null bytes. |
698 unsigned char raw_data[10] = {255, 0, 0, 0, 1, 2, 3, 4, 5, 0}; | 700 unsigned char raw_data[10] = {255, 0, 0, 0, 1, 2, 3, 4, 5, 0}; |
699 ValuesMap changes; | 701 DOMStorageValuesMap changes; |
700 base::string16 string_with_raw_data; | 702 base::string16 string_with_raw_data; |
701 string_with_raw_data.assign(reinterpret_cast<char16*>(raw_data), 5); | 703 string_with_raw_data.assign(reinterpret_cast<char16*>(raw_data), 5); |
702 changes[kKey1] = base::NullableString16(string_with_raw_data, false); | 704 changes[kKey1] = base::NullableString16(string_with_raw_data, false); |
703 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, changes)); | 705 EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, changes)); |
704 CheckDatabaseConsistency(); | 706 CheckDatabaseConsistency(); |
705 ValuesMap values; | 707 DOMStorageValuesMap values; |
706 db_->ReadAreaValues(kNamespace1, kOrigin1, &values); | 708 db_->ReadAreaValues(kNamespace1, kOrigin1, &values); |
707 const unsigned char* data = | 709 const unsigned char* data = |
708 reinterpret_cast<const unsigned char*>(values[kKey1].string().data()); | 710 reinterpret_cast<const unsigned char*>(values[kKey1].string().data()); |
709 for (int i = 0; i < 10; ++i) | 711 for (int i = 0; i < 10; ++i) |
710 EXPECT_EQ(raw_data[i], data[i]); | 712 EXPECT_EQ(raw_data[i], data[i]); |
711 } | 713 } |
712 | 714 |
713 TEST_F(SessionStorageDatabaseTest, DeleteNamespaceConfusion) { | 715 TEST_F(SessionStorageDatabaseTest, DeleteNamespaceConfusion) { |
714 // Regression test for a bug where a namespace with id 10 prevented deleting | 716 // Regression test for a bug where a namespace with id 10 prevented deleting |
715 // the namespace with id 1. | 717 // the namespace with id 1. |
716 | 718 |
717 ValuesMap data1; | 719 DOMStorageValuesMap data1; |
718 data1[kKey1] = kValue1; | 720 data1[kKey1] = kValue1; |
719 ASSERT_TRUE(db_->CommitAreaChanges("foobar", kOrigin1, false, data1)); | 721 ASSERT_TRUE(db_->CommitAreaChanges("foobar", kOrigin1, false, data1)); |
720 ASSERT_TRUE(db_->CommitAreaChanges("foobarbaz", kOrigin1, false, data1)); | 722 ASSERT_TRUE(db_->CommitAreaChanges("foobarbaz", kOrigin1, false, data1)); |
721 | 723 |
722 // Delete the namespace with ID 1. | 724 // Delete the namespace with ID 1. |
723 EXPECT_TRUE(db_->DeleteNamespace("foobar")); | 725 EXPECT_TRUE(db_->DeleteNamespace("foobar")); |
724 } | 726 } |
725 | 727 |
726 TEST_F(SessionStorageDatabaseTest, ReadNamespaceIds) { | 728 TEST_F(SessionStorageDatabaseTest, ReadNamespaceIds) { |
727 ValuesMap data1; | 729 DOMStorageValuesMap data1; |
728 data1[kKey1] = kValue1; | 730 data1[kKey1] = kValue1; |
729 data1[kKey2] = kValue2; | 731 data1[kKey2] = kValue2; |
730 data1[kKey3] = kValue3; | 732 data1[kKey3] = kValue3; |
731 std::set<std::string> expected_namespace_ids; | 733 std::set<std::string> expected_namespace_ids; |
732 | 734 |
733 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1)); | 735 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1)); |
734 expected_namespace_ids.insert(kNamespace1); | 736 expected_namespace_ids.insert(kNamespace1); |
735 CheckNamespaceIds(expected_namespace_ids); | 737 CheckNamespaceIds(expected_namespace_ids); |
736 | 738 |
737 ASSERT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone)); | 739 ASSERT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone)); |
738 expected_namespace_ids.insert(kNamespaceClone); | 740 expected_namespace_ids.insert(kNamespaceClone); |
739 CheckNamespaceIds(expected_namespace_ids); | 741 CheckNamespaceIds(expected_namespace_ids); |
740 | 742 |
741 ASSERT_TRUE(db_->DeleteNamespace(kNamespace1)); | 743 ASSERT_TRUE(db_->DeleteNamespace(kNamespace1)); |
742 expected_namespace_ids.erase(kNamespace1); | 744 expected_namespace_ids.erase(kNamespace1); |
743 CheckNamespaceIds(expected_namespace_ids); | 745 CheckNamespaceIds(expected_namespace_ids); |
744 | 746 |
745 CheckDatabaseConsistency(); | 747 CheckDatabaseConsistency(); |
746 } | 748 } |
747 | 749 |
748 TEST_F(SessionStorageDatabaseTest, ReadNamespaceIdsInEmptyDatabase) { | 750 TEST_F(SessionStorageDatabaseTest, ReadNamespaceIdsInEmptyDatabase) { |
749 std::set<std::string> expected_namespace_ids; | 751 std::set<std::string> expected_namespace_ids; |
750 CheckNamespaceIds(expected_namespace_ids); | 752 CheckNamespaceIds(expected_namespace_ids); |
751 } | 753 } |
752 | 754 |
753 TEST_F(SessionStorageDatabaseTest, ReadOriginsInNamespace) { | 755 TEST_F(SessionStorageDatabaseTest, ReadOriginsInNamespace) { |
754 ValuesMap data1; | 756 DOMStorageValuesMap data1; |
755 data1[kKey1] = kValue1; | 757 data1[kKey1] = kValue1; |
756 data1[kKey2] = kValue2; | 758 data1[kKey2] = kValue2; |
757 data1[kKey3] = kValue3; | 759 data1[kKey3] = kValue3; |
758 | 760 |
759 std::set<GURL> expected_origins1; | 761 std::set<GURL> expected_origins1; |
760 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1)); | 762 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1)); |
761 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data1)); | 763 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data1)); |
762 expected_origins1.insert(kOrigin1); | 764 expected_origins1.insert(kOrigin1); |
763 expected_origins1.insert(kOrigin2); | 765 expected_origins1.insert(kOrigin2); |
764 CheckOrigins(kNamespace1, expected_origins1); | 766 CheckOrigins(kNamespace1, expected_origins1); |
765 | 767 |
766 std::set<GURL> expected_origins2; | 768 std::set<GURL> expected_origins2; |
767 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace2, kOrigin2, false, data1)); | 769 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace2, kOrigin2, false, data1)); |
768 expected_origins2.insert(kOrigin2); | 770 expected_origins2.insert(kOrigin2); |
769 CheckOrigins(kNamespace2, expected_origins2); | 771 CheckOrigins(kNamespace2, expected_origins2); |
770 | 772 |
771 ASSERT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone)); | 773 ASSERT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone)); |
772 CheckOrigins(kNamespaceClone, expected_origins1); | 774 CheckOrigins(kNamespaceClone, expected_origins1); |
773 | 775 |
774 ASSERT_TRUE(db_->DeleteArea(kNamespace1, kOrigin2)); | 776 ASSERT_TRUE(db_->DeleteArea(kNamespace1, kOrigin2)); |
775 expected_origins1.erase(kOrigin2); | 777 expected_origins1.erase(kOrigin2); |
776 CheckOrigins(kNamespace1, expected_origins1); | 778 CheckOrigins(kNamespace1, expected_origins1); |
777 | 779 |
778 CheckDatabaseConsistency(); | 780 CheckDatabaseConsistency(); |
779 } | 781 } |
780 | 782 |
781 TEST_F(SessionStorageDatabaseTest, DeleteAllOrigins) { | 783 TEST_F(SessionStorageDatabaseTest, DeleteAllOrigins) { |
782 // Write data for a namespace, for 2 origins. | 784 // Write data for a namespace, for 2 origins. |
783 ValuesMap data1; | 785 DOMStorageValuesMap data1; |
784 data1[kKey1] = kValue1; | 786 data1[kKey1] = kValue1; |
785 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1)); | 787 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1)); |
786 ValuesMap data2; | 788 DOMStorageValuesMap data2; |
787 data2[kKey1] = kValue2; | 789 data2[kKey1] = kValue2; |
788 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2)); | 790 ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2)); |
789 | 791 |
790 EXPECT_TRUE(db_->DeleteArea(kNamespace1, kOrigin1)); | 792 EXPECT_TRUE(db_->DeleteArea(kNamespace1, kOrigin1)); |
791 EXPECT_TRUE(db_->DeleteArea(kNamespace1, kOrigin2)); | 793 EXPECT_TRUE(db_->DeleteArea(kNamespace1, kOrigin2)); |
792 // Check that also the namespace start key was deleted. | 794 // Check that also the namespace start key was deleted. |
793 CheckDatabaseConsistency(); | 795 CheckDatabaseConsistency(); |
794 } | 796 } |
795 | 797 |
796 | 798 |
797 } // namespace dom_storage | 799 } // namespace content |
OLD | NEW |