Auto merge of #14274 - stshine:servo-url-index, r=emilio

Implement range index with the Position enum on ServoUrl

<!-- Please describe your changes on the following line: -->

---
<!-- 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
- [ ] These changes fix #__ (github issue number if applicable).

<!-- Either: -->
- [ ] There are tests for these changes OR
- [X] These changes do not require tests because refactoring

<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->

r? @emilio

<!-- 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/14274)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2016-11-20 12:35:14 -06:00 committed by GitHub
commit ac6a2681ae
6 changed files with 35 additions and 6 deletions

View file

@ -35,7 +35,7 @@ pub type DecodeData = (Mime, Vec<u8>);
pub fn decode(url: &ServoUrl) -> Result<DecodeData, DecodeError> { pub fn decode(url: &ServoUrl) -> Result<DecodeData, DecodeError> {
assert_eq!(url.scheme(), "data"); assert_eq!(url.scheme(), "data");
// Split out content type and data. // Split out content type and data.
let parts: Vec<&str> = url.as_url().unwrap()[Position::BeforePath..Position::AfterQuery].splitn(2, ',').collect(); let parts: Vec<&str> = url[Position::BeforePath..Position::AfterQuery].splitn(2, ',').collect();
if parts.len() != 2 { if parts.len() != 2 {
return Err(DecodeError::InvalidDataUri); return Err(DecodeError::InvalidDataUri);
} }

View file

@ -931,7 +931,7 @@ pub fn load<A, B>(load_data: &LoadData,
// the source rather than rendering the contents of the URL. // the source rather than rendering the contents of the URL.
let viewing_source = doc_url.scheme() == "view-source"; let viewing_source = doc_url.scheme() == "view-source";
if viewing_source { if viewing_source {
doc_url = ServoUrl::parse(&load_data.url.as_url().unwrap()[Position::BeforeUsername..]).unwrap(); doc_url = ServoUrl::parse(&load_data.url[Position::BeforeUsername..]).unwrap();
} }
// Loop to handle redirects. // Loop to handle redirects.

View file

@ -358,7 +358,7 @@ impl ResponseMethods for Response {
} }
fn serialize_without_fragment(url: &ServoUrl) -> &str { fn serialize_without_fragment(url: &ServoUrl) -> &str {
&url.as_url().unwrap()[..Position::AfterQuery] &url[..Position::AfterQuery]
} }
impl Response { impl Response {

View file

@ -878,7 +878,7 @@ impl XMLHttpRequest {
}, },
}; };
*self.response_url.borrow_mut() = metadata.final_url.as_url().unwrap()[..Position::AfterQuery].to_owned(); *self.response_url.borrow_mut() = metadata.final_url[..Position::AfterQuery].to_owned();
// XXXManishearth Clear cache entries in case of a network error // XXXManishearth Clear cache entries in case of a network error
self.process_partial_response(XHRProgress::HeadersReceived( self.process_partial_response(XHRProgress::HeadersReceived(

View file

@ -1739,7 +1739,7 @@ impl ScriptThread {
// Start with the scheme data of the parsed URL; // Start with the scheme data of the parsed URL;
// append question mark and query component, if any; // append question mark and query component, if any;
// append number sign and fragment component if any. // append number sign and fragment component if any.
let encoded = &incomplete.url.as_url().unwrap()[Position::BeforePath..]; let encoded = &incomplete.url[Position::BeforePath..];
// Percent-decode (8.) and UTF-8 decode (9.) // Percent-decode (8.) and UTF-8 decode (9.)
let script_source = percent_decode(encoded.as_bytes()).decode_utf8_lossy(); let script_source = percent_decode(encoded.as_bytes()).decode_utf8_lossy();

View file

@ -19,9 +19,10 @@ extern crate url;
use std::fmt; use std::fmt;
use std::net::IpAddr; use std::net::IpAddr;
use std::ops::{Range, RangeFrom, RangeTo, RangeFull, Index};
use std::path::Path; use std::path::Path;
use std::sync::Arc; use std::sync::Arc;
use url::{Url, Origin}; use url::{Url, Origin, Position};
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "servo", derive(HeapSizeOf, Serialize, Deserialize))] #[cfg_attr(feature = "servo", derive(HeapSizeOf, Serialize, Deserialize))]
@ -152,3 +153,31 @@ impl fmt::Display for ServoUrl {
self.0.fmt(formatter) self.0.fmt(formatter)
} }
} }
impl Index<RangeFull> for ServoUrl {
type Output = str;
fn index(&self, _: RangeFull) -> &str {
&self.0[..]
}
}
impl Index<RangeFrom<Position>> for ServoUrl {
type Output = str;
fn index(&self, range: RangeFrom<Position>) -> &str {
&self.0[range]
}
}
impl Index<RangeTo<Position>> for ServoUrl {
type Output = str;
fn index(&self, range: RangeTo<Position>) -> &str {
&self.0[range]
}
}
impl Index<Range<Position>> for ServoUrl {
type Output = str;
fn index(&self, range: Range<Position>) -> &str {
&self.0[range]
}
}