| 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
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8dd3f53d103814c2e42a2d86da9109c5e868799f
|
| --- /dev/null
|
| +++ b/components/password_manager/content/renderer/credential_manager_client.cc
|
| @@ -0,0 +1,173 @@
|
| +// Copyright 2014 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.
|
| +
|
| +#include "components/password_manager/content/renderer/credential_manager_client.h"
|
| +
|
| +#include "components/password_manager/content/common/credential_manager_messages.h"
|
| +#include "components/password_manager/content/common/credential_manager_types.h"
|
| +#include "content/public/renderer/render_thread.h"
|
| +#include "content/public/renderer/render_view.h"
|
| +#include "third_party/WebKit/public/platform/WebCredential.h"
|
| +#include "third_party/WebKit/public/platform/WebCredentialManagerError.h"
|
| +#include "third_party/WebKit/public/web/WebView.h"
|
| +
|
| +namespace password_manager {
|
| +
|
| +namespace {
|
| +
|
| +template <typename T>
|
| +void ClearCallbacksMapWithErrors(T* callbacks_map) {
|
| + typename T::iterator iter(callbacks_map);
|
| + while (!iter.IsAtEnd()) {
|
| + blink::WebCredentialManagerError reason(
|
| + blink::WebCredentialManagerError::ErrorTypeUnknown,
|
| + "An unknown error occurred.");
|
| + iter.GetCurrentValue()->onError(&reason);
|
| + callbacks_map->Remove(iter.GetCurrentKey());
|
| + iter.Advance();
|
| + }
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +CredentialManagerClient::CredentialManagerClient()
|
| + : routing_id_(MSG_ROUTING_NONE),
|
| + render_thread_(content::RenderThread::Get()) {
|
| + DCHECK(render_thread_);
|
| +}
|
| +
|
| +CredentialManagerClient::~CredentialManagerClient() {
|
| + DisconnectFromRenderThread();
|
| +
|
| + ClearCallbacksMapWithErrors(&failed_sign_in_callbacks_);
|
| + ClearCallbacksMapWithErrors(&signed_in_callbacks_);
|
| + ClearCallbacksMapWithErrors(&signed_out_callbacks_);
|
| + ClearCallbacksMapWithErrors(&request_callbacks_);
|
| +}
|
| +
|
| +void CredentialManagerClient::OnRenderViewCreated(
|
| + content::RenderView* render_view) {
|
| + render_view->GetWebView()->setCredentialManagerClient(this);
|
| +}
|
| +
|
| +void CredentialManagerClient::OnRenderProcessShutdown() {
|
| + DisconnectFromRenderThread();
|
| +}
|
| +
|
| +int CredentialManagerClient::GetRoutingID() {
|
| + if (render_thread_ && routing_id_ == MSG_ROUTING_NONE) {
|
| + routing_id_ = render_thread_->GenerateRoutingID();
|
| + render_thread_->AddRoute(routing_id_, this);
|
| + }
|
| + return routing_id_;
|
| +}
|
| +
|
| +void CredentialManagerClient::DisconnectFromRenderThread() {
|
| + if (render_thread_ && routing_id_ != MSG_ROUTING_NONE)
|
| + render_thread_->RemoveRoute(routing_id_);
|
| + render_thread_ = NULL;
|
| + routing_id_ = MSG_ROUTING_NONE;
|
| +}
|
| +
|
| +// -----------------------------------------------------------------------------
|
| +// 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_AcknowledgeFailedSignIn,
|
| + OnAcknowledgeFailedSignIn)
|
| + IPC_MESSAGE_HANDLER(CredentialManagerMsg_AcknowledgeSignedIn,
|
| + OnAcknowledgeSignedIn)
|
| + IPC_MESSAGE_HANDLER(CredentialManagerMsg_AcknowledgeSignedOut,
|
| + OnAcknowledgeSignedOut)
|
| + IPC_MESSAGE_HANDLER(CredentialManagerMsg_SendCredential, OnSendCredential)
|
| + IPC_MESSAGE_UNHANDLED(handled = false)
|
| + IPC_END_MESSAGE_MAP()
|
| + return handled;
|
| +}
|
| +
|
| +void CredentialManagerClient::OnAcknowledgeFailedSignIn(int request_id) {
|
| + RespondToNotificationCallback(request_id, &failed_sign_in_callbacks_);
|
| +}
|
| +
|
| +void CredentialManagerClient::OnAcknowledgeSignedIn(int request_id) {
|
| + RespondToNotificationCallback(request_id, &signed_in_callbacks_);
|
| +}
|
| +
|
| +void CredentialManagerClient::OnAcknowledgeSignedOut(int request_id) {
|
| + RespondToNotificationCallback(request_id, &signed_out_callbacks_);
|
| +}
|
| +
|
| +void CredentialManagerClient::OnSendCredential(int request_id,
|
| + const CredentialInfo& info) {
|
| + RequestCallbacks* callbacks = request_callbacks_.Lookup(request_id);
|
| + DCHECK(callbacks);
|
| + // TODO(mkwst): Split into local/federated credentials.
|
| + blink::WebCredential credential(info.id, info.name, info.avatar);
|
| + callbacks->onSuccess(&credential);
|
| + request_callbacks_.Remove(request_id);
|
| +}
|
| +
|
| +// -----------------------------------------------------------------------------
|
| +// Dispatch messages from the renderer to the browser.
|
| +
|
| +void CredentialManagerClient::dispatchFailedSignIn(
|
| + const blink::WebCredential& credential,
|
| + blink::WebCredentialManagerClient::NotificationCallbacks* callbacks) {
|
| + int request_id = failed_sign_in_callbacks_.Add(callbacks);
|
| + CredentialInfo info(
|
| + credential.id(), credential.name(), credential.avatarURL());
|
| + if (render_thread_) {
|
| + render_thread_->Send(new CredentialManagerHostMsg_NotifyFailedSignIn(
|
| + GetRoutingID(), request_id, info));
|
| + }
|
| +}
|
| +
|
| +void CredentialManagerClient::dispatchSignedIn(
|
| + const blink::WebCredential& credential,
|
| + blink::WebCredentialManagerClient::NotificationCallbacks* callbacks) {
|
| + int request_id = signed_in_callbacks_.Add(callbacks);
|
| + CredentialInfo info(
|
| + credential.id(), credential.name(), credential.avatarURL());
|
| + if (render_thread_) {
|
| + render_thread_->Send(new CredentialManagerHostMsg_NotifySignedIn(
|
| + GetRoutingID(), request_id, info));
|
| + }
|
| +}
|
| +
|
| +void CredentialManagerClient::dispatchSignedOut(
|
| + NotificationCallbacks* callbacks) {
|
| + int request_id = signed_out_callbacks_.Add(callbacks);
|
| + if (render_thread_) {
|
| + render_thread_->Send(new CredentialManagerHostMsg_NotifySignedOut(
|
| + GetRoutingID(), request_id));
|
| + }
|
| +}
|
| +
|
| +void CredentialManagerClient::dispatchRequest(
|
| + bool zeroClickOnly,
|
| + const blink::WebVector<blink::WebURL>& federations,
|
| + RequestCallbacks* callbacks) {
|
| + int request_id = request_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]);
|
| + if (render_thread_) {
|
| + render_thread_->Send(new CredentialManagerHostMsg_RequestCredential(
|
| + GetRoutingID(), request_id, zeroClickOnly, federation_vector));
|
| + }
|
| +}
|
| +
|
| +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
|
|
|