diff options
author | tanishka <109246904+taniishkaaa@users.noreply.github.com> | 2024-10-24 04:18:19 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-23 22:48:19 +0000 |
commit | ea875f0a51551914f85e56945a663ca0e749cc0e (patch) | |
tree | 744025510d9c1399abc843e7669e714dca37b98d /components/script/dom | |
parent | bb4932026cef55aefd95a5a627a944e1ad26c6f2 (diff) | |
download | servo-ea875f0a51551914f85e56945a663ca0e749cc0e.tar.gz servo-ea875f0a51551914f85e56945a663ca0e749cc0e.zip |
CanGc fixes from EventTarget::fire_event (#33985)
Signed-off-by: taniishkaaa <tanishkasingh2004@gmail.com>
Diffstat (limited to 'components/script/dom')
28 files changed, 127 insertions, 97 deletions
diff --git a/components/script/dom/audiotracklist.rs b/components/script/dom/audiotracklist.rs index 93b1c5ec651..b9f62c4b72e 100644 --- a/components/script/dom/audiotracklist.rs +++ b/components/script/dom/audiotracklist.rs @@ -15,6 +15,7 @@ use crate::dom::bindings::str::DOMString; use crate::dom::eventtarget::EventTarget; use crate::dom::htmlmediaelement::HTMLMediaElement; use crate::dom::window::Window; +use crate::script_runtime::CanGc; use crate::task_source::TaskSource; #[dom_struct] @@ -96,7 +97,7 @@ impl AudioTrackList { let _ = source.queue_with_canceller( task!(media_track_change: move || { let this = this.root(); - this.upcast::<EventTarget>().fire_event(atom!("change")); + this.upcast::<EventTarget>().fire_event(atom!("change"), CanGc::note()); }), &canceller, ); diff --git a/components/script/dom/bindings/codegen/Bindings.conf b/components/script/dom/bindings/codegen/Bindings.conf index c8aeb645284..751aee93cfd 100644 --- a/components/script/dom/bindings/codegen/Bindings.conf +++ b/components/script/dom/bindings/codegen/Bindings.conf @@ -375,6 +375,10 @@ DOMInterfaces = { 'canGc': ['GetTransform', 'SetStrokeStyle', 'SetFillStyle', 'SetShadowColor'], }, +'Performance': { + 'canGc': ['Mark', 'Measure'], +}, + 'Permissions': { 'canGc': ['Query', 'Request', 'Revoke'], }, @@ -476,7 +480,7 @@ DOMInterfaces = { 'WorkerGlobalScope': { 'inRealms': ['Fetch'], - 'canGc': ['Fetch', 'CreateImageBitmap'], + 'canGc': ['Fetch', 'CreateImageBitmap', 'ImportScripts'], }, 'Worklet': { diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index 4ce3fd6d88a..88fcd9bc879 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -430,6 +430,7 @@ impl DedicatedWorkerGlobalScope { request, &global_scope.resource_threads().sender(), global_scope, + CanGc::note(), ) { Err(_) => { println!("error loading script {}", serialized_worker_url); diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index fd862b891a1..f97d1b355ea 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -1076,7 +1076,7 @@ impl Document { } // https://html.spec.whatwg.org/multipage/#current-document-readiness - pub fn set_ready_state(&self, state: DocumentReadyState) { + pub fn set_ready_state(&self, state: DocumentReadyState, can_gc: CanGc) { match state { DocumentReadyState::Loading => { if self.window().is_top_level() { @@ -1096,7 +1096,7 @@ impl Document { self.ready_state.set(state); self.upcast::<EventTarget>() - .fire_event(atom!("readystatechange")); + .fire_event(atom!("readystatechange"), can_gc); } /// Return whether scripting is enabled or not @@ -2456,7 +2456,7 @@ impl Document { } // Step 7.1. - document.set_ready_state(DocumentReadyState::Complete); + document.set_ready_state(DocumentReadyState::Complete, CanGc::note()); // Step 7.2. if document.browsing_context().is_none() { @@ -4232,7 +4232,7 @@ impl Document { VisibilityStateEntry::new(&self.global(), visibility_state, CrossProcessInstant::now()); self.window .Performance() - .queue_entry(entry.upcast::<PerformanceEntry>()); + .queue_entry(entry.upcast::<PerformanceEntry>(), can_gc); // Step 4 Run the screen orientation change steps with document. // TODO ScreenOrientation hasn't implemented yet diff --git a/components/script/dom/domparser.rs b/components/script/dom/domparser.rs index e3e66733af9..aeeb4f0488c 100644 --- a/components/script/dom/domparser.rs +++ b/components/script/dom/domparser.rs @@ -91,7 +91,7 @@ impl DOMParserMethods for DOMParser { can_gc, ); ServoParser::parse_html_document(&document, Some(s), url, can_gc); - document.set_ready_state(DocumentReadyState::Complete); + document.set_ready_state(DocumentReadyState::Complete, can_gc); Ok(document) }, Text_xml | Application_xml | Application_xhtml_xml | Image_svg_xml => { @@ -113,7 +113,7 @@ impl DOMParserMethods for DOMParser { can_gc, ); ServoParser::parse_xml_document(&document, Some(s), url, can_gc); - document.set_ready_state(DocumentReadyState::Complete); + document.set_ready_state(DocumentReadyState::Complete, can_gc); Ok(document) }, } diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 1c526d02a0b..d7478dd21c2 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -4400,7 +4400,7 @@ impl TaskOnce for ElementPerformFullscreenEnter { if self.error || !element.fullscreen_element_ready_check() { document .upcast::<EventTarget>() - .fire_event(atom!("fullscreenerror")); + .fire_event(atom!("fullscreenerror"), CanGc::note()); promise.reject_error(Error::Type(String::from("fullscreen is not connected"))); return; } @@ -4418,7 +4418,7 @@ impl TaskOnce for ElementPerformFullscreenEnter { // Step 7.6 document .upcast::<EventTarget>() - .fire_event(atom!("fullscreenchange")); + .fire_event(atom!("fullscreenchange"), CanGc::note()); // Step 7.7 promise.resolve_native(&()); @@ -4459,7 +4459,7 @@ impl TaskOnce for ElementPerformFullscreenExit { // Step 9.8 document .upcast::<EventTarget>() - .fire_event(atom!("fullscreenchange")); + .fire_event(atom!("fullscreenchange"), CanGc::note()); // Step 9.10 self.promise.root().resolve_native(&()); diff --git a/components/script/dom/event.rs b/components/script/dom/event.rs index 0ed5c1a970d..b86c50bdc3b 100644 --- a/components/script/dom/event.rs +++ b/components/script/dom/event.rs @@ -631,7 +631,7 @@ pub struct SimpleEventTask { impl TaskOnce for SimpleEventTask { fn run_once(self) { let target = self.target.root(); - target.fire_event(self.name); + target.fire_event(self.name, CanGc::note()); } } diff --git a/components/script/dom/eventsource.rs b/components/script/dom/eventsource.rs index ce0d039b8d5..a5f98cd393e 100644 --- a/components/script/dom/eventsource.rs +++ b/components/script/dom/eventsource.rs @@ -118,7 +118,7 @@ impl EventSourceContext { let event_source = event_source.root(); if event_source.ready_state.get() != ReadyState::Closed { event_source.ready_state.set(ReadyState::Open); - event_source.upcast::<EventTarget>().fire_event(atom!("open")); + event_source.upcast::<EventTarget>().fire_event(atom!("open"), CanGc::note()); } }), &global, @@ -159,7 +159,7 @@ impl EventSourceContext { event_source.ready_state.set(ReadyState::Connecting); // Step 1.3. - event_source.upcast::<EventTarget>().fire_event(atom!("error")); + event_source.upcast::<EventTarget>().fire_event(atom!("error"), CanGc::note()); // Step 2. let duration = event_source.reconnection_time.get(); @@ -438,7 +438,7 @@ impl FetchResponseListener for EventSourceContext { } fn submit_resource_timing(&mut self) { - network_listener::submit_timing(self) + network_listener::submit_timing(self, CanGc::note()) } } @@ -505,7 +505,7 @@ impl EventSource { let event_source = event_source.root(); if event_source.ready_state.get() != ReadyState::Closed { event_source.ready_state.set(ReadyState::Closed); - event_source.upcast::<EventTarget>().fire_event(atom!("error")); + event_source.upcast::<EventTarget>().fire_event(atom!("error"), CanGc::note()); } }), &global, diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs index 00f33ce2f2e..67f2b492252 100644 --- a/components/script/dom/eventtarget.rs +++ b/components/script/dom/eventtarget.rs @@ -660,12 +660,12 @@ impl EventTarget { } // https://dom.spec.whatwg.org/#concept-event-fire - pub fn fire_event(&self, name: Atom) -> DomRoot<Event> { + pub fn fire_event(&self, name: Atom, can_gc: CanGc) -> DomRoot<Event> { self.fire_event_with_params( name, EventBubbles::DoesNotBubble, EventCancelable::NotCancelable, - CanGc::note(), + can_gc, ) } diff --git a/components/script/dom/htmldetailselement.rs b/components/script/dom/htmldetailselement.rs index e5f2d9986fa..a1086a86515 100644 --- a/components/script/dom/htmldetailselement.rs +++ b/components/script/dom/htmldetailselement.rs @@ -90,7 +90,7 @@ impl VirtualMethods for HTMLDetailsElement { task!(details_notification_task_steps: move || { let this = this.root(); if counter == this.toggle_counter.get() { - this.upcast::<EventTarget>().fire_event(atom!("toggle")); + this.upcast::<EventTarget>().fire_event(atom!("toggle"), CanGc::note()); } }), window.upcast(), diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs index 8745606b39c..bf0f6de5b0d 100644 --- a/components/script/dom/htmliframeelement.rs +++ b/components/script/dom/htmliframeelement.rs @@ -504,7 +504,8 @@ impl HTMLIFrameElement { // TODO Step 3 - set child document `mut iframe load` flag // Step 4 - self.upcast::<EventTarget>().fire_event(atom!("load")); + self.upcast::<EventTarget>() + .fire_event(atom!("load"), can_gc); let mut blocker = self.load_blocker.borrow_mut(); LoadBlocker::terminate(&mut blocker, can_gc); diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index 13970e06aad..f238d777558 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -299,7 +299,7 @@ impl FetchResponseListener for ImageContext { } fn submit_resource_timing(&mut self) { - network_listener::submit_timing(self) + network_listener::submit_timing(self, CanGc::note()) } } @@ -485,14 +485,18 @@ impl HTMLImageElement { // Fire image.onload and loadend if trigger_image_load { // TODO: https://html.spec.whatwg.org/multipage/#fire-a-progress-event-or-event - self.upcast::<EventTarget>().fire_event(atom!("load")); - self.upcast::<EventTarget>().fire_event(atom!("loadend")); + self.upcast::<EventTarget>() + .fire_event(atom!("load"), can_gc); + self.upcast::<EventTarget>() + .fire_event(atom!("loadend"), can_gc); } // Fire image.onerror if trigger_image_error { - self.upcast::<EventTarget>().fire_event(atom!("error")); - self.upcast::<EventTarget>().fire_event(atom!("loadend")); + self.upcast::<EventTarget>() + .fire_event(atom!("error"), can_gc); + self.upcast::<EventTarget>() + .fire_event(atom!("loadend"), can_gc); } // Trigger reflow @@ -901,7 +905,7 @@ impl HTMLImageElement { let src_present = elem.has_attribute(&local_name!("src")); if src_present || Self::uses_srcset_or_picture(elem) { - this.upcast::<EventTarget>().fire_event(atom!("error")); + this.upcast::<EventTarget>().fire_event(atom!("error"), CanGc::note()); } }), window.upcast(), @@ -932,7 +936,7 @@ impl HTMLImageElement { this.current_request.borrow_mut(); current_request.source_url = Some(USVString(src)) } - this.upcast::<EventTarget>().fire_event(atom!("error")); + this.upcast::<EventTarget>().fire_event(atom!("error"), CanGc::note()); }), window.upcast(), @@ -1027,7 +1031,7 @@ impl HTMLImageElement { current_request.source_url = Some(USVString(src)); } // TODO: restart animation, if set. - this.upcast::<EventTarget>().fire_event(atom!("load")); + this.upcast::<EventTarget>().fire_event(atom!("load"), CanGc::note()); }), window.upcast(), ); @@ -1278,7 +1282,7 @@ impl HTMLImageElement { this.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage); // Step 15.7 - this.upcast::<EventTarget>().fire_event(atom!("load")); + this.upcast::<EventTarget>().fire_event(atom!("load"), CanGc::note()); }), window.upcast(), ); diff --git a/components/script/dom/htmllinkelement.rs b/components/script/dom/htmllinkelement.rs index 95f0765cb41..f7dcb06b157 100644 --- a/components/script/dom/htmllinkelement.rs +++ b/components/script/dom/htmllinkelement.rs @@ -714,13 +714,13 @@ impl FetchResponseListener for PrefetchContext { self.link .root() .upcast::<EventTarget>() - .fire_event(atom!("error")); + .fire_event(atom!("error"), CanGc::note()); } else { // Step 2. Otherwise, fire an event named load at el. self.link .root() .upcast::<EventTarget>() - .fire_event(atom!("load")); + .fire_event(atom!("load"), CanGc::note()); } } @@ -733,7 +733,7 @@ impl FetchResponseListener for PrefetchContext { } fn submit_resource_timing(&mut self) { - submit_timing(self) + submit_timing(self, CanGc::note()) } } diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index f199e2f0e7f..d51a7e3a86a 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -549,10 +549,10 @@ impl HTMLMediaElement { this.fulfill_in_flight_play_promises(|| { // Step 2.3.1. - this.upcast::<EventTarget>().fire_event(atom!("timeupdate")); + this.upcast::<EventTarget>().fire_event(atom!("timeupdate"), CanGc::note()); // Step 2.3.2. - this.upcast::<EventTarget>().fire_event(atom!("pause")); + this.upcast::<EventTarget>().fire_event(atom!("pause"), CanGc::note()); if let Some(ref player) = *this.player.borrow() { if let Err(e) = player.lock().unwrap().pause() { @@ -597,7 +597,7 @@ impl HTMLMediaElement { this.fulfill_in_flight_play_promises(|| { // Step 2.1. - this.upcast::<EventTarget>().fire_event(atom!("playing")); + this.upcast::<EventTarget>().fire_event(atom!("playing"), CanGc::note()); this.play_media(); // Step 2.2. @@ -641,7 +641,7 @@ impl HTMLMediaElement { let _ = task_source.queue( task!(media_reached_current_data: move || { let this = this.root(); - this.upcast::<EventTarget>().fire_event(atom!("loadeddata")); + this.upcast::<EventTarget>().fire_event(atom!("loadeddata"), CanGc::note()); this.delay_load_event(false, CanGc::note()); }), window.upcast(), @@ -829,7 +829,9 @@ impl HTMLMediaElement { let src = source.Src(); // Step 9.attr.2. if src.is_empty() { - source.upcast::<EventTarget>().fire_event(atom!("error")); + source + .upcast::<EventTarget>() + .fire_event(atom!("error"), can_gc); self.queue_dedicated_media_source_failure_steps(); return; } @@ -837,7 +839,9 @@ impl HTMLMediaElement { let url_record = match base_url.join(&src) { Ok(url) => url, Err(_) => { - source.upcast::<EventTarget>().fire_event(atom!("error")); + source + .upcast::<EventTarget>() + .fire_event(atom!("error"), can_gc); self.queue_dedicated_media_source_failure_steps(); return; }, @@ -1022,7 +1026,7 @@ impl HTMLMediaElement { this.set_show_poster(true); // Step 5. - this.upcast::<EventTarget>().fire_event(atom!("error")); + this.upcast::<EventTarget>().fire_event(atom!("error"), CanGc::note()); if let Some(ref player) = *this.player.borrow() { if let Err(e) = player.lock().unwrap().stop() { @@ -1504,7 +1508,7 @@ impl HTMLMediaElement { task!(reaches_the_end_steps: move || { let this = this.root(); // Step 3.1. - this.upcast::<EventTarget>().fire_event(atom!("timeupdate")); + this.upcast::<EventTarget>().fire_event(atom!("timeupdate"), CanGc::note()); // Step 3.2. if this.Ended() && !this.Paused() { @@ -1512,7 +1516,7 @@ impl HTMLMediaElement { this.paused.set(true); // Step 3.2.2. - this.upcast::<EventTarget>().fire_event(atom!("pause")); + this.upcast::<EventTarget>().fire_event(atom!("pause"), CanGc::note()); // Step 3.2.3. this.take_pending_play_promises(Err(Error::Abort)); @@ -1520,7 +1524,7 @@ impl HTMLMediaElement { } // Step 3.3. - this.upcast::<EventTarget>().fire_event(atom!("ended")); + this.upcast::<EventTarget>().fire_event(atom!("ended"), CanGc::note()); }), window.upcast(), ); @@ -1573,7 +1577,8 @@ impl HTMLMediaElement { self.delay_load_event(false, can_gc); // 5. Fire an event named error at the media element. - self.upcast::<EventTarget>().fire_event(atom!("error")); + self.upcast::<EventTarget>() + .fire_event(atom!("error"), can_gc); // TODO: 6. Abort the overall resource selection algorithm. }, @@ -2836,11 +2841,13 @@ impl FetchResponseListener for HTMLMediaElementFetchListener { } if status.is_ok() && self.latest_fetched_content != 0 { - elem.upcast::<EventTarget>().fire_event(atom!("progress")); + elem.upcast::<EventTarget>() + .fire_event(atom!("progress"), CanGc::note()); elem.network_state.set(NetworkState::Idle); - elem.upcast::<EventTarget>().fire_event(atom!("suspend")); + elem.upcast::<EventTarget>() + .fire_event(atom!("suspend"), CanGc::note()); } // => "If the connection is interrupted after some media data has been received..." else if elem.ready_state.get() != ReadyState::HaveNothing { @@ -2868,7 +2875,8 @@ impl FetchResponseListener for HTMLMediaElementFetchListener { elem.delay_load_event(false, CanGc::note()); // Step 5 - elem.upcast::<EventTarget>().fire_event(atom!("error")); + elem.upcast::<EventTarget>() + .fire_event(atom!("error"), CanGc::note()); } else { // => "If the media data cannot be fetched at all..." elem.queue_dedicated_media_source_failure_steps(); @@ -2884,7 +2892,7 @@ impl FetchResponseListener for HTMLMediaElementFetchListener { } fn submit_resource_timing(&mut self) { - network_listener::submit_timing(self) + network_listener::submit_timing(self, CanGc::note()) } } diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 364e975e1c9..f504c50ab3b 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -488,7 +488,7 @@ impl FetchResponseListener for ClassicContext { } fn submit_resource_timing(&mut self) { - network_listener::submit_timing(self) + network_listener::submit_timing(self, CanGc::note()) } } diff --git a/components/script/dom/htmlvideoelement.rs b/components/script/dom/htmlvideoelement.rs index a8a1868cd0d..937b4216f71 100644 --- a/components/script/dom/htmlvideoelement.rs +++ b/components/script/dom/htmlvideoelement.rs @@ -368,7 +368,7 @@ impl FetchResponseListener for PosterFrameFetchContext { } fn submit_resource_timing(&mut self) { - network_listener::submit_timing(self) + network_listener::submit_timing(self, CanGc::note()) } } diff --git a/components/script/dom/performance.rs b/components/script/dom/performance.rs index cb647a8bad2..5ad3d63b40f 100644 --- a/components/script/dom/performance.rs +++ b/components/script/dom/performance.rs @@ -29,6 +29,7 @@ use crate::dom::performancenavigation::PerformanceNavigation; use crate::dom::performancenavigationtiming::PerformanceNavigationTiming; use crate::dom::performanceobserver::PerformanceObserver as DOMPerformanceObserver; use crate::dom::window::Window; +use crate::script_runtime::CanGc; const INVALID_ENTRY_NAMES: &[&str] = &[ "navigationStart", @@ -276,9 +277,9 @@ impl Performance { /// <https://w3c.github.io/performance-timeline/#queue-a-performanceentry> /// Also this algorithm has been extented according to : /// <https://w3c.github.io/resource-timing/#sec-extensions-performance-interface> - pub fn queue_entry(&self, entry: &PerformanceEntry) -> Option<usize> { + pub fn queue_entry(&self, entry: &PerformanceEntry, can_gc: CanGc) -> Option<usize> { // https://w3c.github.io/performance-timeline/#dfn-determine-eligibility-for-adding-a-performance-entry - if entry.entry_type() == "resource" && !self.should_queue_resource_entry(entry) { + if entry.entry_type() == "resource" && !self.should_queue_resource_entry(entry, can_gc) { return None; } @@ -349,14 +350,14 @@ impl Performance { self.resource_timing_buffer_current_size.get() <= self.resource_timing_buffer_size_limit.get() } - fn copy_secondary_resource_timing_buffer(&self) { + fn copy_secondary_resource_timing_buffer(&self, can_gc: CanGc) { while self.can_add_resource_timing_entry() { let entry = self .resource_timing_secondary_entries .borrow_mut() .pop_front(); if let Some(ref entry) = entry { - self.queue_entry(entry); + self.queue_entry(entry, can_gc); } else { break; } @@ -364,15 +365,15 @@ impl Performance { } // `fire a buffer full event` paragraph of // https://w3c.github.io/resource-timing/#sec-extensions-performance-interface - fn fire_buffer_full_event(&self) { + fn fire_buffer_full_event(&self, can_gc: CanGc) { while !self.resource_timing_secondary_entries.borrow().is_empty() { let no_of_excess_entries_before = self.resource_timing_secondary_entries.borrow().len(); if !self.can_add_resource_timing_entry() { self.upcast::<EventTarget>() - .fire_event(atom!("resourcetimingbufferfull")); + .fire_event(atom!("resourcetimingbufferfull"), can_gc); } - self.copy_secondary_resource_timing_buffer(); + self.copy_secondary_resource_timing_buffer(can_gc); let no_of_excess_entries_after = self.resource_timing_secondary_entries.borrow().len(); if no_of_excess_entries_before <= no_of_excess_entries_after { self.resource_timing_secondary_entries.borrow_mut().clear(); @@ -383,7 +384,7 @@ impl Performance { } /// `add a PerformanceResourceTiming entry` paragraph of /// <https://w3c.github.io/resource-timing/#sec-extensions-performance-interface> - fn should_queue_resource_entry(&self, entry: &PerformanceEntry) -> bool { + fn should_queue_resource_entry(&self, entry: &PerformanceEntry, can_gc: CanGc) -> bool { // Step 1 is done in the args list. if !self.resource_timing_buffer_pending_full_event.get() { // Step 2. @@ -397,7 +398,7 @@ impl Performance { } // Step 3. self.resource_timing_buffer_pending_full_event.set(true); - self.fire_buffer_full_event(); + self.fire_buffer_full_event(can_gc); } // Steps 4 and 5. self.resource_timing_secondary_entries @@ -469,7 +470,7 @@ impl PerformanceMethods for Performance { } // https://w3c.github.io/user-timing/#dom-performance-mark - fn Mark(&self, mark_name: DOMString) -> Fallible<()> { + fn Mark(&self, mark_name: DOMString, can_gc: CanGc) -> Fallible<()> { let global = self.global(); // Step 1. if global.is::<Window>() && INVALID_ENTRY_NAMES.contains(&mark_name.as_ref()) { @@ -484,7 +485,7 @@ impl PerformanceMethods for Performance { Duration::ZERO, ); // Steps 7 and 8. - self.queue_entry(entry.upcast::<PerformanceEntry>()); + self.queue_entry(entry.upcast::<PerformanceEntry>(), can_gc); // Step 9. Ok(()) @@ -503,6 +504,7 @@ impl PerformanceMethods for Performance { measure_name: DOMString, start_mark: Option<DOMString>, end_mark: Option<DOMString>, + can_gc: CanGc, ) -> Fallible<()> { // Steps 1 and 2. let end_time = end_mark @@ -532,7 +534,7 @@ impl PerformanceMethods for Performance { ); // Step 9 and 10. - self.queue_entry(entry.upcast::<PerformanceEntry>()); + self.queue_entry(entry.upcast::<PerformanceEntry>(), can_gc); // Step 11. Ok(()) diff --git a/components/script/dom/selection.rs b/components/script/dom/selection.rs index 63ec919a4b3..fbe5047a12e 100644 --- a/components/script/dom/selection.rs +++ b/components/script/dom/selection.rs @@ -96,7 +96,7 @@ impl Selection { task!(selectionchange_task_steps: move || { let this = this.root(); this.task_queued.set(false); - this.document.upcast::<EventTarget>().fire_event(atom!("selectionchange")); + this.document.upcast::<EventTarget>().fire_event(atom!("selectionchange"), CanGc::note()); }), window.upcast(), ) diff --git a/components/script/dom/serviceworker.rs b/components/script/dom/serviceworker.rs index b3b9738340a..e6ce9968559 100644 --- a/components/script/dom/serviceworker.rs +++ b/components/script/dom/serviceworker.rs @@ -27,7 +27,7 @@ use crate::dom::bindings::structuredclone; use crate::dom::bindings::trace::RootedTraceableBox; use crate::dom::eventtarget::EventTarget; use crate::dom::globalscope::GlobalScope; -use crate::script_runtime::JSContext; +use crate::script_runtime::{CanGc, JSContext}; use crate::task::TaskOnce; pub type TrustedServiceWorkerAddress = Trusted<ServiceWorker>; @@ -74,15 +74,15 @@ impl ServiceWorker { ) } - pub fn dispatch_simple_error(address: TrustedServiceWorkerAddress) { + pub fn dispatch_simple_error(address: TrustedServiceWorkerAddress, can_gc: CanGc) { let service_worker = address.root(); - service_worker.upcast().fire_event(atom!("error")); + service_worker.upcast().fire_event(atom!("error"), can_gc); } - pub fn set_transition_state(&self, state: ServiceWorkerState) { + pub fn set_transition_state(&self, state: ServiceWorkerState, can_gc: CanGc) { self.state.set(state); self.upcast::<EventTarget>() - .fire_event(atom!("statechange")); + .fire_event(atom!("statechange"), can_gc); } pub fn get_script_url(&self) -> ServoUrl { @@ -167,6 +167,6 @@ impl ServiceWorkerMethods for ServiceWorker { impl TaskOnce for SimpleWorkerErrorHandler<ServiceWorker> { #[allow(crown::unrooted_must_root)] fn run_once(self) { - ServiceWorker::dispatch_simple_error(self.addr); + ServiceWorker::dispatch_simple_error(self.addr, CanGc::note()); } } diff --git a/components/script/dom/serviceworkerglobalscope.rs b/components/script/dom/serviceworkerglobalscope.rs index 98f800c0dd6..a164dbee06c 100644 --- a/components/script/dom/serviceworkerglobalscope.rs +++ b/components/script/dom/serviceworkerglobalscope.rs @@ -360,17 +360,21 @@ impl ServiceWorkerGlobalScope { .referrer_policy(referrer_policy) .origin(origin); - let (_url, source) = - match load_whole_resource(request, &resource_threads_sender, global.upcast()) { - Err(_) => { - println!("error loading script {}", serialized_worker_url); - scope.clear_js_runtime(); - return; - }, - Ok((metadata, bytes)) => { - (metadata.final_url, String::from_utf8(bytes).unwrap()) - }, - }; + let (_url, source) = match load_whole_resource( + request, + &resource_threads_sender, + global.upcast(), + CanGc::note(), + ) { + Err(_) => { + println!("error loading script {}", serialized_worker_url); + scope.clear_js_runtime(); + return; + }, + Ok((metadata, bytes)) => { + (metadata.final_url, String::from_utf8(bytes).unwrap()) + }, + }; unsafe { // Handle interrupt requests @@ -465,7 +469,8 @@ impl ServiceWorkerGlobalScope { // TODO XXXcreativcoder This will eventually use a FetchEvent interface to fire event // when we have the Request and Response dom api's implemented // https://w3c.github.io/ServiceWorker/#fetchevent-interface - self.upcast::<EventTarget>().fire_event(atom!("fetch")); + self.upcast::<EventTarget>() + .fire_event(atom!("fetch"), can_gc); let _ = mediator.response_chan.send(None); }, WakeUp => {}, diff --git a/components/script/dom/servoparser/mod.rs b/components/script/dom/servoparser/mod.rs index 933d8e4f1eb..ca1c20aaf03 100644 --- a/components/script/dom/servoparser/mod.rs +++ b/components/script/dom/servoparser/mod.rs @@ -404,14 +404,15 @@ impl ServoParser { // Step 2. self.document - .set_ready_state(DocumentReadyState::Interactive); + .set_ready_state(DocumentReadyState::Interactive, can_gc); // Step 3. self.tokenizer.end(can_gc); self.document.set_current_parser(None); // Step 4. - self.document.set_ready_state(DocumentReadyState::Complete); + self.document + .set_ready_state(DocumentReadyState::Complete, can_gc); } // https://html.spec.whatwg.org/multipage/#active-parser @@ -633,7 +634,7 @@ impl ServoParser { // Step 1. self.document - .set_ready_state(DocumentReadyState::Interactive); + .set_ready_state(DocumentReadyState::Interactive, can_gc); // Step 2. self.tokenizer.end(can_gc); @@ -1006,10 +1007,10 @@ impl FetchResponseListener for ParserContext { CrossProcessInstant::now(), document, ); - self.pushed_entry_index = document - .global() - .performance() - .queue_entry(performance_entry.upcast::<PerformanceEntry>()); + self.pushed_entry_index = document.global().performance().queue_entry( + performance_entry.upcast::<PerformanceEntry>(), + CanGc::note(), + ); } } diff --git a/components/script/dom/texttracklist.rs b/components/script/dom/texttracklist.rs index ed2d289c449..55ac4fbdfac 100644 --- a/components/script/dom/texttracklist.rs +++ b/components/script/dom/texttracklist.rs @@ -99,13 +99,13 @@ impl TextTrackList { // FIXME(#22314, dlrobertson) allow TextTracks to be // removed from the TextTrackList. #[allow(dead_code)] - pub fn remove(&self, idx: usize) { + pub fn remove(&self, idx: usize, can_gc: CanGc) { if let Some(track) = self.dom_tracks.borrow().get(idx) { track.remove_track_list(); } self.dom_tracks.borrow_mut().remove(idx); self.upcast::<EventTarget>() - .fire_event(atom!("removetrack")); + .fire_event(atom!("removetrack"), can_gc); } } diff --git a/components/script/dom/videotracklist.rs b/components/script/dom/videotracklist.rs index 90eb03a7062..5c2f852dc7d 100644 --- a/components/script/dom/videotracklist.rs +++ b/components/script/dom/videotracklist.rs @@ -15,6 +15,7 @@ use crate::dom::eventtarget::EventTarget; use crate::dom::htmlmediaelement::HTMLMediaElement; use crate::dom::videotrack::VideoTrack; use crate::dom::window::Window; +use crate::script_runtime::CanGc; use crate::task_source::TaskSource; #[dom_struct] @@ -99,7 +100,7 @@ impl VideoTrackList { let _ = source.queue_with_canceller( task!(media_track_change: move || { let this = this.root(); - this.upcast::<EventTarget>().fire_event(atom!("change")); + this.upcast::<EventTarget>().fire_event(atom!("change"), CanGc::note()); }), &canceller, ); diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs index c0b67e6fd92..964927038fa 100644 --- a/components/script/dom/websocket.rs +++ b/components/script/dom/websocket.rs @@ -478,7 +478,7 @@ impl TaskOnce for ConnectionEstablishedTask { }; // Step 4. - ws.upcast().fire_event(atom!("open")); + ws.upcast().fire_event(atom!("open"), CanGc::note()); } } @@ -524,7 +524,7 @@ impl TaskOnce for CloseTask { // Step 2. if self.failed { - ws.upcast().fire_event(atom!("error")); + ws.upcast().fire_event(atom!("error"), CanGc::note()); } // Step 3. diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs index 48fe9cbda13..b62e7d14fd8 100644 --- a/components/script/dom/worker.rs +++ b/components/script/dom/worker.rs @@ -128,9 +128,9 @@ impl Worker { } } - pub fn dispatch_simple_error(address: TrustedWorkerAddress) { + pub fn dispatch_simple_error(address: TrustedWorkerAddress, can_gc: CanGc) { let worker = address.root(); - worker.upcast().fire_event(atom!("error")); + worker.upcast().fire_event(atom!("error"), can_gc); } /// <https://html.spec.whatwg.org/multipage/#dom-dedicatedworkerglobalscope-postmessage> @@ -301,6 +301,6 @@ impl WorkerMethods for Worker { impl TaskOnce for SimpleWorkerErrorHandler<Worker> { #[allow(crown::unrooted_must_root)] fn run_once(self) { - Worker::dispatch_simple_error(self.addr); + Worker::dispatch_simple_error(self.addr, CanGc::note()); } } diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs index 16cee5b7d9f..cd3e02cc7e6 100644 --- a/components/script/dom/workerglobalscope.rs +++ b/components/script/dom/workerglobalscope.rs @@ -248,7 +248,7 @@ impl WorkerGlobalScopeMethods for WorkerGlobalScope { error_event_handler!(error, GetOnerror, SetOnerror); // https://html.spec.whatwg.org/multipage/#dom-workerglobalscope-importscripts - fn ImportScripts(&self, url_strings: Vec<DOMString>) -> ErrorResult { + fn ImportScripts(&self, url_strings: Vec<DOMString>, can_gc: CanGc) -> ErrorResult { let mut urls = Vec::with_capacity(url_strings.len()); for url in url_strings { let url = self.worker_url.borrow().join(&url); @@ -274,6 +274,7 @@ impl WorkerGlobalScopeMethods for WorkerGlobalScope { request, &global_scope.resource_threads().sender(), global_scope, + can_gc, ) { Err(_) => return Err(Error::Network), Ok((metadata, bytes)) => (metadata.final_url, String::from_utf8(bytes).unwrap()), diff --git a/components/script/dom/worklet.rs b/components/script/dom/worklet.rs index 029f266dfd3..ae6f6777523 100644 --- a/components/script/dom/worklet.rs +++ b/components/script/dom/worklet.rs @@ -662,6 +662,7 @@ impl WorkletThread { request, &resource_fetcher, global_scope.upcast::<GlobalScope>(), + can_gc, ) .ok() .and_then(|(_, bytes)| String::from_utf8(bytes).ok()); diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index 970012c12e9..64466ef749b 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -291,7 +291,7 @@ impl XMLHttpRequest { } fn submit_resource_timing(&mut self) { - network_listener::submit_timing(self) + network_listener::submit_timing(self, CanGc::note()) } } |