mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
Fire the pageshow event at the end of the page load r=jdm
This commit is contained in:
parent
476a0764f5
commit
3dd015b2d9
4 changed files with 57 additions and 7 deletions
|
@ -47,6 +47,7 @@ none
|
|||
number
|
||||
onchange
|
||||
open
|
||||
pageshow
|
||||
password
|
||||
pause
|
||||
play
|
||||
|
|
|
@ -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),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -568129,7 +568129,7 @@
|
|||
"support"
|
||||
],
|
||||
"html/syntax/parsing/the-end.html": [
|
||||
"78b17f053dd3e52b3bf68a5fafc4a4e070e65cfd",
|
||||
"4b38fe0c7bcb088450cc13f13c805711caf91961",
|
||||
"testharness"
|
||||
],
|
||||
"html/syntax/serializing-html-fragments/.gitkeep": [
|
||||
|
|
|
@ -29,12 +29,28 @@ async_test(function() {
|
|||
}, "load");
|
||||
|
||||
async_test(function() {
|
||||
var seen = false;
|
||||
document.addEventListener("DOMContentLoaded", this.step_func(function() {
|
||||
seen = true;
|
||||
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");
|
||||
}));
|
||||
window.addEventListener("load", this.step_func_done(function() {
|
||||
assert_true(seen, "DOMContentLoaded should be fired before load");
|
||||
}, "pageshow");
|
||||
|
||||
async_test(function() {
|
||||
var seen_dcl = false;
|
||||
var seen_load = false;
|
||||
document.addEventListener("DOMContentLoaded", this.step_func(function() {
|
||||
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("pageshow", this.step_func_done(function() {
|
||||
assert_true(seen_load, "load should be fired before pageshow")
|
||||
}));
|
||||
}, "order");
|
||||
</script>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue