Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(299)

Unified Diff: third_party/WebKit/WebCore/dom/WorkerMessagingProxy.cpp

Issue 21184: WebKit merge 40722:40785 (part 1) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 11 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/WebCore/dom/WorkerMessagingProxy.cpp
===================================================================
--- third_party/WebKit/WebCore/dom/WorkerMessagingProxy.cpp (revision 9391)
+++ third_party/WebKit/WebCore/dom/WorkerMessagingProxy.cpp (working copy)
@@ -1,327 +1,327 @@
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-#include "config.h"
-
-#if ENABLE(WORKERS)
-
-#include "WorkerMessagingProxy.h"
-
-#include "DOMWindow.h"
-#include "Document.h"
-#include "MessageEvent.h"
-#include "ScriptExecutionContext.h"
-#include "Worker.h"
-#include "WorkerContext.h"
-#include "WorkerThread.h"
-
-namespace WebCore {
-
-class MessageWorkerContextTask : public ScriptExecutionContext::Task {
-public:
- static PassRefPtr<MessageWorkerContextTask> create(const String& message)
- {
- return adoptRef(new MessageWorkerContextTask(message));
- }
-
-private:
- MessageWorkerContextTask(const String& message)
- : m_message(message.copy())
- {
- }
-
- virtual void performTask(ScriptExecutionContext* scriptContext)
- {
- ASSERT(scriptContext->isWorkerContext());
- WorkerContext* context = static_cast<WorkerContext*>(scriptContext);
-
- RefPtr<Event> evt = MessageEvent::create(m_message, "", "", 0, 0);
-
- if (context->onmessage()) {
- evt->setTarget(context);
- evt->setCurrentTarget(context);
- context->onmessage()->handleEvent(evt.get(), false);
- }
-
- ExceptionCode ec = 0;
- context->dispatchEvent(evt.release(), ec);
- ASSERT(!ec);
-
- context->thread()->messagingProxy()->confirmWorkerThreadMessage(context->hasPendingActivity());
- }
-
-private:
- String m_message;
-};
-
-class MessageWorkerTask : public ScriptExecutionContext::Task {
-public:
- static PassRefPtr<MessageWorkerTask> create(const String& message, WorkerMessagingProxy* messagingProxy)
- {
- return adoptRef(new MessageWorkerTask(message, messagingProxy));
- }
-
-private:
- MessageWorkerTask(const String& message, WorkerMessagingProxy* messagingProxy)
- : m_message(message.copy())
- , m_messagingProxy(messagingProxy)
- {
- }
-
- virtual void performTask(ScriptExecutionContext*)
- {
- Worker* workerObject = m_messagingProxy->workerObject();
- if (!workerObject || m_messagingProxy->askedToTerminate())
- return;
-
- RefPtr<Event> evt = MessageEvent::create(m_message, "", "", 0, 0);
-
- if (workerObject->onmessage()) {
- evt->setTarget(workerObject);
- evt->setCurrentTarget(workerObject);
- workerObject->onmessage()->handleEvent(evt.get(), false);
- }
-
- ExceptionCode ec = 0;
- workerObject->dispatchEvent(evt.release(), ec);
- ASSERT(!ec);
- }
-
-private:
- String m_message;
- WorkerMessagingProxy* m_messagingProxy;
-};
-
-class WorkerExceptionTask : public ScriptExecutionContext::Task {
-public:
- static PassRefPtr<WorkerExceptionTask> create(const String& errorMessage, int lineNumber, const String& sourceURL, WorkerMessagingProxy* messagingProxy)
- {
- return adoptRef(new WorkerExceptionTask(errorMessage, lineNumber, sourceURL, messagingProxy));
- }
-
-private:
- WorkerExceptionTask(const String& errorMessage, int lineNumber, const String& sourceURL, WorkerMessagingProxy* messagingProxy)
- : m_errorMessage(errorMessage.copy())
- , m_lineNumber(lineNumber)
- , m_sourceURL(sourceURL.copy())
- , m_messagingProxy(messagingProxy)
- {
- }
-
- virtual void performTask(ScriptExecutionContext* context)
- {
- if (!m_messagingProxy->askedToTerminate())
- context->reportException(m_errorMessage, m_lineNumber, m_sourceURL);
- }
-
- String m_errorMessage;
- int m_lineNumber;
- String m_sourceURL;
- WorkerMessagingProxy* m_messagingProxy;
-};
-
-class WorkerContextDestroyedTask : public ScriptExecutionContext::Task {
-public:
- static PassRefPtr<WorkerContextDestroyedTask> create(WorkerMessagingProxy* messagingProxy)
- {
- return adoptRef(new WorkerContextDestroyedTask(messagingProxy));
- }
-
-private:
- WorkerContextDestroyedTask(WorkerMessagingProxy* messagingProxy)
- : m_messagingProxy(messagingProxy)
- {
- }
-
- virtual void performTask(ScriptExecutionContext*)
- {
- m_messagingProxy->workerContextDestroyedInternal();
- }
-
- WorkerMessagingProxy* m_messagingProxy;
-};
-
-class WorkerThreadActivityReportTask : public ScriptExecutionContext::Task {
-public:
- static PassRefPtr<WorkerThreadActivityReportTask> create(WorkerMessagingProxy* messagingProxy, bool confirmingMessage, bool hasPendingActivity)
- {
- return adoptRef(new WorkerThreadActivityReportTask(messagingProxy, confirmingMessage, hasPendingActivity));
- }
-
-private:
- WorkerThreadActivityReportTask(WorkerMessagingProxy* messagingProxy, bool confirmingMessage, bool hasPendingActivity)
- : m_messagingProxy(messagingProxy)
- , m_confirmingMessage(confirmingMessage)
- , m_hasPendingActivity(hasPendingActivity)
- {
- }
-
- virtual void performTask(ScriptExecutionContext*)
- {
- m_messagingProxy->reportWorkerThreadActivityInternal(m_confirmingMessage, m_hasPendingActivity);
- }
-
- WorkerMessagingProxy* m_messagingProxy;
- bool m_confirmingMessage;
- bool m_hasPendingActivity;
-};
-
-
-WorkerMessagingProxy::WorkerMessagingProxy(PassRefPtr<ScriptExecutionContext> scriptExecutionContext, Worker* workerObject)
- : m_scriptExecutionContext(scriptExecutionContext)
- , m_workerObject(workerObject)
- , m_unconfirmedMessageCount(0)
- , m_workerThreadHadPendingActivity(false)
- , m_askedToTerminate(false)
-{
- ASSERT(m_workerObject);
- ASSERT((m_scriptExecutionContext->isDocument() && isMainThread())
- || (m_scriptExecutionContext->isWorkerContext() && currentThread() == static_cast<WorkerContext*>(m_scriptExecutionContext.get())->thread()->threadID()));
-}
-
-WorkerMessagingProxy::~WorkerMessagingProxy()
-{
- ASSERT(!m_workerObject);
- ASSERT((m_scriptExecutionContext->isDocument() && isMainThread())
- || (m_scriptExecutionContext->isWorkerContext() && currentThread() == static_cast<WorkerContext*>(m_scriptExecutionContext.get())->thread()->threadID()));
-}
-
-void WorkerMessagingProxy::postMessageToWorkerObject(const String& message)
-{
- m_scriptExecutionContext->postTask(MessageWorkerTask::create(message, this));
-}
-
-void WorkerMessagingProxy::postMessageToWorkerContext(const String& message)
-{
- postTaskToWorkerContext(MessageWorkerContextTask::create(message));
-}
-
-void WorkerMessagingProxy::postTaskToWorkerContext(PassRefPtr<ScriptExecutionContext::Task> task)
-{
- if (m_askedToTerminate)
- return;
-
- if (m_workerThread) {
- ++m_unconfirmedMessageCount;
- m_workerThread->runLoop().postTask(task);
- } else
- m_queuedEarlyTasks.append(task);
-}
-
-void WorkerMessagingProxy::postTaskToWorkerObject(PassRefPtr<ScriptExecutionContext::Task> task)
-{
- m_scriptExecutionContext->postTask(task);
-}
-
-void WorkerMessagingProxy::postWorkerException(const String& errorMessage, int lineNumber, const String& sourceURL)
-{
- m_scriptExecutionContext->postTask(WorkerExceptionTask::create(errorMessage, lineNumber, sourceURL, this));
-}
-
-void WorkerMessagingProxy::workerThreadCreated(PassRefPtr<WorkerThread> workerThread)
-{
- m_workerThread = workerThread;
-
- if (m_askedToTerminate) {
- // Worker.terminate() could be called from JS before the thread was created.
- m_workerThread->stop();
- } else {
- unsigned taskCount = m_queuedEarlyTasks.size();
- ASSERT(!m_unconfirmedMessageCount);
- m_unconfirmedMessageCount = taskCount + 1; // Worker initialization counts as a pending message.
-
- for (unsigned i = 0; i < taskCount; ++i)
- m_workerThread->runLoop().postTask(m_queuedEarlyTasks[i]);
- m_queuedEarlyTasks.clear();
- }
-}
-
-void WorkerMessagingProxy::workerObjectDestroyed()
-{
- m_workerObject = 0;
- if (m_workerThread)
- terminate();
- else
- workerContextDestroyedInternal();
-}
-
-void WorkerMessagingProxy::workerContextDestroyed()
-{
- m_scriptExecutionContext->postTask(WorkerContextDestroyedTask::create(this));
- // Will execute workerContextDestroyedInternal() on context's thread.
-}
-
-void WorkerMessagingProxy::workerContextDestroyedInternal()
-{
- // WorkerContextDestroyedTask 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_workerThread = 0;
- if (!m_workerObject)
- delete this;
-}
-
-void WorkerMessagingProxy::terminate()
-{
- if (m_askedToTerminate)
- return;
- m_askedToTerminate = true;
-
- if (m_workerThread)
- m_workerThread->stop();
-}
-
-void WorkerMessagingProxy::confirmWorkerThreadMessage(bool hasPendingActivity)
-{
- m_scriptExecutionContext->postTask(WorkerThreadActivityReportTask::create(this, true, hasPendingActivity));
- // Will execute reportWorkerThreadActivityInternal() on context's thread.
-}
-
-void WorkerMessagingProxy::reportWorkerThreadActivity(bool hasPendingActivity)
-{
- m_scriptExecutionContext->postTask(WorkerThreadActivityReportTask::create(this, false, hasPendingActivity));
- // Will execute reportWorkerThreadActivityInternal() on context's thread.
-}
-
-void WorkerMessagingProxy::reportWorkerThreadActivityInternal(bool confirmingMessage, bool hasPendingActivity)
-{
- if (confirmingMessage && !m_askedToTerminate) {
- ASSERT(m_unconfirmedMessageCount);
- --m_unconfirmedMessageCount;
- }
-
- m_workerThreadHadPendingActivity = hasPendingActivity;
-}
-
-bool WorkerMessagingProxy::workerThreadHasPendingActivity() const
-{
- return (m_unconfirmedMessageCount || m_workerThreadHadPendingActivity) && !m_askedToTerminate;
-}
-
-} // namespace WebCore
-
-#endif // ENABLE(WORKERS)
-
-
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include "config.h"
+
+#if ENABLE(WORKERS)
+
+#include "WorkerMessagingProxy.h"
+
+#include "DOMWindow.h"
+#include "Document.h"
+#include "MessageEvent.h"
+#include "ScriptExecutionContext.h"
+#include "Worker.h"
+#include "WorkerContext.h"
+#include "WorkerThread.h"
+
+namespace WebCore {
+
+class MessageWorkerContextTask : public ScriptExecutionContext::Task {
+public:
+ static PassRefPtr<MessageWorkerContextTask> create(const String& message)
+ {
+ return adoptRef(new MessageWorkerContextTask(message));
+ }
+
+private:
+ MessageWorkerContextTask(const String& message)
+ : m_message(message.copy())
+ {
+ }
+
+ virtual void performTask(ScriptExecutionContext* scriptContext)
+ {
+ ASSERT(scriptContext->isWorkerContext());
+ WorkerContext* context = static_cast<WorkerContext*>(scriptContext);
+
+ RefPtr<Event> evt = MessageEvent::create(m_message, "", "", 0, 0);
+
+ if (context->onmessage()) {
+ evt->setTarget(context);
+ evt->setCurrentTarget(context);
+ context->onmessage()->handleEvent(evt.get(), false);
+ }
+
+ ExceptionCode ec = 0;
+ context->dispatchEvent(evt.release(), ec);
+ ASSERT(!ec);
+
+ context->thread()->messagingProxy()->confirmWorkerThreadMessage(context->hasPendingActivity());
+ }
+
+private:
+ String m_message;
+};
+
+class MessageWorkerTask : public ScriptExecutionContext::Task {
+public:
+ static PassRefPtr<MessageWorkerTask> create(const String& message, WorkerMessagingProxy* messagingProxy)
+ {
+ return adoptRef(new MessageWorkerTask(message, messagingProxy));
+ }
+
+private:
+ MessageWorkerTask(const String& message, WorkerMessagingProxy* messagingProxy)
+ : m_message(message.copy())
+ , m_messagingProxy(messagingProxy)
+ {
+ }
+
+ virtual void performTask(ScriptExecutionContext*)
+ {
+ Worker* workerObject = m_messagingProxy->workerObject();
+ if (!workerObject || m_messagingProxy->askedToTerminate())
+ return;
+
+ RefPtr<Event> evt = MessageEvent::create(m_message, "", "", 0, 0);
+
+ if (workerObject->onmessage()) {
+ evt->setTarget(workerObject);
+ evt->setCurrentTarget(workerObject);
+ workerObject->onmessage()->handleEvent(evt.get(), false);
+ }
+
+ ExceptionCode ec = 0;
+ workerObject->dispatchEvent(evt.release(), ec);
+ ASSERT(!ec);
+ }
+
+private:
+ String m_message;
+ WorkerMessagingProxy* m_messagingProxy;
+};
+
+class WorkerExceptionTask : public ScriptExecutionContext::Task {
+public:
+ static PassRefPtr<WorkerExceptionTask> create(const String& errorMessage, int lineNumber, const String& sourceURL, WorkerMessagingProxy* messagingProxy)
+ {
+ return adoptRef(new WorkerExceptionTask(errorMessage, lineNumber, sourceURL, messagingProxy));
+ }
+
+private:
+ WorkerExceptionTask(const String& errorMessage, int lineNumber, const String& sourceURL, WorkerMessagingProxy* messagingProxy)
+ : m_errorMessage(errorMessage.copy())
+ , m_lineNumber(lineNumber)
+ , m_sourceURL(sourceURL.copy())
+ , m_messagingProxy(messagingProxy)
+ {
+ }
+
+ virtual void performTask(ScriptExecutionContext* context)
+ {
+ if (!m_messagingProxy->askedToTerminate())
+ context->reportException(m_errorMessage, m_lineNumber, m_sourceURL);
+ }
+
+ String m_errorMessage;
+ int m_lineNumber;
+ String m_sourceURL;
+ WorkerMessagingProxy* m_messagingProxy;
+};
+
+class WorkerContextDestroyedTask : public ScriptExecutionContext::Task {
+public:
+ static PassRefPtr<WorkerContextDestroyedTask> create(WorkerMessagingProxy* messagingProxy)
+ {
+ return adoptRef(new WorkerContextDestroyedTask(messagingProxy));
+ }
+
+private:
+ WorkerContextDestroyedTask(WorkerMessagingProxy* messagingProxy)
+ : m_messagingProxy(messagingProxy)
+ {
+ }
+
+ virtual void performTask(ScriptExecutionContext*)
+ {
+ m_messagingProxy->workerContextDestroyedInternal();
+ }
+
+ WorkerMessagingProxy* m_messagingProxy;
+};
+
+class WorkerThreadActivityReportTask : public ScriptExecutionContext::Task {
+public:
+ static PassRefPtr<WorkerThreadActivityReportTask> create(WorkerMessagingProxy* messagingProxy, bool confirmingMessage, bool hasPendingActivity)
+ {
+ return adoptRef(new WorkerThreadActivityReportTask(messagingProxy, confirmingMessage, hasPendingActivity));
+ }
+
+private:
+ WorkerThreadActivityReportTask(WorkerMessagingProxy* messagingProxy, bool confirmingMessage, bool hasPendingActivity)
+ : m_messagingProxy(messagingProxy)
+ , m_confirmingMessage(confirmingMessage)
+ , m_hasPendingActivity(hasPendingActivity)
+ {
+ }
+
+ virtual void performTask(ScriptExecutionContext*)
+ {
+ m_messagingProxy->reportPendingActivityInternal(m_confirmingMessage, m_hasPendingActivity);
+ }
+
+ WorkerMessagingProxy* m_messagingProxy;
+ bool m_confirmingMessage;
+ bool m_hasPendingActivity;
+};
+
+
+WorkerMessagingProxy::WorkerMessagingProxy(PassRefPtr<ScriptExecutionContext> scriptExecutionContext, Worker* workerObject)
+ : m_scriptExecutionContext(scriptExecutionContext)
+ , m_workerObject(workerObject)
+ , m_unconfirmedMessageCount(0)
+ , m_workerThreadHadPendingActivity(false)
+ , m_askedToTerminate(false)
+{
+ ASSERT(m_workerObject);
+ ASSERT((m_scriptExecutionContext->isDocument() && isMainThread())
+ || (m_scriptExecutionContext->isWorkerContext() && currentThread() == static_cast<WorkerContext*>(m_scriptExecutionContext.get())->thread()->threadID()));
+}
+
+WorkerMessagingProxy::~WorkerMessagingProxy()
+{
+ ASSERT(!m_workerObject);
+ ASSERT((m_scriptExecutionContext->isDocument() && isMainThread())
+ || (m_scriptExecutionContext->isWorkerContext() && currentThread() == static_cast<WorkerContext*>(m_scriptExecutionContext.get())->thread()->threadID()));
+}
+
+void WorkerMessagingProxy::postMessageToWorkerObject(const String& message)
+{
+ m_scriptExecutionContext->postTask(MessageWorkerTask::create(message, this));
+}
+
+void WorkerMessagingProxy::postMessageToWorkerContext(const String& message)
+{
+ postTaskToWorkerContext(MessageWorkerContextTask::create(message));
+}
+
+void WorkerMessagingProxy::postTaskToWorkerContext(PassRefPtr<ScriptExecutionContext::Task> task)
+{
+ if (m_askedToTerminate)
+ return;
+
+ if (m_workerThread) {
+ ++m_unconfirmedMessageCount;
+ m_workerThread->runLoop().postTask(task);
+ } else
+ m_queuedEarlyTasks.append(task);
+}
+
+void WorkerMessagingProxy::postTaskToWorkerObject(PassRefPtr<ScriptExecutionContext::Task> task)
+{
+ m_scriptExecutionContext->postTask(task);
+}
+
+void WorkerMessagingProxy::postExceptionToWorkerObject(const String& errorMessage, int lineNumber, const String& sourceURL)
+{
+ m_scriptExecutionContext->postTask(WorkerExceptionTask::create(errorMessage, lineNumber, sourceURL, this));
+}
+
+void WorkerMessagingProxy::workerThreadCreated(PassRefPtr<WorkerThread> workerThread)
+{
+ m_workerThread = workerThread;
+
+ if (m_askedToTerminate) {
+ // Worker.terminate() could be called from JS before the thread was created.
+ m_workerThread->stop();
+ } else {
+ unsigned taskCount = m_queuedEarlyTasks.size();
+ ASSERT(!m_unconfirmedMessageCount);
+ m_unconfirmedMessageCount = taskCount + 1; // Worker initialization counts as a pending message.
+
+ for (unsigned i = 0; i < taskCount; ++i)
+ m_workerThread->runLoop().postTask(m_queuedEarlyTasks[i]);
+ m_queuedEarlyTasks.clear();
+ }
+}
+
+void WorkerMessagingProxy::workerObjectDestroyed()
+{
+ m_workerObject = 0;
+ if (m_workerThread)
+ terminateWorkerContext();
+ else
+ workerContextDestroyedInternal();
+}
+
+void WorkerMessagingProxy::workerContextDestroyed()
+{
+ m_scriptExecutionContext->postTask(WorkerContextDestroyedTask::create(this));
+ // Will execute workerContextDestroyedInternal() on context's thread.
+}
+
+void WorkerMessagingProxy::workerContextDestroyedInternal()
+{
+ // WorkerContextDestroyedTask 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_workerThread = 0;
+ if (!m_workerObject)
+ delete this;
+}
+
+void WorkerMessagingProxy::terminateWorkerContext()
+{
+ if (m_askedToTerminate)
+ return;
+ m_askedToTerminate = true;
+
+ if (m_workerThread)
+ m_workerThread->stop();
+}
+
+void WorkerMessagingProxy::confirmWorkerThreadMessage(bool hasPendingActivity)
+{
+ m_scriptExecutionContext->postTask(WorkerThreadActivityReportTask::create(this, true, hasPendingActivity));
+ // Will execute reportPendingActivityInternal() on context's thread.
+}
+
+void WorkerMessagingProxy::reportPendingActivity(bool hasPendingActivity)
+{
+ m_scriptExecutionContext->postTask(WorkerThreadActivityReportTask::create(this, false, hasPendingActivity));
+ // Will execute reportPendingActivityInternal() on context's thread.
+}
+
+void WorkerMessagingProxy::reportPendingActivityInternal(bool confirmingMessage, bool hasPendingActivity)
+{
+ if (confirmingMessage && !m_askedToTerminate) {
+ ASSERT(m_unconfirmedMessageCount);
+ --m_unconfirmedMessageCount;
+ }
+
+ m_workerThreadHadPendingActivity = hasPendingActivity;
+}
+
+bool WorkerMessagingProxy::hasPendingActivity() const
+{
+ return (m_unconfirmedMessageCount || m_workerThreadHadPendingActivity) && !m_askedToTerminate;
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(WORKERS)
+
+
« no previous file with comments | « third_party/WebKit/WebCore/dom/WorkerMessagingProxy.h ('k') | third_party/WebKit/WebCore/dom/WorkerObjectProxy.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698