#!perl -w
my
$mech
= WWW::Mechanize::Firefox->new(
);
my
$mk_listener
=
$mech
->repl->declare(
<<'JS');
function (myListener,source) {
myListener.source = source;
const STATE_START = Components.interfaces.nsIWebProgressListener.STATE_START;
const STATE_STOP = Components.interfaces.nsIWebProgressListener.STATE_STOP;
var callbacks = ['onStateChange',
'onLocationChange',
"onProgressChange",
"onStatusChange",
"onSecurityChange",
];
for (var h in callbacks) {
var e = callbacks[h];
if (! myListener[e]) {
myListener[e] = function(){}
};
};
myListener.QueryInterface = function(aIID) {
if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
aIID.equals(Components.interfaces.nsISupports))
return this;
throw Components.results.NS_NOINTERFACE;
};
return myListener
}
JS
sub
onStateChange {
my
(
$progress
,
$request
,
$flag
,
$status
) =
@_
;
print
"@_\n"
;
}
sub
onLocationChange {
my
(
$progress
,
$request
,
$uri
) =
@_
;
print
"Location :"
,
$uri
->{spec},
"\n"
;
}
my
$NOTIFY_STATE_DOCUMENT
=
$mech
->repl->expr(
'Components.interfaces.nsIWebProgress.NOTIFY_STATE_DOCUMENT'
);
sub
event_listener {
my
(
$source
,
%handlers
) =
@_
;
my
(
$obj
) =
$mech
->repl->expr(
'new Object'
);
for
my
$key
(
keys
%handlers
) {
$obj
->{
$key
} =
$handlers
{
$key
};
};
my
$lsn
=
$mk_listener
->(
$obj
,
$source
);
$lsn
->__release_action(
'self.source.removeEventListener(self)'
);
$source
->addProgressListener(
$lsn
,
$NOTIFY_STATE_DOCUMENT
);
$lsn
;
};
my
$browser
=
$mech
->repl->expr(
'window.getBrowser()'
);
my
$eventlistener
= event_listener(
$browser
,
onLocationChange
=> \
&onLocationChange
,
);
while
(1) {
$mech
->repl->poll();
sleep
1;
};