blob: f3bedc29e56c2a0c6c2a64012ddc9bf4e2151605 [file] [log] [blame]
// Copyright 2021 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/core/html/parser/subresource_redirect_origins_preloader.h"
#include "third_party/blink/public/common/features.h"
#include "third_party/blink/renderer/core/frame/frame.h"
#include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/core/frame/local_frame_client.h"
#include "third_party/blink/renderer/platform/network/network_state_notifier.h"
#include "third_party/blink/renderer/platform/weborigin/kurl.h"
namespace blink {
// static
const char SubresourceRedirectOriginsPreloader::kSupplementName[] =
"SubresourceRedirectOriginsPreloader";
SubresourceRedirectOriginsPreloader* SubresourceRedirectOriginsPreloader::From(
Document& document) {
if (!base::FeatureList::IsEnabled(blink::features::kSubresourceRedirect) ||
!GetNetworkStateNotifier().SaveDataEnabled()) {
return nullptr;
}
SubresourceRedirectOriginsPreloader* preloader =
Supplement<Document>::From<SubresourceRedirectOriginsPreloader>(document);
if (!preloader) {
preloader =
MakeGarbageCollected<SubresourceRedirectOriginsPreloader>(document);
ProvideTo(document, preloader);
}
return preloader;
}
SubresourceRedirectOriginsPreloader::SubresourceRedirectOriginsPreloader(
Document& document)
: Supplement<Document>(document) {}
void SubresourceRedirectOriginsPreloader::Trace(Visitor* visitor) const {
Supplement<Document>::Trace(visitor);
}
void SubresourceRedirectOriginsPreloader::AddImagePreloadRequest(
const KURL& base_url,
const String& resource_url) {
KURL url = base_url.IsEmpty() ? GetSupplementable()->CompleteURL(resource_url)
: GetSupplementable()->CompleteURLWithOverride(
resource_url, base_url);
if (!url.IsValid())
return;
if (!url.ProtocolIsInHTTPFamily())
return;
auto origin = SecurityOrigin::Create(url);
if (origin->IsOpaque())
return;
origins_.insert(origin);
}
void SubresourceRedirectOriginsPreloader::PreloadOriginsNow() {
GetSupplementable()
->GetFrame()
->Client()
->PreloadSubresourceOptimizationsForOrigins(origins_);
origins_.clear();
}
} // namespace blink