aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorGuro Bokum <jiojiajiu@gmail.com>2015-03-28 23:27:54 +0700
committerGuro Bokum <jiojiajiu@gmail.com>2015-04-13 21:08:07 +0700
commit97714ec5eddc3d86d45f3e4afdf34ad6170d50f7 (patch)
tree0cea51ffe48c257d3bbf3cd7f7e48665e4b8bb12 /components/script/dom
parent1e45d025b381390f346e8f24db615cb698033844 (diff)
downloadservo-97714ec5eddc3d86d45f3e4afdf34ad6170d50f7.tar.gz
servo-97714ec5eddc3d86d45f3e4afdf34ad6170d50f7.zip
Firefox timeline integration #4957
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/bindings/trace.rs1
-rw-r--r--components/script/dom/window.rs50
2 files changed, 48 insertions, 3 deletions
diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs
index 4b5dffc1875..9d4e548e161 100644
--- a/components/script/dom/bindings/trace.rs
+++ b/components/script/dom/bindings/trace.rs
@@ -241,6 +241,7 @@ no_jsmanaged_fields!(ImageCacheTask, ScriptControlChan);
no_jsmanaged_fields!(Atom, Namespace, Timer);
no_jsmanaged_fields!(Trusted<T>);
no_jsmanaged_fields!(PropertyDeclarationBlock);
+no_jsmanaged_fields!(HashSet<T>);
// These three are interdependent, if you plan to put jsmanaged data
// in one of these make sure it is propagated properly to containing structs
no_jsmanaged_fields!(SubpageId, WindowSizeData, PipelineId);
diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs
index 9fe135eb53f..5bd20138550 100644
--- a/components/script/dom/window.rs
+++ b/components/script/dom/window.rs
@@ -34,7 +34,7 @@ use script_task::ScriptMsg;
use script_traits::ScriptControlChan;
use timers::{IsInterval, TimerId, TimerManager, TimerCallback};
-use devtools_traits::DevtoolsControlChan;
+use devtools_traits::{DevtoolsControlChan, TimelineMarker, TimelineMarkerType, TracingMetadata};
use msg::compositor_msg::ScriptListener;
use msg::constellation_msg::{LoadData, PipelineId, SubpageId, ConstellationChan, WindowSizeData, WorkerId};
use net_traits::ResourceTask;
@@ -54,13 +54,15 @@ use url::{Url, UrlParser};
use libc;
use rustc_serialize::base64::{FromBase64, ToBase64, STANDARD};
-use std::cell::{Cell, Ref, RefMut};
+use std::borrow::ToOwned;
+use std::cell::{Cell, Ref, RefMut, RefCell};
+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};
+use std::sync::mpsc::{channel, Receiver, Sender};
use std::sync::mpsc::TryRecvError::{Empty, Disconnected};
use time;
@@ -102,6 +104,10 @@ pub struct Window {
/// For providing instructions to an optional devtools server.
devtools_chan: Option<DevtoolsControlChan>,
+ /// For sending timeline markers. Will be ignored if
+ /// no devtools server
+ devtools_markers: RefCell<HashSet<TimelineMarkerType>>,
+ devtools_marker_sender: RefCell<Option<Sender<TimelineMarker>>>,
/// A flag to indicate whether the developer tools have requested live updates of
/// page changes.
@@ -477,6 +483,10 @@ pub trait WindowHelpers {
fn IndexedGetter(self, _index: u32, _found: &mut bool) -> Option<Temporary<Window>>;
fn thaw(self);
fn freeze(self);
+ fn need_emit_timeline_marker(self, timeline_type: TimelineMarkerType) -> bool;
+ fn emit_timeline_marker(self, marker: TimelineMarker);
+ fn set_devtools_timeline_marker(self, marker: TimelineMarkerType, reply: Sender<TimelineMarker>);
+ fn drop_devtools_timeline_markers(self);
}
pub trait ScriptHelpers {
@@ -547,6 +557,11 @@ impl<'a> WindowHelpers for JSRef<'a, Window> {
None => return,
};
+ if self.need_emit_timeline_marker(TimelineMarkerType::Reflow) {
+ let marker = TimelineMarker::new("Reflow".to_owned(), TracingMetadata::IntervalStart);
+ self.emit_timeline_marker(marker);
+ }
+
// Layout will let us know when it's done.
let (join_chan, join_port) = channel();
@@ -583,6 +598,11 @@ impl<'a> WindowHelpers for JSRef<'a, Window> {
debug!("script: layout forked");
self.join_layout();
+
+ if self.need_emit_timeline_marker(TimelineMarkerType::Reflow) {
+ let marker = TimelineMarker::new("Reflow".to_owned(), TracingMetadata::IntervalEnd);
+ self.emit_timeline_marker(marker);
+ }
}
// FIXME(cgaebel): join_layout is racey. What if the compositor triggers a
@@ -776,6 +796,27 @@ impl<'a> WindowHelpers for JSRef<'a, Window> {
fn freeze(self) {
self.timers.suspend();
}
+
+ fn need_emit_timeline_marker(self, timeline_type: TimelineMarkerType) -> bool {
+ let markers = self.devtools_markers.borrow();
+ markers.contains(&timeline_type)
+ }
+
+ fn emit_timeline_marker(self, marker: TimelineMarker) {
+ let sender = self.devtools_marker_sender.borrow();
+ let sender = sender.as_ref().expect("There is no marker sender");
+ sender.send(marker);
+ }
+
+ fn set_devtools_timeline_marker(self, marker: TimelineMarkerType, reply: Sender<TimelineMarker>) {
+ *self.devtools_marker_sender.borrow_mut() = Some(reply);
+ self.devtools_markers.borrow_mut().insert(marker);
+ }
+
+ fn drop_devtools_timeline_markers(self) {
+ self.devtools_markers.borrow_mut().clear();
+ *self.devtools_marker_sender.borrow_mut() = None;
+ }
}
impl Window {
@@ -836,6 +877,9 @@ impl Window {
layout_rpc: layout_rpc,
layout_join_port: DOMRefCell::new(None),
window_size: Cell::new(window_size),
+
+ devtools_marker_sender: RefCell::new(None),
+ devtools_markers: RefCell::new(HashSet::new()),
devtools_wants_updates: Cell::new(false),
};