Home | History | Annotate | Download | only in dom
      1 /*
      2  * Copyright (C) 2011 Google Inc. All Rights Reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #ifndef TreeScope_h
     27 #define TreeScope_h
     28 
     29 #include "ContainerNode.h"
     30 #include "DocumentOrderedMap.h"
     31 
     32 namespace WebCore {
     33 
     34 class Element;
     35 class HTMLMapElement;
     36 
     37 class TreeScope : public ContainerNode {
     38     friend class Document;
     39 
     40 public:
     41     TreeScope* parentTreeScope() const { return m_parentTreeScope; }
     42 
     43     Element* getElementById(const AtomicString&) const;
     44     bool hasElementWithId(AtomicStringImpl* id) const;
     45     bool containsMultipleElementsWithId(const AtomicString& id) const;
     46     void addElementById(const AtomicString& elementId, Element*);
     47     void removeElementById(const AtomicString& elementId, Element*);
     48 
     49     void addImageMap(HTMLMapElement*);
     50     void removeImageMap(HTMLMapElement*);
     51     HTMLMapElement* getImageMap(const String& url) const;
     52 
     53     Element* getElementByAccessKey(const String& key) const;
     54     void invalidateAccessKeyMap();
     55 
     56     void addNodeListCache() { ++m_numNodeListCaches; }
     57     void removeNodeListCache() { ASSERT(m_numNodeListCaches > 0); --m_numNodeListCaches; }
     58     bool hasNodeListCaches() const { return m_numNodeListCaches; }
     59 
     60     // Find first anchor with the given name.
     61     // First searches for an element with the given ID, but if that fails, then looks
     62     // for an anchor with the given name. ID matching is always case sensitive, but
     63     // Anchor name matching is case sensitive in strict mode and not case sensitive in
     64     // quirks mode for historical compatibility reasons.
     65     Element* findAnchor(const String& name);
     66 
     67 protected:
     68     TreeScope(Document*, ConstructionType = CreateContainer);
     69 
     70     virtual ~TreeScope();
     71 
     72     void destroyTreeScopeData();
     73 
     74     void setParentTreeScope(TreeScope*);
     75 
     76 private:
     77     TreeScope* m_parentTreeScope;
     78 
     79     DocumentOrderedMap m_elementsById;
     80     DocumentOrderedMap m_imageMapsByName;
     81 
     82     mutable HashMap<StringImpl*, Element*, CaseFoldingHash> m_elementsByAccessKey;
     83     mutable bool m_accessKeyMapValid;
     84 
     85     unsigned m_numNodeListCaches;
     86 };
     87 
     88 inline bool TreeScope::hasElementWithId(AtomicStringImpl* id) const
     89 {
     90     ASSERT(id);
     91     return m_elementsById.contains(id);
     92 }
     93 
     94 inline bool TreeScope::containsMultipleElementsWithId(const AtomicString& id) const
     95 {
     96     return m_elementsById.containsMultiple(id.impl());
     97 }
     98 
     99 } // namespace WebCore
    100 
    101 #endif // TreeScope_h
    102 
    103