gh-142754: Ensure that Element & Attr instances have the ownerDocument attribute (#142794)

Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>
This commit is contained in:
Petr Viktorin 2025-12-16 13:20:48 +01:00 committed by GitHub
parent c10ec48bb9
commit 1cc7551b3f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 15 additions and 1 deletions

View file

@ -9,7 +9,7 @@
import xml.dom.minidom
from xml.dom.minidom import parse, Attr, Node, Document, parseString
from xml.dom.minidom import parse, Attr, Node, Document, Element, parseString
from xml.dom.minidom import getDOMImplementation
from xml.parsers.expat import ExpatError
@ -191,6 +191,14 @@ def testAppendChildNoQuadraticComplexity(self):
# This example used to take at least 30 seconds.
self.assertLess(end - start, 1)
def testSetAttributeNodeWithoutOwnerDocument(self):
# regression test for gh-142754
elem = Element("test")
attr = Attr("id")
attr.value = "test-id"
elem.setAttributeNode(attr)
self.assertEqual(elem.getAttribute("id"), "test-id")
def testAppendChildFragment(self):
dom, orig, c1, c2, c3, frag = self._create_fragment_test_nodes()
dom.documentElement.appendChild(frag)

View file

@ -364,6 +364,7 @@ class Attr(Node):
def __init__(self, qName, namespaceURI=EMPTY_NAMESPACE, localName=None,
prefix=None):
self.ownerElement = None
self.ownerDocument = None
self._name = qName
self.namespaceURI = namespaceURI
self._prefix = prefix
@ -689,6 +690,7 @@ class Element(Node):
def __init__(self, tagName, namespaceURI=EMPTY_NAMESPACE, prefix=None,
localName=None):
self.ownerDocument = None
self.parentNode = None
self.tagName = self.nodeName = tagName
self.prefix = prefix

View file

@ -0,0 +1,4 @@
Add the *ownerDocument* attribute to :mod:`xml.dom.minidom` elements and attributes
created by directly instantiating the ``Element`` or ``Attr`` class. Note that
this way of creating nodes is not supported; creator functions like
:py:meth:`xml.dom.Document.documentElement` should be used instead.