Skip to content

Commit

Permalink
Fire the pageshow event at the end of the page load r=jdm
Browse files Browse the repository at this point in the history
  • Loading branch information
fabricedesre committed Mar 6, 2018
1 parent 476a076 commit 3dd015b
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 6 deletions.
1 change: 1 addition & 0 deletions components/atoms/static_atoms.txt
Expand Up @@ -47,6 +47,7 @@ none
number
onchange
open
pageshow
password
pause
play
Expand Down
35 changes: 34 additions & 1 deletion components/script/dom/document.rs
Expand Up @@ -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)]
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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),
}
}

Expand Down
2 changes: 1 addition & 1 deletion tests/wpt/metadata/MANIFEST.json
Expand Up @@ -568129,7 +568129,7 @@
"support"
],
"html/syntax/parsing/the-end.html": [
"78b17f053dd3e52b3bf68a5fafc4a4e070e65cfd",
"4b38fe0c7bcb088450cc13f13c805711caf91961",
"testharness"
],
"html/syntax/serializing-html-fragments/.gitkeep": [
Expand Down
24 changes: 20 additions & 4 deletions tests/wpt/web-platform-tests/html/syntax/parsing/the-end.html
Expand Up @@ -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");
</script>

0 comments on commit 3dd015b

Please sign in to comment.