RFR: 8268225: Support :focus-visible and :focus-within CSS pseudoclasses [v2]
Michael Strauß
mstrauss at openjdk.java.net
Mon Dec 6 20:58:14 UTC 2021
On Mon, 6 Dec 2021 13:05:16 GMT, Jeanette Winzenburg <fastegal at openjdk.org> wrote:
> might also need a test that verifies the focusWithin of a parent added somewhere above the focused node? hmm .. or maybe not, that would require to re-arrange a complete subtree ..
Inserting a parent into a scene graph such that the existing subtree at that position becomes a subtree of the newly inserted parent can't be done as an atomic operation. First, you'll need to remove the subtree at the insertion point from the existing scene graph (otherwise you'll get an exception saying that a node can only appear once in a scene graph). Then you can add the new parent with the removed subtree as its child.
But what happens if the removed subtree contains a focused node? Since we can't know whether the removed subtree will ever be re-attached to the scene graph, we probably shouldn't keep its focus flags set. Moreover, `Scene.focusOwner` probably also should not refer to a node that is not part of the scene graph anymore.
But that's not what happens:
// Create a focusable rect
var rect = new Rectangle();
rect.setFocusTraversable(true);
// Add the rect to a group and requestFocus on the rect
var root = new Group(rect);
scene.setRoot(root);
rect.requestFocus();
// Now, the rect is focused and it is the focus owner of the scene
assertTrue(rect.isFocused());
assertSame(rect, scene.getFocusOwner());
// Remove the rect from the scene graph
root.getChildren().clear();
// This is what I would now assume to be true (but isn't):
assertFalse(rect.isFocused()); // FAILED: rect.isFocused() == true
assertNotSame(rect, scene.getFocusOwner()); // FAILED: rect == scene.getFocusOwner()
I'm inclined to think that this behavior is a bug.
-------------
PR: https://git.openjdk.java.net/jfx/pull/475
More information about the openjfx-dev
mailing list