// Copyright 2022 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/payments/content/android/csp_checker_android.h"
#include "url/android/gurl_android.h"
// Must come after all headers that specialize FromJniType() / ToJniType().
#include "components/payments/content/android/jni_headers/CSPCheckerBridge_jni.h"
namespace payments {
CSPCheckerAndroid::CSPCheckerAndroid(
const base::android::JavaParamRef<jobject>& jbridge)
: jbridge_(jbridge) {}
CSPCheckerAndroid::~CSPCheckerAndroid() = default;
void CSPCheckerAndroid::Destroy(JNIEnv* env) {
delete this;
}
void CSPCheckerAndroid::OnResult(JNIEnv* env,
jint callback_id,
jboolean result) {
auto iter = result_callbacks_.find(callback_id);
if (iter == result_callbacks_.end())
return;
base::OnceCallback<void(bool)> callback = std::move(iter->second);
result_callbacks_.erase(iter);
std::move(callback).Run(result);
}
// static
base::WeakPtr<CSPCheckerAndroid> CSPCheckerAndroid::GetWeakPtr(
jlong native_csp_checker_android) {
if (!native_csp_checker_android)
return base::WeakPtr<CSPCheckerAndroid>();
payments::CSPCheckerAndroid* csp_checker_android =
reinterpret_cast<payments::CSPCheckerAndroid*>(
native_csp_checker_android);
if (!csp_checker_android)
return base::WeakPtr<CSPCheckerAndroid>();
return csp_checker_android->weak_ptr_factory_.GetWeakPtr();
}
void CSPCheckerAndroid::AllowConnectToSource(
const GURL& url,
const GURL& url_before_redirects,
bool did_follow_redirect,
base::OnceCallback<void(bool)> result_callback) {
JNIEnv* env = jni_zero::AttachCurrentThread();
if (!env)
return;
int callback_id = ++callback_counter_;
result_callbacks_.insert(
std::make_pair(callback_id, std::move(result_callback)));
Java_CSPCheckerBridge_allowConnectToSource(
env, jbridge_, url::GURLAndroid::FromNativeGURL(env, url),
url::GURLAndroid::FromNativeGURL(env, url_before_redirects),
did_follow_redirect, callback_id);
}
// A static free function declared in and invoked directly from Java.
static jlong JNI_CSPCheckerBridge_CreateNativeCSPChecker(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jbridge) {
return reinterpret_cast<intptr_t>(new CSPCheckerAndroid(jbridge));
}
} // namespace payments