diff options
author | jorlow@chromium.org <jorlow@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-14 12:59:11 +0000 |
---|---|---|
committer | jorlow@chromium.org <jorlow@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-14 12:59:11 +0000 |
commit | 70c19a930beddde0e382777cb8799e7c8ebb1625 (patch) | |
tree | 887ab4d3962e19a5d114f205c0871ba2f9cf1e98 /chrome/renderer | |
parent | 7d754b0c3f04087aad0931141cdbdfbf1a82ba41 (diff) | |
download | chromium_src-70c19a930beddde0e382777cb8799e7c8ebb1625.zip chromium_src-70c19a930beddde0e382777cb8799e7c8ebb1625.tar.gz chromium_src-70c19a930beddde0e382777cb8799e7c8ebb1625.tar.bz2 |
Implement IndexedDatabase::open up until re-entrance into WebKit. That (and the
rest of IndexedDB) will be done in subsequent patches. Included in this patch
is a lot of other infrastructure for making IndexedDB work. Included is a
conversion from the DOMStorageDispatcherHost into a dispatcher host for all APIs
that have a backend in WebKit.
I named it WebKitAPIDispatcherHost. Since it's in browser/in_process_webkit and
it is for APIs that connect up to the WebKit API and it's used for APIs whose
backend is implemented in WebKit I thought the name was decent and not _too_
confusing, but if you have better ideas, please let me know.
This includes some code that you've already reviewed (darin), but a lot has
changed so please take a look at all of it.
TEST=Not much to test yet + behind a flag.
BUG=none
Review URL: http://codereview.chromium.org/1599009
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@47268 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r-- | chrome/renderer/indexed_db_dispatcher.cc | 84 | ||||
-rw-r--r-- | chrome/renderer/indexed_db_dispatcher.h | 51 | ||||
-rw-r--r-- | chrome/renderer/render_thread.cc | 7 | ||||
-rw-r--r-- | chrome/renderer/render_thread.h | 6 | ||||
-rw-r--r-- | chrome/renderer/renderer_webidbdatabase_impl.cc | 18 | ||||
-rw-r--r-- | chrome/renderer/renderer_webidbdatabase_impl.h | 21 | ||||
-rw-r--r-- | chrome/renderer/renderer_webindexeddatabase_impl.cc | 31 | ||||
-rw-r--r-- | chrome/renderer/renderer_webindexeddatabase_impl.h | 30 | ||||
-rw-r--r-- | chrome/renderer/renderer_webkitclient_impl.cc | 22 | ||||
-rw-r--r-- | chrome/renderer/renderer_webkitclient_impl.h | 7 |
10 files changed, 275 insertions, 2 deletions
diff --git a/chrome/renderer/indexed_db_dispatcher.cc b/chrome/renderer/indexed_db_dispatcher.cc new file mode 100644 index 0000000..3dbaf0b --- /dev/null +++ b/chrome/renderer/indexed_db_dispatcher.cc @@ -0,0 +1,84 @@ +// Copyright (c) 2009 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 "chrome/renderer/indexed_db_dispatcher.h" + +#include "chrome/common/render_messages.h" +#include "chrome/renderer/render_thread.h" +#include "chrome/renderer/render_view.h" +#include "chrome/renderer/renderer_webidbdatabase_impl.h" +#include "third_party/WebKit/WebKit/chromium/public/WebFrame.h" +#include "third_party/WebKit/WebKit/chromium/public/WebIDBDatabaseError.h" +#include "third_party/WebKit/WebKit/chromium/public/WebSecurityOrigin.h" +#include "third_party/WebKit/WebKit/chromium/public/WebString.h" + +using WebKit::WebFrame; +using WebKit::WebIDBCallbacks; +using WebKit::WebIDBDatabase; +using WebKit::WebIDBDatabaseError; + +IndexedDBDispatcher::IndexedDBDispatcher() { +} + +IndexedDBDispatcher::~IndexedDBDispatcher() { +} + +bool IndexedDBDispatcher::OnMessageReceived(const IPC::Message& msg) { + bool handled = true; + IPC_BEGIN_MESSAGE_MAP(IndexedDBDispatcher, msg) + IPC_MESSAGE_HANDLER(ViewMsg_IndexedDatabaseOpenSuccess, + OnIndexedDatabaseOpenSuccess) + IPC_MESSAGE_HANDLER(ViewMsg_IndexedDatabaseOpenError, + OnIndexedDatabaseOpenError) + IPC_MESSAGE_UNHANDLED(handled = false) + IPC_END_MESSAGE_MAP() + return handled; +} + +void IndexedDBDispatcher::RequestIndexedDatabaseOpen( + const string16& name, const string16& description, bool modify_database, + WebIDBCallbacks* callbacks_ptr, const string16& origin, WebFrame* web_frame, + int* exception_code) { + scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); + *exception_code = 0; // Redundant, but why not... + + if (!web_frame) + return; // We must be shutting down. + RenderView* render_view = RenderView::FromWebView(web_frame->view()); + if (!render_view) + return; // We must be shutting down. + + ViewHostMsg_IndexedDatabaseOpen_Params params; + params.routing_id_ = render_view->routing_id(); + params.response_id_ = indexed_database_open_callbacks_.Add( + callbacks.release()); + params.origin_ = origin; + params.name_ = name; + params.description_ = description; + params.modify_database_ = modify_database; + RenderThread::current()->Send(new ViewHostMsg_IndexedDatabaseOpen(params)); +} + +void IndexedDBDispatcher::SendIDBDatabaseDestroyed(int32 idb_database_id) { + // TODO(jorlow): Is it possible for this to be destroyed but still have + // pending callbacks? If so, fix! + RenderThread::current()->Send(new ViewHostMsg_IDBDatabaseDestroyed( + idb_database_id)); +} + +void IndexedDBDispatcher::OnIndexedDatabaseOpenSuccess( + int32 response_id, int32 idb_database_id) { + WebKit::WebIDBCallbacks* callbacks = + indexed_database_open_callbacks_.Lookup(response_id); + callbacks->onSuccess(new RendererWebIDBDatabaseImpl(idb_database_id)); + indexed_database_open_callbacks_.Remove(response_id); +} + +void IndexedDBDispatcher::OnIndexedDatabaseOpenError( + int32 response_id, int code, const string16& message) { + WebKit::WebIDBCallbacks* callbacks = + indexed_database_open_callbacks_.Lookup(response_id); + callbacks->onError(WebIDBDatabaseError(code, message)); + indexed_database_open_callbacks_.Remove(response_id); +} diff --git a/chrome/renderer/indexed_db_dispatcher.h b/chrome/renderer/indexed_db_dispatcher.h new file mode 100644 index 0000000..78bb80b --- /dev/null +++ b/chrome/renderer/indexed_db_dispatcher.h @@ -0,0 +1,51 @@ +// Copyright (c) 2010 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 CHROME_RENDERER_INDEXED_DB_DISPATCHER_H_ +#define CHROME_RENDERER_INDEXED_DB_DISPATCHER_H_ + +#include "base/id_map.h" +#include "base/string16.h" +#include "ipc/ipc_message.h" +#include "third_party/WebKit/WebKit/chromium/public/WebIDBCallbacks.h" +#include "third_party/WebKit/WebKit/chromium/public/WebIDBDatabase.h" + +namespace WebKit { +class WebFrame; +} + +// Handle the indexed db related communication for this entire renderer. +class IndexedDBDispatcher { + public: + IndexedDBDispatcher(); + ~IndexedDBDispatcher(); + + // Called to possibly handle the incoming IPC message. Returns true if + // handled. + bool OnMessageReceived(const IPC::Message& msg); + + void RequestIndexedDatabaseOpen( + const string16& name, const string16& description, bool modify_database, + WebKit::WebIDBCallbacks* callbacks, const string16& origin, + WebKit::WebFrame* web_frame, int* exception_code); + + void SendIDBDatabaseDestroyed(int32 idb_database_id_); + + private: + // Message handlers. For each message we send, we need to handle both the + // success and the error case. + void OnIndexedDatabaseOpenSuccess(int32 response_id, + int32 idb_database_id); + void OnIndexedDatabaseOpenError(int32 response_id, int code, + const string16& message); + + // Careful! WebIDBCallbacks wraps non-threadsafe data types. It must be + // destroyed and used on the same thread it was created on. + IDMap<WebKit::WebIDBCallbacks, IDMapOwnPointer> + indexed_database_open_callbacks_; + + DISALLOW_COPY_AND_ASSIGN(IndexedDBDispatcher); +}; + +#endif // CHROME_RENDERER_INDEXED_DB_DISPATCHER_H_ diff --git a/chrome/renderer/render_thread.cc b/chrome/renderer/render_thread.cc index bccacf6..92b4b80 100644 --- a/chrome/renderer/render_thread.cc +++ b/chrome/renderer/render_thread.cc @@ -50,12 +50,14 @@ #include "chrome/renderer/extensions/js_only_v8_extensions.h" #include "chrome/renderer/extensions/renderer_extension_bindings.h" #include "chrome/renderer/external_extension.h" +#include "chrome/renderer/indexed_db_dispatcher.h" #include "chrome/renderer/loadtimes_extension_bindings.h" #include "chrome/renderer/net/render_dns_master.h" #include "chrome/renderer/plugin_channel_host.h" #include "chrome/renderer/render_process_impl.h" #include "chrome/renderer/render_view.h" #include "chrome/renderer/render_view_visitor.h" +#include "chrome/renderer/renderer_webindexeddatabase_impl.h" #include "chrome/renderer/renderer_webkitclient_impl.h" #include "chrome/renderer/spellchecker/spellcheck.h" #include "chrome/renderer/user_script_slave.h" @@ -234,6 +236,7 @@ void RenderThread::Init() { dns_master_.reset(new RenderDnsMaster()); histogram_snapshots_.reset(new RendererHistogramSnapshots()); appcache_dispatcher_.reset(new AppCacheDispatcher(this)); + indexed_db_dispatcher_.reset(new IndexedDBDispatcher()); spellchecker_.reset(new SpellCheck()); devtools_agent_filter_ = new DevToolsAgentFilter(); @@ -522,9 +525,11 @@ void RenderThread::OnDOMStorageEvent( } void RenderThread::OnControlMessageReceived(const IPC::Message& msg) { - // App cache messages are handled by a delegate. + // Some messages are handled by delegates. if (appcache_dispatcher_->OnMessageReceived(msg)) return; + if (indexed_db_dispatcher_->OnMessageReceived(msg)) + return; IPC_BEGIN_MESSAGE_MAP(RenderThread, msg) IPC_MESSAGE_HANDLER(ViewMsg_VisitedLink_NewTable, OnUpdateVisitedLinks) diff --git a/chrome/renderer/render_thread.h b/chrome/renderer/render_thread.h index 3578f77..a02a0b9 100644 --- a/chrome/renderer/render_thread.h +++ b/chrome/renderer/render_thread.h @@ -31,6 +31,7 @@ class CookieMessageFilter; class DBMessageFilter; class DevToolsAgentFilter; class FilePath; +class IndexedDBDispatcher; class ListValue; class NullableString16; class RenderDnsMaster; @@ -143,6 +144,10 @@ class RenderThread : public RenderThreadBase, return appcache_dispatcher_.get(); } + IndexedDBDispatcher* indexed_db_dispatcher() const { + return indexed_db_dispatcher_.get(); + } + SpellCheck* spellchecker() const { return spellchecker_.get(); } @@ -283,6 +288,7 @@ class RenderThread : public RenderThreadBase, scoped_ptr<UserScriptSlave> user_script_slave_; scoped_ptr<RenderDnsMaster> dns_master_; scoped_ptr<AppCacheDispatcher> appcache_dispatcher_; + scoped_ptr<IndexedDBDispatcher> indexed_db_dispatcher_; scoped_refptr<DevToolsAgentFilter> devtools_agent_filter_; scoped_ptr<RendererHistogramSnapshots> histogram_snapshots_; scoped_ptr<RendererWebKitClientImpl> webkit_client_; diff --git a/chrome/renderer/renderer_webidbdatabase_impl.cc b/chrome/renderer/renderer_webidbdatabase_impl.cc new file mode 100644 index 0000000..1c8e114 --- /dev/null +++ b/chrome/renderer/renderer_webidbdatabase_impl.cc @@ -0,0 +1,18 @@ +// Copyright (c) 2010 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 "chrome/renderer/renderer_webidbdatabase_impl.h" + +#include "chrome/renderer/render_thread.h" +#include "chrome/renderer/indexed_db_dispatcher.h" + +RendererWebIDBDatabaseImpl::RendererWebIDBDatabaseImpl(int32 idb_database_id) + : idb_database_id_(idb_database_id) { +} + +RendererWebIDBDatabaseImpl::~RendererWebIDBDatabaseImpl() { + IndexedDBDispatcher* dispatcher = + RenderThread::current()->indexed_db_dispatcher(); + dispatcher->SendIDBDatabaseDestroyed(idb_database_id_); +} diff --git a/chrome/renderer/renderer_webidbdatabase_impl.h b/chrome/renderer/renderer_webidbdatabase_impl.h new file mode 100644 index 0000000..f4fe7fc --- /dev/null +++ b/chrome/renderer/renderer_webidbdatabase_impl.h @@ -0,0 +1,21 @@ +// Copyright (c) 2010 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 CHROME_RENDERER_RENDERER_WEBIDBDATABASE_IMPL_H_ +#define CHROME_RENDERER_RENDERER_WEBIDBDATABASE_IMPL_H_ + +#include "base/basictypes.h" +#include "third_party/WebKit/WebKit/chromium/public/WebIDBCallbacks.h" +#include "third_party/WebKit/WebKit/chromium/public/WebIDBDatabase.h" + +class RendererWebIDBDatabaseImpl : public WebKit::WebIDBDatabase { + public: + explicit RendererWebIDBDatabaseImpl(int32 idb_database_id); + virtual ~RendererWebIDBDatabaseImpl(); + + private: + int32 idb_database_id_; +}; + +#endif // CHROME_RENDERER_RENDERER_WEBIDBDATABASE_IMPL_H_ diff --git a/chrome/renderer/renderer_webindexeddatabase_impl.cc b/chrome/renderer/renderer_webindexeddatabase_impl.cc new file mode 100644 index 0000000..e472a8b2 --- /dev/null +++ b/chrome/renderer/renderer_webindexeddatabase_impl.cc @@ -0,0 +1,31 @@ +// Copyright (c) 2010 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 "chrome/renderer/renderer_webindexeddatabase_impl.h" + +#include "chrome/renderer/render_thread.h" +#include "chrome/renderer/indexed_db_dispatcher.h" +#include "third_party/WebKit/WebKit/chromium/public/WebString.h" + +using WebKit::WebIDBCallbacks; +using WebKit::WebIDBDatabase; +using WebKit::WebString; +using WebKit::WebFrame; + +RendererWebIndexedDatabaseImpl::RendererWebIndexedDatabaseImpl() { +} + +RendererWebIndexedDatabaseImpl::~RendererWebIndexedDatabaseImpl() { +} + +void RendererWebIndexedDatabaseImpl::open( + const WebString& name, const WebString& description, bool modify_database, + WebIDBCallbacks* callbacks, const WebString& origin, WebFrame* web_frame, + int& exception_code) { + IndexedDBDispatcher* dispatcher = + RenderThread::current()->indexed_db_dispatcher(); + dispatcher->RequestIndexedDatabaseOpen(name, description, modify_database, + callbacks, origin, web_frame, + &exception_code); +} diff --git a/chrome/renderer/renderer_webindexeddatabase_impl.h b/chrome/renderer/renderer_webindexeddatabase_impl.h new file mode 100644 index 0000000..6cc73f2d --- /dev/null +++ b/chrome/renderer/renderer_webindexeddatabase_impl.h @@ -0,0 +1,30 @@ +// Copyright (c) 2010 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 CHROME_RENDERER_RENDERER_WEBINDEXEDDATABASE_IMPL_H_ +#define CHROME_RENDERER_RENDERER_WEBINDEXEDDATABASE_IMPL_H_ + +#include "third_party/WebKit/WebKit/chromium/public/WebIDBCallbacks.h" +#include "third_party/WebKit/WebKit/chromium/public/WebIndexedDatabase.h" + +namespace WebKit { +class WebFrame; +class WebIDBDatabase; +class WebString; +} + +class RendererWebIndexedDatabaseImpl : public WebKit::WebIndexedDatabase { + public: + RendererWebIndexedDatabaseImpl(); + virtual ~RendererWebIndexedDatabaseImpl(); + + // See WebIndexedDatabase.h for documentation on these functions. + virtual void open( + const WebKit::WebString& name, const WebKit::WebString& description, + bool modify_database, WebKit::WebIDBCallbacks* callbacks, + const WebKit::WebString& origin, WebKit::WebFrame* web_frame, + int& exception_code); +}; + +#endif // CHROME_RENDERER_RENDERER_WEBINDEXEDDATABASE_IMPL_H_ diff --git a/chrome/renderer/renderer_webkitclient_impl.cc b/chrome/renderer/renderer_webkitclient_impl.cc index 0846df1..bc3c0c9 100644 --- a/chrome/renderer/renderer_webkitclient_impl.cc +++ b/chrome/renderer/renderer_webkitclient_impl.cc @@ -21,6 +21,7 @@ #include "chrome/renderer/net/render_dns_master.h" #include "chrome/renderer/render_thread.h" #include "chrome/renderer/render_view.h" +#include "chrome/renderer/renderer_webindexeddatabase_impl.h" #include "chrome/renderer/renderer_webstoragenamespace_impl.h" #include "chrome/renderer/visitedlink_slave.h" #include "chrome/renderer/webgles2context_impl.h" @@ -29,6 +30,7 @@ #include "ipc/ipc_sync_message_filter.h" #include "third_party/WebKit/WebKit/chromium/public/WebFrame.h" #include "third_party/WebKit/WebKit/chromium/public/WebGraphicsContext3D.h" +#include "third_party/WebKit/WebKit/chromium/public/WebIndexedDatabase.h" #include "third_party/WebKit/WebKit/chromium/public/WebStorageEventDispatcher.h" #include "third_party/WebKit/WebKit/chromium/public/WebString.h" #include "third_party/WebKit/WebKit/chromium/public/WebURL.h" @@ -44,6 +46,7 @@ #endif using WebKit::WebFrame; +using WebKit::WebIndexedDatabase; using WebKit::WebKitClient; using WebKit::WebStorageArea; using WebKit::WebStorageEventDispatcher; @@ -52,6 +55,13 @@ using WebKit::WebString; using WebKit::WebURL; using WebKit::WebVector; +RendererWebKitClientImpl::RendererWebKitClientImpl() + : sudden_termination_disables_(0) { +} + +RendererWebKitClientImpl::~RendererWebKitClientImpl() { +} + //------------------------------------------------------------------------------ WebKit::WebClipboard* RendererWebKitClientImpl::clipboard() { @@ -170,6 +180,18 @@ void RendererWebKitClientImpl::dispatchStorageEvent( //------------------------------------------------------------------------------ +WebIndexedDatabase* RendererWebKitClientImpl::indexedDatabase() { + if (!web_indexed_database_.get()) { + if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess)) + web_indexed_database_.reset(WebIndexedDatabase::create()); + else + web_indexed_database_.reset(new RendererWebIndexedDatabaseImpl()); + } + return web_indexed_database_.get(); +} + +//------------------------------------------------------------------------------ + WebString RendererWebKitClientImpl::MimeRegistry::mimeTypeForExtension( const WebString& file_extension) { if (IsPluginProcess()) diff --git a/chrome/renderer/renderer_webkitclient_impl.h b/chrome/renderer/renderer_webkitclient_impl.h index adcad69..82c40295 100644 --- a/chrome/renderer/renderer_webkitclient_impl.h +++ b/chrome/renderer/renderer_webkitclient_impl.h @@ -6,6 +6,7 @@ #define CHROME_RENDERER_RENDERER_WEBKITCLIENT_IMPL_H_ #include "base/platform_file.h" +#include "base/scoped_ptr.h" #include "chrome/renderer/websharedworkerrepository_impl.h" #include "webkit/glue/simple_webmimeregistry_impl.h" #include "webkit/glue/webclipboard_impl.h" @@ -27,7 +28,8 @@ class SyncMessage; class RendererWebKitClientImpl : public webkit_glue::WebKitClientImpl { public: - RendererWebKitClientImpl() : sudden_termination_disables_(0) {} + RendererWebKitClientImpl(); + virtual ~RendererWebKitClientImpl(); // WebKitClient methods: virtual WebKit::WebClipboard* clipboard(); @@ -62,6 +64,8 @@ class RendererWebKitClientImpl : public webkit_glue::WebKitClientImpl { unsigned key_size_index, const WebKit::WebString& challenge, const WebKit::WebURL& url); + virtual WebKit::WebIndexedDatabase* indexedDatabase(); + virtual WebKit::WebSharedWorkerRepository* sharedWorkerRepository(); virtual WebKit::WebGraphicsContext3D* createGraphicsContext3D(); virtual WebKit::WebGLES2Context* createGLES2Context(); @@ -129,6 +133,7 @@ class RendererWebKitClientImpl : public webkit_glue::WebKitClientImpl { // to WorkerService on the browser thread. WebSharedWorkerRepositoryImpl shared_worker_repository_; + scoped_ptr<WebKit::WebIndexedDatabase> web_indexed_database_; }; #endif // CHROME_RENDERER_RENDERER_WEBKITCLIENT_IMPL_H_ |