OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/banners/app_banner_settings_helper.h" | 5 #include "chrome/browser/banners/app_banner_settings_helper.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
11 #include "base/metrics/field_trial.h" | 11 #include "base/metrics/field_trial.h" |
12 #include "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" |
13 #include "base/strings/string_split.h" | |
14 #include "chrome/browser/banners/app_banner_data_fetcher.h" | 13 #include "chrome/browser/banners/app_banner_data_fetcher.h" |
15 #include "chrome/browser/banners/app_banner_metrics.h" | 14 #include "chrome/browser/banners/app_banner_metrics.h" |
16 #include "chrome/browser/browser_process.h" | 15 #include "chrome/browser/browser_process.h" |
17 #include "chrome/browser/profiles/profile.h" | 16 #include "chrome/browser/profiles/profile.h" |
18 #include "chrome/common/chrome_switches.h" | 17 #include "chrome/common/chrome_switches.h" |
19 #include "components/content_settings/core/browser/host_content_settings_map.h" | 18 #include "components/content_settings/core/browser/host_content_settings_map.h" |
20 #include "components/content_settings/core/common/content_settings_pattern.h" | 19 #include "components/content_settings/core/common/content_settings_pattern.h" |
21 #include "components/rappor/rappor_utils.h" | 20 #include "components/rappor/rappor_utils.h" |
22 #include "content/public/browser/web_contents.h" | 21 #include "content/public/browser/web_contents.h" |
23 #include "net/base/escape.h" | 22 #include "net/base/escape.h" |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
103 if (ui::PageTransitionCoreTypeIs(transition_type, | 102 if (ui::PageTransitionCoreTypeIs(transition_type, |
104 ui::PAGE_TRANSITION_TYPED) || | 103 ui::PAGE_TRANSITION_TYPED) || |
105 ui::PageTransitionCoreTypeIs(transition_type, | 104 ui::PageTransitionCoreTypeIs(transition_type, |
106 ui::PAGE_TRANSITION_GENERATED)) { | 105 ui::PAGE_TRANSITION_GENERATED)) { |
107 return kDirectNavigationEngagement; | 106 return kDirectNavigationEngagement; |
108 } else { | 107 } else { |
109 return kIndirectNavigationEnagagement; | 108 return kIndirectNavigationEnagagement; |
110 } | 109 } |
111 } | 110 } |
112 | 111 |
113 // Queries a field trial for updates to the default engagement values assigned | |
114 // to direct and indirect navigations. | |
115 void UpdateEngagementWeights() { | |
116 // Expect a field trial value of "X:Y", where X is the direct engagement | |
117 // value and Y is the indirect engagement value. | |
118 std::string weights = | |
119 base::FieldTrialList::FindFullName("AppBannersEngagementWeights"); | |
120 if (weights.empty()) | |
121 return; | |
122 | |
123 std::vector<std::string> tokens = base::SplitString( | |
124 weights, ":", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); | |
125 if (tokens.size() == 2) { | |
126 double direct_engagement = -1; | |
127 double indirect_engagement = -1; | |
128 | |
129 // Ensure that we get valid doubles from the field trial, and that both | |
130 // values are greater than or equal to zero and less than or equal to the | |
131 // total engagement required to trigger the banner. | |
132 if (base::StringToDouble(tokens[0], &direct_engagement) && | |
133 base::StringToDouble(tokens[1], &indirect_engagement) && | |
134 direct_engagement >= 0 && indirect_engagement >= 0 && | |
135 direct_engagement <= kTotalEngagementToTrigger && | |
136 indirect_engagement <= kTotalEngagementToTrigger) { | |
137 AppBannerSettingsHelper::SetEngagementWeights(direct_engagement, | |
138 indirect_engagement); | |
139 } | |
140 } | |
141 } | |
142 | |
143 // Queries a field trial for updates to the default number of minutes between | |
144 // site visits counted for the purposes of displaying a banner. | |
145 void UpdateMinutesBetweenVisits() { | |
146 std::string minutes_between_visits = | |
147 base::FieldTrialList::FindFullName("AppBannersMinutesBetweenVisits"); | |
148 if (minutes_between_visits.empty()) | |
149 return; | |
150 | |
151 int minimum_minutes = 0; | |
152 if (base::StringToInt(minutes_between_visits, &minimum_minutes)) | |
153 AppBannerSettingsHelper::SetMinimumMinutesBetweenVisits(minimum_minutes); | |
154 } | |
155 | |
156 } // namespace | 112 } // namespace |
157 | 113 |
158 void AppBannerSettingsHelper::ClearHistoryForURLs( | 114 void AppBannerSettingsHelper::ClearHistoryForURLs( |
159 Profile* profile, | 115 Profile* profile, |
160 const std::set<GURL>& origin_urls) { | 116 const std::set<GURL>& origin_urls) { |
161 HostContentSettingsMap* settings = profile->GetHostContentSettingsMap(); | 117 HostContentSettingsMap* settings = profile->GetHostContentSettingsMap(); |
162 for (const GURL& origin_url : origin_urls) { | 118 for (const GURL& origin_url : origin_urls) { |
163 ContentSettingsPattern pattern(ContentSettingsPattern::FromURL(origin_url)); | 119 ContentSettingsPattern pattern(ContentSettingsPattern::FromURL(origin_url)); |
164 if (!pattern.IsValid()) | 120 if (!pattern.IsValid()) |
165 continue; | 121 continue; |
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
493 | 449 |
494 // Given a time, returns that time scoped to the nearest minute resolution | 450 // Given a time, returns that time scoped to the nearest minute resolution |
495 // locally. For example, if the resolution is one hour, this function will | 451 // locally. For example, if the resolution is one hour, this function will |
496 // return the time to the closest (previous) hour in the local time zone. | 452 // return the time to the closest (previous) hour in the local time zone. |
497 base::Time AppBannerSettingsHelper::BucketTimeToResolution( | 453 base::Time AppBannerSettingsHelper::BucketTimeToResolution( |
498 base::Time time, | 454 base::Time time, |
499 unsigned int minutes) { | 455 unsigned int minutes) { |
500 // Only support resolutions smaller than or equal to one day. Enforce | 456 // Only support resolutions smaller than or equal to one day. Enforce |
501 // that resolutions divide evenly into one day. Otherwise, default to a | 457 // that resolutions divide evenly into one day. Otherwise, default to a |
502 // day resolution (each time converted to midnight local time). | 458 // day resolution (each time converted to midnight local time). |
503 if (minutes == 0 || minutes >= kNumberOfMinutesInADay || | 459 if (minutes == 0 || minutes > kNumberOfMinutesInADay || |
504 kNumberOfMinutesInADay % minutes != 0) { | 460 kNumberOfMinutesInADay % minutes != 0) { |
505 return time.LocalMidnight(); | 461 return time.LocalMidnight(); |
506 } | 462 } |
507 | 463 |
508 // Extract the number of minutes past midnight in local time. Divide that | 464 // Extract the number of minutes past midnight in local time. Divide that |
509 // number by the resolution size, and return the time converted to local | 465 // number by the resolution size, and return the time converted to local |
510 // midnight with the resulting truncated number added. | 466 // midnight with the resulting truncated number added. |
511 base::Time::Exploded exploded; | 467 base::Time::Exploded exploded; |
512 time.LocalExplode(&exploded); | 468 time.LocalExplode(&exploded); |
513 int total_minutes = exploded.hour * 60 + exploded.minute; | 469 int total_minutes = exploded.hour * 60 + exploded.minute; |
514 | 470 |
515 // Use truncating integer division here. | 471 // Use truncating integer division here. |
516 return time.LocalMidnight() + | 472 return time.LocalMidnight() + |
517 base::TimeDelta::FromMinutes((total_minutes / minutes) * minutes); | 473 base::TimeDelta::FromMinutes((total_minutes / minutes) * minutes); |
518 } | 474 } |
519 | 475 |
520 void AppBannerSettingsHelper::UpdateFromFieldTrial() { | 476 void AppBannerSettingsHelper::UpdateMinutesBetweenVisits() { |
521 UpdateEngagementWeights(); | 477 std::string minutes_between_visits = |
522 UpdateMinutesBetweenVisits(); | 478 base::FieldTrialList::FindFullName("AppBannersMinutesBetweenVisits"); |
| 479 int minimum_minutes = 0; |
| 480 if (base::StringToInt(minutes_between_visits, &minimum_minutes)) |
| 481 AppBannerSettingsHelper::SetMinimumMinutesBetweenVisits(minimum_minutes); |
523 } | 482 } |
OLD | NEW |