// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_SPECULATION_RULE_LOADER_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_SPECULATION_RULE_LOADER_H_

#include "base/time/time.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/platform/bindings/name_client.h"
#include "third_party/blink/renderer/platform/heap/member.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource_finish_observer.h"

namespace blink {

class Document;
class SpeculationRulesResource;

// This is used for Speculation-Rules header
class CORE_EXPORT SpeculationRuleLoader final : public ResourceFinishObserver,
                                                public NameClient {
 public:
  explicit SpeculationRuleLoader(Document& document);
  ~SpeculationRuleLoader() override;

  void Trace(Visitor*) const override;
  const char* GetHumanReadableName() const override {
    return "SpeculationRuleLoader";
  }
  String DebugName() const override { return "SpeculationRuleLoader"; }

  void LoadResource(SpeculationRulesResource*);

 private:
  void NotifyFinished() override;

  Member<Document> document_;
  Member<SpeculationRulesResource> resource_;
  base::TimeTicks start_time_;
};

}  // namespace blink

#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_SPECULATION_RULE_LOADER_H_
