1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
// Copyright 2013 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 COMPONENTS_AUTOFILL_CONTENT_RENDERER_PASSWORD_GENERATION_AGENT_H_
#define COMPONENTS_AUTOFILL_CONTENT_RENDERER_PASSWORD_GENERATION_AGENT_H_
#include <map>
#include <utility>
#include <vector>
#include "base/memory/linked_ptr.h"
#include "base/memory/scoped_ptr.h"
#include "content/public/renderer/render_frame_observer.h"
#include "third_party/WebKit/public/web/WebInputElement.h"
#include "url/gurl.h"
namespace blink {
class WebDocument;
}
namespace autofill {
struct FormData;
struct PasswordForm;
// This class is responsible for controlling communication for password
// generation between the browser (which shows the popup and generates
// passwords) and WebKit (shows the generation icon in the password field).
class PasswordGenerationAgent : public content::RenderFrameObserver {
public:
explicit PasswordGenerationAgent(content::RenderFrame* render_frame);
~PasswordGenerationAgent() override;
// Returns true if the field being changed is one where a generated password
// is being offered. Updates the state of the popup if necessary.
bool TextDidChangeInTextField(const blink::WebInputElement& element);
// Returns true if the newly focused node caused the generation UI to show.
bool FocusedNodeHasChanged(const blink::WebNode& node);
// Called when new form controls are inserted.
void OnDynamicFormsSeen();
// The length that a password can be before the UI is hidden.
static const size_t kMaximumOfferSize = 5;
protected:
// Returns true if the document for |render_frame()| is one that we should
// consider analyzing. Virtual so that it can be overriden during testing.
virtual bool ShouldAnalyzeDocument() const;
// RenderViewObserver:
bool OnMessageReceived(const IPC::Message& message) override;
// Use to force enable during testing.
void set_enabled(bool enabled) { enabled_ = enabled; }
private:
struct AccountCreationFormData {
linked_ptr<PasswordForm> form;
std::vector<blink::WebInputElement> password_elements;
AccountCreationFormData(
linked_ptr<PasswordForm> form,
std::vector<blink::WebInputElement> password_elements);
~AccountCreationFormData();
};
typedef std::vector<AccountCreationFormData> AccountCreationFormDataList;
// RenderFrameObserver:
void DidFinishDocumentLoad() override;
void DidFinishLoad() override;
// Message handlers.
void OnFormNotBlacklisted(const PasswordForm& form);
void OnPasswordAccepted(const base::string16& password);
void OnAccountCreationFormsDetected(
const std::vector<autofill::FormData>& forms);
// Helper function that will try and populate |password_elements_| and
// |possible_account_creation_form_|.
void FindPossibleGenerationForm();
// Helper function to decide if |passwords_| contains password fields for
// an account creation form. Sets |generation_element_| to the field that
// we want to trigger the generation UI on.
void DetermineGenerationElement();
// Show password generation UI anchored at |generation_element_|.
void ShowGenerationPopup();
// Show UI for editing a generated password at |generation_element_|.
void ShowEditingPopup();
// Hides a password generation popup if one exists.
void HidePopup();
// Stores forms that are candidates for account creation.
AccountCreationFormDataList possible_account_creation_forms_;
// Stores the origins of the password forms confirmed not to be blacklisted
// by the browser. A form can be blacklisted if a user chooses "never save
// passwords for this site".
std::vector<GURL> not_blacklisted_password_form_origins_;
// Stores each password form for which the Autofill server classifies one of
// the form's fields as an ACCOUNT_CREATION_PASSWORD. These forms will
// not be sent if the feature is disabled.
std::vector<autofill::FormData> generation_enabled_forms_;
// Data for form which generation is allowed on.
scoped_ptr<AccountCreationFormData> generation_form_data_;
// Element where we want to trigger password generation UI.
blink::WebInputElement generation_element_;
// If the password field at |generation_element_| contains a generated
// password.
bool password_is_generated_;
// True if a password was generated and the user edited it. Used for UMA
// stats.
bool password_edited_;
// True if the generation popup was shown during this navigation. Used to
// track UMA stats per page visit rather than per display, since the former
// is more interesting.
bool generation_popup_shown_;
// True if the editing popup was shown during this navigation. Used to track
// UMA stats per page rather than per display, since the former is more
// interesting.
bool editing_popup_shown_;
// If this feature is enabled. Controlled by Finch.
bool enabled_;
DISALLOW_COPY_AND_ASSIGN(PasswordGenerationAgent);
};
} // namespace autofill
#endif // COMPONENTS_AUTOFILL_CONTENT_RENDERER_PASSWORD_GENERATION_AGENT_H_
|