summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkalman@chromium.org <kalman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-06 02:51:29 +0000
committerkalman@chromium.org <kalman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-06 02:51:29 +0000
commitf8d87d3aa72e8a5575c921ed7764c7478f7d54d2 (patch)
tree2158cd4d3f8149078bc92ca64ef52d62da43efbc
parent5075fa32f9d9995c8a086be8e40cecf22dad694a (diff)
downloadchromium_src-f8d87d3aa72e8a5575c921ed7764c7478f7d54d2.zip
chromium_src-f8d87d3aa72e8a5575c921ed7764c7478f7d54d2.tar.gz
chromium_src-f8d87d3aa72e8a5575c921ed7764c7478f7d54d2.tar.bz2
Delete chromeHidden! This involves (a) moving all the remaining modules
exported on chromeHidden into module system exports (notably Event and JSONSchemaValidator) and (b) moving all of the local state stored on chromeHidden into local variables. TBR=koz@chromium.org BUG=55316, 244205 Review URL: https://codereview.chromium.org/16256026 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@204396 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/chrome_renderer.gypi2
-rw-r--r--chrome/common/extensions/api/extension.json20
-rw-r--r--chrome/common/extensions/api/extension_api_stub.cc5
-rw-r--r--chrome/renderer/extensions/chrome_v8_context.cc25
-rw-r--r--chrome/renderer/extensions/chrome_v8_context.h18
-rw-r--r--chrome/renderer/extensions/dispatcher.cc147
-rw-r--r--chrome/renderer/extensions/dispatcher.h3
-rw-r--r--chrome/renderer/extensions/event_unittest.cc74
-rw-r--r--chrome/renderer/extensions/json_schema_unittest.cc65
-rw-r--r--chrome/renderer/extensions/logging_native_handler.cc100
-rw-r--r--chrome/renderer/extensions/logging_native_handler.h55
-rw-r--r--chrome/renderer/extensions/miscellaneous_bindings.h9
-rw-r--r--chrome/renderer/extensions/v8_schema_registry.cc37
-rw-r--r--chrome/renderer/extensions/v8_schema_registry.h5
-rw-r--r--chrome/renderer/resources/extensions/ad_view.js1
-rw-r--r--chrome/renderer/resources/extensions/app_runtime_custom_bindings.js4
-rw-r--r--chrome/renderer/resources/extensions/app_window_custom_bindings.js53
-rw-r--r--chrome/renderer/resources/extensions/binding.js26
-rw-r--r--chrome/renderer/resources/extensions/bluetooth_custom_bindings.js63
-rw-r--r--chrome/renderer/resources/extensions/chrome_setting.js5
-rw-r--r--chrome/renderer/resources/extensions/context_menus_custom_bindings.js51
-rw-r--r--chrome/renderer/resources/extensions/declarative_webrequest_custom_bindings.js1
-rw-r--r--chrome/renderer/resources/extensions/downloads_custom_bindings.js4
-rw-r--r--chrome/renderer/resources/extensions/event.js83
-rw-r--r--chrome/renderer/resources/extensions/extension_custom_bindings.js2
-rw-r--r--chrome/renderer/resources/extensions/file_browser_handler_custom_bindings.js5
-rw-r--r--chrome/renderer/resources/extensions/i18n_custom_bindings.js2
-rw-r--r--chrome/renderer/resources/extensions/input.ime_custom_bindings.js6
-rw-r--r--chrome/renderer/resources/extensions/json_schema.js61
-rw-r--r--chrome/renderer/resources/extensions/miscellaneous_bindings.js11
-rw-r--r--chrome/renderer/resources/extensions/omnibox_custom_bindings.js4
-rw-r--r--chrome/renderer/resources/extensions/page_actions_custom_bindings.js6
-rw-r--r--chrome/renderer/resources/extensions/permissions_custom_bindings.js3
-rw-r--r--chrome/renderer/resources/extensions/schema_utils.js67
-rw-r--r--chrome/renderer/resources/extensions/send_request.js1
-rw-r--r--chrome/renderer/resources/extensions/sync_file_system_custom_bindings.js4
-rw-r--r--chrome/renderer/resources/extensions/system_indicator_custom_bindings.js1
-rw-r--r--chrome/renderer/resources/extensions/tts_custom_bindings.js13
-rw-r--r--chrome/renderer/resources/extensions/tts_engine_custom_bindings.js4
-rw-r--r--chrome/renderer/resources/extensions/utils.js9
-rw-r--r--chrome/renderer/resources/extensions/web_request_custom_bindings.js14
-rw-r--r--chrome/renderer/resources/extensions/web_view.js1
-rw-r--r--chrome/test/base/module_system_test.cc18
-rw-r--r--chrome/test/base/module_system_test.h7
-rw-r--r--chrome/test/data/extensions/json_schema_test.js106
45 files changed, 613 insertions, 588 deletions
diff --git a/chrome/chrome_renderer.gypi b/chrome/chrome_renderer.gypi
index ff61033..509201b 100644
--- a/chrome/chrome_renderer.gypi
+++ b/chrome/chrome_renderer.gypi
@@ -95,6 +95,8 @@
'renderer/extensions/file_system_natives.h',
'renderer/extensions/i18n_custom_bindings.cc',
'renderer/extensions/i18n_custom_bindings.h',
+ 'renderer/extensions/logging_native_handler.cc',
+ 'renderer/extensions/logging_native_handler.h',
'renderer/extensions/media_galleries_custom_bindings.cc',
'renderer/extensions/media_galleries_custom_bindings.h',
'renderer/extensions/miscellaneous_bindings.cc',
diff --git a/chrome/common/extensions/api/extension.json b/chrome/common/extensions/api/extension.json
index a6844d2..7f79475 100644
--- a/chrome/common/extensions/api/extension.json
+++ b/chrome/common/extensions/api/extension.json
@@ -108,7 +108,12 @@
"returns": {
"type": "array",
"description": "Array of global objects",
- "items": { "type": "object", "isInstanceOf": "global", "additionalProperties": { "type": "any" } }
+ "items": {
+ "name": "viewGlobals",
+ "type": "object",
+ "isInstanceOf": "global",
+ "additionalProperties": { "type": "any" }
+ }
}
},
{
@@ -118,7 +123,11 @@
"description": "Returns the JavaScript 'window' object for the background page running inside the current extension. Returns null if the extension has no background page.",
"parameters": [],
"returns": {
- "type": "object", "isInstanceOf": "global", "additionalProperties": { "type": "any" }
+ "type": "object",
+ "optional": true,
+ "name": "backgroundPageGlobal",
+ "isInstanceOf": "global",
+ "additionalProperties": { "type": "any" }
}
},
{
@@ -134,7 +143,12 @@
"returns": {
"type": "array",
"description": "Array of global window objects",
- "items": { "type": "object", "isInstanceOf": "global", "additionalProperties": { "type": "any" } }
+ "items": {
+ "type": "object",
+ "name": "tabGlobals",
+ "isInstanceOf": "global",
+ "additionalProperties": { "type": "any" }
+ }
}
},
{
diff --git a/chrome/common/extensions/api/extension_api_stub.cc b/chrome/common/extensions/api/extension_api_stub.cc
index 759c33e..e739801 100644
--- a/chrome/common/extensions/api/extension_api_stub.cc
+++ b/chrome/common/extensions/api/extension_api_stub.cc
@@ -23,4 +23,9 @@ bool ExtensionAPI::IsPrivileged(const std::string& full_name) {
return false;
}
+const base::DictionaryValue* ExtensionAPI::GetSchema(
+ const std::string& full_name) {
+ return NULL;
+}
+
} // namespace extensions
diff --git a/chrome/renderer/extensions/chrome_v8_context.cc b/chrome/renderer/extensions/chrome_v8_context.cc
index 20687c7..c95a420 100644
--- a/chrome/renderer/extensions/chrome_v8_context.cc
+++ b/chrome/renderer/extensions/chrome_v8_context.cc
@@ -26,10 +26,6 @@ using content::V8ValueConverter;
namespace extensions {
-namespace {
-const char kChromeHidden[] = "chromeHidden";
-} // namespace
-
ChromeV8Context::ChromeV8Context(v8::Handle<v8::Context> v8_context,
WebKit::WebFrame* web_frame,
const Extension* extension,
@@ -63,27 +59,6 @@ std::string ChromeV8Context::GetExtensionID() {
return extension_.get() ? extension_->id() : std::string();
}
-// static
-v8::Handle<v8::Value> ChromeV8Context::GetOrCreateChromeHidden(
- v8::Handle<v8::Context> context) {
- v8::Local<v8::Object> global = context->Global();
- v8::Local<v8::Value> hidden = global->GetHiddenValue(
- v8::String::New(kChromeHidden));
-
- if (hidden.IsEmpty() || hidden->IsUndefined()) {
- hidden = v8::Object::New();
- global->SetHiddenValue(v8::String::New(kChromeHidden), hidden);
- }
-
- DCHECK(hidden->IsObject());
- return v8::Local<v8::Object>::Cast(hidden);
-}
-
-v8::Handle<v8::Value> ChromeV8Context::GetChromeHidden() const {
- v8::Local<v8::Object> global = v8_context_->Global();
- return global->GetHiddenValue(v8::String::New(kChromeHidden));
-}
-
content::RenderView* ChromeV8Context::GetRenderView() const {
if (web_frame_ && web_frame_->view())
return content::RenderView::FromWebView(web_frame_->view());
diff --git a/chrome/renderer/extensions/chrome_v8_context.h b/chrome/renderer/extensions/chrome_v8_context.h
index ac4b845..55b8d59 100644
--- a/chrome/renderer/extensions/chrome_v8_context.h
+++ b/chrome/renderer/extensions/chrome_v8_context.h
@@ -27,10 +27,6 @@ namespace extensions {
class Extension;
// Chrome's wrapper for a v8 context.
-//
-// TODO(aa): Consider converting this back to a set of bindings_utils. It would
-// require adding WebFrame::GetIsolatedWorldIdByV8Context() to WebCore, but then
-// we won't need this object and it's a bit less state to keep track of.
class ChromeV8Context : public RequestSender::Source {
public:
ChromeV8Context(v8::Handle<v8::Context> context,
@@ -69,18 +65,6 @@ class ChromeV8Context : public RequestSender::Source {
// string if there is no such extension.
std::string GetExtensionID();
- // Returns a special Chrome-specific hidden object that is associated with a
- // context, but not reachable from the JavaScript in that context. This is
- // used by our v8::Extension implementations as a way to share code and as a
- // bridge between C++ and JavaScript.
- static v8::Handle<v8::Value> GetOrCreateChromeHidden(
- v8::Handle<v8::Context> context);
-
- // Return the chromeHidden object associated with this context, or an empty
- // handle if no chrome hidden has been created (by GetOrCreateChromeHidden)
- // yet for this context.
- v8::Handle<v8::Value> GetChromeHidden() const;
-
// Returns the RenderView associated with this context. Can return NULL if the
// context is in the process of being destroyed.
content::RenderView* GetRenderView() const;
@@ -93,7 +77,7 @@ class ChromeV8Context : public RequestSender::Source {
int argc,
v8::Handle<v8::Value> argv[]) const;
- // Fires the onunload event on the chromeHidden object.
+ // Fires the onunload event on the unload_event module.
void DispatchOnUnloadEvent();
// Returns the availability of the API |api_name|.
diff --git a/chrome/renderer/extensions/dispatcher.cc b/chrome/renderer/extensions/dispatcher.cc
index 095c786..0de79aa 100644
--- a/chrome/renderer/extensions/dispatcher.cc
+++ b/chrome/renderer/extensions/dispatcher.cc
@@ -46,6 +46,7 @@
#include "chrome/renderer/extensions/file_browser_private_custom_bindings.h"
#include "chrome/renderer/extensions/file_system_natives.h"
#include "chrome/renderer/extensions/i18n_custom_bindings.h"
+#include "chrome/renderer/extensions/logging_native_handler.h"
#include "chrome/renderer/extensions/media_galleries_custom_bindings.h"
#include "chrome/renderer/extensions/miscellaneous_bindings.h"
#include "chrome/renderer/extensions/module_system.h"
@@ -138,25 +139,6 @@ class TestFeaturesNativeHandler : public ObjectBackedNativeHandler {
}
};
-class SchemaRegistryNativeHandler : public ObjectBackedNativeHandler {
- public:
- SchemaRegistryNativeHandler(V8SchemaRegistry* registry,
- ChromeV8Context* context)
- : ObjectBackedNativeHandler(context),
- registry_(registry) {
- RouteFunction("GetSchema",
- base::Bind(&SchemaRegistryNativeHandler::GetSchema,
- base::Unretained(this)));
- }
-
- private:
- v8::Handle<v8::Value> GetSchema(const v8::Arguments& args) {
- return registry_->GetSchema(*v8::String::AsciiValue(args[0]));
- }
-
- V8SchemaRegistry* registry_;
-};
-
class V8ContextNativeHandler : public ObjectBackedNativeHandler {
public:
V8ContextNativeHandler(ChromeV8Context* context, Dispatcher* dispatcher)
@@ -199,20 +181,6 @@ class V8ContextNativeHandler : public ObjectBackedNativeHandler {
Dispatcher* dispatcher_;
};
-class ChromeHiddenNativeHandler : public ObjectBackedNativeHandler {
- public:
- explicit ChromeHiddenNativeHandler(ChromeV8Context* context)
- : ObjectBackedNativeHandler(context) {
- RouteFunction("GetChromeHidden",
- base::Bind(&ChromeHiddenNativeHandler::GetChromeHidden,
- base::Unretained(this)));
- }
-
- v8::Handle<v8::Value> GetChromeHidden(const v8::Arguments& args) {
- return ChromeV8Context::GetOrCreateChromeHidden(context()->v8_context());
- }
-};
-
class ChromeNativeHandler : public ObjectBackedNativeHandler {
public:
explicit ChromeNativeHandler(ChromeV8Context* context)
@@ -360,86 +328,14 @@ class ProcessInfoNativeHandler : public ChromeV8Extension {
bool send_request_disabled_;
};
-class LoggingNativeHandler : public ObjectBackedNativeHandler {
- public:
- explicit LoggingNativeHandler(ChromeV8Context* context)
- : ObjectBackedNativeHandler(context) {
- RouteFunction("DCHECK",
- base::Bind(&LoggingNativeHandler::Dcheck, base::Unretained(this)));
- RouteFunction("CHECK",
- base::Bind(&LoggingNativeHandler::Check, base::Unretained(this)));
- RouteFunction("DCHECK_IS_ON",
- base::Bind(&LoggingNativeHandler::DcheckIsOn, base::Unretained(this)));
- }
-
- v8::Handle<v8::Value> Check(const v8::Arguments& args) {
- bool check_value;
- std::string error_message;
- ParseArgs(args, &check_value, &error_message);
- CHECK(check_value) << error_message;
- return v8::Undefined();
- }
-
- v8::Handle<v8::Value> Dcheck(const v8::Arguments& args) {
- bool check_value;
- std::string error_message;
- ParseArgs(args, &check_value, &error_message);
- DCHECK(check_value) << error_message;
- return v8::Undefined();
- }
-
- v8::Handle<v8::Value> DcheckIsOn(const v8::Arguments& args) {
- return v8::Boolean::New(DCHECK_IS_ON());
- }
-
- private:
- void ParseArgs(const v8::Arguments& args,
- bool* check_value,
- std::string* error_message) {
- CHECK_LE(args.Length(), 2);
- *check_value = args[0]->BooleanValue();
- if (args.Length() == 2)
- *error_message = "Error: " + std::string(
- *v8::String::AsciiValue(args[1]));
-
- v8::Handle<v8::StackTrace> stack_trace =
- v8::StackTrace::CurrentStackTrace(10);
- if (stack_trace.IsEmpty() || stack_trace->GetFrameCount() <= 0) {
- *error_message += "\n <no stack trace>";
- } else {
- for (size_t i = 0; i < (size_t) stack_trace->GetFrameCount(); ++i) {
- v8::Handle<v8::StackFrame> frame = stack_trace->GetFrame(i);
- CHECK(!frame.IsEmpty());
- *error_message += base::StringPrintf("\n at %s (%s:%d:%d)",
- ToStringOrDefault(frame->GetFunctionName(), "<anonymous>").c_str(),
- ToStringOrDefault(frame->GetScriptName(), "<anonymous>").c_str(),
- frame->GetLineNumber(),
- frame->GetColumn());
- }
- }
- }
-
- std::string ToStringOrDefault(const v8::Handle<v8::String>& v8_string,
- const std::string& dflt) {
- if (v8_string.IsEmpty())
- return dflt;
- std::string ascii_value = *v8::String::AsciiValue(v8_string);
- return ascii_value.empty() ? dflt : ascii_value;
- }
-};
-
void InstallAppBindings(ModuleSystem* module_system,
- v8::Handle<v8::Object> chrome,
- v8::Handle<v8::Object> chrome_hidden) {
+ v8::Handle<v8::Object> chrome) {
module_system->SetLazyField(chrome, "app", "app", "chromeApp");
}
void InstallWebstoreBindings(ModuleSystem* module_system,
- v8::Handle<v8::Object> chrome,
- v8::Handle<v8::Object> chrome_hidden) {
+ v8::Handle<v8::Object> chrome) {
module_system->SetLazyField(chrome, "webstore", "webstore", "chromeWebstore");
- module_system->SetLazyField(chrome_hidden, "webstore", "webstore",
- "chromeHiddenWebstore");
}
// Calls a method |method_name| in a module |module_name| belonging to the
@@ -787,11 +683,12 @@ void Dispatcher::RegisterSchemaGeneratedBindings(
}
}
+// NOTE: please use the naming convention "foo_natives" for these.
void Dispatcher::RegisterNativeHandlers(ModuleSystem* module_system,
ChromeV8Context* context) {
- module_system->RegisterNativeHandler("event_bindings",
+ module_system->RegisterNativeHandler("event_natives",
scoped_ptr<NativeHandler>(EventBindings::Create(this, context)));
- module_system->RegisterNativeHandler("miscellaneous_bindings",
+ module_system->RegisterNativeHandler("miscellaneous_bindings_natives",
scoped_ptr<NativeHandler>(MiscellaneousBindings::Get(this, context)));
module_system->RegisterNativeHandler("apiDefinitions",
scoped_ptr<NativeHandler>(new ApiDefinitionsNatives(this, context)));
@@ -817,7 +714,7 @@ void Dispatcher::RegisterNativeHandlers(ModuleSystem* module_system,
module_system->RegisterNativeHandler("app_runtime",
scoped_ptr<NativeHandler>(
new AppRuntimeCustomBindings(this, context)));
- module_system->RegisterNativeHandler("app_window",
+ module_system->RegisterNativeHandler("app_window_natives",
scoped_ptr<NativeHandler>(
new AppWindowCustomBindings(this, context)));
module_system->RegisterNativeHandler("context_menus",
@@ -861,23 +758,22 @@ void Dispatcher::RegisterNativeHandlers(ModuleSystem* module_system,
}
void Dispatcher::PopulateSourceMap() {
- source_map_.RegisterSource("event_bindings", IDR_EVENT_BINDINGS_JS);
- source_map_.RegisterSource("miscellaneous_bindings",
- IDR_MISCELLANEOUS_BINDINGS_JS);
- source_map_.RegisterSource("json", IDR_JSON_JS);
- source_map_.RegisterSource("json_schema", IDR_JSON_SCHEMA_JS);
- source_map_.RegisterSource("test", IDR_TEST_CUSTOM_BINDINGS_JS);
-
// Libraries.
source_map_.RegisterSource("contentWatcher", IDR_CONTENT_WATCHER_JS);
+ source_map_.RegisterSource("entryIdManager", IDR_ENTRY_ID_MANAGER);
+ source_map_.RegisterSource(kEventModule, IDR_EVENT_BINDINGS_JS);
source_map_.RegisterSource("imageUtil", IDR_IMAGE_UTIL_JS);
+ source_map_.RegisterSource("json", IDR_JSON_JS);
+ source_map_.RegisterSource("json_schema", IDR_JSON_SCHEMA_JS);
source_map_.RegisterSource("lastError", IDR_LAST_ERROR_JS);
+ source_map_.RegisterSource("miscellaneous_bindings",
+ IDR_MISCELLANEOUS_BINDINGS_JS);
source_map_.RegisterSource("schemaUtils", IDR_SCHEMA_UTILS_JS);
source_map_.RegisterSource("sendRequest", IDR_SEND_REQUEST_JS);
source_map_.RegisterSource("setIcon", IDR_SET_ICON_JS);
+ source_map_.RegisterSource("test", IDR_TEST_CUSTOM_BINDINGS_JS);
source_map_.RegisterSource("unload_event", IDR_UNLOAD_EVENT_JS);
source_map_.RegisterSource("utils", IDR_UTILS_JS);
- source_map_.RegisterSource("entryIdManager", IDR_ENTRY_ID_MANAGER);
// Custom bindings.
source_map_.RegisterSource("app", IDR_APP_CUSTOM_BINDINGS_JS);
@@ -971,9 +867,7 @@ void Dispatcher::InstallBindings(ModuleSystem* module_system,
v8::Handle<v8::Object> global(v8_context->Global());
v8::Handle<v8::Object> chrome =
global->Get(v8::String::New("chrome"))->ToObject();
- v8::Handle<v8::Object> chrome_hidden =
- ChromeV8Context::GetOrCreateChromeHidden(v8_context)->ToObject();
- (*lazy_binding->second)(module_system, chrome, chrome_hidden);
+ (*lazy_binding->second)(module_system, chrome);
} else {
module_system->Require(api);
}
@@ -1026,8 +920,6 @@ void Dispatcher::DidCreateScriptContext(
module_system->RegisterNativeHandler("chrome",
scoped_ptr<NativeHandler>(new ChromeNativeHandler(context)));
- module_system->RegisterNativeHandler("chrome_hidden",
- scoped_ptr<NativeHandler>(new ChromeHiddenNativeHandler(context)));
module_system->RegisterNativeHandler("print",
scoped_ptr<NativeHandler>(new PrintNativeHandler(context)));
module_system->RegisterNativeHandler("lazy_background_page",
@@ -1036,8 +928,7 @@ void Dispatcher::DidCreateScriptContext(
module_system->RegisterNativeHandler("logging",
scoped_ptr<NativeHandler>(new LoggingNativeHandler(context)));
module_system->RegisterNativeHandler("schema_registry",
- scoped_ptr<NativeHandler>(
- new SchemaRegistryNativeHandler(v8_schema_registry(), context)));
+ v8_schema_registry_.AsNativeHandler());
module_system->RegisterNativeHandler("v8_context",
scoped_ptr<NativeHandler>(new V8ContextNativeHandler(context, this)));
module_system->RegisterNativeHandler("test_features",
@@ -1054,7 +945,11 @@ void Dispatcher::DidCreateScriptContext(
ChromeRenderProcessObserver::is_incognito_process(),
manifest_version, send_request_disabled)));
- GetOrCreateChrome(v8_context);
+ v8::Handle<v8::Object> chrome = GetOrCreateChrome(v8_context);
+
+ // chrome.Event is part of the public API (although undocumented). Make it
+ // lazily evalulate to Event from event_bindings.js.
+ module_system->SetLazyField(chrome, "Event", kEventModule, "Event");
// Loading JavaScript is expensive, so only run the full API bindings
// generation mechanisms in extension pages (NOT all web pages).
diff --git a/chrome/renderer/extensions/dispatcher.h b/chrome/renderer/extensions/dispatcher.h
index 65148ce..6d7623c 100644
--- a/chrome/renderer/extensions/dispatcher.h
+++ b/chrome/renderer/extensions/dispatcher.h
@@ -147,8 +147,7 @@ class Dispatcher : public content::RenderProcessObserver {
FRIEND_TEST_ALL_PREFIXES(RendererPermissionsPolicyDelegateTest,
CannotScriptWebstore);
typedef void (*BindingInstaller)(ModuleSystem* module_system,
- v8::Handle<v8::Object> chrome,
- v8::Handle<v8::Object> chrome_hidden);
+ v8::Handle<v8::Object> chrome);
// RenderProcessObserver implementation:
virtual bool OnControlMessageReceived(const IPC::Message& message) OVERRIDE;
diff --git a/chrome/renderer/extensions/event_unittest.cc b/chrome/renderer/extensions/event_unittest.cc
index 92c225e..0b4f2b8 100644
--- a/chrome/renderer/extensions/event_unittest.cc
+++ b/chrome/renderer/extensions/event_unittest.cc
@@ -12,17 +12,16 @@ namespace {
class EventUnittest : public ModuleSystemTest {
virtual void SetUp() OVERRIDE {
ModuleSystemTest::SetUp();
- module_system_->RunString("chrome = {};", "setup-chrome");
- RegisterModule("event", IDR_EVENT_BINDINGS_JS);
- RegisterModule("schemaUtils", IDR_SCHEMA_UTILS_JS);
- RegisterModule("utils", IDR_UTILS_JS);
+ RegisterModule("event_bindings", IDR_EVENT_BINDINGS_JS);
RegisterModule("json_schema", IDR_JSON_SCHEMA_JS);
+ RegisterModule("schemaUtils", IDR_SCHEMA_UTILS_JS);
RegisterModule("unload_event", IDR_UNLOAD_EVENT_JS);
+ RegisterModule("utils", IDR_UTILS_JS);
// Mock out the native handler for event_bindings. These mocks will fail if
// any invariants maintained by the real event_bindings are broken.
- OverrideNativeHandler("event_bindings",
+ OverrideNativeHandler("event_natives",
"var assert = requireNative('assert');"
"var attachedListeners = exports.attachedListeners = {};"
"var attachedFilteredListeners = "
@@ -61,12 +60,6 @@ class EventUnittest : public ModuleSystemTest {
"exports.HasFilteredListener = function(name) {"
" return attachedFilteredListeners[name].length;"
"};");
- OverrideNativeHandler("chrome_hidden",
- "var chromeHidden = {};"
- "exports.GetChromeHidden = function() { return chromeHidden; };");
- OverrideNativeHandler("chrome",
- "var chrome = {};"
- "exports.GetChrome = function() { return chrome; };");
OverrideNativeHandler("sendRequest",
"exports.sendRequest = function() {};");
OverrideNativeHandler("apiDefinitions",
@@ -86,18 +79,17 @@ TEST_F(EventUnittest, AddRemoveTwoListeners) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
RegisterModule("test",
"var assert = requireNative('assert');"
- "require('event');"
- "var Event = requireNative('chrome').GetChrome().Event;"
- "var eventBindings = requireNative('event_bindings');"
+ "var Event = require('event_bindings').Event;"
+ "var eventNatives = requireNative('event_natives');"
"var myEvent = new Event('named-event');"
"var cb1 = function() {};"
"var cb2 = function() {};"
"myEvent.addListener(cb1);"
"myEvent.addListener(cb2);"
"myEvent.removeListener(cb1);"
- "assert.AssertTrue(!!eventBindings.attachedListeners['named-event']);"
+ "assert.AssertTrue(!!eventNatives.attachedListeners['named-event']);"
"myEvent.removeListener(cb2);"
- "assert.AssertFalse(!!eventBindings.attachedListeners['named-event']);");
+ "assert.AssertFalse(!!eventNatives.attachedListeners['named-event']);");
module_system_->Require("test");
}
@@ -105,17 +97,15 @@ TEST_F(EventUnittest, OnUnloadDetachesAllListeners) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
RegisterModule("test",
"var assert = requireNative('assert');"
- "require('event');"
- "var Event = requireNative('chrome').GetChrome().Event;"
- "var eventBindings = requireNative('event_bindings');"
- "var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();"
+ "var Event = require('event_bindings').Event;"
+ "var eventNatives = requireNative('event_natives');"
"var myEvent = new Event('named-event');"
"var cb1 = function() {};"
"var cb2 = function() {};"
"myEvent.addListener(cb1);"
"myEvent.addListener(cb2);"
"require('unload_event').dispatch();"
- "assert.AssertFalse(!!eventBindings.attachedListeners['named-event']);");
+ "assert.AssertFalse(!!eventNatives.attachedListeners['named-event']);");
module_system_->Require("test");
}
@@ -123,24 +113,21 @@ TEST_F(EventUnittest, OnUnloadDetachesAllListenersEvenDupes) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
RegisterModule("test",
"var assert = requireNative('assert');"
- "require('event');"
- "var Event = requireNative('chrome').GetChrome().Event;"
- "var eventBindings = requireNative('event_bindings');"
- "var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();"
+ "var Event = require('event_bindings').Event;"
+ "var eventNatives = requireNative('event_natives');"
"var myEvent = new Event('named-event');"
"var cb1 = function() {};"
"myEvent.addListener(cb1);"
"myEvent.addListener(cb1);"
"require('unload_event').dispatch();"
- "assert.AssertFalse(!!eventBindings.attachedListeners['named-event']);");
+ "assert.AssertFalse(!!eventNatives.attachedListeners['named-event']);");
module_system_->Require("test");
}
TEST_F(EventUnittest, EventsThatSupportRulesMustHaveAName) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
RegisterModule("test",
- "require('event');"
- "var Event = requireNative('chrome').GetChrome().Event;"
+ "var Event = require('event_bindings').Event;"
"var eventOpts = {supportsRules: true};"
"var assert = requireNative('assert');"
"var caught = false;"
@@ -156,14 +143,13 @@ TEST_F(EventUnittest, EventsThatSupportRulesMustHaveAName) {
TEST_F(EventUnittest, NamedEventDispatch) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
RegisterModule("test",
- "var event = require('event');"
- "var Event = requireNative('chrome').GetChrome().Event;"
- "var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();"
+ "var Event = require('event_bindings').Event;"
+ "var dispatchEvent = require('event_bindings').dispatchEvent;"
"var assert = requireNative('assert');"
"var e = new Event('myevent');"
"var called = false;"
"e.addListener(function() { called = true; });"
- "event.dispatchEvent('myevent', []);"
+ "dispatchEvent('myevent', []);"
"assert.AssertTrue(called);");
module_system_->Require("test");
}
@@ -171,8 +157,7 @@ TEST_F(EventUnittest, NamedEventDispatch) {
TEST_F(EventUnittest, AddListenerWithFiltersThrowsErrorByDefault) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
RegisterModule("test",
- "require('event');"
- "var Event = requireNative('chrome').GetChrome().Event;"
+ "var Event = require('event_bindings').Event;"
"var assert = requireNative('assert');"
"var e = new Event('myevent');"
"var filter = [{"
@@ -191,10 +176,9 @@ TEST_F(EventUnittest, AddListenerWithFiltersThrowsErrorByDefault) {
TEST_F(EventUnittest, FilteredEventsAttachment) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
RegisterModule("test",
- "require('event');"
- "var Event = requireNative('chrome').GetChrome().Event;"
+ "var Event = require('event_bindings').Event;"
"var assert = requireNative('assert');"
- "var bindings = requireNative('event_bindings');"
+ "var bindings = requireNative('event_natives');"
"var eventOpts = {supportsListeners: true, supportsFilters: true};"
"var e = new Event('myevent', undefined, eventOpts);"
"var cb = function() {};"
@@ -209,10 +193,9 @@ TEST_F(EventUnittest, FilteredEventsAttachment) {
TEST_F(EventUnittest, DetachFilteredEvent) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
RegisterModule("test",
- "require('event');"
- "var Event = requireNative('chrome').GetChrome().Event;"
+ "var Event = require('event_bindings').Event;"
"var assert = requireNative('assert');"
- "var bindings = requireNative('event_bindings');"
+ "var bindings = requireNative('event_natives');"
"var eventOpts = {supportsListeners: true, supportsFilters: true};"
"var e = new Event('myevent', undefined, eventOpts);"
"var cb1 = function() {};"
@@ -228,10 +211,9 @@ TEST_F(EventUnittest, DetachFilteredEvent) {
TEST_F(EventUnittest, AttachAndRemoveSameFilteredEventListener) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
RegisterModule("test",
- "require('event');"
- "var Event = requireNative('chrome').GetChrome().Event;"
+ "var Event = require('event_bindings').Event;"
"var assert = requireNative('assert');"
- "var bindings = requireNative('event_bindings');"
+ "var bindings = requireNative('event_natives');"
"var eventOpts = {supportsListeners: true, supportsFilters: true};"
"var e = new Event('myevent', undefined, eventOpts);"
"var cb = function() {};"
@@ -249,8 +231,7 @@ TEST_F(EventUnittest, AttachAndRemoveSameFilteredEventListener) {
TEST_F(EventUnittest, AddingFilterWithUrlFieldNotAListThrowsException) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
RegisterModule("test",
- "require('event');"
- "var Event = requireNative('chrome').GetChrome().Event;"
+ "var Event = require('event_bindings').Event;"
"var assert = requireNative('assert');"
"var eventOpts = {supportsListeners: true, supportsFilters: true};"
"var e = new Event('myevent', undefined, eventOpts);"
@@ -269,8 +250,7 @@ TEST_F(EventUnittest, AddingFilterWithUrlFieldNotAListThrowsException) {
TEST_F(EventUnittest, MaxListeners) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
RegisterModule("test",
- "require('event');"
- "var Event = requireNative('chrome').GetChrome().Event;"
+ "var Event = require('event_bindings').Event;"
"var assert = requireNative('assert');"
"var eventOpts = {supportsListeners: true, maxListeners: 1};"
"var e = new Event('myevent', undefined, eventOpts);"
diff --git a/chrome/renderer/extensions/json_schema_unittest.cc b/chrome/renderer/extensions/json_schema_unittest.cc
index c209d9f..35de3d9 100644
--- a/chrome/renderer/extensions/json_schema_unittest.cc
+++ b/chrome/renderer/extensions/json_schema_unittest.cc
@@ -2,56 +2,33 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "base/file_util.h"
-#include "base/path_service.h"
-#include "base/string_util.h"
-#include "chrome/common/chrome_paths.h"
-#include "chrome/test/base/v8_unit_test.h"
+#include "chrome/renderer/extensions/v8_schema_registry.h"
+#include "chrome/test/base/module_system_test.h"
#include "grit/renderer_resources.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/base/resource/resource_bundle.h"
-
-static const char kJsonSchema[] = "json_schema.js";
-static const char kJsonSchemaTest[] = "json_schema_test.js";
namespace extensions {
-class JsonSchemaTest : public V8UnitTest {
+class JsonSchemaTest : public ModuleSystemTest {
public:
- JsonSchemaTest() {}
-
- virtual void SetUp() {
- V8UnitTest::SetUp();
-
- // Add the json schema code to the context.
- std::string code = ResourceBundle::GetSharedInstance().GetRawDataResource(
- IDR_JSON_SCHEMA_JS).as_string();
-
- // json_schema.js expects to have require() and requireNative() defined.
- ExecuteScriptInContext(
- "function requireNative(id) {"
- " return {"
- " GetChromeHidden: function() { return {}; },"
- " CHECK: function(foo, bar) { return undefined; },"
- " };"
- "}"
- "function require(id) {"
- " return {"
- " loadTypeSchema: function(foo) { return undefined; },"
- " };"
- "}",
- "test-code");
- ExecuteScriptInContext(code, kJsonSchema);
-
- // Add the test functions to the context.
- base::FilePath test_js_file_path;
- ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_js_file_path));
- test_js_file_path = test_js_file_path.AppendASCII("extensions");
- test_js_file_path = test_js_file_path.AppendASCII(kJsonSchemaTest);
- std::string test_js;
- ASSERT_TRUE(file_util::ReadFileToString(test_js_file_path, &test_js));
- ExecuteScriptInContext(test_js, kJsonSchemaTest);
+ virtual void SetUp() OVERRIDE {
+ ModuleSystemTest::SetUp();
+
+ RegisterModule("json_schema", IDR_JSON_SCHEMA_JS);
+ RegisterModule("utils", IDR_UTILS_JS);
+
+ module_system_->RegisterNativeHandler("schema_registry",
+ schema_registry_.AsNativeHandler());
+
+ RegisterTestFile("json_schema_test", "json_schema_test.js");
}
+
+ protected:
+ void TestFunction(const std::string& test_name) {
+ module_system_->CallModuleMethod("json_schema_test", test_name);
+ }
+
+ private:
+ V8SchemaRegistry schema_registry_;
};
TEST_F(JsonSchemaTest, TestFormatError) {
diff --git a/chrome/renderer/extensions/logging_native_handler.cc b/chrome/renderer/extensions/logging_native_handler.cc
new file mode 100644
index 0000000..c5c9b08
--- /dev/null
+++ b/chrome/renderer/extensions/logging_native_handler.cc
@@ -0,0 +1,100 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/renderer/extensions/logging_native_handler.h"
+
+#include "base/logging.h"
+#include "base/stringprintf.h"
+
+namespace extensions {
+
+LoggingNativeHandler::LoggingNativeHandler(ChromeV8Context* context)
+ : ObjectBackedNativeHandler(context) {
+ RouteFunction("DCHECK",
+ base::Bind(&LoggingNativeHandler::Dcheck, base::Unretained(this)));
+ RouteFunction("CHECK",
+ base::Bind(&LoggingNativeHandler::Check, base::Unretained(this)));
+ RouteFunction("DCHECK_IS_ON",
+ base::Bind(&LoggingNativeHandler::DcheckIsOn, base::Unretained(this)));
+ RouteFunction("LOG",
+ base::Bind(&LoggingNativeHandler::Log, base::Unretained(this)));
+ RouteFunction("WARNING",
+ base::Bind(&LoggingNativeHandler::Warning, base::Unretained(this)));
+}
+
+LoggingNativeHandler::~LoggingNativeHandler() {}
+
+v8::Handle<v8::Value> LoggingNativeHandler::Check(const v8::Arguments& args) {
+ bool check_value;
+ std::string error_message;
+ ParseArgs(args, &check_value, &error_message);
+ CHECK(check_value) << error_message;
+ return v8::Undefined();
+}
+
+v8::Handle<v8::Value> LoggingNativeHandler::Dcheck(const v8::Arguments& args) {
+ bool check_value;
+ std::string error_message;
+ ParseArgs(args, &check_value, &error_message);
+ DCHECK(check_value) << error_message;
+ return v8::Undefined();
+}
+
+v8::Handle<v8::Value> LoggingNativeHandler::DcheckIsOn(
+ const v8::Arguments& args) {
+ return v8::Boolean::New(DCHECK_IS_ON());
+}
+
+v8::Handle<v8::Value> LoggingNativeHandler::Log(
+ const v8::Arguments& args) {
+ CHECK_EQ(1, args.Length());
+ LOG(INFO) << *v8::String::AsciiValue(args[0]);
+ return v8::Undefined();
+}
+
+v8::Handle<v8::Value> LoggingNativeHandler::Warning(
+ const v8::Arguments& args) {
+ CHECK_EQ(1, args.Length());
+ LOG(WARNING) << *v8::String::AsciiValue(args[0]);
+ return v8::Undefined();
+}
+
+void LoggingNativeHandler::ParseArgs(const v8::Arguments& args,
+ bool* check_value,
+ std::string* error_message) {
+ CHECK_LE(args.Length(), 2);
+ *check_value = args[0]->BooleanValue();
+ if (args.Length() == 2) {
+ *error_message = "Error: " + std::string(
+ *v8::String::AsciiValue(args[1]));
+ }
+
+ v8::Handle<v8::StackTrace> stack_trace =
+ v8::StackTrace::CurrentStackTrace(10);
+ if (stack_trace.IsEmpty() || stack_trace->GetFrameCount() <= 0) {
+ *error_message += "\n <no stack trace>";
+ } else {
+ for (size_t i = 0; i < (size_t) stack_trace->GetFrameCount(); ++i) {
+ v8::Handle<v8::StackFrame> frame = stack_trace->GetFrame(i);
+ CHECK(!frame.IsEmpty());
+ *error_message += base::StringPrintf("\n at %s (%s:%d:%d)",
+ ToStringOrDefault(frame->GetFunctionName(), "<anonymous>").c_str(),
+ ToStringOrDefault(frame->GetScriptName(), "<anonymous>").c_str(),
+ frame->GetLineNumber(),
+ frame->GetColumn());
+ }
+ }
+}
+
+std::string LoggingNativeHandler::ToStringOrDefault(
+ const v8::Handle<v8::String>& v8_string,
+ const std::string& dflt) {
+ if (v8_string.IsEmpty())
+ return dflt;
+ std::string ascii_value = *v8::String::AsciiValue(v8_string);
+ return ascii_value.empty() ? dflt : ascii_value;
+}
+
+} // namespace extensions
+
diff --git a/chrome/renderer/extensions/logging_native_handler.h b/chrome/renderer/extensions/logging_native_handler.h
new file mode 100644
index 0000000..9097522
--- /dev/null
+++ b/chrome/renderer/extensions/logging_native_handler.h
@@ -0,0 +1,55 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_RENDERER_EXTENSIONS_LOGGING_NATIVE_HANDLER_H_
+#define CHROME_RENDERER_EXTENSIONS_LOGGING_NATIVE_HANDLER_H_
+
+#include <string>
+
+#include "chrome/renderer/extensions/object_backed_native_handler.h"
+
+namespace extensions {
+
+// Exposes logging.h macros to JavaScript bindings.
+class LoggingNativeHandler : public ObjectBackedNativeHandler {
+ public:
+ explicit LoggingNativeHandler(ChromeV8Context* context);
+ virtual ~LoggingNativeHandler();
+
+ // Equivalent to CHECK(predicate) << message.
+ //
+ // void(predicate, message?)
+ v8::Handle<v8::Value> Check(const v8::Arguments& args);
+
+ // Equivalent to DCHECK(predicate) << message.
+ //
+ // void(predicate, message?)
+ v8::Handle<v8::Value> Dcheck(const v8::Arguments& args);
+
+ // Equivalent to DCHECK_IS_ON().
+ //
+ // bool()
+ v8::Handle<v8::Value> DcheckIsOn(const v8::Arguments& args);
+
+ // Equivalent to LOG(INFO) << message.
+ //
+ // void(message)
+ v8::Handle<v8::Value> Log(const v8::Arguments& args);
+
+ // Equivalent to LOG(WARNING) << message.
+ //
+ // void(message)
+ v8::Handle<v8::Value> Warning(const v8::Arguments& args);
+
+ void ParseArgs(const v8::Arguments& args,
+ bool* check_value,
+ std::string* error_message);
+
+ std::string ToStringOrDefault(const v8::Handle<v8::String>& v8_string,
+ const std::string& dflt);
+};
+
+} // namespace extensions
+
+#endif // CHROME_RENDERER_EXTENSIONS_LOGGING_NATIVE_HANDLER_H_
diff --git a/chrome/renderer/extensions/miscellaneous_bindings.h b/chrome/renderer/extensions/miscellaneous_bindings.h
index bdd50f3..95d0733 100644
--- a/chrome/renderer/extensions/miscellaneous_bindings.h
+++ b/chrome/renderer/extensions/miscellaneous_bindings.h
@@ -37,9 +37,9 @@ class MiscellaneousBindings {
static ChromeV8Extension* Get(Dispatcher* dispatcher,
ChromeV8Context* context);
- // Dispatches the Port.onConnect content script messaging event to some
- // contexts in |contexts|. If |restrict_to_render_view| is specified, only
- // contexts in that render view will receive the message.
+ // Dispatches the onConnect content script messaging event to some contexts
+ // in |contexts|. If |restrict_to_render_view| is specified, only contexts in
+ // that render view will receive the message.
static void DispatchOnConnect(
const ChromeV8ContextSet::ContextSet& contexts,
int target_port_id,
@@ -59,8 +59,7 @@ class MiscellaneousBindings {
const base::ListValue& message,
content::RenderView* restrict_to_render_view);
- // Dispatches the Port.onDisconnect event in response to the channel being
- // closed.
+ // Dispatches the onDisconnect event in response to the channel being closed.
static void DispatchOnDisconnect(
const ChromeV8ContextSet::ContextSet& context_set,
int port_id,
diff --git a/chrome/renderer/extensions/v8_schema_registry.cc b/chrome/renderer/extensions/v8_schema_registry.cc
index 5aa785f..7f1dc97 100644
--- a/chrome/renderer/extensions/v8_schema_registry.cc
+++ b/chrome/renderer/extensions/v8_schema_registry.cc
@@ -7,12 +7,39 @@
#include "base/logging.h"
#include "base/values.h"
#include "chrome/common/extensions/api/extension_api.h"
+#include "chrome/renderer/extensions/chrome_v8_context.h"
+#include "chrome/renderer/extensions/object_backed_native_handler.h"
#include "content/public/renderer/v8_value_converter.h"
using content::V8ValueConverter;
namespace extensions {
+namespace {
+
+class SchemaRegistryNativeHandler : public ObjectBackedNativeHandler {
+ public:
+ SchemaRegistryNativeHandler(V8SchemaRegistry* registry,
+ scoped_ptr<ChromeV8Context> context)
+ : ObjectBackedNativeHandler(context.get()),
+ context_(context.Pass()),
+ registry_(registry) {
+ RouteFunction("GetSchema",
+ base::Bind(&SchemaRegistryNativeHandler::GetSchema,
+ base::Unretained(this)));
+ }
+
+ private:
+ v8::Handle<v8::Value> GetSchema(const v8::Arguments& args) {
+ return registry_->GetSchema(*v8::String::AsciiValue(args[0]));
+ }
+
+ scoped_ptr<ChromeV8Context> context_;
+ V8SchemaRegistry* registry_;
+};
+
+} // namespace
+
V8SchemaRegistry::V8SchemaRegistry() {}
V8SchemaRegistry::~V8SchemaRegistry() {
@@ -24,6 +51,16 @@ V8SchemaRegistry::~V8SchemaRegistry() {
}
}
+scoped_ptr<NativeHandler> V8SchemaRegistry::AsNativeHandler() {
+ scoped_ptr<ChromeV8Context> context(new ChromeV8Context(
+ GetOrCreateContext(),
+ NULL, // no frame
+ NULL, // no extension
+ Feature::UNSPECIFIED_CONTEXT));
+ return scoped_ptr<NativeHandler>(
+ new SchemaRegistryNativeHandler(this, context.Pass()));
+}
+
v8::Handle<v8::Array> V8SchemaRegistry::GetSchemas(
const std::set<std::string>& apis) {
v8::HandleScope handle_scope;
diff --git a/chrome/renderer/extensions/v8_schema_registry.h b/chrome/renderer/extensions/v8_schema_registry.h
index 9a7a695..c479372 100644
--- a/chrome/renderer/extensions/v8_schema_registry.h
+++ b/chrome/renderer/extensions/v8_schema_registry.h
@@ -10,10 +10,12 @@
#include <string>
#include "base/basictypes.h"
+#include "base/memory/scoped_ptr.h"
#include "chrome/renderer/extensions/scoped_persistent.h"
#include "v8/include/v8.h"
namespace extensions {
+class NativeHandler;
// A registry for the v8::Value representations of extension API schemas.
// In a way, the v8 counterpart to ExtensionAPI.
@@ -22,6 +24,9 @@ class V8SchemaRegistry {
V8SchemaRegistry();
~V8SchemaRegistry();
+ // Creates a NativeHandler wrapper |this|. Supports GetSchema.
+ scoped_ptr<NativeHandler> AsNativeHandler();
+
// Returns a v8::Array with all the schemas for the APIs in |apis|.
v8::Handle<v8::Array> GetSchemas(const std::set<std::string>& apis);
diff --git a/chrome/renderer/resources/extensions/ad_view.js b/chrome/renderer/resources/extensions/ad_view.js
index 0a7aab4..8eaadf4 100644
--- a/chrome/renderer/resources/extensions/ad_view.js
+++ b/chrome/renderer/resources/extensions/ad_view.js
@@ -11,7 +11,6 @@
// want to refactor to extract common pieces?
var adViewCustom = require('adViewCustom');
-var chrome = requireNative('chrome').GetChrome();
var forEach = require('utils').forEach;
var watchForTag = require('tagWatcher').watchForTag;
diff --git a/chrome/renderer/resources/extensions/app_runtime_custom_bindings.js b/chrome/renderer/resources/extensions/app_runtime_custom_bindings.js
index bf1a8f23..be637c4 100644
--- a/chrome/renderer/resources/extensions/app_runtime_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/app_runtime_custom_bindings.js
@@ -6,8 +6,8 @@
var binding = require('binding').Binding.create('app.runtime');
-var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
var chrome = requireNative('chrome').GetChrome();
+var eventBindings = require('event_bindings');
var fileSystemHelpers = requireNative('file_system_natives');
var forEach = require('utils').forEach;
var GetIsolatedFileSystem = fileSystemHelpers.GetIsolatedFileSystem;
@@ -17,7 +17,7 @@ var SerializeToString = appNatives.SerializeToString;
var CreateBlob = appNatives.CreateBlob;
var entryIdManager = require('entryIdManager');
-chromeHidden.Event.registerArgumentMassager('app.runtime.onLaunched',
+eventBindings.registerArgumentMassager('app.runtime.onLaunched',
function(args, dispatch) {
var launchData = args[0];
diff --git a/chrome/renderer/resources/extensions/app_window_custom_bindings.js b/chrome/renderer/resources/extensions/app_window_custom_bindings.js
index ab82bc6..f6171e1 100644
--- a/chrome/renderer/resources/extensions/app_window_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/app_window_custom_bindings.js
@@ -4,14 +4,15 @@
// Custom binding for the app_window API.
+var appWindowNatives = requireNative('app_window_natives');
var Binding = require('binding').Binding;
-var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
var chrome = requireNative('chrome').GetChrome();
-var sendRequest = require('sendRequest').sendRequest;
-var appWindowNatives = requireNative('app_window');
+var Event = require('event_bindings').Event;
var forEach = require('utils').forEach;
-var GetView = appWindowNatives.GetView;
-var OnContextReady = appWindowNatives.OnContextReady;
+var sendRequest = require('sendRequest').sendRequest;
+
+var appWindowData = null;
+var currentAppWindow = null;
var appWindow = Binding.create('app.window');
appWindow.registerCustomHook(function(bindingsAPI) {
@@ -20,8 +21,10 @@ appWindow.registerCustomHook(function(bindingsAPI) {
apiFunctions.setCustomCallback('create',
function(name, request, windowParams) {
var view = null;
- if (windowParams.viewId)
- view = GetView(windowParams.viewId, windowParams.injectTitlebar);
+ if (windowParams.viewId) {
+ view = appWindowNatives.GetView(
+ windowParams.viewId, windowParams.injectTitlebar);
+ }
if (!view) {
// No route to created window. If given a callback, trigger it with an
@@ -54,7 +57,8 @@ appWindow.registerCustomHook(function(bindingsAPI) {
return;
}
- var willCallback = OnContextReady(windowParams.viewId, function(success) {
+ var willCallback = appWindowNatives.OnContextReady(windowParams.viewId,
+ function(success) {
if (success) {
callback(view.chrome.app.window.current());
} else {
@@ -68,12 +72,12 @@ appWindow.registerCustomHook(function(bindingsAPI) {
});
apiFunctions.setHandleRequest('current', function() {
- if (!chromeHidden.currentAppWindow) {
+ if (!currentAppWindow) {
console.error('chrome.app.window.current() is null -- window not ' +
'created with chrome.app.window.create()');
return null;
}
- return chromeHidden.currentAppWindow;
+ return currentAppWindow;
});
// This is an internal function, but needs to be bound with setHandleRequest
@@ -89,30 +93,30 @@ appWindow.registerCustomHook(function(bindingsAPI) {
AppWindow.prototype.moveTo = window.moveTo.bind(window);
AppWindow.prototype.resizeTo = window.resizeTo.bind(window);
AppWindow.prototype.contentWindow = window;
- AppWindow.prototype.onClosed = new chrome.Event;
+ AppWindow.prototype.onClosed = new Event();
AppWindow.prototype.close = function() {
this.contentWindow.close();
};
AppWindow.prototype.getBounds = function() {
- var bounds = chromeHidden.appWindowData.bounds;
+ var bounds = appWindowData.bounds;
return { left: bounds.left, top: bounds.top,
width: bounds.width, height: bounds.height };
};
AppWindow.prototype.isFullscreen = function() {
- return chromeHidden.appWindowData.fullscreen;
+ return appWindowData.fullscreen;
};
AppWindow.prototype.isMinimized = function() {
- return chromeHidden.appWindowData.minimized;
+ return appWindowData.minimized;
};
AppWindow.prototype.isMaximized = function() {
- return chromeHidden.appWindowData.maximized;
+ return appWindowData.maximized;
};
Object.defineProperty(AppWindow.prototype, 'id', {get: function() {
- return chromeHidden.appWindowData.id;
+ return appWindowData.id;
}});
- chromeHidden.appWindowData = {
+ appWindowData = {
id: params.id || '',
bounds: { left: params.bounds.left, top: params.bounds.top,
width: params.bounds.width, height: params.bounds.height },
@@ -120,7 +124,7 @@ appWindow.registerCustomHook(function(bindingsAPI) {
minimized: params.minimized,
maximized: params.maximized
};
- chromeHidden.currentAppWindow = new AppWindow;
+ currentAppWindow = new AppWindow;
});
});
@@ -132,13 +136,14 @@ function boundsEqual(bounds1, bounds2) {
}
function updateAppWindowProperties(update) {
- if (!chromeHidden.appWindowData)
+ if (!appWindowData)
return;
- var oldData = chromeHidden.appWindowData;
+
+ var oldData = appWindowData;
update.id = oldData.id;
- chromeHidden.appWindowData = update;
+ appWindowData = update;
- var currentWindow = chromeHidden.currentAppWindow;
+ var currentWindow = currentAppWindow;
if (!boundsEqual(oldData.bounds, update.bounds))
currentWindow["onBoundsChanged"].dispatch();
@@ -157,9 +162,9 @@ function updateAppWindowProperties(update) {
};
function onAppWindowClosed() {
- if (!chromeHidden.currentAppWindow)
+ if (!currentAppWindow)
return;
- chromeHidden.currentAppWindow.onClosed.dispatch();
+ currentAppWindow.onClosed.dispatch();
}
exports.binding = appWindow.generate();
diff --git a/chrome/renderer/resources/extensions/binding.js b/chrome/renderer/resources/extensions/binding.js
index 68f52f9..3a2bac3 100644
--- a/chrome/renderer/resources/extensions/binding.js
+++ b/chrome/renderer/resources/extensions/binding.js
@@ -2,10 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-require('json_schema');
-require('event_bindings');
-var chrome = requireNative('chrome').GetChrome();
-var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
+var Event = require('event_bindings').Event;
var forEach = require('utils').forEach;
var GetAvailability = requireNative('v8_context').GetAvailability;
var logging = requireNative('logging');
@@ -91,7 +88,7 @@ CustomBindingsObject.prototype.setSchema = function(schema) {
// dictionary for easier access.
var self = this;
self.functionSchemas = {};
- schema.functions.forEach(function(f) {
+ forEach(schema.functions, function(i, f) {
self.functionSchemas[f.name] = {
name: f.name,
definition: f
@@ -208,9 +205,9 @@ Binding.prototype = {
if (shouldCheck)
return shouldCheck;
- ['functions', 'events'].forEach(function(type) {
+ forEach(['functions', 'events'], function(i, type) {
if (schema.hasOwnProperty(type)) {
- schema[type].forEach(function(node) {
+ forEach(schema[type], function(i, node) {
if ('unprivileged' in node)
shouldCheck = true;
});
@@ -293,9 +290,8 @@ Binding.prototype = {
// TODO(aa): It would be best to run this in a unit test, but in order
// to do that we would need to better factor this code so that it
// doesn't depend on so much v8::Extension machinery.
- if (chromeHidden.validateAPI &&
- schemaUtils.isFunctionSignatureAmbiguous(
- apiFunction.definition)) {
+ if (logging.DCHECK_IS_ON() &&
+ schemaUtils.isFunctionSignatureAmbiguous(apiFunction.definition)) {
throw new Error(
apiFunction.name + ' has ambiguous optional arguments. ' +
'To implement custom disambiguation logic, add ' +
@@ -328,11 +324,9 @@ Binding.prototype = {
}
sendRequestHandler.clearCalledSendRequest();
- // Validate return value if defined - only in debug.
- if (chromeHidden.validateCallbacks &&
- this.definition.returns) {
+ // Validate return value if in sanity check mode.
+ if (logging.DCHECK_IS_ON() && this.definition.returns)
schemaUtils.validate([retval], [this.definition.returns]);
- }
return retval;
}).bind(apiFunction);
}, this);
@@ -363,9 +357,9 @@ Binding.prototype = {
eventName, eventDef.parameters, eventDef.extraParameters,
options);
} else if (eventDef.anonymous) {
- mod[eventDef.name] = new chrome.Event();
+ mod[eventDef.name] = new Event();
} else {
- mod[eventDef.name] = new chrome.Event(
+ mod[eventDef.name] = new Event(
eventName, eventDef.parameters, options);
}
}, this);
diff --git a/chrome/renderer/resources/extensions/bluetooth_custom_bindings.js b/chrome/renderer/resources/extensions/bluetooth_custom_bindings.js
index fe8cc13..07697d4 100644
--- a/chrome/renderer/resources/extensions/bluetooth_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/bluetooth_custom_bindings.js
@@ -6,10 +6,10 @@
var binding = require('binding').Binding.create('bluetooth');
-var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
var chrome = requireNative('chrome').GetChrome();
-var sendRequest = require('sendRequest').sendRequest;
+var Event = require('event_bindings').Event;
var lastError = require('lastError');
+var sendRequest = require('sendRequest').sendRequest;
// Use custom binding to create an undocumented event listener that will
// receive events about device discovery and call the event listener that was
@@ -17,7 +17,7 @@ var lastError = require('lastError');
binding.registerCustomHook(function(api) {
var apiFunctions = api.apiFunctions;
- chromeHidden.bluetooth = {};
+ var bluetooth = {};
function callCallbackIfPresent(name, args, error) {
var callback = args[args.length - 1];
@@ -25,29 +25,27 @@ binding.registerCustomHook(function(api) {
lastError.run(name, error, callback);
}
- chromeHidden.bluetooth.deviceDiscoveredHandler = null;
- chromeHidden.bluetooth.onDeviceDiscovered =
- new chrome.Event('bluetooth.onDeviceDiscovered');
+ bluetooth.deviceDiscoveredHandler = null;
+ bluetooth.onDeviceDiscovered = new Event('bluetooth.onDeviceDiscovered');
function clearDeviceDiscoveredHandler() {
- chromeHidden.bluetooth.onDeviceDiscovered.removeListener(
- chromeHidden.bluetooth.deviceDiscoveredHandler);
- chromeHidden.bluetooth.deviceDiscoveredHandler = null;
+ bluetooth.onDeviceDiscovered.removeListener(
+ bluetooth.deviceDiscoveredHandler);
+ bluetooth.deviceDiscoveredHandler = null;
}
apiFunctions.setHandleRequest('startDiscovery',
function() {
var args = arguments;
if (args.length > 0 && args[0] && args[0].deviceCallback) {
- if (chromeHidden.bluetooth.deviceDiscoveredHandler != null) {
+ if (bluetooth.deviceDiscoveredHandler != null) {
callCallbackIfPresent('bluetooth.startDiscovery',
args,
'Concurrent discovery is not allowed.');
return;
}
- chromeHidden.bluetooth.deviceDiscoveredHandler =
- args[0].deviceCallback;
- chromeHidden.bluetooth.onDeviceDiscovered.addListener(
- chromeHidden.bluetooth.deviceDiscoveredHandler);
+ bluetooth.deviceDiscoveredHandler = args[0].deviceCallback;
+ bluetooth.onDeviceDiscovered.addListener(
+ bluetooth.deviceDiscoveredHandler);
sendRequest(this.name,
args,
this.definition.parameters,
@@ -74,42 +72,37 @@ binding.registerCustomHook(function(api) {
});
// An object to hold state during one call to getDevices.
- chromeHidden.bluetooth.getDevicesState = null;
+ bluetooth.getDevicesState = null;
// Hidden events used to deliver getDevices data to the client callbacks
- chromeHidden.bluetooth.onDeviceSearchResult =
- new chrome.Event('bluetooth.onDeviceSearchResult');
- chromeHidden.bluetooth.onDeviceSearchFinished =
- new chrome.Event('bluetooth.onDeviceSearchFinished');
+ bluetooth.onDeviceSearchResult = new Event('bluetooth.onDeviceSearchResult');
+ bluetooth.onDeviceSearchFinished =
+ new Event('bluetooth.onDeviceSearchFinished');
function deviceSearchResultHandler(device) {
- chromeHidden.bluetooth.getDevicesState.actualEvents++;
- chromeHidden.bluetooth.getDevicesState.deviceCallback(device);
+ bluetooth.getDevicesState.actualEvents++;
+ bluetooth.getDevicesState.deviceCallback(device);
maybeFinishDeviceSearch();
}
function deviceSearchFinishedHandler(info) {
- chromeHidden.bluetooth.getDevicesState.expectedEventCount =
- info.expectedEventCount;
+ bluetooth.getDevicesState.expectedEventCount = info.expectedEventCount;
maybeFinishDeviceSearch();
}
function addDeviceSearchListeners() {
- chromeHidden.bluetooth.onDeviceSearchResult.addListener(
- deviceSearchResultHandler);
- chromeHidden.bluetooth.onDeviceSearchFinished.addListener(
- deviceSearchFinishedHandler);
+ bluetooth.onDeviceSearchResult.addListener(deviceSearchResultHandler);
+ bluetooth.onDeviceSearchFinished.addListener(deviceSearchFinishedHandler);
}
function removeDeviceSearchListeners() {
- chromeHidden.bluetooth.onDeviceSearchResult.removeListener(
- deviceSearchResultHandler);
- chromeHidden.bluetooth.onDeviceSearchFinished.removeListener(
+ bluetooth.onDeviceSearchResult.removeListener(deviceSearchResultHandler);
+ bluetooth.onDeviceSearchFinished.removeListener(
deviceSearchFinishedHandler);
}
function maybeFinishDeviceSearch() {
- var state = chromeHidden.bluetooth.getDevicesState;
+ var state = bluetooth.getDevicesState;
if (typeof(state.expectedEventCount) != 'undefined' &&
state.actualEvents >= state.expectedEventCount) {
finishDeviceSearch();
@@ -117,9 +110,9 @@ binding.registerCustomHook(function(api) {
}
function finishDeviceSearch() {
- var finalCallback = chromeHidden.bluetooth.getDevicesState.finalCallback;
+ var finalCallback = bluetooth.getDevicesState.finalCallback;
removeDeviceSearchListeners();
- chromeHidden.bluetooth.getDevicesState = null;
+ bluetooth.getDevicesState = null;
if (finalCallback) {
finalCallback();
@@ -130,7 +123,7 @@ binding.registerCustomHook(function(api) {
function() {
var args = Array.prototype.slice.call(arguments);
- if (chromeHidden.bluetooth.getDevicesState != null) {
+ if (bluetooth.getDevicesState != null) {
throw new Error('Concurrent calls to getDevices are not allowed.');
}
@@ -155,7 +148,7 @@ binding.registerCustomHook(function(api) {
'deviceCallback.');
}
- chromeHidden.bluetooth.getDevicesState = state;
+ bluetooth.getDevicesState = state;
addDeviceSearchListeners();
return args;
diff --git a/chrome/renderer/resources/extensions/chrome_setting.js b/chrome/renderer/resources/extensions/chrome_setting.js
index b2969b0..b2194b1 100644
--- a/chrome/renderer/resources/extensions/chrome_setting.js
+++ b/chrome/renderer/resources/extensions/chrome_setting.js
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-var chrome = requireNative('chrome').GetChrome();
+var Event = require('event_bindings').Event;
var sendRequest = require('sendRequest').sendRequest;
var validate = require('schemaUtils').validate;
@@ -35,8 +35,7 @@ function ChromeSetting(prefKey, valueSchema) {
[prefKey, details, callback],
extendSchema(clearSchema));
};
- this.onChange = new chrome.Event('types.ChromeSetting.' + prefKey +
- '.onChange');
+ this.onChange = new Event('types.ChromeSetting.' + prefKey + '.onChange');
};
exports.ChromeSetting = ChromeSetting;
diff --git a/chrome/renderer/resources/extensions/context_menus_custom_bindings.js b/chrome/renderer/resources/extensions/context_menus_custom_bindings.js
index 4b0a936..f143ee6 100644
--- a/chrome/renderer/resources/extensions/context_menus_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/context_menus_custom_bindings.js
@@ -6,40 +6,38 @@
var binding = require('binding').Binding.create('contextMenus');
-var contextMenus = requireNative('context_menus');
-var GetNextContextMenuId = contextMenus.GetNextContextMenuId;
+var contextMenuNatives = requireNative('context_menus');
var sendRequest = require('sendRequest').sendRequest;
-
-var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
+var Event = require('event_bindings').Event;
binding.registerCustomHook(function(bindingsAPI) {
var apiFunctions = bindingsAPI.apiFunctions;
- chromeHidden.contextMenus = {};
- chromeHidden.contextMenus.generatedIdHandlers = {};
- chromeHidden.contextMenus.stringIdHandlers = {};
+ var contextMenus = {};
+ contextMenus.generatedIdHandlers = {};
+ contextMenus.stringIdHandlers = {};
var eventName = 'contextMenus';
- chromeHidden.contextMenus.event = new chrome.Event(eventName);
- chromeHidden.contextMenus.getIdFromCreateProperties = function(prop) {
+ contextMenus.event = new Event(eventName);
+ contextMenus.getIdFromCreateProperties = function(prop) {
if (typeof(prop.id) !== 'undefined')
return prop.id;
return prop.generatedId;
};
- chromeHidden.contextMenus.handlersForId = function(id) {
+ contextMenus.handlersForId = function(id) {
if (typeof(id) === 'number')
- return chromeHidden.contextMenus.generatedIdHandlers;
- return chromeHidden.contextMenus.stringIdHandlers;
+ return contextMenus.generatedIdHandlers;
+ return contextMenus.stringIdHandlers;
};
- chromeHidden.contextMenus.ensureListenerSetup = function() {
- if (chromeHidden.contextMenus.listening) {
+ contextMenus.ensureListenerSetup = function() {
+ if (contextMenus.listening) {
return;
}
- chromeHidden.contextMenus.listening = true;
- chromeHidden.contextMenus.event.addListener(function() {
+ contextMenus.listening = true;
+ contextMenus.event.addListener(function() {
// An extension context menu item has been clicked on - fire the onclick
// if there is one.
var id = arguments[0].menuItemId;
- var onclick = chromeHidden.contextMenus.handlersForId(id)[id];
+ var onclick = contextMenus.handlersForId(id)[id];
if (onclick) {
onclick.apply(null, arguments);
}
@@ -48,13 +46,13 @@ binding.registerCustomHook(function(bindingsAPI) {
apiFunctions.setHandleRequest('create', function() {
var args = arguments;
- var id = GetNextContextMenuId();
+ var id = contextMenuNatives.GetNextContextMenuId();
args[0].generatedId = id;
var optArgs = {
customCallback: this.customCallback,
};
sendRequest(this.name, args, this.definition.parameters, optArgs);
- return chromeHidden.contextMenus.getIdFromCreateProperties(args[0]);
+ return contextMenus.getIdFromCreateProperties(args[0]);
});
apiFunctions.setCustomCallback('create', function(name, request, response) {
@@ -62,14 +60,13 @@ binding.registerCustomHook(function(bindingsAPI) {
return;
}
- var id = chromeHidden.contextMenus.getIdFromCreateProperties(
- request.args[0]);
+ var id = contextMenus.getIdFromCreateProperties(request.args[0]);
// Set up the onclick handler if we were passed one in the request.
var onclick = request.args.length ? request.args[0].onclick : null;
if (onclick) {
- chromeHidden.contextMenus.ensureListenerSetup();
- chromeHidden.contextMenus.handlersForId(id)[id] = onclick;
+ contextMenus.ensureListenerSetup();
+ contextMenus.handlersForId(id)[id] = onclick;
}
});
@@ -78,7 +75,7 @@ binding.registerCustomHook(function(bindingsAPI) {
return;
}
var id = request.args[0];
- delete chromeHidden.contextMenus.handlersForId(id)[id];
+ delete contextMenus.handlersForId(id)[id];
});
apiFunctions.setCustomCallback('update', function(name, request, response) {
@@ -87,7 +84,7 @@ binding.registerCustomHook(function(bindingsAPI) {
}
var id = request.args[0];
if (request.args[1].onclick) {
- chromeHidden.contextMenus.handlersForId(id)[id] = request.args[1].onclick;
+ contextMenus.handlersForId(id)[id] = request.args[1].onclick;
}
});
@@ -96,8 +93,8 @@ binding.registerCustomHook(function(bindingsAPI) {
if (chrome.runtime.lastError) {
return;
}
- chromeHidden.contextMenus.generatedIdHandlers = {};
- chromeHidden.contextMenus.stringIdHandlers = {};
+ contextMenus.generatedIdHandlers = {};
+ contextMenus.stringIdHandlers = {};
});
});
diff --git a/chrome/renderer/resources/extensions/declarative_webrequest_custom_bindings.js b/chrome/renderer/resources/extensions/declarative_webrequest_custom_bindings.js
index 9d0c3c5..4e5a5b8 100644
--- a/chrome/renderer/resources/extensions/declarative_webrequest_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/declarative_webrequest_custom_bindings.js
@@ -6,7 +6,6 @@
var binding = require('binding').Binding.create('declarativeWebRequest');
-var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
var chrome = requireNative('chrome').GetChrome();
var utils = require('utils');
var validate = require('schemaUtils').validate;
diff --git a/chrome/renderer/resources/extensions/downloads_custom_bindings.js b/chrome/renderer/resources/extensions/downloads_custom_bindings.js
index 36832f6..be7d1c4 100644
--- a/chrome/renderer/resources/extensions/downloads_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/downloads_custom_bindings.js
@@ -5,11 +5,11 @@
// Custom bindings for the downloads API.
var binding = require('binding').Binding.create('downloads');
-var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
var downloadsInternal = require('binding').Binding.create(
'downloadsInternal').generate();
+var eventBindings = require('event_bindings');
-chromeHidden.Event.registerArgumentMassager(
+eventBindings.registerArgumentMassager(
'downloads.onDeterminingFilename',
function massage_determining_filename(args, dispatch) {
var downloadItem = args[0];
diff --git a/chrome/renderer/resources/extensions/event.js b/chrome/renderer/resources/extensions/event.js
index 2bd3649..f70f9b4 100644
--- a/chrome/renderer/resources/extensions/event.js
+++ b/chrome/renderer/resources/extensions/event.js
@@ -2,25 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
- var DCHECK = requireNative('logging').DCHECK;
- // TODO(cduvall/kalman): json_schema shouldn't put things on chromeHidden.
- require('json_schema');
- var eventBindingsNatives = requireNative('event_bindings');
- var AttachEvent = eventBindingsNatives.AttachEvent;
- var DetachEvent = eventBindingsNatives.DetachEvent;
- var AttachFilteredEvent = eventBindingsNatives.AttachFilteredEvent;
- var DetachFilteredEvent = eventBindingsNatives.DetachFilteredEvent;
- var MatchAgainstEventFilter = eventBindingsNatives.MatchAgainstEventFilter;
- var forEach = require('utils').forEach;
+ var eventNatives = requireNative('event_natives');
+ var logging = requireNative('logging');
+ var schemaRegistry = requireNative('schema_registry');
var sendRequest = require('sendRequest').sendRequest;
var utils = require('utils');
var validate = require('schemaUtils').validate;
var unloadEvent = require('unload_event');
- var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
- var chrome = requireNative('chrome').GetChrome();
- var schemaRegistry = requireNative('schema_registry');
-
// Schemas for the rule-style functions on the events API that
// only need to be generated occasionally, so populate them lazily.
var ruleFunctionSchemas = {
@@ -64,7 +53,7 @@
function(listener) {
// Only attach / detach on the first / last listener removed.
if (this.event_.listeners_.length == 0)
- AttachEvent(this.event_.eventName_);
+ eventNatives.AttachEvent(this.event_.eventName_);
};
UnfilteredAttachmentStrategy.prototype.onRemovedListener =
@@ -74,7 +63,7 @@
};
UnfilteredAttachmentStrategy.prototype.detach = function(manual) {
- DetachEvent(this.event_.eventName_, manual);
+ eventNatives.DetachEvent(this.event_.eventName_, manual);
};
UnfilteredAttachmentStrategy.prototype.getListenersByIDs = function(ids) {
@@ -89,8 +78,8 @@
FilteredAttachmentStrategy.idToEventMap = {};
FilteredAttachmentStrategy.prototype.onAddedListener = function(listener) {
- var id = AttachFilteredEvent(this.event_.eventName_,
- listener.filters || {});
+ var id = eventNatives.AttachFilteredEvent(this.event_.eventName_,
+ listener.filters || {});
if (id == -1)
throw new Error("Can't add listener");
listener.id = id;
@@ -109,7 +98,7 @@
var id = listener.id;
delete this.listenerMap_[id];
delete FilteredAttachmentStrategy.idToEventMap[id];
- DetachFilteredEvent(id, manual);
+ eventNatives.DetachFilteredEvent(id, manual);
};
FilteredAttachmentStrategy.prototype.detach = function(manual) {
@@ -124,7 +113,7 @@
return result;
};
- chromeHidden.parseEventOptions = function(opt_eventOptions) {
+ function parseEventOptions(opt_eventOptions) {
function merge(dest, src) {
for (var k in src) {
if (!dest.hasOwnProperty(k)) {
@@ -148,9 +137,10 @@
// opt_eventName is required for events that support rules.
//
// Example:
- // chrome.tabs.onChanged = new chrome.Event("tab-changed");
+ // var Event = require('event_bindings').Event;
+ // chrome.tabs.onChanged = new Event("tab-changed");
// chrome.tabs.onChanged.addListener(function(data) { alert(data); });
- // chromeHidden.Event.dispatch("tab-changed", "hi");
+ // Event.dispatch("tab-changed", "hi");
// will result in an alert dialog that says 'hi'.
//
// If opt_eventOptions exists, it is a dictionary that contains the boolean
@@ -158,7 +148,7 @@
var Event = function(opt_eventName, opt_argSchemas, opt_eventOptions) {
this.eventName_ = opt_eventName;
this.listeners_ = [];
- this.eventOptions_ = chromeHidden.parseEventOptions(opt_eventOptions);
+ this.eventOptions_ = parseEventOptions(opt_eventOptions);
if (this.eventOptions_.supportsRules && !opt_eventName)
throw new Error("Events that support rules require an event name.");
@@ -171,9 +161,7 @@
// Validate event arguments (the data that is passed to the callbacks)
// if we are in debug.
- if (opt_argSchemas &&
- chromeHidden.validateCallbacks) {
-
+ if (opt_argSchemas && logging.DCHECK_IS_ON()) {
this.validateEventArgs_ = function(args) {
try {
validate(args, opt_argSchemas);
@@ -187,17 +175,14 @@
}
};
-
- chromeHidden.Event = {};
-
// callback is a function(args, dispatch). args are the args we receive from
// dispatchEvent(), and dispatch is a function(args) that dispatches args to
// its listeners.
- chromeHidden.Event.registerArgumentMassager = function(name, callback) {
+ function registerArgumentMassager(name, callback) {
if (eventArgumentMassagers[name])
throw new Error("Massager already registered for event: " + name);
eventArgumentMassagers[name] = callback;
- };
+ }
// Dispatches a named event with the given argument array. The args array is
// the list of arguments that will be sent to the event callback.
@@ -205,7 +190,7 @@
var listenerIDs = null;
if (filteringInfo)
- listenerIDs = MatchAgainstEventFilter(name, filteringInfo);
+ listenerIDs = eventNatives.MatchAgainstEventFilter(name, filteringInfo);
var event = attachedNamedEvents[name];
if (!event)
@@ -214,7 +199,7 @@
var dispatchArgs = function(args) {
var result = event.dispatch_(args, listenerIDs);
if (result)
- DCHECK(!result.validationErrors, result.validationErrors);
+ logging.DCHECK(!result.validationErrors, result.validationErrors);
return result;
};
@@ -249,10 +234,8 @@
if (!this.eventName_)
return;
- if (attachedNamedEvents[this.eventName_]) {
- throw new Error("chrome.Event '" + this.eventName_ +
- "' is already attached.");
- }
+ if (attachedNamedEvents[this.eventName_])
+ throw new Error("Event '" + this.eventName_ + "' is already attached.");
attachedNamedEvents[this.eventName_] = this;
}
@@ -263,9 +246,8 @@
if (!this.eventOptions_.supportsListeners)
throw new Error("This event does not support listeners.");
var idx = this.findListener_(cb);
- if (idx == -1) {
+ if (idx == -1)
return;
- }
var removedListener = this.listeners_.splice(idx, 1)[0];
this.attachmentStrategy_.onRemovedListener(removedListener);
@@ -277,10 +259,8 @@
if (!this.eventName_)
return;
- if (!attachedNamedEvents[this.eventName_]) {
- throw new Error("chrome.Event '" + this.eventName_ +
- "' is not attached.");
- }
+ if (!attachedNamedEvents[this.eventName_])
+ throw new Error("Event '" + this.eventName_ + "' is not attached.");
delete attachedNamedEvents[this.eventName_];
}
@@ -338,8 +318,11 @@
if (result !== undefined)
results.push(result);
} catch (e) {
- console.error("Error in event handler for '" + this.eventName_ +
- "': " + e.message + ' ' + e.stack);
+ var errorMessage = "Error in event handler";
+ if (this.eventName_)
+ errorMessage += " for " + this.eventName_;
+ errorMessage += ": " + e;
+ console.error(errorMessage);
}
}
if (results.length)
@@ -394,10 +377,10 @@
function validateRules(rules, conditions, actions) {
var conditionsSchema = buildArrayOfChoicesSchema(conditions);
var actionsSchema = buildArrayOfChoicesSchema(actions);
- forEach(rules, function(i, rule) {
+ utils.forEach(rules, function(i, rule) {
validate([rule.conditions], [conditionsSchema]);
validate([rule.actions], [actionsSchema]);
- })
+ });
};
if (!this.eventOptions_.conditions || !this.eventOptions_.actions) {
@@ -453,5 +436,9 @@
}
});
- chrome.Event = Event;
+ // NOTE: Event is (lazily) exposed as chrome.Event from dispatcher.cc.
+ exports.Event = Event;
+
exports.dispatchEvent = dispatchEvent;
+ exports.parseEventOptions = parseEventOptions;
+ exports.registerArgumentMassager = registerArgumentMassager;
diff --git a/chrome/renderer/resources/extensions/extension_custom_bindings.js b/chrome/renderer/resources/extensions/extension_custom_bindings.js
index 5650a07..54302ac 100644
--- a/chrome/renderer/resources/extensions/extension_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/extension_custom_bindings.js
@@ -48,7 +48,7 @@ binding.registerCustomHook(function(bindingsAPI, extensionId) {
windowId = properties.windowId;
}
}
- return GetExtensionViews(windowId, type) || null;
+ return GetExtensionViews(windowId, type);
});
apiFunctions.setHandleRequest('getBackgroundPage', function() {
diff --git a/chrome/renderer/resources/extensions/file_browser_handler_custom_bindings.js b/chrome/renderer/resources/extensions/file_browser_handler_custom_bindings.js
index 1fbe7b08c..af310ba 100644
--- a/chrome/renderer/resources/extensions/file_browser_handler_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/file_browser_handler_custom_bindings.js
@@ -6,14 +6,13 @@
var binding = require('binding').Binding.create('fileBrowserHandler');
+var eventBindings = require('event_bindings');
var fileBrowserNatives = requireNative('file_browser_handler');
var GetExternalFileEntry = fileBrowserNatives.GetExternalFileEntry;
-
-var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
var fileBrowserHandlerInternal = require('binding').Binding.create(
'fileBrowserHandlerInternal').generate();
-chromeHidden.Event.registerArgumentMassager('fileBrowserHandler.onExecute',
+eventBindings.registerArgumentMassager('fileBrowserHandler.onExecute',
function(args, dispatch) {
if (args.length < 2) {
dispatch(args);
diff --git a/chrome/renderer/resources/extensions/i18n_custom_bindings.js b/chrome/renderer/resources/extensions/i18n_custom_bindings.js
index 39f5a7d..a2f5869 100644
--- a/chrome/renderer/resources/extensions/i18n_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/i18n_custom_bindings.js
@@ -9,8 +9,6 @@ var binding = require('binding').Binding.create('i18n');
var i18nNatives = requireNative('i18n');
var GetL10nMessage = i18nNatives.GetL10nMessage;
-var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
-
binding.registerCustomHook(function(bindingsAPI, extensionId) {
var apiFunctions = bindingsAPI.apiFunctions;
diff --git a/chrome/renderer/resources/extensions/input.ime_custom_bindings.js b/chrome/renderer/resources/extensions/input.ime_custom_bindings.js
index 79ab4a3..1eba5ff 100644
--- a/chrome/renderer/resources/extensions/input.ime_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/input.ime_custom_bindings.js
@@ -7,6 +7,8 @@
var binding = require('binding').Binding.create('input.ime');
+var Event = require('event_bindings').Event;
+
binding.registerCustomHook(function(api) {
var input_ime = api.compiledApi;
@@ -16,7 +18,7 @@ binding.registerCustomHook(function(api) {
var result = false;
try {
- result = chrome.Event.prototype.dispatchToListener(callback, args);
+ result = Event.prototype.dispatchToListener(callback, args);
} catch (e) {
console.error('Error in event handler for onKeyEvent: ' + e.stack);
}
@@ -33,7 +35,7 @@ binding.registerCustomHook(function(api) {
}
}
}
- chrome.Event.prototype.addListener.call(this, cb, null);
+ Event.prototype.addListener.call(this, cb, null);
};
});
diff --git a/chrome/renderer/resources/extensions/json_schema.js b/chrome/renderer/resources/extensions/json_schema.js
index 6640f48..ecf0c34 100644
--- a/chrome/renderer/resources/extensions/json_schema.js
+++ b/chrome/renderer/resources/extensions/json_schema.js
@@ -38,8 +38,6 @@
// additional properties will be validated.
//==============================================================================
-// TODO(cduvall): Make this file not depend on chromeHidden.
-var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
var loadTypeSchema = require('utils').loadTypeSchema;
var CHECK = requireNative('logging').CHECK;
@@ -60,7 +58,7 @@ function isOptionalValue(value) {
/**
* Validates an instance against a schema and accumulates errors. Usage:
*
- * var validator = new chromeHidden.JSONSchemaValidator();
+ * var validator = new JSONSchemaValidator();
* validator.validate(inst, schema);
* if (validator.errors.length == 0)
* console.log("Valid!");
@@ -72,12 +70,12 @@ function isOptionalValue(value) {
* the key that had the problem, and the "message" property contains a sentence
* describing the error.
*/
-chromeHidden.JSONSchemaValidator = function() {
+function JSONSchemaValidator() {
this.errors = [];
this.types = [];
-};
+}
-chromeHidden.JSONSchemaValidator.messages = {
+JSONSchemaValidator.messages = {
invalidEnum: "Value must be one of: [*].",
propertyRequired: "Property is required.",
unexpectedProperty: "Unexpected property.",
@@ -106,7 +104,7 @@ chromeHidden.JSONSchemaValidator.messages = {
* Builds an error message. Key is the property in the |errors| object, and
* |opt_replacements| is an array of values to replace "*" characters with.
*/
-chromeHidden.JSONSchemaValidator.formatError = function(key, opt_replacements) {
+JSONSchemaValidator.formatError = function(key, opt_replacements) {
var message = this.messages[key];
if (opt_replacements) {
for (var i = 0; i < opt_replacements.length; i++) {
@@ -121,7 +119,7 @@ chromeHidden.JSONSchemaValidator.formatError = function(key, opt_replacements) {
* don't explicitly disallow 'function', because we want to allow functions in
* the input values.
*/
-chromeHidden.JSONSchemaValidator.getType = function(value) {
+JSONSchemaValidator.getType = function(value) {
var s = typeof value;
if (s == "object") {
@@ -147,7 +145,7 @@ chromeHidden.JSONSchemaValidator.getType = function(value) {
* with "$ref": <typeId>. Each type must be a valid schema and define an
* "id" property.
*/
-chromeHidden.JSONSchemaValidator.prototype.addTypes = function(typeOrTypeList) {
+JSONSchemaValidator.prototype.addTypes = function(typeOrTypeList) {
function addType(validator, type) {
if (!type.id)
throw new Error("Attempt to addType with missing 'id' property");
@@ -166,8 +164,7 @@ chromeHidden.JSONSchemaValidator.prototype.addTypes = function(typeOrTypeList) {
/**
* Returns a list of strings of the types that this schema accepts.
*/
-chromeHidden.JSONSchemaValidator.prototype.getAllTypesForSchema =
- function(schema) {
+JSONSchemaValidator.prototype.getAllTypesForSchema = function(schema) {
var schemaTypes = [];
if (schema.type)
schemaTypes.push(schema.type);
@@ -186,7 +183,7 @@ chromeHidden.JSONSchemaValidator.prototype.getAllTypesForSchema =
return schemaTypes;
};
-chromeHidden.JSONSchemaValidator.prototype.getOrAddType = function(typeName) {
+JSONSchemaValidator.prototype.getOrAddType = function(typeName) {
if (!this.types[typeName])
this.types[typeName] = loadTypeSchema(typeName);
return this.types[typeName];
@@ -195,8 +192,7 @@ chromeHidden.JSONSchemaValidator.prototype.getOrAddType = function(typeName) {
/**
* Returns true if |schema| would accept an argument of type |type|.
*/
-chromeHidden.JSONSchemaValidator.prototype.isValidSchemaType =
- function(type, schema) {
+JSONSchemaValidator.prototype.isValidSchemaType = function(type, schema) {
if (type == 'any')
return true;
@@ -217,8 +213,7 @@ chromeHidden.JSONSchemaValidator.prototype.isValidSchemaType =
* Returns true if there is a non-null argument that both |schema1| and
* |schema2| would accept.
*/
-chromeHidden.JSONSchemaValidator.prototype.checkSchemaOverlap =
- function(schema1, schema2) {
+JSONSchemaValidator.prototype.checkSchemaOverlap = function(schema1, schema2) {
var schema1Types = this.getAllTypesForSchema(schema1);
for (var i = 0; i < schema1Types.length; i++) {
if (this.isValidSchemaType(schema1Types[i], schema2))
@@ -232,8 +227,7 @@ chromeHidden.JSONSchemaValidator.prototype.checkSchemaOverlap =
* value and will be validated recursively. When this method returns, the
* |errors| property will contain a list of errors, if any.
*/
-chromeHidden.JSONSchemaValidator.prototype.validate =
- function(instance, schema, opt_path) {
+JSONSchemaValidator.prototype.validate = function(instance, schema, opt_path) {
var path = opt_path || "";
if (!schema) {
@@ -301,7 +295,7 @@ chromeHidden.JSONSchemaValidator.prototype.validate =
* Validates an instance against a choices schema. The instance must match at
* least one of the provided choices.
*/
-chromeHidden.JSONSchemaValidator.prototype.validateChoices =
+JSONSchemaValidator.prototype.validateChoices =
function(instance, schema, path) {
var originalErrors = this.errors;
@@ -323,8 +317,7 @@ chromeHidden.JSONSchemaValidator.prototype.validateChoices =
* |errors| property, and returns a boolean indicating whether the instance
* validates.
*/
-chromeHidden.JSONSchemaValidator.prototype.validateEnum =
- function(instance, schema, path) {
+JSONSchemaValidator.prototype.validateEnum = function(instance, schema, path) {
for (var i = 0; i < schema.enum.length; i++) {
if (instance === schema.enum[i])
return true;
@@ -338,7 +331,7 @@ chromeHidden.JSONSchemaValidator.prototype.validateEnum =
* Validates an instance against an object schema and populates the errors
* property.
*/
-chromeHidden.JSONSchemaValidator.prototype.validateObject =
+JSONSchemaValidator.prototype.validateObject =
function(instance, schema, path) {
if (schema.properties) {
for (var prop in schema.properties) {
@@ -399,9 +392,8 @@ chromeHidden.JSONSchemaValidator.prototype.validateObject =
* Validates an instance against an array schema and populates the errors
* property.
*/
-chromeHidden.JSONSchemaValidator.prototype.validateArray =
- function(instance, schema, path) {
- var typeOfItems = chromeHidden.JSONSchemaValidator.getType(schema.items);
+JSONSchemaValidator.prototype.validateArray = function(instance, schema, path) {
+ var typeOfItems = JSONSchemaValidator.getType(schema.items);
if (typeOfItems == 'object') {
if (schema.minItems && instance.length < schema.minItems) {
@@ -446,7 +438,7 @@ chromeHidden.JSONSchemaValidator.prototype.validateArray =
/**
* Validates a string and populates the errors property.
*/
-chromeHidden.JSONSchemaValidator.prototype.validateString =
+JSONSchemaValidator.prototype.validateString =
function(instance, schema, path) {
if (schema.minLength && instance.length < schema.minLength)
this.addError(path, "stringMinLength", [schema.minLength]);
@@ -462,9 +454,8 @@ chromeHidden.JSONSchemaValidator.prototype.validateString =
* Validates a number and populates the errors property. The instance is
* assumed to be a number.
*/
-chromeHidden.JSONSchemaValidator.prototype.validateNumber =
+JSONSchemaValidator.prototype.validateNumber =
function(instance, schema, path) {
-
// Forbid NaN, +Infinity, and -Infinity. Our APIs don't use them, and
// JSON serialization encodes them as 'null'. Re-evaluate supporting
// them if we add an API that could reasonably take them as a parameter.
@@ -491,9 +482,8 @@ chromeHidden.JSONSchemaValidator.prototype.validateNumber =
* Validates the primitive type of an instance and populates the errors
* property. Returns true if the instance validates, false otherwise.
*/
-chromeHidden.JSONSchemaValidator.prototype.validateType =
- function(instance, schema, path) {
- var actualType = chromeHidden.JSONSchemaValidator.getType(instance);
+JSONSchemaValidator.prototype.validateType = function(instance, schema, path) {
+ var actualType = JSONSchemaValidator.getType(instance);
if (schema.type == actualType ||
(schema.type == "number" && actualType == "integer")) {
return true;
@@ -511,17 +501,18 @@ chromeHidden.JSONSchemaValidator.prototype.validateType =
* |replacements| is an array of values to replace '*' characters in the
* message.
*/
-chromeHidden.JSONSchemaValidator.prototype.addError =
- function(path, key, replacements) {
+JSONSchemaValidator.prototype.addError = function(path, key, replacements) {
this.errors.push({
path: path,
- message: chromeHidden.JSONSchemaValidator.formatError(key, replacements)
+ message: JSONSchemaValidator.formatError(key, replacements)
});
};
/**
* Resets errors to an empty list so you can call 'validate' again.
*/
-chromeHidden.JSONSchemaValidator.prototype.resetErrors = function() {
+JSONSchemaValidator.prototype.resetErrors = function() {
this.errors = [];
};
+
+exports.JSONSchemaValidator = JSONSchemaValidator;
diff --git a/chrome/renderer/resources/extensions/miscellaneous_bindings.js b/chrome/renderer/resources/extensions/miscellaneous_bindings.js
index 64454c7..6b57e1c 100644
--- a/chrome/renderer/resources/extensions/miscellaneous_bindings.js
+++ b/chrome/renderer/resources/extensions/miscellaneous_bindings.js
@@ -7,13 +7,14 @@
// background pages. See user_script_slave.cc for script that is loaded by
// content scripts only.
+ // TODO(kalman): factor requiring chrome out of here.
var chrome = requireNative('chrome').GetChrome();
- require('event_bindings');
+ var Event = require('event_bindings').Event;
var lastError = require('lastError');
var logActivity = requireNative('activityLogger');
- var miscNatives = requireNative('miscellaneous_bindings');
- var unloadEvent = require('unload_event');
+ var miscNatives = requireNative('miscellaneous_bindings_natives');
var processNatives = requireNative('process');
+ var unloadEvent = require('unload_event');
// The reserved channel name for the sendRequest/send(Native)Message APIs.
// Note: sendRequest is deprecated.
@@ -37,8 +38,8 @@
function Port(portId, opt_name) {
this.portId_ = portId;
this.name = opt_name;
- this.onDisconnect = new chrome.Event();
- this.onMessage = new chrome.Event();
+ this.onDisconnect = new Event();
+ this.onMessage = new Event();
}
// Sends a message asynchronously to the context on the other end of this
diff --git a/chrome/renderer/resources/extensions/omnibox_custom_bindings.js b/chrome/renderer/resources/extensions/omnibox_custom_bindings.js
index ee12051..2fd7a6c 100644
--- a/chrome/renderer/resources/extensions/omnibox_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/omnibox_custom_bindings.js
@@ -7,7 +7,7 @@
var binding = require('binding').Binding.create('omnibox');
-var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
+var eventBindings = require('event_bindings');
var sendRequest = require('sendRequest').sendRequest;
// Remove invalid characters from |text| so that it is suitable to use
@@ -111,7 +111,7 @@ binding.registerCustomHook(function(bindingsAPI) {
});
});
-chromeHidden.Event.registerArgumentMassager('omnibox.onInputChanged',
+eventBindings.registerArgumentMassager('omnibox.onInputChanged',
function(args, dispatch) {
var text = args[0];
var requestId = args[1];
diff --git a/chrome/renderer/resources/extensions/page_actions_custom_bindings.js b/chrome/renderer/resources/extensions/page_actions_custom_bindings.js
index 0b72e07..2f1b9a1 100644
--- a/chrome/renderer/resources/extensions/page_actions_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/page_actions_custom_bindings.js
@@ -6,16 +6,16 @@
var binding = require('binding').Binding.create('pageActions');
+var Event = require('event_bindings').Event;
var pageActionsNatives = requireNative('page_actions');
-var GetCurrentPageActions = pageActionsNatives.GetCurrentPageActions;
binding.registerCustomHook(function(bindingsAPI, extensionId) {
- var pageActions = GetCurrentPageActions(extensionId);
+ var pageActions = pageActionsNatives.GetCurrentPageActions(extensionId);
var pageActionsApi = bindingsAPI.compiledApi;
var oldStyleEventName = 'pageActions';
for (var i = 0; i < pageActions.length; ++i) {
// Setup events for each extension_id/page_action_id string we find.
- pageActionsApi[pageActions[i]] = new chrome.Event(oldStyleEventName);
+ pageActionsApi[pageActions[i]] = new Event(oldStyleEventName);
}
});
diff --git a/chrome/renderer/resources/extensions/permissions_custom_bindings.js b/chrome/renderer/resources/extensions/permissions_custom_bindings.js
index addd8ac..0f973d4 100644
--- a/chrome/renderer/resources/extensions/permissions_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/permissions_custom_bindings.js
@@ -6,6 +6,7 @@
var binding = require('binding').Binding.create('permissions');
+var Event = require('event_bindings').Event;
var sendRequest = require('sendRequest').sendRequest;
// These custom binding are only necessary because it is not currently
@@ -85,7 +86,7 @@ binding.registerCustomHook(function(api) {
for (var i = 0; i < args[0].permissions.length; i += 1) {
args[0].permissions[i] = maybeConvertToObject(args[0].permissions[i]);
}
- chrome.Event.prototype.dispatchToListener(callback, args);
+ Event.prototype.dispatchToListener(callback, args);
};
permissions.onRemoved.dispatchToListener =
permissions.onAdded.dispatchToListener;
diff --git a/chrome/renderer/resources/extensions/schema_utils.js b/chrome/renderer/resources/extensions/schema_utils.js
index 31531f9..5ec93fc 100644
--- a/chrome/renderer/resources/extensions/schema_utils.js
+++ b/chrome/renderer/resources/extensions/schema_utils.js
@@ -3,47 +3,40 @@
// found in the LICENSE file.
// Routines used to validate and normalize arguments.
+// TODO(benwells): unit test this file.
-var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
-var chrome = requireNative('chrome').GetChrome();
+var JSONSchemaValidator = require('json_schema').JSONSchemaValidator;
-// TODO(benwells): unit test this file.
-// JSONSchemaValidator is not loaded in unit tests.
-var validate;
-if (chromeHidden.JSONSchemaValidator) {
- var schemaValidator = new chromeHidden.JSONSchemaValidator();
+var schemaValidator = new JSONSchemaValidator();
- // Validate arguments.
- validate = function(args, parameterSchemas) {
- if (args.length > parameterSchemas.length)
- throw new Error("Too many arguments.");
- for (var i = 0; i < parameterSchemas.length; i++) {
- if (i in args && args[i] !== null && args[i] !== undefined) {
- schemaValidator.resetErrors();
- schemaValidator.validate(args[i], parameterSchemas[i]);
- if (schemaValidator.errors.length == 0)
- continue;
- var message = "Invalid value for argument " + (i + 1) + ". ";
- for (var i = 0, err;
- err = schemaValidator.errors[i]; i++) {
- if (err.path) {
- message += "Property '" + err.path + "': ";
- }
- message += err.message;
- message = message.substring(0, message.length - 1);
- message += ", ";
+// Validate arguments.
+function validate(args, parameterSchemas) {
+ if (args.length > parameterSchemas.length)
+ throw new Error("Too many arguments.");
+ for (var i = 0; i < parameterSchemas.length; i++) {
+ if (i in args && args[i] !== null && args[i] !== undefined) {
+ schemaValidator.resetErrors();
+ schemaValidator.validate(args[i], parameterSchemas[i]);
+ if (schemaValidator.errors.length == 0)
+ continue;
+ var message = "Invalid value for argument " + (i + 1) + ". ";
+ for (var i = 0, err;
+ err = schemaValidator.errors[i]; i++) {
+ if (err.path) {
+ message += "Property '" + err.path + "': ";
}
- message = message.substring(0, message.length - 2);
- message += ".";
- throw new Error(message);
- } else if (!parameterSchemas[i].optional) {
- throw new Error("Parameter " + (i + 1) + " (" +
- parameterSchemas[i].name + ") is required.");
+ message += err.message;
+ message = message.substring(0, message.length - 1);
+ message += ", ";
}
+ message = message.substring(0, message.length - 2);
+ message += ".";
+ throw new Error(message);
+ } else if (!parameterSchemas[i].optional) {
+ throw new Error("Parameter " + (i + 1) + " (" +
+ parameterSchemas[i].name + ") is required.");
}
- };
-} else {
- validate = function() {};
+ }
}
// Generate all possible signatures for a given API function.
@@ -64,7 +57,7 @@ function argumentsMatchSignature(args, candidateSignature) {
if (args.length != candidateSignature.length)
return false;
for (var i = 0; i < candidateSignature.length; i++) {
- var argType = chromeHidden.JSONSchemaValidator.getType(args[i]);
+ var argType = JSONSchemaValidator.getType(args[i]);
if (!schemaValidator.isValidSchemaType(argType,
candidateSignature[i]))
return false;
@@ -101,7 +94,7 @@ function getParameterSignatureString(name, definedSignature) {
// Example return value for call: chrome.windows.get(1, callback) is:
// "windows.get(int, function)"
function getArgumentSignatureString(name, args) {
- var typeNames = args.map(chromeHidden.JSONSchemaValidator.getType);
+ var typeNames = args.map(JSONSchemaValidator.getType);
return name + "(" + typeNames.join(", ") + ")";
};
diff --git a/chrome/renderer/resources/extensions/send_request.js b/chrome/renderer/resources/extensions/send_request.js
index 052396f..78f9dbd 100644
--- a/chrome/renderer/resources/extensions/send_request.js
+++ b/chrome/renderer/resources/extensions/send_request.js
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
var forEach = require('utils').forEach;
var json = require('json');
var lastError = require('lastError');
diff --git a/chrome/renderer/resources/extensions/sync_file_system_custom_bindings.js b/chrome/renderer/resources/extensions/sync_file_system_custom_bindings.js
index 92b030c..cac006d 100644
--- a/chrome/renderer/resources/extensions/sync_file_system_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/sync_file_system_custom_bindings.js
@@ -6,7 +6,7 @@
var binding = require('binding').Binding.create('syncFileSystem');
-var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
+var eventBindings = require('event_bindings');
var fileSystemNatives = requireNative('file_system_natives');
var forEach = require('utils').forEach;
var syncFileSystemNatives = requireNative('sync_file_system');
@@ -86,7 +86,7 @@ binding.registerCustomHook(function(bindingsAPI) {
});
});
-chromeHidden.Event.registerArgumentMassager(
+eventBindings.registerArgumentMassager(
'syncFileSystem.onFileStatusChanged', function(args, dispatch) {
// Make FileEntry object using all the base string fields.
var fileEntry = fileSystemNatives.GetFileEntry(
diff --git a/chrome/renderer/resources/extensions/system_indicator_custom_bindings.js b/chrome/renderer/resources/extensions/system_indicator_custom_bindings.js
index 0551a83..91d02a6 100644
--- a/chrome/renderer/resources/extensions/system_indicator_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/system_indicator_custom_bindings.js
@@ -8,7 +8,6 @@
var binding = require('binding').Binding.create('systemIndicator');
-var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
var setIcon = require('setIcon').setIcon;
binding.registerCustomHook(function(bindingsAPI) {
diff --git a/chrome/renderer/resources/extensions/tts_custom_bindings.js b/chrome/renderer/resources/extensions/tts_custom_bindings.js
index 5c74666..8c5b76c 100644
--- a/chrome/renderer/resources/extensions/tts_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/tts_custom_bindings.js
@@ -8,21 +8,16 @@ var binding = require('binding').Binding.create('tts');
var ttsNatives = requireNative('tts');
var GetNextTTSEventId = ttsNatives.GetNextTTSEventId;
-
-var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
var sendRequest = require('sendRequest').sendRequest;
var lazyBG = requireNative('lazy_background_page');
binding.registerCustomHook(function(api) {
var apiFunctions = api.apiFunctions;
var tts = api.compiledApi;
-
- chromeHidden.tts = {
- handlers: {}
- };
+ var handlers = {};
function ttsEventListener(event) {
- var eventHandler = chromeHidden.tts.handlers[event.srcId];
+ var eventHandler = handlers[event.srcId];
if (eventHandler) {
eventHandler({
type: event.type,
@@ -30,7 +25,7 @@ binding.registerCustomHook(function(api) {
errorMessage: event.errorMessage
});
if (event.isFinalEvent) {
- delete chromeHidden.tts.handlers[event.srcId];
+ delete handlers[event.srcId];
// Balanced in 'speak' handler.
lazyBG.DecrementKeepaliveCount();
}
@@ -50,7 +45,7 @@ binding.registerCustomHook(function(api) {
if (args.length > 1 && args[1] && args[1].onEvent) {
var id = GetNextTTSEventId();
args[1].srcId = id;
- chromeHidden.tts.handlers[id] = args[1].onEvent;
+ handlers[id] = args[1].onEvent;
// Keep the page alive until the event finishes.
// Balanced in eventHandler.
lazyBG.IncrementKeepaliveCount();
diff --git a/chrome/renderer/resources/extensions/tts_engine_custom_bindings.js b/chrome/renderer/resources/extensions/tts_engine_custom_bindings.js
index 1d19cea..1a2c970 100644
--- a/chrome/renderer/resources/extensions/tts_engine_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/tts_engine_custom_bindings.js
@@ -6,9 +6,9 @@
var binding = require('binding').Binding.create('ttsEngine');
-var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
+var eventBindings = require('event_bindings');
-chromeHidden.Event.registerArgumentMassager('ttsEngine.onSpeak',
+eventBindings.registerArgumentMassager('ttsEngine.onSpeak',
function(args, dispatch) {
var text = args[0];
var options = args[1];
diff --git a/chrome/renderer/resources/extensions/utils.js b/chrome/renderer/resources/extensions/utils.js
index 6312f96..7e6904f 100644
--- a/chrome/renderer/resources/extensions/utils.js
+++ b/chrome/renderer/resources/extensions/utils.js
@@ -2,9 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-var chrome = requireNative('chrome').GetChrome();
var schemaRegistry = requireNative('schema_registry');
var CHECK = requireNative('logging').CHECK;
+var WARNING = requireNative('logging').WARNING;
function forEach(obj, f, self) {
// For arrays, make sure the indices are numbers not strings - and in that
@@ -46,8 +46,11 @@ function lookup(array_of_dictionaries, field, value) {
function loadTypeSchema(typeName, defaultSchema) {
var parts = typeName.split('.');
if (parts.length == 1) {
- CHECK(defaultSchema, 'Trying to reference "' + typeName +
- '" with neither namespace nor default schema.');
+ if (defaultSchema == null) {
+ WARNING('Trying to reference "' + typeName + '" ' +
+ 'with neither namespace nor default schema.');
+ return null;
+ }
var types = defaultSchema.types;
} else {
var schemaName = parts.slice(0, parts.length - 1).join('.')
diff --git a/chrome/renderer/resources/extensions/web_request_custom_bindings.js b/chrome/renderer/resources/extensions/web_request_custom_bindings.js
index b2b0953..426c895 100644
--- a/chrome/renderer/resources/extensions/web_request_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/web_request_custom_bindings.js
@@ -6,13 +6,11 @@
var binding = require('binding').Binding.create('webRequest');
-var webRequestNatives = requireNative('web_request');
-var GetUniqueSubEventName = webRequestNatives.GetUniqueSubEventName;
-
-var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
+var eventBindings = require('event_bindings');
var sendRequest = require('sendRequest').sendRequest;
var validate = require('schemaUtils').validate;
var webRequestInternal = require('webRequestInternal').binding;
+var webRequestNatives = requireNative('web_request');
// WebRequestEvent object. This is used for special webRequest events with
// extra parameters. Each invocation of addListener creates a new named
@@ -34,10 +32,10 @@ function WebRequestEvent(eventName, opt_argSchemas, opt_extraArgSchemas,
this.extraArgSchemas_ = opt_extraArgSchemas;
this.webViewInstanceId_ = opt_webViewInstanceId ? opt_webViewInstanceId : 0;
this.subEvents_ = [];
- this.eventOptions_ = chromeHidden.parseEventOptions(opt_eventOptions);
+ this.eventOptions_ = eventBindings.parseEventOptions(opt_eventOptions);
if (this.eventOptions_.supportsRules) {
this.eventForRules_ =
- new chrome.Event(eventName, opt_argSchemas, opt_eventOptions);
+ new eventBindings.Event(eventName, opt_argSchemas, opt_eventOptions);
}
}
@@ -66,7 +64,7 @@ WebRequestEvent.prototype.addListener =
// NOTE(benjhayden) New APIs should not use this subEventName trick! It does
// not play well with event pages. See downloads.onDeterminingFilename and
// ExtensionDownloadsEventRouter for an alternative approach.
- var subEventName = GetUniqueSubEventName(this.eventName_);
+ var subEventName = webRequestNatives.GetUniqueSubEventName(this.eventName_);
// Note: this could fail to validate, in which case we would not add the
// subEvent listener.
validate(Array.prototype.slice.call(arguments, 1), this.extraArgSchemas_);
@@ -74,7 +72,7 @@ WebRequestEvent.prototype.addListener =
cb, opt_filter, opt_extraInfo, this.eventName_, subEventName,
this.webViewInstanceId_);
- var subEvent = new chrome.Event(subEventName, this.argSchemas_);
+ var subEvent = new eventBindings.Event(subEventName, this.argSchemas_);
var subEventCallback = cb;
if (opt_extraInfo && opt_extraInfo.indexOf('blocking') >= 0) {
var eventName = this.eventName_;
diff --git a/chrome/renderer/resources/extensions/web_view.js b/chrome/renderer/resources/extensions/web_view.js
index 4138215..d5e2c67 100644
--- a/chrome/renderer/resources/extensions/web_view.js
+++ b/chrome/renderer/resources/extensions/web_view.js
@@ -7,7 +7,6 @@
// The actual tag is implemented via the browser plugin. The internals of this
// are hidden via Shadow DOM.
-var chrome = requireNative('chrome').GetChrome();
var forEach = require('utils').forEach;
var watchForTag = require('tagWatcher').watchForTag;
diff --git a/chrome/test/base/module_system_test.cc b/chrome/test/base/module_system_test.cc
index ea144c2..c8bfe0c 100644
--- a/chrome/test/base/module_system_test.cc
+++ b/chrome/test/base/module_system_test.cc
@@ -5,9 +5,14 @@
#include "chrome/test/base/module_system_test.h"
#include "base/callback.h"
+#include "base/file_util.h"
+#include "base/files/file_path.h"
#include "base/memory/scoped_ptr.h"
+#include "base/path_service.h"
#include "base/strings/string_piece.h"
+#include "chrome/common/chrome_paths.h"
#include "chrome/renderer/extensions/chrome_v8_context.h"
+#include "chrome/renderer/extensions/logging_native_handler.h"
#include "chrome/renderer/extensions/object_backed_native_handler.h"
#include "ui/base/resource/resource_bundle.h"
@@ -101,6 +106,8 @@ ModuleSystemTest::ModuleSystemTest()
module_system_.reset(new ModuleSystem(context_.get(), source_map_.get()));
module_system_->RegisterNativeHandler("assert", scoped_ptr<NativeHandler>(
assert_natives_));
+ module_system_->RegisterNativeHandler("logging", scoped_ptr<NativeHandler>(
+ new extensions::LoggingNativeHandler(context_.get())));
module_system_->SetExceptionHandlerForTest(
scoped_ptr<ModuleSystem::ExceptionHandler>(new FailsOnException));
}
@@ -128,6 +135,17 @@ void ModuleSystemTest::OverrideNativeHandler(const std::string& name,
module_system_->OverrideNativeHandlerForTest(name);
}
+void ModuleSystemTest::RegisterTestFile(const std::string& module_name,
+ const std::string& file_name) {
+ base::FilePath test_js_file_path;
+ ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_js_file_path));
+ test_js_file_path = test_js_file_path.AppendASCII("extensions")
+ .AppendASCII(file_name);
+ std::string test_js;
+ ASSERT_TRUE(file_util::ReadFileToString(test_js_file_path, &test_js));
+ source_map_->RegisterModule(module_name, test_js);
+}
+
void ModuleSystemTest::TearDown() {
// All tests must assert at least once unless otherwise specified.
EXPECT_EQ(should_assertions_be_made_,
diff --git a/chrome/test/base/module_system_test.h b/chrome/test/base/module_system_test.h
index 3f2fcb3..d446252 100644
--- a/chrome/test/base/module_system_test.h
+++ b/chrome/test/base/module_system_test.h
@@ -26,6 +26,8 @@ class StringSourceMap;
//
// By default a test will fail if no method in the native module 'assert' is
// called. This behaviour can be overridden by calling ExpectNoAssertionsMade().
+//
+// TODO(kalman): move this back into chrome/renderer/extensions.
class ModuleSystemTest : public testing::Test {
public:
ModuleSystemTest();
@@ -45,6 +47,11 @@ class ModuleSystemTest : public testing::Test {
// name.
void OverrideNativeHandler(const std::string& name, const std::string& code);
+ // Registers |file_name| from chrome/test/data/extensions as a module name
+ // |module_name|.
+ void RegisterTestFile(const std::string& module_name,
+ const std::string& file_name);
+
// Make the test fail if any asserts are called. By default a test will fail
// if no asserts are called.
void ExpectNoAssertionsMade();
diff --git a/chrome/test/data/extensions/json_schema_test.js b/chrome/test/data/extensions/json_schema_test.js
index ec613f1..904f8c3 100644
--- a/chrome/test/data/extensions/json_schema_test.js
+++ b/chrome/test/data/extensions/json_schema_test.js
@@ -2,51 +2,56 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-function assert(truth) {
- if (!truth)
- throw new Error("Assertion failed.");
-}
+var AssertTrue = requireNative('assert').AssertTrue;
+var JSONSchemaValidator = require('json_schema').JSONSchemaValidator;
+var LOG = requireNative('logging').LOG;
function assertValid(type, instance, schema, types) {
- var validator = new chromeHidden.JSONSchemaValidator();
+ var validator = new JSONSchemaValidator();
if (types)
validator.addTypes(types);
validator["validate" + type](instance, schema, "");
+ var success = true;
if (validator.errors.length != 0) {
- log("Got unexpected errors");
+ LOG("Got unexpected errors");
for (var i = 0; i < validator.errors.length; i++) {
- log(validator.errors[i].message + " path: " + validator.errors[i].path);
+ LOG(validator.errors[i].message + " path: " + validator.errors[i].path);
}
- assert(false);
+ success = false;
}
+ AssertTrue(success);
}
function assertNotValid(type, instance, schema, errors, types) {
- var validator = new chromeHidden.JSONSchemaValidator();
+ var validator = new JSONSchemaValidator();
if (types)
validator.addTypes(types);
validator["validate" + type](instance, schema, "");
- assert(validator.errors.length === errors.length);
+ AssertTrue(validator.errors.length === errors.length);
+ var success = true;
for (var i = 0; i < errors.length; i++) {
if (validator.errors[i].message == errors[i]) {
- log("Got expected error: " + validator.errors[i].message + " for path: " +
- validator.errors[i].path);
+ LOG("Got expected error: " + validator.errors[i].message +
+ " for path: " + validator.errors[i].path);
} else {
- log("Missed expected error: " + errors[i] + ". Got: " +
+ LOG("Missed expected error: " + errors[i] + ". Got: " +
validator.errors[i].message + " instead.");
- assert(false);
+ success = false;
}
}
+ AssertTrue(success);
}
function assertListConsistsOfElements(list, elements) {
+ var success = true;
for (var li = 0; li < list.length; li++) {
for (var ei = 0; ei < elements.length && list[li] != elements[ei]; ei++) { }
if (ei == elements.length) {
- log("Expected type not found: " + list[li]);
- assert(false);
+ LOG("Expected type not found: " + list[li]);
+ success = false;
}
}
+ AssertTrue(success);
}
function assertEqualSets(set1, set2) {
@@ -55,14 +60,14 @@ function assertEqualSets(set1, set2) {
}
function formatError(key, replacements) {
- return chromeHidden.JSONSchemaValidator.formatError(key, replacements);
+ return JSONSchemaValidator.formatError(key, replacements);
}
function testFormatError() {
- assert(formatError("propertyRequired") == "Property is required.");
- assert(formatError("invalidEnum", ["foo, bar"]) ==
+ AssertTrue(formatError("propertyRequired") == "Property is required.");
+ AssertTrue(formatError("invalidEnum", ["foo, bar"]) ==
"Value must be one of: [foo, bar].");
- assert(formatError("invalidType", ["foo", "bar"]) ==
+ AssertTrue(formatError("invalidType", ["foo", "bar"]) ==
"Expected 'foo' but got 'bar'.");
}
@@ -388,7 +393,7 @@ function testNumber() {
formatError("numberMaxDecimal", [schema.maxDecimal])]);
var nan = 0/0;
- assert(isNaN(nan));
+ AssertTrue(isNaN(nan));
assertNotValid("Number", nan, schema,
[formatError("numberFiniteNotNan", ["NaN"])]);
@@ -502,7 +507,7 @@ function testGetAllTypesForSchema() {
]
};
- var validator = new chromeHidden.JSONSchemaValidator();
+ var validator = new JSONSchemaValidator();
validator.addTypes(referencedTypes);
var arraySchemaTypes = validator.getAllTypesForSchema(arraySchema);
@@ -542,21 +547,21 @@ function testIsValidSchemaType() {
]
};
- var validator = new chromeHidden.JSONSchemaValidator();
+ var validator = new JSONSchemaValidator();
validator.addTypes(referencedTypes);
- assert(validator.isValidSchemaType("object", objectSchema));
- assert(!validator.isValidSchemaType("integer", objectSchema));
- assert(!validator.isValidSchemaType("array", objectSchema));
- assert(validator.isValidSchemaType("null", objectSchema));
- assert(validator.isValidSchemaType("undefined", objectSchema));
-
- assert(validator.isValidSchemaType("integer", complexSchema));
- assert(validator.isValidSchemaType("function", complexSchema));
- assert(validator.isValidSchemaType("string", complexSchema));
- assert(!validator.isValidSchemaType("object", complexSchema));
- assert(!validator.isValidSchemaType("null", complexSchema));
- assert(!validator.isValidSchemaType("undefined", complexSchema));
+ AssertTrue(validator.isValidSchemaType("object", objectSchema));
+ AssertTrue(!validator.isValidSchemaType("integer", objectSchema));
+ AssertTrue(!validator.isValidSchemaType("array", objectSchema));
+ AssertTrue(validator.isValidSchemaType("null", objectSchema));
+ AssertTrue(validator.isValidSchemaType("undefined", objectSchema));
+
+ AssertTrue(validator.isValidSchemaType("integer", complexSchema));
+ AssertTrue(validator.isValidSchemaType("function", complexSchema));
+ AssertTrue(validator.isValidSchemaType("string", complexSchema));
+ AssertTrue(!validator.isValidSchemaType("object", complexSchema));
+ AssertTrue(!validator.isValidSchemaType("null", complexSchema));
+ AssertTrue(!validator.isValidSchemaType("undefined", complexSchema));
}
function testCheckSchemaOverlap() {
@@ -597,13 +602,30 @@ function testCheckSchemaOverlap() {
]
};
- var validator = new chromeHidden.JSONSchemaValidator();
+ var validator = new JSONSchemaValidator();
validator.addTypes(referencedTypes);
- assert(!validator.checkSchemaOverlap(arraySchema, choicesSchema));
- assert(!validator.checkSchemaOverlap(arraySchema, objectRefSchema));
- assert(!validator.checkSchemaOverlap(arraySchema, complexSchema));
- assert(validator.checkSchemaOverlap(choicesSchema, objectRefSchema));
- assert(validator.checkSchemaOverlap(choicesSchema, complexSchema));
- assert(validator.checkSchemaOverlap(objectRefSchema, complexSchema));
+ AssertTrue(!validator.checkSchemaOverlap(arraySchema, choicesSchema));
+ AssertTrue(!validator.checkSchemaOverlap(arraySchema, objectRefSchema));
+ AssertTrue(!validator.checkSchemaOverlap(arraySchema, complexSchema));
+ AssertTrue(validator.checkSchemaOverlap(choicesSchema, objectRefSchema));
+ AssertTrue(validator.checkSchemaOverlap(choicesSchema, complexSchema));
+ AssertTrue(validator.checkSchemaOverlap(objectRefSchema, complexSchema));
}
+
+// Tests exposed to schema_unittest.cc.
+exports.testFormatError = testFormatError;
+exports.testComplex = testComplex;
+exports.testEnum = testEnum;
+exports.testExtends = testExtends;
+exports.testObject = testObject;
+exports.testArrayTuple = testArrayTuple;
+exports.testArrayNonTuple = testArrayNonTuple;
+exports.testString = testString;
+exports.testNumber = testNumber;
+exports.testIntegerBounds = testIntegerBounds;
+exports.testType = testType;
+exports.testTypeReference = testTypeReference;
+exports.testGetAllTypesForSchema = testGetAllTypesForSchema;
+exports.testIsValidSchemaType = testIsValidSchemaType;
+exports.testCheckSchemaOverlap = testCheckSchemaOverlap;