mirror of
https://github.com/servo/servo.git
synced 2025-07-24 15:50:21 +01:00
Reorganize document creation so it occurs after we have a final URL.
This commit is contained in:
parent
94de93b3a3
commit
542e8d52d5
2 changed files with 48 additions and 49 deletions
|
@ -210,8 +210,7 @@ impl<'a> DocumentHelpers<'a> for JSRef<'a, Document> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn url(self) -> Url {
|
fn url(self) -> Url {
|
||||||
let window = self.window().root();
|
self.url.clone()
|
||||||
window.page().get_url()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn quirks_mode(self) -> QuirksMode {
|
fn quirks_mode(self) -> QuirksMode {
|
||||||
|
|
|
@ -787,42 +787,9 @@ impl ScriptTask {
|
||||||
|
|
||||||
let is_javascript = url.scheme.as_slice() == "javascript";
|
let is_javascript = url.scheme.as_slice() == "javascript";
|
||||||
|
|
||||||
let cx = self.js_context.borrow();
|
|
||||||
let cx = cx.as_ref().unwrap();
|
|
||||||
// Create the window and document objects.
|
|
||||||
let window = Window::new(cx.ptr,
|
|
||||||
page.clone(),
|
|
||||||
self.chan.clone(),
|
|
||||||
self.control_chan.clone(),
|
|
||||||
self.compositor.borrow_mut().dup(),
|
|
||||||
self.image_cache_task.clone()).root();
|
|
||||||
let doc_url = if is_javascript {
|
|
||||||
let doc_url = last_url.unwrap_or_else(|| {
|
|
||||||
Url::parse("about:blank").unwrap()
|
|
||||||
});
|
|
||||||
*page.mut_url() = Some((doc_url.clone(), true));
|
|
||||||
doc_url
|
|
||||||
} else {
|
|
||||||
url.clone()
|
|
||||||
};
|
|
||||||
let document = Document::new(window.r(), Some(doc_url.clone()),
|
|
||||||
IsHTMLDocument::HTMLDocument, None,
|
|
||||||
DocumentSource::FromParser).root();
|
|
||||||
|
|
||||||
window.r().init_browser_context(document.r());
|
|
||||||
|
|
||||||
self.compositor.borrow_mut().set_ready_state(pipeline_id, Loading);
|
self.compositor.borrow_mut().set_ready_state(pipeline_id, Loading);
|
||||||
|
|
||||||
{
|
let (mut parser_input, final_url, last_modified) = if !is_javascript {
|
||||||
// Create the root frame.
|
|
||||||
let mut frame = page.mut_frame();
|
|
||||||
*frame = Some(Frame {
|
|
||||||
document: JS::from_rooted(document.r()),
|
|
||||||
window: JS::from_rooted(window.r()),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
let (parser_input, final_url) = if !is_javascript {
|
|
||||||
// Wait for the LoadResponse so that the parser knows the final URL.
|
// Wait for the LoadResponse so that the parser knows the final URL.
|
||||||
let (input_chan, input_port) = channel();
|
let (input_chan, input_port) = channel();
|
||||||
self.resource_task.send(ControlMsg::Load(NetLoadData {
|
self.resource_task.send(ControlMsg::Load(NetLoadData {
|
||||||
|
@ -836,28 +803,61 @@ impl ScriptTask {
|
||||||
|
|
||||||
let load_response = input_port.recv().unwrap();
|
let load_response = input_port.recv().unwrap();
|
||||||
|
|
||||||
load_response.metadata.headers.as_ref().map(|headers| {
|
let last_modified = load_response.metadata.headers.as_ref().and_then(|headers| {
|
||||||
headers.get().map(|&LastModified(ref tm)| {
|
headers.get().map(|&LastModified(ref tm)| tm.clone())
|
||||||
document.r().set_last_modified(dom_last_modified(tm));
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
let final_url = load_response.metadata.final_url.clone();
|
let final_url = load_response.metadata.final_url.clone();
|
||||||
|
|
||||||
{
|
(HTMLInput::InputUrl(load_response), final_url, last_modified)
|
||||||
// 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((final_url.clone(), true));
|
|
||||||
}
|
|
||||||
|
|
||||||
(HTMLInput::InputUrl(load_response), final_url)
|
|
||||||
} else {
|
} else {
|
||||||
|
let doc_url = last_url.unwrap_or_else(|| {
|
||||||
|
Url::parse("about:blank").unwrap()
|
||||||
|
});
|
||||||
|
(HTMLInput::InputString("".to_owned()), doc_url, None)
|
||||||
|
};
|
||||||
|
|
||||||
|
// 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((final_url.clone(), true));
|
||||||
|
}
|
||||||
|
|
||||||
|
let cx = self.js_context.borrow();
|
||||||
|
let cx = cx.as_ref().unwrap();
|
||||||
|
// Create the window and document objects.
|
||||||
|
let window = Window::new(cx.ptr,
|
||||||
|
page.clone(),
|
||||||
|
self.chan.clone(),
|
||||||
|
self.control_chan.clone(),
|
||||||
|
self.compositor.borrow_mut().dup(),
|
||||||
|
self.image_cache_task.clone()).root();
|
||||||
|
|
||||||
|
let document = Document::new(window.r(), Some(final_url.clone()),
|
||||||
|
IsHTMLDocument::HTMLDocument, None,
|
||||||
|
DocumentSource::FromParser).root();
|
||||||
|
if let Some(tm) = last_modified {
|
||||||
|
document.set_last_modified(dom_last_modified(&tm));
|
||||||
|
}
|
||||||
|
window.r().init_browser_context(document.r());
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
// Create the root frame.
|
||||||
|
let mut frame = page.mut_frame();
|
||||||
|
*frame = Some(Frame {
|
||||||
|
document: JS::from_rooted(document.r()),
|
||||||
|
window: JS::from_rooted(window.r()),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if is_javascript {
|
||||||
let evalstr = load_data.url.non_relative_scheme_data().unwrap();
|
let evalstr = load_data.url.non_relative_scheme_data().unwrap();
|
||||||
let jsval = window.r().evaluate_js_on_global_with_result(evalstr);
|
let jsval = window.r().evaluate_js_on_global_with_result(evalstr);
|
||||||
let strval = FromJSValConvertible::from_jsval(self.get_cx(), jsval,
|
let strval = FromJSValConvertible::from_jsval(self.get_cx(), jsval,
|
||||||
StringificationBehavior::Empty);
|
StringificationBehavior::Empty);
|
||||||
(HTMLInput::InputString(strval.unwrap_or("".to_owned())), doc_url)
|
parser_input = HTMLInput::InputString(strval.unwrap_or("".to_owned()));
|
||||||
};
|
};
|
||||||
|
|
||||||
parse_html(document.r(), parser_input, &final_url);
|
parse_html(document.r(), parser_input, &final_url);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue