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); }