Line data Source code
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 : /*
8 : * A class for keeping track of prefix-to-namespace-id mappings
9 : */
10 :
11 : #include "nsXMLNameSpaceMap.h"
12 : #include "nsContentUtils.h"
13 : #include "nsGkAtoms.h"
14 : #include "nsNameSpaceManager.h"
15 : #include "mozilla/dom/NameSpaceConstants.h"
16 :
17 : template <>
18 : class nsDefaultComparator <nsNameSpaceEntry, nsIAtom*> {
19 : public:
20 6715 : bool Equals(const nsNameSpaceEntry& aEntry, nsIAtom* const& aPrefix) const {
21 6715 : return aEntry.prefix == aPrefix;
22 : }
23 : };
24 :
25 : template <>
26 : class nsDefaultComparator <nsNameSpaceEntry, int32_t> {
27 : public:
28 0 : bool Equals(const nsNameSpaceEntry& aEntry, const int32_t& aNameSpace) const {
29 0 : return aEntry.nameSpaceID == aNameSpace;
30 : }
31 : };
32 :
33 :
34 : /* static */ nsXMLNameSpaceMap*
35 39 : nsXMLNameSpaceMap::Create(bool aForXML)
36 : {
37 39 : nsXMLNameSpaceMap *map = new nsXMLNameSpaceMap();
38 39 : NS_ENSURE_TRUE(map, nullptr);
39 :
40 39 : if (aForXML) {
41 0 : nsresult rv1 = map->AddPrefix(nsGkAtoms::xmlns,
42 0 : kNameSpaceID_XMLNS);
43 0 : nsresult rv2 = map->AddPrefix(nsGkAtoms::xml, kNameSpaceID_XML);
44 :
45 0 : if (NS_FAILED(rv1) || NS_FAILED(rv2)) {
46 0 : delete map;
47 0 : map = nullptr;
48 : }
49 : }
50 :
51 39 : return map;
52 : }
53 :
54 39 : nsXMLNameSpaceMap::nsXMLNameSpaceMap()
55 39 : : mNameSpaces(4)
56 : {
57 39 : }
58 :
59 : nsresult
60 103 : nsXMLNameSpaceMap::AddPrefix(nsIAtom *aPrefix, int32_t aNameSpaceID)
61 : {
62 103 : if (!mNameSpaces.Contains(aPrefix) && !mNameSpaces.AppendElement(aPrefix)) {
63 0 : return NS_ERROR_OUT_OF_MEMORY;
64 : }
65 103 : mNameSpaces[mNameSpaces.IndexOf(aPrefix)].nameSpaceID = aNameSpaceID;
66 103 : return NS_OK;
67 : }
68 :
69 : nsresult
70 64 : nsXMLNameSpaceMap::AddPrefix(nsIAtom *aPrefix, nsString &aURI)
71 : {
72 : int32_t id;
73 64 : nsresult rv = nsContentUtils::NameSpaceManager()->RegisterNameSpace(aURI,
74 64 : id);
75 :
76 64 : NS_ENSURE_SUCCESS(rv, rv);
77 :
78 64 : return AddPrefix(aPrefix, id);
79 : }
80 :
81 : int32_t
82 6431 : nsXMLNameSpaceMap::FindNameSpaceID(nsIAtom *aPrefix) const
83 : {
84 6431 : size_t index = mNameSpaces.IndexOf(aPrefix);
85 6431 : if (index != mNameSpaces.NoIndex) {
86 6431 : return mNameSpaces[index].nameSpaceID;
87 : }
88 :
89 : // The default mapping for no prefix is no namespace. If a non-null prefix
90 : // was specified and we didn't find it, we return an error.
91 :
92 0 : return aPrefix ? kNameSpaceID_Unknown : kNameSpaceID_None;
93 : }
94 :
95 : nsIAtom*
96 0 : nsXMLNameSpaceMap::FindPrefix(int32_t aNameSpaceID) const
97 : {
98 0 : size_t index = mNameSpaces.IndexOf(aNameSpaceID);
99 0 : if (index != mNameSpaces.NoIndex) {
100 0 : return mNameSpaces[index].prefix;
101 : }
102 :
103 0 : return nullptr;
104 : }
105 :
106 : void
107 0 : nsXMLNameSpaceMap::Clear()
108 : {
109 0 : mNameSpaces.Clear();
110 9 : }
|