blob: 7c05277904af166e525db3e47178ea1d160de8c8 [file] [log] [blame]
// Copyright 2020 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.
#ifndef CHROME_RENDERER_SUBRESOURCE_REDIRECT_PUBLIC_IMAGE_HINTS_DECIDER_AGENT_H_
#define CHROME_RENDERER_SUBRESOURCE_REDIRECT_PUBLIC_IMAGE_HINTS_DECIDER_AGENT_H_
#include "base/containers/flat_set.h"
#include "base/macros.h"
#include "base/optional.h"
#include "base/timer/timer.h"
#include "chrome/renderer/subresource_redirect/public_resource_decider_agent.h"
#include "chrome/renderer/subresource_redirect/redirect_result.h"
#include "url/gurl.h"
namespace subresource_redirect {
// The decider agent implementation that allows image compression based on
// public image hints received. Only redirects public images for mainframes.
class PublicImageHintsDeciderAgent : public PublicResourceDeciderAgent {
public:
PublicImageHintsDeciderAgent(
blink::AssociatedInterfaceRegistry* associated_interfaces,
content::RenderFrame* render_frame);
~PublicImageHintsDeciderAgent() override;
PublicImageHintsDeciderAgent(const PublicImageHintsDeciderAgent&) = delete;
PublicImageHintsDeciderAgent& operator=(const PublicImageHintsDeciderAgent&) =
delete;
private:
friend class SubresourceRedirectPublicImageHintsDeciderAgentTest;
// content::RenderFrameObserver:
void DidStartNavigation(
const GURL& url,
base::Optional<blink::WebNavigationType> navigation_type) override;
void ReadyToCommitNavigation(
blink::WebDocumentLoader* document_loader) override;
void OnDestruct() override;
// mojom::SubresourceRedirectHintsReceiver:
void SetCompressPublicImagesHints(
mojom::CompressPublicImagesHintsPtr images_hints) override;
void SetLoggedInState(bool is_logged_in) override;
// PublicResourceDeciderAgent:
base::Optional<RedirectResult> ShouldRedirectSubresource(
const GURL& url,
ShouldRedirectDecisionCallback callback) override;
void RecordMetricsOnLoadFinished(const GURL& url,
int64_t content_length,
RedirectResult redirect_result) override;
void NotifyCompressedResourceFetchFailed(
base::TimeDelta retry_after) override;
bool IsMainFrame() const;
// Clears the image hint urls.
void ClearImageHints();
// Called when the hint receive timer expires to flush the metrics for
// resources that no hint has been received and clears
// |unavailable_image_hints_urls_|.
void OnHintsReceiveTimeout();
// Records the breakdown of bytes to UKM metrics.
void RecordMetrics(int64_t content_length,
RedirectResult redirect_result) const;
// Record the breakdown of bytes for unavailable image hints, whether the
// hints fetch timed out, the image was not in the delayed hints, or the
// image was in the delayed hints.
void RecordImageHintsUnavailableMetrics();
// The raw spec of image urls that are determined public, received from image
// hints. Will be base::nullopt after the navigation starts and until the
// hints have been received.
base::Optional<base::flat_set<std::string>> public_image_urls_;
// To trigger the timeout for the hints to be received from the time
// navigation starts.
base::OneShotTimer hint_receive_timeout_timer_;
// The urls and resource size of images that were not redirectable due to
// image hints were not unavailable at the time of image fetch. This list is
// kept until hints are received or hints retrieval times out. This is used
// for metrics purposes.
base::flat_set<std::pair<std::string, int64_t>> unavailable_image_hints_urls_;
};
} // namespace subresource_redirect
#endif // CHROME_RENDERER_SUBRESOURCE_REDIRECT_PUBLIC_IMAGE_HINTS_DECIDER_AGENT_H_