Coverage Report

Created: 2018-09-25 14:53

/work/obj-fuzz/dist/include/nsIContentInlines.h
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
3
/* This Source Code Form is subject to the terms of the Mozilla Public
4
 * License, v. 2.0. If a copy of the MPL was not distributed with this
5
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#ifndef nsIContentInlines_h
8
#define nsIContentInlines_h
9
10
#include "nsIContent.h"
11
#include "nsIDocument.h"
12
#include "nsBindingManager.h"
13
#include "nsContentUtils.h"
14
#include "nsAtom.h"
15
#include "nsIFrame.h"
16
#include "mozilla/dom/Element.h"
17
#include "mozilla/dom/HTMLSlotElement.h"
18
#include "mozilla/dom/ShadowRoot.h"
19
20
inline bool
21
nsIContent::IsInHTMLDocument() const
22
{
23
  return OwnerDoc()->IsHTMLDocument();
24
}
25
26
inline bool
27
nsIContent::IsInChromeDocument() const
28
{
29
  return nsContentUtils::IsChromeDoc(OwnerDoc());
30
}
31
32
inline void
33
nsIContent::SetPrimaryFrame(nsIFrame* aFrame)
34
{
35
  MOZ_ASSERT(IsInUncomposedDoc() || IsInShadowTree(), "This will end badly!");
36
37
  // FIXME bug 749326
38
  NS_ASSERTION(!aFrame || !mPrimaryFrame || aFrame == mPrimaryFrame,
39
               "Losing track of existing primary frame");
40
41
  if (aFrame) {
42
    if (MOZ_LIKELY(!IsHTMLElement(nsGkAtoms::area)) ||
43
        aFrame->GetContent() == this) {
44
      aFrame->SetIsPrimaryFrame(true);
45
    }
46
  } else if (nsIFrame* currentPrimaryFrame = GetPrimaryFrame()) {
47
    if (MOZ_LIKELY(!IsHTMLElement(nsGkAtoms::area)) ||
48
        currentPrimaryFrame->GetContent() == this) {
49
      currentPrimaryFrame->SetIsPrimaryFrame(false);
50
    }
51
  }
52
53
  mPrimaryFrame = aFrame;
54
}
55
56
inline mozilla::dom::ShadowRoot* nsIContent::GetShadowRoot() const
57
0
{
58
0
  if (!IsElement()) {
59
0
    return nullptr;
60
0
  }
61
0
62
0
  return AsElement()->GetShadowRoot();
63
0
}
64
65
template<nsINode::FlattenedParentType aType>
66
static inline nsINode*
67
GetFlattenedTreeParentNode(const nsINode* aNode)
68
0
{
69
0
  if (!aNode->IsContent()) {
70
0
    return nullptr;
71
0
  }
72
0
73
0
  nsINode* parent = aNode->GetParentNode();
74
0
  if (!parent || !parent->IsContent()) {
75
0
    return parent;
76
0
  }
77
0
78
0
  const nsIContent* content = aNode->AsContent();
79
0
  nsIContent* parentAsContent = parent->AsContent();
80
0
81
0
  if (aType == nsINode::eForStyle &&
82
0
      content->IsRootOfNativeAnonymousSubtree() &&
83
0
      parentAsContent == content->OwnerDoc()->GetRootElement()) {
84
0
    const bool docLevel =
85
0
      content->GetProperty(nsGkAtoms::docLevelNativeAnonymousContent);
86
0
    return docLevel ? content->OwnerDocAsNode() : parent;
87
0
  }
88
0
89
0
  if (content->IsRootOfAnonymousSubtree()) {
90
0
    return parent;
91
0
  }
92
0
93
0
  if (parentAsContent->GetShadowRoot()) {
94
0
    // If it's not assigned to any slot it's not part of the flat tree, and thus
95
0
    // we return null.
96
0
    return content->GetAssignedSlot();
97
0
  }
98
0
99
0
  if (parentAsContent->IsInShadowTree()) {
100
0
    if (auto* slot = mozilla::dom::HTMLSlotElement::FromNode(parentAsContent)) {
101
0
      // If the assigned nodes list is empty, we're fallback content which is
102
0
      // active, otherwise we are not part of the flat tree.
103
0
      return slot->AssignedNodes().IsEmpty()
104
0
        ? parent
105
0
        : nullptr;
106
0
    }
107
0
108
0
    if (auto* shadowRoot = mozilla::dom::ShadowRoot::FromNode(parentAsContent)) {
109
0
      return shadowRoot->GetHost();
110
0
    }
111
0
  }
112
0
113
0
  if (content->HasFlag(NODE_MAY_BE_IN_BINDING_MNGR) ||
114
0
      parent->HasFlag(NODE_MAY_BE_IN_BINDING_MNGR)) {
115
0
    if (nsIContent* xblInsertionPoint = content->GetXBLInsertionPoint()) {
116
0
      return xblInsertionPoint->GetParent();
117
0
    }
118
0
119
0
    if (parent->OwnerDoc()->BindingManager()->GetBindingWithContent(parentAsContent)) {
120
0
      // This is an unassigned node child of the bound element, so it isn't part
121
0
      // of the flat tree.
122
0
      return nullptr;
123
0
    }
124
0
  }
125
0
126
0
  MOZ_ASSERT(!parentAsContent->IsActiveChildrenElement(),
127
0
             "<xbl:children> isn't in the flattened tree");
128
0
129
0
  // Common case.
130
0
  return parent;
131
0
}
Unexecuted instantiation: xptdata.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: xptdata.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: Unified_cpp_gfx_layers2.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: Unified_cpp_gfx_layers2.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: Unified_cpp_gfx_layers4.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: Unified_cpp_gfx_layers4.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: Unified_cpp_dom_xslt_xpath0.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: Unified_cpp_dom_xslt_xpath0.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: Unified_cpp_dom_xslt_xpath1.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: Unified_cpp_dom_xslt_xpath1.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: nsWindow.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: nsWindow.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: Unified_cpp_widget_gtk0.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: Unified_cpp_widget_gtk0.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: Unified_cpp_widget_gtk1.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: Unified_cpp_widget_gtk1.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: Unified_cpp_widget_gtk2.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: Unified_cpp_widget_gtk2.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: Unified_cpp_editor_spellchecker0.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: Unified_cpp_editor_spellchecker0.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: AccessibleWrap.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: AccessibleWrap.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: ApplicationAccessibleWrap.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: ApplicationAccessibleWrap.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: AtkSocketAccessible.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: AtkSocketAccessible.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: DOMtoATK.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: DOMtoATK.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: DocAccessibleWrap.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: DocAccessibleWrap.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: Platform.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: Platform.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: RootAccessibleWrap.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: RootAccessibleWrap.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: UtilInterface.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: UtilInterface.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: nsMaiHyperlink.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: nsMaiHyperlink.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: nsMaiInterfaceAction.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: nsMaiInterfaceAction.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: nsMaiInterfaceComponent.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: nsMaiInterfaceComponent.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: nsMaiInterfaceDocument.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: nsMaiInterfaceDocument.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: nsMaiInterfaceEditableText.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: nsMaiInterfaceEditableText.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: nsMaiInterfaceHyperlinkImpl.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: nsMaiInterfaceHyperlinkImpl.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: nsMaiInterfaceHypertext.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: nsMaiInterfaceHypertext.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: nsMaiInterfaceImage.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: nsMaiInterfaceImage.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: nsMaiInterfaceSelection.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: nsMaiInterfaceSelection.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: nsMaiInterfaceTable.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: nsMaiInterfaceTable.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: nsMaiInterfaceTableCell.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: nsMaiInterfaceTableCell.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: nsMaiInterfaceText.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: nsMaiInterfaceText.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: nsMaiInterfaceValue.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: nsMaiInterfaceValue.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: Unified_cpp_accessible_aom0.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: Unified_cpp_accessible_aom0.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: Unified_cpp_accessible_html0.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: Unified_cpp_accessible_html0.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: Unified_cpp_accessible_ipc0.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: Unified_cpp_accessible_ipc0.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: DocAccessibleChild.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: DocAccessibleChild.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: ProxyAccessible.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: ProxyAccessible.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: Unified_cpp_accessible_xpcom0.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: Unified_cpp_accessible_xpcom0.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: Unified_cpp_components_find0.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: Unified_cpp_components_find0.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: Unified_cpp_reputationservice0.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: Unified_cpp_reputationservice0.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: nsTypeAheadFind.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: nsTypeAheadFind.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
Unexecuted instantiation: nsFormFillController.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)0>(nsINode const*)
Unexecuted instantiation: nsFormFillController.cpp:nsINode* GetFlattenedTreeParentNode<(nsINode::FlattenedParentType)1>(nsINode const*)
132
133
inline nsINode*
134
nsINode::GetFlattenedTreeParentNode() const
135
{
136
  return ::GetFlattenedTreeParentNode<nsINode::eNotForStyle>(this);
137
}
138
139
inline nsIContent*
140
nsIContent::GetFlattenedTreeParent() const
141
{
142
  nsINode* parent = GetFlattenedTreeParentNode();
143
  return (parent && parent->IsContent()) ? parent->AsContent() : nullptr;
144
}
145
146
inline bool
147
nsIContent::IsEventAttributeName(nsAtom* aName)
148
{
149
  const char16_t* name = aName->GetUTF16String();
150
  if (name[0] != 'o' || name[1] != 'n') {
151
    return false;
152
  }
153
154
  return IsEventAttributeNameInternal(aName);
155
}
156
157
inline nsINode*
158
nsINode::GetFlattenedTreeParentNodeForStyle() const
159
{
160
  return ::GetFlattenedTreeParentNode<nsINode::eForStyle>(this);
161
}
162
163
inline bool
164
nsINode::NodeOrAncestorHasDirAuto() const
165
{
166
  return AncestorHasDirAuto() || (IsElement() && AsElement()->HasDirAuto());
167
}
168
169
inline bool
170
nsINode::IsEditable() const
171
0
{
172
0
  if (HasFlag(NODE_IS_EDITABLE)) {
173
0
    // The node is in an editable contentEditable subtree.
174
0
    return true;
175
0
  }
176
0
177
0
  nsIDocument* doc = GetUncomposedDoc();
178
0
179
0
  // Check if the node is in a document and the document is in designMode.
180
0
  return doc && doc->HasFlag(NODE_IS_EDITABLE);
181
0
}
182
183
inline bool
184
nsIContent::IsActiveChildrenElement() const
185
{
186
  if (!mNodeInfo->Equals(nsGkAtoms::children, kNameSpaceID_XBL)) {
187
    return false;
188
  }
189
190
  nsIContent* bindingParent = GetBindingParent();
191
  if (!bindingParent) {
192
    return false;
193
  }
194
195
  // We reuse the binding parent machinery for Shadow DOM too, so prevent that
196
  // from getting us confused in this case.
197
  return !bindingParent->GetShadowRoot();
198
}
199
200
inline bool
201
nsIContent::IsInAnonymousSubtree() const
202
0
{
203
0
  NS_ASSERTION(!IsInNativeAnonymousSubtree() || GetBindingParent() ||
204
0
               (!IsInUncomposedDoc() &&
205
0
                static_cast<nsIContent*>(SubtreeRoot())->IsInNativeAnonymousSubtree()),
206
0
               "Must have binding parent when in native anonymous subtree which is in document.\n"
207
0
               "Native anonymous subtree which is not in document must have native anonymous root.");
208
0
209
0
  if (IsInNativeAnonymousSubtree()) {
210
0
    return true;
211
0
  }
212
0
213
0
  nsIContent* bindingParent = GetBindingParent();
214
0
  if (!bindingParent) {
215
0
    return false;
216
0
  }
217
0
218
0
  // We reuse the binding parent machinery for Shadow DOM too, so prevent that
219
0
  // from getting us confused in this case.
220
0
  return !bindingParent->GetShadowRoot();
221
0
}
222
223
#endif // nsIContentInlines_h