mirror of
https://github.com/servo/servo.git
synced 2025-07-31 19:20:22 +01:00
Auto merge of #21048 - cbrewster:hash_change_history, r=asajeffrey
Track hash changes in session history <!-- Please describe your changes on the following line: --> Adds tracking of hash changes in the session history. --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: --> - [X] `./mach build -d` does not report any errors - [X] `./mach test-tidy` does not report any errors - [X] These changes fix #14970 fix #13437 (github issue number if applicable). <!-- Either: --> - [X] There are tests for these changes OR - [ ] These changes do not require tests because _____ <!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.--> <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/21048) <!-- Reviewable:end -->
This commit is contained in:
commit
a97d8b99ef
22 changed files with 110 additions and 87 deletions
|
@ -85,7 +85,10 @@ impl History {
|
|||
// Step 6
|
||||
let hash_changed = old_url.fragment() != url.fragment();
|
||||
|
||||
// TODO: Step 8 - scroll restoration
|
||||
// Step 8
|
||||
if let Some(fragment) = url.fragment() {
|
||||
document.check_and_scroll_fragment(fragment);
|
||||
}
|
||||
|
||||
// Step 11
|
||||
let state_changed = state_id != self.state_id.get();
|
||||
|
|
|
@ -33,7 +33,10 @@ use dom::cssstyledeclaration::{CSSModificationAccess, CSSStyleDeclaration, CSSSt
|
|||
use dom::customelementregistry::CustomElementRegistry;
|
||||
use dom::document::{AnimationFrameCallback, Document};
|
||||
use dom::element::Element;
|
||||
use dom::event::Event;
|
||||
use dom::eventtarget::EventTarget;
|
||||
use dom::globalscope::GlobalScope;
|
||||
use dom::hashchangeevent::HashChangeEvent;
|
||||
use dom::history::History;
|
||||
use dom::location::Location;
|
||||
use dom::mediaquerylist::{MediaQueryList, WeakMediaQueryListVec};
|
||||
|
@ -1582,13 +1585,33 @@ impl Window {
|
|||
referrer_policy: Option<ReferrerPolicy>) {
|
||||
let doc = self.Document();
|
||||
let referrer_policy = referrer_policy.or(doc.get_referrer_policy());
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#navigating-across-documents
|
||||
if !force_reload && url.as_url()[..Position::AfterQuery] ==
|
||||
doc.url().as_url()[..Position::AfterQuery] {
|
||||
// Step 6
|
||||
if let Some(fragment) = url.fragment() {
|
||||
self.send_to_constellation(ScriptMsg::NavigatedToFragment(url.clone(), replace));
|
||||
doc.check_and_scroll_fragment(fragment);
|
||||
let this = Trusted::new(self);
|
||||
let old_url = doc.url().into_string();
|
||||
let new_url = url.clone().into_string();
|
||||
let task = task!(hashchange_event: move || {
|
||||
let this = this.root();
|
||||
let event = HashChangeEvent::new(
|
||||
&this,
|
||||
atom!("hashchange"),
|
||||
false,
|
||||
false,
|
||||
old_url,
|
||||
new_url);
|
||||
event.upcast::<Event>().fire(this.upcast::<EventTarget>());
|
||||
});
|
||||
// FIXME(nox): Why are errors silenced here?
|
||||
let _ = self.script_chan.send(CommonScriptMsg::Task(
|
||||
ScriptThreadEventCategory::DomEvent,
|
||||
Box::new(self.task_canceller(TaskSourceName::DOMManipulation).wrap_task(task)),
|
||||
self.pipeline_id()
|
||||
));
|
||||
doc.set_url(url.clone());
|
||||
return
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue