diff --git a/components/script/parse/html.rs b/components/script/parse/html.rs
index f78949d924c..c629305e931 100644
--- a/components/script/parse/html.rs
+++ b/components/script/parse/html.rs
@@ -33,7 +33,7 @@ use string_cache::QualName;
pub enum HTMLInput {
InputString(String),
- InputUrl(Url),
+ InputUrl(LoadResponse),
}
trait SinkHelpers {
@@ -163,9 +163,8 @@ impl<'a> TreeSink for servohtmlparser::Sink {
pub fn parse_html(document: JSRef,
input: HTMLInput,
- base_url: Url,
- load_response: Option) {
- let parser = ServoHTMLParser::new(Some(base_url.clone()), document).root();
+ url: Url) {
+ let parser = ServoHTMLParser::new(Some(url.clone()), document).root();
let parser: JSRef = *parser;
task_state::enter(IN_HTML_PARSER);
@@ -174,11 +173,10 @@ pub fn parse_html(document: JSRef,
InputString(s) => {
parser.parse_chunk(s);
}
- InputUrl(url) => {
- let load_response = load_response.unwrap();
+ InputUrl(load_response) => {
match load_response.metadata.content_type {
Some((ref t, _)) if t.as_slice().eq_ignore_ascii_case("image") => {
- let page = format!("
", base_url.serialize());
+ let page = format!("
", url.serialize());
parser.parse_chunk(page);
},
_ => {
diff --git a/components/script/script_task.rs b/components/script/script_task.rs
index b36f7733a98..01473c34681 100644
--- a/components/script/script_task.rs
+++ b/components/script/script_task.rs
@@ -744,53 +744,44 @@ impl ScriptTask {
});
}
- let parser_input = if !is_javascript {
- InputUrl(url.clone())
+ let (parser_input, base_url) = if !is_javascript {
+ // Wait for the LoadResponse so that the parser knows the final URL.
+ let (input_chan, input_port) = channel();
+ self.resource_task.send(Load(NetLoadData {
+ url: url,
+ method: load_data.method,
+ headers: load_data.headers,
+ data: load_data.data,
+ cors: None,
+ consumer: input_chan,
+ }));
+
+ let load_response = input_port.recv();
+
+ load_response.metadata.headers.as_ref().map(|headers| {
+ headers.get().map(|&LastModified(ref tm)| {
+ document.set_last_modified(dom_last_modified(tm));
+ });
+ });
+
+ let base_url = load_response.metadata.final_url.clone();
+
+ {
+ // Store the final URL before we start parsing, so that DOM routines
+ // (e.g. HTMLImageElement::update_image) can resolve relative URLs
+ // correctly.
+ *page.mut_url() = Some((base_url.clone(), true));
+ }
+
+ (InputUrl(load_response), base_url)
} else {
let evalstr = load_data.url.non_relative_scheme_data().unwrap();
let jsval = window.evaluate_js_with_result(evalstr);
let strval = FromJSValConvertible::from_jsval(self.get_cx(), jsval, Empty);
- InputString(strval.unwrap_or("".to_string()))
+ (InputString(strval.unwrap_or("".to_string())), doc_url)
};
- let (base_url, load_response) = match parser_input {
- InputUrl(ref url) => {
- // Wait for the LoadResponse so that the parser knows the final URL.
- let (input_chan, input_port) = channel();
- self.resource_task.send(Load(NetLoadData {
- url: url.clone(),
- method: load_data.method,
- headers: load_data.headers,
- data: load_data.data,
- cors: None,
- consumer: input_chan,
- }));
-
- let load_response = input_port.recv();
-
- load_response.metadata.headers.as_ref().map(|headers| {
- headers.get().map(|&LastModified(ref tm)| {
- document.set_last_modified(dom_last_modified(tm));
- });
- });
-
- let base_url = load_response.metadata.final_url.clone();
-
- {
- // Store the final URL before we start parsing, so that DOM routines
- // (e.g. HTMLImageElement::update_image) can resolve relative URLs
- // correctly.
- *page.mut_url() = Some((base_url.clone(), true));
- }
-
- (base_url, Some(load_response))
- },
- InputString(_) => {
- (doc_url, None)
- },
- };
-
- parse_html(*document, parser_input, base_url, load_response);
+ parse_html(*document, parser_input, base_url);
url = page.get_url().clone();
document.set_ready_state(DocumentReadyStateValues::Interactive);