OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/dom/CompositorProxy.h" | 5 #include "core/dom/CompositorProxy.h" |
6 | 6 |
7 #include "bindings/core/v8/ExceptionMessages.h" | 7 #include "bindings/core/v8/ExceptionMessages.h" |
8 #include "bindings/core/v8/ExceptionState.h" | 8 #include "bindings/core/v8/ExceptionState.h" |
| 9 #include "core/dom/CompositorProxyClient.h" |
9 #include "core/dom/DOMNodeIds.h" | 10 #include "core/dom/DOMNodeIds.h" |
10 #include "core/dom/ExceptionCode.h" | 11 #include "core/dom/ExceptionCode.h" |
11 #include "core/dom/ExecutionContext.h" | 12 #include "core/dom/ExecutionContext.h" |
| 13 #include "core/workers/WorkerClients.h" |
| 14 #include "core/workers/WorkerGlobalScope.h" |
12 #include "platform/ThreadSafeFunctional.h" | 15 #include "platform/ThreadSafeFunctional.h" |
| 16 #include "platform/TraceEvent.h" |
13 #include "public/platform/Platform.h" | 17 #include "public/platform/Platform.h" |
14 #include "public/platform/WebCompositorMutableProperties.h" | 18 #include "public/platform/WebCompositorMutableProperties.h" |
| 19 #include "public/platform/WebCompositorMutableState.h" |
15 #include "public/platform/WebTraceLocation.h" | 20 #include "public/platform/WebTraceLocation.h" |
16 #include <algorithm> | 21 #include <algorithm> |
17 | 22 |
18 namespace blink { | 23 namespace blink { |
19 | 24 |
20 struct MutablePropertyMapping { | 25 struct MutablePropertyMapping { |
21 const char* name; | 26 const char* name; |
22 unsigned length; | 27 unsigned length; |
23 WebCompositorMutableProperty property; | 28 WebCompositorMutableProperty property; |
24 }; | 29 }; |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 { | 126 { |
122 if (!context->isDocument()) { | 127 if (!context->isDocument()) { |
123 exceptionState.throwTypeError(ExceptionMessages::failedToConstruct("Comp
ositorProxy", "Can only be created from the main context.")); | 128 exceptionState.throwTypeError(ExceptionMessages::failedToConstruct("Comp
ositorProxy", "Can only be created from the main context.")); |
124 exceptionState.throwIfNeeded(); | 129 exceptionState.throwIfNeeded(); |
125 return nullptr; | 130 return nullptr; |
126 } | 131 } |
127 | 132 |
128 return new CompositorProxy(*element, attributeArray); | 133 return new CompositorProxy(*element, attributeArray); |
129 } | 134 } |
130 | 135 |
131 CompositorProxy* CompositorProxy::create(uint64_t elementId, uint32_t compositor
MutableProperties) | 136 CompositorProxy* CompositorProxy::create(ExecutionContext* context, uint64_t ele
mentId, uint32_t compositorMutableProperties) |
132 { | 137 { |
133 return new CompositorProxy(elementId, compositorMutableProperties); | 138 TRACE_EVENT0("compositor-worker", "CompositorProxy::create"); |
| 139 WorkerClients* clients = toWorkerGlobalScope(context)->clients(); |
| 140 ASSERT(clients); |
| 141 CompositorProxyClient* client = CompositorProxyClient::from(clients); |
| 142 return new CompositorProxy(elementId, compositorMutableProperties, client); |
134 } | 143 } |
135 | 144 |
136 CompositorProxy::CompositorProxy(Element& element, const Vector<String>& attribu
teArray) | 145 CompositorProxy::CompositorProxy(Element& element, const Vector<String>& attribu
teArray) |
137 : m_elementId(DOMNodeIds::idForNode(&element)) | 146 : m_elementId(DOMNodeIds::idForNode(&element)) |
138 , m_compositorMutableProperties(compositorMutablePropertiesFromNames(attribu
teArray)) | 147 , m_compositorMutableProperties(compositorMutablePropertiesFromNames(attribu
teArray)) |
| 148 , m_client(nullptr) |
139 { | 149 { |
140 ASSERT(isMainThread()); | 150 ASSERT(isMainThread()); |
141 ASSERT(m_compositorMutableProperties); | 151 ASSERT(m_compositorMutableProperties); |
142 ASSERT(sanityCheckMutableProperties(m_compositorMutableProperties)); | 152 ASSERT(sanityCheckMutableProperties(m_compositorMutableProperties)); |
143 | 153 |
| 154 TRACE_EVENT0("compositor-worker", "CompositorProxy::CompositorProxy (main)")
; |
144 incrementCompositorProxiedPropertiesForElement(m_elementId, m_compositorMuta
bleProperties); | 155 incrementCompositorProxiedPropertiesForElement(m_elementId, m_compositorMuta
bleProperties); |
145 } | 156 } |
146 | 157 |
147 CompositorProxy::CompositorProxy(uint64_t elementId, uint32_t compositorMutableP
roperties) | 158 CompositorProxy::CompositorProxy(uint64_t elementId, uint32_t compositorMutableP
roperties, CompositorProxyClient* client) |
148 : m_elementId(elementId) | 159 : m_elementId(elementId) |
149 , m_compositorMutableProperties(compositorMutableProperties) | 160 , m_compositorMutableProperties(compositorMutableProperties) |
| 161 , m_client(client) |
150 { | 162 { |
151 ASSERT(isControlThread()); | 163 ASSERT(isControlThread()); |
152 ASSERT(sanityCheckMutableProperties(m_compositorMutableProperties)); | 164 ASSERT(sanityCheckMutableProperties(m_compositorMutableProperties)); |
| 165 TRACE_EVENT0("compositor-worker", "CompositorProxy::CompositorProxy (impl)")
; |
153 Platform::current()->mainThread()->taskRunner()->postTask(BLINK_FROM_HERE, t
hreadSafeBind(&incrementCompositorProxiedPropertiesForElement, m_elementId, m_co
mpositorMutableProperties)); | 166 Platform::current()->mainThread()->taskRunner()->postTask(BLINK_FROM_HERE, t
hreadSafeBind(&incrementCompositorProxiedPropertiesForElement, m_elementId, m_co
mpositorMutableProperties)); |
154 } | 167 } |
155 | 168 |
156 CompositorProxy::~CompositorProxy() | 169 CompositorProxy::~CompositorProxy() |
157 { | 170 { |
| 171 TRACE_EVENT0("compositor-worker", "CompositorProxy::~CompositorProxy"); |
158 if (m_connected) | 172 if (m_connected) |
159 disconnect(); | 173 disconnect(); |
160 } | 174 } |
161 | 175 |
162 bool CompositorProxy::supports(const String& attributeName) const | 176 bool CompositorProxy::supports(const String& attributeName) const |
163 { | 177 { |
| 178 TRACE_EVENT0("compositor-worker", "CompositorProxy::supports"); |
164 return !!(m_compositorMutableProperties & static_cast<uint32_t>(compositorMu
tablePropertyForName(attributeName))); | 179 return !!(m_compositorMutableProperties & static_cast<uint32_t>(compositorMu
tablePropertyForName(attributeName))); |
165 } | 180 } |
166 | 181 |
167 double CompositorProxy::opacity(ExceptionState& exceptionState) const | 182 double CompositorProxy::opacity(ExceptionState& exceptionState) const |
168 { | 183 { |
| 184 TRACE_EVENT0("compositor-worker", "CompositorProxy::opacity"); |
169 if (raiseExceptionIfMutationNotAllowed(exceptionState)) | 185 if (raiseExceptionIfMutationNotAllowed(exceptionState)) |
170 return 0.0; | 186 return 0.0; |
171 if (raiseExceptionIfNotMutable(static_cast<uint32_t>(WebCompositorMutablePro
pertyOpacity), exceptionState)) | 187 if (raiseExceptionIfNotMutable(static_cast<uint32_t>(WebCompositorMutablePro
pertyOpacity), exceptionState)) |
172 return 0.0; | 188 return 0.0; |
173 return m_opacity; | 189 if (!m_state.get()) |
| 190 return 0.0; |
| 191 return m_state->opacity(); |
174 } | 192 } |
175 | 193 |
176 double CompositorProxy::scrollLeft(ExceptionState& exceptionState) const | 194 double CompositorProxy::scrollLeft(ExceptionState& exceptionState) const |
177 { | 195 { |
| 196 TRACE_EVENT0("compositor-worker", "CompositorProxy::scrollLeft"); |
178 if (raiseExceptionIfMutationNotAllowed(exceptionState)) | 197 if (raiseExceptionIfMutationNotAllowed(exceptionState)) |
179 return 0.0; | 198 return 0.0; |
180 if (raiseExceptionIfNotMutable(static_cast<uint32_t>(WebCompositorMutablePro
pertyScrollLeft), exceptionState)) | 199 if (raiseExceptionIfNotMutable(static_cast<uint32_t>(WebCompositorMutablePro
pertyScrollLeft), exceptionState)) |
181 return 0.0; | 200 return 0.0; |
182 return m_scrollLeft; | 201 if (!m_state.get()) |
| 202 return 0.0; |
| 203 return m_state->scrollLeft(); |
183 } | 204 } |
184 | 205 |
185 double CompositorProxy::scrollTop(ExceptionState& exceptionState) const | 206 double CompositorProxy::scrollTop(ExceptionState& exceptionState) const |
186 { | 207 { |
| 208 TRACE_EVENT0("compositor-worker", "CompositorProxy::scrollTop"); |
187 if (raiseExceptionIfMutationNotAllowed(exceptionState)) | 209 if (raiseExceptionIfMutationNotAllowed(exceptionState)) |
188 return 0.0; | 210 return 0.0; |
189 if (raiseExceptionIfNotMutable(static_cast<uint32_t>(WebCompositorMutablePro
pertyScrollTop), exceptionState)) | 211 if (raiseExceptionIfNotMutable(static_cast<uint32_t>(WebCompositorMutablePro
pertyScrollTop), exceptionState)) |
190 return 0.0; | 212 return 0.0; |
191 return m_scrollTop; | 213 if (!m_state.get()) |
| 214 return 0.0; |
| 215 return m_state->scrollTop(); |
192 } | 216 } |
193 | 217 |
194 DOMMatrix* CompositorProxy::transform(ExceptionState& exceptionState) const | 218 DOMMatrix* CompositorProxy::transform(ExceptionState& exceptionState) const |
195 { | 219 { |
| 220 TRACE_EVENT0("compositor-worker", "CompositorProxy::transform"); |
196 if (raiseExceptionIfMutationNotAllowed(exceptionState)) | 221 if (raiseExceptionIfMutationNotAllowed(exceptionState)) |
197 return nullptr; | 222 return nullptr; |
198 if (raiseExceptionIfNotMutable(static_cast<uint32_t>(WebCompositorMutablePro
pertyTransform), exceptionState)) | 223 if (raiseExceptionIfNotMutable(static_cast<uint32_t>(WebCompositorMutablePro
pertyTransform), exceptionState)) |
199 return nullptr; | 224 return nullptr; |
200 return m_transform; | 225 if (!m_state.get()) |
| 226 return DOMMatrix::create(); |
| 227 return DOMMatrix::create(m_state->transform()); |
201 } | 228 } |
202 | 229 |
203 void CompositorProxy::setOpacity(double opacity, ExceptionState& exceptionState) | 230 void CompositorProxy::setOpacity(double opacity, ExceptionState& exceptionState) |
204 { | 231 { |
| 232 TRACE_EVENT0("compositor-worker", "CompositorProxy::setOpacity"); |
205 if (raiseExceptionIfMutationNotAllowed(exceptionState)) | 233 if (raiseExceptionIfMutationNotAllowed(exceptionState)) |
206 return; | 234 return; |
207 if (raiseExceptionIfNotMutable(static_cast<uint32_t>(WebCompositorMutablePro
pertyOpacity), exceptionState)) | 235 if (raiseExceptionIfNotMutable(static_cast<uint32_t>(WebCompositorMutablePro
pertyOpacity), exceptionState)) |
208 return; | 236 return; |
209 m_opacity = std::min(1., std::max(0., opacity)); | 237 if (!m_state.get()) |
210 m_mutatedProperties |= static_cast<uint32_t>(WebCompositorMutablePropertyTra
nsform); | 238 return; |
| 239 opacity = std::min(1., std::max(0., opacity)); |
| 240 m_state->setOpacity(opacity); |
211 } | 241 } |
212 | 242 |
213 void CompositorProxy::setScrollLeft(double scrollLeft, ExceptionState& exception
State) | 243 void CompositorProxy::setScrollLeft(double scrollLeft, ExceptionState& exception
State) |
214 { | 244 { |
| 245 TRACE_EVENT0("compositor-worker", "CompositorProxy::setScrollLeft"); |
215 if (raiseExceptionIfMutationNotAllowed(exceptionState)) | 246 if (raiseExceptionIfMutationNotAllowed(exceptionState)) |
216 return; | 247 return; |
217 if (raiseExceptionIfNotMutable(static_cast<uint32_t>(WebCompositorMutablePro
pertyScrollLeft), exceptionState)) | 248 if (raiseExceptionIfNotMutable(static_cast<uint32_t>(WebCompositorMutablePro
pertyScrollLeft), exceptionState)) |
218 return; | 249 return; |
219 m_scrollLeft = scrollLeft; | 250 if (!m_state.get()) |
220 m_mutatedProperties |= static_cast<uint32_t>(WebCompositorMutablePropertyScr
ollLeft); | 251 return; |
| 252 m_state->setScrollLeft(scrollLeft); |
221 } | 253 } |
222 | 254 |
223 void CompositorProxy::setScrollTop(double scrollTop, ExceptionState& exceptionSt
ate) | 255 void CompositorProxy::setScrollTop(double scrollTop, ExceptionState& exceptionSt
ate) |
224 { | 256 { |
| 257 TRACE_EVENT0("compositor-worker", "CompositorProxy::setScrollTop"); |
225 if (raiseExceptionIfMutationNotAllowed(exceptionState)) | 258 if (raiseExceptionIfMutationNotAllowed(exceptionState)) |
226 return; | 259 return; |
227 if (raiseExceptionIfNotMutable(static_cast<uint32_t>(WebCompositorMutablePro
pertyScrollTop), exceptionState)) | 260 if (raiseExceptionIfNotMutable(static_cast<uint32_t>(WebCompositorMutablePro
pertyScrollTop), exceptionState)) |
228 return; | 261 return; |
229 m_scrollTop = scrollTop; | 262 if (!m_state.get()) |
230 m_mutatedProperties |= static_cast<uint32_t>(WebCompositorMutablePropertyScr
ollTop); | 263 return; |
| 264 m_state->setScrollTop(scrollTop); |
231 } | 265 } |
232 | 266 |
233 void CompositorProxy::setTransform(DOMMatrix* transform, ExceptionState& excepti
onState) | 267 void CompositorProxy::setTransform(DOMMatrix* transform, ExceptionState& excepti
onState) |
234 { | 268 { |
| 269 TRACE_EVENT0("compositor-worker", "CompositorProxy::setTransform"); |
235 if (raiseExceptionIfMutationNotAllowed(exceptionState)) | 270 if (raiseExceptionIfMutationNotAllowed(exceptionState)) |
236 return; | 271 return; |
237 if (raiseExceptionIfNotMutable(static_cast<uint32_t>(WebCompositorMutablePro
pertyTransform), exceptionState)) | 272 if (raiseExceptionIfNotMutable(static_cast<uint32_t>(WebCompositorMutablePro
pertyTransform), exceptionState)) |
238 return; | 273 return; |
239 m_transform = transform; | 274 if (!m_state.get()) |
240 m_mutatedProperties |= static_cast<uint32_t>(WebCompositorMutablePropertyTra
nsform); | 275 return; |
| 276 m_state->setTransform(TransformationMatrix::toSkMatrix44(transform->matrix()
)); |
241 } | 277 } |
242 | 278 |
243 bool CompositorProxy::raiseExceptionIfNotMutable(uint32_t property, ExceptionSta
te& exceptionState) const | 279 bool CompositorProxy::raiseExceptionIfNotMutable(uint32_t property, ExceptionSta
te& exceptionState) const |
244 { | 280 { |
245 if (m_connected && (m_compositorMutableProperties & property)) | 281 if (m_connected && (m_compositorMutableProperties & property)) |
246 return false; | 282 return false; |
247 exceptionState.throwDOMException(NoModificationAllowedError, | 283 exceptionState.throwDOMException(NoModificationAllowedError, |
248 m_connected ? "Attempted to mutate non-mutable attribute." : "Attempted
to mutate attribute on a disconnected proxy."); | 284 m_connected ? "Attempted to mutate non-mutable attribute." : "Attempted
to mutate attribute on a disconnected proxy."); |
249 return true; | 285 return true; |
250 } | 286 } |
251 | 287 |
| 288 void CompositorProxy::setNeedsSync() |
| 289 { |
| 290 if (m_needsSync) |
| 291 return; |
| 292 m_needsSync = true; |
| 293 if (m_client) |
| 294 m_client->requestSync(this); |
| 295 } |
| 296 |
252 void CompositorProxy::disconnect() | 297 void CompositorProxy::disconnect() |
253 { | 298 { |
| 299 if (!m_connected) |
| 300 return; |
| 301 TRACE_EVENT0("compositor-worker", "CompositorProxy::disconnect"); |
254 m_connected = false; | 302 m_connected = false; |
255 if (isMainThread()) | 303 if (isMainThread()) { |
256 decrementCompositorProxiedPropertiesForElement(m_elementId, m_compositor
MutableProperties); | 304 decrementCompositorProxiedPropertiesForElement(m_elementId, m_compositor
MutableProperties); |
257 else | 305 } else { |
258 Platform::current()->mainThread()->taskRunner()->postTask(BLINK_FROM_HER
E, threadSafeBind(&decrementCompositorProxiedPropertiesForElement, m_elementId,
m_compositorMutableProperties)); | 306 Platform::current()->mainThread()->taskRunner()->postTask( |
| 307 BLINK_FROM_HERE, threadSafeBind(&decrementCompositorProxiedPropertie
sForElement, m_elementId, m_compositorMutableProperties)); |
| 308 if (m_client) |
| 309 m_client->unregisterCompositorProxy(this); |
| 310 } |
| 311 } |
| 312 |
| 313 void CompositorProxy::takeCompositorMutableState(blink::WebCompositorMutableStat
e* state) |
| 314 { |
| 315 m_state = adoptPtr(state); |
259 } | 316 } |
260 | 317 |
261 } // namespace blink | 318 } // namespace blink |
OLD | NEW |