Auto merge of #27304 - paulrouget:staticdevtoolsport, r=jdm

UWP: non random port for devtools, and support for custom UWP prefs

packages-prefs.json is now taken into account for libsimpleservo. Making it possible to have custom pref for the UWP builds, removing some weirdness in the way we handle preferences in the hololens code.

This also adds a new set of preferences to control the devtools server startup state, and make the port choice constant across sessions.

Fix #27267
Fix #22970
This commit is contained in:
bors-servo 2020-07-21 03:38:10 -04:00 committed by GitHub
commit 774673d186
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 116 additions and 58 deletions

2
Cargo.lock generated
View file

@ -1242,6 +1242,7 @@ dependencies = [
"msg",
"serde",
"serde_json",
"servo_config",
"servo_rand",
"servo_url",
"time",
@ -5433,6 +5434,7 @@ dependencies = [
"libloading 0.5.2",
"libservo",
"log",
"serde_json",
"servo-media",
"surfman",
"webxr",

View file

@ -112,9 +112,12 @@ pub struct Opts {
/// remote Firefox debugger connections.
pub debugger_port: Option<u16>,
/// `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<u16>,
/// Port number to start a server to listen to remote Firefox devtools connections.
/// 0 for random port.
pub devtools_port: u16,
/// Start the devtools server at startup
pub devtools_server_enabled: bool,
/// `None` to disable WebDriver or `Some` with a port number to start a server to listen to
/// remote WebDriver commands.
@ -482,7 +485,8 @@ pub fn default_opts() -> Opts {
enable_canvas_antialiasing: true,
trace_layout: false,
debugger_port: None,
devtools_port: None,
devtools_port: 0,
devtools_server_enabled: false,
webdriver_port: None,
initial_window_size: Size2D::new(1024, 740),
multiprocess: false,
@ -802,11 +806,22 @@ pub fn from_cmdline_args(mut opts: Options, args: &[String]) -> ArgumentParsingR
})
});
// Set default port 0 for a random port to be selected.
let devtools_port = opt_match.opt_default("devtools", "0").map(|port| {
port.parse()
.unwrap_or_else(|err| args_fail(&format!("Error parsing option: --devtools ({})", err)))
});
let (devtools_enabled, devtools_port) = if opt_match.opt_present("devtools") {
let port = opt_match
.opt_str("devtools")
.map(|port| {
port.parse().unwrap_or_else(|err| {
args_fail(&format!("Error parsing option: --devtools ({})", err))
})
})
.unwrap_or(pref!(devtools.server.port));
(true, port as u16)
} else {
(
pref!(devtools.server.enabled),
pref!(devtools.server.port) as u16,
)
};
let webdriver_port = opt_match.opt_default("webdriver", "7000").map(|port| {
port.parse().unwrap_or_else(|err| {
@ -874,6 +889,7 @@ pub fn from_cmdline_args(mut opts: Options, args: &[String]) -> ArgumentParsingR
trace_layout: debug_options.trace_layout,
debugger_port: debugger_port,
devtools_port: devtools_port,
devtools_server_enabled: devtools_enabled,
webdriver_port: webdriver_port,
initial_window_size: initial_window_size,
multiprocess: opt_match.opt_present("M"),

View file

@ -123,6 +123,12 @@ mod gen {
},
},
},
devtools: {
server: {
enabled: bool,
port: i64,
},
},
dom: {
webgpu: {
enabled: bool,

View file

@ -22,6 +22,7 @@ log = "0.4"
msg = { path = "../msg" }
serde = "1.0"
serde_json = "1.0"
servo_config = { path = "../config" }
servo_rand = { path = "../rand" }
servo_url = { path = "../url" }
time = "0.1"

View file

@ -356,9 +356,15 @@ where
let mem_profiler_chan = profile_mem::Profiler::create(opts.mem_profiler_period);
let debugger_chan = opts.debugger_port.map(|port| debugger::start_server(port));
let devtools_chan = opts
.devtools_port
.map(|port| devtools::start_server(port, embedder_proxy.clone()));
let devtools_chan = if opts.devtools_server_enabled {
Some(devtools::start_server(
opts.devtools_port,
embedder_proxy.clone(),
))
} else {
None
};
let coordinates = window.get_coordinates();
let device_pixel_ratio = coordinates.hidpi_factor.get();

View file

@ -30,6 +30,7 @@ libloading = "0.5"
[build-dependencies]
gl_generator = "0.14"
serde_json = "1.0"
[features]
debugmozjs = ["libservo/debugmozjs"]

View file

@ -3,6 +3,7 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use gl_generator::{Api, Fallbacks, Profile, Registry};
use serde_json::{self, Value};
use std::env;
use std::fs::File;
use std::path::PathBuf;
@ -40,4 +41,30 @@ fn main() {
.write_bindings(gl_generator::StructGenerator, &mut file)
.unwrap();
}
// Merge prefs.json and package-prefs.json
let mut default_prefs = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
default_prefs.push("../../../resources/prefs.json");
let mut prefs: Value = serde_json::from_reader(File::open(&default_prefs).unwrap()).unwrap();
let mut pkg_prefs = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
pkg_prefs.push("../../../resources/package-prefs.json");
let pkg_prefs: Value = serde_json::from_reader(File::open(&pkg_prefs).unwrap()).unwrap();
if target.contains("uwp") {
// Assuming Hololens build
let to_merge = pkg_prefs
.as_object()
.unwrap()
.get("hololens")
.unwrap()
.as_object()
.unwrap();
for (key, value) in to_merge.iter() {
prefs
.as_object_mut()
.unwrap()
.insert(key.clone(), value.clone());
}
}
let file = File::create(&dest.join("prefs.json")).unwrap();
serde_json::to_writer(file, &prefs).unwrap();
}

View file

@ -30,8 +30,7 @@ use servo::euclid::{Point2D, Rect, Scale, Size2D, Vector2D};
use servo::keyboard_types::{Key, KeyState, KeyboardEvent};
use servo::msg::constellation_msg::TraversalDirection;
use servo::script_traits::{TouchEventType, TouchId};
use servo::servo_config::opts;
use servo::servo_config::{pref, set_pref};
use servo::servo_config::{opts, pref};
use servo::servo_url::ServoUrl;
use servo::webrender_api::units::DevicePixel;
use servo::webrender_api::ScrollLocation;
@ -62,7 +61,6 @@ pub struct InitOptions {
pub coordinates: Coordinates,
pub density: f32,
pub xr_discovery: Option<webxr::Discovery>,
pub enable_subpixel_text_antialiasing: bool,
pub gl_context_pointer: Option<*const c_void>,
pub native_display_pointer: Option<*const c_void>,
pub native_widget: *mut c_void,
@ -227,22 +225,15 @@ pub fn init(
) -> Result<(), &'static str> {
resources::set(Box::new(ResourceReaderInstance::new()));
let mut args = mem::replace(&mut init_opts.args, vec![]);
if !args.is_empty() {
// opts::from_cmdline_args expects the first argument to be the binary name.
args.insert(0, "servo".to_string());
set_pref!(
gfx.subpixel_text_antialiasing.enabled,
init_opts.enable_subpixel_text_antialiasing
);
opts::from_cmdline_args(Options::new(), &args);
}
if let Some(prefs) = init_opts.prefs {
add_user_prefs(prefs);
}
let mut args = mem::replace(&mut init_opts.args, vec![]);
// opts::from_cmdline_args expects the first argument to be the binary name.
args.insert(0, "servo".to_string());
opts::from_cmdline_args(Options::new(), &args);
let pref_url = ServoUrl::parse(&pref!(shell.homepage)).ok();
let blank_url = ServoUrl::parse("about:blank").ok();
@ -943,7 +934,7 @@ impl ResourceReaderInstance {
impl ResourceReaderMethods for ResourceReaderInstance {
fn read(&self, res: Resource) -> Vec<u8> {
Vec::from(match res {
Resource::Preferences => &include_bytes!("../../../../resources/prefs.json")[..],
Resource::Preferences => &include_bytes!(concat!(env!("OUT_DIR"), "/prefs.json"))[..],
Resource::HstsPreloadList => {
&include_bytes!("../../../../resources/hsts_preload.json")[..]
},

View file

@ -243,7 +243,6 @@ pub struct CInitOptions {
pub width: i32,
pub height: i32,
pub density: f32,
pub enable_subpixel_text_antialiasing: bool,
pub vslogger_mod_list: *const *const c_char,
pub vslogger_mod_size: u32,
pub native_widget: *mut c_void,
@ -446,7 +445,6 @@ unsafe fn init(
prefs,
density: opts.density,
xr_discovery: None,
enable_subpixel_text_antialiasing: opts.enable_subpixel_text_antialiasing,
gl_context_pointer: gl_context,
native_display_pointer: display,
native_widget: opts.native_widget,

View file

@ -5,6 +5,13 @@
"linux": {},
"android": {},
"windows": {},
"hololens": {
"_comment": "settings specific to Hololens/UWP builds",
"devtools.server.enabled": true,
"dom.webxr.enabled": true,
"shell.homepage": "https://servo.org/hl-home/",
"gfx.subpixel-text-antialiasing.enabled": false
},
"vr": {
"_comment": "settings specific to VR builds",
"dom.webvr.enabled": true,

View file

@ -1,4 +1,6 @@
{
"devtools.server.enabled": false,
"devtools.server.port": 0,
"dom.bluetooth.enabled": false,
"dom.bluetooth.testing.enabled": false,
"dom.canvas_capture.enabled": false,

View file

@ -1,8 +1,6 @@
#pragma once
#define DEFAULT_URL_PROD L"https://servo.org/hl-home/"
// For development purpose.
// Will override DEFAULT_URL_PROD or any locally stored preferences.
// Will override shell.homepage preference:
// #define OVERRIDE_DEFAULT_URL L"data:text/html,<input>"
// #define OVERRIDE_DEFAULT_URL L"http://localhost:8000/test.html"

View file

@ -147,14 +147,6 @@ Servo::Servo(std::optional<hstring> initUrl, hstring args, GLsizei width,
auto prefs = localSettings.Containers().Lookup(L"servoUserPrefs");
if (!prefs.Values().HasKey(L"shell.homepage")) {
prefs.Values().Insert(L"shell.homepage", box_value(DEFAULT_URL_PROD));
}
if (!prefs.Values().HasKey(L"dom.webxr.enabled")) {
prefs.Values().Insert(L"dom.webxr.enabled", box_value(true));
}
std::vector<capi::CPref> cprefs;
for (auto pref : prefs.Values()) {
@ -172,22 +164,9 @@ Servo::Servo(std::optional<hstring> initUrl, hstring args, GLsizei width,
auto val = unbox_value<bool>(value);
cpref.value = &val;
} else if (type == Windows::Foundation::PropertyType::String) {
hstring strValue;
if (pref.Key() == L"shell.homepage") {
if (initUrl.has_value()) {
strValue = *initUrl;
} else {
#ifdef OVERRIDE_DEFAULT_URL
strValue = OVERRIDE_DEFAULT_URL;
#else
strValue = unbox_value<hstring>(value);
#endif
}
} else {
strValue = unbox_value<hstring>(value);
}
cpref.pref_type = capi::CPrefType::Str;
cpref.value = *hstring2char(strValue);
auto val = unbox_value<hstring>(value);
cpref.value = *hstring2char(val);
} else if (type == Windows::Foundation::PropertyType::Int64) {
cpref.pref_type = capi::CPrefType::Int;
auto val = unbox_value<int64_t>(value);
@ -205,15 +184,22 @@ Servo::Servo(std::optional<hstring> initUrl, hstring args, GLsizei width,
cprefs.push_back(cpref);
}
if (initUrl.has_value()) {
setNonPersistentHomepage(*initUrl, cprefs);
} else {
#ifdef OVERRIDE_DEFAULT_URL
setNonPersistentHomepage(OVERRIDE_DEFAULT_URL, cprefs);
#endif
}
capi::CPrefList prefsList = {cprefs.size(), cprefs.data()};
capi::CInitOptions o;
o.prefs = &prefsList;
o.args = *hstring2char(args + L" --devtools");
o.args = *hstring2char(args);
o.width = mWindowWidth;
o.height = mWindowHeight;
o.density = dpi;
o.enable_subpixel_text_antialiasing = false;
o.native_widget = eglNativeWindow;
// Note about logs:
@ -385,6 +371,20 @@ std::vector<Servo::PrefTuple> Servo::GetPrefs() {
return vec;
}
void setNonPersistentHomepage(hstring url, std::vector<capi::CPref> &cprefs) {
for (auto cpref : cprefs) {
if (strcmp(cpref.key, "shell.homepage") == 0) {
cpref.value = *hstring2char(url);
return;
}
}
capi::CPref cpref;
cpref.key = "shell.homepage";
cpref.pref_type = capi::CPrefType::Str;
cpref.value = *hstring2char(url);
cprefs.push_back(cpref);
}
winrt::hstring char2hstring(const char *c_str) {
// FIXME: any better way of doing this?
auto str = std::string(c_str);

View file

@ -21,6 +21,7 @@ using namespace capi;
hstring char2hstring(const char *);
std::unique_ptr<char *> hstring2char(hstring);
void setNonPersistentHomepage(hstring, std::vector<capi::CPref> &);
class ServoDelegate;

View file

@ -661,6 +661,8 @@ void ServoControl::OnServoDevtoolsStarted(bool success, const unsigned int port,
hstring token) {
RunOnUIThread([=] {
auto status = success ? DevtoolsStatus::Running : DevtoolsStatus::Failed;
// This port works, let's save it for future use.
Servo::SetIntPref(L"devtools.server.port", port);
mOnDevtoolsStatusChangedEvent(status, port, token);
});
}