Index: chrome/browser/subresource_filter/chrome_subresource_filter_client.cc |
diff --git a/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc b/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc |
index 43b8eb5776dedf75084cfbcb99045e15b49d8f39..b77cdc962795ed87d5915adda5a9bb69210a9d66 100644 |
--- a/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc |
+++ b/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc |
@@ -6,7 +6,10 @@ |
#include <string> |
+#include "base/memory/ptr_util.h" |
#include "base/metrics/histogram_macros.h" |
+#include "base/time/default_clock.h" |
+#include "base/values.h" |
#include "chrome/browser/content_settings/host_content_settings_map_factory.h" |
#include "chrome/browser/content_settings/tab_specific_content_settings.h" |
#include "chrome/browser/infobars/infobar_service.h" |
@@ -16,9 +19,22 @@ |
#include "components/content_settings/core/browser/host_content_settings_map.h" |
#include "components/content_settings/core/common/content_settings_types.h" |
+namespace { |
+ |
+// Key into the website setting dict for the smart UI. |
+const char kUILastShowTime[] = "LastShowTime"; |
+ |
+// Number of hours before showing the UI again on a domain. |
+// TODO(csharrison): Consider setting this via a finch param. |
+const int kUIShowThresholdHours = 24; |
engedy
2017/04/04 13:35:59
nit: constexpr base::TimeDelta k...Threshold = bas
Charlie Harrison
2017/04/10 14:58:53
Done.
|
+ |
+} // namespace |
+ |
ChromeSubresourceFilterClient::ChromeSubresourceFilterClient( |
content::WebContents* web_contents) |
- : web_contents_(web_contents), shown_for_navigation_(false) { |
+ : clock_(base::MakeUnique<base::DefaultClock>(base::DefaultClock())), |
+ web_contents_(web_contents), |
+ shown_for_navigation_(false) { |
DCHECK(web_contents); |
// Ensure the content settings observer is initialized. |
SubresourceFilterContentSettingsObserverFactory::EnsureForProfile( |
@@ -28,24 +44,28 @@ ChromeSubresourceFilterClient::ChromeSubresourceFilterClient( |
ChromeSubresourceFilterClient::~ChromeSubresourceFilterClient() {} |
void ChromeSubresourceFilterClient::ToggleNotificationVisibility( |
+ const GURL& url, |
engedy
2017/04/04 13:35:59
nit: Have you considered simply using web_contents
Charlie Harrison
2017/04/10 14:58:53
Ahh, much better :) Done.
|
bool visibility) { |
if (shown_for_navigation_ && visibility) |
return; |
- |
- shown_for_navigation_ = visibility; |
- TabSpecificContentSettings* content_settings = |
- TabSpecificContentSettings::FromWebContents(web_contents_); |
+ shown_for_navigation_ = false; |
// |visibility| is false when a new navigation starts. |
if (visibility) { |
- content_settings->OnContentBlocked( |
- CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER); |
- LogAction(kActionUIShown); |
+ if (!ShouldShowUIForSite(url)) { |
+ LogAction(kActionUISuppressed); |
+ return; |
+ } |
#if defined(OS_ANDROID) |
InfoBarService* infobar_service = |
InfoBarService::FromWebContents(web_contents_); |
SubresourceFilterInfobarDelegate::Create(infobar_service); |
#endif |
+ TabSpecificContentSettings* content_settings = |
+ TabSpecificContentSettings::FromWebContents(web_contents_); |
+ content_settings->OnContentBlocked( |
+ CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER); |
+ OnUIShown(url); |
} else { |
LogAction(kActionNavigationStarted); |
} |
@@ -53,18 +73,16 @@ void ChromeSubresourceFilterClient::ToggleNotificationVisibility( |
bool ChromeSubresourceFilterClient::IsWhitelistedByContentSettings( |
const GURL& url) { |
- return GetContentSettingForUrl(url) == CONTENT_SETTING_BLOCK; |
+ ContentSetting setting = GetSettingsMap()->GetContentSetting( |
+ url, url, ContentSettingsType::CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER, |
+ std::string()); |
+ return setting == CONTENT_SETTING_BLOCK; |
} |
void ChromeSubresourceFilterClient::WhitelistByContentSettings( |
const GURL& url) { |
// Whitelist via content settings. |
- Profile* profile = |
- Profile::FromBrowserContext(web_contents_->GetBrowserContext()); |
- DCHECK(profile); |
- HostContentSettingsMap* settings_map = |
- HostContentSettingsMapFactory::GetForProfile(profile); |
- settings_map->SetContentSettingDefaultScope( |
+ GetSettingsMap()->SetContentSettingDefaultScope( |
url, url, ContentSettingsType::CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER, |
std::string(), CONTENT_SETTING_BLOCK); |
@@ -77,14 +95,57 @@ void ChromeSubresourceFilterClient::LogAction(SubresourceFilterAction action) { |
kActionLastEntry); |
} |
-ContentSetting ChromeSubresourceFilterClient::GetContentSettingForUrl( |
- const GURL& url) { |
+bool ChromeSubresourceFilterClient::UsingSmartUI() const { |
engedy
2017/04/04 13:35:59
nit: How about calling this ShouldUseSmartUI?
Charlie Harrison
2017/04/10 14:58:53
Done.
|
+#if defined(OS_ANDROID) |
+ return true; |
+#else |
+ return false; |
+#endif |
+} |
+ |
+HostContentSettingsMap* ChromeSubresourceFilterClient::GetSettingsMap() const { |
engedy
2017/04/04 13:35:59
nit: Can we make this a global function in an anon
Charlie Harrison
2017/04/10 14:58:53
Would prefer not to since we'd need to inject the
engedy
2017/04/12 14:02:50
Acknowledged.
|
Profile* profile = |
Profile::FromBrowserContext(web_contents_->GetBrowserContext()); |
DCHECK(profile); |
HostContentSettingsMap* settings_map = |
HostContentSettingsMapFactory::GetForProfile(profile); |
- return settings_map->GetContentSetting( |
- url, url, ContentSettingsType::CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER, |
- std::string()); |
+ DCHECK(settings_map); |
+ return settings_map; |
+} |
+ |
+void ChromeSubresourceFilterClient::OnUIShown(const GURL& url) { |
+ LogAction(kActionUIShown); |
+ shown_for_navigation_ = true; |
+ |
+ if (!UsingSmartUI()) |
+ return; |
+ auto dict = base::MakeUnique<base::DictionaryValue>(); |
+ double now = clock_->Now().ToDoubleT(); |
+ dict->SetDouble(kUILastShowTime, now); |
+ GetSettingsMap()->SetWebsiteSettingDefaultScope( |
+ url, url, |
engedy
2017/04/04 13:35:59
For REQUESTING_ORIGIN_ONLY_SCOPE website settings,
Charlie Harrison
2017/04/10 14:58:53
Done.
|
+ ContentSettingsType::CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER_DATA, |
+ std::string(), std::move(dict)); |
+} |
+ |
+bool ChromeSubresourceFilterClient::ShouldShowUIForSite(const GURL& url) const { |
+ if (!UsingSmartUI()) |
+ return true; |
+ |
+ std::unique_ptr<base::DictionaryValue> dict = |
+ base::DictionaryValue::From(GetSettingsMap()->GetWebsiteSetting( |
+ url, url, CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER_DATA, |
+ std::string(), nullptr)); |
+ if (!dict) |
+ return true; |
+ |
+ double last_shown_time_double = 0; |
+ if (dict->GetDouble(kUILastShowTime, &last_shown_time_double)) { |
+ base::Time last_shown = base::Time::FromDoubleT(last_shown_time_double); |
+ if (clock_->Now() - last_shown < |
+ base::TimeDelta::FromHours(kUIShowThresholdHours)) { |
+ return false; |
+ } |
+ } |
+ return true; |
} |