diff options
Diffstat (limited to 'components/script')
35 files changed, 107 insertions, 91 deletions
diff --git a/components/script/Cargo.toml b/components/script/Cargo.toml index 634c3e46d09..16642b80e8a 100644 --- a/components/script/Cargo.toml +++ b/components/script/Cargo.toml @@ -45,9 +45,6 @@ path = "../canvas" [dependencies.webdriver_traits] path = "../webdriver_traits" -[dependencies.cssparser] -git = "https://github.com/servo/rust-cssparser" - [dependencies.selectors] git = "https://github.com/servo/rust-selectors" @@ -80,3 +77,6 @@ bitflags = "*" rustc-serialize = "*" libc = "*" hyper = "0.3" +cssparser = "0.3.1" +unicase = "0.1" +num = "0.1.24" diff --git a/components/script/cors.rs b/components/script/cors.rs index a4044a52568..cd7d0828564 100644 --- a/components/script/cors.rs +++ b/components/script/cors.rs @@ -30,6 +30,7 @@ use hyper::header::{ContentType, Host}; use hyper::method::Method; use hyper::status::StatusClass::Success; +use unicase::UniCase; use url::{SchemeData, Url}; use util::task::spawn_named; @@ -185,10 +186,10 @@ impl CORSRequest { // Step 5 - 7 let mut header_names = vec!(); for header in self.headers.iter() { - header_names.push(header.name().to_ascii_lowercase()); + header_names.push(header.name().to_owned()); } header_names.sort(); - preflight.headers.set(AccessControlRequestHeaders(header_names)); + preflight.headers.set(AccessControlRequestHeaders(header_names.into_iter().map(UniCase).collect())); // Step 8 unnecessary, we don't use the request body // Step 9, 10 unnecessary, we're writing our own fetch code @@ -446,8 +447,8 @@ fn is_simple_method(m: &Method) -> bool { pub fn allow_cross_origin_request(req: &CORSRequest, headers: &Headers) -> bool { //FIXME(seanmonstar): use req.headers.get::<AccessControlAllowOrigin>() match headers.get() { - Some(&AccessControlAllowOrigin::AllowStar) => true, // Not always true, depends on credentials mode - Some(&AccessControlAllowOrigin::AllowOrigin(ref url)) => + Some(&AccessControlAllowOrigin::Any) => true, // Not always true, depends on credentials mode + Some(&AccessControlAllowOrigin::Value(ref url)) => url.scheme == req.origin.scheme && url.host() == req.origin.host() && url.port() == req.origin.port(), diff --git a/components/script/dom/activation.rs b/components/script/dom/activation.rs index 047d3a5c4df..dbbe4689e1b 100644 --- a/components/script/dom/activation.rs +++ b/components/script/dom/activation.rs @@ -14,7 +14,7 @@ use dom::node::window_from_node; use std::borrow::ToOwned; /// Trait for elements with defined activation behavior -pub trait Activatable : Copy { +pub trait Activatable { fn as_element(&self) -> Temporary<Element>; // Is this particular instance of the element activatable? diff --git a/components/script/dom/bindings/conversions.rs b/components/script/dom/bindings/conversions.rs index 5055921bb3a..089193cca43 100644 --- a/components/script/dom/bindings/conversions.rs +++ b/components/script/dom/bindings/conversions.rs @@ -56,15 +56,14 @@ use js::jsval::{UndefinedValue, NullValue, BooleanValue, Int32Value, UInt32Value use js::jsval::{StringValue, ObjectValue, ObjectOrNullValue}; use libc; +use num::Float; use std::borrow::ToOwned; use std::default; -use std::marker::MarkerTrait; -use std::num::Float; use std::slice; /// A trait to retrieve the constants necessary to check if a `JSObject` /// implements a given interface. -pub trait IDLInterface: MarkerTrait { +pub trait IDLInterface { /// Returns the prototype ID. fn get_prototype_id() -> PrototypeList::ID; /// Returns the prototype depth, i.e., the number of interfaces this diff --git a/components/script/dom/bindings/js.rs b/components/script/dom/bindings/js.rs index 70dd88c1842..fc22078360f 100644 --- a/components/script/dom/bindings/js.rs +++ b/components/script/dom/bindings/js.rs @@ -641,7 +641,6 @@ impl<T: Reflectable> Root<T> { } } -#[unsafe_destructor] impl<T: Reflectable> Drop for Root<T> { fn drop(&mut self) { self.root_list.unroot(self); diff --git a/components/script/dom/bindings/num.rs b/components/script/dom/bindings/num.rs index 353a395784b..d0ceaae89f8 100644 --- a/components/script/dom/bindings/num.rs +++ b/components/script/dom/bindings/num.rs @@ -5,7 +5,7 @@ //! The `Finite<T>` struct. use core::nonzero::Zeroable; -use std::num::Float; +use num::Float; use std::ops::Deref; /// Encapsulates the IDL restricted float type. diff --git a/components/script/dom/bindings/refcounted.rs b/components/script/dom/bindings/refcounted.rs index 204ef93e023..046ae913b50 100644 --- a/components/script/dom/bindings/refcounted.rs +++ b/components/script/dom/bindings/refcounted.rs @@ -110,7 +110,6 @@ impl<T: Reflectable> Clone for Trusted<T> { } } -#[unsafe_destructor] impl<T: Reflectable> Drop for Trusted<T> { fn drop(&mut self) { let mut refcount = self.refcount.lock().unwrap(); diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index 14d23920ab9..ab325ab804b 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -56,7 +56,7 @@ use script_traits::UntrustedNodeAddress; use msg::compositor_msg::ScriptListener; use msg::constellation_msg::ConstellationChan; use net_traits::image::base::Image; -use util::smallvec::{SmallVec1, SmallVec}; +use util::smallvec::SmallVec1; use util::str::{LengthOrPercentageOrAuto}; use std::cell::{Cell, RefCell}; use std::collections::{HashMap, HashSet}; @@ -64,7 +64,6 @@ use std::collections::hash_state::HashState; use std::ffi::CString; use std::hash::{Hash, Hasher}; use std::intrinsics::return_address; -use std::old_io::timer::Timer; use std::ops::{Deref, DerefMut}; use std::rc::Rc; use std::sync::Arc; @@ -252,7 +251,7 @@ no_jsmanaged_fields!(Receiver<T>); no_jsmanaged_fields!(Rect<T>); no_jsmanaged_fields!(Arc<T>); no_jsmanaged_fields!(Image, ImageCacheChan, ImageCacheTask, ScriptControlChan); -no_jsmanaged_fields!(Atom, Namespace, Timer); +no_jsmanaged_fields!(Atom, Namespace); no_jsmanaged_fields!(Trusted<T>); no_jsmanaged_fields!(PropertyDeclarationBlock); no_jsmanaged_fields!(HashSet<T>); @@ -444,7 +443,6 @@ impl<T: VecRootableType> RootedVec<T> { } } -#[unsafe_destructor] impl<T: VecRootableType> Drop for RootedVec<T> { fn drop(&mut self) { RootedCollectionSet::remove(self); diff --git a/components/script/dom/bindings/utils.rs b/components/script/dom/bindings/utils.rs index 2c96fa2c0dd..55933484165 100644 --- a/components/script/dom/bindings/utils.rs +++ b/components/script/dom/bindings/utils.rs @@ -639,7 +639,7 @@ pub fn validate_and_extract(namespace: Option<DOMString>, qualified_name: &str) let (prefix, local_name) = if qualified_name.contains(":") { // Step 5. - let mut parts = qualified_name.splitn(1, ':'); + let mut parts = qualified_name.splitn(2, ':'); let prefix = parts.next().unwrap(); debug_assert!(!prefix.is_empty()); let local_name = parts.next().unwrap(); diff --git a/components/script/dom/blob.rs b/components/script/dom/blob.rs index 47d03d72082..b27a0c3e7e9 100644 --- a/components/script/dom/blob.rs +++ b/components/script/dom/blob.rs @@ -12,10 +12,10 @@ use dom::bindings::codegen::Bindings::BlobBinding::BlobMethods; use util::str::DOMString; +use num::ToPrimitive; use std::ascii::AsciiExt; use std::borrow::ToOwned; use std::cmp::{min, max}; -use std::num::ToPrimitive; #[jstraceable] pub enum BlobTypeId { diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs index cd02eb18f0e..9390e4db0fb 100644 --- a/components/script/dom/canvasrenderingcontext2d.rs +++ b/components/script/dom/canvasrenderingcontext2d.rs @@ -36,9 +36,9 @@ use net_traits::image::base::Image; use net_traits::image_cache_task::ImageCacheChan; use png::PixelsByColorType; +use num::{Float, ToPrimitive}; use std::borrow::ToOwned; use std::cell::RefCell; -use std::num::{Float, ToPrimitive}; use std::sync::{Arc}; use std::sync::mpsc::{channel, Sender}; @@ -977,7 +977,6 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D> } } -#[unsafe_destructor] impl Drop for CanvasRenderingContext2D { fn drop(&mut self) { self.renderer.send(CanvasMsg::Common(CanvasCommonMsg::Close)).unwrap(); diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index 97c25e56b9c..28ecf365848 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -84,7 +84,6 @@ impl<'a> AutoWorkerReset<'a> { } } -#[unsafe_destructor] impl<'a> Drop for AutoWorkerReset<'a> { fn drop(&mut self) { *self.workerscope.worker.borrow_mut() = self.old_worker.clone(); diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 32f6a23623c..f96dd134082 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -81,6 +81,7 @@ use string_cache::{Atom, QualName}; use url::Url; use js::jsapi::JSRuntime; +use num::ToPrimitive; use std::borrow::ToOwned; use std::collections::HashMap; use std::collections::hash_map::Entry::{Occupied, Vacant}; @@ -88,7 +89,6 @@ use std::ascii::AsciiExt; use std::cell::{Cell, Ref}; use std::default::Default; use std::sync::mpsc::channel; -use std::num::ToPrimitive; use time; #[derive(PartialEq)] diff --git a/components/script/dom/domrect.rs b/components/script/dom/domrect.rs index 08cacc09be2..45c325b3a2d 100644 --- a/components/script/dom/domrect.rs +++ b/components/script/dom/domrect.rs @@ -10,7 +10,6 @@ use dom::bindings::num::Finite; use dom::bindings::utils::{Reflector, reflect_dom_object}; use dom::window::Window; use util::geometry::Au; -use std::num::Float; #[dom_struct] pub struct DOMRect { diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index deb2df56b84..bc3f76079eb 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -64,6 +64,7 @@ use style::properties::{PropertyDeclarationBlock, PropertyDeclaration, parse_sty use style::properties::DeclaredValue::SpecifiedValue; use style::values::specified::CSSColor; use util::namespace; +use util::smallvec::VecLike; use util::str::{DOMString, LengthOrPercentageOrAuto}; use cssparser::Color; @@ -74,16 +75,14 @@ use html5ever::serialize::TraversalScope::{IncludeNode, ChildrenOnly}; use html5ever::tree_builder::{NoQuirks, LimitedQuirks, Quirks}; use selectors::matching::{matches, DeclarationBlock}; use selectors::parser::parse_author_origin_selector_list_from_str; -use selectors::smallvec::VecLike; use string_cache::{Atom, Namespace, QualName}; use url::UrlParser; use std::ascii::AsciiExt; -use std::borrow::{IntoCow, ToOwned}; +use std::borrow::{Cow, ToOwned}; use std::cell::{Ref, RefMut}; use std::default::Default; use std::mem; -use std::old_io::Writer; use std::sync::Arc; #[dom_struct] @@ -257,7 +256,7 @@ impl RawLayoutElementHelpers for Element { }; if let Some(color) = bgcolor { - hints.vec_push(from_declaration( + hints.push(from_declaration( PropertyDeclaration::BackgroundColor(SpecifiedValue( CSSColor { parsed: Color::RGBA(color), authored: None })))); } @@ -1011,9 +1010,9 @@ impl<'a> ElementMethods for JSRef<'a, Element> { fn TagName(self) -> DOMString { let qualified_name = match self.prefix { Some(ref prefix) => { - (format!("{}:{}", &**prefix, &*self.local_name)).into_cow() + Cow::Owned(format!("{}:{}", &**prefix, &*self.local_name)) }, - None => self.local_name.into_cow() + None => Cow::Borrowed(&*self.local_name) }; if self.html_element_in_html_document() { qualified_name.to_ascii_uppercase() diff --git a/components/script/dom/formdata.rs b/components/script/dom/formdata.rs index 98410ef02ef..068c0b591a5 100644 --- a/components/script/dom/formdata.rs +++ b/components/script/dom/formdata.rs @@ -87,7 +87,7 @@ impl<'a> FormDataMethods for JSRef<'a, FormData> { // FIXME(https://github.com/rust-lang/rust/issues/23338) let data = self.data.borrow(); if data.contains_key(&name) { - match data[name][0].clone() { + match data[&name][0].clone() { FormDatum::StringData(ref s) => Some(eString(s.clone())), FormDatum::FileData(ref f) => { Some(eFile(Unrooted::from_js(*f))) diff --git a/components/script/dom/htmlanchorelement.rs b/components/script/dom/htmlanchorelement.rs index 7a13b77b986..4a46235756e 100644 --- a/components/script/dom/htmlanchorelement.rs +++ b/components/script/dom/htmlanchorelement.rs @@ -25,8 +25,8 @@ use dom::node::{Node, NodeHelpers, NodeTypeId, document_from_node, window_from_n use dom::virtualmethods::VirtualMethods; use dom::window::WindowHelpers; +use num::ToPrimitive; use std::default::Default; -use std::num::ToPrimitive; use string_cache::Atom; use util::str::DOMString; diff --git a/components/script/dom/htmlcollection.rs b/components/script/dom/htmlcollection.rs index e4520f6760c..68d8c9cf3e8 100644 --- a/components/script/dom/htmlcollection.rs +++ b/components/script/dom/htmlcollection.rs @@ -167,10 +167,12 @@ impl HTMLCollection { fn traverse(root: JSRef<Node>) -> FilterMap<Skip<TreeIterator>, fn(Temporary<Node>) -> Option<Temporary<Element>>> { + fn to_temporary(node: Temporary<Node>) -> Option<Temporary<Element>> { + ElementCast::to_temporary(node) + } root.traverse_preorder() .skip(1) - .filter_map(ElementCast::to_temporary as - fn(Temporary<Node>) -> Option<Temporary<Element>>) + .filter_map(to_temporary as fn(Temporary<Node>) -> Option<Temporary<Element>>) } } diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs index f42aceced3a..ce70535de74 100644 --- a/components/script/dom/htmlelement.rs +++ b/components/script/dom/htmlelement.rs @@ -176,7 +176,7 @@ fn to_snake_case(name: DOMString) -> DOMString { for ch in name.chars() { if ch.is_uppercase() { attr_name.push('\x2d'); - attr_name.push(ch.to_lowercase()); + attr_name.extend(ch.to_lowercase()); } else { attr_name.push(ch); } diff --git a/components/script/dom/imagedata.rs b/components/script/dom/imagedata.rs index 34bebafb082..99dfbc853a7 100644 --- a/components/script/dom/imagedata.rs +++ b/components/script/dom/imagedata.rs @@ -33,7 +33,7 @@ impl ImageData { if let Some(vec) = data { let js_object_data: *mut uint8_t = JS_GetUint8ClampedArrayData(js_object, cx); - ptr::copy_nonoverlapping(js_object_data, vec.as_ptr(), vec.len()) + ptr::copy_nonoverlapping(vec.as_ptr(), js_object_data, vec.len()) } ImageData { diff --git a/components/script/dom/keyboardevent.rs b/components/script/dom/keyboardevent.rs index 08a268678f0..ab93eddbefa 100644 --- a/components/script/dom/keyboardevent.rs +++ b/components/script/dom/keyboardevent.rs @@ -450,7 +450,7 @@ fn key_location(key: constellation_msg::Key) -> u32 { fn key_charcode(key: constellation_msg::Key, mods: constellation_msg::KeyModifiers) -> Option<u32> { let key = key_value(key, mods); if key.len() == 1 { - Some(key.char_at(0) as u32) + Some(key.chars().next().unwrap() as u32) } else { None } diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index 9143677d1e0..bf9473b9d83 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -179,7 +179,6 @@ impl NodeFlags { } } -#[unsafe_destructor] impl Drop for Node { #[allow(unsafe_code)] fn drop(&mut self) { @@ -987,8 +986,11 @@ impl<'a> NodeHelpers for JSRef<'a, Node> { } fn child_elements(self) -> ChildElementIterator { + fn to_temporary(node: Temporary<Node>) -> Option<Temporary<Element>> { + ElementCast::to_temporary(node) + } self.children() - .filter_map(ElementCast::to_temporary as fn(_) -> _) + .filter_map(to_temporary as fn(_) -> _) .peekable() } diff --git a/components/script/dom/textencoder.rs b/components/script/dom/textencoder.rs index 545402dc4a2..09aeb01c5e4 100644 --- a/components/script/dom/textencoder.rs +++ b/components/script/dom/textencoder.rs @@ -84,7 +84,7 @@ impl<'a> TextEncoderMethods for JSRef<'a, TextEncoder> { let js_object: *mut JSObject = JS_NewUint8Array(cx, length); let js_object_data: *mut uint8_t = JS_GetUint8ArrayData(js_object, cx); - ptr::copy_nonoverlapping(js_object_data, encoded.as_ptr(), length as usize); + ptr::copy_nonoverlapping(encoded.as_ptr(), js_object_data, length as usize); return js_object; } } diff --git a/components/script/dom/userscripts.rs b/components/script/dom/userscripts.rs index 3f4a7e6f268..1910784b0c5 100644 --- a/components/script/dom/userscripts.rs +++ b/components/script/dom/userscripts.rs @@ -28,7 +28,7 @@ pub fn load_script(head: JSRef<HTMLHeadElement>) { p.push("user-agent-js"); p } else { - PathBuf::new(path_str) + PathBuf::from(path_str) }; let mut files = read_dir(&path).ok().expect("Bad path passed to --userscripts") diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index e470dca128f..82dfc614f52 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -61,7 +61,6 @@ impl WebGLRenderingContext { } } -#[unsafe_destructor] impl Drop for WebGLRenderingContext { fn drop(&mut self) { self.renderer.send(CanvasMsg::Common(CanvasCommonMsg::Close)).unwrap(); diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 70046185981..37d79625334 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -61,7 +61,6 @@ use std::collections::HashSet; use std::default::Default; use std::ffi::CString; use std::mem; -use std::num::Float; use std::rc::Rc; use std::sync::mpsc::{channel, Receiver, Sender}; use std::sync::mpsc::TryRecvError::{Empty, Disconnected}; diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index d9e0f57ad8d..4e038609fef 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -56,15 +56,16 @@ use std::ascii::AsciiExt; use std::borrow::ToOwned; use std::cell::{RefCell, Cell}; use std::default::Default; -use std::old_io::Timer; use std::str::FromStr; use std::sync::{Mutex, Arc}; -use std::time::duration::Duration; +use std::sync::mpsc::{channel, Sender, TryRecvError}; +use std::thread::sleep_ms; use time; use url::{Url, UrlParser}; use dom::bindings::codegen::UnionTypes::StringOrURLSearchParams; use dom::bindings::codegen::UnionTypes::StringOrURLSearchParams::{eString, eURLSearchParams}; + pub type SendParam = StringOrURLSearchParams; #[derive(PartialEq, Copy, Clone)] @@ -140,7 +141,7 @@ pub struct XMLHttpRequest { send_flag: Cell<bool>, global: GlobalField, - timer: DOMRefCell<Timer>, + timeout_cancel: DOMRefCell<Option<Sender<()>>>, fetch_time: Cell<i64>, timeout_target: DOMRefCell<Option<Box<ScriptChan+Send>>>, generation_id: Cell<GenerationId>, @@ -174,7 +175,7 @@ impl XMLHttpRequest { upload_events: Cell::new(false), global: GlobalField::from_rooted(&global), - timer: DOMRefCell::new(Timer::new().unwrap()), + timeout_cancel: DOMRefCell::new(None), fetch_time: Cell::new(0), timeout_target: DOMRefCell::new(None), generation_id: Cell::new(GenerationId(0)), @@ -963,7 +964,7 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> { let total = self.response_headers.borrow().get::<ContentLength>().map(|x| {**x as u64}); self.dispatch_progress_event(false, type_, len, total); } - fn set_timeout(self, timeout: u32) { + fn set_timeout(self, duration_ms: u32) { struct XHRTimeout { xhr: TrustedXHRAddress, gen_id: GenerationId, @@ -981,22 +982,23 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> { // Sets up the object to timeout in a given number of milliseconds // This will cancel all previous timeouts - let oneshot = self.timer.borrow_mut() - .oneshot(Duration::milliseconds(timeout as i64)); let timeout_target = (*self.timeout_target.borrow().as_ref().unwrap()).clone(); let global = self.global.root(); let xhr = Trusted::new(global.r().get_cx(), self, global.r().script_chan()); let gen_id = self.generation_id.get(); + let (cancel_tx, cancel_rx) = channel(); + *self.timeout_cancel.borrow_mut() = Some(cancel_tx); spawn_named("XHR:Timer".to_owned(), move || { - match oneshot.recv() { - Ok(_) => { + sleep_ms(duration_ms); + match cancel_rx.try_recv() { + Err(TryRecvError::Empty) => { timeout_target.send(ScriptMsg::RunnableMsg(box XHRTimeout { xhr: xhr, gen_id: gen_id, })).unwrap(); }, - Err(_) => { - // This occurs if xhr.timeout (the sender) goes out of scope (i.e, xhr went out of scope) + Err(TryRecvError::Disconnected) | Ok(()) => { + // This occurs if xhr.timeout_cancel (the sender) goes out of scope (i.e, xhr went out of scope) // or if the oneshot timer was overwritten. The former case should not happen due to pinning. debug!("XHR timeout was overwritten or canceled") } @@ -1006,8 +1008,9 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> { } fn cancel_timeout(self) { - // oneshot() closes the previous channel, canceling the timeout - self.timer.borrow_mut().oneshot(Duration::zero()); + if let Some(cancel_tx) = self.timeout_cancel.borrow_mut().take() { + let _ = cancel_tx.send(()); + } } fn text_response(self) -> DOMString { diff --git a/components/script/horribly_inefficient_timers.rs b/components/script/horribly_inefficient_timers.rs new file mode 100644 index 00000000000..6f3774d3dca --- /dev/null +++ b/components/script/horribly_inefficient_timers.rs @@ -0,0 +1,31 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/// A quick hack to work around the removal of [`std::old_io::timer::Timer`]( +/// http://doc.rust-lang.org/1.0.0-beta/std/old_io/timer/struct.Timer.html ) + +use std::sync::mpsc::{channel, Receiver}; +use std::thread::{spawn, sleep_ms}; + +pub fn oneshot(duration_ms: u32) -> Receiver<()> { + let (tx, rx) = channel(); + spawn(move || { + sleep_ms(duration_ms); + let _ = tx.send(()); + }); + rx +} + +pub fn periodic(duration_ms: u32) -> Receiver<()> { + let (tx, rx) = channel(); + spawn(move || { + loop { + sleep_ms(duration_ms); + if tx.send(()).is_err() { + break + } + } + }); + rx +} diff --git a/components/script/layout_interface.rs b/components/script/layout_interface.rs index 4aa66eb452d..34d21e7e788 100644 --- a/components/script/layout_interface.rs +++ b/components/script/layout_interface.rs @@ -16,7 +16,6 @@ use profile_traits::mem::{Reporter, ReportsChan}; use script_traits::{ScriptControlChan, OpaqueScriptLayoutChannel, UntrustedNodeAddress}; use std::any::Any; use std::sync::mpsc::{channel, Receiver, Sender}; -use std::boxed::BoxAny; use style::animation::PropertyAnimation; use style::media_queries::MediaQueryList; use style::stylesheets::Stylesheet; @@ -88,7 +87,7 @@ pub struct HitTestResponse(pub UntrustedNodeAddress); pub struct MouseOverResponse(pub Vec<UntrustedNodeAddress>); /// Why we're doing reflow. -#[derive(PartialEq, Copy, Debug)] +#[derive(PartialEq, Copy, Clone, Debug)] pub enum ReflowGoal { /// We're reflowing in order to send a display list to the screen. ForDisplay, @@ -185,15 +184,15 @@ pub struct Animation { /// A description of the property animation that is occurring. pub property_animation: PropertyAnimation, /// The start time of the animation, as returned by `time::precise_time_s()`. - pub start_time: f64, + pub start_time: f32, /// The end time of the animation, as returned by `time::precise_time_s()`. - pub end_time: f64, + pub end_time: f32, } impl Animation { /// Returns the duration of this animation in seconds. #[inline] - pub fn duration(&self) -> f64 { + pub fn duration(&self) -> f32 { self.end_time - self.start_time } } diff --git a/components/script/lib.rs b/components/script/lib.rs index 879216a2e27..94cf931436b 100644 --- a/components/script/lib.rs +++ b/components/script/lib.rs @@ -7,13 +7,9 @@ #![feature(collections)] #![feature(core)] #![feature(custom_attribute)] -#![feature(old_io)] -#![feature(path)] #![feature(plugin)] #![feature(rustc_private)] #![feature(std_misc)] -#![feature(unicode)] -#![feature(unsafe_destructor)] #![deny(unsafe_code)] #![allow(non_snake_case)] @@ -39,8 +35,9 @@ extern crate js; extern crate libc; extern crate msg; extern crate net_traits; +extern crate num; extern crate png; -extern crate "rustc-serialize" as rustc_serialize; +extern crate rustc_serialize; extern crate time; extern crate canvas; extern crate profile_traits; @@ -49,6 +46,7 @@ extern crate selectors; extern crate util; #[macro_use] extern crate style; +extern crate unicase; extern crate url; extern crate uuid; extern crate string_cache; @@ -68,4 +66,5 @@ pub mod script_task; mod timers; pub mod textinput; mod devtools; +mod horribly_inefficient_timers; mod webdriver_handlers; diff --git a/components/script/page.rs b/components/script/page.rs index 57c22e4e3e7..67da1a9fc61 100644 --- a/components/script/page.rs +++ b/components/script/page.rs @@ -9,7 +9,6 @@ use dom::node::NodeHelpers; use dom::window::Window; use msg::constellation_msg::PipelineId; -use util::smallvec::SmallVec; use std::cell::Cell; use std::rc::Rc; use url::Url; diff --git a/components/script/parse/html.rs b/components/script/parse/html.rs index d16177e3a07..8bb528c2efe 100644 --- a/components/script/parse/html.rs +++ b/components/script/parse/html.rs @@ -39,13 +39,13 @@ use util::str::DOMString; use util::task_state; use util::task_state::IN_HTML_PARSER; use std::borrow::Cow; -use std::old_io::{Writer, IoResult}; +use std::io::{self, Write}; use url::Url; use html5ever::Attribute; use html5ever::serialize::{Serializable, Serializer, AttrRef}; use html5ever::serialize::TraversalScope; use html5ever::serialize::TraversalScope::{IncludeNode, ChildrenOnly}; -use html5ever::tree_builder::{TreeSink, QuirksMode, NodeOrText, AppendNode, AppendText}; +use html5ever::tree_builder::{TreeSink, QuirksMode, NodeOrText, AppendNode, AppendText, NextParserState}; use string_cache::QualName; use hyper::header::ContentType; @@ -179,10 +179,11 @@ impl<'a> TreeSink for servohtmlparser::Sink { script.map(|script| script.mark_already_started()); } - fn complete_script(&mut self, node: JS<Node>) { + fn complete_script(&mut self, node: JS<Node>) -> NextParserState { let node: Root<Node> = node.root(); let script: Option<JSRef<HTMLScriptElement>> = HTMLScriptElementCast::to_ref(node.r()); script.map(|script| script.prepare()); + NextParserState::Continue } fn reparent_children(&mut self, node: JS<Node>, new_parent: JS<Node>) { @@ -198,8 +199,8 @@ impl<'a> TreeSink for servohtmlparser::Sink { } impl<'a> Serializable for JSRef<'a, Node> { - fn serialize<'wr, Wr: Writer>(&self, serializer: &mut Serializer<'wr, Wr>, - traversal_scope: TraversalScope) -> IoResult<()> { + fn serialize<'wr, Wr: Write>(&self, serializer: &mut Serializer<'wr, Wr>, + traversal_scope: TraversalScope) -> io::Result<()> { let node = *self; match (traversal_scope, node.type_id()) { (_, NodeTypeId::Element(..)) => { diff --git a/components/script/script_task.rs b/components/script/script_task.rs index 24a91c65c34..5e776d4db0f 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -71,7 +71,6 @@ use net_traits::image_cache_task::{ImageCacheChan, ImageCacheTask, ImageCacheRes use net_traits::storage_task::StorageTask; use string_cache::Atom; use util::geometry::to_frac_px; -use util::smallvec::SmallVec; use util::str::DOMString; use util::task::{spawn_named, spawn_named_with_send_on_failure}; use util::task_state; @@ -86,11 +85,11 @@ use js::rust::{Runtime, RtUtils}; use url::Url; use libc; +use num::ToPrimitive; use std::any::Any; use std::borrow::ToOwned; use std::cell::{Cell, RefCell}; use std::collections::HashSet; -use std::num::ToPrimitive; use std::option::Option; use std::ptr; use std::rc::Rc; @@ -98,7 +97,7 @@ use std::result::Result; use std::sync::mpsc::{channel, Sender, Receiver, Select}; use time::Tm; -use hyper::header::ContentType; +use hyper::header::{ContentType, HttpDate}; use hyper::mime::{Mime, TopLevel, SubLevel}; thread_local!(pub static STACK_ROOTS: Cell<Option<RootCollectionPtr>> = Cell::new(None)); @@ -340,7 +339,6 @@ impl<'a> ScriptMemoryFailsafe<'a> { } } -#[unsafe_destructor] impl<'a> Drop for ScriptMemoryFailsafe<'a> { #[allow(unrooted_must_root)] fn drop(&mut self) { @@ -1088,7 +1086,6 @@ impl ScriptTask { self.neutered = true; } } - #[unsafe_destructor] impl<'a> Drop for AutoPageRemover<'a> { fn drop(&mut self) { if !self.neutered { @@ -1127,7 +1124,7 @@ impl ScriptTask { incomplete.window_size).root(); let last_modified: Option<DOMString> = response.metadata.headers.as_ref().and_then(|headers| { - headers.get().map(|&LastModified(ref tm)| dom_last_modified(tm)) + headers.get().map(|&LastModified(HttpDate(ref tm))| dom_last_modified(tm)) }); let content_type = match response.metadata.content_type { @@ -1458,7 +1455,6 @@ impl<'a> AutoDOMEventMarker<'a> { } } -#[unsafe_destructor] impl<'a> Drop for AutoDOMEventMarker<'a> { fn drop(&mut self) { let marker = TimelineMarker::new("DOMEvent".to_owned(), TracingMetadata::IntervalEnd); diff --git a/components/script/textinput.rs b/components/script/textinput.rs index 24383bf3fb4..f99f5e8781c 100644 --- a/components/script/textinput.rs +++ b/components/script/textinput.rs @@ -14,7 +14,6 @@ use util::str::DOMString; use std::borrow::ToOwned; use std::cmp::{min, max}; use std::default::Default; -use std::num::SignedInt; use std::sync::mpsc::channel; #[derive(Copy, Clone, PartialEq)] @@ -310,7 +309,7 @@ impl TextInput { }, // printable characters have single-character key values c if c.len() == 1 => { - self.insert_char(c.char_at(0)); + self.insert_char(c.chars().next().unwrap()); KeyReaction::DispatchInput } "Space" => { diff --git a/components/script/timers.rs b/components/script/timers.rs index 01e9920b3b7..806bc57b85a 100644 --- a/components/script/timers.rs +++ b/components/script/timers.rs @@ -11,6 +11,7 @@ use dom::bindings::utils::Reflectable; use dom::window::ScriptHelpers; use script_task::{ScriptChan, ScriptMsg, TimerSource}; +use horribly_inefficient_timers; use util::task::spawn_named; use util::str::DOMString; @@ -24,8 +25,6 @@ use std::collections::HashMap; use std::sync::mpsc::{channel, Sender}; use std::sync::mpsc::Select; use std::hash::{Hash, Hasher}; -use std::old_io::timer::Timer; -use std::time::duration::Duration; #[derive(PartialEq, Eq)] #[jstraceable] @@ -74,7 +73,6 @@ pub struct TimerManager { } -#[unsafe_destructor] impl Drop for TimerManager { fn drop(&mut self) { for (_, timer_handle) in self.active_timers.borrow_mut().iter_mut() { @@ -141,13 +139,12 @@ impl TimerManager { source: TimerSource, script_chan: Box<ScriptChan+Send>) -> i32 { - let timeout = cmp::max(0, timeout) as u64; + let duration_ms = cmp::max(0, timeout) as u32; let handle = self.next_timer_handle.get(); self.next_timer_handle.set(handle + 1); // Spawn a new timer task; it will dispatch the `ScriptMsg::FireTimer` // to the relevant script handler that will deal with it. - let tm = Timer::new().unwrap(); let (control_chan, control_port) = channel(); let spawn_name = match source { TimerSource::FromWindow(_) if is_interval == IsInterval::Interval => "Window:SetInterval", @@ -156,12 +153,10 @@ impl TimerManager { TimerSource::FromWorker => "Worker:SetTimeout", }.to_owned(); spawn_named(spawn_name, move || { - let mut tm = tm; - let duration = Duration::milliseconds(timeout as i64); let timeout_port = if is_interval == IsInterval::Interval { - tm.periodic(duration) + horribly_inefficient_timers::periodic(duration_ms) } else { - tm.oneshot(duration) + horribly_inefficient_timers::oneshot(duration_ms) }; let control_port = control_port; |