Hello again,
it's great if the changed closeTab() works for you. If you also change
the sub ->autoclose_tab() as below, it should all work. I've attached my
test case for the regression tests too. Without the changes, I get 2
failed tests, and with the changes I get 6 passing tests. If you can
reproduce the error before patching and the error goes away with the
changes below, that would be fantastic.
Also thank you very much for the hint of the patched MozRepl. I have
just upgraded to Firefox 20, with the changes from github. It seems
there is a fresh release of the Mozrepl plugin at
https://github.com/bard/mozrepl incorporating these changes.
-max
sub closeTab {
my ($self,$tab,$repl) = @_;
$repl ||= $self->repl;
my $close_tab = $repl->declare(<<'JS');
function(tab) {
if(tab.collapsed) { return };
var be =
Components.classes["@mozilla.org/appshell/window-mediator;1"]
.getService(Components.interfaces.nsIWindowMediator)
.getEnumerator("navigator:browser");
while (be.hasMoreElements()) {
var browserWin = be.getNext();
var tabbrowser = browserWin.gBrowser;
if( tabbrowser ) {
for( var i=0; i< tabbrowser.tabs.length; i++) {
if( tabbrowser.tabs.item( i ) === tab ) {
tabbrowser.removeTab(tab);
break;
};
};
};
};
}
JS
return $close_tab->($tab);
}
sub autoclose_tab {
my ($self,$tab,$close) = @_;
$close = 1
if( 2 == @_ );
my $release = join "\n",
# Find the window our tab lives in
q<if(!self.collapsed){>,
q<var be =
Components.classes["@mozilla.org/appshell/window-mediator;1"]>,
q<.getService(Components.interfaces.nsIWindowMediator)>,
q<.getEnumerator("navigator:browser");>,
q<while (be.hasMoreElements()) {>,
q<var browserWin = be.getNext();>,
q<var tabbrowser = browserWin.gBrowser;>,
q<if( tabbrowser ) {>,
q!for( var i=0; i< tabbrowser.tabs.length; i++) {!,
q<if( tabbrowser.tabs.item( i ) === self ) {>,
q<tabbrowser.removeTab(self);>,
q<break;>,
q<};>,
q<};>,
q<};>,
q<};>,
q<};>,
;
if( $close ) {
$tab->__release_action($release);
} else {
$tab->__release_action('');
};
};
Am 11.04.2013 18:27, schrieb Geunyoung Park via RT:
Show quoted text> Queue: WWW-Mechanize-FireFox
> Ticket <URL:
https://rt.cpan.org/Ticket/Display.html?id=84418 >
>
> Hello,
>
> I'm sorry my reply is late.
>
>
> I modified API40.pm and changed closeTab() as you'd written.
>
> I tested several times with various number of FF windows. (up to five)
> (My FF version is 20.0 and MozRepl extension is a patched version
>
https://github.com/milouse/mozrepl/commit/3504aa5b45f4b438bc0e7ef53019558c4bd8bc1c )
>
>
> This code:
> # close tab explicitly
> $fox->application()->closeTab( $fox->tab() );
> worked very well in every time.
> Every tab was closed correctly. :-)
>
>
> On the other hand,
> undef $fox;
> or, to do nothing and exit(),
> these resulted in the problem as before.
> (sleep() before exit() didn't work)
>
>
> I wish my report to be helpful.
>
> G.Y.Park
>
>
>
> On Wed Apr 10 16:15:33 2013, CORION wrote:
>> Hello again,
>>
>> thanks for finding out how to more easily reproduce the error. I was
>> now
>> able to always reproduce the error. With the following changed
>> subroutine ->closeTab(), I always get a properly closed tab, no matter
>> which window is active at closing time:
>>
>> sub closeTab {
>> my ($self,$tab,$repl) = @_;
>> $repl ||= $self->repl;
>> my $close_tab = $repl->declare(<<'JS');
>> function(tab) {
>> if(tab.collapsed) { return };
>> var be =
>> Components.classes["@mozilla.org/appshell/window-mediator;1"]
>> .getService(Components.interfaces.nsIWindowMediator)
>> .getEnumerator("navigator:browser");
>> while (be.hasMoreElements()) {
>> var browserWin = be.getNext();
>> var tabbrowser = browserWin.gBrowser;
>> if( tabbrowser ) {
>> for( var i=0; i< tabbrowser.tabs.length; i++) {
>> if( tabbrowser.tabs.item( i ) === tab ) {
>> tabbrowser.removeTab(tab);
>> break;
>> };
>> };
>> };
>> };
>> }
>> JS
>> return $close_tab->($tab);
>> }
>>
>> The changed version works for me on Firefox 20 and I'm currently
>> running
>> the test suite for the other browser versions.
>>
>> Can you please test whether this change also works for your cases? If
>> so, I will release a new version.
>>
>> -max
>>
>>
>> Am 09.04.2013 08:34, schrieb Geunyoung Park via RT:
>>> Queue: WWW-Mechanize-FireFox
>>> Ticket <URL:
https://rt.cpan.org/Ticket/Display.html?id=84418 >
>>>
>>> Hello,
>>>
>>> Thank you for your reply.
>>>
>>> I tried
>>> undef $fox;
>>> but it didn't work.
>>>
>>> I inserted sleep() before and after undef statement, but it also
>>> didn't work.
>>>
>>>
>>> Finally, I tried such code:
>>>
>>> # close tab explicitly
>>> $fox->application()->closeTab( $fox->tab() );
>>>
>>> This code worked well with one window (or, running in first window
>> of two)
>>> But when the script runs in the second window, that line resulted in
>> an
>>> error:
>>>
>>> MozRepl::RemoteObject: NS_ERROR_FAILURE: Component returned failure
>> code: 0x80004005 (NS_ERROR_FAILURE)
>> [nsIWebProgress.removeProgressListener] at
>> D:/strawberry/perl/site/lib/Firefox/Application/API40.pm line 159
>>>
>>>
>>>
>>>
>>> G.Y.Park
>>>
>>>
>>>
>>> On Mon Apr 08 13:01:57 2013, CORION wrote:
>>>> Hello Geunyoung Park!
>>>>
>>>> Actually, WWW::Mechanize::Firefox can remove the tab even from a
>>>> different window, since about v 0.50 or so. The problem is that at
>> the
>>>> end of the script, Perl has already shut down the socket connection
>> to
>>>> Firefox, and so Perl cannot talk to Firefox anymore.
>>>>
>>>> The workaround is to explicitly release Firefox before your program
>>>> ends:
>>>>
>>>> perl -Ilib -MWWW::Mechanize::Firefox::DSL -e "sleep 5; undef
>> $mech"
>>>>
>>>> ... or in your test program:
>>>>
>>>> use WWW::Mechanize::Firefox;
>>>> my $fox= WWW::Mechanize::Firefox->new();
>>>> $fox->get('
http://google.com');
>>>> undef $fox;
>>>> exit;
>>>>
>>>> -max
>>>>
>>>> Am 04.04.2013 07:29, schrieb Geunyoung Park via RT:
>>>>> Queue: WWW-Mechanize-FireFox
>>>>> Ticket <URL:
https://rt.cpan.org/Ticket/Display.html?id=84418 >
>>>>>
>>>>> I forgot reporting what my script was.
>>>>>
>>>>> It was just a very simple script:
>>>>>
>>>>> use WWW::Mechanize::Firefox;
>>>>> my $fox = WWW::Mechanize::Firefox->new();
>>>>> $fox->get('
http://google.com');
>>>>> exit;
>>>>>
>>>>>
>>>>> G.Y.Park
>>>>>
>>>>>
>>>>>
>>>>> On Thu Apr 04 01:26:47 2013, GYPARK wrote:
>>>>>> Hello,
>>>>>>
>>>>>> At first, thank you for your great module.
>>>>>> It is very helpful to me and I really love it.
>>>>>>
>>>>>> I found a problem that tab doesn't close automatically
>>>>>> when the tab has opened in...other than the first window.
>>>>>>
>>>>>> I'm not good at English so I made a illustration and attached it.
>>>>>> I wish it would be helpful for you in reproducing the problem.
>>>>>> Firefox in my screenshot is Korean version but it would not
>> matter,
>>>> maybe.
>>>>>>
>>>>>>
>>>>>> And, I have no idea whether this is an issue of this module or of
>>>> MozRepl.
>>>>>> If it is case of the latter, I'm sorry for bothering you.
>>>>>>
>>>>>> Would you please check it?
>>>>>>
>>>>>>
>>>>>> Thank you.
>>>>>> G.Y.Park from South Korea
>>>>>
>>>>>
>>>>>
>>>>
>>>
>>>
>>>
>>
>
>
>