diff --git a/Cargo.lock b/Cargo.lock index 21c9134e43e9..10c20b566370 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20,9 +20,9 @@ dependencies = [ [[package]] name = "adler" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccc9a9dd069569f212bc4330af9f17c4afb5e8ce185e83dbb14f1349dda18b10" +checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" [[package]] name = "adler32" diff --git a/components/compositing/lib.rs b/components/compositing/lib.rs index cc4f86922ffb..3a7634e3f570 100644 --- a/components/compositing/lib.rs +++ b/components/compositing/lib.rs @@ -109,6 +109,8 @@ pub enum ConstellationMsg { MediaSessionAction(MediaSessionActionType), /// Toggle browser visibility. ChangeBrowserVisibility(TopLevelBrowsingContextId, bool), + /// Virtual keyboard was dismissed + IMEDismissed, } impl fmt::Debug for ConstellationMsg { @@ -140,6 +142,7 @@ impl fmt::Debug for ConstellationMsg { ExitFullScreen(..) => "ExitFullScreen", MediaSessionAction(..) => "MediaSessionAction", ChangeBrowserVisibility(..) => "ChangeBrowserVisibility", + IMEDismissed => "IMEDismissed", }; write!(formatter, "ConstellationMsg::{}", variant) } diff --git a/components/compositing/windowing.rs b/components/compositing/windowing.rs index ac481486d378..c308bf196f6f 100644 --- a/components/compositing/windowing.rs +++ b/components/compositing/windowing.rs @@ -102,6 +102,8 @@ pub enum WindowEvent { MediaSessionAction(MediaSessionActionType), /// Set browser visibility. A hidden browser will not tick the animations. ChangeBrowserVisibility(TopLevelBrowsingContextId, bool), + /// Virtual keyboard was dismissed + IMEDismissed, } impl Debug for WindowEvent { @@ -134,6 +136,7 @@ impl Debug for WindowEvent { WindowEvent::ExitFullScreen(..) => write!(f, "ExitFullScreen"), WindowEvent::MediaSessionAction(..) => write!(f, "MediaSessionAction"), WindowEvent::ChangeBrowserVisibility(..) => write!(f, "ChangeBrowserVisibility"), + WindowEvent::IMEDismissed => write!(f, "IMEDismissed"), } } } diff --git a/components/constellation/constellation.rs b/components/constellation/constellation.rs index 1fe8bb034f23..4d94533ffae7 100644 --- a/components/constellation/constellation.rs +++ b/components/constellation/constellation.rs @@ -1470,6 +1470,9 @@ where FromCompositorMsg::Keyboard(key_event) => { self.handle_key_msg(key_event); }, + FromCompositorMsg::IMEDismissed => { + self.handle_ime_dismissed(); + }, // Perform a navigation previously requested by script, if approved by the embedder. // If there is already a pending page (self.pending_changes), it will not be overridden; // However, if the id is not encompassed by another change, it will be. @@ -4074,6 +4077,39 @@ where session_history.replace_history_state(pipeline_id, history_state_id, url); } + fn handle_ime_dismissed(&mut self) { + // Send to the focused browsing contexts' current pipeline. + let focused_browsing_context_id = self + .active_browser_id + .and_then(|browser_id| self.browsers.get(&browser_id)) + .map(|browser| browser.focused_browsing_context_id); + if let Some(browsing_context_id) = focused_browsing_context_id { + let pipeline_id = match self.browsing_contexts.get(&browsing_context_id) { + Some(ctx) => ctx.pipeline_id, + None => { + return warn!( + "Got IME dismissed event for nonexistent browsing context {}.", + browsing_context_id, + ); + }, + }; + let msg = + ConstellationControlMsg::SendEvent(pipeline_id, CompositorEvent::IMEDismissedEvent); + let result = match self.pipelines.get(&pipeline_id) { + Some(pipeline) => pipeline.event_loop.send(msg), + None => { + return debug!( + "Pipeline {:?} got IME dismissed event after closure.", + pipeline_id + ); + }, + }; + if let Err(e) = result { + self.handle_send_error(pipeline_id, e); + } + } + } + fn handle_key_msg(&mut self, event: KeyboardEvent) { // Send to the focused browsing contexts' current pipeline. If it // doesn't exist, fall back to sending to the compositor. diff --git a/components/devtools/actor.rs b/components/devtools/actor.rs index f6aca6923d98..158092ee1a87 100644 --- a/components/devtools/actor.rs +++ b/components/devtools/actor.rs @@ -159,7 +159,13 @@ impl ActorRegistry { msg: &Map, stream: &mut TcpStream, ) -> Result<(), ()> { - let to = msg.get("to").unwrap().as_str().unwrap(); + let to = match msg.get("to") { + Some(to) => to.as_str().unwrap(), + None => { + warn!("Received unexpected message: {:?}", msg); + return Err(()); + }, + }; match self.actors.get(to) { None => debug!("message received for unknown actor \"{}\"", to), diff --git a/components/devtools/actors/browsing_context.rs b/components/devtools/actors/browsing_context.rs index b90d84d04bd8..708c9f69de9e 100644 --- a/components/devtools/actors/browsing_context.rs +++ b/components/devtools/actors/browsing_context.rs @@ -12,8 +12,8 @@ use crate::actors::emulation::EmulationActor; use crate::actors::inspector::InspectorActor; use crate::actors::performance::PerformanceActor; use crate::actors::profiler::ProfilerActor; -use crate::actors::root::RootActor; use crate::actors::stylesheets::StyleSheetsActor; +use crate::actors::tab::TabDescriptorActor; use crate::actors::thread::ThreadActor; use crate::actors::timeline::TimelineActor; use crate::protocol::JsonPacketStream; @@ -130,6 +130,7 @@ pub struct BrowsingContextActor { pub performance: String, pub styleSheets: String, pub thread: String, + pub tab: String, pub streams: RefCell>, pub browsing_context_id: BrowsingContextId, pub active_pipeline: Cell, @@ -266,6 +267,9 @@ impl BrowsingContextActor { let thread = ThreadActor::new(actors.new_name("context")); let DevtoolsPageInfo { title, url } = page_info; + + let tabdesc = TabDescriptorActor::new(actors, name.clone()); + let target = BrowsingContextActor { name: name, script_chan: script_sender, @@ -278,6 +282,7 @@ impl BrowsingContextActor { profiler: profiler.name(), performance: performance.name(), styleSheets: styleSheets.name(), + tab: tabdesc.name(), thread: thread.name(), streams: RefCell::new(Vec::new()), browsing_context_id: id, @@ -291,9 +296,8 @@ impl BrowsingContextActor { actors.register(Box::new(performance)); actors.register(Box::new(styleSheets)); actors.register(Box::new(thread)); + actors.register(Box::new(tabdesc)); - let root = actors.find_mut::("root"); - root.tabs.push(target.name.clone()); target } diff --git a/components/devtools/actors/root.rs b/components/devtools/actors/root.rs index 0010afd3b9fc..1965d9737283 100644 --- a/components/devtools/actors/root.rs +++ b/components/devtools/actors/root.rs @@ -7,9 +7,9 @@ /// Connection point for all new remote devtools interactions, providing lists of know actors /// that perform more specific actions (targets, addons, browser chrome, etc.) use crate::actor::{Actor, ActorMessageStatus, ActorRegistry}; -use crate::actors::browsing_context::{BrowsingContextActor, BrowsingContextActorMsg}; use crate::actors::device::DeviceActor; use crate::actors::performance::PerformanceActor; +use crate::actors::tab::{TabDescriptorActor, TabDescriptorActorMsg}; use crate::actors::worker::{WorkerActor, WorkerMsg}; use crate::protocol::{ActorDescription, JsonPacketStream}; use serde_json::{Map, Value}; @@ -45,13 +45,13 @@ struct GetRootReply { struct ListTabsReply { from: String, selected: u32, - tabs: Vec, + tabs: Vec, } #[derive(Serialize)] struct GetTabReply { from: String, - tab: BrowsingContextActorMsg, + tab: TabDescriptorActorMsg, } #[derive(Serialize)] @@ -181,7 +181,11 @@ impl Actor for RootActor { tabs: self .tabs .iter() - .map(|target| registry.find::(target).encodable()) + .map(|target| { + registry + .find::(target) + .encodable(®istry) + }) .collect(), }; stream.write_json_packet(&actor); @@ -211,10 +215,10 @@ impl Actor for RootActor { }, "getTab" => { - let tab = registry.find::(&self.tabs[0]); + let tab = registry.find::(&self.tabs[0]); let reply = GetTabReply { from: self.name(), - tab: tab.encodable(), + tab: tab.encodable(®istry), }; stream.write_json_packet(&reply); ActorMessageStatus::Processed diff --git a/components/devtools/actors/tab.rs b/components/devtools/actors/tab.rs new file mode 100644 index 000000000000..1f83d2462331 --- /dev/null +++ b/components/devtools/actors/tab.rs @@ -0,0 +1,101 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +use crate::actor::{Actor, ActorMessageStatus, ActorRegistry}; +use crate::actors::browsing_context::{BrowsingContextActor, BrowsingContextActorMsg}; +use crate::actors::root::RootActor; +use crate::protocol::JsonPacketStream; +use serde_json::{Map, Value}; +use std::net::TcpStream; + +#[derive(Serialize)] +pub struct TabDescriptorTraits { + getFavicon: bool, + hasTabInfo: bool, + watcher: bool, +} + +#[derive(Serialize)] +pub struct TabDescriptorActorMsg { + actor: String, + title: String, + url: String, + outerWindowID: u32, + browsingContextId: u32, + traits: TabDescriptorTraits, +} + +#[derive(Serialize)] +struct GetTargetReply { + from: String, + frame: BrowsingContextActorMsg, +} + +pub struct TabDescriptorActor { + name: String, + browsing_context_actor: String, +} + +impl Actor for TabDescriptorActor { + fn name(&self) -> String { + self.name.clone() + } + + fn handle_message( + &self, + registry: &ActorRegistry, + msg_type: &str, + _msg: &Map, + stream: &mut TcpStream, + ) -> Result { + Ok(match msg_type { + "getTarget" => { + let frame = registry + .find::(&self.browsing_context_actor) + .encodable(); + stream.write_json_packet(&GetTargetReply { + from: self.name(), + frame, + }); + ActorMessageStatus::Processed + }, + _ => ActorMessageStatus::Ignored, + }) + } +} + +impl TabDescriptorActor { + pub(crate) fn new( + actors: &mut ActorRegistry, + browsing_context_actor: String, + ) -> TabDescriptorActor { + let name = actors.new_name("tabDescription"); + let root = actors.find_mut::("root"); + root.tabs.push(name.clone()); + TabDescriptorActor { + name: name, + browsing_context_actor, + } + } + + pub fn encodable(&self, registry: &ActorRegistry) -> TabDescriptorActorMsg { + let ctx_actor = registry.find::(&self.browsing_context_actor); + + let title = ctx_actor.title.borrow().clone(); + let url = ctx_actor.url.borrow().clone(); + + TabDescriptorActorMsg { + title, + url, + actor: self.name(), + browsingContextId: ctx_actor.browsing_context_id.index.0.get(), + outerWindowID: ctx_actor.active_pipeline.get().index.0.get(), + traits: TabDescriptorTraits { + getFavicon: false, + hasTabInfo: true, + watcher: false, + }, + } + } +} diff --git a/components/devtools/lib.rs b/components/devtools/lib.rs index aafd8860590e..62238c656ee5 100644 --- a/components/devtools/lib.rs +++ b/components/devtools/lib.rs @@ -66,6 +66,7 @@ mod actors { pub mod profiler; pub mod root; pub mod stylesheets; + pub mod tab; pub mod thread; pub mod timeline; pub mod worker; diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 437b147678d7..8244f4af31f0 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -1722,6 +1722,13 @@ impl Document { self.window.reflow(ReflowGoal::Full, ReflowReason::KeyEvent); } + pub fn ime_dismissed(&self) { + self.request_focus( + self.GetBody().as_ref().map(|e| &*e.upcast()), + FocusType::Element, + ) + } + pub fn dispatch_composition_event( &self, composition_event: ::keyboard_types::CompositionEvent, diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 7a439e0dcd60..dda8699b9f2b 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -129,8 +129,8 @@ use profile_traits::time::{self as profile_time, profile, ProfilerCategory}; use script_layout_interface::message::{self, LayoutThreadInit, Msg, ReflowGoal}; use script_traits::webdriver_msg::WebDriverScriptCommand; use script_traits::CompositorEvent::{ - CompositionEvent, KeyboardEvent, MouseButtonEvent, MouseMoveEvent, ResizeEvent, TouchEvent, - WheelEvent, + CompositionEvent, IMEDismissedEvent, KeyboardEvent, MouseButtonEvent, MouseMoveEvent, + ResizeEvent, TouchEvent, WheelEvent, }; use script_traits::{ AnimationTickType, CompositorEvent, ConstellationControlMsg, DiscardBrowsingContext, @@ -3583,6 +3583,14 @@ impl ScriptThread { document.dispatch_key_event(key_event); }, + IMEDismissedEvent => { + let document = match self.documents.borrow().find_document(pipeline_id) { + Some(document) => document, + None => return warn!("Message sent to closed pipeline {}.", pipeline_id), + }; + document.ime_dismissed(); + }, + CompositionEvent(composition_event) => { let document = match self.documents.borrow().find_document(pipeline_id) { Some(document) => document, diff --git a/components/script_traits/lib.rs b/components/script_traits/lib.rs index f885a042ddd1..13dc9c32fa3f 100644 --- a/components/script_traits/lib.rs +++ b/components/script_traits/lib.rs @@ -570,6 +570,8 @@ pub enum CompositorEvent { KeyboardEvent(KeyboardEvent), /// An event from the IME is dispatched. CompositionEvent(CompositionEvent), + /// Virtual keyboard was dismissed + IMEDismissedEvent, } /// Requests a TimerEvent-Message be sent after the given duration. diff --git a/components/servo/lib.rs b/components/servo/lib.rs index b2a8ebc12fb0..aa71c8f3309a 100644 --- a/components/servo/lib.rs +++ b/components/servo/lib.rs @@ -663,6 +663,16 @@ where } }, + WindowEvent::IMEDismissed => { + let msg = ConstellationMsg::IMEDismissed; + if let Err(e) = self.constellation_chan.send(msg) { + warn!( + "Sending IMEDismissed event to constellation failed ({:?}).", + e + ); + } + }, + WindowEvent::Quit => { self.compositor.maybe_start_shutting_down(); }, diff --git a/ports/libsimpleservo/api/src/lib.rs b/ports/libsimpleservo/api/src/lib.rs index adf7cfe15d40..fc9ce60b8f99 100644 --- a/ports/libsimpleservo/api/src/lib.rs +++ b/ports/libsimpleservo/api/src/lib.rs @@ -560,6 +560,11 @@ impl ServoGlue { } } + pub fn ime_dismissed(&mut self) -> Result<(), &'static str> { + info!("ime_dismissed"); + self.process_event(WindowEvent::IMEDismissed) + } + pub fn on_context_menu_closed( &mut self, result: ContextMenuResult, diff --git a/ports/libsimpleservo/capi/src/lib.rs b/ports/libsimpleservo/capi/src/lib.rs index 6af857c352c0..01044cf70c21 100644 --- a/ports/libsimpleservo/capi/src/lib.rs +++ b/ports/libsimpleservo/capi/src/lib.rs @@ -766,6 +766,14 @@ pub extern "C" fn change_visibility(visible: bool) { }); } +#[no_mangle] +pub extern "C" fn ime_dismissed() { + catch_any_panic(|| { + debug!("ime_dismissed"); + call(|s| s.ime_dismissed()); + }); +} + pub struct WakeupCallback(extern "C" fn()); impl WakeupCallback { diff --git a/support/hololens/ServoApp/Devtools/Client.cpp b/support/hololens/ServoApp/Devtools/Client.cpp index b3bc3b9c7b6b..f854647ce0a1 100644 --- a/support/hololens/ServoApp/Devtools/Client.cpp +++ b/support/hololens/ServoApp/Devtools/Client.cpp @@ -113,24 +113,11 @@ void DevtoolsClient::HandleMessage(JsonObject obj) { } else if (obj.HasKey(L"tab")) { // Got the current tab. auto tab = obj.GetNamedObject(L"tab"); - if (tab.HasKey(L"actor")) { - // Attach to tab, and ask for cached messaged - JsonObject msg1; - mConsoleActor = tab.GetNamedValue(L"consoleActor"); - msg1.Insert(L"to", tab.GetNamedValue(L"actor")); - msg1.Insert(L"type", JsonValue::CreateStringValue(L"attach")); - Send(msg1); - JsonObject msg2; - msg2.Insert(L"to", *mConsoleActor); - msg2.Insert(L"type", - JsonValue::CreateStringValue(L"getCachedMessages")); - JsonArray types; - types.Append(JsonValue::CreateStringValue(L"PageError")); - types.Append(JsonValue::CreateStringValue(L"ConsoleAPI")); - msg2.Insert(L"messageTypes", types); - Send(msg2); - return; - } + JsonObject out; + out.Insert(L"to", tab.GetNamedValue(L"actor")); + out.Insert(L"type", JsonValue::CreateStringValue(L"getTarget")); + Send(out); + return; } } else if (obj.HasKey(L"resultID")) { // evaluateJSAsync response. @@ -163,6 +150,23 @@ void DevtoolsClient::HandleMessage(JsonObject obj) { // FIXME: log if there is a non-200 HTTP response return; } + } else if (obj.HasKey(L"frame")) { + auto frame = obj.GetNamedObject(L"frame"); + // Attach to tab, and ask for cached messaged + JsonObject msg1; + mConsoleActor = frame.GetNamedValue(L"consoleActor"); + msg1.Insert(L"to", frame.GetNamedValue(L"actor")); + msg1.Insert(L"type", JsonValue::CreateStringValue(L"attach")); + Send(msg1); + JsonObject msg2; + msg2.Insert(L"to", *mConsoleActor); + msg2.Insert(L"type", JsonValue::CreateStringValue(L"getCachedMessages")); + JsonArray types; + types.Append(JsonValue::CreateStringValue(L"PageError")); + types.Append(JsonValue::CreateStringValue(L"ConsoleAPI")); + msg2.Insert(L"messageTypes", types); + Send(msg2); + return; } else if (obj.HasKey(L"messages")) { // Response to getCachedMessages for (auto messageValue : obj.GetNamedArray(L"messages")) { diff --git a/support/hololens/ServoApp/ServoControl/Servo.h b/support/hololens/ServoApp/ServoControl/Servo.h index 2be93581b224..2d8e3b0f0917 100644 --- a/support/hololens/ServoApp/ServoControl/Servo.h +++ b/support/hololens/ServoApp/ServoControl/Servo.h @@ -88,6 +88,7 @@ class Servo { void ContextMenuClosed(CContextMenuResult res, unsigned int idx) { on_context_menu_closed(res, idx); } + void IMEDismissed() { ime_dismissed(); } private: ServoDelegate &mDelegate; diff --git a/support/hololens/ServoApp/ServoControl/ServoControl.cpp b/support/hololens/ServoApp/ServoControl/ServoControl.cpp index f83aef329413..db4710f0606b 100644 --- a/support/hololens/ServoApp/ServoControl/ServoControl.cpp +++ b/support/hololens/ServoApp/ServoControl/ServoControl.cpp @@ -91,6 +91,12 @@ void ServoControl::OnLoaded(IInspectable const &, RoutedEventArgs const &) { void ServoControl::InitializeTextController() { mInputPane = Windows::UI::ViewManagement::InputPane::GetForCurrentView(); + mInputPane->Hiding([=](const auto &, const auto &) { + if (mLooping) { + RunOnGLThread([=] { mServo->IMEDismissed(); }); + } + }); + auto manager = CoreTextServicesManager::GetForCurrentView(); mEditContext = manager.CreateEditContext(); mEditContext->InputPaneDisplayPolicy(CoreTextInputPaneDisplayPolicy::Manual); diff --git a/tests/wpt/metadata-layout-2020/FileAPI/url/url-charset.window.js.ini b/tests/wpt/metadata-layout-2020/FileAPI/url/url-charset.window.js.ini deleted file mode 100644 index 7248ba77bd54..000000000000 --- a/tests/wpt/metadata-layout-2020/FileAPI/url/url-charset.window.js.ini +++ /dev/null @@ -1,5 +0,0 @@ -[url-charset.window.html] - expected: TIMEOUT - [Blob charset should override any auto-detected charset.] - expected: TIMEOUT - diff --git a/tests/wpt/metadata-layout-2020/FileAPI/url/url-in-tags-revoke.window.js.ini b/tests/wpt/metadata-layout-2020/FileAPI/url/url-in-tags-revoke.window.js.ini index 3605e8f3fc99..76b44d9e9cf9 100644 --- a/tests/wpt/metadata-layout-2020/FileAPI/url/url-in-tags-revoke.window.js.ini +++ b/tests/wpt/metadata-layout-2020/FileAPI/url/url-in-tags-revoke.window.js.ini @@ -4,7 +4,7 @@ expected: TIMEOUT [Opening a blob URL in a new window immediately before revoking it works.] - expected: TIMEOUT + expected: FAIL [Fetching a blob URL immediately before revoking it works in an iframe.] expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-002.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-002.html.ini deleted file mode 100644 index f64b45fea6b5..000000000000 --- a/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-002.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[hit-test-floats-002.html] - [Hit test float] - expected: FAIL - diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-004.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-004.html.ini new file mode 100644 index 000000000000..4bfb0c2053a4 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-004.html.ini @@ -0,0 +1,4 @@ +[hit-test-floats-004.html] + [Miss float below something else] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini index f8e7e539aae9..4a1e8110f6fb 100644 --- a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini +++ b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini @@ -2,6 +2,3 @@ [Hit test intersecting scaled box] expected: FAIL - [Hit test within unscaled box] - expected: FAIL - diff --git a/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-invalid-cases.html.ini b/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-invalid-cases.html.ini deleted file mode 100644 index e181af5397fa..000000000000 --- a/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-invalid-cases.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[elementsFromPoint-invalid-cases.html] - [The root element is the last element returned for otherwise empty queries within the viewport] - expected: FAIL - diff --git a/tests/wpt/metadata-layout-2020/css/selectors/first-line-bidi-001.html.ini b/tests/wpt/metadata-layout-2020/css/selectors/first-line-bidi-001.html.ini new file mode 100644 index 000000000000..55e21381badd --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/selectors/first-line-bidi-001.html.ini @@ -0,0 +1,2 @@ +[first-line-bidi-001.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/selectors/first-line-bidi-002.html.ini b/tests/wpt/metadata-layout-2020/css/selectors/first-line-bidi-002.html.ini new file mode 100644 index 000000000000..368773f14e5d --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/selectors/first-line-bidi-002.html.ini @@ -0,0 +1,2 @@ +[first-line-bidi-002.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini b/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini index e10e8e7e2f33..6b67f8f167b4 100644 --- a/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini +++ b/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini @@ -321,15 +321,9 @@ [