1/* 2 * Copyright (C) 2011 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23 * THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#ifndef DrawingAreaProxyImpl_h 27#define DrawingAreaProxyImpl_h 28 29#include "BackingStore.h" 30#include "DrawingAreaProxy.h" 31#include "LayerTreeContext.h" 32#include <wtf/RunLoop.h> 33 34namespace WebCore { 35class Region; 36} 37 38namespace WebKit { 39 40class DrawingAreaProxyImpl : public DrawingAreaProxy { 41public: 42 explicit DrawingAreaProxyImpl(WebPageProxy*); 43 virtual ~DrawingAreaProxyImpl(); 44 45 void paint(BackingStore::PlatformGraphicsContext, const WebCore::IntRect&, WebCore::Region& unpaintedRegion); 46 47 bool isInAcceleratedCompositingMode() const { return !m_layerTreeContext.isEmpty(); } 48 49 bool hasReceivedFirstUpdate() const { return m_hasReceivedFirstUpdate; } 50 51private: 52 // DrawingAreaProxy 53 virtual void sizeDidChange(); 54 virtual void deviceScaleFactorDidChange(); 55 56 virtual void setBackingStoreIsDiscardable(bool); 57 virtual void waitForBackingStoreUpdateOnNextPaint(); 58 59 // IPC message handlers 60 virtual void update(uint64_t backingStoreStateID, const UpdateInfo&); 61 virtual void didUpdateBackingStoreState(uint64_t backingStoreStateID, const UpdateInfo&, const LayerTreeContext&); 62 virtual void enterAcceleratedCompositingMode(uint64_t backingStoreStateID, const LayerTreeContext&); 63 virtual void exitAcceleratedCompositingMode(uint64_t backingStoreStateID, const UpdateInfo&); 64 virtual void updateAcceleratedCompositingMode(uint64_t backingStoreStateID, const LayerTreeContext&); 65 66 void incorporateUpdate(const UpdateInfo&); 67 68 enum RespondImmediatelyOrNot { DoNotRespondImmediately, RespondImmediately }; 69 void backingStoreStateDidChange(RespondImmediatelyOrNot); 70 void sendUpdateBackingStoreState(RespondImmediatelyOrNot); 71 void waitForAndDispatchDidUpdateBackingStoreState(); 72 73 void enterAcceleratedCompositingMode(const LayerTreeContext&); 74 void exitAcceleratedCompositingMode(); 75 void updateAcceleratedCompositingMode(const LayerTreeContext&); 76 77 void discardBackingStoreSoon(); 78 void discardBackingStore(); 79 80 // The state ID corresponding to our current backing store. Updated whenever we allocate 81 // a new backing store. Any messages received that correspond to an earlier state are ignored, 82 // as they don't apply to our current backing store. 83 uint64_t m_currentBackingStoreStateID; 84 85 // The next backing store state ID we will request the web process update to. Incremented 86 // whenever our state changes in a way that will require a new backing store to be allocated. 87 uint64_t m_nextBackingStoreStateID; 88 89 // The current layer tree context. 90 LayerTreeContext m_layerTreeContext; 91 92 // Whether we've sent a UpdateBackingStoreState message and are now waiting for a DidUpdateBackingStoreState message. 93 // Used to throttle UpdateBackingStoreState messages so we don't send them faster than the Web process can handle. 94 bool m_isWaitingForDidUpdateBackingStoreState; 95 96 // For a new Drawing Area don't draw anything until the WebProcess has sent over the first content. 97 bool m_hasReceivedFirstUpdate; 98 99 bool m_isBackingStoreDiscardable; 100 std::unique_ptr<BackingStore> m_backingStore; 101 102 RunLoop::Timer<DrawingAreaProxyImpl> m_discardBackingStoreTimer; 103}; 104 105} // namespace WebKit 106 107#endif // DrawingAreaProxyImpl_h 108