summaryrefslogtreecommitdiffstats
path: root/webkit
diff options
context:
space:
mode:
authordarin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-15 17:21:10 +0000
committerdarin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-15 17:21:10 +0000
commitdaa8c58ee49795d292312bbf217999c93693919c (patch)
tree561a327f148d74b0522871f15103e25a27b841f5 /webkit
parent0b97342d07fd3ef047432b52809d31d10432ee85 (diff)
downloadchromium_src-daa8c58ee49795d292312bbf217999c93693919c.zip
chromium_src-daa8c58ee49795d292312bbf217999c93693919c.tar.gz
chromium_src-daa8c58ee49795d292312bbf217999c93693919c.tar.bz2
Extract form related classes from the guts of WebFrameImpl.
Instead of having WebFrameImpl generate SearchableFormData, PasswordForm, and AutofillForm classes, allow the embedder (RenderView) to do so. This is done to help minimize the dependencies WebFrameImpl has on other code, which will make it easier to move WebFrame and WebDataSource into the WebKit API. Most significant change: Now, RenderView always sets a NavigationState on WebDataSource instances. We used to only do so for browser initiated navigations. This is done so that we can store things like SearchableFormData and friends on the NavigationState. To facilitate this change, it was necessary to add a way through the WebKit API to refer to a HTMLFormElement. This CL introduces WebForm, which is like a RefPtr<HTMLFormElement>, so you can just copy a WebForm around by value and the right thing happens. Some of the other changes are about moving more things into the webkit_glue namespace. On hindsight, I probably should have done that as a separate CL. BUG=10041 TEST=none R=brettw Review URL: http://codereview.chromium.org/126083 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@18395 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit')
-rw-r--r--webkit/api/public/WebForm.h75
-rw-r--r--webkit/api/public/WebFrameClient.h14
-rw-r--r--webkit/api/src/WebForm.cpp86
-rw-r--r--webkit/glue/autofill_form.cc23
-rw-r--r--webkit/glue/autofill_form.h14
-rw-r--r--webkit/glue/dom_operations.h1
-rw-r--r--webkit/glue/editor_client_impl.cc2
-rw-r--r--webkit/glue/glue_util.cc14
-rw-r--r--webkit/glue/glue_util.h8
-rw-r--r--webkit/glue/password_autocomplete_listener_unittest.cc1
-rw-r--r--webkit/glue/password_form_dom_manager.cc334
-rw-r--r--webkit/glue/password_form_dom_manager.h86
-rw-r--r--webkit/glue/searchable_form_data.cc49
-rw-r--r--webkit/glue/searchable_form_data.h17
-rw-r--r--webkit/glue/webdatasource.h16
-rw-r--r--webkit/glue/webdatasource_impl.cc15
-rw-r--r--webkit/glue/webdatasource_impl.h38
-rw-r--r--webkit/glue/webframe.h14
-rw-r--r--webkit/glue/webframe_impl.cc19
-rw-r--r--webkit/glue/webframe_impl.h2
-rw-r--r--webkit/glue/webframeloaderclient_impl.cc56
-rw-r--r--webkit/glue/webview_delegate.h21
-rw-r--r--webkit/glue/webview_impl.cc18
-rw-r--r--webkit/glue/webview_impl.h5
-rw-r--r--webkit/webkit.gyp2
25 files changed, 463 insertions, 467 deletions
diff --git a/webkit/api/public/WebForm.h b/webkit/api/public/WebForm.h
new file mode 100644
index 0000000..fe2e168
--- /dev/null
+++ b/webkit/api/public/WebForm.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WebForm_h
+#define WebForm_h
+
+#include "WebCommon.h"
+
+#if WEBKIT_IMPLEMENTATION
+namespace WebCore { class HTMLFormElement; }
+namespace WTF { template <typename T> class PassRefPtr; }
+#endif
+
+namespace WebKit {
+ class WebFormPrivate;
+
+ // A container for passing around a reference to a form element. Provides
+ // some information about the form.
+ class WebForm {
+ public:
+ ~WebForm() { reset(); }
+
+ WebForm() : m_private(0) { }
+ WebForm(const WebForm& f) : m_private(0) { assign(f); }
+ WebForm& operator=(const WebForm& f) { assign(f); return *this; }
+
+ WEBKIT_API void reset();
+ WEBKIT_API void assign(const WebForm&);
+
+ bool isNull() const { return m_private == 0; }
+
+ // Returns true if the form does not have "autocomplete=off" specified.
+ WEBKIT_API bool isAutoCompleteEnabled() const;
+
+#if WEBKIT_IMPLEMENTATION
+ WebForm(const WTF::PassRefPtr<WebCore::HTMLFormElement>&);
+ WebForm& operator=(const WTF::PassRefPtr<WebCore::HTMLFormElement>&);
+ operator WTF::PassRefPtr<WebCore::HTMLFormElement>() const;
+#endif
+
+ private:
+ void assign(WebFormPrivate*);
+ WebFormPrivate* m_private;
+ };
+
+} // namespace WebKit
+
+#endif
diff --git a/webkit/api/public/WebFrameClient.h b/webkit/api/public/WebFrameClient.h
index d03cf12..8140997 100644
--- a/webkit/api/public/WebFrameClient.h
+++ b/webkit/api/public/WebFrameClient.h
@@ -1,10 +1,10 @@
/*
* Copyright (C) 2009 Google Inc. All rights reserved.
- *
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
- *
+ *
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
@@ -14,7 +14,7 @@
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
- *
+ *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -37,6 +37,7 @@
#include "WebNavigationGesture.h"
namespace WebKit {
+ class WebForm;
class WebFrame;
class WebMediaPlayer;
class WebMediaPlayerClient;
@@ -47,7 +48,7 @@ namespace WebKit {
class WebFrameClient {
public:
- // Factory methods -----------------------------------------------------
+ // Factory methods -----------------------------------------------------
// May return null.
virtual WebPlugin* createPlugin(
@@ -85,6 +86,9 @@ namespace WebKit {
// Navigational notifications ------------------------------------------
+ // A form submission is about to occur.
+ virtual void willSubmitForm(WebFrame*, const WebForm&) = 0;
+
// A client-side redirect will occur. This may correspond to a <META
// refresh> or some script activity.
virtual void willPerformClientRedirect(
@@ -139,7 +143,7 @@ namespace WebKit {
// The navigation resulted in scrolling the page to a named anchor instead
// of downloading a new document.
- virtual void didChangeLocationWithinPage(WebFrame*, bool isNewNavigation) = 0;
+ virtual void didChangeLocationWithinPage(WebFrame*, bool isNewNavigation) = 0;
// Called upon update to scroll position, document state, and other
// non-navigational events related to the data held by WebHistoryItem.
diff --git a/webkit/api/src/WebForm.cpp b/webkit/api/src/WebForm.cpp
new file mode 100644
index 0000000..3ab7c4a
--- /dev/null
+++ b/webkit/api/src/WebForm.cpp
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "WebForm.h"
+
+#include "HTMLFormElement.h"
+#include <wtf/PassRefPtr.h>
+
+using namespace WebCore;
+
+namespace WebKit {
+
+class WebFormPrivate : public HTMLFormElement {
+};
+
+void WebForm::reset()
+{
+ assign(0);
+}
+
+void WebForm::assign(const WebForm& other)
+{
+ WebFormPrivate* p = const_cast<WebFormPrivate*>(other.m_private);
+ p->ref();
+ assign(p);
+}
+
+bool WebForm::isAutoCompleteEnabled() const
+{
+ ASSERT(!isNull());
+ return m_private->autoComplete();
+}
+
+WebForm::WebForm(const WTF::PassRefPtr<WebCore::HTMLFormElement>& element)
+ : m_private(static_cast<WebFormPrivate*>(element.releaseRef()))
+{
+}
+
+WebForm& WebForm::operator=(const WTF::PassRefPtr<WebCore::HTMLFormElement>& element)
+{
+ assign(static_cast<WebFormPrivate*>(element.releaseRef()));
+ return *this;
+}
+
+WebForm::operator WTF::PassRefPtr<WebCore::HTMLFormElement>() const
+{
+ return PassRefPtr<HTMLFormElement>(const_cast<WebFormPrivate*>(m_private));
+}
+
+void WebForm::assign(WebFormPrivate* p)
+{
+ // p is already ref'd for us by the caller
+ if (m_private)
+ m_private->deref();
+ m_private = p;
+}
+
+} // namespace WebKit
diff --git a/webkit/glue/autofill_form.cc b/webkit/glue/autofill_form.cc
index ff0725c..e484716 100644
--- a/webkit/glue/autofill_form.cc
+++ b/webkit/glue/autofill_form.cc
@@ -3,35 +3,33 @@
// found in the LICENSE file.
#include "config.h"
-#include "base/compiler_specific.h"
-MSVC_PUSH_WARNING_LEVEL(0);
#include "Frame.h"
#include "HTMLFormElement.h"
#include "HTMLInputElement.h"
#include "HTMLNames.h"
-MSVC_POP_WARNING();
-
#undef LOG
#include "base/basictypes.h"
#include "base/logging.h"
#include "base/string_util.h"
+#include "webkit/api/public/WebForm.h"
#include "webkit/glue/autofill_form.h"
#include "webkit/glue/glue_util.h"
-AutofillForm* AutofillForm::CreateAutofillForm(
- WebCore::HTMLFormElement* form) {
+using WebKit::WebForm;
+
+namespace webkit_glue {
+AutofillForm* AutofillForm::Create(const WebForm& webform) {
+ RefPtr<WebCore::HTMLFormElement> form = WebFormToHTMLFormElement(webform);
DCHECK(form);
WebCore::Frame* frame = form->document()->frame();
-
if (!frame)
return NULL;
WebCore::FrameLoader* loader = frame->loader();
-
if (!loader)
return NULL;
@@ -59,8 +57,7 @@ AutofillForm* AutofillForm::CreateAutofillForm(
continue;
// For each TEXT input field, store the name and value
- std::wstring value = webkit_glue::StringToStdWString(
- input_element->value());
+ std::wstring value = StringToStdWString(input_element->value());
TrimWhitespace(value, TRIM_LEADING, &value);
if (value.length() == 0)
continue;
@@ -78,16 +75,18 @@ AutofillForm* AutofillForm::CreateAutofillForm(
// static
std::wstring AutofillForm::GetNameForInputElement(WebCore::HTMLInputElement*
element) {
- std::wstring name = webkit_glue::StringToStdWString(element->name());
+ std::wstring name = StringToStdWString(element->name());
std::wstring trimmed_name;
TrimWhitespace(name, TRIM_LEADING, &trimmed_name);
if (trimmed_name.length() > 0)
return trimmed_name;
- name = webkit_glue::StringToStdWString(element->id());
+ name = StringToStdWString(element->id());
TrimWhitespace(name, TRIM_LEADING, &trimmed_name);
if (trimmed_name.length() > 0)
return trimmed_name;
return std::wstring();
}
+
+} // namespace webkit_glue
diff --git a/webkit/glue/autofill_form.h b/webkit/glue/autofill_form.h
index 8375e75..4cf1b20 100644
--- a/webkit/glue/autofill_form.h
+++ b/webkit/glue/autofill_form.h
@@ -9,13 +9,17 @@
#include <vector>
namespace WebCore {
- class HTMLInputElement;
- class HTMLFormElement;
+class HTMLInputElement;
}
+namespace WebKit {
+class WebForm;
+}
+
+namespace webkit_glue {
+
// The AutofillForm struct represents a single HTML form together with the
// values entered in the fields.
-
class AutofillForm {
public:
// Struct for storing name/value pairs.
@@ -29,7 +33,7 @@ class AutofillForm {
std::wstring value;
};
- static AutofillForm* CreateAutofillForm(WebCore::HTMLFormElement* form);
+ static AutofillForm* Create(const WebKit::WebForm& form);
// Returns the name that should be used for the specified |element| when
// storing autofill data. This is either the field name or its id, an empty
@@ -41,4 +45,6 @@ class AutofillForm {
std::vector<Element> elements;
};
+} // namespace webkit_glue
+
#endif // WEBKIT_GLUE_AUTOFILL_FORM_H_
diff --git a/webkit/glue/dom_operations.h b/webkit/glue/dom_operations.h
index a088ef7..f202def 100644
--- a/webkit/glue/dom_operations.h
+++ b/webkit/glue/dom_operations.h
@@ -14,6 +14,7 @@
namespace WebCore {
class Element;
+class HTMLInputElement;
class Node;
}
diff --git a/webkit/glue/editor_client_impl.cc b/webkit/glue/editor_client_impl.cc
index f2575c8..07d1b5c 100644
--- a/webkit/glue/editor_client_impl.cc
+++ b/webkit/glue/editor_client_impl.cc
@@ -35,6 +35,8 @@
#include "webkit/glue/webview.h"
#include "webkit/glue/webview_impl.h"
+using webkit_glue::AutofillForm;
+
// Arbitrary depth limit for the undo stack, to keep it from using
// unbounded memory. This is the maximum number of distinct undoable
// actions -- unbroken stretches of typed characters are coalesced
diff --git a/webkit/glue/glue_util.cc b/webkit/glue/glue_util.cc
index b85ad71..34bd0fe 100644
--- a/webkit/glue/glue_util.cc
+++ b/webkit/glue/glue_util.cc
@@ -17,6 +17,7 @@
#include "ChromiumDataObject.h"
#include "CString.h"
+#include "HTMLFormElement.h"
#include "IntPoint.h"
#include "IntRect.h"
#include "PlatformString.h"
@@ -30,6 +31,7 @@
#include "base/sys_string_conversions.h"
#include "googleurl/src/gurl.h"
#include "webkit/api/public/WebDragData.h"
+#include "webkit/api/public/WebForm.h"
#include "webkit/api/public/WebPoint.h"
#include "webkit/api/public/WebRect.h"
#include "webkit/api/public/WebSize.h"
@@ -226,6 +228,18 @@ PassRefPtr<WebCore::ChromiumDataObject> WebDragDataToChromiumDataObject(
return data;
}
+// FormElement conversions -----------------------------------------------------
+
+WebKit::WebForm HTMLFormElementToWebForm(
+ const WTF::PassRefPtr<WebCore::HTMLFormElement>& form) {
+ return form;
+}
+
+WTF::PassRefPtr<WebCore::HTMLFormElement> WebFormToHTMLFormElement(
+ const WebKit::WebForm& form) {
+ return form;
+}
+
// WebURLRequest conversions ---------------------------------------------------
WebCore::ResourceRequest* WebURLRequestToMutableResourceRequest(
diff --git a/webkit/glue/glue_util.h b/webkit/glue/glue_util.h
index 553802c..776dc7e 100644
--- a/webkit/glue/glue_util.h
+++ b/webkit/glue/glue_util.h
@@ -13,6 +13,7 @@ class GURL;
namespace WebCore {
class ChromiumDataObject;
class CString;
+class HTMLFormElement;
class IntPoint;
class IntRect;
class IntSize;
@@ -25,6 +26,7 @@ struct ResourceRequest;
namespace WebKit {
class WebCString;
class WebDragData;
+class WebForm;
class WebString;
class WebURL;
class WebURLRequest;
@@ -107,6 +109,12 @@ WebKit::WebDragData ChromiumDataObjectToWebDragData(
WTF::PassRefPtr<WebCore::ChromiumDataObject> WebDragDataToChromiumDataObject(
const WebKit::WebDragData&);
+// WebForm <-> HTMLFormElement
+WebKit::WebForm HTMLFormElementToWebForm(
+ const WTF::PassRefPtr<WebCore::HTMLFormElement>&);
+WTF::PassRefPtr<WebCore::HTMLFormElement> WebFormToHTMLFormElement(
+ const WebKit::WebForm&);
+
// Exposes the ResourceRequest contained by a WebURLRequest
WebCore::ResourceRequest* WebURLRequestToMutableResourceRequest(
WebKit::WebURLRequest* req);
diff --git a/webkit/glue/password_autocomplete_listener_unittest.cc b/webkit/glue/password_autocomplete_listener_unittest.cc
index ef5a4b1..05337d9 100644
--- a/webkit/glue/password_autocomplete_listener_unittest.cc
+++ b/webkit/glue/password_autocomplete_listener_unittest.cc
@@ -28,6 +28,7 @@ MSVC_POP_WARNING();
#include "testing/gtest/include/gtest/gtest.h"
using webkit_glue::PasswordAutocompleteListener;
+using webkit_glue::PasswordFormDomManager;
using webkit_glue::HTMLInputDelegate;
class TestHTMLInputDelegate : public HTMLInputDelegate {
diff --git a/webkit/glue/password_form_dom_manager.cc b/webkit/glue/password_form_dom_manager.cc
index fb99302..ceef5b4 100644
--- a/webkit/glue/password_form_dom_manager.cc
+++ b/webkit/glue/password_form_dom_manager.cc
@@ -4,9 +4,6 @@
#include "config.h"
-#include "base/compiler_specific.h"
-
-MSVC_PUSH_WARNING_LEVEL(0);
#include "Document.h"
#include "DocumentLoader.h"
#include "Frame.h"
@@ -15,80 +12,127 @@ MSVC_PUSH_WARNING_LEVEL(0);
#include "HTMLInputElement.h"
#include "HTMLNames.h"
#include "KURL.h"
-MSVC_POP_WARNING();
-
#undef LOG
#include "base/logging.h"
-#include "base/basictypes.h"
#include "webkit/glue/glue_util.h"
#include "webkit/glue/password_form_dom_manager.h"
+using WebKit::WebForm;
+
+namespace webkit_glue {
+
+namespace {
+
// Maximum number of password fields we will observe before throwing our
// hands in the air and giving up with a given form.
-static const size_t kMaxPasswords = 3;
+const size_t kMaxPasswords = 3;
-PasswordForm* PasswordFormDomManager::CreatePasswordForm(
- WebCore::HTMLFormElement* form) {
- WebCore::Frame* frame = form->document()->frame();
- if (frame == NULL)
- return NULL;
+// Helper structure to locate username, passwords and submit fields.
+struct PasswordFormFields {
+ WebCore::HTMLInputElement* username;
+ std::vector<WebCore::HTMLInputElement*> passwords;
+ WebCore::HTMLFormControlElement* submit;
+ PasswordFormFields() : username(NULL), submit(NULL) {
+ }
+};
- WebCore::FrameLoader* loader = frame->loader();
- if (loader == NULL)
- return NULL;
+// Helper to CreatePasswordForm to do the locating of username/password
+// fields.
+// This method based on Firefox2 code in
+// toolkit/components/passwordmgr/base/nsPasswordManager.cpp
+// Its license block is
- PasswordFormFields fields;
- FindPasswordFormFields(form, &fields);
+/* ***** BEGIN LICENSE BLOCK *****
+* Version: MPL 1.1/GPL 2.0/LGPL 2.1
+*
+* The contents of this file are subject to the Mozilla Public License Version
+* 1.1 (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+* http://www.mozilla.org/MPL/
+*
+* Software distributed under the License is distributed on an "AS IS" basis,
+* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+* for the specific language governing rights and limitations under the
+* License.
+*
+* The Original Code is Mozilla Password Manager.
+*
+* The Initial Developer of the Original Code is
+* Brian Ryner.
+* Portions created by the Initial Developer are Copyright (C) 2003
+* the Initial Developer. All Rights Reserved.
+*
+* Contributor(s):
+* Brian Ryner <bryner@brianryner.com>
+*
+* Alternatively, the contents of this file may be used under the terms of
+* either the GNU General Public License Version 2 or later (the "GPL"), or
+* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+* in which case the provisions of the GPL or the LGPL are applicable instead
+* of those above. If you wish to allow use of your version of this file only
+* under the terms of either the GPL or the LGPL, and not to allow others to
+* use your version of this file under the terms of the MPL, indicate your
+* decision by deleting the provisions above and replace them with the notice
+* and other provisions required by the GPL or the LGPL. If you do not delete
+* the provisions above, a recipient may use your version of this file under
+* the terms of any one of the MPL, the GPL or the LGPL.
+*
+* ***** END LICENSE BLOCK ***** */
+void FindPasswordFormFields(
+ WebCore::HTMLFormElement* form,
+ PasswordFormFields* fields) {
+ DCHECK(form && fields);
+ int first_password_index = 0;
+ // First, find the password fields and activated submit button
+ const WTF::Vector<WebCore::HTMLFormControlElement*>& form_elements =
+ form->formElements;
+ for (size_t i = 0; i < form_elements.size(); i++) {
+ WebCore::HTMLFormControlElement* form_element = form_elements[i];
+ if (form_element->isActivatedSubmit())
+ fields->submit = form_element;
- // Get the document URL
- WebCore::String origin_string = form->document()->documentURI();
- GURL full_origin(webkit_glue::StringToStdString(origin_string));
+ if (!form_element->hasLocalName(WebCore::HTMLNames::inputTag))
+ continue;
- // Calculate the canonical action URL
- GURL full_action(webkit_glue::KURLToGURL(loader->completeURL(form->action())));
- if (!full_action.is_valid())
- return NULL;
+ WebCore::HTMLInputElement* input_element =
+ static_cast<WebCore::HTMLInputElement*>(form_element);
+ if (!input_element->isEnabledFormControl())
+ continue;
- // Determine the types of the password fields
- WebCore::HTMLInputElement* password = NULL;
- WebCore::HTMLInputElement* old_password = NULL;
- if (!LocateSpecificPasswords(&fields, &password, &old_password))
- return NULL;
+ if ((fields->passwords.size() < kMaxPasswords) &&
+ (input_element->inputType() == WebCore::HTMLInputElement::PASSWORD) &&
+ (input_element->autoComplete())) {
+ if (fields->passwords.empty())
+ first_password_index = i;
+ fields->passwords.push_back(input_element);
+ }
+ }
- return AssemblePasswordFormResult(full_origin, full_action,
- fields.submit, fields.username,
- old_password, password);
-}
+ if (!fields->passwords.empty()) {
+ // Then, search backwards for the username field
+ for (int i = first_password_index - 1; i >= 0; i--) {
+ WebCore::HTMLFormControlElement* form_element = form_elements[i];
+ if (!form_element->hasLocalName(WebCore::HTMLNames::inputTag))
+ continue;
-// static
-void PasswordFormDomManager::InitFillData(
- const PasswordForm& form_on_page,
- const PasswordFormMap& matches,
- const PasswordForm* const preferred_match,
- bool wait_for_username_before_autofill,
- PasswordFormDomManager::FillData* result) {
- DCHECK(preferred_match);
- // Fill basic form data.
- result->basic_data.origin = form_on_page.origin;
- result->basic_data.action = form_on_page.action;
- result->basic_data.elements.push_back(form_on_page.username_element);
- result->basic_data.values.push_back(preferred_match->username_value);
- result->basic_data.elements.push_back(form_on_page.password_element);
- result->basic_data.values.push_back(preferred_match->password_value);
- result->basic_data.submit = form_on_page.submit_element;
- result->wait_for_username = wait_for_username_before_autofill;
+ WebCore::HTMLInputElement* input_element =
+ static_cast<WebCore::HTMLInputElement*>(form_element);
+ if (!input_element->isEnabledFormControl())
+ continue;
- // Copy additional username/value pairs.
- PasswordFormMap::const_iterator iter;
- for (iter = matches.begin(); iter != matches.end(); iter++) {
- if (iter->second != preferred_match)
- result->additional_logins[iter->first] = iter->second->password_value;
+ if ((input_element->inputType() == WebCore::HTMLInputElement::TEXT) &&
+ (input_element->autoComplete())) {
+ fields->username = input_element;
+ break;
+ }
+ }
}
}
-// static
-bool PasswordFormDomManager::LocateSpecificPasswords(
+// Helper to determine which password is the main one, and which is
+// an old password (e.g on a "make new password" form), if any.
+bool LocateSpecificPasswords(
PasswordFormFields* fields,
WebCore::HTMLInputElement** password,
WebCore::HTMLInputElement** old_password) {
@@ -133,100 +177,9 @@ bool PasswordFormDomManager::LocateSpecificPasswords(
}
return true;
}
- // This method based on Firefox2 code in
- // toolkit/components/passwordmgr/base/nsPasswordManager.cpp
- // Its license block is
- //
- /* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is Mozilla Password Manager.
- *
- * The Initial Developer of the Original Code is
- * Brian Ryner.
- * Portions created by the Initial Developer are Copyright (C) 2003
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- * Brian Ryner <bryner@brianryner.com>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-// static
-void PasswordFormDomManager::FindPasswordFormFields(
- WebCore::HTMLFormElement* form,
- PasswordFormFields* fields) {
- DCHECK(form && fields);
- int first_password_index = 0;
- // First, find the password fields and activated submit button
- const WTF::Vector<WebCore::HTMLFormControlElement*>& form_elements =
- form->formElements;
- for (size_t i = 0; i < form_elements.size(); i++) {
- WebCore::HTMLFormControlElement* form_element = form_elements[i];
- if (form_element->isActivatedSubmit())
- fields->submit = form_element;
-
- if (!form_element->hasLocalName(WebCore::HTMLNames::inputTag))
- continue;
-
- WebCore::HTMLInputElement* input_element =
- static_cast<WebCore::HTMLInputElement*>(form_element);
- if (!input_element->isEnabledFormControl())
- continue;
-
- if ((fields->passwords.size() < kMaxPasswords) &&
- (input_element->inputType() == WebCore::HTMLInputElement::PASSWORD) &&
- (input_element->autoComplete())) {
- if (fields->passwords.empty())
- first_password_index = i;
- fields->passwords.push_back(input_element);
- }
- }
-
- if (!fields->passwords.empty()) {
- // Then, search backwards for the username field
- for (int i = first_password_index - 1; i >= 0; i--) {
- WebCore::HTMLFormControlElement* form_element = form_elements[i];
- if (!form_element->hasLocalName(WebCore::HTMLNames::inputTag))
- continue;
-
- WebCore::HTMLInputElement* input_element =
- static_cast<WebCore::HTMLInputElement*>(form_element);
- if (!input_element->isEnabledFormControl())
- continue;
-
- if ((input_element->inputType() == WebCore::HTMLInputElement::TEXT) &&
- (input_element->autoComplete())) {
- fields->username = input_element;
- break;
- }
- }
- }
-}
-// static
-PasswordForm* PasswordFormDomManager::AssemblePasswordFormResult(
+// Helper to gather up the final form data and create a PasswordForm.
+PasswordForm* AssemblePasswordFormResult(
const GURL& full_origin,
const GURL& full_action,
WebCore::HTMLFormControlElement* submit,
@@ -252,24 +205,79 @@ PasswordForm* PasswordFormDomManager::AssemblePasswordFormResult(
result->signon_realm = full_origin.GetOrigin().spec();
// Note PasswordManager sets ssl_valid by asking the WebContents' SSLManager.
result->submit_element =
- submit == NULL ? empty : webkit_glue::StringToStdWString(submit->name());
+ submit == NULL ? empty : StringToStdWString(submit->name());
result->username_element =
- username == NULL ? empty
- : webkit_glue::StringToStdWString(username->name());
+ username == NULL ? empty : StringToStdWString(username->name());
result->username_value =
- username == NULL ? empty
- : webkit_glue::StringToStdWString(username->value());
+ username == NULL ? empty : StringToStdWString(username->value());
result->password_element =
- password == NULL ? empty
- : webkit_glue::StringToStdWString(password->name());
+ password == NULL ? empty : StringToStdWString(password->name());
result->password_value =
- password == NULL ? empty
- : webkit_glue::StringToStdWString(password->value());
+ password == NULL ? empty : StringToStdWString(password->value());
result->old_password_element =
- old_password == NULL ? empty
- : webkit_glue::StringToStdWString(old_password->name());
+ old_password == NULL ? empty : StringToStdWString(old_password->name());
result->old_password_value =
- old_password == NULL ? empty
- : webkit_glue::StringToStdWString(old_password->value());
+ old_password == NULL ? empty : StringToStdWString(old_password->value());
return result;
}
+
+} // namespace
+
+PasswordForm* PasswordFormDomManager::CreatePasswordForm(
+ const WebForm& webform) {
+ RefPtr<WebCore::HTMLFormElement> form = WebFormToHTMLFormElement(webform);
+
+ WebCore::Frame* frame = form->document()->frame();
+ if (!frame)
+ return NULL;
+
+ PasswordFormFields fields;
+ FindPasswordFormFields(form.get(), &fields);
+
+ // Get the document URL
+ WebCore::String origin_string = form->document()->documentURI();
+ GURL full_origin(StringToStdString(origin_string));
+
+ // Calculate the canonical action URL
+ GURL full_action(KURLToGURL(frame->loader()->completeURL(form->action())));
+ if (!full_action.is_valid())
+ return NULL;
+
+ // Determine the types of the password fields
+ WebCore::HTMLInputElement* password = NULL;
+ WebCore::HTMLInputElement* old_password = NULL;
+ if (!LocateSpecificPasswords(&fields, &password, &old_password))
+ return NULL;
+
+ return AssemblePasswordFormResult(full_origin, full_action,
+ fields.submit, fields.username,
+ old_password, password);
+}
+
+// static
+void PasswordFormDomManager::InitFillData(
+ const PasswordForm& form_on_page,
+ const PasswordFormMap& matches,
+ const PasswordForm* const preferred_match,
+ bool wait_for_username_before_autofill,
+ PasswordFormDomManager::FillData* result) {
+ DCHECK(preferred_match);
+ // Fill basic form data.
+ result->basic_data.origin = form_on_page.origin;
+ result->basic_data.action = form_on_page.action;
+ result->basic_data.elements.push_back(form_on_page.username_element);
+ result->basic_data.values.push_back(preferred_match->username_value);
+ result->basic_data.elements.push_back(form_on_page.password_element);
+ result->basic_data.values.push_back(preferred_match->password_value);
+ result->basic_data.submit = form_on_page.submit_element;
+ result->wait_for_username = wait_for_username_before_autofill;
+
+ // Copy additional username/value pairs.
+ PasswordFormMap::const_iterator iter;
+ for (iter = matches.begin(); iter != matches.end(); iter++) {
+ if (iter->second != preferred_match)
+ result->additional_logins[iter->first] = iter->second->password_value;
+ }
+}
+
+} // namespace webkit_glue
diff --git a/webkit/glue/password_form_dom_manager.h b/webkit/glue/password_form_dom_manager.h
index 84dbc93..9963a5d 100644
--- a/webkit/glue/password_form_dom_manager.h
+++ b/webkit/glue/password_form_dom_manager.h
@@ -2,20 +2,20 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef WEBKIT_GLUE_PASSWORD_FORM_DOM_MANAGER_H__
-#define WEBKIT_GLUE_PASSWORD_FORM_DOM_MANAGER_H__
+#ifndef WEBKIT_GLUE_PASSWORD_FORM_DOM_MANAGER_H_
+#define WEBKIT_GLUE_PASSWORD_FORM_DOM_MANAGER_H_
#include "webkit/glue/form_data.h"
#include "webkit/glue/password_form.h"
-namespace WebCore {
-class HTMLFormElement;
-class HTMLInputElement;
-class HTMLFormControlElement;
+namespace WebKit {
+class WebForm;
}
class GURL;
+namespace webkit_glue {
+
class PasswordFormDomManager {
public:
typedef std::map<std::wstring, std::wstring> LoginCollection;
@@ -41,7 +41,7 @@ class PasswordFormDomManager {
// custom metadata to DOM nodes, so we have to do this every time an event
// happens with a given form and compare against previously Create'd forms
// to identify..which sucks.
- static PasswordForm* CreatePasswordForm(WebCore::HTMLFormElement* form);
+ static PasswordForm* CreatePasswordForm(const WebKit::WebForm& form);
// Create a FillData structure in preparation for autofilling a form,
// from basic_data identifying which form to fill, and a collection of
@@ -55,77 +55,9 @@ class PasswordFormDomManager {
bool wait_for_username_before_autofill,
FillData* result);
private:
- // Helper structure to locate username, passwords and submit fields.
- struct PasswordFormFields {
- WebCore::HTMLInputElement* username;
- std::vector<WebCore::HTMLInputElement*> passwords;
- WebCore::HTMLFormControlElement* submit;
- PasswordFormFields() : username(NULL), submit(NULL) {
- }
- };
-
- // Helper to CreatePasswordForm to do the locating of username/password
- // fields.
- // This method based on Firefox2 code in
- // toolkit/components/passwordmgr/base/nsPasswordManager.cpp
- // Its license block is
-
- /* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is Mozilla Password Manager.
- *
- * The Initial Developer of the Original Code is
- * Brian Ryner.
- * Portions created by the Initial Developer are Copyright (C) 2003
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- * Brian Ryner <bryner@brianryner.com>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
- static void FindPasswordFormFields(WebCore::HTMLFormElement* form,
- PasswordFormFields* fields);
- // Helper to determine which password is the main one, and which is
- // an old password (e.g on a "make new password" form), if any.
- static bool LocateSpecificPasswords(
- PasswordFormFields* fields,
- WebCore::HTMLInputElement** password,
- WebCore::HTMLInputElement** old_password_index);
-
- // Helper to gather up the final form data and create a PasswordForm.
- static PasswordForm* AssemblePasswordFormResult(
- const GURL& full_origin,
- const GURL& full_action,
- WebCore::HTMLFormControlElement* submit,
- WebCore::HTMLInputElement* username,
- WebCore::HTMLInputElement* old_password,
- WebCore::HTMLInputElement* password);
-
- // This class can't be instantiated.
DISALLOW_IMPLICIT_CONSTRUCTORS(PasswordFormDomManager);
};
+} // namespace webkit_glue
+
#endif // WEBKIT_GLUE_PASSWORD_FORM_DOM_MANAGER_H__
diff --git a/webkit/glue/searchable_form_data.cc b/webkit/glue/searchable_form_data.cc
index 6187897..5955745a 100644
--- a/webkit/glue/searchable_form_data.cc
+++ b/webkit/glue/searchable_form_data.cc
@@ -36,10 +36,15 @@ MSVC_POP_WARNING();
#include "webkit/glue/searchable_form_data.h"
#include "webkit/glue/webframe_impl.h"
+using WebCore::HTMLFormElement;
using WebCore::HTMLInputElement;
using WebCore::HTMLOptionElement;
+using WebKit::WebForm;
+
+namespace webkit_glue {
namespace {
+
// TODO(eseidel): appendString and appendEncodedString do *not* follow Google
// style because they are copy/paste from WebKit and will go away as soon as the
// WebKit functions are made public.
@@ -154,8 +159,7 @@ bool IsSelectInDefaultState(WebCore::HTMLSelectElement* select) {
// least one item is selected, determine which one.
HTMLOptionElement* initial_selected = NULL;
while (node) {
- HTMLOptionElement* option_element =
- webkit_glue::CastToHTMLOptionElement(node);
+ HTMLOptionElement* option_element = CastToHTMLOptionElement(node);
if (option_element) {
if (!initial_selected)
initial_selected = option_element;
@@ -171,8 +175,7 @@ bool IsSelectInDefaultState(WebCore::HTMLSelectElement* select) {
return initial_selected->selected();
} else {
while (node) {
- HTMLOptionElement* option_element =
- webkit_glue::CastToHTMLOptionElement(node);
+ HTMLOptionElement* option_element = CastToHTMLOptionElement(node);
if (option_element &&
option_element->selected() != option_element->defaultSelected()) {
return false;
@@ -296,37 +299,20 @@ WebCore::HTMLInputElement* GetTextElement(
} // namespace
-SearchableFormData* SearchableFormData::Create(WebCore::Element* element) {
- if (!element->isFormControlElement() || !element->isHTMLElement()) {
- return NULL;
- }
-
- WebCore::Frame* frame = element->document()->frame();
- if (frame == NULL)
- return NULL;
+SearchableFormData* SearchableFormData::Create(const WebForm& webform) {
+ RefPtr<HTMLFormElement> form = WebFormToHTMLFormElement(webform);
- WebCore::HTMLFormControlElement* input_element =
- static_cast<WebCore::HTMLFormControlElement*>(element);
-
- WebCore::HTMLFormElement* form = input_element->form();
- if (form == NULL)
- return NULL;
-
- return Create(form);
-}
-
-SearchableFormData* SearchableFormData::Create(WebCore::HTMLFormElement* form) {
WebCore::Frame* frame = form->document()->frame();
if (frame == NULL)
return NULL;
// Only consider forms that GET data and the action targets an http page.
- if (!IsFormMethodGet(form) || !IsHTTPFormSubmit(form))
+ if (!IsFormMethodGet(form.get()) || !IsHTTPFormSubmit(form.get()))
return NULL;
Vector<char> enc_string;
WebCore::HTMLFormControlElement* first_submit_button =
- GetButtonToActivate(form);
+ GetButtonToActivate(form.get());
if (first_submit_button) {
// The form does not have an active submit button, make the first button
@@ -337,7 +323,7 @@ SearchableFormData* SearchableFormData::Create(WebCore::HTMLFormElement* form) {
std::string encoding;
WebCore::HTMLInputElement* text_element =
- GetTextElement(form, &enc_string, &encoding);
+ GetTextElement(form.get(), &enc_string, &encoding);
if (first_submit_button)
first_submit_button->setActivatedSubmit(false);
@@ -354,11 +340,10 @@ SearchableFormData* SearchableFormData::Create(WebCore::HTMLFormElement* form) {
WebCore::FrameLoader* loader = frame->loader();
WebCore::KURL url = loader->completeURL(action.isNull() ? "" : action);
url.setQuery(form_data->flattenToString());
- std::wstring current_value = webkit_glue::StringToStdWString(
- static_cast<WebCore::HTMLInputElement*>(text_element)->value());
- std::wstring text_name =
- webkit_glue::StringToStdWString(text_element->name());
- GURL gurl(webkit_glue::KURLToGURL(url));
+ std::wstring current_value = StringToStdWString(
+ static_cast<WebCore::HTMLInputElement*>(text_element)->value());
+ std::wstring text_name = StringToStdWString(text_element->name());
+ GURL gurl(KURLToGURL(url));
return new SearchableFormData(gurl, text_name, current_value, encoding);
}
@@ -382,3 +367,5 @@ SearchableFormData::SearchableFormData(const GURL& url,
element_value_(element_value),
encoding_(encoding) {
}
+
+} // namespace webkit_glue
diff --git a/webkit/glue/searchable_form_data.h b/webkit/glue/searchable_form_data.h
index 2164189..fc76c57 100644
--- a/webkit/glue/searchable_form_data.h
+++ b/webkit/glue/searchable_form_data.h
@@ -9,22 +9,19 @@
#include "googleurl/src/gurl.h"
-namespace WebCore {
-class Element;
-class HTMLFormElement;
+namespace WebKit {
+class WebForm;
}
+namespace webkit_glue {
+
// SearchableFormData encapsulates a URL and class name of an INPUT field
// that correspond to a searchable form request.
class SearchableFormData {
public:
// If form contains elements that constitutes a valid searchable form
// request, a SearchableFormData is created and returned.
- static SearchableFormData* Create(WebCore::HTMLFormElement* form);
-
- // If the element is contained in a form that constitutes a valid searchable
- // form, a SearchableFormData is created and returned.
- static SearchableFormData* Create(WebCore::Element* element);
+ static SearchableFormData* Create(const WebKit::WebForm& form);
// Returns true if the two SearchableFormData are equal, false otherwise.
// Either argument may be NULL. If both elements are NULL, true is returned.
@@ -53,7 +50,9 @@ class SearchableFormData {
const std::wstring element_value_;
const std::string encoding_;
- DISALLOW_EVIL_CONSTRUCTORS(SearchableFormData);
+ DISALLOW_COPY_AND_ASSIGN(SearchableFormData);
};
+} // namespace webkit_glue
+
#endif // WEBKIT_GLUE_SEARCHABLE_FORM_H__
diff --git a/webkit/glue/webdatasource.h b/webkit/glue/webdatasource.h
index 53e9492..5885db7 100644
--- a/webkit/glue/webdatasource.h
+++ b/webkit/glue/webdatasource.h
@@ -10,7 +10,6 @@
#include "base/string16.h"
class GURL;
-class SearchableFormData;
class WebFrame;
class WebRequest;
class WebResponse;
@@ -82,21 +81,6 @@ class WebDataSource {
// redirect, it will contain the source and destination URL).
virtual const std::vector<GURL>& GetRedirectChain() const = 0;
- // Returns the SearchableFormData, or NULL if the request wasn't a search
- // request. The returned object is owned by the WebDataSource (actually
- // the WebDocumentLoader) and shouldn't be freed.
- virtual const SearchableFormData* GetSearchableFormData() const = 0;
-
- // Returns the PasswordFormData, or NULL if the request isn't a form submission
- // or doesn't have any password fields. The returned object is owned by the
- // WebDataSource (actually the WebDocumentLoader) and shouldn't be freed.
- virtual const PasswordForm* GetPasswordFormData() const = 0;
-
- // Returns true if this request was the result of submitting a form.
- // NOTE: this returns false if the user submitted a form, but the form used
- // script to do the actuall submission.
- virtual bool IsFormSubmit() const = 0;
-
// Returns the page title.
virtual string16 GetPageTitle() const = 0;
diff --git a/webkit/glue/webdatasource_impl.cc b/webkit/glue/webdatasource_impl.cc
index 6980e13..c0ace9b 100644
--- a/webkit/glue/webdatasource_impl.cc
+++ b/webkit/glue/webdatasource_impl.cc
@@ -32,8 +32,7 @@ PassRefPtr<WebDataSourceImpl> WebDataSourceImpl::Create(
WebDataSourceImpl::WebDataSourceImpl(const WebCore::ResourceRequest& request,
const WebCore::SubstituteData& data)
- : WebCore::DocumentLoader(request, data),
- form_submit_(false) {
+ : WebCore::DocumentLoader(request, data) {
}
WebDataSourceImpl::~WebDataSourceImpl() {
@@ -79,18 +78,6 @@ void WebDataSourceImpl::AppendRedirect(const GURL& url) {
redirect_chain_.push_back(url);
}
-const SearchableFormData* WebDataSourceImpl::GetSearchableFormData() const {
- return searchable_form_data();
-}
-
-const PasswordForm* WebDataSourceImpl::GetPasswordFormData() const {
- return password_form_data();
-}
-
-bool WebDataSourceImpl::IsFormSubmit() const {
- return is_form_submit();
-}
-
string16 WebDataSourceImpl::GetPageTitle() const {
return webkit_glue::StringToString16(title());
}
diff --git a/webkit/glue/webdatasource_impl.h b/webkit/glue/webdatasource_impl.h
index 912dffb..d2e98bf 100644
--- a/webkit/glue/webdatasource_impl.h
+++ b/webkit/glue/webdatasource_impl.h
@@ -9,7 +9,6 @@
#include "base/scoped_ptr.h"
#include "base/time.h"
-#include "webkit/glue/searchable_form_data.h"
#include "webkit/glue/webdatasource.h"
#include "webkit/glue/webresponse_impl.h"
#include "webkit/glue/weburlrequest_impl.h"
@@ -33,9 +32,6 @@ class WebDataSourceImpl : public WebCore::DocumentLoader, public WebDataSource {
virtual GURL GetUnreachableURL() const;
virtual bool HasUnreachableURL() const;
virtual const std::vector<GURL>& GetRedirectChain() const;
- virtual const SearchableFormData* GetSearchableFormData() const;
- virtual const PasswordForm* GetPasswordFormData() const;
- virtual bool IsFormSubmit() const;
virtual string16 GetPageTitle() const;
virtual base::Time GetRequestTime() const;
virtual void SetRequestTime(base::Time time);
@@ -53,35 +49,6 @@ class WebDataSourceImpl : public WebCore::DocumentLoader, public WebDataSource {
void ClearRedirectChain();
void AppendRedirect(const GURL& url);
- // Sets the SearchableFormData for this DocumentLoader.
- // WebDocumentLoaderImpl will own the SearchableFormData.
- void set_searchable_form_data(SearchableFormData* searchable_form_data) {
- searchable_form_data_.reset(searchable_form_data);
- }
- // Returns the SearchableFormData for this DocumentLoader.
- // WebDocumentLoaderImpl owns the returned SearchableFormData.
- const SearchableFormData* searchable_form_data() const {
- return searchable_form_data_.get();
- }
-
- // Sets the PasswordFormData for this DocumentLoader.
- // WebDocumentLoaderImpl will own the PasswordFormData.
- void set_password_form_data(PasswordForm* password_form_data) {
- password_form_data_.reset(password_form_data);
- }
- // Returns the PasswordFormData for this DocumentLoader.
- // WebDocumentLoaderImpl owns the returned PasswordFormData.
- const PasswordForm* password_form_data() const {
- return password_form_data_.get();
- }
-
- void set_form_submit(bool value) {
- form_submit_ = value;
- }
- bool is_form_submit() const {
- return form_submit_;
- }
-
void set_request_time(base::Time request_time) {
request_time_ = request_time;
}
@@ -119,13 +86,8 @@ class WebDataSourceImpl : public WebCore::DocumentLoader, public WebDataSource {
// who modifies this when to keep it up to date.
std::vector<GURL> redirect_chain_;
- scoped_ptr<const SearchableFormData> searchable_form_data_;
- scoped_ptr<const PasswordForm> password_form_data_;
-
OwnPtr<ExtraData> extra_data_;
- bool form_submit_;
-
// See webdatasource.h for a description of these time stamps.
base::Time request_time_;
base::Time start_load_time_;
diff --git a/webkit/glue/webframe.h b/webkit/glue/webframe.h
index e630f35..ad80a0d 100644
--- a/webkit/glue/webframe.h
+++ b/webkit/glue/webframe.h
@@ -5,6 +5,8 @@
#ifndef WEBKIT_GLUE_WEBFRAME_H_
#define WEBKIT_GLUE_WEBFRAME_H_
+#include <vector>
+
#include "base/scoped_ptr.h"
#include "base/string16.h"
#include "skia/ext/bitmap_platform_device.h"
@@ -20,6 +22,7 @@ class WebTextInput;
struct NPObject;
namespace WebKit {
+class WebForm;
struct WebConsoleMessage;
struct WebFindOptions;
struct WebRect;
@@ -59,14 +62,6 @@ class WebFrame {
virtual void CallJSGC() = 0;
- // WARNING: DON'T USE THIS METHOD unless you know what it is doing.
- //
- // Returns a pointer to the underlying implementation WebCore::Frame.
- // Currently it is a hack to avoid including "Frame.h". The caller
- // casts the return value to WebCore::Frame.
- // TODO(fqian): Remove this method when V8 supports NP runtime.
- virtual void* GetFrameImplementation() = 0;
-
// This grants the currently loaded Document access to all security origins
// (including file URLs). Use with care. The access is revoked when a new
// document is loaded into this frame.
@@ -214,6 +209,9 @@ class WebFrame {
// unless it is AddRef'd separately by the caller.
virtual WebView* GetView() const = 0;
+ // Returns a vector of WebForms (corresponds to document.forms).
+ virtual void GetForms(std::vector<WebKit::WebForm>* forms) const = 0;
+
// Returns the serialization of the frame's security origin.
virtual std::string GetSecurityOrigin() const = 0;
diff --git a/webkit/glue/webframe_impl.cc b/webkit/glue/webframe_impl.cc
index 0d78729..f573dcb 100644
--- a/webkit/glue/webframe_impl.cc
+++ b/webkit/glue/webframe_impl.cc
@@ -142,6 +142,7 @@ MSVC_POP_WARNING();
#include "skia/ext/platform_canvas.h"
#include "webkit/api/public/WebConsoleMessage.h"
#include "webkit/api/public/WebFindOptions.h"
+#include "webkit/api/public/WebForm.h"
#include "webkit/api/public/WebRect.h"
#include "webkit/api/public/WebScriptSource.h"
#include "webkit/api/public/WebSize.h"
@@ -185,6 +186,7 @@ using WebCore::FrameLoadType;
using WebCore::FrameTree;
using WebCore::FrameView;
using WebCore::HistoryItem;
+using WebCore::HTMLFormElement;
using WebCore::IntRect;
using WebCore::KURL;
using WebCore::Node;
@@ -204,6 +206,7 @@ using WebCore::XPathResult;
using WebKit::WebConsoleMessage;
using WebKit::WebFindOptions;
+using WebKit::WebForm;
using WebKit::WebRect;
using WebKit::WebScriptSource;
using WebKit::WebSize;
@@ -750,6 +753,22 @@ WebView* WebFrameImpl::GetView() const {
return GetWebViewImpl();
}
+void WebFrameImpl::GetForms(std::vector<WebForm>* results) const {
+ results->clear();
+ if (!frame_)
+ return;
+ RefPtr<WebCore::HTMLCollection> forms = frame_->document()->forms();
+ unsigned int form_count = forms->length();
+ for (unsigned int i = 0; i < form_count; ++i) {
+ Node* node = forms->item(i);
+ // Strange but true, sometimes item can be NULL.
+ if (node) {
+ results->push_back(webkit_glue::HTMLFormElementToWebForm(
+ static_cast<HTMLFormElement*>(node)));
+ }
+ }
+}
+
std::string WebFrameImpl::GetSecurityOrigin() const {
if (frame_) {
if (frame_->document())
diff --git a/webkit/glue/webframe_impl.h b/webkit/glue/webframe_impl.h
index c7eeb8d..54da684 100644
--- a/webkit/glue/webframe_impl.h
+++ b/webkit/glue/webframe_impl.h
@@ -110,6 +110,7 @@ class WebFrameImpl : public WebFrame, public base::RefCounted<WebFrameImpl> {
virtual WebFrame* GetTop() const;
virtual WebFrame* GetChildFrame(const std::wstring& xpath) const;
virtual WebView* GetView() const;
+ virtual void GetForms(std::vector<WebKit::WebForm>* forms) const;
virtual std::string GetSecurityOrigin() const;
virtual bool CaptureImage(scoped_ptr<skia::BitmapPlatformDevice>* image,
bool scroll_to_zero);
@@ -119,7 +120,6 @@ class WebFrameImpl : public WebFrame, public base::RefCounted<WebFrameImpl> {
virtual void BindToWindowObject(const std::wstring& name, NPObject* object);
virtual void CallJSGC();
- virtual void* GetFrameImplementation() { return frame(); }
virtual void GrantUniversalAccess();
virtual NPObject* GetWindowNPObject();
diff --git a/webkit/glue/webframeloaderclient_impl.cc b/webkit/glue/webframeloaderclient_impl.cc
index a21e401..a4a77a9 100644
--- a/webkit/glue/webframeloaderclient_impl.cc
+++ b/webkit/glue/webframeloaderclient_impl.cc
@@ -44,6 +44,7 @@ MSVC_POP_WARNING();
#if defined(OS_WIN)
#include "webkit/activex_shim/activex_shared.h"
#endif
+#include "webkit/api/public/WebForm.h"
#include "webkit/glue/autofill_form.h"
#include "webkit/glue/alt_404_page_resource_fetcher.h"
#include "webkit/glue/glue_util.h"
@@ -376,35 +377,6 @@ void WebFrameLoaderClient::dispatchDidFinishDocumentLoad() {
// listeners and their associated HTMLInputElements.
webframe_->ClearPasswordListeners();
- // The document has now been fully loaded.
- // Scan for password forms to be sent to the browser
- PassRefPtr<WebCore::HTMLCollection> forms =
- webframe_->frame()->document()->forms();
-
- std::vector<PasswordForm> passwordForms;
-
- unsigned int form_count = forms->length();
- for (unsigned int i = 0; i < form_count; ++i) {
- // Strange but true, sometimes item can be NULL.
- WebCore::Node* item = forms->item(i);
- if (item) {
- WebCore::HTMLFormElement* form =
- static_cast<WebCore::HTMLFormElement*>(item);
-
- // Honour autocomplete=off.
- if (!form->autoComplete())
- continue;
-
- scoped_ptr<PasswordForm> passwordFormPtr(
- PasswordFormDomManager::CreatePasswordForm(form));
-
- if (passwordFormPtr.get())
- passwordForms.push_back(*passwordFormPtr);
- }
- }
-
- if (d && (passwordForms.size() > 0))
- d->OnPasswordFormsSeen(webview, passwordForms);
if (d)
d->DidFinishDocumentLoadForFrame(webview, webframe_);
data_source->set_finish_document_load_time(base::Time::Now());
@@ -1010,32 +982,12 @@ void WebFrameLoaderClient::dispatchUnableToImplementPolicy(const ResourceError&)
void WebFrameLoaderClient::dispatchWillSubmitForm(FramePolicyFunction function,
PassRefPtr<FormState> form_ref) {
- SearchableFormData* form_data = SearchableFormData::Create(form_ref->form());
- WebDataSourceImpl* ds = WebDataSourceImpl::FromLoader(
- webframe_->frame()->loader()->provisionalDocumentLoader());
- // Don't free the SearchableFormData, the datasource will do that.
- ds->set_searchable_form_data(form_data);
-
- PasswordForm* pass_data =
- PasswordFormDomManager::CreatePasswordForm(form_ref->form());
- // Don't free the PasswordFormData, the datasource will do that.
- ds->set_password_form_data(pass_data);
-
WebViewImpl* webview = webframe_->GetWebViewImpl();
WebViewDelegate* d = webview->delegate();
-
- // Unless autocomplete=off, record what the user put in it for future
- // autofilling.
- if (form_ref->form()->autoComplete()) {
- scoped_ptr<AutofillForm> autofill_form(
- AutofillForm::CreateAutofillForm(form_ref->form()));
- if (autofill_form.get()) {
- d->OnAutofillFormSubmitted(webview, *autofill_form);
- }
+ if (d) {
+ d->WillSubmitForm(webview, webframe_,
+ webkit_glue::HTMLFormElementToWebForm(form_ref->form()));
}
-
- ds->set_form_submit(true);
-
(webframe_->frame()->loader()->*function)(PolicyUse);
}
diff --git a/webkit/glue/webview_delegate.h b/webkit/glue/webview_delegate.h
index 9c658e2..7002c57 100644
--- a/webkit/glue/webview_delegate.h
+++ b/webkit/glue/webview_delegate.h
@@ -42,6 +42,7 @@ class AccessibilityObject;
namespace WebKit {
class WebDragData;
+class WebForm;
class WebWorker;
class WebWorkerClient;
class WebMediaPlayer;
@@ -50,9 +51,7 @@ struct WebPoint;
struct WebRect;
}
-struct PasswordForm;
struct WebPreferences;
-class AutofillForm;
class FilePath;
class SkBitmap;
class WebDevToolsAgentDelegate;
@@ -418,6 +417,12 @@ class WebViewDelegate : virtual public WebWidgetDelegate {
WebFrame* frame,
const GURL& source) {
}
+
+ // Notifies the delegate that a form is about to be submitted.
+ virtual void WillSubmitForm(WebView* webview, WebFrame* frame,
+ const WebKit::WebForm& form) {
+ }
+
//
// @method webView:willCloseFrame:
// @abstract Notifies the delegate that a frame will be closed
@@ -470,18 +475,6 @@ class WebViewDelegate : virtual public WebWidgetDelegate {
const std::wstring& source_id) {
}
- // Notification of possible password forms to be filled/submitted by
- // the password manager
- virtual void OnPasswordFormsSeen(WebView* webview,
- const std::vector<PasswordForm>& forms) {
- }
-
- // Notification of the submission of a form so that its contents can be
- // recorded for future autofilling.
- virtual void OnAutofillFormSubmitted(WebView* webview,
- const AutofillForm& form) {
- }
-
// Queries the browser for suggestions to be shown for the form text field
// named |field_name|. |text| is the text entered by the user so far and
// |node_id| is the id of the node of the input field.
diff --git a/webkit/glue/webview_impl.cc b/webkit/glue/webview_impl.cc
index b568a9f..57d594a 100644
--- a/webkit/glue/webview_impl.cc
+++ b/webkit/glue/webview_impl.cc
@@ -1730,24 +1730,6 @@ bool WebViewImpl::SetDropEffect(bool accept) {
}
}
-SearchableFormData* WebViewImpl::CreateSearchableFormDataForFocusedNode() {
- if (!page_.get())
- return NULL;
-
- if (RefPtr<Frame> focused = page_->focusController()->focusedFrame()) {
- RefPtr<Document> document = focused->document();
- if (document.get()) {
- RefPtr<Node> focused_node = document->focusedNode();
- if (focused_node.get() &&
- focused_node->nodeType() == Node::ELEMENT_NODE) {
- return SearchableFormData::Create(
- static_cast<Element*>(focused_node.get()));
- }
- }
- }
- return NULL;
-}
-
void WebViewImpl::AutofillSuggestionsForNode(
int64 node_id,
const std::vector<std::wstring>& suggestions,
diff --git a/webkit/glue/webview_impl.h b/webkit/glue/webview_impl.h
index caac1c8..28e3666 100644
--- a/webkit/glue/webview_impl.h
+++ b/webkit/glue/webview_impl.h
@@ -230,11 +230,6 @@ class WebViewImpl : public WebView, public base::RefCounted<WebViewImpl> {
WebCore::Frame* frame,
const WebCore::PlatformKeyboardEvent& e);
- // Creates and returns a new SearchableFormData for the focused node.
- // It's up to the caller to free the returned SearchableFormData.
- // This returns NULL if the focused node is NULL, or not in a valid form.
- SearchableFormData* CreateSearchableFormDataForFocusedNode();
-
scoped_refptr<WebViewDelegate> delegate_;
WebKit::WebSize size_;
diff --git a/webkit/webkit.gyp b/webkit/webkit.gyp
index 3e8df1e..7c54e1e 100644
--- a/webkit/webkit.gyp
+++ b/webkit/webkit.gyp
@@ -4189,6 +4189,7 @@
'api/public/WebData.h',
'api/public/WebDragData.h',
'api/public/WebFindOptions.h',
+ 'api/public/WebForm.h',
'api/public/WebHTTPBody.h',
'api/public/WebImage.h',
'api/public/WebInputEvent.h',
@@ -4230,6 +4231,7 @@
'api/src/WebCString.cpp',
'api/src/WebData.cpp',
'api/src/WebDragData.cpp',
+ 'api/src/WebForm.cpp',
'api/src/WebHTTPBody.cpp',
'api/src/WebImageSkia.cpp',
'api/src/WebInputEvent.cpp',