diff options
author | koz@chromium.org <koz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-10 00:35:59 +0000 |
---|---|---|
committer | koz@chromium.org <koz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-10 00:35:59 +0000 |
commit | 11844fa2e459d8b64d743323e95e4b3f0eea4616 (patch) | |
tree | f92c701828ebe6ddc909ff6b4a480d797da6c8ab /chrome/renderer | |
parent | c5eef3146b705a8bc2412d672ba78c26cfe0f886 (diff) | |
download | chromium_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.cc | 89 | ||||
-rw-r--r-- | chrome/renderer/module_system.cc | 6 | ||||
-rw-r--r-- | chrome/renderer/module_system.h | 8 | ||||
-rw-r--r-- | chrome/renderer/module_system_unittest.cc | 17 | ||||
-rw-r--r-- | chrome/renderer/native_handler.h | 2 | ||||
-rw-r--r-- | chrome/renderer/resources/extensions/event.js | 3 |
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; |