Changeset 192021 in webkit
- Timestamp:
- Nov 4, 2015 3:15:51 AM (9 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r192020 r192021 1 2015-11-04 Xabier Rodriguez Calvar <calvaris@igalia.com> 2 3 [Streams API] Shield streams against user replacing the Promise constructor 4 https://bugs.webkit.org/show_bug.cgi?id=150887 5 6 Reviewed by Youenn Fablet. 7 8 * streams/streams-promises-expected.txt: Added. 9 * streams/streams-promises.html: Added. 10 1 11 2015-11-04 Antoine Quint <graouts@apple.com> 2 12 -
trunk/Source/WebCore/ChangeLog
r192020 r192021 1 2015-11-04 Xabier Rodriguez Calvar <calvaris@igalia.com> 2 3 [Streams API] Shield streams against user replacing the Promise constructor 4 https://bugs.webkit.org/show_bug.cgi?id=150887 5 6 Reviewed by Youenn Fablet. 7 8 With this rework, we shield the Streams implementation against the user doing something like "Promise = 9 function() { /* do garbage */ };". 10 11 Test: streams/streams-promises.html. 12 13 * Modules/streams/ReadableStream.js: 14 (initializeReadableStream): 15 (cancel): 16 * Modules/streams/ReadableStreamInternals.js: 17 (privateInitializeReadableStreamReader): 18 (cancelReadableStream): 19 (readFromReadableStreamReader): 20 * Modules/streams/ReadableStreamReader.js: 21 (cancel): 22 (read): 23 (closed): 24 * Modules/streams/StreamInternals.js: 25 (promiseInvokeOrNoop): 26 (promiseInvokeOrFallbackOrNoop): 27 * Modules/streams/WritableStream.js: 28 (initializeWritableStream): 29 (abort): 30 (close): 31 (write): 32 (closed): 33 (ready): 34 * Modules/streams/WritableStreamInternals.js: 35 (syncWritableStreamStateWithQueue): 36 1 37 2015-11-04 Antoine Quint <graouts@apple.com> 2 38 -
trunk/Source/WebCore/Modules/streams/ReadableStream.js
r191730 r192021 57 57 var result = @invokeOrNoop(underlyingSource, "start", [this.@controller]); 58 58 var _this = this; 59 Promise.resolve(result).then(function() {59 @Promise.resolve(result).then(function() { 60 60 _this.@started = true; 61 61 @requestReadableStreamPull(_this); … … 73 73 74 74 if (!@isReadableStream(this)) 75 return Promise.reject(new @TypeError("Function should be called on a ReadableStream"));75 return @Promise.reject(new @TypeError("Function should be called on a ReadableStream")); 76 76 77 77 if (@isReadableStreamLocked(this)) 78 return Promise.reject(new @TypeError("ReadableStream is locked"));78 return @Promise.reject(new @TypeError("ReadableStream is locked")); 79 79 80 80 return @cancelReadableStream(this, reason); -
trunk/Source/WebCore/Modules/streams/ReadableStreamInternals.js
r191956 r192021 43 43 this.@storedError = undefined; 44 44 stream.@reader = this; 45 this.@closedPromiseCapability = @newPromiseCapability( Promise);45 this.@closedPromiseCapability = @newPromiseCapability(@Promise); 46 46 return this; 47 47 } … … 49 49 this.@ownerReadableStream = null; 50 50 this.@storedError = undefined; 51 this.@closedPromiseCapability = { @promise: Promise.resolve(undefined) };51 this.@closedPromiseCapability = { @promise: @Promise.resolve(undefined) }; 52 52 return this; 53 53 } … … 55 55 this.@ownerReadableStream = null; 56 56 this.@storedError = stream.@storedError; 57 this.@closedPromiseCapability = { @promise: Promise.reject(stream.@storedError) };57 this.@closedPromiseCapability = { @promise: @Promise.reject(stream.@storedError) }; 58 58 59 59 return this; … … 276 276 277 277 if (stream.@state === @streamClosed) 278 return Promise.resolve();278 return @Promise.resolve(); 279 279 if (stream.@state === @streamErrored) 280 return Promise.reject(stream.@storedError);280 return @Promise.reject(stream.@storedError); 281 281 stream.@queue = @newQueue(); 282 282 @finishClosingReadableStream(stream); … … 355 355 356 356 if (reader.@state === @streamClosed) 357 return Promise.resolve({value: undefined, done: true});357 return @Promise.resolve({value: undefined, done: true}); 358 358 if (reader.@state === @streamErrored) 359 return Promise.reject(reader.@storedError);359 return @Promise.reject(reader.@storedError); 360 360 // FIXME: ASSERT(!!reader.@ownerReadableStream); 361 361 // FIXME: ASSERT(reader.@ownerReadableStream.@state === @streamReadable); … … 367 367 else if (!stream.@queue.content.length) 368 368 @finishClosingReadableStream(stream); 369 return Promise.resolve({value: chunk, done: false});370 } 371 var readPromiseCapability = @newPromiseCapability( Promise);369 return @Promise.resolve({value: chunk, done: false}); 370 } 371 var readPromiseCapability = @newPromiseCapability(@Promise); 372 372 reader.@readRequests.push(readPromiseCapability); 373 373 @requestReadableStreamPull(stream); -
trunk/Source/WebCore/Modules/streams/ReadableStreamReader.js
r191950 r192021 31 31 32 32 if (!@isReadableStreamReader(this)) 33 return Promise.reject(new @TypeError("Function should be called on a ReadableStreamReader"));33 return @Promise.reject(new @TypeError("Function should be called on a ReadableStreamReader")); 34 34 35 35 if (this.@state === @streamClosed) 36 return Promise.resolve();36 return @Promise.resolve(); 37 37 38 38 if (this.@state === @streamErrored) 39 return Promise.reject(this.@storedError);39 return @Promise.reject(this.@storedError); 40 40 41 41 // FIXME: ASSERT(@isReadableStream(this.@ownerReadableStream)); … … 49 49 50 50 if (!@isReadableStreamReader(this)) 51 return Promise.reject(new @TypeError("Function should be called on a ReadableStreamReader"));51 return @Promise.reject(new @TypeError("Function should be called on a ReadableStreamReader")); 52 52 53 53 return @readFromReadableStreamReader(this); … … 75 75 76 76 if (!@isReadableStreamReader(this)) 77 return Promise.reject(new @TypeError("Callee of closed is not a ReadableStreamReader"));77 return @Promise.reject(new @TypeError("Callee of closed is not a ReadableStreamReader")); 78 78 79 79 return this.@closedPromiseCapability.@promise; -
trunk/Source/WebCore/Modules/streams/StreamInternals.js
r191950 r192021 45 45 var method = object[key]; 46 46 if (typeof method === "undefined") 47 return Promise.resolve();47 return @Promise.resolve(); 48 48 var result = method.@apply(object, args); 49 return Promise.resolve(result);49 return @Promise.resolve(result); 50 50 } 51 51 catch(error) { 52 return Promise.reject(error);52 return @Promise.reject(error); 53 53 } 54 54 … … 64 64 return @promiseInvokeOrNoop(object, key2, args2); 65 65 const result = method.@apply(object, args1); 66 return Promise.resolve(result);66 return @Promise.resolve(result); 67 67 } 68 68 catch(error) { 69 return Promise.reject(error);69 return @Promise.reject(error); 70 70 } 71 71 } -
trunk/Source/WebCore/Modules/streams/WritableStream.js
r191956 r192021 43 43 44 44 this.@underlyingSink = underlyingSink; 45 this.@closedPromiseCapability = @newPromiseCapability( Promise);46 this.@readyPromiseCapability = { @promise: Promise.resolve(undefined) };45 this.@closedPromiseCapability = @newPromiseCapability(@Promise); 46 this.@readyPromiseCapability = { @promise: @Promise.resolve(undefined) }; 47 47 this.@queue = @newQueue(); 48 48 this.@state = @streamWritable; … … 56 56 var error = @errorWritableStream.bind(this); 57 57 var startResult = @invokeOrNoop(underlyingSink, "start", [error]); 58 this.@startedPromise = Promise.resolve(startResult);58 this.@startedPromise = @Promise.resolve(startResult); 59 59 var _this = this; 60 60 this.@startedPromise.then(function() { … … 71 71 72 72 if (!@isWritableStream(this)) 73 return Promise.reject(new @TypeError("The WritableStream.abort method can only be used on instances of WritableStream"));73 return @Promise.reject(new @TypeError("The WritableStream.abort method can only be used on instances of WritableStream")); 74 74 75 75 if (this.@state === @streamClosed) 76 return Promise.resolve(undefined);76 return @Promise.resolve(undefined); 77 77 78 78 if (this.@state === @streamErrored) 79 return Promise.reject(this.@storedError);79 return @Promise.reject(this.@storedError); 80 80 81 81 @errorWritableStream.@apply(this, [reason]); … … 91 91 92 92 if (!@isWritableStream(this)) 93 return Promise.reject(new @TypeError("The WritableStream.close method can only be used on instances of WritableStream"));93 return @Promise.reject(new @TypeError("The WritableStream.close method can only be used on instances of WritableStream")); 94 94 95 95 if (this.@state === @streamClosed || this.@state === @streamClosing) 96 return Promise.reject(new @TypeError("Cannot close a WritableString that is closed or closing"));96 return @Promise.reject(new @TypeError("Cannot close a WritableString that is closed or closing")); 97 97 98 98 if (this.@state === @streamErrored) 99 return Promise.reject(this.@storedError);99 return @Promise.reject(this.@storedError); 100 100 101 101 if (this.@state === @streamWaiting) … … 114 114 115 115 if (!@isWritableStream(this)) 116 return Promise.reject(new @TypeError("The WritableStream.close method can only be used on instances of WritableStream"));116 return @Promise.reject(new @TypeError("The WritableStream.close method can only be used on instances of WritableStream")); 117 117 118 118 if (this.@state === @streamClosed || this.@state === @streamClosing) 119 return Promise.reject(new @TypeError("Cannot write on a WritableString that is closed or closing"));119 return @Promise.reject(new @TypeError("Cannot write on a WritableString that is closed or closing")); 120 120 121 121 if (this.@state === @streamErrored) 122 return Promise.reject(this.@storedError);122 return @Promise.reject(this.@storedError); 123 123 124 124 // FIXME … … 131 131 } catch(e) { 132 132 @errorWritableStream.@call(this, e); 133 return Promise.reject(e);133 return @Promise.reject(e); 134 134 } 135 135 } 136 136 137 const promiseCapability = @newPromiseCapability( Promise);137 const promiseCapability = @newPromiseCapability(@Promise); 138 138 try { 139 139 @enqueueValueWithSize(this.@queue, { promiseCapability: promiseCapability, chunk: chunk }, chunkSize); 140 140 } catch (e) { 141 141 @errorWritableStream.@call(this, e); 142 return Promise.reject(e);142 return @Promise.reject(e); 143 143 } 144 144 … … 154 154 155 155 if (!@isWritableStream(this)) 156 return Promise.reject(new @TypeError("The WritableStream.closed getter can only be used on instances of WritableStream"));156 return @Promise.reject(new @TypeError("The WritableStream.closed getter can only be used on instances of WritableStream")); 157 157 158 158 return this.@closedPromiseCapability.@promise; … … 164 164 165 165 if (!@isWritableStream(this)) 166 return Promise.reject(new @TypeError("The WritableStream.ready getter can only be used on instances of WritableStream"));166 return @Promise.reject(new @TypeError("The WritableStream.ready getter can only be used on instances of WritableStream")); 167 167 168 168 return this.@readyPromiseCapability.@promise; -
trunk/Source/WebCore/Modules/streams/WritableStreamInternals.js
r191956 r192021 48 48 if (shouldApplyBackpressure && stream.@state === @streamWritable) { 49 49 stream.@state = @streamWaiting; 50 stream.@readyPromiseCapability = @newPromiseCapability( Promise);50 stream.@readyPromiseCapability = @newPromiseCapability(@Promise); 51 51 } 52 52 if (!shouldApplyBackpressure && stream.@state === @streamWaiting) {
Note: See TracChangeset
for help on using the changeset viewer.