diff options
Diffstat (limited to 'components/servo')
-rw-r--r-- | components/servo/Cargo.lock | 5 | ||||
-rw-r--r-- | components/servo/lib.rs | 51 | ||||
-rw-r--r-- | components/servo/main.rs | 5 |
3 files changed, 54 insertions, 7 deletions
diff --git a/components/servo/Cargo.lock b/components/servo/Cargo.lock index 859e6b00e0d..036639d82de 100644 --- a/components/servo/Cargo.lock +++ b/components/servo/Cargo.lock @@ -12,7 +12,7 @@ dependencies = [ "constellation 0.0.1", "devtools 0.0.1", "devtools_traits 0.0.1", - "env_logger 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "euclid 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "gaol 0.0.1 (git+https://github.com/servo/gaol)", "gfx 0.0.1", @@ -357,6 +357,7 @@ dependencies = [ name = "constellation" version = "0.0.1" dependencies = [ + "backtrace 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "canvas 0.0.1", "canvas_traits 0.0.1", "clipboard 0.1.2 (git+https://github.com/aweinstock314/rust-clipboard)", @@ -670,7 +671,7 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/components/servo/lib.rs b/components/servo/lib.rs index 8ef09eb066e..20aee632c1d 100644 --- a/components/servo/lib.rs +++ b/components/servo/lib.rs @@ -17,10 +17,12 @@ //! The `Browser` is fed events from a generic type that implements the //! `WindowMethods` trait. +extern crate env_logger; #[cfg(not(target_os = "windows"))] extern crate gaol; #[macro_use] extern crate gleam; +extern crate log; pub extern crate canvas; pub extern crate canvas_traits; @@ -65,10 +67,13 @@ use compositing::{CompositorProxy, IOCompositor}; #[cfg(not(target_os = "windows"))] use constellation::content_process_sandbox_profile; use constellation::{Constellation, InitialConstellationState, UnprivilegedPipelineContent}; +use constellation::{FromScriptLogger, FromCompositorLogger}; +use env_logger::Logger as EnvLogger; #[cfg(not(target_os = "windows"))] use gaol::sandbox::{ChildSandbox, ChildSandboxMethods}; use gfx::font_cache_thread::FontCacheThread; use ipc_channel::ipc::{self, IpcSender}; +use log::{Log, LogMetadata, LogRecord}; use net::bluetooth_thread::BluetoothThreadFactory; use net::image_cache_thread::new_image_cache_thread; use net::resource_thread::new_resource_threads; @@ -78,7 +83,8 @@ use profile::mem as profile_mem; use profile::time as profile_time; use profile_traits::mem; use profile_traits::time; -use script_traits::ConstellationMsg; +use script_traits::{ConstellationMsg, ScriptMsg}; +use std::cmp::max; use std::rc::Rc; use std::sync::mpsc::Sender; use util::opts; @@ -100,6 +106,7 @@ pub use gleam::gl; /// various browser components. pub struct Browser<Window: WindowMethods + 'static> { compositor: IOCompositor<Window>, + constellation_chan: Sender<ConstellationMsg>, } impl<Window> Browser<Window> where Window: WindowMethods + 'static { @@ -172,7 +179,7 @@ impl<Window> Browser<Window> where Window: WindowMethods + 'static { let compositor = IOCompositor::create(window, InitialCompositorState { sender: compositor_proxy, receiver: compositor_receiver, - constellation_chan: constellation_chan, + constellation_chan: constellation_chan.clone(), time_profiler_chan: time_profiler_chan, mem_profiler_chan: mem_profiler_chan, webrender: webrender, @@ -181,6 +188,7 @@ impl<Window> Browser<Window> where Window: WindowMethods + 'static { Browser { compositor: compositor, + constellation_chan: constellation_chan, } } @@ -199,6 +207,18 @@ impl<Window> Browser<Window> where Window: WindowMethods + 'static { pub fn request_title_for_main_frame(&self) { self.compositor.title_for_main_frame() } + + pub fn setup_logging(&self) { + let constellation_chan = self.constellation_chan.clone(); + log::set_logger(|max_log_level| { + let env_logger = EnvLogger::new(); + let con_logger = FromCompositorLogger::new(constellation_chan); + let filter = max(env_logger.filter(), con_logger.filter()); + let logger = BothLogger(env_logger, con_logger); + max_log_level.set(filter); + Box::new(logger) + }).expect("Failed to set logger.") + } } fn create_constellation(opts: opts::Opts, @@ -244,6 +264,32 @@ fn create_constellation(opts: opts::Opts, constellation_chan } +// A logger that logs to two downstream loggers. +// This should probably be in the log crate. +struct BothLogger<Log1, Log2>(Log1, Log2); + +impl<Log1, Log2> Log for BothLogger<Log1, Log2> where Log1: Log, Log2: Log { + fn enabled(&self, metadata: &LogMetadata) -> bool { + self.0.enabled(metadata) || self.1.enabled(metadata) + } + + fn log(&self, record: &LogRecord) { + self.0.log(record); + self.1.log(record); + } +} + +pub fn set_logger(constellation_chan: IpcSender<ScriptMsg>) { + log::set_logger(|max_log_level| { + let env_logger = EnvLogger::new(); + let con_logger = FromScriptLogger::new(constellation_chan); + let filter = max(env_logger.filter(), con_logger.filter()); + let logger = BothLogger(env_logger, con_logger); + max_log_level.set(filter); + Box::new(logger) + }).expect("Failed to set logger.") +} + /// Content process entry point. pub fn run_content_process(token: String) { let (unprivileged_content_sender, unprivileged_content_receiver) = @@ -255,6 +301,7 @@ pub fn run_content_process(token: String) { let unprivileged_content = unprivileged_content_receiver.recv().unwrap(); opts::set_defaults(unprivileged_content.opts()); PREFS.extend(unprivileged_content.prefs()); + set_logger(unprivileged_content.constellation_chan()); // Enter the sandbox if necessary. if opts::get().sandbox { diff --git a/components/servo/main.rs b/components/servo/main.rs index 66f5a149158..954c3f0e848 100644 --- a/components/servo/main.rs +++ b/components/servo/main.rs @@ -22,7 +22,6 @@ extern crate android_glue; #[cfg(not(target_os = "android"))] extern crate backtrace; -extern crate env_logger; // The window backed by glutin extern crate glutin_app as app; #[cfg(target_os = "android")] @@ -96,8 +95,6 @@ fn main() { }; initiate_panic_hook(); - env_logger::init().unwrap(); - setup_logging(); if let Some(token) = content_process_token { @@ -117,6 +114,8 @@ fn main() { browser: Browser::new(window.clone()), }; + browser.browser.setup_logging(); + register_glutin_resize_handler(&window, &mut browser); browser.browser.handle_events(vec![WindowEvent::InitializeCompositing]); |