Skip to content

Commit

Permalink
Move the site characteristics db to its own feature
Browse files Browse the repository at this point in the history
Bug: 773382
Change-Id: I0fc43eac062edcf1f9d0a6059f88e0768f1de880
Reviewed-on: https://chromium-review.googlesource.com/1081467
Reviewed-by: François Doray <fdoray@chromium.org>
Reviewed-by: Chris Hamilton <chrisha@chromium.org>
Commit-Queue: Sébastien Marchand <sebmarchand@chromium.org>
Cr-Commit-Position: refs/heads/master@{#563699}
  • Loading branch information
sebmarchand authored and Commit Bot committed Jun 1, 2018
1 parent 1f38887 commit 699e71a
Show file tree
Hide file tree
Showing 10 changed files with 213 additions and 125 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -84,30 +84,30 @@ void LocalSiteCharacteristicsDataImpl::NotifyLoadedSiteForegrounded() {

SiteFeatureUsage LocalSiteCharacteristicsDataImpl::UpdatesFaviconInBackground()
const {
return GetFeatureUsage(site_characteristics_.updates_favicon_in_background(),
GetStaticProactiveTabFreezeAndDiscardParams()
.favicon_update_observation_window);
return GetFeatureUsage(
site_characteristics_.updates_favicon_in_background(),
GetSiteCharacteristicsDatabaseParams().favicon_update_observation_window);
}

SiteFeatureUsage LocalSiteCharacteristicsDataImpl::UpdatesTitleInBackground()
const {
return GetFeatureUsage(site_characteristics_.updates_title_in_background(),
GetStaticProactiveTabFreezeAndDiscardParams()
.title_update_observation_window);
return GetFeatureUsage(
site_characteristics_.updates_title_in_background(),
GetSiteCharacteristicsDatabaseParams().title_update_observation_window);
}

SiteFeatureUsage LocalSiteCharacteristicsDataImpl::UsesAudioInBackground()
const {
return GetFeatureUsage(site_characteristics_.uses_audio_in_background(),
GetStaticProactiveTabFreezeAndDiscardParams()
.audio_usage_observation_window);
return GetFeatureUsage(
site_characteristics_.uses_audio_in_background(),
GetSiteCharacteristicsDatabaseParams().audio_usage_observation_window);
}

SiteFeatureUsage
LocalSiteCharacteristicsDataImpl::UsesNotificationsInBackground() const {
return GetFeatureUsage(
site_characteristics_.uses_notifications_in_background(),
GetStaticProactiveTabFreezeAndDiscardParams()
GetSiteCharacteristicsDatabaseParams()
.notifications_usage_observation_window);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ TEST_F(LocalSiteCharacteristicsDataImplTest, BasicTestEndToEnd) {

// Advance the clock by a time lower than the miniumum observation time for
// the audio feature.
test_clock_.Advance(GetStaticProactiveTabFreezeAndDiscardParams()
test_clock_.Advance(GetStaticSiteCharacteristicsDatabaseParams()
.audio_usage_observation_window -
base::TimeDelta::FromSeconds(1));

Expand Down Expand Up @@ -192,7 +192,7 @@ TEST_F(LocalSiteCharacteristicsDataImplTest, BasicTestEndToEnd) {

// Advance the clock and make sure that notifications feature gets
// reported as unused.
test_clock_.Advance(GetStaticProactiveTabFreezeAndDiscardParams()
test_clock_.Advance(GetStaticSiteCharacteristicsDatabaseParams()
.notifications_usage_observation_window);
EXPECT_EQ(SiteFeatureUsage::kSiteFeatureNotInUse,
local_site_data->UsesNotificationsInBackground());
Expand Down Expand Up @@ -246,7 +246,7 @@ TEST_F(LocalSiteCharacteristicsDataImplTest, GetFeatureUsageForUnloadedSite) {
local_site_data->NotifyLoadedSiteBackgrounded();
local_site_data->NotifyUsesAudioInBackground();

test_clock_.Advance(GetStaticProactiveTabFreezeAndDiscardParams()
test_clock_.Advance(GetStaticSiteCharacteristicsDatabaseParams()
.notifications_usage_observation_window -
base::TimeDelta::FromSeconds(1));
EXPECT_EQ(SiteFeatureUsage::kSiteFeatureInUse,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ constexpr char kSiteCharacteristicsDirectoryName[] =
LocalSiteCharacteristicsDataStore::LocalSiteCharacteristicsDataStore(
Profile* profile)
: history_observer_(this) {
DCHECK(base::FeatureList::IsEnabled(features::kProactiveTabFreezeAndDiscard));
DCHECK(base::FeatureList::IsEnabled(features::kSiteCharacteristicsDatabase));

database_ = std::make_unique<LevelDBSiteCharacteristicsDatabase>(
profile->GetPath().AppendASCII(kSiteCharacteristicsDirectoryName));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ namespace resource_coordinator {
// static
SiteCharacteristicsDataStore*
LocalSiteCharacteristicsDataStoreFactory::GetForProfile(Profile* profile) {
if (base::FeatureList::IsEnabled(features::kProactiveTabFreezeAndDiscard)) {
if (base::FeatureList::IsEnabled(features::kSiteCharacteristicsDatabase)) {
return static_cast<SiteCharacteristicsDataStore*>(
GetInstance()->GetServiceForBrowserContext(profile, true));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ class LocalSiteCharacteristicsDataStoreFactoryTest

void SetUp() override {
scoped_feature_list_.InitAndEnableFeature(
features::kProactiveTabFreezeAndDiscard);
features::kSiteCharacteristicsDatabase);
InProcessBrowserTest::SetUp();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ class LocalSiteCharacteristicsDataStoreTest : public ::testing::Test {
LocalSiteCharacteristicsDataStoreTest()
: scoped_set_tick_clock_for_testing_(&test_clock_) {
scoped_feature_list_.InitAndEnableFeature(
features::kProactiveTabFreezeAndDiscard);
features::kSiteCharacteristicsDatabase);
data_store_ =
std::make_unique<LocalSiteCharacteristicsDataStore>(&profile_);
test_clock_.SetNowTicks(base::TimeTicks::UnixEpoch());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ using LocalSiteCharacteristicsNonRecordingDataStoreTest = ::testing::Test;
TEST_F(LocalSiteCharacteristicsNonRecordingDataStoreTest, EndToEnd) {
base::test::ScopedFeatureList scoped_feature_list;
scoped_feature_list.InitAndEnableFeature(
features::kProactiveTabFreezeAndDiscard);
features::kSiteCharacteristicsDatabase);
content::TestBrowserThreadBundle test_browser_thread_bundle;
TestingProfile profile;
const char kTestOrigin[] = "http://www.foo.com";
Expand Down
105 changes: 66 additions & 39 deletions chrome/browser/resource_coordinator/tab_manager_features.cc
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ const base::Feature kCustomizedTabLoadTimeout{
const base::Feature kProactiveTabFreezeAndDiscard{
"ProactiveTabFreezeAndDiscard", base::FEATURE_DISABLED_BY_DEFAULT};

// Enables the site characteristics database.
const base::Feature kSiteCharacteristicsDatabase{
"SiteCharacteristicsDatabase", base::FEATURE_DISABLED_BY_DEFAULT};

// Enables delaying the navigation of background tabs in order to improve
// foreground tab's user experience.
const base::Feature kStaggeredBackgroundTabOpening{
Expand Down Expand Up @@ -86,15 +90,17 @@ const char kProactiveTabFreezeAndDiscard_ModerateOccludedTimeoutParam[] =
"ModerateOccludedTimeoutSeconds";
const char kProactiveTabFreezeAndDiscard_HighOccludedTimeoutParam[] =
"HighOccludedTimeoutSeconds";
const char kProactiveTabFreezeAndDiscard_FaviconUpdateObservationWindow[] =
const char kProactiveTabFreezeAndDiscard_FreezeTimeout[] = "FreezeTimeout";

// Field-trial parameter names for the site characteristics database.
const char kSiteCharacteristicsDb_FaviconUpdateObservationWindow[] =
"FaviconUpdateObservationWindow";
const char kProactiveTabFreezeAndDiscard_TitleUpdateObservationWindow[] =
const char kSiteCharacteristicsDb_TitleUpdateObservationWindow[] =
"TitleUpdateObservationWindow";
const char kProactiveTabFreezeAndDiscard_AudioUsageObservationWindow[] =
const char kSiteCharacteristicsDb_AudioUsageObservationWindow[] =
"AudioUsageObservationWindow";
const char kProactiveTabFreezeAndDiscard_NotificationsUsageObservationWindow[] =
const char kSiteCharacteristicsDb_NotificationsUsageObservationWindow[] =
"NotificationsUsageObservationWindow";
const char kProactiveTabFreezeAndDiscard_FreezeTimeout[] = "FreezeTimeout";

// Default values for ProactiveTabFreezeAndDiscardParams.
const bool kProactiveTabFreezeAndDiscard_ShouldProactivelyDiscardDefault =
Expand Down Expand Up @@ -123,28 +129,36 @@ const base::TimeDelta
base::TimeDelta::FromHours(1);
const base::TimeDelta kProactiveTabFreezeAndDiscard_HighOccludedTimeoutDefault =
base::TimeDelta::FromMinutes(10);
const base::TimeDelta kProactiveTabFreezeAndDiscard_FreezeTimeout_Default =
base::TimeDelta::FromMinutes(10);

// Default values for SiteCharacteristicsDatabaseParams.
//
// Observations windows have a default value of 2 hours, 95% of backgrounded
// tabs don't use any of these features in this time window.
const base::TimeDelta
kProactiveTabFreezeAndDiscard_FaviconUpdateObservationWindow_Default =
kSiteCharacteristicsDb_FaviconUpdateObservationWindow_Default =
base::TimeDelta::FromHours(2);
const base::TimeDelta
kProactiveTabFreezeAndDiscard_TitleUpdateObservationWindow_Default =
kSiteCharacteristicsDb_TitleUpdateObservationWindow_Default =
base::TimeDelta::FromHours(2);
const base::TimeDelta
kProactiveTabFreezeAndDiscard_AudioUsageObservationWindow_Default =
kSiteCharacteristicsDb_AudioUsageObservationWindow_Default =
base::TimeDelta::FromHours(2);
const base::TimeDelta
kProactiveTabFreezeAndDiscard_NotificationsUsageObservationWindow_Default =
kSiteCharacteristicsDb_NotificationsUsageObservationWindow_Default =
base::TimeDelta::FromHours(2);
const base::TimeDelta kProactiveTabFreezeAndDiscard_FreezeTimeout_Default =
base::TimeDelta::FromMinutes(10);

ProactiveTabFreezeAndDiscardParams::ProactiveTabFreezeAndDiscardParams() =
default;
ProactiveTabFreezeAndDiscardParams::ProactiveTabFreezeAndDiscardParams(
const ProactiveTabFreezeAndDiscardParams& rhs) = default;

SiteCharacteristicsDatabaseParams::SiteCharacteristicsDatabaseParams() =
default;
SiteCharacteristicsDatabaseParams::SiteCharacteristicsDatabaseParams(
const SiteCharacteristicsDatabaseParams& rhs) = default;

ProactiveTabFreezeAndDiscardParams GetProactiveTabFreezeAndDiscardParams(
int memory_in_gb) {
ProactiveTabFreezeAndDiscardParams params = {};
Expand Down Expand Up @@ -189,34 +203,6 @@ ProactiveTabFreezeAndDiscardParams GetProactiveTabFreezeAndDiscardParams(
kProactiveTabFreezeAndDiscard_HighOccludedTimeoutDefault
.InSeconds()));

params.favicon_update_observation_window =
base::TimeDelta::FromSeconds(base::GetFieldTrialParamByFeatureAsInt(
features::kProactiveTabFreezeAndDiscard,
kProactiveTabFreezeAndDiscard_FaviconUpdateObservationWindow,
kProactiveTabFreezeAndDiscard_FaviconUpdateObservationWindow_Default
.InSeconds()));

params.title_update_observation_window =
base::TimeDelta::FromSeconds(base::GetFieldTrialParamByFeatureAsInt(
features::kProactiveTabFreezeAndDiscard,
kProactiveTabFreezeAndDiscard_TitleUpdateObservationWindow,
kProactiveTabFreezeAndDiscard_TitleUpdateObservationWindow_Default
.InSeconds()));

params.audio_usage_observation_window =
base::TimeDelta::FromSeconds(base::GetFieldTrialParamByFeatureAsInt(
features::kProactiveTabFreezeAndDiscard,
kProactiveTabFreezeAndDiscard_AudioUsageObservationWindow,
kProactiveTabFreezeAndDiscard_AudioUsageObservationWindow_Default
.InSeconds()));

params.notifications_usage_observation_window =
base::TimeDelta::FromSeconds(base::GetFieldTrialParamByFeatureAsInt(
features::kProactiveTabFreezeAndDiscard,
kProactiveTabFreezeAndDiscard_NotificationsUsageObservationWindow,
kProactiveTabFreezeAndDiscard_NotificationsUsageObservationWindow_Default
.InSeconds()));

params.freeze_timeout =
base::TimeDelta::FromSeconds(base::GetFieldTrialParamByFeatureAsInt(
features::kProactiveTabFreezeAndDiscard,
Expand Down Expand Up @@ -244,4 +230,45 @@ base::TimeDelta GetTabLoadTimeout(const base::TimeDelta& default_timeout) {
return base::TimeDelta::FromMilliseconds(timeout_in_ms);
}

SiteCharacteristicsDatabaseParams GetSiteCharacteristicsDatabaseParams() {
SiteCharacteristicsDatabaseParams params = {};

params.favicon_update_observation_window =
base::TimeDelta::FromSeconds(base::GetFieldTrialParamByFeatureAsInt(
features::kSiteCharacteristicsDatabase,
kSiteCharacteristicsDb_FaviconUpdateObservationWindow,
kSiteCharacteristicsDb_FaviconUpdateObservationWindow_Default
.InSeconds()));

params.title_update_observation_window =
base::TimeDelta::FromSeconds(base::GetFieldTrialParamByFeatureAsInt(
features::kSiteCharacteristicsDatabase,
kSiteCharacteristicsDb_TitleUpdateObservationWindow,
kSiteCharacteristicsDb_TitleUpdateObservationWindow_Default
.InSeconds()));

params.audio_usage_observation_window =
base::TimeDelta::FromSeconds(base::GetFieldTrialParamByFeatureAsInt(
features::kSiteCharacteristicsDatabase,
kSiteCharacteristicsDb_AudioUsageObservationWindow,
kSiteCharacteristicsDb_AudioUsageObservationWindow_Default
.InSeconds()));

params.notifications_usage_observation_window =
base::TimeDelta::FromSeconds(base::GetFieldTrialParamByFeatureAsInt(
features::kSiteCharacteristicsDatabase,
kSiteCharacteristicsDb_NotificationsUsageObservationWindow,
kSiteCharacteristicsDb_NotificationsUsageObservationWindow_Default
.InSeconds()));

return params;
}

const SiteCharacteristicsDatabaseParams&
GetStaticSiteCharacteristicsDatabaseParams() {
static base::NoDestructor<SiteCharacteristicsDatabaseParams> params(
GetSiteCharacteristicsDatabaseParams());
return *params;
}

} // namespace resource_coordinator
73 changes: 48 additions & 25 deletions chrome/browser/resource_coordinator/tab_manager_features.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ namespace features {

extern const base::Feature kCustomizedTabLoadTimeout;
extern const base::Feature kProactiveTabFreezeAndDiscard;
extern const base::Feature kSiteCharacteristicsDatabase;
extern const base::Feature kStaggeredBackgroundTabOpening;
extern const base::Feature kStaggeredBackgroundTabOpeningExperiment;
extern const base::Feature kTabRanker;
Expand All @@ -32,15 +33,16 @@ extern const char kProactiveTabFreezeAndDiscard_HighLoadedTabCountParam[];
extern const char kProactiveTabFreezeAndDiscard_LowOccludedTimeoutParam[];
extern const char kProactiveTabFreezeAndDiscard_ModerateOccludedTimeoutParam[];
extern const char kProactiveTabFreezeAndDiscard_HighOccludedTimeoutParam[];
extern const char
kProactiveTabFreezeAndDiscard_FaviconUpdateObservationWindow[];
extern const char kProactiveTabFreezeAndDiscard_TitleUpdateObservationWindow[];
extern const char kProactiveTabFreezeAndDiscard_AudioUsageObservationWindow[];
extern const char
kProactiveTabFreezeAndDiscard_NotificationsUsageObservationWindow[];
extern const char kProactiveTabFreezeAndDiscard_FreezeTimeout[];

// Default values of parameters related to proactive discarding.
// Variations parameter names related to the site characteristics database.
// See ProactiveTabFreezeAndDiscardsParams for details.
extern const char kSiteCharacteristicsDb_FaviconUpdateObservationWindow[];
extern const char kSiteCharacteristicsDb_TitleUpdateObservationWindow[];
extern const char kSiteCharacteristicsDb_AudioUsageObservationWindow[];
extern const char kSiteCharacteristicsDb_NotificationsUsageObservationWindow[];

// Default values of parameters related to the site characteristics database.
// See ProactiveTabFreezeAndDiscardsParams for details.
extern const bool kProactiveTabFreezeAndDiscard_ShouldProactivelyDiscardDefault;
extern const uint32_t kProactiveTabFreezeAndDiscard_LowLoadedTabCountDefault;
Expand All @@ -54,17 +56,20 @@ extern const base::TimeDelta
extern const base::TimeDelta
kProactiveTabFreezeAndDiscard_HighOccludedTimeoutDefault;
extern const base::TimeDelta
kProactiveTabFreezeAndDiscard_FaviconUpdateObservationWindow_Default;
kProactiveTabFreezeAndDiscard_FreezeTimeout_Default;

// Default values of parameters related to the site characteristics database.
// See SiteCharacteristicsDatabaseParams for details.
extern const base::TimeDelta
kProactiveTabFreezeAndDiscard_TitleUpdateObservationWindow_Default;
kSiteCharacteristicsDb_FaviconUpdateObservationWindow_Default;
extern const base::TimeDelta
kProactiveTabFreezeAndDiscard_AudioUsageObservationWindow_Default;
kSiteCharacteristicsDb_TitleUpdateObservationWindow_Default;
extern const base::TimeDelta
kProactiveTabFreezeAndDiscard_NotificationsUsageObservationWindow_Default;
kSiteCharacteristicsDb_AudioUsageObservationWindow_Default;
extern const base::TimeDelta
kProactiveTabFreezeAndDiscard_FreezeTimeout_Default;
kSiteCharacteristicsDb_NotificationsUsageObservationWindow_Default;

// Parameters used by the proactive tab freezing and discarding feature.
// Parameters used by the proactive tab discarding feature.
//
// Proactive discarding has 5 key parameters:
//
Expand All @@ -91,16 +96,6 @@ extern const base::TimeDelta
// proactive discarding will occur), and when in the excessive state the timeout
// is zero (discarding will occur immediately).
//
// Proactive tab discarding decisions are also based on whether or not a tab
// might use some features, a feature is considered as unused if it hasn't been
// used for a sufficiently long period of time while the tab was backgrounded.
// There's currently 4 features we're interested in:
//
// - Favicon update
// - Title update
// - Audio usage
// - Notifications usage
//
// This logic is independent of urgent discarding, which may embark when things
// are sufficiently bad. Similarly, manual or extension driven discards can
// override this logic. Finally, proactive discarding can only discard occluded
Expand Down Expand Up @@ -140,6 +135,26 @@ struct ProactiveTabFreezeAndDiscardParams {
// Amount of time a tab must be occluded before eligible for proactive
// discard when the tab count state is HIGH.
base::TimeDelta high_occluded_timeout;
// Amount of time a tab must be occluded before it is frozen.
base::TimeDelta freeze_timeout;
};

// Parameters used by the site characteristics database.
//
// The site characteristics database tracks tab usage of a some features, a tab,
// a feature is considered as unused if it hasn't been used for a sufficiently
// long period of time while the tab was backgrounded. There's currently 4
// features we're interested in:
//
// - Favicon update
// - Title update
// - Audio usage
// - Notifications usage
struct SiteCharacteristicsDatabaseParams {
SiteCharacteristicsDatabaseParams();
SiteCharacteristicsDatabaseParams(
const SiteCharacteristicsDatabaseParams& rhs);

// Minimum observation window before considering that this website doesn't
// update its favicon while in background.
base::TimeDelta favicon_update_observation_window;
Expand All @@ -152,8 +167,6 @@ struct ProactiveTabFreezeAndDiscardParams {
// Minimum observation window before considering that this website doesn't
// use notifications while in background.
base::TimeDelta notifications_usage_observation_window;
// Amount of time a tab must be occluded before it is frozen.
base::TimeDelta freeze_timeout;
};

// Gets parameters for the proactive tab discarding feature. This does no
Expand All @@ -170,6 +183,16 @@ GetStaticProactiveTabFreezeAndDiscardParams();

base::TimeDelta GetTabLoadTimeout(const base::TimeDelta& default_timeout);

// Gets parameters for the site characteristics database feature. This does no
// parameter validation, and sets the default values if the feature is not
// enabled.
SiteCharacteristicsDatabaseParams GetSiteCharacteristicsDatabaseParams();

// Return a static SiteCharacteristicsDatabaseParams object that can be used by
// all the classes that need one.
const SiteCharacteristicsDatabaseParams&
GetStaticSiteCharacteristicsDatabaseParams();

} // namespace resource_coordinator

#endif // CHROME_BROWSER_RESOURCE_COORDINATOR_TAB_MANAGER_FEATURES_H_
Loading

0 comments on commit 699e71a

Please sign in to comment.