On Wed, 8 Jan 2025 11:57:44 GMT, John Hendrikx <jhendr...@openjdk.org> wrote:

>> Michael Strauß has updated the pull request with a new target base due to a 
>> merge or a rebase. The incremental webrev excludes the unrelated changes 
>> brought in by the merge/rebase. The pull request contains seven additional 
>> commits since the last revision:
>> 
>>  - Merge branch 'master' into feature/root-pseudo-class
>>  - whitespace error
>>  - add child-indexed pseudo-classes
>>  - add pseudo-class table to Parent
>>  - update cssref
>>  - Set :root pseudo-class on sub-scene root node
>>  - Set :root pseudo-class on root node
>
> modules/javafx.graphics/src/main/java/javafx/scene/Parent.java line 479:
> 
>> 477:                     
>> n.pseudoClassStateChanged(NTH_EVEN_CHILD_PSEUDO_CLASS, i % 2 != 0);
>> 478:                     
>> n.pseudoClassStateChanged(NTH_ODD_CHILD_PSEUDO_CLASS, i % 2 == 0);
>> 479:                 }
> 
> With this new code, Nodes with many children being manipulated may incur some 
> significant new costs now that these pseudo classes need to be changed for 
> potentially many/all children.  Where before adding a new first child mostly 
> had a cost in shifting the child array with a copy, now we also potentially 
> have two listener call backs per child (and I'm unsure, but these may even 
> trigger some CSS recalculations or CSS cache invalidations).  Nodes with many 
> children may suffer from this, and mostly needlessly as these pseudo classes 
> will see very limited use.
> 
> I think there's some potential for performance regression here that is 
> perhaps sufficient to warrant the exclusion of this feature or making it 
> optional.

I think this concern is out of proportion. Generally, nodes will not have such 
a huge number of children that simply flipping a few pseudo-classes will be 
prohibitively expensive. CSS recalculation will, in most cases, only happen 
once per pulse anyway.

I don't know why we would be optimizing for pathological applications that 
register two pseudo-class listeners for each of their tens of thousands of 
children in a container, _and_ do heavy work in those listeners.

> modules/javafx.graphics/src/test/java/test/javafx/scene/Parent_pseudoClasses_Test.java
>  line 60:
> 
>> 58:         assertNotPseudoClass(ONLY_CHILD, child1);
>> 59:         assertPseudoClass(ONLY_CHILD, child2);
>> 60:     }
> 
> How about a case where the last child is removed, and seeing if the first and 
> now only child gets the correct states?  I think there currently is 
> definitely a bug where the odd/even may not be reapplied in that case...

I've added more tests, including the scenario you point out.

-------------

PR Review Comment: https://git.openjdk.org/jfx/pull/1652#discussion_r1907558879
PR Review Comment: https://git.openjdk.org/jfx/pull/1652#discussion_r1907559803

Reply via email to