aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rw-r--r--components/script/body.rs8
-rw-r--r--components/script/dom/bindings/utils.rs1
-rw-r--r--components/script/dom/bytelengthqueuingstrategy.rs3
-rw-r--r--components/script/dom/readablestream.rs23
-rw-r--r--components/script/dom/readablestreamdefaultreader.rs4
5 files changed, 26 insertions, 13 deletions
diff --git a/components/script/body.rs b/components/script/body.rs
index 1a62556332f..c55e67d8add 100644
--- a/components/script/body.rs
+++ b/components/script/body.rs
@@ -282,7 +282,7 @@ struct TransmitBodyPromiseHandler {
impl Callback for TransmitBodyPromiseHandler {
/// Step 5 of <https://fetch.spec.whatwg.org/#concept-request-transmit-body>
fn callback(&self, cx: JSContext, v: HandleValue, _realm: InRealm, can_gc: CanGc) {
- let is_done = match get_read_promise_done(cx, &v) {
+ let is_done = match get_read_promise_done(cx, &v, can_gc) {
Ok(is_done) => is_done,
Err(_) => {
// Step 5.5, the "otherwise" steps.
@@ -299,7 +299,7 @@ impl Callback for TransmitBodyPromiseHandler {
return self.stream.stop_reading(can_gc);
}
- let chunk = match get_read_promise_bytes(cx, &v) {
+ let chunk = match get_read_promise_bytes(cx, &v, can_gc) {
Ok(chunk) => chunk,
Err(_) => {
// Step 5.5, the "otherwise" steps.
@@ -660,7 +660,7 @@ impl Callback for ConsumeBodyPromiseHandler {
.as_ref()
.expect("ConsumeBodyPromiseHandler has no stream in callback.");
- let is_done = match get_read_promise_done(cx, &v) {
+ let is_done = match get_read_promise_done(cx, &v, can_gc) {
Ok(is_done) => is_done,
Err(err) => {
stream.stop_reading(can_gc);
@@ -673,7 +673,7 @@ impl Callback for ConsumeBodyPromiseHandler {
// When read is fulfilled with an object whose done property is true.
self.resolve_result_promise(cx, can_gc);
} else {
- let chunk = match get_read_promise_bytes(cx, &v) {
+ let chunk = match get_read_promise_bytes(cx, &v, can_gc) {
Ok(chunk) => chunk,
Err(err) => {
stream.stop_reading(can_gc);
diff --git a/components/script/dom/bindings/utils.rs b/components/script/dom/bindings/utils.rs
index 9431c79d000..1fb26186d2e 100644
--- a/components/script/dom/bindings/utils.rs
+++ b/components/script/dom/bindings/utils.rs
@@ -303,6 +303,7 @@ pub(crate) fn get_dictionary_property(
object: HandleObject,
property: &str,
rval: MutableHandleValue,
+ _can_gc: CanGc,
) -> Result<bool, ()> {
fn has_property(
cx: *mut JSContext,
diff --git a/components/script/dom/bytelengthqueuingstrategy.rs b/components/script/dom/bytelengthqueuingstrategy.rs
index 3be16eb1599..adbe6667fd9 100644
--- a/components/script/dom/bytelengthqueuingstrategy.rs
+++ b/components/script/dom/bytelengthqueuingstrategy.rs
@@ -78,7 +78,7 @@ impl ByteLengthQueuingStrategyMethods<crate::DomTypeHolder> for ByteLengthQueuin
let fun = native_fn!(byte_length_queuing_strategy_size, c"size", 1, 0);
// Step 3. Set globalObject’s byte length queuing strategy size function to
// a Function that represents a reference to F,
- // with callback context equal to globalObject’s relevant settings object.
+ // with callback context equal to globalObject's relevant settings object.
global.set_byte_length_queuing_strategy_size(fun.clone());
Ok(fun)
}
@@ -109,6 +109,7 @@ pub(crate) unsafe fn byte_length_queuing_strategy_size(
object.handle(),
"byteLength",
MutableHandleValue::from_raw(args.rval()),
+ CanGc::note(),
)
.unwrap_or(false)
}
diff --git a/components/script/dom/readablestream.rs b/components/script/dom/readablestream.rs
index 6f2fe166820..f8b23072e66 100644
--- a/components/script/dom/readablestream.rs
+++ b/components/script/dom/readablestream.rs
@@ -197,8 +197,14 @@ impl Callback for PipeTo {
} else {
rooted!(in(*cx) let object = result.to_object());
rooted!(in(*cx) let mut done = UndefinedValue());
- get_dictionary_property(*cx, object.handle(), "done", done.handle_mut())
- .unwrap()
+ get_dictionary_property(
+ *cx,
+ object.handle(),
+ "done",
+ done.handle_mut(),
+ can_gc,
+ )
+ .unwrap()
}
};
// If any chunks have been read but not yet written, write them to dest.
@@ -347,7 +353,7 @@ impl PipeTo {
rooted!(in(*cx) let object = chunk.to_object());
rooted!(in(*cx) let mut bytes = UndefinedValue());
let has_value =
- get_dictionary_property(*cx, object.handle(), "value", bytes.handle_mut())
+ get_dictionary_property(*cx, object.handle(), "value", bytes.handle_mut(), can_gc)
.expect("Chunk should have a value.");
if !bytes.is_undefined() && has_value {
// Write the chunk.
@@ -1932,14 +1938,18 @@ impl ReadableStreamMethods<crate::DomTypeHolder> for ReadableStream {
#[allow(unsafe_code)]
/// Get the `done` property of an object that a read promise resolved to.
-pub(crate) fn get_read_promise_done(cx: SafeJSContext, v: &SafeHandleValue) -> Result<bool, Error> {
+pub(crate) fn get_read_promise_done(
+ cx: SafeJSContext,
+ v: &SafeHandleValue,
+ can_gc: CanGc,
+) -> Result<bool, Error> {
if !v.is_object() {
return Err(Error::Type("Unknown format for done property.".to_string()));
}
unsafe {
rooted!(in(*cx) let object = v.to_object());
rooted!(in(*cx) let mut done = UndefinedValue());
- match get_dictionary_property(*cx, object.handle(), "done", done.handle_mut()) {
+ match get_dictionary_property(*cx, object.handle(), "done", done.handle_mut(), can_gc) {
Ok(true) => match bool::from_jsval(*cx, done.handle(), ()) {
Ok(ConversionResult::Success(val)) => Ok(val),
Ok(ConversionResult::Failure(error)) => Err(Error::Type(error.to_string())),
@@ -1956,6 +1966,7 @@ pub(crate) fn get_read_promise_done(cx: SafeJSContext, v: &SafeHandleValue) -> R
pub(crate) fn get_read_promise_bytes(
cx: SafeJSContext,
v: &SafeHandleValue,
+ can_gc: CanGc,
) -> Result<Vec<u8>, Error> {
if !v.is_object() {
return Err(Error::Type(
@@ -1965,7 +1976,7 @@ pub(crate) fn get_read_promise_bytes(
unsafe {
rooted!(in(*cx) let object = v.to_object());
rooted!(in(*cx) let mut bytes = UndefinedValue());
- match get_dictionary_property(*cx, object.handle(), "value", bytes.handle_mut()) {
+ match get_dictionary_property(*cx, object.handle(), "value", bytes.handle_mut(), can_gc) {
Ok(true) => {
match Vec::<u8>::from_jsval(*cx, bytes.handle(), ConversionBehavior::EnforceRange) {
Ok(ConversionResult::Success(val)) => Ok(val),
diff --git a/components/script/dom/readablestreamdefaultreader.rs b/components/script/dom/readablestreamdefaultreader.rs
index 32eb9cfe621..65a63626287 100644
--- a/components/script/dom/readablestreamdefaultreader.rs
+++ b/components/script/dom/readablestreamdefaultreader.rs
@@ -60,7 +60,7 @@ impl Callback for ReadLoopFulFillmentHandler {
#[cfg_attr(crown, allow(crown::unrooted_must_root))]
fn callback(&self, cx: SafeJSContext, v: SafeHandleValue, realm: InRealm, can_gc: CanGc) {
let global = self.reader.global();
- let is_done = match get_read_promise_done(cx, &v) {
+ let is_done = match get_read_promise_done(cx, &v, can_gc) {
Ok(is_done) => is_done,
Err(err) => {
self.reader
@@ -82,7 +82,7 @@ impl Callback for ReadLoopFulFillmentHandler {
.expect("Releasing the reader should succeed");
} else {
// <https://streams.spec.whatwg.org/#ref-for-read-request-chunk-steps%E2%91%A6>
- let chunk = match get_read_promise_bytes(cx, &v) {
+ let chunk = match get_read_promise_bytes(cx, &v, can_gc) {
Ok(chunk) => chunk,
Err(err) => {
// If chunk is not a Uint8Array object, call failureSteps with a TypeError and abort these steps.