WorkerGlobalScopeProxy* WorkerGlobalScopeProxyProviderImpl::createWorkerGlobalScopeProxy(Worker* worker) { if (worker->executionContext()->isDocument()) { Document* document = toDocument(worker->executionContext()); WebLocalFrameImpl* webFrame = WebLocalFrameImpl::fromFrame(document->frame()); OwnPtrWillBeRawPtr<WorkerClients> workerClients = WorkerClients::create(); provideLocalFileSystemToWorker(workerClients.get(), LocalFileSystemClient::create()); provideContentSettingsClientToWorker(workerClients.get(), adoptPtr(webFrame->client()->createWorkerContentSettingsClientProxy(webFrame))); // FIXME: call provideServiceWorkerContainerClientToWorker here when we // support ServiceWorker in dedicated workers (http://crbug.com/371690) return new DedicatedWorkerMessagingProxy(worker, workerClients.release()); } ASSERT_NOT_REACHED(); return 0; }
void WebSharedWorkerImpl::onScriptLoaderFinished() { ASSERT(m_loadingDocument); ASSERT(m_mainScriptLoader); if (m_askedToTerminate) return; if (m_mainScriptLoader->failed()) { m_mainScriptLoader->cancel(); m_client->workerScriptLoadFailed(); // The SharedWorker was unable to load the initial script, so // shut it down right here. delete this; return; } Document* document = m_mainFrame->frame()->document(); WorkerThreadStartMode startMode = DontPauseWorkerGlobalScopeOnStart; if (InspectorInstrumentation::shouldPauseDedicatedWorkerOnStart(document)) startMode = PauseWorkerGlobalScopeOnStart; // FIXME: this document's origin is pristine and without any extra privileges. (crbug.com/254993) SecurityOrigin* starterOrigin = document->securityOrigin(); OwnPtrWillBeRawPtr<WorkerClients> workerClients = WorkerClients::create(); provideLocalFileSystemToWorker(workerClients.get(), LocalFileSystemClient::create()); WebSecurityOrigin webSecurityOrigin(m_loadingDocument->securityOrigin()); provideContentSettingsClientToWorker(workerClients.get(), adoptPtr(m_client->createWorkerContentSettingsClientProxy(webSecurityOrigin))); RefPtrWillBeRawPtr<ContentSecurityPolicy> contentSecurityPolicy = m_mainScriptLoader->releaseContentSecurityPolicy(); OwnPtr<WorkerThreadStartupData> startupData = WorkerThreadStartupData::create( m_url, m_loadingDocument->userAgent(), m_mainScriptLoader->script(), nullptr, startMode, contentSecurityPolicy ? contentSecurityPolicy->headers() : nullptr, starterOrigin, workerClients.release()); m_loaderProxy = WorkerLoaderProxy::create(this); setWorkerThread(SharedWorkerThread::create(m_name, m_loaderProxy, *this)); InspectorInstrumentation::scriptImported(m_loadingDocument.get(), m_mainScriptLoader->identifier(), m_mainScriptLoader->script()); m_mainScriptLoader.clear(); workerThread()->start(startupData.release()); m_workerInspectorProxy->workerThreadCreated(m_loadingDocument.get(), workerThread(), m_url); m_client->workerScriptLoaded(); }
InProcessWorkerMessagingProxy* DedicatedWorkerMessagingProxyProviderImpl::createWorkerMessagingProxy( Worker* worker) { if (worker->getExecutionContext()->isDocument()) { Document* document = toDocument(worker->getExecutionContext()); WebLocalFrameImpl* webFrame = WebLocalFrameImpl::fromFrame(document->frame()); WorkerClients* workerClients = WorkerClients::create(); provideIndexedDBClientToWorker(workerClients, IndexedDBClientImpl::create()); provideLocalFileSystemToWorker(workerClients, LocalFileSystemClient::create()); provideContentSettingsClientToWorker( workerClients, wrapUnique( webFrame->client()->createWorkerContentSettingsClientProxy())); // FIXME: call provideServiceWorkerContainerClientToWorker here when we // support ServiceWorker in dedicated workers (http://crbug.com/371690) return new DedicatedWorkerMessagingProxy(worker, workerClients); } NOTREACHED(); return 0; }
void WebSharedWorkerImpl::onScriptLoaderFinished() { DCHECK(m_loadingDocument); DCHECK(m_mainScriptLoader); if (m_askedToTerminate) return; if (m_mainScriptLoader->failed()) { m_mainScriptLoader->cancel(); m_client->workerScriptLoadFailed(); // The SharedWorker was unable to load the initial script, so // shut it down right here. delete this; return; } Document* document = m_mainFrame->frame()->document(); // FIXME: this document's origin is pristine and without any extra privileges. // (crbug.com/254993) SecurityOrigin* starterOrigin = document->getSecurityOrigin(); WorkerClients* workerClients = WorkerClients::create(); provideLocalFileSystemToWorker(workerClients, LocalFileSystemClient::create()); WebSecurityOrigin webSecurityOrigin(m_loadingDocument->getSecurityOrigin()); provideContentSettingsClientToWorker( workerClients, wrapUnique( m_client->createWorkerContentSettingsClientProxy(webSecurityOrigin))); provideIndexedDBClientToWorker(workerClients, IndexedDBClientImpl::create()); ContentSecurityPolicy* contentSecurityPolicy = m_mainScriptLoader->releaseContentSecurityPolicy(); WorkerThreadStartMode startMode = m_workerInspectorProxy->workerStartMode(document); std::unique_ptr<WorkerSettings> workerSettings = wrapUnique(new WorkerSettings(document->settings())); std::unique_ptr<WorkerThreadStartupData> startupData = WorkerThreadStartupData::create( m_url, m_loadingDocument->userAgent(), m_mainScriptLoader->script(), nullptr, startMode, contentSecurityPolicy ? contentSecurityPolicy->headers().get() : nullptr, m_mainScriptLoader->referrerPolicy(), starterOrigin, workerClients, m_mainScriptLoader->responseAddressSpace(), m_mainScriptLoader->originTrialTokens(), std::move(workerSettings)); // We have a dummy document here for loading but it doesn't really represent // the document/frame of associated document(s) for this worker. Here we // populate the task runners with null document not to confuse the frame // scheduler (which will end up using the thread's default task runner). m_mainThreadTaskRunners = ParentFrameTaskRunners::create(nullptr); m_loaderProxy = WorkerLoaderProxy::create(this); m_workerThread = SharedWorkerThread::create(m_name, m_loaderProxy, *this); InspectorInstrumentation::scriptImported(m_loadingDocument.get(), m_mainScriptLoader->identifier(), m_mainScriptLoader->script()); m_mainScriptLoader.clear(); workerThread()->start(std::move(startupData)); m_workerInspectorProxy->workerThreadCreated( toDocument(m_loadingDocument.get()), workerThread(), m_url); m_client->workerScriptLoaded(); }