summaryrefslogtreecommitdiffstats
path: root/webkit
diff options
context:
space:
mode:
authordarin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-15 21:19:28 +0000
committerdarin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-15 21:19:28 +0000
commit467a1036c61793da05d1c18737876cdd57448251 (patch)
treeac7a323a78b1258a98d63bc45313fbda42207794 /webkit
parente791c39004e6bad4191cb7b4d9ee5669f33aa08e (diff)
downloadchromium_src-467a1036c61793da05d1c18737876cdd57448251.zip
chromium_src-467a1036c61793da05d1c18737876cdd57448251.tar.gz
chromium_src-467a1036c61793da05d1c18737876cdd57448251.tar.bz2
Make TestWebIDBFactory allocate a separate WebIDBFactory per thread.
This allows the main WebKit thread and web worker threads to each get their own WebIDBFactory instance, which mimics the behavior when we let the WebIDBFactory be instantiated via the WebKitPlatformSupport::idbFactory() method. Avoid storing WebString on class that will be reached by multiple threads. This is a slight variation on the patch attempted here: https://chromiumcodereview.appspot.com/12181010 R=alecflett@chromium.org Review URL: https://codereview.chromium.org/12230054 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@182828 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit')
-rw-r--r--webkit/support/test_webidbfactory.cc67
-rw-r--r--webkit/support/test_webidbfactory.h55
-rw-r--r--webkit/support/test_webkit_platform_support.cc67
-rw-r--r--webkit/support/test_webkit_platform_support.h3
-rw-r--r--webkit/support/webkit_support.cc17
-rw-r--r--webkit/support/webkit_support.gypi2
-rw-r--r--webkit/support/webkit_support.h1
7 files changed, 128 insertions, 84 deletions
diff --git a/webkit/support/test_webidbfactory.cc b/webkit/support/test_webidbfactory.cc
new file mode 100644
index 0000000..a320f6c
--- /dev/null
+++ b/webkit/support/test_webidbfactory.cc
@@ -0,0 +1,67 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "webkit/support/test_webidbfactory.h"
+
+#include "base/logging.h"
+#include "webkit/base/file_path_string_conversions.h"
+#include "webkit/support/webkit_support.h"
+
+TestWebIDBFactory::TestWebIDBFactory() {
+ // Create a new temp directory for Indexed DB storage, specific to this
+ // factory. If this fails, WebKit uses in-memory storage.
+ if (!indexed_db_dir_.CreateUniqueTempDir()) {
+ LOG(WARNING) << "Failed to create a temp dir for Indexed DB, "
+ "using in-memory storage.";
+ DCHECK(indexed_db_dir_.path().empty());
+ }
+}
+
+TestWebIDBFactory::~TestWebIDBFactory() {
+}
+
+void TestWebIDBFactory::getDatabaseNames(
+ WebKit::WebIDBCallbacks* callbacks,
+ const WebKit::WebSecurityOrigin& origin,
+ WebKit::WebFrame* frame,
+ const WebKit::WebString& data_dir) {
+ GetFactory()->getDatabaseNames(callbacks, origin, frame,
+ data_dir.isEmpty() ? GetDataDir() : data_dir);
+}
+
+void TestWebIDBFactory::open(
+ const WebKit::WebString& name,
+ long long version,
+ long long transaction_id,
+ WebKit::WebIDBCallbacks* callbacks,
+ WebKit::WebIDBDatabaseCallbacks* database_callbacks,
+ const WebKit::WebSecurityOrigin& origin,
+ WebKit::WebFrame* frame,
+ const WebKit::WebString& data_dir) {
+ GetFactory()->open(name, version, transaction_id, callbacks,
+ database_callbacks, origin, frame,
+ data_dir.isEmpty() ? GetDataDir() : data_dir);
+}
+
+void TestWebIDBFactory::deleteDatabase(const WebKit::WebString& name,
+ WebKit::WebIDBCallbacks* callbacks,
+ const WebKit::WebSecurityOrigin& origin,
+ WebKit::WebFrame* frame,
+ const WebKit::WebString& data_dir) {
+ GetFactory()->deleteDatabase(name, callbacks, origin, frame,
+ data_dir.isEmpty() ? GetDataDir() : data_dir);
+}
+
+WebKit::WebIDBFactory* TestWebIDBFactory::GetFactory() {
+ WebKit::WebIDBFactory* factory = factories_.Get();
+ if (!factory) {
+ factory = WebKit::WebIDBFactory::create();
+ factories_.Set(factory);
+ }
+ return factory;
+}
+
+WebKit::WebString TestWebIDBFactory::GetDataDir() const {
+ return webkit_base::FilePathToWebString(indexed_db_dir_.path());
+}
diff --git a/webkit/support/test_webidbfactory.h b/webkit/support/test_webidbfactory.h
new file mode 100644
index 0000000..e7b02b0
--- /dev/null
+++ b/webkit/support/test_webidbfactory.h
@@ -0,0 +1,55 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef WEBKIT_SUPPORT_TEST_WEBIDBFACTORY_H_
+#define WEBKIT_SUPPORT_TEST_WEBIDBFACTORY_H_
+
+#include "base/files/scoped_temp_dir.h"
+#include "base/threading/thread_local.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebIDBFactory.h"
+
+// Wrap a WebKit::WebIDBFactory to rewrite the data directory to
+// a scoped temp directory. In multiprocess Chromium this is rewritten
+// to a real profile directory during IPC.
+class TestWebIDBFactory : public WebKit::WebIDBFactory {
+ public:
+ TestWebIDBFactory();
+ virtual ~TestWebIDBFactory();
+
+ // WebIDBFactory methods:
+ virtual void getDatabaseNames(WebKit::WebIDBCallbacks* callbacks,
+ const WebKit::WebSecurityOrigin& origin,
+ WebKit::WebFrame* frame,
+ const WebKit::WebString& data_dir);
+ virtual void open(const WebKit::WebString& name,
+ long long version,
+ long long transaction_id,
+ WebKit::WebIDBCallbacks* callbacks,
+ WebKit::WebIDBDatabaseCallbacks* database_callbacks,
+ const WebKit::WebSecurityOrigin& origin,
+ WebKit::WebFrame* frame,
+ const WebKit::WebString& data_dir);
+ virtual void deleteDatabase(const WebKit::WebString& name,
+ WebKit::WebIDBCallbacks* callbacks,
+ const WebKit::WebSecurityOrigin& origin,
+ WebKit::WebFrame* frame,
+ const WebKit::WebString& data_dir);
+
+ private:
+ // Returns the WebIDBFactory implementation to use for the current thread.
+ WebKit::WebIDBFactory* GetFactory();
+
+ // Returns the data directory to use.
+ WebKit::WebString GetDataDir() const;
+
+ // We allocate a separate WebIDBFactory instance per thread since the
+ // implementation is not thread-safe. We also intentionally leak the
+ // factory instances to avoid shutdown races. TODO(darin): Can we
+ // avoid leaking these?
+ base::ThreadLocalPointer<WebKit::WebIDBFactory> factories_;
+
+ base::ScopedTempDir indexed_db_dir_;
+};
+
+#endif // WEBKIT_SUPPORT_TEST_WEBIDBFACTORY_H_
diff --git a/webkit/support/test_webkit_platform_support.cc b/webkit/support/test_webkit_platform_support.cc
index e9f1961..a8897a9 100644
--- a/webkit/support/test_webkit_platform_support.cc
+++ b/webkit/support/test_webkit_platform_support.cc
@@ -342,73 +342,6 @@ TestWebKitPlatformSupport::createLocalStorageNamespace(
return dom_storage_system_.CreateLocalStorageNamespace();
}
-// Wrap a WebKit::WebIDBFactory to rewrite the data directory to
-// a scoped temp directory. In multiprocess Chromium this is rewritten
-// to a real profile directory during IPC.
-class TestWebIDBFactory : public WebKit::WebIDBFactory {
- public:
- TestWebIDBFactory() {
- // Create a new temp directory for Indexed DB storage, specific to this
- // factory. If this fails, WebKit uses in-memory storage.
- if (!indexed_db_dir_.CreateUniqueTempDir()) {
- LOG(WARNING) << "Failed to create a temp dir for Indexed DB, "
- "using in-memory storage.";
- DCHECK(indexed_db_dir_.path().empty());
- }
- data_dir_ = webkit_support::GetAbsoluteWebStringFromUTF8Path(
- indexed_db_dir_.path().AsUTF8Unsafe());
-
- // Lazily construct factory_ so that it gets allocated on the thread where
- // it will be used. TestWebIDBFactory gets allocated on the main thread.
- }
-
- virtual void getDatabaseNames(WebKit::WebIDBCallbacks* callbacks,
- const WebKit::WebSecurityOrigin& origin,
- WebKit::WebFrame* frame,
- const WebString& dataDir) {
- EnsureFactory();
- factory_->getDatabaseNames(callbacks, origin, frame,
- dataDir.isEmpty() ? data_dir_ : dataDir);
- }
-
- virtual void open(const WebString& name,
- long long version,
- long long transaction_id,
- WebKit::WebIDBCallbacks* callbacks,
- WebKit::WebIDBDatabaseCallbacks* databaseCallbacks,
- const WebKit::WebSecurityOrigin& origin,
- WebKit::WebFrame* frame,
- const WebString& dataDir) {
- EnsureFactory();
- factory_->open(name, version, transaction_id, callbacks,
- databaseCallbacks, origin, frame,
- dataDir.isEmpty() ? data_dir_ : dataDir);
- }
-
- virtual void deleteDatabase(const WebString& name,
- WebKit::WebIDBCallbacks* callbacks,
- const WebKit::WebSecurityOrigin& origin,
- WebKit::WebFrame* frame,
- const WebString& dataDir) {
- EnsureFactory();
- factory_->deleteDatabase(name, callbacks, origin, frame,
- dataDir.isEmpty() ? data_dir_ : dataDir);
- }
- private:
- void EnsureFactory() {
- if (!factory_)
- factory_.reset(WebKit::WebIDBFactory::create());
- }
-
- scoped_ptr<WebIDBFactory> factory_;
- base::ScopedTempDir indexed_db_dir_;
- WebString data_dir_;
-};
-
-WebKit::WebIDBFactory* TestWebKitPlatformSupport::idbFactory() {
- return new TestWebIDBFactory();
-}
-
#if defined(OS_WIN) || defined(OS_MACOSX)
void TestWebKitPlatformSupport::SetThemeEngine(WebKit::WebThemeEngine* engine) {
active_theme_engine_ = engine ?
diff --git a/webkit/support/test_webkit_platform_support.h b/webkit/support/test_webkit_platform_support.h
index ac824f2..049b19a 100644
--- a/webkit/support/test_webkit_platform_support.h
+++ b/webkit/support/test_webkit_platform_support.h
@@ -8,7 +8,6 @@
#include "base/compiler_specific.h"
#include "third_party/WebKit/Source/Platform/chromium/public/WebGamepads.h"
#include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsContext3D.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebIDBFactory.h"
#include "webkit/glue/webfileutilities_impl.h"
#include "webkit/glue/webkitplatformsupport_impl.h"
#include "webkit/support/simple_database_system.h"
@@ -83,8 +82,6 @@ class TestWebKitPlatformSupport :
virtual WebKit::WebStorageNamespace* createLocalStorageNamespace(
const WebKit::WebString& path, unsigned quota);
- virtual WebKit::WebIDBFactory* idbFactory();
-
#if defined(OS_WIN) || defined(OS_MACOSX)
void SetThemeEngine(WebKit::WebThemeEngine* engine);
virtual WebKit::WebThemeEngine *themeEngine();
diff --git a/webkit/support/webkit_support.cc b/webkit/support/webkit_support.cc
index 357c94c..4f16414 100644
--- a/webkit/support/webkit_support.cc
+++ b/webkit/support/webkit_support.cc
@@ -72,6 +72,7 @@
#include "webkit/plugins/webplugininfo.h"
#include "webkit/support/platform_support.h"
#include "webkit/support/simple_database_system.h"
+#include "webkit/support/test_webidbfactory.h"
#include "webkit/support/test_webkit_platform_support.h"
#include "webkit/support/test_webplugin_page_delegate.h"
#include "webkit/tools/test_shell/simple_appcache_system.h"
@@ -171,8 +172,8 @@ class TestEnvironment {
new TestWebKitPlatformSupport(unit_test_mode,
shadow_platform_delegate));
- // TODO(darin): Uncomment this once DRT calls ResetTestEnvironment().
- //WebKit::setIDBFactory(webkit_platform_support_->idbFactory());
+ idb_factory_.reset(new TestWebIDBFactory());
+ WebKit::setIDBFactory(idb_factory_.get());
#if defined(OS_ANDROID)
// Make sure we have enough decoding resources for layout tests.
@@ -188,13 +189,6 @@ class TestEnvironment {
SimpleResourceLoaderBridge::Shutdown();
}
- void Reset() {
-#if defined(OS_ANDROID)
- media_player_manager_->ReleaseMediaResources();
-#endif
- WebKit::setIDBFactory(webkit_platform_support_->idbFactory());
- }
-
TestWebKitPlatformSupport* webkit_platform_support() const {
return webkit_platform_support_.get();
}
@@ -238,6 +232,7 @@ class TestEnvironment {
scoped_ptr<base::AtExitManager> at_exit_manager_;
scoped_ptr<MessageLoopType> main_message_loop_;
scoped_ptr<TestWebKitPlatformSupport> webkit_platform_support_;
+ scoped_ptr<TestWebIDBFactory> idb_factory_;
#if defined(OS_ANDROID)
base::FilePath mock_current_directory_;
@@ -397,10 +392,6 @@ void TearDownTestEnvironment() {
logging::CloseLogFile();
}
-void ResetTestEnvironment() {
- test_environment->Reset();
-}
-
WebKit::WebKitPlatformSupport* GetWebKitPlatformSupport() {
DCHECK(test_environment);
return test_environment->webkit_platform_support();
diff --git a/webkit/support/webkit_support.gypi b/webkit/support/webkit_support.gypi
index b3be7fa..1715ef7 100644
--- a/webkit/support/webkit_support.gypi
+++ b/webkit/support/webkit_support.gypi
@@ -56,6 +56,8 @@
'test_stream_texture_factory_android.h',
'test_webkit_platform_support.cc',
'test_webkit_platform_support.h',
+ 'test_webidbfactory.cc',
+ 'test_webidbfactory.h',
'test_webmessageportchannel.cc',
'test_webmessageportchannel.h',
'test_webplugin_page_delegate.cc',
diff --git a/webkit/support/webkit_support.h b/webkit/support/webkit_support.h
index 5ff2558..1b02567 100644
--- a/webkit/support/webkit_support.h
+++ b/webkit/support/webkit_support.h
@@ -76,7 +76,6 @@ void SetUpTestEnvironment(WebKit::Platform* shadow_platform_delegate);
void SetUpTestEnvironmentForUnitTests(
WebKit::Platform* shadow_platform_delegate);
void TearDownTestEnvironment();
-void ResetTestEnvironment();
// Returns a pointer to a WebKitPlatformSupport implementation for
// DumpRenderTree. Needs to call SetUpTestEnvironment() before this.