From 8a5c6a0d3b147a00e31a37dcfe21ef8f962cb9a8 Mon Sep 17 00:00:00 2001 From: Robin Stocker Date: Wed, 8 Oct 2014 23:29:15 +1100 Subject: [PATCH] Allow to specify port with --devtools option (fixes #3597) Note that using `servo --devtools http://example.org` doesn't work. In that case either the port must be specified or the option moved to the end. This is done by getopts and is the same for other such options, e.g. `--profile`. --- components/devtools/lib.rs | 17 ++++++++--------- components/util/opts.rs | 13 +++++++++---- ports/cef/core.rs | 2 +- src/lib.rs | 8 +++----- 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/components/devtools/lib.rs b/components/devtools/lib.rs index 064ecd18ff2..e747bbf9594 100644 --- a/components/devtools/lib.rs +++ b/components/devtools/lib.rs @@ -58,20 +58,19 @@ mod actors { } mod protocol; -/// Spin up a devtools server that listens for connections. Defaults to port 6000. -/// TODO: allow specifying a port -pub fn start_server() -> Sender { - let (chan, port) = comm::channel(); +/// Spin up a devtools server that listens for connections on the specified port. +pub fn start_server(port: u16) -> Sender { + let (sender, receiver) = comm::channel(); TaskBuilder::new().named("devtools").spawn(proc() { - run_server(port) + run_server(receiver, port) }); - chan + sender } static POLL_TIMEOUT: u64 = 300; -fn run_server(port: Receiver) { - let listener = TcpListener::bind("127.0.0.1", 6000); +fn run_server(receiver: Receiver, port: u16) { + let listener = TcpListener::bind("127.0.0.1", port); // bind the listener to the specified address let mut acceptor = listener.listen().unwrap(); @@ -185,7 +184,7 @@ fn run_server(port: Receiver) { loop { match acceptor.accept() { Err(ref e) if e.kind == TimedOut => { - match port.try_recv() { + match receiver.try_recv() { Ok(ServerExitMsg) | Err(Disconnected) => break, Ok(NewGlobal(id, sender)) => handle_new_global(actors.clone(), id, sender), Err(Empty) => acceptor.set_timeout(Some(POLL_TIMEOUT)), diff --git a/components/util/opts.rs b/components/util/opts.rs index ae3f01a21f6..47a65797615 100644 --- a/components/util/opts.rs +++ b/components/util/opts.rs @@ -85,8 +85,9 @@ pub struct Opts { /// and render. pub trace_layout: bool, - /// True if we should start a server to listen to remote Firefox devtools connections. - pub devtools_server: bool, + /// `None` to disable devtools or `Some` with a port number to start a server to listen to + /// remote Firefox devtools connections. + pub devtools_port: Option, /// The initial requested size of the window. pub initial_window_size: TypedSize2D, @@ -127,7 +128,7 @@ pub fn from_cmdline_args(args: &[String]) -> Option { getopts::optflag("", "show-debug-borders", "Show debugging borders on layers and tiles."), getopts::optflag("", "disable-text-aa", "Disable antialiasing for text rendering."), getopts::optflag("", "trace-layout", "Write layout trace to external file for debugging."), - getopts::optflag("", "devtools", "Start remote devtools server"), + getopts::optflagopt("", "devtools", "Start remote devtools server on port", "6000"), getopts::optopt("", "resolution", "Set window resolution.", "800x600"), getopts::optopt("u", "user-agent", "Set custom user agent string", "NCSA Mosaic/1.0 (X11;SunOS 4.1.4 sun4m)"), getopts::optflag("h", "help", "Print this message") @@ -211,6 +212,10 @@ pub fn from_cmdline_args(args: &[String]) -> Option { bubble_inline_sizes_separately = true; } + let devtools_port = opt_match.opt_default("devtools", "6000").map(|port| { + from_str(port.as_slice()).unwrap() + }); + let initial_window_size = match opt_match.opt_str("resolution") { Some(res_string) => { let res: Vec = res_string.as_slice().split('x').map(|r| from_str(r).unwrap()).collect(); @@ -240,7 +245,7 @@ pub fn from_cmdline_args(args: &[String]) -> Option { show_debug_borders: opt_match.opt_present("show-debug-borders"), enable_text_antialiasing: !opt_match.opt_present("disable-text-aa"), trace_layout: trace_layout, - devtools_server: opt_match.opt_present("devtools"), + devtools_port: devtools_port, initial_window_size: initial_window_size, user_agent: opt_match.opt_str("u"), }) diff --git a/ports/cef/core.rs b/ports/cef/core.rs index 6a40bafea7f..f08bf007fed 100644 --- a/ports/cef/core.rs +++ b/ports/cef/core.rs @@ -68,7 +68,7 @@ pub extern "C" fn cef_run_message_loop() { show_debug_borders: false, enable_text_antialiasing: true, trace_layout: false, - devtools_server: false, + devtools_port: None, initial_window_size: TypedSize2D(800, 600), user_agent: None, }; diff --git a/src/lib.rs b/src/lib.rs index a9b545fa51b..79ace45134c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -95,11 +95,9 @@ pub fn run(opts: opts::Opts) { let (compositor_port, compositor_chan) = CompositorChan::new(); let time_profiler_chan = TimeProfiler::create(opts.time_profiler_period); let memory_profiler_chan = MemoryProfiler::create(opts.memory_profiler_period); - let devtools_chan = if opts.devtools_server { - Some(devtools::start_server()) - } else { - None - }; + let devtools_chan = opts.devtools_port.map(|port| { + devtools::start_server(port) + }); let opts_clone = opts.clone(); let time_profiler_chan_clone = time_profiler_chan.clone();