1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #include "txNamespaceMap.h"
8 #include "txXPathNode.h"
10 txNamespaceMap::txNamespaceMap()
14 txNamespaceMap::txNamespaceMap(const txNamespaceMap
& aOther
)
15 : mPrefixes(aOther
.mPrefixes
)
17 mNamespaces
= aOther
.mNamespaces
; //bah! I want a copy-constructor!
21 txNamespaceMap::mapNamespace(nsIAtom
* aPrefix
, const nsAString
& aNamespaceURI
)
23 nsIAtom
* prefix
= aPrefix
== nsGkAtoms::_empty
? nullptr : aPrefix
;
26 if (prefix
&& aNamespaceURI
.IsEmpty()) {
28 int32_t index
= mPrefixes
.IndexOf(prefix
);
30 mPrefixes
.RemoveObjectAt(index
);
31 mNamespaces
.RemoveElementAt(index
);
37 if (aNamespaceURI
.IsEmpty()) {
38 // Set default to empty namespace
39 nsId
= kNameSpaceID_None
;
42 nsId
= txNamespaceManager::getNamespaceID(aNamespaceURI
);
43 NS_ENSURE_FALSE(nsId
== kNameSpaceID_Unknown
, NS_ERROR_FAILURE
);
46 // Check if the mapping already exists
47 int32_t index
= mPrefixes
.IndexOf(prefix
);
49 mNamespaces
.ElementAt(index
) = nsId
;
55 if (!mPrefixes
.AppendObject(prefix
)) {
56 return NS_ERROR_OUT_OF_MEMORY
;
59 if (mNamespaces
.AppendElement(nsId
) == nullptr) {
60 mPrefixes
.RemoveObjectAt(mPrefixes
.Count() - 1);
62 return NS_ERROR_OUT_OF_MEMORY
;
69 txNamespaceMap::lookupNamespace(nsIAtom
* aPrefix
)
71 if (aPrefix
== nsGkAtoms::xml
) {
72 return kNameSpaceID_XML
;
75 nsIAtom
* prefix
= aPrefix
== nsGkAtoms::_empty
? 0 : aPrefix
;
77 int32_t index
= mPrefixes
.IndexOf(prefix
);
79 return mNamespaces
.SafeElementAt(index
, kNameSpaceID_Unknown
);
83 return kNameSpaceID_None
;
86 return kNameSpaceID_Unknown
;
90 txNamespaceMap::lookupNamespaceWithDefault(const nsAString
& aPrefix
)
92 nsCOMPtr
<nsIAtom
> prefix
= do_GetAtom(aPrefix
);
93 if (prefix
!= nsGkAtoms::_poundDefault
) {
94 return lookupNamespace(prefix
);
97 return lookupNamespace(nullptr);