summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
authorkoz@chromium.org <koz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-10 00:35:59 +0000
committerkoz@chromium.org <koz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-10 00:35:59 +0000
commit11844fa2e459d8b64d743323e95e4b3f0eea4616 (patch)
treef92c701828ebe6ddc909ff6b4a480d797da6c8ab /chrome/renderer
parentc5eef3146b705a8bc2412d672ba78c26cfe0f886 (diff)
downloadchromium_src-11844fa2e459d8b64d743323e95e4b3f0eea4616.zip
chromium_src-11844fa2e459d8b64d743323e95e4b3f0eea4616.tar.gz
chromium_src-11844fa2e459d8b64d743323e95e4b3f0eea4616.tar.bz2
Add unit tests for event.js
BUG=121479 TEST=supplied unit tests Review URL: https://chromiumcodereview.appspot.com/10383035 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@136200 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r--chrome/renderer/extensions/event_unittest.cc89
-rw-r--r--chrome/renderer/module_system.cc6
-rw-r--r--chrome/renderer/module_system.h8
-rw-r--r--chrome/renderer/module_system_unittest.cc17
-rw-r--r--chrome/renderer/native_handler.h2
-rw-r--r--chrome/renderer/resources/extensions/event.js3
6 files changed, 123 insertions, 2 deletions
diff --git a/chrome/renderer/extensions/event_unittest.cc b/chrome/renderer/extensions/event_unittest.cc
new file mode 100644
index 0000000..ca1d9b04
--- /dev/null
+++ b/chrome/renderer/extensions/event_unittest.cc
@@ -0,0 +1,89 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/test/base/module_system_test.h"
+
+#include "grit/renderer_resources.h"
+
+namespace {
+
+class EventUnittest : public ModuleSystemTest {
+ virtual void SetUp() OVERRIDE {
+ ModuleSystemTest::SetUp();
+ module_system_->RunString("chrome = {};", "setup-chrome");
+
+ RegisterModule("event", IDR_EVENT_BINDINGS_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",
+ "var assert = requireNative('assert');"
+ "var attachedListeners = exports.attachedListeners = {};"
+ "exports.AttachEvent = function(eventName) {"
+ " assert.AssertFalse(!!attachedListeners[eventName]);"
+ " attachedListeners[eventName] = 1;"
+ "};"
+ "exports.DetachEvent = function(eventName) {"
+ " assert.AssertTrue(!!attachedListeners[eventName]);"
+ " delete attachedListeners[eventName];"
+ "};");
+ OverrideNativeHandler("chrome_hidden",
+ "var chromeHidden = {};"
+ "exports.GetChromeHidden = function() { return chromeHidden; };");
+ }
+};
+
+TEST_F(EventUnittest, TestNothing) {
+ ExpectNoAssertionsMade();
+}
+
+TEST_F(EventUnittest, AddRemoveTwoListeners) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
+ RegisterModule("test",
+ "var assert = requireNative('assert');"
+ "var event = require('event');"
+ "var eventBindings = requireNative('event_bindings');"
+ "var myEvent = new event.Event('named-event');"
+ "var cb1 = function() {};"
+ "var cb2 = function() {};"
+ "myEvent.addListener(cb1);"
+ "myEvent.addListener(cb2);"
+ "myEvent.removeListener(cb1);"
+ "assert.AssertTrue(!!eventBindings.attachedListeners['named-event']);"
+ "myEvent.removeListener(cb2);"
+ "assert.AssertFalse(!!eventBindings.attachedListeners['named-event']);");
+ module_system_->Require("test");
+}
+
+TEST_F(EventUnittest, EventsThatSupportRulesMustHaveAName) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
+ RegisterModule("test",
+ "var event = require('event');"
+ "var eventOpts = {supportsRules: true};"
+ "var assert = requireNative('assert');"
+ "var caught = false;"
+ "try {"
+ " var myEvent = new event.Event(undefined, undefined, eventOpts);"
+ "} catch (e) {"
+ " caught = true;"
+ "}"
+ "assert.AssertTrue(caught);");
+ module_system_->Require("test");
+}
+
+TEST_F(EventUnittest, NamedEventDispatch) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
+ RegisterModule("test",
+ "var event = require('event');"
+ "var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();"
+ "var assert = requireNative('assert');"
+ "var e = new event.Event('myevent');"
+ "var called = false;"
+ "e.addListener(function() { called = true; });"
+ "chromeHidden.Event.dispatch('myevent', []);"
+ "assert.AssertTrue(called);");
+ module_system_->Require("test");
+}
+
+} // namespace
diff --git a/chrome/renderer/module_system.cc b/chrome/renderer/module_system.cc
index 7c246e4..c0c0c8f 100644
--- a/chrome/renderer/module_system.cc
+++ b/chrome/renderer/module_system.cc
@@ -117,6 +117,10 @@ void ModuleSystem::RegisterNativeHandler(const std::string& name,
linked_ptr<NativeHandler>(native_handler.release());
}
+void ModuleSystem::OverrideNativeHandler(const std::string& name) {
+ overridden_native_handlers_.insert(name);
+}
+
void ModuleSystem::RunString(const std::string& code, const std::string& name) {
v8::HandleScope handle_scope;
RunString(v8::String::New(code.c_str()), v8::String::New(name.c_str()));
@@ -205,6 +209,8 @@ v8::Handle<v8::Value> ModuleSystem::GetNative(const v8::Arguments& args) {
if (natives_enabled_ == 0)
return ThrowException("Natives disabled");
std::string native_name = *v8::String::AsciiValue(args[0]->ToString());
+ if (overridden_native_handlers_.count(native_name) > 0u)
+ return RequireForJs(args);
NativeHandlerMap::iterator i = native_handler_map_.find(native_name);
if (i == native_handler_map_.end())
return v8::Undefined();
diff --git a/chrome/renderer/module_system.h b/chrome/renderer/module_system.h
index c68137a..65b49d4 100644
--- a/chrome/renderer/module_system.h
+++ b/chrome/renderer/module_system.h
@@ -13,6 +13,7 @@
#include "v8/include/v8.h"
#include <map>
+#include <set>
#include <string>
// A module system for JS similar to node.js' require() function.
@@ -70,6 +71,11 @@ class ModuleSystem : public NativeHandler {
void RegisterNativeHandler(const std::string& name,
scoped_ptr<NativeHandler> native_handler);
+ // Causes requireNative(|name|) to look for its module in |source_map_|
+ // instead of using a registered native handler. This can be used in unit
+ // tests to mock out native modules.
+ void OverrideNativeHandler(const std::string& name);
+
// Executes |code| in the current context with |name| as the filename.
void RunString(const std::string& code, const std::string& name);
@@ -124,6 +130,8 @@ class ModuleSystem : public NativeHandler {
// pinned natives as enabled.
int natives_enabled_;
+ std::set<std::string> overridden_native_handlers_;
+
DISALLOW_COPY_AND_ASSIGN(ModuleSystem);
};
diff --git a/chrome/renderer/module_system_unittest.cc b/chrome/renderer/module_system_unittest.cc
index 45e7e30..03fc17c 100644
--- a/chrome/renderer/module_system_unittest.cc
+++ b/chrome/renderer/module_system_unittest.cc
@@ -208,3 +208,20 @@ TEST_F(ModuleSystemTest, TestModulesOnlyGetEvaledOnce) {
module_system_->Require("test");
}
+
+TEST_F(ModuleSystemTest, TestOverrideNativeHandler) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
+ OverrideNativeHandler("assert", "exports.AssertTrue = function() {};");
+ RegisterModule("test", "requireNative('assert').AssertTrue(true);");
+ ExpectNoAssertionsMade();
+ module_system_->Require("test");
+}
+
+TEST_F(ModuleSystemTest, TestOverrideNonExistentNativeHandler) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
+ OverrideNativeHandler("thing", "exports.x = 5;");
+ RegisterModule("test",
+ "var assert = requireNative('assert');"
+ "assert.AssertTrue(requireNative('thing').x == 5);");
+ module_system_->Require("test");
+}
diff --git a/chrome/renderer/native_handler.h b/chrome/renderer/native_handler.h
index 6efe444..7fe45f9 100644
--- a/chrome/renderer/native_handler.h
+++ b/chrome/renderer/native_handler.h
@@ -29,7 +29,7 @@ class NativeHandler {
// Create an object with bindings to the native functions defined through
// RouteFunction().
- v8::Handle<v8::Object> NewInstance();
+ virtual v8::Handle<v8::Object> NewInstance();
protected:
typedef v8::Handle<v8::Value> (*HandlerFunc)(const v8::Arguments&);
diff --git a/chrome/renderer/resources/extensions/event.js b/chrome/renderer/resources/extensions/event.js
index 5288b6e..81c465b 100644
--- a/chrome/renderer/resources/extensions/event.js
+++ b/chrome/renderer/resources/extensions/event.js
@@ -5,7 +5,6 @@
var eventBindingsNatives = requireNative('event_bindings');
var AttachEvent = eventBindingsNatives.AttachEvent;
var DetachEvent = eventBindingsNatives.DetachEvent;
- var Print = eventBindingsNatives.Print;
var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
@@ -313,3 +312,5 @@
chromeHidden.dispatchError = function(msg) {
console.error(msg);
};
+
+ exports.Event = chrome.Event;