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);