| Index: webkit/glue/dom_operations.cc
|
| ===================================================================
|
| --- webkit/glue/dom_operations.cc (revision 64639)
|
| +++ webkit/glue/dom_operations.cc (working copy)
|
| @@ -9,30 +9,28 @@
|
| #include "base/compiler_specific.h"
|
| #include "base/string_number_conversions.h"
|
| #include "base/string_split.h"
|
| +#include "base/string_util.h"
|
| #include "third_party/WebKit/WebKit/chromium/public/WebAnimationController.h"
|
| #include "third_party/WebKit/WebKit/chromium/public/WebDocument.h"
|
| #include "third_party/WebKit/WebKit/chromium/public/WebElement.h"
|
| -#include "third_party/WebKit/WebKit/chromium/public/WebFormElement.h"
|
| #include "third_party/WebKit/WebKit/chromium/public/WebFrame.h"
|
| #include "third_party/WebKit/WebKit/chromium/public/WebInputElement.h"
|
| #include "third_party/WebKit/WebKit/chromium/public/WebNode.h"
|
| #include "third_party/WebKit/WebKit/chromium/public/WebNodeCollection.h"
|
| #include "third_party/WebKit/WebKit/chromium/public/WebNodeList.h"
|
| +#include "third_party/WebKit/WebKit/chromium/public/WebString.h"
|
| #include "third_party/WebKit/WebKit/chromium/public/WebVector.h"
|
| #include "third_party/WebKit/WebKit/chromium/public/WebView.h"
|
| -#include "webkit/glue/form_data.h"
|
| -#include "webkit/glue/password_form_dom_manager.h"
|
| -#include "webkit/glue/webpasswordautocompletelistener_impl.h"
|
|
|
| using WebKit::WebAnimationController;
|
| using WebKit::WebDocument;
|
| using WebKit::WebElement;
|
| -using WebKit::WebFormElement;
|
| using WebKit::WebFrame;
|
| using WebKit::WebInputElement;
|
| using WebKit::WebNode;
|
| using WebKit::WebNodeCollection;
|
| using WebKit::WebNodeList;
|
| +using WebKit::WebString;
|
| using WebKit::WebVector;
|
| using WebKit::WebView;
|
|
|
| @@ -153,163 +151,6 @@
|
|
|
| namespace webkit_glue {
|
|
|
| -// Map element name to a list of pointers to corresponding elements to simplify
|
| -// form filling.
|
| -typedef std::map<string16, WebKit::WebInputElement>
|
| - FormInputElementMap;
|
| -
|
| -// Utility struct for form lookup and autofill. When we parse the DOM to lookup
|
| -// a form, in addition to action and origin URL's we have to compare all
|
| -// necessary form elements. To avoid having to look these up again when we want
|
| -// to fill the form, the FindFormElements function stores the pointers
|
| -// in a FormElements* result, referenced to ensure they are safe to use.
|
| -struct FormElements {
|
| - WebFormElement form_element;
|
| - FormInputElementMap input_elements;
|
| - FormElements() {
|
| - }
|
| -};
|
| -
|
| -typedef std::vector<FormElements*> FormElementsList;
|
| -
|
| -// Internal implementation of FillForm API.
|
| -static bool FillFormImpl(FormElements* fe, const FormData& data) {
|
| - if (!fe->form_element.autoComplete())
|
| - return false;
|
| -
|
| - std::map<string16, string16> data_map;
|
| - for (size_t i = 0; i < data.fields.size(); i++)
|
| - data_map[data.fields[i].name()] = data.fields[i].value();
|
| -
|
| - for (FormInputElementMap::iterator it = fe->input_elements.begin();
|
| - it != fe->input_elements.end(); ++it) {
|
| - WebKit::WebInputElement& element = it->second;
|
| - if (!element.value().isEmpty()) // Don't overwrite pre-filled values.
|
| - continue;
|
| - if (element.isPasswordField() &&
|
| - (!element.isEnabledFormControl() || element.hasAttribute("readonly"))) {
|
| - continue; // Don't fill uneditable password fields.
|
| - }
|
| - if (!element.isValidValue(data_map[it->first]))
|
| - continue;
|
| -
|
| - element.setValue(data_map[it->first]);
|
| - element.setAutofilled(true);
|
| - element.dispatchFormControlChangeEvent();
|
| - }
|
| -
|
| - return false;
|
| -}
|
| -
|
| -// Helper to search the given form element for the specified input elements
|
| -// in |data|, and add results to |result|.
|
| -static bool FindFormInputElements(WebFormElement* fe,
|
| - const FormData& data,
|
| - FormElements* result) {
|
| - // Loop through the list of elements we need to find on the form in
|
| - // order to autofill it. If we don't find any one of them, abort
|
| - // processing this form; it can't be the right one.
|
| - for (size_t j = 0; j < data.fields.size(); j++) {
|
| - WebVector<WebNode> temp_elements;
|
| - fe->getNamedElements(data.fields[j].name(), temp_elements);
|
| - if (temp_elements.isEmpty()) {
|
| - // We didn't find a required element. This is not the right form.
|
| - // Make sure no input elements from a partially matched form
|
| - // in this iteration remain in the result set.
|
| - // Note: clear will remove a reference from each InputElement.
|
| - result->input_elements.clear();
|
| - return false;
|
| - }
|
| - // This element matched, add it to our temporary result. It's possible
|
| - // there are multiple matches, but for purposes of identifying the form
|
| - // one suffices and if some function needs to deal with multiple
|
| - // matching elements it can get at them through the FormElement*.
|
| - // Note: This assignment adds a reference to the InputElement.
|
| - result->input_elements[data.fields[j].name()] =
|
| - temp_elements[0].to<WebInputElement>();
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -// Helper to locate form elements identified by |data|.
|
| -static void FindFormElements(WebView* view,
|
| - const FormData& data,
|
| - FormElementsList* results) {
|
| - DCHECK(view);
|
| - DCHECK(results);
|
| - WebFrame* main_frame = view->mainFrame();
|
| - if (!main_frame)
|
| - return;
|
| -
|
| - GURL::Replacements rep;
|
| - rep.ClearQuery();
|
| - rep.ClearRef();
|
| -
|
| - // Loop through each frame.
|
| - for (WebFrame* f = main_frame; f; f = f->traverseNext(false)) {
|
| - WebDocument doc = f->document();
|
| - if (!doc.isHTMLDocument())
|
| - continue;
|
| -
|
| - GURL full_origin(f->url());
|
| - if (data.origin != full_origin.ReplaceComponents(rep))
|
| - continue;
|
| -
|
| - WebVector<WebFormElement> forms;
|
| - f->forms(forms);
|
| -
|
| - for (size_t i = 0; i < forms.size(); ++i) {
|
| - WebFormElement fe = forms[i];
|
| - // Action URL must match.
|
| - GURL full_action(f->document().completeURL(fe.action()));
|
| - if (data.action != full_action.ReplaceComponents(rep))
|
| - continue;
|
| -
|
| - scoped_ptr<FormElements> curr_elements(new FormElements);
|
| - if (!FindFormInputElements(&fe, data, curr_elements.get()))
|
| - continue;
|
| -
|
| - // We found the right element.
|
| - // Note: this assignment adds a reference to |fe|.
|
| - curr_elements->form_element = fe;
|
| - results->push_back(curr_elements.release());
|
| - }
|
| - }
|
| -}
|
| -
|
| -void FillPasswordForm(WebView* view,
|
| - const PasswordFormFillData& data) {
|
| - FormElementsList forms;
|
| - // We own the FormElements* in forms.
|
| - FindFormElements(view, data.basic_data, &forms);
|
| - FormElementsList::iterator iter;
|
| - for (iter = forms.begin(); iter != forms.end(); ++iter) {
|
| - scoped_ptr<FormElements> form_elements(*iter);
|
| -
|
| - // If wait_for_username is true, we don't want to initially fill the form
|
| - // until the user types in a valid username.
|
| - if (!data.wait_for_username)
|
| - FillFormImpl(form_elements.get(), data.basic_data);
|
| -
|
| - // Attach autocomplete listener to enable selecting alternate logins.
|
| - // First, get pointers to username element.
|
| - WebInputElement username_element =
|
| - form_elements->input_elements[data.basic_data.fields[0].name()];
|
| -
|
| - // Get pointer to password element. (We currently only support single
|
| - // password forms).
|
| - WebInputElement password_element =
|
| - form_elements->input_elements[data.basic_data.fields[1].name()];
|
| -
|
| - username_element.document().frame()->registerPasswordListener(
|
| - username_element,
|
| - new WebPasswordAutocompleteListenerImpl(
|
| - new WebInputElementDelegate(username_element),
|
| - new WebInputElementDelegate(password_element),
|
| - data));
|
| - }
|
| -}
|
| -
|
| WebString GetSubResourceLinkFromElement(const WebElement& element) {
|
| const char* attribute_name = NULL;
|
| if (element.hasTagName("img") ||
|
|
|