1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_PASSWORD_MANAGER_IOS_PASSWORD_FORM_HELPER_H_
#define COMPONENTS_PASSWORD_MANAGER_IOS_PASSWORD_FORM_HELPER_H_
#import <Foundation/Foundation.h>
#import "base/memory/ref_counted_memory.h"
#import "components/autofill/core/common/unique_ids.h"
#import "components/autofill/ios/form_util/form_activity_observer_bridge.h"
#import "ios/web/public/js_messaging/script_message.h"
#import "ios/web/public/web_state_observer_bridge.h"
#import "url/gurl.h"
NS_ASSUME_NONNULL_BEGIN
@class PasswordFormHelper;
namespace autofill {
class FormData;
struct PasswordFormFillData;
} // namespace autofill
namespace password_manager {
struct FillData;
} // namespace password_manager
namespace web {
class WebFrame;
class WebState;
} // namespace web
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
//
// Status returned after handling the submitted form. Any item that isn't
// kHandled represents a rejection where the submission wasn't handled.
enum class HandleSubmittedFormStatus {
kHandled = 0,
kRejectedNoWebState = 1,
kRejectedNoDelegate = 2,
kRejectedMessageBodyNotADict = 3,
kRejectedNoFrameMatchingId = 4,
kRejectedNoTrustedUrl = 5,
kRejectedCantExtractFormData = 6,
kMaxValue = kRejectedCantExtractFormData
};
// A protocol implemented by a delegate of PasswordFormHelper.
@protocol PasswordFormHelperDelegate
// Called when the password form is submitted.
- (void)formHelper:(PasswordFormHelper*)formHelper
didSubmitForm:(const autofill::FormData&)form
inFrame:(web::WebFrame*)frame;
@end
// Handles common form processing logic of password controller for both
// ios/chrome and ios/web_view.
// TODO(crbug.com/40701292): Consider folding this class into
// SharedPasswordController.
@interface PasswordFormHelper
: NSObject<FormActivityObserver, CRWWebStateObserver>
// Last committed URL of current web state.
// Returns empty URL if current web state is not available.
@property(nonatomic, readonly) const GURL& lastCommittedURL;
// The associated delegate.
@property(nonatomic, nullable, weak) id<PasswordFormHelperDelegate> delegate;
// Uses JavaScript to find password forms. Calls |completionHandler| with the
// extracted information used for matching and saving passwords. Calls
// |completionHandler| with an empty vector if no password forms are found.
- (void)findPasswordFormsInFrame:(web::WebFrame*)frame
completionHandler:
(nullable void (^)(const std::vector<autofill::FormData>&))
completionHandler;
// Fills new password field for (optional as @"") |newPasswordIdentifier| and
// for (optional as @"") confirm password field |confirmPasswordIdentifier| in
// the form identified by |formData|. Invokes |completionHandler| with true if
// any fields were filled, false otherwise.
- (void)fillPasswordForm:(autofill::FormRendererId)formIdentifier
inFrame:(web::WebFrame*)frame
newPasswordIdentifier:(autofill::FieldRendererId)newPasswordIdentifier
confirmPasswordIdentifier:
(autofill::FieldRendererId)confirmPasswordIdentifier
generatedPassword:(NSString*)generatedPassword
completionHandler:(nullable void (^)(BOOL))completionHandler;
// Autofills credentials into the page on credential suggestion selection.
// Credentials and input fields are specified by |fillData|. |fieldRendererID|
// specifies the unput on which the suggestion was accepted. Invokes
// |completionHandler| when finished with YES if successful and NO otherwise.
- (void)fillPasswordFormWithFillData:(password_manager::FillData)fillData
inFrame:(web::WebFrame*)frame
triggeredOnField:(autofill::FieldRendererId)fieldRendererID
completionHandler:(nullable void (^)(BOOL))completionHandler;
// Finds the password form with unique ID |formIdentifier| and calls
// |completionHandler| with the populated |FormData| data structure. |found| is
// YES if the current form was found successfully, NO otherwise.
- (void)extractPasswordFormData:(autofill::FormRendererId)formIdentifier
inFrame:(web::WebFrame*)frame
completionHandler:
(void (^)(BOOL found,
const autofill::FormData& form))completionHandler;
// Updates the stored field data. In case if there is a presaved credential it
// updates the presaved credential.
- (void)updateFieldDataOnUserInput:(autofill::FieldRendererId)field_id
inFrame:(web::WebFrame*)frame
inputValue:(NSString*)field_value;
// Processes `message` sent by JavaScript to the `PasswordFormSubmitButtonClick`
// handler.
- (HandleSubmittedFormStatus)handleFormSubmittedMessage:
(const web::ScriptMessage&)message;
// Creates a instance with the given |webState|.
- (instancetype)initWithWebState:(web::WebState*)webState
NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE;
@end
NS_ASSUME_NONNULL_END
#endif // COMPONENTS_PASSWORD_MANAGER_IOS_PASSWORD_FORM_HELPER_H_
|