Beispiel #1
0
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);
    }
}
Beispiel #3
0
// 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);
}