diff --git a/components/atoms/static_atoms.txt b/components/atoms/static_atoms.txt index 2c27a091c88c..e72e1e07b194 100644 --- a/components/atoms/static_atoms.txt +++ b/components/atoms/static_atoms.txt @@ -47,6 +47,7 @@ none number onchange open +pageshow password pause play diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 7f3f40ea22c9..49bc45b27c1f 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -364,6 +364,8 @@ pub struct Document { canceller: FetchCanceller, /// https://html.spec.whatwg.org/multipage/#throw-on-dynamic-markup-insertion-counter throw_on_dynamic_markup_insertion_counter: Cell, + /// https://html.spec.whatwg.org/multipage/#page-showing + page_showing: Cell, } #[derive(JSTraceable, MallocSizeOf)] @@ -1634,7 +1636,37 @@ impl Document { ).unwrap(); // Step 8. - // TODO: pageshow event. + let document = Trusted::new(self); + if document.root().browsing_context().is_some() { + self.window.dom_manipulation_task_source().queue( + task!(fire_pageshow_event: move || { + let document = document.root(); + let window = document.window(); + if document.page_showing.get() || !window.is_alive() { + return; + } + + document.page_showing.set(true); + + let event = PageTransitionEvent::new( + window, + atom!("pageshow"), + false, // bubbles + false, // cancelable + false, // persisted + ); + let event = event.upcast::(); + event.set_trusted(true); + + // FIXME(nox): Why are errors silenced here? + let _ = window.upcast::().dispatch_event_with_target( + document.upcast(), + &event, + ); + }), + self.window.upcast(), + ).unwrap(); + } // Step 9. // TODO: pending application cache download process tasks. @@ -2225,6 +2257,7 @@ impl Document { tti_window: DomRefCell::new(InteractiveWindow::new()), canceller: canceller, throw_on_dynamic_markup_insertion_counter: Cell::new(0), + page_showing: Cell::new(false), } } diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index f28b91348406..75e0923093c3 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -568129,7 +568129,7 @@ "support" ], "html/syntax/parsing/the-end.html": [ - "78b17f053dd3e52b3bf68a5fafc4a4e070e65cfd", + "4b38fe0c7bcb088450cc13f13c805711caf91961", "testharness" ], "html/syntax/serializing-html-fragments/.gitkeep": [ diff --git a/tests/wpt/web-platform-tests/html/syntax/parsing/the-end.html b/tests/wpt/web-platform-tests/html/syntax/parsing/the-end.html index 0a7babf0b5d7..181d89951062 100644 --- a/tests/wpt/web-platform-tests/html/syntax/parsing/the-end.html +++ b/tests/wpt/web-platform-tests/html/syntax/parsing/the-end.html @@ -29,12 +29,28 @@ }, "load"); async_test(function() { - var seen = false; + window.addEventListener("pageshow", this.step_func_done(function(e) { + assert_equals(e.type, "pageshow"); + assert_false(e.bubbles, "bubbles should be false"); + assert_false(e.cancelable, "cancelable should be false"); + assert_equals(e.target, document, "target should be document"); + assert_true(e.isTrusted, "isTrusted should be true"); + assert_class_string(e, "PageTransitionEvent"); + })); +}, "pageshow"); + +async_test(function() { + var seen_dcl = false; + var seen_load = false; document.addEventListener("DOMContentLoaded", this.step_func(function() { - seen = true; + seen_dcl = true; + })); + window.addEventListener("load", this.step_func(function() { + seen_load = true; + assert_true(seen_dcl, "DOMContentLoaded should be fired before load"); })); - window.addEventListener("load", this.step_func_done(function() { - assert_true(seen, "DOMContentLoaded should be fired before load"); + window.addEventListener("pageshow", this.step_func_done(function() { + assert_true(seen_load, "load should be fired before pageshow") })); }, "order");