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

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: rebase 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 // static
91 bool BrowsingDataBridge::Register(JNIEnv* env) {
92 return RegisterNativesImpl(env);
93 }
94
95 static void ClearBrowsingData(
96 JNIEnv* env,
97 const JavaParamRef<jobject>& obj,
98 const JavaParamRef<jintArray>& data_types,
99 jint time_period,
100 const JavaParamRef<jobjectArray>& jexcluding_domains,
101 const JavaParamRef<jintArray>& jexcluding_domain_reasons,
102 const JavaParamRef<jobjectArray>& jignoring_domains,
103 const JavaParamRef<jintArray>& jignoring_domain_reasons) {
104 BrowsingDataRemover* browsing_data_remover =
105 BrowsingDataRemoverFactory::GetForBrowserContext(GetOriginalProfile());
106
107 std::vector<int> data_types_vector;
108 base::android::JavaIntArrayToIntVector(env, data_types, &data_types_vector);
109
110 int remove_mask = 0;
111 for (const int data_type : data_types_vector) {
112 switch (static_cast<browsing_data::BrowsingDataType>(data_type)) {
113 case browsing_data::BrowsingDataType::HISTORY:
114 remove_mask |= ChromeBrowsingDataRemoverDelegate::DATA_TYPE_HISTORY;
115 break;
116 case browsing_data::BrowsingDataType::CACHE:
117 remove_mask |= BrowsingDataRemover::DATA_TYPE_CACHE;
118 break;
119 case browsing_data::BrowsingDataType::COOKIES:
120 remove_mask |= BrowsingDataRemover::DATA_TYPE_COOKIES;
121 remove_mask |= ChromeBrowsingDataRemoverDelegate::DATA_TYPE_SITE_DATA;
122 break;
123 case browsing_data::BrowsingDataType::PASSWORDS:
124 remove_mask |= ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PASSWORDS;
125 break;
126 case browsing_data::BrowsingDataType::FORM_DATA:
127 remove_mask |= ChromeBrowsingDataRemoverDelegate::DATA_TYPE_FORM_DATA;
128 break;
129 case browsing_data::BrowsingDataType::BOOKMARKS:
130 // Bookmarks are deleted separately on the Java side.
131 NOTREACHED();
132 break;
133 case browsing_data::BrowsingDataType::NUM_TYPES:
134 NOTREACHED();
135 }
136 }
137 std::vector<std::string> excluding_domains;
138 std::vector<int32_t> excluding_domain_reasons;
139 std::vector<std::string> ignoring_domains;
140 std::vector<int32_t> ignoring_domain_reasons;
141 base::android::AppendJavaStringArrayToStringVector(
142 env, jexcluding_domains.obj(), &excluding_domains);
143 base::android::JavaIntArrayToIntVector(env, jexcluding_domain_reasons.obj(),
144 &excluding_domain_reasons);
145 base::android::AppendJavaStringArrayToStringVector(
146 env, jignoring_domains.obj(), &ignoring_domains);
147 base::android::JavaIntArrayToIntVector(env, jignoring_domain_reasons.obj(),
148 &ignoring_domain_reasons);
149 std::unique_ptr<content::BrowsingDataFilterBuilder> filter_builder(
150 content::BrowsingDataFilterBuilder::Create(
151 content::BrowsingDataFilterBuilder::BLACKLIST));
152 for (const std::string& domain : excluding_domains) {
153 filter_builder->AddRegisterableDomain(domain);
154 }
155
156 if (!excluding_domains.empty() || !ignoring_domains.empty()) {
157 ImportantSitesUtil::RecordBlacklistedAndIgnoredImportantSites(
158 GetOriginalProfile(), excluding_domains, excluding_domain_reasons,
159 ignoring_domains, ignoring_domain_reasons);
160 }
161
162 // Delete the types protected by Important Sites with a filter,
163 // and the rest completely.
164 int filterable_mask =
165 remove_mask &
166 ChromeBrowsingDataRemoverDelegate::IMPORTANT_SITES_DATA_TYPES;
167 int nonfilterable_mask =
168 remove_mask &
169 ~ChromeBrowsingDataRemoverDelegate::IMPORTANT_SITES_DATA_TYPES;
170
171 // ClearBrowsingDataObserver deletes itself when |browsing_data_remover| is
172 // done with both removal tasks.
173 ClearBrowsingDataObserver* observer = new ClearBrowsingDataObserver(
174 env, obj, browsing_data_remover, 2 /* tasks_count */);
175
176 browsing_data::TimePeriod period =
177 static_cast<browsing_data::TimePeriod>(time_period);
178 browsing_data::RecordDeletionForPeriod(period);
179
180 if (filterable_mask) {
181 browsing_data_remover->RemoveWithFilterAndReply(
182 browsing_data::CalculateBeginDeleteTime(period),
183 browsing_data::CalculateEndDeleteTime(period), filterable_mask,
184 BrowsingDataRemover::ORIGIN_TYPE_UNPROTECTED_WEB,
185 std::move(filter_builder), observer);
186 } else {
187 // Make sure |observer| doesn't wait for the filtered task.
188 observer->OnBrowsingDataRemoverDone();
189 }
190
191 if (nonfilterable_mask) {
192 browsing_data_remover->RemoveAndReply(
193 browsing_data::CalculateBeginDeleteTime(period),
194 browsing_data::CalculateEndDeleteTime(period), nonfilterable_mask,
195 BrowsingDataRemover::ORIGIN_TYPE_UNPROTECTED_WEB, observer);
196 } else {
197 // Make sure |observer| doesn't wait for the non-filtered task.
198 observer->OnBrowsingDataRemoverDone();
199 }
200 }
201
202 static void ShowNoticeAboutOtherFormsOfBrowsingHistory(
203 const JavaRef<jobject>& listener,
204 bool show) {
205 JNIEnv* env = AttachCurrentThread();
206 UMA_HISTOGRAM_BOOLEAN(
207 "History.ClearBrowsingData.HistoryNoticeShownInFooterWhenUpdated", show);
208 if (!show)
209 return;
210 Java_OtherFormsOfBrowsingHistoryListener_showNoticeAboutOtherFormsOfBrowsingHi story(
211 env, listener);
212 }
213
214 static void EnableDialogAboutOtherFormsOfBrowsingHistory(
215 const JavaRef<jobject>& listener,
216 bool enabled) {
217 JNIEnv* env = AttachCurrentThread();
218 if (!enabled)
219 return;
220 Java_OtherFormsOfBrowsingHistoryListener_enableDialogAboutOtherFormsOfBrowsing History(
221 env, listener);
222 }
223
224 static void RequestInfoAboutOtherFormsOfBrowsingHistory(
225 JNIEnv* env,
226 const JavaParamRef<jobject>& obj,
227 const JavaParamRef<jobject>& listener) {
228 // The permanent notice in the footer.
229 browsing_data::ShouldShowNoticeAboutOtherFormsOfBrowsingHistory(
230 ProfileSyncServiceFactory::GetForProfile(GetOriginalProfile()),
231 WebHistoryServiceFactory::GetForProfile(GetOriginalProfile()),
232 base::Bind(&ShowNoticeAboutOtherFormsOfBrowsingHistory,
233 ScopedJavaGlobalRef<jobject>(env, listener)));
234
235 // The one-time notice in the dialog.
236 browsing_data::ShouldPopupDialogAboutOtherFormsOfBrowsingHistory(
237 ProfileSyncServiceFactory::GetForProfile(GetOriginalProfile()),
238 WebHistoryServiceFactory::GetForProfile(GetOriginalProfile()),
239 chrome::GetChannel(),
240 base::Bind(&EnableDialogAboutOtherFormsOfBrowsingHistory,
241 ScopedJavaGlobalRef<jobject>(env, listener)));
242 }
243
244 static void FetchImportantSites(JNIEnv* env,
245 const JavaParamRef<jclass>& clazz,
246 const JavaParamRef<jobject>& java_callback) {
247 Profile* profile = GetOriginalProfile();
248 std::vector<ImportantSitesUtil::ImportantDomainInfo> important_sites =
249 ImportantSitesUtil::GetImportantRegisterableDomains(profile,
250 kMaxImportantSites);
251 bool dialog_disabled = ImportantSitesUtil::IsDialogDisabled(profile);
252
253 std::vector<std::string> important_domains;
254 std::vector<int32_t> important_domain_reasons;
255 std::vector<std::string> important_domain_examples;
256 for (const ImportantSitesUtil::ImportantDomainInfo& info : important_sites) {
257 important_domains.push_back(info.registerable_domain);
258 important_domain_reasons.push_back(info.reason_bitfield);
259 important_domain_examples.push_back(info.example_origin.spec());
260 }
261
262 ScopedJavaLocalRef<jobjectArray> java_domains =
263 base::android::ToJavaArrayOfStrings(env, important_domains);
264 ScopedJavaLocalRef<jintArray> java_reasons =
265 base::android::ToJavaIntArray(env, important_domain_reasons);
266 ScopedJavaLocalRef<jobjectArray> java_origins =
267 base::android::ToJavaArrayOfStrings(env, important_domain_examples);
268
269 Java_ImportantSitesCallback_onImportantRegisterableDomainsReady(
270 env, java_callback.obj(), java_domains.obj(), java_origins.obj(),
271 java_reasons.obj(), dialog_disabled);
272 }
273
274 // This value should not change during a sessions, as it's used for UMA metrics.
275 static jint GetMaxImportantSites(JNIEnv* env,
276 const JavaParamRef<jclass>& clazz) {
277 return kMaxImportantSites;
278 }
279
280 static void MarkOriginAsImportantForTesting(
281 JNIEnv* env,
282 const JavaParamRef<jclass>& clazz,
283 const JavaParamRef<jstring>& jorigin) {
284 GURL origin(base::android::ConvertJavaStringToUTF8(jorigin));
285 CHECK(origin.is_valid());
286 ImportantSitesUtil::MarkOriginAsImportantForTesting(GetOriginalProfile(),
287 origin);
288 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698