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

Unified Diff: chrome/renderer/autofill/password_generation_manager.cc

Issue 10449099: Use shadow DOM API to show icon for password generation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments Created 8 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/renderer/autofill/password_generation_manager.cc
diff --git a/chrome/renderer/autofill/password_generation_manager.cc b/chrome/renderer/autofill/password_generation_manager.cc
index b4bc16f58350d93ffd79e23a12be8b52180c80d9..783fc8f4927452dd6f12545abf59a61888c04b9b 100644
--- a/chrome/renderer/autofill/password_generation_manager.cc
+++ b/chrome/renderer/autofill/password_generation_manager.cc
@@ -6,13 +6,16 @@
#include "base/logging.h"
#include "chrome/common/autofill_messages.h"
+#include "content/public/renderer/render_view.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebCString.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebRect.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebVector.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputElement.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFormElement.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebRect.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebVector.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
#include "ui/gfx/rect.h"
namespace autofill {
@@ -20,7 +23,9 @@ namespace autofill {
PasswordGenerationManager::PasswordGenerationManager(
content::RenderView* render_view)
: content::RenderViewObserver(render_view),
- enabled_(false) {}
+ enabled_(false) {
+ render_view->GetWebView()->addTextFieldDecoratorClient(this);
+}
PasswordGenerationManager::~PasswordGenerationManager() {}
void PasswordGenerationManager::DidFinishDocumentLoad(WebKit::WebFrame* frame) {
@@ -29,14 +34,14 @@ void PasswordGenerationManager::DidFinishDocumentLoad(WebKit::WebFrame* frame) {
if (!enabled_)
return;
- if (!ShouldAnalyzeFrame(*frame))
+ if (!ShouldAnalyzeDocument(frame->document()))
return;
WebKit::WebVector<WebKit::WebFormElement> forms;
frame->document().forms(forms);
for (size_t i = 0; i < forms.size(); ++i) {
const WebKit::WebFormElement& web_form = forms[i];
- if (!web_form.autoComplete())
+ if (web_form.isNull() || !web_form.autoComplete())
continue;
// Grab all of the passwords for each form.
@@ -50,21 +55,26 @@ void PasswordGenerationManager::DidFinishDocumentLoad(WebKit::WebFrame* frame) {
if (input_element && input_element->isPasswordField())
passwords.push_back(*input_element);
}
+
// For now, just assume that if there are two password fields in the
- // form that this is meant for account creation.
+ // form that this is meant for account creation. Also, we assume that there
+ // is only one account creation field per URL.
// TODO(gcasto): Determine better heauristics for this.
if (passwords.size() == 2) {
- account_creation_elements_ = make_pair(passwords[0], passwords);
- break;
+ passwords_ = passwords;
+ // Make the decoration visible for this element.
+ passwords[0].decorationElementFor(this).setAttribute("style",
+ "display:block");
+ return;
}
}
}
-bool PasswordGenerationManager::ShouldAnalyzeFrame(
- const WebKit::WebFrame& frame) const {
+bool PasswordGenerationManager::ShouldAnalyzeDocument(
+ const WebKit::WebDocument& document) const {
// Make sure that this security origin is allowed to use password manager.
// Generating a password that can't be saved is a bad idea.
- WebKit::WebSecurityOrigin origin = frame.document().securityOrigin();
+ WebKit::WebSecurityOrigin origin = document.securityOrigin();
if (!origin.canAccessPasswordManager()) {
DVLOG(1) << "No PasswordManager access";
return false;
@@ -73,25 +83,44 @@ bool PasswordGenerationManager::ShouldAnalyzeFrame(
return true;
}
-void PasswordGenerationManager::FocusedNodeChanged(
- const WebKit::WebNode& node) {
- WebKit::WebInputElement input_element =
- node.toConst<WebKit::WebInputElement>();
- if (!input_element.isNull() &&
- account_creation_elements_.first == input_element) {
- gfx::Rect rect(input_element.boundsInViewportSpace());
- webkit::forms::PasswordForm* password_form(
- webkit::forms::PasswordFormDomManager::CreatePasswordForm(
- input_element.form()));
-
- if (password_form) {
- Send(new AutofillHostMsg_ShowPasswordGenerationPopup(routing_id(),
- rect,
- *password_form));
- }
+bool PasswordGenerationManager::shouldAddDecorationTo(
+ const WebKit::WebInputElement& element) {
+ return element.isPasswordField();
+}
+
+bool PasswordGenerationManager::visibleByDefault() {
+ return false;
+}
+
+WebKit::WebCString PasswordGenerationManager::imageNameForNormalState() {
+ return WebKit::WebCString("generatePassword");
+}
+
+WebKit::WebCString PasswordGenerationManager::imageNameForDisabledState() {
+ return imageNameForNormalState();
+}
+
+WebKit::WebCString PasswordGenerationManager::imageNameForReadOnlyState() {
+ return imageNameForNormalState();
+}
+
+void PasswordGenerationManager::handleClick(WebKit::WebInputElement& element) {
+ gfx::Rect rect(element.decorationElementFor(this).boundsInViewportSpace());
+ webkit::forms::PasswordForm* password_form(
+ webkit::forms::PasswordFormDomManager::CreatePasswordForm(
+ element.form()));
+ if (password_form) {
+ Send(new AutofillHostMsg_ShowPasswordGenerationPopup(routing_id(),
+ rect,
+ *password_form));
}
}
+void PasswordGenerationManager::willDetach(
+ const WebKit::WebInputElement& element) {
+ // No implementation
+}
+
bool PasswordGenerationManager::OnMessageReceived(const IPC::Message& message) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(PasswordGenerationManager, message)
@@ -105,9 +134,8 @@ bool PasswordGenerationManager::OnMessageReceived(const IPC::Message& message) {
}
void PasswordGenerationManager::OnPasswordAccepted(const string16& password) {
- for (std::vector<WebKit::WebInputElement>::iterator it =
- account_creation_elements_.second.begin();
- it != account_creation_elements_.second.end(); ++it) {
+ for (std::vector<WebKit::WebInputElement>::iterator it = passwords_.begin();
+ it != passwords_.end(); ++it) {
it->setValue(password);
it->setAutofilled(true);
}

Powered by Google App Engine
This is Rietveld 408576698