https://github.com/python/cpython/commit/1cc7551b3f9f71efbc88d96dce90f82de98b2454
commit: 1cc7551b3f9f71efbc88d96dce90f82de98b2454
branch: main
author: Petr Viktorin <[email protected]>
committer: hugovk <[email protected]>
date: 2025-12-16T12:20:48Z
summary:

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

Co-authored-by: Hugo van Kemenade <[email protected]>

files:
A Misc/NEWS.d/next/Library/2025-12-16-11-55-55.gh-issue-142754.xuCrt3.rst
M Lib/test/test_minidom.py
M Lib/xml/dom/minidom.py

diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py
index 4fa5a4e6768b25..7717a98583f741 100644
--- a/Lib/test/test_minidom.py
+++ b/Lib/test/test_minidom.py
@@ -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)
diff --git a/Lib/xml/dom/minidom.py b/Lib/xml/dom/minidom.py
index 0a2ccc00f1857d..16b33b90184dc5 100644
--- a/Lib/xml/dom/minidom.py
+++ b/Lib/xml/dom/minidom.py
@@ -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
diff --git 
a/Misc/NEWS.d/next/Library/2025-12-16-11-55-55.gh-issue-142754.xuCrt3.rst 
b/Misc/NEWS.d/next/Library/2025-12-16-11-55-55.gh-issue-142754.xuCrt3.rst
new file mode 100644
index 00000000000000..d4e158ccb8c9e6
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-12-16-11-55-55.gh-issue-142754.xuCrt3.rst
@@ -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.

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to