blob: 5445a4f6908592654893433b1b0cf2f3b3a81ce0 (
plain)
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
|
// Copyright (c) 2010 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 CHROME_RENDERER_FORM_MANAGER_H_
#define CHROME_RENDERER_FORM_MANAGER_H_
#include <map>
#include <vector>
#include "base/string16.h"
#include "third_party/WebKit/WebKit/chromium/public/WebFormControlElement.h"
#include "third_party/WebKit/WebKit/chromium/public/WebFormElement.h"
#include "webkit/glue/form_data.h"
namespace WebKit {
class WebFrame;
}
// Manages the forms in a RenderView.
class FormManager {
public:
// A bitfield mask for form requirements.
typedef enum {
REQUIRE_NONE = 0x0, // No requirements.
REQUIRE_AUTOCOMPLETE = 0x1, // Require that autocomplete != off.
REQUIRE_ELEMENTS_ENABLED = 0x2 // Require that disabled attribute is off.
} RequirementsMask;
FormManager();
virtual ~FormManager();
// Scans the DOM in |frame| extracting and storing forms.
void ExtractForms(WebKit::WebFrame* frame);
// Returns a vector of forms that match |requirements|.
void GetForms(std::vector<webkit_glue::FormData>* forms,
RequirementsMask requirements);
// Finds the form that contains |element| and returns it in |form|. Returns
// false if the form is not found.
bool FindForm(const WebKit::WebFormControlElement& element,
webkit_glue::FormData* form);
// Fills the form represented by |form|. |form| should have the name set to
// the name of the form to fill out, and the number of elements and values
// must match the number of stored elements in the form.
// TODO(jhawkins): Is matching on name alone good enough? It's possible to
// store multiple forms with the same names from different frames.
bool FillForm(const webkit_glue::FormData& form);
// Resets the stored set of forms.
void Reset();
private:
// A map of WebFormControlElements keyed by each element's name.
typedef std::map<string16, WebKit::WebFormControlElement>
FormControlElementMap;
// Stores the WebFormElement and the map of form control elements for each
// form.
struct FormElement {
WebKit::WebFormElement form_element;
FormControlElementMap control_elements;
};
// A map of vectors of FormElements keyed by the WebFrame containing each
// form.
typedef std::map<WebKit::WebFrame*, std::vector<FormElement*> >
WebFrameFormElementMap;
// Resets the forms for the specified |frame|.
void ResetFrame(WebKit::WebFrame* frame);
// Converts a FormElement to FormData storage.
// TODO(jhawkins): Modify FormElement so we don't need |frame|.
void FormElementToFormData(WebKit::WebFrame* frame,
const FormElement* form_element,
RequirementsMask requirements,
webkit_glue::FormData* form);
// Returns the corresponding label for |element|.
static string16 LabelForElement(const WebKit::WebFormControlElement& element);
// Infers corresponding label for |element| from surrounding context in the
// DOM. Contents of preceeding <p> tag or preceeding text element found in
// the form.
static string16 InferLabelForElement(
const WebKit::WebFormControlElement& element);
// The map of form elements.
WebFrameFormElementMap form_elements_map_;
DISALLOW_COPY_AND_ASSIGN(FormManager);
};
#endif // CHROME_RENDERER_FORM_MANAGER_H_
|