On Fri, 8 Nov 2024 16:28:17 GMT, Kevin Rushforth <[email protected]> wrote:
>> @hjohn @kevinrushforth @aghaisas
>>
>> hmm .. it's been a while but you might be on to something.
>>
>> Let's recap:
>>
>> - the first issue to get fixed was JDK-8207774: the problem was that the
>> isConsumed always was false (due to creating the actionEvent for passing
>> around was done by the constructor that led to immediate copying, setting
>> consumed to false)
>> - the next issue was this: the problem was that actively refiring the
>> keyEvent on parent led to a nested eventDispatch, confusing every
>> collaborator. That was fixed by removing the refire altogether and consuming
>> the keyEvent if handled by the textField's action/Listeners (that's the
>> plainly reverted logic above)
>> - both before and after the fixes the state "handled" can be reached by the
>> mere existence of an onAction handler on the textField, consuming or not
>>
>> And that's still wrong, as you correctly - IMO - noted. The expectation
>> formulated as a test (c&p and adjusted from TextFieldTest)
>>
>> /**
>> * ENTER must be forwarded if action
>> * not consumed the action.
>> *
>> * Here we test that key handlers on parent are notified.
>> */
>> @Test
>> public void testEnterWithNotConsumingActionParentHandler() {
>> initStage();
>> root.getChildren().add(txtField);
>> txtField.setOnAction(e -> {}); // do nothing handler
>> List<KeyEvent> keys = new ArrayList<>();
>>
>> root.addEventHandler(KeyEvent.KEY_PRESSED, e -> {
>> keys.add(e);
>> });
>> stage.show();
>> KeyEventFirer keyboard = new KeyEventFirer(txtField);
>> keyboard.doKeyPress(ENTER);
>> assertEquals("key handler must be notified", 1, keys.size());
>> }
>>
>> We can't reach that by replacing the || by && (would introduce a regression,
>> as failing tests indicate) but .. maybe by entirely removing the not/null
>> check of onAction: the fired actionEvent will be passed to the singleton
>> handler (along with any added via addXX) anyway, so it doesn't really make
>> sense (with the first issue fixed)
>>
>> Now the method looks like and all tests including the new one above (and
>> hopefully the analogous twins of XXConsuming -> XXNotConsuming, didn't try,
>> being lazy ;):
>>
>> @Override protected void fire(KeyEvent event) {
>> TextField textField = getNode();
>> EventHandler<ActionEvent> onAction = textField.getOnAction();
>> // JDK-8207774
>> // use textField as target to prevent immediate copy in dispatch
>> ...
>
> @kleopatra Your explanation makes sense to me. Thank you for taking the time
> to write it up.
>
> If so, the proposed fix, including adjusting the comment, would be:
>
>
> ---
> a/modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/behavior/TextFieldBehavior.java
> +++
> b/modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/behavior/TextFieldBehavior.java
> @@ -162,9 +162,8 @@ public class TextFieldBehavior extends
> TextInputControlBehavior<TextField> {
>
> textField.commitValue();
> textField.fireEvent(actionEvent);
> - // fix of JDK-8207759: reverted logic
> - // mapping not auto-consume and consume if handled by action
> - if (onAction != null || actionEvent.isConsumed()) {
> + // Consume the original event if the copied actionEvent was consumed.
> + if (actionEvent.isConsumed()) {
> event.consume();
> }
> }
You are right, `&&` would be insufficient as there is another way to add action
handlers. I didn't really see that, although the fix I had in mind was to
eliminate the `onAction` variable completely (it is unused in your fix as
well), so probably would have ended up at the correct result :)
I can roll this into a small PR if you wish.
-------------
PR Review Comment: https://git.openjdk.org/jfx/pull/15#discussion_r1835039351