Diff
Modified: trunk/LayoutTests/ChangeLog (192020 => 192021)
--- trunk/LayoutTests/ChangeLog 2015-11-04 10:40:17 UTC (rev 192020)
+++ trunk/LayoutTests/ChangeLog 2015-11-04 11:15:51 UTC (rev 192021)
@@ -1,3 +1,13 @@
+2015-11-04 Xabier Rodriguez Calvar <calva...@igalia.com>
+
+ [Streams API] Shield streams against user replacing the Promise constructor
+ https://bugs.webkit.org/show_bug.cgi?id=150887
+
+ Reviewed by Youenn Fablet.
+
+ * streams/streams-promises-expected.txt: Added.
+ * streams/streams-promises.html: Added.
+
2015-11-04 Antoine Quint <grao...@apple.com>
SVG: hit testing region for <text> elements is incorrect
Added: trunk/LayoutTests/streams/streams-promises-expected.txt (0 => 192021)
--- trunk/LayoutTests/streams/streams-promises-expected.txt (rev 0)
+++ trunk/LayoutTests/streams/streams-promises-expected.txt 2015-11-04 11:15:51 UTC (rev 192021)
@@ -0,0 +1,3 @@
+
+PASS Streams can be built even if Promise constructor is replaced
+
Added: trunk/LayoutTests/streams/streams-promises.html (0 => 192021)
--- trunk/LayoutTests/streams/streams-promises.html (rev 0)
+++ trunk/LayoutTests/streams/streams-promises.html 2015-11-04 11:15:51 UTC (rev 192021)
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<script src=''></script>
+<script src=''></script>
+<script>
+test(function() {
+ Promise = function() { throw new Error("nasty things"); };
+
+ const rs = new ReadableStream(); // Does not throw.
+ const ws = new WritableStream(); // Does not throw.
+}, 'Streams can be built even if Promise constructor is replaced');
+</script>
Modified: trunk/Source/WebCore/ChangeLog (192020 => 192021)
--- trunk/Source/WebCore/ChangeLog 2015-11-04 10:40:17 UTC (rev 192020)
+++ trunk/Source/WebCore/ChangeLog 2015-11-04 11:15:51 UTC (rev 192021)
@@ -1,3 +1,39 @@
+2015-11-04 Xabier Rodriguez Calvar <calva...@igalia.com>
+
+ [Streams API] Shield streams against user replacing the Promise constructor
+ https://bugs.webkit.org/show_bug.cgi?id=150887
+
+ Reviewed by Youenn Fablet.
+
+ With this rework, we shield the Streams implementation against the user doing something like "Promise =
+ function() { /* do garbage */ };".
+
+ Test: streams/streams-promises.html.
+
+ * Modules/streams/ReadableStream.js:
+ (initializeReadableStream):
+ (cancel):
+ * Modules/streams/ReadableStreamInternals.js:
+ (privateInitializeReadableStreamReader):
+ (cancelReadableStream):
+ (readFromReadableStreamReader):
+ * Modules/streams/ReadableStreamReader.js:
+ (cancel):
+ (read):
+ (closed):
+ * Modules/streams/StreamInternals.js:
+ (promiseInvokeOrNoop):
+ (promiseInvokeOrFallbackOrNoop):
+ * Modules/streams/WritableStream.js:
+ (initializeWritableStream):
+ (abort):
+ (close):
+ (write):
+ (closed):
+ (ready):
+ * Modules/streams/WritableStreamInternals.js:
+ (syncWritableStreamStateWithQueue):
+
2015-11-04 Antoine Quint <grao...@apple.com>
SVG: hit testing region for <text> elements is incorrect
Modified: trunk/Source/WebCore/Modules/streams/ReadableStream.js (192020 => 192021)
--- trunk/Source/WebCore/Modules/streams/ReadableStream.js 2015-11-04 10:40:17 UTC (rev 192020)
+++ trunk/Source/WebCore/Modules/streams/ReadableStream.js 2015-11-04 11:15:51 UTC (rev 192021)
@@ -56,7 +56,7 @@
var result = @invokeOrNoop(underlyingSource, "start", [this.@controller]);
var _this = this;
- Promise.resolve(result).then(function() {
+ @Promise.resolve(result).then(function() {
_this.@started = true;
@requestReadableStreamPull(_this);
}, function(error) {
@@ -72,10 +72,10 @@
"use strict";
if (!@isReadableStream(this))
- return Promise.reject(new @TypeError("Function should be called on a ReadableStream"));
+ return @Promise.reject(new @TypeError("Function should be called on a ReadableStream"));
if (@isReadableStreamLocked(this))
- return Promise.reject(new @TypeError("ReadableStream is locked"));
+ return @Promise.reject(new @TypeError("ReadableStream is locked"));
return @cancelReadableStream(this, reason);
}
Modified: trunk/Source/WebCore/Modules/streams/ReadableStreamInternals.js (192020 => 192021)
--- trunk/Source/WebCore/Modules/streams/ReadableStreamInternals.js 2015-11-04 10:40:17 UTC (rev 192020)
+++ trunk/Source/WebCore/Modules/streams/ReadableStreamInternals.js 2015-11-04 11:15:51 UTC (rev 192021)
@@ -42,19 +42,19 @@
this.@ownerReadableStream = stream;
this.@storedError = undefined;
stream.@reader = this;
- this.@closedPromiseCapability = @newPromiseCapability(Promise);
+ this.@closedPromiseCapability = @newPromiseCapability(@Promise);
return this;
}
if (stream.@state === @streamClosed) {
this.@ownerReadableStream = null;
this.@storedError = undefined;
- this.@closedPromiseCapability = { @promise: Promise.resolve(undefined) };
+ this.@closedPromiseCapability = { @promise: @Promise.resolve(undefined) };
return this;
}
// FIXME: ASSERT(stream.@state === @streamErrored);
this.@ownerReadableStream = null;
this.@storedError = stream.@storedError;
- this.@closedPromiseCapability = { @promise: Promise.reject(stream.@storedError) };
+ this.@closedPromiseCapability = { @promise: @Promise.reject(stream.@storedError) };
return this;
}
@@ -275,9 +275,9 @@
"use strict";
if (stream.@state === @streamClosed)
- return Promise.resolve();
+ return @Promise.resolve();
if (stream.@state === @streamErrored)
- return Promise.reject(stream.@storedError);
+ return @Promise.reject(stream.@storedError);
stream.@queue = @newQueue();
@finishClosingReadableStream(stream);
return @promiseInvokeOrNoop(stream.@underlyingSource, "cancel", [reason]).then(function() { });
@@ -354,9 +354,9 @@
"use strict";
if (reader.@state === @streamClosed)
- return Promise.resolve({value: undefined, done: true});
+ return @Promise.resolve({value: undefined, done: true});
if (reader.@state === @streamErrored)
- return Promise.reject(reader.@storedError);
+ return @Promise.reject(reader.@storedError);
// FIXME: ASSERT(!!reader.@ownerReadableStream);
// FIXME: ASSERT(reader.@ownerReadableStream.@state === @streamReadable);
var stream = reader.@ownerReadableStream;
@@ -366,9 +366,9 @@
@requestReadableStreamPull(stream);
else if (!stream.@queue.content.length)
@finishClosingReadableStream(stream);
- return Promise.resolve({value: chunk, done: false});
+ return @Promise.resolve({value: chunk, done: false});
}
- var readPromiseCapability = @newPromiseCapability(Promise);
+ var readPromiseCapability = @newPromiseCapability(@Promise);
read...@readrequests.push(readPromiseCapability);
@requestReadableStreamPull(stream);
return readPromiseCapability.@promise;
Modified: trunk/Source/WebCore/Modules/streams/ReadableStreamReader.js (192020 => 192021)
--- trunk/Source/WebCore/Modules/streams/ReadableStreamReader.js 2015-11-04 10:40:17 UTC (rev 192020)
+++ trunk/Source/WebCore/Modules/streams/ReadableStreamReader.js 2015-11-04 11:15:51 UTC (rev 192021)
@@ -30,13 +30,13 @@
"use strict";
if (!@isReadableStreamReader(this))
- return Promise.reject(new @TypeError("Function should be called on a ReadableStreamReader"));
+ return @Promise.reject(new @TypeError("Function should be called on a ReadableStreamReader"));
if (this.@state === @streamClosed)
- return Promise.resolve();
+ return @Promise.resolve();
if (this.@state === @streamErrored)
- return Promise.reject(this.@storedError);
+ return @Promise.reject(this.@storedError);
// FIXME: ASSERT(@isReadableStream(this.@ownerReadableStream));
// FIXME: ASSERT(this.@ownerReadableStream.@state === @streamReadable);
@@ -48,7 +48,7 @@
"use strict";
if (!@isReadableStreamReader(this))
- return Promise.reject(new @TypeError("Function should be called on a ReadableStreamReader"));
+ return @Promise.reject(new @TypeError("Function should be called on a ReadableStreamReader"));
return @readFromReadableStreamReader(this);
}
@@ -74,7 +74,7 @@
"use strict";
if (!@isReadableStreamReader(this))
- return Promise.reject(new @TypeError("Callee of closed is not a ReadableStreamReader"));
+ return @Promise.reject(new @TypeError("Callee of closed is not a ReadableStreamReader"));
return this.@closedPromiseCapability.@promise;
}
Modified: trunk/Source/WebCore/Modules/streams/StreamInternals.js (192020 => 192021)
--- trunk/Source/WebCore/Modules/streams/StreamInternals.js 2015-11-04 10:40:17 UTC (rev 192020)
+++ trunk/Source/WebCore/Modules/streams/StreamInternals.js 2015-11-04 11:15:51 UTC (rev 192021)
@@ -44,12 +44,12 @@
try {
var method = object[key];
if (typeof method === "undefined")
- return Promise.resolve();
+ return @Promise.resolve();
var result = method.@apply(object, args);
- return Promise.resolve(result);
+ return @Promise.resolve(result);
}
catch(error) {
- return Promise.reject(error);
+ return @Promise.reject(error);
}
}
@@ -63,10 +63,10 @@
if (typeof method === "undefined")
return @promiseInvokeOrNoop(object, key2, args2);
const result = method.@apply(object, args1);
- return Promise.resolve(result);
+ return @Promise.resolve(result);
}
catch(error) {
- return Promise.reject(error);
+ return @Promise.reject(error);
}
}
Modified: trunk/Source/WebCore/Modules/streams/WritableStream.js (192020 => 192021)
--- trunk/Source/WebCore/Modules/streams/WritableStream.js 2015-11-04 10:40:17 UTC (rev 192020)
+++ trunk/Source/WebCore/Modules/streams/WritableStream.js 2015-11-04 11:15:51 UTC (rev 192021)
@@ -42,8 +42,8 @@
throw new @TypeError("WritableStream constructor takes an object as second argument, if any");
this.@underlyingSink = underlyingSink;
- this.@closedPromiseCapability = @newPromiseCapability(Promise);
- this.@readyPromiseCapability = { @promise: Promise.resolve(undefined) };
+ this.@closedPromiseCapability = @newPromiseCapability(@Promise);
+ this.@readyPromiseCapability = { @promise: @Promise.resolve(undefined) };
this.@queue = @newQueue();
this.@state = @streamWritable;
this.@started = false;
@@ -55,7 +55,7 @@
var error = @errorWritableStream.bind(this);
var startResult = @invokeOrNoop(underlyingSink, "start", [error]);
- this.@startedPromise = Promise.resolve(startResult);
+ this.@startedPromise = @Promise.resolve(startResult);
var _this = this;
th...@startedpromise.then(function() {
_this.@started = true;
@@ -70,13 +70,13 @@
"use strict";
if (!@isWritableStream(this))
- return Promise.reject(new @TypeError("The WritableStream.abort method can only be used on instances of WritableStream"));
+ return @Promise.reject(new @TypeError("The WritableStream.abort method can only be used on instances of WritableStream"));
if (this.@state === @streamClosed)
- return Promise.resolve(undefined);
+ return @Promise.resolve(undefined);
if (this.@state === @streamErrored)
- return Promise.reject(this.@storedError);
+ return @Promise.reject(this.@storedError);
@errorWritableStream.@apply(this, [reason]);
@@ -90,13 +90,13 @@
"use strict";
if (!@isWritableStream(this))
- return Promise.reject(new @TypeError("The WritableStream.close method can only be used on instances of WritableStream"));
+ return @Promise.reject(new @TypeError("The WritableStream.close method can only be used on instances of WritableStream"));
if (this.@state === @streamClosed || this.@state === @streamClosing)
- return Promise.reject(new @TypeError("Cannot close a WritableString that is closed or closing"));
+ return @Promise.reject(new @TypeError("Cannot close a WritableString that is closed or closing"));
if (this.@state === @streamErrored)
- return Promise.reject(this.@storedError);
+ return @Promise.reject(this.@storedError);
if (this.@state === @streamWaiting)
this.@readyPromiseCapability.@resolve.@call(undefined, undefined);
@@ -113,13 +113,13 @@
"use strict";
if (!@isWritableStream(this))
- return Promise.reject(new @TypeError("The WritableStream.close method can only be used on instances of WritableStream"));
+ return @Promise.reject(new @TypeError("The WritableStream.close method can only be used on instances of WritableStream"));
if (this.@state === @streamClosed || this.@state === @streamClosing)
- return Promise.reject(new @TypeError("Cannot write on a WritableString that is closed or closing"));
+ return @Promise.reject(new @TypeError("Cannot write on a WritableString that is closed or closing"));
if (this.@state === @streamErrored)
- return Promise.reject(this.@storedError);
+ return @Promise.reject(this.@storedError);
// FIXME
// assert(this.@state === @streamWritable || this.@state === @streamWaiting);
@@ -130,16 +130,16 @@
chunkSize = th...@strategy.size.@call(undefined, chunk);
} catch(e) {
@errorWritableStream.@call(this, e);
- return Promise.reject(e);
+ return @Promise.reject(e);
}
}
- const promiseCapability = @newPromiseCapability(Promise);
+ const promiseCapability = @newPromiseCapability(@Promise);
try {
@enqueueValueWithSize(this.@queue, { promiseCapability: promiseCapability, chunk: chunk }, chunkSize);
} catch (e) {
@errorWritableStream.@call(this, e);
- return Promise.reject(e);
+ return @Promise.reject(e);
}
@syncWritableStreamStateWithQueue(this);
@@ -153,7 +153,7 @@
"use strict";
if (!@isWritableStream(this))
- return Promise.reject(new @TypeError("The WritableStream.closed getter can only be used on instances of WritableStream"));
+ return @Promise.reject(new @TypeError("The WritableStream.closed getter can only be used on instances of WritableStream"));
return this.@closedPromiseCapability.@promise;
}
@@ -163,7 +163,7 @@
"use strict";
if (!@isWritableStream(this))
- return Promise.reject(new @TypeError("The WritableStream.ready getter can only be used on instances of WritableStream"));
+ return @Promise.reject(new @TypeError("The WritableStream.ready getter can only be used on instances of WritableStream"));
return this.@readyPromiseCapability.@promise;
}
Modified: trunk/Source/WebCore/Modules/streams/WritableStreamInternals.js (192020 => 192021)
--- trunk/Source/WebCore/Modules/streams/WritableStreamInternals.js 2015-11-04 10:40:17 UTC (rev 192020)
+++ trunk/Source/WebCore/Modules/streams/WritableStreamInternals.js 2015-11-04 11:15:51 UTC (rev 192021)
@@ -47,7 +47,7 @@
const shouldApplyBackpressure = stre...@queue.size > stream.@strategy.highWaterMark;
if (shouldApplyBackpressure && stream.@state === @streamWritable) {
stream.@state = @streamWaiting;
- stream.@readyPromiseCapability = @newPromiseCapability(Promise);
+ stream.@readyPromiseCapability = @newPromiseCapability(@Promise);
}
if (!shouldApplyBackpressure && stream.@state === @streamWaiting) {
stream.@state = @streamWritable;