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

Side by Side Diff: chrome/browser/android/browsing_data/browsing_data_bridge.cc

Issue 2756173002: Move code about browsing data from PrefServiceBridge to BrowsingDataBridge. (Closed)
Patch Set: fix comments Created 3 years, 9 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
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/android/browsing_data/browsing_data_bridge.h"
6
7 #include <jni.h>
8 #include <stddef.h>
9
10 #include <memory>
11 #include <set>
12 #include <string>
13 #include <vector>
14
15 #include "base/android/jni_android.h"
16 #include "base/android/jni_array.h"
17 #include "base/android/jni_string.h"
18 #include "base/android/jni_weak_ref.h"
19 #include "base/metrics/histogram_macros.h"
20 #include "base/scoped_observer.h"
21 #include "base/values.h"
22 #include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
23 #include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h"
24 #include "chrome/browser/engagement/important_sites_util.h"
25 #include "chrome/browser/history/web_history_service_factory.h"
26 #include "chrome/browser/profiles/profile_manager.h"
27 #include "chrome/browser/sync/profile_sync_service_factory.h"
28 #include "chrome/common/channel_info.h"
29 #include "components/browser_sync/profile_sync_service.h"
30 #include "components/browsing_data/core/history_notice_utils.h"
31 #include "components/prefs/pref_service.h"
32 #include "content/public/browser/browsing_data_filter_builder.h"
33 #include "jni/BrowsingDataBridge_jni.h"
34
35 using base::android::AttachCurrentThread;
36 using base::android::JavaParamRef;
37 using base::android::JavaRef;
38 using base::android::ScopedJavaLocalRef;
39 using base::android::ScopedJavaGlobalRef;
40
41 namespace {
42
43 const size_t kMaxImportantSites = 5;
44
45 Profile* GetOriginalProfile() {
46 return ProfileManager::GetActiveUserProfile()->GetOriginalProfile();
47 }
48
49 // Merges |task_count| BrowsingDataRemover completion callbacks and redirects
50 // them back into Java.
51 class ClearBrowsingDataObserver : public BrowsingDataRemover::Observer {
52 public:
53 // |obj| is expected to be the object passed into ClearBrowsingData(); e.g. a
54 // ChromePreference.
55 ClearBrowsingDataObserver(JNIEnv* env,
56 jobject obj,
57 BrowsingDataRemover* browsing_data_remover,
58 int task_count)
59 : task_count_(task_count),
60 weak_chrome_native_preferences_(env, obj),
61 observer_(this) {
62 DCHECK_GT(task_count, 0);
63 observer_.Add(browsing_data_remover);
64 }
65
66 void OnBrowsingDataRemoverDone() override {
67 DCHECK(task_count_);
68 if (--task_count_)
69 return;
70
71 // We delete ourselves when done.
72 std::unique_ptr<ClearBrowsingDataObserver> auto_delete(this);
73
74 JNIEnv* env = AttachCurrentThread();
75 if (weak_chrome_native_preferences_.get(env).is_null())
76 return;
77
78 Java_BrowsingDataBridge_browsingDataCleared(
79 env, weak_chrome_native_preferences_.get(env));
80 }
81
82 private:
83 int task_count_;
84 JavaObjectWeakGlobalRef weak_chrome_native_preferences_;
85 ScopedObserver<BrowsingDataRemover, BrowsingDataRemover::Observer> observer_;
86 };
87
88 } // namespace
89
90 bool RegisterBrowsingDataBridge(JNIEnv* env) {
91 return RegisterNativesImpl(env);
92 }
93
94 static void ClearBrowsingData(
95 JNIEnv* env,
96 const JavaParamRef<jobject>& obj,
97 const JavaParamRef<jintArray>& data_types,
98 jint time_period,
99 const JavaParamRef<jobjectArray>& jexcluding_domains,
100 const JavaParamRef<jintArray>& jexcluding_domain_reasons,
101 const JavaParamRef<jobjectArray>& jignoring_domains,
102 const JavaParamRef<jintArray>& jignoring_domain_reasons) {
103 BrowsingDataRemover* browsing_data_remover =
104 BrowsingDataRemoverFactory::GetForBrowserContext(GetOriginalProfile());
105
106 std::vector<int> data_types_vector;
107 base::android::JavaIntArrayToIntVector(env, data_types, &data_types_vector);
108
109 int remove_mask = 0;
110 for (const int data_type : data_types_vector) {
111 switch (static_cast<browsing_data::BrowsingDataType>(data_type)) {
112 case browsing_data::BrowsingDataType::HISTORY:
113 remove_mask |= ChromeBrowsingDataRemoverDelegate::DATA_TYPE_HISTORY;
114 break;
115 case browsing_data::BrowsingDataType::CACHE:
116 remove_mask |= BrowsingDataRemover::DATA_TYPE_CACHE;
117 break;
118 case browsing_data::BrowsingDataType::COOKIES:
119 remove_mask |= BrowsingDataRemover::DATA_TYPE_COOKIES;
120 remove_mask |= ChromeBrowsingDataRemoverDelegate::DATA_TYPE_SITE_DATA;
121 break;
122 case browsing_data::BrowsingDataType::PASSWORDS:
123 remove_mask |= ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PASSWORDS;
124 break;
125 case browsing_data::BrowsingDataType::FORM_DATA:
126 remove_mask |= ChromeBrowsingDataRemoverDelegate::DATA_TYPE_FORM_DATA;
127 break;
128 case browsing_data::BrowsingDataType::BOOKMARKS:
129 // Bookmarks are deleted separately on the Java side.
130 NOTREACHED();
131 break;
132 case browsing_data::BrowsingDataType::NUM_TYPES:
133 NOTREACHED();
134 }
135 }
136 std::vector<std::string> excluding_domains;
137 std::vector<int32_t> excluding_domain_reasons;
138 std::vector<std::string> ignoring_domains;
139 std::vector<int32_t> ignoring_domain_reasons;
140 base::android::AppendJavaStringArrayToStringVector(
141 env, jexcluding_domains.obj(), &excluding_domains);
142 base::android::JavaIntArrayToIntVector(env, jexcluding_domain_reasons.obj(),
143 &excluding_domain_reasons);
144 base::android::AppendJavaStringArrayToStringVector(
145 env, jignoring_domains.obj(), &ignoring_domains);
146 base::android::JavaIntArrayToIntVector(env, jignoring_domain_reasons.obj(),
147 &ignoring_domain_reasons);
148 std::unique_ptr<content::BrowsingDataFilterBuilder> filter_builder(
149 content::BrowsingDataFilterBuilder::Create(
150 content::BrowsingDataFilterBuilder::BLACKLIST));
151 for (const std::string& domain : excluding_domains) {
152 filter_builder->AddRegisterableDomain(domain);
153 }
154
155 if (!excluding_domains.empty() || !ignoring_domains.empty()) {
156 ImportantSitesUtil::RecordBlacklistedAndIgnoredImportantSites(
157 GetOriginalProfile(), excluding_domains, excluding_domain_reasons,
158 ignoring_domains, ignoring_domain_reasons);
159 }
160
161 // Delete the types protected by Important Sites with a filter,
162 // and the rest completely.
163 int filterable_mask =
164 remove_mask &
165 ChromeBrowsingDataRemoverDelegate::IMPORTANT_SITES_DATA_TYPES;
166 int nonfilterable_mask =
167 remove_mask &
168 ~ChromeBrowsingDataRemoverDelegate::IMPORTANT_SITES_DATA_TYPES;
169
170 // ClearBrowsingDataObserver deletes itself when |browsing_data_remover| is
171 // done with both removal tasks.
172 ClearBrowsingDataObserver* observer = new ClearBrowsingDataObserver(
173 env, obj, browsing_data_remover, 2 /* tasks_count */);
174
175 browsing_data::TimePeriod period =
176 static_cast<browsing_data::TimePeriod>(time_period);
177 browsing_data::RecordDeletionForPeriod(period);
178
179 if (filterable_mask) {
180 browsing_data_remover->RemoveWithFilterAndReply(
181 browsing_data::CalculateBeginDeleteTime(period),
182 browsing_data::CalculateEndDeleteTime(period), filterable_mask,
183 BrowsingDataRemover::ORIGIN_TYPE_UNPROTECTED_WEB,
184 std::move(filter_builder), observer);
185 } else {
186 // Make sure |observer| doesn't wait for the filtered task.
187 observer->OnBrowsingDataRemoverDone();
188 }
189
190 if (nonfilterable_mask) {
191 browsing_data_remover->RemoveAndReply(
192 browsing_data::CalculateBeginDeleteTime(period),
193 browsing_data::CalculateEndDeleteTime(period), nonfilterable_mask,
194 BrowsingDataRemover::ORIGIN_TYPE_UNPROTECTED_WEB, observer);
195 } else {
196 // Make sure |observer| doesn't wait for the non-filtered task.
197 observer->OnBrowsingDataRemoverDone();
198 }
199 }
200
201 static void ShowNoticeAboutOtherFormsOfBrowsingHistory(
202 const JavaRef<jobject>& listener,
203 bool show) {
204 JNIEnv* env = AttachCurrentThread();
205 UMA_HISTOGRAM_BOOLEAN(
206 "History.ClearBrowsingData.HistoryNoticeShownInFooterWhenUpdated", show);
207 if (!show)
208 return;
209 Java_OtherFormsOfBrowsingHistoryListener_showNoticeAboutOtherFormsOfBrowsingHi story(
210 env, listener);
211 }
212
213 static void EnableDialogAboutOtherFormsOfBrowsingHistory(
214 const JavaRef<jobject>& listener,
215 bool enabled) {
216 JNIEnv* env = AttachCurrentThread();
217 if (!enabled)
218 return;
219 Java_OtherFormsOfBrowsingHistoryListener_enableDialogAboutOtherFormsOfBrowsing History(
220 env, listener);
221 }
222
223 static void RequestInfoAboutOtherFormsOfBrowsingHistory(
224 JNIEnv* env,
225 const JavaParamRef<jobject>& obj,
226 const JavaParamRef<jobject>& listener) {
227 // The permanent notice in the footer.
228 browsing_data::ShouldShowNoticeAboutOtherFormsOfBrowsingHistory(
229 ProfileSyncServiceFactory::GetForProfile(GetOriginalProfile()),
230 WebHistoryServiceFactory::GetForProfile(GetOriginalProfile()),
231 base::Bind(&ShowNoticeAboutOtherFormsOfBrowsingHistory,
232 ScopedJavaGlobalRef<jobject>(env, listener)));
233
234 // The one-time notice in the dialog.
235 browsing_data::ShouldPopupDialogAboutOtherFormsOfBrowsingHistory(
236 ProfileSyncServiceFactory::GetForProfile(GetOriginalProfile()),
237 WebHistoryServiceFactory::GetForProfile(GetOriginalProfile()),
238 chrome::GetChannel(),
239 base::Bind(&EnableDialogAboutOtherFormsOfBrowsingHistory,
240 ScopedJavaGlobalRef<jobject>(env, listener)));
241 }
242
243 static void FetchImportantSites(JNIEnv* env,
244 const JavaParamRef<jclass>& clazz,
245 const JavaParamRef<jobject>& java_callback) {
246 Profile* profile = GetOriginalProfile();
247 std::vector<ImportantSitesUtil::ImportantDomainInfo> important_sites =
248 ImportantSitesUtil::GetImportantRegisterableDomains(profile,
249 kMaxImportantSites);
250 bool dialog_disabled = ImportantSitesUtil::IsDialogDisabled(profile);
251
252 std::vector<std::string> important_domains;
253 std::vector<int32_t> important_domain_reasons;
254 std::vector<std::string> important_domain_examples;
255 for (const ImportantSitesUtil::ImportantDomainInfo& info : important_sites) {
256 important_domains.push_back(info.registerable_domain);
257 important_domain_reasons.push_back(info.reason_bitfield);
258 important_domain_examples.push_back(info.example_origin.spec());
259 }
260
261 ScopedJavaLocalRef<jobjectArray> java_domains =
262 base::android::ToJavaArrayOfStrings(env, important_domains);
263 ScopedJavaLocalRef<jintArray> java_reasons =
264 base::android::ToJavaIntArray(env, important_domain_reasons);
265 ScopedJavaLocalRef<jobjectArray> java_origins =
266 base::android::ToJavaArrayOfStrings(env, important_domain_examples);
267
268 Java_ImportantSitesCallback_onImportantRegisterableDomainsReady(
269 env, java_callback.obj(), java_domains.obj(), java_origins.obj(),
270 java_reasons.obj(), dialog_disabled);
271 }
272
273 // This value should not change during a sessions, as it's used for UMA metrics.
274 static jint GetMaxImportantSites(JNIEnv* env,
275 const JavaParamRef<jclass>& clazz) {
276 return kMaxImportantSites;
277 }
278
279 static void MarkOriginAsImportantForTesting(
280 JNIEnv* env,
281 const JavaParamRef<jclass>& clazz,
282 const JavaParamRef<jstring>& jorigin) {
283 GURL origin(base::android::ConvertJavaStringToUTF8(jorigin));
284 CHECK(origin.is_valid());
285 ImportantSitesUtil::MarkOriginAsImportantForTesting(GetOriginalProfile(),
286 origin);
287 }
OLDNEW
« no previous file with comments | « chrome/browser/android/browsing_data/browsing_data_bridge.h ('k') | chrome/browser/android/chrome_jni_registrar.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698