Index: Source/modules/cachestorage/CacheStorage.cpp |
diff --git a/Source/modules/cachestorage/CacheStorage.cpp b/Source/modules/cachestorage/CacheStorage.cpp |
index 86ffcb2ac4a93601d43240c5964e44c217af0342..fcf275ee5484253297b158f963c48c23de3012ac 100644 |
--- a/Source/modules/cachestorage/CacheStorage.cpp |
+++ b/Source/modules/cachestorage/CacheStorage.cpp |
@@ -24,6 +24,21 @@ DOMException* createNoImplementationException() |
return DOMException::create(NotSupportedError, "No CacheStorage implementation provided."); |
} |
+bool commonChecks(ScriptState* scriptState, ExceptionState& exceptionState) |
+{ |
+ ExecutionContext* executionContext = scriptState->executionContext(); |
+ // FIXME: May be null due to worker termination: http://crbug.com/413518. |
+ if (!executionContext) |
+ return false; |
+ |
+ String errorMessage; |
+ if (!executionContext->isPrivilegedContext(errorMessage)) { |
+ exceptionState.throwSecurityError(errorMessage); |
+ return false; |
+ } |
+ return true; |
+} |
+ |
} |
// FIXME: Consider using CallbackPromiseAdapter. |
@@ -183,13 +198,26 @@ private: |
RefPtrWillBePersistent<ScriptPromiseResolver> m_resolver; |
}; |
+// static |
+bool CacheStorage::canAccessCacheStorage(ExecutionContext* executionContext, String* errorMessage) |
+{ |
+ String ignored; |
+ if (!errorMessage) |
+ errorMessage = &ignored; |
+ return executionContext->isPrivilegedContext(*errorMessage); |
+} |
+ |
+// static |
CacheStorage* CacheStorage::create(WeakPtr<GlobalFetch::ScopedFetcher> fetcher, WebServiceWorkerCacheStorage* webCacheStorage) |
{ |
return new CacheStorage(fetcher, adoptPtr(webCacheStorage)); |
} |
-ScriptPromise CacheStorage::open(ScriptState* scriptState, const String& cacheName) |
+ScriptPromise CacheStorage::open(ScriptState* scriptState, const String& cacheName, ExceptionState& exceptionState) |
{ |
+ if (!commonChecks(scriptState, exceptionState)) |
+ return ScriptPromise(); |
+ |
RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState); |
const ScriptPromise promise = resolver->promise(); |
@@ -207,8 +235,11 @@ ScriptPromise CacheStorage::open(ScriptState* scriptState, const String& cacheNa |
return promise; |
} |
-ScriptPromise CacheStorage::has(ScriptState* scriptState, const String& cacheName) |
+ScriptPromise CacheStorage::has(ScriptState* scriptState, const String& cacheName, ExceptionState& exceptionState) |
{ |
+ if (!commonChecks(scriptState, exceptionState)) |
+ return ScriptPromise(); |
+ |
RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState); |
const ScriptPromise promise = resolver->promise(); |
@@ -225,8 +256,11 @@ ScriptPromise CacheStorage::has(ScriptState* scriptState, const String& cacheNam |
return promise; |
} |
-ScriptPromise CacheStorage::deleteFunction(ScriptState* scriptState, const String& cacheName) |
+ScriptPromise CacheStorage::deleteFunction(ScriptState* scriptState, const String& cacheName, ExceptionState& exceptionState) |
{ |
+ if (!commonChecks(scriptState, exceptionState)) |
+ return ScriptPromise(); |
+ |
RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState); |
const ScriptPromise promise = resolver->promise(); |
@@ -238,8 +272,11 @@ ScriptPromise CacheStorage::deleteFunction(ScriptState* scriptState, const Strin |
return promise; |
} |
-ScriptPromise CacheStorage::keys(ScriptState* scriptState) |
+ScriptPromise CacheStorage::keys(ScriptState* scriptState, ExceptionState& exceptionState) |
{ |
+ if (!commonChecks(scriptState, exceptionState)) |
+ return ScriptPromise(); |
+ |
RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState); |
const ScriptPromise promise = resolver->promise(); |
@@ -254,6 +291,8 @@ ScriptPromise CacheStorage::keys(ScriptState* scriptState) |
ScriptPromise CacheStorage::match(ScriptState* scriptState, const RequestInfo& request, const CacheQueryOptions& options, ExceptionState& exceptionState) |
{ |
ASSERT(!request.isNull()); |
+ if (!commonChecks(scriptState, exceptionState)) |
+ return ScriptPromise(); |
if (request.isRequest()) |
return matchImpl(scriptState, request.getAsRequest(), options); |