in reply to Re^4: fetch HTML page, do javascript, read output from alert/msgbox
in thread fetch HTML page, do javascript, read output from alert/msgbox

I think you still have to pass in and define myalert as a (Perl) subroutine, and you shouldn't edit FireFox.pm but declare your own subroutine for that. I haven't tried capturing alert() myself, as I haven't needed it yet.

Replies are listed 'Best First'.
Re^6: fetch HTML page, do javascript, read output from alert/msgbox
by TheFlyingCorpse (Novice) on Nov 11, 2009 at 14:37 UTC

    How would I go about and do that?

    I've tried putting your code into my script and making the eval do the javascript:Install() part of it, without success.

    How should I declare a subroutine for myalert?
      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->("$uri",$window,$redefined_alert ) }; };

      and call it as

      eval_in_page_with_redefined_alert($mech,$str, sub { print "Caught aler +t(): @_" });

      If that doesn't work for you, something likely is wrong with my Javascript. You'll then have to look at the Mozilla FireFox Javascript documentation to figure out how things should be done instead.

        MozRepl::RemoteObject: [Exception... "Illegal value" nsresult: "0x800 +70057 (NS_ERROR _ILLEGAL_VALUE)" location: "JS frame :: chrome://mozrepl/content/repl +.js -> file:/// C:/Documents%20and%20Settings/Administrator/Programdata/Mozilla/Firefo +x/Profiles/kaq7 hscq.default/mozrepl.tmp.js :: anonymous :: line 5" data: no] at C:\D +ocuments and Se ttings\Administrator\Skrivebord\PRINTLOOKER\firefox.pl line 40

        I get this error when running this script:

        #Start use WWW::Mechanize::FireFox #URL $url = 'http://host/url/site'; #New instance my $mech = WWW::Mechanize::FireFox->new(); #Exitkode my $EXITCODE = 0; #Get content of URL $mech->get($url); $str = 'javascript:InstallPrinter()'; eval_in_page_with_redefined_alert($mech,$str, sub { print "Caught aler +t(): @_" }); #$eval_in_page=>('javascript:InstallPrinter()'); #$mech->get('javascript:InstallPrinter()'); 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->("$uri",$window,$redefined_alert ) }; };