| Index: ios/chrome/browser/passwords/credential_manager.h
|
| diff --git a/ios/chrome/browser/passwords/credential_manager.h b/ios/chrome/browser/passwords/credential_manager.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..9a0efcef80d27205d8f05a444873fced1d7960b1
|
| --- /dev/null
|
| +++ b/ios/chrome/browser/passwords/credential_manager.h
|
| @@ -0,0 +1,131 @@
|
| +// 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.
|
| +
|
| +#ifndef IOS_CHROME_BROWSER_PASSWORDS_CREDENTIAL_MANAGER_H_
|
| +#define IOS_CHROME_BROWSER_PASSWORDS_CREDENTIAL_MANAGER_H_
|
| +
|
| +#include <string>
|
| +#include <vector>
|
| +
|
| +#import "base/mac/scoped_nsobject.h"
|
| +#include "base/macros.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "base/memory/weak_ptr.h"
|
| +#include "base/prefs/pref_member.h"
|
| +#include "components/password_manager/core/browser/credential_manager_password_form_manager.h"
|
| +#include "components/password_manager/core/browser/credential_manager_pending_request_task.h"
|
| +#include "components/password_manager/core/browser/credential_manager_pending_require_user_mediation_task.h"
|
| +#include "components/password_manager/core/browser/password_manager_client.h"
|
| +#include "components/password_manager/core/browser/password_store.h"
|
| +#include "ios/web/public/web_state/web_state_observer.h"
|
| +
|
| +@class JSCredentialManager;
|
| +
|
| +// Implements the app-side of the CredentialManagement JavaScript API.
|
| +// Injects and listens to the injected JavaScript, owns and drives the user
|
| +// interface, and integrates with the password manager. This is the iOS
|
| +// equivalent of the upstream class CredentialManagerDispatcher. Note: Only
|
| +// activates on iOS 8 and later.
|
| +class CredentialManager
|
| + : public password_manager::CredentialManagerPasswordFormManagerDelegate,
|
| + public password_manager::CredentialManagerPendingRequestTaskDelegate,
|
| + public password_manager::
|
| + CredentialManagerPendingRequireUserMediationTaskDelegate,
|
| + public web::WebStateObserver {
|
| + public:
|
| + CredentialManager(web::WebState* web_state,
|
| + password_manager::PasswordManagerClient* client,
|
| + password_manager::PasswordManagerDriver* driver,
|
| + JSCredentialManager* js_manager);
|
| + ~CredentialManager() override;
|
| +
|
| + // web::WebStateObserver:
|
| + void PageLoaded(
|
| + web::PageLoadCompletionStatus load_completion_status) override;
|
| + void CredentialsRequested(int request_id,
|
| + const GURL& source_url,
|
| + bool zero_click_only,
|
| + const std::vector<std::string>& federations,
|
| + bool is_user_initiated) override;
|
| + void SignedIn(int request_id,
|
| + const GURL& source_url,
|
| + const web::Credential& credential) override;
|
| + void SignedOut(int request_id, const GURL& source_url) override;
|
| + void WebStateDestroyed() override;
|
| +
|
| + // password_manager::CredentialManagerPendingRequestTaskDelegate:
|
| + bool IsZeroClickAllowed() const override;
|
| + GURL GetOrigin() const override;
|
| + void SendCredential(
|
| + int id,
|
| + const password_manager::CredentialInfo& credential) override;
|
| + password_manager::PasswordManagerClient* client() const override;
|
| + autofill::PasswordForm GetSynthesizedFormForOrigin() const override;
|
| +
|
| + // password_manager::CredentialManagerPendingRequireUserMediationTaskDelegate:
|
| + password_manager::PasswordStore* GetPasswordStore() override;
|
| + void DoneRequiringUserMediation() override;
|
| +
|
| + // CredentialManagerPasswordFormManagerDelegate:
|
| + void OnProvisionalSaveComplete() override;
|
| +
|
| + private:
|
| + // The errors that can cause a request to fail.
|
| + enum ErrorType {
|
| + // An existing request is outstanding.
|
| + ERROR_TYPE_PENDING_REQUEST = 0,
|
| +
|
| + // The password store isn't available.
|
| + ERROR_TYPE_PASSWORD_STORE_UNAVAILABLE,
|
| +
|
| + // The page origin is untrusted.
|
| + ERROR_TYPE_SECURITY_ERROR_UNTRUSTED_ORIGIN,
|
| + };
|
| +
|
| + // Sends a message via |js_manager_| to resolve the JavaScript Promise
|
| + // associated with |request_id|. Invoked after a page-initiated credential
|
| + // event is acknowledged by the PasswordStore.
|
| + void ResolvePromise(int request_id);
|
| +
|
| + // Sends a message via |js_manager_| to reject the JavaScript Promise
|
| + // associated with |request_id_| with the given |error_type|. Invoked after a
|
| + // page-initiated credential event, store, or retrieval fails.
|
| + void RejectPromise(int request_id, ErrorType error_type);
|
| +
|
| + // Determines the currently loaded page's URL from the active WebState, but
|
| + // only if it is absolutely trusted. Does not hit the network, but still might
|
| + // be costly depending on the webview. Returns true if successful.
|
| + bool GetUrlWithAbsoluteTrust(GURL* page_url);
|
| +
|
| + // The request to retrieve credentials from the PasswordStore.
|
| + scoped_ptr<password_manager::CredentialManagerPendingRequestTask>
|
| + pending_request_;
|
| +
|
| + // The task to notify the password manager that the user was signed out.
|
| + scoped_ptr<password_manager::CredentialManagerPendingRequireUserMediationTask>
|
| + pending_require_user_mediation_;
|
| +
|
| + // Saves credentials to the PasswordStore.
|
| + scoped_ptr<password_manager::CredentialManagerPasswordFormManager>
|
| + form_manager_;
|
| +
|
| + // Injected JavaScript to provide the API to web pages.
|
| + base::scoped_nsobject<JSCredentialManager> js_manager_;
|
| +
|
| + // Client to access Chrome-specific password manager functionality. Weak.
|
| + password_manager::PasswordManagerClient* client_;
|
| +
|
| + // Driver to access embedder-specific password manager functionality. Weak.
|
| + password_manager::PasswordManagerDriver* driver_;
|
| +
|
| + // Whether zero-click sign-in is enabled.
|
| + BooleanPrefMember zero_click_sign_in_enabled_;
|
| +
|
| + // Weak pointer factory for asynchronously resolving requests.
|
| + base::WeakPtrFactory<CredentialManager> weak_factory_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(CredentialManager);
|
| +};
|
| +
|
| +#endif // IOS_CHROME_BROWSER_PASSWORDS_CREDENTIAL_MANAGER_H_
|
|
|