Thanks to visit codestin.com
Credit goes to github.com

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)