summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormiket@chromium.org <miket@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-19 22:24:35 +0000
committermiket@chromium.org <miket@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-19 22:24:35 +0000
commitae33d3293bfb954bae710a31f401b0d833ba7be4 (patch)
tree7f7da014d0e47a89313f815d4cb42a80efba4144
parent558a9746b8245f7bf8f162709755a373566bcf65 (diff)
downloadchromium_src-ae33d3293bfb954bae710a31f401b0d833ba7be4.zip
chromium_src-ae33d3293bfb954bae710a31f401b0d833ba7be4.tar.gz
chromium_src-ae33d3293bfb954bae710a31f401b0d833ba7be4.tar.bz2
Reapply 127159 (http://codereview.chromium.org/9666059) plus important fixes.
Refactor extension_function_dispatcher to extract ExtensionFunctionRegistry. This allows us to generate an additional code block that takes an ExtensionFunctionRegistry and asks it to register generated API functions. Then switch DnsResolve over to get registered this way. Along the way, notice that DNSResolve is capitalized using an untenable style. Fix that. Fixes since original 127159: - change name of build rule to gen_bundle_api - actually add per-file dependencies to .gyp (this was why clean builds failed) - change 'outputs' to match the emitted filename, fixing a needless rebuild problem. - split the top-level build action that was a part of json_schema_compile.gypi, and include it only in api.gyp, thus fixing the problem where json_schema_compiler_tests.gyp was asking it to create outputs in the tools/json_schema_compiler_test directory, again causing needless work during the build process. BUG=none (essential plumbing work) TEST=same as before. Review URL: https://chromiumcodereview.appspot.com/9716003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@127555 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--build/json_schema_bundle_compile.gypi66
-rw-r--r--build/json_schema_compile.gypi6
-rw-r--r--chrome/browser/extensions/api/dns/dns_api.cc22
-rw-r--r--chrome/browser/extensions/api/dns/dns_api.h6
-rw-r--r--chrome/browser/extensions/api/dns/dns_apitest.cc34
-rw-r--r--chrome/browser/extensions/extension_function_dispatcher.cc540
-rw-r--r--chrome/browser/extensions/extension_function_registry.cc499
-rw-r--r--chrome/browser/extensions/extension_function_registry.h56
-rw-r--r--chrome/chrome_browser_extensions.gypi2
-rw-r--r--chrome/chrome_common.gypi4
-rw-r--r--chrome/common/extensions/api/api.gyp7
-rw-r--r--tools/json_schema_compiler/compiler.py95
-rw-r--r--tools/json_schema_compiler/cpp_type_generator.py7
-rw-r--r--tools/json_schema_compiler/cpp_util.py13
-rw-r--r--tools/json_schema_compiler/h_bundle_generator.py79
-rw-r--r--tools/json_schema_compiler/h_generator.py13
-rw-r--r--tools/json_schema_compiler/test/json_schema_compiler_tests.gyp3
17 files changed, 847 insertions, 605 deletions
diff --git a/build/json_schema_bundle_compile.gypi b/build/json_schema_bundle_compile.gypi
new file mode 100644
index 0000000..1f564d1
--- /dev/null
+++ b/build/json_schema_bundle_compile.gypi
@@ -0,0 +1,66 @@
+# Copyright (c) 2012 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.
+
+{
+ 'variables': {
+ # When including this gypi, the following variables must be set:
+ # json_schema_files: an array of json files that comprise the api model.
+ # cc_dir: path to generated files
+ # root_namespace: the C++ namespace that all generated files go under
+ # Functions and namespaces can be excluded by setting "nocompile" to true.
+ 'api_gen_dir': '<(DEPTH)/tools/json_schema_compiler',
+ 'api_gen': '<(api_gen_dir)/compiler.py',
+ },
+ 'actions': [
+ {
+ 'action_name': 'genapi_bundle',
+ 'inputs': [
+ '<(api_gen_dir)/any.cc',
+ '<(api_gen_dir)/any.h',
+ '<(api_gen_dir)/any_helper.py',
+ '<(api_gen_dir)/cc_generator.py',
+ '<(api_gen_dir)/code.py',
+ '<(api_gen_dir)/compiler.py',
+ '<(api_gen_dir)/cpp_type_generator.py',
+ '<(api_gen_dir)/cpp_util.py',
+ '<(api_gen_dir)/h_generator.py',
+ '<(api_gen_dir)/json_schema.py',
+ '<(api_gen_dir)/model.py',
+ '<(api_gen_dir)/util.cc',
+ '<(api_gen_dir)/util.h',
+ '<(api_gen_dir)/util_cc_helper.py',
+ '<@(idl_schema_files)',
+ ],
+ 'outputs': [
+ '<(SHARED_INTERMEDIATE_DIR)/chrome/common/extensions/api/generated_api.h',
+ ],
+ 'action': [
+ 'python',
+ '<(api_gen)',
+ '--root=<(DEPTH)',
+ '--destdir=<(SHARED_INTERMEDIATE_DIR)',
+ '--namespace=<(root_namespace)',
+ '--bundle',
+ '<@(idl_schema_files)',
+ ],
+ 'message': 'Generating C++ API bundle code',
+ 'process_outputs_as_sources': 1,
+ }
+ ],
+ 'include_dirs': [
+ '<(SHARED_INTERMEDIATE_DIR)',
+ '<(DEPTH)',
+ ],
+ 'dependencies':[
+ '<(DEPTH)/tools/json_schema_compiler/api_gen_util.gyp:api_gen_util',
+ ],
+ 'direct_dependent_settings': {
+ 'include_dirs': [
+ '<(SHARED_INTERMEDIATE_DIR)',
+ ]
+ },
+ # This target exports a hard dependency because it generates header
+ # files.
+ 'hard_dependency': 1,
+}
diff --git a/build/json_schema_compile.gypi b/build/json_schema_compile.gypi
index b44fe91..6c8f69c 100644
--- a/build/json_schema_compile.gypi
+++ b/build/json_schema_compile.gypi
@@ -5,7 +5,8 @@
{
'variables': {
# When including this gypi, the following variables must be set:
- # json_schema_files: an array of json files that comprise the api model.
+ # json_schema_files: a list of json files that comprise the api model.
+ # idl_schema_files: a list of IDL files that comprise the api model.
# cc_dir: path to generated files
# root_namespace: the C++ namespace that all generated files go under
# Functions and namespaces can be excluded by setting "nocompile" to true.
@@ -53,6 +54,7 @@
},
{
'rule_name': 'genapi_idl',
+ 'msvs_external_rule': 1,
'extension': 'idl',
'inputs': [
'<(api_gen_dir)/any.cc',
@@ -72,7 +74,7 @@
# TODO(calamity): uncomment this when gyp on windows behaves like other
# platforms. List expansions of filepaths in inputs expand to different
# things.
- # '<@(json_schema_files)',
+ # '<@(idl_schema_files)',
],
'outputs': [
'<(SHARED_INTERMEDIATE_DIR)/<(cc_dir)/<(RULE_INPUT_ROOT).cc',
diff --git a/chrome/browser/extensions/api/dns/dns_api.cc b/chrome/browser/extensions/api/dns/dns_api.cc
index 11a0537..6e845ea 100644
--- a/chrome/browser/extensions/api/dns/dns_api.cc
+++ b/chrome/browser/extensions/api/dns/dns_api.cc
@@ -22,9 +22,9 @@ namespace Resolve = extensions::api::experimental::Resolve;
namespace extensions {
// static
-net::HostResolver* DNSResolveFunction::host_resolver_for_testing;
+net::HostResolver* DnsResolveFunction::host_resolver_for_testing;
-DNSResolveFunction::DNSResolveFunction()
+DnsResolveFunction::DnsResolveFunction()
: response_(false),
io_thread_(g_browser_process->io_thread()),
capturing_bound_net_log_(new net::CapturingBoundNetLog(
@@ -33,16 +33,16 @@ DNSResolveFunction::DNSResolveFunction()
addresses_(new net::AddressList) {
}
-DNSResolveFunction::~DNSResolveFunction() {
+DnsResolveFunction::~DnsResolveFunction() {
}
// static
-void DNSResolveFunction::set_host_resolver_for_testing(
+void DnsResolveFunction::set_host_resolver_for_testing(
net::HostResolver* host_resolver_for_testing_param) {
host_resolver_for_testing = host_resolver_for_testing_param;
}
-bool DNSResolveFunction::RunImpl() {
+bool DnsResolveFunction::RunImpl() {
scoped_ptr<Resolve::Params> params(Resolve::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get());
@@ -50,12 +50,12 @@ bool DNSResolveFunction::RunImpl() {
bool result = BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
- base::Bind(&DNSResolveFunction::WorkOnIOThread, this));
+ base::Bind(&DnsResolveFunction::WorkOnIOThread, this));
DCHECK(result);
return true;
}
-void DNSResolveFunction::WorkOnIOThread() {
+void DnsResolveFunction::WorkOnIOThread() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
net::HostResolver* host_resolver = host_resolver_for_testing ?
@@ -71,7 +71,7 @@ void DNSResolveFunction::WorkOnIOThread() {
net::HostResolver::RequestInfo request_info(host_port_pair);
int resolve_result = host_resolver->Resolve(
request_info, addresses_.get(),
- base::Bind(&DNSResolveFunction::OnLookupFinished, this),
+ base::Bind(&DnsResolveFunction::OnLookupFinished, this),
request_handle_.get(), capturing_bound_net_log_->bound());
// Balanced in OnLookupFinished.
@@ -81,7 +81,7 @@ void DNSResolveFunction::WorkOnIOThread() {
OnLookupFinished(resolve_result);
}
-void DNSResolveFunction::OnLookupFinished(int resolve_result) {
+void DnsResolveFunction::OnLookupFinished(int resolve_result) {
scoped_ptr<ResolveCallbackResolveInfo> resolve_info(
new ResolveCallbackResolveInfo());
@@ -97,13 +97,13 @@ void DNSResolveFunction::OnLookupFinished(int resolve_result) {
bool post_task_result = BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
- base::Bind(&DNSResolveFunction::RespondOnUIThread, this));
+ base::Bind(&DnsResolveFunction::RespondOnUIThread, this));
DCHECK(post_task_result);
Release(); // Added in WorkOnIOThread().
}
-void DNSResolveFunction::RespondOnUIThread() {
+void DnsResolveFunction::RespondOnUIThread() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
SendResponse(response_);
}
diff --git a/chrome/browser/extensions/api/dns/dns_api.h b/chrome/browser/extensions/api/dns/dns_api.h
index 54a2002..113d995 100644
--- a/chrome/browser/extensions/api/dns/dns_api.h
+++ b/chrome/browser/extensions/api/dns/dns_api.h
@@ -19,10 +19,10 @@ class IOThread;
namespace extensions {
-class DNSResolveFunction : public AsyncExtensionFunction {
+class DnsResolveFunction : public AsyncExtensionFunction {
public:
- DNSResolveFunction();
- virtual ~DNSResolveFunction();
+ DnsResolveFunction();
+ virtual ~DnsResolveFunction();
virtual bool RunImpl() OVERRIDE;
diff --git a/chrome/browser/extensions/api/dns/dns_apitest.cc b/chrome/browser/extensions/api/dns/dns_apitest.cc
index 7657db2..508a9aa 100644
--- a/chrome/browser/extensions/api/dns/dns_apitest.cc
+++ b/chrome/browser/extensions/api/dns/dns_apitest.cc
@@ -21,12 +21,12 @@ using extension_function_test_utils::RunFunctionAndReturnResult;
namespace {
-class DNSApiTest : public ExtensionApiTest {
+class DnsApiTest : public ExtensionApiTest {
public:
static const std::string kHostname;
static const std::string kAddress;
- DNSApiTest() : resolver_event_(true, false),
+ DnsApiTest() : resolver_event_(true, false),
mock_host_resolver_(NULL) {
}
@@ -38,13 +38,13 @@ class DNSApiTest : public ExtensionApiTest {
virtual void SetUpOnMainThread() OVERRIDE {
CreateMockHostResolverOnIOThread();
- extensions::DNSResolveFunction::set_host_resolver_for_testing(
+ extensions::DnsResolveFunction::set_host_resolver_for_testing(
get_mock_host_resolver());
}
virtual void CleanUpOnMainThread() OVERRIDE {
if (mock_host_resolver_) {
- extensions::DNSResolveFunction::set_host_resolver_for_testing(NULL);
+ extensions::DnsResolveFunction::set_host_resolver_for_testing(NULL);
DeleteMockHostResolverOnIOThread();
}
}
@@ -52,7 +52,7 @@ class DNSApiTest : public ExtensionApiTest {
void CreateMockHostResolverOnIOThread() {
bool result = BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
- base::Bind(&DNSApiTest::FinishMockHostResolverCreation, this));
+ base::Bind(&DnsApiTest::FinishMockHostResolverCreation, this));
DCHECK(result);
base::TimeDelta max_time = base::TimeDelta::FromSeconds(5);
@@ -74,7 +74,7 @@ class DNSApiTest : public ExtensionApiTest {
resolver_event_.Reset();
bool result = BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
- base::Bind(&DNSApiTest::FinishMockHostResolverDeletion, this));
+ base::Bind(&DnsApiTest::FinishMockHostResolverDeletion, this));
DCHECK(result);
base::TimeDelta max_time = base::TimeDelta::FromSeconds(5);
@@ -100,14 +100,14 @@ class DNSApiTest : public ExtensionApiTest {
// Plain pointer because we have to manage lifetime manually.
net::MockHostResolver* mock_host_resolver_;
};
-const std::string DNSApiTest::kHostname = "www.sowbug.org";
-const std::string DNSApiTest::kAddress = "9.8.7.6";
+const std::string DnsApiTest::kHostname = "www.sowbug.org";
+const std::string DnsApiTest::kAddress = "9.8.7.6";
} // namespace
-IN_PROC_BROWSER_TEST_F(DNSApiTest, DNSResolveIPLiteral) {
- scoped_refptr<extensions::DNSResolveFunction> resolve_function(
- new extensions::DNSResolveFunction());
+IN_PROC_BROWSER_TEST_F(DnsApiTest, DnsResolveIPLiteral) {
+ scoped_refptr<extensions::DnsResolveFunction> resolve_function(
+ new extensions::DnsResolveFunction());
scoped_refptr<Extension> empty_extension(CreateEmptyExtension());
resolve_function->set_extension(empty_extension.get());
@@ -127,16 +127,16 @@ IN_PROC_BROWSER_TEST_F(DNSApiTest, DNSResolveIPLiteral) {
EXPECT_EQ("127.0.0.1", address);
}
-IN_PROC_BROWSER_TEST_F(DNSApiTest, DNSResolveHostname) {
- scoped_refptr<extensions::DNSResolveFunction> resolve_function(
- new extensions::DNSResolveFunction());
+IN_PROC_BROWSER_TEST_F(DnsApiTest, DnsResolveHostname) {
+ scoped_refptr<extensions::DnsResolveFunction> resolve_function(
+ new extensions::DnsResolveFunction());
scoped_refptr<Extension> empty_extension(CreateEmptyExtension());
resolve_function->set_extension(empty_extension.get());
resolve_function->set_has_callback(true);
std::string function_arguments("[\"");
- function_arguments += DNSApiTest::kHostname;
+ function_arguments += DnsApiTest::kHostname;
function_arguments += "\"]";
scoped_ptr<base::Value> result(
RunFunctionAndReturnResult(resolve_function.get(),
@@ -150,9 +150,9 @@ IN_PROC_BROWSER_TEST_F(DNSApiTest, DNSResolveHostname) {
std::string address;
EXPECT_TRUE(value->GetString("address", &address));
- EXPECT_EQ(DNSApiTest::kAddress, address);
+ EXPECT_EQ(DnsApiTest::kAddress, address);
}
-IN_PROC_BROWSER_TEST_F(DNSApiTest, DNSExtension) {
+IN_PROC_BROWSER_TEST_F(DnsApiTest, DnsExtension) {
ASSERT_TRUE(RunExtensionTest("dns/api")) << message_;
}
diff --git a/chrome/browser/extensions/extension_function_dispatcher.cc b/chrome/browser/extensions/extension_function_dispatcher.cc
index 7d04788..d1344be 100644
--- a/chrome/browser/extensions/extension_function_dispatcher.cc
+++ b/chrome/browser/extensions/extension_function_dispatcher.cc
@@ -8,64 +8,19 @@
#include "base/json/json_string_value_serializer.h"
#include "base/memory/ref_counted.h"
-#include "base/memory/singleton.h"
#include "base/process_util.h"
#include "base/values.h"
#include "build/build_config.h"
-#include "chrome/browser/accessibility/accessibility_extension_api.h"
-#include "chrome/browser/bookmarks/bookmark_extension_api.h"
-#include "chrome/browser/bookmarks/bookmark_manager_extension_api.h"
-#include "chrome/browser/download/download_extension_api.h"
-#include "chrome/browser/extensions/api/app/app_api.h"
-#include "chrome/browser/extensions/api/browsing_data/browsing_data_api.h"
-#include "chrome/browser/extensions/api/declarative/declarative_api.h"
-#include "chrome/browser/extensions/api/dns/dns_api.h"
-#include "chrome/browser/extensions/api/extension_action/extension_browser_actions_api.h"
-#include "chrome/browser/extensions/api/extension_action/extension_page_actions_api.h"
-#include "chrome/browser/extensions/api/permissions/permissions_api.h"
-#include "chrome/browser/extensions/api/serial/serial_api.h"
-#include "chrome/browser/extensions/api/socket/socket_api.h"
-#include "chrome/browser/extensions/api/web_request/web_request_api.h"
-#include "chrome/browser/extensions/execute_code_in_tab_function.h"
#include "chrome/browser/extensions/extension_activity_log.h"
-#include "chrome/browser/extensions/extension_chrome_auth_private_api.h"
-#include "chrome/browser/extensions/extension_content_settings_api.h"
-#include "chrome/browser/extensions/extension_context_menu_api.h"
-#include "chrome/browser/extensions/extension_cookies_api.h"
-#include "chrome/browser/extensions/extension_debugger_api.h"
-#include "chrome/browser/extensions/extension_font_settings_api.h"
#include "chrome/browser/extensions/extension_function.h"
-#include "chrome/browser/extensions/extension_i18n_api.h"
-#include "chrome/browser/extensions/extension_idle_api.h"
-#include "chrome/browser/extensions/extension_managed_mode_api.h"
-#include "chrome/browser/extensions/extension_management_api.h"
-#include "chrome/browser/extensions/extension_metrics_module.h"
-#include "chrome/browser/extensions/extension_module.h"
-#include "chrome/browser/extensions/extension_omnibox_api.h"
-#include "chrome/browser/extensions/extension_page_capture_api.h"
-#include "chrome/browser/extensions/extension_preference_api.h"
-#include "chrome/browser/extensions/extension_processes_api.h"
+#include "chrome/browser/extensions/extension_function_registry.h"
#include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_tabs_module.h"
-#include "chrome/browser/extensions/extension_test_api.h"
-#include "chrome/browser/extensions/extension_tts_api.h"
-#include "chrome/browser/extensions/extension_tts_engine_api.h"
-#include "chrome/browser/extensions/extension_web_socket_proxy_private_api.h"
#include "chrome/browser/extensions/extension_web_ui.h"
-#include "chrome/browser/extensions/extension_webnavigation_api.h"
-#include "chrome/browser/extensions/extension_webstore_private_api.h"
#include "chrome/browser/extensions/extensions_quota_service.h"
#include "chrome/browser/extensions/process_map.h"
-#include "chrome/browser/extensions/settings/settings_api.h"
-#include "chrome/browser/extensions/system/system_api.h"
#include "chrome/browser/external_protocol/external_protocol_handler.h"
-#include "chrome/browser/history/history_extension_api.h"
-#include "chrome/browser/history/top_sites_extension_api.h"
-#include "chrome/browser/infobars/infobar_extension_api.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/renderer_host/chrome_render_message_filter.h"
-#include "chrome/browser/rlz/rlz_extension_api.h"
-#include "chrome/browser/speech/speech_input_extension_api.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/common/extensions/api/extension_api.h"
@@ -78,490 +33,12 @@
#include "ipc/ipc_message_macros.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h"
#include "third_party/skia/include/core/SkBitmap.h"
-
-#if defined(TOOLKIT_VIEWS)
-#include "chrome/browser/extensions/extension_input_api.h"
-#endif
-
-#if defined(OS_CHROMEOS) && defined(USE_VIRTUAL_KEYBOARD)
-#include "chrome/browser/extensions/extension_input_ui_api.h"
-#endif
-
-#if defined(OS_CHROMEOS)
-#include "chrome/browser/chromeos/extensions/file_browser_private_api.h"
-#include "chrome/browser/chromeos/media/media_player_extension_api.h"
-#include "chrome/browser/extensions/api/terminal/terminal_private_api.h"
-#include "chrome/browser/extensions/extension_info_private_api_chromeos.h"
-#include "chrome/browser/extensions/extension_input_ime_api.h"
-#include "chrome/browser/extensions/extension_input_method_api.h"
-#endif
+#include "webkit/glue/resource_type.h"
using extensions::ExtensionAPI;
using content::RenderViewHost;
using WebKit::WebSecurityOrigin;
-// FactoryRegistry -------------------------------------------------------------
-
-namespace {
-
-// Template for defining ExtensionFunctionFactory.
-template<class T>
-ExtensionFunction* NewExtensionFunction() {
- return new T();
-}
-
-// Contains a list of all known extension functions and allows clients to
-// create instances of them.
-class FactoryRegistry {
- public:
- static FactoryRegistry* GetInstance();
- FactoryRegistry() { ResetFunctions(); }
-
- // Resets all functions to their default values.
- void ResetFunctions();
-
- // Adds all function names to 'names'.
- void GetAllNames(std::vector<std::string>* names);
-
- // Allows overriding of specific functions (e.g. for testing). Functions
- // must be previously registered. Returns true if successful.
- bool OverrideFunction(const std::string& name,
- ExtensionFunctionFactory factory);
-
- // Factory method for the ExtensionFunction registered as 'name'.
- ExtensionFunction* NewFunction(const std::string& name);
-
- private:
- template<class T>
- void RegisterFunction() {
- factories_[T::function_name()] = &NewExtensionFunction<T>;
- }
-
- typedef std::map<std::string, ExtensionFunctionFactory> FactoryMap;
- FactoryMap factories_;
-};
-
-FactoryRegistry* FactoryRegistry::GetInstance() {
- return Singleton<FactoryRegistry>::get();
-}
-
-void FactoryRegistry::ResetFunctions() {
- // Register all functions here.
-
- // Windows
- RegisterFunction<GetWindowFunction>();
- RegisterFunction<GetCurrentWindowFunction>();
- RegisterFunction<GetLastFocusedWindowFunction>();
- RegisterFunction<GetAllWindowsFunction>();
- RegisterFunction<CreateWindowFunction>();
- RegisterFunction<UpdateWindowFunction>();
- RegisterFunction<RemoveWindowFunction>();
-
- // Tabs
- RegisterFunction<GetTabFunction>();
- RegisterFunction<GetCurrentTabFunction>();
- RegisterFunction<GetSelectedTabFunction>();
- RegisterFunction<GetAllTabsInWindowFunction>();
- RegisterFunction<QueryTabsFunction>();
- RegisterFunction<HighlightTabsFunction>();
- RegisterFunction<CreateTabFunction>();
- RegisterFunction<UpdateTabFunction>();
- RegisterFunction<MoveTabsFunction>();
- RegisterFunction<ReloadTabFunction>();
- RegisterFunction<RemoveTabsFunction>();
- RegisterFunction<DetectTabLanguageFunction>();
- RegisterFunction<CaptureVisibleTabFunction>();
- RegisterFunction<TabsExecuteScriptFunction>();
- RegisterFunction<TabsInsertCSSFunction>();
-
- // Page Actions.
- RegisterFunction<EnablePageActionFunction>();
- RegisterFunction<DisablePageActionFunction>();
- RegisterFunction<PageActionShowFunction>();
- RegisterFunction<PageActionHideFunction>();
- RegisterFunction<PageActionSetIconFunction>();
- RegisterFunction<PageActionSetTitleFunction>();
- RegisterFunction<PageActionSetPopupFunction>();
- RegisterFunction<PageActionGetTitleFunction>();
- RegisterFunction<PageActionGetPopupFunction>();
-
- // Browser Actions.
- RegisterFunction<BrowserActionSetIconFunction>();
- RegisterFunction<BrowserActionSetTitleFunction>();
- RegisterFunction<BrowserActionSetBadgeTextFunction>();
- RegisterFunction<BrowserActionSetBadgeBackgroundColorFunction>();
- RegisterFunction<BrowserActionSetPopupFunction>();
- RegisterFunction<BrowserActionGetTitleFunction>();
- RegisterFunction<BrowserActionGetBadgeTextFunction>();
- RegisterFunction<BrowserActionGetBadgeBackgroundColorFunction>();
- RegisterFunction<BrowserActionGetPopupFunction>();
-
- // Browsing Data.
- RegisterFunction<RemoveBrowsingDataFunction>();
- RegisterFunction<RemoveAppCacheFunction>();
- RegisterFunction<RemoveCacheFunction>();
- RegisterFunction<RemoveCookiesFunction>();
- RegisterFunction<RemoveDownloadsFunction>();
- RegisterFunction<RemoveFileSystemsFunction>();
- RegisterFunction<RemoveFormDataFunction>();
- RegisterFunction<RemoveHistoryFunction>();
- RegisterFunction<RemoveIndexedDBFunction>();
- RegisterFunction<RemoveLocalStorageFunction>();
- RegisterFunction<RemoveOriginBoundCertsFunction>();
- RegisterFunction<RemovePluginDataFunction>();
- RegisterFunction<RemovePasswordsFunction>();
- RegisterFunction<RemoveWebSQLFunction>();
-
- // Bookmarks.
- RegisterFunction<GetBookmarksFunction>();
- RegisterFunction<GetBookmarkChildrenFunction>();
- RegisterFunction<GetBookmarkRecentFunction>();
- RegisterFunction<GetBookmarkTreeFunction>();
- RegisterFunction<GetBookmarkSubTreeFunction>();
- RegisterFunction<SearchBookmarksFunction>();
- RegisterFunction<RemoveBookmarkFunction>();
- RegisterFunction<RemoveTreeBookmarkFunction>();
- RegisterFunction<CreateBookmarkFunction>();
- RegisterFunction<MoveBookmarkFunction>();
- RegisterFunction<UpdateBookmarkFunction>();
-
- // Infobars.
- RegisterFunction<ShowInfoBarFunction>();
-
- // BookmarkManager
- RegisterFunction<CopyBookmarkManagerFunction>();
- RegisterFunction<CutBookmarkManagerFunction>();
- RegisterFunction<PasteBookmarkManagerFunction>();
- RegisterFunction<CanPasteBookmarkManagerFunction>();
- RegisterFunction<ImportBookmarksFunction>();
- RegisterFunction<ExportBookmarksFunction>();
- RegisterFunction<SortChildrenBookmarkManagerFunction>();
- RegisterFunction<BookmarkManagerGetStringsFunction>();
- RegisterFunction<StartDragBookmarkManagerFunction>();
- RegisterFunction<DropBookmarkManagerFunction>();
- RegisterFunction<GetSubtreeBookmarkManagerFunction>();
- RegisterFunction<CanEditBookmarkManagerFunction>();
-
- // History
- RegisterFunction<AddUrlHistoryFunction>();
- RegisterFunction<DeleteAllHistoryFunction>();
- RegisterFunction<DeleteRangeHistoryFunction>();
- RegisterFunction<DeleteUrlHistoryFunction>();
- RegisterFunction<GetVisitsHistoryFunction>();
- RegisterFunction<SearchHistoryFunction>();
-
- // Idle
- RegisterFunction<ExtensionIdleQueryStateFunction>();
-
- // I18N.
- RegisterFunction<GetAcceptLanguagesFunction>();
-
- // Processes.
- RegisterFunction<GetProcessIdForTabFunction>();
-
- // Metrics.
- RegisterFunction<MetricsRecordUserActionFunction>();
- RegisterFunction<MetricsRecordValueFunction>();
- RegisterFunction<MetricsRecordPercentageFunction>();
- RegisterFunction<MetricsRecordCountFunction>();
- RegisterFunction<MetricsRecordSmallCountFunction>();
- RegisterFunction<MetricsRecordMediumCountFunction>();
- RegisterFunction<MetricsRecordTimeFunction>();
- RegisterFunction<MetricsRecordMediumTimeFunction>();
- RegisterFunction<MetricsRecordLongTimeFunction>();
-
- // RLZ.
-#if defined(OS_WIN)
- RegisterFunction<RlzRecordProductEventFunction>();
- RegisterFunction<RlzGetAccessPointRlzFunction>();
- RegisterFunction<RlzSendFinancialPingFunction>();
- RegisterFunction<RlzClearProductStateFunction>();
-#endif
-
- // Cookies.
- RegisterFunction<GetCookieFunction>();
- RegisterFunction<GetAllCookiesFunction>();
- RegisterFunction<SetCookieFunction>();
- RegisterFunction<RemoveCookieFunction>();
- RegisterFunction<GetAllCookieStoresFunction>();
-
- // Test.
- RegisterFunction<ExtensionTestPassFunction>();
- RegisterFunction<ExtensionTestFailFunction>();
- RegisterFunction<ExtensionTestLogFunction>();
- RegisterFunction<ExtensionTestQuotaResetFunction>();
- RegisterFunction<ExtensionTestCreateIncognitoTabFunction>();
- RegisterFunction<ExtensionTestSendMessageFunction>();
- RegisterFunction<ExtensionTestGetConfigFunction>();
-
- // Accessibility.
- RegisterFunction<GetFocusedControlFunction>();
- RegisterFunction<SetAccessibilityEnabledFunction>();
- RegisterFunction<GetAlertsForTabFunction>();
-
- // Text-to-speech.
- RegisterFunction<ExtensionTtsEngineSendTtsEventFunction>();
- RegisterFunction<ExtensionTtsGetVoicesFunction>();
- RegisterFunction<ExtensionTtsIsSpeakingFunction>();
- RegisterFunction<ExtensionTtsSpeakFunction>();
- RegisterFunction<ExtensionTtsStopSpeakingFunction>();
-
- // Context Menus.
- RegisterFunction<CreateContextMenuFunction>();
- RegisterFunction<UpdateContextMenuFunction>();
- RegisterFunction<RemoveContextMenuFunction>();
- RegisterFunction<RemoveAllContextMenusFunction>();
-
- // Omnibox.
- RegisterFunction<OmniboxSendSuggestionsFunction>();
- RegisterFunction<OmniboxSetDefaultSuggestionFunction>();
-
- // Speech input.
- RegisterFunction<StartSpeechInputFunction>();
- RegisterFunction<StopSpeechInputFunction>();
- RegisterFunction<IsRecordingSpeechInputFunction>();
-
-#if defined(TOOLKIT_VIEWS)
- // Input.
- RegisterFunction<SendKeyboardEventInputFunction>();
-#endif
-
-#if defined(USE_VIRTUAL_KEYBOARD)
- RegisterFunction<HideKeyboardFunction>();
- RegisterFunction<SetKeyboardHeightFunction>();
-#endif
-
-#if defined(OS_CHROMEOS)
- // IME
- RegisterFunction<SetCompositionFunction>();
- RegisterFunction<ClearCompositionFunction>();
- RegisterFunction<CommitTextFunction>();
- RegisterFunction<SetCandidateWindowPropertiesFunction>();
- RegisterFunction<SetCandidatesFunction>();
- RegisterFunction<SetCursorPositionFunction>();
- RegisterFunction<SetMenuItemsFunction>();
- RegisterFunction<UpdateMenuItemsFunction>();
-
- RegisterFunction<InputEventHandled>();
-#if defined(USE_VIRTUAL_KEYBOARD)
- RegisterFunction<CandidateClickedInputUiFunction>();
- RegisterFunction<CursorUpInputUiFunction>();
- RegisterFunction<CursorDownInputUiFunction>();
- RegisterFunction<PageUpInputUiFunction>();
- RegisterFunction<PageDownInputUiFunction>();
- RegisterFunction<RegisterInputUiFunction>();
- RegisterFunction<PageUpInputUiFunction>();
- RegisterFunction<PageDownInputUiFunction>();
-#endif
-#endif
-
- // Managed mode.
- RegisterFunction<GetManagedModeFunction>();
- RegisterFunction<EnterManagedModeFunction>();
-
- // Management.
- RegisterFunction<GetAllExtensionsFunction>();
- RegisterFunction<GetExtensionByIdFunction>();
- RegisterFunction<GetPermissionWarningsByIdFunction>();
- RegisterFunction<GetPermissionWarningsByManifestFunction>();
- RegisterFunction<LaunchAppFunction>();
- RegisterFunction<SetEnabledFunction>();
- RegisterFunction<UninstallFunction>();
-
- // Extension module.
- RegisterFunction<SetUpdateUrlDataFunction>();
- RegisterFunction<IsAllowedIncognitoAccessFunction>();
- RegisterFunction<IsAllowedFileSchemeAccessFunction>();
-
- // WebstorePrivate.
- RegisterFunction<GetBrowserLoginFunction>();
- RegisterFunction<GetStoreLoginFunction>();
- RegisterFunction<SetStoreLoginFunction>();
- RegisterFunction<InstallBundleFunction>();
- RegisterFunction<BeginInstallWithManifestFunction>();
- RegisterFunction<CompleteInstallFunction>();
- RegisterFunction<SilentlyInstallFunction>();
- RegisterFunction<GetWebGLStatusFunction>();
-
- // WebNavigation.
- RegisterFunction<GetFrameFunction>();
- RegisterFunction<GetAllFramesFunction>();
-
- // WebRequest.
- RegisterFunction<WebRequestAddEventListener>();
- RegisterFunction<WebRequestEventHandled>();
- RegisterFunction<WebRequestHandlerBehaviorChanged>();
-
- // Preferences.
- RegisterFunction<GetPreferenceFunction>();
- RegisterFunction<SetPreferenceFunction>();
- RegisterFunction<ClearPreferenceFunction>();
-
- // ChromeOS-specific part of the API.
-#if defined(OS_CHROMEOS)
- // Device Customization.
- RegisterFunction<GetChromeosInfoFunction>();
-
- // FileBrowserPrivate functions.
- // TODO(jamescook): Expose these on non-ChromeOS platforms so we can use
- // the extension-based file picker on Aura. crbug.com/97424
- RegisterFunction<CancelFileDialogFunction>();
- RegisterFunction<ExecuteTasksFileBrowserFunction>();
- RegisterFunction<FileDialogStringsFunction>();
- RegisterFunction<GetFileTasksFileBrowserFunction>();
- RegisterFunction<GetVolumeMetadataFunction>();
- RegisterFunction<RequestLocalFileSystemFunction>();
- RegisterFunction<AddFileWatchBrowserFunction>();
- RegisterFunction<RemoveFileWatchBrowserFunction>();
- RegisterFunction<SelectFileFunction>();
- RegisterFunction<SelectFilesFunction>();
- RegisterFunction<AddMountFunction>();
- RegisterFunction<RemoveMountFunction>();
- RegisterFunction<GetMountPointsFunction>();
- RegisterFunction<GetSizeStatsFunction>();
- RegisterFunction<FormatDeviceFunction>();
- RegisterFunction<ViewFilesFunction>();
- RegisterFunction<ToggleFullscreenFunction>();
- RegisterFunction<IsFullscreenFunction>();
- RegisterFunction<GetGDataFilePropertiesFunction>();
- RegisterFunction<PinGDataFileFunction>();
- RegisterFunction<GetFileLocationsFunction>();
- RegisterFunction<GetGDataFilesFunction>();
-
- // Mediaplayer
- RegisterFunction<PlayMediaplayerFunction>();
- RegisterFunction<GetPlaylistMediaplayerFunction>();
- RegisterFunction<SetWindowHeightMediaplayerFunction>();
- RegisterFunction<CloseWindowMediaplayerFunction>();
-
- // InputMethod
- RegisterFunction<GetInputMethodFunction>();
-
- // Terminal
- RegisterFunction<OpenTerminalProcessFunction>();
- RegisterFunction<SendInputToTerminalProcessFunction>();
- RegisterFunction<CloseTerminalProcessFunction>();
- RegisterFunction<OnTerminalResizeFunction>();
-
-#if defined(USE_VIRTUAL_KEYBOARD)
- // Input
- RegisterFunction<SendHandwritingStrokeFunction>();
- RegisterFunction<CancelHandwritingStrokesFunction>();
-#endif
-#endif
-
- // Websocket to TCP proxy. Currently noop on anything other than ChromeOS.
- RegisterFunction<WebSocketProxyPrivateGetPassportForTCPFunction>();
- RegisterFunction<WebSocketProxyPrivateGetURLForTCPFunction>();
-
- // Debugger
- RegisterFunction<AttachDebuggerFunction>();
- RegisterFunction<DetachDebuggerFunction>();
- RegisterFunction<SendCommandDebuggerFunction>();
-
- // Settings
- RegisterFunction<extensions::GetSettingsFunction>();
- RegisterFunction<extensions::SetSettingsFunction>();
- RegisterFunction<extensions::RemoveSettingsFunction>();
- RegisterFunction<extensions::ClearSettingsFunction>();
- RegisterFunction<extensions::GetBytesInUseSettingsFunction>();
-
- // Content settings.
- RegisterFunction<GetResourceIdentifiersFunction>();
- RegisterFunction<ClearContentSettingsFunction>();
- RegisterFunction<GetContentSettingFunction>();
- RegisterFunction<SetContentSettingFunction>();
-
- // Font settings.
- RegisterFunction<GetFontListFunction>();
- RegisterFunction<GetFontNameFunction>();
- RegisterFunction<SetFontNameFunction>();
-
- // ChromeAuth settings.
- RegisterFunction<SetCloudPrintCredentialsFunction>();
-
- // Experimental App API.
- RegisterFunction<AppNotifyFunction>();
- RegisterFunction<AppClearAllNotificationsFunction>();
-
- // Permissions
- RegisterFunction<ContainsPermissionsFunction>();
- RegisterFunction<GetAllPermissionsFunction>();
- RegisterFunction<RemovePermissionsFunction>();
- RegisterFunction<RequestPermissionsFunction>();
-
- // Downloads
- RegisterFunction<DownloadsDownloadFunction>();
- RegisterFunction<DownloadsSearchFunction>();
- RegisterFunction<DownloadsPauseFunction>();
- RegisterFunction<DownloadsResumeFunction>();
- RegisterFunction<DownloadsCancelFunction>();
- RegisterFunction<DownloadsEraseFunction>();
- RegisterFunction<DownloadsSetDestinationFunction>();
- RegisterFunction<DownloadsAcceptDangerFunction>();
- RegisterFunction<DownloadsShowFunction>();
- RegisterFunction<DownloadsDragFunction>();
- RegisterFunction<DownloadsGetFileIconFunction>();
-
- // PageCapture
- RegisterFunction<PageCaptureSaveAsMHTMLFunction>();
-
- // TopSites
- RegisterFunction<GetTopSitesFunction>();
-
- // Serial
- RegisterFunction<extensions::SerialOpenFunction>();
- RegisterFunction<extensions::SerialCloseFunction>();
- RegisterFunction<extensions::SerialReadFunction>();
- RegisterFunction<extensions::SerialWriteFunction>();
-
- // Sockets
- RegisterFunction<extensions::SocketCreateFunction>();
- RegisterFunction<extensions::SocketDestroyFunction>();
- RegisterFunction<extensions::SocketConnectFunction>();
- RegisterFunction<extensions::SocketDisconnectFunction>();
- RegisterFunction<extensions::SocketReadFunction>();
- RegisterFunction<extensions::SocketWriteFunction>();
-
- // DNS
- RegisterFunction<extensions::DNSResolveFunction>();
-
- // System
- RegisterFunction<extensions::GetIncognitoModeAvailabilityFunction>();
- RegisterFunction<extensions::GetUpdateStatusFunction>();
-
- // Net
- RegisterFunction<extensions::AddRulesFunction>();
- RegisterFunction<extensions::RemoveRulesFunction>();
- RegisterFunction<extensions::GetRulesFunction>();
-}
-
-void FactoryRegistry::GetAllNames(std::vector<std::string>* names) {
- for (FactoryMap::iterator iter = factories_.begin();
- iter != factories_.end(); ++iter) {
- names->push_back(iter->first);
- }
-}
-
-bool FactoryRegistry::OverrideFunction(const std::string& name,
- ExtensionFunctionFactory factory) {
- FactoryMap::iterator iter = factories_.find(name);
- if (iter == factories_.end()) {
- return false;
- } else {
- iter->second = factory;
- return true;
- }
-}
-
-ExtensionFunction* FactoryRegistry::NewFunction(const std::string& name) {
- FactoryMap::iterator iter = factories_.find(name);
- DCHECK(iter != factories_.end());
- ExtensionFunction* function = iter->second();
- function->set_name(name);
- return function;
-}
-
const char kAccessDenied[] = "access denied";
const char kQuotaExceeded[] = "quota exceeded";
@@ -603,22 +80,19 @@ void LogFailure(const Extension* extension,
}
}
-}; // namespace
-
-// ExtensionFunctionDispatcher -------------------------------------------------
-
void ExtensionFunctionDispatcher::GetAllFunctionNames(
std::vector<std::string>* names) {
- FactoryRegistry::GetInstance()->GetAllNames(names);
+ ExtensionFunctionRegistry::GetInstance()->GetAllNames(names);
}
bool ExtensionFunctionDispatcher::OverrideFunction(
const std::string& name, ExtensionFunctionFactory factory) {
- return FactoryRegistry::GetInstance()->OverrideFunction(name, factory);
+ return ExtensionFunctionRegistry::GetInstance()->OverrideFunction(name,
+ factory);
}
void ExtensionFunctionDispatcher::ResetFunctions() {
- FactoryRegistry::GetInstance()->ResetFunctions();
+ ExtensionFunctionRegistry::GetInstance()->ResetFunctions();
}
// static
@@ -794,7 +268,7 @@ ExtensionFunction* ExtensionFunctionDispatcher::CreateExtensionFunction(
}
ExtensionFunction* function =
- FactoryRegistry::GetInstance()->NewFunction(params.name);
+ ExtensionFunctionRegistry::GetInstance()->NewFunction(params.name);
function->SetArgs(&params.arguments);
function->set_source_url(params.source_url);
function->set_request_id(params.request_id);
diff --git a/chrome/browser/extensions/extension_function_registry.cc b/chrome/browser/extensions/extension_function_registry.cc
new file mode 100644
index 0000000..99d525c
--- /dev/null
+++ b/chrome/browser/extensions/extension_function_registry.cc
@@ -0,0 +1,499 @@
+// Copyright (c) 2012 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_registry.h"
+
+#include "chrome/browser/accessibility/accessibility_extension_api.h"
+#include "chrome/browser/bookmarks/bookmark_extension_api.h"
+#include "chrome/browser/bookmarks/bookmark_manager_extension_api.h"
+#include "chrome/browser/download/download_extension_api.h"
+#include "chrome/browser/extensions/api/app/app_api.h"
+#include "chrome/browser/extensions/api/browsing_data/browsing_data_api.h"
+#include "chrome/browser/extensions/api/declarative/declarative_api.h"
+#include "chrome/browser/extensions/api/extension_action/extension_browser_actions_api.h"
+#include "chrome/browser/extensions/api/extension_action/extension_page_actions_api.h"
+#include "chrome/browser/extensions/api/permissions/permissions_api.h"
+#include "chrome/browser/extensions/api/serial/serial_api.h"
+#include "chrome/browser/extensions/api/socket/socket_api.h"
+#include "chrome/browser/extensions/api/web_request/web_request_api.h"
+#include "chrome/browser/extensions/execute_code_in_tab_function.h"
+#include "chrome/browser/extensions/extension_chrome_auth_private_api.h"
+#include "chrome/browser/extensions/extension_content_settings_api.h"
+#include "chrome/browser/extensions/extension_context_menu_api.h"
+#include "chrome/browser/extensions/extension_cookies_api.h"
+#include "chrome/browser/extensions/extension_debugger_api.h"
+#include "chrome/browser/extensions/extension_font_settings_api.h"
+#include "chrome/browser/extensions/extension_i18n_api.h"
+#include "chrome/browser/extensions/extension_idle_api.h"
+#include "chrome/browser/extensions/extension_managed_mode_api.h"
+#include "chrome/browser/extensions/extension_management_api.h"
+#include "chrome/browser/extensions/extension_metrics_module.h"
+#include "chrome/browser/extensions/extension_module.h"
+#include "chrome/browser/extensions/extension_omnibox_api.h"
+#include "chrome/browser/extensions/extension_page_capture_api.h"
+#include "chrome/browser/extensions/extension_preference_api.h"
+#include "chrome/browser/extensions/extension_processes_api.h"
+#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/extensions/extension_test_api.h"
+#include "chrome/browser/extensions/extension_tts_api.h"
+#include "chrome/browser/extensions/extension_tts_engine_api.h"
+#include "chrome/browser/extensions/extension_web_socket_proxy_private_api.h"
+#include "chrome/browser/extensions/extension_webnavigation_api.h"
+#include "chrome/browser/extensions/extension_webstore_private_api.h"
+#include "chrome/browser/extensions/settings/settings_api.h"
+#include "chrome/browser/extensions/system/system_api.h"
+#include "chrome/browser/history/history_extension_api.h"
+#include "chrome/browser/history/top_sites_extension_api.h"
+#include "chrome/browser/infobars/infobar_extension_api.h"
+#include "chrome/browser/rlz/rlz_extension_api.h"
+#include "chrome/browser/speech/speech_input_extension_api.h"
+#include "chrome/common/extensions/api/generated_api.h"
+
+#if defined(TOOLKIT_VIEWS)
+#include "chrome/browser/extensions/extension_input_api.h"
+#endif
+
+#if defined(OS_CHROMEOS) && defined(USE_VIRTUAL_KEYBOARD)
+#include "chrome/browser/extensions/extension_input_ui_api.h"
+#endif
+
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/extensions/file_browser_private_api.h"
+#include "chrome/browser/chromeos/media/media_player_extension_api.h"
+#include "chrome/browser/extensions/api/terminal/terminal_private_api.h"
+#include "chrome/browser/extensions/extension_info_private_api_chromeos.h"
+#include "chrome/browser/extensions/extension_input_ime_api.h"
+#include "chrome/browser/extensions/extension_input_method_api.h"
+#endif
+
+// static
+ExtensionFunctionRegistry* ExtensionFunctionRegistry::GetInstance() {
+ return Singleton<ExtensionFunctionRegistry>::get();
+}
+
+ExtensionFunctionRegistry::ExtensionFunctionRegistry() {
+ ResetFunctions();
+}
+
+ExtensionFunctionRegistry::~ExtensionFunctionRegistry() {
+}
+
+void ExtensionFunctionRegistry::ResetFunctions() {
+ // Register all functions here.
+
+ // Windows
+ RegisterFunction<GetWindowFunction>();
+ RegisterFunction<GetCurrentWindowFunction>();
+ RegisterFunction<GetLastFocusedWindowFunction>();
+ RegisterFunction<GetAllWindowsFunction>();
+ RegisterFunction<CreateWindowFunction>();
+ RegisterFunction<UpdateWindowFunction>();
+ RegisterFunction<RemoveWindowFunction>();
+
+ // Tabs
+ RegisterFunction<GetTabFunction>();
+ RegisterFunction<GetCurrentTabFunction>();
+ RegisterFunction<GetSelectedTabFunction>();
+ RegisterFunction<GetAllTabsInWindowFunction>();
+ RegisterFunction<QueryTabsFunction>();
+ RegisterFunction<HighlightTabsFunction>();
+ RegisterFunction<CreateTabFunction>();
+ RegisterFunction<UpdateTabFunction>();
+ RegisterFunction<MoveTabsFunction>();
+ RegisterFunction<ReloadTabFunction>();
+ RegisterFunction<RemoveTabsFunction>();
+ RegisterFunction<DetectTabLanguageFunction>();
+ RegisterFunction<CaptureVisibleTabFunction>();
+ RegisterFunction<TabsExecuteScriptFunction>();
+ RegisterFunction<TabsInsertCSSFunction>();
+
+ // Page Actions.
+ RegisterFunction<EnablePageActionFunction>();
+ RegisterFunction<DisablePageActionFunction>();
+ RegisterFunction<PageActionShowFunction>();
+ RegisterFunction<PageActionHideFunction>();
+ RegisterFunction<PageActionSetIconFunction>();
+ RegisterFunction<PageActionSetTitleFunction>();
+ RegisterFunction<PageActionSetPopupFunction>();
+ RegisterFunction<PageActionGetTitleFunction>();
+ RegisterFunction<PageActionGetPopupFunction>();
+
+ // Browser Actions.
+ RegisterFunction<BrowserActionSetIconFunction>();
+ RegisterFunction<BrowserActionSetTitleFunction>();
+ RegisterFunction<BrowserActionSetBadgeTextFunction>();
+ RegisterFunction<BrowserActionSetBadgeBackgroundColorFunction>();
+ RegisterFunction<BrowserActionSetPopupFunction>();
+ RegisterFunction<BrowserActionGetTitleFunction>();
+ RegisterFunction<BrowserActionGetBadgeTextFunction>();
+ RegisterFunction<BrowserActionGetBadgeBackgroundColorFunction>();
+ RegisterFunction<BrowserActionGetPopupFunction>();
+
+ // Browsing Data.
+ RegisterFunction<RemoveBrowsingDataFunction>();
+ RegisterFunction<RemoveAppCacheFunction>();
+ RegisterFunction<RemoveCacheFunction>();
+ RegisterFunction<RemoveCookiesFunction>();
+ RegisterFunction<RemoveDownloadsFunction>();
+ RegisterFunction<RemoveFileSystemsFunction>();
+ RegisterFunction<RemoveFormDataFunction>();
+ RegisterFunction<RemoveHistoryFunction>();
+ RegisterFunction<RemoveIndexedDBFunction>();
+ RegisterFunction<RemoveLocalStorageFunction>();
+ RegisterFunction<RemoveOriginBoundCertsFunction>();
+ RegisterFunction<RemovePluginDataFunction>();
+ RegisterFunction<RemovePasswordsFunction>();
+ RegisterFunction<RemoveWebSQLFunction>();
+
+ // Bookmarks.
+ RegisterFunction<GetBookmarksFunction>();
+ RegisterFunction<GetBookmarkChildrenFunction>();
+ RegisterFunction<GetBookmarkRecentFunction>();
+ RegisterFunction<GetBookmarkTreeFunction>();
+ RegisterFunction<GetBookmarkSubTreeFunction>();
+ RegisterFunction<SearchBookmarksFunction>();
+ RegisterFunction<RemoveBookmarkFunction>();
+ RegisterFunction<RemoveTreeBookmarkFunction>();
+ RegisterFunction<CreateBookmarkFunction>();
+ RegisterFunction<MoveBookmarkFunction>();
+ RegisterFunction<UpdateBookmarkFunction>();
+
+ // Infobars.
+ RegisterFunction<ShowInfoBarFunction>();
+
+ // BookmarkManager
+ RegisterFunction<CopyBookmarkManagerFunction>();
+ RegisterFunction<CutBookmarkManagerFunction>();
+ RegisterFunction<PasteBookmarkManagerFunction>();
+ RegisterFunction<CanPasteBookmarkManagerFunction>();
+ RegisterFunction<ImportBookmarksFunction>();
+ RegisterFunction<ExportBookmarksFunction>();
+ RegisterFunction<SortChildrenBookmarkManagerFunction>();
+ RegisterFunction<BookmarkManagerGetStringsFunction>();
+ RegisterFunction<StartDragBookmarkManagerFunction>();
+ RegisterFunction<DropBookmarkManagerFunction>();
+ RegisterFunction<GetSubtreeBookmarkManagerFunction>();
+ RegisterFunction<CanEditBookmarkManagerFunction>();
+
+ // History
+ RegisterFunction<AddUrlHistoryFunction>();
+ RegisterFunction<DeleteAllHistoryFunction>();
+ RegisterFunction<DeleteRangeHistoryFunction>();
+ RegisterFunction<DeleteUrlHistoryFunction>();
+ RegisterFunction<GetVisitsHistoryFunction>();
+ RegisterFunction<SearchHistoryFunction>();
+
+ // Idle
+ RegisterFunction<ExtensionIdleQueryStateFunction>();
+
+ // I18N.
+ RegisterFunction<GetAcceptLanguagesFunction>();
+
+ // Processes.
+ RegisterFunction<GetProcessIdForTabFunction>();
+
+ // Metrics.
+ RegisterFunction<MetricsRecordUserActionFunction>();
+ RegisterFunction<MetricsRecordValueFunction>();
+ RegisterFunction<MetricsRecordPercentageFunction>();
+ RegisterFunction<MetricsRecordCountFunction>();
+ RegisterFunction<MetricsRecordSmallCountFunction>();
+ RegisterFunction<MetricsRecordMediumCountFunction>();
+ RegisterFunction<MetricsRecordTimeFunction>();
+ RegisterFunction<MetricsRecordMediumTimeFunction>();
+ RegisterFunction<MetricsRecordLongTimeFunction>();
+
+ // RLZ.
+#if defined(OS_WIN)
+ RegisterFunction<RlzRecordProductEventFunction>();
+ RegisterFunction<RlzGetAccessPointRlzFunction>();
+ RegisterFunction<RlzSendFinancialPingFunction>();
+ RegisterFunction<RlzClearProductStateFunction>();
+#endif
+
+ // Cookies.
+ RegisterFunction<GetCookieFunction>();
+ RegisterFunction<GetAllCookiesFunction>();
+ RegisterFunction<SetCookieFunction>();
+ RegisterFunction<RemoveCookieFunction>();
+ RegisterFunction<GetAllCookieStoresFunction>();
+
+ // Test.
+ RegisterFunction<ExtensionTestPassFunction>();
+ RegisterFunction<ExtensionTestFailFunction>();
+ RegisterFunction<ExtensionTestLogFunction>();
+ RegisterFunction<ExtensionTestQuotaResetFunction>();
+ RegisterFunction<ExtensionTestCreateIncognitoTabFunction>();
+ RegisterFunction<ExtensionTestSendMessageFunction>();
+ RegisterFunction<ExtensionTestGetConfigFunction>();
+
+ // Accessibility.
+ RegisterFunction<GetFocusedControlFunction>();
+ RegisterFunction<SetAccessibilityEnabledFunction>();
+ RegisterFunction<GetAlertsForTabFunction>();
+
+ // Text-to-speech.
+ RegisterFunction<ExtensionTtsEngineSendTtsEventFunction>();
+ RegisterFunction<ExtensionTtsGetVoicesFunction>();
+ RegisterFunction<ExtensionTtsIsSpeakingFunction>();
+ RegisterFunction<ExtensionTtsSpeakFunction>();
+ RegisterFunction<ExtensionTtsStopSpeakingFunction>();
+
+ // Context Menus.
+ RegisterFunction<CreateContextMenuFunction>();
+ RegisterFunction<UpdateContextMenuFunction>();
+ RegisterFunction<RemoveContextMenuFunction>();
+ RegisterFunction<RemoveAllContextMenusFunction>();
+
+ // Omnibox.
+ RegisterFunction<OmniboxSendSuggestionsFunction>();
+ RegisterFunction<OmniboxSetDefaultSuggestionFunction>();
+
+ // Speech input.
+ RegisterFunction<StartSpeechInputFunction>();
+ RegisterFunction<StopSpeechInputFunction>();
+ RegisterFunction<IsRecordingSpeechInputFunction>();
+
+#if defined(TOOLKIT_VIEWS)
+ // Input.
+ RegisterFunction<SendKeyboardEventInputFunction>();
+#endif
+
+#if defined(USE_VIRTUAL_KEYBOARD)
+ RegisterFunction<HideKeyboardFunction>();
+ RegisterFunction<SetKeyboardHeightFunction>();
+#endif
+
+#if defined(OS_CHROMEOS)
+ // IME
+ RegisterFunction<SetCompositionFunction>();
+ RegisterFunction<ClearCompositionFunction>();
+ RegisterFunction<CommitTextFunction>();
+ RegisterFunction<SetCandidateWindowPropertiesFunction>();
+ RegisterFunction<SetCandidatesFunction>();
+ RegisterFunction<SetCursorPositionFunction>();
+ RegisterFunction<SetMenuItemsFunction>();
+ RegisterFunction<UpdateMenuItemsFunction>();
+
+ RegisterFunction<InputEventHandled>();
+#if defined(USE_VIRTUAL_KEYBOARD)
+ RegisterFunction<CandidateClickedInputUiFunction>();
+ RegisterFunction<CursorUpInputUiFunction>();
+ RegisterFunction<CursorDownInputUiFunction>();
+ RegisterFunction<PageUpInputUiFunction>();
+ RegisterFunction<PageDownInputUiFunction>();
+ RegisterFunction<RegisterInputUiFunction>();
+ RegisterFunction<PageUpInputUiFunction>();
+ RegisterFunction<PageDownInputUiFunction>();
+#endif
+#endif
+
+ // Managed mode.
+ RegisterFunction<GetManagedModeFunction>();
+ RegisterFunction<EnterManagedModeFunction>();
+
+ // Management.
+ RegisterFunction<GetAllExtensionsFunction>();
+ RegisterFunction<GetExtensionByIdFunction>();
+ RegisterFunction<GetPermissionWarningsByIdFunction>();
+ RegisterFunction<GetPermissionWarningsByManifestFunction>();
+ RegisterFunction<LaunchAppFunction>();
+ RegisterFunction<SetEnabledFunction>();
+ RegisterFunction<UninstallFunction>();
+
+ // Extension module.
+ RegisterFunction<SetUpdateUrlDataFunction>();
+ RegisterFunction<IsAllowedIncognitoAccessFunction>();
+ RegisterFunction<IsAllowedFileSchemeAccessFunction>();
+
+ // WebstorePrivate.
+ RegisterFunction<GetBrowserLoginFunction>();
+ RegisterFunction<GetStoreLoginFunction>();
+ RegisterFunction<SetStoreLoginFunction>();
+ RegisterFunction<InstallBundleFunction>();
+ RegisterFunction<BeginInstallWithManifestFunction>();
+ RegisterFunction<CompleteInstallFunction>();
+ RegisterFunction<SilentlyInstallFunction>();
+ RegisterFunction<GetWebGLStatusFunction>();
+
+ // WebNavigation.
+ RegisterFunction<GetFrameFunction>();
+ RegisterFunction<GetAllFramesFunction>();
+
+ // WebRequest.
+ RegisterFunction<WebRequestAddEventListener>();
+ RegisterFunction<WebRequestEventHandled>();
+ RegisterFunction<WebRequestHandlerBehaviorChanged>();
+
+ // Preferences.
+ RegisterFunction<GetPreferenceFunction>();
+ RegisterFunction<SetPreferenceFunction>();
+ RegisterFunction<ClearPreferenceFunction>();
+
+ // ChromeOS-specific part of the API.
+#if defined(OS_CHROMEOS)
+ // Device Customization.
+ RegisterFunction<GetChromeosInfoFunction>();
+
+ // FileBrowserPrivate functions.
+ // TODO(jamescook): Expose these on non-ChromeOS platforms so we can use
+ // the extension-based file picker on Aura. crbug.com/97424
+ RegisterFunction<CancelFileDialogFunction>();
+ RegisterFunction<ExecuteTasksFileBrowserFunction>();
+ RegisterFunction<FileDialogStringsFunction>();
+ RegisterFunction<GetFileTasksFileBrowserFunction>();
+ RegisterFunction<GetVolumeMetadataFunction>();
+ RegisterFunction<RequestLocalFileSystemFunction>();
+ RegisterFunction<AddFileWatchBrowserFunction>();
+ RegisterFunction<RemoveFileWatchBrowserFunction>();
+ RegisterFunction<SelectFileFunction>();
+ RegisterFunction<SelectFilesFunction>();
+ RegisterFunction<AddMountFunction>();
+ RegisterFunction<RemoveMountFunction>();
+ RegisterFunction<GetMountPointsFunction>();
+ RegisterFunction<GetSizeStatsFunction>();
+ RegisterFunction<FormatDeviceFunction>();
+ RegisterFunction<ViewFilesFunction>();
+ RegisterFunction<ToggleFullscreenFunction>();
+ RegisterFunction<IsFullscreenFunction>();
+ RegisterFunction<GetGDataFilePropertiesFunction>();
+ RegisterFunction<PinGDataFileFunction>();
+ RegisterFunction<GetFileLocationsFunction>();
+ RegisterFunction<GetGDataFilesFunction>();
+
+ // Mediaplayer
+ RegisterFunction<PlayMediaplayerFunction>();
+ RegisterFunction<GetPlaylistMediaplayerFunction>();
+ RegisterFunction<SetWindowHeightMediaplayerFunction>();
+ RegisterFunction<CloseWindowMediaplayerFunction>();
+
+ // InputMethod
+ RegisterFunction<GetInputMethodFunction>();
+
+ // Terminal
+ RegisterFunction<OpenTerminalProcessFunction>();
+ RegisterFunction<SendInputToTerminalProcessFunction>();
+ RegisterFunction<CloseTerminalProcessFunction>();
+ RegisterFunction<OnTerminalResizeFunction>();
+
+#if defined(USE_VIRTUAL_KEYBOARD)
+ // Input
+ RegisterFunction<SendHandwritingStrokeFunction>();
+ RegisterFunction<CancelHandwritingStrokesFunction>();
+#endif
+#endif
+
+ // Websocket to TCP proxy. Currently noop on anything other than ChromeOS.
+ RegisterFunction<WebSocketProxyPrivateGetPassportForTCPFunction>();
+ RegisterFunction<WebSocketProxyPrivateGetURLForTCPFunction>();
+
+ // Debugger
+ RegisterFunction<AttachDebuggerFunction>();
+ RegisterFunction<DetachDebuggerFunction>();
+ RegisterFunction<SendCommandDebuggerFunction>();
+
+ // Settings
+ RegisterFunction<extensions::GetSettingsFunction>();
+ RegisterFunction<extensions::SetSettingsFunction>();
+ RegisterFunction<extensions::RemoveSettingsFunction>();
+ RegisterFunction<extensions::ClearSettingsFunction>();
+ RegisterFunction<extensions::GetBytesInUseSettingsFunction>();
+
+ // Content settings.
+ RegisterFunction<GetResourceIdentifiersFunction>();
+ RegisterFunction<ClearContentSettingsFunction>();
+ RegisterFunction<GetContentSettingFunction>();
+ RegisterFunction<SetContentSettingFunction>();
+
+ // Font settings.
+ RegisterFunction<GetFontListFunction>();
+ RegisterFunction<GetFontNameFunction>();
+ RegisterFunction<SetFontNameFunction>();
+
+ // ChromeAuth settings.
+ RegisterFunction<SetCloudPrintCredentialsFunction>();
+
+ // Experimental App API.
+ RegisterFunction<AppNotifyFunction>();
+ RegisterFunction<AppClearAllNotificationsFunction>();
+
+ // Permissions
+ RegisterFunction<ContainsPermissionsFunction>();
+ RegisterFunction<GetAllPermissionsFunction>();
+ RegisterFunction<RemovePermissionsFunction>();
+ RegisterFunction<RequestPermissionsFunction>();
+
+ // Downloads
+ RegisterFunction<DownloadsDownloadFunction>();
+ RegisterFunction<DownloadsSearchFunction>();
+ RegisterFunction<DownloadsPauseFunction>();
+ RegisterFunction<DownloadsResumeFunction>();
+ RegisterFunction<DownloadsCancelFunction>();
+ RegisterFunction<DownloadsEraseFunction>();
+ RegisterFunction<DownloadsSetDestinationFunction>();
+ RegisterFunction<DownloadsAcceptDangerFunction>();
+ RegisterFunction<DownloadsShowFunction>();
+ RegisterFunction<DownloadsDragFunction>();
+ RegisterFunction<DownloadsGetFileIconFunction>();
+
+ // PageCapture
+ RegisterFunction<PageCaptureSaveAsMHTMLFunction>();
+
+ // TopSites
+ RegisterFunction<GetTopSitesFunction>();
+
+ // Serial
+ RegisterFunction<extensions::SerialOpenFunction>();
+ RegisterFunction<extensions::SerialCloseFunction>();
+ RegisterFunction<extensions::SerialReadFunction>();
+ RegisterFunction<extensions::SerialWriteFunction>();
+
+ // Sockets
+ RegisterFunction<extensions::SocketCreateFunction>();
+ RegisterFunction<extensions::SocketDestroyFunction>();
+ RegisterFunction<extensions::SocketConnectFunction>();
+ RegisterFunction<extensions::SocketDisconnectFunction>();
+ RegisterFunction<extensions::SocketReadFunction>();
+ RegisterFunction<extensions::SocketWriteFunction>();
+
+ // System
+ RegisterFunction<extensions::GetIncognitoModeAvailabilityFunction>();
+ RegisterFunction<extensions::GetUpdateStatusFunction>();
+
+ // Net
+ RegisterFunction<extensions::AddRulesFunction>();
+ RegisterFunction<extensions::RemoveRulesFunction>();
+ RegisterFunction<extensions::GetRulesFunction>();
+
+ // Generated APIs
+ extensions::api::GeneratedFunctionRegistry::RegisterAll(this);
+}
+
+void ExtensionFunctionRegistry::GetAllNames(std::vector<std::string>* names) {
+ for (FactoryMap::iterator iter = factories_.begin();
+ iter != factories_.end(); ++iter) {
+ names->push_back(iter->first);
+ }
+}
+
+bool ExtensionFunctionRegistry::OverrideFunction(
+ const std::string& name,
+ ExtensionFunctionFactory factory) {
+ FactoryMap::iterator iter = factories_.find(name);
+ if (iter == factories_.end()) {
+ return false;
+ } else {
+ iter->second = factory;
+ return true;
+ }
+}
+
+ExtensionFunction* ExtensionFunctionRegistry::NewFunction(
+ const std::string& name) {
+ FactoryMap::iterator iter = factories_.find(name);
+ DCHECK(iter != factories_.end());
+ ExtensionFunction* function = iter->second();
+ function->set_name(name);
+ return function;
+}
diff --git a/chrome/browser/extensions/extension_function_registry.h b/chrome/browser/extensions/extension_function_registry.h
new file mode 100644
index 0000000..9ad83ec
--- /dev/null
+++ b/chrome/browser/extensions/extension_function_registry.h
@@ -0,0 +1,56 @@
+// Copyright (c) 2012 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_FUNCTION_REGISTRY_H_
+#define CHROME_BROWSER_EXTENSIONS_EXTENSION_FUNCTION_REGISTRY_H_
+#pragma once
+
+#include <map>
+#include <string>
+#include <vector>
+
+class ExtensionFunction;
+
+// A factory function for creating new ExtensionFunction instances.
+typedef ExtensionFunction* (*ExtensionFunctionFactory)();
+
+// Template for defining ExtensionFunctionFactory.
+template<class T>
+ExtensionFunction* NewExtensionFunction() {
+ return new T();
+}
+
+// Contains a list of all known extension functions and allows clients to
+// create instances of them.
+class ExtensionFunctionRegistry {
+ public:
+ static ExtensionFunctionRegistry* GetInstance();
+ explicit ExtensionFunctionRegistry();
+ virtual ~ExtensionFunctionRegistry();
+
+ // Resets all functions to their default values.
+ void ResetFunctions();
+
+ // Adds all function names to 'names'.
+ void GetAllNames(std::vector<std::string>* names);
+
+ // Allows overriding of specific functions (e.g. for testing). Functions
+ // must be previously registered. Returns true if successful.
+ bool OverrideFunction(const std::string& name,
+ ExtensionFunctionFactory factory);
+
+ // Factory method for the ExtensionFunction registered as 'name'.
+ ExtensionFunction* NewFunction(const std::string& name);
+
+ template<class T>
+ void RegisterFunction() {
+ factories_[T::function_name()] = &NewExtensionFunction<T>;
+ }
+
+ private:
+ typedef std::map<std::string, ExtensionFunctionFactory> FactoryMap;
+ FactoryMap factories_;
+};
+
+#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_FUNCTION_REGISTRY_H_
diff --git a/chrome/chrome_browser_extensions.gypi b/chrome/chrome_browser_extensions.gypi
index 2a21f41..817119d 100644
--- a/chrome/chrome_browser_extensions.gypi
+++ b/chrome/chrome_browser_extensions.gypi
@@ -217,6 +217,8 @@
'browser/extensions/extension_function.h',
'browser/extensions/extension_function_dispatcher.cc',
'browser/extensions/extension_function_dispatcher.h',
+ 'browser/extensions/extension_function_registry.cc',
+ 'browser/extensions/extension_function_registry.h',
'browser/extensions/extension_global_error.cc',
'browser/extensions/extension_global_error.h',
'browser/extensions/extension_global_error_badge.cc',
diff --git a/chrome/chrome_common.gypi b/chrome/chrome_common.gypi
index b6d5e87..5e9ac64 100644
--- a/chrome/chrome_common.gypi
+++ b/chrome/chrome_common.gypi
@@ -38,6 +38,7 @@
'<(DEPTH)/chrome/chrome_resources.gyp:chrome_resources',
'<(DEPTH)/chrome/chrome_resources.gyp:chrome_strings',
'<(DEPTH)/chrome/chrome_resources.gyp:theme_resources',
+ '<(DEPTH)/chrome/common/extensions/api/api.gyp:api',
'<(DEPTH)/content/content.gyp:content_common',
'<(DEPTH)/ipc/ipc.gyp:ipc',
'<(DEPTH)/net/net.gyp:net',
@@ -257,6 +258,9 @@
'common/zip_internal.h',
'common/zip_reader.cc',
'common/zip_reader.h',
+
+ # Generated by the api.gyp:api target
+ '<(SHARED_INTERMEDIATE_DIR)/chrome/common/extensions/api/generated_api.h'
],
'conditions': [
['OS=="android"', {
diff --git a/chrome/common/extensions/api/api.gyp b/chrome/common/extensions/api/api.gyp
index 9c9d36c..4aa8af4 100644
--- a/chrome/common/extensions/api/api.gyp
+++ b/chrome/common/extensions/api/api.gyp
@@ -8,10 +8,13 @@
'target_name': 'api',
'type': 'static_library',
'sources': [
- '<@(json_schema_files)',
'<@(idl_schema_files)',
+ '<@(json_schema_files)',
+ ],
+ 'includes': [
+ '../../../../build/json_schema_bundle_compile.gypi',
+ '../../../../build/json_schema_compile.gypi',
],
- 'includes': ['../../../../build/json_schema_compile.gypi'],
'variables': {
'chromium_code': 1,
'json_schema_files': [
diff --git a/tools/json_schema_compiler/compiler.py b/tools/json_schema_compiler/compiler.py
index f782f72..bd9805d 100644
--- a/tools/json_schema_compiler/compiler.py
+++ b/tools/json_schema_compiler/compiler.py
@@ -18,6 +18,7 @@ Usage example:
import cc_generator
import cpp_type_generator
+import h_bundle_generator
import h_generator
import idl_schema
import json_schema
@@ -26,30 +27,9 @@ import optparse
import os.path
import sys
-if __name__ == '__main__':
- parser = optparse.OptionParser(
- description='Generates a C++ model of an API from JSON schema',
- usage='usage: %prog [option]... schema')
- parser.add_option('-r', '--root', default='.',
- help='logical include root directory. Path to schema files from specified'
- 'dir will be the include path.')
- parser.add_option('-d', '--destdir',
- help='root directory to output generated files.')
- parser.add_option('-n', '--namespace', default='generated_api_schemas',
- help='C++ namespace for generated files. e.g extensions::api.')
-
- (opts, args) = parser.parse_args()
- if not args:
- sys.exit(parser.get_usage())
- dest_dir = opts.destdir
- root_namespace = opts.namespace
-
- schema = os.path.normpath(args[0])
-
- api_model = model.Model()
-
- # Actually generate for source file.
+def load_schema(schema):
schema_filename, schema_extension = os.path.splitext(schema)
+
if schema_extension == '.json':
api_defs = json_schema.Load(schema)
elif schema_extension == '.idl':
@@ -58,6 +38,15 @@ if __name__ == '__main__':
sys.exit("Did not recognize file extension %s for schema %s" %
(schema_extension, schema))
+ return api_defs
+
+def handle_single_schema(filename, dest_dir, root, root_namespace):
+ schema = os.path.normpath(filename)
+ schema_filename, schema_extension = os.path.splitext(schema)
+ api_defs = load_schema(schema)
+
+ api_model = model.Model()
+
for target_namespace in api_defs:
referenced_schemas = target_namespace.get('dependencies', [])
# Load type dependencies into the model.
@@ -110,3 +99,63 @@ if __name__ == '__main__':
print '%s.cc' % out_file
print
print cc_code
+
+def handle_bundle_schema(filenames, dest_dir, root, root_namespace):
+ # Merge the source files into a single list of schemas.
+ api_defs = []
+ for filename in filenames:
+ schema = os.path.normpath(filename)
+ schema_filename, schema_extension = os.path.splitext(schema)
+ api_defs.extend(load_schema(schema))
+
+ api_model = model.Model()
+ relpath = os.path.relpath(os.path.normpath(filenames[0]), root)
+ for target_namespace in api_defs:
+ api_model.AddNamespace(target_namespace, relpath)
+
+ type_generator = cpp_type_generator.CppTypeGenerator(root_namespace)
+ for referenced_namespace in api_model.namespaces.values():
+ type_generator.AddNamespace(
+ referenced_namespace,
+ referenced_namespace.unix_name)
+
+ generator = h_bundle_generator.HBundleGenerator(api_model, type_generator)
+ h_bundle_code = generator.Generate().Render()
+
+ out_file = 'generated_api'
+ if dest_dir:
+ with open(
+ os.path.join(dest_dir, 'chrome/common/extensions/api/generated_api.h'),
+ 'w') as h_file:
+ h_file.write(h_bundle_code)
+ else:
+ print '%s.h' % out_file
+ print
+ print h_bundle_code
+
+if __name__ == '__main__':
+ parser = optparse.OptionParser(
+ description='Generates a C++ model of an API from JSON schema',
+ usage='usage: %prog [option]... schema')
+ parser.add_option('-r', '--root', default='.',
+ help='logical include root directory. Path to schema files from specified'
+ 'dir will be the include path.')
+ parser.add_option('-d', '--destdir',
+ help='root directory to output generated files.')
+ parser.add_option('-n', '--namespace', default='generated_api_schemas',
+ help='C++ namespace for generated files. e.g extensions::api.')
+ parser.add_option('-b', '--bundle', action="store_true", help=
+'''if supplied, causes compiler to generate bundle files for the given set of
+source files.''')
+
+ (opts, args) = parser.parse_args()
+
+ if not args:
+ sys.exit(0) # This is OK as a no-op
+ dest_dir = opts.destdir
+ root_namespace = opts.namespace
+
+ if opts.bundle:
+ handle_bundle_schema(args, dest_dir, opts.root, root_namespace)
+ else:
+ handle_single_schema(args[0], dest_dir, opts.root, root_namespace)
diff --git a/tools/json_schema_compiler/cpp_type_generator.py b/tools/json_schema_compiler/cpp_type_generator.py
index 44e7b59..482819c 100644
--- a/tools/json_schema_compiler/cpp_type_generator.py
+++ b/tools/json_schema_compiler/cpp_type_generator.py
@@ -11,16 +11,17 @@ class CppTypeGenerator(object):
"""Manages the types of properties and provides utilities for getting the
C++ type out of a model.Property
"""
- def __init__(self, root_namespace, namespace, cpp_namespace):
+ def __init__(self, root_namespace, namespace=None, cpp_namespace=None):
"""Creates a cpp_type_generator. The given root_namespace should be of the
format extensions::api::sub. The generator will generate code suitable for
use in the given namespace.
"""
self._type_namespaces = {}
- self._namespace = namespace
self._root_namespace = root_namespace.split('::')
self._cpp_namespaces = {}
- self.AddNamespace(namespace, cpp_namespace)
+ if namespace and cpp_namespace:
+ self._namespace = namespace
+ self.AddNamespace(namespace, cpp_namespace)
def AddNamespace(self, namespace, cpp_namespace):
"""Maps a model.Namespace to its C++ namespace name. All mappings are
diff --git a/tools/json_schema_compiler/cpp_util.py b/tools/json_schema_compiler/cpp_util.py
index 3b65f5d..0886826 100644
--- a/tools/json_schema_compiler/cpp_util.py
+++ b/tools/json_schema_compiler/cpp_util.py
@@ -6,6 +6,7 @@
from datetime import datetime
from model import PropertyType
+import os
CHROMIUM_LICENSE = (
"""// Copyright (c) %d The Chromium Authors. All rights reserved.
@@ -16,6 +17,10 @@ GENERATED_FILE_MESSAGE = """// GENERATED FROM THE API DEFINITION IN
// %s
// DO NOT EDIT.
"""
+GENERATED_BUNDLE_FILE_MESSAGE = """// GENERATED FROM THE API DEFINITIONS IN
+// %s
+// DO NOT EDIT.
+"""
def Classname(s):
"""Translates a namespace name or function name into something more
@@ -67,3 +72,11 @@ def GetParameterDeclaration(param, type_):
'type': type_,
'name': param.unix_name,
}
+
+def GenerateIfndefName(path, filename):
+ """Formats a path and filename as a #define name.
+
+ e.g chrome/extensions/gen, file.h becomes CHROME_EXTENSIONS_GEN_FILE_H__.
+ """
+ return (('%s_%s_H__' % (path, filename))
+ .upper().replace(os.sep, '_').replace('/', '_'))
diff --git a/tools/json_schema_compiler/h_bundle_generator.py b/tools/json_schema_compiler/h_bundle_generator.py
new file mode 100644
index 0000000..5aa22d4
--- /dev/null
+++ b/tools/json_schema_compiler/h_bundle_generator.py
@@ -0,0 +1,79 @@
+# Copyright (c) 2012 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.
+
+from model import PropertyType
+import code
+import cpp_util
+import model
+
+SOURCE_BASE_PATH = 'chrome/common/extensions/api'
+
+class HBundleGenerator(object):
+ """A .h generator for namespace bundle functionality.
+ """
+ def __init__(self, model, cpp_type_generator):
+ self._cpp_type_generator = cpp_type_generator
+ self._model = model
+
+ def Generate(self):
+ """Generates a code.Code object with the .h for a bundle.
+ """
+ c = code.Code()
+ (c.Append(cpp_util.CHROMIUM_LICENSE)
+ .Append()
+ .Append(cpp_util.GENERATED_BUNDLE_FILE_MESSAGE % SOURCE_BASE_PATH)
+ .Append()
+ )
+
+ ifndef_name = cpp_util.GenerateIfndefName(SOURCE_BASE_PATH,
+ 'generated_api')
+ (c.Append('#ifndef %s' % ifndef_name)
+ .Append('#define %s' % ifndef_name)
+ .Append('#pragma once')
+ .Append()
+ .Append('#include <string>')
+ .Append()
+ .Append('#include "base/basictypes.h"'))
+
+ for namespace in self._model.namespaces.values():
+ namespace_name = namespace.name.replace(
+ "experimental.", "")
+ c.Append('#include "chrome/browser/extensions/api/%s/%s_api.h"' % (
+ namespace_name, namespace_name))
+
+ (c.Append()
+ .Append("class ExtensionFunctionRegistry;")
+ .Append())
+
+ c.Concat(self._cpp_type_generator.GetRootNamespaceStart())
+
+ for namespace in self._model.namespaces.values():
+ c.Append("// TODO(miket): emit code for %s" % (namespace.unix_name))
+ c.Append()
+
+ c.Concat(self.GenerateFunctionRegistry())
+
+ (c.Concat(self._cpp_type_generator.GetRootNamespaceEnd())
+ .Append()
+ .Append('#endif // %s' % ifndef_name)
+ .Append()
+ )
+ return c
+
+ def GenerateFunctionRegistry(self):
+ c = code.Code()
+ c.Sblock("class GeneratedFunctionRegistry {")
+ c.Append("public:")
+ c.Sblock("static void RegisterAll(ExtensionFunctionRegistry* registry) {")
+ for namespace in self._model.namespaces.values():
+ for function in namespace.functions.values():
+ namespace_name = namespace.name.replace(
+ "experimental.", "").capitalize()
+ function_name = namespace_name + function.name.capitalize()
+ c.Append("registry->RegisterFunction<%sFunction>();" % (
+ function_name))
+ c.Eblock("}")
+ c.Eblock("};")
+ c.Append()
+ return c
diff --git a/tools/json_schema_compiler/h_generator.py b/tools/json_schema_compiler/h_generator.py
index 3c97bc6..dfc99cb 100644
--- a/tools/json_schema_compiler/h_generator.py
+++ b/tools/json_schema_compiler/h_generator.py
@@ -27,7 +27,8 @@ class HGenerator(object):
.Append()
)
- ifndef_name = self._GenerateIfndefName()
+ ifndef_name = cpp_util.GenerateIfndefName(self._namespace.source_file_dir,
+ self._target_namespace)
(c.Append('#ifndef %s' % ifndef_name)
.Append('#define %s' % ifndef_name)
.Append('#pragma once')
@@ -263,13 +264,3 @@ class HGenerator(object):
c.Eblock('};')
return c
-
- def _GenerateIfndefName(self):
- """Formats a path and filename as a #define name.
-
- e.g chrome/extensions/gen, file.h becomes CHROME_EXTENSIONS_GEN_FILE_H__.
- """
- return (('%s_%s_H__' %
- (self._namespace.source_file_dir, self._target_namespace))
- .upper().replace(os.sep, '_'))
-
diff --git a/tools/json_schema_compiler/test/json_schema_compiler_tests.gyp b/tools/json_schema_compiler/test/json_schema_compiler_tests.gyp
index 58e50b7..0310014 100644
--- a/tools/json_schema_compiler/test/json_schema_compiler_tests.gyp
+++ b/tools/json_schema_compiler/test/json_schema_compiler_tests.gyp
@@ -20,11 +20,14 @@
'objects.json',
'simple_api.json',
],
+ 'idl_schema_files': [
+ ],
'cc_dir': 'tools/json_schema_compiler/test',
'root_namespace': 'test::api',
},
'sources': [
'<@(json_schema_files)',
+ '<@(idl_schema_files)',
],
'includes': ['../../../build/json_schema_compile.gypi'],
},