Index: third_party/WebKit/Source/web/CompositorMutatorImpl.cpp |
diff --git a/third_party/WebKit/Source/web/CompositorMutatorImpl.cpp b/third_party/WebKit/Source/web/CompositorMutatorImpl.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e3c52ac299d794b93f11c6551117d36cf6f7d111 |
--- /dev/null |
+++ b/third_party/WebKit/Source/web/CompositorMutatorImpl.cpp |
@@ -0,0 +1,87 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "web/CompositorMutatorImpl.h" |
+ |
+#include "core/animation/CustomCompositorAnimationManager.h" |
+#include "core/dom/CompositorProxy.h" |
+#include "platform/ThreadSafeFunctional.h" |
+#include "platform/TraceEvent.h" |
+#include "platform/WaitableEvent.h" |
+#include "platform/graphics/CompositorMutationsTarget.h" |
+#include "platform/graphics/CompositorMutatorClient.h" |
+#include "platform/heap/Handle.h" |
+#include "public/platform/Platform.h" |
+#include "web/CompositorProxyClientImpl.h" |
+ |
+namespace blink { |
+ |
+namespace { |
+ |
+void createCompositorMutatorClient(std::unique_ptr<CompositorMutatorClient>* ptr, WaitableEvent* doneEvent) |
+{ |
+ CompositorMutatorImpl* mutator = CompositorMutatorImpl::create(); |
+ ptr->reset(new CompositorMutatorClient(mutator, mutator->animationManager())); |
+ mutator->setClient(ptr->get()); |
+ doneEvent->signal(); |
+} |
+ |
+} // namespace |
+ |
+CompositorMutatorImpl::CompositorMutatorImpl() |
+ : m_animationManager(adoptPtr(new CustomCompositorAnimationManager)) |
+ , m_client(nullptr) |
+{ |
+} |
+ |
+std::unique_ptr<CompositorMutatorClient> CompositorMutatorImpl::createClient() |
+{ |
+ std::unique_ptr<CompositorMutatorClient> mutatorClient; |
+ WaitableEvent doneEvent; |
+ if (WebThread* compositorThread = Platform::current()->compositorThread()) { |
+ compositorThread->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&createCompositorMutatorClient, AllowCrossThreadAccess(&mutatorClient), AllowCrossThreadAccess(&doneEvent))); |
+ } else { |
+ createCompositorMutatorClient(&mutatorClient, &doneEvent); |
+ } |
+ // TODO(flackr): Instead of waiting for this event, we may be able to just set the |
+ // mutator on the CompositorProxyClient directly from the compositor thread before |
+ // it gets used there. We still need to make sure we only create one mutator though. |
+ doneEvent.wait(); |
+ return mutatorClient; |
+} |
+ |
+CompositorMutatorImpl* CompositorMutatorImpl::create() |
+{ |
+ return new CompositorMutatorImpl(); |
+} |
+ |
+bool CompositorMutatorImpl::mutate(double monotonicTimeNow) |
+{ |
+ TRACE_EVENT0("compositor-worker", "CompositorMutatorImpl::mutate"); |
+ bool needToReinvoke = false; |
+ // TODO(vollick): we should avoid executing the animation frame |
+ // callbacks if none of the proxies in the global scope are affected by |
+ // m_mutations. |
+ for (CompositorProxyClientImpl* client : m_proxyClients) { |
+ if (client->mutate(monotonicTimeNow)) |
+ needToReinvoke = true; |
+ } |
+ |
+ return needToReinvoke; |
+} |
+ |
+void CompositorMutatorImpl::registerProxyClient(CompositorProxyClientImpl* client) |
+{ |
+ TRACE_EVENT0("compositor-worker", "CompositorMutatorImpl::registerClient"); |
+ m_proxyClients.add(client); |
+ setNeedsMutate(); |
+} |
+ |
+void CompositorMutatorImpl::setNeedsMutate() |
+{ |
+ TRACE_EVENT0("compositor-worker", "CompositorMutatorImpl::setNeedsMutate"); |
+ m_client->setNeedsMutate(); |
+} |
+ |
+} // namespace blink |