aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock4
-rw-r--r--components/config/prefs.rs3
-rw-r--r--components/script/webdriver_handlers.rs46
-rw-r--r--ports/servoshell/egl/ohos.rs3
-rw-r--r--ports/servoshell/prefs.rs6
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/execute_async_script/collections.py.ini3
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/execute_script/collections.py.ini3
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