Make console a namespace (fixes #13010)

This commit is contained in:
Anthony Ramine 2016-09-06 15:47:53 +02:00
parent 0b689a8a31
commit 2bc0862f47
9 changed files with 30 additions and 73 deletions

View file

@ -4,38 +4,17 @@
use devtools_traits::{ConsoleMessage, LogLevel, ScriptToDevtoolsControlMsg}; use devtools_traits::{ConsoleMessage, LogLevel, ScriptToDevtoolsControlMsg};
use dom::bindings::cell::DOMRefCell; 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::global::GlobalRef;
use dom::bindings::js::Root;
use dom::bindings::reflector::{Reflectable, Reflector, reflect_dom_object};
use dom::bindings::str::DOMString; use dom::bindings::str::DOMString;
use std::collections::HashMap; use std::collections::HashMap;
use std::collections::hash_map::Entry; use std::collections::hash_map::Entry;
use time::{Timespec, get_time}; use time::{Timespec, get_time};
// https://developer.mozilla.org/en-US/docs/Web/API/Console // https://developer.mozilla.org/en-US/docs/Web/API/Console
#[dom_struct] pub struct Console(());
pub struct Console {
reflector_: Reflector,
}
impl Console { impl Console {
fn new_inherited() -> Console { fn send_to_devtools(global: GlobalRef, level: LogLevel, message: DOMString) {
Console {
reflector_: Reflector::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();
if let Some(chan) = global.devtools_chan() { if let Some(chan) = global.devtools_chan() {
let console_message = prepare_message(level, message); let console_message = prepare_message(level, message);
let devtools_message = ScriptToDevtoolsControlMsg::ConsoleAPI( let devtools_message = ScriptToDevtoolsControlMsg::ConsoleAPI(
@ -47,75 +26,73 @@ impl Console {
} }
} }
impl ConsoleMethods for Console { impl Console {
// https://developer.mozilla.org/en-US/docs/Web/API/Console/log // 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 { for message in messages {
println!("{}", message); 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 // 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 { for message in messages {
println!("{}", message); 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 // 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 { for message in messages {
println!("{}", message); 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 // 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 { for message in messages {
println!("{}", message); 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 // 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 { for message in messages {
println!("{}", message); 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 // 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 { if !condition {
let message = message.unwrap_or_else(|| DOMString::from("no message")); let message = message.unwrap_or_else(|| DOMString::from("no message"));
println!("Assertion failed: {}", 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 // https://developer.mozilla.org/en-US/docs/Web/API/Console/time
fn Time(&self, label: DOMString) { pub fn Time(global: GlobalRef, label: DOMString) {
let global = self.global(); if let Ok(()) = global.console_timers().time(label.clone()) {
if let Ok(()) = global.r().console_timers().time(label.clone()) {
let message = DOMString::from(format!("{}: timer started", label)); let message = DOMString::from(format!("{}: timer started", label));
println!("{}", message); 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/timeEnd // https://developer.mozilla.org/en-US/docs/Web/API/Console/timeEnd
fn TimeEnd(&self, label: DOMString) { pub fn TimeEnd(global: GlobalRef, label: DOMString) {
let global = self.global(); if let Ok(delta) = global.console_timers().time_end(&label) {
if let Ok(delta) = global.r().console_timers().time_end(&label) {
let message = DOMString::from( let message = DOMString::from(
format!("{}: {}ms", label, delta) format!("{}: {}ms", label, delta)
); );
println!("{}", message); println!("{}", message);
self.send_to_devtools(LogLevel::Log, message); Self::send_to_devtools(global, LogLevel::Log, message);
}; };
} }
} }

View file

@ -9,8 +9,10 @@
* © Copyright 2014 Mozilla Foundation. * © Copyright 2014 Mozilla Foundation.
*/ */
[Exposed=(Window,Worker)] [ClassString="Console",
interface Console { Exposed=(Window,Worker),
ProtoObjectHack]
namespace console {
// These should be DOMString message, DOMString message2, ... // These should be DOMString message, DOMString message2, ...
void log(DOMString... messages); void log(DOMString... messages);
void debug(DOMString... messages); void debug(DOMString... messages);

View file

@ -161,7 +161,6 @@ partial interface Window {
// Proprietary extensions. // Proprietary extensions.
partial interface Window { partial interface Window {
readonly attribute Console console;
void debug(DOMString arg); void debug(DOMString arg);
void gc(); void gc();
void trap(); void trap();

View file

@ -24,10 +24,3 @@ partial interface WorkerGlobalScope { // not obsolete
}; };
WorkerGlobalScope implements WindowTimers; WorkerGlobalScope implements WindowTimers;
WorkerGlobalScope implements WindowBase64; WorkerGlobalScope implements WindowBase64;
// Proprietary
[Exposed=Worker]
partial interface WorkerGlobalScope {
[Replaceable]
readonly attribute Console console;
};

View file

@ -25,7 +25,7 @@ use dom::bindings::str::DOMString;
use dom::bindings::structuredclone::StructuredCloneData; use dom::bindings::structuredclone::StructuredCloneData;
use dom::bindings::utils::{GlobalStaticData, WindowProxyHandler}; use dom::bindings::utils::{GlobalStaticData, WindowProxyHandler};
use dom::browsingcontext::BrowsingContext; use dom::browsingcontext::BrowsingContext;
use dom::console::{Console, TimerSet}; use dom::console::TimerSet;
use dom::crypto::Crypto; use dom::crypto::Crypto;
use dom::cssstyledeclaration::{CSSModificationAccess, CSSStyleDeclaration}; use dom::cssstyledeclaration::{CSSModificationAccess, CSSStyleDeclaration};
use dom::document::Document; use dom::document::Document;
@ -157,7 +157,6 @@ pub struct Window {
history_traversal_task_source: HistoryTraversalTaskSource, history_traversal_task_source: HistoryTraversalTaskSource,
#[ignore_heap_size_of = "task sources are hard"] #[ignore_heap_size_of = "task sources are hard"]
file_reading_task_source: FileReadingTaskSource, file_reading_task_source: FileReadingTaskSource,
console: MutNullableHeap<JS<Console>>,
crypto: MutNullableHeap<JS<Crypto>>, crypto: MutNullableHeap<JS<Crypto>>,
navigator: MutNullableHeap<JS<Navigator>>, navigator: MutNullableHeap<JS<Navigator>>,
#[ignore_heap_size_of = "channels are hard"] #[ignore_heap_size_of = "channels are hard"]
@ -511,11 +510,6 @@ impl WindowMethods for Window {
self.local_storage.or_init(|| Storage::new(&GlobalRef::Window(self), StorageType::Local)) self.local_storage.or_init(|| Storage::new(&GlobalRef::Window(self), StorageType::Local))
} }
// https://developer.mozilla.org/en-US/docs/Web/API/Console
fn Console(&self) -> Root<Console> {
self.console.or_init(|| Console::new(GlobalRef::Window(self)))
}
// https://dvcs.w3.org/hg/webcrypto-api/raw-file/tip/spec/Overview.html#dfn-GlobalCrypto // https://dvcs.w3.org/hg/webcrypto-api/raw-file/tip/spec/Overview.html#dfn-GlobalCrypto
fn Crypto(&self) -> Root<Crypto> { fn Crypto(&self) -> Root<Crypto> {
self.crypto.or_init(|| Crypto::new(GlobalRef::Window(self))) self.crypto.or_init(|| Crypto::new(GlobalRef::Window(self)))
@ -1704,7 +1698,6 @@ impl Window {
history_traversal_task_source: history_task_source, history_traversal_task_source: history_task_source,
file_reading_task_source: file_task_source, file_reading_task_source: file_task_source,
image_cache_chan: image_cache_chan, image_cache_chan: image_cache_chan,
console: Default::default(),
crypto: Default::default(), crypto: Default::default(),
navigator: Default::default(), navigator: Default::default(),
image_cache_thread: image_cache_thread, image_cache_thread: image_cache_thread,

View file

@ -11,7 +11,7 @@ use dom::bindings::inheritance::Castable;
use dom::bindings::js::{JS, MutNullableHeap, Root}; use dom::bindings::js::{JS, MutNullableHeap, Root};
use dom::bindings::reflector::Reflectable; use dom::bindings::reflector::Reflectable;
use dom::bindings::str::DOMString; use dom::bindings::str::DOMString;
use dom::console::{Console, TimerSet}; use dom::console::TimerSet;
use dom::crypto::Crypto; use dom::crypto::Crypto;
use dom::dedicatedworkerglobalscope::DedicatedWorkerGlobalScope; use dom::dedicatedworkerglobalscope::DedicatedWorkerGlobalScope;
use dom::eventtarget::EventTarget; use dom::eventtarget::EventTarget;
@ -79,7 +79,6 @@ pub struct WorkerGlobalScope {
resource_threads: ResourceThreads, resource_threads: ResourceThreads,
location: MutNullableHeap<JS<WorkerLocation>>, location: MutNullableHeap<JS<WorkerLocation>>,
navigator: MutNullableHeap<JS<WorkerNavigator>>, navigator: MutNullableHeap<JS<WorkerNavigator>>,
console: MutNullableHeap<JS<Console>>,
crypto: MutNullableHeap<JS<Crypto>>, crypto: MutNullableHeap<JS<Crypto>>,
timers: OneshotTimers, timers: OneshotTimers,
@ -132,7 +131,6 @@ impl WorkerGlobalScope {
resource_threads: init.resource_threads, resource_threads: init.resource_threads,
location: Default::default(), location: Default::default(),
navigator: Default::default(), navigator: Default::default(),
console: Default::default(),
crypto: Default::default(), crypto: Default::default(),
timers: OneshotTimers::new(timer_event_chan, init.scheduler_chan.clone()), timers: OneshotTimers::new(timer_event_chan, init.scheduler_chan.clone()),
mem_profiler_chan: init.mem_profiler_chan, mem_profiler_chan: init.mem_profiler_chan,
@ -303,11 +301,6 @@ impl WorkerGlobalScopeMethods for WorkerGlobalScope {
self.navigator.or_init(|| WorkerNavigator::new(self)) self.navigator.or_init(|| WorkerNavigator::new(self))
} }
// https://developer.mozilla.org/en-US/docs/Web/API/WorkerGlobalScope/console
fn Console(&self) -> Root<Console> {
self.console.or_init(|| Console::new(GlobalRef::Worker(self)))
}
// https://html.spec.whatwg.org/multipage/#dfn-Crypto // https://html.spec.whatwg.org/multipage/#dfn-Crypto
fn Crypto(&self) -> Root<Crypto> { fn Crypto(&self) -> Root<Crypto> {
self.crypto.or_init(|| Crypto::new(GlobalRef::Worker(self))) self.crypto.or_init(|| Crypto::new(GlobalRef::Worker(self)))

View file

@ -27,7 +27,6 @@ test_interfaces([
"DOMRect", "DOMRect",
"DOMRectReadOnly", "DOMRectReadOnly",
"Comment", "Comment",
"Console",
"CustomEvent", "CustomEvent",
"Document", "Document",
"DocumentFragment", "DocumentFragment",
@ -183,5 +182,6 @@ test_interfaces([
"XMLHttpRequest", "XMLHttpRequest",
"XMLHttpRequestEventTarget", "XMLHttpRequestEventTarget",
"XMLHttpRequestUpload", "XMLHttpRequestUpload",
"console",
]); ]);
</script> </script>

View file

@ -65,7 +65,7 @@ function test_interfaces(interfaceNamesInGlobalScope) {
} }
for (var name of Object.getOwnPropertyNames(self)) { for (var name of Object.getOwnPropertyNames(self)) {
if (!/^[A-Z]/.test(name)) { if (!/^[A-Z]/.test(name) && name != 'console') {
continue; continue;
} }
assert_true(name in interfaceMap, assert_true(name in interfaceMap,

View file

@ -23,7 +23,6 @@ test_interfaces([
"DOMRect", "DOMRect",
"DOMRectReadOnly", "DOMRectReadOnly",
"Comment", "Comment",
"Console",
"CustomEvent", "CustomEvent",
"DedicatedWorkerGlobalScope", "DedicatedWorkerGlobalScope",
"Document", "Document",
@ -128,6 +127,7 @@ test_interfaces([
"XMLHttpRequest", "XMLHttpRequest",
"XMLHttpRequestEventTarget", "XMLHttpRequestEventTarget",
"XMLHttpRequestUpload", "XMLHttpRequestUpload",
"console",
]); ]);
done(); done();