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"
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
,
24 NS_ELEMENT_INTERFACE_TABLE_TO_MAP_SEGUE
25 NS_INTERFACE_MAP_END_INHERITING(Element
)
27 NS_IMPL_ELEMENT_CLONE(XBLChildrenElement
)
30 XBLChildrenElement::UnsetAttr(int32_t aNameSpaceID
, nsIAtom
* aAttribute
,
33 if (aAttribute
== nsGkAtoms::includes
&&
34 aNameSpaceID
== kNameSpaceID_None
) {
38 return Element::UnsetAttr(aNameSpaceID
, aAttribute
, aNotify
);
42 XBLChildrenElement::ParseAttribute(int32_t aNamespaceID
,
44 const nsAString
& aValue
,
47 if (aAttribute
== nsGkAtoms::includes
&&
48 aNamespaceID
== kNameSpaceID_None
) {
50 nsCharSeparatedTokenizer
tok(aValue
, '|',
51 nsCharSeparatedTokenizer::SEPARATOR_OPTIONAL
);
52 while (tok
.hasMoreTokens()) {
53 mIncludes
.AppendElement(do_GetAtom(tok
.nextToken()));
60 } // namespace mozilla
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
,
74 NS_INTERFACE_TABLE_TO_MAP_SEGUE
75 NS_INTERFACE_MAP_ENTRIES_CYCLE_COLLECTION(nsAnonymousContentList
)
76 NS_INTERFACE_MAP_ENTRY(nsISupports
)
80 nsAnonymousContentList::GetLength(uint32_t* aLength
)
88 for (nsIContent
* child
= mParent
->GetFirstChild();
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();
97 count
+= point
->GetChildCount();
111 nsAnonymousContentList::Item(uint32_t aIndex
, nsIDOMNode
** aReturn
)
113 nsIContent
* item
= Item(aIndex
);
115 return NS_ERROR_FAILURE
;
118 return CallQueryInterface(item
, aReturn
);
122 nsAnonymousContentList::Item(uint32_t aIndex
)
128 uint32_t remIndex
= aIndex
;
129 for (nsIContent
* child
= mParent
->GetFirstChild();
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();
141 if (remIndex
< point
->GetChildCount()) {
142 return point
->GetChildAt(remIndex
);
144 remIndex
-= point
->GetChildCount();
159 nsAnonymousContentList::IndexOf(nsIContent
* aContent
)
161 NS_ASSERTION(!aContent
->NodeInfo()->Equals(nsGkAtoms::children
,
163 "Looking for insertion point");
170 for (nsIContent
* child
= mParent
->GetFirstChild();
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();
183 int32_t insIndex
= point
->IndexOf(aContent
);
184 if (insIndex
!= -1) {
185 return index
+ insIndex
;
187 index
+= point
->GetChildCount();
191 if (child
== aContent
) {
202 nsAnonymousContentList::WrapObject(JSContext
*cx
)
204 return mozilla::dom::NodeListBinding::Wrap(cx
, this);