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);
    }
}
示例#2
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);
}