2010-07-01 Simon Fraser <simon.fraser@apple.com>
[WebKit-https.git] / WebKit2 / UIProcess / LayerBackedDrawingAreaProxy.cpp
1 /*
2  * Copyright (C) 2010 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 #if USE(ACCELERATED_COMPOSITING)
27
28 #include "LayerBackedDrawingAreaProxy.h"
29
30 #include "DrawingAreaMessageKinds.h"
31 #include "DrawingAreaProxyMessageKinds.h"
32 #include "MessageID.h"
33 #include "WebPageProxy.h"
34 #include "WebProcessProxy.h"
35
36 using namespace WebCore;
37
38 namespace WebKit {
39
40 LayerBackedDrawingAreaProxy::LayerBackedDrawingAreaProxy(PlatformWebView* webView)
41     : DrawingAreaProxy(LayerBackedDrawingAreaType)
42     , m_isWaitingForDidSetFrameNotification(false)
43     , m_isVisible(true)
44     , m_webView(webView)
45 {
46 }
47
48 LayerBackedDrawingAreaProxy::~LayerBackedDrawingAreaProxy()
49 {
50 }
51
52 void LayerBackedDrawingAreaProxy::paint(const IntRect& rect, PlatformDrawingContext context)
53 {
54 }
55
56 void LayerBackedDrawingAreaProxy::setSize(const IntSize& viewSize)
57 {
58     WebPageProxy* page = this->page();
59     if (!page->isValid())
60         return;
61
62     if (viewSize.isEmpty())
63         return;
64
65     m_viewSize = viewSize;
66     m_lastSetViewSize = viewSize;
67
68     platformSetSize();
69
70     if (m_isWaitingForDidSetFrameNotification)
71         return;
72     m_isWaitingForDidSetFrameNotification = true;
73
74     page->process()->responsivenessTimer()->start();
75     page->process()->connection()->send(DrawingAreaMessage::SetSize, page->pageID(), CoreIPC::In(viewSize));
76 }
77
78 #if !PLATFORM(MAC)
79 void LayerBackedDrawingAreaProxy::platformSetSize()
80 {
81 }
82 #endif
83
84 void LayerBackedDrawingAreaProxy::setPageIsVisible(bool isVisible)
85 {
86     WebPageProxy* page = this->page();
87
88     if (isVisible == m_isVisible)
89         return;
90     
91     m_isVisible = isVisible;
92     if (!page->isValid())
93         return;
94
95     if (!m_isVisible) {
96         // Tell the web process that it doesn't need to paint anything for now.
97         page->process()->connection()->send(DrawingAreaMessage::SuspendPainting, page->pageID(), CoreIPC::In());
98         return;
99     }
100     
101     // The page is now visible.
102     page->process()->connection()->send(DrawingAreaMessage::ResumePainting, page->pageID(), CoreIPC::In());
103     
104     // FIXME: We should request a full repaint here if needed.
105 }
106     
107 void LayerBackedDrawingAreaProxy::didSetSize()
108 {
109     m_isWaitingForDidSetFrameNotification = false;
110 }
111
112 void LayerBackedDrawingAreaProxy::update()
113 {
114     WebPageProxy* page = this->page();
115     page->process()->connection()->send(DrawingAreaMessage::DidUpdate, page->pageID(), CoreIPC::In());
116 }
117
118 void LayerBackedDrawingAreaProxy::didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder& arguments)
119 {
120     switch (messageID.get<DrawingAreaProxyMessage::Kind>()) {
121         case DrawingAreaProxyMessage::Update: {
122             update();
123             break;
124         }
125         case DrawingAreaProxyMessage::DidSetSize: {
126             didSetSize();
127             break;
128         }
129 #if USE(ACCELERATED_COMPOSITING)
130         case DrawingAreaProxyMessage::AttachCompositingContext: {
131             uint32_t contextID;
132             if (!arguments.decode(CoreIPC::Out(contextID)))
133                 return;
134             attachCompositingContext(contextID);
135             break;
136         }
137         case DrawingAreaProxyMessage::DetachCompositingContext: {
138             detachCompositingContext();
139             break;
140         }
141 #endif
142         default:
143             ASSERT_NOT_REACHED();
144     }
145 }
146
147 } // namespace WebKit
148
149 #endif // USE(ACCELERATED_COMPOSITING)