Diff
Modified: trunk/Source/WebKit2/ChangeLog (170318 => 170319)
--- trunk/Source/WebKit2/ChangeLog 2014-06-23 21:27:59 UTC (rev 170318)
+++ trunk/Source/WebKit2/ChangeLog 2014-06-23 21:32:03 UTC (rev 170319)
@@ -1,3 +1,62 @@
+2014-06-23 Tim Horton <[email protected]>
+
+ [wk2] Synchronously wait a short time for a layer tree update after bringing a web view in-window
+ https://bugs.webkit.org/show_bug.cgi?id=134189
+
+ Reviewed by Simon Fraser.
+
+ Make the old behavior of -[WKView endDeferringViewInWindowChangesSync] the default; synchronously wait
+ for a fraction of a second when a page that was previously in-window but currently isn't comes back in-window,
+ until new content is painted (or we hit a timeout).
+
+ * UIProcess/DrawingAreaProxy.h:
+ (WebKit::DrawingAreaProxy::waitForDidUpdateViewState):
+ * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h:
+ * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm:
+ (WebKit::TiledCoreAnimationDrawingAreaProxy::waitForDidUpdateViewState):
+ Delegate waitForDidUpdateViewState to the DrawingAreaProxys, because behavior is very dependent on them.
+
+ * UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.h:
+ * UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm:
+ (WebKit::RemoteLayerTreeDrawingAreaProxy::coreAnimationDidCommitLayers):
+ (WebKit::RemoteLayerTreeDrawingAreaProxy::waitForDidUpdateViewState):
+ Implement waitForDidUpdateViewState for the RemoteLayerTree; it waits for CommitLayerTree.
+
+ * UIProcess/WebPageProxy.cpp:
+ (WebKit::WebPageProxy::WebPageProxy):
+ (WebKit::WebPageProxy::updateViewState):
+ (WebKit::WebPageProxy::viewStateDidChange):
+ (WebKit::WebPageProxy::dispatchViewStateChange):
+ (WebKit::WebPageProxy::waitForDidUpdateViewState):
+ (WebKit::WebPageProxy::resetStateAfterProcessExited):
+ (WebKit::WebPageProxy::viewSize): Deleted.
+ * UIProcess/WebPageProxy.h:
+ (WebKit::WebPageProxy::didUpdateViewState):
+ * UIProcess/API/mac/WKView.mm:
+ (-[WKView endDeferringViewInWindowChangesSync]):
+ Always waitForDidUpdateViewState when a page that was previously in-window but currently isn't comes back in-window.
+
+ * WebProcess/WebPage/DrawingArea.h:
+ (WebKit::DrawingArea::viewStateDidChange):
+ * WebProcess/WebPage/WebPage.cpp:
+ (WebKit::WebPage::WebPage):
+ (WebKit::WebPage::setViewState):
+ (WebKit::WebPage::didUpdateViewStateTimerFired): Deleted.
+ * WebProcess/WebPage/WebPage.h:
+ * WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.h:
+ * WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm:
+ (WebKit::RemoteLayerTreeDrawingArea::flushLayers):
+ (WebKit::RemoteLayerTreeDrawingArea::viewStateDidChange):
+ * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h:
+ * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm:
+ (WebKit::TiledCoreAnimationDrawingArea::TiledCoreAnimationDrawingArea):
+ (WebKit::TiledCoreAnimationDrawingArea::viewStateDidChange):
+ (WebKit::TiledCoreAnimationDrawingArea::didUpdateViewStateTimerFired):
+ * WebProcess/WebPage/mac/WebPageMac.mm:
+ (WebKit::WebPage::didUpdateViewStateTimerFired): Deleted.
+ Delegate sending of didUpdateViewState to the DrawingAreas (RemoteLayerTreeDrawingArea won't send it,
+ because the UI process waits for CommitLayerTree instead).
+
2014-06-23 Timothy Horton <[email protected]>
[iOS][wk2] Ensure that layers are marked volatile before allowing the process to suspend
Modified: trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm (170318 => 170319)
--- trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm 2014-06-23 21:27:59 UTC (rev 170318)
+++ trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm 2014-06-23 21:32:03 UTC (rev 170319)
@@ -3756,6 +3756,7 @@
#endif
}
+// FIXME: All of these "DeferringViewInWindowChanges" methods should be able to be removed once clients are weaned off of them.
- (void)beginDeferringViewInWindowChanges
{
if (_data->_shouldDeferViewInWindowChanges) {
@@ -3788,18 +3789,12 @@
return;
}
- PageClient* pageClient = _data->_pageClient.get();
- bool hasPendingViewInWindowChange = _data->_viewInWindowChangeWasDeferred && _data->_page->isInWindow() != pageClient->isViewInWindow();
-
_data->_shouldDeferViewInWindowChanges = NO;
if (_data->_viewInWindowChangeWasDeferred) {
- _data->_page->viewStateDidChange(ViewState::IsInWindow, hasPendingViewInWindowChange ? WebPageProxy::WantsReplyOrNot::DoesWantReply : WebPageProxy::WantsReplyOrNot::DoesNotWantReply);
+ _data->_page->viewStateDidChange(ViewState::IsInWindow);
_data->_viewInWindowChangeWasDeferred = NO;
}
-
- if (hasPendingViewInWindowChange)
- _data->_page->waitForDidUpdateViewState();
}
- (BOOL)isDeferringViewInWindowChanges
Modified: trunk/Source/WebKit2/UIProcess/DrawingAreaProxy.h (170318 => 170319)
--- trunk/Source/WebKit2/UIProcess/DrawingAreaProxy.h 2014-06-23 21:27:59 UTC (rev 170318)
+++ trunk/Source/WebKit2/UIProcess/DrawingAreaProxy.h 2014-06-23 21:32:03 UTC (rev 170319)
@@ -87,6 +87,8 @@
virtual uint64_t lastVisibleTransactionID() const { ASSERT_NOT_REACHED(); return 0; }
+ virtual void waitForDidUpdateViewState() { }
+
protected:
explicit DrawingAreaProxy(DrawingAreaType, WebPageProxy*);
Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (170318 => 170319)
--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp 2014-06-23 21:27:59 UTC (rev 170318)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp 2014-06-23 21:32:03 UTC (rev 170319)
@@ -280,6 +280,7 @@
, m_geolocationPermissionRequestManager(*this)
, m_notificationPermissionRequestManager(*this)
, m_viewState(ViewState::NoFlags)
+ , m_viewWasEverInWindow(false)
, m_backForwardList(WebBackForwardList::create(*this))
, m_loadStateAtProcessExit(FrameLoadState::State::Finished)
#if PLATFORM(MAC) && !USE(ASYNC_NSTEXTINPUTCLIENT)
@@ -362,7 +363,6 @@
, m_autoSizingShouldExpandToViewHeight(false)
, m_mediaVolume(1)
, m_mayStartMediaWhenInWindow(true)
- , m_waitingForDidUpdateViewState(false)
, m_scrollPinningBehavior(DoNotPin)
, m_navigationID(0)
, m_configurationPreferenceValues(configuration.preferenceValues)
@@ -1094,19 +1094,22 @@
m_viewState |= ViewState::IsVisible;
if (flagsToUpdate & ViewState::IsVisibleOrOccluded && m_pageClient.isViewVisibleOrOccluded())
m_viewState |= ViewState::IsVisibleOrOccluded;
- if (flagsToUpdate & ViewState::IsInWindow && m_pageClient.isViewInWindow())
+ if (flagsToUpdate & ViewState::IsInWindow && m_pageClient.isViewInWindow()) {
m_viewState |= ViewState::IsInWindow;
+ m_viewWasEverInWindow = true;
+ }
if (flagsToUpdate & ViewState::IsVisuallyIdle && m_pageClient.isVisuallyIdle())
m_viewState |= ViewState::IsVisuallyIdle;
}
-void WebPageProxy::viewStateDidChange(ViewState::Flags mayHaveChanged, WantsReplyOrNot wantsReply)
+void WebPageProxy::viewStateDidChange(ViewState::Flags mayHaveChanged)
{
+ bool isNewlyInWindow = !isInWindow() && (mayHaveChanged & ViewState::IsInWindow) && m_pageClient.isViewInWindow();
+
m_potentiallyChangedViewStateFlags |= mayHaveChanged;
- m_viewStateChangeWantsReply = (wantsReply == WantsReplyOrNot::DoesWantReply || m_viewStateChangeWantsReply == WantsReplyOrNot::DoesWantReply) ? WantsReplyOrNot::DoesWantReply : WantsReplyOrNot::DoesNotWantReply;
+ m_viewStateChangeWantsReply = ((m_viewWasEverInWindow && isNewlyInWindow) || m_viewStateChangeWantsReply == WantsReplyOrNot::DoesWantReply) ? WantsReplyOrNot::DoesWantReply : WantsReplyOrNot::DoesNotWantReply;
#if PLATFORM(COCOA)
- bool isNewlyInWindow = !(m_viewState & ViewState::IsInWindow) && (mayHaveChanged & ViewState::IsInWindow) && m_pageClient.isViewInWindow();
if (isNewlyInWindow) {
dispatchViewStateChange();
return;
@@ -1174,6 +1177,9 @@
updateBackingStoreDiscardableState();
+ if (m_viewStateChangeWantsReply == WantsReplyOrNot::DoesWantReply)
+ waitForDidUpdateViewState();
+
m_potentiallyChangedViewStateFlags = ViewState::NoFlags;
m_viewStateChangeWantsReply = WantsReplyOrNot::DoesNotWantReply;
}
@@ -1203,19 +1209,19 @@
void WebPageProxy::waitForDidUpdateViewState()
{
+ if (!isValid())
+ return;
+
+ if (m_process->state() != WebProcessProxy::State::Running)
+ return;
+
// If we have previously timed out with no response from the WebProcess, don't block the UIProcess again until it starts responding.
if (m_waitingForDidUpdateViewState)
return;
- if (!isValid())
- return;
-
m_waitingForDidUpdateViewState = true;
- if (m_process->state() != WebProcessProxy::State::Launching) {
- auto viewStateUpdateTimeout = std::chrono::milliseconds(250);
- m_process->connection()->waitForAndDispatchImmediately<Messages::WebPageProxy::DidUpdateViewState>(m_pageID, viewStateUpdateTimeout);
- }
+ m_drawingArea->waitForDidUpdateViewState();
}
IntSize WebPageProxy::viewSize() const
@@ -4295,7 +4301,6 @@
m_isValid = false;
m_isPageSuspended = false;
- m_waitingForDidUpdateViewState = false;
if (m_mainFrame) {
m_urlAtProcessExit = m_mainFrame->url();
Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (170318 => 170319)
--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h 2014-06-23 21:27:59 UTC (rev 170318)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h 2014-06-23 21:32:03 UTC (rev 170319)
@@ -361,9 +361,10 @@
bool delegatesScrolling() const { return m_delegatesScrolling; }
enum class WantsReplyOrNot { DoesNotWantReply, DoesWantReply };
- void viewStateDidChange(WebCore::ViewState::Flags mayHaveChanged, WantsReplyOrNot = WantsReplyOrNot::DoesNotWantReply);
+ void viewStateDidChange(WebCore::ViewState::Flags mayHaveChanged);
bool isInWindow() const { return m_viewState & WebCore::ViewState::IsInWindow; }
void waitForDidUpdateViewState();
+ void didUpdateViewState() { m_waitingForDidUpdateViewState = false; }
void layerHostingModeDidChange();
@@ -575,8 +576,6 @@
void listenForLayoutMilestones(WebCore::LayoutMilestones);
- void didUpdateViewState() { m_waitingForDidUpdateViewState = false; }
-
bool hasHorizontalScrollbar() const { return m_mainFrameHasHorizontalScrollbar; }
bool hasVerticalScrollbar() const { return m_mainFrameHasVerticalScrollbar; }
@@ -1321,6 +1320,7 @@
NotificationPermissionRequestManagerProxy m_notificationPermissionRequestManager;
WebCore::ViewState::Flags m_viewState;
+ bool m_viewWasEverInWindow;
#if PLATFORM(IOS)
std::unique_ptr<ProcessThrottler::ForegroundActivityToken> m_activityToken;
Modified: trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.h (170318 => 170319)
--- trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.h 2014-06-23 21:27:59 UTC (rev 170318)
+++ trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.h 2014-06-23 21:32:03 UTC (rev 170319)
@@ -67,6 +67,8 @@
virtual void updateDebugIndicator() override;
void updateDebugIndicator(WebCore::IntSize contentsSize, bool rootLayerChanged, float scale);
void updateDebugIndicatorPosition();
+
+ virtual void waitForDidUpdateViewState() override;
WebCore::FloatPoint indicatorLocation() const;
Modified: trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm (170318 => 170319)
--- trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm 2014-06-23 21:27:59 UTC (rev 170318)
+++ trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm 2014-06-23 21:32:03 UTC (rev 170319)
@@ -37,6 +37,7 @@
#import <WebCore/IOSurfacePool.h>
#import <WebCore/WebActionDisablingCALayerDelegate.h>
+using namespace IPC;
using namespace WebCore;
static const CFIndex didCommitLayersRunLoopOrder = (CFIndex)RunLoopObserver::WellKnownRunLoopOrders::CoreAnimationCommit + 1;
@@ -317,6 +318,18 @@
m_webPageProxy->process().send(Messages::DrawingArea::DidUpdate(), m_webPageProxy->pageID());
m_lastVisibleTransactionID = m_transactionIDForPendingCACommit;
+
+ m_webPageProxy->didUpdateViewState();
}
+void RemoteLayerTreeDrawingAreaProxy::waitForDidUpdateViewState()
+{
+#if PLATFORM(IOS)
+ auto viewStateUpdateTimeout = std::chrono::milliseconds(500);
+#else
+ auto viewStateUpdateTimeout = std::chrono::milliseconds(250);
+#endif
+ m_webPageProxy->process().connection()->waitForAndDispatchImmediately<Messages::RemoteLayerTreeDrawingAreaProxy::CommitLayerTree>(m_webPageProxy->pageID(), viewStateUpdateTimeout, InterruptWaitingIfSyncMessageArrives);
+}
+
} // namespace WebKit
Modified: trunk/Source/WebKit2/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h (170318 => 170319)
--- trunk/Source/WebKit2/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h 2014-06-23 21:27:59 UTC (rev 170318)
+++ trunk/Source/WebKit2/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h 2014-06-23 21:32:03 UTC (rev 170319)
@@ -52,6 +52,8 @@
virtual void adjustTransientZoom(double scale, WebCore::FloatPoint origin) override;
virtual void commitTransientZoom(double scale, WebCore::FloatPoint origin) override;
+ virtual void waitForDidUpdateViewState() override;
+
// Message handlers.
virtual void didUpdateGeometry() override;
virtual void intrinsicContentSizeDidChange(const WebCore::IntSize& newIntrinsicContentSize) override;
Modified: trunk/Source/WebKit2/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm (170318 => 170319)
--- trunk/Source/WebKit2/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm 2014-06-23 21:27:59 UTC (rev 170318)
+++ trunk/Source/WebKit2/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm 2014-06-23 21:32:03 UTC (rev 170319)
@@ -35,6 +35,7 @@
#import "WebPageProxy.h"
#import "WebProcessProxy.h"
+using namespace IPC;
using namespace WebCore;
namespace WebKit {
@@ -126,6 +127,12 @@
sendUpdateGeometry();
}
+void TiledCoreAnimationDrawingAreaProxy::waitForDidUpdateViewState()
+{
+ auto viewStateUpdateTimeout = std::chrono::milliseconds(250);
+ m_webPageProxy->process().connection()->waitForAndDispatchImmediately<Messages::WebPageProxy::DidUpdateViewState>(m_webPageProxy->pageID(), viewStateUpdateTimeout, InterruptWaitingIfSyncMessageArrives);
+}
+
void TiledCoreAnimationDrawingAreaProxy::intrinsicContentSizeDidChange(const IntSize& newIntrinsicContentSize)
{
if (m_webPageProxy->minimumLayoutSize().width() > 0)
Modified: trunk/Source/WebKit2/WebProcess/WebPage/DrawingArea.h (170318 => 170319)
--- trunk/Source/WebKit2/WebProcess/WebPage/DrawingArea.h 2014-06-23 21:27:59 UTC (rev 170318)
+++ trunk/Source/WebKit2/WebProcess/WebPage/DrawingArea.h 2014-06-23 21:32:03 UTC (rev 170319)
@@ -114,7 +114,7 @@
virtual void dispatchAfterEnsuringUpdatedScrollPosition(std::function<void ()>);
- virtual void viewStateDidChange(WebCore::ViewState::Flags) { }
+ virtual void viewStateDidChange(WebCore::ViewState::Flags, bool wantsDidUpdateViewState) { }
virtual void setLayerHostingMode(LayerHostingMode) { }
virtual bool markLayersVolatileImmediatelyIfPossible() { return true; }
Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (170318 => 170319)
--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp 2014-06-23 21:27:59 UTC (rev 170318)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp 2014-06-23 21:32:03 UTC (rev 170319)
@@ -266,7 +266,6 @@
, m_accessibilityObject(0)
#endif
, m_setCanStartMediaTimer(RunLoop::main(), this, &WebPage::setCanStartMediaTimerFired)
- , m_sendDidUpdateViewStateTimer(RunLoop::main(), this, &WebPage::didUpdateViewStateTimerFired)
, m_formClient(std::make_unique<API::InjectedBundle::FormClient>())
, m_uiClient(std::make_unique<API::InjectedBundle::PageUIClient>())
, m_findController(this)
@@ -2174,13 +2173,6 @@
m_page->setCanStartMedia(true);
}
-#if !PLATFORM(MAC)
-void WebPage::didUpdateViewStateTimerFired()
-{
- send(Messages::WebPageProxy::DidUpdateViewState());
-}
-#endif
-
inline bool WebPage::canHandleUserEvents() const
{
#if USE(TILED_BACKING_STORE)
@@ -2220,16 +2212,14 @@
ViewState::Flags changed = m_viewState ^ viewState;
m_viewState = viewState;
- m_drawingArea->viewStateDidChange(changed);
m_page->setViewState(viewState);
for (auto* pluginView : m_pluginViews)
pluginView->viewStateDidChange(changed);
+ m_drawingArea->viewStateDidChange(changed, wantsDidUpdateViewState);
+
if (changed & ViewState::IsInWindow)
updateIsInWindow();
-
- if (wantsDidUpdateViewState)
- m_sendDidUpdateViewStateTimer.startOneShot(0);
}
void WebPage::setLayerHostingMode(unsigned layerHostingMode)
Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h (170318 => 170319)
--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h 2014-06-23 21:27:59 UTC (rev 170318)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h 2014-06-23 21:32:03 UTC (rev 170319)
@@ -1024,7 +1024,6 @@
void changeSelectedIndex(int32_t index);
void setCanStartMediaTimerFired();
- void didUpdateViewStateTimerFired();
bool canHandleUserEvents() const;
@@ -1128,7 +1127,6 @@
#endif // !PLATFORM(IOS)
RunLoop::Timer<WebPage> m_setCanStartMediaTimer;
- RunLoop::Timer<WebPage> m_sendDidUpdateViewStateTimer;
bool m_mayStartMediaWhenInWindow;
HashMap<uint64_t, RefPtr<WebUndoStep>> m_undoStepMap;
Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.h (170318 => 170319)
--- trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.h 2014-06-23 21:27:59 UTC (rev 170318)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.h 2014-06-23 21:32:03 UTC (rev 170319)
@@ -95,6 +95,8 @@
virtual void mainFrameContentSizeChanged(const WebCore::IntSize&) override;
+ virtual void viewStateDidChange(WebCore::ViewState::Flags changed, bool wantsDidUpdateViewState) override;
+
// GraphicsLayerClient
virtual void notifyAnimationStarted(const WebCore::GraphicsLayer*, double time) override { }
virtual void notifyFlushRequired(const WebCore::GraphicsLayer*) override { }
Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm (170318 => 170319)
--- trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm 2014-06-23 21:27:59 UTC (rev 170318)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm 2014-06-23 21:32:03 UTC (rev 170319)
@@ -384,4 +384,9 @@
m_connection->sendMessage(std::move(m_commitEncoder));
}
+void RemoteLayerTreeDrawingArea::viewStateDidChange(ViewState::Flags, bool wantsDidUpdateViewState)
+{
+ // FIXME: Should we suspend painting while not visible, like TiledCoreAnimationDrawingArea? Probably.
+}
+
} // namespace WebKit
Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h (170318 => 170319)
--- trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h 2014-06-23 21:27:59 UTC (rev 170318)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h 2014-06-23 21:32:03 UTC (rev 170319)
@@ -36,6 +36,7 @@
#include <WebCore/TransformationMatrix.h>
#include <wtf/HashMap.h>
#include <wtf/RetainPtr.h>
+#include <wtf/RunLoop.h>
OBJC_CLASS CALayer;
@@ -54,8 +55,6 @@
TiledCoreAnimationDrawingArea(WebPage&, const WebPageCreationParameters&);
virtual ~TiledCoreAnimationDrawingArea();
- virtual void viewStateDidChange(WebCore::ViewState::Flags changed) override;
-
private:
// DrawingArea
virtual void setNeedsDisplay() override;
@@ -81,6 +80,9 @@
virtual bool shouldUseTiledBackingForFrameView(const WebCore::FrameView*) override;
+ virtual void viewStateDidChange(WebCore::ViewState::Flags changed, bool wantsDidUpdateViewState) override;
+ void didUpdateViewStateTimerFired();
+
// WebCore::LayerFlushSchedulerClient
virtual bool flushLayers() override;
@@ -136,6 +138,8 @@
WebCore::FloatPoint m_transientZoomOrigin;
WebCore::TransformationMatrix m_transform;
+
+ RunLoop::Timer<TiledCoreAnimationDrawingArea> m_sendDidUpdateViewStateTimer;
};
DRAWING_AREA_TYPE_CASTS(TiledCoreAnimationDrawingArea, type() == DrawingAreaTypeTiledCoreAnimation);
Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm (170318 => 170319)
--- trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm 2014-06-23 21:27:59 UTC (rev 170318)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm 2014-06-23 21:32:03 UTC (rev 170319)
@@ -75,6 +75,7 @@
, m_exposedRect(FloatRect::infiniteRect())
, m_scrolledExposedRect(FloatRect::infiniteRect())
, m_transientZoomScale(1)
+ , m_sendDidUpdateViewStateTimer(RunLoop::main(), this, &TiledCoreAnimationDrawingArea::didUpdateViewStateTimerFired)
{
m_webPage.corePage()->settings().setForceCompositingMode(true);
@@ -294,7 +295,7 @@
return returnValue;
}
-void TiledCoreAnimationDrawingArea::viewStateDidChange(ViewState::Flags changed)
+void TiledCoreAnimationDrawingArea::viewStateDidChange(ViewState::Flags changed, bool wantsDidUpdateViewState)
{
if (changed & ViewState::IsVisible) {
if (m_webPage.isVisible())
@@ -302,8 +303,17 @@
else
suspendPainting();
}
+
+ if (wantsDidUpdateViewState)
+ m_sendDidUpdateViewStateTimer.startOneShot(0);
}
+void TiledCoreAnimationDrawingArea::didUpdateViewStateTimerFired()
+{
+ [CATransaction flush];
+ m_webPage.send(Messages::WebPageProxy::DidUpdateViewState());
+}
+
void TiledCoreAnimationDrawingArea::suspendPainting()
{
ASSERT(!m_isPaintingSuspended);
Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm (170318 => 170319)
--- trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm 2014-06-23 21:27:59 UTC (rev 170318)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm 2014-06-23 21:32:03 UTC (rev 170319)
@@ -989,12 +989,6 @@
}
}
-void WebPage::didUpdateViewStateTimerFired()
-{
- [CATransaction flush];
- send(Messages::WebPageProxy::DidUpdateViewState());
-}
-
#if ENABLE(WEBGL)
WebCore::WebGLLoadPolicy WebPage::webGLPolicyForURL(WebFrame* frame, const String& url)
{