mirror of
https://github.com/servo/servo.git
synced 2025-08-04 13:10:20 +01:00
ohos: Allow passing arguments to servoshell (#33588)
* ohos: Bump minimum CMake version By bumping the minimum CMake version, we avoid a deprecation warning. The OH 4.0 SDK ships with CMake 3.16, so we can be sure that we have CMake 3.16 or newer available. Signed-off-by: Jonathan Schwender <jonathan.schwender@huawei.com> * ohos: Allow passing arguments to servoshell Allows passing options passed via `wants` to the Ability through to servoshell. This allows easier debugging, either by calling servoshell from a test app, or from the commandline, e.g. ``` hdc shell aa start -a EntryAbility -b org.servo.servoshell -U "https://www.wikipedia.org" \ --pb dom.webgpu.enabled true \ --ps dom.webgpu.wgpu_backend "gl" \ --pi layout.threads 4 ``` Note: While the OH `wants` API differentiates between boolean, string and integer values, we convert everything back to strings, so we can reuse the same parsing code as the desktop servoshell. Signed-off-by: Jonathan Schwender <jonathan.schwender@huawei.com> Signed-off-by: Jonathan Schwender <schwenderjonathan@gmail.com> --------- Signed-off-by: Jonathan Schwender <jonathan.schwender@huawei.com> Signed-off-by: Jonathan Schwender <schwenderjonathan@gmail.com>
This commit is contained in:
parent
d7da0563d3
commit
e534c7d461
5 changed files with 90 additions and 6 deletions
|
@ -51,6 +51,7 @@ pub struct InitOpts {
|
||||||
/// Path to application data bundled with the servo app, e.g. web-pages.
|
/// Path to application data bundled with the servo app, e.g. web-pages.
|
||||||
pub resource_dir: String,
|
pub resource_dir: String,
|
||||||
pub display_density: f64,
|
pub display_density: f64,
|
||||||
|
pub commandline_args: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
|
|
@ -17,6 +17,8 @@ use servo::embedder_traits::resources;
|
||||||
/// and that perform_updates need to be called
|
/// and that perform_updates need to be called
|
||||||
pub use servo::embedder_traits::EventLoopWaker;
|
pub use servo::embedder_traits::EventLoopWaker;
|
||||||
use servo::euclid::Size2D;
|
use servo::euclid::Size2D;
|
||||||
|
use servo::servo_config::opts;
|
||||||
|
use servo::servo_config::opts::ArgumentParsingResult;
|
||||||
use servo::servo_url::ServoUrl;
|
use servo::servo_url::ServoUrl;
|
||||||
use servo::webrender_traits::RenderingContext;
|
use servo::webrender_traits::RenderingContext;
|
||||||
use servo::{self, gl, Servo};
|
use servo::{self, gl, Servo};
|
||||||
|
@ -43,6 +45,58 @@ pub fn init(
|
||||||
crate::init_tracing();
|
crate::init_tracing();
|
||||||
let resource_dir = PathBuf::from(&options.resource_dir).join("servo");
|
let resource_dir = PathBuf::from(&options.resource_dir).join("servo");
|
||||||
resources::set(Box::new(ResourceReaderInstance::new(resource_dir)));
|
resources::set(Box::new(ResourceReaderInstance::new(resource_dir)));
|
||||||
|
let mut args = vec!["servoshell".to_string()];
|
||||||
|
// It would be nice if `from_cmdline_args()` could accept str slices, to avoid allocations here.
|
||||||
|
// Then again, this code could and maybe even should be disabled in production builds.
|
||||||
|
let split_args: Vec<String> = options
|
||||||
|
.commandline_args
|
||||||
|
.split("\u{1f}")
|
||||||
|
.map(|arg| arg.to_string())
|
||||||
|
.collect();
|
||||||
|
args.extend(split_args);
|
||||||
|
debug!("Servo commandline args: {:?}", args);
|
||||||
|
|
||||||
|
let mut opts = getopts::Options::new();
|
||||||
|
opts.optopt(
|
||||||
|
"u",
|
||||||
|
"user-agent",
|
||||||
|
"Set custom user agent string (or ios / android / desktop for platform default)",
|
||||||
|
"NCSA Mosaic/1.0 (X11;SunOS 4.1.4 sun4m)",
|
||||||
|
);
|
||||||
|
opts.optmulti(
|
||||||
|
"",
|
||||||
|
"pref",
|
||||||
|
"A preference to set to enable",
|
||||||
|
"dom.bluetooth.enabled",
|
||||||
|
);
|
||||||
|
opts.optmulti(
|
||||||
|
"",
|
||||||
|
"pref",
|
||||||
|
"A preference to set to disable",
|
||||||
|
"dom.webgpu.enabled=false",
|
||||||
|
);
|
||||||
|
opts.optmulti(
|
||||||
|
"",
|
||||||
|
"prefs-file",
|
||||||
|
"Load in additional prefs from a file.",
|
||||||
|
"--prefs-file /path/to/prefs.json",
|
||||||
|
);
|
||||||
|
|
||||||
|
let opts_matches;
|
||||||
|
let content_process_token;
|
||||||
|
match opts::from_cmdline_args(opts, &args) {
|
||||||
|
ArgumentParsingResult::ContentProcess(matches, token) => {
|
||||||
|
error!("Content Process mode not supported / tested yet on OpenHarmony!");
|
||||||
|
opts_matches = matches;
|
||||||
|
content_process_token = Some(token);
|
||||||
|
},
|
||||||
|
ArgumentParsingResult::ChromeProcess(matches) => {
|
||||||
|
opts_matches = matches;
|
||||||
|
content_process_token = None;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
crate::prefs::register_user_prefs(&opts_matches);
|
||||||
|
|
||||||
gl.clear_color(1.0, 1.0, 1.0, 1.0);
|
gl.clear_color(1.0, 1.0, 1.0, 1.0);
|
||||||
gl.clear(gl::COLOR_BUFFER_BIT);
|
gl.clear(gl::COLOR_BUFFER_BIT);
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
# the minimum version of CMake.
|
# the minimum version of CMake.
|
||||||
cmake_minimum_required(VERSION 3.4.1)
|
cmake_minimum_required(VERSION 3.16.0)
|
||||||
project(servoshell)
|
project(servoshell)
|
||||||
|
|
|
@ -5,8 +5,29 @@ import Want from '@ohos.app.ability.Want';
|
||||||
import window from '@ohos.window';
|
import window from '@ohos.window';
|
||||||
|
|
||||||
export default class EntryAbility extends UIAbility {
|
export default class EntryAbility extends UIAbility {
|
||||||
|
init_params: LocalStorage = new LocalStorage();
|
||||||
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
|
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
|
||||||
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
|
let uri: string = want.uri || "https://servo.org"
|
||||||
|
let params: string[] = []
|
||||||
|
if (typeof want.parameters !== "undefined") {
|
||||||
|
Object.entries(want.parameters).forEach((entry) => {
|
||||||
|
let key = entry[0]
|
||||||
|
// Skip some default parameters, since servo is not interested in those
|
||||||
|
if (key.startsWith("ohos.")
|
||||||
|
|| key.startsWith("component.")
|
||||||
|
|| key === "isCallBySCB"
|
||||||
|
|| key === "moduleName"
|
||||||
|
) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let value = entry[1]
|
||||||
|
params.push("--" + key + "=" + value.toString())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
let servoshell_params = params.join("\u{001f}")
|
||||||
|
hilog.debug(0x0000, 'Servo EntryAbility', 'Servoshell parameters: %{public}s', servoshell_params);
|
||||||
|
this.init_params.setOrCreate('InitialURI', uri)
|
||||||
|
this.init_params.setOrCreate('CommandlineArgs', servoshell_params)
|
||||||
}
|
}
|
||||||
|
|
||||||
onDestroy() {
|
onDestroy() {
|
||||||
|
@ -17,7 +38,7 @@ export default class EntryAbility extends UIAbility {
|
||||||
// Main window is created, set main page for this ability
|
// Main window is created, set main page for this ability
|
||||||
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
|
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
|
||||||
|
|
||||||
windowStage.loadContent('pages/Index', (err, data) => {
|
windowStage.loadContent('pages/Index', this.init_params, (err, data) => {
|
||||||
if (err.code) {
|
if (err.code) {
|
||||||
hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
|
hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -16,6 +16,7 @@ interface InitOpts {
|
||||||
osFullName: string,
|
osFullName: string,
|
||||||
resourceDir: string,
|
resourceDir: string,
|
||||||
displayDensity: number,
|
displayDensity: number,
|
||||||
|
commandlineArgs: string,
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_density(): number {
|
function get_density(): number {
|
||||||
|
@ -39,7 +40,10 @@ function get_device_type(): string {
|
||||||
return device_type;
|
return device_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Entry
|
// Use the getShared API to obtain the LocalStorage instance shared by stage.
|
||||||
|
let storage = LocalStorage.getShared()
|
||||||
|
|
||||||
|
@Entry(storage)
|
||||||
@Component
|
@Component
|
||||||
struct Index {
|
struct Index {
|
||||||
xComponentContext: ServoXComponentInterface | undefined = undefined;
|
xComponentContext: ServoXComponentInterface | undefined = undefined;
|
||||||
|
@ -48,8 +52,11 @@ struct Index {
|
||||||
type: XComponentType.SURFACE,
|
type: XComponentType.SURFACE,
|
||||||
libraryname: 'servoshell',
|
libraryname: 'servoshell',
|
||||||
}
|
}
|
||||||
@State urlToLoad: string = 'https://servo.org'
|
|
||||||
private context = getContext(this) as common.UIAbilityContext;
|
private context = getContext(this) as common.UIAbilityContext;
|
||||||
|
@LocalStorageProp('InitialURI') InitialURI: string = "unused"
|
||||||
|
@LocalStorageProp('CommandlineArgs') CommandlineArgs: string = ""
|
||||||
|
@State urlToLoad: string = this.InitialURI
|
||||||
|
|
||||||
build() {
|
build() {
|
||||||
Column() {
|
Column() {
|
||||||
|
@ -86,13 +93,14 @@ struct Index {
|
||||||
.onLoad((xComponentContext) => {
|
.onLoad((xComponentContext) => {
|
||||||
this.xComponentContext = xComponentContext as ServoXComponentInterface;
|
this.xComponentContext = xComponentContext as ServoXComponentInterface;
|
||||||
let resource_dir: string = this.context.resourceDir;
|
let resource_dir: string = this.context.resourceDir;
|
||||||
console.debug("Resources are located at %s", resource_dir);
|
console.debug("Resources are located at %{public}s", resource_dir);
|
||||||
let init_options: InitOpts = {
|
let init_options: InitOpts = {
|
||||||
url: this.urlToLoad,
|
url: this.urlToLoad,
|
||||||
deviceType: get_device_type(),
|
deviceType: get_device_type(),
|
||||||
osFullName: deviceInfo.osFullName,
|
osFullName: deviceInfo.osFullName,
|
||||||
displayDensity: get_density(),
|
displayDensity: get_density(),
|
||||||
resourceDir: resource_dir,
|
resourceDir: resource_dir,
|
||||||
|
commandlineArgs: this.CommandlineArgs
|
||||||
}
|
}
|
||||||
this.xComponentContext.initServo(init_options)
|
this.xComponentContext.initServo(init_options)
|
||||||
this.xComponentContext.registerURLcallback((new_url) => {
|
this.xComponentContext.registerURLcallback((new_url) => {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue