diff options
Diffstat (limited to 'src/components/script/html/hubbub_html_parser.rs')
-rw-r--r-- | src/components/script/html/hubbub_html_parser.rs | 51 |
1 files changed, 36 insertions, 15 deletions
diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs index e96c3eaf893..f8291d3dbf0 100644 --- a/src/components/script/html/hubbub_html_parser.rs +++ b/src/components/script/html/hubbub_html_parser.rs @@ -28,7 +28,7 @@ use servo_util::url::parse_url; use std::ascii::StrAsciiExt; use std::cast; use std::cell::RefCell; -use std::comm::{Port, SharedChan}; +use std::comm::{Port, Chan}; use std::str; use style::Stylesheet; @@ -103,7 +103,7 @@ spawned, collates them, and sends them to the given result channel. * `from_parent` - A port on which to receive new links. */ -fn css_link_listener(to_parent: SharedChan<HtmlDiscoveryMessage>, +fn css_link_listener(to_parent: Chan<HtmlDiscoveryMessage>, from_parent: Port<CSSMessage>, resource_task: ResourceTask) { let mut result_vec = ~[]; @@ -126,7 +126,7 @@ fn css_link_listener(to_parent: SharedChan<HtmlDiscoveryMessage>, } } -fn js_script_listener(to_parent: SharedChan<HtmlDiscoveryMessage>, +fn js_script_listener(to_parent: Chan<HtmlDiscoveryMessage>, from_parent: Port<JSMessage>, resource_task: ResourceTask) { let mut result_vec = ~[]; @@ -140,7 +140,7 @@ fn js_script_listener(to_parent: SharedChan<HtmlDiscoveryMessage>, } Ok((metadata, bytes)) => { result_vec.push(JSFile { - data: str::from_utf8(bytes).to_owned(), + data: str::from_utf8(bytes).unwrap().to_owned(), url: metadata.final_url, }); } @@ -256,9 +256,9 @@ pub fn parse_html(page: &Page, // Spawn a CSS parser to receive links to CSS style sheets. let resource_task2 = resource_task.clone(); - let (discovery_port, discovery_chan) = SharedChan::new(); + let (discovery_port, discovery_chan) = Chan::new(); let stylesheet_chan = discovery_chan.clone(); - let (css_msg_port, css_chan) = SharedChan::new(); + let (css_msg_port, css_chan) = Chan::new(); spawn_named("parse_html:css", proc() { css_link_listener(stylesheet_chan, css_msg_port, resource_task2.clone()); }); @@ -266,7 +266,7 @@ pub fn parse_html(page: &Page, // Spawn a JS parser to receive JavaScript. let resource_task2 = resource_task.clone(); let js_result_chan = discovery_chan.clone(); - let (js_msg_port, js_chan) = SharedChan::new(); + let (js_msg_port, js_chan) = Chan::new(); spawn_named("parse_html:js", proc() { js_script_listener(js_result_chan, js_msg_port, resource_task2.clone()); }); @@ -303,11 +303,16 @@ pub fn parse_html(page: &Page, let next_subpage_id = RefCell::new(next_subpage_id); + let doc_cell = RefCell::new(document); + let tree_handler = hubbub::TreeHandler { create_comment: |data: ~str| { debug!("create comment"); - let comment: JS<Node> = NodeCast::from(&Comment::new(data, document)); - unsafe { comment.to_hubbub_node() } + // NOTE: tmp vars are workaround for lifetime issues. Both required. + let tmp_borrow = doc_cell.borrow(); + let tmp = tmp_borrow.get(); + let comment: JS<Node> = NodeCast::from(&Comment::new(data, *tmp)); + unsafe { comment.to_hubbub_node() } }, create_doctype: |doctype: ~hubbub::Doctype| { debug!("create doctype"); @@ -315,14 +320,20 @@ pub fn parse_html(page: &Page, public_id: public_id, system_id: system_id, force_quirks: _ } = doctype; - let doctype_node = DocumentType::new(name, public_id, system_id, document); + // NOTE: tmp vars are workaround for lifetime issues. Both required. + let tmp_borrow = doc_cell.borrow(); + let tmp = tmp_borrow.get(); + let doctype_node = DocumentType::new(name, public_id, system_id, *tmp); unsafe { doctype_node.to_hubbub_node() } }, create_element: |tag: ~hubbub::Tag| { debug!("create element"); - let mut element = build_element_from_tag(tag.name.clone(), document); + // NOTE: tmp vars are workaround for lifetime issues. Both required. + let tmp_borrow = doc_cell.borrow(); + let tmp = tmp_borrow.get(); + let mut element = build_element_from_tag(tag.name.clone(), *tmp); debug!("-- attach attrs"); for attr in tag.attributes.iter() { @@ -366,7 +377,8 @@ pub fn parse_html(page: &Page, // Subpage Id let subpage_id = next_subpage_id.get(); - next_subpage_id.set(SubpageId(*subpage_id + 1)); + let SubpageId(id_num) = subpage_id; + next_subpage_id.set(SubpageId(id_num + 1)); iframe_element.get_mut().size = Some(IFrameSize { pipeline_id: pipeline_id, @@ -384,7 +396,10 @@ pub fn parse_html(page: &Page, }, create_text: |data: ~str| { debug!("create text"); - let text = Text::new(data, document); + // NOTE: tmp vars are workaround for lifetime issues. Both required. + let tmp_borrow = doc_cell.borrow(); + let tmp = tmp_borrow.get(); + let text = Text::new(data, *tmp); unsafe { text.to_hubbub_node() } }, ref_node: |_| {}, @@ -431,11 +446,17 @@ pub fn parse_html(page: &Page, }, set_quirks_mode: |mode| { debug!("set quirks mode"); - document.get_mut().set_quirks_mode(mode); + // NOTE: tmp vars are workaround for lifetime issues. Both required. + let mut tmp_borrow = doc_cell.borrow_mut(); + let mut tmp = tmp_borrow.get(); + tmp.get_mut().set_quirks_mode(mode); }, encoding_change: |encname| { debug!("encoding change"); - document.get_mut().set_encoding_name(encname); + // NOTE: tmp vars are workaround for lifetime issues. Both required. + let mut tmp_borrow = doc_cell.borrow_mut(); + let mut tmp = tmp_borrow.get(); + tmp.get_mut().set_encoding_name(encname); }, complete_script: |script| { unsafe { |