diff options
Diffstat (limited to 'components/script/dom/console.rs')
-rw-r--r-- | components/script/dom/console.rs | 111 |
1 files changed, 54 insertions, 57 deletions
diff --git a/components/script/dom/console.rs b/components/script/dom/console.rs index 9382bf936a8..37d549befd9 100644 --- a/components/script/dom/console.rs +++ b/components/script/dom/console.rs @@ -4,39 +4,17 @@ use devtools_traits::{ConsoleMessage, LogLevel, ScriptToDevtoolsControlMsg}; use dom::bindings::cell::DOMRefCell; -use dom::bindings::codegen::Bindings::ConsoleBinding; -use dom::bindings::codegen::Bindings::ConsoleBinding::ConsoleMethods; use dom::bindings::global::GlobalRef; -use dom::bindings::js::Root; -use dom::bindings::reflector::{Reflectable, Reflector, reflect_dom_object}; use dom::bindings::str::DOMString; use std::collections::HashMap; +use std::collections::hash_map::Entry; use time::{Timespec, get_time}; // https://developer.mozilla.org/en-US/docs/Web/API/Console -#[dom_struct] -pub struct Console { - reflector_: Reflector, - timers: DOMRefCell<HashMap<DOMString, u64>>, -} +pub struct Console(()); impl Console { - fn new_inherited() -> Console { - Console { - reflector_: Reflector::new(), - timers: DOMRefCell::new(HashMap::new()), - } - } - - pub fn new(global: GlobalRef) -> Root<Console> { - reflect_dom_object(box Console::new_inherited(), - global, - ConsoleBinding::Wrap) - } - - fn send_to_devtools(&self, level: LogLevel, message: DOMString) { - let global = self.global(); - let global = global.r(); + fn send_to_devtools(global: GlobalRef, level: LogLevel, message: DOMString) { if let Some(chan) = global.devtools_chan() { let console_message = prepare_message(level, message); let devtools_message = ScriptToDevtoolsControlMsg::ConsoleAPI( @@ -48,83 +26,73 @@ impl Console { } } -impl ConsoleMethods for Console { +impl Console { // https://developer.mozilla.org/en-US/docs/Web/API/Console/log - fn Log(&self, messages: Vec<DOMString>) { + pub fn Log(global: GlobalRef, messages: Vec<DOMString>) { for message in messages { println!("{}", message); - self.send_to_devtools(LogLevel::Log, message); + Self::send_to_devtools(global, LogLevel::Log, message); } } // https://developer.mozilla.org/en-US/docs/Web/API/Console - fn Debug(&self, messages: Vec<DOMString>) { + pub fn Debug(global: GlobalRef, messages: Vec<DOMString>) { for message in messages { println!("{}", message); - self.send_to_devtools(LogLevel::Debug, message); + Self::send_to_devtools(global, LogLevel::Debug, message); } } // https://developer.mozilla.org/en-US/docs/Web/API/Console/info - fn Info(&self, messages: Vec<DOMString>) { + pub fn Info(global: GlobalRef, messages: Vec<DOMString>) { for message in messages { println!("{}", message); - self.send_to_devtools(LogLevel::Info, message); + Self::send_to_devtools(global, LogLevel::Info, message); } } // https://developer.mozilla.org/en-US/docs/Web/API/Console/warn - fn Warn(&self, messages: Vec<DOMString>) { + pub fn Warn(global: GlobalRef, messages: Vec<DOMString>) { for message in messages { println!("{}", message); - self.send_to_devtools(LogLevel::Warn, message); + Self::send_to_devtools(global, LogLevel::Warn, message); } } // https://developer.mozilla.org/en-US/docs/Web/API/Console/error - fn Error(&self, messages: Vec<DOMString>) { + pub fn Error(global: GlobalRef, messages: Vec<DOMString>) { for message in messages { println!("{}", message); - self.send_to_devtools(LogLevel::Error, message); + Self::send_to_devtools(global, LogLevel::Error, message); } } // https://developer.mozilla.org/en-US/docs/Web/API/Console/assert - fn Assert(&self, condition: bool, message: Option<DOMString>) { + pub fn Assert(global: GlobalRef, condition: bool, message: Option<DOMString>) { if !condition { let message = message.unwrap_or_else(|| DOMString::from("no message")); println!("Assertion failed: {}", message); - self.send_to_devtools(LogLevel::Error, message); + Self::send_to_devtools(global, LogLevel::Error, message); } } // https://developer.mozilla.org/en-US/docs/Web/API/Console/time - fn Time(&self, label: DOMString) { - let mut timers = self.timers.borrow_mut(); - if timers.contains_key(&label) { - // Timer already started - return; - } - if timers.len() >= 10000 { - // Too many timers on page - return; + pub fn Time(global: GlobalRef, label: DOMString) { + if let Ok(()) = global.console_timers().time(label.clone()) { + let message = DOMString::from(format!("{}: timer started", label)); + println!("{}", message); + Self::send_to_devtools(global, LogLevel::Log, message); } - - timers.insert(label.clone(), timestamp_in_ms(get_time())); - let message = DOMString::from(format!("{}: timer started", label)); - println!("{}", message); - self.send_to_devtools(LogLevel::Log, message); } // https://developer.mozilla.org/en-US/docs/Web/API/Console/timeEnd - fn TimeEnd(&self, label: DOMString) { - let mut timers = self.timers.borrow_mut(); - if let Some(start) = timers.remove(&label) { + pub fn TimeEnd(global: GlobalRef, label: DOMString) { + if let Ok(delta) = global.console_timers().time_end(&label) { let message = DOMString::from( - format!("{}: {}ms", label, timestamp_in_ms(get_time()) - start) + format!("{}: {}ms", label, delta) ); println!("{}", message); - self.send_to_devtools(LogLevel::Log, message); + Self::send_to_devtools(global, LogLevel::Log, message); }; } } @@ -143,3 +111,32 @@ fn prepare_message(logLevel: LogLevel, message: DOMString) -> ConsoleMessage { columnNumber: 1, } } + +#[derive(HeapSizeOf, JSTraceable)] +pub struct TimerSet(DOMRefCell<HashMap<DOMString, u64>>); + +impl TimerSet { + pub fn new() -> Self { + TimerSet(DOMRefCell::new(Default::default())) + } + + fn time(&self, label: DOMString) -> Result<(), ()> { + let mut timers = self.0.borrow_mut(); + if timers.len() >= 10000 { + return Err(()); + } + match timers.entry(label) { + Entry::Vacant(entry) => { + entry.insert(timestamp_in_ms(get_time())); + Ok(()) + }, + Entry::Occupied(_) => Err(()), + } + } + + fn time_end(&self, label: &str) -> Result<u64, ()> { + self.0.borrow_mut().remove(label).ok_or(()).map(|start| { + timestamp_in_ms(get_time()) - start + }) + } +} |