blob: b01ef15e16d41dcb348f3fc70deb3e5603d73901 [file] [log] [blame]
// Copyright 2019 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 "third_party/blink/renderer/modules/manifest/manifest_fetcher.h"
#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h"
#include "third_party/blink/renderer/core/frame/local_dom_window.h"
#include "third_party/blink/renderer/core/html/parser/text_resource_decoder.h"
#include "third_party/blink/renderer/core/loader/threadable_loader.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h"
namespace blink {
ManifestFetcher::ManifestFetcher(const KURL& url)
: url_(url), completed_(false) {}
ManifestFetcher::~ManifestFetcher() = default;
void ManifestFetcher::Start(LocalDOMWindow& window,
bool use_credentials,
ResourceFetcher* resource_fetcher,
ManifestFetcher::Callback callback) {
callback_ = std::move(callback);
ResourceRequest request(url_);
request.SetRequestContext(mojom::blink::RequestContextType::MANIFEST);
request.SetMode(network::mojom::RequestMode::kCors);
// See https://w3c.github.io/manifest/. Use "include" when use_credentials is
// true, and "omit" otherwise.
request.SetCredentialsMode(use_credentials
? network::mojom::CredentialsMode::kInclude
: network::mojom::CredentialsMode::kOmit);
ResourceLoaderOptions resource_loader_options(window.GetCurrentWorld());
resource_loader_options.data_buffering_policy = kDoNotBufferData;
loader_ = MakeGarbageCollected<ThreadableLoader>(
window, this, resource_loader_options, resource_fetcher);
loader_->Start(std::move(request));
}
void ManifestFetcher::Cancel() {
if (!loader_)
return;
DCHECK(!completed_);
ThreadableLoader* loader = loader_.Release();
loader->Cancel();
}
void ManifestFetcher::DidReceiveResponse(uint64_t,
const ResourceResponse& response) {
response_ = response;
}
void ManifestFetcher::DidReceiveData(const char* data, unsigned length) {
if (!length)
return;
if (!decoder_) {
String encoding = response_.TextEncodingName();
decoder_ = std::make_unique<TextResourceDecoder>(TextResourceDecoderOptions(
TextResourceDecoderOptions::kPlainTextContent,
encoding.IsEmpty() ? UTF8Encoding() : WTF::TextEncoding(encoding)));
}
data_.Append(decoder_->Decode(data, length));
}
void ManifestFetcher::DidFinishLoading(uint64_t) {
DCHECK(!completed_);
completed_ = true;
std::move(callback_).Run(response_, data_.ToString());
data_.Clear();
}
void ManifestFetcher::DidFail(const ResourceError& error) {
if (!callback_)
return;
data_.Clear();
std::move(callback_).Run(response_, String());
}
void ManifestFetcher::DidFailRedirectCheck() {
DidFail(ResourceError::Failure(NullURL()));
}
void ManifestFetcher::Trace(Visitor* visitor) const {
visitor->Trace(loader_);
ThreadableLoaderClient::Trace(visitor);
}
} // namespace blink