2010-07-01 Simon Fraser <simon.fraser@apple.com>
[WebKit-https.git] / WebKit2 / WebProcess / WebPage / mac / LayerBackedDrawingAreaMac.mm
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 "LayerBackedDrawingArea.h"
29
30 #include "DrawingAreaProxyMessageKinds.h"
31 #include "WebKitSystemInterface.h"
32 #include "WebPage.h"
33 #include "WebProcess.h"
34 #include <WebCore/Frame.h>
35 #include <WebCore/FrameView.h>
36 #include <WebCore/GraphicsLayer.h>
37 #include <WebCore/Page.h>
38
39 using namespace WebCore;
40
41 namespace WebKit {
42
43 void LayerBackedDrawingArea::platformInit()
44 {
45     setUpUpdateLayoutRunLoopObserver();
46 }
47
48 void LayerBackedDrawingArea::platformClear()
49 {
50     if (m_updateLayoutRunLoopObserver) {
51         CFRunLoopObserverInvalidate(m_updateLayoutRunLoopObserver.get());
52         m_updateLayoutRunLoopObserver = 0;
53     }
54
55     WKCARemoteLayerClientInvalidate(m_remoteLayerRef.get());
56     m_remoteLayerRef = 0;
57 }
58
59 void LayerBackedDrawingArea::attachCompositingContext(GraphicsLayer* layer)
60 {
61     m_backingLayer->removeAllChildren();
62     if (layer) {
63         m_backingLayer->addChild(layer);
64     }
65
66     m_backingLayer->syncCompositingState();     // FIXME: hack
67     
68     m_backingLayer->setDebugBorder(Color(0, 0, 255, 0.6), 4);
69     
70     if (m_attached)
71         return;
72         
73     m_attached = true;
74
75     mach_port_t serverPort = 0; // FIXME: will use WebProcess::shared().compositingRenderServerPort();
76     m_remoteLayerRef = WKCARemoteLayerClientMakeWithServerPort(serverPort);
77     WKCARemoteLayerClientSetLayer(m_remoteLayerRef.get(), m_backingLayer->platformLayer());
78     
79     uint32_t contextID = WKCARemoteLayerClientGetClientId(m_remoteLayerRef.get());
80     WebProcess::shared().connection()->send(DrawingAreaProxyMessage::AttachCompositingContext, m_webPage->pageID(), CoreIPC::In(contextID));
81 }
82
83 void LayerBackedDrawingArea::detachCompositingContext()
84 {
85     m_backingLayer->removeAllChildren();
86     m_backingLayer->syncCompositingState();     // FIXME: hack
87 }
88
89 void LayerBackedDrawingArea::scheduleCompositingLayerSync()
90 {
91 //    if (m_syncTimer.isActive())
92 //        return;
93 //
94 //    m_syncTimer.startOneShot(0);
95
96     scheduleUpdateLayoutRunLoopObserver();
97 }
98
99 void LayerBackedDrawingArea::syncCompositingLayers()
100 {
101     bool didSync = m_webPage->corePage()->mainFrame()->view()->syncCompositingStateRecursive();
102     if (!didSync) {
103     
104     }
105 }
106
107 void LayerBackedDrawingArea::setUpUpdateLayoutRunLoopObserver()
108 {
109     if (m_updateLayoutRunLoopObserver)
110         return;
111
112     // Run before Core Animations commit observer, which has order 2000000.
113     const CFIndex runLoopOrder = 2000000 - 1;
114     CFRunLoopObserverContext context = { 0, this, 0, 0, 0 };
115     m_updateLayoutRunLoopObserver.adoptCF(CFRunLoopObserverCreate(0,
116         kCFRunLoopBeforeWaiting | kCFRunLoopExit, true /* repeats */,
117         runLoopOrder, updateLayoutRunLoopObserverCallback, &context));
118 }
119
120 void LayerBackedDrawingArea::scheduleUpdateLayoutRunLoopObserver()
121 {
122     CFRunLoopRef currentRunLoop = CFRunLoopGetCurrent();
123     if (CFRunLoopContainsObserver(currentRunLoop, m_updateLayoutRunLoopObserver.get(), kCFRunLoopCommonModes))
124         return;
125
126     CFRunLoopAddObserver(currentRunLoop, m_updateLayoutRunLoopObserver.get(), kCFRunLoopCommonModes);
127 }
128
129 void LayerBackedDrawingArea::removeUpdateLayoutRunLoopObserver()
130 {
131     // FIXME: cache the run loop ref?
132     CFRunLoopRemoveObserver(CFRunLoopGetCurrent(), m_updateLayoutRunLoopObserver.get(), kCFRunLoopCommonModes);
133 }
134
135 void LayerBackedDrawingArea::updateLayoutRunLoopObserverCallback(CFRunLoopObserverRef, CFRunLoopActivity, void* info)
136 {
137     LayerBackedDrawingArea* drawingArea = reinterpret_cast<LayerBackedDrawingArea*>(info);
138     drawingArea->updateLayoutRunLoopObserverFired();
139 }
140
141 void LayerBackedDrawingArea::updateLayoutRunLoopObserverFired()
142 {
143     m_webPage->layoutIfNeeded();
144     syncCompositingLayers();
145 }
146
147 } // namespace WebKit
148
149 #endif // USE(ACCELERATED_COMPOSITING)