• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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