aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/atoms/static_atoms.txt1
-rw-r--r--components/script/dom/document.rs35
-rw-r--r--tests/wpt/metadata/MANIFEST.json2
-rw-r--r--tests/wpt/web-platform-tests/html/syntax/parsing/the-end.html24
4 files changed, 56 insertions, 6 deletions
diff --git a/components/atoms/static_atoms.txt b/components/atoms/static_atoms.txt
index 2c27a091c88..e72e1e07b19 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 7f3f40ea22c..49bc45b27c1 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<u64>,
+ /// https://html.spec.whatwg.org/multipage/#page-showing
+ page_showing: Cell<bool>,
}
#[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>();
+ event.set_trusted(true);
+
+ // FIXME(nox): Why are errors silenced here?
+ let _ = window.upcast::<EventTarget>().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 77e7a64addc..f33bd33dfb1 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -568154,7 +568154,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 0a7babf0b5d..181d8995106 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 @@ async_test(function() {
}, "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");
</script>