diff options
-rw-r--r-- | Cargo.lock | 4 | ||||
-rw-r--r-- | components/config/prefs.rs | 3 | ||||
-rw-r--r-- | components/script/webdriver_handlers.rs | 46 | ||||
-rw-r--r-- | ports/servoshell/egl/ohos.rs | 3 | ||||
-rw-r--r-- | ports/servoshell/prefs.rs | 6 | ||||
-rw-r--r-- | tests/wpt/meta/webdriver/tests/classic/execute_async_script/collections.py.ini | 3 | ||||
-rw-r--r-- | tests/wpt/meta/webdriver/tests/classic/execute_script/collections.py.ini | 3 |
7 files changed, 42 insertions, 26 deletions
diff --git a/Cargo.lock b/Cargo.lock index 90bb55247c1..0d5553c9c73 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2027,9 +2027,9 @@ dependencies = [ [[package]] name = "error-code" -version = "3.3.1" +version = "3.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" +checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" [[package]] name = "etagere" diff --git a/components/config/prefs.rs b/components/config/prefs.rs index 96c40c91360..a9ec112e3eb 100644 --- a/components/config/prefs.rs +++ b/components/config/prefs.rs @@ -236,6 +236,8 @@ pub struct Preferences { /// The user-agent to use for Servo. This can also be set via [`UserAgentPlatform`] in /// order to set the value to the default value for the given platform. pub user_agent: String, + + pub log_filter: String, } impl Preferences { @@ -398,6 +400,7 @@ impl Preferences { threadpools_webrender_workers_max: 4, webgl_testing_context_creation_error: false, user_agent: String::new(), + log_filter: String::new(), } } } diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index f90f3024a70..330ae4f0788 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -199,7 +199,7 @@ unsafe fn is_arguments_object(cx: *mut JSContext, value: HandleValue) -> bool { jsstring_to_str(cx, class_name) == "[object Arguments]" } -#[derive(Eq, Hash, PartialEq)] +#[derive(Clone, Eq, Hash, PartialEq)] struct HashableJSVal(u64); impl From<HandleValue<'_>> for HashableJSVal { @@ -209,6 +209,7 @@ impl From<HandleValue<'_>> for HashableJSVal { } #[allow(unsafe_code)] +/// <https://w3c.github.io/webdriver/#dfn-json-deserialize> pub(crate) fn jsval_to_webdriver( cx: SafeJSContext, global_scope: &GlobalScope, @@ -231,12 +232,6 @@ unsafe fn jsval_to_webdriver_inner( val: HandleValue, seen: &mut HashSet<HashableJSVal>, ) -> WebDriverJSResult { - let hashable = val.into(); - if seen.contains(&hashable) { - return Err(WebDriverJSError::JSError); - } - seen.insert(hashable); - let _ac = enter_realm(global_scope); if val.get().is_undefined() { Ok(WebDriverJSValue::Undefined) @@ -268,14 +263,26 @@ unsafe fn jsval_to_webdriver_inner( _ => unreachable!(), }; Ok(WebDriverJSValue::String(String::from(string))) - } else if val.get().is_object() { + } + // https://w3c.github.io/webdriver/#dfn-clone-an-object + else if val.get().is_object() { + let hashable = val.into(); + // Step 1. If value is in `seen`, return error with error code javascript error. + if seen.contains(&hashable) { + return Err(WebDriverJSError::JSError); + } + //Step 2. Append value to `seen`. + seen.insert(hashable.clone()); + rooted!(in(cx) let object = match FromJSValConvertible::from_jsval(cx, val, ()).unwrap() { ConversionResult::Success(object) => object, _ => unreachable!(), }); let _ac = JSAutoRealm::new(cx, *object); - if is_array_like::<crate::DomTypeHolder>(cx, val) || is_arguments_object(cx, val) { + let return_val = if is_array_like::<crate::DomTypeHolder>(cx, val) || + is_arguments_object(cx, val) + { let mut result: Vec<WebDriverJSValue> = Vec::new(); let length = match get_property::<u32>( @@ -298,7 +305,7 @@ unsafe fn jsval_to_webdriver_inner( return Err(WebDriverJSError::JSError); }, }; - + // Step 4. For each enumerable property in value, run the following substeps: for i in 0..length { rooted!(in(cx) let mut item = UndefinedValue()); match get_property_jsval(cx, object.handle(), &i.to_string(), item.handle_mut()) { @@ -319,7 +326,6 @@ unsafe fn jsval_to_webdriver_inner( }, } } - Ok(WebDriverJSValue::ArrayLike(result)) } else if let Ok(element) = root_from_object::<Element>(*object, cx) { Ok(WebDriverJSValue::Element(WebElement( @@ -328,7 +334,7 @@ unsafe fn jsval_to_webdriver_inner( } else if let Ok(window) = root_from_object::<Window>(*object, cx) { let window_proxy = window.window_proxy(); if window_proxy.is_browsing_context_discarded() { - Err(WebDriverJSError::StaleElementReference) + return Err(WebDriverJSError::StaleElementReference); } else if window_proxy.browsing_context_id() == window_proxy.webview_id() { Ok(WebDriverJSValue::Window(WebWindow( window.Document().upcast::<Node>().unique_id(), @@ -348,7 +354,12 @@ unsafe fn jsval_to_webdriver_inner( &HandleValueArray::empty(), value.handle_mut(), ) { - jsval_to_webdriver_inner(cx, global_scope, value.handle(), seen) + Ok(jsval_to_webdriver_inner( + cx, + global_scope, + value.handle(), + seen, + )?) } else { throw_dom_exception( SafeJSContext::from_ptr(cx), @@ -356,7 +367,7 @@ unsafe fn jsval_to_webdriver_inner( Error::JSFailed, CanGc::note(), ); - Err(WebDriverJSError::JSError) + return Err(WebDriverJSError::JSError); } } else { let mut result = HashMap::new(); @@ -408,9 +419,12 @@ unsafe fn jsval_to_webdriver_inner( } } } - Ok(WebDriverJSValue::Object(result)) - } + }; + // Step 5. Remove the last element of `seen`. + seen.remove(&hashable); + // Step 6. Return success with data `result`. + return_val } else { Err(WebDriverJSError::UnknownType) } diff --git a/ports/servoshell/egl/ohos.rs b/ports/servoshell/egl/ohos.rs index 236f1d842da..9b537f0409c 100644 --- a/ports/servoshell/egl/ohos.rs +++ b/ports/servoshell/egl/ohos.rs @@ -387,6 +387,7 @@ extern "C" fn on_dispatch_key_event(xc: *mut OH_NativeXComponent, _window: *mut static LOGGER: LazyLock<hilog::Logger> = LazyLock::new(|| { let mut builder = hilog::Builder::new(); + builder.set_domain(hilog::LogDomain::new(0xE0C3)); let filters = [ "fonts", "servo", @@ -678,7 +679,7 @@ impl EventLoopWaker for WakeupCallback { } fn wake(&self) { - info!("wake called!"); + log::trace!("wake called!"); self.chan.send(ServoAction::WakeUp).unwrap_or_else(|e| { error!("Failed to send wake message with: {e}"); }); diff --git a/ports/servoshell/prefs.rs b/ports/servoshell/prefs.rs index a2efe3bab3b..a3ebda231d0 100644 --- a/ports/servoshell/prefs.rs +++ b/ports/servoshell/prefs.rs @@ -428,7 +428,11 @@ pub(crate) fn parse_command_line_arguments(args: Vec<String>) -> ArgumentParsing #[cfg(target_env = "ohos")] let log_filter = { let filters = opt_match.opt_strs("log-filter").join(","); - (!filters.is_empty()).then_some(filters) + let log_filter = (!filters.is_empty()).then_some(filters).or_else(|| { + (!preferences.log_filter.is_empty()).then_some(preferences.log_filter.clone()) + }); + log::debug!("Set log_filter to: {:?}", log_filter); + log_filter }; let mut debug_options = DebugOptions::default(); diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_async_script/collections.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/collections.py.ini index eb7c9dd30ae..710ae93d053 100644 --- a/tests/wpt/meta/webdriver/tests/classic/execute_async_script/collections.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/collections.py.ini @@ -1,7 +1,4 @@ [collections.py] - [test_array_in_array] - expected: FAIL - [test_file_list] expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_script/collections.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_script/collections.py.ini index ff87e768065..710ae93d053 100644 --- a/tests/wpt/meta/webdriver/tests/classic/execute_script/collections.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/execute_script/collections.py.ini @@ -4,6 +4,3 @@ [test_html_all_collection] expected: FAIL - - [test_array_in_array] - expected: FAIL |