Index: third_party/WebKit/Source/core/dom/CompositorProxy.cpp |
diff --git a/third_party/WebKit/Source/core/dom/CompositorProxy.cpp b/third_party/WebKit/Source/core/dom/CompositorProxy.cpp |
index fd5ae040a01d31bbdd2c5275fa63c9f58ea9ad29..e9ff44e3e16cc3dbd239043b1d9939206cfc70ff 100644 |
--- a/third_party/WebKit/Source/core/dom/CompositorProxy.cpp |
+++ b/third_party/WebKit/Source/core/dom/CompositorProxy.cpp |
@@ -9,6 +9,8 @@ |
#include "core/dom/DOMNodeIds.h" |
#include "core/dom/ExceptionCode.h" |
#include "core/dom/ExecutionContext.h" |
+#include "core/workers/WorkerClients.h" |
+#include "core/workers/WorkerGlobalScope.h" |
#include "platform/ThreadSafeFunctional.h" |
#include "platform/graphics/CompositorMutableProperties.h" |
#include "public/platform/Platform.h" |
@@ -112,39 +114,54 @@ CompositorProxy* CompositorProxy::create(ExecutionContext* context, Element* ele |
return new CompositorProxy(*element, attributeArray); |
} |
-CompositorProxy* CompositorProxy::create(uint64_t elementId, uint32_t compositorMutableProperties) |
+CompositorProxy* CompositorProxy::create(ExecutionContext* context, uint64_t elementId, uint32_t compositorMutableProperties) |
{ |
+ if (context->isCompositorWorkerGlobalScope()) { |
+ WorkerClients* clients = toWorkerGlobalScope(context)->clients(); |
+ DCHECK(clients); |
+ CompositorProxyClient* client = CompositorProxyClient::from(clients); |
+ return new CompositorProxy(elementId, compositorMutableProperties, client); |
+ } |
+ |
return new CompositorProxy(elementId, compositorMutableProperties); |
} |
-CompositorProxy::CompositorProxy(Element& element, const Vector<String>& attributeArray) |
- : m_elementId(DOMNodeIds::idForNode(&element)) |
- , m_compositorMutableProperties(compositorMutablePropertiesFromNames(attributeArray)) |
+CompositorProxy::CompositorProxy(uint64_t elementId, uint32_t compositorMutableProperties) |
+ : m_elementId(elementId) |
+ , m_compositorMutableProperties(compositorMutableProperties) |
+ , m_client(nullptr) |
{ |
- DCHECK(isMainThread()); |
DCHECK(m_compositorMutableProperties); |
#if DCHECK_IS_ON() |
DCHECK(sanityCheckMutableProperties(m_compositorMutableProperties)); |
#endif |
- incrementCompositorProxiedPropertiesForElement(m_elementId, m_compositorMutableProperties); |
+ if (isMainThread()) { |
+ incrementCompositorProxiedPropertiesForElement(m_elementId, m_compositorMutableProperties); |
+ } else { |
+ Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&incrementCompositorProxiedPropertiesForElement, m_elementId, m_compositorMutableProperties)); |
+ } |
} |
-CompositorProxy::CompositorProxy(uint64_t elementId, uint32_t compositorMutableProperties) |
- : m_elementId(elementId) |
- , m_compositorMutableProperties(compositorMutableProperties) |
+CompositorProxy::CompositorProxy(Element& element, const Vector<String>& attributeArray) |
+ : CompositorProxy(DOMNodeIds::idForNode(&element), compositorMutablePropertiesFromNames(attributeArray)) |
+{ |
+ DCHECK(isMainThread()); |
+} |
+ |
+CompositorProxy::CompositorProxy(uint64_t elementId, uint32_t compositorMutableProperties, CompositorProxyClient* client) |
+ : CompositorProxy(elementId, compositorMutableProperties) |
{ |
+ m_client = client; |
+ DCHECK(m_client); |
DCHECK(isControlThread()); |
-#if DCHECK_IS_ON() |
- DCHECK(sanityCheckMutableProperties(m_compositorMutableProperties)); |
-#endif |
- Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&incrementCompositorProxiedPropertiesForElement, m_elementId, m_compositorMutableProperties)); |
+ m_client->registerCompositorProxy(this); |
} |
CompositorProxy::~CompositorProxy() |
{ |
- if (m_connected) |
- disconnect(); |
+ disconnect(); |
+ DCHECK(!m_connected); |
} |
bool CompositorProxy::supports(const String& attributeName) const |
@@ -239,11 +256,14 @@ bool CompositorProxy::raiseExceptionIfNotMutable(uint32_t property, ExceptionSta |
void CompositorProxy::disconnect() |
{ |
+ if (!m_connected) |
+ return; |
m_connected = false; |
- if (isMainThread()) |
+ if (isMainThread()) { |
decrementCompositorProxiedPropertiesForElement(m_elementId, m_compositorMutableProperties); |
- else |
+ } else { |
Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&decrementCompositorProxiedPropertiesForElement, m_elementId, m_compositorMutableProperties)); |
+ } |
} |
} // namespace blink |