text: // 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.
  #ifndef IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_CONTROLLER_H_
  #define IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_CONTROLLER_H_
  
  #import <Foundation/NSObject.h>
  
  #include <memory>
  
  #import "components/autofill/ios/browser/form_suggestion_provider.h"
  #import "ios/chrome/browser/passwords/ios_chrome_password_manager_client.h"
  #import "ios/chrome/browser/passwords/ios_chrome_password_manager_driver.h"
  #import "ios/web/public/web_state/web_state_observer_bridge.h"
  
  @protocol ApplicationCommands;
  @class NotifyUserAutoSigninViewController;
  @protocol PasswordFormFiller;
  @protocol PasswordsUiDelegate;
  @class UIViewController;
  
  namespace password_manager {
  class PasswordManagerClient;
  class PasswordManagerDriver;
  }  // namespace password_manager
  
  // Delegate for registering view controller and displaying its view. Used to
  // add views to BVC.
  @protocol PasswordControllerDelegate
  
  // Adds |viewController| as child controller in order to display auto sign-in
  // notification. Returns YES if view was displayed, NO otherwise.
  - (BOOL)displaySignInNotification:(UIViewController*)viewController
                          fromTabId:(NSString*)tabId;
  
  // Opens the list of saved passwords in the settings.
  - (void)displaySavedPasswordList;
  
  @end
  
  // Per-tab password controller. Handles password autofill and saving.
  @interface PasswordController : NSObject<CRWWebStateObserver,
                                           PasswordManagerClientDelegate,
                                           PasswordManagerDriverDelegate>
  
  // An object that can provide suggestions from this PasswordController.
  @property(nonatomic, readonly) id<FormSuggestionProvider> suggestionProvider;
  
  // The PasswordManagerClient owned by this PasswordController.
  @property(nonatomic, readonly)
      password_manager::PasswordManagerClient* passwordManagerClient;
  
  // The PasswordManagerDriver owned by this PasswordController.
  @property(nonatomic, readonly)
      password_manager::PasswordManagerDriver* passwordManagerDriver;
  
  // The PasswordFormFiller owned by this PasswordController.
  @property(nonatomic, readonly) id<PasswordFormFiller> passwordFormFiller;
  
  // The base view controller from which to present UI.
  @property(nonatomic, readwrite, weak) UIViewController* baseViewController;
  
  // The dispatcher used for the PasswordController. This property can return nil
  // even after being set to a non-nil object.
  @property(nonatomic, weak) id<ApplicationCommands> dispatcher;
  
  // Delegate used by this PasswordController to show UI on BVC.
  @property(weak, nonatomic) id<PasswordControllerDelegate> delegate;
  
  // |webState| should not be nil.
  - (instancetype)initWithWebState:(web::WebState*)webState;
  
  // This is just for testing.
  - (instancetype)
     initWithWebState:(web::WebState*)webState
               client:(std::unique_ptr<password_manager::PasswordManagerClient>)
                          passwordManagerClient NS_DESIGNATED_INITIALIZER;
  
  - (instancetype)init NS_UNAVAILABLE;
  
  // Releases all tab-specific members. Must be called when the Tab is closing,
  // otherwise invalid memory might be accessed during destruction.
  - (void)detach;
  
  @end
  
  #endif  // IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_CONTROLLER_H_
  