| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "extensions/renderer/module_system.h" | 6 #include "extensions/renderer/module_system.h" |
| 7 #include "extensions/renderer/module_system_test.h" | 7 #include "extensions/renderer/module_system_test.h" |
| 8 #include "gin/modules/module_registry.h" | 8 #include "gin/modules/module_registry.h" |
| 9 | 9 |
| 10 namespace extensions { | 10 namespace extensions { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 env()->module_system()->Require("test"); | 59 env()->module_system()->Require("test"); |
| 60 ASSERT_TRUE(handler->handled_exception()); | 60 ASSERT_TRUE(handler->handled_exception()); |
| 61 | 61 |
| 62 ExpectNoAssertionsMade(); | 62 ExpectNoAssertionsMade(); |
| 63 } | 63 } |
| 64 | 64 |
| 65 TEST_F(ModuleSystemTest, TestRequire) { | 65 TEST_F(ModuleSystemTest, TestRequire) { |
| 66 ModuleSystem::NativesEnabledScope natives_enabled_scope( | 66 ModuleSystem::NativesEnabledScope natives_enabled_scope( |
| 67 env()->module_system()); | 67 env()->module_system()); |
| 68 env()->RegisterModule("add", | 68 env()->RegisterModule("add", |
| 69 "exports.Add = function(x, y) { return x + y; };"); | 69 "exports.$set('Add'," |
| 70 "function(x, y) { return x + y; });"); |
| 70 env()->RegisterModule("test", | 71 env()->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 env()->module_system()->Require("test"); |
| 74 } | 75 } |
| 75 | 76 |
| 76 TEST_F(ModuleSystemTest, TestNestedRequire) { | 77 TEST_F(ModuleSystemTest, TestNestedRequire) { |
| 77 ModuleSystem::NativesEnabledScope natives_enabled_scope( | 78 ModuleSystem::NativesEnabledScope natives_enabled_scope( |
| 78 env()->module_system()); | 79 env()->module_system()); |
| 79 env()->RegisterModule("add", | 80 env()->RegisterModule("add", |
| 80 "exports.Add = function(x, y) { return x + y; };"); | 81 "exports.$set('Add'," |
| 82 "function(x, y) { return x + y; });"); |
| 81 env()->RegisterModule("double", | 83 env()->RegisterModule("double", |
| 82 "var Add = require('add').Add;" | 84 "var Add = require('add').Add;" |
| 83 "exports.Double = function(x) { return Add(x, x); };"); | 85 "exports.$set('Double'," |
| 86 "function(x) { return Add(x, x); });"); |
| 84 env()->RegisterModule("test", | 87 env()->RegisterModule("test", |
| 85 "var Double = require('double').Double;" | 88 "var Double = require('double').Double;" |
| 86 "requireNative('assert').AssertTrue(Double(3) == 6);"); | 89 "requireNative('assert').AssertTrue(Double(3) == 6);"); |
| 87 env()->module_system()->Require("test"); | 90 env()->module_system()->Require("test"); |
| 88 } | 91 } |
| 89 | 92 |
| 90 TEST_F(ModuleSystemTest, TestModuleInsulation) { | 93 TEST_F(ModuleSystemTest, TestModuleInsulation) { |
| 91 ModuleSystem::NativesEnabledScope natives_enabled_scope( | 94 ModuleSystem::NativesEnabledScope natives_enabled_scope( |
| 92 env()->module_system()); | 95 env()->module_system()); |
| 93 env()->RegisterModule("x", | 96 env()->RegisterModule("x", |
| 94 "var x = 10;" | 97 "var x = 10;" |
| 95 "exports.X = function() { return x; };"); | 98 "exports.$set('X', function() { return x; });"); |
| 96 env()->RegisterModule("y", | 99 env()->RegisterModule("y", |
| 97 "var x = 15;" | 100 "var x = 15;" |
| 98 "require('x');" | 101 "require('x');" |
| 99 "exports.Y = function() { return x; };"); | 102 "exports.$set('Y', function() { return x; });"); |
| 100 env()->RegisterModule("test", | 103 env()->RegisterModule("test", |
| 101 "var Y = require('y').Y;" | 104 "var Y = require('y').Y;" |
| 102 "var X = require('x').X;" | 105 "var X = require('x').X;" |
| 103 "var assert = requireNative('assert');" | 106 "var assert = requireNative('assert');" |
| 104 "assert.AssertTrue(!this.hasOwnProperty('x'));" | 107 "assert.AssertTrue(!this.hasOwnProperty('x'));" |
| 105 "assert.AssertTrue(Y() == 15);" | 108 "assert.AssertTrue(Y() == 15);" |
| 106 "assert.AssertTrue(X() == 10);"); | 109 "assert.AssertTrue(X() == 10);"); |
| 107 env()->module_system()->Require("test"); | 110 env()->module_system()->Require("test"); |
| 108 } | 111 } |
| 109 | 112 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 133 ModuleSystem::NativesEnabledScope natives_enabled_inner( | 136 ModuleSystem::NativesEnabledScope natives_enabled_inner( |
| 134 env()->module_system()); | 137 env()->module_system()); |
| 135 } | 138 } |
| 136 env()->module_system()->Require("test"); | 139 env()->module_system()->Require("test"); |
| 137 } | 140 } |
| 138 } | 141 } |
| 139 | 142 |
| 140 TEST_F(ModuleSystemTest, TestLazyField) { | 143 TEST_F(ModuleSystemTest, TestLazyField) { |
| 141 ModuleSystem::NativesEnabledScope natives_enabled_scope( | 144 ModuleSystem::NativesEnabledScope natives_enabled_scope( |
| 142 env()->module_system()); | 145 env()->module_system()); |
| 143 env()->RegisterModule("lazy", "exports.x = 5;"); | 146 env()->RegisterModule("lazy", "exports.$set('x', 5);"); |
| 144 | 147 |
| 145 v8::Local<v8::Object> object = env()->CreateGlobal("object"); | 148 v8::Local<v8::Object> object = env()->CreateGlobal("object"); |
| 146 | 149 |
| 147 env()->module_system()->SetLazyField(object, "blah", "lazy", "x"); | 150 env()->module_system()->SetLazyField(object, "blah", "lazy", "x"); |
| 148 | 151 |
| 149 env()->RegisterModule("test", | 152 env()->RegisterModule("test", |
| 150 "var assert = requireNative('assert');" | 153 "var assert = requireNative('assert');" |
| 151 "assert.AssertTrue(object.blah == 5);"); | 154 "assert.AssertTrue(object.blah == 5);"); |
| 152 env()->module_system()->Require("test"); | 155 env()->module_system()->Require("test"); |
| 153 } | 156 } |
| 154 | 157 |
| 155 TEST_F(ModuleSystemTest, TestLazyFieldYieldingObject) { | 158 TEST_F(ModuleSystemTest, TestLazyFieldYieldingObject) { |
| 156 ModuleSystem::NativesEnabledScope natives_enabled_scope( | 159 ModuleSystem::NativesEnabledScope natives_enabled_scope( |
| 157 env()->module_system()); | 160 env()->module_system()); |
| 158 env()->RegisterModule( | 161 env()->RegisterModule( |
| 159 "lazy", | 162 "lazy", |
| 160 "var object = {};" | 163 "var object = {};" |
| 161 "object.__defineGetter__('z', function() { return 1; });" | 164 "object.__defineGetter__('z', function() { return 1; });" |
| 162 "object.x = 5;" | 165 "object.x = 5;" |
| 163 "object.y = function() { return 10; };" | 166 "object.y = function() { return 10; };" |
| 164 "exports.object = object;"); | 167 "exports.$set('object', object);"); |
| 165 | 168 |
| 166 v8::Local<v8::Object> object = env()->CreateGlobal("object"); | 169 v8::Local<v8::Object> object = env()->CreateGlobal("object"); |
| 167 | 170 |
| 168 env()->module_system()->SetLazyField(object, "thing", "lazy", "object"); | 171 env()->module_system()->SetLazyField(object, "thing", "lazy", "object"); |
| 169 | 172 |
| 170 env()->RegisterModule("test", | 173 env()->RegisterModule("test", |
| 171 "var assert = requireNative('assert');" | 174 "var assert = requireNative('assert');" |
| 172 "assert.AssertTrue(object.thing.x == 5);" | 175 "assert.AssertTrue(object.thing.x == 5);" |
| 173 "assert.AssertTrue(object.thing.y() == 10);" | 176 "assert.AssertTrue(object.thing.y() == 10);" |
| 174 "assert.AssertTrue(object.thing.z == 1);"); | 177 "assert.AssertTrue(object.thing.z == 1);"); |
| 175 env()->module_system()->Require("test"); | 178 env()->module_system()->Require("test"); |
| 176 } | 179 } |
| 177 | 180 |
| 178 TEST_F(ModuleSystemTest, TestLazyFieldIsOnlyEvaledOnce) { | 181 TEST_F(ModuleSystemTest, TestLazyFieldIsOnlyEvaledOnce) { |
| 179 ModuleSystem::NativesEnabledScope natives_enabled_scope( | 182 ModuleSystem::NativesEnabledScope natives_enabled_scope( |
| 180 env()->module_system()); | 183 env()->module_system()); |
| 181 env()->module_system()->RegisterNativeHandler( | 184 env()->module_system()->RegisterNativeHandler( |
| 182 "counter", | 185 "counter", |
| 183 scoped_ptr<NativeHandler>(new CounterNatives(env()->context()))); | 186 scoped_ptr<NativeHandler>(new CounterNatives(env()->context()))); |
| 184 env()->RegisterModule("lazy", | 187 env()->RegisterModule("lazy", |
| 185 "requireNative('counter').Increment();" | 188 "requireNative('counter').Increment();" |
| 186 "exports.x = 5;"); | 189 "exports.$set('x', 5);"); |
| 187 | 190 |
| 188 v8::Local<v8::Object> object = env()->CreateGlobal("object"); | 191 v8::Local<v8::Object> object = env()->CreateGlobal("object"); |
| 189 | 192 |
| 190 env()->module_system()->SetLazyField(object, "x", "lazy", "x"); | 193 env()->module_system()->SetLazyField(object, "x", "lazy", "x"); |
| 191 | 194 |
| 192 env()->RegisterModule("test", | 195 env()->RegisterModule("test", |
| 193 "var assert = requireNative('assert');" | 196 "var assert = requireNative('assert');" |
| 194 "var counter = requireNative('counter');" | 197 "var counter = requireNative('counter');" |
| 195 "assert.AssertTrue(counter.Get() == 0);" | 198 "assert.AssertTrue(counter.Get() == 0);" |
| 196 "object.x;" | 199 "object.x;" |
| 197 "assert.AssertTrue(counter.Get() == 1);" | 200 "assert.AssertTrue(counter.Get() == 1);" |
| 198 "object.x;" | 201 "object.x;" |
| 199 "assert.AssertTrue(counter.Get() == 1);"); | 202 "assert.AssertTrue(counter.Get() == 1);"); |
| 200 env()->module_system()->Require("test"); | 203 env()->module_system()->Require("test"); |
| 201 } | 204 } |
| 202 | 205 |
| 203 TEST_F(ModuleSystemTest, TestRequireNativesAfterLazyEvaluation) { | 206 TEST_F(ModuleSystemTest, TestRequireNativesAfterLazyEvaluation) { |
| 204 ModuleSystem::NativesEnabledScope natives_enabled_scope( | 207 ModuleSystem::NativesEnabledScope natives_enabled_scope( |
| 205 env()->module_system()); | 208 env()->module_system()); |
| 206 env()->RegisterModule("lazy", "exports.x = 5;"); | 209 env()->RegisterModule("lazy", "exports.$set('x', 5);"); |
| 207 v8::Local<v8::Object> object = env()->CreateGlobal("object"); | 210 v8::Local<v8::Object> object = env()->CreateGlobal("object"); |
| 208 | 211 |
| 209 env()->module_system()->SetLazyField(object, "x", "lazy", "x"); | 212 env()->module_system()->SetLazyField(object, "x", "lazy", "x"); |
| 210 env()->RegisterModule("test", | 213 env()->RegisterModule("test", |
| 211 "object.x;" | 214 "object.x;" |
| 212 "requireNative('assert').AssertTrue(true);"); | 215 "requireNative('assert').AssertTrue(true);"); |
| 213 env()->module_system()->Require("test"); | 216 env()->module_system()->Require("test"); |
| 214 } | 217 } |
| 215 | 218 |
| 216 TEST_F(ModuleSystemTest, TestTransitiveRequire) { | 219 TEST_F(ModuleSystemTest, TestTransitiveRequire) { |
| 217 ModuleSystem::NativesEnabledScope natives_enabled_scope( | 220 ModuleSystem::NativesEnabledScope natives_enabled_scope( |
| 218 env()->module_system()); | 221 env()->module_system()); |
| 219 env()->RegisterModule("dependency", "exports.x = 5;"); | 222 env()->RegisterModule("dependency", "exports.$set('x', 5);"); |
| 220 env()->RegisterModule("lazy", "exports.output = require('dependency');"); | 223 env()->RegisterModule("lazy", |
| 224 "exports.$set('output', require('dependency'));"); |
| 221 | 225 |
| 222 v8::Local<v8::Object> object = env()->CreateGlobal("object"); | 226 v8::Local<v8::Object> object = env()->CreateGlobal("object"); |
| 223 | 227 |
| 224 env()->module_system()->SetLazyField(object, "thing", "lazy", "output"); | 228 env()->module_system()->SetLazyField(object, "thing", "lazy", "output"); |
| 225 | 229 |
| 226 env()->RegisterModule("test", | 230 env()->RegisterModule("test", |
| 227 "var assert = requireNative('assert');" | 231 "var assert = requireNative('assert');" |
| 228 "assert.AssertTrue(object.thing.x == 5);"); | 232 "assert.AssertTrue(object.thing.x == 5);"); |
| 229 env()->module_system()->Require("test"); | 233 env()->module_system()->Require("test"); |
| 230 } | 234 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 246 "assert.AssertTrue(counter.Get() == 1);" | 250 "assert.AssertTrue(counter.Get() == 1);" |
| 247 "require('incrementsWhenEvaled');" | 251 "require('incrementsWhenEvaled');" |
| 248 "assert.AssertTrue(counter.Get() == 1);"); | 252 "assert.AssertTrue(counter.Get() == 1);"); |
| 249 | 253 |
| 250 env()->module_system()->Require("test"); | 254 env()->module_system()->Require("test"); |
| 251 } | 255 } |
| 252 | 256 |
| 253 TEST_F(ModuleSystemTest, TestOverrideNativeHandler) { | 257 TEST_F(ModuleSystemTest, TestOverrideNativeHandler) { |
| 254 ModuleSystem::NativesEnabledScope natives_enabled_scope( | 258 ModuleSystem::NativesEnabledScope natives_enabled_scope( |
| 255 env()->module_system()); | 259 env()->module_system()); |
| 256 env()->OverrideNativeHandler("assert", "exports.AssertTrue = function() {};"); | 260 env()->OverrideNativeHandler("assert", |
| 261 "exports.$set('AssertTrue', function() {});"); |
| 257 env()->RegisterModule("test", "requireNative('assert').AssertTrue(true);"); | 262 env()->RegisterModule("test", "requireNative('assert').AssertTrue(true);"); |
| 258 ExpectNoAssertionsMade(); | 263 ExpectNoAssertionsMade(); |
| 259 env()->module_system()->Require("test"); | 264 env()->module_system()->Require("test"); |
| 260 } | 265 } |
| 261 | 266 |
| 262 TEST_F(ModuleSystemTest, TestOverrideNonExistentNativeHandler) { | 267 TEST_F(ModuleSystemTest, TestOverrideNonExistentNativeHandler) { |
| 263 ModuleSystem::NativesEnabledScope natives_enabled_scope( | 268 ModuleSystem::NativesEnabledScope natives_enabled_scope( |
| 264 env()->module_system()); | 269 env()->module_system()); |
| 265 env()->OverrideNativeHandler("thing", "exports.x = 5;"); | 270 env()->OverrideNativeHandler("thing", "exports.$set('x', 5);"); |
| 266 env()->RegisterModule("test", | 271 env()->RegisterModule("test", |
| 267 "var assert = requireNative('assert');" | 272 "var assert = requireNative('assert');" |
| 268 "assert.AssertTrue(requireNative('thing').x == 5);"); | 273 "assert.AssertTrue(requireNative('thing').x == 5);"); |
| 269 env()->module_system()->Require("test"); | 274 env()->module_system()->Require("test"); |
| 270 } | 275 } |
| 271 | 276 |
| 272 TEST_F(ModuleSystemTest, TestRequireAsync) { | 277 TEST_F(ModuleSystemTest, TestRequireAsync) { |
| 273 ModuleSystem::NativesEnabledScope natives_enabled_scope( | 278 ModuleSystem::NativesEnabledScope natives_enabled_scope( |
| 274 env()->module_system()); | 279 env()->module_system()); |
| 275 env()->RegisterModule("add", | 280 env()->RegisterModule("add", |
| (...skipping 20 matching lines...) Expand all Loading... |
| 296 "define('add', [], function() {" | 301 "define('add', [], function() {" |
| 297 " return { Add: function(x, y) { return x + y; } };" | 302 " return { Add: function(x, y) { return x + y; } };" |
| 298 "});"); | 303 "});"); |
| 299 env()->RegisterModule( | 304 env()->RegisterModule( |
| 300 "subtract", | 305 "subtract", |
| 301 "define('subtract', [], function() {" | 306 "define('subtract', [], function() {" |
| 302 " return { Subtract: function(x, y) { return x - y; } };" | 307 " return { Subtract: function(x, y) { return x - y; } };" |
| 303 "});"); | 308 "});"); |
| 304 env()->RegisterModule( | 309 env()->RegisterModule( |
| 305 "math", | 310 "math", |
| 306 "exports.AddAndSubtract = function(x, y, z) {" | 311 "exports.$set('AddAndSubtract', function(x, y, z) {" |
| 307 " return Promise.all([requireAsync('add')," | 312 " return Promise.all([requireAsync('add')," |
| 308 " requireAsync('subtract')" | 313 " requireAsync('subtract')" |
| 309 " ]).then(function(modules) {" | 314 " ]).then(function(modules) {" |
| 310 " return modules[1].Subtract(modules[0].Add(x, y), z);" | 315 " return modules[1].Subtract(modules[0].Add(x, y), z);" |
| 311 " });" | 316 " });" |
| 312 "};"); | 317 "});"); |
| 313 env()->RegisterModule("test", | 318 env()->RegisterModule("test", |
| 314 "var AddAndSubtract = require('math').AddAndSubtract;" | 319 "var AddAndSubtract = require('math').AddAndSubtract;" |
| 315 "AddAndSubtract(3, 5, 2).then(function(result) {" | 320 "AddAndSubtract(3, 5, 2).then(function(result) {" |
| 316 " requireNative('assert').AssertTrue(result == 6);" | 321 " requireNative('assert').AssertTrue(result == 6);" |
| 317 "});"); | 322 "});"); |
| 318 env()->module_system()->Require("test"); | 323 env()->module_system()->Require("test"); |
| 319 RunResolvedPromises(); | 324 RunResolvedPromises(); |
| 320 } | 325 } |
| 321 | 326 |
| 322 TEST_F(ModuleSystemTest, TestNestedRequireAsyncs) { | 327 TEST_F(ModuleSystemTest, TestNestedRequireAsyncs) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 337 "}).then(function(module) {" | 342 "}).then(function(module) {" |
| 338 " requireNative('assert').AssertTrue(module.next === '');" | 343 " requireNative('assert').AssertTrue(module.next === '');" |
| 339 "});"); | 344 "});"); |
| 340 env()->module_system()->Require("test"); | 345 env()->module_system()->Require("test"); |
| 341 RunResolvedPromises(); | 346 RunResolvedPromises(); |
| 342 } | 347 } |
| 343 | 348 |
| 344 TEST_F(ModuleSystemTest, TestRequireFromAMDModule) { | 349 TEST_F(ModuleSystemTest, TestRequireFromAMDModule) { |
| 345 ModuleSystem::NativesEnabledScope natives_enabled_scope( | 350 ModuleSystem::NativesEnabledScope natives_enabled_scope( |
| 346 env()->module_system()); | 351 env()->module_system()); |
| 347 env()->RegisterModule("add", | 352 env()->RegisterModule( |
| 348 "exports.Add = function(x, y) { return x + y; };"); | 353 "add", "exports.$set('Add', function(x, y) { return x + y; });"); |
| 349 env()->RegisterModule("math", | 354 env()->RegisterModule("math", |
| 350 "define('math', [], function() {" | 355 "define('math', [], function() {" |
| 351 " var add = require('add');" | 356 " var add = require('add');" |
| 352 " return { Add: add.Add };" | 357 " return { Add: add.Add };" |
| 353 "});"); | 358 "});"); |
| 354 env()->RegisterModule( | 359 env()->RegisterModule( |
| 355 "test", | 360 "test", |
| 356 "requireAsync('math').then(function(math) {" | 361 "requireAsync('math').then(function(math) {" |
| 357 " requireNative('assert').AssertTrue(math.Add(3, 5) == 8);" | 362 " requireNative('assert').AssertTrue(math.Add(3, 5) == 8);" |
| 358 "});"); | 363 "});"); |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 gin::ModuleRegistry::From(env()->context()->v8_context()) | 494 gin::ModuleRegistry::From(env()->context()->v8_context()) |
| 490 ->AddBuiltinModule( | 495 ->AddBuiltinModule( |
| 491 env()->isolate(), "natives", | 496 env()->isolate(), "natives", |
| 492 other_env->module_system()->NewInstance()); | 497 other_env->module_system()->NewInstance()); |
| 493 other_env->ShutdownModuleSystem(); | 498 other_env->ShutdownModuleSystem(); |
| 494 env()->module_system()->Require("test"); | 499 env()->module_system()->Require("test"); |
| 495 RunResolvedPromises(); | 500 RunResolvedPromises(); |
| 496 } | 501 } |
| 497 | 502 |
| 498 } // namespace extensions | 503 } // namespace extensions |
| OLD | NEW |