From 587717bc724a575ffbad5772bb757958244823ed Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Tue, 27 Oct 2015 19:52:19 -0700 Subject: [PATCH] script: Make timer events e10s-safe. Closes #8235. --- components/compositing/constellation.rs | 2 +- components/compositing/pipeline.rs | 7 ++- components/compositing/timer_scheduler.rs | 11 +++-- components/msg/compositor_msg.rs | 1 + components/script/dom/bindings/global.rs | 3 +- components/script/dom/bindings/trace.rs | 9 +--- .../script/dom/dedicatedworkerglobalscope.rs | 43 +++++------------ components/script/dom/window.rs | 15 +++--- components/script/dom/workerglobalscope.rs | 12 ++--- components/script/script_task.rs | 24 +++------- components/script/timers.rs | 12 ++--- components/script_traits/lib.rs | 24 +++++----- ports/gonk/Cargo.lock | 46 ++++++++++--------- 13 files changed, 90 insertions(+), 119 deletions(-) diff --git a/components/compositing/constellation.rs b/components/compositing/constellation.rs index d0c5003f9086..9baffe700e84 100644 --- a/components/compositing/constellation.rs +++ b/components/compositing/constellation.rs @@ -138,7 +138,7 @@ pub struct Constellation { /// A list of in-process senders to `WebGLPaintTask`s. webgl_paint_tasks: Vec>, - scheduler_chan: Sender, + scheduler_chan: IpcSender, } /// State needed to construct a constellation. diff --git a/components/compositing/pipeline.rs b/components/compositing/pipeline.rs index ad425224d265..b94fb763e4ef 100644 --- a/components/compositing/pipeline.rs +++ b/components/compositing/pipeline.rs @@ -68,6 +68,9 @@ pub struct CompositionPipeline { } /// Initial setup data needed to construct a pipeline. +/// +/// *DO NOT* add any Senders to this unless you absolutely know what you're doing, or pcwalton will +/// have to rewrite your code. Use IPC senders instead. pub struct InitialPipelineState { /// The ID of the pipeline to create. pub id: PipelineId, @@ -77,7 +80,7 @@ pub struct InitialPipelineState { /// A channel to the associated constellation. pub constellation_chan: ConstellationChan, /// A channel to schedule timer events. - pub scheduler_chan: Sender, + pub scheduler_chan: IpcSender, /// A channel to the compositor. pub compositor_proxy: Box, /// A channel to the developer tools, if applicable. @@ -320,7 +323,7 @@ pub struct PipelineContent { id: PipelineId, parent_info: Option<(PipelineId, SubpageId)>, constellation_chan: ConstellationChan, - scheduler_chan: Sender, + scheduler_chan: IpcSender, compositor_proxy: Box, devtools_chan: Option>, image_cache_task: ImageCacheTask, diff --git a/components/compositing/timer_scheduler.rs b/components/compositing/timer_scheduler.rs index d29137be7880..bbc6e307b0a1 100644 --- a/components/compositing/timer_scheduler.rs +++ b/components/compositing/timer_scheduler.rs @@ -3,6 +3,8 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use euclid::length::Length; +use ipc_channel::ipc::{self, IpcSender}; +use ipc_channel::router::ROUTER; use num::traits::Saturating; use script_traits::{MsDuration, NsDuration, precise_time_ms, precise_time_ns}; use script_traits::{TimerEvent, TimerEventRequest}; @@ -11,7 +13,7 @@ use std::cmp::{self, Ord}; use std::collections::BinaryHeap; use std::sync::Arc; use std::sync::atomic::{self, AtomicBool}; -use std::sync::mpsc::{channel, Receiver, Select, Sender}; +use std::sync::mpsc::{channel, Receiver, Select}; use std::thread::{self, spawn, Thread}; use util::task::spawn_named; @@ -107,11 +109,11 @@ enum Task { } impl TimerScheduler { - pub fn start() -> Sender { - let (chan, port) = channel(); + pub fn start() -> IpcSender { + let (chan, port) = ipc::channel().unwrap(); let timer_scheduler = TimerScheduler { - port: port, + port: ROUTER.route_ipc_receiver_to_new_mpsc_receiver(port), scheduled_events: RefCell::new(BinaryHeap::new()), @@ -126,6 +128,7 @@ impl TimerScheduler { } fn run_event_loop(&self) { + loop { match self.receive_next_task() { Some(Task::HandleRequest(request)) => self.handle_request(request), diff --git a/components/msg/compositor_msg.rs b/components/msg/compositor_msg.rs index a0548d308739..240f77505051 100644 --- a/components/msg/compositor_msg.rs +++ b/components/msg/compositor_msg.rs @@ -169,3 +169,4 @@ pub enum EventResult { DefaultAllowed, DefaultPrevented, } + diff --git a/components/script/dom/bindings/global.rs b/components/script/dom/bindings/global.rs index a1a1c68c8c01..462f1079ef0c 100644 --- a/components/script/dom/bindings/global.rs +++ b/components/script/dom/bindings/global.rs @@ -23,7 +23,6 @@ use net_traits::ResourceTask; use profile_traits::mem; use script_task::{CommonScriptMsg, ScriptChan, ScriptPort, ScriptTask}; use script_traits::TimerEventRequest; -use std::sync::mpsc::Sender; use url::Url; use util::mem::HeapSizeOf; @@ -99,7 +98,7 @@ impl<'a> GlobalRef<'a> { } /// Get the scheduler channel to request timer events. - pub fn scheduler_chan(&self) -> Sender { + pub fn scheduler_chan(&self) -> IpcSender { match *self { GlobalRef::Window(window) => window.scheduler_chan(), GlobalRef::Worker(worker) => worker.scheduler_chan(), diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index 156239eb2732..e05e29cb0179 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -60,7 +60,7 @@ use net_traits::storage_task::StorageType; use profile_traits::mem::ProfilerChan as MemProfilerChan; use profile_traits::time::ProfilerChan as TimeProfilerChan; use script_task::ScriptChan; -use script_traits::{TimerEventChan, TimerEventId, TimerSource, UntrustedNodeAddress}; +use script_traits::{TimerEventId, TimerSource, UntrustedNodeAddress}; use selectors::parser::PseudoElement; use serde::{Deserialize, Serialize}; use smallvec::SmallVec; @@ -316,13 +316,6 @@ impl JSTraceable for Box { } } -impl JSTraceable for Box { - #[inline] - fn trace(&self, _trc: *mut JSTracer) { - // Do nothing - } -} - impl JSTraceable for Box { #[inline] fn trace(&self, _trc: *mut JSTracer) { diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index 2c9a6f9f629c..562b871ada88 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -19,7 +19,7 @@ use dom::messageevent::MessageEvent; use dom::worker::{SimpleWorkerErrorHandler, TrustedWorkerAddress, WorkerMessageHandler}; use dom::workerglobalscope::WorkerGlobalScope; use dom::workerglobalscope::WorkerGlobalScopeInit; -use ipc_channel::ipc::IpcReceiver; +use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; use ipc_channel::router::ROUTER; use js::jsapi::{HandleValue, JSContext, RootedValue}; use js::jsapi::{JSAutoCompartment, JSAutoRequest}; @@ -30,7 +30,7 @@ use net_traits::load_whole_resource; use rand::random; use script_task::ScriptTaskEventCategory::WorkerEvent; use script_task::{ScriptTask, ScriptChan, ScriptPort, StackRootTLS, CommonScriptMsg}; -use script_traits::{TimerEvent, TimerEventChan, TimerSource}; +use script_traits::{TimerEvent, TimerSource}; use std::mem::replace; use std::rc::Rc; use std::sync::mpsc::{Receiver, RecvError, Select, Sender, channel}; @@ -102,29 +102,6 @@ impl ScriptPort for Receiver<(TrustedWorkerAddress, WorkerScriptMsg)> { } } -/// A TimerEventChan that can be cloned freely and will silently send a TrustedWorkerAddress -/// with timer events. While this SendableWorkerScriptChan is alive, the associated Worker -/// object will remain alive. -struct WorkerThreadTimerEventChan { - sender: Sender<(TrustedWorkerAddress, TimerEvent)>, - worker: TrustedWorkerAddress, -} - -impl TimerEventChan for WorkerThreadTimerEventChan { - fn send(&self, event: TimerEvent) -> Result<(), ()> { - self.sender - .send((self.worker.clone(), event)) - .map_err(|_| ()) - } - - fn clone(&self) -> Box { - box WorkerThreadTimerEventChan { - sender: self.sender.clone(), - worker: self.worker.clone(), - } - } -} - /// Set the `worker` field of a related DedicatedWorkerGlobalScope object to a particular /// value for the duration of this object's lifetime. This ensures that the related Worker /// object only lives as long as necessary (ie. while events are being executed), while @@ -182,7 +159,7 @@ impl DedicatedWorkerGlobalScope { parent_sender: Box, own_sender: Sender<(TrustedWorkerAddress, WorkerScriptMsg)>, receiver: Receiver<(TrustedWorkerAddress, WorkerScriptMsg)>, - timer_event_chan: Box, + timer_event_chan: IpcSender, timer_event_port: Receiver<(TrustedWorkerAddress, TimerEvent)>) -> DedicatedWorkerGlobalScope { @@ -206,7 +183,7 @@ impl DedicatedWorkerGlobalScope { parent_sender: Box, own_sender: Sender<(TrustedWorkerAddress, WorkerScriptMsg)>, receiver: Receiver<(TrustedWorkerAddress, WorkerScriptMsg)>, - timer_event_chan: Box, + timer_event_chan: IpcSender, timer_event_port: Receiver<(TrustedWorkerAddress, TimerEvent)>) -> Root { let scope = box DedicatedWorkerGlobalScope::new_inherited( @@ -248,15 +225,17 @@ impl DedicatedWorkerGlobalScope { ROUTER.route_ipc_receiver_to_mpsc_sender(from_devtools_receiver, devtools_mpsc_chan); let (timer_tx, timer_rx) = channel(); - let timer_event_chan = box WorkerThreadTimerEventChan { - sender: timer_tx, - worker: worker.clone(), - }; + let (timer_ipc_chan, timer_ipc_port) = ipc::channel().unwrap(); + let worker_for_route = worker.clone(); + ROUTER.add_route(timer_ipc_port.to_opaque(), box move |message| { + let event = message.to().unwrap(); + timer_tx.send((worker_for_route.clone(), event)).unwrap(); + }); let global = DedicatedWorkerGlobalScope::new( init, url, id, devtools_mpsc_port, runtime.clone(), parent_sender.clone(), own_sender, receiver, - timer_event_chan, timer_rx); + timer_ipc_chan, timer_rx); // FIXME(njn): workers currently don't have a unique ID suitable for using in reporter // registration (#6631), so we instead use a random number and cross our fingers. let scope = global.upcast::(); diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index afae2923bf5e..d4c04ded8daf 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -53,8 +53,9 @@ use page::Page; use profile_traits::mem; use rustc_serialize::base64::{FromBase64, STANDARD, ToBase64}; use script_task::{ScriptChan, ScriptPort, MainThreadScriptMsg}; -use script_task::{SendableMainThreadScriptChan, MainThreadScriptChan, MainThreadTimerEventChan}; -use script_traits::{ConstellationControlMsg, TimerEventChan, TimerEventId, TimerEventRequest, TimerSource}; +use script_task::{SendableMainThreadScriptChan, MainThreadScriptChan}; +use script_traits::{ConstellationControlMsg, TimerEvent, TimerEventId, TimerEventRequest}; +use script_traits::{TimerSource}; use selectors::parser::PseudoElement; use std::ascii::AsciiExt; use std::borrow::ToOwned; @@ -129,7 +130,7 @@ pub struct Window { session_storage: MutNullableHeap>, local_storage: MutNullableHeap>, #[ignore_heap_size_of = "channels are hard"] - scheduler_chan: Sender, + scheduler_chan: IpcSender, timers: ActiveTimers, next_worker_id: Cell, @@ -1091,7 +1092,7 @@ impl Window { self.constellation_chan.clone() } - pub fn scheduler_chan(&self) -> Sender { + pub fn scheduler_chan(&self) -> IpcSender { self.scheduler_chan.clone() } @@ -1236,8 +1237,8 @@ impl Window { mem_profiler_chan: mem::ProfilerChan, devtools_chan: Option>, constellation_chan: ConstellationChan, - scheduler_chan: Sender, - timer_event_chan: MainThreadTimerEventChan, + scheduler_chan: IpcSender, + timer_event_chan: IpcSender, layout_chan: LayoutChan, id: PipelineId, parent_info: Option<(PipelineId, SubpageId)>, @@ -1271,7 +1272,7 @@ impl Window { session_storage: Default::default(), local_storage: Default::default(), scheduler_chan: scheduler_chan.clone(), - timers: ActiveTimers::new(box timer_event_chan, scheduler_chan), + timers: ActiveTimers::new(timer_event_chan, scheduler_chan), next_worker_id: Cell::new(WorkerId(0)), id: id, parent_info: parent_info, diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs index abf7f9352401..eb16b4c20525 100644 --- a/components/script/dom/workerglobalscope.rs +++ b/components/script/dom/workerglobalscope.rs @@ -24,11 +24,11 @@ use msg::constellation_msg::{ConstellationChan, PipelineId, WorkerId}; use net_traits::{ResourceTask, load_whole_resource}; use profile_traits::mem; use script_task::{CommonScriptMsg, ScriptChan, ScriptPort}; -use script_traits::{TimerEventChan, TimerEventId, TimerEventRequest, TimerSource}; +use script_traits::{TimerEvent, TimerEventId, TimerEventRequest, TimerSource}; use std::cell::Cell; use std::default::Default; use std::rc::Rc; -use std::sync::mpsc::{Receiver, Sender}; +use std::sync::mpsc::Receiver; use timers::{ActiveTimers, IsInterval, TimerCallback}; use url::{Url, UrlParser}; use util::str::DOMString; @@ -44,7 +44,7 @@ pub struct WorkerGlobalScopeInit { pub to_devtools_sender: Option>, pub from_devtools_sender: Option>, pub constellation_chan: ConstellationChan, - pub scheduler_chan: Sender, + pub scheduler_chan: IpcSender, pub worker_id: WorkerId, } @@ -87,7 +87,7 @@ pub struct WorkerGlobalScope { constellation_chan: ConstellationChan, #[ignore_heap_size_of = "Defined in std"] - scheduler_chan: Sender, + scheduler_chan: IpcSender, } impl WorkerGlobalScope { @@ -95,7 +95,7 @@ impl WorkerGlobalScope { worker_url: Url, runtime: Rc, from_devtools_receiver: Receiver, - timer_event_chan: Box) + timer_event_chan: IpcSender) -> WorkerGlobalScope { WorkerGlobalScope { eventtarget: EventTarget::new_inherited(), @@ -139,7 +139,7 @@ impl WorkerGlobalScope { self.constellation_chan.clone() } - pub fn scheduler_chan(&self) -> Sender { + pub fn scheduler_chan(&self) -> IpcSender { self.scheduler_chan.clone() } diff --git a/components/script/script_task.rs b/components/script/script_task.rs index 30bb371667b0..d3bbb82b59aa 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -83,7 +83,7 @@ use script_traits::CompositorEvent::{TouchDownEvent, TouchMoveEvent, TouchUpEven use script_traits::{CompositorEvent, ConstellationControlMsg}; use script_traits::{InitialScriptState, MouseButton, NewLayoutInfo}; use script_traits::{OpaqueScriptLayoutChannel, ScriptState, ScriptTaskFactory}; -use script_traits::{TimerEvent, TimerEventChan, TimerEventRequest, TimerSource}; +use script_traits::{TimerEvent, TimerEventRequest, TimerSource}; use std::any::Any; use std::borrow::ToOwned; use std::cell::{Cell, RefCell}; @@ -320,20 +320,6 @@ impl MainThreadScriptChan { } } -pub struct MainThreadTimerEventChan(Sender); - -impl TimerEventChan for MainThreadTimerEventChan { - fn send(&self, event: TimerEvent) -> Result<(), ()> { - let MainThreadTimerEventChan(ref chan) = *self; - chan.send(event).map_err(|_| ()) - } - - fn clone(&self) -> Box { - let MainThreadTimerEventChan(ref chan) = *self; - box MainThreadTimerEventChan((*chan).clone()) - } -} - pub struct StackRootTLS; impl StackRootTLS { @@ -416,7 +402,7 @@ pub struct ScriptTask { /// List of pipelines that have been owned and closed by this script task. closed_pipelines: RefCell>, - scheduler_chan: Sender, + scheduler_chan: IpcSender, timer_event_chan: Sender, timer_event_port: Receiver, } @@ -1583,6 +1569,10 @@ impl ScriptTask { let mut page_remover = AutoPageRemover::new(self, page_to_remove); let MainThreadScriptChan(ref sender) = self.chan; + let (ipc_timer_event_chan, ipc_timer_event_port) = ipc::channel().unwrap(); + ROUTER.route_ipc_receiver_to_mpsc_sender(ipc_timer_event_port, + self.timer_event_chan.clone()); + // Create the window and document objects. let window = Window::new(self.js_runtime.clone(), page.clone(), @@ -1597,7 +1587,7 @@ impl ScriptTask { self.devtools_chan.clone(), self.constellation_chan.clone(), self.scheduler_chan.clone(), - MainThreadTimerEventChan(self.timer_event_chan.clone()), + ipc_timer_event_chan, incomplete.layout_chan, incomplete.pipeline_id, incomplete.parent_info, diff --git a/components/script/timers.rs b/components/script/timers.rs index 6c982cb1ad44..b132d0ad3f24 100644 --- a/components/script/timers.rs +++ b/components/script/timers.rs @@ -9,16 +9,16 @@ use dom::bindings::global::global_object_for_js_object; use dom::bindings::utils::Reflectable; use dom::window::ScriptHelpers; use euclid::length::Length; +use ipc_channel::ipc::IpcSender; use js::jsapi::{HandleValue, Heap, RootedValue}; use js::jsval::{JSVal, UndefinedValue}; use num::traits::Saturating; use script_traits::{MsDuration, precise_time_ms}; -use script_traits::{TimerEventChan, TimerEventId, TimerEventRequest, TimerSource}; +use script_traits::{TimerEvent, TimerEventId, TimerEventRequest, TimerSource}; use std::cell::Cell; use std::cmp::{self, Ord, Ordering}; use std::default::Default; use std::rc::Rc; -use std::sync::mpsc::Sender; use util::mem::HeapSizeOf; use util::str::DOMString; @@ -29,9 +29,9 @@ pub struct TimerHandle(i32); #[privatize] pub struct ActiveTimers { #[ignore_heap_size_of = "Defined in std"] - timer_event_chan: Box, + timer_event_chan: IpcSender, #[ignore_heap_size_of = "Defined in std"] - scheduler_chan: Sender, + scheduler_chan: IpcSender, next_timer_handle: Cell, timers: DOMRefCell>, suspended_since: Cell>, @@ -116,8 +116,8 @@ impl HeapSizeOf for InternalTimerCallback { } impl ActiveTimers { - pub fn new(timer_event_chan: Box, - scheduler_chan: Sender) + pub fn new(timer_event_chan: IpcSender, + scheduler_chan: IpcSender) -> ActiveTimers { ActiveTimers { timer_event_chan: timer_event_chan, diff --git a/components/script_traits/lib.rs b/components/script_traits/lib.rs index eda5cf1b4593..21d3bfc0b19b 100644 --- a/components/script_traits/lib.rs +++ b/components/script_traits/lib.rs @@ -185,23 +185,20 @@ pub enum CompositorEvent { pub struct OpaqueScriptLayoutChannel(pub (Box, Box)); /// Requests a TimerEvent-Message be sent after the given duration. -pub struct TimerEventRequest(pub Box, pub TimerSource, pub TimerEventId, pub MsDuration); +#[derive(Deserialize, Serialize)] +pub struct TimerEventRequest(pub IpcSender, + pub TimerSource, + pub TimerEventId, + pub MsDuration); /// Notifies the script task to fire due timers. /// TimerSource must be FromWindow when dispatched to ScriptTask and /// must be FromWorker when dispatched to a DedicatedGlobalWorkerScope +#[derive(Deserialize, Serialize)] pub struct TimerEvent(pub TimerSource, pub TimerEventId); -/// A cloneable interface for sending timer events. -pub trait TimerEventChan { - /// Send a timer event to the associated event loop. - fn send(&self, msg: TimerEvent) -> Result<(), ()>; - /// Clone this handle. - fn clone(&self) -> Box; -} - /// Describes the task that requested the TimerEvent. -#[derive(Copy, Clone, HeapSizeOf)] +#[derive(Copy, Clone, HeapSizeOf, Deserialize, Serialize)] pub enum TimerSource { /// The event was requested from a window (ScriptTask). FromWindow(PipelineId), @@ -210,7 +207,7 @@ pub enum TimerSource { } /// The id to be used for a TimerEvent is defined by the corresponding TimerEventRequest. -#[derive(PartialEq, Eq, Copy, Clone, Debug, HeapSizeOf)] +#[derive(PartialEq, Eq, Copy, Clone, Debug, HeapSizeOf, Deserialize, Serialize)] pub struct TimerEventId(pub u32); /// Unit of measurement. @@ -235,6 +232,9 @@ pub fn precise_time_ns() -> NsDuration { } /// Data needed to construct a script thread. +/// +/// NB: *DO NOT* add any Senders or Receivers here! pcwalton will have to rewrite your code if you +/// do! Use IPC senders and receivers instead. pub struct InitialScriptState { /// The ID of the pipeline with which this script thread is associated. pub id: PipelineId, @@ -250,7 +250,7 @@ pub struct InitialScriptState { /// A channel on which messages can be sent to the constellation from script. pub constellation_chan: ConstellationChan, /// A channel to schedule timer events. - pub scheduler_chan: Sender, + pub scheduler_chan: IpcSender, /// Information that script sends out when it panics. pub failure_info: Failure, /// A channel to the resource manager task. diff --git a/ports/gonk/Cargo.lock b/ports/gonk/Cargo.lock index 0b872ec8ec8d..b438139ac6d4 100644 --- a/ports/gonk/Cargo.lock +++ b/ports/gonk/Cargo.lock @@ -57,7 +57,7 @@ dependencies = [ "euclid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_macros 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -81,7 +81,7 @@ dependencies = [ "heapsize_plugin 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_macros 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "skia 0.0.20130412 (git+https://github.com/servo/skia)", "x11 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -147,7 +147,7 @@ dependencies = [ "offscreen_gl_context 0.1.0 (git+https://github.com/ecoal95/rust-offscreen-rendering-context)", "plugins 0.0.1", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_macros 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", ] @@ -234,6 +234,8 @@ dependencies = [ "plugins 0.0.1", "profile_traits 0.0.1", "script_traits 0.0.1", + "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "style_traits 0.0.1", "time 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", "url 0.2.37 (registry+https://github.com/rust-lang/crates.io-index)", @@ -286,7 +288,7 @@ dependencies = [ "encoding 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)", "matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_macros 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -314,7 +316,7 @@ dependencies = [ "plugins 0.0.1", "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_macros 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", "url 0.2.37 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", @@ -331,7 +333,7 @@ dependencies = [ "plugins 0.0.1", "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_macros 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", "url 0.2.37 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", @@ -439,7 +441,7 @@ dependencies = [ "rand 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_macros 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -552,7 +554,7 @@ dependencies = [ "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", "script_traits 0.0.1", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_macros 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "simd 0.1.0 (git+https://github.com/huonw/simd)", "skia 0.0.20130412 (git+https://github.com/servo/skia)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -771,7 +773,7 @@ dependencies = [ "libc 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_macros 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -855,7 +857,7 @@ dependencies = [ "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_macros 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_plugin 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -878,7 +880,7 @@ dependencies = [ "profile_traits 0.0.1", "script_traits 0.0.1", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_macros 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "url 0.2.37 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", ] @@ -994,7 +996,7 @@ dependencies = [ "plugins 0.0.1", "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_macros 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "style_traits 0.0.1", "url 0.2.37 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", @@ -1037,7 +1039,7 @@ dependencies = [ "regex 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", "regex_macros 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_macros 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "stb_image 0.1.0 (git+https://github.com/servo/rust-stb-image)", "url 0.2.37 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", @@ -1103,7 +1105,7 @@ dependencies = [ "libc 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_macros 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "x11 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1215,7 +1217,7 @@ dependencies = [ "ipc-channel 0.1.0 (git+https://github.com/pcwalton/ipc-channel)", "plugins 0.0.1", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_macros 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", "url 0.2.37 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1353,7 +1355,7 @@ dependencies = [ "plugins 0.0.1", "profile_traits 0.0.1", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_macros 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", "url 0.2.37 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", @@ -1384,7 +1386,7 @@ dependencies = [ [[package]] name = "serde_codegen" -version = "0.5.3" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aster 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1403,10 +1405,10 @@ dependencies = [ [[package]] name = "serde_macros" -version = "0.5.3" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde_codegen 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_codegen 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1533,7 +1535,7 @@ dependencies = [ "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_macros 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_plugin 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1555,7 +1557,7 @@ dependencies = [ "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_macros 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "url 0.2.37 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", ] @@ -1689,7 +1691,7 @@ dependencies = [ "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_macros 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", "url 0.2.37 (registry+https://github.com/rust-lang/crates.io-index)",