aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/bindings/settings_stack.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/bindings/settings_stack.rs')
-rw-r--r--components/script/dom/bindings/settings_stack.rs143
1 files changed, 6 insertions, 137 deletions
diff --git a/components/script/dom/bindings/settings_stack.rs b/components/script/dom/bindings/settings_stack.rs
index 1284931c349..8e00d03a953 100644
--- a/components/script/dom/bindings/settings_stack.rs
+++ b/components/script/dom/bindings/settings_stack.rs
@@ -3,36 +3,20 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use std::cell::RefCell;
-use std::marker::PhantomData;
-use std::thread;
-use js::jsapi::{GetScriptedCallerGlobal, HideScriptedCaller, JSTracer, UnhideScriptedCaller};
+use js::jsapi::{GetScriptedCallerGlobal, JSTracer};
use js::rust::Runtime;
+use script_bindings::settings_stack::*;
-use crate::DomTypes;
-use crate::dom::bindings::root::{Dom, DomRoot};
+//use script_bindings::interfaces::{DomHelpers, GlobalScopeHelpers};
+use crate::dom::bindings::root::DomRoot;
use crate::dom::bindings::trace::JSTraceable;
-use crate::dom::bindings::utils::DomHelpers;
-use crate::dom::globalscope::{GlobalScope, GlobalScopeHelpers};
-use crate::script_runtime::CanGc;
+use crate::dom::globalscope::GlobalScope;
thread_local!(pub(super) static STACK: RefCell<Vec<StackEntry<crate::DomTypeHolder>>> = const {
RefCell::new(Vec::new())
});
-#[derive(Debug, Eq, JSTraceable, PartialEq)]
-enum StackEntryKind {
- Incumbent,
- Entry,
-}
-
-#[cfg_attr(crown, allow(crown::unrooted_must_root))]
-#[derive(JSTraceable)]
-pub(crate) struct StackEntry<D: DomTypes> {
- global: Dom<D::GlobalScope>,
- kind: StackEntryKind,
-}
-
/// Traces the script settings stack.
pub(crate) unsafe fn trace(tracer: *mut JSTracer) {
STACK.with(|stack| {
@@ -46,61 +30,6 @@ pub(crate) fn is_execution_stack_empty() -> bool {
pub(crate) type AutoEntryScript = GenericAutoEntryScript<crate::DomTypeHolder>;
-/// RAII struct that pushes and pops entries from the script settings stack.
-pub(crate) struct GenericAutoEntryScript<D: DomTypes> {
- global: DomRoot<D::GlobalScope>,
- #[cfg(feature = "tracing")]
- #[allow(dead_code)]
- span: tracing::span::EnteredSpan,
-}
-
-impl<D: DomTypes> GenericAutoEntryScript<D> {
- /// <https://html.spec.whatwg.org/multipage/#prepare-to-run-script>
- pub(crate) fn new(global: &D::GlobalScope) -> Self {
- let settings_stack = <D as DomHelpers<D>>::settings_stack();
- settings_stack.with(|stack| {
- trace!("Prepare to run script with {:p}", global);
- let mut stack = stack.borrow_mut();
- stack.push(StackEntry {
- global: Dom::from_ref(global),
- kind: StackEntryKind::Entry,
- });
- Self {
- global: DomRoot::from_ref(global),
- #[cfg(feature = "tracing")]
- span: tracing::info_span!(
- "ScriptEvaluate",
- servo_profiling = true,
- url = global.get_url().to_string(),
- )
- .entered(),
- }
- })
- }
-}
-
-impl<D: DomTypes> Drop for GenericAutoEntryScript<D> {
- /// <https://html.spec.whatwg.org/multipage/#clean-up-after-running-script>
- fn drop(&mut self) {
- let settings_stack = <D as DomHelpers<D>>::settings_stack();
- settings_stack.with(|stack| {
- let mut stack = stack.borrow_mut();
- let entry = stack.pop().unwrap();
- assert_eq!(
- &*entry.global as *const D::GlobalScope, &*self.global as *const D::GlobalScope,
- "Dropped AutoEntryScript out of order."
- );
- assert_eq!(entry.kind, StackEntryKind::Entry);
- trace!("Clean up after running script with {:p}", &*entry.global);
- });
-
- // Step 5
- if !thread::panicking() && incumbent_global().is_none() {
- self.global.perform_a_microtask_checkpoint(CanGc::note());
- }
- }
-}
-
/// Returns the ["entry"] global object.
///
/// ["entry"]: https://html.spec.whatwg.org/multipage/#entry
@@ -117,67 +46,7 @@ pub(crate) fn entry_global() -> DomRoot<GlobalScope> {
.unwrap()
}
-/// RAII struct that pushes and pops entries from the script settings stack.
-pub(crate) struct GenericAutoIncumbentScript<D: DomTypes> {
- global: usize,
- _marker: PhantomData<D>,
-}
-
-pub(crate) type AutoIncumbentScript = GenericAutoIncumbentScript<crate::DomTypeHolder>;
-
-impl<D: DomTypes> GenericAutoIncumbentScript<D> {
- /// <https://html.spec.whatwg.org/multipage/#prepare-to-run-a-callback>
- pub(crate) fn new(global: &D::GlobalScope) -> Self {
- // Step 2-3.
- unsafe {
- let cx =
- Runtime::get().expect("Creating a new incumbent script after runtime shutdown");
- HideScriptedCaller(cx.as_ptr());
- }
- let settings_stack = <D as DomHelpers<D>>::settings_stack();
- settings_stack.with(|stack| {
- trace!("Prepare to run a callback with {:p}", global);
- // Step 1.
- let mut stack = stack.borrow_mut();
- stack.push(StackEntry {
- global: Dom::from_ref(global),
- kind: StackEntryKind::Incumbent,
- });
- Self {
- global: global as *const _ as usize,
- _marker: PhantomData,
- }
- })
- }
-}
-
-impl<D: DomTypes> Drop for GenericAutoIncumbentScript<D> {
- /// <https://html.spec.whatwg.org/multipage/#clean-up-after-running-a-callback>
- fn drop(&mut self) {
- let settings_stack = <D as DomHelpers<D>>::settings_stack();
- settings_stack.with(|stack| {
- // Step 4.
- let mut stack = stack.borrow_mut();
- let entry = stack.pop().unwrap();
- // Step 3.
- assert_eq!(
- &*entry.global as *const D::GlobalScope as usize, self.global,
- "Dropped AutoIncumbentScript out of order."
- );
- assert_eq!(entry.kind, StackEntryKind::Incumbent);
- trace!(
- "Clean up after running a callback with {:p}",
- &*entry.global
- );
- });
- unsafe {
- // Step 1-2.
- if let Some(cx) = Runtime::get() {
- UnhideScriptedCaller(cx.as_ptr());
- }
- }
- }
-}
+pub type AutoIncumbentScript = GenericAutoIncumbentScript<crate::DomTypeHolder>;
/// Returns the ["incumbent"] global object.
///