Auto merge of #7260 - notriddle:issue_7169, r=Ms2ger

Navigate to a new page even when there's a fragment.

Closes #7169

<!-- Reviewable:start -->
[<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/7260)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2015-08-19 01:40:28 -06:00
commit 70b9922eb0
4 changed files with 26 additions and 13 deletions

View file

@ -256,7 +256,7 @@ pub trait DocumentHelpers<'a> {
fn disarm_reflow_timeout(self); fn disarm_reflow_timeout(self);
fn unregister_named_element(self, to_unregister: &Element, id: Atom); fn unregister_named_element(self, to_unregister: &Element, id: Atom);
fn register_named_element(self, element: &Element, id: Atom); fn register_named_element(self, element: &Element, id: Atom);
fn find_fragment_node(self, fragid: DOMString) -> Option<Root<Element>>; fn find_fragment_node(self, fragid: &str) -> Option<Root<Element>>;
fn hit_test(self, point: &Point2D<f32>) -> Option<UntrustedNodeAddress>; fn hit_test(self, point: &Point2D<f32>) -> Option<UntrustedNodeAddress>;
fn get_nodes_under_mouse(self, point: &Point2D<f32>) -> Vec<UntrustedNodeAddress>; fn get_nodes_under_mouse(self, point: &Point2D<f32>) -> Vec<UntrustedNodeAddress>;
fn set_ready_state(self, state: DocumentReadyState); fn set_ready_state(self, state: DocumentReadyState);
@ -513,12 +513,12 @@ impl<'a> DocumentHelpers<'a> for &'a Document {
/// Attempt to find a named element in this page's document. /// Attempt to find a named element in this page's document.
/// https://html.spec.whatwg.org/multipage/#the-indicated-part-of-the-document /// https://html.spec.whatwg.org/multipage/#the-indicated-part-of-the-document
fn find_fragment_node(self, fragid: DOMString) -> Option<Root<Element>> { fn find_fragment_node(self, fragid: &str) -> Option<Root<Element>> {
self.GetElementById(fragid.clone()).or_else(|| { self.GetElementById(fragid.to_owned()).or_else(|| {
let check_anchor = |&node: &&HTMLAnchorElement| { let check_anchor = |&node: &&HTMLAnchorElement| {
let elem = ElementCast::from_ref(node); let elem = ElementCast::from_ref(node);
elem.get_attribute(&ns!(""), &atom!("name")).map_or(false, |attr| { elem.get_attribute(&ns!(""), &atom!("name")).map_or(false, |attr| {
&**attr.r().value() == &*fragid &**attr.r().value() == fragid
}) })
}; };
let doc_node = NodeCast::from_ref(self); let doc_node = NodeCast::from_ref(self);

View file

@ -82,6 +82,7 @@ use util::opts;
use euclid::Rect; use euclid::Rect;
use euclid::point::Point2D; use euclid::point::Point2D;
use hyper::header::{LastModified, Headers}; use hyper::header::{LastModified, Headers};
use hyper::method::Method;
use ipc_channel::ipc::{self, IpcSender}; use ipc_channel::ipc::{self, IpcSender};
use ipc_channel::router::ROUTER; use ipc_channel::router::ROUTER;
use js::glue::CollectServoSizes; use js::glue::CollectServoSizes;
@ -1727,10 +1728,16 @@ impl ScriptTask {
/// for the given pipeline (specifically the "navigate" algorithm). /// for the given pipeline (specifically the "navigate" algorithm).
fn handle_navigate(&self, pipeline_id: PipelineId, subpage_id: Option<SubpageId>, load_data: LoadData) { fn handle_navigate(&self, pipeline_id: PipelineId, subpage_id: Option<SubpageId>, load_data: LoadData) {
// Step 8. // Step 8.
if let Some(fragment) = load_data.url.fragment { {
let nurl = &load_data.url;
if let Some(ref fragment) = nurl.fragment {
let page = get_page(&self.root_page(), pipeline_id); let page = get_page(&self.root_page(), pipeline_id);
let document = page.document(); let document = page.document();
match document.r().find_fragment_node(fragment) { let document = document.r();
let url = document.url();
if url.scheme == nurl.scheme && url.scheme_data == nurl.scheme_data &&
url.query == nurl.query && load_data.method == Method::Get {
match document.find_fragment_node(&*fragment) {
Some(ref node) => { Some(ref node) => {
self.scroll_fragment_point(pipeline_id, node.r()); self.scroll_fragment_point(pipeline_id, node.r());
} }
@ -1738,6 +1745,8 @@ impl ScriptTask {
} }
return; return;
} }
}
}
match subpage_id { match subpage_id {
Some(subpage_id) => { Some(subpage_id) => {
@ -1767,7 +1776,7 @@ impl ScriptTask {
let document = page.document(); let document = page.document();
let fragment_node = window.r().steal_fragment_name() let fragment_node = window.r().steal_fragment_name()
.and_then(|name| document.r().find_fragment_node(name)); .and_then(|name| document.r().find_fragment_node(&*name));
match fragment_node { match fragment_node {
Some(ref node) => self.scroll_fragment_point(pipeline_id, node.r()), Some(ref node) => self.scroll_fragment_point(pipeline_id, node.r()),
None => {} None => {}

View file

@ -0,0 +1,2 @@
<h1>This should change when the link is clicked</h1>
<a href="test_navigate2.html#t">Test link</a> <div id="t">Move</div>

View file

@ -0,0 +1,2 @@
<h1>This should not change when the link is clicked</h1>
<a href="test_navigate2.html#t">Test link</a> <div id="t">Move</div>