| Index: ios/chrome/browser/payments/js_payment_request_manager.mm
|
| diff --git a/ios/chrome/browser/payments/js_payment_request_manager.mm b/ios/chrome/browser/payments/js_payment_request_manager.mm
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..83d0ce0b5437f19c19a9fa42cab5d05f2115ff6f
|
| --- /dev/null
|
| +++ b/ios/chrome/browser/payments/js_payment_request_manager.mm
|
| @@ -0,0 +1,93 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#import "ios/chrome/browser/payments/js_payment_request_manager.h"
|
| +
|
| +#include "base/json/json_writer.h"
|
| +#include "base/json/string_escape.h"
|
| +#include "base/logging.h"
|
| +#include "base/strings/sys_string_conversions.h"
|
| +#include "base/values.h"
|
| +#include "ios/web/public/payments/payment_request.h"
|
| +
|
| +namespace {
|
| +
|
| +// Sanitizes |JSON| and wraps it in quotes so it can be injected safely in
|
| +// JavaScript.
|
| +NSString* JSONEscape(NSString* JSON) {
|
| + return base::SysUTF8ToNSString(
|
| + base::GetQuotedJSONString(base::SysNSStringToUTF8(JSON)));
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +@interface JSPaymentRequestManager ()
|
| +
|
| +// Executes the JavaScript in |script| and passes a BOOL to |completionHandler|
|
| +// indicating whether an error occurred. The resolve and reject functions in the
|
| +// Payment Request JavaScript do not return values so the result is ignored.
|
| +- (void)executeScript:(NSString*)script
|
| + completionHandler:(void (^)(BOOL))completionHandler;
|
| +
|
| +@end
|
| +
|
| +@implementation JSPaymentRequestManager
|
| +
|
| +- (void)resolveRequestPromise:(const web::PaymentResponse&)paymentResponse
|
| + completionHandler:(void (^)(BOOL))completionHandler {
|
| + std::unique_ptr<base::DictionaryValue> paymentResponseData =
|
| + paymentResponse.ToDictionaryValue();
|
| + std::string paymentResponseDataJSON;
|
| + base::JSONWriter::Write(*paymentResponseData, &paymentResponseDataJSON);
|
| + NSString* script = [NSString
|
| + stringWithFormat:
|
| + @"__gCrWeb['paymentRequestManager'].pendingRequest.resolve(%@)",
|
| + base::SysUTF8ToNSString(paymentResponseDataJSON)];
|
| + [self executeScript:script completionHandler:completionHandler];
|
| +}
|
| +
|
| +- (void)rejectRequestPromise:(NSString*)errorMessage
|
| + completionHandler:(void (^)(BOOL))completionHandler {
|
| + NSString* script = [NSString
|
| + stringWithFormat:
|
| + @"__gCrWeb['paymentRequestManager'].pendingRequest.reject(%@)",
|
| + JSONEscape(errorMessage)];
|
| + [self executeScript:script completionHandler:completionHandler];
|
| +}
|
| +
|
| +- (void)resolveResponsePromise:(void (^)(BOOL))completionHandler {
|
| + NSString* script =
|
| + @"__gCrWeb['paymentRequestManager'].pendingResponse.resolve()";
|
| + [self executeScript:script completionHandler:completionHandler];
|
| +}
|
| +
|
| +- (void)rejectResponsePromise:(NSString*)errorMessage
|
| + completionHandler:(void (^)(BOOL))completionHandler {
|
| + NSString* script = [NSString
|
| + stringWithFormat:
|
| + @"__gCrWeb['paymentRequestManager'].pendingResponse.reject(%@)",
|
| + JSONEscape(errorMessage)];
|
| + [self executeScript:script completionHandler:completionHandler];
|
| +}
|
| +
|
| +- (void)executeScript:(NSString*)script
|
| + completionHandler:(void (^)(BOOL))completionHandler {
|
| + [self executeJavaScript:script
|
| + completionHandler:^(id result, NSError* error) {
|
| + if (completionHandler)
|
| + completionHandler(!error);
|
| + }];
|
| +}
|
| +
|
| +#pragma mark - Protected methods
|
| +
|
| +- (NSString*)scriptPath {
|
| + return @"payment_request_manager";
|
| +}
|
| +
|
| +- (NSString*)presenceBeacon {
|
| + return @"__gCrWeb.paymentRequestManager";
|
| +}
|
| +
|
| +@end
|
|
|