165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/*
265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2011 Apple Inc. All rights reserved.
365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without
565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions
665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met:
765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright
865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer.
965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    documentation and/or other materials provided with the distribution.
1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE.
2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */
2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "config.h"
2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "DrawingAreaProxyImpl.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "DrawingAreaMessages.h"
302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "DrawingAreaProxyMessages.h"
312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "LayerTreeContext.h"
32ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include "Region.h"
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "UpdateInfo.h"
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebPageProxy.h"
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebProcessProxy.h"
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if !PLATFORM(MAC) && !PLATFORM(WIN)
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#error "This drawing area is not ready for use by other ports yet."
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore;
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassOwnPtr<DrawingAreaProxyImpl> DrawingAreaProxyImpl::create(WebPageProxy* webPageProxy)
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return adoptPtr(new DrawingAreaProxyImpl(webPageProxy));
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochDrawingAreaProxyImpl::DrawingAreaProxyImpl(WebPageProxy* webPageProxy)
5181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    : DrawingAreaProxy(DrawingAreaTypeImpl, webPageProxy)
5281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_currentBackingStoreStateID(0)
5381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_nextBackingStoreStateID(0)
5481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_isWaitingForDidUpdateBackingStoreState(false)
552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_isBackingStoreDiscardable(true)
5681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_discardBackingStoreTimer(RunLoop::current(), this, &DrawingAreaProxyImpl::discardBackingStore)
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochDrawingAreaProxyImpl::~DrawingAreaProxyImpl()
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
622bde8e466a4451c7319e3a072d118917957d6554Steve Block#if USE(ACCELERATED_COMPOSITING)
632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Make sure to exit accelerated compositing mode.
642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (isInAcceleratedCompositingMode())
652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        exitAcceleratedCompositingMode();
662bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
69ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid DrawingAreaProxyImpl::paint(BackingStore::PlatformGraphicsContext context, const IntRect& rect, Region& unpaintedRegion)
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
71ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    unpaintedRegion = rect;
72ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
7381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (isInAcceleratedCompositingMode())
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT(m_currentBackingStoreStateID <= m_nextBackingStoreStateID);
7781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (m_currentBackingStoreStateID < m_nextBackingStoreStateID) {
7881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Tell the web process to do a full backing store update now, in case we previously told
7981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // it about our next state but didn't request an immediate update.
8081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        sendUpdateBackingStoreState(RespondImmediately);
812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (m_isWaitingForDidUpdateBackingStoreState) {
8381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // Wait for a DidUpdateBackingStoreState message that contains the new bits before we paint
8481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // what's currently in the backing store.
8581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            waitForAndDispatchDidUpdateBackingStoreState();
8681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Dispatching DidUpdateBackingStoreState (either beneath sendUpdateBackingStoreState or
8981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // beneath waitForAndDispatchDidUpdateBackingStoreState) could destroy our backing store or
9081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // change the compositing mode.
912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (!m_backingStore || isInAcceleratedCompositingMode())
922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return;
9381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else {
9481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        ASSERT(!m_isWaitingForDidUpdateBackingStoreState);
9581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (!m_backingStore) {
9681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // The view has asked us to paint before the web process has painted anything. There's
9781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // nothing we can do.
9881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return;
9981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
1002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
1012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_backingStore->paint(context, rect);
103ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    unpaintedRegion.subtract(IntRect(IntPoint(), m_backingStore->size()));
10481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
10581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    discardBackingStoreSoon();
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DrawingAreaProxyImpl::didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*)
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT_NOT_REACHED();
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DrawingAreaProxyImpl::didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*, CoreIPC::ArgumentEncoder*)
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT_NOT_REACHED();
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool DrawingAreaProxyImpl::paint(const WebCore::IntRect&, PlatformDrawingContext)
11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT_NOT_REACHED();
12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return false;
12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DrawingAreaProxyImpl::sizeDidChange()
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
12681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    backingStoreStateDidChange(RespondImmediately);
12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
129ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid DrawingAreaProxyImpl::visibilityDidChange()
130ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
131ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (!m_webPageProxy->isViewVisible()) {
132ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        // Suspend painting.
133ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        m_webPageProxy->process()->send(Messages::DrawingArea::SuspendPainting(), m_webPageProxy->pageID());
134ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return;
135ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
136ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
137ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // Resume painting.
138ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    m_webPageProxy->process()->send(Messages::DrawingArea::ResumePainting(), m_webPageProxy->pageID());
1392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(ACCELERATED_COMPOSITING)
1412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // If we don't have a backing store, go ahead and mark the backing store as being changed so
1422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // that when paint we'll actually wait for something to paint and not flash white.
1432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!m_backingStore && m_layerTreeContext.isEmpty())
1442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        backingStoreStateDidChange(DoNotRespondImmediately);
1452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
146ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
147ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
148ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid DrawingAreaProxyImpl::setPageIsVisible(bool)
14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid DrawingAreaProxyImpl::setBackingStoreIsDiscardable(bool isBackingStoreDiscardable)
1532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
1542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (m_isBackingStoreDiscardable == isBackingStoreDiscardable)
1552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
1562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_isBackingStoreDiscardable = isBackingStoreDiscardable;
1582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (m_isBackingStoreDiscardable)
1592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        discardBackingStoreSoon();
1602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    else
1612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_discardBackingStoreTimer.stop();
1622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
1632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
16481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid DrawingAreaProxyImpl::update(uint64_t backingStoreStateID, const UpdateInfo& updateInfo)
16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
16681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT_ARG(backingStoreStateID, backingStoreStateID <= m_currentBackingStoreStateID);
16781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (backingStoreStateID < m_currentBackingStoreStateID)
1682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
1692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME: Handle the case where the view is hidden.
17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    incorporateUpdate(updateInfo);
17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webPageProxy->process()->send(Messages::DrawingArea::DidUpdate(), m_webPageProxy->pageID());
17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid DrawingAreaProxyImpl::didUpdateBackingStoreState(uint64_t backingStoreStateID, const UpdateInfo& updateInfo, const LayerTreeContext& layerTreeContext)
17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
17881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT_ARG(backingStoreStateID, backingStoreStateID <= m_nextBackingStoreStateID);
17981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT_ARG(backingStoreStateID, backingStoreStateID > m_currentBackingStoreStateID);
18081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_currentBackingStoreStateID = backingStoreStateID;
1812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
18281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_isWaitingForDidUpdateBackingStoreState = false;
183ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
18481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (m_nextBackingStoreStateID != m_currentBackingStoreStateID)
18581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        sendUpdateBackingStoreState(RespondImmediately);
186ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1872bde8e466a4451c7319e3a072d118917957d6554Steve Block#if USE(ACCELERATED_COMPOSITING)
1882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (layerTreeContext != m_layerTreeContext) {
1892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (!m_layerTreeContext.isEmpty()) {
1902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            exitAcceleratedCompositingMode();
1912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            ASSERT(m_layerTreeContext.isEmpty());
1922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
1932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (!layerTreeContext.isEmpty()) {
1952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            enterAcceleratedCompositingMode(layerTreeContext);
1962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            ASSERT(layerTreeContext == m_layerTreeContext);
1972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
1982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
1992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (isInAcceleratedCompositingMode()) {
2012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ASSERT(!m_backingStore);
2022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
2032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
2042bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
2052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
20681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // FIXME: We could just reuse our existing backing store if it's the same size as
20781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // updateInfo.viewSize.
208ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    m_backingStore = nullptr;
2092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    incorporateUpdate(updateInfo);
2102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
21281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid DrawingAreaProxyImpl::enterAcceleratedCompositingMode(uint64_t backingStoreStateID, const LayerTreeContext& layerTreeContext)
2132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
21481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT_ARG(backingStoreStateID, backingStoreStateID <= m_currentBackingStoreStateID);
21581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (backingStoreStateID < m_currentBackingStoreStateID)
2162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
2172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2182bde8e466a4451c7319e3a072d118917957d6554Steve Block#if USE(ACCELERATED_COMPOSITING)
2192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    enterAcceleratedCompositingMode(layerTreeContext);
2202bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
2212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
22381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid DrawingAreaProxyImpl::exitAcceleratedCompositingMode(uint64_t backingStoreStateID, const UpdateInfo& updateInfo)
2242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
22581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT_ARG(backingStoreStateID, backingStoreStateID <= m_currentBackingStoreStateID);
22681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (backingStoreStateID < m_currentBackingStoreStateID)
2272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
2282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2292bde8e466a4451c7319e3a072d118917957d6554Steve Block#if USE(ACCELERATED_COMPOSITING)
2302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    exitAcceleratedCompositingMode();
2312bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
232ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
233ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    incorporateUpdate(updateInfo);
23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
23565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DrawingAreaProxyImpl::incorporateUpdate(const UpdateInfo& updateInfo)
23765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
2382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(!isInAcceleratedCompositingMode());
2392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
240ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (updateInfo.updateRectBounds.isEmpty())
241ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return;
24265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_backingStore)
244ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        m_backingStore = BackingStore::create(updateInfo.viewSize, m_webPageProxy);
24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_backingStore->incorporateUpdate(updateInfo);
24765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
248ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    bool shouldScroll = !updateInfo.scrollRect.isEmpty();
249ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
250ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (shouldScroll)
251ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        m_webPageProxy->scrollView(updateInfo.scrollRect, updateInfo.scrollOffset);
25281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
25365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (size_t i = 0; i < updateInfo.updateRects.size(); ++i)
25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_webPageProxy->setViewNeedsDisplay(updateInfo.updateRects[i]);
25565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (WebPageProxy::debugPaintFlags() & kWKDebugFlashBackingStoreUpdates)
25781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_webPageProxy->flashBackingStoreUpdates(updateInfo.updateRects);
25881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
259ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (shouldScroll)
26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_webPageProxy->displayView();
26165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
26265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid DrawingAreaProxyImpl::backingStoreStateDidChange(RespondImmediatelyOrNot respondImmediatelyOrNot)
26481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
26581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ++m_nextBackingStoreStateID;
26681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    sendUpdateBackingStoreState(respondImmediatelyOrNot);
26781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
26881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
26981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid DrawingAreaProxyImpl::sendUpdateBackingStoreState(RespondImmediatelyOrNot respondImmediatelyOrNot)
27065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
27181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT(m_currentBackingStoreStateID < m_nextBackingStoreStateID);
27281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
27365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_webPageProxy->isValid())
27465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
27565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
27681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (m_isWaitingForDidUpdateBackingStoreState)
277ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return;
278ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
27981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_isWaitingForDidUpdateBackingStoreState = respondImmediatelyOrNot == RespondImmediately;
28081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_webPageProxy->process()->send(Messages::DrawingArea::UpdateBackingStoreState(m_nextBackingStoreStateID, respondImmediatelyOrNot == RespondImmediately, m_size, m_scrollOffset), m_webPageProxy->pageID());
2812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_scrollOffset = IntSize();
2822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2832bde8e466a4451c7319e3a072d118917957d6554Steve Block#if USE(ACCELERATED_COMPOSITING)
28481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (m_isWaitingForDidUpdateBackingStoreState && !m_layerTreeContext.isEmpty()) {
28581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Wait for the DidUpdateBackingStoreState message. Normally we don this in DrawingAreaProxyImpl::paint, but that
2862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // function is never called when in accelerated compositing mode.
28781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        waitForAndDispatchDidUpdateBackingStoreState();
2882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
2892bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
2902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
29281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid DrawingAreaProxyImpl::waitForAndDispatchDidUpdateBackingStoreState()
2932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
29481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT(m_isWaitingForDidUpdateBackingStoreState);
2952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_webPageProxy->isValid())
2972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
2982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_webPageProxy->process()->isLaunching())
2992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
3002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3012bde8e466a4451c7319e3a072d118917957d6554Steve Block#if USE(ACCELERATED_COMPOSITING)
30281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // FIXME: waitForAndDispatchImmediately will always return the oldest DidUpdateBackingStoreState message that
30381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // hasn't yet been processed. But it might be better to skip ahead to some other DidUpdateBackingStoreState
30481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // message, if multiple DidUpdateBackingStoreState messages are waiting to be processed. For instance, we could
30581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // choose the most recent one, or the one that is closest to our current size.
30681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
30781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // The timeout, in seconds, we use when waiting for a DidUpdateBackingStoreState message when we're asked to paint.
30881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static const double didUpdateBackingStoreStateTimeout = 0.5;
30981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_webPageProxy->process()->connection()->waitForAndDispatchImmediately<Messages::DrawingAreaProxy::DidUpdateBackingStoreState>(m_webPageProxy->pageID(), didUpdateBackingStoreStateTimeout);
3102bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
3112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3132bde8e466a4451c7319e3a072d118917957d6554Steve Block#if USE(ACCELERATED_COMPOSITING)
3142fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid DrawingAreaProxyImpl::enterAcceleratedCompositingMode(const LayerTreeContext& layerTreeContext)
3152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(!isInAcceleratedCompositingMode());
3172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_backingStore = nullptr;
3192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_layerTreeContext = layerTreeContext;
3202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_webPageProxy->enterAcceleratedCompositingMode(layerTreeContext);
3212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3232fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid DrawingAreaProxyImpl::exitAcceleratedCompositingMode()
3242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(isInAcceleratedCompositingMode());
3262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_layerTreeContext = LayerTreeContext();
3282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_webPageProxy->exitAcceleratedCompositingMode();
32965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
3302bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
33165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
33281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid DrawingAreaProxyImpl::discardBackingStoreSoon()
33381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
3342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!m_isBackingStoreDiscardable)
3352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
3362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
33781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // We'll wait this many seconds after the last paint before throwing away our backing store to save memory.
33881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // FIXME: It would be smarter to make this delay based on how expensive painting is. See <http://webkit.org/b/55733>.
33981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static const double discardBackingStoreDelay = 5;
34081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
34181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_discardBackingStoreTimer.startOneShot(discardBackingStoreDelay);
34281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
34381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
34481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid DrawingAreaProxyImpl::discardBackingStore()
34581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
34681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_backingStore = nullptr;
34781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    backingStoreStateDidChange(DoNotRespondImmediately);
34881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
34981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
35065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
351