blob: 051927dc290fdc3116bec3725d26f99910a1e100 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "config.h"
#include "modules/quota/StorageManager.h"
#include "bindings/core/v8/ScriptPromiseResolver.h"
#include "core/dom/Document.h"
#include "core/dom/ExceptionCode.h"
#include "modules/permissions/Permissions.h"
#include "public/platform/Platform.h"
#include "public/platform/WebCallbacks.h"
#include "public/platform/modules/permissions/WebPermissionClient.h"
#include "public/platform/modules/permissions/WebPermissionStatus.h"
namespace blink {
namespace {
class DurableStorageQueryCallbacks final : public WebPermissionCallback {
public:
DurableStorageQueryCallbacks(ScriptPromiseResolver* resolver)
: m_resolver(resolver)
{
}
void onSuccess(WebPermissionStatus status) override
{
String toReturn;
switch (status) {
case WebPermissionStatusGranted:
toReturn = "granted";
break;
case WebPermissionStatusDenied:
toReturn = "denied";
break;
case WebPermissionStatusPrompt:
toReturn = "default";
break;
}
m_resolver->resolve(toReturn);
}
void onError() override
{
ASSERT_NOT_REACHED();
}
private:
Persistent<ScriptPromiseResolver> m_resolver;
};
class DurableStorageRequestCallbacks final : public WebPermissionCallback {
public:
DurableStorageRequestCallbacks(ScriptPromiseResolver* resolver)
: m_resolver(resolver)
{
}
void onSuccess(WebPermissionStatus status) override
{
m_resolver->resolve(status == WebPermissionStatusGranted);
}
void onError() override
{
ASSERT_NOT_REACHED();
}
private:
Persistent<ScriptPromiseResolver> m_resolver;
};
} // namespace
ScriptPromise StorageManager::requestPersistent(ScriptState* scriptState)
{
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
ExecutionContext* executionContext = scriptState->executionContext();
SecurityOrigin* securityOrigin = executionContext->securityOrigin();
// TODO(dgrogan): Is the isUnique() check covered by the later
// isSecureContext() check? If so, maybe remove it. Write a test if it
// stays.
if (securityOrigin->isUnique()) {
resolver->reject(DOMException::create(NotSupportedError));
return promise;
}
String errorMessage;
if (!executionContext->isSecureContext(errorMessage)) {
resolver->reject(DOMException::create(SecurityError, errorMessage));
return promise;
}
ASSERT(executionContext->isDocument());
WebPermissionClient* permissionClient = Permissions::getClient(executionContext);
if (!permissionClient) {
resolver->reject(DOMException::create(InvalidStateError, "In its current state, the global scope can't request permissions."));
return promise;
}
permissionClient->requestPermission(WebPermissionTypeDurableStorage, KURL(KURL(), scriptState->executionContext()->securityOrigin()->toString()), new DurableStorageRequestCallbacks(resolver));
return promise;
}
ScriptPromise StorageManager::persistentPermission(ScriptState* scriptState)
{
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
WebPermissionClient* permissionClient = Permissions::getClient(scriptState->executionContext());
if (!permissionClient) {
resolver->reject(DOMException::create(InvalidStateError, "In its current state, the global scope can't query permissions."));
return promise;
}
permissionClient->queryPermission(WebPermissionTypeDurableStorage, KURL(KURL(), scriptState->executionContext()->securityOrigin()->toString()), new DurableStorageQueryCallbacks(resolver));
return promise;
}
DEFINE_TRACE(StorageManager)
{
}
} // namespace blink