blob: 1dd01989ef5985ac1e5b4bcc11f9e35fcee727be [file] [log] [blame]
// Copyright 2016 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 "modules/serviceworkers/NavigationPreloadManager.h"
#include "bindings/core/v8/CallbackPromiseAdapter.h"
#include "core/dom/DOMException.h"
#include "modules/serviceworkers/NavigationPreloadCallbacks.h"
#include "modules/serviceworkers/ServiceWorkerContainerClient.h"
#include "modules/serviceworkers/ServiceWorkerRegistration.h"
#include "platform/network/HTTPParsers.h"
namespace blink {
ScriptPromise NavigationPreloadManager::enable(ScriptState* scriptState) {
return setEnabled(true, scriptState);
}
ScriptPromise NavigationPreloadManager::disable(ScriptState* scriptState) {
return setEnabled(false, scriptState);
}
ScriptPromise NavigationPreloadManager::setHeaderValue(ScriptState* scriptState,
const String& value) {
ServiceWorkerContainerClient* client =
ServiceWorkerContainerClient::from(m_registration->getExecutionContext());
if (!client || !client->provider()) {
return ScriptPromise::rejectWithDOMException(
scriptState, DOMException::create(InvalidStateError, "No provider."));
}
if (!isValidHTTPHeaderValue(value)) {
return ScriptPromise::reject(
scriptState, V8ThrowException::createTypeError(
scriptState->isolate(),
"The string provided to setHeaderValue ('" + value +
"') is not a valid HTTP header field value."));
}
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
m_registration->webRegistration()->setNavigationPreloadHeader(
value, client->provider(),
wrapUnique(new SetNavigationPreloadHeaderCallbacks(resolver)));
return promise;
}
ScriptPromise NavigationPreloadManager::getState(ScriptState* scriptState) {
ServiceWorkerContainerClient* client =
ServiceWorkerContainerClient::from(m_registration->getExecutionContext());
if (!client || !client->provider()) {
return ScriptPromise::rejectWithDOMException(
scriptState, DOMException::create(InvalidStateError, "No provider."));
}
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
m_registration->webRegistration()->getNavigationPreloadState(
client->provider(),
wrapUnique(new GetNavigationPreloadStateCallbacks(resolver)));
return promise;
}
NavigationPreloadManager::NavigationPreloadManager(
ServiceWorkerRegistration* registration)
: m_registration(registration) {}
ScriptPromise NavigationPreloadManager::setEnabled(bool enable,
ScriptState* scriptState) {
ServiceWorkerContainerClient* client =
ServiceWorkerContainerClient::from(m_registration->getExecutionContext());
if (!client || !client->provider()) {
return ScriptPromise::rejectWithDOMException(
scriptState, DOMException::create(InvalidStateError, "No provider."));
}
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
m_registration->webRegistration()->enableNavigationPreload(
enable, client->provider(),
wrapUnique(new EnableNavigationPreloadCallbacks(resolver)));
return promise;
}
DEFINE_TRACE(NavigationPreloadManager) {
visitor->trace(m_registration);
}
} // namespace blink