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

Unified Diff: ios/chrome/browser/passwords/js_password_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_password_manager.mm
diff --git a/ios/chrome/browser/passwords/js_password_manager.mm b/ios/chrome/browser/passwords/js_password_manager.mm
new file mode 100644
index 0000000000000000000000000000000000000000..6c47498d3e45218dee93e7f896bbb1320960e508
--- /dev/null
+++ b/ios/chrome/browser/passwords/js_password_manager.mm
@@ -0,0 +1,107 @@
+// Copyright 2012 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_password_manager.h"
+
+#include "base/json/string_escape.h"
+#include "base/logging.h"
+#include "base/strings/sys_string_conversions.h"
+
+namespace {
+// Santizies |str| and wraps it in quotes so it can be injected safely in
+// JavaScript.
+NSString* JSONEscape(NSString* str) {
Eugene But (OOO till 7-30) 2015/11/18 17:06:48 NIT: s/str/JSON here and in the comment
vabr (Chromium) 2015/11/19 10:02:27 Also here, I do not understand why the capitalisat
vabr (Chromium) 2015/11/19 16:45:02 Change to JSONString to match the others.
+ return base::SysUTF8ToNSString(
+ base::GetQuotedJSONString(base::SysNSStringToUTF8(str)));
+}
+} // namespace
+
+@interface JsPasswordManager ()
+// Injects a script that does two things:
+// 1. Injects password controller JavaScript in the page.
+// 2. Extracts the _submitted_ password form data from the DOM on the page.
+// The result is returned in |completionHandler|.
+// |completionHandler| cannot be nil.
+- (void)evaluateExtraScript:(NSString*)script
+ completionHandler:(void (^)(NSString*))completionHandler;
+@end
+
+@implementation JsPasswordManager
+
+- (void)findPasswordFormsWithCompletionHandler:
+ (void (^)(NSString*))completionHandler {
+ DCHECK(completionHandler);
+ [self evaluateExtraScript:@"__gCrWeb.findPasswordForms()"
+ completionHandler:completionHandler];
+}
+
+- (void)extractForm:(NSString*)formName
+ completionHandler:(void (^)(NSString*))completionHandler {
Eugene But (OOO till 7-30) 2015/11/18 17:06:48 Indent 4 spaces
vabr (Chromium) 2015/11/19 10:02:27 Cannot do, it conflicts with git cl format, and th
Eugene But (OOO till 7-30) 2015/11/19 15:13:21 This is a bug in clang format and presubmit messag
vabr (Chromium) 2015/11/19 16:45:02 Fair enough, done.
+ DCHECK(completionHandler);
+ NSString* extra = [NSString
+ stringWithFormat:@"__gCrWeb.getPasswordForm(%@)", JSONEscape(formName)];
+ [self evaluateExtraScript:extra completionHandler:completionHandler];
+}
+
+- (void)fillPasswordForm:(NSString*)jsonString
+ withUsername:(NSString*)username
+ password:(NSString*)password
+ completionHandler:(void (^)(BOOL))completionHandler {
+ DCHECK(completionHandler);
+ NSString* script = [NSString
+ stringWithFormat:@"__gCrWeb.fillPasswordForm(%@, %@, %@)", jsonString,
+ JSONEscape(username), JSONEscape(password)];
+ [self evaluate:script
+ stringResultHandler:^(NSString* result, NSError* error) {
+ completionHandler(!error && [result isEqualToString:@"true"]);
+ }];
+}
+
+- (void)clearAutofilledPasswordsInForm:(NSString*)formName
+ completionHandler:(void (^)(BOOL))completionHandler {
+ NSString* script =
+ [NSString stringWithFormat:@"__gCrWeb.clearAutofilledPasswords(%@)",
+ JSONEscape(formName)];
+ [self evaluate:script
+ stringResultHandler:^(NSString* result, NSError* error) {
+ completionHandler(!error && [result isEqualToString:@"true"]);
+ }];
+}
+
+- (void)fillPasswordForm:(NSString*)formName
+ withGeneratedPassword:(NSString*)password
+ completionHandler:(void (^)(BOOL))completionHandler {
+ NSString* script =
+ [NSString stringWithFormat:
+ @"__gCrWeb.fillPasswordFormWithGeneratedPassword(%@, %@)",
+ JSONEscape(formName), JSONEscape(password)];
+ [self evaluate:script
+ stringResultHandler:^(NSString* result, NSError* error) {
+ if (completionHandler)
+ completionHandler(!error && [result isEqualToString:@"true"]);
+ }];
+}
+
+#pragma mark -
+#pragma mark ProtectedMethods
+
+- (NSString*)scriptPath {
+ return @"password_controller";
+}
+
+#pragma mark -
+#pragma mark Private
+
+- (void)evaluateExtraScript:(NSString*)script
+ completionHandler:(void (^)(NSString*))completionHandler {
+ DCHECK(completionHandler);
+ [self injectDependenciesIfMissing];
+ NSString* js = [[self injectionContent] stringByAppendingString:script];
Eugene But (OOO till 7-30) 2015/11/18 17:06:48 s/js/JS
vabr (Chromium) 2015/11/19 10:02:27 Same push-back as for jsonString in ios/chrome/bro
vabr (Chromium) 2015/11/19 16:45:02 Done.
+ [self evaluate:js
+ stringResultHandler:^(NSString* result, NSError*) {
+ completionHandler(result);
+ }];
+}
+
+@end

Powered by Google App Engine
This is Rietveld 408576698