blob: f53ebc045698556ff9aa1712106ded81a4a93ddc [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/android/tab_storage_packager_android.h"
#include <memory>
#include <utility>
#include "base/android/jni_android.h"
#include "base/android/jni_bytebuffer.h"
#include "base/android/jni_string.h"
#include "base/token.h"
#include "chrome/browser/android/tab_android.h"
#include "chrome/browser/tab/android_tab_package.h"
#include "chrome/browser/tab/collection_storage_package.h"
#include "chrome/browser/tab/tab_storage_package.h"
#include "chrome/browser/tab/tab_storage_packager.h"
// Must come after all headers that specialize FromJniType() / ToJniType().
#include "chrome/browser/tab/jni_headers/TabStoragePackager_jni.h"
namespace tabs {
static const int kTabStoragePackagerAndroidVersion = 1;
TabStoragePackagerAndroid::TabStoragePackagerAndroid() {
JNIEnv* env = base::android::AttachCurrentThread();
java_obj_.Reset(
Java_TabStoragePackager_create(env, reinterpret_cast<intptr_t>(this)));
}
void TabStoragePackagerAndroid::Package(const TabInterface* tab) {
JNIEnv* env = base::android::AttachCurrentThread();
Java_TabStoragePackager_packageTab(env, java_obj_,
static_cast<const TabAndroid*>(tab));
}
void TabStoragePackagerAndroid::Package(const TabCollection* collection) {
// TODO(https://crbug.com/448875689): Fill this package with relevant data.
package_ = std::make_unique<CollectionStoragePackage>();
}
void TabStoragePackagerAndroid::ConsolidatePackageData(
JNIEnv* env,
jlong timestamp_millis,
const jni_zero::JavaParamRef<jobject>& web_contents_state_buffer,
std::string& opener_app_id,
jint theme_color,
jlong last_navigation_committed_timestamp_millis,
jboolean tab_has_sensitive_content,
TabAndroid* tab) {
DCHECK(!package_) << "Previous package was not released.";
std::unique_ptr<std::string> web_contents_state_bytes;
if (web_contents_state_buffer) {
base::span<const uint8_t> span =
base::android::JavaByteBufferToSpan(env, web_contents_state_buffer);
web_contents_state_bytes =
std::make_unique<std::string>(span.begin(), span.end());
}
base::Token tab_group_id;
if (tab->GetGroup().has_value()) {
tab_group_id = tab->GetGroup()->token();
}
std::unique_ptr<AndroidTabPackage> android_package =
std::make_unique<AndroidTabPackage>(
kTabStoragePackagerAndroidVersion, tab->GetAndroidId(),
tab->GetParentId(), timestamp_millis,
std::move(web_contents_state_bytes),
std::make_unique<std::string>(std::move(opener_app_id)), theme_color,
last_navigation_committed_timestamp_millis, tab_has_sensitive_content,
tab->GetTabLaunchTypeAtCreation());
package_ = std::make_unique<TabStoragePackage>(
tab->GetUserAgent(), std::move(tab_group_id), tab->IsPinned(),
std::move(android_package));
}
std::unique_ptr<StoragePackage> TabStoragePackagerAndroid::ReleasePackage() {
DCHECK(package_) << "Package was not instantiated.";
return std::move(package_);
}
TabStoragePackagerAndroid::~TabStoragePackagerAndroid() = default;
} // namespace tabs