Index: third_party/WebKit/Source/core/workers/InProcessWorkerMessagingProxy.cpp |
diff --git a/third_party/WebKit/Source/core/workers/InProcessWorkerMessagingProxy.cpp b/third_party/WebKit/Source/core/workers/InProcessWorkerMessagingProxy.cpp |
index 64a3f0a70813baf6d806b86fae5716d381510d95..37543c733c86115a34ac4fc4a989c3d9b576ddd8 100644 |
--- a/third_party/WebKit/Source/core/workers/InProcessWorkerMessagingProxy.cpp |
+++ b/third_party/WebKit/Source/core/workers/InProcessWorkerMessagingProxy.cpp |
@@ -45,6 +45,7 @@ |
#include "core/workers/WorkerClients.h" |
#include "core/workers/WorkerInspectorProxy.h" |
#include "core/workers/WorkerThreadStartupData.h" |
+#include "wtf/WTF.h" |
namespace blink { |
@@ -77,29 +78,28 @@ InProcessWorkerMessagingProxy::InProcessWorkerMessagingProxy(InProcessWorkerBase |
, m_workerInspectorProxy(WorkerInspectorProxy::create()) |
, m_workerClients(workerClients) |
{ |
+ DCHECK(isParentContextThread()); |
DCHECK(m_workerObject); |
- DCHECK((m_executionContext->isDocument() && isMainThread()) |
- || (m_executionContext->isWorkerGlobalScope() && toWorkerGlobalScope(m_executionContext.get())->thread()->isCurrentThread())); |
} |
InProcessWorkerMessagingProxy::~InProcessWorkerMessagingProxy() |
{ |
+ DCHECK(isParentContextThread()); |
DCHECK(!m_workerObject); |
- DCHECK((m_executionContext->isDocument() && isMainThread()) |
- || (m_executionContext->isWorkerGlobalScope() && toWorkerGlobalScope(m_executionContext.get())->thread()->isCurrentThread())); |
if (m_loaderProxy) |
m_loaderProxy->detachProvider(this); |
} |
void InProcessWorkerMessagingProxy::startWorkerGlobalScope(const KURL& scriptURL, const String& userAgent, const String& sourceCode) |
{ |
- // FIXME: This need to be revisited when we support nested worker one day |
- DCHECK(m_executionContext->isDocument()); |
+ DCHECK(isParentContextThread()); |
if (m_askedToTerminate) { |
- // Worker.terminate() could be called from JS before the thread was created. |
+ // Worker.terminate() could be called from JS before the thread was |
+ // created. |
return; |
} |
- Document* document = toDocument(m_executionContext.get()); |
+ |
+ Document* document = toDocument(getExecutionContext()); |
SecurityOrigin* starterOrigin = document->getSecurityOrigin(); |
ContentSecurityPolicy* csp = m_workerObject->contentSecurityPolicy() ? m_workerObject->contentSecurityPolicy() : document->contentSecurityPolicy(); |
@@ -118,15 +118,17 @@ void InProcessWorkerMessagingProxy::startWorkerGlobalScope(const KURL& scriptURL |
void InProcessWorkerMessagingProxy::postMessageToWorkerObject(PassRefPtr<SerializedScriptValue> message, PassOwnPtr<MessagePortChannelArray> channels) |
{ |
+ DCHECK(isParentContextThread()); |
if (!m_workerObject || m_askedToTerminate) |
return; |
- MessagePortArray* ports = MessagePort::entanglePorts(*m_executionContext.get(), std::move(channels)); |
+ MessagePortArray* ports = MessagePort::entanglePorts(*getExecutionContext(), std::move(channels)); |
m_workerObject->dispatchEvent(MessageEvent::create(ports, message)); |
} |
void InProcessWorkerMessagingProxy::postMessageToWorkerGlobalScope(PassRefPtr<SerializedScriptValue> message, PassOwnPtr<MessagePortChannelArray> channels) |
{ |
+ DCHECK(isParentContextThread()); |
if (m_askedToTerminate) |
return; |
@@ -151,18 +153,21 @@ bool InProcessWorkerMessagingProxy::postTaskToWorkerGlobalScope(PassOwnPtr<Execu |
void InProcessWorkerMessagingProxy::postTaskToLoader(PassOwnPtr<ExecutionContextTask> task) |
{ |
- // FIXME: In case of nested workers, this should go directly to the root Document context. |
- DCHECK(m_executionContext->isDocument()); |
- m_executionContext->postTask(BLINK_FROM_HERE, std::move(task)); |
+ DCHECK(getExecutionContext()->isDocument()); |
+ getExecutionContext()->postTask(BLINK_FROM_HERE, std::move(task)); |
} |
void InProcessWorkerMessagingProxy::reportException(const String& errorMessage, int lineNumber, int columnNumber, const String& sourceURL, int exceptionId) |
{ |
+ DCHECK(isParentContextThread()); |
if (!m_workerObject) |
return; |
- // We don't bother checking the askedToTerminate() flag here, because exceptions should *always* be reported even if the thread is terminated. |
- // This is intentionally different than the behavior in MessageWorkerTask, because terminated workers no longer deliver messages (section 4.6 of the WebWorker spec), but they do report exceptions. |
+ // We don't bother checking the askedToTerminate() flag here, because |
+ // exceptions should *always* be reported even if the thread is terminated. |
+ // This is intentionally different than the behavior in MessageWorkerTask, |
+ // because terminated workers no longer deliver messages (section 4.6 of the |
+ // WebWorker spec), but they do report exceptions. |
ErrorEvent* event = ErrorEvent::create(errorMessage, sourceURL, lineNumber, columnNumber, nullptr); |
DispatchEventResult dispatchResult = m_workerObject->dispatchEvent(event); |
@@ -171,11 +176,11 @@ void InProcessWorkerMessagingProxy::reportException(const String& errorMessage, |
void InProcessWorkerMessagingProxy::reportConsoleMessage(MessageSource source, MessageLevel level, const String& message, int lineNumber, const String& sourceURL) |
{ |
+ DCHECK(isParentContextThread()); |
if (m_askedToTerminate) |
return; |
- // FIXME: In case of nested workers, this should go directly to the root Document context. |
- DCHECK(m_executionContext->isDocument()); |
- Document* document = toDocument(m_executionContext.get()); |
+ |
+ Document* document = toDocument(getExecutionContext()); |
LocalFrame* frame = document->frame(); |
if (!frame) |
return; |
@@ -187,12 +192,15 @@ void InProcessWorkerMessagingProxy::reportConsoleMessage(MessageSource source, M |
void InProcessWorkerMessagingProxy::workerThreadCreated() |
{ |
+ DCHECK(isParentContextThread()); |
DCHECK(!m_askedToTerminate); |
DCHECK(m_workerThread); |
DCHECK(!m_unconfirmedMessageCount); |
m_unconfirmedMessageCount = m_queuedEarlyTasks.size(); |
- m_workerThreadHadPendingActivity = true; // Worker initialization means a pending activity. |
+ |
+ // Worker initialization means a pending activity. |
+ m_workerThreadHadPendingActivity = true; |
for (auto& earlyTasks : m_queuedEarlyTasks) |
m_workerThread->postTask(BLINK_FROM_HERE, earlyTasks.release()); |
@@ -201,16 +209,19 @@ void InProcessWorkerMessagingProxy::workerThreadCreated() |
void InProcessWorkerMessagingProxy::workerObjectDestroyed() |
{ |
+ DCHECK(isParentContextThread()); |
+ |
// workerObjectDestroyed() is called in InProcessWorkerBase's destructor. |
- // Thus it should be guaranteed that a weak pointer m_workerObject has been cleared |
- // before this method gets called. |
+ // Thus it should be guaranteed that a weak pointer m_workerObject has been |
+ // cleared before this method gets called. |
DCHECK(!m_workerObject); |
- m_executionContext->postTask(BLINK_FROM_HERE, createCrossThreadTask(&InProcessWorkerMessagingProxy::workerObjectDestroyedInternal, this)); |
+ getExecutionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&InProcessWorkerMessagingProxy::workerObjectDestroyedInternal, this)); |
} |
void InProcessWorkerMessagingProxy::workerObjectDestroyedInternal() |
{ |
+ DCHECK(isParentContextThread()); |
m_mayBeDestroyed = true; |
if (m_workerThread) |
terminateWorkerGlobalScope(); |
@@ -220,8 +231,11 @@ void InProcessWorkerMessagingProxy::workerObjectDestroyedInternal() |
void InProcessWorkerMessagingProxy::workerThreadTerminated() |
{ |
- // This method is always the last to be performed, so the proxy is not needed for communication |
- // in either side any more. However, the Worker object may still exist, and it assumes that the proxy exists, too. |
+ DCHECK(isParentContextThread()); |
+ |
+ // This method is always the last to be performed, so the proxy is not |
+ // needed for communication in either side any more. However, the Worker |
+ // object may still exist, and it assumes that the proxy exists, too. |
m_askedToTerminate = true; |
m_workerThread = nullptr; |
terminateInternally(); |
@@ -231,6 +245,7 @@ void InProcessWorkerMessagingProxy::workerThreadTerminated() |
void InProcessWorkerMessagingProxy::terminateWorkerGlobalScope() |
{ |
+ DCHECK(isParentContextThread()); |
if (m_askedToTerminate) |
return; |
m_askedToTerminate = true; |
@@ -243,18 +258,21 @@ void InProcessWorkerMessagingProxy::terminateWorkerGlobalScope() |
void InProcessWorkerMessagingProxy::postMessageToPageInspector(const String& message) |
{ |
+ DCHECK(isParentContextThread()); |
if (m_workerInspectorProxy) |
m_workerInspectorProxy->dispatchMessageFromWorker(message); |
} |
void InProcessWorkerMessagingProxy::postWorkerConsoleAgentEnabled() |
{ |
+ DCHECK(isParentContextThread()); |
if (m_workerInspectorProxy) |
m_workerInspectorProxy->workerConsoleAgentEnabled(); |
} |
void InProcessWorkerMessagingProxy::confirmMessageFromWorkerObject(bool hasPendingActivity) |
{ |
+ DCHECK(isParentContextThread()); |
if (!m_askedToTerminate) { |
DCHECK(m_unconfirmedMessageCount); |
--m_unconfirmedMessageCount; |
@@ -264,24 +282,33 @@ void InProcessWorkerMessagingProxy::confirmMessageFromWorkerObject(bool hasPendi |
void InProcessWorkerMessagingProxy::reportPendingActivity(bool hasPendingActivity) |
{ |
+ DCHECK(isParentContextThread()); |
m_workerThreadHadPendingActivity = hasPendingActivity; |
} |
bool InProcessWorkerMessagingProxy::hasPendingActivity() const |
{ |
+ DCHECK(isParentContextThread()); |
return (m_unconfirmedMessageCount || m_workerThreadHadPendingActivity) && !m_askedToTerminate; |
} |
void InProcessWorkerMessagingProxy::terminateInternally() |
{ |
+ DCHECK(isParentContextThread()); |
m_workerInspectorProxy->workerThreadTerminated(); |
- // FIXME: This need to be revisited when we support nested worker one day |
- DCHECK(m_executionContext->isDocument()); |
- Document* document = toDocument(m_executionContext.get()); |
+ Document* document = toDocument(getExecutionContext()); |
LocalFrame* frame = document->frame(); |
if (frame) |
frame->console().adoptWorkerMessagesAfterTermination(m_workerInspectorProxy.get()); |
} |
+bool InProcessWorkerMessagingProxy::isParentContextThread() const |
+{ |
+ // TODO(nhiroki): Nested worker is not supported yet, so the parent context |
+ // thread should be equal to the main thread (http://crbug.com/31666). |
+ DCHECK(getExecutionContext()->isDocument()); |
+ return isMainThread(); |
+} |
+ |
} // namespace blink |