f933c6f25cfd973b54d0e34bff26c1df843579a6
[WebKit-https.git] / Source / WebCore / dom / TreeScope.h
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 "DocumentOrderedMap.h"
30 #include <wtf/Forward.h>
31 #include <wtf/text/AtomicString.h>
32
33 namespace WebCore {
34
35 class ContainerNode;
36 class DOMSelection;
37 class Document;
38 class Element;
39 class HTMLMapElement;
40 class IdTargetObserverRegistry;
41 class Node;
42
43 // A class which inherits both Node and TreeScope must call clearRareData() in its destructor
44 // so that the Node destructor no longer does problematic NodeList cache manipulation in
45 // the destructor.
46 class TreeScope {
47     friend class Document;
48
49 public:
50     TreeScope* parentTreeScope() const { return m_parentTreeScope; }
51     void setParentTreeScope(TreeScope*);
52
53     Node* focusedNode();
54     Element* getElementById(const AtomicString&) const;
55     bool hasElementWithId(AtomicStringImpl* id) const;
56     bool containsMultipleElementsWithId(const AtomicString& id) const;
57     void addElementById(const AtomicString& elementId, Element*);
58     void removeElementById(const AtomicString& elementId, Element*);
59
60     Node* ancestorInThisScope(Node*) const;
61
62     void addImageMap(HTMLMapElement*);
63     void removeImageMap(HTMLMapElement*);
64     HTMLMapElement* getImageMap(const String& url) const;
65
66     DOMSelection* getSelection() const;
67
68     // Find first anchor with the given name.
69     // First searches for an element with the given ID, but if that fails, then looks
70     // for an anchor with the given name. ID matching is always case sensitive, but
71     // Anchor name matching is case sensitive in strict mode and not case sensitive in
72     // quirks mode for historical compatibility reasons.
73     Element* findAnchor(const String& name);
74
75     virtual bool applyAuthorStyles() const;
76     virtual bool resetStyleInheritance() const;
77
78     // Used by the basic DOM mutation methods (e.g., appendChild()).
79     void adoptIfNeeded(Node*);
80
81     ContainerNode* rootNode() const { return m_rootNode; }
82     Document* rootDocument() const { return m_rootDocument; }
83     bool isDocumentScope() const;
84     IdTargetObserverRegistry& idTargetObserverRegistry() const { return *m_idTargetObserverRegistry.get(); }
85
86     static TreeScope* nullInstance();
87
88 protected:
89     TreeScope(ContainerNode*, Document*);
90     virtual ~TreeScope();
91
92     void destroyTreeScopeData();
93
94 private:
95     TreeScope();
96
97     ContainerNode* m_rootNode;
98     Document* m_rootDocument;
99     TreeScope* m_parentTreeScope;
100
101     DocumentOrderedMap m_elementsById;
102     DocumentOrderedMap m_imageMapsByName;
103
104     OwnPtr<IdTargetObserverRegistry> m_idTargetObserverRegistry;
105
106     mutable RefPtr<DOMSelection> m_selection;
107 };
108
109 inline bool TreeScope::hasElementWithId(AtomicStringImpl* id) const
110 {
111     ASSERT(id);
112     return m_elementsById.contains(id);
113 }
114
115 inline bool TreeScope::containsMultipleElementsWithId(const AtomicString& id) const
116 {
117     return m_elementsById.containsMultiple(id.impl());
118 }
119
120 TreeScope* commonTreeScope(Node*, Node*);
121
122 } // namespace WebCore
123
124 #endif // TreeScope_h