Changeset 185404 in webkit
- Timestamp:
- Jun 9, 2015, 11:26:57 PM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 7 edited
-
ChangeLog (modified) (1 diff)
-
bindings/js/JSAudioContextCustom.cpp (modified) (4 diffs)
-
bindings/js/JSDOMPromise.cpp (modified) (4 diffs)
-
bindings/js/JSDOMPromise.h (modified) (12 diffs)
-
bindings/js/JSMediaDevicesCustom.cpp (modified) (4 diffs)
-
bindings/js/JSReadableStreamReaderCustom.cpp (modified) (3 diffs)
-
bindings/js/JSSubtleCryptoCustom.cpp (modified) (20 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r185403 r185404 1 2015-06-09 Youenn Fablet <youenn.fablet@crf.canon.fr> 2 3 DeferredWrapper should clear its JS strong references once its promise is resolved/rejected 4 https://bugs.webkit.org/show_bug.cgi?id=145753 5 6 Reviewed by Darin Adler. 7 8 Clear strong references at the end of DeferredWrapper::resolve and DeferredWrapper::reject. 9 Added assertions to check that resolve or reject is called only once. 10 11 Removed DeferredWrapper constructor that creates internally its promise. 12 Reason is DeferredWrapper can be resolved synchronously and promise 13 will be lost when returning it at the end of the binding promise function. 14 Updated all custom bindings accordingly. 15 16 Covered by existing tests. 17 18 * bindings/js/JSAudioContextCustom.cpp: 19 (WebCore::JSAudioContext::suspend): Updated DeferredWrapper constructor to properly return the promise. 20 (WebCore::JSAudioContext::resume): Ditto. 21 (WebCore::JSAudioContext::close): Ditto. 22 * bindings/js/JSDOMPromise.cpp: 23 (WebCore::DeferredWrapper::resolve): Cleared strong references after promise resolution. 24 (WebCore::DeferredWrapper::reject): Cleared strong references after promise rejection. 25 * bindings/js/JSDOMPromise.h: 26 (WebCore::DeferredWrapper::resolve): Added ASSERT to check promise is not yet rejected/resolved. 27 (WebCore::DeferredWrapper::reject): Ditto. 28 (WebCore::DeferredWrapper::reject<ExceptionCode>): Ditto. 29 (WebCore::DeferredWrapper::resolve<String>): Ditto. 30 (WebCore::DeferredWrapper::resolve<bool>): Ditto. 31 (WebCore::DeferredWrapper::resolve<JSC::JSValue>): Ditto. 32 (WebCore::char>>): 33 (WebCore::DeferredWrapper::reject<String>): Ditto. 34 * bindings/js/JSMediaDevicesCustom.cpp: 35 (WebCore::JSMediaDevices::getUserMedia): Updated DeferredWrapper constructor to properly return the promise. 36 * bindings/js/JSReadableStreamReaderCustom.cpp: 37 (WebCore::JSReadableStreamReader::read): Ditto. 38 (WebCore::JSReadableStreamReader::closed): Ditto. 39 * bindings/js/JSSubtleCryptoCustom.cpp: 40 (WebCore::JSSubtleCrypto::encrypt): Ditto. 41 (WebCore::JSSubtleCrypto::decrypt): Ditto. 42 (WebCore::JSSubtleCrypto::sign): Ditto. 43 (WebCore::JSSubtleCrypto::verify): Ditto. 44 (WebCore::JSSubtleCrypto::digest): Ditto. 45 (WebCore::JSSubtleCrypto::generateKey): Ditto. 46 (WebCore::JSSubtleCrypto::importKey): Ditto. 47 (WebCore::JSSubtleCrypto::exportKey): Ditto. 48 (WebCore::JSSubtleCrypto::wrapKey): Ditto. 49 (WebCore::JSSubtleCrypto::unwrapKey): Ditto. 50 1 51 2015-06-09 Zalan Bujtas <zalan@apple.com> 2 52 -
trunk/Source/WebCore/bindings/js/JSAudioContextCustom.cpp
r184651 r185404 114 114 JSValue JSAudioContext::suspend(ExecState* exec) 115 115 { 116 DeferredWrapper wrapper(exec, globalObject()); 116 JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject()); 117 DeferredWrapper wrapper(exec, globalObject(), promiseDeferred); 117 118 auto successCallback = [wrapper]() mutable { 118 119 wrapper.resolve(nullptr); … … 124 125 impl().suspendContext(WTF::move(successCallback), WTF::move(failureCallback)); 125 126 126 return wrapper.promise();127 return promiseDeferred->promise(); 127 128 } 128 129 129 130 JSValue JSAudioContext::resume(ExecState* exec) 130 131 { 131 DeferredWrapper wrapper(exec, globalObject()); 132 JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject()); 133 DeferredWrapper wrapper(exec, globalObject(), promiseDeferred); 132 134 auto successCallback = [wrapper]() mutable { 133 135 wrapper.resolve(nullptr); … … 139 141 impl().resumeContext(WTF::move(successCallback), WTF::move(failureCallback)); 140 142 141 return wrapper.promise();143 return promiseDeferred->promise(); 142 144 } 143 145 144 146 JSValue JSAudioContext::close(ExecState* exec) 145 147 { 146 DeferredWrapper wrapper(exec, globalObject()); 148 JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject()); 149 DeferredWrapper wrapper(exec, globalObject(), promiseDeferred); 147 150 auto successCallback = [wrapper]() mutable { 148 151 wrapper.resolve(nullptr); … … 154 157 impl().closeContext(WTF::move(successCallback), WTF::move(failureCallback)); 155 158 156 return wrapper.promise();159 return promiseDeferred->promise(); 157 160 } 158 161 -
trunk/Source/WebCore/bindings/js/JSDOMPromise.cpp
r180559 r185404 33 33 namespace WebCore { 34 34 35 DeferredWrapper::DeferredWrapper(ExecState* exec, JSDOMGlobalObject* globalObject)36 : m_globalObject(exec->vm(), globalObject)37 , m_deferred(exec->vm(), JSPromiseDeferred::create(exec, globalObject))38 {39 }40 41 35 DeferredWrapper::DeferredWrapper(ExecState* exec, JSDOMGlobalObject* globalObject, JSPromiseDeferred* promiseDeferred) 42 36 : m_globalObject(exec->vm(), globalObject) … … 47 41 JSObject* DeferredWrapper::promise() const 48 42 { 43 // FIXME: Remove this accessor once ReadableStreamReader custom binding does not need it. 44 ASSERT(m_deferred); 49 45 return m_deferred->promise(); 50 46 } … … 62 58 63 59 call(exec, deferredResolve, resolveCallType, resolveCallData, jsUndefined(), arguments); 60 61 m_globalObject.clear(); 62 m_deferred.clear(); 64 63 } 65 64 … … 76 75 77 76 call(exec, deferredReject, rejectCallType, rejectCallData, jsUndefined(), arguments); 77 78 m_globalObject.clear(); 79 m_deferred.clear(); 78 80 } 79 81 -
trunk/Source/WebCore/bindings/js/JSDOMPromise.h
r184651 r185404 39 39 class DeferredWrapper { 40 40 public: 41 DeferredWrapper(JSC::ExecState*, JSDOMGlobalObject*);42 41 DeferredWrapper(JSC::ExecState*, JSDOMGlobalObject*, JSC::JSPromiseDeferred*); 43 42 … … 61 60 inline void DeferredWrapper::resolve(const ResolveResultType& result) 62 61 { 62 ASSERT(m_deferred); 63 ASSERT(m_globalObject); 63 64 JSC::ExecState* exec = m_globalObject->globalExec(); 64 65 JSC::JSLockHolder locker(exec); … … 69 70 inline void DeferredWrapper::reject(const RejectResultType& result) 70 71 { 72 ASSERT(m_deferred); 73 ASSERT(m_globalObject); 71 74 JSC::ExecState* exec = m_globalObject->globalExec(); 72 75 JSC::JSLockHolder locker(exec); … … 77 80 inline void DeferredWrapper::reject(const std::nullptr_t&) 78 81 { 82 ASSERT(m_deferred); 83 ASSERT(m_globalObject); 79 84 JSC::ExecState* exec = m_globalObject->globalExec(); 80 85 JSC::JSLockHolder locker(exec); … … 85 90 inline void DeferredWrapper::reject(const JSC::JSValue& value) 86 91 { 92 ASSERT(m_deferred); 93 ASSERT(m_globalObject); 87 94 JSC::ExecState* exec = m_globalObject->globalExec(); 88 95 JSC::JSLockHolder locker(exec); … … 93 100 inline void DeferredWrapper::reject<ExceptionCode>(const ExceptionCode& ec) 94 101 { 102 ASSERT(m_deferred); 103 ASSERT(m_globalObject); 95 104 JSC::ExecState* exec = m_globalObject->globalExec(); 96 105 JSC::JSLockHolder locker(exec); … … 101 110 inline void DeferredWrapper::resolve<String>(const String& result) 102 111 { 112 ASSERT(m_deferred); 113 ASSERT(m_globalObject); 103 114 JSC::ExecState* exec = m_globalObject->globalExec(); 104 115 JSC::JSLockHolder locker(exec); … … 109 120 inline void DeferredWrapper::resolve<bool>(const bool& result) 110 121 { 122 ASSERT(m_deferred); 123 ASSERT(m_globalObject); 111 124 JSC::ExecState* exec = m_globalObject->globalExec(); 112 125 JSC::JSLockHolder locker(exec); … … 117 130 inline void DeferredWrapper::resolve<JSC::JSValue>(const JSC::JSValue& value) 118 131 { 132 ASSERT(m_deferred); 133 ASSERT(m_globalObject); 119 134 JSC::ExecState* exec = m_globalObject->globalExec(); 120 135 JSC::JSLockHolder locker(exec); … … 124 139 inline void DeferredWrapper::resolve<Vector<unsigned char>>(const Vector<unsigned char>& result) 125 140 { 141 ASSERT(m_deferred); 142 ASSERT(m_globalObject); 126 143 JSC::ExecState* exec = m_globalObject->globalExec(); 127 144 JSC::JSLockHolder locker(exec); … … 133 150 inline void DeferredWrapper::resolve(const std::nullptr_t&) 134 151 { 152 ASSERT(m_deferred); 153 ASSERT(m_globalObject); 135 154 JSC::ExecState* exec = m_globalObject->globalExec(); 136 155 JSC::JSLockHolder locker(exec); … … 141 160 inline void DeferredWrapper::reject<String>(const String& result) 142 161 { 162 ASSERT(m_deferred); 163 ASSERT(m_globalObject); 143 164 JSC::ExecState* exec = m_globalObject->globalExec(); 144 165 JSC::JSLockHolder locker(exec); -
trunk/Source/WebCore/bindings/js/JSMediaDevicesCustom.cpp
r185259 r185404 48 48 JSValue JSMediaDevices::getUserMedia(ExecState* exec) 49 49 { 50 DeferredWrapper wrapper(exec, globalObject()); 50 JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject()); 51 DeferredWrapper wrapper(exec, globalObject(), promiseDeferred); 51 52 52 53 Dictionary options(exec, exec->argument(0)); … … 55 56 exec->clearException(); 56 57 wrapper.reject(exception->value()); 57 return wrapper.promise();58 return promiseDeferred->promise(); 58 59 } 59 60 … … 61 62 JSValue error = createTypeError(exec, "First argument of getUserMedia must be a valid Dictionary"); 62 63 wrapper.reject(error); 63 return wrapper.promise();64 return promiseDeferred->promise(); 64 65 } 65 66 … … 76 77 wrapper.reject(ec); 77 78 78 return wrapper.promise();79 return promiseDeferred->promise(); 79 80 } 80 81 -
trunk/Source/WebCore/bindings/js/JSReadableStreamReaderCustom.cpp
r185149 r185404 47 47 JSValue JSReadableStreamReader::read(ExecState* exec) 48 48 { 49 DeferredWrapper wrapper(exec, globalObject()); 49 JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject()); 50 DeferredWrapper wrapper(exec, globalObject(), promiseDeferred); 51 50 52 auto successCallback = [wrapper](JSValue value) mutable { 51 53 JSValue result = createIteratorResultObject(wrapper.promise()->globalObject()->globalExec(), value, false); … … 62 64 impl().read(WTF::move(successCallback), WTF::move(endCallback), WTF::move(failureCallback)); 63 65 64 return wrapper.promise();66 return promiseDeferred->promise(); 65 67 } 66 68 … … 82 84 impl().closed(WTF::move(successCallback), WTF::move(failureCallback)); 83 85 84 return wrapper.promise();86 return m_closedPromiseDeferred->promise(); 85 87 } 86 88 -
trunk/Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp
r180717 r185404 163 163 164 164 165 DeferredWrapper wrapper(exec, globalObject()); 165 JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject()); 166 DeferredWrapper wrapper(exec, globalObject(), promiseDeferred); 166 167 auto successCallback = [wrapper](const Vector<uint8_t>& result) mutable { 167 168 wrapper.resolve(result); … … 178 179 } 179 180 180 return wrapper.promise();181 return promiseDeferred->promise(); 181 182 } 182 183 … … 214 215 } 215 216 216 DeferredWrapper wrapper(exec, globalObject()); 217 JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject()); 218 DeferredWrapper wrapper(exec, globalObject(), promiseDeferred); 217 219 auto successCallback = [wrapper](const Vector<uint8_t>& result) mutable { 218 220 wrapper.resolve(result); … … 229 231 } 230 232 231 return wrapper.promise();233 return promiseDeferred->promise(); 232 234 } 233 235 … … 265 267 } 266 268 267 DeferredWrapper wrapper(exec, globalObject()); 269 JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject()); 270 DeferredWrapper wrapper(exec, globalObject(), promiseDeferred); 268 271 auto successCallback = [wrapper](const Vector<uint8_t>& result) mutable { 269 272 wrapper.resolve(result); … … 280 283 } 281 284 282 return wrapper.promise();285 return promiseDeferred->promise(); 283 286 } 284 287 … … 322 325 } 323 326 324 DeferredWrapper wrapper(exec, globalObject()); 327 JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject()); 328 DeferredWrapper wrapper(exec, globalObject(), promiseDeferred); 325 329 auto successCallback = [wrapper](bool result) mutable { 326 330 wrapper.resolve(result); … … 337 341 } 338 342 339 return wrapper.promise();343 return promiseDeferred->promise(); 340 344 } 341 345 … … 363 367 } 364 368 365 DeferredWrapper wrapper(exec, globalObject()); 369 JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject()); 370 DeferredWrapper wrapper(exec, globalObject(), promiseDeferred); 366 371 auto successCallback = [wrapper](const Vector<uint8_t>& result) mutable { 367 372 wrapper.resolve(result); … … 378 383 } 379 384 380 return wrapper.promise();385 return promiseDeferred->promise(); 381 386 } 382 387 … … 413 418 } 414 419 415 DeferredWrapper wrapper(exec, globalObject()); 420 JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject()); 421 DeferredWrapper wrapper(exec, globalObject(), promiseDeferred); 416 422 auto successCallback = [wrapper](CryptoKey* key, CryptoKeyPair* keyPair) mutable { 417 423 ASSERT(key || keyPair); … … 433 439 } 434 440 435 return wrapper.promise();441 return promiseDeferred->promise(); 436 442 } 437 443 … … 540 546 } 541 547 542 DeferredWrapper wrapper(exec, globalObject()); 548 JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject()); 549 DeferredWrapper wrapper(exec, globalObject(), promiseDeferred); 543 550 auto successCallback = [wrapper](CryptoKey& result) mutable { 544 551 wrapper.resolve(&result); … … 552 559 return jsUndefined(); 553 560 554 return wrapper.promise();561 return promiseDeferred->promise(); 555 562 } 556 563 … … 602 609 return throwTypeError(exec); 603 610 604 DeferredWrapper wrapper(exec, globalObject()); 611 JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject()); 612 DeferredWrapper wrapper(exec, globalObject(), promiseDeferred); 605 613 auto successCallback = [wrapper](const Vector<uint8_t>& result) mutable { 606 614 wrapper.resolve(result); … … 614 622 return jsUndefined(); 615 623 616 return wrapper.promise();624 return promiseDeferred->promise(); 617 625 } 618 626 … … 654 662 } 655 663 656 DeferredWrapper wrapper(exec, globalObject()); 664 JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject()); 665 DeferredWrapper wrapper(exec, globalObject(), promiseDeferred); 657 666 658 667 CryptoAlgorithm* algorithmPtr = algorithm.release(); … … 693 702 } 694 703 695 return wrapper.promise();704 return promiseDeferred->promise(); 696 705 } 697 706 … … 766 775 } 767 776 768 DeferredWrapper wrapper(exec, globalObject()); 777 JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject()); 778 DeferredWrapper wrapper(exec, globalObject(), promiseDeferred); 769 779 Strong<JSDOMGlobalObject> domGlobalObject(exec->vm(), globalObject()); 770 780 … … 803 813 } 804 814 805 return wrapper.promise();815 return promiseDeferred->promise(); 806 816 } 807 817
Note:
See TracChangeset
for help on using the changeset viewer.