-
Notifications
You must be signed in to change notification settings - Fork 6.6k
/
form_cache.h
130 lines (101 loc) · 5.03 KB
/
form_cache.h
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
// 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_FORM_CACHE_H_
#define COMPONENTS_AUTOFILL_CONTENT_RENDERER_FORM_CACHE_H_
#include <stddef.h>
#include <map>
#include <set>
#include <string>
#include <vector>
#include "base/gtest_prod_util.h"
#include "base/macros.h"
#include "components/autofill/core/common/field_data_manager.h"
#include "components/autofill/core/common/form_data.h"
#include "components/autofill/core/common/form_data_predictions.h"
#include "components/autofill/core/common/unique_ids.h"
namespace blink {
class WebFormControlElement;
class WebLocalFrame;
} // namespace blink
namespace autofill {
struct FormData;
struct FormDataPredictions;
// Manages the forms in a single RenderFrame.
class FormCache {
public:
explicit FormCache(blink::WebLocalFrame* frame);
~FormCache();
// Scans the DOM in |frame_| extracting and storing forms that have not been
// seen before. Returns the extracted forms. Note that modified forms are
// considered new forms.
std::vector<FormData> ExtractNewForms(
const FieldDataManager* field_data_manager);
// Resets the forms.
void Reset();
// Clears the values of all input elements in the section of the form that
// contains |element|. Returns false if the form is not found.
bool ClearSectionWithElement(const blink::WebFormControlElement& element);
// For each field in the |form|, if |attach_predictions_to_dom| is true, sets
// the title to include the field's heuristic type, server type, and
// signature; as well as the form's signature and the experiment id for the
// server predictions. In all cases, may emit console warnings regarding the
// use of autocomplete attributes.
bool ShowPredictions(const FormDataPredictions& form,
bool attach_predictions_to_dom);
// For a given |control_element| check whether it is eligible for manual
// filling on form interaction.
bool IsFormElementEligibleForManualFilling(
const blink::WebFormControlElement& control_element);
// Stores the FieldRendererId of the fields that are eligible for manual
// filling in a set.
void SetFieldsEligibleForManualFilling(
const std::vector<FieldRendererId>& fields_eligible_for_manual_filling);
private:
FRIEND_TEST_ALL_PREFIXES(FormCacheTest,
ShouldShowAutocompleteConsoleWarnings_Enabled);
FRIEND_TEST_ALL_PREFIXES(FormCacheTest,
ShouldShowAutocompleteConsoleWarnings_Disabled);
FRIEND_TEST_ALL_PREFIXES(FormCacheBrowserTest, FreeDataOnElementRemoval);
// Scans |control_elements| and returns the number of editable elements.
// Also logs warning messages for deprecated attribute if
// |log_deprecation_messages| is set.
size_t ScanFormControlElements(
const std::vector<blink::WebFormControlElement>& control_elements,
bool log_deprecation_messages);
// Saves initial state of checkbox and select elements.
void SaveInitialValues(
const std::vector<blink::WebFormControlElement>& control_elements);
// Returns whether we should show a console warning related to a wrong
// autocomplete attribute. We will show a warning if (1) there is no
// autocomplete attribute and we have a guess for one or (2) we recognize the
// autocomplete attribute but it appears to be the wrong one.
bool ShouldShowAutocompleteConsoleWarnings(
const std::string& predicted_autocomplete,
const std::string& actual_autocomplete);
// Clears the value of the |control_element|.
void ClearElement(blink::WebFormControlElement& control_element,
const blink::WebFormControlElement& element);
// Clears all entries from |initial_select_values_| and
// |initial_checked_state_| whose keys not contained in |ids_to_retain|.
void PruneInitialValueCaches(const std::set<FieldRendererId>& ids_to_retain);
// The frame this FormCache is associated with. Weak reference.
blink::WebLocalFrame* frame_;
// The cached forms. Used to prevent re-extraction of forms.
// TODO(crbug/896689) Move to std::map<unique_rederer_id, FormData>.
std::set<FormData, FormData::IdentityComparator> parsed_forms_;
// The synthetic FormData is for all the fieldsets in the document without a
// form owner.
FormData synthetic_form_;
// The cached initial values for <select> elements. Entries are keyed by
// unique_renderer_form_control_id of the WebSelectElements.
std::map<FieldRendererId, std::u16string> initial_select_values_;
// The cached initial values for checkable <input> elements. Entries are
// keyed by the unique_renderer_form_control_id of the WebInputElements.
std::map<FieldRendererId, bool> initial_checked_state_;
// Fields that are eligible to show manual filling on form interaction.
base::flat_set<FieldRendererId> fields_eligible_for_manual_filling_;
DISALLOW_COPY_AND_ASSIGN(FormCache);
};
} // namespace autofill
#endif // COMPONENTS_AUTOFILL_CONTENT_RENDERER_FORM_CACHE_H_