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 |