| Index: components/password_manager/content/renderer/credential_manager_client.cc
|
| diff --git a/components/password_manager/content/renderer/credential_manager_client.cc b/components/password_manager/content/renderer/credential_manager_client.cc
|
| index c3791bc636ad1c496b351bb81d39bd024233bf73..3c548e8adabe1f8ff2f6a0e5dd668296cc6777a7 100644
|
| --- a/components/password_manager/content/renderer/credential_manager_client.cc
|
| +++ b/components/password_manager/content/renderer/credential_manager_client.cc
|
| @@ -9,14 +9,10 @@
|
| #include <memory>
|
| #include <utility>
|
|
|
| -#include "base/bind.h"
|
| -#include "base/logging.h"
|
| -#include "components/password_manager/content/public/cpp/type_converters.h"
|
| +#include "components/password_manager/content/common/credential_manager_content_utils.h"
|
| +#include "components/password_manager/content/common/credential_manager_messages.h"
|
| #include "components/password_manager/core/common/credential_manager_types.h"
|
| -#include "content/public/common/service_registry.h"
|
| -#include "content/public/renderer/render_frame.h"
|
| #include "content/public/renderer/render_view.h"
|
| -#include "mojo/common/url_type_converters.h"
|
| #include "third_party/WebKit/public/platform/WebCredential.h"
|
| #include "third_party/WebKit/public/platform/WebCredentialManagerError.h"
|
| #include "third_party/WebKit/public/platform/WebFederatedCredential.h"
|
| @@ -27,128 +23,13 @@
|
|
|
| namespace {
|
|
|
| -blink::WebCredentialManagerError GetWebCredentialManagerErrorFromMojo(
|
| - mojom::CredentialManagerError error) {
|
| - switch (error) {
|
| - case mojom::CredentialManagerError::DISABLED:
|
| - return blink::WebCredentialManagerError::
|
| - WebCredentialManagerDisabledError;
|
| - case mojom::CredentialManagerError::PENDINGREQUEST:
|
| - return blink::WebCredentialManagerError::
|
| - WebCredentialManagerPendingRequestError;
|
| - case mojom::CredentialManagerError::PASSWORDSTOREUNAVAILABLE:
|
| - return blink::WebCredentialManagerError::
|
| - WebCredentialManagerPasswordStoreUnavailableError;
|
| - case mojom::CredentialManagerError::UNKNOWN:
|
| - return blink::WebCredentialManagerError::WebCredentialManagerUnknownError;
|
| - case mojom::CredentialManagerError::SUCCESS:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| -
|
| - NOTREACHED();
|
| - return blink::WebCredentialManagerError::WebCredentialManagerUnknownError;
|
| -}
|
| -
|
| -// Takes ownership of blink::WebCredentialManagerClient::NotificationCallbacks
|
| -// pointer. When the wrapper is destroyed, if |callbacks| is still alive
|
| -// its onError() will get called.
|
| -class NotificationCallbacksWrapper {
|
| - public:
|
| - explicit NotificationCallbacksWrapper(
|
| - blink::WebCredentialManagerClient::NotificationCallbacks* callbacks);
|
| -
|
| - ~NotificationCallbacksWrapper();
|
| -
|
| - void NotifySuccess();
|
| -
|
| - private:
|
| - std::unique_ptr<blink::WebCredentialManagerClient::NotificationCallbacks>
|
| - callbacks_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(NotificationCallbacksWrapper);
|
| -};
|
| -
|
| -NotificationCallbacksWrapper::NotificationCallbacksWrapper(
|
| - blink::WebCredentialManagerClient::NotificationCallbacks* callbacks)
|
| - : callbacks_(callbacks) {}
|
| -
|
| -NotificationCallbacksWrapper::~NotificationCallbacksWrapper() {
|
| - if (callbacks_)
|
| - callbacks_->onError(blink::WebCredentialManagerUnknownError);
|
| -}
|
| -
|
| -void NotificationCallbacksWrapper::NotifySuccess() {
|
| - // Call onSuccess() and reset callbacks to avoid calling onError() in
|
| - // destructor.
|
| - if (callbacks_) {
|
| - callbacks_->onSuccess();
|
| - callbacks_.reset();
|
| - }
|
| -}
|
| -
|
| -// Takes ownership of blink::WebCredentialManagerClient::RequestCallbacks
|
| -// pointer. When the wrapper is destroied, if |callbacks| is still alive
|
| -// its onError() will get called.
|
| -class RequestCallbacksWrapper {
|
| - public:
|
| - explicit RequestCallbacksWrapper(
|
| - blink::WebCredentialManagerClient::RequestCallbacks* callbacks);
|
| -
|
| - ~RequestCallbacksWrapper();
|
| -
|
| - void NotifySuccess(mojom::CredentialInfoPtr info);
|
| -
|
| - void NotifyError(mojom::CredentialManagerError error);
|
| -
|
| - private:
|
| - std::unique_ptr<blink::WebCredentialManagerClient::RequestCallbacks>
|
| - callbacks_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(RequestCallbacksWrapper);
|
| -};
|
| -
|
| -RequestCallbacksWrapper::RequestCallbacksWrapper(
|
| - blink::WebCredentialManagerClient::RequestCallbacks* callbacks)
|
| - : callbacks_(callbacks) {}
|
| -
|
| -RequestCallbacksWrapper::~RequestCallbacksWrapper() {
|
| - if (callbacks_)
|
| - callbacks_->onError(blink::WebCredentialManagerUnknownError);
|
| -}
|
| -
|
| -void RequestCallbacksWrapper::NotifySuccess(mojom::CredentialInfoPtr info) {
|
| - // Call onSuccess() and reset callbacks to avoid calling onError() in
|
| - // destructor.
|
| - if (callbacks_) {
|
| - std::unique_ptr<blink::WebCredential> credential =
|
| - info.To<std::unique_ptr<blink::WebCredential>>();
|
| - callbacks_->onSuccess(std::move(credential));
|
| - callbacks_.reset();
|
| - }
|
| -}
|
| -
|
| -void RequestCallbacksWrapper::NotifyError(mojom::CredentialManagerError error) {
|
| - if (callbacks_) {
|
| - callbacks_->onError(GetWebCredentialManagerErrorFromMojo(error));
|
| - callbacks_.reset();
|
| - }
|
| -}
|
| -
|
| -void RespondToNotificationCallback(
|
| - NotificationCallbacksWrapper* callbacks_wrapper) {
|
| - callbacks_wrapper->NotifySuccess();
|
| -}
|
| -
|
| -void RespondToRequestCallback(RequestCallbacksWrapper* callbacks_wrapper,
|
| - mojom::CredentialManagerError error,
|
| - mojom::CredentialInfoPtr info) {
|
| - if (error == mojom::CredentialManagerError::SUCCESS) {
|
| - DCHECK(!info.is_null());
|
| - callbacks_wrapper->NotifySuccess(std::move(info));
|
| - } else {
|
| - DCHECK(info.is_null());
|
| - callbacks_wrapper->NotifyError(error);
|
| +template <typename T>
|
| +void ClearCallbacksMapWithErrors(T* callbacks_map) {
|
| + typename T::iterator iter(callbacks_map);
|
| + while (!iter.IsAtEnd()) {
|
| + iter.GetCurrentValue()->onError(blink::WebCredentialManagerUnknownError);
|
| + callbacks_map->Remove(iter.GetCurrentKey());
|
| + iter.Advance();
|
| }
|
| }
|
|
|
| @@ -160,32 +41,86 @@
|
| render_view->GetWebView()->setCredentialManagerClient(this);
|
| }
|
|
|
| -CredentialManagerClient::~CredentialManagerClient() {}
|
| +CredentialManagerClient::~CredentialManagerClient() {
|
| + ClearCallbacksMapWithErrors(&store_callbacks_);
|
| + ClearCallbacksMapWithErrors(&require_user_mediation_callbacks_);
|
| + ClearCallbacksMapWithErrors(&get_callbacks_);
|
| +}
|
|
|
| // -----------------------------------------------------------------------------
|
| -// Access mojo CredentialManagerService.
|
| +// Handle messages from the browser.
|
| +
|
| +bool CredentialManagerClient::OnMessageReceived(const IPC::Message& message) {
|
| + bool handled = true;
|
| + IPC_BEGIN_MESSAGE_MAP(CredentialManagerClient, message)
|
| + IPC_MESSAGE_HANDLER(CredentialManagerMsg_AcknowledgeStore,
|
| + OnAcknowledgeStore)
|
| + IPC_MESSAGE_HANDLER(CredentialManagerMsg_AcknowledgeRequireUserMediation,
|
| + OnAcknowledgeRequireUserMediation)
|
| + IPC_MESSAGE_HANDLER(CredentialManagerMsg_SendCredential, OnSendCredential)
|
| + IPC_MESSAGE_HANDLER(CredentialManagerMsg_RejectCredentialRequest,
|
| + OnRejectCredentialRequest)
|
| + IPC_MESSAGE_UNHANDLED(handled = false)
|
| + IPC_END_MESSAGE_MAP()
|
| + return handled;
|
| +}
|
| +
|
| +void CredentialManagerClient::OnAcknowledgeStore(int request_id) {
|
| + RespondToNotificationCallback(request_id, &store_callbacks_);
|
| +}
|
| +
|
| +void CredentialManagerClient::OnAcknowledgeRequireUserMediation(
|
| + int request_id) {
|
| + RespondToNotificationCallback(request_id, &require_user_mediation_callbacks_);
|
| +}
|
| +
|
| +void CredentialManagerClient::OnSendCredential(int request_id,
|
| + const CredentialInfo& info) {
|
| + RequestCallbacks* callbacks = get_callbacks_.Lookup(request_id);
|
| + DCHECK(callbacks);
|
| + std::unique_ptr<blink::WebCredential> credential;
|
| + switch (info.type) {
|
| + case CredentialType::CREDENTIAL_TYPE_FEDERATED:
|
| + credential.reset(new blink::WebFederatedCredential(
|
| + info.id, info.federation, info.name, info.icon));
|
| + break;
|
| + case CredentialType::CREDENTIAL_TYPE_PASSWORD:
|
| + credential.reset(new blink::WebPasswordCredential(
|
| + info.id, info.password, info.name, info.icon));
|
| + break;
|
| + case CredentialType::CREDENTIAL_TYPE_EMPTY:
|
| + // Intentionally empty; we'll send nullptr to the onSuccess call below.
|
| + break;
|
| + }
|
| + callbacks->onSuccess(std::move(credential));
|
| + get_callbacks_.Remove(request_id);
|
| +}
|
| +
|
| +void CredentialManagerClient::OnRejectCredentialRequest(
|
| + int request_id,
|
| + blink::WebCredentialManagerError error) {
|
| + RequestCallbacks* callbacks = get_callbacks_.Lookup(request_id);
|
| + DCHECK(callbacks);
|
| + callbacks->onError(error);
|
| + get_callbacks_.Remove(request_id);
|
| +}
|
| +
|
| +// -----------------------------------------------------------------------------
|
| +// Dispatch messages from the renderer to the browser.
|
|
|
| void CredentialManagerClient::dispatchStore(
|
| const blink::WebCredential& credential,
|
| blink::WebCredentialManagerClient::NotificationCallbacks* callbacks) {
|
| - DCHECK(callbacks);
|
| - ConnectToMojoCMIfNeeded();
|
| -
|
| - mojom::CredentialInfoPtr info = mojom::CredentialInfo::From(credential);
|
| - mojo_cm_service_->Store(
|
| - std::move(info),
|
| - base::Bind(&RespondToNotificationCallback,
|
| - base::Owned(new NotificationCallbacksWrapper(callbacks))));
|
| + int request_id = store_callbacks_.Add(callbacks);
|
| + CredentialInfo info(WebCredentialToCredentialInfo(credential));
|
| + Send(new CredentialManagerHostMsg_Store(routing_id(), request_id, info));
|
| }
|
|
|
| void CredentialManagerClient::dispatchRequireUserMediation(
|
| - blink::WebCredentialManagerClient::NotificationCallbacks* callbacks) {
|
| - DCHECK(callbacks);
|
| - ConnectToMojoCMIfNeeded();
|
| -
|
| - mojo_cm_service_->RequireUserMediation(
|
| - base::Bind(&RespondToNotificationCallback,
|
| - base::Owned(new NotificationCallbacksWrapper(callbacks))));
|
| + NotificationCallbacks* callbacks) {
|
| + int request_id = require_user_mediation_callbacks_.Add(callbacks);
|
| + Send(new CredentialManagerHostMsg_RequireUserMediation(routing_id(),
|
| + request_id));
|
| }
|
|
|
| void CredentialManagerClient::dispatchGet(
|
| @@ -193,27 +128,23 @@
|
| bool include_passwords,
|
| const blink::WebVector<blink::WebURL>& federations,
|
| RequestCallbacks* callbacks) {
|
| - DCHECK(callbacks);
|
| - ConnectToMojoCMIfNeeded();
|
| -
|
| + int request_id = get_callbacks_.Add(callbacks);
|
| std::vector<GURL> federation_vector;
|
| for (size_t i = 0; i < std::min(federations.size(), kMaxFederations); ++i)
|
| federation_vector.push_back(federations[i]);
|
| -
|
| - mojo_cm_service_->Get(
|
| - zero_click_only, include_passwords,
|
| - mojo::Array<mojo::String>::From(federation_vector),
|
| - base::Bind(&RespondToRequestCallback,
|
| - base::Owned(new RequestCallbacksWrapper(callbacks))));
|
| + Send(new CredentialManagerHostMsg_RequestCredential(
|
| + routing_id(), request_id, zero_click_only, include_passwords,
|
| + federation_vector));
|
| }
|
|
|
| -void CredentialManagerClient::ConnectToMojoCMIfNeeded() {
|
| - if (mojo_cm_service_)
|
| - return;
|
| -
|
| - content::RenderFrame* main_frame = render_view()->GetMainRenderFrame();
|
| - main_frame->GetServiceRegistry()->ConnectToRemoteService(
|
| - mojo::GetProxy(&mojo_cm_service_));
|
| +void CredentialManagerClient::RespondToNotificationCallback(
|
| + int request_id,
|
| + CredentialManagerClient::NotificationCallbacksMap* map) {
|
| + blink::WebCredentialManagerClient::NotificationCallbacks* callbacks =
|
| + map->Lookup(request_id);
|
| + DCHECK(callbacks);
|
| + callbacks->onSuccess();
|
| + map->Remove(request_id);
|
| }
|
|
|
| } // namespace password_manager
|
|
|