package Mozilla::Mechanize::Link; use strict; use warnings; # $Id: Link.pm,v 1.3 2005/10/06 18:25:18 slanning Exp $ =head1 NAME Mozilla::Mechanize::Link Mozilla::Mechanize::Link - Mimic WWW::Mechanize::Link =head1 SYNOPSIS sorry, read the source for now =head1 DESCRIPTION The C object is a thin wrapper around HTML link elements. =head1 METHODS =head2 Mozilla::Mechanize::Link->new($link_node, $moz) Initialize a new object. $link_node is a L (or a node that can be QueryInterfaced to one); specifically, it must be an HTMLAnchorElement, an HTMLFrameElement, an HTMLIFrameElement, or an HTMLAreaElement. $moz is a L object. (This latter is a hack for `click', so that new pages can load in the browser. The GUI has to be able to enter its main loop. If you don't plan to use that method, you don't have to pass it in.) B: Although it supports the same methods as L, it is a completely different implementation. =cut sub new { my $class = shift; my $node = shift; my $moz = shift; my $iid = 0; # turn the Node into the appropriate HTMLElement if (lc $node->GetNodeName eq 'a') { $iid = Mozilla::DOM::HTMLAnchorElement->GetIID; } elsif (lc $node->GetNodeName eq 'frame') { $iid = Mozilla::DOM::HTMLFrameElement->GetIID; } elsif (lc $node->GetNodeName eq 'iframe') { $iid = Mozilla::DOM::HTMLIFrameElement->GetIID; } elsif (lc $node->GetNodeName eq 'area') { $iid = Mozilla::DOM::HTMLAreaElement->GetIID; } else { my $errstr = "Invalid Link node"; defined($moz) ? $moz->die($errstr) : die($errstr); } my $link = $node->QueryInterface($iid); my $self = { link => $link }; $self->{moz} = $moz if defined $moz; bless($self, $class); } =head2 $link->url Returns the url from the link. =cut sub url { my $self = shift; my $link = $self->{link}; if ($link->GetTagName =~ /^i?frame$/i) { return $link->GetSrc; } else { return $link->GetHref; } } =head2 $link->text Text of the link (innerHTML, so includes any HTML markup). =cut sub text { my $self = shift; my $link = $self->{link}; my $iid = Mozilla::DOM::NSHTMLElement->GetIID; my $nshtmlelem = $link->QueryInterface($iid); return $nshtmlelem->GetInnerHTML; } =head2 $link->name NAME attribute from the source tag, if any. =cut sub name { my $self = shift; my $link = $self->{link}; return $link->HasAttribute('name') ? $link->GetAttribute('name') : ''; } =head2 $link->tag Tag name ("A", "AREA", "FRAME" or "IFRAME"). =cut sub tag { my $self = shift; my $link = $self->{link}; return $link->GetTagName; } =head2 $link->click Click the link (does this fire onClick?). =cut sub click { my $self = shift; my $link = $self->{link}; # XXX: maybe this could be done better # Create a click event my $doc = $link->GetOwnerDocument; my $deiid = Mozilla::DOM::DocumentEvent->GetIID(); my $docevent = $doc->QueryInterface($deiid); my $event = $docevent->CreateEvent('MouseEvents'); $event->InitEvent('click', 1, 1); # Dispatch the click event my $etiid = Mozilla::DOM::EventTarget->GetIID(); my $target = $link->QueryInterface($etiid); $target->DispatchEvent($event); # XXX: if they didn't pass $moz to `new', they're stuck.. my $moz = $self->{moz} || return; $moz->_wait_while_busy(); } 1; __END__ =head1 COPYRIGHT AND LICENSE Copyright 2005,2009 Scott Lanning . All rights reserved. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. =cut