From 64692ed5d67f8ef542b7a598a0a68a5fdf10b5f2 Mon Sep 17 00:00:00 2001 From: Kamil Jarosz Date: Fri, 22 Mar 2024 19:03:52 +0100 Subject: [PATCH 1/4] tests: Add AutomatedEvent::KeyUp --- tests/framework/src/runner.rs | 4 ++++ tests/input-format/src/format.rs | 3 +++ tests/input-format/src/injector.rs | 1 + 3 files changed, 8 insertions(+) diff --git a/tests/framework/src/runner.rs b/tests/framework/src/runner.rs index 953b1bf35745..30756907c246 100644 --- a/tests/framework/src/runner.rs +++ b/tests/framework/src/runner.rs @@ -230,6 +230,10 @@ impl TestRunner { key_code: KeyCode::from_u8(*key_code).expect("Invalid keycode in test"), key_char: None, }, + AutomatedEvent::KeyUp { key_code } => PlayerEvent::KeyUp { + key_code: KeyCode::from_u8(*key_code).expect("Invalid keycode in test"), + key_char: None, + }, AutomatedEvent::TextInput { codepoint } => PlayerEvent::TextInput { codepoint: *codepoint, }, diff --git a/tests/input-format/src/format.rs b/tests/input-format/src/format.rs index a60ac59bed44..71540c338832 100644 --- a/tests/input-format/src/format.rs +++ b/tests/input-format/src/format.rs @@ -65,6 +65,9 @@ pub enum AutomatedEvent { /// Press a key KeyDown { key_code: u8 }, + /// Release a key + KeyUp { key_code: u8 }, + /// Input a character code TextInput { codepoint: char }, diff --git a/tests/input-format/src/injector.rs b/tests/input-format/src/injector.rs index a0d326c15b33..28a120f5dd95 100644 --- a/tests/input-format/src/injector.rs +++ b/tests/input-format/src/injector.rs @@ -96,6 +96,7 @@ impl InputInjector { AutomatedEvent::Wait => break, AutomatedEvent::MouseMove { .. } | AutomatedEvent::KeyDown { .. } + | AutomatedEvent::KeyUp { .. } | AutomatedEvent::TextInput { .. } | AutomatedEvent::TextControl { .. } | AutomatedEvent::SetClipboardText { .. } => {} From 514a1e6bb5e3b44d574f1fd1b19c2dbaf5e42517 Mon Sep 17 00:00:00 2001 From: Kamil Jarosz Date: Tue, 26 Mar 2024 13:08:38 +0100 Subject: [PATCH 2/4] core: Use either crate instead of a custom implementation --- Cargo.lock | 1 + core/Cargo.toml | 1 + core/src/avm2/qname.rs | 2 +- core/src/either.rs | 21 --------------------- core/src/lib.rs | 1 - 5 files changed, 3 insertions(+), 23 deletions(-) delete mode 100644 core/src/either.rs diff --git a/Cargo.lock b/Cargo.lock index 7e211cad5eb4..6960601f9bc1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4184,6 +4184,7 @@ dependencies = [ "downcast-rs", "egui", "egui_extras", + "either", "encoding_rs", "enum-map", "enumset", diff --git a/core/Cargo.toml b/core/Cargo.toml index d2f5668bcf4d..cc4cb764af3b 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -66,6 +66,7 @@ ttf-parser = "0.20" num-bigint = "0.4" unic-segment = "0.9.0" id3 = "1.13.1" +either = "1.10.0" [target.'cfg(not(target_family = "wasm"))'.dependencies.futures] version = "0.3.30" diff --git a/core/src/avm2/qname.rs b/core/src/avm2/qname.rs index f70aab3ca34a..59efb7a8a13f 100644 --- a/core/src/avm2/qname.rs +++ b/core/src/avm2/qname.rs @@ -1,8 +1,8 @@ use crate::avm2::script::TranslationUnit; use crate::avm2::{Activation, Error, Namespace}; use crate::context::UpdateContext; -use crate::either::Either; use crate::string::{AvmString, WStr, WString}; +use either::Either; use gc_arena::{Collect, Mutation}; use std::fmt::Debug; use swf::avm2::types::{Index, Multiname as AbcMultiname}; diff --git a/core/src/either.rs b/core/src/either.rs deleted file mode 100644 index 4f7167c9e310..000000000000 --- a/core/src/either.rs +++ /dev/null @@ -1,21 +0,0 @@ -use std::ops::Deref; - -pub enum Either { - Left(A), - Right(B), -} - -impl Deref for Either -where - A: Deref, - B: Deref, -{ - type Target = A::Target; - - fn deref(&self) -> &Self::Target { - match self { - Self::Left(a) => a, - Self::Right(b) => b, - } - } -} diff --git a/core/src/lib.rs b/core/src/lib.rs index fc43e80845b6..2a76613d5e66 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -29,7 +29,6 @@ pub mod context; pub mod context_menu; mod drawing; mod ecma_conversions; -pub(crate) mod either; pub mod events; pub mod focus_tracker; mod font; From 0880476a1464b49cafa263f12b0edb3550cc3f35 Mon Sep 17 00:00:00 2001 From: Kamil Jarosz Date: Tue, 26 Mar 2024 13:08:58 +0100 Subject: [PATCH 3/4] core: Reverse tab order on Shift+Tab When pressing Shift+Tab or Ctrl+Shift+Tab, elements are tabbed in reverse. --- core/src/focus_tracker.rs | 16 ++++++++++++---- core/src/player.rs | 3 ++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/core/src/focus_tracker.rs b/core/src/focus_tracker.rs index 020108368fd0..50b5f0f793e3 100644 --- a/core/src/focus_tracker.rs +++ b/core/src/focus_tracker.rs @@ -4,6 +4,7 @@ use crate::context::UpdateContext; pub use crate::display_object::{ DisplayObject, TDisplayObject, TDisplayObjectContainer, TextSelection, }; +use either::Either; use gc_arena::lock::GcLock; use gc_arena::{Collect, Mutation}; @@ -67,7 +68,7 @@ impl<'gc> FocusTracker<'gc> { } } - pub fn cycle(&self, context: &mut UpdateContext<'_, 'gc>) { + pub fn cycle(&self, context: &mut UpdateContext<'_, 'gc>, reverse: bool) { let stage = context.stage; let mut tab_order = vec![]; stage.fill_tab_order(&mut tab_order, context); @@ -88,16 +89,23 @@ impl<'gc> FocusTracker<'gc> { tab_order.sort_by_key(|o| o.tab_index()); } + let mut tab_order = if reverse { + Either::Left(tab_order.iter().rev()) + } else { + Either::Right(tab_order.iter()) + } + .peekable(); + let first = tab_order.peek().copied(); + let next = if let Some(current_focus) = self.0.get() { // Find the next object which should take the focus. tab_order - .iter() .skip_while(|o| o.as_ptr() != current_focus.as_ptr()) .nth(1) - .or(tab_order.first()) + .or(first) } else { // If no focus is present, we start from the beginning. - tab_order.first() + first }; self.set(next.copied(), context); diff --git a/core/src/player.rs b/core/src/player.rs index ea1772b4f962..bd47e1005a0b 100644 --- a/core/src/player.rs +++ b/core/src/player.rs @@ -1186,8 +1186,9 @@ impl Player { } = event { self.mutate_with_update_context(|context| { + let reversed = context.input.is_key_down(KeyCode::Shift); let tracker = context.focus_tracker; - tracker.cycle(context); + tracker.cycle(context, reversed); }); } } From 4c439cf1e2e32b380c7ce7256ce281404bab448e Mon Sep 17 00:00:00 2001 From: Kamil Jarosz Date: Tue, 26 Mar 2024 13:08:58 +0100 Subject: [PATCH 4/4] tests: Add tab_ordering_reverse test --- .../swfs/avm1/tab_ordering_reverse/input.json | 24 +++++++++ .../swfs/avm1/tab_ordering_reverse/output.txt | 51 ++++++++++++++++++ .../swfs/avm1/tab_ordering_reverse/test.as | 11 ++++ .../swfs/avm1/tab_ordering_reverse/test.swf | Bin 0 -> 11794 bytes .../swfs/avm1/tab_ordering_reverse/test.toml | 1 + 5 files changed, 87 insertions(+) create mode 100644 tests/tests/swfs/avm1/tab_ordering_reverse/input.json create mode 100644 tests/tests/swfs/avm1/tab_ordering_reverse/output.txt create mode 100644 tests/tests/swfs/avm1/tab_ordering_reverse/test.as create mode 100644 tests/tests/swfs/avm1/tab_ordering_reverse/test.swf create mode 100644 tests/tests/swfs/avm1/tab_ordering_reverse/test.toml diff --git a/tests/tests/swfs/avm1/tab_ordering_reverse/input.json b/tests/tests/swfs/avm1/tab_ordering_reverse/input.json new file mode 100644 index 000000000000..3ca80b630b38 --- /dev/null +++ b/tests/tests/swfs/avm1/tab_ordering_reverse/input.json @@ -0,0 +1,24 @@ +[ + { "type": "KeyDown", "key_code": 9 }, + { "type": "KeyDown", "key_code": 9 }, + { "type": "KeyDown", "key_code": 16 }, + { "type": "KeyDown", "key_code": 9 }, + { "type": "KeyUp", "key_code": 16 }, + { "type": "KeyDown", "key_code": 9 }, + { "type": "KeyDown", "key_code": 16 }, + { "type": "KeyDown", "key_code": 9 }, + { "type": "KeyDown", "key_code": 9 }, + { "type": "KeyDown", "key_code": 9 }, + { "type": "KeyUp", "key_code": 16 }, + { "type": "KeyDown", "key_code": 9 }, + { "type": "KeyDown", "key_code": 9 }, + { "type": "KeyDown", "key_code": 17 }, + { "type": "KeyDown", "key_code": 9 }, + { "type": "KeyUp", "key_code": 17 }, + { "type": "KeyDown", "key_code": 16 }, + { "type": "KeyDown", "key_code": 17 }, + { "type": "KeyDown", "key_code": 9 }, + { "type": "KeyUp", "key_code": 17 }, + { "type": "KeyUp", "key_code": 16 }, + { "type": "KeyDown", "key_code": 9 } +] diff --git a/tests/tests/swfs/avm1/tab_ordering_reverse/output.txt b/tests/tests/swfs/avm1/tab_ordering_reverse/output.txt new file mode 100644 index 000000000000..1ee971e0ff60 --- /dev/null +++ b/tests/tests/swfs/avm1/tab_ordering_reverse/output.txt @@ -0,0 +1,51 @@ +Focus changed + old: null + new: _level0.text1 +Tab pressed +Focus changed + old: _level0.text1 + new: _level0.text2 +Tab pressed +Focus changed + old: _level0.text2 + new: _level0.text3 +Tab pressed +Focus changed + old: _level0.text3 + new: _level0.text2 +Tab pressed +Focus changed + old: _level0.text2 + new: _level0.text3 +Tab pressed +Focus changed + old: _level0.text3 + new: _level0.text2 +Tab pressed +Focus changed + old: _level0.text2 + new: _level0.text1 +Tab pressed +Focus changed + old: _level0.text1 + new: _level0.text4 +Tab pressed +Focus changed + old: _level0.text4 + new: _level0.text1 +Tab pressed +Focus changed + old: _level0.text1 + new: _level0.text2 +Tab pressed +Focus changed + old: _level0.text2 + new: _level0.text3 +Tab pressed +Focus changed + old: _level0.text3 + new: _level0.text2 +Tab pressed +Focus changed + old: _level0.text2 + new: _level0.text3 diff --git a/tests/tests/swfs/avm1/tab_ordering_reverse/test.as b/tests/tests/swfs/avm1/tab_ordering_reverse/test.as new file mode 100644 index 000000000000..9633923eb424 --- /dev/null +++ b/tests/tests/swfs/avm1/tab_ordering_reverse/test.as @@ -0,0 +1,11 @@ +var listener = new Object(); +listener.onSetFocus = function(oldFocus, newFocus) { + if (newFocus) { + trace("Focus changed"); + trace(" old: " + oldFocus); + trace(" new: " + newFocus); + } +}; +Selection.addListener(listener); + +Selection.setFocus(text1); diff --git a/tests/tests/swfs/avm1/tab_ordering_reverse/test.swf b/tests/tests/swfs/avm1/tab_ordering_reverse/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..358e00590e0442e95e46da23ff4bfcbc002ebcc5 GIT binary patch literal 11794 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 A9{>OV literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm1/tab_ordering_reverse/test.toml b/tests/tests/swfs/avm1/tab_ordering_reverse/test.toml new file mode 100644 index 000000000000..cf6123969a1d --- /dev/null +++ b/tests/tests/swfs/avm1/tab_ordering_reverse/test.toml @@ -0,0 +1 @@ +num_ticks = 1