b164bd9ea83972751e718b77b1cf41ef94c7730e
[WebKit-https.git] / Source / WebCore / dom / TreeScope.h
1 /*
2  * Copyright (C) 2011 Google Inc. All Rights Reserved.
3  * Copyright (C) 2012, 2013 Apple Inc. All Rights Reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #pragma once
28
29 #include "TreeScopeOrderedMap.h"
30 #include <memory>
31 #include <wtf/Forward.h>
32 #include <wtf/Vector.h>
33 #include <wtf/text/AtomicString.h>
34
35 namespace WebCore {
36
37 class ContainerNode;
38 class Document;
39 class Element;
40 class HTMLImageElement;
41 class HTMLLabelElement;
42 class HTMLMapElement;
43 class LayoutPoint;
44 class IdTargetObserverRegistry;
45 class Node;
46 class ShadowRoot;
47
48 class TreeScope {
49     friend class Document;
50
51 public:
52     TreeScope* parentTreeScope() const { return m_parentTreeScope; }
53     void setParentTreeScope(TreeScope&);
54
55     Element* focusedElementInScope();
56     Element* pointerLockElement() const;
57
58     WEBCORE_EXPORT Element* getElementById(const AtomicString&) const;
59     WEBCORE_EXPORT Element* getElementById(const String&) const;
60     Element* getElementById(StringView) const;
61     const Vector<Element*>* getAllElementsById(const AtomicString&) const;
62     bool hasElementWithId(const AtomicStringImpl&) const;
63     bool containsMultipleElementsWithId(const AtomicString& id) const;
64     void addElementById(const AtomicStringImpl& elementId, Element&, bool notifyObservers = true);
65     void removeElementById(const AtomicStringImpl& elementId, Element&, bool notifyObservers = true);
66
67     WEBCORE_EXPORT Element* getElementByName(const AtomicString&) const;
68     bool hasElementWithName(const AtomicStringImpl&) const;
69     bool containsMultipleElementsWithName(const AtomicString&) const;
70     void addElementByName(const AtomicStringImpl&, Element&);
71     void removeElementByName(const AtomicStringImpl&, Element&);
72
73     Document& documentScope() const { return m_documentScope.get(); }
74     static ptrdiff_t documentScopeMemoryOffset() { return OBJECT_OFFSETOF(TreeScope, m_documentScope); }
75
76     // https://dom.spec.whatwg.org/#retarget
77     Node& retargetToScope(Node&) const;
78
79     WEBCORE_EXPORT Node* ancestorNodeInThisScope(Node*) const;
80     WEBCORE_EXPORT Element* ancestorElementInThisScope(Element*) const;
81
82     void addImageMap(HTMLMapElement&);
83     void removeImageMap(HTMLMapElement&);
84     HTMLMapElement* getImageMap(const AtomicString&) const;
85
86     void addImageElementByUsemap(const AtomicStringImpl&, HTMLImageElement&);
87     void removeImageElementByUsemap(const AtomicStringImpl&, HTMLImageElement&);
88     HTMLImageElement* imageElementByUsemap(const AtomicStringImpl&) const;
89
90     // For accessibility.
91     bool shouldCacheLabelsByForAttribute() const { return !!m_labelsByForAttribute; }
92     void addLabel(const AtomicStringImpl& forAttributeValue, HTMLLabelElement&);
93     void removeLabel(const AtomicStringImpl& forAttributeValue, HTMLLabelElement&);
94     HTMLLabelElement* labelElementForId(const AtomicString& forAttributeValue);
95
96     WEBCORE_EXPORT RefPtr<Element> elementFromPoint(double clientX, double clientY);
97     WEBCORE_EXPORT Vector<RefPtr<Element>> elementsFromPoint(double clientX, double clientY);
98
99     // Find first anchor with the given name.
100     // First searches for an element with the given ID, but if that fails, then looks
101     // for an anchor with the given name. ID matching is always case sensitive, but
102     // Anchor name matching is case sensitive in strict mode and not case sensitive in
103     // quirks mode for historical compatibility reasons.
104     Element* findAnchor(const String& name);
105
106     ContainerNode& rootNode() const { return m_rootNode; }
107
108     IdTargetObserverRegistry& idTargetObserverRegistry() const { return *m_idTargetObserverRegistry.get(); }
109
110 protected:
111     TreeScope(ShadowRoot&, Document&);
112     explicit TreeScope(Document&);
113     ~TreeScope();
114
115     void destroyTreeScopeData();
116     void setDocumentScope(Document& document)
117     {
118         m_documentScope = document;
119     }
120
121     Node* nodeFromPoint(const LayoutPoint& clientPoint, LayoutPoint* localPoint);
122
123 private:
124
125     ContainerNode& m_rootNode;
126     std::reference_wrapper<Document> m_documentScope;
127     TreeScope* m_parentTreeScope;
128
129     std::unique_ptr<TreeScopeOrderedMap> m_elementsById;
130     std::unique_ptr<TreeScopeOrderedMap> m_elementsByName;
131     std::unique_ptr<TreeScopeOrderedMap> m_imageMapsByName;
132     std::unique_ptr<TreeScopeOrderedMap> m_imagesByUsemap;
133     std::unique_ptr<TreeScopeOrderedMap> m_labelsByForAttribute;
134
135     std::unique_ptr<IdTargetObserverRegistry> m_idTargetObserverRegistry;
136 };
137
138 inline bool TreeScope::hasElementWithId(const AtomicStringImpl& id) const
139 {
140     return m_elementsById && m_elementsById->contains(id);
141 }
142
143 inline bool TreeScope::containsMultipleElementsWithId(const AtomicString& id) const
144 {
145     return m_elementsById && id.impl() && m_elementsById->containsMultiple(*id.impl());
146 }
147
148 inline bool TreeScope::hasElementWithName(const AtomicStringImpl& id) const
149 {
150     return m_elementsByName && m_elementsByName->contains(id);
151 }
152
153 inline bool TreeScope::containsMultipleElementsWithName(const AtomicString& name) const
154 {
155     return m_elementsByName && name.impl() && m_elementsByName->containsMultiple(*name.impl());
156 }
157
158 TreeScope* commonTreeScope(Node*, Node*);
159
160 } // namespace WebCore