virtual void performTask(ExecutionContext* scriptContext) { ASSERT_WITH_SECURITY_IMPLICATION(scriptContext->isWorkerGlobalScope()); DedicatedWorkerGlobalScope* context = static_cast<DedicatedWorkerGlobalScope*>(scriptContext); OwnPtrWillBeRawPtr<MessagePortArray> ports = MessagePort::entanglePorts(*scriptContext, m_channels.release()); context->dispatchEvent(MessageEvent::create(ports.release(), m_message)); context->thread()->workerObjectProxy().confirmMessageFromWorkerObject(context->hasPendingActivity()); }
virtual void performTask(ScriptExecutionContext* scriptContext) { ASSERT_WITH_SECURITY_IMPLICATION(scriptContext->isWorkerGlobalScope()); DedicatedWorkerGlobalScope* context = static_cast<DedicatedWorkerGlobalScope*>(scriptContext); std::unique_ptr<MessagePortArray> ports = MessagePort::entanglePorts(*scriptContext, std::move(m_channels)); context->dispatchEvent(MessageEvent::create(std::move(ports), m_message)); context->thread().workerObjectProxy().confirmMessageFromWorkerObject(context->hasPendingActivity()); }
void WorkerMessagingProxy::postMessageToWorkerGlobalScope(PassRefPtr<SerializedScriptValue> message, std::unique_ptr<MessagePortChannelArray> channels) { if (m_askedToTerminate) return; MessagePortChannelArray* channelsPtr = channels.release(); ScriptExecutionContext::Task task([=] (ScriptExecutionContext* scriptContext) { ASSERT_WITH_SECURITY_IMPLICATION(scriptContext->isWorkerGlobalScope()); DedicatedWorkerGlobalScope* context = static_cast<DedicatedWorkerGlobalScope*>(scriptContext); std::unique_ptr<MessagePortArray> ports = MessagePort::entanglePorts(*scriptContext, std::unique_ptr<MessagePortChannelArray>(channelsPtr)); context->dispatchEvent(MessageEvent::create(std::move(ports), message)); context->thread().workerObjectProxy().confirmMessageFromWorkerObject(context->hasPendingActivity()); }); if (m_workerThread) { ++m_unconfirmedMessageCount; m_workerThread->runLoop().postTask(std::move(task)); } else m_queuedEarlyTasks.append(std::make_unique<ScriptExecutionContext::Task>(std::move(task))); }
DedicatedWorkerGlobalScope* DedicatedWorkerGlobalScope::create( DedicatedWorkerThread* 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'. DedicatedWorkerGlobalScope* context = new DedicatedWorkerGlobalScope( startupData->m_scriptURL, startupData->m_userAgent, thread, timeOrigin, std::move(startupData->m_starterOriginPrivilegeData), startupData->m_workerClients); context->applyContentSecurityPolicyFromVector( *startupData->m_contentSecurityPolicyHeaders); context->setWorkerSettings(std::move(startupData->m_workerSettings)); if (!startupData->m_referrerPolicy.isNull()) context->parseAndSetReferrerPolicy(startupData->m_referrerPolicy); context->setAddressSpace(startupData->m_addressSpace); OriginTrialContext::addTokens(context, startupData->m_originTrialTokens.get()); return context; }