Index: chrome/renderer/module_system_unittest.cc |
diff --git a/chrome/renderer/module_system_unittest.cc b/chrome/renderer/module_system_unittest.cc |
index bed8a27321dd487739a8bc0bfb4acc546e020379..7f2e2be0545a3e1e3811aeb6c862e8980280dd49 100644 |
--- a/chrome/renderer/module_system_unittest.cc |
+++ b/chrome/renderer/module_system_unittest.cc |
@@ -4,12 +4,14 @@ |
#include "base/callback.h" |
#include "base/memory/scoped_ptr.h" |
+#include "base/string_piece.h" |
#include "chrome/renderer/module_system.h" |
#include "testing/gtest/include/gtest/gtest.h" |
#include <map> |
#include <string> |
+// Native JS functions for doing asserts. |
class AssertNatives : public NativeHandler { |
public: |
AssertNatives() |
@@ -33,22 +35,70 @@ class AssertNatives : public NativeHandler { |
bool failed_; |
}; |
+class StringSourceMap : public ModuleSystem::SourceMap { |
+ public: |
+ StringSourceMap() {} |
+ |
+ v8::Handle<v8::Value> GetSource(const std::string& name) OVERRIDE { |
+ if (source_map_.count(name) == 0) |
+ return v8::Undefined(); |
+ return v8::String::New(source_map_[name].c_str()); |
+ } |
+ |
+ bool Contains(const std::string& name) OVERRIDE { |
+ return source_map_.count(name); |
+ } |
+ |
+ void RegisterModule(const std::string& name, const std::string& source) { |
+ source_map_[name] = source; |
+ } |
+ |
+ private: |
+ 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()), |
- assert_natives_(new AssertNatives()) { |
+ handle_scope_(), |
+ source_map_(new StringSourceMap()) { |
context_->Enter(); |
- source_map_["add"] = "exports.Add = function(x, y) { return x + y; };"; |
- module_system_.reset(new ModuleSystem(&source_map_)); |
+ assert_natives_ = new AssertNatives(); |
+ module_system_.reset(new ModuleSystem(source_map_)); |
module_system_->RegisterNativeHandler("assert", scoped_ptr<NativeHandler>( |
assert_natives_)); |
+ RegisterModule("add", "exports.Add = function(x, y) { return x + y; };"); |
} |
~ModuleSystemTest() { |
+ context_->Exit(); |
context_.Dispose(); |
} |
+ void RegisterModule(const std::string& name, const std::string& code) { |
+ source_map_->RegisterModule(name, code); |
+ } |
+ |
virtual void TearDown() { |
// All tests must call a native function at least once. |
ASSERT_TRUE(assert_natives_->native_function_called()); |
@@ -56,45 +106,63 @@ class ModuleSystemTest : public testing::Test { |
ASSERT_FALSE(try_catch_.HasCaught()); |
} |
+ v8::Persistent<v8::Context> context_; |
v8::HandleScope handle_scope_; |
v8::TryCatch try_catch_; |
- v8::Persistent<v8::Context> context_; |
AssertNatives* assert_natives_; |
- std::map<std::string, std::string> source_map_; |
+ StringSourceMap* source_map_; |
scoped_ptr<ModuleSystem> module_system_; |
}; |
TEST_F(ModuleSystemTest, TestRequire) { |
- source_map_["test"] = |
+ RegisterModule("test", |
"var Add = require('add').Add;" |
- "requireNative('assert').AssertTrue(Add(3, 5) == 8);"; |
+ "requireNative('assert').AssertTrue(Add(3, 5) == 8);"); |
module_system_->Require("test"); |
} |
TEST_F(ModuleSystemTest, TestNestedRequire) { |
- source_map_["double"] = |
+ RegisterModule("double", |
"var Add = require('add').Add;" |
- "exports.Double = function(x) { return Add(x, x); };"; |
- source_map_["test"] = |
+ "exports.Double = function(x) { return Add(x, x); };"); |
+ RegisterModule("test", |
"var Double = require('double').Double;" |
- "requireNative('assert').AssertTrue(Double(3) == 6);"; |
+ "requireNative('assert').AssertTrue(Double(3) == 6);"); |
module_system_->Require("test"); |
} |
TEST_F(ModuleSystemTest, TestModuleInsulation) { |
- source_map_["x"] = |
+ RegisterModule("x", |
"var x = 10;" |
- "exports.X = function() { return x; };"; |
- source_map_["y"] = |
+ "exports.X = function() { return x; };"); |
+ RegisterModule("y", |
"var x = 15;" |
"require('x');" |
- "exports.Y = function() { return x; };"; |
- source_map_["test"] = |
+ "exports.Y = function() { return x; };"); |
+ RegisterModule("test", |
"var Y = require('y').Y;" |
"var X = require('x').X;" |
"var assert = requireNative('assert');" |
"assert.AssertTrue(!this.hasOwnProperty('x'));" |
"assert.AssertTrue(Y() == 15);" |
- "assert.AssertTrue(X() == 10);"; |
+ "assert.AssertTrue(X() == 10);"); |
+ module_system_->Require("test"); |
+} |
+ |
+TEST_F(ModuleSystemTest, TestDisableNativesPreventsNativeModulesBeingLoaded) { |
+ module_system_->RegisterNativeHandler("disable", |
+ scoped_ptr<NativeHandler>( |
+ new DisableNativesHandler(module_system_.get()))); |
+ RegisterModule("test", |
+ "var assert = requireNative('assert');" |
+ "var disable = requireNative('disable');" |
+ "disable.DisableNatives();" |
+ "var caught = false;" |
+ "try {" |
+ " requireNative('assert');" |
+ "} catch (e) {" |
+ " caught = true;" |
+ "}" |
+ "assert.AssertTrue(caught);"); |
module_system_->Require("test"); |
} |