Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/base/nsXMLNameSpaceMap.cpp
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
/*
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, nsAtom*> {
19
  public:
20
0
    bool Equals(const nsNameSpaceEntry& aEntry, nsAtom* const& aPrefix) const {
21
0
      return aEntry.prefix == aPrefix;
22
0
    }
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
0
    }
31
};
32
33
34
/* static */ nsXMLNameSpaceMap*
35
nsXMLNameSpaceMap::Create(bool aForXML)
36
0
{
37
0
  nsXMLNameSpaceMap *map = new nsXMLNameSpaceMap();
38
0
  NS_ENSURE_TRUE(map, nullptr);
39
0
40
0
  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
0
45
0
    if (NS_FAILED(rv1) || NS_FAILED(rv2)) {
46
0
      delete map;
47
0
      map = nullptr;
48
0
    }
49
0
  }
50
0
51
0
  return map;
52
0
}
53
54
nsXMLNameSpaceMap::nsXMLNameSpaceMap()
55
  : mNameSpaces(4)
56
0
{
57
0
}
58
59
nsresult
60
nsXMLNameSpaceMap::AddPrefix(nsAtom *aPrefix, int32_t aNameSpaceID)
61
0
{
62
0
  if (!mNameSpaces.Contains(aPrefix) && !mNameSpaces.AppendElement(aPrefix)) {
63
0
    return NS_ERROR_OUT_OF_MEMORY;
64
0
  }
65
0
  mNameSpaces[mNameSpaces.IndexOf(aPrefix)].nameSpaceID = aNameSpaceID;
66
0
  return NS_OK;
67
0
}
68
69
nsresult
70
nsXMLNameSpaceMap::AddPrefix(nsAtom *aPrefix, nsString &aURI)
71
0
{
72
0
  int32_t id;
73
0
  nsresult rv = nsContentUtils::NameSpaceManager()->RegisterNameSpace(aURI,
74
0
                                                                      id);
75
0
76
0
  NS_ENSURE_SUCCESS(rv, rv);
77
0
78
0
  return AddPrefix(aPrefix, id);
79
0
}
80
81
int32_t
82
nsXMLNameSpaceMap::FindNameSpaceID(nsAtom *aPrefix) const
83
0
{
84
0
  size_t index = mNameSpaces.IndexOf(aPrefix);
85
0
  if (index != mNameSpaces.NoIndex) {
86
0
    return mNameSpaces[index].nameSpaceID;
87
0
  }
88
0
89
0
  // The default mapping for no prefix is no namespace.  If a non-null prefix
90
0
  // was specified and we didn't find it, we return an error.
91
0
92
0
  return aPrefix ? kNameSpaceID_Unknown : kNameSpaceID_None;
93
0
}
94
95
nsAtom*
96
nsXMLNameSpaceMap::FindPrefix(int32_t aNameSpaceID) const
97
0
{
98
0
  size_t index = mNameSpaces.IndexOf(aNameSpaceID);
99
0
  if (index != mNameSpaces.NoIndex) {
100
0
    return mNameSpaces[index].prefix;
101
0
  }
102
0
103
0
  return nullptr;
104
0
}
105
106
void
107
nsXMLNameSpaceMap::Clear()
108
0
{
109
0
  mNameSpaces.Clear();
110
0
}