Chromium Code Reviews| Index: Source/core/workers/WorkerThread.cpp |
| diff --git a/Source/core/workers/WorkerThread.cpp b/Source/core/workers/WorkerThread.cpp |
| index cc0c0c2130bc61d14f9bc98fff3e5f28e485e15b..d61bef8a2ba6865e33d7f79dff77345921597966 100644 |
| --- a/Source/core/workers/WorkerThread.cpp |
| +++ b/Source/core/workers/WorkerThread.cpp |
| @@ -31,6 +31,8 @@ |
| #include "bindings/core/v8/ScriptSourceCode.h" |
| #include "bindings/core/v8/V8Initializer.h" |
| #include "core/dom/Microtask.h" |
| +#include "core/fetch/CachedMetadata.h" |
| +#include "core/fetch/CachedMetadataHandler.h" |
| #include "core/inspector/InspectorInstrumentation.h" |
| #include "core/inspector/WorkerInspectorController.h" |
| #include "core/workers/DedicatedWorkerGlobalScope.h" |
| @@ -81,6 +83,45 @@ private: |
| WorkerThread* m_workerThread; |
| }; |
| +class WorkerScriptCachedMetadataHandler : public CachedMetadataHandler { |
|
kinuko
2015/02/16 14:18:38
This class can be probably in its own file, as it'
horo
2015/02/16 16:20:12
Done.
|
| +public: |
| + WorkerScriptCachedMetadataHandler(WorkerGlobalScope* workerGlobalScope, const KURL& scriptURL, const Vector<char>* metaData) |
| + : m_workerGlobalScope(workerGlobalScope) |
| + , m_scriptURL(scriptURL) |
| + { |
| + if (metaData) |
| + m_cachedMetadata = CachedMetadata::deserialize(metaData->data(), metaData->size()); |
| + } |
| + ~WorkerScriptCachedMetadataHandler() override { } |
| + void setCachedMetadata(unsigned dataTypeID, const char* data, size_t size, CacheType type) override |
| + { |
| + if (type != SendToPlatform) |
| + return; |
| + m_cachedMetadata = CachedMetadata::create(dataTypeID, data, size); |
| + const Vector<char>& serializedData = m_cachedMetadata->serialize(); |
| + m_workerGlobalScope->setCachedMetadata(m_scriptURL, serializedData.data(), serializedData.size()); |
| + } |
| + void clearCachedMetadata(CacheType type) override |
| + { |
| + if (type != SendToPlatform) |
| + return; |
| + m_cachedMetadata = nullptr; |
| + m_workerGlobalScope->clearCachedMetadata(m_scriptURL); |
| + } |
| + CachedMetadata* cachedMetadata(unsigned dataTypeID) const override |
| + { |
| + if (!m_cachedMetadata || m_cachedMetadata->dataTypeID() != dataTypeID) |
| + return nullptr; |
| + return m_cachedMetadata.get(); |
| + } |
| + String encoding() const override { return ""; } |
| + |
| +private: |
| + WorkerGlobalScope* m_workerGlobalScope; |
| + KURL m_scriptURL; |
| + RefPtr<CachedMetadata> m_cachedMetadata; |
| +}; |
| + |
| } // namespace |
| static Mutex& threadSetMutex() |
| @@ -311,6 +352,8 @@ void WorkerThread::initialize() |
| KURL scriptURL = m_startupData->m_scriptURL; |
| String sourceCode = m_startupData->m_sourceCode; |
| WorkerThreadStartMode startMode = m_startupData->m_startMode; |
| + OwnPtr<Vector<char>> cachedMetaData = m_startupData->m_cachedMetaData.release(); |
| + V8CacheOptions v8CacheOptions = m_startupData->m_v8CacheOptions; |
| { |
| MutexLocker lock(m_threadCreationMutex); |
| @@ -342,7 +385,8 @@ void WorkerThread::initialize() |
| if (!script->isExecutionForbidden()) |
| script->initializeContextIfNeeded(); |
| InspectorInstrumentation::willEvaluateWorkerScript(workerGlobalScope(), startMode); |
| - bool success = script->evaluate(ScriptSourceCode(sourceCode, scriptURL)); |
| + WorkerScriptCachedMetadataHandler handler(workerGlobalScope(), scriptURL, cachedMetaData.get()); |
| + bool success = script->evaluate(ScriptSourceCode(sourceCode, scriptURL), nullptr, &handler, v8CacheOptions); |
| m_workerGlobalScope->didEvaluateWorkerScript(); |
| m_workerReportingProxy.didEvaluateWorkerScript(success); |