bool HTMLFormElement::validateInteractively() { const FormAssociatedElement::List& elements = associatedElements(); for (unsigned i = 0; i < elements.size(); ++i) { if (elements[i]->isFormControlElement()) toHTMLFormControlElement(elements[i])->hideVisibleValidationMessage(); } WillBeHeapVector<RefPtrWillBeMember<HTMLFormControlElement>> unhandledInvalidControls; if (!checkInvalidControlsAndCollectUnhandled(&unhandledInvalidControls, CheckValidityDispatchInvalidEvent)) return true; // Because the form has invalid controls, we abort the form submission and // show a validation message on a focusable form control. // Needs to update layout now because we'd like to call isFocusable(), which // has !layoutObject()->needsLayout() assertion. document().updateLayoutIgnorePendingStylesheets(); RefPtrWillBeRawPtr<HTMLFormElement> protector(this); // Focus on the first focusable control and show a validation message. for (unsigned i = 0; i < unhandledInvalidControls.size(); ++i) { 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) { HTMLFormControlElement* unhandled = unhandledInvalidControls[i].get(); if (unhandled->isFocusable()) continue; String message("An invalid form control with name='%name' is not focusable."); message.replace("%name", unhandled->name()); document().addConsoleMessage(ConsoleMessage::create(RenderingMessageSource, ErrorMessageLevel, message)); } } return false; }