summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authoraa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-24 09:18:27 +0000
committeraa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-24 09:18:27 +0000
commit309d7a28aa6c938f60ac7a543ab4a73827d29562 (patch)
treea806e83ff1533242c190a736519dbd31d43fb1e6 /chrome/browser
parentcb2c560e5c5761329e614aeeaeb6ccb5dcfc1987 (diff)
downloadchromium_src-309d7a28aa6c938f60ac7a543ab4a73827d29562.zip
chromium_src-309d7a28aa6c938f60ac7a543ab4a73827d29562.tar.gz
chromium_src-309d7a28aa6c938f60ac7a543ab4a73827d29562.tar.bz2
Add basic infrastructure for sending async browser API request and receiving results.
Review URL: http://codereview.chromium.org/42262 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@12347 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/browser.scons2
-rw-r--r--chrome/browser/browser.vcproj8
-rw-r--r--chrome/browser/extensions/extension_api_handler.cc45
-rw-r--r--chrome/browser/extensions/extension_api_handler.h29
-rw-r--r--chrome/browser/renderer_host/render_view_host.cc17
-rw-r--r--chrome/browser/renderer_host/render_view_host.h10
6 files changed, 110 insertions, 1 deletions
diff --git a/chrome/browser/browser.scons b/chrome/browser/browser.scons
index 69a8ba7..fec32ef 100644
--- a/chrome/browser/browser.scons
+++ b/chrome/browser/browser.scons
@@ -506,6 +506,8 @@ input_files = ChromeFileList([
MSVSFilter('Extensions', [
'extensions/extension.cc',
'extensions/extension.h',
+ 'extensions/extension_api_handler.cc',
+ 'extensions/extension_api_handler.h',
'extensions/extension_view.cc',
'extensions/extension_view.h',
'extensions/extension_error_reporter.cc',
diff --git a/chrome/browser/browser.vcproj b/chrome/browser/browser.vcproj
index 842f44c..ff76afb 100644
--- a/chrome/browser/browser.vcproj
+++ b/chrome/browser/browser.vcproj
@@ -1906,6 +1906,14 @@
>
</File>
<File
+ RelativePath=".\extensions\extension_api_handler.cc"
+ >
+ </File>
+ <File
+ RelativePath=".\extensions\extension_api_handler.h"
+ >
+ </File>
+ <File
RelativePath=".\extensions\extension_error_reporter.cc"
>
</File>
diff --git a/chrome/browser/extensions/extension_api_handler.cc b/chrome/browser/extensions/extension_api_handler.cc
new file mode 100644
index 0000000..702917b
--- /dev/null
+++ b/chrome/browser/extensions/extension_api_handler.cc
@@ -0,0 +1,45 @@
+// 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/browser/extensions/extension_api_handler.h"
+
+#include "base/json_reader.h"
+#include "base/json_writer.h"
+#include "base/values.h"
+#include "chrome/browser/browser.h"
+#include "chrome/browser/browser_list.h"
+#include "chrome/browser/renderer_host/render_view_host.h"
+
+ExtensionAPIHandler::ExtensionAPIHandler(RenderViewHost* render_view_host)
+ : render_view_host_(render_view_host) {}
+
+void ExtensionAPIHandler::HandleRequest(const std::string& name,
+ const std::string& args,
+ int callback_id) {
+ scoped_ptr<Value> value;
+ if (!args.empty()) {
+ value.reset(JSONReader::Read(args, false));
+ DCHECK(value.get());
+ }
+
+ // TODO(aa): This will probably dispatch to per-module specialized classes.
+ // Consider refactoring similar work in dom_ui to reuse.
+ if (name == "CreateTab") {
+ Browser* browser = BrowserList::GetLastActive();
+ if (browser) {
+ DCHECK(value->IsType(Value::TYPE_DICTIONARY));
+ std::string url;
+ static_cast<DictionaryValue*>(value.get())->GetString(L"url", &url);
+ browser->AddTabWithURL(GURL(url), GURL(), PageTransition::TYPED, true,
+ NULL);
+
+ static int response_count = 0;
+ scoped_ptr<Value> response(Value::CreateIntegerValue(response_count++));
+ std::string json;
+ JSONWriter::Write(response.get(), false, &json);
+
+ render_view_host_->SendExtensionResponse(callback_id, json);
+ }
+ }
+}
diff --git a/chrome/browser/extensions/extension_api_handler.h b/chrome/browser/extensions/extension_api_handler.h
new file mode 100644
index 0000000..3cd6efd
--- /dev/null
+++ b/chrome/browser/extensions/extension_api_handler.h
@@ -0,0 +1,29 @@
+// 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.
+
+#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_APIS_H_
+#define CHROME_BROWSER_EXTENSIONS_EXTENSION_APIS_H_
+
+#include <string>
+
+class RenderViewHost;
+
+// ExtensionAPIHandler is the top-level entry point for extension callbacks
+// in the browser process. It lives on the UI thread.
+class ExtensionAPIHandler {
+ public:
+ ExtensionAPIHandler(RenderViewHost* render_view_host);
+
+ // Handle a request to perform some synchronous API.
+ // TODO(aa): args should be a Value object.
+ void HandleRequest(const std::string& name, const std::string& args,
+ int callback_id);
+
+ private:
+ // TODO(aa): Once there can be APIs that are asynchronous wrt the browser's UI
+ // thread, we may have to have to do something about this raw pointer.
+ RenderViewHost* render_view_host_;
+};
+
+#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_APIS_H_
diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc
index cb6110b..a02f15c 100644
--- a/chrome/browser/renderer_host/render_view_host.cc
+++ b/chrome/browser/renderer_host/render_view_host.cc
@@ -98,7 +98,8 @@ RenderViewHost::RenderViewHost(SiteInstance* instance,
run_modal_reply_msg_(NULL),
has_unload_listener_(false),
is_waiting_for_unload_ack_(false),
- are_javascript_messages_suppressed_(false) {
+ are_javascript_messages_suppressed_(false),
+ ALLOW_THIS_IN_INITIALIZER_LIST(extension_api_handler_(this)) {
DCHECK(instance_);
DCHECK(delegate_);
if (modal_dialog_event == NULL)
@@ -761,6 +762,7 @@ void RenderViewHost::OnMessageReceived(const IPC::Message& msg) {
IPC_MESSAGE_HANDLER(ViewHostMsg_RemoveAutofillEntry,
OnRemoveAutofillEntry)
IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateFeedList, OnMsgUpdateFeedList)
+ IPC_MESSAGE_HANDLER(ViewHostMsg_ExtensionRequest, OnExtensionRequest)
// Have the super handle all other messages.
IPC_MESSAGE_UNHANDLED(RenderWidgetHost::OnMessageReceived(msg))
IPC_END_MESSAGE_MAP_EX()
@@ -1344,3 +1346,16 @@ void RenderViewHost::ForwardMessageFromExternalHost(const std::string& message,
Send(new ViewMsg_HandleMessageFromExternalHost(routing_id(), message, origin,
target));
}
+
+void RenderViewHost::OnExtensionRequest(const std::string& name,
+ const std::string& args,
+ int callback_id) {
+ // TODO(aa): Here is where we can check that this renderer was supposed to be
+ // able to call extension APIs.
+ extension_api_handler_.HandleRequest(name, args, callback_id);
+}
+
+void RenderViewHost::SendExtensionResponse(int callback_id,
+ const std::string& response) {
+ Send(new ViewMsg_ExtensionResponse(routing_id(), callback_id, response));
+}
diff --git a/chrome/browser/renderer_host/render_view_host.h b/chrome/browser/renderer_host/render_view_host.h
index fdaf769..1e61e7e 100644
--- a/chrome/browser/renderer_host/render_view_host.h
+++ b/chrome/browser/renderer_host/render_view_host.h
@@ -9,6 +9,7 @@
#include <vector>
#include "base/scoped_ptr.h"
+#include "chrome/browser/extensions/extension_api_handler.h"
#include "chrome/browser/renderer_host/render_view_host_delegate.h"
#include "chrome/browser/renderer_host/render_widget_host.h"
#include "chrome/common/modal_dialog_event.h"
@@ -429,6 +430,8 @@ class RenderViewHost : public RenderWidgetHost {
// Creates a new RenderWidget with the given route id.
void CreateNewWidget(int route_id, bool activatable);
+ void SendExtensionResponse(int callback_id, const std::string& response);
+
protected:
// RenderWidgetHost protected overrides.
virtual void UnhandledKeyboardEvent(const NativeWebKeyboardEvent& event);
@@ -553,6 +556,9 @@ class RenderViewHost : public RenderWidgetHost {
void OnRemoveAutofillEntry(const std::wstring& field_name,
const std::wstring& value);
+ void OnExtensionRequest(const std::string& name, const std::string& args,
+ int callback_id);
+
// Helper function to send a navigation message. If a cross-site request is
// in progress, we may be suspended while waiting for the onbeforeunload
// handler, so this function might buffer the message rather than sending it.
@@ -631,6 +637,10 @@ class RenderViewHost : public RenderWidgetHost {
bool are_javascript_messages_suppressed_;
+ // Handler for extension API requests.
+ // Handles processing IPC messages related to the extension system.
+ ExtensionAPIHandler extension_api_handler_;
+
DISALLOW_EVIL_CONSTRUCTORS(RenderViewHost);
};