diff options
Diffstat (limited to 'WebCore/workers/WorkerContext.cpp')
-rw-r--r-- | WebCore/workers/WorkerContext.cpp | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/WebCore/workers/WorkerContext.cpp b/WebCore/workers/WorkerContext.cpp index b52b285..6cee246 100644 --- a/WebCore/workers/WorkerContext.cpp +++ b/WebCore/workers/WorkerContext.cpp @@ -63,6 +63,16 @@ #include "NotificationCenter.h" #endif +#if ENABLE(FILE_SYSTEM) +#include "AsyncFileSystem.h" +#include "DOMFileSystem.h" +#include "ErrorCallback.h" +#include "FileError.h" +#include "FileSystemCallback.h" +#include "FileSystemCallbacks.h" +#include "LocalFileSystem.h" +#endif + namespace WebCore { class CloseWorkerContextTask : public ScriptExecutionContext::Task { @@ -100,6 +110,10 @@ WorkerContext::~WorkerContext() #if ENABLE(NOTIFICATIONS) m_notifications.clear(); #endif + + // Make sure we have no observers. + notifyObserversOfStop(); + // Notify proxy that we are going away. This can free the WorkerThread object, so do not access it after this. thread()->workerReportingProxy().workerContextDestroyed(); } @@ -335,6 +349,74 @@ void WorkerContext::revokeBlobURL(const String& blobURLString) } #endif +#if ENABLE(FILE_SYSTEM) +void WorkerContext::requestFileSystem(int type, long long size, PassRefPtr<FileSystemCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback) +{ + if (!AsyncFileSystem::isAvailable() || !securityOrigin()->canAccessFileSystem()) { + DOMFileSystem::scheduleCallback(this, errorCallback, FileError::create(SECURITY_ERR)); + return; + } + + AsyncFileSystem::Type fileSystemType = static_cast<AsyncFileSystem::Type>(type); + if (fileSystemType != AsyncFileSystem::Temporary && fileSystemType != AsyncFileSystem::Persistent) { + DOMFileSystem::scheduleCallback(this, errorCallback, FileError::create(INVALID_MODIFICATION_ERR)); + return; + } + + LocalFileSystem::localFileSystem().requestFileSystem(this, fileSystemType, size, FileSystemCallbacks::create(successCallback, errorCallback, this)); +} + +COMPILE_ASSERT(static_cast<int>(WorkerContext::TEMPORARY) == static_cast<int>(AsyncFileSystem::Temporary), enum_mismatch); +COMPILE_ASSERT(static_cast<int>(WorkerContext::PERSISTENT) == static_cast<int>(AsyncFileSystem::Persistent), enum_mismatch); +#endif + +WorkerContext::Observer::Observer(WorkerContext* context) + : m_context(context) +{ + ASSERT(m_context && m_context->isContextThread()); + m_context->registerObserver(this); +} + +WorkerContext::Observer::~Observer() +{ + if (!m_context) + return; + ASSERT(m_context->isContextThread()); + m_context->unregisterObserver(this); +} + +void WorkerContext::Observer::stopObserving() +{ + if (!m_context) + return; + ASSERT(m_context->isContextThread()); + m_context->unregisterObserver(this); + m_context = 0; +} + +void WorkerContext::registerObserver(Observer* observer) +{ + ASSERT(observer); + m_workerObservers.add(observer); +} + +void WorkerContext::unregisterObserver(Observer* observer) +{ + ASSERT(observer); + m_workerObservers.remove(observer); +} + +void WorkerContext::notifyObserversOfStop() +{ + HashSet<Observer*>::iterator iter = m_workerObservers.begin(); + while (iter != m_workerObservers.end()) { + WorkerContext::Observer* observer = *iter; + observer->stopObserving(); + observer->notifyStop(); + iter = m_workerObservers.begin(); + } +} + } // namespace WebCore #endif // ENABLE(WORKERS) |