Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4099)

Unified Diff: chrome/renderer/module_system_unittest.cc

Issue 9835039: Make app_custom_bindings.js lazily evaluated so it doesn't execute on every page load. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: respond to comments Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/renderer/module_system_unittest.cc
diff --git a/chrome/renderer/module_system_unittest.cc b/chrome/renderer/module_system_unittest.cc
index 6b9b0206e4750e432ed405ae4c8c602bc18a3c03..222f76a6e7b215bb9d81456b9aba067f27333f15 100644
--- a/chrome/renderer/module_system_unittest.cc
+++ b/chrome/renderer/module_system_unittest.cc
@@ -15,26 +15,49 @@
class AssertNatives : public NativeHandler {
public:
AssertNatives()
- : native_function_called_(false),
+ : assertion_made_(false),
failed_(false) {
RouteFunction("AssertTrue", base::Bind(&AssertNatives::AssertTrue,
base::Unretained(this)));
}
- bool native_function_called() { return native_function_called_; }
+ bool assertion_made() { return assertion_made_; }
bool failed() { return failed_; }
v8::Handle<v8::Value> AssertTrue(const v8::Arguments& args) {
- native_function_called_ = true;
+ assertion_made_ = true;
failed_ = failed_ || !args[0]->ToBoolean()->Value();
return v8::Undefined();
}
private:
- bool native_function_called_;
+ bool assertion_made_;
bool failed_;
};
+class CounterNatives : public NativeHandler {
+ public:
+ CounterNatives()
+ : counter_(0) {
not at google - send to devlin 2012/03/26 02:29:49 nit: on same line as CounterNatives()
koz (OOO until 15th September) 2012/03/26 03:58:59 Done.
+ RouteFunction("Get", base::Bind(&CounterNatives::Get,
+ base::Unretained(this)));
+ RouteFunction("Increment", base::Bind(&CounterNatives::Increment,
+ base::Unretained(this)));
+ }
+
+ v8::Handle<v8::Value> Get(const v8::Arguments& args) {
+ return v8::Integer::New(counter_);
+ }
+
+ v8::Handle<v8::Value> Increment(const v8::Arguments& args) {
+ counter_++;
+ return v8::Undefined();
+ }
+
+ private:
+ int counter_;
+};
+
class StringSourceMap : public ModuleSystem::SourceMap {
public:
StringSourceMap() {}
@@ -58,30 +81,12 @@ class StringSourceMap : public ModuleSystem::SourceMap {
std::map<std::string, std::string> source_map_;
};
-// Native JS functions for disabling injection in ModuleSystem.
-class DisableNativesHandler : public NativeHandler {
- public:
- explicit DisableNativesHandler(ModuleSystem* module_system)
- : module_system_(module_system) {
- RouteFunction("DisableNatives",
- base::Bind(&DisableNativesHandler::DisableNatives,
- base::Unretained(this)));
- }
-
- v8::Handle<v8::Value> DisableNatives(const v8::Arguments& args) {
- module_system_->set_natives_enabled(false);
- return v8::Undefined();
- }
-
- private:
- ModuleSystem* module_system_;
-};
-
class ModuleSystemTest : public testing::Test {
public:
ModuleSystemTest()
: context_(v8::Context::New()),
- source_map_(new StringSourceMap()) {
+ source_map_(new StringSourceMap()),
+ should_assertions_be_made_(true) {
context_->Enter();
assert_natives_ = new AssertNatives();
module_system_.reset(new ModuleSystem(source_map_.get()));
@@ -101,9 +106,22 @@ class ModuleSystemTest : public testing::Test {
virtual void TearDown() {
// All tests must call a native function at least once.
- ASSERT_TRUE(assert_natives_->native_function_called());
- ASSERT_FALSE(assert_natives_->failed());
ASSERT_FALSE(try_catch_.HasCaught());
+ ASSERT_EQ(should_assertions_be_made_,
+ assert_natives_->assertion_made());
+ ASSERT_FALSE(assert_natives_->failed());
+ }
+
+ void ExpectNoAssertionsMade() {
not at google - send to devlin 2012/03/26 02:29:49 This is an unfortunate name in the context of gtes
koz (OOO until 15th September) 2012/03/26 03:58:59 Yeah. I can't think of a better name that's not su
+ should_assertions_be_made_ = false;
+ }
+
+ v8::Handle<v8::Object> CreateGlobal(const std::string& name) {
+ v8::HandleScope handle_scope;
+ v8::Handle<v8::Object> object = v8::Object::New();
+ v8::Context::GetCurrent()->Global()->Set(v8::String::New(name.c_str()),
+ object);
+ return handle_scope.Close(object);
}
v8::Persistent<v8::Context> context_;
@@ -112,9 +130,11 @@ class ModuleSystemTest : public testing::Test {
AssertNatives* assert_natives_;
scoped_ptr<StringSourceMap> source_map_;
scoped_ptr<ModuleSystem> module_system_;
+ bool should_assertions_be_made_;
};
TEST_F(ModuleSystemTest, TestRequire) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
RegisterModule("test",
"var Add = require('add').Add;"
"requireNative('assert').AssertTrue(Add(3, 5) == 8);");
@@ -122,6 +142,7 @@ TEST_F(ModuleSystemTest, TestRequire) {
}
TEST_F(ModuleSystemTest, TestNestedRequire) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
RegisterModule("double",
"var Add = require('add').Add;"
"exports.Double = function(x) { return Add(x, x); };");
@@ -132,6 +153,7 @@ TEST_F(ModuleSystemTest, TestNestedRequire) {
}
TEST_F(ModuleSystemTest, TestModuleInsulation) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
RegisterModule("x",
"var x = 10;"
"exports.X = function() { return x; };");
@@ -149,30 +171,42 @@ TEST_F(ModuleSystemTest, TestModuleInsulation) {
module_system_->Require("test");
}
-TEST_F(ModuleSystemTest, TestDisableNativesPreventsNativeModulesBeingLoaded) {
- module_system_->RegisterNativeHandler("disable",
- scoped_ptr<NativeHandler>(
- new DisableNativesHandler(module_system_.get())));
+TEST_F(ModuleSystemTest, TestNativesAreDisabledOutsideANativesEnabledScope) {
RegisterModule("test",
- "var assert = requireNative('assert');"
- "var disable = requireNative('disable');"
- "disable.DisableNatives();"
- "var caught = false;"
+ "var assert;"
"try {"
- " requireNative('assert');"
+ " assert = requireNative('assert');"
"} catch (e) {"
" caught = true;"
"}"
- "assert.AssertTrue(caught);");
+ "if (assert) {"
+ " assert.AssertTrue(true);"
+ "}");
module_system_->Require("test");
+ ExpectNoAssertionsMade();
+}
+
+TEST_F(ModuleSystemTest, TestNativesAreEnabledWithinANativesEnabledScope) {
+ RegisterModule("test",
+ "var assert = requireNative('assert');"
+ "assert.AssertTrue(true);");
+
+ {
+ ModuleSystem::NativesEnabledScope natives_enabled(module_system_.get());
+ {
+ ModuleSystem::NativesEnabledScope natives_enabled_inner(
+ module_system_.get());
+ }
+ module_system_->Require("test");
+ }
}
TEST_F(ModuleSystemTest, TestLazyField) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
RegisterModule("lazy",
"exports.x = 5;");
- v8::Handle<v8::Object> object = v8::Object::New();
- v8::Context::GetCurrent()->Global()->Set(v8::String::New("object"), object);
+ v8::Handle<v8::Object> object = CreateGlobal("object");
module_system_->SetLazyField(object, "blah", "lazy", "x");
@@ -181,3 +215,99 @@ TEST_F(ModuleSystemTest, TestLazyField) {
"assert.AssertTrue(object.blah == 5);");
module_system_->Require("test");
}
+
+TEST_F(ModuleSystemTest, TestLazyFieldYieldingObject) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
+ RegisterModule("lazy",
+ "var object = {};"
+ "object.__defineGetter__('z', function() { return 1; });"
+ "object.x = 5;"
+ "object.y = function() { return 10; };"
+ "exports.object = object;");
+
+ v8::Handle<v8::Object> object = CreateGlobal("object");
+
+ module_system_->SetLazyField(object, "thing", "lazy", "object");
+
+ RegisterModule("test",
+ "var assert = requireNative('assert');"
+ "assert.AssertTrue(object.thing.x == 5);"
+ "assert.AssertTrue(object.thing.y() == 10);"
+ "assert.AssertTrue(object.thing.z == 1);"
+ );
+ module_system_->Require("test");
+}
+
+TEST_F(ModuleSystemTest, TestLazyFieldIsOnlyEvaledOnce) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
+ module_system_->RegisterNativeHandler(
+ "counter",
+ scoped_ptr<NativeHandler>(new CounterNatives()));
+ RegisterModule("lazy",
+ "requireNative('counter').Increment();"
+ "exports.x = 5;");
+
+ v8::Handle<v8::Object> object = CreateGlobal("object");
+
+ module_system_->SetLazyField(object, "x", "lazy", "x");
+
+ RegisterModule("test",
+ "var assert = requireNative('assert');"
+ "var counter = requireNative('counter');"
+ "assert.AssertTrue(counter.Get() == 0);"
+ "object.x;"
+ "assert.AssertTrue(counter.Get() == 1);"
+ "object.x;"
+ "assert.AssertTrue(counter.Get() == 1);");
+ module_system_->Require("test");
+}
+
+TEST_F(ModuleSystemTest, TestRequireNativesAfterLazyEvaluation) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
+ RegisterModule("lazy",
+ "exports.x = 5;");
+ v8::Handle<v8::Object> object = CreateGlobal("object");
+
+ module_system_->SetLazyField(object, "x", "lazy", "x");
+ RegisterModule("test",
+ "object.x;"
+ "requireNative('assert').AssertTrue(true);");
+ module_system_->Require("test");
+}
+
+TEST_F(ModuleSystemTest, TestTransitiveRequire) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
+ RegisterModule("dependency",
+ "exports.x = 5;");
+ RegisterModule("lazy",
+ "exports.output = require('dependency');");
+
+ v8::Handle<v8::Object> object = CreateGlobal("object");
+
+ module_system_->SetLazyField(object, "thing", "lazy", "output");
+
+ RegisterModule("test",
+ "var assert = requireNative('assert');"
+ "assert.AssertTrue(object.thing.x == 5);");
+ module_system_->Require("test");
+}
+
+TEST_F(ModuleSystemTest, TestModulesOnlyGetEvaledOnce) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
+ module_system_->RegisterNativeHandler(
+ "counter",
+ scoped_ptr<NativeHandler>(new CounterNatives()));
+
+ RegisterModule("incrementsWhenEvaled",
+ "requireNative('counter').Increment();");
+ RegisterModule("test",
+ "var assert = requireNative('assert');"
+ "var counter = requireNative('counter');"
+ "assert.AssertTrue(counter.Get() == 0);"
+ "require('incrementsWhenEvaled');"
+ "assert.AssertTrue(counter.Get() == 1);"
+ "require('incrementsWhenEvaled');"
+ "assert.AssertTrue(counter.Get() == 1);");
+
+ module_system_->Require("test");
+}

Powered by Google App Engine
This is Rietveld 408576698