bool HTMLFormElement::validateInteractively(Event* event) { ASSERT(event); if (!document()->page() || !document()->page()->settings()->interactiveFormValidationEnabled() || noValidate()) return true; HTMLFormControlElement* submitElement = submitElementFromEvent(event); if (submitElement && submitElement->formNoValidate()) return true; Vector<RefPtr<HTMLFormControlElement> > unhandledInvalidControls; collectUnhandledInvalidControls(unhandledInvalidControls); if (unhandledInvalidControls.isEmpty()) return true; // If the form has invalid controls, abort submission. RefPtr<HTMLFormElement> protector(this); // Focus on the first focusable control. for (unsigned i = 0; i < unhandledInvalidControls.size(); ++i) { HTMLFormControlElement* unhandled = unhandledInvalidControls[i].get(); if (unhandled->isFocusable() && unhandled->inDocument()) { RefPtr<Document> originalDocument(unhandled->document()); unhandled->scrollIntoViewIfNeeded(false); // scrollIntoViewIfNeeded() dispatches events, so the state // of 'unhandled' might be changed so it's no longer focusable or // moved to another document. if (unhandled->isFocusable() && unhandled->inDocument() && originalDocument == unhandled->document()) { unhandled->focus(); break; } } } // Warn about all of unfocusable controls. if (Frame* frame = document()->frame()) { for (unsigned i = 0; i < unhandledInvalidControls.size(); ++i) { HTMLFormControlElement* unhandled = unhandledInvalidControls[i].get(); if (unhandled->isFocusable() && unhandled->inDocument()) continue; String message("An invalid form control with name='%name' is not focusable."); message.replace("%name", unhandled->name()); frame->domWindow()->console()->addMessage(HTMLMessageSource, LogMessageType, ErrorMessageLevel, message, 0, document()->url().string()); } } m_insubmit = false; return false; }
static void runAutofocus(HTMLDialogElement* dialog) { Node* next = 0; for (Node* node = dialog->firstChild(); node; node = next) { if (node->isElementNode() && toElement(node)->isFormControlElement()) { HTMLFormControlElement* control = toHTMLFormControlElement(node); if (control->isAutofocusable()) { control->focus(); control->setAutofocused(); return; } } if (node->hasTagName(dialogTag)) next = NodeTraversal::nextSkippingChildren(node, dialog); else next = NodeTraversal::next(node, dialog); } }
// This function chooses the focused element when showModal() is invoked, as described in the spec for showModal(). static void setFocusForModalDialog(HTMLDialogElement* dialog) { Element* focusableDescendant = 0; Node* next = 0; for (Node* node = dialog->firstChild(); node; node = next) { if (node->hasTagName(dialogTag)) next = NodeTraversal::nextSkippingChildren(*node, dialog); else next = NodeTraversal::next(*node, dialog); if (!node->isElementNode()) continue; Element* element = toElement(node); if (element->isFormControlElement()) { HTMLFormControlElement* control = toHTMLFormControlElement(node); if (control->isAutofocusable()) { control->focus(); return; } } if (!focusableDescendant && element->isFocusable()) focusableDescendant = element; } if (focusableDescendant) { focusableDescendant->focus(); return; } if (dialog->isFocusable()) { dialog->focus(); return; } dialog->document().setFocusedElement(0); }