The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w
use strict;
use Test::More;
use WWW::Mechanize::Firefox;

=head1 NAME

rt84418 - testcase for Ticket RT84418

=head1 DESCRIPTION

The tab created by WWW::Mechanize::Firefox does not
get automatically closed when using more than one open
window, and creating that tab in the second window.

=cut

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 => 6;
};

isa_ok $mech, 'WWW::Mechanize::Firefox';

sub open_windows {
    my $windowEnum= $mech->repl->expr(<<'JS');
    Components.classes["@mozilla.org/appshell/window-mediator;1"]
      .getService(Components.interfaces.nsIWindowMediator)
      .getEnumerator("navigator:browser")
JS

    my $openWindows;
    $openWindows++
        while $windowEnum->hasMoreElements and $windowEnum->getNext();
    $openWindows
};

my $atStart= open_windows;
my $first= $mech->repl->expr('window');
{
    # First case, manually destroy the tab:

    # Create second window
    my $second= $first->open;
    
    my $count= open_windows;
    is $count, $atStart+1, "We opened a new window";
    
    # The second window gets the focus

    # Create tab (in second window)
    my $other_mech= WWW::Mechanize::Firefox->new(
        tab => 'current',
    );
    $other_mech->update_html('Tab in second window');
    my $magic= 'Second tab - ' . $$;
    $other_mech->tab->{title} = $magic;

    # Focus first window
    $mech->repl->expr('window.focus()');

    my $lives= eval {
        #$other_mech->application()->closeTab( $other_mech->tab() );
        1;
    };
    ok $lives, "We survived explicitly closing the second tab"
        or diag($@);

    my $tabs= grep { $magic eq $_->{title} } $other_mech->application->openTabs();
    is $tabs, 0, "The second tab was closed";
    # Try to clean up
    eval {
        $second->close();
    };
}

{
    # Now, let the second tab fall off the scope:

    # Create second window
    my $second= $mech->repl->expr('window.open()');
    # The second window gets the focus

    {
        # Create tab (in second window)
        my $other_mech= WWW::Mechanize::Firefox->new(
            #tab => 'current',
            #autoclose => 1,
        );
        $other_mech->update_html('Tab in second window');
        sleep 1;

        # Focus first window
        $first->focus;
        sleep 1;

        # Now, close the tab
        my $lives= eval {
            undef $other_mech;
            1;
        };
        ok $lives, "We survived implicitly closing the second tab";
    };
    $second->close();
    
    my $windowsNow= open_windows;
    is $windowsNow, $atStart, "We closed the newly opened window";
}
undef $mech;