mirror of
https://github.com/servo/servo.git
synced 2025-06-25 17:44:33 +01:00
Rust upgrades
This commit is contained in:
parent
caf1ed9446
commit
bbac8aa5c3
130 changed files with 1236 additions and 985 deletions
|
@ -50,13 +50,13 @@ use servo_util::task::send_on_failure;
|
|||
use servo_util::namespace::Null;
|
||||
use std::cast;
|
||||
use std::cell::{RefCell, Ref, RefMut};
|
||||
use std::comm::{Port, SharedChan};
|
||||
use std::comm::{Port, Chan, Empty, Disconnected, Data};
|
||||
use std::mem::replace;
|
||||
use std::ptr;
|
||||
use std::rc::Rc;
|
||||
use std::task;
|
||||
use std::util::replace;
|
||||
|
||||
use extra::serialize::{Encoder, Encodable};
|
||||
use serialize::{Encoder, Encodable};
|
||||
|
||||
/// Messages used to control the script task.
|
||||
pub enum ScriptMsg {
|
||||
|
@ -90,7 +90,7 @@ pub struct NewLayoutInfo {
|
|||
|
||||
/// Encapsulates external communication with the script task.
|
||||
#[deriving(Clone)]
|
||||
pub struct ScriptChan(SharedChan<ScriptMsg>);
|
||||
pub struct ScriptChan(Chan<ScriptMsg>);
|
||||
|
||||
impl<S: Encoder> Encodable<S> for ScriptChan {
|
||||
fn encode(&self, _s: &mut S) {
|
||||
|
@ -100,7 +100,7 @@ impl<S: Encoder> Encodable<S> for ScriptChan {
|
|||
impl ScriptChan {
|
||||
/// Creates a new script chan.
|
||||
pub fn new() -> (Port<ScriptMsg>, ScriptChan) {
|
||||
let (port, chan) = SharedChan::new();
|
||||
let (port, chan) = Chan::new();
|
||||
(port, ScriptChan(chan))
|
||||
}
|
||||
}
|
||||
|
@ -164,7 +164,7 @@ pub struct PageTreeIterator<'a> {
|
|||
impl PageTree {
|
||||
fn new(id: PipelineId, layout_chan: LayoutChan, window_size: Size2D<uint>) -> PageTree {
|
||||
PageTree {
|
||||
page: unsafe { Rc::new_unchecked(Page {
|
||||
page: unsafe { Rc::new(Page {
|
||||
id: id,
|
||||
frame: RefCell::new(None),
|
||||
layout_chan: layout_chan,
|
||||
|
@ -220,7 +220,7 @@ impl PageTree {
|
|||
.map(|(idx, _)| idx)
|
||||
};
|
||||
match remove_idx {
|
||||
Some(idx) => return Some(self.inner.remove(idx)),
|
||||
Some(idx) => return Some(self.inner.remove(idx).unwrap()),
|
||||
None => {
|
||||
for page_tree in self.inner.mut_iter() {
|
||||
match page_tree.remove(id) {
|
||||
|
@ -237,11 +237,9 @@ impl PageTree {
|
|||
impl<'a> Iterator<Rc<Page>> for PageTreeIterator<'a> {
|
||||
fn next(&mut self) -> Option<Rc<Page>> {
|
||||
if !self.stack.is_empty() {
|
||||
let next = self.stack.pop();
|
||||
{
|
||||
for child in next.inner.mut_iter() {
|
||||
self.stack.push(child);
|
||||
}
|
||||
let mut next = self.stack.pop().unwrap();
|
||||
for child in next.inner.mut_iter() {
|
||||
self.stack.push(child);
|
||||
}
|
||||
Some(next.page.clone())
|
||||
} else {
|
||||
|
@ -307,7 +305,7 @@ impl Page {
|
|||
|
||||
pub fn get_url(&self) -> Url {
|
||||
let url = self.url();
|
||||
url.get().get_ref().first().clone()
|
||||
url.get().get_ref().ref0().clone()
|
||||
}
|
||||
|
||||
/// Sends a ping to layout and waits for the response. The response will arrive when the
|
||||
|
@ -319,11 +317,14 @@ impl Page {
|
|||
match join_port {
|
||||
Some(ref join_port) => {
|
||||
match join_port.try_recv() {
|
||||
None => {
|
||||
Empty => {
|
||||
info!("script: waiting on layout");
|
||||
join_port.recv();
|
||||
}
|
||||
Some(_) => {}
|
||||
Data(_) => {}
|
||||
Disconnected => {
|
||||
fail!("Layout task failed while script was waiting for a result.");
|
||||
}
|
||||
}
|
||||
|
||||
debug!("script: layout joined")
|
||||
|
@ -339,7 +340,8 @@ impl Page {
|
|||
response_port: Port<T>)
|
||||
-> T {
|
||||
self.join_layout();
|
||||
self.layout_chan.send(QueryMsg(query));
|
||||
let LayoutChan(ref chan) = self.layout_chan;
|
||||
chan.send(QueryMsg(query));
|
||||
response_port.recv()
|
||||
}
|
||||
|
||||
|
@ -397,7 +399,8 @@ impl Page {
|
|||
id: *last_reflow_id.get(),
|
||||
};
|
||||
|
||||
self.layout_chan.send(ReflowMsg(reflow));
|
||||
let LayoutChan(ref chan) = self.layout_chan;
|
||||
chan.send(ReflowMsg(reflow));
|
||||
|
||||
debug!("script: layout forked")
|
||||
}
|
||||
|
@ -494,7 +497,7 @@ impl ScriptTask {
|
|||
let js_runtime = js::rust::rt();
|
||||
|
||||
unsafe {
|
||||
Rc::new_unchecked(ScriptTask {
|
||||
Rc::new(ScriptTask {
|
||||
page_tree: RefCell::new(PageTree::new(id, layout_chan, window_size)),
|
||||
|
||||
image_cache_task: img_cache_task,
|
||||
|
@ -530,9 +533,9 @@ impl ScriptTask {
|
|||
resource_task: ResourceTask,
|
||||
image_cache_task: ImageCacheTask,
|
||||
window_size: Size2D<uint>) {
|
||||
let mut builder = task::task();
|
||||
send_on_failure(&mut builder, FailureMsg(failure_msg), (*constellation_chan).clone());
|
||||
builder.name("ScriptTask");
|
||||
let mut builder = task::task().named("ScriptTask");
|
||||
let ConstellationChan(const_chan) = constellation_chan.clone();
|
||||
send_on_failure(&mut builder, FailureMsg(failure_msg), const_chan);
|
||||
builder.spawn(proc() {
|
||||
let script_task = ScriptTask::new(id,
|
||||
compositor as ~ScriptListener,
|
||||
|
@ -593,8 +596,8 @@ impl ScriptTask {
|
|||
}
|
||||
|
||||
match self.port.try_recv() {
|
||||
None => break,
|
||||
Some(ev) => event = ev,
|
||||
Empty | Disconnected => break,
|
||||
Data(ev) => event = ev,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -683,7 +686,8 @@ impl ScriptTask {
|
|||
/// Handles a navigate forward or backward message.
|
||||
/// TODO(tkuehn): is it ever possible to navigate only on a subframe?
|
||||
fn handle_navigate_msg(&self, direction: NavigationDirection) {
|
||||
self.constellation_chan.send(constellation_msg::NavigateMsg(direction));
|
||||
let ConstellationChan(ref chan) = self.constellation_chan;
|
||||
chan.send(constellation_msg::NavigateMsg(direction));
|
||||
}
|
||||
|
||||
/// Window was resized, but this script was not active, so don't reflow yet
|
||||
|
@ -696,7 +700,7 @@ impl ScriptTask {
|
|||
let mut page_url = page.mut_url();
|
||||
let last_loaded_url = replace(page_url.get(), None);
|
||||
for url in last_loaded_url.iter() {
|
||||
*page_url.get() = Some((url.first(), true));
|
||||
*page_url.get() = Some((url.ref0().clone(), true));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -823,19 +827,22 @@ impl ScriptTask {
|
|||
js_scripts = Some(scripts);
|
||||
}
|
||||
Some(HtmlDiscoveredStyle(sheet)) => {
|
||||
page.layout_chan.send(AddStylesheetMsg(sheet));
|
||||
let LayoutChan(ref chan) = page.layout_chan;
|
||||
chan.send(AddStylesheetMsg(sheet));
|
||||
}
|
||||
Some(HtmlDiscoveredIFrame((iframe_url, subpage_id, sandboxed))) => {
|
||||
page.next_subpage_id.set(SubpageId(*subpage_id + 1));
|
||||
let SubpageId(num) = subpage_id;
|
||||
page.next_subpage_id.set(SubpageId(num + 1));
|
||||
let sandboxed = if sandboxed {
|
||||
IFrameSandboxed
|
||||
} else {
|
||||
IFrameUnsandboxed
|
||||
};
|
||||
self.constellation_chan.send(LoadIframeUrlMsg(iframe_url,
|
||||
pipeline_id,
|
||||
subpage_id,
|
||||
sandboxed));
|
||||
let ConstellationChan(ref chan) = self.constellation_chan;
|
||||
chan.send(LoadIframeUrlMsg(iframe_url,
|
||||
pipeline_id,
|
||||
subpage_id,
|
||||
sandboxed));
|
||||
}
|
||||
None => break
|
||||
}
|
||||
|
@ -893,9 +900,10 @@ impl ScriptTask {
|
|||
wintarget.get_mut().dispatch_event_with_target(&winclone, Some(doctarget), &mut event);
|
||||
|
||||
let mut fragment_node = page.fragment_node.borrow_mut();
|
||||
*fragment_node.get() = fragment.map_default(None, |fragid| self.find_fragment_node(page, fragid));
|
||||
*fragment_node.get() = fragment.map_or(None, |fragid| self.find_fragment_node(page, fragid));
|
||||
|
||||
self.constellation_chan.send(LoadCompleteMsg(page.id, url));
|
||||
let ConstellationChan(ref chan) = self.constellation_chan;
|
||||
chan.send(LoadCompleteMsg(page.id, url));
|
||||
}
|
||||
|
||||
fn find_fragment_node(&self, page: &Page, fragid: ~str) -> Option<JS<Element>> {
|
||||
|
@ -908,7 +916,7 @@ impl ScriptTask {
|
|||
let mut anchors = doc_node.traverse_preorder().filter(|node| node.is_anchor_element());
|
||||
anchors.find(|node| {
|
||||
let elem: JS<Element> = ElementCast::to(node);
|
||||
elem.get().get_attribute(Null, "name").map_default(false, |attr| {
|
||||
elem.get().get_attribute(Null, "name").map_or(false, |attr| {
|
||||
attr.get().value_ref() == fragid
|
||||
})
|
||||
}).map(|node| ElementCast::to(&node))
|
||||
|
@ -1121,7 +1129,8 @@ impl ScriptTask {
|
|||
None => {}
|
||||
}
|
||||
} else {
|
||||
self.constellation_chan.send(LoadUrlMsg(page.id, url));
|
||||
let ConstellationChan(ref chan) = self.constellation_chan;
|
||||
chan.send(LoadUrlMsg(page.id, url));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1133,7 +1142,8 @@ fn shut_down_layout(page: &Page) {
|
|||
|
||||
// Tell the layout task to begin shutting down.
|
||||
let (response_port, response_chan) = Chan::new();
|
||||
page.layout_chan.send(layout_interface::PrepareToExitMsg(response_chan));
|
||||
let LayoutChan(ref chan) = page.layout_chan;
|
||||
chan.send(layout_interface::PrepareToExitMsg(response_chan));
|
||||
response_port.recv();
|
||||
|
||||
// Destroy all nodes. Setting frame and js_info to None will trigger our
|
||||
|
@ -1149,5 +1159,5 @@ fn shut_down_layout(page: &Page) {
|
|||
*js_info.get() = None;
|
||||
|
||||
// Destroy the layout task. If there were node leaks, layout will now crash safely.
|
||||
page.layout_chan.send(layout_interface::ExitNowMsg);
|
||||
chan.send(layout_interface::ExitNowMsg);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue