#!perl -w
use strict;
use Test::More;
use WWW::Mechanize::FireFox;
my $mech = eval { WWW::Mechanize::FireFox->new(
autodie => 0,
#log => [qw[debug]]
)};
if (! $mech) {
my $err = $@;
plan skip_all => "Couldn't connect to MozRepl: $@";
exit
} else {
plan tests => 2;
};
isa_ok $mech, 'WWW::Mechanize::FireFox';
my $browser = $mech->tab->{linkedBrowser};
$mech->get_local('49-mech-get-file.html');
sub eval_in_page_with_redefined_alert {
my ($self,$str,$redefined_alert) = @_;
my $eval_in_sandbox = $self->repl->declare(<<'JS');
function (w,str,myalert) {
var unsafeWin = w.wrappedJSObject;
var safeWin = XPCNativeWrapper(unsafeWin);
var sandbox = Components.utils.Sandbox(safeWin);
sandbox.window = safeWin;
sandbox.window.alert = myalert; // <--
sandbox.alert = myalert; // <--
sandbox.document = sandbox.window.document;
sandbox.__proto__ = unsafeWin;
var res = Components.utils.evalInSandbox(str, sandbox);
return [res,typeof(res)];
};
JS
my $window = $self->tab->{linkedBrowser}->{contentWindow};
my $uri = $self->uri;
return @{ $eval_in_sandbox->($window, $str, $redefined_alert ) };
};
my @alerts;
eval_in_page_with_redefined_alert($mech,"window.alert('Hello')", sub {
+ my @params = @_; push @alerts, \@params });
$mech->repl->poll;
is_deeply \@alerts, [['Hello']], "We can capture alert() boxes if we w
+ant to";
Update: With MozRepl::RemoteObject v0.08 and WWW::Mechanize::FireFox v0.09, you can now specify additional variables for the environment in which things get evaluated. |