aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/bindings/global.rs3
-rw-r--r--components/script/dom/bindings/trace.rs9
-rw-r--r--components/script/dom/dedicatedworkerglobalscope.rs43
-rw-r--r--components/script/dom/window.rs14
-rw-r--r--components/script/dom/workerglobalscope.rs12
-rw-r--r--components/script/script_task.rs24
-rw-r--r--components/script/timers.rs12
7 files changed, 39 insertions, 78 deletions
diff --git a/components/script/dom/bindings/global.rs b/components/script/dom/bindings/global.rs
index c2d1c07c3ae..f3ae21e3212 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::{MsDuration, TimerEventRequest};
-use std::sync::mpsc::Sender;
use timers::{ScheduledCallback, TimerHandle};
use url::Url;
use util::mem::HeapSizeOf;
@@ -100,7 +99,7 @@ impl<'a> GlobalRef<'a> {
}
/// Get the scheduler channel to request timer events.
- pub fn scheduler_chan(&self) -> Sender<TimerEventRequest> {
+ pub fn scheduler_chan(&self) -> IpcSender<TimerEventRequest> {
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 cd8fab7e56f..e05670b9a6d 100644
--- a/components/script/dom/bindings/trace.rs
+++ b/components/script/dom/bindings/trace.rs
@@ -62,7 +62,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 selectors::states::*;
use serde::{Deserialize, Serialize};
@@ -302,13 +302,6 @@ impl JSTraceable for Box<ScriptChan + Send> {
}
}
-impl JSTraceable for Box<TimerEventChan + Send> {
- #[inline]
- fn trace(&self, _trc: *mut JSTracer) {
- // Do nothing
- }
-}
-
impl JSTraceable for Box<FnBox(f64, )> {
#[inline]
fn trace(&self, _trc: *mut JSTracer) {
diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs
index a8a42ddf1ae..4a9d7802526 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};
@@ -103,29 +103,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<TimerEventChan + Send> {
- 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
@@ -183,7 +160,7 @@ impl DedicatedWorkerGlobalScope {
parent_sender: Box<ScriptChan + Send>,
own_sender: Sender<(TrustedWorkerAddress, WorkerScriptMsg)>,
receiver: Receiver<(TrustedWorkerAddress, WorkerScriptMsg)>,
- timer_event_chan: Box<TimerEventChan + Send>,
+ timer_event_chan: IpcSender<TimerEvent>,
timer_event_port: Receiver<(TrustedWorkerAddress, TimerEvent)>)
-> DedicatedWorkerGlobalScope {
@@ -207,7 +184,7 @@ impl DedicatedWorkerGlobalScope {
parent_sender: Box<ScriptChan + Send>,
own_sender: Sender<(TrustedWorkerAddress, WorkerScriptMsg)>,
receiver: Receiver<(TrustedWorkerAddress, WorkerScriptMsg)>,
- timer_event_chan: Box<TimerEventChan + Send>,
+ timer_event_chan: IpcSender<TimerEvent>,
timer_event_port: Receiver<(TrustedWorkerAddress, TimerEvent)>)
-> Root<DedicatedWorkerGlobalScope> {
let scope = box DedicatedWorkerGlobalScope::new_inherited(
@@ -249,15 +226,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::<WorkerGlobalScope>();
diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs
index 5a914fcc49d..d9891c3fdc4 100644
--- a/components/script/dom/window.rs
+++ b/components/script/dom/window.rs
@@ -53,8 +53,8 @@ use page::Page;
use profile_traits::mem;
use rustc_serialize::base64::{FromBase64, STANDARD, ToBase64};
use script_task::{ScriptChan, ScriptPort, MainThreadScriptMsg, RunnableWrapper};
-use script_task::{SendableMainThreadScriptChan, MainThreadScriptChan, MainThreadTimerEventChan};
-use script_traits::{MsDuration, TimerEventChan, TimerEventId, TimerEventRequest, TimerSource};
+use script_task::{SendableMainThreadScriptChan, MainThreadScriptChan};
+use script_traits::{MsDuration, TimerEvent, TimerEventId, TimerEventRequest, TimerSource};
use selectors::parser::PseudoElement;
use std::ascii::AsciiExt;
use std::borrow::ToOwned;
@@ -129,7 +129,7 @@ pub struct Window {
session_storage: MutNullableHeap<JS<Storage>>,
local_storage: MutNullableHeap<JS<Storage>>,
#[ignore_heap_size_of = "channels are hard"]
- scheduler_chan: Sender<TimerEventRequest>,
+ scheduler_chan: IpcSender<TimerEventRequest>,
timers: ActiveTimers,
next_worker_id: Cell<WorkerId>,
@@ -1075,7 +1075,7 @@ impl Window {
self.constellation_chan.clone()
}
- pub fn scheduler_chan(&self) -> Sender<TimerEventRequest> {
+ pub fn scheduler_chan(&self) -> IpcSender<TimerEventRequest> {
self.scheduler_chan.clone()
}
@@ -1225,8 +1225,8 @@ impl Window {
mem_profiler_chan: mem::ProfilerChan,
devtools_chan: Option<IpcSender<ScriptToDevtoolsControlMsg>>,
constellation_chan: ConstellationChan,
- scheduler_chan: Sender<TimerEventRequest>,
- timer_event_chan: MainThreadTimerEventChan,
+ scheduler_chan: IpcSender<TimerEventRequest>,
+ timer_event_chan: IpcSender<TimerEvent>,
layout_chan: LayoutChan,
id: PipelineId,
parent_info: Option<(PipelineId, SubpageId)>,
@@ -1259,7 +1259,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 019d526b48f..28854fd84ac 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::{MsDuration, TimerEventChan, TimerEventId, TimerEventRequest, TimerSource};
+use script_traits::{MsDuration, 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, ScheduledCallback, TimerCallback, TimerHandle};
use url::{Url, UrlParser};
use util::str::DOMString;
@@ -44,7 +44,7 @@ pub struct WorkerGlobalScopeInit {
pub to_devtools_sender: Option<IpcSender<ScriptToDevtoolsControlMsg>>,
pub from_devtools_sender: Option<IpcSender<DevtoolScriptControlMsg>>,
pub constellation_chan: ConstellationChan,
- pub scheduler_chan: Sender<TimerEventRequest>,
+ pub scheduler_chan: IpcSender<TimerEventRequest>,
pub worker_id: WorkerId,
}
@@ -87,7 +87,7 @@ pub struct WorkerGlobalScope {
constellation_chan: ConstellationChan,
#[ignore_heap_size_of = "Defined in std"]
- scheduler_chan: Sender<TimerEventRequest>,
+ scheduler_chan: IpcSender<TimerEventRequest>,
}
impl WorkerGlobalScope {
@@ -95,7 +95,7 @@ impl WorkerGlobalScope {
worker_url: Url,
runtime: Rc<Runtime>,
from_devtools_receiver: Receiver<DevtoolScriptControlMsg>,
- timer_event_chan: Box<TimerEventChan + Send>)
+ timer_event_chan: IpcSender<TimerEvent>)
-> WorkerGlobalScope {
WorkerGlobalScope {
eventtarget: EventTarget::new_inherited(),
@@ -139,7 +139,7 @@ impl WorkerGlobalScope {
self.constellation_chan.clone()
}
- pub fn scheduler_chan(&self) -> Sender<TimerEventRequest> {
+ pub fn scheduler_chan(&self) -> IpcSender<TimerEventRequest> {
self.scheduler_chan.clone()
}
diff --git a/components/script/script_task.rs b/components/script/script_task.rs
index 48972b3fe70..c366329af1e 100644
--- a/components/script/script_task.rs
+++ b/components/script/script_task.rs
@@ -83,7 +83,7 @@ use script_traits::CompositorEvent::{MouseDownEvent, MouseUpEvent, TouchEvent};
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 script_traits::{TouchEventType, TouchId};
use std::any::Any;
use std::borrow::ToOwned;
@@ -353,20 +353,6 @@ impl MainThreadScriptChan {
}
}
-pub struct MainThreadTimerEventChan(Sender<TimerEvent>);
-
-impl TimerEventChan for MainThreadTimerEventChan {
- fn send(&self, event: TimerEvent) -> Result<(), ()> {
- let MainThreadTimerEventChan(ref chan) = *self;
- chan.send(event).map_err(|_| ())
- }
-
- fn clone(&self) -> Box<TimerEventChan + Send> {
- let MainThreadTimerEventChan(ref chan) = *self;
- box MainThreadTimerEventChan((*chan).clone())
- }
-}
-
pub struct StackRootTLS<'a>(PhantomData<&'a u32>);
impl<'a> StackRootTLS<'a> {
@@ -449,7 +435,7 @@ pub struct ScriptTask {
/// List of pipelines that have been owned and closed by this script task.
closed_pipelines: DOMRefCell<HashSet<PipelineId>>,
- scheduler_chan: Sender<TimerEventRequest>,
+ scheduler_chan: IpcSender<TimerEventRequest>,
timer_event_chan: Sender<TimerEvent>,
timer_event_port: Receiver<TimerEvent>,
}
@@ -1607,6 +1593,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(),
@@ -1620,7 +1610,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 b2829b0f512..aa6ce6e68c2 100644
--- a/components/script/timers.rs
+++ b/components/script/timers.rs
@@ -10,16 +10,16 @@ use dom::bindings::reflector::Reflectable;
use dom::bindings::trace::JSTraceable;
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;
@@ -30,9 +30,9 @@ pub struct TimerHandle(i32);
#[privatize]
pub struct ActiveTimers {
#[ignore_heap_size_of = "Defined in std"]
- timer_event_chan: Box<TimerEventChan + Send>,
+ timer_event_chan: IpcSender<TimerEvent>,
#[ignore_heap_size_of = "Defined in std"]
- scheduler_chan: Sender<TimerEventRequest>,
+ scheduler_chan: IpcSender<TimerEventRequest>,
next_timer_handle: Cell<TimerHandle>,
timers: DOMRefCell<Vec<Timer>>,
suspended_since: Cell<Option<MsDuration>>,
@@ -130,8 +130,8 @@ impl Clone for Box<ScheduledCallback> {
}
impl ActiveTimers {
- pub fn new(timer_event_chan: Box<TimerEventChan + Send>,
- scheduler_chan: Sender<TimerEventRequest>)
+ pub fn new(timer_event_chan: IpcSender<TimerEvent>,
+ scheduler_chan: IpcSender<TimerEventRequest>)
-> ActiveTimers {
ActiveTimers {
timer_event_chan: timer_event_chan,