summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
authorjorlow@chromium.org <jorlow@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-14 12:59:11 +0000
committerjorlow@chromium.org <jorlow@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-14 12:59:11 +0000
commit70c19a930beddde0e382777cb8799e7c8ebb1625 (patch)
tree887ab4d3962e19a5d114f205c0871ba2f9cf1e98 /chrome/renderer
parent7d754b0c3f04087aad0931141cdbdfbf1a82ba41 (diff)
downloadchromium_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.cc84
-rw-r--r--chrome/renderer/indexed_db_dispatcher.h51
-rw-r--r--chrome/renderer/render_thread.cc7
-rw-r--r--chrome/renderer/render_thread.h6
-rw-r--r--chrome/renderer/renderer_webidbdatabase_impl.cc18
-rw-r--r--chrome/renderer/renderer_webidbdatabase_impl.h21
-rw-r--r--chrome/renderer/renderer_webindexeddatabase_impl.cc31
-rw-r--r--chrome/renderer/renderer_webindexeddatabase_impl.h30
-rw-r--r--chrome/renderer/renderer_webkitclient_impl.cc22
-rw-r--r--chrome/renderer/renderer_webkitclient_impl.h7
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_