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 |