| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2014 Google Inc. All rights reserved. | 2 * Copyright (C) 2014 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 : m_scope(v8::Isolate::GetCurrent()) | 76 : m_scope(v8::Isolate::GetCurrent()) |
| 77 { | 77 { |
| 78 } | 78 } |
| 79 | 79 |
| 80 ~ScriptPromiseTest() | 80 ~ScriptPromiseTest() |
| 81 { | 81 { |
| 82 // FIXME: We put this statement here to clear an exception from the isol
ate. | 82 // FIXME: We put this statement here to clear an exception from the isol
ate. |
| 83 createClosure(callback, v8::Undefined(m_scope.isolate()), m_scope.isolat
e()); | 83 createClosure(callback, v8::Undefined(m_scope.isolate()), m_scope.isolat
e()); |
| 84 | 84 |
| 85 // Execute all pending microtasks | 85 // Execute all pending microtasks |
| 86 isolate()->RunMicrotasks(); | 86 v8::MicrotasksScope::PerformCheckpoint(isolate()); |
| 87 } | 87 } |
| 88 | 88 |
| 89 String toString(const ScriptValue& value) | 89 String toString(const ScriptValue& value) |
| 90 { | 90 { |
| 91 return toCoreString(value.v8Value()->ToString(getScriptState()->context(
)).ToLocalChecked()); | 91 return toCoreString(value.v8Value()->ToString(getScriptState()->context(
)).ToLocalChecked()); |
| 92 } | 92 } |
| 93 | 93 |
| 94 Vector<String> toStringArray(const ScriptValue& value) | 94 Vector<String> toStringArray(const ScriptValue& value) |
| 95 { | 95 { |
| 96 NonThrowableExceptionState exceptionState; | 96 NonThrowableExceptionState exceptionState; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 117 { | 117 { |
| 118 Resolver resolver(getScriptState()); | 118 Resolver resolver(getScriptState()); |
| 119 ScriptPromise promise = resolver.promise(); | 119 ScriptPromise promise = resolver.promise(); |
| 120 ScriptValue onFulfilled, onRejected; | 120 ScriptValue onFulfilled, onRejected; |
| 121 promise.then(Function::createFunction(getScriptState(), &onFulfilled), Funct
ion::createFunction(getScriptState(), &onRejected)); | 121 promise.then(Function::createFunction(getScriptState(), &onFulfilled), Funct
ion::createFunction(getScriptState(), &onRejected)); |
| 122 | 122 |
| 123 ASSERT_FALSE(promise.isEmpty()); | 123 ASSERT_FALSE(promise.isEmpty()); |
| 124 EXPECT_TRUE(onFulfilled.isEmpty()); | 124 EXPECT_TRUE(onFulfilled.isEmpty()); |
| 125 EXPECT_TRUE(onRejected.isEmpty()); | 125 EXPECT_TRUE(onRejected.isEmpty()); |
| 126 | 126 |
| 127 isolate()->RunMicrotasks(); | 127 v8::MicrotasksScope::PerformCheckpoint(isolate()); |
| 128 resolver.resolve(v8String(isolate(), "hello")); | 128 resolver.resolve(v8String(isolate(), "hello")); |
| 129 | 129 |
| 130 EXPECT_TRUE(onFulfilled.isEmpty()); | 130 EXPECT_TRUE(onFulfilled.isEmpty()); |
| 131 EXPECT_TRUE(onRejected.isEmpty()); | 131 EXPECT_TRUE(onRejected.isEmpty()); |
| 132 | 132 |
| 133 isolate()->RunMicrotasks(); | 133 v8::MicrotasksScope::PerformCheckpoint(isolate()); |
| 134 | 134 |
| 135 EXPECT_EQ("hello", toString(onFulfilled)); | 135 EXPECT_EQ("hello", toString(onFulfilled)); |
| 136 EXPECT_TRUE(onRejected.isEmpty()); | 136 EXPECT_TRUE(onRejected.isEmpty()); |
| 137 } | 137 } |
| 138 | 138 |
| 139 TEST_F(ScriptPromiseTest, resolveThen) | 139 TEST_F(ScriptPromiseTest, resolveThen) |
| 140 { | 140 { |
| 141 Resolver resolver(getScriptState()); | 141 Resolver resolver(getScriptState()); |
| 142 ScriptPromise promise = resolver.promise(); | 142 ScriptPromise promise = resolver.promise(); |
| 143 ScriptValue onFulfilled, onRejected; | 143 ScriptValue onFulfilled, onRejected; |
| 144 resolver.resolve(v8String(isolate(), "hello")); | 144 resolver.resolve(v8String(isolate(), "hello")); |
| 145 promise.then(Function::createFunction(getScriptState(), &onFulfilled), Funct
ion::createFunction(getScriptState(), &onRejected)); | 145 promise.then(Function::createFunction(getScriptState(), &onFulfilled), Funct
ion::createFunction(getScriptState(), &onRejected)); |
| 146 | 146 |
| 147 ASSERT_FALSE(promise.isEmpty()); | 147 ASSERT_FALSE(promise.isEmpty()); |
| 148 EXPECT_TRUE(onFulfilled.isEmpty()); | 148 EXPECT_TRUE(onFulfilled.isEmpty()); |
| 149 EXPECT_TRUE(onRejected.isEmpty()); | 149 EXPECT_TRUE(onRejected.isEmpty()); |
| 150 | 150 |
| 151 isolate()->RunMicrotasks(); | 151 v8::MicrotasksScope::PerformCheckpoint(isolate()); |
| 152 | 152 |
| 153 EXPECT_EQ("hello", toString(onFulfilled)); | 153 EXPECT_EQ("hello", toString(onFulfilled)); |
| 154 EXPECT_TRUE(onRejected.isEmpty()); | 154 EXPECT_TRUE(onRejected.isEmpty()); |
| 155 } | 155 } |
| 156 | 156 |
| 157 TEST_F(ScriptPromiseTest, thenReject) | 157 TEST_F(ScriptPromiseTest, thenReject) |
| 158 { | 158 { |
| 159 Resolver resolver(getScriptState()); | 159 Resolver resolver(getScriptState()); |
| 160 ScriptPromise promise = resolver.promise(); | 160 ScriptPromise promise = resolver.promise(); |
| 161 ScriptValue onFulfilled, onRejected; | 161 ScriptValue onFulfilled, onRejected; |
| 162 promise.then(Function::createFunction(getScriptState(), &onFulfilled), Funct
ion::createFunction(getScriptState(), &onRejected)); | 162 promise.then(Function::createFunction(getScriptState(), &onFulfilled), Funct
ion::createFunction(getScriptState(), &onRejected)); |
| 163 | 163 |
| 164 ASSERT_FALSE(promise.isEmpty()); | 164 ASSERT_FALSE(promise.isEmpty()); |
| 165 EXPECT_TRUE(onFulfilled.isEmpty()); | 165 EXPECT_TRUE(onFulfilled.isEmpty()); |
| 166 EXPECT_TRUE(onRejected.isEmpty()); | 166 EXPECT_TRUE(onRejected.isEmpty()); |
| 167 | 167 |
| 168 isolate()->RunMicrotasks(); | 168 v8::MicrotasksScope::PerformCheckpoint(isolate()); |
| 169 resolver.reject(v8String(isolate(), "hello")); | 169 resolver.reject(v8String(isolate(), "hello")); |
| 170 | 170 |
| 171 EXPECT_TRUE(onFulfilled.isEmpty()); | 171 EXPECT_TRUE(onFulfilled.isEmpty()); |
| 172 EXPECT_TRUE(onRejected.isEmpty()); | 172 EXPECT_TRUE(onRejected.isEmpty()); |
| 173 | 173 |
| 174 isolate()->RunMicrotasks(); | 174 v8::MicrotasksScope::PerformCheckpoint(isolate()); |
| 175 | 175 |
| 176 EXPECT_TRUE(onFulfilled.isEmpty()); | 176 EXPECT_TRUE(onFulfilled.isEmpty()); |
| 177 EXPECT_EQ("hello", toString(onRejected)); | 177 EXPECT_EQ("hello", toString(onRejected)); |
| 178 } | 178 } |
| 179 | 179 |
| 180 TEST_F(ScriptPromiseTest, rejectThen) | 180 TEST_F(ScriptPromiseTest, rejectThen) |
| 181 { | 181 { |
| 182 Resolver resolver(getScriptState()); | 182 Resolver resolver(getScriptState()); |
| 183 ScriptPromise promise = resolver.promise(); | 183 ScriptPromise promise = resolver.promise(); |
| 184 ScriptValue onFulfilled, onRejected; | 184 ScriptValue onFulfilled, onRejected; |
| 185 resolver.reject(v8String(isolate(), "hello")); | 185 resolver.reject(v8String(isolate(), "hello")); |
| 186 promise.then(Function::createFunction(getScriptState(), &onFulfilled), Funct
ion::createFunction(getScriptState(), &onRejected)); | 186 promise.then(Function::createFunction(getScriptState(), &onFulfilled), Funct
ion::createFunction(getScriptState(), &onRejected)); |
| 187 | 187 |
| 188 ASSERT_FALSE(promise.isEmpty()); | 188 ASSERT_FALSE(promise.isEmpty()); |
| 189 EXPECT_TRUE(onFulfilled.isEmpty()); | 189 EXPECT_TRUE(onFulfilled.isEmpty()); |
| 190 EXPECT_TRUE(onRejected.isEmpty()); | 190 EXPECT_TRUE(onRejected.isEmpty()); |
| 191 | 191 |
| 192 isolate()->RunMicrotasks(); | 192 v8::MicrotasksScope::PerformCheckpoint(isolate()); |
| 193 | 193 |
| 194 EXPECT_TRUE(onFulfilled.isEmpty()); | 194 EXPECT_TRUE(onFulfilled.isEmpty()); |
| 195 EXPECT_EQ("hello", toString(onRejected)); | 195 EXPECT_EQ("hello", toString(onRejected)); |
| 196 } | 196 } |
| 197 | 197 |
| 198 TEST_F(ScriptPromiseTest, castPromise) | 198 TEST_F(ScriptPromiseTest, castPromise) |
| 199 { | 199 { |
| 200 ScriptPromise promise = Resolver(getScriptState()).promise(); | 200 ScriptPromise promise = Resolver(getScriptState()).promise(); |
| 201 ScriptPromise newPromise = ScriptPromise::cast(getScriptState(), promise.v8V
alue()); | 201 ScriptPromise newPromise = ScriptPromise::cast(getScriptState(), promise.v8V
alue()); |
| 202 | 202 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 219 EXPECT_NE(promise1.v8Value(), promise2.v8Value()); | 219 EXPECT_NE(promise1.v8Value(), promise2.v8Value()); |
| 220 | 220 |
| 221 ASSERT_TRUE(promise1.v8Value()->IsPromise()); | 221 ASSERT_TRUE(promise1.v8Value()->IsPromise()); |
| 222 ASSERT_TRUE(promise2.v8Value()->IsPromise()); | 222 ASSERT_TRUE(promise2.v8Value()->IsPromise()); |
| 223 | 223 |
| 224 EXPECT_TRUE(onFulfilled1.isEmpty()); | 224 EXPECT_TRUE(onFulfilled1.isEmpty()); |
| 225 EXPECT_TRUE(onFulfilled2.isEmpty()); | 225 EXPECT_TRUE(onFulfilled2.isEmpty()); |
| 226 EXPECT_TRUE(onRejected1.isEmpty()); | 226 EXPECT_TRUE(onRejected1.isEmpty()); |
| 227 EXPECT_TRUE(onRejected2.isEmpty()); | 227 EXPECT_TRUE(onRejected2.isEmpty()); |
| 228 | 228 |
| 229 isolate()->RunMicrotasks(); | 229 v8::MicrotasksScope::PerformCheckpoint(isolate()); |
| 230 | 230 |
| 231 EXPECT_EQ("hello", toString(onFulfilled1)); | 231 EXPECT_EQ("hello", toString(onFulfilled1)); |
| 232 EXPECT_EQ("hello", toString(onFulfilled2)); | 232 EXPECT_EQ("hello", toString(onFulfilled2)); |
| 233 EXPECT_TRUE(onRejected1.isEmpty()); | 233 EXPECT_TRUE(onRejected1.isEmpty()); |
| 234 EXPECT_TRUE(onRejected2.isEmpty()); | 234 EXPECT_TRUE(onRejected2.isEmpty()); |
| 235 } | 235 } |
| 236 | 236 |
| 237 TEST_F(ScriptPromiseTest, reject) | 237 TEST_F(ScriptPromiseTest, reject) |
| 238 { | 238 { |
| 239 ScriptValue onFulfilled, onRejected; | 239 ScriptValue onFulfilled, onRejected; |
| 240 | 240 |
| 241 ScriptValue value = ScriptValue(getScriptState(), v8String(isolate(), "hello
")); | 241 ScriptValue value = ScriptValue(getScriptState(), v8String(isolate(), "hello
")); |
| 242 ScriptPromise promise = ScriptPromise::reject(getScriptState(), ScriptValue(
value)); | 242 ScriptPromise promise = ScriptPromise::reject(getScriptState(), ScriptValue(
value)); |
| 243 promise.then(Function::createFunction(getScriptState(), &onFulfilled), Funct
ion::createFunction(getScriptState(), &onRejected)); | 243 promise.then(Function::createFunction(getScriptState(), &onFulfilled), Funct
ion::createFunction(getScriptState(), &onRejected)); |
| 244 | 244 |
| 245 ASSERT_FALSE(promise.isEmpty()); | 245 ASSERT_FALSE(promise.isEmpty()); |
| 246 ASSERT_TRUE(promise.v8Value()->IsPromise()); | 246 ASSERT_TRUE(promise.v8Value()->IsPromise()); |
| 247 | 247 |
| 248 EXPECT_TRUE(onFulfilled.isEmpty()); | 248 EXPECT_TRUE(onFulfilled.isEmpty()); |
| 249 EXPECT_TRUE(onRejected.isEmpty()); | 249 EXPECT_TRUE(onRejected.isEmpty()); |
| 250 | 250 |
| 251 isolate()->RunMicrotasks(); | 251 v8::MicrotasksScope::PerformCheckpoint(isolate()); |
| 252 | 252 |
| 253 EXPECT_TRUE(onFulfilled.isEmpty()); | 253 EXPECT_TRUE(onFulfilled.isEmpty()); |
| 254 EXPECT_EQ("hello", toString(onRejected)); | 254 EXPECT_EQ("hello", toString(onRejected)); |
| 255 } | 255 } |
| 256 | 256 |
| 257 TEST_F(ScriptPromiseTest, rejectWithExceptionState) | 257 TEST_F(ScriptPromiseTest, rejectWithExceptionState) |
| 258 { | 258 { |
| 259 ScriptValue onFulfilled, onRejected; | 259 ScriptValue onFulfilled, onRejected; |
| 260 ScriptPromise promise = ScriptPromise::rejectWithDOMException(getScriptState
(), DOMException::create(SyntaxError, "some syntax error")); | 260 ScriptPromise promise = ScriptPromise::rejectWithDOMException(getScriptState
(), DOMException::create(SyntaxError, "some syntax error")); |
| 261 promise.then(Function::createFunction(getScriptState(), &onFulfilled), Funct
ion::createFunction(getScriptState(), &onRejected)); | 261 promise.then(Function::createFunction(getScriptState(), &onFulfilled), Funct
ion::createFunction(getScriptState(), &onRejected)); |
| 262 | 262 |
| 263 ASSERT_FALSE(promise.isEmpty()); | 263 ASSERT_FALSE(promise.isEmpty()); |
| 264 EXPECT_TRUE(onFulfilled.isEmpty()); | 264 EXPECT_TRUE(onFulfilled.isEmpty()); |
| 265 EXPECT_TRUE(onRejected.isEmpty()); | 265 EXPECT_TRUE(onRejected.isEmpty()); |
| 266 | 266 |
| 267 isolate()->RunMicrotasks(); | 267 v8::MicrotasksScope::PerformCheckpoint(isolate()); |
| 268 | 268 |
| 269 EXPECT_TRUE(onFulfilled.isEmpty()); | 269 EXPECT_TRUE(onFulfilled.isEmpty()); |
| 270 EXPECT_EQ("SyntaxError: some syntax error", toString(onRejected)); | 270 EXPECT_EQ("SyntaxError: some syntax error", toString(onRejected)); |
| 271 } | 271 } |
| 272 | 272 |
| 273 TEST_F(ScriptPromiseTest, allWithEmptyPromises) | 273 TEST_F(ScriptPromiseTest, allWithEmptyPromises) |
| 274 { | 274 { |
| 275 ScriptValue onFulfilled, onRejected; | 275 ScriptValue onFulfilled, onRejected; |
| 276 | 276 |
| 277 ScriptPromise promise = ScriptPromise::all(getScriptState(), Vector<ScriptPr
omise>()); | 277 ScriptPromise promise = ScriptPromise::all(getScriptState(), Vector<ScriptPr
omise>()); |
| 278 ASSERT_FALSE(promise.isEmpty()); | 278 ASSERT_FALSE(promise.isEmpty()); |
| 279 | 279 |
| 280 promise.then(Function::createFunction(getScriptState(), &onFulfilled), Funct
ion::createFunction(getScriptState(), &onRejected)); | 280 promise.then(Function::createFunction(getScriptState(), &onFulfilled), Funct
ion::createFunction(getScriptState(), &onRejected)); |
| 281 | 281 |
| 282 EXPECT_TRUE(onFulfilled.isEmpty()); | 282 EXPECT_TRUE(onFulfilled.isEmpty()); |
| 283 EXPECT_TRUE(onRejected.isEmpty()); | 283 EXPECT_TRUE(onRejected.isEmpty()); |
| 284 | 284 |
| 285 isolate()->RunMicrotasks(); | 285 v8::MicrotasksScope::PerformCheckpoint(isolate()); |
| 286 | 286 |
| 287 EXPECT_FALSE(onFulfilled.isEmpty()); | 287 EXPECT_FALSE(onFulfilled.isEmpty()); |
| 288 EXPECT_TRUE(toStringArray(onFulfilled).isEmpty()); | 288 EXPECT_TRUE(toStringArray(onFulfilled).isEmpty()); |
| 289 EXPECT_TRUE(onRejected.isEmpty()); | 289 EXPECT_TRUE(onRejected.isEmpty()); |
| 290 } | 290 } |
| 291 | 291 |
| 292 TEST_F(ScriptPromiseTest, allWithResolvedPromises) | 292 TEST_F(ScriptPromiseTest, allWithResolvedPromises) |
| 293 { | 293 { |
| 294 ScriptValue onFulfilled, onRejected; | 294 ScriptValue onFulfilled, onRejected; |
| 295 | 295 |
| 296 Vector<ScriptPromise> promises; | 296 Vector<ScriptPromise> promises; |
| 297 promises.append(ScriptPromise::cast(getScriptState(), v8String(isolate(), "h
ello"))); | 297 promises.append(ScriptPromise::cast(getScriptState(), v8String(isolate(), "h
ello"))); |
| 298 promises.append(ScriptPromise::cast(getScriptState(), v8String(isolate(), "w
orld"))); | 298 promises.append(ScriptPromise::cast(getScriptState(), v8String(isolate(), "w
orld"))); |
| 299 | 299 |
| 300 ScriptPromise promise = ScriptPromise::all(getScriptState(), promises); | 300 ScriptPromise promise = ScriptPromise::all(getScriptState(), promises); |
| 301 ASSERT_FALSE(promise.isEmpty()); | 301 ASSERT_FALSE(promise.isEmpty()); |
| 302 promise.then(Function::createFunction(getScriptState(), &onFulfilled), Funct
ion::createFunction(getScriptState(), &onRejected)); | 302 promise.then(Function::createFunction(getScriptState(), &onFulfilled), Funct
ion::createFunction(getScriptState(), &onRejected)); |
| 303 | 303 |
| 304 EXPECT_TRUE(onFulfilled.isEmpty()); | 304 EXPECT_TRUE(onFulfilled.isEmpty()); |
| 305 EXPECT_TRUE(onRejected.isEmpty()); | 305 EXPECT_TRUE(onRejected.isEmpty()); |
| 306 | 306 |
| 307 isolate()->RunMicrotasks(); | 307 v8::MicrotasksScope::PerformCheckpoint(isolate()); |
| 308 | 308 |
| 309 EXPECT_FALSE(onFulfilled.isEmpty()); | 309 EXPECT_FALSE(onFulfilled.isEmpty()); |
| 310 Vector<String> values = toStringArray(onFulfilled); | 310 Vector<String> values = toStringArray(onFulfilled); |
| 311 EXPECT_EQ(2u, values.size()); | 311 EXPECT_EQ(2u, values.size()); |
| 312 EXPECT_EQ("hello", values[0]); | 312 EXPECT_EQ("hello", values[0]); |
| 313 EXPECT_EQ("world", values[1]); | 313 EXPECT_EQ("world", values[1]); |
| 314 EXPECT_TRUE(onRejected.isEmpty()); | 314 EXPECT_TRUE(onRejected.isEmpty()); |
| 315 } | 315 } |
| 316 | 316 |
| 317 TEST_F(ScriptPromiseTest, allWithRejectedPromise) | 317 TEST_F(ScriptPromiseTest, allWithRejectedPromise) |
| 318 { | 318 { |
| 319 ScriptValue onFulfilled, onRejected; | 319 ScriptValue onFulfilled, onRejected; |
| 320 | 320 |
| 321 Vector<ScriptPromise> promises; | 321 Vector<ScriptPromise> promises; |
| 322 promises.append(ScriptPromise::cast(getScriptState(), v8String(isolate(), "h
ello"))); | 322 promises.append(ScriptPromise::cast(getScriptState(), v8String(isolate(), "h
ello"))); |
| 323 promises.append(ScriptPromise::reject(getScriptState(), v8String(isolate(),
"world"))); | 323 promises.append(ScriptPromise::reject(getScriptState(), v8String(isolate(),
"world"))); |
| 324 | 324 |
| 325 ScriptPromise promise = ScriptPromise::all(getScriptState(), promises); | 325 ScriptPromise promise = ScriptPromise::all(getScriptState(), promises); |
| 326 ASSERT_FALSE(promise.isEmpty()); | 326 ASSERT_FALSE(promise.isEmpty()); |
| 327 promise.then(Function::createFunction(getScriptState(), &onFulfilled), Funct
ion::createFunction(getScriptState(), &onRejected)); | 327 promise.then(Function::createFunction(getScriptState(), &onFulfilled), Funct
ion::createFunction(getScriptState(), &onRejected)); |
| 328 | 328 |
| 329 EXPECT_TRUE(onFulfilled.isEmpty()); | 329 EXPECT_TRUE(onFulfilled.isEmpty()); |
| 330 EXPECT_TRUE(onRejected.isEmpty()); | 330 EXPECT_TRUE(onRejected.isEmpty()); |
| 331 | 331 |
| 332 isolate()->RunMicrotasks(); | 332 v8::MicrotasksScope::PerformCheckpoint(isolate()); |
| 333 | 333 |
| 334 EXPECT_TRUE(onFulfilled.isEmpty()); | 334 EXPECT_TRUE(onFulfilled.isEmpty()); |
| 335 EXPECT_FALSE(onRejected.isEmpty()); | 335 EXPECT_FALSE(onRejected.isEmpty()); |
| 336 EXPECT_EQ("world", toString(onRejected)); | 336 EXPECT_EQ("world", toString(onRejected)); |
| 337 } | 337 } |
| 338 | 338 |
| 339 } // namespace | 339 } // namespace |
| 340 | 340 |
| 341 } // namespace blink | 341 } // namespace blink |
| OLD | NEW |