blob: 9603f03d3b7046d90c46ac08c9a182559a130b46 [file] [log] [blame]
// Copyright 2017 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 COMPONENTS_PREVIEWS_CONTENT_PREVIEWS_OPTIMIZATION_GUIDE_H_
#define COMPONENTS_PREVIEWS_CONTENT_PREVIEWS_OPTIMIZATION_GUIDE_H_
#include <string>
#include <vector>
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/sequenced_task_runner.h"
#include "base/single_thread_task_runner.h"
#include "components/optimization_guide/optimization_guide_service.h"
#include "components/optimization_guide/optimization_guide_service_observer.h"
#include "components/previews/content/previews_optimization_guide.h"
#include "components/previews/core/previews_experiments.h"
#include "url/gurl.h"
namespace optimization_guide {
namespace proto {
class Configuration;
} // namespace proto
} // namespace optimization_guide
namespace previews {
class PreviewsHints;
class PreviewsUserData;
using ResourceLoadingHintsCallback = base::OnceCallback<void(
const GURL& document_gurl,
const std::vector<std::string>& resource_patterns_to_block)>;
// A Previews optimization guide that makes decisions guided by hints received
// from the OptimizationGuideService.
class PreviewsOptimizationGuide
: public optimization_guide::OptimizationGuideServiceObserver {
public:
// The embedder guarantees |optimization_guide_service| outlives |this|.
PreviewsOptimizationGuide(
optimization_guide::OptimizationGuideService* optimization_guide_service,
const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner);
~PreviewsOptimizationGuide() override;
// Returns whether |type| is whitelisted for |url|.|previews_data| can be
// modified.
// Virtual so it can be mocked in tests.
virtual bool IsWhitelisted(PreviewsUserData* previews_data,
const GURL& url,
PreviewsType type) const;
// Returns whether |type| is blacklisted for |url|.
// Virtual so it can be mocked in tests.
virtual bool IsBlacklisted(const GURL& url, PreviewsType type) const;
// Returns whether |request| may have associated optimization hints
// (specifically, PageHints). If so, but the hints are not available
// synchronously, this method will request that they be loaded (from disk or
// network).
bool MaybeLoadOptimizationHints(const GURL& url,
ResourceLoadingHintsCallback callback);
// Logs UMA for whether the OptimizationGuide HintCache has a matching Hint
// guidance for |url|. This is useful for measuring the effectiveness of the
// page hints provided by Cacao.
void LogHintCacheMatch(const GURL& url,
bool is_committed,
net::EffectiveConnectionType ect) const;
// optimization_guide::OptimizationGuideServiceObserver implementation:
void OnHintsProcessed(
const optimization_guide::proto::Configuration& config,
const optimization_guide::ComponentInfo& component_info) override;
private:
// Updates the hints to the latest hints sent by the Component Updater.
void UpdateHints(std::unique_ptr<PreviewsHints> hints);
// Handles a loaded hint. It checks if the |loaded_hint| has any page hint
// that apply to |doucment_url|. If so, it looks for any applicable resource
// loading hints and will call |callback| with the applicable resource loading
// details if found.
void OnLoadedHint(ResourceLoadingHintsCallback callback,
const GURL& document_url,
const optimization_guide::proto::Hint& loaded_hint) const;
// The OptimizationGuideService that this guide is listening to. Not owned.
optimization_guide::OptimizationGuideService* optimization_guide_service_;
// Runner for IO thread tasks.
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
// Background thread where hints processing should be performed.
scoped_refptr<base::SequencedTaskRunner> background_task_runner_;
// The current hints used for this optimization guide.
std::unique_ptr<PreviewsHints> hints_;
// Used to get |weak_ptr_| to self on the IO thread.
base::WeakPtrFactory<PreviewsOptimizationGuide> io_weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(PreviewsOptimizationGuide);
};
} // namespace previews
#endif // COMPONENTS_PREVIEWS_CONTENT_PREVIEWS_OPTIMIZATION_GUIDE_H_