Index: third_party/WebKit/Source/modules/compositorworker/CompositorWorkerGlobalScope.cpp |
diff --git a/third_party/WebKit/Source/modules/compositorworker/CompositorWorkerGlobalScope.cpp b/third_party/WebKit/Source/modules/compositorworker/CompositorWorkerGlobalScope.cpp |
index aa495efd7e60256c7eac965fc58fd83a8012af16..79db3c65a4b084cda910d5eff675512aaa6c0aaa 100644 |
--- a/third_party/WebKit/Source/modules/compositorworker/CompositorWorkerGlobalScope.cpp |
+++ b/third_party/WebKit/Source/modules/compositorworker/CompositorWorkerGlobalScope.cpp |
@@ -9,11 +9,15 @@ |
#include "core/workers/WorkerThreadStartupData.h" |
#include "modules/EventTargetModules.h" |
#include "modules/compositorworker/CompositorWorkerThread.h" |
+#include "platform/TraceEvent.h" |
+#include "wtf/TemporaryChange.h" |
+#include "wtf/ThreadingPrimitives.h" |
namespace blink { |
PassRefPtrWillBeRawPtr<CompositorWorkerGlobalScope> CompositorWorkerGlobalScope::create(CompositorWorkerThread* thread, PassOwnPtr<WorkerThreadStartupData> startupData, double timeOrigin) |
{ |
+ TRACE_EVENT0("compositor-worker", "CompositorWorkerGlobalScope::create"); |
// Note: startupData is finalized on return. After the relevant parts has been |
// passed along to the created 'context'. |
RefPtrWillBeRawPtr<CompositorWorkerGlobalScope> context = adoptRefWillBeNoop(new CompositorWorkerGlobalScope(startupData->m_scriptURL, startupData->m_userAgent, thread, timeOrigin, startupData->m_starterOriginPrivilegeData.release(), startupData->m_workerClients.release())); |
@@ -23,12 +27,16 @@ PassRefPtrWillBeRawPtr<CompositorWorkerGlobalScope> CompositorWorkerGlobalScope: |
CompositorWorkerGlobalScope::CompositorWorkerGlobalScope(const KURL& url, const String& userAgent, CompositorWorkerThread* thread, double timeOrigin, PassOwnPtr<SecurityOrigin::PrivilegeData> starterOriginPrivilegeData, PassOwnPtrWillBeRawPtr<WorkerClients> workerClients) |
: WorkerGlobalScope(url, userAgent, thread, timeOrigin, starterOriginPrivilegeData, workerClients) |
+ , m_executingAnimationFrameCallbacks(false) |
, m_callbackCollection(this) |
+ , m_client(CompositorProxyClient::from(clients())) |
{ |
+ m_client->setGlobalScope(this); |
} |
CompositorWorkerGlobalScope::~CompositorWorkerGlobalScope() |
{ |
+ TRACE_EVENT0("compositor-worker", "CompositorWorkerGlobalScope::~CompositorWorkerGlobalScope"); |
} |
DEFINE_TRACE(CompositorWorkerGlobalScope) |
@@ -44,6 +52,8 @@ const AtomicString& CompositorWorkerGlobalScope::interfaceName() const |
void CompositorWorkerGlobalScope::postMessage(ExecutionContext* executionContext, PassRefPtr<SerializedScriptValue> message, const MessagePortArray* ports, ExceptionState& exceptionState) |
{ |
+ TRACE_EVENT0("compositor-worker", "CompositorWorkerGlobalScope::postMessage"); |
+ |
// Disentangle the port in preparation for sending it to the remote context. |
OwnPtr<MessagePortChannelArray> channels = MessagePort::disentanglePorts(executionContext, ports, exceptionState); |
if (exceptionState.hadException()) |
@@ -53,21 +63,30 @@ void CompositorWorkerGlobalScope::postMessage(ExecutionContext* executionContext |
int CompositorWorkerGlobalScope::requestAnimationFrame(FrameRequestCallback* callback) |
{ |
+ TRACE_EVENT0("compositor-worker", "CompositorWorkerGlobalScope::requestAnimationFrame"); |
+ const bool shouldSignal = !m_executingAnimationFrameCallbacks && m_callbackCollection.isEmpty(); |
+ if (shouldSignal) |
+ m_client->requestMutation(); |
return m_callbackCollection.registerCallback(callback); |
} |
void CompositorWorkerGlobalScope::cancelAnimationFrame(int id) |
{ |
+ TRACE_EVENT0("compositor-worker", "CompositorWorkerGlobalScope::cancelAnimationFrame"); |
m_callbackCollection.cancelCallback(id); |
} |
-void CompositorWorkerGlobalScope::executeAnimationFrameCallbacks(double highResTimeNow) |
+bool CompositorWorkerGlobalScope::executeAnimationFrameCallbacks(double highResTimeNow) |
{ |
+ TRACE_EVENT0("compositor-worker", "CompositorWorkerGlobalScope::executeAnimationFrameCallbacks"); |
+ TemporaryChange<bool> temporaryChange(m_executingAnimationFrameCallbacks, true); |
m_callbackCollection.executeCallbacks(highResTimeNow, highResTimeNow); |
+ return !m_callbackCollection.isEmpty(); |
} |
CompositorWorkerThread* CompositorWorkerGlobalScope::thread() const |
{ |
+ TRACE_EVENT0("compositor-worker", "CompositorWorkerGlobalScope::thread"); |
return static_cast<CompositorWorkerThread*>(WorkerGlobalScope::thread()); |
} |