Chromium Code Reviews| Index: chrome/browser/android/payments/service_worker_payment_app_bridge.cc |
| diff --git a/chrome/browser/android/payments/service_worker_payment_app_bridge.cc b/chrome/browser/android/payments/service_worker_payment_app_bridge.cc |
| index 3421925cb66a2c7fc9bcd7b01432ce4c55bbcb8f..bdbb91b5e452ef38afaef26c462be89a72d871f0 100644 |
| --- a/chrome/browser/android/payments/service_worker_payment_app_bridge.cc |
| +++ b/chrome/browser/android/payments/service_worker_payment_app_bridge.cc |
| @@ -8,34 +8,33 @@ |
| #include "base/android/scoped_java_ref.h" |
| #include "chrome/browser/profiles/profile_manager.h" |
| #include "components/payments/payment_app.mojom.h" |
| -#include "content/public/browser/service_worker_context.h" |
| +#include "content/public/browser/browser_context.h" |
| +#include "content/public/browser/browser_thread.h" |
| +#include "content/public/browser/payment_app_context.h" |
| #include "content/public/browser/storage_partition.h" |
| +#include "content/public/browser/web_contents.h" |
| #include "jni/ServiceWorkerPaymentAppBridge_jni.h" |
| using base::android::ConvertUTF8ToJavaString; |
| using base::android::JavaParamRef; |
| +using base::android::JavaRef; |
| +using base::android::ScopedJavaGlobalRef; |
| using base::android::ScopedJavaLocalRef; |
| -static ScopedJavaLocalRef<jobject> GetAllAppManifests( |
| - JNIEnv* env, |
| - const JavaParamRef<jclass>& jcaller) { |
| - // TODO(tommyt): crbug.com/669876. Initialise the following two variables. |
| - // At the moment, they are empty, so this function will return an empty |
| - // list of manifests. We need to hook this function up to the service worker |
| - // payment apps. |
| - std::string scope_url; |
| - std::vector<payments::mojom::PaymentAppManifestPtr> manifests; |
| - |
| - ScopedJavaLocalRef<jobject> java_manifests = |
| - Java_ServiceWorkerPaymentAppBridge_createManifestList(env); |
| - for (const auto& manifest : manifests) { |
| +namespace { |
| + |
| +void OnGotAllManifests(JNIEnv* env, |
| + const JavaRef<jobject>& jweb_contents, |
| + const JavaRef<jobject>& jcallback, |
| + content::PaymentAppContext::Manifests manifests) { |
| + for (const auto& entry : manifests) { |
| ScopedJavaLocalRef<jobject> java_manifest = |
| - Java_ServiceWorkerPaymentAppBridge_createAndAddManifest( |
| - env, java_manifests, ConvertUTF8ToJavaString(env, scope_url), |
| - ConvertUTF8ToJavaString(env, manifest->name), |
| - manifest->icon ? ConvertUTF8ToJavaString(env, *manifest->icon) |
| - : nullptr); |
| - for (const auto& option : manifest->options) { |
| + Java_ServiceWorkerPaymentAppBridge_createManifest( |
| + env, entry.first, ConvertUTF8ToJavaString(env, entry.second->name), |
| + entry.second->icon |
| + ? ConvertUTF8ToJavaString(env, *entry.second->icon) |
| + : nullptr); |
| + for (const auto& option : entry.second->options) { |
| ScopedJavaLocalRef<jobject> java_option = |
| Java_ServiceWorkerPaymentAppBridge_createAndAddOption( |
| env, java_manifest, ConvertUTF8ToJavaString(env, option->id), |
| @@ -47,16 +46,70 @@ static ScopedJavaLocalRef<jobject> GetAllAppManifests( |
| env, java_option, ConvertUTF8ToJavaString(env, enabled_method)); |
| } |
| } |
| + |
| + Java_ServiceWorkerPaymentAppBridge_onGotManifest(env, java_manifest, |
| + jweb_contents, jcallback); |
| + } |
| + |
| + Java_ServiceWorkerPaymentAppBridge_onGotAllManifests(env, jcallback); |
| +} |
| + |
| +} // namespace |
| + |
| +static void GetAllAppManifests(JNIEnv* env, |
| + const JavaParamRef<jclass>& jcaller, |
| + const JavaParamRef<jobject>& jweb_contents, |
| + const JavaParamRef<jobject>& jcallback) { |
| + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| + |
| + content::WebContents* web_contents = |
| + content::WebContents::FromJavaWebContents(jweb_contents); |
| + |
| + if (web_contents == nullptr) { |
| + LOG(ERROR) << "Unable to resolve WebContents"; |
| + Java_ServiceWorkerPaymentAppBridge_onGotAllManifests(env, jcallback); |
| + return; |
| + } |
| + |
| + content::BrowserContext* browser_context = web_contents->GetBrowserContext(); |
| + |
| + if (browser_context == nullptr) { |
| + LOG(ERROR) << "No BrowserContext found"; |
| + Java_ServiceWorkerPaymentAppBridge_onGotAllManifests(env, jcallback); |
| + return; |
| + } |
| + |
| + content::StoragePartition* storage_partition = |
| + content::BrowserContext::GetStoragePartition( |
| + browser_context, web_contents->GetSiteInstance()); |
| + |
| + if (storage_partition == nullptr) { |
| + LOG(ERROR) << "No StoragePartition found"; |
| + Java_ServiceWorkerPaymentAppBridge_onGotAllManifests(env, jcallback); |
| + return; |
| + } |
| + |
| + content::PaymentAppContext* payment_app_context = |
| + storage_partition->GetPaymentAppContext(); |
| + |
| + if (payment_app_context == nullptr) { |
| + LOG(ERROR) << "No PaymentAppContext found"; |
| + Java_ServiceWorkerPaymentAppBridge_onGotAllManifests(env, jcallback); |
| + return; |
| } |
| - return java_manifests; |
| + payment_app_context->GetAllManifests(base::Bind( |
| + &OnGotAllManifests, env, ScopedJavaGlobalRef<jobject>(env, jweb_contents), |
|
Bernhard Bauer
2016/12/22 14:03:07
Don't bind the JNIEnv into a callback (or hold on
tommyt
2016/12/22 15:09:35
Done.
|
| + ScopedJavaGlobalRef<jobject>(env, jcallback))); |
| } |
| static void InvokePaymentApp(JNIEnv* env, |
| const JavaParamRef<jclass>& jcaller, |
| - const JavaParamRef<jstring>& scopeUrl, |
| - const JavaParamRef<jstring>& optionId, |
| - const JavaParamRef<jobject>& methodDataMap) { |
| + const JavaParamRef<jobject>& jweb_contents, |
| + jlong registration_id, |
| + const JavaParamRef<jstring>& joption_id, |
| + const JavaParamRef<jobjectArray>& jmethod_data) { |
| + // TODO(tommyt): crbug.com/669876. Implement this |
| NOTIMPLEMENTED(); |
| } |