diff options
author | aa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-24 09:18:27 +0000 |
---|---|---|
committer | aa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-24 09:18:27 +0000 |
commit | 309d7a28aa6c938f60ac7a543ab4a73827d29562 (patch) | |
tree | a806e83ff1533242c190a736519dbd31d43fb1e6 /chrome/browser | |
parent | cb2c560e5c5761329e614aeeaeb6ccb5dcfc1987 (diff) | |
download | chromium_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.scons | 2 | ||||
-rw-r--r-- | chrome/browser/browser.vcproj | 8 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_api_handler.cc | 45 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_api_handler.h | 29 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_view_host.cc | 17 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_view_host.h | 10 |
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); }; |