doAfterNextPresentationUpdate should not be called while content is hidden due to...
authortimothy_horton@apple.com <timothy_horton@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 10 Jul 2018 21:29:25 +0000 (21:29 +0000)
committertimothy_horton@apple.com <timothy_horton@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 10 Jul 2018 21:29:25 +0000 (21:29 +0000)
commit1f98aab90bc01a7dc92f3c6c131cfda839b1fc19
tree85bac182a6f59236921a243964557db95e98b892
parent076f85c291708758d37cb31c7c6c54f9d0a81888
doAfterNextPresentationUpdate should not be called while content is hidden due to animated resize
https://bugs.webkit.org/show_bug.cgi?id=187500
<rdar://problem/41294139>

Reviewed by Simon Fraser.

Source/WebKit:

Clients generally expect that after doAfterNextPresentationUpdate, there's
something vaguely sensible on the screen. They use this to remove snapshots,
unhide web views, etc.

During some kinds of resize/rotation, we will hide the WKContentView,
and asynchronously hide it when the resize/rotation is complete. This
can cause clients to prematurely expose a blank WKWebView.

To fix this, avoid calling doAfterNextPresentationUpdate until the
animated resize completes. Add a variant that does not wait for this
(to be used for testing purposes).

* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _didCompleteAnimatedResize]):
(-[WKWebView _snapshotRect:intoImageOfWidth:completionHandler:]):
Rename the vector of blocks that we call after animated resize completes
to be generic rather than just about snapshots.

(-[WKWebView _internalDoAfterNextPresentationUpdate:withoutWaitingForPainting:withoutWaitingForAnimatedResize:]):
Add this _internal variant of _doAfterNextPresentationUpdate that takes bits determining
which waits to perform or avoid, to reduce duplication.

(-[WKWebView _doAfterNextPresentationUpdate:]):
(-[WKWebView _doAfterNextPresentationUpdateWithoutWaitingForAnimatedResizeForTesting:]):
(-[WKWebView _doAfterNextPresentationUpdateWithoutWaitingForPainting:]):
Call _internalDoAfterNextPresentationUpdate with the appropriate bits set for each situation.

* UIProcess/API/Cocoa/WKWebViewPrivate.h:
Add _doAfterNextPresentationUpdateWithoutWaitingForAnimatedResizeForTesting to WKWebView(WKTesting).

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/AnimatedResize.mm:
(-[AnimatedResizeWebView _endAnimatedResize]):
Set didEndAnimatedResize before calling super, because it makes the
new test easier and doesn't affect any of the existing ones.

(AnimatedResizeBlocksViewportFitChanges):
This doAfterNextPresentationUpdate is always called during animated resize,
and then synchronously waited for, so it /must/ use
_doAfterNextPresentationUpdateWithoutWaitingForAnimatedResizeWithTesting.

(AnimatedResizeBlocksDoAfterNextPresentationUpdate):
Add a test ensuring that doAfterNextPresentationUpdate is deferred
until endAnimatedResize is called.

* TestWebKitAPI/cocoa/TestNavigationDelegate.mm:
(-[WKWebView _test_waitForDidFinishNavigation]):
_test_waitForDidFinishNavigation is sometimes called during animated resize,
and synchronously waits for a doAfterNextPresentationUpdate, so
it cannot wait for the animated resize to complete.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@233698 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Source/WebKit/ChangeLog
Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm
Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h
Tools/ChangeLog
Tools/TestWebKitAPI/Tests/WebKitCocoa/AnimatedResize.mm
Tools/TestWebKitAPI/cocoa/TestNavigationDelegate.mm