Index: Source/core/html/HTMLFormElement.cpp |
diff --git a/Source/core/html/HTMLFormElement.cpp b/Source/core/html/HTMLFormElement.cpp |
index 80e639c76fa517f94a3ec3bdaa01b0f5b25cca09..64e97f6e786d763b1f5d4e3d33b0389db352ee63 100644 |
--- a/Source/core/html/HTMLFormElement.cpp |
+++ b/Source/core/html/HTMLFormElement.cpp |
@@ -273,23 +273,15 @@ static inline HTMLFormControlElement* submitElementFromEvent(const Event* event) |
return 0; |
} |
-bool HTMLFormElement::validateInteractively(Event* event) |
+bool HTMLFormElement::validateInteractively() |
{ |
- ASSERT(event); |
- if (!document().page() || noValidate()) |
- return true; |
- |
- HTMLFormControlElement* submitElement = submitElementFromEvent(event); |
- if (submitElement && submitElement->formNoValidate()) |
- return true; |
- |
const FormAssociatedElement::List& elements = associatedElements(); |
for (unsigned i = 0; i < elements.size(); ++i) { |
if (elements[i]->isFormControlElement()) |
toHTMLFormControlElement(elements[i])->hideVisibleValidationMessage(); |
} |
- WillBeHeapVector<RefPtrWillBeMember<FormAssociatedElement> > unhandledInvalidControls; |
+ WillBeHeapVector<RefPtrWillBeMember<HTMLFormControlElement> > unhandledInvalidControls; |
if (!checkInvalidControlsAndCollectUnhandled(&unhandledInvalidControls, CheckValidityDispatchInvalidEvent)) |
return true; |
// Because the form has invalid controls, we abort the form submission and |
@@ -302,25 +294,20 @@ bool HTMLFormElement::validateInteractively(Event* event) |
RefPtrWillBeRawPtr<HTMLFormElement> protector(this); |
// Focus on the first focusable control and show a validation message. |
for (unsigned i = 0; i < unhandledInvalidControls.size(); ++i) { |
- FormAssociatedElement* unhandledAssociatedElement = unhandledInvalidControls[i].get(); |
- HTMLElement* unhandled = toHTMLElement(unhandledAssociatedElement); |
- if (unhandled->isFocusable() && unhandled->inDocument()) { |
- unhandled->scrollIntoViewIfNeeded(false); |
- unhandled->focus(); |
- if (unhandled->isFormControlElement()) |
- toHTMLFormControlElement(unhandled)->updateVisibleValidationMessage(); |
+ HTMLFormControlElement* unhandled = unhandledInvalidControls[i].get(); |
+ if (unhandled->isFocusable()) { |
+ unhandled->showValidationMessage(); |
break; |
} |
} |
// Warn about all of unfocusable controls. |
if (document().frame()) { |
for (unsigned i = 0; i < unhandledInvalidControls.size(); ++i) { |
- FormAssociatedElement* unhandledAssociatedElement = unhandledInvalidControls[i].get(); |
- HTMLElement* unhandled = toHTMLElement(unhandledAssociatedElement); |
- if (unhandled->isFocusable() && unhandled->inDocument()) |
+ HTMLFormControlElement* unhandled = unhandledInvalidControls[i].get(); |
+ if (unhandled->isFocusable()) |
continue; |
String message("An invalid form control with name='%name' is not focusable."); |
- message.replace("%name", unhandledAssociatedElement->name()); |
+ message.replace("%name", unhandled->name()); |
document().addConsoleMessage(ConsoleMessage::create(RenderingMessageSource, ErrorMessageLevel, message)); |
} |
} |
@@ -334,8 +321,14 @@ void HTMLFormElement::prepareForSubmission(Event* event) |
if (!frame || m_isSubmittingOrInUserJSSubmitEvent) |
return; |
+ bool skipValidation = !document().page() || noValidate(); |
+ ASSERT(event); |
+ HTMLFormControlElement* submitElement = submitElementFromEvent(event); |
+ if (submitElement && submitElement->formNoValidate()) |
+ skipValidation = true; |
+ |
// Interactive validation must be done before dispatching the submit event. |
- if (!validateInteractively(event)) |
+ if (!skipValidation && !validateInteractively()) |
return; |
m_isSubmittingOrInUserJSSubmitEvent = true; |
@@ -736,7 +729,7 @@ bool HTMLFormElement::checkValidity() |
return !checkInvalidControlsAndCollectUnhandled(0, CheckValidityDispatchInvalidEvent); |
} |
-bool HTMLFormElement::checkInvalidControlsAndCollectUnhandled(WillBeHeapVector<RefPtrWillBeMember<FormAssociatedElement> >* unhandledInvalidControls, CheckValidityEventBehavior eventBehavior) |
+bool HTMLFormElement::checkInvalidControlsAndCollectUnhandled(WillBeHeapVector<RefPtrWillBeMember<HTMLFormControlElement> >* unhandledInvalidControls, CheckValidityEventBehavior eventBehavior) |
{ |
RefPtrWillBeRawPtr<HTMLFormElement> protector(this); |
// Copy associatedElements because event handlers called from |
@@ -757,6 +750,11 @@ bool HTMLFormElement::checkInvalidControlsAndCollectUnhandled(WillBeHeapVector<R |
return hasInvalidControls; |
} |
+bool HTMLFormElement::reportValidity() |
+{ |
+ return validateInteractively(); |
+} |
+ |
Element* HTMLFormElement::elementFromPastNamesMap(const AtomicString& pastName) |
{ |
if (pastName.isEmpty() || !m_pastNamesMap) |