Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(489)

Side by Side Diff: chrome/browser/subresource_filter/chrome_subresource_filter_client.cc

Issue 2795053002: [subresource_filter] Implement the "Smart" UI on Android (Closed)
Patch Set: fix tests Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/subresource_filter/chrome_subresource_filter_client.h" 5 #include "chrome/browser/subresource_filter/chrome_subresource_filter_client.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/memory/ptr_util.h"
9 #include "base/metrics/histogram_macros.h" 10 #include "base/metrics/histogram_macros.h"
11 #include "base/time/default_clock.h"
12 #include "base/values.h"
10 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" 13 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
11 #include "chrome/browser/content_settings/tab_specific_content_settings.h" 14 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
12 #include "chrome/browser/infobars/infobar_service.h" 15 #include "chrome/browser/infobars/infobar_service.h"
13 #include "chrome/browser/profiles/profile.h" 16 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/browser/subresource_filter/subresource_filter_content_settings_ observer_factory.h" 17 #include "chrome/browser/subresource_filter/subresource_filter_content_settings_ observer_factory.h"
15 #include "chrome/browser/ui/android/content_settings/subresource_filter_infobar_ delegate.h" 18 #include "chrome/browser/ui/android/content_settings/subresource_filter_infobar_ delegate.h"
16 #include "components/content_settings/core/browser/host_content_settings_map.h" 19 #include "components/content_settings/core/browser/host_content_settings_map.h"
17 #include "components/content_settings/core/common/content_settings_types.h" 20 #include "components/content_settings/core/common/content_settings_types.h"
18 21
22 namespace {
23
24 // Key into the website setting dict for the smart UI.
25 const char kUILastShowTime[] = "LastShowTime";
26
27 // Number of hours before showing the UI again on a domain.
28 // TODO(csharrison): Consider setting this via a finch param.
29 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.
30
31 } // namespace
32
19 ChromeSubresourceFilterClient::ChromeSubresourceFilterClient( 33 ChromeSubresourceFilterClient::ChromeSubresourceFilterClient(
20 content::WebContents* web_contents) 34 content::WebContents* web_contents)
21 : web_contents_(web_contents), shown_for_navigation_(false) { 35 : clock_(base::MakeUnique<base::DefaultClock>(base::DefaultClock())),
36 web_contents_(web_contents),
37 shown_for_navigation_(false) {
22 DCHECK(web_contents); 38 DCHECK(web_contents);
23 // Ensure the content settings observer is initialized. 39 // Ensure the content settings observer is initialized.
24 SubresourceFilterContentSettingsObserverFactory::EnsureForProfile( 40 SubresourceFilterContentSettingsObserverFactory::EnsureForProfile(
25 Profile::FromBrowserContext(web_contents_->GetBrowserContext())); 41 Profile::FromBrowserContext(web_contents_->GetBrowserContext()));
26 } 42 }
27 43
28 ChromeSubresourceFilterClient::~ChromeSubresourceFilterClient() {} 44 ChromeSubresourceFilterClient::~ChromeSubresourceFilterClient() {}
29 45
30 void ChromeSubresourceFilterClient::ToggleNotificationVisibility( 46 void ChromeSubresourceFilterClient::ToggleNotificationVisibility(
47 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.
31 bool visibility) { 48 bool visibility) {
32 if (shown_for_navigation_ && visibility) 49 if (shown_for_navigation_ && visibility)
33 return; 50 return;
34 51 shown_for_navigation_ = false;
35 shown_for_navigation_ = visibility;
36 TabSpecificContentSettings* content_settings =
37 TabSpecificContentSettings::FromWebContents(web_contents_);
38 52
39 // |visibility| is false when a new navigation starts. 53 // |visibility| is false when a new navigation starts.
40 if (visibility) { 54 if (visibility) {
41 content_settings->OnContentBlocked( 55 if (!ShouldShowUIForSite(url)) {
42 CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER); 56 LogAction(kActionUISuppressed);
43 LogAction(kActionUIShown); 57 return;
58 }
44 #if defined(OS_ANDROID) 59 #if defined(OS_ANDROID)
45 InfoBarService* infobar_service = 60 InfoBarService* infobar_service =
46 InfoBarService::FromWebContents(web_contents_); 61 InfoBarService::FromWebContents(web_contents_);
47 SubresourceFilterInfobarDelegate::Create(infobar_service); 62 SubresourceFilterInfobarDelegate::Create(infobar_service);
48 #endif 63 #endif
64 TabSpecificContentSettings* content_settings =
65 TabSpecificContentSettings::FromWebContents(web_contents_);
66 content_settings->OnContentBlocked(
67 CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER);
68 OnUIShown(url);
49 } else { 69 } else {
50 LogAction(kActionNavigationStarted); 70 LogAction(kActionNavigationStarted);
51 } 71 }
52 } 72 }
53 73
54 bool ChromeSubresourceFilterClient::IsWhitelistedByContentSettings( 74 bool ChromeSubresourceFilterClient::IsWhitelistedByContentSettings(
55 const GURL& url) { 75 const GURL& url) {
56 return GetContentSettingForUrl(url) == CONTENT_SETTING_BLOCK; 76 ContentSetting setting = GetSettingsMap()->GetContentSetting(
77 url, url, ContentSettingsType::CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER,
78 std::string());
79 return setting == CONTENT_SETTING_BLOCK;
57 } 80 }
58 81
59 void ChromeSubresourceFilterClient::WhitelistByContentSettings( 82 void ChromeSubresourceFilterClient::WhitelistByContentSettings(
60 const GURL& url) { 83 const GURL& url) {
61 // Whitelist via content settings. 84 // Whitelist via content settings.
62 Profile* profile = 85 GetSettingsMap()->SetContentSettingDefaultScope(
63 Profile::FromBrowserContext(web_contents_->GetBrowserContext());
64 DCHECK(profile);
65 HostContentSettingsMap* settings_map =
66 HostContentSettingsMapFactory::GetForProfile(profile);
67 settings_map->SetContentSettingDefaultScope(
68 url, url, ContentSettingsType::CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER, 86 url, url, ContentSettingsType::CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER,
69 std::string(), CONTENT_SETTING_BLOCK); 87 std::string(), CONTENT_SETTING_BLOCK);
70 88
71 LogAction(kActionContentSettingsBlockedFromUI); 89 LogAction(kActionContentSettingsBlockedFromUI);
72 } 90 }
73 91
74 // static 92 // static
75 void ChromeSubresourceFilterClient::LogAction(SubresourceFilterAction action) { 93 void ChromeSubresourceFilterClient::LogAction(SubresourceFilterAction action) {
76 UMA_HISTOGRAM_ENUMERATION("SubresourceFilter.Actions", action, 94 UMA_HISTOGRAM_ENUMERATION("SubresourceFilter.Actions", action,
77 kActionLastEntry); 95 kActionLastEntry);
78 } 96 }
79 97
80 ContentSetting ChromeSubresourceFilterClient::GetContentSettingForUrl( 98 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.
81 const GURL& url) { 99 #if defined(OS_ANDROID)
100 return true;
101 #else
102 return false;
103 #endif
104 }
105
106 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.
82 Profile* profile = 107 Profile* profile =
83 Profile::FromBrowserContext(web_contents_->GetBrowserContext()); 108 Profile::FromBrowserContext(web_contents_->GetBrowserContext());
84 DCHECK(profile); 109 DCHECK(profile);
85 HostContentSettingsMap* settings_map = 110 HostContentSettingsMap* settings_map =
86 HostContentSettingsMapFactory::GetForProfile(profile); 111 HostContentSettingsMapFactory::GetForProfile(profile);
87 return settings_map->GetContentSetting( 112 DCHECK(settings_map);
88 url, url, ContentSettingsType::CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER, 113 return settings_map;
89 std::string());
90 } 114 }
115
116 void ChromeSubresourceFilterClient::OnUIShown(const GURL& url) {
117 LogAction(kActionUIShown);
118 shown_for_navigation_ = true;
119
120 if (!UsingSmartUI())
121 return;
122 auto dict = base::MakeUnique<base::DictionaryValue>();
123 double now = clock_->Now().ToDoubleT();
124 dict->SetDouble(kUILastShowTime, now);
125 GetSettingsMap()->SetWebsiteSettingDefaultScope(
126 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.
127 ContentSettingsType::CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER_DATA,
128 std::string(), std::move(dict));
129 }
130
131 bool ChromeSubresourceFilterClient::ShouldShowUIForSite(const GURL& url) const {
132 if (!UsingSmartUI())
133 return true;
134
135 std::unique_ptr<base::DictionaryValue> dict =
136 base::DictionaryValue::From(GetSettingsMap()->GetWebsiteSetting(
137 url, url, CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER_DATA,
138 std::string(), nullptr));
139 if (!dict)
140 return true;
141
142 double last_shown_time_double = 0;
143 if (dict->GetDouble(kUILastShowTime, &last_shown_time_double)) {
144 base::Time last_shown = base::Time::FromDoubleT(last_shown_time_double);
145 if (clock_->Now() - last_shown <
146 base::TimeDelta::FromHours(kUIShowThresholdHours)) {
147 return false;
148 }
149 }
150 return true;
151 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698