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