Source/WebCore/ChangeLog

 12011-05-03 Roland Steiner <rolandsteiner@chromium.org>
 2
 3 Reviewed by NOBODY (OOPS!).
 4
 5 Allow access keys to be used in shadow DOM
 6 https://bugs.webkit.org/show_bug.cgi?id=59979
 7
 8 Move access key methods and members back to Document from TreeScope.
 9 Also traverse into shadow trees when building the access key map.
 10
 11 No new tests. (refactoring)
 12
 13 * dom/Document.cpp:
 14 (WebCore::Document::Document):
 15 (WebCore::Document::getElementByAccessKey):
 16 (WebCore::Document::buildAccessKeyMap):
 17 (WebCore::Document::invalidateAccessKeyMap):
 18 * dom/Document.h:
 19 * dom/TreeScope.cpp:
 20 (WebCore::TreeScope::TreeScope):
 21 (WebCore::TreeScope::destroyTreeScopeData):
 22 * dom/TreeScope.h:
 23
1242011-05-03 Sam Weinig <sam@webkit.org>
225
326 Reviewed by Anders Carlsson.

Source/WebCore/dom/Document.cpp

@@Document::Document(Frame* frame, const KURL& url, bool isXHTML, bool isHTML)
400400#endif
401401 , m_createRenderers(true)
402402 , m_inPageCache(false)
 403 , m_accessKeyMapValid(false)
403404 , m_useSecureKeyboardEntryWhenActive(false)
404405 , m_isXHTML(isXHTML)
405406 , m_isHTML(isHTML)

@@Element* Document::getElementById(const AtomicString& id) const
609610 return TreeScope::getElementById(id);
610611}
611612
 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
612643MediaQueryMatcher* Document::mediaQueryMatcher()
613644{
614645 if (!m_mediaQueryMatcher)

Source/WebCore/dom/Document.h

@@public:
245245
246246 Element* getElementById(const AtomicString& id) const;
247247
 248 Element* getElementByAccessKey(const String& key);
 249 void invalidateAccessKeyMap();
 250
248251 // DOM methods & attributes for Document
249252
250253 DEFINE_ATTRIBUTE_EVENT_LISTENER(abort);

@@private:
11191122
11201123 void cacheDocumentElement() const;
11211124
 1125 void buildAccessKeyMap(ContainerNode* root);
 1126
11221127 void createStyleSelector();
11231128
11241129 PassRefPtr<NodeList> handleZeroPadding(const HitTestRequest&, HitTestResult&) const;

@@private:
13301335 HashSet<Element*> m_mediaVolumeCallbackElements;
13311336 HashSet<Element*> m_privateBrowsingStateChangedElements;
13321337
 1338 HashMap<StringImpl*, Element*, CaseFoldingHash> m_elementsByAccessKey;
 1339 bool m_accessKeyMapValid;
 1340
13331341 bool m_useSecureKeyboardEntryWhenActive;
13341342
13351343 bool m_isXHTML;

Source/WebCore/dom/TreeScope.cpp

@@using namespace HTMLNames;
3939TreeScope::TreeScope(Document* document)
4040 : ContainerNode(document)
4141 , m_parentTreeScope(0)
42  , m_accessKeyMapValid(false)
4342 , m_numNodeListCaches(0)
4443{
4544}

@@void TreeScope::destroyTreeScopeData()
5453{
5554 m_elementsById.clear();
5655 m_imageMapsByName.clear();
57  m_elementsByAccessKey.clear();
5856}
5957
6058void TreeScope::setParentTreeScope(TreeScope* newParentScope)

@@void TreeScope::removeElementById(const AtomicString& elementId, Element* elemen
8482 m_elementsById.remove(elementId.impl(), element);
8583}
8684
87 Element* TreeScope::getElementByAccessKey(const String& key) const
88 {
89  if (key.isEmpty())
90  return 0;
91  if (!m_accessKeyMapValid) {
92  for (Node* n = firstChild(); n; n = n->traverseNextNode()) {
93  if (!n->isElementNode())
94  continue;
95  Element* element = static_cast<Element*>(n);
96  const AtomicString& accessKey = element->getAttribute(accesskeyAttr);
97  if (!accessKey.isEmpty())
98  m_elementsByAccessKey.set(accessKey.impl(), element);
99  }
100  m_accessKeyMapValid = true;
101  }
102  return m_elementsByAccessKey.get(key.impl());
103 }
104 
105 void TreeScope::invalidateAccessKeyMap()
106 {
107  m_accessKeyMapValid = false;
108  m_elementsByAccessKey.clear();
109 }
110 
11185void TreeScope::addImageMap(HTMLMapElement* imageMap)
11286{
11387 AtomicStringImpl* name = imageMap->getName().impl();

Source/WebCore/dom/TreeScope.h

@@public:
5151 void removeImageMap(HTMLMapElement*);
5252 HTMLMapElement* getImageMap(const String& url) const;
5353
54  Element* getElementByAccessKey(const String& key) const;
55  void invalidateAccessKeyMap();
56 
5754 void addNodeListCache() { ++m_numNodeListCaches; }
5855 void removeNodeListCache() { ASSERT(m_numNodeListCaches > 0); --m_numNodeListCaches; }
5956 bool hasNodeListCaches() const { return m_numNodeListCaches; }

@@private:
7976 DocumentOrderedMap m_elementsById;
8077 DocumentOrderedMap m_imageMapsByName;
8178
82  mutable HashMap<StringImpl*, Element*, CaseFoldingHash> m_elementsByAccessKey;
83  mutable bool m_accessKeyMapValid;
84 
8579 unsigned m_numNodeListCaches;
8680};
8781