Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
Apache Flex 4.12.1
Description
Steps to reproduce A:
- Run the HierarchicalCollectionViewCursor_FLEX_34119_Test unit test. You should see lots of "Bookmark no longer valid" errors.
Steps to reproduce B:
- Run the attached AIR project. (Avoid debug mode unless you want to press F8 MANY times). It will take around 10s.
The unit test (HierarchicalCollectionViewCursorTest.as) shows many of the ways in which HierarchicalCollectionViewCursor's state can make ListCollectionView fail through a seek() operation on ListCollectionViewCursor by allowing a CursorError to be thrown from ListCollectionView.getBookmarkIndex() (I say 'allowing' because it could easily prevent it).
The trace output (also attached to this ticket as BookmarkErrorScenarios.txt) shows all the configurations of the collection view that I constructed which cause the RTE.
Notations in trace output:
- [SEL] - the currently selected item by the HierarchicalCollectionViewCursor (cursor.current).
- [INS] - the newly inserted item, which caused the RTE
- [REPL] - the item which, when replaced, causes the RTE (notice there's only one such instance - when the (selected) second stage is replaced with another item).
NOTES:
- keep in mind that the attached AIR project is a raw, unrefined way to reproduce this bug. For the code which reflects the understanding received after investigating this bug, please run the unit test in Steps to reproduce A above.
- for us this has caused numerous, apparently mysterious bugs within AdvancedDataGrids and Trees which boiled down to one or other of these configurations.
- The reproduceCursorErrorWithDisableAutoUpdate() test shows that the error can also be thrown by not allowing the HierarchicalCollectionView (and, implicitly, the HierarchicalCollectionViewCursor) to know about changes in the underlying collections (by using disableAutoUpdate() in conjunction with refresh() and enableAutoUpdate()). We were using these methods to optimise expensive updates in the collections shown in the AdvancedDataGrids, without realising they had a knock-on effect on the HierarchicalCollectionView used by the grids. This part of the error-generation scenario is controlled by the programmers, of course, but it might be worth documenting, so that others can avoid these issues.
FLEX-33054reports a limited scenario of this bug too. When this is fixed, so shouldFLEX-33054.
The RTE that's usually thrown:
Main Thread (Suspended: Error: Bookmark no longer valid.)
mx.collections::HierarchicalCollectionViewCursor/collectionChangeHandler
flash.events::EventDispatcher/dispatchEventFunction [no source]
flash.events::EventDispatcher/dispatchEvent [no source]
mx.collections::HierarchicalCollectionView/nestedCollectionChangeHandler
flash.events::EventDispatcher/dispatchEventFunction [no source]
flash.events::EventDispatcher/dispatchEvent [no source]
mx.collections::ListCollectionView/dispatchEvent
mx.collections::ListCollectionView/addItemsToView
mx.collections::ListCollectionView/listChangeHandler
flash.events::EventDispatcher/dispatchEventFunction [no source]
flash.events::EventDispatcher/dispatchEvent [no source]
mx.collections::ArrayList/internalDispatchEvent
mx.collections::ArrayList/addItemAt
mx.collections::ListCollectionView/addItemAt
Attachments
Attachments
Issue Links
- is related to
-
FLEX-34440 'Bookmark no longer valid' CursorError caused by HierarchicalCollectionView's conversion of CollectionEventKind.REPLACE into CollectionEventKind.REMOVE
- Resolved
-
FLEX-34424 HierarchicalCollectionViewCursor.current returns null when previous sibling is removed
- Resolved
-
FLEX-34458 HierarchicalCollectionViewCursor.current returns wrong item after previous sibling is removed when current was "${L}" (CursorBookmark.LAST)
- Resolved
- relates to
-
FLEX-33054 Cursor Seek in HierarchicalCollectionViewCursor operates on wrong child level
- Resolved
-
FLEX-34456 HierarchicalCollectionViewCursors interfere with each other's operation
- Resolved
-
FLEX-32574 HierarchicalCollectionViewCursor:get current() does not catch CursorError
- Closed