1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/browsing_data/content/android/browsing_data_model_android.h"
#include "base/android/callback_android.h"
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "base/android/jni_weak_ref.h"
#include "base/functional/bind.h"
#include "base/metrics/histogram_functions.h"
#include "components/permissions/permissions_client.h"
#include "content/public/browser/android/browser_context_handle.h"
#include "content/public/browser/browser_context.h"
// Must come after all headers that specialize FromJniType() / ToJniType().
#include "components/browsing_data/content/android/jni_headers/BrowsingDataModel_jni.h"
using base::android::ConvertJavaStringToUTF8;
using base::android::JavaParamRef;
using base::android::JavaRef;
using base::android::ScopedJavaGlobalRef;
using base::android::ScopedJavaLocalRef;
BrowsingDataModelAndroid::BrowsingDataModelAndroid(
std::unique_ptr<BrowsingDataModel> model)
: browsing_data_model_(std::move(model)) {}
BrowsingDataModelAndroid::~BrowsingDataModelAndroid() = default;
ScopedJavaLocalRef<jobject> BrowsingDataModelAndroid::GetBrowsingDataInfo(
JNIEnv* env,
const JavaParamRef<jobject>& jbrowser_context_handle,
const JavaParamRef<jobject>& map,
bool fetch_important) {
std::map<url::Origin, std::pair<uint64_t, uint64_t>> origin_to_data_map;
for (const auto& [owner, key, details] : *browsing_data_model_) {
const auto origin = BrowsingDataModel::GetOriginForDataKey(key.get());
origin_to_data_map[origin].first += details->cookie_count;
origin_to_data_map[origin].second += details->storage_size;
}
std::vector<std::pair<url::Origin, bool>> important_notations(
origin_to_data_map.size());
content::BrowserContext* browser_context =
content::BrowserContextFromJavaHandle(jbrowser_context_handle);
std::ranges::transform(origin_to_data_map, important_notations.begin(),
[](const auto& key_value) {
return std::make_pair(key_value.first, false);
});
if (fetch_important) {
permissions::PermissionsClient::Get()->AreSitesImportant(
browser_context, &important_notations);
}
int i = 0;
for (const auto& [origin, data] : origin_to_data_map) {
Java_BrowsingDataModel_insertBrowsingDataInfoIntoMap(
env, map, origin.ToJavaObject(env), /*cookieCount=*/data.first,
/*storageSize=*/data.second,
/*importantDomain=*/
fetch_important ? important_notations[i++].second : false);
}
return ScopedJavaLocalRef<jobject>(map);
}
void BrowsingDataModelAndroid::RemoveBrowsingData(
JNIEnv* env,
const jstring host,
const JavaParamRef<jobject>& java_callback) {
browsing_data_model_->RemoveBrowsingData(
ConvertJavaStringToUTF8(env, host),
base::BindOnce(&base::android::RunRunnableAndroid,
ScopedJavaGlobalRef<jobject>(java_callback)));
}
void BrowsingDataModelAndroid::Destroy(JNIEnv* env) {
base::ScopedUmaHistogramTimer histogram_timer(
"Android.BrowsingDataModel.ModelDestructionTime");
delete this;
}
|