diff options
Diffstat (limited to 'components/script/dom/document.rs')
-rw-r--r-- | components/script/dom/document.rs | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 211927bbf9c..68777b70d39 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -3,9 +3,11 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use core::nonzero::NonZero; +use devtools_traits::ScriptToDevtoolsControlMsg; use document_loader::{DocumentLoader, LoadType}; use dom::activation::{ActivationSource, synthetic_click_activation}; use dom::attr::Attr; +use dom::bindings::callback::ExceptionHandling; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::DOMRectBinding::DOMRectMethods; use dom::bindings::codegen::Bindings::DocumentBinding; @@ -18,7 +20,7 @@ use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use dom::bindings::codegen::Bindings::NodeFilterBinding::NodeFilter; use dom::bindings::codegen::Bindings::PerformanceBinding::PerformanceMethods; use dom::bindings::codegen::Bindings::TouchBinding::TouchMethods; -use dom::bindings::codegen::Bindings::WindowBinding::{ScrollBehavior, WindowMethods}; +use dom::bindings::codegen::Bindings::WindowBinding::{FrameRequestCallback, ScrollBehavior, WindowMethods}; use dom::bindings::codegen::UnionTypes::NodeOrString; use dom::bindings::error::{Error, ErrorResult, Fallible}; use dom::bindings::inheritance::{Castable, ElementTypeId, HTMLElementTypeId, NodeTypeId}; @@ -112,7 +114,6 @@ use servo_atoms::Atom; use servo_url::ServoUrl; use std::ascii::AsciiExt; use std::borrow::ToOwned; -use std::boxed::FnBox; use std::cell::{Cell, Ref, RefMut}; use std::collections::HashMap; use std::collections::hash_map::Entry::{Occupied, Vacant}; @@ -233,8 +234,7 @@ pub struct Document { animation_frame_ident: Cell<u32>, /// 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: DOMRefCell<Vec<(u32, Option<Box<FnBox(f64)>>)>>, + animation_frame_list: DOMRefCell<Vec<(u32, Option<AnimationFrameCallback>)>>, /// Whether we're in the process of running animation callbacks. /// /// Tracking this is not necessary for correctness. Instead, it is an optimization to avoid @@ -1461,7 +1461,7 @@ impl Document { } /// https://html.spec.whatwg.org/multipage/#dom-window-requestanimationframe - pub fn request_animation_frame(&self, callback: Box<FnBox(f64)>) -> u32 { + pub fn request_animation_frame(&self, callback: AnimationFrameCallback) -> u32 { let ident = self.animation_frame_ident.get() + 1; self.animation_frame_ident.set(ident); @@ -1502,7 +1502,7 @@ impl Document { for (_, callback) in animation_frame_list.drain(..) { if let Some(callback) = callback { - callback(*timing); + callback.call(self, *timing); } } @@ -3182,3 +3182,29 @@ pub enum FocusEventType { Focus, // Element gained focus. Doesn't bubble. Blur, // Element lost focus. Doesn't bubble. } + +#[derive(HeapSizeOf, JSTraceable)] +pub enum AnimationFrameCallback { + DevtoolsFramerateTick { actor_name: String }, + FrameRequestCallback { + #[ignore_heap_size_of = "Rc is hard"] + callback: Rc<FrameRequestCallback> + }, +} + +impl AnimationFrameCallback { + fn call(&self, document: &Document, now: f64) { + match *self { + AnimationFrameCallback::DevtoolsFramerateTick { ref actor_name } => { + let msg = ScriptToDevtoolsControlMsg::FramerateTick(actor_name.clone(), now); + let devtools_sender = document.window().upcast::<GlobalScope>().devtools_chan().unwrap(); + devtools_sender.send(msg).unwrap(); + } + AnimationFrameCallback::FrameRequestCallback { ref callback } => { + // TODO(jdm): The spec says that any exceptions should be suppressed: + // https://github.com/servo/servo/issues/6928 + let _ = callback.Call__(Finite::wrap(now), ExceptionHandling::Report); + } + } + } +} |