Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(63)

Unified Diff: ios/chrome/browser/passwords/js_credential_manager.mm

Issue 1456983002: Move JS-related password manager code upstream (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ios/chrome/browser/passwords/js_credential_manager.mm
diff --git a/ios/chrome/browser/passwords/js_credential_manager.mm b/ios/chrome/browser/passwords/js_credential_manager.mm
new file mode 100644
index 0000000000000000000000000000000000000000..5432153c33a1bb1641857f27af7d34e847624f73
--- /dev/null
+++ b/ios/chrome/browser/passwords/js_credential_manager.mm
@@ -0,0 +1,106 @@
+// Copyright 2015 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/passwords/js_credential_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"
+#import "ios/web/web_state/js/credential_util.h"
Eugene But (OOO till 7-30) 2015/11/18 17:06:48 s/import/include
vabr (Chromium) 2015/11/19 10:02:27 Done.
+
+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
+
+namespace ios {
+namespace passwords {
+const char kPendingRequestErrorType[] = "PendingRequestError";
+const char kPendingRequestErrorMessage[] =
+ "There is already an outstanding request";
+const char kSecurityErrorType[] = "SecurityError";
+const char kPasswordStoreUnavailableErrorType[] =
+ "PasswordStoreUnavailableError";
+const char kPasswordStoreUnavailableErrorMessage[] =
+ "The password store is unavailable";
+const char kSecurityErrorMessageUntrustedOrigin[] = "The origin is untrusted";
+} // namespace passwords
+} // namespace ios
+
+@interface JSCredentialManager ()
+
+// Evaluates the JavaScript in |script|, which should evaluate to a JavaScript
+// boolean value. That value will be passed to |completionHandler|.
+- (void)evaluateScript:(NSString*)script
+ completionHandler:(void (^)(BOOL))completionHandler;
+
+@end
+
+@implementation JSCredentialManager
+
+- (void)resolvePromiseWithRequestID:(NSInteger)requestID
+ credential:(const web::Credential&)credential
+ completionHandler:(void (^)(BOOL))completionHandler {
+ base::DictionaryValue credentialData;
+ web::CredentialToDictionaryValue(credential, &credentialData);
+ std::string credentialDataJSON;
+ base::JSONWriter::Write(credentialData, &credentialDataJSON);
+ NSString* script = [NSString
+ stringWithFormat:@"__gCrWeb['credentialManager'].resolve(%ld, %@)",
+ static_cast<long>(requestID),
+ base::SysUTF8ToNSString(credentialDataJSON)];
+ [self evaluate:script
+ stringResultHandler:^(NSString* result, NSError* error) {
+ if (completionHandler)
+ completionHandler(!error && [result isEqualToString:@"true"]);
+ }];
+}
+
+- (void)resolvePromiseWithRequestID:(NSInteger)requestID
+ completionHandler:(void (^)(BOOL))completionHandler {
+ NSString* script =
+ [NSString stringWithFormat:@"__gCrWeb['credentialManager'].resolve(%ld)",
+ static_cast<long>(requestID)];
+ [self evaluateScript:script completionHandler:completionHandler];
+}
+
+- (void)rejectPromiseWithRequestID:(NSInteger)requestID
+ errorType:(NSString*)errorType
+ message:(NSString*)message
+ completionHandler:(void (^)(BOOL))completionHandler {
+ NSString* script = [NSString
+ stringWithFormat:@"__gCrWeb['credentialManager'].reject(%ld, %@, %@)",
+ static_cast<long>(requestID), JSONEscape(errorType),
+ JSONEscape(message)];
+ [self evaluateScript:script completionHandler:completionHandler];
+}
+
+- (void)evaluateScript:(NSString*)script
+ completionHandler:(void (^)(BOOL))completionHandler {
+ [self evaluate:script
+ stringResultHandler:^(NSString* result, NSError* error) {
+ if (completionHandler)
+ completionHandler(!error && [result isEqualToString:@"true"]);
+ }];
+}
+
+#pragma mark - Protected methods
+
+- (NSString*)scriptPath {
+ return @"credential_manager";
+}
+
+- (NSString*)presenceBeacon {
+ return @"__gCrWeb.credentialManager";
+}
+
+@end

Powered by Google App Engine
This is Rietveld 408576698