OLD | NEW |
(Empty) | |
| 1 // Copyright 2016 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 #import "ios/chrome/browser/payments/js_payment_request_manager.h" |
| 6 |
| 7 #include "base/json/json_writer.h" |
| 8 #include "base/json/string_escape.h" |
| 9 #include "base/logging.h" |
| 10 #include "base/strings/sys_string_conversions.h" |
| 11 #include "base/values.h" |
| 12 #include "ios/web/public/payments/payment_request.h" |
| 13 |
| 14 namespace { |
| 15 |
| 16 // Sanitizes |JSON| and wraps it in quotes so it can be injected safely in |
| 17 // JavaScript. |
| 18 NSString* JSONEscape(NSString* JSON) { |
| 19 return base::SysUTF8ToNSString( |
| 20 base::GetQuotedJSONString(base::SysNSStringToUTF8(JSON))); |
| 21 } |
| 22 |
| 23 } // namespace |
| 24 |
| 25 @interface JSPaymentRequestManager () |
| 26 |
| 27 // Executes the JavaScript in |script| and passes a BOOL to |completionHandler| |
| 28 // indicating whether an error occurred. The resolve and reject functions in the |
| 29 // Payment Request JavaScript do not return values so the result is ignored. |
| 30 - (void)executeScript:(NSString*)script |
| 31 completionHandler:(void (^)(BOOL))completionHandler; |
| 32 |
| 33 @end |
| 34 |
| 35 @implementation JSPaymentRequestManager |
| 36 |
| 37 - (void)resolveRequestPromise:(const web::PaymentResponse&)paymentResponse |
| 38 completionHandler:(void (^)(BOOL))completionHandler { |
| 39 std::unique_ptr<base::DictionaryValue> paymentResponseData = |
| 40 paymentResponse.ToDictionaryValue(); |
| 41 std::string paymentResponseDataJSON; |
| 42 base::JSONWriter::Write(*paymentResponseData, &paymentResponseDataJSON); |
| 43 NSString* script = [NSString |
| 44 stringWithFormat: |
| 45 @"__gCrWeb['paymentRequestManager'].pendingRequest.resolve(%@)", |
| 46 base::SysUTF8ToNSString(paymentResponseDataJSON)]; |
| 47 [self executeScript:script completionHandler:completionHandler]; |
| 48 } |
| 49 |
| 50 - (void)rejectRequestPromise:(NSString*)errorMessage |
| 51 completionHandler:(void (^)(BOOL))completionHandler { |
| 52 NSString* script = [NSString |
| 53 stringWithFormat: |
| 54 @"__gCrWeb['paymentRequestManager'].pendingRequest.reject(%@)", |
| 55 JSONEscape(errorMessage)]; |
| 56 [self executeScript:script completionHandler:completionHandler]; |
| 57 } |
| 58 |
| 59 - (void)resolveResponsePromise:(void (^)(BOOL))completionHandler { |
| 60 NSString* script = |
| 61 @"__gCrWeb['paymentRequestManager'].pendingResponse.resolve()"; |
| 62 [self executeScript:script completionHandler:completionHandler]; |
| 63 } |
| 64 |
| 65 - (void)rejectResponsePromise:(NSString*)errorMessage |
| 66 completionHandler:(void (^)(BOOL))completionHandler { |
| 67 NSString* script = [NSString |
| 68 stringWithFormat: |
| 69 @"__gCrWeb['paymentRequestManager'].pendingResponse.reject(%@)", |
| 70 JSONEscape(errorMessage)]; |
| 71 [self executeScript:script completionHandler:completionHandler]; |
| 72 } |
| 73 |
| 74 - (void)executeScript:(NSString*)script |
| 75 completionHandler:(void (^)(BOOL))completionHandler { |
| 76 [self executeJavaScript:script |
| 77 completionHandler:^(id result, NSError* error) { |
| 78 if (completionHandler) |
| 79 completionHandler(!error); |
| 80 }]; |
| 81 } |
| 82 |
| 83 #pragma mark - Protected methods |
| 84 |
| 85 - (NSString*)scriptPath { |
| 86 return @"payment_request_manager"; |
| 87 } |
| 88 |
| 89 - (NSString*)presenceBeacon { |
| 90 return @"__gCrWeb.paymentRequestManager"; |
| 91 } |
| 92 |
| 93 @end |
OLD | NEW |