On Wed, 15 Feb 2023 09:46:22 GMT, John Hendrikx <jhendr...@openjdk.org> wrote:
>> This contains the following: >> - Nested changes or invalidations using ExpressionHelper are delayed until >> the current emission completes >> - This fixes odd change events being produced (with incorrect oldValue) >> - Also fixes a bug in ExpressionHelper where a nested change would unlock >> the listener list early, which could cause a >> `ConcurrentModificationException` if a nested change was combined with a >> remove/add listener call >> - A test for ExpressionHelper to verify the new behavior >> - A test for all *Property and *Binding classes that verifies correct >> listener behavior at the API level (this tests gets 85% coverage on >> ExpressionHelper on its own, the only thing it is not testing is the locking >> behavior, which is not relevant at the API level). >> - A fix for `WebColorFieldSkin` which triggered a nested change which used a >> flag to prevent an event loop (I've changed it now to match how >> `DoubleFieldSkin` and `IntegerFieldSkin` do it > > John Hendrikx has updated the pull request incrementally with one additional > commit since the last revision: > > Fix no change detection > > Old text was uppercased while new text is always lowercase. With this test static void with2Changes() { inv = 0; var property = new SimpleIntegerProperty(0); ChangeListener<? super Number> listenerA = (obs, ov, nv) -> { inv++; String spaces = spaces(); System.out.println(spaces + " bA " + ov + "->" + nv + " (" + property.get() + ")"); property.set(5); System.out.println(spaces + " aA " + ov + "->" + nv + " (" + property.get() + ")"); }; ChangeListener<? super Number> listenerB = (obs, ov, nv) -> { inv++; String spaces = spaces(); System.out.println(spaces + " bB " + ov + "->" + nv + " (" + property.get() + ")"); property.set(6); System.out.println(spaces + " aB " + ov + "->" + nv + " (" + property.get() + ")"); }; property.addListener(listenerA); property.addListener(listenerB); property.set(1); } I get 1 bA 0->1 (1) 1 aA 0->1 (5) 2 bB 0->1 (5) 2 aB 0->1 (6) 3 bA 1->6 (6) 3 aA 1->6 (5) 4 bB 1->6 (5) 4 aB 1->6 (6) I think that we are missing a 1->5 event originating in listener A, and maybe a 5->6 event. I'm honestly not sure what the behavior should be here. ------------- PR: https://git.openjdk.org/jfx/pull/837