blob: 8fac8b531f3bea494f3813707cf86b45ad7430c7 [file]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/android/additional_navigation_params.h"
#include "base/android/jni_string.h"
#include "base/android/unguessable_token_android.h"
#include "content/browser/renderer_host/render_frame_host_impl.h"
#include "content/common/android/child_process_id.h"
#include "content/public/android/content_jni_headers/AdditionalNavigationParamsImpl_jni.h"
#include "content/public/browser/initiator_navigation_state.h"
namespace content {
base::android::ScopedJavaLocalRef<jobject> CreateJavaAdditionalNavigationParams(
JNIEnv* env,
RenderFrameHost& initiator_frame_host) {
auto* rfhi = static_cast<RenderFrameHostImpl*>(&initiator_frame_host);
scoped_refptr<InitiatorNavigationState> initiator_navigation_state =
rfhi->GetCurrentInitiatorNavigationState();
int64_t native_state_ptr = 0;
if (initiator_navigation_state) {
initiator_navigation_state->AddRef();
native_state_ptr =
reinterpret_cast<int64_t>(initiator_navigation_state.get());
}
return Java_AdditionalNavigationParamsImpl_Constructor(
env, initiator_frame_host.GetFrameToken().value(),
initiator_frame_host.GetProcess()->GetID(), native_state_ptr);
}
void JNI_AdditionalNavigationParamsImpl_Destroy(JNIEnv* env,
int64_t native_state) {
if (native_state) {
auto* state = reinterpret_cast<InitiatorNavigationState*>(native_state);
state->Release();
}
}
std::optional<blink::LocalFrameToken>
GetInitiatorFrameTokenFromJavaAdditionalNavigationParams(
JNIEnv* env,
const base::android::JavaRef<jobject>& j_object) {
if (!j_object) {
return std::nullopt;
}
std::optional<base::UnguessableToken> optional_token =
Java_AdditionalNavigationParamsImpl_getInitiatorFrameToken(env, j_object);
if (optional_token) {
return blink::LocalFrameToken(optional_token.value());
}
return std::nullopt;
}
content::ChildProcessId GetInitiatorProcessIdFromJavaAdditionalNavigationParams(
JNIEnv* env,
const base::android::JavaRef<jobject>& j_object) {
if (!j_object) {
return content::ChildProcessId();
}
return Java_AdditionalNavigationParamsImpl_getInitiatorProcessId(env,
j_object);
}
scoped_refptr<InitiatorNavigationState>
TakeNativeStateFromJavaAdditionalNavigationParams(
JNIEnv* env,
const base::android::JavaRef<jobject>& j_object) {
if (!j_object) {
return nullptr;
}
int64_t native_ptr =
Java_AdditionalNavigationParamsImpl_takeNativeState(env, j_object);
if (!native_ptr) {
return nullptr;
}
auto* state = reinterpret_cast<InitiatorNavigationState*>(native_ptr);
auto ref_ptr = base::WrapRefCounted(state);
state->Release();
return ref_ptr;
}
void DestroyJavaAdditionalNavigationParams(
JNIEnv* env,
const base::android::JavaRef<jobject>& j_object) {
if (!j_object) {
return;
}
Java_AdditionalNavigationParamsImpl_destroy(env, j_object);
}
} // namespace content
DEFINE_JNI(AdditionalNavigationParamsImpl)