diff --git a/Lib/test/test_pulldom.py b/Lib/test/test_pulldom.py index 3c8ed251acaa4d..0a53e4b2de0dbc 100644 --- a/Lib/test/test_pulldom.py +++ b/Lib/test/test_pulldom.py @@ -128,8 +128,13 @@ def test_expandItem(self): next(items) # Skip character data evt, node = next(items) self.assertEqual(node.tagName, "html") - with self.assertRaises(StopIteration): - next(items) + # Consume any remaining events (e.g. END_ELEMENT, END_DOCUMENT) + # that are now correctly delivered after the fix for parser.close() + remaining = list(items) + self.assertTrue( + any(evt == pulldom.END_DOCUMENT for evt, _ in remaining), + "Expected END_DOCUMENT in remaining events" + ) items.clear() self.assertIsNone(items.parser) self.assertIsNone(items.stream) @@ -144,9 +149,8 @@ def test_comment(self): else: self.fail("No comment was encountered") - @unittest.expectedFailure def test_end_document(self): - """PullDOM does not receive "end-document" events.""" + """PullDOM receives end-document events.""" items = pulldom.parseString(SMALL_SAMPLE) # Read all of the nodes up to and including : for evt, node in items: diff --git a/Lib/xml/dom/pulldom.py b/Lib/xml/dom/pulldom.py index 913141cd7ef3ce..a4607150213c13 100644 --- a/Lib/xml/dom/pulldom.py +++ b/Lib/xml/dom/pulldom.py @@ -249,6 +249,8 @@ def getEvent(self): buf = self.stream.read(self.bufsize) if not buf: self.parser.close() + if self.pulldom.firstEvent[1]: + break return None self.parser.feed(buf) rc = self.pulldom.firstEvent[1][0] diff --git a/Misc/NEWS.d/next/Library/2026-02-26-15-36-50.gh-issue-145259._SeM5N.rst b/Misc/NEWS.d/next/Library/2026-02-26-15-36-50.gh-issue-145259._SeM5N.rst new file mode 100644 index 00000000000000..1f12f57de75fa7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-02-26-15-36-50.gh-issue-145259._SeM5N.rst @@ -0,0 +1,4 @@ +Fix :class:`xml.dom.pulldom.DOMEventStream` silently dropping SAX events +produced by ``parser.close()`` at end-of-stream. When ``bufsize`` caused the +final tag to be split across reads, ``END_ELEMENT`` and other trailing events +were lost.