Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5688)

Unified Diff: chrome/browser/extensions/api/passwords_private/passwords_private_api.cc

Issue 1142693003: Implement the chrome.passwordsPrivate API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add password_ui_view_android.h. Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/api/passwords_private/passwords_private_api.cc
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc
index ce1128ab807c846af805e19541329ea36a7b229d..d0f83d97e4428249e558bed713503454a5fa6ccb 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc
@@ -5,7 +5,10 @@
#include "chrome/browser/extensions/api/passwords_private/passwords_private_api.h"
#include "base/values.h"
+#include "chrome/browser/extensions/api/passwords_private/passwords_private_delegate_factory.h"
#include "chrome/common/extensions/api/passwords_private.h"
+#include "components/password_manager/core/common/experiments.h"
+#include "content/public/browser/web_contents.h"
#include "extensions/browser/extension_function_registry.h"
namespace extensions {
@@ -18,9 +21,9 @@ PasswordsPrivateCanPasswordAccountBeManagedFunction::
ExtensionFunction::ResponseAction
PasswordsPrivateCanPasswordAccountBeManagedFunction::Run() {
- // TODO(khorimoto): Implement.
-
- return RespondNow(NoArguments());
+ scoped_ptr<base::FundamentalValue> visible(new base::FundamentalValue(
+ password_manager::ManageAccountLinkExperimentEnabled()));
+ return RespondNow(OneArgument(visible.Pass()));
}
////////////////////////////////////////////////////////////////////////////////
@@ -36,7 +39,11 @@ ExtensionFunction::ResponseAction
Create(*args_);
EXTENSION_FUNCTION_VALIDATE(parameters.get());
- // TODO(khorimoto): Implement.
+ PasswordsPrivateDelegate* delegate =
+ PasswordsPrivateDelegateFactory::GetForBrowserContext(browser_context());
+ delegate->RemoveSavedPassword(
+ parameters->login_pair.origin_url,
+ parameters->login_pair.username);
return RespondNow(NoArguments());
}
@@ -54,7 +61,9 @@ ExtensionFunction::ResponseAction
Params::Create(*args_);
EXTENSION_FUNCTION_VALIDATE(parameters.get());
- // TODO(khorimoto): Implement.
+ PasswordsPrivateDelegate* delegate =
+ PasswordsPrivateDelegateFactory::GetForBrowserContext(browser_context());
+ delegate->RemovePasswordException(parameters->exception_url);
return RespondNow(NoArguments());
}
@@ -63,6 +72,10 @@ ExtensionFunction::ResponseAction
// PasswordsPrivateGetPlaintextPasswordFunction
PasswordsPrivateGetPlaintextPasswordFunction::
+ PasswordsPrivateGetPlaintextPasswordFunction()
+ : observer_(nullptr) {}
+
+PasswordsPrivateGetPlaintextPasswordFunction::
~PasswordsPrivateGetPlaintextPasswordFunction() {}
ExtensionFunction::ResponseAction
@@ -72,9 +85,68 @@ ExtensionFunction::ResponseAction
Create(*args_);
EXTENSION_FUNCTION_VALIDATE(parameters.get());
- // TODO(khorimoto): Implement.
+ PasswordsPrivateDelegate* delegate =
+ PasswordsPrivateDelegateFactory::GetForBrowserContext(browser_context());
- return RespondNow(NoArguments());
+ // Set up an observer for the plaintext password retrieval. When the password
+ // has been fetched, the observer will be deleted in
+ // ReplyWithPlaintextPassword().
+ observer_ = new PlaintextPasswordObserver(
+ parameters->login_pair, make_scoped_refptr(this), delegate);
+
+ // Now, request the password and let the observer listen for it.
+ delegate->RequestShowPassword(
+ parameters->login_pair.origin_url,
+ parameters->login_pair.username,
+ content::WebContents::FromRenderViewHost(render_view_host())
+ ->GetTopLevelNativeWindow());
+
+ return RespondLater();
+}
+
+void PasswordsPrivateGetPlaintextPasswordFunction::ReplyWithPlaintextPassword(
+ const std::string& plaintext_password) {
+ scoped_ptr<base::StringValue> password_value(
+ new base::StringValue(plaintext_password));
+ Respond(OneArgument(password_value.Pass()));
+
+ // Delete |observer_|. This, in turn, will also cause |this| to be deleted
+ // since |observer_|'s |fn_needing_reply| will have its refcount decremented
+ // to 0.
+ delete observer_;
+}
+
+PasswordsPrivateGetPlaintextPasswordFunction::PlaintextPasswordObserver::
+ PlaintextPasswordObserver(
+ const extensions::api::passwords_private::LoginPair& login_pair,
+ const scoped_refptr<extensions::
+ PasswordsPrivateGetPlaintextPasswordFunction> fn_needing_reply,
+ extensions::PasswordsPrivateDelegate* delegate)
+ : fn_needing_reply_(fn_needing_reply),
+ delegate_(delegate) {
+ // Unfortunately, the copy constructor for generated API dictionaries is
+ // private, so copy the fields individually.
+ login_pair_.origin_url = login_pair.origin_url;
+ login_pair_.username = login_pair.username;
+
+ // Observe plaintext password retrieval.
+ delegate_->AddObserver(this);
+}
+
+void PasswordsPrivateGetPlaintextPasswordFunction::PlaintextPasswordObserver::
+ OnPlaintextPasswordFetched(
+ const std::string& origin_url,
+ const std::string& username,
+ const std::string& plaintext_password) {
+ if (login_pair_.origin_url == origin_url &&
+ login_pair_.username == username) {
+ fn_needing_reply_->ReplyWithPlaintextPassword(plaintext_password);
+ }
+}
+
+PasswordsPrivateGetPlaintextPasswordFunction::PlaintextPasswordObserver::
+ ~PlaintextPasswordObserver() {
+ delegate_->RemoveObserver(this);
}
} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698