OLD | NEW |
| (Empty) |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | |
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 "components/payments/content/android/payment_manifest_parser_android.h" | |
6 | |
7 #include <stddef.h> | |
8 | |
9 #include "base/android/jni_array.h" | |
10 #include "base/android/jni_string.h" | |
11 #include "base/bind.h" | |
12 #include "base/logging.h" | |
13 #include "base/memory/ptr_util.h" | |
14 #include "base/numerics/safe_conversions.h" | |
15 #include "jni/PaymentManifestParser_jni.h" | |
16 #include "url/gurl.h" | |
17 | |
18 namespace payments { | |
19 namespace { | |
20 | |
21 class ParseCallback { | |
22 public: | |
23 explicit ParseCallback(const base::android::JavaParamRef<jobject>& jcallback) | |
24 : jcallback_(jcallback) {} | |
25 | |
26 ~ParseCallback() {} | |
27 | |
28 // Copies payment method manifest into Java. | |
29 void OnPaymentMethodManifestParsed(std::vector<GURL> web_app_manifest_urls) { | |
30 DCHECK_GE(100U, web_app_manifest_urls.size()); | |
31 JNIEnv* env = base::android::AttachCurrentThread(); | |
32 | |
33 if (web_app_manifest_urls.empty()) { | |
34 // Can trigger synchronous deletion of PaymentManifestParserAndroid. | |
35 Java_ManifestParseCallback_onManifestParseFailure(env, jcallback_); | |
36 return; | |
37 } | |
38 | |
39 base::android::ScopedJavaLocalRef<jobjectArray> juris = | |
40 Java_PaymentManifestParser_createWebAppManifestUris( | |
41 env, web_app_manifest_urls.size()); | |
42 | |
43 for (size_t i = 0; i < web_app_manifest_urls.size(); ++i) { | |
44 bool is_valid_uri = Java_PaymentManifestParser_addUri( | |
45 env, juris.obj(), base::checked_cast<int>(i), | |
46 base::android::ConvertUTF8ToJavaString( | |
47 env, web_app_manifest_urls[i].spec())); | |
48 DCHECK(is_valid_uri); | |
49 } | |
50 | |
51 // Can trigger synchronous deletion of PaymentManifestParserAndroid. | |
52 Java_ManifestParseCallback_onPaymentMethodManifestParseSuccess( | |
53 env, jcallback_, juris.obj()); | |
54 } | |
55 | |
56 // Copies web app manifest into Java. | |
57 void OnWebAppManifestParsed( | |
58 std::vector<mojom::WebAppManifestSectionPtr> manifest) { | |
59 DCHECK_GE(100U, manifest.size()); | |
60 JNIEnv* env = base::android::AttachCurrentThread(); | |
61 | |
62 if (manifest.empty()) { | |
63 // Can trigger synchronous deletion of PaymentManifestParserAndroid. | |
64 Java_ManifestParseCallback_onManifestParseFailure(env, jcallback_); | |
65 return; | |
66 } | |
67 | |
68 base::android::ScopedJavaLocalRef<jobjectArray> jmanifest = | |
69 Java_PaymentManifestParser_createManifest(env, manifest.size()); | |
70 | |
71 for (size_t i = 0; i < manifest.size(); ++i) { | |
72 const mojom::WebAppManifestSectionPtr& section = manifest[i]; | |
73 DCHECK_GE(100U, section->fingerprints.size()); | |
74 | |
75 Java_PaymentManifestParser_addSectionToManifest( | |
76 env, jmanifest.obj(), base::checked_cast<int>(i), | |
77 base::android::ConvertUTF8ToJavaString(env, section->id), | |
78 section->min_version, | |
79 base::checked_cast<int>(section->fingerprints.size())); | |
80 | |
81 for (size_t j = 0; j < section->fingerprints.size(); ++j) { | |
82 const std::vector<uint8_t>& fingerprint = section->fingerprints[j]; | |
83 Java_PaymentManifestParser_addFingerprintToSection( | |
84 env, jmanifest.obj(), base::checked_cast<int>(i), | |
85 base::checked_cast<int>(j), | |
86 base::android::ToJavaByteArray(env, fingerprint)); | |
87 } | |
88 } | |
89 | |
90 // Can trigger synchronous deletion of PaymentManifestParserAndroid. | |
91 Java_ManifestParseCallback_onWebAppManifestParseSuccess(env, jcallback_, | |
92 jmanifest.obj()); | |
93 } | |
94 | |
95 private: | |
96 base::android::ScopedJavaGlobalRef<jobject> jcallback_; | |
97 | |
98 DISALLOW_COPY_AND_ASSIGN(ParseCallback); | |
99 }; | |
100 | |
101 } // namespace | |
102 | |
103 PaymentManifestParserAndroid::PaymentManifestParserAndroid() {} | |
104 | |
105 PaymentManifestParserAndroid::~PaymentManifestParserAndroid() {} | |
106 | |
107 void PaymentManifestParserAndroid::StartUtilityProcess( | |
108 JNIEnv* env, | |
109 const base::android::JavaParamRef<jobject>& jcaller) { | |
110 host_.StartUtilityProcess(); | |
111 } | |
112 | |
113 void PaymentManifestParserAndroid::ParsePaymentMethodManifest( | |
114 JNIEnv* env, | |
115 const base::android::JavaParamRef<jobject>& jcaller, | |
116 const base::android::JavaParamRef<jstring>& jcontent, | |
117 const base::android::JavaParamRef<jobject>& jcallback) { | |
118 host_.ParsePaymentMethodManifest( | |
119 base::android::ConvertJavaStringToUTF8(env, jcontent), | |
120 base::BindOnce(&ParseCallback::OnPaymentMethodManifestParsed, | |
121 base::MakeUnique<ParseCallback>(jcallback))); | |
122 } | |
123 | |
124 void PaymentManifestParserAndroid::ParseWebAppManifest( | |
125 JNIEnv* env, | |
126 const base::android::JavaParamRef<jobject>& jcaller, | |
127 const base::android::JavaParamRef<jstring>& jcontent, | |
128 const base::android::JavaParamRef<jobject>& jcallback) { | |
129 host_.ParseWebAppManifest( | |
130 base::android::ConvertJavaStringToUTF8(env, jcontent), | |
131 base::BindOnce(&ParseCallback::OnWebAppManifestParsed, | |
132 base::MakeUnique<ParseCallback>(jcallback))); | |
133 } | |
134 | |
135 void PaymentManifestParserAndroid::StopUtilityProcess( | |
136 JNIEnv* env, | |
137 const base::android::JavaParamRef<jobject>& jcaller) { | |
138 delete this; | |
139 } | |
140 | |
141 bool RegisterPaymentManifestParser(JNIEnv* env) { | |
142 return RegisterNativesImpl(env); | |
143 } | |
144 | |
145 // Caller owns the result. | |
146 jlong CreatePaymentManifestParserAndroid( | |
147 JNIEnv* env, | |
148 const base::android::JavaParamRef<jclass>& jcaller) { | |
149 return reinterpret_cast<jlong>(new PaymentManifestParserAndroid); | |
150 } | |
151 | |
152 } // namespace payments | |
OLD | NEW |