diff options
author | finnur@chromium.org <finnur@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-24 22:05:35 +0000 |
---|---|---|
committer | finnur@chromium.org <finnur@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-24 22:05:35 +0000 |
commit | bfdffe2b1dce4c1415be1d0fb82b39a7adcd5694 (patch) | |
tree | 8fc12a06e0a45539fdd92a2d8ab6fe53ab3df925 | |
parent | 22e734b70f6fc6292f991132fe6ab5570acd7b02 (diff) | |
download | chromium_src-bfdffe2b1dce4c1415be1d0fb82b39a7adcd5694.zip chromium_src-bfdffe2b1dce4c1415be1d0fb82b39a7adcd5694.tar.gz chromium_src-bfdffe2b1dce4c1415be1d0fb82b39a7adcd5694.tar.bz2 |
No code change, just converting CRLF to LF to prevent changes
to this file from messing up the try server.
TBR=aa
Review URL: http://codereview.chromium.org/93156
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@14486 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/extensions/extension_function_dispatcher.cc | 312 |
1 files changed, 156 insertions, 156 deletions
diff --git a/chrome/browser/extensions/extension_function_dispatcher.cc b/chrome/browser/extensions/extension_function_dispatcher.cc index 56a4f61..6545f6f 100644 --- a/chrome/browser/extensions/extension_function_dispatcher.cc +++ b/chrome/browser/extensions/extension_function_dispatcher.cc @@ -1,156 +1,156 @@ -// 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_function_dispatcher.h"
-
-#include "base/json_reader.h"
-#include "base/json_writer.h"
-#include "base/process_util.h"
-#include "base/singleton.h"
-#include "base/values.h"
-#include "chrome/browser/extensions/extension_bookmarks_module.h"
-#include "chrome/browser/extensions/extension_function.h"
-#include "chrome/browser/extensions/extension_tabs_module.h"
-#include "chrome/browser/renderer_host/render_process_host.h"
-#include "chrome/browser/renderer_host/render_view_host.h"
-#include "chrome/common/result_codes.h"
-
-// FactoryRegistry -------------------------------------------------------------
-
-namespace {
-
-// A pointer to a function that create an instance of an ExtensionFunction.
-typedef ExtensionFunction* (*ExtensionFunctionFactory)();
-
-// Contains a list of all known extension functions and allows clients to create
-// instances of them.
-class FactoryRegistry {
- public:
- static FactoryRegistry* instance();
- FactoryRegistry();
- void GetAllNames(std::vector<std::string>* names);
- ExtensionFunction* NewFunction(const std::string& name);
-
- private:
- typedef std::map<std::string, ExtensionFunctionFactory> FactoryMap;
- FactoryMap factories_;
-};
-
-// Template for defining ExtensionFunctionFactory.
-template<class T>
-ExtensionFunction* NewExtensionFunction() {
- return new T();
-}
-
-FactoryRegistry* FactoryRegistry::instance() {
- return Singleton<FactoryRegistry>::get();
-}
-
-FactoryRegistry::FactoryRegistry() {
- // Register all functions here.
-
- // Tabs
- factories_["GetWindows"] = &NewExtensionFunction<GetWindowsFunction>;
- factories_["GetTabsForWindow"] =
- &NewExtensionFunction<GetTabsForWindowFunction>;
- factories_["GetTab"] = &NewExtensionFunction<GetTabFunction>;
- factories_["CreateTab"] = &NewExtensionFunction<CreateTabFunction>;
- factories_["UpdateTab"] = &NewExtensionFunction<UpdateTabFunction>;
- factories_["MoveTab"] = &NewExtensionFunction<MoveTabFunction>;
- factories_["RemoveTab"] = &NewExtensionFunction<RemoveTabFunction>;
-
- // Bookmarks
- factories_["GetBookmarks"] = &NewExtensionFunction<GetBookmarksFunction>;
- factories_["SearchBookmarks"] =
- &NewExtensionFunction<SearchBookmarksFunction>;
- factories_["RemoveBookmark"] = &NewExtensionFunction<RemoveBookmarkFunction>;
- factories_["CreateBookmark"] = &NewExtensionFunction<CreateBookmarkFunction>;
- factories_["MoveBookmark"] = &NewExtensionFunction<MoveBookmarkFunction>;
- factories_["SetBookmarkTitle"] =
- &NewExtensionFunction<SetBookmarkTitleFunction>;
-}
-
-void FactoryRegistry::GetAllNames(
- std::vector<std::string>* names) {
- for (FactoryMap::iterator iter = factories_.begin(); iter != factories_.end();
- ++iter) {
- names->push_back(iter->first);
- }
-}
-
-ExtensionFunction* FactoryRegistry::NewFunction(const std::string& name) {
- FactoryMap::iterator iter = factories_.find(name);
- DCHECK(iter != factories_.end());
- return iter->second();
-}
-
-};
-
-
-// ExtensionFunctionDispatcher -------------------------------------------------
-
-void ExtensionFunctionDispatcher::GetAllFunctionNames(
- std::vector<std::string>* names) {
- FactoryRegistry::instance()->GetAllNames(names);
-}
-
-ExtensionFunctionDispatcher::ExtensionFunctionDispatcher(
- RenderViewHost* render_view_host,
- const std::string& extension_id)
- : render_view_host_(render_view_host),
- extension_id_(extension_id) {
-}
-
-void ExtensionFunctionDispatcher::HandleRequest(const std::string& name,
- const std::string& args,
- int callback_id) {
- scoped_ptr<Value> value;
- if (!args.empty()) {
- JSONReader reader;
- value.reset(reader.JsonToValue(args, false, false));
-
- // Since we do the serialization in the v8 extension, we should always get
- // valid JSON.
- if (!value.get()) {
- DCHECK(false);
- return;
- }
- }
-
- // TODO(aa): This will get a bit more complicated when we support functions
- // that live longer than the stack frame.
- scoped_ptr<ExtensionFunction> function(
- FactoryRegistry::instance()->NewFunction(name));
- function->set_dispatcher(this);
- function->set_args(value.get());
- function->set_callback_id(callback_id);
- function->Run();
-}
-
-void ExtensionFunctionDispatcher::SendResponse(ExtensionFunction* function) {
- std::string json;
-
- // Some functions might not need to return any results.
- if (function->result())
- JSONWriter::Write(function->result(), false, &json);
-
- render_view_host_->SendExtensionResponse(function->callback_id(), json);
-}
-
-void ExtensionFunctionDispatcher::HandleBadMessage(ExtensionFunction* api) {
- LOG(ERROR) << "bad extension message " << // TODO(erikkay) name?
- " : terminating renderer.";
- if (RenderProcessHost::run_renderer_in_process()) {
- // In single process mode it is better if we don't suicide but just crash.
- CHECK(false);
- } else {
- NOTREACHED();
- base::KillProcess(render_view_host_->process()->process().handle(),
- ResultCodes::KILLED_BAD_MESSAGE, false);
- }
-}
-
-Profile* ExtensionFunctionDispatcher::profile() {
- return render_view_host_->process()->profile();
-}
+// 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_function_dispatcher.h" + +#include "base/json_reader.h" +#include "base/json_writer.h" +#include "base/process_util.h" +#include "base/singleton.h" +#include "base/values.h" +#include "chrome/browser/extensions/extension_bookmarks_module.h" +#include "chrome/browser/extensions/extension_function.h" +#include "chrome/browser/extensions/extension_tabs_module.h" +#include "chrome/browser/renderer_host/render_process_host.h" +#include "chrome/browser/renderer_host/render_view_host.h" +#include "chrome/common/result_codes.h" + +// FactoryRegistry ------------------------------------------------------------- + +namespace { + +// A pointer to a function that create an instance of an ExtensionFunction. +typedef ExtensionFunction* (*ExtensionFunctionFactory)(); + +// Contains a list of all known extension functions and allows clients to create +// instances of them. +class FactoryRegistry { + public: + static FactoryRegistry* instance(); + FactoryRegistry(); + void GetAllNames(std::vector<std::string>* names); + ExtensionFunction* NewFunction(const std::string& name); + + private: + typedef std::map<std::string, ExtensionFunctionFactory> FactoryMap; + FactoryMap factories_; +}; + +// Template for defining ExtensionFunctionFactory. +template<class T> +ExtensionFunction* NewExtensionFunction() { + return new T(); +} + +FactoryRegistry* FactoryRegistry::instance() { + return Singleton<FactoryRegistry>::get(); +} + +FactoryRegistry::FactoryRegistry() { + // Register all functions here. + + // Tabs + factories_["GetWindows"] = &NewExtensionFunction<GetWindowsFunction>; + factories_["GetTabsForWindow"] = + &NewExtensionFunction<GetTabsForWindowFunction>; + factories_["GetTab"] = &NewExtensionFunction<GetTabFunction>; + factories_["CreateTab"] = &NewExtensionFunction<CreateTabFunction>; + factories_["UpdateTab"] = &NewExtensionFunction<UpdateTabFunction>; + factories_["MoveTab"] = &NewExtensionFunction<MoveTabFunction>; + factories_["RemoveTab"] = &NewExtensionFunction<RemoveTabFunction>; + + // Bookmarks + factories_["GetBookmarks"] = &NewExtensionFunction<GetBookmarksFunction>; + factories_["SearchBookmarks"] = + &NewExtensionFunction<SearchBookmarksFunction>; + factories_["RemoveBookmark"] = &NewExtensionFunction<RemoveBookmarkFunction>; + factories_["CreateBookmark"] = &NewExtensionFunction<CreateBookmarkFunction>; + factories_["MoveBookmark"] = &NewExtensionFunction<MoveBookmarkFunction>; + factories_["SetBookmarkTitle"] = + &NewExtensionFunction<SetBookmarkTitleFunction>; +} + +void FactoryRegistry::GetAllNames( + std::vector<std::string>* names) { + for (FactoryMap::iterator iter = factories_.begin(); iter != factories_.end(); + ++iter) { + names->push_back(iter->first); + } +} + +ExtensionFunction* FactoryRegistry::NewFunction(const std::string& name) { + FactoryMap::iterator iter = factories_.find(name); + DCHECK(iter != factories_.end()); + return iter->second(); +} + +}; + + +// ExtensionFunctionDispatcher ------------------------------------------------- + +void ExtensionFunctionDispatcher::GetAllFunctionNames( + std::vector<std::string>* names) { + FactoryRegistry::instance()->GetAllNames(names); +} + +ExtensionFunctionDispatcher::ExtensionFunctionDispatcher( + RenderViewHost* render_view_host, + const std::string& extension_id) + : render_view_host_(render_view_host), + extension_id_(extension_id) { +} + +void ExtensionFunctionDispatcher::HandleRequest(const std::string& name, + const std::string& args, + int callback_id) { + scoped_ptr<Value> value; + if (!args.empty()) { + JSONReader reader; + value.reset(reader.JsonToValue(args, false, false)); + + // Since we do the serialization in the v8 extension, we should always get + // valid JSON. + if (!value.get()) { + DCHECK(false); + return; + } + } + + // TODO(aa): This will get a bit more complicated when we support functions + // that live longer than the stack frame. + scoped_ptr<ExtensionFunction> function( + FactoryRegistry::instance()->NewFunction(name)); + function->set_dispatcher(this); + function->set_args(value.get()); + function->set_callback_id(callback_id); + function->Run(); +} + +void ExtensionFunctionDispatcher::SendResponse(ExtensionFunction* function) { + std::string json; + + // Some functions might not need to return any results. + if (function->result()) + JSONWriter::Write(function->result(), false, &json); + + render_view_host_->SendExtensionResponse(function->callback_id(), json); +} + +void ExtensionFunctionDispatcher::HandleBadMessage(ExtensionFunction* api) { + LOG(ERROR) << "bad extension message " << // TODO(erikkay) name? + " : terminating renderer."; + if (RenderProcessHost::run_renderer_in_process()) { + // In single process mode it is better if we don't suicide but just crash. + CHECK(false); + } else { + NOTREACHED(); + base::KillProcess(render_view_host_->process()->process().handle(), + ResultCodes::KILLED_BAD_MESSAGE, false); + } +} + +Profile* ExtensionFunctionDispatcher::profile() { + return render_view_host_->process()->profile(); +} |