aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorchickenleaf <lashwinib@gmail.com>2024-10-22 03:02:22 +0530
committerGitHub <noreply@github.com>2024-10-21 21:32:22 +0000
commitebfea9b352ef0ec00ad5213055392668e841a0e9 (patch)
tree43baab7b7e7a4bd6f1a8111bfb8fe598aeb2cf87 /components/script/dom
parent1bf68567b8608d87e1817066f1dacb27edc5602a (diff)
downloadservo-ebfea9b352ef0ec00ad5213055392668e841a0e9.tar.gz
servo-ebfea9b352ef0ec00ad5213055392668e841a0e9.zip
CanGc fixes in several files (#33958)
* few cangc fixes Signed-off-by: L Ashwin B <lashwinib@gmail.com> * few cangc fixes Signed-off-by: L Ashwin B <lashwinib@gmail.com> --------- Signed-off-by: L Ashwin B <lashwinib@gmail.com>
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/bindings/codegen/Bindings.conf12
-rw-r--r--components/script/dom/file.rs10
-rw-r--r--components/script/dom/filereader.rs27
-rw-r--r--components/script/dom/formdata.rs16
-rw-r--r--components/script/dom/gamepad.rs8
-rw-r--r--components/script/dom/globalscope.rs6
-rw-r--r--components/script/dom/htmlformelement.rs4
-rw-r--r--components/script/dom/htmlinputelement.rs12
-rw-r--r--components/script/dom/htmlmediaelement.rs2
-rw-r--r--components/script/dom/navigator.rs6
-rw-r--r--components/script/dom/progressevent.rs4
-rw-r--r--components/script/dom/response.rs51
-rw-r--r--components/script/dom/securitypolicyviolationevent.rs11
-rw-r--r--components/script/dom/servoparser/html.rs12
-rw-r--r--components/script/dom/texttracklist.rs2
-rw-r--r--components/script/dom/trackevent.rs11
-rw-r--r--components/script/dom/xmlhttprequest.rs49
-rw-r--r--components/script/dom/xrinputsourcearray.rs4
18 files changed, 140 insertions, 107 deletions
diff --git a/components/script/dom/bindings/codegen/Bindings.conf b/components/script/dom/bindings/codegen/Bindings.conf
index 896cf1f0314..7aa0d6f0d36 100644
--- a/components/script/dom/bindings/codegen/Bindings.conf
+++ b/components/script/dom/bindings/codegen/Bindings.conf
@@ -121,6 +121,10 @@ DOMInterfaces = {
'weakReferenceable': True,
},
+'FileReader': {
+ 'canGc': ['Abort'],
+},
+
'GPU': {
'inRealms': ['RequestAdapter'],
},
@@ -164,11 +168,11 @@ DOMInterfaces = {
},
'HTMLFormElement': {
- 'canGc': ['RequestSubmit', 'ReportValidity'],
+ 'canGc': ['RequestSubmit', 'ReportValidity', 'Submit'],
},
'HTMLInputElement': {
- 'canGc': ['ReportValidity'],
+ 'canGc': ['ReportValidity', 'SelectFiles'],
},
'HTMLMediaElement': {
@@ -276,7 +280,7 @@ DOMInterfaces = {
},
'Response': {
- 'canGc': ['Error', 'Redirect', 'Clone', 'Text', 'Blob', 'FormData', 'Json', 'ArrayBuffer'],
+ 'canGc': ['Error', 'Redirect', 'Clone', 'Text', 'Blob', 'FormData', 'Json', 'ArrayBuffer', 'Headers'],
},
'Request': {
@@ -342,7 +346,7 @@ DOMInterfaces = {
},
'XMLHttpRequest': {
- 'canGc': ['Abort', 'GetResponseXML', 'Response'],
+ 'canGc': ['Abort', 'GetResponseXML', 'Response', 'Send'],
},
'XRBoundedReferenceSpace': {
diff --git a/components/script/dom/file.rs b/components/script/dom/file.rs
index 587dae4d81a..21127331954 100644
--- a/components/script/dom/file.rs
+++ b/components/script/dom/file.rs
@@ -46,8 +46,9 @@ impl File {
blob_impl: BlobImpl,
name: DOMString,
modified: Option<SystemTime>,
+ can_gc: CanGc,
) -> DomRoot<File> {
- Self::new_with_proto(global, None, blob_impl, name, modified, CanGc::note())
+ Self::new_with_proto(global, None, blob_impl, name, modified, can_gc)
}
#[allow(crown::unrooted_must_root)]
@@ -70,7 +71,11 @@ impl File {
}
// Construct from selected file message from file manager thread
- pub fn new_from_selected(window: &Window, selected: SelectedFile) -> DomRoot<File> {
+ pub fn new_from_selected(
+ window: &Window,
+ selected: SelectedFile,
+ can_gc: CanGc,
+ ) -> DomRoot<File> {
let name = DOMString::from(
selected
.filename
@@ -88,6 +93,7 @@ impl File {
),
name,
Some(selected.modified),
+ can_gc,
)
}
diff --git a/components/script/dom/filereader.rs b/components/script/dom/filereader.rs
index 32a7fd8890c..ec3d33a6ed0 100644
--- a/components/script/dom/filereader.rs
+++ b/components/script/dom/filereader.rs
@@ -166,6 +166,7 @@ impl FileReader {
filereader: TrustedFileReader,
gen_id: GenerationId,
error: DOMErrorName,
+ can_gc: CanGc,
) {
let fr = filereader.root();
@@ -185,17 +186,17 @@ impl FileReader {
let exception = DOMException::new(&fr.global(), error);
fr.error.set(Some(&exception));
- fr.dispatch_progress_event(atom!("error"), 0, None);
+ fr.dispatch_progress_event(atom!("error"), 0, None, can_gc);
return_on_abort!();
// Step 3
- fr.dispatch_progress_event(atom!("loadend"), 0, None);
+ fr.dispatch_progress_event(atom!("loadend"), 0, None, can_gc);
return_on_abort!();
// Step 4
fr.terminate_ongoing_reading();
}
// https://w3c.github.io/FileAPI/#dfn-readAsText
- pub fn process_read_data(filereader: TrustedFileReader, gen_id: GenerationId) {
+ pub fn process_read_data(filereader: TrustedFileReader, gen_id: GenerationId, can_gc: CanGc) {
let fr = filereader.root();
macro_rules! return_on_abort(
@@ -207,11 +208,11 @@ impl FileReader {
);
return_on_abort!();
//FIXME Step 7 send current progress
- fr.dispatch_progress_event(atom!("progress"), 0, None);
+ fr.dispatch_progress_event(atom!("progress"), 0, None, can_gc);
}
// https://w3c.github.io/FileAPI/#dfn-readAsText
- pub fn process_read(filereader: TrustedFileReader, gen_id: GenerationId) {
+ pub fn process_read(filereader: TrustedFileReader, gen_id: GenerationId, can_gc: CanGc) {
let fr = filereader.root();
macro_rules! return_on_abort(
@@ -223,7 +224,7 @@ impl FileReader {
);
return_on_abort!();
// Step 6
- fr.dispatch_progress_event(atom!("loadstart"), 0, None);
+ fr.dispatch_progress_event(atom!("loadstart"), 0, None, can_gc);
}
// https://w3c.github.io/FileAPI/#dfn-readAsText
@@ -232,6 +233,7 @@ impl FileReader {
gen_id: GenerationId,
data: ReadMetaData,
blob_contents: Vec<u8>,
+ can_gc: CanGc,
) {
let fr = filereader.root();
@@ -267,11 +269,11 @@ impl FileReader {
};
// Step 8.3
- fr.dispatch_progress_event(atom!("load"), 0, None);
+ fr.dispatch_progress_event(atom!("load"), 0, None, can_gc);
return_on_abort!();
// Step 8.4
if fr.ready_state.get() != FileReaderReadyState::Loading {
- fr.dispatch_progress_event(atom!("loadend"), 0, None);
+ fr.dispatch_progress_event(atom!("loadend"), 0, None, can_gc);
}
return_on_abort!();
}
@@ -368,7 +370,7 @@ impl FileReaderMethods for FileReader {
}
// https://w3c.github.io/FileAPI/#dfn-abort
- fn Abort(&self) {
+ fn Abort(&self, can_gc: CanGc) {
// Step 2
if self.ready_state.get() == FileReaderReadyState::Loading {
self.change_ready_state(FileReaderReadyState::Done);
@@ -381,8 +383,8 @@ impl FileReaderMethods for FileReader {
self.terminate_ongoing_reading();
// Steps 5 & 6
- self.dispatch_progress_event(atom!("abort"), 0, None);
- self.dispatch_progress_event(atom!("loadend"), 0, None);
+ self.dispatch_progress_event(atom!("abort"), 0, None, can_gc);
+ self.dispatch_progress_event(atom!("loadend"), 0, None, can_gc);
}
// https://w3c.github.io/FileAPI/#dfn-error
@@ -412,7 +414,7 @@ impl FileReaderMethods for FileReader {
}
impl FileReader {
- fn dispatch_progress_event(&self, type_: Atom, loaded: u64, total: Option<u64>) {
+ fn dispatch_progress_event(&self, type_: Atom, loaded: u64, total: Option<u64>, can_gc: CanGc) {
let progressevent = ProgressEvent::new(
&self.global(),
type_,
@@ -421,6 +423,7 @@ impl FileReader {
total.is_some(),
loaded,
total.unwrap_or(0),
+ can_gc,
);
progressevent.upcast::<Event>().fire(self.upcast());
}
diff --git a/components/script/dom/formdata.rs b/components/script/dom/formdata.rs
index 24a83910bd5..b1d4f6af947 100644
--- a/components/script/dom/formdata.rs
+++ b/components/script/dom/formdata.rs
@@ -110,7 +110,11 @@ impl FormDataMethods for FormData {
let datum = FormDatum {
ty: DOMString::from("file"),
name: DOMString::from(name.0.clone()),
- value: FormDatumValue::File(DomRoot::from_ref(&*self.create_an_entry(blob, filename))),
+ value: FormDatumValue::File(DomRoot::from_ref(&*self.create_an_entry(
+ blob,
+ filename,
+ CanGc::note(),
+ ))),
};
self.data
@@ -187,7 +191,7 @@ impl FormDataMethods for FormData {
#[allow(crown::unrooted_must_root)]
// https://xhr.spec.whatwg.org/#dom-formdata-set
fn Set_(&self, name: USVString, blob: &Blob, filename: Option<USVString>) {
- let file = self.create_an_entry(blob, filename);
+ let file = self.create_an_entry(blob, filename, CanGc::note());
let mut data = self.data.borrow_mut();
let local_name = LocalName::from(name.0.clone());
@@ -207,7 +211,12 @@ impl FormDataMethods for FormData {
impl FormData {
// https://xhr.spec.whatwg.org/#create-an-entry
- fn create_an_entry(&self, blob: &Blob, opt_filename: Option<USVString>) -> DomRoot<File> {
+ fn create_an_entry(
+ &self,
+ blob: &Blob,
+ opt_filename: Option<USVString>,
+ can_gc: CanGc,
+ ) -> DomRoot<File> {
// Steps 3-4
let name = match opt_filename {
Some(filename) => DOMString::from(filename.0),
@@ -229,6 +238,7 @@ impl FormData {
BlobImpl::new_from_bytes(bytes, blob.type_string()),
name,
None,
+ can_gc,
)
}
diff --git a/components/script/dom/gamepad.rs b/components/script/dom/gamepad.rs
index 106b37a908e..a4df6ebb1c3 100644
--- a/components/script/dom/gamepad.rs
+++ b/components/script/dom/gamepad.rs
@@ -216,7 +216,7 @@ impl Gamepad {
self.gamepad_id
}
- pub fn update_connected(&self, connected: bool, has_gesture: bool) {
+ pub fn update_connected(&self, connected: bool, has_gesture: bool, can_gc: CanGc) {
if self.connected.get() == connected {
return;
}
@@ -229,7 +229,7 @@ impl Gamepad {
};
if has_gesture {
- self.notify_event(event_type);
+ self.notify_event(event_type, can_gc);
}
}
@@ -245,8 +245,8 @@ impl Gamepad {
self.timestamp.set(timestamp);
}
- pub fn notify_event(&self, event_type: GamepadEventType) {
- let event = GamepadEvent::new_with_type(&self.global(), event_type, self, CanGc::note());
+ pub fn notify_event(&self, event_type: GamepadEventType, can_gc: CanGc) {
+ let event = GamepadEvent::new_with_type(&self.global(), event_type, self, can_gc);
event
.upcast::<Event>()
.fire(self.global().as_window().upcast::<EventTarget>());
diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs
index 74dca15fedd..2458db4af8a 100644
--- a/components/script/dom/globalscope.rs
+++ b/components/script/dom/globalscope.rs
@@ -3239,7 +3239,7 @@ impl GlobalScope {
false,
CanGc::note(),
);
- navigator.set_gamepad(selected_index as usize, &gamepad);
+ navigator.set_gamepad(selected_index as usize, &gamepad, CanGc::note());
}
}),
&self.task_canceller(TaskSourceName::Gamepad),
@@ -3258,7 +3258,7 @@ impl GlobalScope {
let navigator = window.Navigator();
if let Some(gamepad) = navigator.get_gamepad(index) {
if window.Document().is_fully_active() {
- gamepad.update_connected(false, gamepad.exposed());
+ gamepad.update_connected(false, gamepad.exposed(), CanGc::note());
navigator.remove_gamepad(index);
}
}
@@ -3304,7 +3304,7 @@ impl GlobalScope {
window.task_manager().gamepad_task_source().queue_with_canceller(
task!(update_gamepad_connect: move || {
let gamepad = new_gamepad.root();
- gamepad.notify_event(GamepadEventType::Connected);
+ gamepad.notify_event(GamepadEventType::Connected, CanGc::note());
}),
&window.upcast::<GlobalScope>()
.task_canceller(TaskSourceName::Gamepad),
diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs
index 18184fdfebd..db36c340f8d 100644
--- a/components/script/dom/htmlformelement.rs
+++ b/components/script/dom/htmlformelement.rs
@@ -269,11 +269,11 @@ impl HTMLFormElementMethods for HTMLFormElement {
make_getter!(Rel, "rel");
// https://html.spec.whatwg.org/multipage/#the-form-element:concept-form-submit
- fn Submit(&self) {
+ fn Submit(&self, can_gc: CanGc) {
self.submit(
SubmittedFrom::FromForm,
FormSubmitterElement::Form(self),
- CanGc::note(),
+ can_gc,
);
}
diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs
index c1bf932350f..95c4c483edd 100644
--- a/components/script/dom/htmlinputelement.rs
+++ b/components/script/dom/htmlinputelement.rs
@@ -1559,9 +1559,9 @@ impl HTMLInputElementMethods for HTMLInputElement {
// enabled by dom.htmlinputelement.select_files.enabled,
// used for test purpose.
// check-tidy: no specs after this line
- fn SelectFiles(&self, paths: Vec<DOMString>) {
+ fn SelectFiles(&self, paths: Vec<DOMString>, can_gc: CanGc) {
if self.input_type() == InputType::File {
- self.select_files(Some(paths));
+ self.select_files(Some(paths), can_gc);
}
}
@@ -1826,7 +1826,7 @@ impl HTMLInputElement {
// https://html.spec.whatwg.org/multipage/#file-upload-state-(type=file)
// Select files by invoking UI or by passed in argument
- fn select_files(&self, opt_test_paths: Option<Vec<DOMString>>) {
+ fn select_files(&self, opt_test_paths: Option<Vec<DOMString>>, can_gc: CanGc) {
let window = window_from_node(self);
let origin = get_blob_origin(&window.get_url());
let resource_threads = window.upcast::<GlobalScope>().resource_threads();
@@ -1851,7 +1851,7 @@ impl HTMLInputElement {
match recv.recv().expect("IpcSender side error") {
Ok(selected_files) => {
for selected in selected_files {
- files.push(File::new_from_selected(&window, selected));
+ files.push(File::new_from_selected(&window, selected, can_gc));
}
},
Err(err) => error = Some(err),
@@ -1877,7 +1877,7 @@ impl HTMLInputElement {
match recv.recv().expect("IpcSender side error") {
Ok(selected) => {
- files.push(File::new_from_selected(&window, selected));
+ files.push(File::new_from_selected(&window, selected, can_gc));
},
Err(err) => error = Some(err),
};
@@ -2839,7 +2839,7 @@ impl Activatable for HTMLInputElement {
target.fire_bubbling_event(atom!("input"));
target.fire_bubbling_event(atom!("change"));
},
- InputType::File => self.select_files(None),
+ InputType::File => self.select_files(None, CanGc::note()),
_ => (),
}
}
diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs
index 7d162e6c848..9f7f635d252 100644
--- a/components/script/dom/htmlmediaelement.rs
+++ b/components/script/dom/htmlmediaelement.rs
@@ -1632,6 +1632,7 @@ impl HTMLMediaElement {
false,
false,
&Some(VideoTrackOrAudioTrackOrTextTrack::AudioTrack(audio_track)),
+ can_gc,
);
event.upcast::<Event>().fire(self.upcast::<EventTarget>());
@@ -1686,6 +1687,7 @@ impl HTMLMediaElement {
false,
false,
&Some(VideoTrackOrAudioTrackOrTextTrack::VideoTrack(video_track)),
+ can_gc,
);
event.upcast::<Event>().fire(self.upcast::<EventTarget>());
diff --git a/components/script/dom/navigator.rs b/components/script/dom/navigator.rs
index 850a4d2e0b6..9ef543bfb68 100644
--- a/components/script/dom/navigator.rs
+++ b/components/script/dom/navigator.rs
@@ -29,7 +29,7 @@ use crate::dom::pluginarray::PluginArray;
use crate::dom::serviceworkercontainer::ServiceWorkerContainer;
use crate::dom::window::Window;
use crate::dom::xrsystem::XRSystem;
-use crate::script_runtime::JSContext;
+use crate::script_runtime::{CanGc, JSContext};
pub(super) fn hardware_concurrency() -> u64 {
static CPUS: LazyLock<u64> = LazyLock::new(|| num_cpus::get().try_into().unwrap_or(1));
@@ -85,14 +85,14 @@ impl Navigator {
self.gamepads.borrow().get(index).and_then(|g| g.get())
}
- pub fn set_gamepad(&self, index: usize, gamepad: &Gamepad) {
+ pub fn set_gamepad(&self, index: usize, gamepad: &Gamepad, can_gc: CanGc) {
if let Some(gamepad_to_set) = self.gamepads.borrow().get(index) {
gamepad_to_set.set(Some(gamepad));
}
if self.has_gamepad_gesture.get() {
gamepad.set_exposed(true);
if self.global().as_window().Document().is_fully_active() {
- gamepad.notify_event(GamepadEventType::Connected);
+ gamepad.notify_event(GamepadEventType::Connected, can_gc);
}
}
}
diff --git a/components/script/dom/progressevent.rs b/components/script/dom/progressevent.rs
index 5d2013397eb..bbe0db66cff 100644
--- a/components/script/dom/progressevent.rs
+++ b/components/script/dom/progressevent.rs
@@ -36,6 +36,7 @@ impl ProgressEvent {
}
}
+ #[allow(clippy::too_many_arguments)]
pub fn new(
global: &GlobalScope,
type_: Atom,
@@ -44,6 +45,7 @@ impl ProgressEvent {
length_computable: bool,
loaded: u64,
total: u64,
+ can_gc: CanGc,
) -> DomRoot<ProgressEvent> {
Self::new_with_proto(
global,
@@ -54,7 +56,7 @@ impl ProgressEvent {
length_computable,
loaded,
total,
- CanGc::note(),
+ can_gc,
)
}
diff --git a/components/script/dom/response.rs b/components/script/dom/response.rs
index 7d8c324951c..92a04fe796c 100644
--- a/components/script/dom/response.rs
+++ b/components/script/dom/response.rs
@@ -113,8 +113,8 @@ impl BodyMixin for Response {
self.body_stream.get()
}
- fn get_mime_type(&self, _can_gc: CanGc) -> Vec<u8> {
- let headers = self.Headers();
+ fn get_mime_type(&self, can_gc: CanGc) -> Vec<u8> {
+ let headers = self.Headers(can_gc);
headers.extract_mime_type()
}
}
@@ -172,7 +172,7 @@ impl ResponseMethods for Response {
// Step 5
if let Some(ref headers_member) = init.headers {
- r.Headers().fill(Some(headers_member.clone()))?;
+ r.Headers(can_gc).fill(Some(headers_member.clone()))?;
}
// Step 6
@@ -197,11 +197,11 @@ impl ResponseMethods for Response {
// Step 6.3
if let Some(content_type_contents) = content_type {
if !r
- .Headers()
+ .Headers(can_gc)
.Has(ByteString::new(b"Content-Type".to_vec()))
.unwrap()
{
- r.Headers().Append(
+ r.Headers(can_gc).Append(
ByteString::new(b"Content-Type".to_vec()),
ByteString::new(content_type_contents.as_bytes().to_vec()),
)?;
@@ -221,7 +221,7 @@ impl ResponseMethods for Response {
fn Error(global: &GlobalScope, can_gc: CanGc) -> DomRoot<Response> {
let r = Response::new(global, can_gc);
*r.response_type.borrow_mut() = DOMResponseType::Error;
- r.Headers().set_guard(Guard::Immutable);
+ r.Headers(can_gc).set_guard(Guard::Immutable);
*r.status.borrow_mut() = HttpStatus::new_error();
r
}
@@ -258,12 +258,12 @@ impl ResponseMethods for Response {
// Step 6
let url_bytestring =
ByteString::from_str(url.as_str()).unwrap_or(ByteString::new(b"".to_vec()));
- r.Headers()
+ r.Headers(can_gc)
.Set(ByteString::new(b"Location".to_vec()), url_bytestring)?;
// Step 4 continued
// Headers Guard is set to Immutable here to prevent error in Step 6
- r.Headers().set_guard(Guard::Immutable);
+ r.Headers(can_gc).set_guard(Guard::Immutable);
// Step 7
Ok(r)
@@ -305,9 +305,9 @@ impl ResponseMethods for Response {
}
// https://fetch.spec.whatwg.org/#dom-response-headers
- fn Headers(&self) -> DomRoot<Headers> {
+ fn Headers(&self, can_gc: CanGc) -> DomRoot<Headers> {
self.headers_reflector
- .or_init(|| Headers::for_response(&self.global(), CanGc::note()))
+ .or_init(|| Headers::for_response(&self.global(), can_gc))
}
// https://fetch.spec.whatwg.org/#dom-response-clone
@@ -319,8 +319,12 @@ impl ResponseMethods for Response {
// Step 2
let new_response = Response::new(&self.global(), can_gc);
- new_response.Headers().copy_from_headers(self.Headers())?;
- new_response.Headers().set_guard(self.Headers().get_guard());
+ new_response
+ .Headers(can_gc)
+ .copy_from_headers(self.Headers(can_gc))?;
+ new_response
+ .Headers(can_gc)
+ .set_guard(self.Headers(can_gc).get_guard());
// https://fetch.spec.whatwg.org/#concept-response-clone
// Instead of storing a net_traits::Response internally, we
@@ -388,16 +392,17 @@ fn serialize_without_fragment(url: &ServoUrl) -> &str {
}
impl Response {
- pub fn set_type(&self, new_response_type: DOMResponseType) {
+ pub fn set_type(&self, new_response_type: DOMResponseType, can_gc: CanGc) {
*self.response_type.borrow_mut() = new_response_type;
- self.set_response_members_by_type(new_response_type);
+ self.set_response_members_by_type(new_response_type, can_gc);
}
- pub fn set_headers(&self, option_hyper_headers: Option<Serde<HyperHeaders>>) {
- self.Headers().set_headers(match option_hyper_headers {
- Some(hyper_headers) => hyper_headers.into_inner(),
- None => HyperHeaders::new(),
- });
+ pub fn set_headers(&self, option_hyper_headers: Option<Serde<HyperHeaders>>, can_gc: CanGc) {
+ self.Headers(can_gc)
+ .set_headers(match option_hyper_headers {
+ Some(hyper_headers) => hyper_headers.into_inner(),
+ None => HyperHeaders::new(),
+ });
}
pub fn set_status(&self, status: &HttpStatus) {
@@ -412,21 +417,21 @@ impl Response {
*self.redirected.borrow_mut() = is_redirected;
}
- fn set_response_members_by_type(&self, response_type: DOMResponseType) {
+ fn set_response_members_by_type(&self, response_type: DOMResponseType, can_gc: CanGc) {
match response_type {
DOMResponseType::Error => {
*self.status.borrow_mut() = HttpStatus::new_error();
- self.set_headers(None);
+ self.set_headers(None, can_gc);
},
DOMResponseType::Opaque => {
*self.url_list.borrow_mut() = vec![];
*self.status.borrow_mut() = HttpStatus::new_error();
- self.set_headers(None);
+ self.set_headers(None, can_gc);
self.body_stream.set(None);
},
DOMResponseType::Opaqueredirect => {
*self.status.borrow_mut() = HttpStatus::new_error();
- self.set_headers(None);
+ self.set_headers(None, can_gc);
self.body_stream.set(None);
},
DOMResponseType::Default => {},
diff --git a/components/script/dom/securitypolicyviolationevent.rs b/components/script/dom/securitypolicyviolationevent.rs
index f62116c2699..f258e326955 100644
--- a/components/script/dom/securitypolicyviolationevent.rs
+++ b/components/script/dom/securitypolicyviolationevent.rs
@@ -93,16 +93,9 @@ impl SecurityPolicyViolationEvent {
bubbles: EventBubbles,
cancelable: EventCancelable,
init: &SecurityPolicyViolationEventInit,
+ can_gc: CanGc,
) -> DomRoot<Self> {
- Self::new_with_proto(
- global,
- None,
- type_,
- bubbles,
- cancelable,
- init,
- CanGc::note(),
- )
+ Self::new_with_proto(global, None, type_, bubbles, cancelable, init, can_gc)
}
}
diff --git a/components/script/dom/servoparser/html.rs b/components/script/dom/servoparser/html.rs
index 3ee280868ae..9d0b331fab2 100644
--- a/components/script/dom/servoparser/html.rs
+++ b/components/script/dom/servoparser/html.rs
@@ -158,22 +158,22 @@ struct SerializationIterator {
stack: Vec<SerializationCommand>,
}
-fn rev_children_iter(n: &Node) -> impl Iterator<Item = DomRoot<Node>> {
+fn rev_children_iter(n: &Node, can_gc: CanGc) -> impl Iterator<Item = DomRoot<Node>> {
if n.downcast::<Element>().is_some_and(|e| e.is_void()) {
return Node::new_document_node().rev_children();
}
match n.downcast::<HTMLTemplateElement>() {
- Some(t) => t.Content(CanGc::note()).upcast::<Node>().rev_children(),
+ Some(t) => t.Content(can_gc).upcast::<Node>().rev_children(),
None => n.rev_children(),
}
}
impl SerializationIterator {
- fn new(node: &Node, skip_first: bool) -> SerializationIterator {
+ fn new(node: &Node, skip_first: bool, can_gc: CanGc) -> SerializationIterator {
let mut ret = SerializationIterator { stack: vec![] };
if skip_first || node.is::<DocumentFragment>() || node.is::<Document>() {
- for c in rev_children_iter(node) {
+ for c in rev_children_iter(node, can_gc) {
ret.push_node(&c);
}
} else {
@@ -203,7 +203,7 @@ impl Iterator for SerializationIterator {
if let Some(SerializationCommand::OpenElement(ref e)) = res {
self.stack
.push(SerializationCommand::CloseElement(e.clone()));
- for c in rev_children_iter(e.upcast::<Node>()) {
+ for c in rev_children_iter(e.upcast::<Node>(), CanGc::note()) {
self.push_node(&c);
}
}
@@ -220,7 +220,7 @@ impl<'a> Serialize for &'a Node {
) -> io::Result<()> {
let node = *self;
- let iter = SerializationIterator::new(node, traversal_scope != IncludeNode);
+ let iter = SerializationIterator::new(node, traversal_scope != IncludeNode, CanGc::note());
for cmd in iter {
match cmd {
diff --git a/components/script/dom/texttracklist.rs b/components/script/dom/texttracklist.rs
index d492b07a9be..ed2d289c449 100644
--- a/components/script/dom/texttracklist.rs
+++ b/components/script/dom/texttracklist.rs
@@ -17,6 +17,7 @@ use crate::dom::eventtarget::EventTarget;
use crate::dom::texttrack::TextTrack;
use crate::dom::trackevent::TrackEvent;
use crate::dom::window::Window;
+use crate::script_runtime::CanGc;
use crate::task_source::TaskSource;
#[dom_struct]
@@ -83,6 +84,7 @@ impl TextTrackList {
&Some(VideoTrackOrAudioTrackOrTextTrack::TextTrack(
DomRoot::from_ref(&track)
)),
+ CanGc::note()
);
event.upcast::<Event>().fire(this.upcast::<EventTarget>());
diff --git a/components/script/dom/trackevent.rs b/components/script/dom/trackevent.rs
index eacb3ae3813..dfe9f2c0303 100644
--- a/components/script/dom/trackevent.rs
+++ b/components/script/dom/trackevent.rs
@@ -65,16 +65,9 @@ impl TrackEvent {
bubbles: bool,
cancelable: bool,
track: &Option<VideoTrackOrAudioTrackOrTextTrack>,
+ can_gc: CanGc,
) -> DomRoot<TrackEvent> {
- Self::new_with_proto(
- global,
- None,
- type_,
- bubbles,
- cancelable,
- track,
- CanGc::note(),
- )
+ Self::new_with_proto(global, None, type_, bubbles, cancelable, track, can_gc)
}
fn new_with_proto(
diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs
index c04e1e97fa2..b9cc481087c 100644
--- a/components/script/dom/xmlhttprequest.rs
+++ b/components/script/dom/xmlhttprequest.rs
@@ -554,7 +554,7 @@ impl XMLHttpRequestMethods for XMLHttpRequest {
}
/// <https://xhr.spec.whatwg.org/#the-send()-method>
- fn Send(&self, data: Option<DocumentOrXMLHttpRequestBodyInit>) -> ErrorResult {
+ fn Send(&self, data: Option<DocumentOrXMLHttpRequestBodyInit>, can_gc: CanGc) -> ErrorResult {
// Step 1, 2
if self.ready_state.get() != XMLHttpRequestState::Opened || self.send_flag.get() {
return Err(Error::InvalidState);
@@ -661,13 +661,13 @@ impl XMLHttpRequestMethods for XMLHttpRequest {
// abort or open we will need the current generation id to detect it.
// Substep 1
let gen_id = self.generation_id.get();
- self.dispatch_response_progress_event(atom!("loadstart"));
+ self.dispatch_response_progress_event(atom!("loadstart"), can_gc);
if self.generation_id.get() != gen_id {
return Ok(());
}
// Substep 2
if !self.upload_complete.get() && self.upload_listener.get() {
- self.dispatch_upload_progress_event(atom!("loadstart"), Ok(Some(0)));
+ self.dispatch_upload_progress_event(atom!("loadstart"), Ok(Some(0)), can_gc);
if self.generation_id.get() != gen_id {
return Ok(());
}
@@ -1114,11 +1114,11 @@ impl XMLHttpRequest {
self.upload_complete.set(true);
// Substeps 2-4
if !self.sync.get() && self.upload_listener.get() {
- self.dispatch_upload_progress_event(atom!("progress"), Ok(None));
+ self.dispatch_upload_progress_event(atom!("progress"), Ok(None), can_gc);
return_if_fetch_was_terminated!();
- self.dispatch_upload_progress_event(atom!("load"), Ok(None));
+ self.dispatch_upload_progress_event(atom!("load"), Ok(None), can_gc);
return_if_fetch_was_terminated!();
- self.dispatch_upload_progress_event(atom!("loadend"), Ok(None));
+ self.dispatch_upload_progress_event(atom!("loadend"), Ok(None), can_gc);
return_if_fetch_was_terminated!();
}
// Part of step 13, send() (processing response)
@@ -1171,7 +1171,7 @@ impl XMLHttpRequest {
);
event.fire(self.upcast());
return_if_fetch_was_terminated!();
- self.dispatch_response_progress_event(atom!("progress"));
+ self.dispatch_response_progress_event(atom!("progress"), can_gc);
}
},
XHRProgress::Done(_) => {
@@ -1193,9 +1193,9 @@ impl XMLHttpRequest {
self.change_ready_state(XMLHttpRequestState::Done, can_gc);
return_if_fetch_was_terminated!();
// Subsubsteps 11-12
- self.dispatch_response_progress_event(atom!("load"));
+ self.dispatch_response_progress_event(atom!("load"), can_gc);
return_if_fetch_was_terminated!();
- self.dispatch_response_progress_event(atom!("loadend"));
+ self.dispatch_response_progress_event(atom!("loadend"), can_gc);
},
XHRProgress::Errored(_, e) => {
self.cancel_timeout();
@@ -1217,15 +1217,15 @@ impl XMLHttpRequest {
if !upload_complete.get() {
upload_complete.set(true);
if self.upload_listener.get() {
- self.dispatch_upload_progress_event(Atom::from(errormsg), Err(()));
+ self.dispatch_upload_progress_event(Atom::from(errormsg), Err(()), can_gc);
return_if_fetch_was_terminated!();
- self.dispatch_upload_progress_event(atom!("loadend"), Err(()));
+ self.dispatch_upload_progress_event(atom!("loadend"), Err(()), can_gc);
return_if_fetch_was_terminated!();
}
}
- self.dispatch_response_progress_event(Atom::from(errormsg));
+ self.dispatch_response_progress_event(Atom::from(errormsg), can_gc);
return_if_fetch_was_terminated!();
- self.dispatch_response_progress_event(atom!("loadend"));
+ self.dispatch_response_progress_event(atom!("loadend"), can_gc);
},
}
}
@@ -1237,7 +1237,14 @@ impl XMLHttpRequest {
self.response_status.set(Ok(()));
}
- fn dispatch_progress_event(&self, upload: bool, type_: Atom, loaded: u64, total: Option<u64>) {
+ fn dispatch_progress_event(
+ &self,
+ upload: bool,
+ type_: Atom,
+ loaded: u64,
+ total: Option<u64>,
+ can_gc: CanGc,
+ ) {
let (total_length, length_computable) = if self
.response_headers
.borrow()
@@ -1255,6 +1262,7 @@ impl XMLHttpRequest {
length_computable,
loaded,
total_length,
+ can_gc,
);
let target = if upload {
self.upload.upcast()
@@ -1264,7 +1272,12 @@ impl XMLHttpRequest {
progressevent.upcast::<Event>().fire(target);
}
- fn dispatch_upload_progress_event(&self, type_: Atom, partial_load: Result<Option<u64>, ()>) {
+ fn dispatch_upload_progress_event(
+ &self,
+ type_: Atom,
+ partial_load: Result<Option<u64>, ()>,
+ can_gc: CanGc,
+ ) {
// If partial_load is Ok(None), loading has completed and we can just use the value from the request body
// If an error occured, we pass 0 for both loaded and total
@@ -1276,17 +1289,17 @@ impl XMLHttpRequest {
},
Err(()) => (0, None),
};
- self.dispatch_progress_event(true, type_, loaded, total);
+ self.dispatch_progress_event(true, type_, loaded, total, can_gc);
}
- fn dispatch_response_progress_event(&self, type_: Atom) {
+ fn dispatch_response_progress_event(&self, type_: Atom, can_gc: CanGc) {
let len = self.response.borrow().len() as u64;
let total = self
.response_headers
.borrow()
.typed_get::<ContentLength>()
.map(|v| v.0);
- self.dispatch_progress_event(false, type_, len, total);
+ self.dispatch_progress_event(false, type_, len, total, can_gc);
}
fn set_timeout(&self, duration: Duration) {
diff --git a/components/script/dom/xrinputsourcearray.rs b/components/script/dom/xrinputsourcearray.rs
index 0be45267979..44f36828540 100644
--- a/components/script/dom/xrinputsourcearray.rs
+++ b/components/script/dom/xrinputsourcearray.rs
@@ -71,7 +71,7 @@ impl XRInputSourceArray {
pub fn remove_input_source(&self, session: &XRSession, id: InputId, can_gc: CanGc) {
let global = self.global();
let removed = if let Some(i) = self.input_sources.borrow().iter().find(|i| i.id() == id) {
- i.gamepad().update_connected(false, false);
+ i.gamepad().update_connected(false, false, can_gc);
[DomRoot::from_ref(&**i)]
} else {
return;
@@ -101,7 +101,7 @@ impl XRInputSourceArray {
let global = self.global();
let root;
let removed = if let Some(i) = self.input_sources.borrow().iter().find(|i| i.id() == id) {
- i.gamepad().update_connected(false, false);
+ i.gamepad().update_connected(false, false, can_gc);
root = [DomRoot::from_ref(&**i)];
&root as &[_]
} else {