#!/usr/bin/perl -w use strict; use WWW::Mechanize::Firefox; my $www=WWW::Mechanize::Firefox->new( #stack_depth=>5, autodie=>1, timeout=>60, #tab=>qr/$tabregex/, bufsize => 50_000_000, ); #$www->events(['load','onload','loaded','DOMFrameContentLoaded','DOMContentLoaded','error','abort','stop']); print time." get #1\n"; $www->get('http://cmcc.deviantart.com/'); print time." after get #1\n"; print time." content #1\n"; my $con=$www->content(); print time." after content #1\n"; print time." get #2\n"; $www->get('http://cmcc.deviantart.com/#/d1a8l1t'); print time." after get #2\n"; print time." content #2\n"; $con=$www->content(); print time." after content #2\n"; #### 1291386396 get #1 1291386398 after get #1 1291386398 content #1 1291386398 after content #1 1291386398 get #2 1291386399 after get #2 1291386399 content #2 1291386399 after content #2 #### sub _addEventListener { my ($self,$browser,$events) = @_; $events ||= $self->events; $events = [$events] unless ref $events; # This registers multiple events for a one-shot event my $make_semaphore = $self->repl->declare(<<'JS'); function(browser,events) { var lock = {}; lock.busy = 0; var b = browser; var listeners = []; for( var i = 0; i < events.length; i++) { var evname = events[i]; var callback = (function(listeners,evname){ return function(e) { if (! lock.busy) { lock.busy++; lock.event = evname; lock.js_event = {}; lock.js_event.target = e.originalTarget; lock.js_event.type = e.type; alert("Caught first event " + e.type + " " + e.message); } else { alert("Caught duplicate event " + e.type + " " + e.message); }; for( var j = 0; j < listeners.length; j++) { b.removeEventListener(listeners[j][0],listeners[j][1],true); }; }; })(listeners,evname); listeners.push([evname,callback]); b.addEventListener(evname,callback,true); }; return lock } JS return $make_semaphore->($browser,$events); };