#!perl -w use strict; use WWW::Mechanize::Firefox; use Time::HiRes; use Getopt::Long; use Pod::Usage; GetOptions( 'mozrepl|m:s' => \my $mozrepl, 'follow|f' => \my $install_listener, 'clear|c' => \my $clear, 'number|n:i' => \my $lines, ) or pod2usage(2); $lines ||= 5; my $mech = WWW::Mechanize::Firefox->new( #log => ['debug'], mozrepl => $mozrepl, ); sub install_listener { warn "Creating logListener"; my $logListener = $mech->repl->declare(<<'JS'); function(callback) { return { observe: callback, QueryInterface: function (iid) { if (!iid.equals(Components.interfaces.nsIConsoleListener) && !iid.equals(Components.interfaces.nsISupports)) { throw Components.results.NS_ERROR_NO_INTERFACE; } return this; }, }; } JS warn "Creating registerListener"; my $registerListener = $mech->repl->declare(<<'JS'); function (listener) { var aConsoleService = Components.classes["@mozilla.org/consoleservice;1"] .getService(Components.interfaces.nsIConsoleService); aConsoleService.registerListener(listener); }; JS my $listener = $logListener->(sub {output_message($_[0])}); $registerListener->($listener); }; sub output_message { print "$_[0]->{message}\n"; }; my $console = $mech->js_console; $mech->clear_js_errors if ($clear); output_message $_ for reverse (grep {defined} ($mech->js_errors)[-$lines..0]); if ($install_listener) { my $l = install_listener; while (1) { $mech->repl->poll; sleep 0.25; }; }; =head1 NAME js-console.pl - send STDIN to the Javascript Console =head1 SYNOPSIS tail-console.pl -f Options: --clear Clear console before receiving new messages --follow Read more messages as they are being added --mozrepl connection string to Firefox =head1 OPTIONS =over 4 =item B<--clear> Clear the console before sending the text. =item B<--follow> Keep watching the console and output text as it gets added. =item B<--mozrepl> Connection information for the mozrepl instance to use. =back =head1 DESCRIPTION This program reads messages from the Error Console and sends them to STDOUT. =head1 SEE ALSO L L - the underlying Console Service that also shows how to listen to events getting added. =cut