# # $Id: HTML.pm,v 0.1 2001/03/31 10:54:03 ram Exp $ # # Copyright (c) 2001, Raphael Manfredi # # You may redistribute only under the terms of the Artistic License, # as specified in the README file that comes with the distribution. # # HISTORY # $Log: HTML.pm,v $ # Revision 0.1 2001/03/31 10:54:03 ram # Baseline for first Alpha release. # # $EndLog$ # use strict; package CGI::Test::Page::HTML; use Carp::Datum; use Getargs::Long; require CGI::Test::Page::Real; use vars qw(@ISA); @ISA = qw(CGI::Test::Page::Real); # # ->make # # Creation routine # sub make { DFEATURE my $f_; my $self = bless {}, shift; $self->_init(@_); return DVAL $self; } # # Attribute access # sub tree { $_[0]->{tree} || $_[0]->_build_tree } sub forms { $_[0]->{forms} || $_[0]->_xtract_forms } sub form_count { $_[0]->_xtract_forms unless exists $_[0]->{form_count}; return $_[0]->{form_count}; } # # ->_build_tree # # Parse HTML content from `raw_content' into an HTML tree. # Only called the first time an access to `tree' is requested. # # Returns constructed tree object. # sub _build_tree { DFEATURE my $f_; my $self = shift; require HTML::TreeBuilder; my $tree = HTML::TreeBuilder->new(); $tree->ignore_unknown(0); # Keep everything, even unknown tags $tree->store_comments(1); # Useful things may hide in "comments" $tree->store_declarations(1); # Store everything that we may test $tree->store_pis(1); # Idem $tree->warn(1); # We want to know if there's a problem $tree->parse($self->raw_content); $tree->eof; return DVAL $self->{tree} = $tree; } # # _xtract_forms # # Extract tags out of the tree, and for each form, build a # CGI::Test::Form object that represents it. # Only called the first time an access to `forms' is requested. # # Side effect: updates the `forms' and `form_count' attributes. # # Returns list ref of objects, in the order they were found. # sub _xtract_forms { DFEATURE my $f_; my $self = shift; my $tree = $self->tree; require CGI::Test::Form; # # The CGI::Test::Form objects we're about to create will refer back to # us, because they are conceptually part of this page. Besides, their # HTML tree is a direct reference into our own tree. # my @forms = $tree->look_down( sub { $_[0]->tag eq "form" } ); @forms = map { CGI::Test::Form->make($_, $self) } @forms; $self->{form_count} = scalar @forms; return DVAL $self->{forms} = \@forms; } # # ->delete # # Break circular references # sub delete { DFEATURE my $f_; my $self = shift; # # The following attributes are "lazy", i.e. calculated on demand. # Therefore, take precautions before de-referencing them. # $self->{tree} = $self->{tree}->delete if ref $self->{tree}; if (ref $self->{forms}) { foreach my $form (@{$self->{forms}}) { $form->delete; } delete $self->{forms}; } $self->SUPER::delete; return DVOID; } # # (DESTROY) # # Dispose of HTML tree properly # sub DESTROY { DFEATURE my $f_; my $self = shift; return DVOID unless ref $self->{tree}; $self->{tree} = $self->{tree}->delete; return DVOID; } 1; =head1 NAME CGI::Test::Page::HTML - A HTML page reply =head1 SYNOPSIS # Inherits from CGI::Test::Page::Real =head1 DESCRIPTION This class represents an HTTP reply containing C data. When testing CGI scripts, this is usually what one gets back. =head1 INTERFACE The interface is the same as the one described in L, with the following addition: =over 4 =item C Returns the root of the HTML tree of the page content, as an HTML::Element node. =back =head1 AUTHOR Raphael Manfredi FRaphael_Manfredi@pobox.comE> =head1 SEE ALSO CGI::Test::Page::Real(3), HTML::Element(3). =cut