The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

#!/usr/bin/perl -w
use strict; use warnings; use lib 't';
our $tests;
BEGIN { ++$INC{'tests.pm'} }
sub tests'VERSION { $tests += pop };
plan tests => $tests;
use utf8;
use Scalar::Util 'weaken';
#use Devel::Cycle;
#use Scalar::Util 'isweak';
# -------------------------#
use tests 9; # Make sure the dust cart comes.
my $doc = new HTML::DOM;
$doc->write('<title>A</title><body>hole<div>bunch<i>o’</i>stuff</div>');
$doc->close;
weaken $doc;
is $doc, undef, 'poof';
$doc = new HTML::DOM;
$doc->write('stuff');
$doc->open;
weaken $doc;
is $doc, undef, 'poof after open';
$doc = new HTML::DOM;
$doc->write('<table></table>');
$doc->close;
(my $table = $doc->getElementsByTagName('table')->[0])->caption(
$doc->createElement('caption')
);
weaken $table;
undef $doc;
is $table, undef, 'poof after unshift_content (implied by table->caption)';
$doc = new HTML::DOM;
$doc->write('<body>stuff');
$doc->close;
my $body = $doc->body;
weaken $body;
undef $doc;
is $body, undef,
'poof after splice_content (text nodes are added that way)';
$doc = new HTML::DOM;
$doc->write(" ");
$doc->close;
{
my $copy = $doc;
weaken $doc;
undef $copy;
is $doc, undef, 'poof after $doc->write(" "); $doc->close';
}
$doc = new HTML::DOM;
{
my $elem = $doc->createElement("body");
$elem->setAttribute("onload","foo");
my $a = $elem->getAttributeNode('onload');
scalar $a->childNodes; # autovivifies the text node;
my $a_copy = $a;
weaken $a;
undef $a_copy; undef $elem;
is $a, undef, 'poof after $attr->childNodes';
}
{
my $elem = $doc->createElement("body");
$elem->setAttribute("onload","foo");
my $t = $doc->createTextNode('yoo');
my $a = $elem->getAttributeNode('onload');
$a->replaceChild($t, $a->firstChild);
my $a_copy = $a;
weaken $a;
undef $a_copy, undef $elem;
is $a, undef, 'poof after $attr->childNodes';
}
{
my $node = $doc->createElement("body");
$node->innerHTML("<foo><bar>baz</bar></foo>");
my $clone = $node->cloneNode("deeep");
my $other_ref = $clone;
weaken $clone;
undef $other_ref;
is $clone, undef, 'pooof! on a deep clone';
}
{
my $node = $doc->createElement("body");
$node->innerHTML("eioiu;");
$node->replaceChild($doc->createTextNode('Ooe'),$node->firstChild);
my $other_ref = $node;
weaken $node;
undef $other_ref;
is $node, undef, 'poof after replaceChild';
}
__END__
Copy and paste this stuff for debugging:
find_cycle $doc;
diag 'isweak: ',isweak ${$doc->defaultView};
diag 'isweak: ',isweak $doc->documentElement->{_parent};