diff --git a/components/devtools/actors/framerate.rs b/components/devtools/actors/framerate.rs index 646234a7e99..3a1dba14538 100644 --- a/components/devtools/actors/framerate.rs +++ b/components/devtools/actors/framerate.rs @@ -22,7 +22,7 @@ pub struct FramerateActor { script_sender: IpcSender, devtools_sender: Sender, start_time: Option, - is_recording: Arc>, + is_recording: bool, ticks: Arc>>, } @@ -54,7 +54,7 @@ impl FramerateActor { script_sender: script_sender, devtools_sender: devtools_sender, start_time: None, - is_recording: Arc::new(Mutex::new(false)), + is_recording: false, ticks: Arc::new(Mutex::new(Vec::new())), }; @@ -67,6 +67,12 @@ impl FramerateActor { let mut lock = self.ticks.lock(); let mut ticks = lock.as_mut().unwrap(); ticks.push(HighResolutionStamp::wrap(tick)); + + if self.is_recording { + let msg = DevtoolScriptControlMsg::RequestAnimationFrame(self.pipeline, + self.name()); + self.script_sender.send(msg).unwrap(); + } } pub fn take_pending_ticks(&self) -> Vec { @@ -76,74 +82,23 @@ impl FramerateActor { } fn start_recording(&mut self) { - let mut lock = self.is_recording.lock(); - if **lock.as_ref().unwrap() { + if self.is_recording { return; } self.start_time = Some(precise_time_ns()); - let is_recording = lock.as_mut(); - **is_recording.unwrap() = true; + self.is_recording = true; - fn get_closure(is_recording: Arc>, - name: String, - pipeline: PipelineId, - script_sender: IpcSender, - devtools_sender: Sender) - -> Box { - - let closure = move |now: f64| { - let msg = DevtoolsControlMsg::FromChrome(ChromeToDevtoolsControlMsg::FramerateTick( - name.clone(), now)); - devtools_sender.send(msg).unwrap(); - - if !*is_recording.lock().unwrap() { - return; - } - - let closure = get_closure(is_recording.clone(), - name.clone(), - pipeline.clone(), - script_sender.clone(), - devtools_sender.clone()); - let (request_animation_frame_sender, request_animation_frame_receiver) = - ipc::channel().unwrap(); - ROUTER.add_route(request_animation_frame_receiver.to_opaque(), box move |message| { - let value: f64 = message.to().unwrap(); - closure(value); - }); - let msg = DevtoolScriptControlMsg::RequestAnimationFrame( - pipeline, - request_animation_frame_sender); - script_sender.send(msg).unwrap(); - }; - Box::new(closure) - }; - - let closure = get_closure(self.is_recording.clone(), - self.name(), - self.pipeline.clone(), - self.script_sender.clone(), - self.devtools_sender.clone()); - let (request_animation_frame_sender, request_animation_frame_receiver) = - ipc::channel().unwrap(); - ROUTER.add_route(request_animation_frame_receiver.to_opaque(), box move |message| { - let value: f64 = message.to().unwrap(); - closure(value); - }); let msg = DevtoolScriptControlMsg::RequestAnimationFrame(self.pipeline, - request_animation_frame_sender); + self.name()); self.script_sender.send(msg).unwrap(); } fn stop_recording(&mut self) { - let mut lock = self.is_recording.lock(); - if !**lock.as_ref().unwrap() { + if !self.is_recording { return; } - - let is_recording = lock.as_mut(); - **is_recording.unwrap() = false; + self.is_recording = false; self.start_time = None; } diff --git a/components/devtools/lib.rs b/components/devtools/lib.rs index d9335943b1e..69abbbcda41 100644 --- a/components/devtools/lib.rs +++ b/components/devtools/lib.rs @@ -406,7 +406,7 @@ fn run_server(sender: Sender, handle_client(actors, stream.try_clone().unwrap()) }) } - Ok(DevtoolsControlMsg::FromChrome(ChromeToDevtoolsControlMsg::FramerateTick( + Ok(DevtoolsControlMsg::FromScript(ScriptToDevtoolsControlMsg::FramerateTick( actor_name, tick))) => handle_framerate_tick(actors.clone(), actor_name, tick), Ok(DevtoolsControlMsg::FromScript(ScriptToDevtoolsControlMsg::NewGlobal( diff --git a/components/devtools_traits/lib.rs b/components/devtools_traits/lib.rs index 71468aaf1e3..314fc49e6aa 100644 --- a/components/devtools_traits/lib.rs +++ b/components/devtools_traits/lib.rs @@ -59,9 +59,6 @@ pub enum DevtoolsControlMsg { pub enum ChromeToDevtoolsControlMsg { /// A new client has connected to the server. AddClient(TcpStream), - /// An animation frame with the given timestamp was processed in a script task. - /// The actor with the provided name should be notified. - FramerateTick(String, f64), /// The browser is shutting down. ServerExitMsg, /// A network event occurred (request, reply, etc.). The actor with the @@ -79,6 +76,9 @@ pub enum ScriptToDevtoolsControlMsg { DevtoolsPageInfo), /// A particular page has invoked the console API. ConsoleAPI(PipelineId, ConsoleMessage, Option), + /// An animation frame with the given timestamp was processed in a script task. + /// The actor with the provided name should be notified. + FramerateTick(String, f64), } /// Serialized JS return values @@ -158,7 +158,7 @@ pub enum DevtoolScriptControlMsg { WantsLiveNotifications(PipelineId, bool), SetTimelineMarkers(PipelineId, Vec, IpcSender), DropTimelineMarkers(PipelineId, Vec), - RequestAnimationFrame(PipelineId, IpcSender), + RequestAnimationFrame(PipelineId, String), } #[derive(RustcEncodable, Deserialize, Serialize)] diff --git a/components/script/devtools.rs b/components/script/devtools.rs index 2211df2931b..08895a0ab1b 100644 --- a/components/script/devtools.rs +++ b/components/script/devtools.rs @@ -4,7 +4,7 @@ use devtools_traits::{CachedConsoleMessage, CachedConsoleMessageTypes, PAGE_ERROR, CONSOLE_API}; use devtools_traits::{EvaluateJSReply, NodeInfo, Modification, TimelineMarker, TimelineMarkerType}; -use devtools_traits::{ConsoleAPI, PageError}; +use devtools_traits::{ConsoleAPI, PageError, ScriptToDevtoolsControlMsg}; use dom::bindings::conversions::jsstring_to_str; use dom::bindings::conversions::FromJSValConvertible; use dom::bindings::js::Root; @@ -202,10 +202,13 @@ pub fn handle_drop_timeline_markers(page: &Rc, } } -pub fn handle_request_animation_frame(page: &Rc, id: PipelineId, callback: IpcSender) { +pub fn handle_request_animation_frame(page: &Rc, id: PipelineId, actor_name: String) { let page = page.find(id).expect("There is no such page"); let doc = page.document(); + let devtools_sender = page.window().devtools_chan(); doc.r().request_animation_frame(box move |time| { - callback.send(time).unwrap() + devtools_sender.unwrap() + .send(ScriptToDevtoolsControlMsg::FramerateTick(actor_name, time)) + .unwrap(); }); } diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index 770515cce40..920c91a5c54 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -65,6 +65,7 @@ use net_traits::image::base::Image; use profile_traits::mem::ProfilerChan; use util::str::{LengthOrPercentageOrAuto}; use selectors::parser::PseudoElement; +use std::boxed::FnBox; use std::cell::{Cell, UnsafeCell, RefCell}; use std::collections::{HashMap, HashSet}; use std::collections::hash_state::HashState; @@ -314,7 +315,7 @@ impl JSTraceable for Box { } } -impl JSTraceable for Box { +impl JSTraceable for Box { #[inline] fn trace(&self, _trc: *mut JSTracer) { // Do nothing diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 616ca867a2e..5d5c6cb4607 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -94,6 +94,7 @@ use js::jsapi::{JSContext, JSObject, JSRuntime}; use num::ToPrimitive; use std::iter::FromIterator; use std::borrow::ToOwned; +use std::boxed::FnBox; use std::collections::HashMap; use std::collections::hash_map::Entry::{Occupied, Vacant}; use std::ascii::AsciiExt; @@ -148,7 +149,7 @@ pub struct Document { /// https://html.spec.whatwg.org/multipage/#list-of-animation-frame-callbacks /// List of animation frame callbacks #[ignore_heap_size_of = "closures are hard"] - animation_frame_list: RefCell>>, + animation_frame_list: RefCell>>, /// Tracks all outstanding loads related to this document. loader: DOMRefCell, /// The current active HTML parser, to allow resuming after interruptions. @@ -292,7 +293,7 @@ pub trait DocumentHelpers<'a> { fn set_current_script(self, script: Option<&HTMLScriptElement>); fn trigger_mozbrowser_event(self, event: MozBrowserEvent); /// https://html.spec.whatwg.org/multipage/#dom-window-requestanimationframe - fn request_animation_frame(self, callback: Box) -> i32; + fn request_animation_frame(self, callback: Box) -> i32; /// https://html.spec.whatwg.org/multipage/#dom-window-cancelanimationframe fn cancel_animation_frame(self, ident: i32); /// https://html.spec.whatwg.org/multipage/#run-the-animation-frame-callbacks @@ -949,7 +950,7 @@ impl<'a> DocumentHelpers<'a> for &'a Document { } /// https://html.spec.whatwg.org/multipage/#dom-window-requestanimationframe - fn request_animation_frame(self, callback: Box) -> i32 { + fn request_animation_frame(self, callback: Box) -> i32 { let window = self.window.root(); let window = window.r(); let ident = self.animation_frame_ident.get() + 1; diff --git a/components/script/lib.rs b/components/script/lib.rs index 59b37f78a25..9967af74414 100644 --- a/components/script/lib.rs +++ b/components/script/lib.rs @@ -16,6 +16,7 @@ #![feature(custom_attribute)] #![feature(custom_derive)] #![feature(drain)] +#![feature(fnbox)] #![feature(hashmap_hasher)] #![feature(mpsc_select)] #![feature(nonzero)] diff --git a/components/script/script_task.rs b/components/script/script_task.rs index efbad39dc86..fd8b1b81789 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -914,8 +914,8 @@ impl ScriptTask { devtools::handle_set_timeline_markers(&page, self, marker_types, reply), DevtoolScriptControlMsg::DropTimelineMarkers(_pipeline_id, marker_types) => devtools::handle_drop_timeline_markers(&page, self, marker_types), - DevtoolScriptControlMsg::RequestAnimationFrame(pipeline_id, callback) => - devtools::handle_request_animation_frame(&page, pipeline_id, callback), + DevtoolScriptControlMsg::RequestAnimationFrame(pipeline_id, name) => + devtools::handle_request_animation_frame(&page, pipeline_id, name), } }