1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
// Copyright 2015 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 "modules/compositorworker/CompositorWorkerGlobalScope.h"
#include "bindings/core/v8/SerializedScriptValue.h"
#include "core/workers/InProcessWorkerObjectProxy.h"
#include "core/workers/WorkerThreadStartupData.h"
#include "modules/EventTargetModules.h"
#include "modules/compositorworker/CompositorWorkerThread.h"
#include "wtf/AutoReset.h"
#include <memory>
namespace blink {
CompositorWorkerGlobalScope* CompositorWorkerGlobalScope::create(
CompositorWorkerThread* thread,
std::unique_ptr<WorkerThreadStartupData> startupData,
double timeOrigin) {
// Note: startupData is finalized on return. After the relevant parts has been
// passed along to the created 'context'.
CompositorWorkerGlobalScope* context = new CompositorWorkerGlobalScope(
startupData->m_scriptURL, startupData->m_userAgent, thread, timeOrigin,
std::move(startupData->m_starterOriginPrivilegeData),
startupData->m_workerClients);
context->applyContentSecurityPolicyFromVector(
*startupData->m_contentSecurityPolicyHeaders);
if (!startupData->m_referrerPolicy.isNull())
context->parseAndSetReferrerPolicy(startupData->m_referrerPolicy);
context->setAddressSpace(startupData->m_addressSpace);
return context;
}
CompositorWorkerGlobalScope::CompositorWorkerGlobalScope(
const KURL& url,
const String& userAgent,
CompositorWorkerThread* thread,
double timeOrigin,
std::unique_ptr<SecurityOrigin::PrivilegeData> starterOriginPrivilegeData,
WorkerClients* workerClients)
: WorkerGlobalScope(url,
userAgent,
thread,
timeOrigin,
std::move(starterOriginPrivilegeData),
workerClients),
m_executingAnimationFrameCallbacks(false),
m_callbackCollection(this) {
CompositorProxyClient::from(clients())->setGlobalScope(this);
}
CompositorWorkerGlobalScope::~CompositorWorkerGlobalScope() {}
void CompositorWorkerGlobalScope::dispose() {
WorkerGlobalScope::dispose();
CompositorProxyClient::from(clients())->dispose();
}
DEFINE_TRACE(CompositorWorkerGlobalScope) {
visitor->trace(m_callbackCollection);
WorkerGlobalScope::trace(visitor);
}
const AtomicString& CompositorWorkerGlobalScope::interfaceName() const {
return EventTargetNames::CompositorWorkerGlobalScope;
}
void CompositorWorkerGlobalScope::postMessage(
ExecutionContext* executionContext,
PassRefPtr<SerializedScriptValue> message,
const MessagePortArray& ports,
ExceptionState& exceptionState) {
// Disentangle the port in preparation for sending it to the remote context.
std::unique_ptr<MessagePortChannelArray> channels =
MessagePort::disentanglePorts(executionContext, ports, exceptionState);
if (exceptionState.hadException())
return;
workerObjectProxy().postMessageToWorkerObject(std::move(message),
std::move(channels));
}
int CompositorWorkerGlobalScope::requestAnimationFrame(
FrameRequestCallback* callback) {
const bool shouldSignal =
!m_executingAnimationFrameCallbacks && m_callbackCollection.isEmpty();
if (shouldSignal)
CompositorProxyClient::from(clients())->requestAnimationFrame();
return m_callbackCollection.registerCallback(callback);
}
void CompositorWorkerGlobalScope::cancelAnimationFrame(int id) {
m_callbackCollection.cancelCallback(id);
}
bool CompositorWorkerGlobalScope::executeAnimationFrameCallbacks(
double highResTimeMs) {
AutoReset<bool> temporaryChange(&m_executingAnimationFrameCallbacks, true);
m_callbackCollection.executeCallbacks(highResTimeMs, highResTimeMs);
return !m_callbackCollection.isEmpty();
}
InProcessWorkerObjectProxy& CompositorWorkerGlobalScope::workerObjectProxy()
const {
return static_cast<CompositorWorkerThread*>(thread())->workerObjectProxy();
}
} // namespace blink
|