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); |