blob: 0ca5f18def186f4c87d41fcabde2552e537c8c70 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/persisted_state_db/persisted_state_db.h"
#include "base/android/callback_android.h"
#include "base/android/jni_android.h"
#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
#include "base/bind.h"
#include "base/callback_helpers.h"
#include "chrome/browser/persisted_state_db/persisted_state_db_content.pb.h"
#include "chrome/browser/persisted_state_db/profile_proto_db_factory.h"
#include "chrome/browser/tab/jni_headers/LevelDBPersistedDataStorage_jni.h"
#include "components/embedder_support/android/browser_context/browser_context_handle.h"
namespace {
void OnUpdateCallback(
const base::android::JavaRef<jobject>& joncomplete_for_testing,
bool success) {
if (!success)
LOG(WARNING) << "There was an error modifying PersistedStateDB";
// Callback for save and delete is only used in tests for synchronization.
// Otherwise the callback is a no-op.
if (joncomplete_for_testing)
base::android::RunRunnableAndroid(joncomplete_for_testing);
}
void OnLoadCallback(
const base::android::JavaRef<jobject>& jcallback,
bool success,
std::vector<ProfileProtoDB<
persisted_state_db::PersistedStateContentProto>::KeyAndValue> data) {
if (!success)
LOG(WARNING) << "There was an error loading from PersistedStateDB";
base::android::RunObjectCallbackAndroid(
jcallback, base::android::ToJavaByteArray(
base::android::AttachCurrentThread(),
data.empty() ? "" : data[0].second.content_data()));
}
} // namespace
PersistedStateDB::PersistedStateDB(content::BrowserContext* browser_context)
: proto_db_(
ProfileProtoDBFactory<
persisted_state_db::PersistedStateContentProto>::GetInstance()
->GetForProfile(browser_context)) {}
PersistedStateDB::~PersistedStateDB() = default;
void PersistedStateDB::Save(
JNIEnv* env,
const base::android::JavaParamRef<jstring>& jkey,
const base::android::JavaParamRef<jbyteArray>& jbyte_array,
const base::android::JavaRef<jobject>& joncomplete_for_testing) {
const std::string& key = base::android::ConvertJavaStringToUTF8(env, jkey);
std::string data;
base::android::JavaByteArrayToString(env, jbyte_array, &data);
persisted_state_db::PersistedStateContentProto proto;
proto.set_key(key);
proto.set_content_data(data);
proto_db_->InsertContent(
key, proto,
base::BindOnce(&OnUpdateCallback,
base::android::ScopedJavaGlobalRef<jobject>(
joncomplete_for_testing)));
}
void PersistedStateDB::Load(JNIEnv* env,
const base::android::JavaParamRef<jstring>& jkey,
const base::android::JavaRef<jobject>& jcallback) {
proto_db_->LoadContentWithPrefix(
base::android::ConvertJavaStringToUTF8(env, jkey),
base::BindOnce(&OnLoadCallback,
base::android::ScopedJavaGlobalRef<jobject>(jcallback)));
}
void PersistedStateDB::Delete(
JNIEnv* env,
const base::android::JavaParamRef<jstring>& jkey,
const base::android::JavaRef<jobject>& joncomplete_for_testing) {
proto_db_->DeleteContentWithPrefix(
base::android::ConvertJavaStringToUTF8(env, jkey),
base::BindOnce(&OnUpdateCallback,
base::android::ScopedJavaGlobalRef<jobject>(
joncomplete_for_testing)));
}
void PersistedStateDB::Destroy(JNIEnv* env) {
proto_db_->Destroy();
}
static void JNI_LevelDBPersistedDataStorage_Init(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& jprofile) {
Java_LevelDBPersistedDataStorage_setNativePtr(
env, obj,
reinterpret_cast<intptr_t>(new PersistedStateDB(
browser_context::BrowserContextFromJavaHandle(jprofile))));
}