• 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/android/parsed_android.h"
6 
7 #include <jni.h>
8 
9 #include "base/android/jni_android.h"
10 
11 // Must come after all headers that specialize FromJniType() / ToJniType().
12 #include "url/url_jni_headers/Parsed_jni.h"
13 
14 using base::android::AttachCurrentThread;
15 using base::android::JavaRef;
16 using base::android::ScopedJavaLocalRef;
17 
18 namespace url {
19 
20 namespace {
21 
CreateJavaParsed(JNIEnv * env,const Parsed & parsed,const JavaRef<jobject> & inner)22 ScopedJavaLocalRef<jobject> CreateJavaParsed(JNIEnv* env,
23                                              const Parsed& parsed,
24                                              const JavaRef<jobject>& inner) {
25   static constexpr bool is_signed =
26       std::is_signed<decltype(parsed.scheme.begin)>::value;
27   static constexpr size_t offset_size = sizeof(parsed.scheme.begin);
28   static_assert((is_signed && sizeof(jint) >= offset_size) ||
29                     (!is_signed && sizeof(jint) > offset_size),
30                 "Java size offsets for Parsed Components must be large enough "
31                 "to store the full C++ offset.");
32   return Java_Parsed_Constructor(
33       env, parsed.scheme.begin, parsed.scheme.len, parsed.username.begin,
34       parsed.username.len, parsed.password.begin, parsed.password.len,
35       parsed.host.begin, parsed.host.len, parsed.port.begin, parsed.port.len,
36       parsed.path.begin, parsed.path.len, parsed.query.begin, parsed.query.len,
37       parsed.ref.begin, parsed.ref.len, parsed.potentially_dangling_markup,
38       inner);
39 }
40 
41 }  // namespace
42 
43 // static
InitFromParsed(JNIEnv * env,const Parsed & parsed)44 ScopedJavaLocalRef<jobject> ParsedAndroid::InitFromParsed(
45     JNIEnv* env,
46     const Parsed& parsed) {
47   ScopedJavaLocalRef<jobject> inner;
48   if (parsed.inner_parsed())
49     inner = CreateJavaParsed(env, *parsed.inner_parsed(), nullptr);
50   return CreateJavaParsed(env, parsed, inner);
51 }
52 
JNI_Parsed_InitNative(JNIEnv * env,jlong native_ptr,jboolean is_inner,jint scheme_begin,jint scheme_length,jint username_begin,jint username_length,jint password_begin,jint password_length,jint host_begin,jint host_length,jint port_begin,jint port_length,jint path_begin,jint path_length,jint query_begin,jint query_length,jint ref_begin,jint ref_length,jboolean potentially_dangling_markup)53 static void JNI_Parsed_InitNative(JNIEnv* env,
54                                   jlong native_ptr,
55                                   jboolean is_inner,
56                                   jint scheme_begin,
57                                   jint scheme_length,
58                                   jint username_begin,
59                                   jint username_length,
60                                   jint password_begin,
61                                   jint password_length,
62                                   jint host_begin,
63                                   jint host_length,
64                                   jint port_begin,
65                                   jint port_length,
66                                   jint path_begin,
67                                   jint path_length,
68                                   jint query_begin,
69                                   jint query_length,
70                                   jint ref_begin,
71                                   jint ref_length,
72                                   jboolean potentially_dangling_markup) {
73   Parsed inner_parsed;
74   Parsed* outer_parsed = reinterpret_cast<Parsed*>(native_ptr);
75   Parsed* target = is_inner ? &inner_parsed : outer_parsed;
76   target->scheme.begin = scheme_begin;
77   target->scheme.len = scheme_length;
78   target->username.begin = username_begin;
79   target->username.len = username_length;
80   target->password.begin = password_begin;
81   target->password.len = password_length;
82   target->host.begin = host_begin;
83   target->host.len = host_length;
84   target->port.begin = port_begin;
85   target->port.len = port_length;
86   target->path.begin = path_begin;
87   target->path.len = path_length;
88   target->query.begin = query_begin;
89   target->query.len = query_length;
90   target->ref.begin = ref_begin;
91   target->ref.len = ref_length;
92   target->potentially_dangling_markup = potentially_dangling_markup;
93 
94   if (is_inner) {
95     outer_parsed->set_inner_parsed(inner_parsed);
96   }
97 }
98 
99 }  // namespace url
100