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

Unified Diff: chrome/renderer/extensions/module_system_unittest.cc

Issue 359413004: Add support for using AMD modules from extensions modules. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: extensions_renderer should depend on gin Created 6 years, 5 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/extensions/module_system_unittest.cc
diff --git a/chrome/renderer/extensions/module_system_unittest.cc b/chrome/renderer/extensions/module_system_unittest.cc
index 84ccd7fc1dd0da957e85d4a3c23b710fef643885..f99cb622256b6450e7dee2883764ae73b2595d7a 100644
--- a/chrome/renderer/extensions/module_system_unittest.cc
+++ b/chrome/renderer/extensions/module_system_unittest.cc
@@ -5,6 +5,7 @@
#include "base/memory/scoped_ptr.h"
#include "chrome/test/base/module_system_test.h"
#include "extensions/renderer/module_system.h"
+#include "gin/modules/module_registry.h"
// TODO(cduvall/kalman): Put this file in extensions namespace.
using extensions::ModuleSystem;
@@ -51,14 +52,14 @@ class TestExceptionHandler : public ModuleSystem::ExceptionHandler {
TEST_F(ModuleSystemTest, TestExceptionHandling) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(
- context_->module_system());
+ env()->module_system());
TestExceptionHandler* handler = new TestExceptionHandler;
scoped_ptr<ModuleSystem::ExceptionHandler> scoped_handler(handler);
ASSERT_FALSE(handler->handled_exception());
- context_->module_system()->SetExceptionHandlerForTest(scoped_handler.Pass());
+ env()->module_system()->SetExceptionHandlerForTest(scoped_handler.Pass());
- RegisterModule("test", "throw 'hi';");
- context_->module_system()->Require("test");
+ env()->RegisterModule("test", "throw 'hi';");
+ env()->module_system()->Require("test");
ASSERT_TRUE(handler->handled_exception());
ExpectNoAssertionsMade();
@@ -66,210 +67,423 @@ TEST_F(ModuleSystemTest, TestExceptionHandling) {
TEST_F(ModuleSystemTest, TestRequire) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(
- context_->module_system());
- RegisterModule("add", "exports.Add = function(x, y) { return x + y; };");
- RegisterModule("test",
- "var Add = require('add').Add;"
- "requireNative('assert').AssertTrue(Add(3, 5) == 8);");
- context_->module_system()->Require("test");
+ env()->module_system());
+ env()->RegisterModule("add",
+ "exports.Add = function(x, y) { return x + y; };");
+ env()->RegisterModule("test",
+ "var Add = require('add').Add;"
+ "requireNative('assert').AssertTrue(Add(3, 5) == 8);");
+ env()->module_system()->Require("test");
}
TEST_F(ModuleSystemTest, TestNestedRequire) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(
- context_->module_system());
- RegisterModule("add", "exports.Add = function(x, y) { return x + y; };");
- RegisterModule("double",
- "var Add = require('add').Add;"
- "exports.Double = function(x) { return Add(x, x); };");
- RegisterModule("test",
- "var Double = require('double').Double;"
- "requireNative('assert').AssertTrue(Double(3) == 6);");
- context_->module_system()->Require("test");
+ env()->module_system());
+ env()->RegisterModule("add",
+ "exports.Add = function(x, y) { return x + y; };");
+ env()->RegisterModule("double",
+ "var Add = require('add').Add;"
+ "exports.Double = function(x) { return Add(x, x); };");
+ env()->RegisterModule("test",
+ "var Double = require('double').Double;"
+ "requireNative('assert').AssertTrue(Double(3) == 6);");
+ env()->module_system()->Require("test");
}
TEST_F(ModuleSystemTest, TestModuleInsulation) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(
- context_->module_system());
- RegisterModule("x",
- "var x = 10;"
- "exports.X = function() { return x; };");
- RegisterModule("y",
- "var x = 15;"
- "require('x');"
- "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);");
- context_->module_system()->Require("test");
+ env()->module_system());
+ env()->RegisterModule("x",
+ "var x = 10;"
+ "exports.X = function() { return x; };");
+ env()->RegisterModule("y",
+ "var x = 15;"
+ "require('x');"
+ "exports.Y = function() { return x; };");
+ env()->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);");
+ env()->module_system()->Require("test");
}
TEST_F(ModuleSystemTest, TestNativesAreDisabledOutsideANativesEnabledScope) {
- RegisterModule("test",
- "var assert;"
- "try {"
- " assert = requireNative('assert');"
- "} catch (e) {"
- " var caught = true;"
- "}"
- "if (assert) {"
- " assert.AssertTrue(true);"
- "}");
- context_->module_system()->Require("test");
+ env()->RegisterModule("test",
+ "var assert;"
+ "try {"
+ " assert = requireNative('assert');"
+ "} catch (e) {"
+ " var caught = true;"
+ "}"
+ "if (assert) {"
+ " assert.AssertTrue(true);"
+ "}");
+ env()->module_system()->Require("test");
ExpectNoAssertionsMade();
}
TEST_F(ModuleSystemTest, TestNativesAreEnabledWithinANativesEnabledScope) {
- RegisterModule("test",
- "var assert = requireNative('assert');"
- "assert.AssertTrue(true);");
+ env()->RegisterModule("test",
+ "var assert = requireNative('assert');"
+ "assert.AssertTrue(true);");
{
- ModuleSystem::NativesEnabledScope natives_enabled(
- context_->module_system());
+ ModuleSystem::NativesEnabledScope natives_enabled(env()->module_system());
{
ModuleSystem::NativesEnabledScope natives_enabled_inner(
- context_->module_system());
+ env()->module_system());
}
- context_->module_system()->Require("test");
+ env()->module_system()->Require("test");
}
}
TEST_F(ModuleSystemTest, TestLazyField) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(
- context_->module_system());
- RegisterModule("lazy",
- "exports.x = 5;");
+ env()->module_system());
+ env()->RegisterModule("lazy", "exports.x = 5;");
- v8::Handle<v8::Object> object = CreateGlobal("object");
+ v8::Handle<v8::Object> object = env()->CreateGlobal("object");
- context_->module_system()->SetLazyField(object, "blah", "lazy", "x");
+ env()->module_system()->SetLazyField(object, "blah", "lazy", "x");
- RegisterModule("test",
- "var assert = requireNative('assert');"
- "assert.AssertTrue(object.blah == 5);");
- context_->module_system()->Require("test");
+ env()->RegisterModule("test",
+ "var assert = requireNative('assert');"
+ "assert.AssertTrue(object.blah == 5);");
+ env()->module_system()->Require("test");
}
TEST_F(ModuleSystemTest, TestLazyFieldYieldingObject) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(
- context_->module_system());
- RegisterModule("lazy",
+ env()->module_system());
+ env()->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");
+ v8::Handle<v8::Object> object = env()->CreateGlobal("object");
- context_->module_system()->SetLazyField(object, "thing", "lazy", "object");
+ env()->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);"
- );
- context_->module_system()->Require("test");
+ env()->RegisterModule("test",
+ "var assert = requireNative('assert');"
+ "assert.AssertTrue(object.thing.x == 5);"
+ "assert.AssertTrue(object.thing.y() == 10);"
+ "assert.AssertTrue(object.thing.z == 1);");
+ env()->module_system()->Require("test");
}
TEST_F(ModuleSystemTest, TestLazyFieldIsOnlyEvaledOnce) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(
- context_->module_system());
- context_->module_system()->RegisterNativeHandler(
+ env()->module_system());
+ env()->module_system()->RegisterNativeHandler(
"counter",
- scoped_ptr<NativeHandler>(new CounterNatives(context_.get())));
- RegisterModule("lazy",
- "requireNative('counter').Increment();"
- "exports.x = 5;");
-
- v8::Handle<v8::Object> object = CreateGlobal("object");
-
- context_->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);");
- context_->module_system()->Require("test");
+ scoped_ptr<NativeHandler>(new CounterNatives(env()->context())));
+ env()->RegisterModule("lazy",
+ "requireNative('counter').Increment();"
+ "exports.x = 5;");
+
+ v8::Handle<v8::Object> object = env()->CreateGlobal("object");
+
+ env()->module_system()->SetLazyField(object, "x", "lazy", "x");
+
+ env()->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);");
+ env()->module_system()->Require("test");
}
TEST_F(ModuleSystemTest, TestRequireNativesAfterLazyEvaluation) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(
- context_->module_system());
- RegisterModule("lazy",
- "exports.x = 5;");
- v8::Handle<v8::Object> object = CreateGlobal("object");
-
- context_->module_system()->SetLazyField(object, "x", "lazy", "x");
- RegisterModule("test",
- "object.x;"
- "requireNative('assert').AssertTrue(true);");
- context_->module_system()->Require("test");
+ env()->module_system());
+ env()->RegisterModule("lazy", "exports.x = 5;");
+ v8::Handle<v8::Object> object = env()->CreateGlobal("object");
+
+ env()->module_system()->SetLazyField(object, "x", "lazy", "x");
+ env()->RegisterModule("test",
+ "object.x;"
+ "requireNative('assert').AssertTrue(true);");
+ env()->module_system()->Require("test");
}
TEST_F(ModuleSystemTest, TestTransitiveRequire) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(
- context_->module_system());
- RegisterModule("dependency",
- "exports.x = 5;");
- RegisterModule("lazy",
- "exports.output = require('dependency');");
+ env()->module_system());
+ env()->RegisterModule("dependency", "exports.x = 5;");
+ env()->RegisterModule("lazy", "exports.output = require('dependency');");
- v8::Handle<v8::Object> object = CreateGlobal("object");
+ v8::Handle<v8::Object> object = env()->CreateGlobal("object");
- context_->module_system()->SetLazyField(object, "thing", "lazy", "output");
+ env()->module_system()->SetLazyField(object, "thing", "lazy", "output");
- RegisterModule("test",
- "var assert = requireNative('assert');"
- "assert.AssertTrue(object.thing.x == 5);");
- context_->module_system()->Require("test");
+ env()->RegisterModule("test",
+ "var assert = requireNative('assert');"
+ "assert.AssertTrue(object.thing.x == 5);");
+ env()->module_system()->Require("test");
}
TEST_F(ModuleSystemTest, TestModulesOnlyGetEvaledOnce) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(
- context_->module_system());
- context_->module_system()->RegisterNativeHandler(
+ env()->module_system());
+ env()->module_system()->RegisterNativeHandler(
"counter",
- scoped_ptr<NativeHandler>(new CounterNatives(context_.get())));
-
- 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);");
-
- context_->module_system()->Require("test");
+ scoped_ptr<NativeHandler>(new CounterNatives(env()->context())));
+
+ env()->RegisterModule("incrementsWhenEvaled",
+ "requireNative('counter').Increment();");
+ env()->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);");
+
+ env()->module_system()->Require("test");
}
TEST_F(ModuleSystemTest, TestOverrideNativeHandler) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(
- context_->module_system());
- OverrideNativeHandler("assert", "exports.AssertTrue = function() {};");
- RegisterModule("test", "requireNative('assert').AssertTrue(true);");
+ env()->module_system());
+ env()->OverrideNativeHandler("assert", "exports.AssertTrue = function() {};");
+ env()->RegisterModule("test", "requireNative('assert').AssertTrue(true);");
ExpectNoAssertionsMade();
- context_->module_system()->Require("test");
+ env()->module_system()->Require("test");
}
TEST_F(ModuleSystemTest, TestOverrideNonExistentNativeHandler) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(
- context_->module_system());
- OverrideNativeHandler("thing", "exports.x = 5;");
- RegisterModule("test",
- "var assert = requireNative('assert');"
- "assert.AssertTrue(requireNative('thing').x == 5);");
- context_->module_system()->Require("test");
+ env()->module_system());
+ env()->OverrideNativeHandler("thing", "exports.x = 5;");
+ env()->RegisterModule("test",
+ "var assert = requireNative('assert');"
+ "assert.AssertTrue(requireNative('thing').x == 5);");
+ env()->module_system()->Require("test");
+}
+
+TEST_F(ModuleSystemTest, TestRequireAsync) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(
+ env()->module_system());
+ env()->RegisterModule("add",
+ "define('add', [], function() {"
+ " return { Add: function(x, y) { return x + y; } };"
+ "});");
+ env()->RegisterModule("math",
+ "define('math', ['add'], function(add) {"
+ " return { Add: add.Add };"
+ "});");
+ env()->RegisterModule(
+ "test",
+ "requireAsync('math').then(function(math) {"
+ " requireNative('assert').AssertTrue(math.Add(3, 5) == 8);"
+ "});");
+ env()->module_system()->Require("test");
+ RunResolvedPromises();
+}
+
+TEST_F(ModuleSystemTest, TestRequireAsyncInParallel) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(
+ env()->module_system());
+ env()->RegisterModule("add",
+ "define('add', [], function() {"
+ " return { Add: function(x, y) { return x + y; } };"
+ "});");
+ env()->RegisterModule(
+ "subtract",
+ "define('subtract', [], function() {"
+ " return { Subtract: function(x, y) { return x - y; } };"
+ "});");
+ env()->RegisterModule(
+ "math",
+ "exports.AddAndSubtract = function(x, y, z) {"
+ " return Promise.all([requireAsync('add'),"
+ " requireAsync('subtract')"
+ " ]).then(function(modules) {"
+ " return modules[1].Subtract(modules[0].Add(x, y), z);"
+ " });"
+ "};");
+ env()->RegisterModule("test",
+ "var AddAndSubtract = require('math').AddAndSubtract;"
+ "AddAndSubtract(3, 5, 2).then(function(result) {"
+ " requireNative('assert').AssertTrue(result == 6);"
+ "});");
+ env()->module_system()->Require("test");
+ RunResolvedPromises();
+}
+
+TEST_F(ModuleSystemTest, TestNestedRequireAsyncs) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(
+ env()->module_system());
+ env()->RegisterModule("first",
+ "define('first', [], function() {"
+ " return { next: 'second' };"
+ "});");
+ env()->RegisterModule("second",
+ "define('second', [], function() {"
+ " return { next: '' };"
+ "});");
+ env()->RegisterModule(
+ "test",
+ "requireAsync('first').then(function(module) {"
+ " return requireAsync(module.next)"
+ "}).then(function(module) {"
+ " requireNative('assert').AssertTrue(module.next === '');"
+ "});");
+ env()->module_system()->Require("test");
+ RunResolvedPromises();
+}
+
+TEST_F(ModuleSystemTest, TestRequireFromAMDModule) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(
+ env()->module_system());
+ env()->RegisterModule("add",
+ "exports.Add = function(x, y) { return x + y; };");
+ env()->RegisterModule("math",
+ "define('math', [], function() {"
+ " var add = require('add');"
+ " return { Add: add.Add };"
+ "});");
+ env()->RegisterModule(
+ "test",
+ "requireAsync('math').then(function(math) {"
+ " requireNative('assert').AssertTrue(math.Add(3, 5) == 8);"
+ "});");
+ env()->module_system()->Require("test");
+ RunResolvedPromises();
+}
+
+TEST_F(ModuleSystemTest, TestRequireAsyncFromAMDModule) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(
+ env()->module_system());
+ env()->RegisterModule("add",
+ "define('add', [], function() {"
+ " return { Add: function(x, y) { return x + y; } };"
+ "});");
+ env()->RegisterModule("math",
+ "define('math', [], function() {"
+ " function Add(x, y) {"
+ " return requireAsync('add').then(function(add) {"
+ " return add.Add(x, y);"
+ " });"
+ " }"
+ " return { Add: Add };"
+ "});");
+ env()->RegisterModule("test",
+ "requireAsync('math').then(function(math) {"
+ " return math.Add(3, 6);"
+ "}).then(function(result) {"
+ " requireNative('assert').AssertTrue(result == 9);"
+ "});");
+ env()->module_system()->Require("test");
+ RunResolvedPromises();
+}
+
+TEST_F(ModuleSystemTest, TestRequireAsyncFromAnotherContext) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(
+ env()->module_system());
+ env()->RegisterModule(
+ "test",
+ "requireAsync('natives').then(function(natives) {"
+ " natives.requireAsync('ping').then(function(ping) {"
+ " return ping();"
+ " }).then(function(result) {"
+ " requireNative('assert').AssertTrue(result == 'pong');"
+ " });"
+ "});");
+ scoped_ptr<ModuleSystemTestEnvironment> other_env = CreateEnvironment();
+ other_env->RegisterModule("ping",
+ "define('ping', ['natives'], function(natives) {"
+ " return function() {"
+ " return 'pong';"
+ " }"
+ "});");
+ gin::ModuleRegistry::From(env()->context()->v8_context())->AddBuiltinModule(
+ env()->isolate(), "natives", other_env->module_system()->NewInstance());
+ gin::ModuleRegistry::From(other_env->context()->v8_context())
+ ->AddBuiltinModule(
+ env()->isolate(), "natives", env()->module_system()->NewInstance());
+ env()->module_system()->Require("test");
+ RunResolvedPromises();
+}
+
+TEST_F(ModuleSystemTest, TestRequireAsyncBetweenContexts) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(
+ env()->module_system());
+ env()->RegisterModule("pong",
+ "define('pong', [], function() {"
+ " return function() { return 'done'; };"
+ "});");
+ env()->RegisterModule(
+ "test",
+ "requireAsync('natives').then(function(natives) {"
+ " natives.requireAsync('ping').then(function(ping) {"
+ " return ping();"
+ " }).then(function(pong) {"
+ " return pong();"
+ " }).then(function(result) {"
+ " requireNative('assert').AssertTrue(result == 'done');"
+ " });"
+ "});");
+ scoped_ptr<ModuleSystemTestEnvironment> other_env = CreateEnvironment();
+ other_env->RegisterModule("ping",
+ "define('ping', ['natives'], function(natives) {"
+ " return function() {"
+ " return natives.requireAsync('pong');"
+ " }"
+ "});");
+ gin::ModuleRegistry::From(env()->context()->v8_context())->AddBuiltinModule(
+ env()->isolate(), "natives", other_env->module_system()->NewInstance());
+ gin::ModuleRegistry::From(other_env->context()->v8_context())
+ ->AddBuiltinModule(
+ env()->isolate(), "natives", env()->module_system()->NewInstance());
+ env()->module_system()->Require("test");
+ RunResolvedPromises();
+}
+
+TEST_F(ModuleSystemTest, TestRequireAsyncFromContextWithNoModuleRegistry) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(
+ env()->module_system());
+ env()->RegisterModule("test",
+ "requireAsync('natives').then(function(natives) {"
+ " var AssertTrue = requireNative('assert').AssertTrue;"
+ " natives.requireAsync('foo').then(function() {"
+ " AssertTrue(false);"
+ " }).catch(function(error) {"
+ " AssertTrue(error.message == "
+ " 'Extension view no longer exists');"
+ " });"
+ "});");
+ scoped_ptr<ModuleSystemTestEnvironment> other_env = CreateEnvironment();
+ gin::ModuleRegistry::From(env()->context()->v8_context())->AddBuiltinModule(
+ env()->isolate(), "natives", other_env->module_system()->NewInstance());
+ other_env->ShutdownGin();
+ env()->module_system()->Require("test");
+ RunResolvedPromises();
+}
+
+TEST_F(ModuleSystemTest, TestRequireAsyncFromContextWithNoModuleSystem) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(
+ env()->module_system());
+ env()->RegisterModule("test",
+ "requireAsync('natives').then(function(natives) {"
+ " requireNative('assert').AssertTrue("
+ " natives.requireAsync('foo') === undefined);"
+ "});");
+ scoped_ptr<ModuleSystemTestEnvironment> other_env = CreateEnvironment();
+ gin::ModuleRegistry::From(env()->context()->v8_context())->AddBuiltinModule(
+ env()->isolate(), "natives", other_env->module_system()->NewInstance());
+ other_env->ShutdownModuleSystem();
+ env()->module_system()->Require("test");
+ RunResolvedPromises();
}
« no previous file with comments | « chrome/renderer/extensions/messaging_utils_unittest.cc ('k') | chrome/renderer/extensions/safe_builtins_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698