Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(149)

Unified Diff: third_party/WebKit/Source/core/dom/CompositorProxy.cpp

Issue 1900423004: [compositorworker] Register compositor proxies with proxy client (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update comment Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..a40403acfab8e3435b1627555e3326a3c7135a34 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,57 @@ 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();
+ // We do not explicitly unregister from client here. The client has a weak
+ // reference to us which gets collected on its own. This way we avoid using
+ // a pre-finalizer.
+ disconnectInternal();
+ DCHECK(!m_connected);
}
bool CompositorProxy::supports(const String& attributeName) const
@@ -239,11 +259,21 @@ bool CompositorProxy::raiseExceptionIfNotMutable(uint32_t property, ExceptionSta
void CompositorProxy::disconnect()
{
+ disconnectInternal();
+ if (m_client)
+ m_client->unregisterCompositorProxy(this);
+}
+
+void CompositorProxy::disconnectInternal()
+{
+ 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
« no previous file with comments | « third_party/WebKit/Source/core/dom/CompositorProxy.h ('k') | third_party/WebKit/Source/core/dom/CompositorProxyClient.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698