Index: content/browser/in_process_webkit/indexed_db_unittest.cc |
diff --git a/content/browser/in_process_webkit/indexed_db_unittest.cc b/content/browser/in_process_webkit/indexed_db_unittest.cc |
index 23a469442d9a4179aaa7dc2d25f1323eed01e11f..05d74c54f7ea06e33fe8f5bfee8efc82e71b5f68 100644 |
--- a/content/browser/in_process_webkit/indexed_db_unittest.cc |
+++ b/content/browser/in_process_webkit/indexed_db_unittest.cc |
@@ -9,8 +9,10 @@ |
#include "content/public/common/url_constants.h" |
#include "content/public/test/test_browser_context.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebIDBDatabase.h" |
#include "webkit/database/database_util.h" |
#include "webkit/quota/mock_special_storage_policy.h" |
+#include "webkit/quota/quota_manager.h" |
#include "webkit/quota/special_storage_policy.h" |
using content::BrowserContext; |
@@ -126,3 +128,71 @@ TEST_F(IndexedDBTest, SetForceKeepSessionState) { |
EXPECT_TRUE(file_util::DirectoryExists(normal_path)); |
EXPECT_TRUE(file_util::DirectoryExists(session_only_path)); |
} |
+ |
+class MockWebIDBDatabase : public WebKit::WebIDBDatabase |
+{ |
+ public: |
+ MockWebIDBDatabase(bool expect_force_close) |
+ : expect_force_close_(expect_force_close), |
+ force_close_called_(false) {} |
+ |
+ ~MockWebIDBDatabase() |
+ { |
+ EXPECT_TRUE(force_close_called_ == expect_force_close_); |
+ } |
+ |
+ virtual void forceClose() |
+ { |
+ ASSERT_TRUE(expect_force_close_); |
+ force_close_called_ = true; |
+ } |
+ |
+ private: |
+ bool expect_force_close_; |
+ bool force_close_called_; |
+}; |
+ |
+ |
+TEST_F(IndexedDBTest, ForceCloseOpenDatabasesOnDelete) { |
+ ScopedTempDir temp_dir; |
+ ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
+ |
+ FilePath test_path; |
+ |
+ // Create the scope which will ensure we run the destructor of the webkit |
+ // context. |
+ { |
+ content::TestBrowserContext browser_context; |
+ |
+ const GURL kTestOrigin("http://test/"); |
+ |
+ IndexedDBContextImpl* idb_context = |
+ static_cast<IndexedDBContextImpl*>( |
+ BrowserContext::GetIndexedDBContext(&browser_context)); |
+ |
+ idb_context->quota_manager_proxy_ = NULL; |
+ idb_context->set_data_path_for_testing(temp_dir.path()); |
+ |
+ test_path = idb_context->GetFilePathForTesting( |
+ DatabaseUtil::GetOriginIdentifier(kTestOrigin)); |
+ ASSERT_TRUE(file_util::CreateDirectory(test_path)); |
+ |
+ const bool kExpectForceClose = true; |
+ |
+ MockWebIDBDatabase connection1(kExpectForceClose); |
+ idb_context->ConnectionOpened(kTestOrigin, &connection1); |
+ |
+ MockWebIDBDatabase connection2(!kExpectForceClose); |
+ idb_context->ConnectionOpened(kTestOrigin, &connection2); |
+ idb_context->ConnectionClosed(kTestOrigin, &connection2); |
+ |
+ idb_context->DeleteForOrigin(kTestOrigin); |
+ |
+ message_loop_.RunAllPending(); |
+ } |
+ |
+ // Make sure we wait until the destructor has run. |
+ message_loop_.RunAllPending(); |
+ |
+ EXPECT_FALSE(file_util::DirectoryExists(test_path)); |
+} |