613Element* Document::getElementByAccessKey(const String& key)
614{
615 if (key.isEmpty())
616 return 0;
617 if (!m_accessKeyMapValid) {
618 buildAccessKeyMap(this);
619 m_accessKeyMapValid = true;
620 }
621 return m_elementsByAccessKey.get(key.impl());
622}
623
624void Document::buildAccessKeyMap(ContainerNode* root)
625{
626 for (Node* n = root; n; n = n->traverseNextNode(root)) {
627 if (!n->isElementNode())
628 continue;
629 Element* element = static_cast<Element*>(n);
630 const AtomicString& accessKey = element->getAttribute(accesskeyAttr);
631 if (!accessKey.isEmpty())
632 m_elementsByAccessKey.set(accessKey.impl(), element);
633 buildAccessKeyMap(element->shadowRoot());
634 }
635}
636
637void Document::invalidateAccessKeyMap()
638{
639 m_accessKeyMapValid = false;
640 m_elementsByAccessKey.clear();
641}
642