Send along the current remote layer tree transaction with the commit message
[WebKit-https.git] / Source / WebKit2 / Shared / mac / RemoteLayerTreeTransaction.mm
1 /*
2  * Copyright (C) 2012 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 "RemoteLayerTreeTransaction.h"
28
29 #include "ArgumentCoders.h"
30 #include "MessageDecoder.h"
31 #include "MessageEncoder.h"
32 #include "RemoteGraphicsLayer.h"
33 #include <wtf/text/CString.h>
34 #include <wtf/text/StringBuilder.h>
35
36 namespace WebKit {
37
38 RemoteLayerTreeTransaction::LayerProperties::LayerProperties()
39     : changedProperties(NoChange)
40 {
41 }
42
43 void RemoteLayerTreeTransaction::LayerProperties::encode(CoreIPC::ArgumentEncoder& encoder) const
44 {
45     encoder << changedProperties;
46
47     if (changedProperties & NameChanged)
48         encoder << name;
49 }
50
51 bool RemoteLayerTreeTransaction::LayerProperties::decode(CoreIPC::ArgumentDecoder* decoder, LayerProperties& result)
52 {
53     if (!decoder->decode(result.changedProperties))
54         return false;
55
56     if (result.changedProperties & NameChanged) {
57         if (!decoder->decode(result.name))
58             return false;
59     }
60
61     return true;
62 }
63
64 RemoteLayerTreeTransaction::RemoteLayerTreeTransaction()
65 {
66 }
67
68 RemoteLayerTreeTransaction::~RemoteLayerTreeTransaction()
69 {
70 }
71
72 void RemoteLayerTreeTransaction::encode(CoreIPC::ArgumentEncoder& encoder) const
73 {
74     encoder << m_changedLayerProperties;
75 }
76
77 bool RemoteLayerTreeTransaction::decode(CoreIPC::ArgumentDecoder* decoder, RemoteLayerTreeTransaction& result)
78 {
79     if (!decoder->decode(result.m_changedLayerProperties))
80         return false;
81
82     return true;
83 }
84
85 void RemoteLayerTreeTransaction::layerPropertiesChanged(const RemoteGraphicsLayer* graphicsLayer, unsigned changedProperties)
86 {
87     LayerProperties& layerProperties = m_changedLayerProperties.add(graphicsLayer->layerID(), LayerProperties()).iterator->value;
88
89     layerProperties.changedProperties |= changedProperties;
90
91     if (changedProperties & NameChanged)
92         layerProperties.name = graphicsLayer->name();
93 }
94
95 #ifndef NDEBUG
96
97 static void writeIndent(StringBuilder& builder, int indent)
98 {
99     for (int i = 0; i < indent; ++i)
100         builder.append(' ');
101 }
102
103 static void dumpChangedLayers(StringBuilder& builder, const HashMap<uint64_t, RemoteLayerTreeTransaction::LayerProperties>& changedLayerProperties)
104 {
105     if (changedLayerProperties.isEmpty())
106         return;
107
108     writeIndent(builder, 1);
109     builder.append("(changed-layers\n");
110
111     // Dump the layer properties sorted by layer ID.
112     Vector<uint64_t> layerIDs;
113     copyKeysToVector(changedLayerProperties, layerIDs);
114     std::sort(layerIDs.begin(), layerIDs.end());
115
116     for (uint64_t layerID: layerIDs) {
117         const RemoteLayerTreeTransaction::LayerProperties& layerProperties = changedLayerProperties.get(layerID);
118
119         writeIndent(builder, 2);
120         builder.append("(layer ");
121         builder.appendNumber(layerID);
122
123         if (layerProperties.changedProperties & RemoteLayerTreeTransaction::NameChanged) {
124             builder.append('\n');
125             writeIndent(builder, 3);
126             builder.append("(name \"");
127             builder.append(layerProperties.name);
128             builder.append("\")");
129         }
130
131         builder.append(")\n");
132     }
133 }
134
135 void RemoteLayerTreeTransaction::dump() const
136 {
137     StringBuilder builder;
138
139     builder.append("(\n");
140     dumpChangedLayers(builder, m_changedLayerProperties);
141     builder.append(")\n");
142
143     fprintf(stderr, "%s", builder.toString().utf8().data());
144 }
145
146 #endif // NDEBUG
147
148 } // namespace WebKit