Commit a4b45392 authored by Sophie Chang's avatar Sophie Chang Committed by Commit Bot

Integrate prediction manager into optimization guide keyed service

Bug: 1001194
Change-Id: I91e678bf04c15864618ec69fa1e2fa20c6c43af3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1848153
Commit-Queue: Sophie Chang <sophiechang@chromium.org>
Reviewed-by: default avatarTarun Bansal <tbansal@chromium.org>
Reviewed-by: default avatarMichael Crouse <mcrouse@chromium.org>
Cr-Commit-Position: refs/heads/master@{#704445}
parent 71e33341
...@@ -693,7 +693,7 @@ void OptimizationGuideHintsManager::OnHintLoaded( ...@@ -693,7 +693,7 @@ void OptimizationGuideHintsManager::OnHintLoaded(
} }
void OptimizationGuideHintsManager::RegisterOptimizationTypes( void OptimizationGuideHintsManager::RegisterOptimizationTypes(
std::vector<optimization_guide::proto::OptimizationType> const std::vector<optimization_guide::proto::OptimizationType>&
optimization_types) { optimization_types) {
bool should_load_new_optimization_filter = false; bool should_load_new_optimization_filter = false;
for (const auto optimization_type : optimization_types) { for (const auto optimization_type : optimization_types) {
......
...@@ -89,7 +89,7 @@ class OptimizationGuideHintsManager ...@@ -89,7 +89,7 @@ class OptimizationGuideHintsManager
// Registers the optimization types that have the potential for hints to be // Registers the optimization types that have the potential for hints to be
// called by consumers of the Optimization Guide. // called by consumers of the Optimization Guide.
void RegisterOptimizationTypes( void RegisterOptimizationTypes(
std::vector<optimization_guide::proto::OptimizationType> const std::vector<optimization_guide::proto::OptimizationType>&
optimization_types); optimization_types);
// Returns whether there have been any optimization types registered. // Returns whether there have been any optimization types registered.
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "chrome/browser/optimization_guide/optimization_guide_session_statistic.h" #include "chrome/browser/optimization_guide/optimization_guide_session_statistic.h"
#include "chrome/browser/optimization_guide/optimization_guide_top_host_provider.h" #include "chrome/browser/optimization_guide/optimization_guide_top_host_provider.h"
#include "chrome/browser/optimization_guide/optimization_guide_web_contents_observer.h" #include "chrome/browser/optimization_guide/optimization_guide_web_contents_observer.h"
#include "chrome/browser/optimization_guide/prediction/prediction_manager.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "components/leveldb_proto/public/proto_database_provider.h" #include "components/leveldb_proto/public/proto_database_provider.h"
#include "components/optimization_guide/command_line_top_host_provider.h" #include "components/optimization_guide/command_line_top_host_provider.h"
...@@ -143,6 +144,8 @@ void OptimizationGuideKeyedService::Initialize( ...@@ -143,6 +144,8 @@ void OptimizationGuideKeyedService::Initialize(
database_provider, top_host_provider_.get(), database_provider, top_host_provider_.get(),
content::BrowserContext::GetDefaultStoragePartition(profile) content::BrowserContext::GetDefaultStoragePartition(profile)
->GetURLLoaderFactoryForBrowserProcess()); ->GetURLLoaderFactoryForBrowserProcess());
prediction_manager_ =
std::make_unique<optimization_guide::PredictionManager>();
} }
void OptimizationGuideKeyedService::MaybeLoadHintForNavigation( void OptimizationGuideKeyedService::MaybeLoadHintForNavigation(
...@@ -155,12 +158,15 @@ void OptimizationGuideKeyedService::MaybeLoadHintForNavigation( ...@@ -155,12 +158,15 @@ void OptimizationGuideKeyedService::MaybeLoadHintForNavigation(
} }
} }
void OptimizationGuideKeyedService::RegisterOptimizationTypes( void OptimizationGuideKeyedService::RegisterOptimizationTypesAndTargets(
std::vector<optimization_guide::proto::OptimizationType> const std::vector<optimization_guide::proto::OptimizationType>&
optimization_types) { optimization_types,
const std::vector<optimization_guide::proto::OptimizationTarget>&
optimization_targets) {
DCHECK(hints_manager_); DCHECK(hints_manager_);
DCHECK(prediction_manager_);
hints_manager_->RegisterOptimizationTypes(optimization_types); hints_manager_->RegisterOptimizationTypes(optimization_types);
prediction_manager_->RegisterOptimizationTargets(optimization_targets);
} }
optimization_guide::OptimizationGuideDecision optimization_guide::OptimizationGuideDecision
...@@ -198,10 +204,6 @@ void OptimizationGuideKeyedService::Shutdown() { ...@@ -198,10 +204,6 @@ void OptimizationGuideKeyedService::Shutdown() {
} }
void OptimizationGuideKeyedService::UpdateSessionFCP(base::TimeDelta fcp) { void OptimizationGuideKeyedService::UpdateSessionFCP(base::TimeDelta fcp) {
// TODO(crbug/1001194): This will be passed to the if (prediction_manager_)
// OptimizationGuidePredictionManager that will own the FCP session prediction_manager_->UpdateFCPSessionStatistics(fcp);
// statistics.
if (!session_fcp_)
session_fcp_ = std::make_unique<OptimizationGuideSessionStatistic>();
session_fcp_->AddSample(static_cast<float>(fcp.InMilliseconds()));
} }
...@@ -31,10 +31,10 @@ class ProtoDatabaseProvider; ...@@ -31,10 +31,10 @@ class ProtoDatabaseProvider;
namespace optimization_guide { namespace optimization_guide {
class OptimizationGuideService; class OptimizationGuideService;
class TopHostProvider; class TopHostProvider;
class PredictionManager;
} // namespace optimization_guide } // namespace optimization_guide
class OptimizationGuideHintsManager; class OptimizationGuideHintsManager;
class OptimizationGuideSessionStatistic;
class OptimizationGuideKeyedService class OptimizationGuideKeyedService
: public KeyedService, : public KeyedService,
...@@ -60,6 +60,10 @@ class OptimizationGuideKeyedService ...@@ -60,6 +60,10 @@ class OptimizationGuideKeyedService
return top_host_provider_.get(); return top_host_provider_.get();
} }
optimization_guide::PredictionManager* GetPredictionManager() {
return prediction_manager_.get();
}
// Prompts the load of the hint for the navigation, if there is at least one // Prompts the load of the hint for the navigation, if there is at least one
// optimization type registered and there is a hint available. // optimization type registered and there is a hint available.
void MaybeLoadHintForNavigation(content::NavigationHandle* navigation_handle); void MaybeLoadHintForNavigation(content::NavigationHandle* navigation_handle);
...@@ -68,9 +72,11 @@ class OptimizationGuideKeyedService ...@@ -68,9 +72,11 @@ class OptimizationGuideKeyedService
void ClearData(); void ClearData();
// optimization_guide::OptimizationGuideDecider implementation: // optimization_guide::OptimizationGuideDecider implementation:
void RegisterOptimizationTypes( void RegisterOptimizationTypesAndTargets(
std::vector<optimization_guide::proto::OptimizationType> const std::vector<optimization_guide::proto::OptimizationType>&
optimization_types) override; optimization_types,
const std::vector<optimization_guide::proto::OptimizationTarget>&
optimization_targets) override;
optimization_guide::OptimizationGuideDecision CanApplyOptimization( optimization_guide::OptimizationGuideDecision CanApplyOptimization(
content::NavigationHandle* navigation_handle, content::NavigationHandle* navigation_handle,
optimization_guide::proto::OptimizationTarget optimization_target, optimization_guide::proto::OptimizationTarget optimization_target,
...@@ -80,21 +86,18 @@ class OptimizationGuideKeyedService ...@@ -80,21 +86,18 @@ class OptimizationGuideKeyedService
// KeyedService implementation: // KeyedService implementation:
void Shutdown() override; void Shutdown() override;
// Update |session_fcp_| with the provided fcp value. // Updates |prediction_manager_| with the provided fcp value.
void UpdateSessionFCP(base::TimeDelta fcp); void UpdateSessionFCP(base::TimeDelta fcp);
OptimizationGuideSessionStatistic* GetSessionFCPForTesting() const {
return session_fcp_.get();
}
private: private:
content::BrowserContext* browser_context_; content::BrowserContext* browser_context_;
// Manages the storing, loading, and fetching of hints. // Manages the storing, loading, and fetching of hints.
std::unique_ptr<OptimizationGuideHintsManager> hints_manager_; std::unique_ptr<OptimizationGuideHintsManager> hints_manager_;
// The current session's FCP statistics for HTTP/HTTPS navigations. // Manages the storing, loading, and evaluating of optimization target
std::unique_ptr<OptimizationGuideSessionStatistic> session_fcp_; // prediction models.
std::unique_ptr<optimization_guide::PredictionManager> prediction_manager_;
// The top host provider to use for fetching information for the user's top // The top host provider to use for fetching information for the user's top
// hosts. Will be null if the user has not consented to this type of browser // hosts. Will be null if the user has not consented to this type of browser
......
...@@ -181,7 +181,8 @@ class OptimizationGuideKeyedServiceBrowserTest ...@@ -181,7 +181,8 @@ class OptimizationGuideKeyedServiceBrowserTest
void RegisterWithKeyedService() { void RegisterWithKeyedService() {
OptimizationGuideKeyedServiceFactory::GetForProfile(browser()->profile()) OptimizationGuideKeyedServiceFactory::GetForProfile(browser()->profile())
->RegisterOptimizationTypes({optimization_guide::proto::NOSCRIPT}); ->RegisterOptimizationTypesAndTargets(
{optimization_guide::proto::NOSCRIPT}, /*optimization_targets=*/{});
} }
void PushHintsComponentAndWaitForCompletion() { void PushHintsComponentAndWaitForCompletion() {
......
...@@ -52,6 +52,10 @@ class PredictionManager ...@@ -52,6 +52,10 @@ class PredictionManager
// Updates |session_fcp_| and |previous_fcp_| with |fcp|. // Updates |session_fcp_| and |previous_fcp_| with |fcp|.
void UpdateFCPSessionStatistics(base::TimeDelta fcp); void UpdateFCPSessionStatistics(base::TimeDelta fcp);
OptimizationGuideSessionStatistic* GetFCPSessionStatisticsForTesting() const {
return const_cast<OptimizationGuideSessionStatistic*>(&session_fcp_);
}
// network::NetworkQualityTracker::EffectiveConnectionTypeObserver // network::NetworkQualityTracker::EffectiveConnectionTypeObserver
// implementation: // implementation:
void OnEffectiveConnectionTypeChanged( void OnEffectiveConnectionTypeChanged(
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h" #include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h"
#include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h" #include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h"
#include "chrome/browser/optimization_guide/optimization_guide_session_statistic.h" #include "chrome/browser/optimization_guide/optimization_guide_session_statistic.h"
#include "chrome/browser/optimization_guide/prediction/prediction_manager.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser.h"
#include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/in_process_browser_test.h"
...@@ -50,7 +51,9 @@ class PredictionManagerBrowserTest : public InProcessBrowserTest { ...@@ -50,7 +51,9 @@ class PredictionManagerBrowserTest : public InProcessBrowserTest {
void RegisterWithKeyedService() { void RegisterWithKeyedService() {
OptimizationGuideKeyedServiceFactory::GetForProfile(browser()->profile()) OptimizationGuideKeyedServiceFactory::GetForProfile(browser()->profile())
->RegisterOptimizationTypes({optimization_guide::proto::NOSCRIPT}); ->RegisterOptimizationTypesAndTargets(
{optimization_guide::proto::NOSCRIPT},
{optimization_guide::proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD});
} }
std::unique_ptr<page_load_metrics::PageLoadMetricsTestWaiter> std::unique_ptr<page_load_metrics::PageLoadMetricsTestWaiter>
...@@ -84,8 +87,9 @@ IN_PROC_BROWSER_TEST_F(PredictionManagerBrowserTest, ...@@ -84,8 +87,9 @@ IN_PROC_BROWSER_TEST_F(PredictionManagerBrowserTest,
ui_test_utils::NavigateToURL(browser(), https_url_with_content()); ui_test_utils::NavigateToURL(browser(), https_url_with_content());
waiter->Wait(); waiter->Wait();
OptimizationGuideSessionStatistic* session_fcp = const OptimizationGuideSessionStatistic* session_fcp =
keyed_service->GetSessionFCPForTesting(); keyed_service->GetPredictionManager()
->GetFCPSessionStatisticsForTesting();
EXPECT_TRUE(session_fcp); EXPECT_TRUE(session_fcp);
EXPECT_EQ(1u, session_fcp->GetNumberOfSamples()); EXPECT_EQ(1u, session_fcp->GetNumberOfSamples());
} }
...@@ -102,8 +106,9 @@ IN_PROC_BROWSER_TEST_F(PredictionManagerBrowserTest, ...@@ -102,8 +106,9 @@ IN_PROC_BROWSER_TEST_F(PredictionManagerBrowserTest,
ui_test_utils::NavigateToURL(browser(), https_url_with_content()); ui_test_utils::NavigateToURL(browser(), https_url_with_content());
waiter->Wait(); waiter->Wait();
OptimizationGuideSessionStatistic* session_fcp = const OptimizationGuideSessionStatistic* session_fcp =
keyed_service->GetSessionFCPForTesting(); keyed_service->GetPredictionManager()
->GetFCPSessionStatisticsForTesting();
float current_mean = session_fcp->GetMean(); float current_mean = session_fcp->GetMean();
waiter = CreatePageLoadMetricsTestWaiter(); waiter = CreatePageLoadMetricsTestWaiter();
......
...@@ -39,10 +39,12 @@ struct OptimizationMetadata { ...@@ -39,10 +39,12 @@ struct OptimizationMetadata {
class OptimizationGuideDecider { class OptimizationGuideDecider {
public: public:
// Registers the optimization types that intend to be queried during the // Registers the optimization types and targets that intend to be queried
// session. // during the session. It is expected for this to be called after the browser
virtual void RegisterOptimizationTypes( // has been initialized.
std::vector<proto::OptimizationType> optimization_types) = 0; virtual void RegisterOptimizationTypesAndTargets(
const std::vector<proto::OptimizationType>& optimization_types,
const std::vector<proto::OptimizationTarget>& optimization_targets) = 0;
// Returns whether the current conditions match |optimization_target| and // Returns whether the current conditions match |optimization_target| and
// |optimization_type| can be applied for the URL associated with // |optimization_type| can be applied for the URL associated with
......
...@@ -89,10 +89,11 @@ PreviewsOptimizationGuideDecider::PreviewsOptimizationGuideDecider( ...@@ -89,10 +89,11 @@ PreviewsOptimizationGuideDecider::PreviewsOptimizationGuideDecider(
registered_optimization_types_(GetOptimizationTypesToRegister()) { registered_optimization_types_(GetOptimizationTypesToRegister()) {
DCHECK(optimization_guide_decider_); DCHECK(optimization_guide_decider_);
optimization_guide_decider_->RegisterOptimizationTypes( optimization_guide_decider_->RegisterOptimizationTypesAndTargets(
std::vector<optimization_guide::proto::OptimizationType>( std::vector<optimization_guide::proto::OptimizationType>(
registered_optimization_types_.begin(), registered_optimization_types_.begin(),
registered_optimization_types_.end())); registered_optimization_types_.end()),
{optimization_guide::proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD});
} }
PreviewsOptimizationGuideDecider::~PreviewsOptimizationGuideDecider() = default; PreviewsOptimizationGuideDecider::~PreviewsOptimizationGuideDecider() = default;
......
...@@ -29,12 +29,18 @@ class TestOptimizationGuideDecider ...@@ -29,12 +29,18 @@ class TestOptimizationGuideDecider
TestOptimizationGuideDecider() = default; TestOptimizationGuideDecider() = default;
~TestOptimizationGuideDecider() override = default; ~TestOptimizationGuideDecider() override = default;
void RegisterOptimizationTypes( void RegisterOptimizationTypesAndTargets(
std::vector<optimization_guide::proto::OptimizationType> const std::vector<optimization_guide::proto::OptimizationType>&
optimization_types) override { optimization_types,
const std::vector<optimization_guide::proto::OptimizationTarget>&
optimization_targets) override {
registered_optimization_types_ = registered_optimization_types_ =
base::flat_set<optimization_guide::proto::OptimizationType>( base::flat_set<optimization_guide::proto::OptimizationType>(
optimization_types.begin(), optimization_types.end()); optimization_types.begin(), optimization_types.end());
registered_optimization_targets_ =
base::flat_set<optimization_guide::proto::OptimizationTarget>(
optimization_targets.begin(), optimization_targets.end());
} }
// Returns the optimization types registered with the Optimization Guide // Returns the optimization types registered with the Optimization Guide
...@@ -44,6 +50,13 @@ class TestOptimizationGuideDecider ...@@ -44,6 +50,13 @@ class TestOptimizationGuideDecider
return registered_optimization_types_; return registered_optimization_types_;
} }
// Returns the optimization targets registered with the Optimization Guide
// Decider.
base::flat_set<optimization_guide::proto::OptimizationTarget>
registered_optimization_targets() {
return registered_optimization_targets_;
}
optimization_guide::OptimizationGuideDecision CanApplyOptimization( optimization_guide::OptimizationGuideDecision CanApplyOptimization(
content::NavigationHandle* navigation_handle, content::NavigationHandle* navigation_handle,
optimization_guide::proto::OptimizationTarget optimization_target, optimization_guide::proto::OptimizationTarget optimization_target,
...@@ -81,6 +94,11 @@ class TestOptimizationGuideDecider ...@@ -81,6 +94,11 @@ class TestOptimizationGuideDecider
base::flat_set<optimization_guide::proto::OptimizationType> base::flat_set<optimization_guide::proto::OptimizationType>
registered_optimization_types_; registered_optimization_types_;
// The optimization targets that were registered with the Optimization Guide
// Decider.
base::flat_set<optimization_guide::proto::OptimizationTarget>
registered_optimization_targets_;
std::map<std::tuple<GURL, optimization_guide::proto::OptimizationType>, std::map<std::tuple<GURL, optimization_guide::proto::OptimizationType>,
std::tuple<optimization_guide::OptimizationGuideDecision, std::tuple<optimization_guide::OptimizationGuideDecision,
optimization_guide::OptimizationMetadata>> optimization_guide::OptimizationMetadata>>
...@@ -158,7 +176,7 @@ class PreviewsOptimizationGuideDeciderTest : public testing::Test { ...@@ -158,7 +176,7 @@ class PreviewsOptimizationGuideDeciderTest : public testing::Test {
}; };
TEST_F(PreviewsOptimizationGuideDeciderTest, TEST_F(PreviewsOptimizationGuideDeciderTest,
InitializationRegistersCorrectOptimizationTypes) { InitializationRegistersCorrectOptimizationTypesAndTargets) {
base::test::ScopedFeatureList scoped_feature_list; base::test::ScopedFeatureList scoped_feature_list;
scoped_feature_list.InitWithFeatures( scoped_feature_list.InitWithFeatures(
{previews::features::kLitePageServerPreviews, {previews::features::kLitePageServerPreviews,
...@@ -187,6 +205,17 @@ TEST_F(PreviewsOptimizationGuideDeciderTest, ...@@ -187,6 +205,17 @@ TEST_F(PreviewsOptimizationGuideDeciderTest,
EXPECT_TRUE(registered_optimization_types.find( EXPECT_TRUE(registered_optimization_types.find(
optimization_guide::proto::RESOURCE_LOADING) != optimization_guide::proto::RESOURCE_LOADING) !=
registered_optimization_types.end()); registered_optimization_types.end());
// We expect that the PAINFUL_PAGE_LOAD optimization target is always
// registered.
base::flat_set<optimization_guide::proto::OptimizationTarget>
registered_optimization_targets =
optimization_guide_decider()->registered_optimization_targets();
EXPECT_EQ(1u, registered_optimization_targets.size());
EXPECT_TRUE(
registered_optimization_targets.find(
optimization_guide::proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD) !=
registered_optimization_targets.end());
} }
TEST_F(PreviewsOptimizationGuideDeciderTest, TEST_F(PreviewsOptimizationGuideDeciderTest,
...@@ -218,6 +247,17 @@ TEST_F(PreviewsOptimizationGuideDeciderTest, ...@@ -218,6 +247,17 @@ TEST_F(PreviewsOptimizationGuideDeciderTest,
EXPECT_EQ(registered_optimization_types.find( EXPECT_EQ(registered_optimization_types.find(
optimization_guide::proto::RESOURCE_LOADING), optimization_guide::proto::RESOURCE_LOADING),
registered_optimization_types.end()); registered_optimization_types.end());
// We expect that the PAINFUL_PAGE_LOAD optimization target is always
// registered.
base::flat_set<optimization_guide::proto::OptimizationTarget>
registered_optimization_targets =
optimization_guide_decider()->registered_optimization_targets();
EXPECT_EQ(1u, registered_optimization_targets.size());
EXPECT_TRUE(
registered_optimization_targets.find(
optimization_guide::proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD) !=
registered_optimization_targets.end());
} }
TEST_F(PreviewsOptimizationGuideDeciderTest, TEST_F(PreviewsOptimizationGuideDeciderTest,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment