# This example demonstrates the History, Location, and Navigator
# browser objects (Window and Document being two others familiar
# from JavaScript). It also shows Screen, though I don't think
# that's really considered a "browser object".
#
# $CVSHeader: Mozilla-DOM/examples/BrowserObjects.pm,v 1.3 2007-06-06 21:46:56 slanning Exp $
package BrowserObjects;
use strict;
use warnings;
use Cwd 'getcwd';
use Glib qw(TRUE FALSE);
use Gtk2;
use Gtk2::MozEmbed '0.04';
use Mozilla::DOM '0.13'; # for History, Location, Navigator, Screen
use Glib::Object::Subclass Gtk2::Window::;
# Will set these to zero after they're displayed once,
# since their output is always the same.
my $shownavigator = 1;
my $showscreen = 1;
sub INIT_INSTANCE {
my $self = shift;
my $embed = Gtk2::MozEmbed->new();
# This handler dumps information on the browser objects.
$embed->signal_connect(net_stop => \&net_stop_cb);
# This one demonstrates History's `Back' method
# when you double click anywhere.
$embed->signal_connect(dom_mouse_dbl_click => \&dom_mouse_dbl_click_cb);
# An extra feature in this demo is allowing popup windows.
# (This also comes from pumzilla in Gtk2::MozEmbed.)
# Try commenting this out, then clicking on the link;
# nothing will happen.
$embed->signal_connect(new_window => sub {
my ($embed, $chrome) = @_;
my $newwin = BrowserObjects->new();
$newwin->set_default_size(600, 400);
$newwin->show_all();
# As usual, return the embedded widget, not the window
return $newwin->{_embed};
});
$self->add($embed);
my $cwd = getcwd();
$embed->load_url("file://$cwd/index2.html");
$self->{_embed} = $embed;
}
sub net_stop_cb {
my $embed = shift;
my $browser = $embed->get_nsIWebBrowser;
my $window = $browser->GetContentDOMWindow;
my $iid = Mozilla::DOM::WindowInternal->GetIID;
my $windowinternal = $window->QueryInterface($iid);
show_location($windowinternal);
show_history($windowinternal);
show_navigator($windowinternal) if $shownavigator;
show_screen($windowinternal) if $showscreen;
print "=========\n";
}
sub dom_mouse_dbl_click_cb {
my ($embed, $event) = @_;
my $browser = $embed->get_nsIWebBrowser;
my $window = $browser->GetContentDOMWindow;
my $iid = Mozilla::DOM::WindowInternal->GetIID;
my $windowinternal = $window->QueryInterface($iid);
my $history = $windowinternal->GetHistory;
$history->Back();
return FALSE;
}
## Helper functions
sub show_location {
my $windowinternal = shift;
my $location = $windowinternal->GetLocation;
print "Location:\n";
# Each of these also has a Set version.
# I don't know what Hash or Search are.
foreach my $prop (qw(Hash Host Hostname Href Pathname
Port Protocol Search))
{
my $method = "Get$prop";
my $val = $location->$method;
print "\t$prop = $val\n";
}
# There are also Reload, Replace, Assign, and ToString (?) methods
}
sub show_history {
my $windowinternal = shift;
my $history = $windowinternal->GetHistory;
print "History:\n";
foreach my $prop (qw(Length Current Previous Next))
{
my $method = "Get$prop";
my $val = $history->$method;
print "\t$prop = $val\n";
}
# There are also Back, Forward, Go, and Item methods.
# The Back method is shown in dom_mouse_dbl_click_cb.
}
sub show_navigator {
my $windowinternal = shift;
my $nav = $windowinternal->GetNavigator;
print "Navigator:\n";
foreach my $prop (qw(AppCodeName AppName AppVersion Language
Platform Oscpu Vendor VendorSub
Product ProductSub SecurityPolicy UserAgent))
{
my $method = "Get$prop";
my $val = $nav->$method;
print "\t$prop = $val\n";
}
foreach my $prop (qw(CookieEnabled JavaEnabled TaintEnabled)) {
my $method = ($prop eq 'CookieEnabled') ? "Get$prop" : $prop;
my $val = ($nav->$method) ? 't' : 'f';
print "\t$prop = $val\n";
}
$shownavigator = 0;
}
sub show_screen {
my $windowinternal = shift;
my $screen = $windowinternal->GetScreen;
print "Screen:\n";
foreach my $prop (qw(Top Left Width Height
AvailWidth AvailHeight AvailLeft AvailTop
PixelDepth ColorDepth))
{
my $method = "Get$prop";
my $val = $screen->$method;
print "\t$prop = $val\n";
}
$showscreen = 0;
}
1;