Bumping manifests a=b2g-bump
[gecko.git] / dom / xbl / XBLChildrenElement.cpp
blobad7681d8df565a1632ddbf4ffafbfa98a594abf0
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=2 sw=2 et tw=79: */
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/. */
7 #include "mozilla/dom/XBLChildrenElement.h"
8 #include "nsCharSeparatedTokenizer.h"
9 #include "mozilla/dom/NodeListBinding.h"
11 namespace mozilla {
12 namespace dom {
14 XBLChildrenElement::~XBLChildrenElement()
18 NS_IMPL_ADDREF_INHERITED(XBLChildrenElement, Element)
19 NS_IMPL_RELEASE_INHERITED(XBLChildrenElement, Element)
21 NS_INTERFACE_TABLE_HEAD(XBLChildrenElement)
22 NS_INTERFACE_TABLE_INHERITED(XBLChildrenElement, nsIDOMNode,
23 nsIDOMElement)
24 NS_ELEMENT_INTERFACE_TABLE_TO_MAP_SEGUE
25 NS_INTERFACE_MAP_END_INHERITING(Element)
27 NS_IMPL_ELEMENT_CLONE(XBLChildrenElement)
29 nsresult
30 XBLChildrenElement::UnsetAttr(int32_t aNameSpaceID, nsIAtom* aAttribute,
31 bool aNotify)
33 if (aAttribute == nsGkAtoms::includes &&
34 aNameSpaceID == kNameSpaceID_None) {
35 mIncludes.Clear();
38 return Element::UnsetAttr(aNameSpaceID, aAttribute, aNotify);
41 bool
42 XBLChildrenElement::ParseAttribute(int32_t aNamespaceID,
43 nsIAtom* aAttribute,
44 const nsAString& aValue,
45 nsAttrValue& aResult)
47 if (aAttribute == nsGkAtoms::includes &&
48 aNamespaceID == kNameSpaceID_None) {
49 mIncludes.Clear();
50 nsCharSeparatedTokenizer tok(aValue, '|',
51 nsCharSeparatedTokenizer::SEPARATOR_OPTIONAL);
52 while (tok.hasMoreTokens()) {
53 mIncludes.AppendElement(do_GetAtom(tok.nextToken()));
57 return false;
60 } // namespace mozilla
61 } // namespace dom
63 using namespace mozilla::dom;
65 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(nsAnonymousContentList, mParent)
67 NS_IMPL_CYCLE_COLLECTING_ADDREF(nsAnonymousContentList)
68 NS_IMPL_CYCLE_COLLECTING_RELEASE(nsAnonymousContentList)
70 NS_INTERFACE_TABLE_HEAD(nsAnonymousContentList)
71 NS_WRAPPERCACHE_INTERFACE_TABLE_ENTRY
72 NS_INTERFACE_TABLE_INHERITED(nsAnonymousContentList, nsINodeList,
73 nsIDOMNodeList)
74 NS_INTERFACE_TABLE_TO_MAP_SEGUE
75 NS_INTERFACE_MAP_ENTRIES_CYCLE_COLLECTION(nsAnonymousContentList)
76 NS_INTERFACE_MAP_ENTRY(nsISupports)
77 NS_INTERFACE_MAP_END
79 NS_IMETHODIMP
80 nsAnonymousContentList::GetLength(uint32_t* aLength)
82 if (!mParent) {
83 *aLength = 0;
84 return NS_OK;
87 uint32_t count = 0;
88 for (nsIContent* child = mParent->GetFirstChild();
89 child;
90 child = child->GetNextSibling()) {
91 if (child->NodeInfo()->Equals(nsGkAtoms::children, kNameSpaceID_XBL)) {
92 XBLChildrenElement* point = static_cast<XBLChildrenElement*>(child);
93 if (point->HasInsertedChildren()) {
94 count += point->InsertedChildrenLength();
96 else {
97 count += point->GetChildCount();
100 else {
101 ++count;
105 *aLength = count;
107 return NS_OK;
110 NS_IMETHODIMP
111 nsAnonymousContentList::Item(uint32_t aIndex, nsIDOMNode** aReturn)
113 nsIContent* item = Item(aIndex);
114 if (!item) {
115 return NS_ERROR_FAILURE;
118 return CallQueryInterface(item, aReturn);
121 nsIContent*
122 nsAnonymousContentList::Item(uint32_t aIndex)
124 if (!mParent) {
125 return nullptr;
128 uint32_t remIndex = aIndex;
129 for (nsIContent* child = mParent->GetFirstChild();
130 child;
131 child = child->GetNextSibling()) {
132 if (child->NodeInfo()->Equals(nsGkAtoms::children, kNameSpaceID_XBL)) {
133 XBLChildrenElement* point = static_cast<XBLChildrenElement*>(child);
134 if (point->HasInsertedChildren()) {
135 if (remIndex < point->InsertedChildrenLength()) {
136 return point->InsertedChild(remIndex);
138 remIndex -= point->InsertedChildrenLength();
140 else {
141 if (remIndex < point->GetChildCount()) {
142 return point->GetChildAt(remIndex);
144 remIndex -= point->GetChildCount();
147 else {
148 if (remIndex == 0) {
149 return child;
151 --remIndex;
155 return nullptr;
158 int32_t
159 nsAnonymousContentList::IndexOf(nsIContent* aContent)
161 NS_ASSERTION(!aContent->NodeInfo()->Equals(nsGkAtoms::children,
162 kNameSpaceID_XBL),
163 "Looking for insertion point");
165 if (!mParent) {
166 return -1;
169 int32_t index = 0;
170 for (nsIContent* child = mParent->GetFirstChild();
171 child;
172 child = child->GetNextSibling()) {
173 if (child->NodeInfo()->Equals(nsGkAtoms::children, kNameSpaceID_XBL)) {
174 XBLChildrenElement* point = static_cast<XBLChildrenElement*>(child);
175 if (point->HasInsertedChildren()) {
176 int32_t insIndex = point->IndexOfInsertedChild(aContent);
177 if (insIndex != -1) {
178 return index + insIndex;
180 index += point->InsertedChildrenLength();
182 else {
183 int32_t insIndex = point->IndexOf(aContent);
184 if (insIndex != -1) {
185 return index + insIndex;
187 index += point->GetChildCount();
190 else {
191 if (child == aContent) {
192 return index;
194 ++index;
198 return -1;
201 JSObject*
202 nsAnonymousContentList::WrapObject(JSContext *cx)
204 return mozilla::dom::NodeListBinding::Wrap(cx, this);