Skip to content

Commit 2998a55

Browse files
committed
Attribute nodes did not always get their ownerDocument and ownerElement
properly set. This fixes that.
1 parent 6b04ffe commit 2998a55

3 files changed

Lines changed: 41 additions & 4 deletions

File tree

Lib/test/output/test_minidom

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
test_minidom
22
Passed testAAA
3+
Passed setAttribute() sets ownerDocument
4+
Passed setAttribute() sets ownerElement
35
Test Succeeded testAAA
46
Passed assertion: len(Node.allnodes) == 0
57
Passed testAAB
@@ -131,6 +133,12 @@ Test Succeeded testInsertBeforeFragment
131133
Passed assertion: len(Node.allnodes) == 0
132134
Test Succeeded testLegalChildren
133135
Passed assertion: len(Node.allnodes) == 0
136+
Passed NamedNodeMap.__setitem__() sets ownerDocument
137+
Passed NamedNodeMap.__setitem__() sets ownerElement
138+
Passed NamedNodeMap.__setitem__() sets value
139+
Passed NamedNodeMap.__setitem__() sets nodeValue
140+
Test Succeeded testNamedNodeMapSetItem
141+
Passed assertion: len(Node.allnodes) == 0
134142
Passed test NodeList.item()
135143
Test Succeeded testNodeListItem
136144
Passed assertion: len(Node.allnodes) == 0

Lib/test/test_minidom.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,23 @@ def testLegalChildren():
166166
elem.appendChild(text)
167167
dom.unlink()
168168

169+
def testNamedNodeMapSetItem():
170+
dom = Document()
171+
elem = dom.createElement('element')
172+
attrs = elem.attributes
173+
attrs["foo"] = "bar"
174+
a = attrs.item(0)
175+
confirm(a.ownerDocument is dom,
176+
"NamedNodeMap.__setitem__() sets ownerDocument")
177+
confirm(a.ownerElement is elem,
178+
"NamedNodeMap.__setitem__() sets ownerElement")
179+
confirm(a.value == "bar",
180+
"NamedNodeMap.__setitem__() sets value")
181+
confirm(a.nodeValue == "bar",
182+
"NamedNodeMap.__setitem__() sets nodeValue")
183+
elem.unlink()
184+
dom.unlink()
185+
169186
def testNonZero():
170187
dom = parse(tstfile)
171188
confirm(dom)# should not be zero
@@ -188,6 +205,11 @@ def testAAA():
188205
el = dom.documentElement
189206
el.setAttribute("spam", "jam2")
190207
confirm(el.toxml() == '<abc spam="jam2"/>', "testAAA")
208+
a = el.getAttributeNode("spam")
209+
confirm(a.ownerDocument is dom,
210+
"setAttribute() sets ownerDocument")
211+
confirm(a.ownerElement is dom.documentElement,
212+
"setAttribute() sets ownerElement")
191213
dom.unlink()
192214

193215
def testAAB():

Lib/xml/dom/minidom.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -364,9 +364,10 @@ class NamedNodeMap:
364364
attributes as found in an input document.
365365
"""
366366

367-
def __init__(self, attrs, attrsNS):
367+
def __init__(self, attrs, attrsNS, ownerElement):
368368
self._attrs = attrs
369369
self._attrsNS = attrsNS
370+
self._ownerElement = ownerElement
370371

371372
try:
372373
property
@@ -430,6 +431,7 @@ def __setitem__(self, attname, value):
430431
if type(value) in _StringTypes:
431432
node = Attr(attname)
432433
node.value = value
434+
node.ownerDocument = self._ownerElement.ownerDocument
433435
else:
434436
if not isinstance(value, Attr):
435437
raise TypeError, "value must be a string or Attr object"
@@ -445,6 +447,7 @@ def setNamedItem(self, node):
445447
old.unlink()
446448
self._attrs[node.name] = node
447449
self._attrsNS[(node.namespaceURI, node.localName)] = node
450+
node.ownerElement = self._ownerElement
448451
return old
449452

450453
def setNamedItemNS(self, node):
@@ -518,14 +521,18 @@ def getAttributeNS(self, namespaceURI, localName):
518521
def setAttribute(self, attname, value):
519522
attr = Attr(attname)
520523
# for performance
521-
attr.__dict__["value"] = attr.__dict__["nodeValue"] = value
524+
d = attr.__dict__
525+
d["value"] = d["nodeValue"] = value
526+
d["ownerDocument"] = self.ownerDocument
522527
self.setAttributeNode(attr)
523528

524529
def setAttributeNS(self, namespaceURI, qualifiedName, value):
525530
prefix, localname = _nssplit(qualifiedName)
526531
# for performance
527532
attr = Attr(qualifiedName, namespaceURI, localname, prefix)
528-
attr.__dict__["value"] = attr.__dict__["nodeValue"] = value
533+
d = attr.__dict__
534+
d["value"] = d["nodeValue"] = value
535+
d["ownerDocument"] = self.ownerDocument
529536
self.setAttributeNode(attr)
530537

531538
def getAttributeNode(self, attrname):
@@ -608,7 +615,7 @@ def writexml(self, writer, indent="", addindent="", newl=""):
608615
writer.write("/>%s"%(newl))
609616

610617
def _get_attributes(self):
611-
return AttributeList(self._attrs, self._attrsNS)
618+
return NamedNodeMap(self._attrs, self._attrsNS, self)
612619

613620
try:
614621
property

0 commit comments

Comments
 (0)