1 // Copyright 2019 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "url/origin.h"
6
7 #include <cstdint>
8
9 #include "base/android/jni_string.h"
10 #include "base/android/scoped_java_ref.h"
11 #include "base/memory/ptr_util.h"
12 #include "url/android/gurl_android.h"
13
14 // Must come after all headers that specialize FromJniType() / ToJniType().
15 #include "url/url_jni_headers/Origin_jni.h"
16
17 namespace url {
18
19 // friend
CreateOpaqueOriginForAndroid(const std::string & scheme,const std::string & host,uint16_t port,const base::UnguessableToken & nonce_token)20 Origin CreateOpaqueOriginForAndroid(const std::string& scheme,
21 const std::string& host,
22 uint16_t port,
23 const base::UnguessableToken& nonce_token) {
24 return Origin::CreateOpaqueFromNormalizedPrecursorTuple(
25 scheme, host, port, Origin::Nonce(nonce_token));
26 }
27
ToJavaObject(JNIEnv * env) const28 base::android::ScopedJavaLocalRef<jobject> Origin::ToJavaObject(
29 JNIEnv* env) const {
30 const base::UnguessableToken* token = GetNonceForSerialization();
31 return Java_Origin_Constructor(env, tuple_.scheme(), tuple_.host(),
32 tuple_.port(), opaque(),
33 token ? token->GetHighForSerialization() : 0,
34 token ? token->GetLowForSerialization() : 0);
35 }
36
37 // static
FromJavaObject(JNIEnv * env,const base::android::JavaRef<jobject> & java_origin)38 Origin Origin::FromJavaObject(
39 JNIEnv* env,
40 const base::android::JavaRef<jobject>& java_origin) {
41 Origin ret;
42 Java_Origin_assignNativeOrigin(env, java_origin,
43 reinterpret_cast<jlong>(&ret));
44 return ret;
45 }
46
JNI_Origin_CreateOpaque(JNIEnv * env)47 static base::android::ScopedJavaLocalRef<jobject> JNI_Origin_CreateOpaque(
48 JNIEnv* env) {
49 return Origin().ToJavaObject(env);
50 }
51
JNI_Origin_CreateFromGURL(JNIEnv * env,const base::android::JavaParamRef<jobject> & j_gurl)52 static base::android::ScopedJavaLocalRef<jobject> JNI_Origin_CreateFromGURL(
53 JNIEnv* env,
54 const base::android::JavaParamRef<jobject>& j_gurl) {
55 return Origin::Create(GURLAndroid::ToNativeGURL(env, j_gurl))
56 .ToJavaObject(env);
57 }
58
JNI_Origin_AssignNativeOrigin(JNIEnv * env,std::string & scheme,std::string & host,jshort port,jboolean is_opaque,jlong token_high_bits,jlong token_low_bits,jlong native_origin)59 static void JNI_Origin_AssignNativeOrigin(JNIEnv* env,
60 std::string& scheme,
61 std::string& host,
62 jshort port,
63 jboolean is_opaque,
64 jlong token_high_bits,
65 jlong token_low_bits,
66 jlong native_origin) {
67 Origin* origin = reinterpret_cast<Origin*>(native_origin);
68 if (is_opaque) {
69 std::optional<base::UnguessableToken> nonce_token =
70 base::UnguessableToken::Deserialize(token_high_bits, token_low_bits);
71 *origin =
72 CreateOpaqueOriginForAndroid(scheme, host, port, nonce_token.value());
73 } else {
74 *origin = Origin::CreateFromNormalizedTuple(scheme, host, port);
75 }
76 }
77
78 } // namespace url
79