Get rid of LayerTreeContext::seed on Mac.
[WebKit-https.git] / Source / WebKit2 / UIProcess / DrawingAreaProxyImpl.cpp
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 #include "config.h"
27 #include "DrawingAreaProxyImpl.h"
28
29 #include "DrawingAreaMessages.h"
30 #include "DrawingAreaProxyMessages.h"
31 #include "LayerTreeContext.h"
32 #include "Region.h"
33 #include "UpdateInfo.h"
34 #include "WebPageProxy.h"
35 #include "WebProcessProxy.h"
36
37 #ifndef __APPLE__
38 #error "This drawing area is not ready for use by other ports yet."
39 #endif
40
41 using namespace WebCore;
42
43 namespace WebKit {
44
45 PassOwnPtr<DrawingAreaProxyImpl> DrawingAreaProxyImpl::create(WebPageProxy* webPageProxy)
46 {
47     return adoptPtr(new DrawingAreaProxyImpl(webPageProxy));
48 }
49
50 DrawingAreaProxyImpl::DrawingAreaProxyImpl(WebPageProxy* webPageProxy)
51     : DrawingAreaProxy(DrawingAreaInfo::Impl, webPageProxy)
52     , m_isWaitingForDidSetSize(false)
53     , m_isInAcceleratedCompositingMode(false)
54     , m_lastDidSetSizeSequenceNumber(0)
55 {
56 }
57
58 DrawingAreaProxyImpl::~DrawingAreaProxyImpl()
59 {
60 }
61
62 void DrawingAreaProxyImpl::paint(BackingStore::PlatformGraphicsContext context, const IntRect& rect, Region& unpaintedRegion)
63 {
64     unpaintedRegion = rect;
65
66     if (!m_backingStore)
67         return;
68
69     ASSERT(!m_isInAcceleratedCompositingMode);
70
71     if (m_isWaitingForDidSetSize) {
72         if (!m_webPageProxy->isValid())
73             return;
74         if (m_webPageProxy->process()->isLaunching())
75             return;
76
77         // The timeout, in seconds, we use when waiting for a DidSetSize message when we're asked to paint.
78         static const double didSetSizeTimeout = 0.5;
79         m_webPageProxy->process()->connection()->waitForAndDispatchImmediately<Messages::DrawingAreaProxy::DidSetSize>(m_webPageProxy->pageID(), didSetSizeTimeout);
80     }
81
82     m_backingStore->paint(context, rect);
83     unpaintedRegion.subtract(IntRect(IntPoint(), m_backingStore->size()));
84 }
85
86 void DrawingAreaProxyImpl::didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*)
87 {
88     ASSERT_NOT_REACHED();
89 }
90
91 void DrawingAreaProxyImpl::didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*, CoreIPC::ArgumentEncoder*)
92 {
93     ASSERT_NOT_REACHED();
94 }
95
96 bool DrawingAreaProxyImpl::paint(const WebCore::IntRect&, PlatformDrawingContext)
97 {
98     ASSERT_NOT_REACHED();
99     return false;
100 }
101
102 void DrawingAreaProxyImpl::sizeDidChange()
103 {
104     sendSetSize();
105 }
106
107 void DrawingAreaProxyImpl::visibilityDidChange()
108 {
109     if (!m_webPageProxy->isViewVisible()) {
110         // Suspend painting.
111         m_webPageProxy->process()->send(Messages::DrawingArea::SuspendPainting(), m_webPageProxy->pageID());
112         return;
113     }
114
115     // Resume painting.
116     m_webPageProxy->process()->send(Messages::DrawingArea::ResumePainting(), m_webPageProxy->pageID());
117 }
118
119 void DrawingAreaProxyImpl::setPageIsVisible(bool)
120 {
121 }
122
123 void DrawingAreaProxyImpl::attachCompositingContext(uint32_t contextID)
124 {
125     ASSERT_NOT_REACHED();
126 }
127
128 void DrawingAreaProxyImpl::detachCompositingContext()
129 {
130     ASSERT_NOT_REACHED();
131 }
132
133 void DrawingAreaProxyImpl::update(uint64_t sequenceNumber, const UpdateInfo& updateInfo)
134 {
135     if (sequenceNumber < m_lastDidSetSizeSequenceNumber)
136         return;
137
138     // FIXME: Handle the case where the view is hidden.
139
140     incorporateUpdate(updateInfo);
141     m_webPageProxy->process()->send(Messages::DrawingArea::DidUpdate(), m_webPageProxy->pageID());
142 }
143
144 void DrawingAreaProxyImpl::didSetSize(uint64_t sequenceNumber, const UpdateInfo& updateInfo)
145 {
146     ASSERT(sequenceNumber > m_lastDidSetSizeSequenceNumber);
147     m_lastDidSetSizeSequenceNumber = sequenceNumber;
148
149     ASSERT(m_isWaitingForDidSetSize);
150     m_isWaitingForDidSetSize = false;
151
152     if (m_size != updateInfo.viewSize)
153         sendSetSize();
154
155     if (m_isInAcceleratedCompositingMode) {
156         ASSERT(!m_backingStore);
157         return;
158     }
159
160     m_backingStore = nullptr;
161     incorporateUpdate(updateInfo);
162 }
163
164 void DrawingAreaProxyImpl::enterAcceleratedCompositingMode(uint64_t sequenceNumber, const LayerTreeContext& layerTreeContext)
165 {
166     if (sequenceNumber < m_lastDidSetSizeSequenceNumber)
167         return;
168
169     enterAcceleratedCompositingMode(layerTreeContext);
170 }
171
172 void DrawingAreaProxyImpl::exitAcceleratedCompositingMode(uint64_t sequenceNumber)
173 {
174     if (sequenceNumber < m_lastDidSetSizeSequenceNumber)
175         return;
176
177     exitAcceleratedCompositingMode();
178 }
179
180 void DrawingAreaProxyImpl::incorporateUpdate(const UpdateInfo& updateInfo)
181 {
182     ASSERT(!m_isInAcceleratedCompositingMode);
183
184     if (updateInfo.updateRectBounds.isEmpty())
185         return;
186
187     if (!m_backingStore)
188         m_backingStore = BackingStore::create(updateInfo.viewSize, m_webPageProxy);
189
190     m_backingStore->incorporateUpdate(updateInfo);
191
192     bool shouldScroll = !updateInfo.scrollRect.isEmpty();
193
194     if (shouldScroll)
195         m_webPageProxy->scrollView(updateInfo.scrollRect, updateInfo.scrollOffset);
196     
197     for (size_t i = 0; i < updateInfo.updateRects.size(); ++i)
198         m_webPageProxy->setViewNeedsDisplay(updateInfo.updateRects[i]);
199
200     if (shouldScroll)
201         m_webPageProxy->displayView();
202 }
203
204 void DrawingAreaProxyImpl::sendSetSize()
205 {
206     if (!m_webPageProxy->isValid())
207         return;
208
209     if (m_isWaitingForDidSetSize)
210         return;
211
212     m_isWaitingForDidSetSize = true;
213     m_webPageProxy->process()->send(Messages::DrawingArea::SetSize(m_size), m_webPageProxy->pageID());
214 }
215
216 void DrawingAreaProxyImpl::enterAcceleratedCompositingMode(const LayerTreeContext& layerTreeContext)
217 {
218     ASSERT(!m_isInAcceleratedCompositingMode);
219     m_isInAcceleratedCompositingMode = true;
220     
221     m_backingStore = nullptr;
222     m_webPageProxy->enterAcceleratedCompositingMode(layerTreeContext);
223 }
224
225 void DrawingAreaProxyImpl::exitAcceleratedCompositingMode()
226 {
227     ASSERT(m_isInAcceleratedCompositingMode);
228     m_isInAcceleratedCompositingMode = false;
229     
230     m_webPageProxy->exitAcceleratedCompositingMode();
231 }
232
233 } // namespace WebKit