| Index: WebCore/bindings/generic/ActiveDOMCallback.cpp
|
| ===================================================================
|
| --- WebCore/bindings/generic/ActiveDOMCallback.cpp (revision 109601)
|
| +++ WebCore/bindings/generic/ActiveDOMCallback.cpp (working copy)
|
| @@ -33,111 +33,34 @@
|
|
|
| #include "ActiveDOMObject.h"
|
| #include "ScriptExecutionContext.h"
|
| -#include <wtf/PassOwnPtr.h>
|
| -#include <wtf/ThreadingPrimitives.h>
|
| +#include "WorkerContext.h"
|
|
|
| namespace WebCore {
|
|
|
| -static void destroyOnContextThread(PassOwnPtr<ActiveDOMObjectCallbackImpl>);
|
| -
|
| -class DestroyOnContextThreadTask : public ScriptExecutionContext::Task {
|
| -public:
|
| - static PassOwnPtr<DestroyOnContextThreadTask> create(PassOwnPtr<ActiveDOMObjectCallbackImpl> impl)
|
| - {
|
| - return adoptPtr(new DestroyOnContextThreadTask(impl));
|
| - }
|
| -
|
| - virtual void performTask(ScriptExecutionContext*)
|
| - {
|
| - destroyOnContextThread(m_impl.release());
|
| - }
|
| -
|
| -private:
|
| - DestroyOnContextThreadTask(PassOwnPtr<ActiveDOMObjectCallbackImpl> impl)
|
| - : m_impl(impl)
|
| - {
|
| - }
|
| -
|
| - OwnPtr<ActiveDOMObjectCallbackImpl> m_impl;
|
| -};
|
| -
|
| -class ActiveDOMObjectCallbackImpl : public ActiveDOMObject {
|
| -public:
|
| - ActiveDOMObjectCallbackImpl(ScriptExecutionContext* context)
|
| - : ActiveDOMObject(context, this)
|
| - , m_suspended(false)
|
| - , m_stopped(false)
|
| - {
|
| - }
|
| -
|
| - virtual void contextDestroyed()
|
| - {
|
| - MutexLocker locker(m_mutex);
|
| - ActiveDOMObject::contextDestroyed();
|
| - }
|
| - virtual bool canSuspend() const { return false; }
|
| - virtual void suspend(ReasonForSuspension)
|
| - {
|
| - MutexLocker locker(m_mutex);
|
| - m_suspended = true;
|
| - }
|
| - virtual void resume()
|
| - {
|
| - MutexLocker locker(m_mutex);
|
| - m_suspended = false;
|
| - }
|
| - virtual void stop()
|
| - {
|
| - MutexLocker locker(m_mutex);
|
| - m_stopped = true;
|
| - }
|
| - bool canInvokeCallback()
|
| - {
|
| - MutexLocker locker(m_mutex);
|
| - return (!m_suspended && !m_stopped);
|
| - }
|
| - ScriptExecutionContext* scriptExecutionContext()
|
| - {
|
| - MutexLocker locker(m_mutex);
|
| - return ActiveDOMObject::scriptExecutionContext();
|
| - }
|
| - Mutex& mutex() { return m_mutex; }
|
| -
|
| -private:
|
| - Mutex m_mutex;
|
| - bool m_suspended;
|
| - bool m_stopped;
|
| -};
|
| -
|
| -static void destroyOnContextThread(PassOwnPtr<ActiveDOMObjectCallbackImpl> impl)
|
| -{
|
| - OwnPtr<ActiveDOMObjectCallbackImpl> implOwnPtr = impl;
|
| -
|
| - ScriptExecutionContext* context = implOwnPtr->scriptExecutionContext();
|
| - MutexLocker locker(implOwnPtr->mutex());
|
| - if (context && !context->isContextThread())
|
| - context->postTask(DestroyOnContextThreadTask::create(implOwnPtr.release()));
|
| -}
|
| -
|
| ActiveDOMCallback::ActiveDOMCallback(ScriptExecutionContext* context)
|
| - : m_impl(adoptPtr(new ActiveDOMObjectCallbackImpl(context)))
|
| + : ContextDestructionObserver(context)
|
| {
|
| - m_impl->suspendIfNeeded();
|
| }
|
|
|
| ActiveDOMCallback::~ActiveDOMCallback()
|
| {
|
| - destroyOnContextThread(m_impl.release());
|
| }
|
|
|
| bool ActiveDOMCallback::canInvokeCallback() const
|
| {
|
| - return m_impl->canInvokeCallback();
|
| + ScriptExecutionContext* context = scriptExecutionContext();
|
| + return context && !context->activeDOMObjectsAreSuspended() && !context->activeDOMObjectsAreStopped();
|
| }
|
|
|
| -ScriptExecutionContext* ActiveDOMCallback::scriptExecutionContext() const
|
| +bool ActiveDOMCallback::isScriptControllerTerminating() const
|
| {
|
| - return m_impl->scriptExecutionContext();
|
| + ScriptExecutionContext* context = scriptExecutionContext();
|
| + if (context && context->isWorkerContext()) {
|
| + WorkerScriptController* scriptController = static_cast<WorkerContext*>(context)->script();
|
| + if (!scriptController || scriptController->isExecutionForbidden() || scriptController->isExecutionTerminating())
|
| + return true;
|
| + }
|
| + return false;
|
| }
|
|
|
| } // namespace WebCore
|
|
|