OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 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 | 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/android/browsing_data/browsing_data_bridge.h" | 5 #include "chrome/browser/android/browsing_data/browsing_data_bridge.h" |
6 | 6 |
7 #include <jni.h> | 7 #include <jni.h> |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 | 9 |
10 #include <memory> | 10 #include <memory> |
11 #include <set> | 11 #include <set> |
12 #include <string> | 12 #include <string> |
13 #include <vector> | 13 #include <vector> |
14 | 14 |
15 #include "base/android/jni_android.h" | 15 #include "base/android/jni_android.h" |
16 #include "base/android/jni_array.h" | 16 #include "base/android/jni_array.h" |
17 #include "base/android/jni_string.h" | 17 #include "base/android/jni_string.h" |
18 #include "base/android/jni_weak_ref.h" | 18 #include "base/android/jni_weak_ref.h" |
19 #include "base/metrics/histogram_macros.h" | 19 #include "base/metrics/histogram_macros.h" |
20 #include "base/scoped_observer.h" | 20 #include "base/scoped_observer.h" |
21 #include "base/values.h" | 21 #include "base/values.h" |
| 22 #include "chrome/browser/browsing_data/browsing_data_important_sites_util.h" |
22 #include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h" | 23 #include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h" |
23 #include "chrome/browser/engagement/important_sites_util.h" | 24 #include "chrome/browser/engagement/important_sites_util.h" |
24 #include "chrome/browser/history/web_history_service_factory.h" | 25 #include "chrome/browser/history/web_history_service_factory.h" |
25 #include "chrome/browser/profiles/profile_manager.h" | 26 #include "chrome/browser/profiles/profile_manager.h" |
26 #include "chrome/browser/sync/profile_sync_service_factory.h" | 27 #include "chrome/browser/sync/profile_sync_service_factory.h" |
27 #include "chrome/common/channel_info.h" | 28 #include "chrome/common/channel_info.h" |
28 #include "components/browser_sync/profile_sync_service.h" | 29 #include "components/browser_sync/profile_sync_service.h" |
29 #include "components/browsing_data/core/history_notice_utils.h" | 30 #include "components/browsing_data/core/history_notice_utils.h" |
30 #include "components/prefs/pref_service.h" | 31 #include "components/prefs/pref_service.h" |
31 #include "content/public/browser/browser_context.h" | 32 #include "content/public/browser/browser_context.h" |
32 #include "content/public/browser/browsing_data_filter_builder.h" | 33 #include "content/public/browser/browsing_data_filter_builder.h" |
33 #include "content/public/browser/browsing_data_remover.h" | 34 #include "content/public/browser/browsing_data_remover.h" |
34 #include "jni/BrowsingDataBridge_jni.h" | 35 #include "jni/BrowsingDataBridge_jni.h" |
35 | 36 |
36 using base::android::AttachCurrentThread; | 37 using base::android::AttachCurrentThread; |
37 using base::android::JavaParamRef; | 38 using base::android::JavaParamRef; |
38 using base::android::JavaRef; | 39 using base::android::JavaRef; |
39 using base::android::ScopedJavaLocalRef; | 40 using base::android::ScopedJavaLocalRef; |
40 using base::android::ScopedJavaGlobalRef; | 41 using base::android::ScopedJavaGlobalRef; |
41 using content::BrowsingDataRemover; | 42 using content::BrowsingDataRemover; |
42 | 43 |
43 namespace { | 44 namespace { |
44 | 45 |
45 const size_t kMaxImportantSites = 5; | 46 const size_t kMaxImportantSites = 5; |
46 | 47 |
47 Profile* GetOriginalProfile() { | 48 Profile* GetOriginalProfile() { |
48 return ProfileManager::GetActiveUserProfile()->GetOriginalProfile(); | 49 return ProfileManager::GetActiveUserProfile()->GetOriginalProfile(); |
49 } | 50 } |
50 | 51 |
51 // Merges |task_count| BrowsingDataRemover completion callbacks and redirects | 52 void OnBrowsingDataRemoverDone( |
52 // them back into Java. | 53 JavaObjectWeakGlobalRef weak_chrome_native_preferences) { |
53 class ClearBrowsingDataObserver : public BrowsingDataRemover::Observer { | 54 JNIEnv* env = AttachCurrentThread(); |
54 public: | 55 if (weak_chrome_native_preferences.get(env).is_null()) |
55 // |obj| is expected to be the object passed into ClearBrowsingData(); e.g. a | 56 return; |
56 // ChromePreference. | |
57 ClearBrowsingDataObserver(JNIEnv* env, | |
58 jobject obj, | |
59 BrowsingDataRemover* browsing_data_remover, | |
60 int task_count) | |
61 : task_count_(task_count), | |
62 weak_chrome_native_preferences_(env, obj), | |
63 observer_(this) { | |
64 DCHECK_GT(task_count, 0); | |
65 observer_.Add(browsing_data_remover); | |
66 } | |
67 | 57 |
68 void OnBrowsingDataRemoverDone() override { | 58 Java_BrowsingDataBridge_browsingDataCleared( |
69 DCHECK(task_count_); | 59 env, weak_chrome_native_preferences.get(env)); |
70 if (--task_count_) | 60 } |
71 return; | |
72 | |
73 // We delete ourselves when done. | |
74 std::unique_ptr<ClearBrowsingDataObserver> auto_delete(this); | |
75 | |
76 JNIEnv* env = AttachCurrentThread(); | |
77 if (weak_chrome_native_preferences_.get(env).is_null()) | |
78 return; | |
79 | |
80 Java_BrowsingDataBridge_browsingDataCleared( | |
81 env, weak_chrome_native_preferences_.get(env)); | |
82 } | |
83 | |
84 private: | |
85 int task_count_; | |
86 JavaObjectWeakGlobalRef weak_chrome_native_preferences_; | |
87 ScopedObserver<BrowsingDataRemover, BrowsingDataRemover::Observer> observer_; | |
88 }; | |
89 | 61 |
90 } // namespace | 62 } // namespace |
91 | 63 |
92 bool RegisterBrowsingDataBridge(JNIEnv* env) { | 64 bool RegisterBrowsingDataBridge(JNIEnv* env) { |
93 return RegisterNativesImpl(env); | 65 return RegisterNativesImpl(env); |
94 } | 66 } |
95 | 67 |
96 static void ClearBrowsingData( | 68 static void ClearBrowsingData( |
97 JNIEnv* env, | 69 JNIEnv* env, |
98 const JavaParamRef<jobject>& obj, | 70 const JavaParamRef<jobject>& obj, |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 for (const std::string& domain : excluding_domains) { | 129 for (const std::string& domain : excluding_domains) { |
158 filter_builder->AddRegisterableDomain(domain); | 130 filter_builder->AddRegisterableDomain(domain); |
159 } | 131 } |
160 | 132 |
161 if (!excluding_domains.empty() || !ignoring_domains.empty()) { | 133 if (!excluding_domains.empty() || !ignoring_domains.empty()) { |
162 ImportantSitesUtil::RecordBlacklistedAndIgnoredImportantSites( | 134 ImportantSitesUtil::RecordBlacklistedAndIgnoredImportantSites( |
163 GetOriginalProfile(), excluding_domains, excluding_domain_reasons, | 135 GetOriginalProfile(), excluding_domains, excluding_domain_reasons, |
164 ignoring_domains, ignoring_domain_reasons); | 136 ignoring_domains, ignoring_domain_reasons); |
165 } | 137 } |
166 | 138 |
167 // Delete the types protected by Important Sites with a filter, | 139 base::OnceClosure callback = base::BindOnce( |
168 // and the rest completely. | 140 &OnBrowsingDataRemoverDone, JavaObjectWeakGlobalRef(env, obj)); |
169 int filterable_mask = | |
170 remove_mask & | |
171 ChromeBrowsingDataRemoverDelegate::IMPORTANT_SITES_DATA_TYPES; | |
172 int nonfilterable_mask = | |
173 remove_mask & | |
174 ~ChromeBrowsingDataRemoverDelegate::IMPORTANT_SITES_DATA_TYPES; | |
175 | |
176 // ClearBrowsingDataObserver deletes itself when |browsing_data_remover| is | |
177 // done with both removal tasks. | |
178 ClearBrowsingDataObserver* observer = new ClearBrowsingDataObserver( | |
179 env, obj, browsing_data_remover, 2 /* tasks_count */); | |
180 | 141 |
181 browsing_data::TimePeriod period = | 142 browsing_data::TimePeriod period = |
182 static_cast<browsing_data::TimePeriod>(time_period); | 143 static_cast<browsing_data::TimePeriod>(time_period); |
183 browsing_data::RecordDeletionForPeriod(period); | |
184 | 144 |
185 if (filterable_mask) { | 145 browsing_data_important_sites_util::Remove( |
186 browsing_data_remover->RemoveWithFilterAndReply( | 146 remove_mask, BrowsingDataRemover::ORIGIN_TYPE_UNPROTECTED_WEB, period, |
187 browsing_data::CalculateBeginDeleteTime(period), | 147 std::move(filter_builder), browsing_data_remover, std::move(callback)); |
188 browsing_data::CalculateEndDeleteTime(period), filterable_mask, | |
189 BrowsingDataRemover::ORIGIN_TYPE_UNPROTECTED_WEB, | |
190 std::move(filter_builder), observer); | |
191 } else { | |
192 // Make sure |observer| doesn't wait for the filtered task. | |
193 observer->OnBrowsingDataRemoverDone(); | |
194 } | |
195 | |
196 if (nonfilterable_mask) { | |
197 browsing_data_remover->RemoveAndReply( | |
198 browsing_data::CalculateBeginDeleteTime(period), | |
199 browsing_data::CalculateEndDeleteTime(period), nonfilterable_mask, | |
200 BrowsingDataRemover::ORIGIN_TYPE_UNPROTECTED_WEB, observer); | |
201 } else { | |
202 // Make sure |observer| doesn't wait for the non-filtered task. | |
203 observer->OnBrowsingDataRemoverDone(); | |
204 } | |
205 } | 148 } |
206 | 149 |
207 static void ShowNoticeAboutOtherFormsOfBrowsingHistory( | 150 static void ShowNoticeAboutOtherFormsOfBrowsingHistory( |
208 const JavaRef<jobject>& listener, | 151 const JavaRef<jobject>& listener, |
209 bool show) { | 152 bool show) { |
210 JNIEnv* env = AttachCurrentThread(); | 153 JNIEnv* env = AttachCurrentThread(); |
211 UMA_HISTOGRAM_BOOLEAN( | 154 UMA_HISTOGRAM_BOOLEAN( |
212 "History.ClearBrowsingData.HistoryNoticeShownInFooterWhenUpdated", show); | 155 "History.ClearBrowsingData.HistoryNoticeShownInFooterWhenUpdated", show); |
213 if (!show) | 156 if (!show) |
214 return; | 157 return; |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 | 227 |
285 static void MarkOriginAsImportantForTesting( | 228 static void MarkOriginAsImportantForTesting( |
286 JNIEnv* env, | 229 JNIEnv* env, |
287 const JavaParamRef<jclass>& clazz, | 230 const JavaParamRef<jclass>& clazz, |
288 const JavaParamRef<jstring>& jorigin) { | 231 const JavaParamRef<jstring>& jorigin) { |
289 GURL origin(base::android::ConvertJavaStringToUTF8(jorigin)); | 232 GURL origin(base::android::ConvertJavaStringToUTF8(jorigin)); |
290 CHECK(origin.is_valid()); | 233 CHECK(origin.is_valid()); |
291 ImportantSitesUtil::MarkOriginAsImportantForTesting(GetOriginalProfile(), | 234 ImportantSitesUtil::MarkOriginAsImportantForTesting(GetOriginalProfile(), |
292 origin); | 235 origin); |
293 } | 236 } |
OLD | NEW |