• Amir Hardon's avatar
    Make sure _handleAppFrame is only registered once per frame (#30346) · b6afc16a
    Amir Hardon authored
    There were 2 possible scenarios in which _handleAppFrame is added more than once as a frame callback. When this happens it is possible that the second invocation will try to access _nextFrame.image when _nextFrame is null and crash. The 2 scenarios are:
    
    Scenario 1
    
    A GIF frame is decoded and a Flutter frame is executed before it's time to show the next GIF frame.
    The timer that's waiting for enough time to elapse is invoked, and schedules a callback for the next Flutter frame(here).
    Before the next Flutter frame is executed, MultiFrameImageStreamCompleter#removeListener is called followed by ``MultiFrameImageStreamCompleter#addListenerthat is invoking_decodeNextFrameAndSchedule` which is adding `_handleAppFrame` again as a next frame callback.
    Scenario 2
    removeListener and addListener are called multiple times in succession, every call to addListener can result in another registration of _handleAppFrame to the next Flutter frame callbacks list.
    
    This patch fixes the issue by guarding against a second registration of _handleAppFrame.
    b6afc16a
image_stream_test.dart 19.6 KB