Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/memory/scoped_ptr.h" | 5 #include "base/memory/scoped_ptr.h" |
| 6 #include "chrome/test/base/module_system_test.h" | 6 #include "chrome/test/base/module_system_test.h" |
| 7 #include "extensions/renderer/module_system.h" | 7 #include "extensions/renderer/module_system.h" |
| 8 #include "gin/modules/module_registry.h" | |
| 8 | 9 |
| 9 // TODO(cduvall/kalman): Put this file in extensions namespace. | 10 // TODO(cduvall/kalman): Put this file in extensions namespace. |
| 10 using extensions::ModuleSystem; | 11 using extensions::ModuleSystem; |
| 11 using extensions::NativeHandler; | 12 using extensions::NativeHandler; |
| 12 using extensions::ObjectBackedNativeHandler; | 13 using extensions::ObjectBackedNativeHandler; |
| 13 | 14 |
| 14 class CounterNatives : public ObjectBackedNativeHandler { | 15 class CounterNatives : public ObjectBackedNativeHandler { |
| 15 public: | 16 public: |
| 16 explicit CounterNatives(extensions::ChromeV8Context* context) | 17 explicit CounterNatives(extensions::ChromeV8Context* context) |
| 17 : ObjectBackedNativeHandler(context), counter_(0) { | 18 : ObjectBackedNativeHandler(context), counter_(0) { |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 43 handled_exception_ = true; | 44 handled_exception_ = true; |
| 44 } | 45 } |
| 45 | 46 |
| 46 bool handled_exception() const { return handled_exception_; } | 47 bool handled_exception() const { return handled_exception_; } |
| 47 | 48 |
| 48 private: | 49 private: |
| 49 bool handled_exception_; | 50 bool handled_exception_; |
| 50 }; | 51 }; |
| 51 | 52 |
| 52 TEST_F(ModuleSystemTest, TestExceptionHandling) { | 53 TEST_F(ModuleSystemTest, TestExceptionHandling) { |
| 53 ModuleSystem::NativesEnabledScope natives_enabled_scope( | 54 ModuleSystem::NativesEnabledScope natives_enabled_scope(env_.module_system()); |
| 54 context_->module_system()); | |
| 55 TestExceptionHandler* handler = new TestExceptionHandler; | 55 TestExceptionHandler* handler = new TestExceptionHandler; |
| 56 scoped_ptr<ModuleSystem::ExceptionHandler> scoped_handler(handler); | 56 scoped_ptr<ModuleSystem::ExceptionHandler> scoped_handler(handler); |
| 57 ASSERT_FALSE(handler->handled_exception()); | 57 ASSERT_FALSE(handler->handled_exception()); |
| 58 context_->module_system()->SetExceptionHandlerForTest(scoped_handler.Pass()); | 58 env_.module_system()->SetExceptionHandlerForTest(scoped_handler.Pass()); |
| 59 | 59 |
| 60 RegisterModule("test", "throw 'hi';"); | 60 env_.RegisterModule("test", "throw 'hi';"); |
| 61 context_->module_system()->Require("test"); | 61 env_.module_system()->Require("test"); |
| 62 ASSERT_TRUE(handler->handled_exception()); | 62 ASSERT_TRUE(handler->handled_exception()); |
| 63 | 63 |
| 64 ExpectNoAssertionsMade(); | 64 ExpectNoAssertionsMade(); |
| 65 } | 65 } |
| 66 | 66 |
| 67 TEST_F(ModuleSystemTest, TestRequire) { | 67 TEST_F(ModuleSystemTest, TestRequire) { |
| 68 ModuleSystem::NativesEnabledScope natives_enabled_scope( | 68 ModuleSystem::NativesEnabledScope natives_enabled_scope(env_.module_system()); |
| 69 context_->module_system()); | 69 env_.RegisterModule("add", "exports.Add = function(x, y) { return x + y; };"); |
| 70 RegisterModule("add", "exports.Add = function(x, y) { return x + y; };"); | 70 env_.RegisterModule("test", |
| 71 RegisterModule("test", | 71 "var Add = require('add').Add;" |
| 72 "var Add = require('add').Add;" | 72 "requireNative('assert').AssertTrue(Add(3, 5) == 8);"); |
| 73 "requireNative('assert').AssertTrue(Add(3, 5) == 8);"); | 73 env_.module_system()->Require("test"); |
| 74 context_->module_system()->Require("test"); | |
| 75 } | 74 } |
| 76 | 75 |
| 77 TEST_F(ModuleSystemTest, TestNestedRequire) { | 76 TEST_F(ModuleSystemTest, TestNestedRequire) { |
| 78 ModuleSystem::NativesEnabledScope natives_enabled_scope( | 77 ModuleSystem::NativesEnabledScope natives_enabled_scope(env_.module_system()); |
| 79 context_->module_system()); | 78 env_.RegisterModule("add", "exports.Add = function(x, y) { return x + y; };"); |
| 80 RegisterModule("add", "exports.Add = function(x, y) { return x + y; };"); | 79 env_.RegisterModule("double", |
| 81 RegisterModule("double", | 80 "var Add = require('add').Add;" |
| 82 "var Add = require('add').Add;" | 81 "exports.Double = function(x) { return Add(x, x); };"); |
| 83 "exports.Double = function(x) { return Add(x, x); };"); | 82 env_.RegisterModule("test", |
| 84 RegisterModule("test", | 83 "var Double = require('double').Double;" |
| 85 "var Double = require('double').Double;" | 84 "requireNative('assert').AssertTrue(Double(3) == 6);"); |
| 86 "requireNative('assert').AssertTrue(Double(3) == 6);"); | 85 env_.module_system()->Require("test"); |
| 87 context_->module_system()->Require("test"); | |
| 88 } | 86 } |
| 89 | 87 |
| 90 TEST_F(ModuleSystemTest, TestModuleInsulation) { | 88 TEST_F(ModuleSystemTest, TestModuleInsulation) { |
| 91 ModuleSystem::NativesEnabledScope natives_enabled_scope( | 89 ModuleSystem::NativesEnabledScope natives_enabled_scope(env_.module_system()); |
| 92 context_->module_system()); | 90 env_.RegisterModule("x", |
| 93 RegisterModule("x", | 91 "var x = 10;" |
| 94 "var x = 10;" | 92 "exports.X = function() { return x; };"); |
| 95 "exports.X = function() { return x; };"); | 93 env_.RegisterModule("y", |
| 96 RegisterModule("y", | 94 "var x = 15;" |
| 97 "var x = 15;" | 95 "require('x');" |
| 98 "require('x');" | 96 "exports.Y = function() { return x; };"); |
| 99 "exports.Y = function() { return x; };"); | 97 env_.RegisterModule("test", |
| 100 RegisterModule("test", | 98 "var Y = require('y').Y;" |
| 101 "var Y = require('y').Y;" | 99 "var X = require('x').X;" |
| 102 "var X = require('x').X;" | 100 "var assert = requireNative('assert');" |
| 103 "var assert = requireNative('assert');" | 101 "assert.AssertTrue(!this.hasOwnProperty('x'));" |
| 104 "assert.AssertTrue(!this.hasOwnProperty('x'));" | 102 "assert.AssertTrue(Y() == 15);" |
| 105 "assert.AssertTrue(Y() == 15);" | 103 "assert.AssertTrue(X() == 10);"); |
| 106 "assert.AssertTrue(X() == 10);"); | 104 env_.module_system()->Require("test"); |
| 107 context_->module_system()->Require("test"); | |
| 108 } | 105 } |
| 109 | 106 |
| 110 TEST_F(ModuleSystemTest, TestNativesAreDisabledOutsideANativesEnabledScope) { | 107 TEST_F(ModuleSystemTest, TestNativesAreDisabledOutsideANativesEnabledScope) { |
| 111 RegisterModule("test", | 108 env_.RegisterModule("test", |
| 112 "var assert;" | 109 "var assert;" |
| 113 "try {" | 110 "try {" |
| 114 " assert = requireNative('assert');" | 111 " assert = requireNative('assert');" |
| 115 "} catch (e) {" | 112 "} catch (e) {" |
| 116 " var caught = true;" | 113 " var caught = true;" |
| 117 "}" | 114 "}" |
| 118 "if (assert) {" | 115 "if (assert) {" |
| 119 " assert.AssertTrue(true);" | 116 " assert.AssertTrue(true);" |
| 120 "}"); | 117 "}"); |
| 121 context_->module_system()->Require("test"); | 118 env_.module_system()->Require("test"); |
| 122 ExpectNoAssertionsMade(); | 119 ExpectNoAssertionsMade(); |
| 123 } | 120 } |
| 124 | 121 |
| 125 TEST_F(ModuleSystemTest, TestNativesAreEnabledWithinANativesEnabledScope) { | 122 TEST_F(ModuleSystemTest, TestNativesAreEnabledWithinANativesEnabledScope) { |
| 126 RegisterModule("test", | 123 env_.RegisterModule("test", |
| 127 "var assert = requireNative('assert');" | 124 "var assert = requireNative('assert');" |
| 128 "assert.AssertTrue(true);"); | 125 "assert.AssertTrue(true);"); |
| 129 | 126 |
| 130 { | 127 { |
| 131 ModuleSystem::NativesEnabledScope natives_enabled( | 128 ModuleSystem::NativesEnabledScope natives_enabled(env_.module_system()); |
| 132 context_->module_system()); | |
| 133 { | 129 { |
| 134 ModuleSystem::NativesEnabledScope natives_enabled_inner( | 130 ModuleSystem::NativesEnabledScope natives_enabled_inner( |
| 135 context_->module_system()); | 131 env_.module_system()); |
| 136 } | 132 } |
| 137 context_->module_system()->Require("test"); | 133 env_.module_system()->Require("test"); |
| 138 } | 134 } |
| 139 } | 135 } |
| 140 | 136 |
| 141 TEST_F(ModuleSystemTest, TestLazyField) { | 137 TEST_F(ModuleSystemTest, TestLazyField) { |
| 142 ModuleSystem::NativesEnabledScope natives_enabled_scope( | 138 ModuleSystem::NativesEnabledScope natives_enabled_scope(env_.module_system()); |
| 143 context_->module_system()); | 139 env_.RegisterModule("lazy", "exports.x = 5;"); |
| 144 RegisterModule("lazy", | 140 |
| 145 "exports.x = 5;"); | 141 v8::Handle<v8::Object> object = env_.CreateGlobal("object"); |
| 146 | 142 |
| 147 v8::Handle<v8::Object> object = CreateGlobal("object"); | 143 env_.module_system()->SetLazyField(object, "blah", "lazy", "x"); |
| 148 | 144 |
| 149 context_->module_system()->SetLazyField(object, "blah", "lazy", "x"); | 145 env_.RegisterModule("test", |
| 150 | 146 "var assert = requireNative('assert');" |
| 151 RegisterModule("test", | 147 "assert.AssertTrue(object.blah == 5);"); |
| 152 "var assert = requireNative('assert');" | 148 env_.module_system()->Require("test"); |
| 153 "assert.AssertTrue(object.blah == 5);"); | |
| 154 context_->module_system()->Require("test"); | |
| 155 } | 149 } |
| 156 | 150 |
| 157 TEST_F(ModuleSystemTest, TestLazyFieldYieldingObject) { | 151 TEST_F(ModuleSystemTest, TestLazyFieldYieldingObject) { |
| 158 ModuleSystem::NativesEnabledScope natives_enabled_scope( | 152 ModuleSystem::NativesEnabledScope natives_enabled_scope(env_.module_system()); |
| 159 context_->module_system()); | 153 env_.RegisterModule("lazy", |
| 160 RegisterModule("lazy", | 154 "var object = {};" |
| 161 "var object = {};" | 155 "object.__defineGetter__('z', function() { return 1; });" |
| 162 "object.__defineGetter__('z', function() { return 1; });" | 156 "object.x = 5;" |
| 163 "object.x = 5;" | 157 "object.y = function() { return 10; };" |
| 164 "object.y = function() { return 10; };" | 158 "exports.object = object;"); |
| 165 "exports.object = object;"); | 159 |
| 166 | 160 v8::Handle<v8::Object> object = env_.CreateGlobal("object"); |
| 167 v8::Handle<v8::Object> object = CreateGlobal("object"); | 161 |
| 168 | 162 env_.module_system()->SetLazyField(object, "thing", "lazy", "object"); |
| 169 context_->module_system()->SetLazyField(object, "thing", "lazy", "object"); | 163 |
| 170 | 164 env_.RegisterModule("test", |
| 171 RegisterModule("test", | 165 "var assert = requireNative('assert');" |
| 172 "var assert = requireNative('assert');" | 166 "assert.AssertTrue(object.thing.x == 5);" |
| 173 "assert.AssertTrue(object.thing.x == 5);" | 167 "assert.AssertTrue(object.thing.y() == 10);" |
| 174 "assert.AssertTrue(object.thing.y() == 10);" | 168 "assert.AssertTrue(object.thing.z == 1);"); |
| 175 "assert.AssertTrue(object.thing.z == 1);" | 169 env_.module_system()->Require("test"); |
| 176 ); | |
| 177 context_->module_system()->Require("test"); | |
| 178 } | 170 } |
| 179 | 171 |
| 180 TEST_F(ModuleSystemTest, TestLazyFieldIsOnlyEvaledOnce) { | 172 TEST_F(ModuleSystemTest, TestLazyFieldIsOnlyEvaledOnce) { |
| 181 ModuleSystem::NativesEnabledScope natives_enabled_scope( | 173 ModuleSystem::NativesEnabledScope natives_enabled_scope(env_.module_system()); |
| 182 context_->module_system()); | 174 env_.module_system()->RegisterNativeHandler( |
| 183 context_->module_system()->RegisterNativeHandler( | 175 "counter", scoped_ptr<NativeHandler>(new CounterNatives(env_.context()))); |
| 184 "counter", | 176 env_.RegisterModule("lazy", |
| 185 scoped_ptr<NativeHandler>(new CounterNatives(context_.get()))); | 177 "requireNative('counter').Increment();" |
| 186 RegisterModule("lazy", | 178 "exports.x = 5;"); |
| 187 "requireNative('counter').Increment();" | 179 |
| 188 "exports.x = 5;"); | 180 v8::Handle<v8::Object> object = env_.CreateGlobal("object"); |
| 189 | 181 |
| 190 v8::Handle<v8::Object> object = CreateGlobal("object"); | 182 env_.module_system()->SetLazyField(object, "x", "lazy", "x"); |
| 191 | 183 |
| 192 context_->module_system()->SetLazyField(object, "x", "lazy", "x"); | 184 env_.RegisterModule("test", |
| 193 | 185 "var assert = requireNative('assert');" |
| 194 RegisterModule("test", | 186 "var counter = requireNative('counter');" |
| 195 "var assert = requireNative('assert');" | 187 "assert.AssertTrue(counter.Get() == 0);" |
| 196 "var counter = requireNative('counter');" | 188 "object.x;" |
| 197 "assert.AssertTrue(counter.Get() == 0);" | 189 "assert.AssertTrue(counter.Get() == 1);" |
| 198 "object.x;" | 190 "object.x;" |
| 199 "assert.AssertTrue(counter.Get() == 1);" | 191 "assert.AssertTrue(counter.Get() == 1);"); |
| 200 "object.x;" | 192 env_.module_system()->Require("test"); |
| 201 "assert.AssertTrue(counter.Get() == 1);"); | |
| 202 context_->module_system()->Require("test"); | |
| 203 } | 193 } |
| 204 | 194 |
| 205 TEST_F(ModuleSystemTest, TestRequireNativesAfterLazyEvaluation) { | 195 TEST_F(ModuleSystemTest, TestRequireNativesAfterLazyEvaluation) { |
| 206 ModuleSystem::NativesEnabledScope natives_enabled_scope( | 196 ModuleSystem::NativesEnabledScope natives_enabled_scope(env_.module_system()); |
| 207 context_->module_system()); | 197 env_.RegisterModule("lazy", "exports.x = 5;"); |
| 208 RegisterModule("lazy", | 198 v8::Handle<v8::Object> object = env_.CreateGlobal("object"); |
| 209 "exports.x = 5;"); | 199 |
| 210 v8::Handle<v8::Object> object = CreateGlobal("object"); | 200 env_.module_system()->SetLazyField(object, "x", "lazy", "x"); |
| 211 | 201 env_.RegisterModule("test", |
| 212 context_->module_system()->SetLazyField(object, "x", "lazy", "x"); | 202 "object.x;" |
| 213 RegisterModule("test", | 203 "requireNative('assert').AssertTrue(true);"); |
| 214 "object.x;" | 204 env_.module_system()->Require("test"); |
| 215 "requireNative('assert').AssertTrue(true);"); | |
| 216 context_->module_system()->Require("test"); | |
| 217 } | 205 } |
| 218 | 206 |
| 219 TEST_F(ModuleSystemTest, TestTransitiveRequire) { | 207 TEST_F(ModuleSystemTest, TestTransitiveRequire) { |
| 220 ModuleSystem::NativesEnabledScope natives_enabled_scope( | 208 ModuleSystem::NativesEnabledScope natives_enabled_scope(env_.module_system()); |
| 221 context_->module_system()); | 209 env_.RegisterModule("dependency", "exports.x = 5;"); |
| 222 RegisterModule("dependency", | 210 env_.RegisterModule("lazy", "exports.output = require('dependency');"); |
| 223 "exports.x = 5;"); | 211 |
| 224 RegisterModule("lazy", | 212 v8::Handle<v8::Object> object = env_.CreateGlobal("object"); |
| 225 "exports.output = require('dependency');"); | 213 |
| 226 | 214 env_.module_system()->SetLazyField(object, "thing", "lazy", "output"); |
| 227 v8::Handle<v8::Object> object = CreateGlobal("object"); | 215 |
| 228 | 216 env_.RegisterModule("test", |
| 229 context_->module_system()->SetLazyField(object, "thing", "lazy", "output"); | 217 "var assert = requireNative('assert');" |
| 230 | 218 "assert.AssertTrue(object.thing.x == 5);"); |
| 231 RegisterModule("test", | 219 env_.module_system()->Require("test"); |
| 232 "var assert = requireNative('assert');" | |
| 233 "assert.AssertTrue(object.thing.x == 5);"); | |
| 234 context_->module_system()->Require("test"); | |
| 235 } | 220 } |
| 236 | 221 |
| 237 TEST_F(ModuleSystemTest, TestModulesOnlyGetEvaledOnce) { | 222 TEST_F(ModuleSystemTest, TestModulesOnlyGetEvaledOnce) { |
| 238 ModuleSystem::NativesEnabledScope natives_enabled_scope( | 223 ModuleSystem::NativesEnabledScope natives_enabled_scope(env_.module_system()); |
| 239 context_->module_system()); | 224 env_.module_system()->RegisterNativeHandler( |
| 240 context_->module_system()->RegisterNativeHandler( | 225 "counter", scoped_ptr<NativeHandler>(new CounterNatives(env_.context()))); |
| 241 "counter", | 226 |
| 242 scoped_ptr<NativeHandler>(new CounterNatives(context_.get()))); | 227 env_.RegisterModule("incrementsWhenEvaled", |
| 243 | 228 "requireNative('counter').Increment();"); |
| 244 RegisterModule("incrementsWhenEvaled", | 229 env_.RegisterModule("test", |
| 245 "requireNative('counter').Increment();"); | 230 "var assert = requireNative('assert');" |
| 246 RegisterModule("test", | 231 "var counter = requireNative('counter');" |
| 247 "var assert = requireNative('assert');" | 232 "assert.AssertTrue(counter.Get() == 0);" |
| 248 "var counter = requireNative('counter');" | 233 "require('incrementsWhenEvaled');" |
| 249 "assert.AssertTrue(counter.Get() == 0);" | 234 "assert.AssertTrue(counter.Get() == 1);" |
| 250 "require('incrementsWhenEvaled');" | 235 "require('incrementsWhenEvaled');" |
| 251 "assert.AssertTrue(counter.Get() == 1);" | 236 "assert.AssertTrue(counter.Get() == 1);"); |
| 252 "require('incrementsWhenEvaled');" | 237 |
| 253 "assert.AssertTrue(counter.Get() == 1);"); | 238 env_.module_system()->Require("test"); |
| 254 | |
| 255 context_->module_system()->Require("test"); | |
| 256 } | 239 } |
| 257 | 240 |
| 258 TEST_F(ModuleSystemTest, TestOverrideNativeHandler) { | 241 TEST_F(ModuleSystemTest, TestOverrideNativeHandler) { |
| 259 ModuleSystem::NativesEnabledScope natives_enabled_scope( | 242 ModuleSystem::NativesEnabledScope natives_enabled_scope(env_.module_system()); |
| 260 context_->module_system()); | 243 env_.OverrideNativeHandler("assert", "exports.AssertTrue = function() {};"); |
| 261 OverrideNativeHandler("assert", "exports.AssertTrue = function() {};"); | 244 env_.RegisterModule("test", "requireNative('assert').AssertTrue(true);"); |
| 262 RegisterModule("test", "requireNative('assert').AssertTrue(true);"); | |
| 263 ExpectNoAssertionsMade(); | 245 ExpectNoAssertionsMade(); |
| 264 context_->module_system()->Require("test"); | 246 env_.module_system()->Require("test"); |
| 265 } | 247 } |
| 266 | 248 |
| 267 TEST_F(ModuleSystemTest, TestOverrideNonExistentNativeHandler) { | 249 TEST_F(ModuleSystemTest, TestOverrideNonExistentNativeHandler) { |
| 268 ModuleSystem::NativesEnabledScope natives_enabled_scope( | 250 ModuleSystem::NativesEnabledScope natives_enabled_scope(env_.module_system()); |
| 269 context_->module_system()); | 251 env_.OverrideNativeHandler("thing", "exports.x = 5;"); |
| 270 OverrideNativeHandler("thing", "exports.x = 5;"); | 252 env_.RegisterModule("test", |
| 271 RegisterModule("test", | 253 "var assert = requireNative('assert');" |
| 272 "var assert = requireNative('assert');" | 254 "assert.AssertTrue(requireNative('thing').x == 5);"); |
| 273 "assert.AssertTrue(requireNative('thing').x == 5);"); | 255 env_.module_system()->Require("test"); |
| 274 context_->module_system()->Require("test"); | 256 } |
| 275 } | 257 |
| 258 TEST_F(ModuleSystemTest, TestRequireAsync) { | |
| 259 ModuleSystem::NativesEnabledScope natives_enabled_scope(env_.module_system()); | |
| 260 env_.RegisterModule("add", | |
| 261 "define('add', [], function() {" | |
| 262 " return { Add: function(x, y) { return x + y; } };" | |
| 263 "});"); | |
| 264 env_.RegisterModule("math", | |
| 265 "define('math', ['add'], function(add) {" | |
| 266 " return { Add: add.Add };" | |
| 267 "});"); | |
| 268 env_.RegisterModule( | |
| 269 "test", | |
| 270 "requireAsync('math').then(function(math) {" | |
| 271 " requireNative('assert').AssertTrue(math.Add(3, 5) == 8);" | |
| 272 "});"); | |
| 273 env_.module_system()->Require("test"); | |
| 274 RunResolvedPromises(); | |
| 275 } | |
| 276 | |
| 277 TEST_F(ModuleSystemTest, TestRequireAsyncInParallel) { | |
| 278 ModuleSystem::NativesEnabledScope natives_enabled_scope(env_.module_system()); | |
| 279 env_.RegisterModule("add", | |
| 280 "define('add', [], function() {" | |
| 281 " return { Add: function(x, y) { return x + y; } };" | |
| 282 "});"); | |
| 283 env_.RegisterModule("subtract", | |
| 284 "define('subtract', [], function() {" | |
| 285 " return { Subtract: function(x, y) { return x - y; } };" | |
| 286 "});"); | |
| 287 env_.RegisterModule("math", | |
| 288 "exports.AddAndSubtract = function(x, y, z) {" | |
| 289 " return Promise.all([requireAsync('add')," | |
| 290 " requireAsync('subtract')" | |
| 291 " ]).then(function(modules) {" | |
| 292 " return modules[1].Subtract(modules[0].Add(x, y), z);" | |
| 293 " });" | |
| 294 "};"); | |
| 295 env_.RegisterModule("test", | |
| 296 "var AddAndSubtract = require('math').AddAndSubtract;" | |
| 297 "AddAndSubtract(3, 5, 2).then(function(result) {" | |
| 298 " requireNative('assert').AssertTrue(result == 6);" | |
| 299 "});"); | |
| 300 env_.module_system()->Require("test"); | |
| 301 RunResolvedPromises(); | |
| 302 } | |
| 303 | |
| 304 TEST_F(ModuleSystemTest, TestNestedRequireAsyncs) { | |
| 305 ModuleSystem::NativesEnabledScope natives_enabled_scope(env_.module_system()); | |
| 306 env_.RegisterModule("first", | |
| 307 "define('first', [], function() {" | |
| 308 " return { next: 'second' };" | |
| 309 "});"); | |
| 310 env_.RegisterModule("second", | |
| 311 "define('second', [], function() {" | |
| 312 " return { next: '' };" | |
| 313 "});"); | |
| 314 env_.RegisterModule( | |
| 315 "test", | |
| 316 "requireAsync('first').then(function(module) {" | |
| 317 " return requireAsync(module.next)" | |
| 318 "}).then(function(module) {" | |
| 319 " requireNative('assert').AssertTrue(module.next === '');" | |
| 320 "});"); | |
| 321 env_.module_system()->Require("test"); | |
| 322 RunResolvedPromises(); | |
| 323 } | |
| 324 | |
| 325 TEST_F(ModuleSystemTest, TestRequireFromAMDModule) { | |
| 326 ModuleSystem::NativesEnabledScope natives_enabled_scope(env_.module_system()); | |
| 327 env_.RegisterModule("add", "exports.Add = function(x, y) { return x + y; };"); | |
| 328 env_.RegisterModule("math", | |
| 329 "define('math', [], function() {" | |
| 330 " var add = require('add');" | |
| 331 " return { Add: add.Add };" | |
| 332 "});"); | |
| 333 env_.RegisterModule( | |
| 334 "test", | |
| 335 "requireAsync('math').then(function(math) {" | |
| 336 " requireNative('assert').AssertTrue(math.Add(3, 5) == 8);" | |
| 337 "});"); | |
| 338 env_.module_system()->Require("test"); | |
| 339 RunResolvedPromises(); | |
| 340 } | |
| 341 | |
| 342 TEST_F(ModuleSystemTest, TestRequireAsyncFromAMDModule) { | |
| 343 ModuleSystem::NativesEnabledScope natives_enabled_scope(env_.module_system()); | |
| 344 env_.RegisterModule("add", | |
| 345 "define('add', [], function() {" | |
| 346 " return { Add: function(x, y) { return x + y; } };" | |
| 347 "});"); | |
| 348 env_.RegisterModule("math", | |
| 349 "define('math', [], function() {" | |
| 350 " function Add(x, y) {" | |
| 351 " return requireAsync('add').then(function(add) {" | |
| 352 " return add.Add(x, y);" | |
| 353 " });" | |
| 354 " }" | |
| 355 " return { Add: Add };" | |
| 356 "});"); | |
| 357 env_.RegisterModule("test", | |
| 358 "requireAsync('math').then(function(math) {" | |
| 359 " return math.Add(3, 6);" | |
| 360 "}).then(function(result) {" | |
| 361 " requireNative('assert').AssertTrue(result == 9);" | |
| 362 "});"); | |
| 363 env_.module_system()->Require("test"); | |
| 364 RunResolvedPromises(); | |
| 365 } | |
| 366 | |
| 367 TEST_F(ModuleSystemTest, TestRequireAsyncFromAnotherContext) { | |
| 368 ModuleSystem::NativesEnabledScope natives_enabled_scope(env_.module_system()); | |
| 369 env_.RegisterModule( | |
| 370 "test", | |
| 371 "requireAsync('natives').then(function(natives) {" | |
| 372 " natives.requireAsync('ping').then(function(ping) {" | |
| 373 " return ping();" | |
| 374 " }).then(function(result) {" | |
| 375 " requireNative('assert').AssertTrue(result == 'pong');" | |
| 376 " });" | |
| 377 "});"); | |
| 378 ModuleSystemTestEnvironment other_env(&isolate_holder_); | |
| 379 other_env.RegisterModule("ping", | |
| 380 "define('ping', ['natives'], function(natives) {" | |
| 381 " return function() {" | |
| 382 " return 'pong';" | |
| 383 " }" | |
| 384 "});"); | |
| 385 gin::ModuleRegistry::From(env_.context()->v8_context()) | |
| 386 ->AddBuiltinModule(v8::Isolate::GetCurrent(), | |
| 387 "natives", | |
| 388 other_env.module_system()->NewInstance()); | |
| 389 gin::ModuleRegistry::From(other_env.context()->v8_context()) | |
| 390 ->AddBuiltinModule(v8::Isolate::GetCurrent(), | |
| 391 "natives", | |
| 392 env_.module_system()->NewInstance()); | |
| 393 env_.module_system()->Require("test"); | |
| 394 RunResolvedPromises(); | |
| 395 } | |
| 396 | |
| 397 TEST_F(ModuleSystemTest, TestRequireAsyncBetweenContexts) { | |
| 398 ModuleSystem::NativesEnabledScope natives_enabled_scope(env_.module_system()); | |
| 399 env_.RegisterModule("pong", | |
| 400 "define('pong', [], function() {" | |
| 401 " return function() { return 'done'; };" | |
| 402 "});"); | |
| 403 env_.RegisterModule( | |
| 404 "test", | |
| 405 "requireAsync('natives').then(function(natives) {" | |
| 406 " natives.requireAsync('ping').then(function(ping) {" | |
| 407 " return ping();" | |
| 408 " }).then(function(pong) {" | |
| 409 " return pong();" | |
| 410 " }).then(function(result) {" | |
| 411 " requireNative('assert').AssertTrue(result == 'done');" | |
| 412 " });" | |
| 413 "});"); | |
| 414 ModuleSystemTestEnvironment other_env(&isolate_holder_); | |
| 415 other_env.RegisterModule("ping", | |
| 416 "define('ping', ['natives'], function(natives) {" | |
| 417 " return function() {" | |
| 418 " return natives.requireAsync('pong');" | |
| 419 " }" | |
| 420 "});"); | |
| 421 gin::ModuleRegistry::From(env_.context()->v8_context()) | |
| 422 ->AddBuiltinModule(v8::Isolate::GetCurrent(), | |
|
not at google - send to devlin
2014/07/07 23:18:50
put an isolate() property on env and use that?
Sam McNally
2014/07/08 00:07:04
Done.
| |
| 423 "natives", | |
| 424 other_env.module_system()->NewInstance()); | |
| 425 gin::ModuleRegistry::From(other_env.context()->v8_context()) | |
| 426 ->AddBuiltinModule(v8::Isolate::GetCurrent(), | |
| 427 "natives", | |
| 428 env_.module_system()->NewInstance()); | |
| 429 env_.module_system()->Require("test"); | |
| 430 RunResolvedPromises(); | |
| 431 } | |
| 432 | |
| 433 TEST_F(ModuleSystemTest, TestRequireAsyncFromContextWithNoModuleRegistry) { | |
| 434 ModuleSystem::NativesEnabledScope natives_enabled_scope(env_.module_system()); | |
| 435 env_.RegisterModule("test", | |
| 436 "requireAsync('natives').then(function(natives) {" | |
| 437 " var AssertTrue = requireNative('assert').AssertTrue;" | |
| 438 " natives.requireAsync('foo').then(function() {" | |
| 439 " AssertTrue(false);" | |
| 440 " }).catch(function(error) {" | |
| 441 " AssertTrue(error.message == " | |
| 442 " 'Extension view no longer exists');" | |
| 443 " });" | |
| 444 "});"); | |
| 445 ModuleSystemTestEnvironment other_env(&isolate_holder_); | |
| 446 gin::ModuleRegistry::From(env_.context()->v8_context()) | |
| 447 ->AddBuiltinModule(v8::Isolate::GetCurrent(), | |
| 448 "natives", | |
| 449 other_env.module_system()->NewInstance()); | |
| 450 other_env.DeleteContextHolder(); | |
| 451 env_.module_system()->Require("test"); | |
| 452 RunResolvedPromises(); | |
| 453 } | |
| 454 | |
| 455 TEST_F(ModuleSystemTest, TestRequireAsyncFromContextWithNoModuleSystem) { | |
| 456 ModuleSystem::NativesEnabledScope natives_enabled_scope(env_.module_system()); | |
| 457 env_.RegisterModule("test", | |
| 458 "requireAsync('natives').then(function(natives) {" | |
| 459 " requireNative('assert').AssertTrue(" | |
| 460 " natives.requireAsync('foo') === undefined);" | |
| 461 "});"); | |
| 462 ModuleSystemTestEnvironment other_env(&isolate_holder_); | |
| 463 gin::ModuleRegistry::From(env_.context()->v8_context()) | |
| 464 ->AddBuiltinModule(v8::Isolate::GetCurrent(), | |
| 465 "natives", | |
| 466 other_env.module_system()->NewInstance()); | |
| 467 other_env.DeleteModuleSystem(); | |
| 468 env_.module_system()->Require("test"); | |
| 469 RunResolvedPromises(); | |
| 470 } | |
| OLD | NEW |