mirror of
https://github.com/perlbot/perlbuut
synced 2025-06-07 10:45:40 -04:00
cleaning some stuff up, i don't need the deps stuff, i also cleaned up some warnings in almost all the plugins, and removed a few plugins i don't want
This commit is contained in:
parent
0d73e35eab
commit
1b42ed6147
260 changed files with 76 additions and 67065 deletions
170
deps/IMDB/.svn/entries
vendored
170
deps/IMDB/.svn/entries
vendored
|
@ -1,170 +0,0 @@
|
|||
10
|
||||
|
||||
dir
|
||||
475
|
||||
svn://erxz.com/bb3/branches/perlbuut/deps/IMDB
|
||||
svn://erxz.com/bb3
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
dcb1cea6-7f7e-4c78-8a22-148ace8ce36e
|
||||
|
||||
t
|
||||
dir
|
||||
|
||||
lib
|
||||
dir
|
||||
|
||||
MANIFEST
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
b2b4bb53f7628be730b9d4b603a754b8
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
57
|
||||
|
||||
Makefile.PL
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
a013e7f0b4a91e2d8970394935efdaea
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
509
|
||||
|
||||
Changes
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
440b02384d58aa9be2b95e1133736122
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
152
|
||||
|
||||
README
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
dee33c52c01d661c31f7948418d11118
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
1161
|
||||
|
6
deps/IMDB/.svn/text-base/Changes.svn-base
vendored
6
deps/IMDB/.svn/text-base/Changes.svn-base
vendored
|
@ -1,6 +0,0 @@
|
|||
Revision history for Perl extension IMDB.
|
||||
|
||||
0.01 Sun Jun 7 19:27:43 2009
|
||||
- original version; created by h2xs 1.23 with options
|
||||
-b 5.0.0 -X -n IMDB
|
||||
|
6
deps/IMDB/.svn/text-base/MANIFEST.svn-base
vendored
6
deps/IMDB/.svn/text-base/MANIFEST.svn-base
vendored
|
@ -1,6 +0,0 @@
|
|||
Changes
|
||||
Makefile.PL
|
||||
MANIFEST
|
||||
README
|
||||
t/IMDB.t
|
||||
lib/IMDB.pm
|
12
deps/IMDB/.svn/text-base/Makefile.PL.svn-base
vendored
12
deps/IMDB/.svn/text-base/Makefile.PL.svn-base
vendored
|
@ -1,12 +0,0 @@
|
|||
use 5.000;
|
||||
use ExtUtils::MakeMaker;
|
||||
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
|
||||
# the contents of the Makefile that is written.
|
||||
WriteMakefile(
|
||||
NAME => 'IMDB',
|
||||
VERSION_FROM => 'lib/IMDB.pm', # finds $VERSION
|
||||
PREREQ_PM => {}, # e.g., Module::Name => 1.1
|
||||
($] >= 5.005 ? ## Add these new keywords supported since 5.005
|
||||
(ABSTRACT_FROM => 'lib/IMDB.pm', # retrieve abstract from module
|
||||
AUTHOR => 'A. U. Thor <buu@>') : ()),
|
||||
);
|
40
deps/IMDB/.svn/text-base/README.svn-base
vendored
40
deps/IMDB/.svn/text-base/README.svn-base
vendored
|
@ -1,40 +0,0 @@
|
|||
IMDB version 0.01
|
||||
=================
|
||||
|
||||
The README is used to introduce the module and provide instructions on
|
||||
how to install the module, any machine dependencies it may have (for
|
||||
example C compilers and installed libraries) and any other information
|
||||
that should be provided before the module is installed.
|
||||
|
||||
A README file is required for CPAN modules since CPAN extracts the
|
||||
README file from a module distribution so that people browsing the
|
||||
archive can use it get an idea of the modules uses. It is usually a
|
||||
good idea to provide version information here so that people can
|
||||
decide whether fixes for the module are worth downloading.
|
||||
|
||||
INSTALLATION
|
||||
|
||||
To install this module type the following:
|
||||
|
||||
perl Makefile.PL
|
||||
make
|
||||
make test
|
||||
make install
|
||||
|
||||
DEPENDENCIES
|
||||
|
||||
This module requires these other modules and libraries:
|
||||
|
||||
blah blah blah
|
||||
|
||||
COPYRIGHT AND LICENCE
|
||||
|
||||
Put the correct copyright and licence information here.
|
||||
|
||||
Copyright (C) 2009 by A. U. Thor
|
||||
|
||||
This library is free software; you can redistribute it and/or modify
|
||||
it under the same terms as Perl itself, either Perl version 5.10.0 or,
|
||||
at your option, any later version of Perl 5 you may have available.
|
||||
|
||||
|
6
deps/IMDB/Changes
vendored
6
deps/IMDB/Changes
vendored
|
@ -1,6 +0,0 @@
|
|||
Revision history for Perl extension IMDB.
|
||||
|
||||
0.01 Sun Jun 7 19:27:43 2009
|
||||
- original version; created by h2xs 1.23 with options
|
||||
-b 5.0.0 -X -n IMDB
|
||||
|
6
deps/IMDB/MANIFEST
vendored
6
deps/IMDB/MANIFEST
vendored
|
@ -1,6 +0,0 @@
|
|||
Changes
|
||||
Makefile.PL
|
||||
MANIFEST
|
||||
README
|
||||
t/IMDB.t
|
||||
lib/IMDB.pm
|
12
deps/IMDB/Makefile.PL
vendored
12
deps/IMDB/Makefile.PL
vendored
|
@ -1,12 +0,0 @@
|
|||
use 5.000;
|
||||
use ExtUtils::MakeMaker;
|
||||
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
|
||||
# the contents of the Makefile that is written.
|
||||
WriteMakefile(
|
||||
NAME => 'IMDB',
|
||||
VERSION_FROM => 'lib/IMDB.pm', # finds $VERSION
|
||||
PREREQ_PM => {}, # e.g., Module::Name => 1.1
|
||||
($] >= 5.005 ? ## Add these new keywords supported since 5.005
|
||||
(ABSTRACT_FROM => 'lib/IMDB.pm', # retrieve abstract from module
|
||||
AUTHOR => 'A. U. Thor <buu@>') : ()),
|
||||
);
|
40
deps/IMDB/README
vendored
40
deps/IMDB/README
vendored
|
@ -1,40 +0,0 @@
|
|||
IMDB version 0.01
|
||||
=================
|
||||
|
||||
The README is used to introduce the module and provide instructions on
|
||||
how to install the module, any machine dependencies it may have (for
|
||||
example C compilers and installed libraries) and any other information
|
||||
that should be provided before the module is installed.
|
||||
|
||||
A README file is required for CPAN modules since CPAN extracts the
|
||||
README file from a module distribution so that people browsing the
|
||||
archive can use it get an idea of the modules uses. It is usually a
|
||||
good idea to provide version information here so that people can
|
||||
decide whether fixes for the module are worth downloading.
|
||||
|
||||
INSTALLATION
|
||||
|
||||
To install this module type the following:
|
||||
|
||||
perl Makefile.PL
|
||||
make
|
||||
make test
|
||||
make install
|
||||
|
||||
DEPENDENCIES
|
||||
|
||||
This module requires these other modules and libraries:
|
||||
|
||||
blah blah blah
|
||||
|
||||
COPYRIGHT AND LICENCE
|
||||
|
||||
Put the correct copyright and licence information here.
|
||||
|
||||
Copyright (C) 2009 by A. U. Thor
|
||||
|
||||
This library is free software; you can redistribute it and/or modify
|
||||
it under the same terms as Perl itself, either Perl version 5.10.0 or,
|
||||
at your option, any later version of Perl 5 you may have available.
|
||||
|
||||
|
62
deps/IMDB/lib/.svn/entries
vendored
62
deps/IMDB/lib/.svn/entries
vendored
|
@ -1,62 +0,0 @@
|
|||
10
|
||||
|
||||
dir
|
||||
475
|
||||
svn://erxz.com/bb3/branches/perlbuut/deps/IMDB/lib
|
||||
svn://erxz.com/bb3
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
dcb1cea6-7f7e-4c78-8a22-148ace8ce36e
|
||||
|
||||
IMDB.pm
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
50c116175e3d733ef0edbd95b2e4213c
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
4954
|
||||
|
241
deps/IMDB/lib/.svn/text-base/IMDB.pm.svn-base
vendored
241
deps/IMDB/lib/.svn/text-base/IMDB.pm.svn-base
vendored
|
@ -1,241 +0,0 @@
|
|||
package IMDB;
|
||||
use HTML::TreeBuilder;
|
||||
use URI;
|
||||
use LWP::Simple qw/get/;
|
||||
use URI::Escape qw/uri_escape/;
|
||||
use strict;
|
||||
|
||||
|
||||
sub normalize_title
|
||||
{
|
||||
my( $self, $title ) = @_;
|
||||
|
||||
$title =~ tr/'"[]//d;
|
||||
$title =~ s/ +/ /g;
|
||||
return $title;
|
||||
}
|
||||
|
||||
sub new
|
||||
{
|
||||
my( $class, $title ) = @_;
|
||||
my $self = bless {}, $class;
|
||||
|
||||
my ($uri,$tree) = $self->search( $title );
|
||||
return unless defined $tree;
|
||||
|
||||
$self->get_title($tree);
|
||||
$self->get_basic_info($tree);
|
||||
|
||||
for( qw/plotsummary fullcredits trivia quotes/ )
|
||||
{
|
||||
warn "Fetching $uri$_\n";
|
||||
my $html = get( "$uri$_" );
|
||||
my $tree = HTML::TreeBuilder->new;
|
||||
$tree->parse($html);
|
||||
$tree->eof;
|
||||
|
||||
my $method_name = "get_$_";
|
||||
$self->$method_name($tree);
|
||||
}
|
||||
|
||||
return $self;
|
||||
}
|
||||
|
||||
sub search
|
||||
{
|
||||
my( $self, $title ) = @_;
|
||||
my $search_uri = "http://www.imdb.com/find?s=all&q=" . uri_escape($self->normalize_title($title));
|
||||
warn "Fetching $search_uri\n";
|
||||
my $html = get($search_uri);
|
||||
|
||||
my $tree = HTML::TreeBuilder->new;
|
||||
$tree->parse($html);
|
||||
$tree->eof;
|
||||
|
||||
if( not $tree->look_down(_tag => "title")->as_text =~ /IMDb.*Search/ )
|
||||
{
|
||||
my $link = $tree->look_down( _tag => 'a', href => qr#/title/tt# );
|
||||
$link->attr('href') =~ m'(/title/tt\d+)';
|
||||
return ( "http://www.imdb.com$1",$tree );
|
||||
}
|
||||
|
||||
#This gets the initial header for the search results. <h2>Popular Results</h2>
|
||||
my $top_ele = $tree->look_down( _tag => 'b', sub { $_[0]->as_text eq 'Popular Titles' } );
|
||||
|
||||
if( $top_ele and ($top_ele->parent->content_list)[2] )
|
||||
{
|
||||
$top_ele = ($top_ele->parent->content_list)[2]; #Should be the opening tag for the follow list of links.
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
$top_ele = $tree->look_down( _tag => 'b', sub { $_[0]->as_text eq 'Titles (Exact Matches)' } );
|
||||
|
||||
if( $top_ele )
|
||||
{
|
||||
$top_ele = ($top_ele->right)[1];
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
$top_ele = $tree->look_down( _tag => 'b', sub { $_[0]->as_text eq 'Titles (Approx Matches)' } );
|
||||
|
||||
if( $top_ele )
|
||||
{
|
||||
$top_ele = ($top_ele->right)[1];
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
$top_ele = $tree->look_down( _tag => 'b', sub { $_[0]->as_text eq 'Titles (Partial Matches)' } );
|
||||
|
||||
if( $top_ele )
|
||||
{
|
||||
$top_ele = ($top_ele->right)[1];
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
warn "Error, could not find a useful result for term $title\n";
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# warn "Top ele -- ", $top_ele->as_HTML;
|
||||
|
||||
my $first_link = $top_ele->look_down( _tag => 'a' ); #We only want the first link anyway.
|
||||
|
||||
my $path = URI->new($first_link->attr('href'))->path;
|
||||
my $uri = URI->new_abs( $path, "http://imdb.com");
|
||||
$self->{data}->{uri} = $uri;
|
||||
|
||||
my $actual_html = get( $uri );
|
||||
my $new_tree = HTML::TreeBuilder->new;
|
||||
$new_tree->parse($actual_html);
|
||||
return ($uri,$new_tree);
|
||||
}
|
||||
|
||||
|
||||
sub get_title
|
||||
{
|
||||
my( $self, $tree ) = @_;
|
||||
|
||||
my $title = $tree->look_down(_tag => "title");
|
||||
$self->{data}->{title} = $title->as_text if $title;
|
||||
}
|
||||
|
||||
sub get_basic_info
|
||||
{
|
||||
my( $self, $tree ) = @_;
|
||||
|
||||
my $rdate = $tree->look_down( _tag => 'h5', sub { $_[0]->as_text eq 'Release Date:' } );
|
||||
$self->{data}->{release_date} = $rdate->right if $rdate;
|
||||
my $genre_title = $tree->look_down( _tag => 'h5', sub { $_[0]->as_text eq 'Genre:' } );
|
||||
|
||||
if( $genre_title )
|
||||
{
|
||||
my @genres = $genre_title->right;
|
||||
pop @genres; #Remove the "more.." link.
|
||||
|
||||
if( @genres )
|
||||
{
|
||||
$self->{data}->{genre} .= (ref $_ ? $_->as_text : $_) for @genres;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub get_plotsummary
|
||||
{
|
||||
my( $self, $tree ) = @_;
|
||||
|
||||
my $first_summary = $tree->look_down( _tag => 'p', class => 'plotpar' );
|
||||
if( $first_summary )
|
||||
{
|
||||
$self->{data}->{summary} = $first_summary->as_text;
|
||||
}
|
||||
}
|
||||
|
||||
sub get_quotes
|
||||
{
|
||||
my( $self, $tree ) = @_;
|
||||
|
||||
my $first_link = $tree->look_down( _tag => "a", name => qr/qt\d+/ );
|
||||
return unless $first_link;
|
||||
my @quote_eles = ($first_link,$first_link->right);
|
||||
|
||||
my $quotes;
|
||||
|
||||
for( my $i = 0; $i < $#quote_eles; $i++ )
|
||||
{
|
||||
local $_ = $quote_eles[$i];
|
||||
|
||||
if( ref $_ and $_->tag eq 'a' and $_->attr('name') =~ /qt\d+/ )
|
||||
{
|
||||
my @quote;
|
||||
|
||||
my $start = $i;
|
||||
for( $i; $i < @quote_eles; $i++ )
|
||||
{
|
||||
local $_ = $quote_eles[$i];
|
||||
|
||||
if( ref $_ and ( $_->tag eq 'hr' or $_->tag eq 'div' ) )
|
||||
{
|
||||
last;
|
||||
}
|
||||
|
||||
if( ref $_ and $_->tag eq 'i' )
|
||||
{
|
||||
$quote[-1] .= $_->as_text;
|
||||
$i++;
|
||||
#Hrm, this should probably always be plain text..
|
||||
$quote[-1] .= ref $quote_eles[$i] ? $quote_eles[$i]->as_text : $quote_eles[$i];
|
||||
}
|
||||
else
|
||||
{
|
||||
my $str = ref $_ ? $_->as_text : $_;
|
||||
if( $str =~ /\S/ ) { push @quote, $str }
|
||||
}
|
||||
}
|
||||
|
||||
for( my $j = 0; $j < @quote; $j++ )
|
||||
{
|
||||
if( $quote[$j] =~ /:/ )
|
||||
{
|
||||
$quote[$j-1].=$quote[$j];
|
||||
$quote[$j]='';
|
||||
}
|
||||
}
|
||||
|
||||
s/^\s+//,s/\s+$// for @quote;
|
||||
@quote = grep length $_, @quote;
|
||||
push @$quotes, \@quote;
|
||||
}
|
||||
}
|
||||
|
||||
$self->{data}->{quotes} = $quotes;
|
||||
}
|
||||
|
||||
sub get_trivia
|
||||
{
|
||||
my( $self, $tree ) = @_;
|
||||
|
||||
my @trivia;
|
||||
for my $ul ($tree->look_down( _tag => "ul", class => "trivia" ) )
|
||||
{
|
||||
for( $ul->look_down( _tag => "li" ) )
|
||||
{
|
||||
push @trivia, $_->as_text;
|
||||
}
|
||||
}
|
||||
|
||||
$self->{data}->{trivia} = \@trivia;
|
||||
}
|
||||
|
||||
sub get_fullcredits
|
||||
{
|
||||
my( $self, $tree ) = @_;
|
||||
}
|
||||
|
||||
1;
|
241
deps/IMDB/lib/IMDB.pm
vendored
241
deps/IMDB/lib/IMDB.pm
vendored
|
@ -1,241 +0,0 @@
|
|||
package IMDB;
|
||||
use HTML::TreeBuilder;
|
||||
use URI;
|
||||
use LWP::Simple qw/get/;
|
||||
use URI::Escape qw/uri_escape/;
|
||||
use strict;
|
||||
|
||||
|
||||
sub normalize_title
|
||||
{
|
||||
my( $self, $title ) = @_;
|
||||
|
||||
$title =~ tr/'"[]//d;
|
||||
$title =~ s/ +/ /g;
|
||||
return $title;
|
||||
}
|
||||
|
||||
sub new
|
||||
{
|
||||
my( $class, $title ) = @_;
|
||||
my $self = bless {}, $class;
|
||||
|
||||
my ($uri,$tree) = $self->search( $title );
|
||||
return unless defined $tree;
|
||||
|
||||
$self->get_title($tree);
|
||||
$self->get_basic_info($tree);
|
||||
|
||||
for( qw/plotsummary fullcredits trivia quotes/ )
|
||||
{
|
||||
warn "Fetching $uri$_\n";
|
||||
my $html = get( "$uri$_" );
|
||||
my $tree = HTML::TreeBuilder->new;
|
||||
$tree->parse($html);
|
||||
$tree->eof;
|
||||
|
||||
my $method_name = "get_$_";
|
||||
$self->$method_name($tree);
|
||||
}
|
||||
|
||||
return $self;
|
||||
}
|
||||
|
||||
sub search
|
||||
{
|
||||
my( $self, $title ) = @_;
|
||||
my $search_uri = "http://www.imdb.com/find?s=all&q=" . uri_escape($self->normalize_title($title));
|
||||
warn "Fetching $search_uri\n";
|
||||
my $html = get($search_uri);
|
||||
|
||||
my $tree = HTML::TreeBuilder->new;
|
||||
$tree->parse($html);
|
||||
$tree->eof;
|
||||
|
||||
if( not $tree->look_down(_tag => "title")->as_text =~ /IMDb.*Search/ )
|
||||
{
|
||||
my $link = $tree->look_down( _tag => 'a', href => qr#/title/tt# );
|
||||
$link->attr('href') =~ m'(/title/tt\d+)';
|
||||
return ( "http://www.imdb.com$1",$tree );
|
||||
}
|
||||
|
||||
#This gets the initial header for the search results. <h2>Popular Results</h2>
|
||||
my $top_ele = $tree->look_down( _tag => 'b', sub { $_[0]->as_text eq 'Popular Titles' } );
|
||||
|
||||
if( $top_ele and ($top_ele->parent->content_list)[2] )
|
||||
{
|
||||
$top_ele = ($top_ele->parent->content_list)[2]; #Should be the opening tag for the follow list of links.
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
$top_ele = $tree->look_down( _tag => 'b', sub { $_[0]->as_text eq 'Titles (Exact Matches)' } );
|
||||
|
||||
if( $top_ele )
|
||||
{
|
||||
$top_ele = ($top_ele->right)[1];
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
$top_ele = $tree->look_down( _tag => 'b', sub { $_[0]->as_text eq 'Titles (Approx Matches)' } );
|
||||
|
||||
if( $top_ele )
|
||||
{
|
||||
$top_ele = ($top_ele->right)[1];
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
$top_ele = $tree->look_down( _tag => 'b', sub { $_[0]->as_text eq 'Titles (Partial Matches)' } );
|
||||
|
||||
if( $top_ele )
|
||||
{
|
||||
$top_ele = ($top_ele->right)[1];
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
warn "Error, could not find a useful result for term $title\n";
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# warn "Top ele -- ", $top_ele->as_HTML;
|
||||
|
||||
my $first_link = $top_ele->look_down( _tag => 'a' ); #We only want the first link anyway.
|
||||
|
||||
my $path = URI->new($first_link->attr('href'))->path;
|
||||
my $uri = URI->new_abs( $path, "http://imdb.com");
|
||||
$self->{data}->{uri} = $uri;
|
||||
|
||||
my $actual_html = get( $uri );
|
||||
my $new_tree = HTML::TreeBuilder->new;
|
||||
$new_tree->parse($actual_html);
|
||||
return ($uri,$new_tree);
|
||||
}
|
||||
|
||||
|
||||
sub get_title
|
||||
{
|
||||
my( $self, $tree ) = @_;
|
||||
|
||||
my $title = $tree->look_down(_tag => "title");
|
||||
$self->{data}->{title} = $title->as_text if $title;
|
||||
}
|
||||
|
||||
sub get_basic_info
|
||||
{
|
||||
my( $self, $tree ) = @_;
|
||||
|
||||
my $rdate = $tree->look_down( _tag => 'h5', sub { $_[0]->as_text eq 'Release Date:' } );
|
||||
$self->{data}->{release_date} = $rdate->right if $rdate;
|
||||
my $genre_title = $tree->look_down( _tag => 'h5', sub { $_[0]->as_text eq 'Genre:' } );
|
||||
|
||||
if( $genre_title )
|
||||
{
|
||||
my @genres = $genre_title->right;
|
||||
pop @genres; #Remove the "more.." link.
|
||||
|
||||
if( @genres )
|
||||
{
|
||||
$self->{data}->{genre} .= (ref $_ ? $_->as_text : $_) for @genres;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub get_plotsummary
|
||||
{
|
||||
my( $self, $tree ) = @_;
|
||||
|
||||
my $first_summary = $tree->look_down( _tag => 'p', class => 'plotpar' );
|
||||
if( $first_summary )
|
||||
{
|
||||
$self->{data}->{summary} = $first_summary->as_text;
|
||||
}
|
||||
}
|
||||
|
||||
sub get_quotes
|
||||
{
|
||||
my( $self, $tree ) = @_;
|
||||
|
||||
my $first_link = $tree->look_down( _tag => "a", name => qr/qt\d+/ );
|
||||
return unless $first_link;
|
||||
my @quote_eles = ($first_link,$first_link->right);
|
||||
|
||||
my $quotes;
|
||||
|
||||
for( my $i = 0; $i < $#quote_eles; $i++ )
|
||||
{
|
||||
local $_ = $quote_eles[$i];
|
||||
|
||||
if( ref $_ and $_->tag eq 'a' and $_->attr('name') =~ /qt\d+/ )
|
||||
{
|
||||
my @quote;
|
||||
|
||||
my $start = $i;
|
||||
for( $i; $i < @quote_eles; $i++ )
|
||||
{
|
||||
local $_ = $quote_eles[$i];
|
||||
|
||||
if( ref $_ and ( $_->tag eq 'hr' or $_->tag eq 'div' ) )
|
||||
{
|
||||
last;
|
||||
}
|
||||
|
||||
if( ref $_ and $_->tag eq 'i' )
|
||||
{
|
||||
$quote[-1] .= $_->as_text;
|
||||
$i++;
|
||||
#Hrm, this should probably always be plain text..
|
||||
$quote[-1] .= ref $quote_eles[$i] ? $quote_eles[$i]->as_text : $quote_eles[$i];
|
||||
}
|
||||
else
|
||||
{
|
||||
my $str = ref $_ ? $_->as_text : $_;
|
||||
if( $str =~ /\S/ ) { push @quote, $str }
|
||||
}
|
||||
}
|
||||
|
||||
for( my $j = 0; $j < @quote; $j++ )
|
||||
{
|
||||
if( $quote[$j] =~ /:/ )
|
||||
{
|
||||
$quote[$j-1].=$quote[$j];
|
||||
$quote[$j]='';
|
||||
}
|
||||
}
|
||||
|
||||
s/^\s+//,s/\s+$// for @quote;
|
||||
@quote = grep length $_, @quote;
|
||||
push @$quotes, \@quote;
|
||||
}
|
||||
}
|
||||
|
||||
$self->{data}->{quotes} = $quotes;
|
||||
}
|
||||
|
||||
sub get_trivia
|
||||
{
|
||||
my( $self, $tree ) = @_;
|
||||
|
||||
my @trivia;
|
||||
for my $ul ($tree->look_down( _tag => "ul", class => "trivia" ) )
|
||||
{
|
||||
for( $ul->look_down( _tag => "li" ) )
|
||||
{
|
||||
push @trivia, $_->as_text;
|
||||
}
|
||||
}
|
||||
|
||||
$self->{data}->{trivia} = \@trivia;
|
||||
}
|
||||
|
||||
sub get_fullcredits
|
||||
{
|
||||
my( $self, $tree ) = @_;
|
||||
}
|
||||
|
||||
1;
|
62
deps/IMDB/t/.svn/entries
vendored
62
deps/IMDB/t/.svn/entries
vendored
|
@ -1,62 +0,0 @@
|
|||
10
|
||||
|
||||
dir
|
||||
475
|
||||
svn://erxz.com/bb3/branches/perlbuut/deps/IMDB/t
|
||||
svn://erxz.com/bb3
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
dcb1cea6-7f7e-4c78-8a22-148ace8ce36e
|
||||
|
||||
IMDB.t
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
5563f424f7940616770262ffdd161ce7
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
495
|
||||
|
17
deps/IMDB/t/.svn/text-base/IMDB.t.svn-base
vendored
17
deps/IMDB/t/.svn/text-base/IMDB.t.svn-base
vendored
|
@ -1,17 +0,0 @@
|
|||
# Before `make install' is performed this script should be runnable with
|
||||
# `make test'. After `make install' it should work as `perl IMDB.t'
|
||||
|
||||
#########################
|
||||
|
||||
# change 'tests => 1' to 'tests => last_test_to_print';
|
||||
|
||||
use Test;
|
||||
BEGIN { plan tests => 1 };
|
||||
use IMDB;
|
||||
ok(1); # If we made it this far, we're ok.
|
||||
|
||||
#########################
|
||||
|
||||
# Insert your test code below, the Test::More module is use()ed here so read
|
||||
# its man page ( perldoc Test::More ) for help writing this test script.
|
||||
|
17
deps/IMDB/t/IMDB.t
vendored
17
deps/IMDB/t/IMDB.t
vendored
|
@ -1,17 +0,0 @@
|
|||
# Before `make install' is performed this script should be runnable with
|
||||
# `make test'. After `make install' it should work as `perl IMDB.t'
|
||||
|
||||
#########################
|
||||
|
||||
# change 'tests => 1' to 'tests => last_test_to_print';
|
||||
|
||||
use Test;
|
||||
BEGIN { plan tests => 1 };
|
||||
use IMDB;
|
||||
ok(1); # If we made it this far, we're ok.
|
||||
|
||||
#########################
|
||||
|
||||
# Insert your test code below, the Test::More module is use()ed here so read
|
||||
# its man page ( perldoc Test::More ) for help writing this test script.
|
||||
|
|
@ -1,408 +0,0 @@
|
|||
10
|
||||
|
||||
dir
|
||||
475
|
||||
svn://erxz.com/bb3/branches/perlbuut/deps/JavaScript-SpiderMonkey-0.19-patched
|
||||
svn://erxz.com/bb3
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
dcb1cea6-7f7e-4c78-8a22-148ace8ce36e
|
||||
|
||||
SpiderMonkey.h
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
9f9edd285dd69ea755e8cf82d2895988
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
311
|
||||
|
||||
typemap
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
0b4b207f9bceddce222c490f7833f85c
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
580
|
||||
|
||||
SpiderMonkey.xs
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
3cdf4e44832e756fd6fd56caccfc34c1
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
22143
|
||||
|
||||
t
|
||||
dir
|
||||
|
||||
SpiderMonkey.pm
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
86c0e5aaf190279dbcccf8bca20fd853
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
20317
|
||||
|
||||
INSTALL
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
61bdc79780049dfac7ccb8e934494ca8
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
809
|
||||
|
||||
MANIFEST
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
91b8f16b9e54c3289a60d9dfb0de7f67
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
490
|
||||
|
||||
META.yml
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
e3947fa5d8ade1061c359b694a6dfa83
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
484
|
||||
|
||||
Makefile.PL
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
687a07196bd2f9d9a768fb57c9594ec9
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
4581
|
||||
|
||||
Changes
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
d7e46aa4fd49100848e5c27a0f8bcd06
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
3286
|
||||
|
||||
MANIFEST.SKIP
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
9110b82363ff8e3e369493cda15d5ca8
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
128
|
||||
|
||||
util
|
||||
dir
|
||||
|
||||
README
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
549447c180c59658f370b25d50a30666
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
7770
|
||||
|
|
@ -1,94 +0,0 @@
|
|||
Revision history for Perl extension JavaScript::SpiderMonkey.
|
||||
|
||||
0.19 (05/09/2007)
|
||||
(tb) Allocate correct amount of memory for scripts that contain UTF-8
|
||||
characters with internal UTF-8 flag on.
|
||||
|
||||
0.18 (08/06/2007)
|
||||
(tb) Added protection against infinite loops
|
||||
(tb) Added support for JS_THREADSAFE
|
||||
|
||||
0.17 (27/07/2006)
|
||||
(tb) Made sure eval function doesn't produce warnings when script
|
||||
variable is uninitialized.
|
||||
[was supposed to be part of 0.16 but is actually part of 0.17]
|
||||
(tb) Added support for E4X
|
||||
|
||||
0.16 (13/06/2006)
|
||||
(tb) Added patch initially proposed by marc [at] igneousconsulting.com
|
||||
and subsequently modified by Agent Zhang that allows mapped perl
|
||||
functions to return varied datatypes back to JavaScript
|
||||
|
||||
0.15 (28/02/2006)
|
||||
(tb) Rewrote Makefile.PL to work on more platforms
|
||||
|
||||
0.14 (12/02/2006)
|
||||
(tb) Removed remaining debug info
|
||||
|
||||
0.13 (05/02/2006)
|
||||
(tb) Removed debug info
|
||||
(tb) Made sure Makefile.PL finds libjs if installed in /usr/lib or
|
||||
/usr/local/lib
|
||||
|
||||
0.12 (12/03/2005)
|
||||
(ms) Makefile.PL prerequisite changed from undef to '0'.
|
||||
(ms) Thomas Busch added a check to Makefile.PL to find an already
|
||||
installed JS lib.
|
||||
|
||||
0.11 (08/22/2004)
|
||||
* (ms) Added Log::Log4perl dependency in Makefile.PL as suggested
|
||||
by an anonymous posting on rt.cpan.org.
|
||||
* (ms) Added #define for MSC compiler as suggested in
|
||||
https://rt.cpan.org/Ticket/Display.html?id=6984
|
||||
* (ms) Roger Crew <crew@cs.stanford.edu> provided patches for
|
||||
a clean Win32 compile plus README text on installing the dll/so.
|
||||
|
||||
0.10 06/20/2004
|
||||
* Nikita Savin <nikita@savin.go2serve.net> provided a patch to
|
||||
set $@ instead of printing to STDERR in case of a JS error.
|
||||
* Added patch by Chris Blaise <cblaise@esoft.com>:
|
||||
- Different objects can have the same named function. If no
|
||||
object is specified on function_set, it's global.
|
||||
* Log4perl in for debugging
|
||||
* Chris Blaise submitted a patch to have a perl callback return
|
||||
an object to JS. Applied with modifications, longer term we need
|
||||
a solution on how the perl callback tells the JS wrapper what's coming
|
||||
back: A JS string, an object or an integer.
|
||||
|
||||
0.09 02/20/2004
|
||||
* Max Maischein added Win32 installation steps in Makefile.PL
|
||||
|
||||
0.08 09/19/2002
|
||||
* Doc bug fixed, reported by Yoz Grahame.
|
||||
|
||||
0.07 09/14/2002
|
||||
* Release mgmt changed
|
||||
|
||||
0.06 07/10/2002
|
||||
* Made M*PL smarter to detect the JS target platform
|
||||
|
||||
0.05 06/23/2002
|
||||
* Added installation instructions to README.
|
||||
|
||||
0.04 06/23/2002
|
||||
* Added test case for just setter or just getter
|
||||
* Added documentation
|
||||
* Updated todo list
|
||||
|
||||
0.03 06/23/2002
|
||||
* Added setters and getters for properties
|
||||
|
||||
0.02 01/20/2002
|
||||
* Fixed properties (get/set)
|
||||
|
||||
0.01 01/03/2002
|
||||
* Where it all began.
|
||||
|
||||
TODO:
|
||||
* setters/getters for arrays
|
||||
* Get rid of GLOBAL and the limitation to one instance
|
||||
* getter/setter called every time, callback settings checked
|
||||
at perl level only
|
||||
* Make fixed constants in init() configurable (1000000)
|
||||
* Allow for different contexts
|
||||
* Rethink function names (by_path, function_set etc.)
|
|
@ -1,33 +0,0 @@
|
|||
|
||||
How to install JavaScript::SpiderMonkey
|
||||
|
||||
Get the latest SpiderMonkey distribution from mozilla.org:
|
||||
http://www.mozilla.org/js/spidermonkey shows which releases are available.
|
||||
http://ftp.mozilla.org/pub/js/js-1.5-rc3a.tar.gz has been proven to work.
|
||||
|
||||
Untar it at the same directory level as the distribution of the
|
||||
JavaScript::SpiderMonkey perl module distribution whichs README
|
||||
you're currently reading:
|
||||
|
||||
cd ..
|
||||
tar zxfv js-1.5-rc3a.tar.gz
|
||||
|
||||
It's important that the js and JavaScript-SpiderMonkey-v.vv directories
|
||||
are at the same level:
|
||||
|
||||
$ls
|
||||
JavaScript-SpiderMonkey-1.00
|
||||
js
|
||||
js-1.5-rc3a.tar.gz
|
||||
|
||||
Now, build JavaScript::SpiderMonkey in the standard way:
|
||||
|
||||
cd JavaScript-SpiderMonkey-1.00
|
||||
perl Makefile.PL
|
||||
gmake
|
||||
gmake test
|
||||
gmake install
|
||||
|
||||
-- and you're good to go! Have fun.
|
||||
|
||||
Mike Schilli, m@perlmeister.com, 2002
|
|
@ -1,11 +0,0 @@
|
|||
blib
|
||||
^Makefile$
|
||||
^Makefile.old$
|
||||
CVS
|
||||
.cvsignore
|
||||
docs
|
||||
MANIFEST.bak
|
||||
adm/release
|
||||
^SpiderMonkey.bs$
|
||||
^SpiderMonkey.c$
|
||||
^SpiderMonkey.o$
|
|
@ -1,35 +0,0 @@
|
|||
Changes
|
||||
INSTALL
|
||||
Makefile.PL
|
||||
MANIFEST
|
||||
MANIFEST.SKIP
|
||||
META.yml Module meta-data (added by MakeMaker)
|
||||
README
|
||||
SpiderMonkey.pm
|
||||
SpiderMonkey.xs
|
||||
SpiderMonkey.h
|
||||
t/000readme.t
|
||||
t/001properties.t
|
||||
t/002functions.t
|
||||
t/003properties.t
|
||||
t/004setget.t
|
||||
t/005error.t
|
||||
t/006objmeth.t
|
||||
t/007funcret.t
|
||||
t/00array.t
|
||||
t/01doc-href.t
|
||||
t/02nav-appv.t
|
||||
t/03doc-write.t
|
||||
t/04loop.t
|
||||
t/05form.t
|
||||
t/06form2.t
|
||||
t/07func.t
|
||||
t/08func2.t
|
||||
t/09meth.t
|
||||
t/10elobj.t
|
||||
t/11intret.t
|
||||
t/12dblret.t
|
||||
t/13strret.t
|
||||
t/init.pl
|
||||
typemap
|
||||
util/download.pl
|
|
@ -1,15 +0,0 @@
|
|||
--- #YAML:1.0
|
||||
name: JavaScript-SpiderMonkey
|
||||
version: 0.19
|
||||
abstract: Perl interface to the JavaScript Engine
|
||||
license: ~
|
||||
generated_by: ExtUtils::MakeMaker version 6.36
|
||||
distribution_type: module
|
||||
requires:
|
||||
Data::Dumper: 0
|
||||
Log::Log4perl: 0
|
||||
meta-spec:
|
||||
url: http://module-build.sourceforge.net/META-spec-v1.2.html
|
||||
version: 1.2
|
||||
author:
|
||||
- Mike Schilli <m@perlmeister.com>
|
|
@ -1,166 +0,0 @@
|
|||
######################################################################
|
||||
#
|
||||
# MakeMaker file for JavaScript::SpiderMonkey
|
||||
#
|
||||
# Revision: $Revision: 1.5 $
|
||||
# Last Checkin: $Date: 2007/06/08 19:03:08 $
|
||||
# By: $Author: thomas_busch $
|
||||
#
|
||||
# Authors: Mike Schilli m@perlmeister.com, 2002-2005
|
||||
# Thomas Busch tbusch@cpan.org, 2006
|
||||
#
|
||||
######################################################################
|
||||
|
||||
use ExtUtils::MakeMaker;
|
||||
use Getopt::Long;
|
||||
|
||||
# Get the right lib and include dirs for different platforms
|
||||
|
||||
my $JS_LIB_DIR;
|
||||
my @JS_INCL_DIRS;
|
||||
|
||||
my @c_header_files = qw(
|
||||
jsapi.h
|
||||
jsautocfg.h
|
||||
);
|
||||
|
||||
my @possible_libraries = qw(
|
||||
libjs.a
|
||||
js32.dll
|
||||
libmozjs.so
|
||||
);
|
||||
|
||||
my %possible_install_paths = (
|
||||
"../js/src/*" => "../js/src",
|
||||
"/usr/lib" => "/usr/include",
|
||||
"/usr/local/lib" => "/usr/local/include",
|
||||
"/usr/lib/firefox" => "/usr/include/firefox",
|
||||
);
|
||||
|
||||
my ($JS_LIB_DIR, @JS_INCL_DIRS, $JS_LIB_NAME);
|
||||
|
||||
foreach my $install_path(keys %possible_install_paths) {
|
||||
foreach my $possible_lib(@possible_libraries) {
|
||||
foreach my $libfile(glob "$install_path/$possible_lib") {
|
||||
next if ! -f $libfile;
|
||||
my $include_path = $possible_install_paths{$install_path};
|
||||
foreach my $c_header(@c_header_files) {
|
||||
if (-f "$include_path/$c_header") {
|
||||
my $include_dir = "$include_path/$c_header";
|
||||
$include_dir =~ s/$c_header$//;
|
||||
push @JS_INCL_DIRS, $include_dir;
|
||||
}
|
||||
foreach my $headerfile(glob "$include_path/*/$c_header") {
|
||||
my $include_dir = $headerfile;
|
||||
$include_dir =~ s/$c_header$//;
|
||||
push @JS_INCL_DIRS, $include_dir;
|
||||
}
|
||||
}
|
||||
if (scalar(@JS_INCL_DIRS) == scalar(@c_header_files)) {
|
||||
$JS_LIB_DIR = $libfile;
|
||||
$JS_LIB_DIR =~ s/$possible_lib$//;
|
||||
|
||||
$JS_LIB_NAME = $possible_lib;
|
||||
$JS_LIB_NAME =~ s/\.(a|so|dll)$//;
|
||||
$JS_LIB_NAME =~ s/^lib//;
|
||||
|
||||
last;
|
||||
} else {
|
||||
@JS_INCL_DIRS = ();
|
||||
}
|
||||
}
|
||||
last if $JS_LIB_DIR;
|
||||
}
|
||||
last if $JS_LIB_DIR;
|
||||
}
|
||||
|
||||
if ($JS_INCL_DIRS[0] eq $JS_INCL_DIRS[1]) {
|
||||
shift @JS_INCL_DIRS;
|
||||
}
|
||||
|
||||
## If no SpiderMonkey library found report that and exit.
|
||||
## Otherwise print lib and include paths.
|
||||
|
||||
if (!$JS_LIB_DIR) {
|
||||
print <<EOT;
|
||||
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
This module requires the SpiderMonkey C library -- please read the
|
||||
README file on how to download, compile and link it.
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
|
||||
EOT
|
||||
exit 0;
|
||||
} else {
|
||||
print "JS_LIB_DIR: $JS_LIB_DIR\n";
|
||||
foreach my $include_dir(@JS_INCL_DIRS) {
|
||||
print "JS_INCL_DIR: $include_dir\n";
|
||||
}
|
||||
print "JS_LIB_NAME: $JS_LIB_NAME\n";
|
||||
}
|
||||
|
||||
#### Determine compile options
|
||||
##############################
|
||||
|
||||
my $JS_DEFINE;
|
||||
my $E4X = 0;
|
||||
my $JS_THREADSAFE = 0;
|
||||
|
||||
## Get options from command line
|
||||
GetOptions(
|
||||
"E4X" => \$E4X,
|
||||
"JS_THREADSAFE" => \$JS_THREADSAFE,
|
||||
);
|
||||
|
||||
|
||||
## Determine library name and system-related defines
|
||||
if ($^O ne 'MSWin32') {
|
||||
$JS_DEFINE = '-DXP_UNIX';
|
||||
} else {
|
||||
$JS_DEFINE = '-DXP_WIN';
|
||||
};
|
||||
|
||||
## Add E4X support if flag set.
|
||||
## For more info about E4X check http://en.wikipedia.org/wiki/E4X
|
||||
if ($E4X) {
|
||||
$JS_DEFINE .= " -DE4X";
|
||||
print "E4X support enabled\n";
|
||||
}
|
||||
|
||||
## Support compiling in thread safe environment
|
||||
if ($JS_THREADSAFE) {
|
||||
$JS_DEFINE .= " -DJS_THREADSAFE";
|
||||
print "Compiling with JS_THREADSAFE flag\n";
|
||||
}
|
||||
|
||||
|
||||
#### See lib/ExtUtils/MakeMaker.pm for details of how to influence
|
||||
#### the contents of the Makefile that is written.
|
||||
##################################################
|
||||
|
||||
WriteMakefile(
|
||||
'NAME' => 'JavaScript::SpiderMonkey',
|
||||
'VERSION_FROM' => 'SpiderMonkey.pm', # finds $VERSION
|
||||
'PREREQ_PM' => {
|
||||
'Log::Log4perl' => 0,
|
||||
'Data::Dumper' => 0,
|
||||
}, # e.g., Module::Name => 1.1
|
||||
($] >= 5.005 ? ## Add these new keywords supported since 5.005
|
||||
(ABSTRACT_FROM => 'SpiderMonkey.pm', # retrieve abstract from module
|
||||
AUTHOR => 'Mike Schilli <m@perlmeister.com>') : ()),
|
||||
'LIBS' => ["-L$JS_LIB_DIR -l$JS_LIB_NAME"], # e.g., '-lm'
|
||||
'DEFINE' => $JS_DEFINE, # e.g., '-DHAVE_SOMETHING'
|
||||
# Insert -I. if you add *.h files later:
|
||||
'INC' => "-I".join " -I", @JS_INCL_DIRS,
|
||||
# Un-comment this if you add C files to link with later:
|
||||
# 'OBJECT' => '$(O_FILES)', # link all the C files too
|
||||
);
|
||||
|
||||
######################################################################
|
||||
sub MY::postamble {
|
||||
######################################################################
|
||||
'
|
||||
README: SpiderMonkey.pm
|
||||
pod2text SpiderMonkey.pm >README
|
||||
';
|
||||
}
|
|
@ -1,211 +0,0 @@
|
|||
######################################################################
|
||||
JavaScript::SpiderMonkey 0.17
|
||||
######################################################################
|
||||
|
||||
NAME
|
||||
JavaScript::SpiderMonkey - Perl interface to the JavaScript Engine
|
||||
|
||||
SYNOPSIS
|
||||
use JavaScript::SpiderMonkey;
|
||||
|
||||
my $js = JavaScript::SpiderMonkey->new();
|
||||
|
||||
$js->init(); # Initialize Runtime/Context
|
||||
|
||||
# Define a perl callback for a new JavaScript function
|
||||
$js->function_set("print_to_perl", sub { print "@_\n"; });
|
||||
|
||||
# Create a new (nested) object and a property
|
||||
$js->property_by_path("document.location.href");
|
||||
|
||||
# Execute some code
|
||||
my $rc = $js->eval(q!
|
||||
document.location.href = append("http://", "www.aol.com");
|
||||
|
||||
print_to_perl("URL is ", document.location.href);
|
||||
|
||||
function append(first, second) {
|
||||
return first + second;
|
||||
}
|
||||
!);
|
||||
|
||||
# Get the value of a property set in JS
|
||||
my $url = $js->property_get("document.location.href");
|
||||
|
||||
$js->destroy();
|
||||
|
||||
INSTALL
|
||||
JavaScript::SpiderMonkey requires Mozilla's readily compiled
|
||||
SpiderMonkey 1.5 distribution or better. Please check "SpiderMonkey
|
||||
Installation".
|
||||
|
||||
DESCRIPTION
|
||||
JavaScript::SpiderMonkey is a Perl Interface to the SpiderMonkey
|
||||
JavaScript Engine. It is different from Claes Jacobsson's
|
||||
"JavaScript.pm" in that it offers two different levels of access:
|
||||
|
||||
[1] A 1:1 mapping of the SpiderMonkey API to Perl
|
||||
|
||||
[2] A more Perl-like API
|
||||
|
||||
This document describes [2], for [1], please check "SpiderMonkey.xs".
|
||||
|
||||
new()
|
||||
"$js = JavaScript::SpiderMonkey->new()" creates a new object to work
|
||||
with. To initialize the JS runtime, call "$js->init()" afterwards.
|
||||
|
||||
$js->destroy()
|
||||
"$js->destroy()" destroys the current runtime and frees up all memory.
|
||||
|
||||
$js->init()
|
||||
"$js->init()" initializes the SpiderMonkey engine by creating a context,
|
||||
default classes and objects and adding an error reporter.
|
||||
|
||||
$js->array_by_path($name)
|
||||
Creates an object of type *Array* in the JS runtime:
|
||||
|
||||
$js->array_by_path("document.form");
|
||||
|
||||
will first create an object with the name "document" (unless it exists
|
||||
already) and then define a property named "form" to it, which is an
|
||||
object of type *Array*. Therefore, in the JS code, you're going to be
|
||||
able define things like
|
||||
|
||||
document.form[0] = "value";
|
||||
|
||||
$js->function_set($name, $funcref, [$obj])
|
||||
Binds a Perl function provided as a coderef ($funcref) to a newly
|
||||
created JS function named $name in JS land. It's a real function
|
||||
(therefore bound to the global object) if $obj is omitted. However, if
|
||||
$obj is ref to a JS object (retrieved via "$js->object_by_path($path)"
|
||||
or the like), the function will be a *method* of the specified object.
|
||||
|
||||
$js->function_set("write", sub { print @_ });
|
||||
# write("hello"); // In JS land
|
||||
|
||||
$obj = $j->object_by_path("navigator");
|
||||
$js->function_set("write", sub { print @_ }, $obj);
|
||||
# navigator.write("hello"); // In JS land
|
||||
|
||||
$js->array_set_element($obj, $idx, $val)
|
||||
Sets the element of the array $obj at index position $idx to the value
|
||||
$val. $obj is a reference to an object of type array (retrieved via
|
||||
"$js->object_by_path($path)" or the like).
|
||||
|
||||
$js->array_set_element_as_object($obj, $idx, $elobj)
|
||||
Sets the element of the array $obj at index position $idx to the object
|
||||
$elobj (both $obj and $elobj have been retrieved via
|
||||
"$js->object_by_path($path)" or the like).
|
||||
|
||||
$js->array_get_element($obj, $idx)
|
||||
Gets the value of of the element at index $idx of the object of type
|
||||
Array $obj.
|
||||
|
||||
$js->property_by_path($path, $value, [$getter], [$setter])
|
||||
Sets the specified property of an object in $path to the value $value.
|
||||
$path is the full name of the property, including the object(s) in JS
|
||||
land it belongs to:
|
||||
|
||||
$js-E<gt>property_by_path("document.location.href", "abc");
|
||||
|
||||
This first creates the object "document" (if it doesn't exist already),
|
||||
then the object "document.location", then attaches the property "href"
|
||||
to it and sets it to "abc".
|
||||
|
||||
$getter and $setter are coderefs that will be called by the JavaScript
|
||||
engine when the respective property's value is requested or set:
|
||||
|
||||
sub getter {
|
||||
my($property_path, $value) = @_;
|
||||
print "$property_path has value $value\n";
|
||||
}
|
||||
|
||||
sub setter {
|
||||
my($property_path, $value) = @_;
|
||||
print "$property_path set to value $value\n";
|
||||
}
|
||||
|
||||
$js-E<gt>property_by_path("document.location.href", "abc",
|
||||
\&getter, \&setter);
|
||||
|
||||
If you leave out $getter and $setter, there's going to be no callbacks
|
||||
triggerd while the properity is set or queried. If you just want to
|
||||
specify a $setter, but no $getter, set the $getter to "undef".
|
||||
|
||||
$js->object_by_path($path, [$newobj])
|
||||
Get a pointer to an object with the path specified. Create it if it's
|
||||
not there yet. If $newobj is provided, the ref is used to bind the
|
||||
existing object to the name in $path.
|
||||
|
||||
$js->property_get($path)
|
||||
Fetch the property specified by the $path.
|
||||
|
||||
my $val = $js->property_get("document.location.href");
|
||||
|
||||
$js->eval($code)
|
||||
Runs the specified piece of <$code> in the JS engine. Afterwards,
|
||||
property values of objects previously defined will be available via
|
||||
"$j->property_get($path)" and the like.
|
||||
|
||||
my $rc = $js->eval("write('hello');");
|
||||
|
||||
The method returns 1 on success or else if there was an error in JS
|
||||
land. In case of an error, the JS error text will be available in $@.
|
||||
|
||||
SpiderMonkey Installation
|
||||
First, get the latest SpiderMonkey distribution from mozilla.org:
|
||||
http://www.mozilla.org/js/spidermonkey shows which releases are
|
||||
available. "js-1.5-rc3a.tar.gz" has been proven to work.
|
||||
|
||||
Untar it at the same directory level as you just untarred the
|
||||
"JavaScript::SpiderMonkey" distribution you're currently reading. So, if
|
||||
you're currently in "/my/path/JavaScript-SpiderMonkey-v.vv", do this:
|
||||
|
||||
cp js-1.5-rc3a.tar.gz /my/path
|
||||
cd /my/path
|
||||
tar zxfv js-1.5-rc3a.tar.gz
|
||||
|
||||
Then, compile the SpiderMonkey distribution, if you're on Linux, just
|
||||
use:
|
||||
|
||||
cd js/src
|
||||
make -f Makefile.ref
|
||||
|
||||
It's important that the js and JavaScript-SpiderMonkey-v.vv directories
|
||||
are at the same level:
|
||||
|
||||
[/my/path]$ ls
|
||||
JavaScript-SpiderMonkey-v.vv
|
||||
js
|
||||
js-1.5-rc3a.tar.gz
|
||||
[/my/path]$
|
||||
|
||||
(Note that you *can* untar the SpiderMonkey distribution elsewhere, but,
|
||||
if so, then you need to edit the setting of $JSLIBPATH in Makefile.PL).
|
||||
|
||||
Next, you need to copy the shared library file thus constructed (e.g.,
|
||||
libjs.so or js32.dll) to an appropriate directory on your library path.
|
||||
On Windows, this can also be the directory where the perl executable
|
||||
lives. On Unix, this has been shown to work without copying, but this
|
||||
way you need to keep the compiled binary in the "js" build directory
|
||||
forever. Copying "js/src/Your_OS_DBG.OBJ/libjs.so" to "/usr/local/lib"
|
||||
and making sure that "/usr/local/lib" is in your "LD_LIBRARY_PATH" seems
|
||||
to be safest bet.
|
||||
|
||||
Now, build JavaScript::SpiderMonkey in the standard way:
|
||||
|
||||
cd JavaScript-SpiderMonkey-v.vv
|
||||
perl Makefile.PL
|
||||
make
|
||||
make test
|
||||
make install
|
||||
|
||||
AUTHOR
|
||||
Mike Schilli, <m@perlmeister.com>
|
||||
|
||||
COPYRIGHT AND LICENSE
|
||||
Copyright 2002 by Mike Schilli
|
||||
|
||||
This library is free software; you can redistribute it and/or modify it
|
||||
under the same terms as Perl itself.
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
|
||||
/* Strucuture that keeps track of contexts */
|
||||
struct PJS_Context {
|
||||
/* total number of branch_operations the runtime went through in this context */
|
||||
int branch_count;
|
||||
|
||||
/* max number of branch_operations allowed in this context */
|
||||
int branch_max;
|
||||
};
|
||||
|
||||
typedef struct PJS_Context PJS_Context;
|
||||
|
|
@ -1,707 +0,0 @@
|
|||
######################################################################
|
||||
package JavaScript::SpiderMonkey;
|
||||
######################################################################
|
||||
# Revision: $Revision: 1.8 $
|
||||
# Last Checkin: $Date: 2007/09/05 12:00:17 $
|
||||
# By: $Author: thomas_busch $
|
||||
#
|
||||
# Author: Mike Schilli m@perlmeister.com, 2002
|
||||
######################################################################
|
||||
|
||||
=head1 NAME
|
||||
|
||||
JavaScript::SpiderMonkey - Perl interface to the JavaScript Engine
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
use JavaScript::SpiderMonkey;
|
||||
|
||||
my $js = JavaScript::SpiderMonkey->new();
|
||||
|
||||
$js->init(); # Initialize Runtime/Context
|
||||
|
||||
# Define a perl callback for a new JavaScript function
|
||||
$js->function_set("print_to_perl", sub { print "@_\n"; });
|
||||
|
||||
# Create a new (nested) object and a property
|
||||
$js->property_by_path("document.location.href");
|
||||
|
||||
# Execute some code
|
||||
my $rc = $js->eval(q!
|
||||
document.location.href = append("http://", "www.aol.com");
|
||||
|
||||
print_to_perl("URL is ", document.location.href);
|
||||
|
||||
function append(first, second) {
|
||||
return first + second;
|
||||
}
|
||||
!);
|
||||
|
||||
# Get the value of a property set in JS
|
||||
my $url = $js->property_get("document.location.href");
|
||||
|
||||
$js->destroy();
|
||||
|
||||
=head1 INSTALL
|
||||
|
||||
JavaScript::SpiderMonkey requires Mozilla's readily compiled
|
||||
SpiderMonkey 1.5 distribution or better. Please check
|
||||
L<SpiderMonkey Installation>.
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
JavaScript::SpiderMonkey is a Perl Interface to the
|
||||
SpiderMonkey JavaScript Engine. It is different from
|
||||
Claes Jacobsson's C<JavaScript.pm> in that it offers two
|
||||
different levels of access:
|
||||
|
||||
=over 4
|
||||
|
||||
=item [1]
|
||||
|
||||
A 1:1 mapping of the SpiderMonkey API to Perl
|
||||
|
||||
=item [2]
|
||||
|
||||
A more Perl-like API
|
||||
|
||||
=back
|
||||
|
||||
This document describes [2], for [1], please check C<SpiderMonkey.xs>.
|
||||
|
||||
=cut
|
||||
|
||||
use 5.006;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Data::Dumper;
|
||||
use Log::Log4perl qw(:easy);
|
||||
|
||||
require Exporter;
|
||||
require DynaLoader;
|
||||
|
||||
our $VERSION = '0.19';
|
||||
our @ISA = qw(Exporter DynaLoader);
|
||||
our %EXPORT_TAGS = ( 'all' => [ qw() ] );
|
||||
our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
|
||||
our @EXPORT = qw();
|
||||
|
||||
bootstrap JavaScript::SpiderMonkey $VERSION;
|
||||
|
||||
our $GLOBAL;
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 new()
|
||||
|
||||
C<$js = JavaScript::SpiderMonkey-E<gt>new()> creates a new object to work with.
|
||||
To initialize the JS runtime, call C<$js-E<gt>init()> afterwards.
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub new {
|
||||
##################################################
|
||||
my ($class) = @_;
|
||||
|
||||
my $self = {
|
||||
'runtime' => undef,
|
||||
'context' => undef,
|
||||
'global_object' => undef,
|
||||
'global_class' => undef,
|
||||
'objects' => { },
|
||||
};
|
||||
|
||||
# The function dispatcher is called from C and
|
||||
# doesn't have 'self'. Store it in a class var.
|
||||
# This means we can only have one instance of this
|
||||
# JavaScript::SpiderMonkey object. Ouch.
|
||||
our $GLOBAL = $self;
|
||||
|
||||
bless $self, $class;
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>destroy()
|
||||
|
||||
C<$js-E<gt>destroy()> destroys the current runtime and frees up all memory.
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub destroy {
|
||||
##################################################
|
||||
my ($self) = @_;
|
||||
JavaScript::SpiderMonkey::JS_DestroyContext($self->{context});
|
||||
JavaScript::SpiderMonkey::JS_DestroyRuntime($self->{runtime});
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>init()
|
||||
|
||||
C<$js-E<gt>init()> initializes the SpiderMonkey engine by creating a context,
|
||||
default classes and objects and adding an error reporter.
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub init {
|
||||
##################################################
|
||||
my ($self) = @_;
|
||||
|
||||
$self->{runtime} =
|
||||
JavaScript::SpiderMonkey::JS_Init(1000000);
|
||||
$self->{context} =
|
||||
JavaScript::SpiderMonkey::JS_NewContext($self->{runtime}, 8192);
|
||||
$self->{global_class} =
|
||||
JavaScript::SpiderMonkey::JS_GlobalClass();
|
||||
$self->{global_object} =
|
||||
JavaScript::SpiderMonkey::JS_NewObject(
|
||||
$self->{context}, $self->{global_class},
|
||||
$self->{global_class}, $self->{global_class});
|
||||
|
||||
JavaScript::SpiderMonkey::JS_InitStandardClasses($self->{context},
|
||||
$self->{global_object});
|
||||
JavaScript::SpiderMonkey::JS_SetErrorReporter($self->{context});
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>array_by_path($name)
|
||||
|
||||
Creates an object of type I<Array>
|
||||
in the JS runtime:
|
||||
|
||||
$js->array_by_path("document.form");
|
||||
|
||||
will first create an object with the name C<document> (unless
|
||||
it exists already) and then define a property named C<form> to it,
|
||||
which is an object of type I<Array>. Therefore, in the JS code,
|
||||
you're going to be able define things like
|
||||
|
||||
document.form[0] = "value";
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub array_by_path {
|
||||
##################################################
|
||||
my ($self, $path) = @_;
|
||||
|
||||
my $array = JavaScript::SpiderMonkey::JS_NewArrayObject($self->{context});
|
||||
return $self->object_by_path($path, $array);
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>function_set($name, $funcref, [$obj])
|
||||
|
||||
Binds a Perl function provided as a coderef (C<$funcref>)
|
||||
to a newly created JS function
|
||||
named C<$name> in JS land.
|
||||
It's a real function (therefore bound to the global object) if C<$obj>
|
||||
is omitted. However, if C<$obj> is ref to
|
||||
a JS object (retrieved via C<$js-E<gt>object_by_path($path)> or the like),
|
||||
the function will be a I<method> of the specified object.
|
||||
|
||||
$js->function_set("write", sub { print @_ });
|
||||
# write("hello"); // In JS land
|
||||
|
||||
$obj = $j->object_by_path("navigator");
|
||||
$js->function_set("write", sub { print @_ }, $obj);
|
||||
# navigator.write("hello"); // In JS land
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub function_set {
|
||||
##################################################
|
||||
my ($self, $name, $func, $obj) = @_;
|
||||
|
||||
$obj ||= $self->{global_object}; # Defaults to global object
|
||||
|
||||
$self->{functions}->{${$obj}}->{$name} = $func;
|
||||
|
||||
return JavaScript::SpiderMonkey::JS_DefineFunction(
|
||||
$self->{context}, $obj, $name, 0, 0);
|
||||
}
|
||||
|
||||
##################################################
|
||||
sub function_dispatcher {
|
||||
##################################################
|
||||
my ($obj, $name, @args) = @_;
|
||||
|
||||
DEBUG "Dispatching function $obj-$name-@args";
|
||||
|
||||
our $GLOBAL;
|
||||
|
||||
## Find the path for this object.
|
||||
my $found = 0;
|
||||
foreach( keys( %{$GLOBAL->{objects}} ) ){
|
||||
if( ${$GLOBAL->{objects}->{$_}} eq $obj &&
|
||||
exists( $GLOBAL->{functions}->{$obj}->{$name} ) ){
|
||||
DEBUG "Function found";
|
||||
$found = 1;
|
||||
}
|
||||
}
|
||||
$obj = ${$GLOBAL->{global_object}} unless $found;
|
||||
|
||||
if(! exists $GLOBAL->{functions}->{$obj}->{$name}) {
|
||||
LOGDIE "Dispatcher: Can't find mapping for function $obj" .
|
||||
${$GLOBAL->{global_object}} . " '$name'";
|
||||
}
|
||||
|
||||
my $val = $GLOBAL->{functions}->{$obj}->{$name}->(@args);
|
||||
|
||||
DEBUG "retval=$val";
|
||||
|
||||
return $val;
|
||||
}
|
||||
|
||||
##################################################
|
||||
sub getsetter_dispatcher {
|
||||
##################################################
|
||||
my ($obj, $propname, $what, $value) = @_;
|
||||
|
||||
our $GLOBAL;
|
||||
|
||||
DEBUG "Dispatcher obj=$obj";
|
||||
DEBUG "prop=$propname what=$what value=$value";
|
||||
|
||||
DEBUG "GETTING properties/$obj/$propname/$what";
|
||||
|
||||
if(exists $GLOBAL->{properties}->{$obj}->{$propname}->{$what}) {
|
||||
my $entry = $GLOBAL->{properties}->{$obj}->{$propname}->{$what};
|
||||
my $path = $entry->{path};
|
||||
DEBUG "DISPATCHING for object $path ($what)";
|
||||
$entry->{callback}->($path, $value);
|
||||
} else {
|
||||
DEBUG "properties/$obj/$propname/$what doesn't exist";
|
||||
}
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>array_set_element($obj, $idx, $val)
|
||||
|
||||
Sets the element of the array C<$obj>
|
||||
at index position C<$idx> to the value C<$val>.
|
||||
C<$obj> is a reference to an object of type array
|
||||
(retrieved via C<$js-E<gt>object_by_path($path)> or the like).
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub array_set_element {
|
||||
##################################################
|
||||
my ($self, $obj, $idx, $val) = @_;
|
||||
|
||||
DEBUG "Setting $idx of $obj ($self->{context}) to $val";
|
||||
JavaScript::SpiderMonkey::JS_SetElement(
|
||||
$self->{context}, $obj, $idx, $val);
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>array_set_element_as_object($obj, $idx, $elobj)
|
||||
|
||||
Sets the element of the array C<$obj>
|
||||
at index position C<$idx> to the object C<$elobj>
|
||||
(both C<$obj> and C<$elobj> have been retrieved
|
||||
via C<$js-E<gt>object_by_path($path)> or the like).
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub array_set_element_as_object {
|
||||
##################################################
|
||||
my ($self, $obj, $idx, $elobj) = @_;
|
||||
|
||||
JavaScript::SpiderMonkey::JS_SetElementAsObject(
|
||||
$self->{context}, $obj, $idx, $elobj);
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>array_get_element($obj, $idx)
|
||||
|
||||
Gets the value of of the element at index C<$idx>
|
||||
of the object of type Array C<$obj>.
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub array_get_element {
|
||||
##################################################
|
||||
my ($self, $obj, $idx) = @_;
|
||||
|
||||
my $rc = JavaScript::SpiderMonkey::JS_GetElement(
|
||||
$self->{context}, $obj, $idx);
|
||||
|
||||
DEBUG("Getting $idx of $obj ($self->{context}): ",
|
||||
($rc || "undef"));
|
||||
|
||||
return $rc;
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>property_by_path($path, $value, [$getter], [$setter])
|
||||
|
||||
Sets the specified property of an object in C<$path> to the
|
||||
value C<$value>. C<$path> is the full name of the property,
|
||||
including the object(s) in JS land it belongs to:
|
||||
|
||||
$js-E<gt>property_by_path("document.location.href", "abc");
|
||||
|
||||
This first creates the object C<document> (if it doesn't exist already),
|
||||
then the object C<document.location>, then attaches the property
|
||||
C<href> to it and sets it to C<"abc">.
|
||||
|
||||
C<$getter> and C<$setter> are coderefs that will be called by
|
||||
the JavaScript engine when the respective property's value is
|
||||
requested or set:
|
||||
|
||||
sub getter {
|
||||
my($property_path, $value) = @_;
|
||||
print "$property_path has value $value\n";
|
||||
}
|
||||
|
||||
sub setter {
|
||||
my($property_path, $value) = @_;
|
||||
print "$property_path set to value $value\n";
|
||||
}
|
||||
|
||||
$js-E<gt>property_by_path("document.location.href", "abc",
|
||||
\&getter, \&setter);
|
||||
|
||||
If you leave out C<$getter> and C<$setter>, there's going to be no
|
||||
callbacks triggerd while the properity is set or queried.
|
||||
If you just want to specify a C<$setter>, but no C<$getter>,
|
||||
set the C<$getter> to C<undef>.
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub property_by_path {
|
||||
##################################################
|
||||
my ($self, $path, $value, $getter, $setter) = @_;
|
||||
|
||||
DEBUG "Retrieve/Create property $path";
|
||||
|
||||
(my $opath = $path) =~ s/\.[^.]+$//;
|
||||
my $obj = $self->object_by_path($opath);
|
||||
unless(defined $obj) {
|
||||
LOGWARN "No object pointer found to $opath";
|
||||
return undef;
|
||||
}
|
||||
|
||||
DEBUG "$opath: obj=$obj";
|
||||
|
||||
$value = 'undef' unless defined $value;
|
||||
|
||||
DEBUG "Define property $self->{context}, $obj, $path, $value";
|
||||
|
||||
(my $property = $path) =~ s/.*\.//;
|
||||
|
||||
my $prop = JavaScript::SpiderMonkey::JS_DefineProperty(
|
||||
$self->{context}, $obj, $property, $value);
|
||||
|
||||
DEBUG "SETTING properties/$$obj/$property/getter";
|
||||
if($getter) {
|
||||
# Store it under the original C pointer's value. We get
|
||||
# back a PTRREF from JS_DefineObject, but we need the
|
||||
# original value for the callback dispatcher.
|
||||
$self->{properties}->{$$obj}->{$property}->{getter}->{callback}
|
||||
= $getter;
|
||||
$self->{properties}->{$$obj}->{$property}->{getter}->{path} = $path;
|
||||
}
|
||||
|
||||
if($setter) {
|
||||
$self->{properties}->{$$obj}->{$property}->{setter}->{callback}
|
||||
= $setter;
|
||||
$self->{properties}->{$$obj}->{$property}->{setter}->{path} = $path;
|
||||
}
|
||||
|
||||
return $prop;
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>object_by_path($path, [$newobj])
|
||||
|
||||
Get a pointer to an object with the path
|
||||
specified. Create it if it's not there yet.
|
||||
If C<$newobj> is provided, the ref is used to
|
||||
bind the existing object to the name in C<$path>.
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub object_by_path {
|
||||
##################################################
|
||||
my ($self, $path, $newobj) = @_;
|
||||
|
||||
DEBUG "Retrieve/Create object $path";
|
||||
|
||||
DEBUG "Got a ", defined $newobj ? "predefined" : "undefined",
|
||||
" object";
|
||||
|
||||
my $obj = $self->{global_object};
|
||||
|
||||
my @parts = split /\./, $path;
|
||||
my $full = "";
|
||||
|
||||
return undef unless @parts;
|
||||
|
||||
while(@parts >= 1) {
|
||||
my $part = shift @parts;
|
||||
$full .= "." if $full;
|
||||
$full .= "$part";
|
||||
|
||||
if(exists $self->{objects}->{$full}) {
|
||||
$obj = $self->{objects}->{$full};
|
||||
DEBUG "Object $full exists: $obj";
|
||||
} else {
|
||||
my $gobj = $self->{global_object};
|
||||
if(defined $newobj and $path eq $full) {
|
||||
DEBUG "Setting $path to predefined object";
|
||||
$obj = JavaScript::SpiderMonkey::JS_DefineObject(
|
||||
$self->{context}, $obj, $part,
|
||||
JavaScript::SpiderMonkey::JS_GetClass($self->{context}, $newobj),
|
||||
$newobj);
|
||||
} else {
|
||||
$obj = JavaScript::SpiderMonkey::JS_DefineObject(
|
||||
$self->{context}, $obj, $part,
|
||||
$self->{global_class}, $self->{global_object});
|
||||
}
|
||||
$self->{objects}->{$full} = $obj;
|
||||
DEBUG "Object $full created: $obj";
|
||||
}
|
||||
}
|
||||
|
||||
return $obj;
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>property_get($path)
|
||||
|
||||
Fetch the property specified by the C<$path>.
|
||||
|
||||
my $val = $js->property_get("document.location.href");
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub property_get {
|
||||
##################################################
|
||||
my ($self, $string) = @_;
|
||||
|
||||
my($path, $property) = ($string =~ /(.*)\.([^\.]+)$/);
|
||||
|
||||
if(!exists $self->{objects}->{$path}) {
|
||||
LOGWARN "Cannot find object $path via SpiderMonkey";
|
||||
return;
|
||||
}
|
||||
|
||||
DEBUG "Get property $self->{objects}->{$path}, $property";
|
||||
|
||||
return JavaScript::SpiderMonkey::JS_GetProperty(
|
||||
$self->{context}, $self->{objects}->{$path},
|
||||
$property);
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>eval($code)
|
||||
|
||||
Runs the specified piece of <$code> in the JS engine.
|
||||
Afterwards, property values of objects previously defined
|
||||
will be available via C<$j-E<gt>property_get($path)>
|
||||
and the like.
|
||||
|
||||
my $rc = $js->eval("write('hello');");
|
||||
|
||||
The method returns C<1> on success or else if
|
||||
there was an error in JS land. In case of an error, the JS
|
||||
error text will be available in C<$@>.
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub eval {
|
||||
##################################################
|
||||
my ($self, $script) = @_;
|
||||
|
||||
return 1 unless defined $script;
|
||||
|
||||
my $ok =
|
||||
JavaScript::SpiderMonkey::JS_EvaluateScript(
|
||||
$self->{context},
|
||||
$self->{global_object},
|
||||
$script,
|
||||
$] > 5.007 ? bytes::length($script) : length($script),
|
||||
"Perl",
|
||||
0);
|
||||
|
||||
return $ok;
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>ret_eval($code)
|
||||
|
||||
Runs the specified piece of <$code> in the JS engine.
|
||||
Differs from eval because it returns the results of
|
||||
the last executed expression from the JS context.
|
||||
|
||||
my $value = $js->ret_eval("2+2");
|
||||
|
||||
The method returns the result of the last evaluated
|
||||
JS expression. In case of an error, the JS
|
||||
error text will be available in C<$@>.
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub ret_eval {
|
||||
##################################################
|
||||
my ($self, $script) = @_;
|
||||
|
||||
return 1 unless defined $script;
|
||||
|
||||
no warnings 'uninitialized'; #Silence a spurious undef warning I can't track down.
|
||||
my $ok =
|
||||
JavaScript::SpiderMonkey::JS_RetEvaluateScript(
|
||||
$self->{context},
|
||||
$self->{global_object},
|
||||
$script,
|
||||
#$] > 5.007 ? bytes::length($script) : length($script),
|
||||
length($script),
|
||||
"Perl",
|
||||
0);
|
||||
|
||||
return $ok;
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>set_max_branch_operations($max_branch_operations)
|
||||
|
||||
Set the maximum number of allowed branch operations. This protects
|
||||
against infinite loops and guarantees that the eval operation
|
||||
will terminate.
|
||||
|
||||
=cut
|
||||
##################################################
|
||||
sub set_max_branch_operations {
|
||||
##################################################
|
||||
my ($self, $max_branch_operations) = @_;
|
||||
JavaScript::SpiderMonkey::JS_SetMaxBranchOperations($self->{context}, $max_branch_operations);
|
||||
}
|
||||
|
||||
##################################################
|
||||
sub dump {
|
||||
##################################################
|
||||
my ($self) = @_;
|
||||
|
||||
Data::Dumper::Dumper($self->{objects});
|
||||
}
|
||||
|
||||
##################################################
|
||||
sub debug_enabled {
|
||||
##################################################
|
||||
my $logger = Log::Log4perl::get_logger("JavaScript::SpiderMonkey");
|
||||
if(Log::Log4perl->initialized() and $logger->is_debug()) {
|
||||
# print "DEBUG IS ENABLED\n";
|
||||
return 1;
|
||||
} else {
|
||||
# print "DEBUG IS DISABLED\n";
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 SpiderMonkey Installation
|
||||
|
||||
First, get the latest SpiderMonkey distribution from mozilla.org:
|
||||
http://www.mozilla.org/js/spidermonkey shows which releases are available.
|
||||
C<js-1.6.tar.gz> has been proven to work.
|
||||
|
||||
Untar it at the same directory level as you just untarred the
|
||||
C<JavaScript::SpiderMonkey> distribution you're currently reading.
|
||||
So, if you're currently in C</my/path/JavaScript-SpiderMonkey-v.vv>, do
|
||||
this:
|
||||
|
||||
cp js-1.6.tar.gz /my/path
|
||||
cd /my/path
|
||||
tar zxfv js-1.6.tar.gz
|
||||
|
||||
Then, compile the SpiderMonkey distribution, if you're on Linux,
|
||||
just use:
|
||||
|
||||
cd js/src
|
||||
make -f Makefile.ref
|
||||
|
||||
It's important that the js and JavaScript-SpiderMonkey-v.vv directories
|
||||
are at the same level:
|
||||
|
||||
[/my/path]$ ls
|
||||
JavaScript-SpiderMonkey-v.vv
|
||||
js
|
||||
js-1.6.tar.gz
|
||||
[/my/path]$
|
||||
|
||||
(Note that you *can* untar the SpiderMonkey distribution elsewhere,
|
||||
but, if so, then you need to edit the setting of $JSLIBPATH in Makefile.PL).
|
||||
|
||||
Next, you need to copy the shared library file thus constructed
|
||||
(e.g., libjs.so or js32.dll) to an appropriate directory on your library path.
|
||||
On Windows, this can also be the directory where the perl executable
|
||||
lives. On Unix, this has been shown to work without copying, but this way
|
||||
you need to keep the compiled binary in the C<js> build directory forever.
|
||||
Copying
|
||||
C<js/src/Your_OS_DBG.OBJ/libjs.so> to C</usr/local/lib> and
|
||||
making sure that C</usr/local/lib> is in your C<LD_LIBRARY_PATH>
|
||||
seems to be safest bet.
|
||||
|
||||
Now, build JavaScript::SpiderMonkey in the standard way:
|
||||
|
||||
cd JavaScript-SpiderMonkey-v.vv
|
||||
perl Makefile.PL
|
||||
make
|
||||
make test
|
||||
make install
|
||||
|
||||
=head1 E4X SUPPORT
|
||||
|
||||
To build JavaScript-SpiderMonkey with E4X (ECMAScript for XML) support:
|
||||
|
||||
perl Makefile.PL -E4X
|
||||
|
||||
Please note that E4X support is only supported since SpiderMonkey release 1.6.
|
||||
|
||||
=head1 THREAD SAFETY
|
||||
|
||||
To build JavaScript-SpiderMonkey when using a thread safe version of SpiderMonkey:
|
||||
|
||||
perl Makefile.PL -JS_THREADSAFE
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Mike Schilli, <m at perlmeister dot com>
|
||||
Thomas Busch, <tbusch at cpan dot org> (current maintainer)
|
||||
|
||||
=head1 COPYRIGHT AND LICENSE
|
||||
|
||||
Copyright (c) 2002-2005 Mike Schilli
|
||||
Copyright (c) 2006-2007 Thomas Busch
|
||||
|
||||
This library is free software; you can redistribute it and/or modify
|
||||
it under the same terms as Perl itself.
|
|
@ -1,824 +0,0 @@
|
|||
/* --------------------------------------------------------------------- */
|
||||
/* SpiderMonkey.xs -- Perl Interface to the SpiderMonkey JavaScript */
|
||||
/* implementation. */
|
||||
/* */
|
||||
/* Revision: $Revision: 1.6 $ */
|
||||
/* Last Checkin: $Date: 2007/06/08 19:03:08 $ */
|
||||
/* By: $Author: thomas_busch $ */
|
||||
/* */
|
||||
/* Author: Mike Schilli mschilli1@aol.com, 2001 */
|
||||
/* --------------------------------------------------------------------- */
|
||||
|
||||
#include "EXTERN.h"
|
||||
#include "perl.h"
|
||||
#include "XSUB.h"
|
||||
#include "jsapi.h"
|
||||
#include "SpiderMonkey.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
/* As suggested in https://rt.cpan.org/Ticket/Display.html?id=6984 */
|
||||
#define snprintf _snprintf
|
||||
#endif
|
||||
|
||||
/* JSRuntime needs this global class */
|
||||
static
|
||||
JSClass global_class = {
|
||||
"Global", 0,
|
||||
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
|
||||
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub
|
||||
};
|
||||
|
||||
static int Debug = 0;
|
||||
|
||||
static int max_branch_operations = 0;
|
||||
|
||||
/*==================================*/
|
||||
/* Begin Dirty Hackery */
|
||||
/*==================================*/
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
int obj_to_str(
|
||||
JSContext *cx,
|
||||
JSObject *obj,
|
||||
SV *perl_str
|
||||
/* --------------------------------------------------------------------- */
|
||||
) {
|
||||
JSIdArray *fields = JS_Enumerate( cx, obj );
|
||||
int i = 0;
|
||||
jsval property;
|
||||
|
||||
sv_catpvn( perl_str, "{ ", 2 );
|
||||
/*printf("OBJ_TO_STR\n");
|
||||
printf("Length: %i\n", fields->length);*/
|
||||
|
||||
for( i = 0; i < fields->length; i++ )
|
||||
{
|
||||
jsid id = fields->vector[i];
|
||||
jsval id_val;
|
||||
char *prop_name;
|
||||
|
||||
JS_IdToValue( cx, id, &id_val );
|
||||
prop_name = JS_GetStringBytes(JS_ValueToString(cx, id_val));
|
||||
JS_GetProperty( cx, obj, prop_name, &property );
|
||||
|
||||
/* printf("Adding %s to pv\n", prop_name); */
|
||||
sv_catpvn( perl_str, prop_name, strlen( prop_name ) );
|
||||
sv_catpvn( perl_str, ": ", 2 );
|
||||
/* printf( "Str: %s\n", SvPVbyte_nolen( perl_str ) ); */
|
||||
|
||||
if( JSVAL_IS_OBJECT( property ) )
|
||||
{
|
||||
JSObject *prop_obj;
|
||||
JS_ValueToObject( cx, property, &prop_obj );
|
||||
obj_to_str( cx, prop_obj, perl_str );
|
||||
}
|
||||
else
|
||||
{
|
||||
JSString *prop_str = JS_ValueToString( cx, property );
|
||||
sv_catpvn( perl_str, JS_GetStringBytes( prop_str ), JS_GetStringLength( prop_str ) );
|
||||
/*sv_catpvn( perl_str, " ", 1 );*/
|
||||
}
|
||||
|
||||
if( i < ( fields->length - 1 ) )
|
||||
{
|
||||
sv_catpvn( perl_str, ", ", 2 );
|
||||
}
|
||||
}
|
||||
|
||||
sv_catpvn( perl_str, "}", 1 );
|
||||
JS_DestroyIdArray( cx, fields );
|
||||
return 1;
|
||||
}
|
||||
/*==================================*/
|
||||
/* End Dirty Hackery */
|
||||
/*==================================*/
|
||||
|
||||
/* It's kinda silly that we have to replicate this for getters and setters,
|
||||
* but there doesn't seem to be a way to distinguish between getters
|
||||
* and setters if we use the same function. (Somewhere I read in a
|
||||
* usenet posting there's something like IS_ASSIGN, but this doesn't
|
||||
* seem to be in SpiderMonkey 1.5).
|
||||
*/
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
JSBool getsetter_dispatcher(
|
||||
JSContext *cx,
|
||||
JSObject *obj,
|
||||
jsval id,
|
||||
jsval *vp,
|
||||
char *what
|
||||
/* --------------------------------------------------------------------- */
|
||||
) {
|
||||
dSP;
|
||||
|
||||
/* Call back into perl */
|
||||
ENTER ;
|
||||
SAVETMPS ;
|
||||
PUSHMARK(SP);
|
||||
/* A somewhat nasty trick: Since JS_DefineObject() down below
|
||||
* returns a *JS_Object, which is typemapped as T_PTRREF,
|
||||
* and which is a reference (!) pointing to the real C pointer,
|
||||
* we need to brutally obtain the obj's address by casting
|
||||
* it to an int and forming a scalar out of it.
|
||||
* On the other hand, when Spidermonkey.pm stores the
|
||||
* object's setters/getters, it will dereference
|
||||
* what it gets from JS_DefineObject() (therefore
|
||||
* obtain the object's address in memory) to index its
|
||||
* hash table.
|
||||
* I hope all reasonable machines can hold an address in
|
||||
* an int.
|
||||
*/
|
||||
XPUSHs(sv_2mortal(newSViv((int)obj)));
|
||||
XPUSHs(sv_2mortal(newSVpv(JS_GetStringBytes(JSVAL_TO_STRING(id)), 0)));
|
||||
XPUSHs(sv_2mortal(newSVpv(what, 0)));
|
||||
XPUSHs(sv_2mortal(newSVpv(JS_GetStringBytes(JSVAL_TO_STRING(*vp)), 0)));
|
||||
PUTBACK;
|
||||
call_pv("JavaScript::SpiderMonkey::getsetter_dispatcher", G_DISCARD);
|
||||
FREETMPS;
|
||||
LEAVE;
|
||||
|
||||
return JS_TRUE;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
JSBool getter_dispatcher(
|
||||
JSContext *cx,
|
||||
JSObject *obj,
|
||||
jsval id,
|
||||
jsval *vp
|
||||
/* --------------------------------------------------------------------- */
|
||||
) {
|
||||
return getsetter_dispatcher(cx, obj, id, vp, "getter");
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
JSBool setter_dispatcher(
|
||||
JSContext *cx,
|
||||
JSObject *obj,
|
||||
jsval id,
|
||||
jsval *vp
|
||||
/* --------------------------------------------------------------------- */
|
||||
) {
|
||||
return getsetter_dispatcher(cx, obj, id, vp, "setter");
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
int debug_enabled(
|
||||
/* --------------------------------------------------------------------- */
|
||||
) {
|
||||
dSP;
|
||||
|
||||
int enabled = 0;
|
||||
int count = 0;
|
||||
|
||||
/* Call back into perl */
|
||||
ENTER ;
|
||||
SAVETMPS ;
|
||||
PUTBACK;
|
||||
count = call_pv("JavaScript::SpiderMonkey::debug_enabled", G_SCALAR);
|
||||
if(count == 1) {
|
||||
if(POPi == 1) {
|
||||
enabled = 1;
|
||||
}
|
||||
}
|
||||
FREETMPS;
|
||||
LEAVE;
|
||||
|
||||
return enabled;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
static JSBool
|
||||
FunctionDispatcher(JSContext *cx, JSObject *obj, uintN argc,
|
||||
jsval *argv, jsval *rval) {
|
||||
/* --------------------------------------------------------------------- */
|
||||
dSP;
|
||||
SV *sv;
|
||||
char *n_jstr;
|
||||
int n_jnum;
|
||||
double n_jdbl;
|
||||
unsigned i;
|
||||
int count;
|
||||
JSFunction *fun;
|
||||
fun = JS_ValueToFunction(cx, argv[-2]);
|
||||
|
||||
/* printf("Function %s received %d arguments\n",
|
||||
(char *) JS_GetFunctionName(fun),
|
||||
(int) argc); */
|
||||
|
||||
/* Call back into perl */
|
||||
ENTER ;
|
||||
SAVETMPS ;
|
||||
PUSHMARK(SP);
|
||||
XPUSHs(sv_2mortal(newSViv((int)obj)));
|
||||
XPUSHs(sv_2mortal(newSVpv(
|
||||
JS_GetFunctionName(fun), 0)));
|
||||
for(i=0; i<argc; i++) {
|
||||
XPUSHs(sv_2mortal(newSVpv(
|
||||
JS_GetStringBytes(JS_ValueToString(cx, argv[i])), 0)));
|
||||
}
|
||||
PUTBACK;
|
||||
count = call_pv("JavaScript::SpiderMonkey::function_dispatcher", G_SCALAR);
|
||||
SPAGAIN;
|
||||
|
||||
if(Debug)
|
||||
fprintf(stderr, "DEBUG: Count is %d\n", count);
|
||||
|
||||
if( count > 0) {
|
||||
sv = POPs;
|
||||
if(SvROK(sv)) {
|
||||
/* Im getting a perl reference here, the user
|
||||
* seems to want to send a perl object to jscript
|
||||
* ok, we will do it, although it seems like a painful
|
||||
* thing to me.
|
||||
*/
|
||||
|
||||
if(Debug)
|
||||
fprintf(stderr, "DEBUG: %lx is a ref!\n", (long) sv);
|
||||
*rval = OBJECT_TO_JSVAL(SvIV(SvRV(sv)));
|
||||
}
|
||||
else if(SvIOK(sv)) {
|
||||
/* It appears that we have been sent an int return
|
||||
* value. Thats fine we can give javascript an int
|
||||
*/
|
||||
n_jnum=SvIV(sv);
|
||||
if(Debug)
|
||||
fprintf(stderr, "DEBUG: %lx is an int (%d)\n", (long) sv,n_jnum);
|
||||
*rval = INT_TO_JSVAL(n_jnum);
|
||||
} else if(SvNOK(sv)) {
|
||||
/* It appears that we have been sent an double return
|
||||
* value. Thats fine we can give javascript an double
|
||||
*/
|
||||
n_jdbl=SvNV(sv);
|
||||
|
||||
if(Debug)
|
||||
fprintf(stderr, "DEBUG: %lx is a double(%f)\n", (long) sv,n_jdbl);
|
||||
*rval = DOUBLE_TO_JSVAL(JS_NewDouble(cx, n_jdbl));
|
||||
} else if(SvPOK(sv)) {
|
||||
n_jstr = SvPV(sv, PL_na);
|
||||
//warn("DEBUG: %s (%d)\n", n_jstr);
|
||||
*rval = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, n_jstr));
|
||||
}
|
||||
}
|
||||
|
||||
PUTBACK;
|
||||
FREETMPS;
|
||||
LEAVE;
|
||||
|
||||
return JS_TRUE;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
static void
|
||||
ErrorReporter(JSContext *cx, const char *message, JSErrorReport *report) {
|
||||
/* --------------------------------------------------------------------- */
|
||||
char msg[400];
|
||||
snprintf(msg, sizeof(msg),
|
||||
"Error: %s at line %d: %s", message, report->lineno,
|
||||
report->linebuf);
|
||||
sv_setpv(get_sv("@", TRUE), msg);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
static JSBool
|
||||
BranchHandler(JSContext *cx, JSScript *script) {
|
||||
/* --------------------------------------------------------------------- */
|
||||
PJS_Context* pcx = (PJS_Context*) JS_GetContextPrivate(cx);
|
||||
|
||||
pcx->branch_count++;
|
||||
if (pcx->branch_count > pcx->branch_max) {
|
||||
return JS_FALSE;
|
||||
} else {
|
||||
return JS_TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
MODULE = JavaScript::SpiderMonkey PACKAGE = JavaScript::SpiderMonkey
|
||||
PROTOTYPES: DISABLE
|
||||
|
||||
######################################################################
|
||||
char *
|
||||
JS_GetImplementationVersion()
|
||||
######################################################################
|
||||
CODE:
|
||||
{
|
||||
RETVAL = (char *) JS_GetImplementationVersion();
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
JSRuntime *
|
||||
JS_NewRuntime(maxbytes)
|
||||
int maxbytes
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSRuntime *rt;
|
||||
CODE:
|
||||
{
|
||||
rt = JS_NewRuntime(maxbytes);
|
||||
if(!rt) {
|
||||
XSRETURN_UNDEF;
|
||||
}
|
||||
RETVAL = rt;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
int
|
||||
JS_DestroyRuntime(rt)
|
||||
JSRuntime *rt
|
||||
######################################################################
|
||||
CODE:
|
||||
{
|
||||
JS_DestroyRuntime(rt);
|
||||
RETVAL = 0;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
JSRuntime *
|
||||
JS_Init(maxbytes)
|
||||
int maxbytes
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSRuntime *rt;
|
||||
CODE:
|
||||
{
|
||||
rt = JS_Init(maxbytes);
|
||||
if(!rt) {
|
||||
XSRETURN_UNDEF;
|
||||
}
|
||||
/* Replace this by Debug = debug_enabled(); once
|
||||
* Log::Log4perl 0.47 is out */
|
||||
Debug = 0;
|
||||
RETVAL = rt;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
JSContext *
|
||||
JS_NewContext(rt, stack_chunk_size)
|
||||
JSRuntime *rt
|
||||
int stack_chunk_size
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSContext *cx;
|
||||
CODE:
|
||||
{
|
||||
PJS_Context* pcx;
|
||||
cx = JS_NewContext(rt, stack_chunk_size);
|
||||
if(!cx) {
|
||||
XSRETURN_UNDEF;
|
||||
}
|
||||
#ifdef E4X
|
||||
JS_SetOptions(cx,JSOPTION_XML);
|
||||
#endif
|
||||
|
||||
Newz(1, pcx, 1, PJS_Context);
|
||||
JS_SetContextPrivate(cx, (void *)pcx);
|
||||
|
||||
RETVAL = cx;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
int
|
||||
JS_DestroyContext(cx)
|
||||
JSContext *cx;
|
||||
######################################################################
|
||||
CODE:
|
||||
{
|
||||
JS_DestroyContext(cx);
|
||||
Safefree(JS_GetContextPrivate(cx));
|
||||
RETVAL = 0;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
JSObject *
|
||||
JS_NewObject(cx, class, proto, parent)
|
||||
JSContext * cx
|
||||
JSClass * class
|
||||
JSObject * proto
|
||||
JSObject * parent
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSObject *obj;
|
||||
CODE:
|
||||
{
|
||||
obj = JS_NewObject(cx, class, NULL, NULL);
|
||||
if(!obj) {
|
||||
XSRETURN_UNDEF;
|
||||
}
|
||||
RETVAL = obj;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
JSObject *
|
||||
JS_InitClass(cx, iobj, parent_proto, clasp, constructor, nargs, ps, fs, static_ps, static_fs)
|
||||
JSContext * cx
|
||||
JSObject *iobj
|
||||
JSObject *parent_proto
|
||||
JSClass *clasp
|
||||
JSNative constructor
|
||||
int nargs
|
||||
JSPropertySpec *ps
|
||||
JSFunctionSpec *fs
|
||||
JSPropertySpec *static_ps
|
||||
JSFunctionSpec *static_fs
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSObject *obj;
|
||||
uintN na;
|
||||
INIT:
|
||||
na = (uintN) nargs;
|
||||
CODE:
|
||||
{
|
||||
obj = JS_InitClass(cx, iobj, parent_proto, clasp,
|
||||
constructor, nargs, ps, fs, static_ps,
|
||||
static_fs);
|
||||
if(!obj) {
|
||||
XSRETURN_UNDEF;
|
||||
}
|
||||
RETVAL = obj;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
JSClass *
|
||||
JS_GlobalClass()
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSClass *gc;
|
||||
CODE:
|
||||
{
|
||||
gc = &global_class;
|
||||
RETVAL = gc;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
void
|
||||
JS_ForceLatest(cx)
|
||||
JSContext * cx
|
||||
######################################################################
|
||||
CODE:
|
||||
{
|
||||
JS_SetVersion(cx, JSVERSION_LATEST);
|
||||
}
|
||||
|
||||
######################################################################
|
||||
char*
|
||||
JS_RetEvaluateScript(cx, gobj, script, length, filename, lineno)
|
||||
JSContext * cx
|
||||
JSObject * gobj
|
||||
char * script
|
||||
int length
|
||||
char * filename
|
||||
int lineno
|
||||
######################################################################
|
||||
PREINIT:
|
||||
uintN len;
|
||||
uintN ln;
|
||||
int rc;
|
||||
jsval jsval;
|
||||
JSString *js_string;
|
||||
char *return_string;
|
||||
INIT:
|
||||
len = (uintN) length;
|
||||
ln = (uintN) lineno;
|
||||
CODE:
|
||||
{
|
||||
rc = JS_EvaluateScript(cx, gobj, script, len, filename,
|
||||
ln, &jsval);
|
||||
if(!rc) {
|
||||
XSRETURN_UNDEF;
|
||||
}
|
||||
|
||||
if( JSVAL_IS_OBJECT(jsval) )
|
||||
{
|
||||
SV* sv = NEWSV(5,10);
|
||||
JSObject *obj;
|
||||
JS_ValueToObject( cx, jsval, &obj );
|
||||
obj_to_str(cx,obj,sv);
|
||||
RETVAL = SvPVbyte_nolen( sv );
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
js_string = JS_ValueToString(cx, jsval);
|
||||
return_string = JS_GetStringBytes(js_string);
|
||||
RETVAL = return_string;
|
||||
}
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
int
|
||||
JS_EvaluateScript(cx, gobj, script, length, filename, lineno)
|
||||
JSContext * cx
|
||||
JSObject * gobj
|
||||
char * script
|
||||
int length
|
||||
char * filename
|
||||
int lineno
|
||||
######################################################################
|
||||
PREINIT:
|
||||
uintN len;
|
||||
uintN ln;
|
||||
int rc;
|
||||
jsval jsval;
|
||||
INIT:
|
||||
len = (uintN) length;
|
||||
ln = (uintN) lineno;
|
||||
CODE:
|
||||
{
|
||||
rc = JS_EvaluateScript(cx, gobj, script, len, filename,
|
||||
ln, &jsval);
|
||||
if(!rc) {
|
||||
XSRETURN_UNDEF;
|
||||
}
|
||||
RETVAL = rc;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
int
|
||||
JS_InitStandardClasses(cx, gobj)
|
||||
JSContext * cx
|
||||
JSObject * gobj
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSBool rc;
|
||||
CODE:
|
||||
{
|
||||
rc = JS_InitStandardClasses(cx, gobj);
|
||||
if(!rc) {
|
||||
XSRETURN_UNDEF;
|
||||
}
|
||||
RETVAL = (int) rc;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
int
|
||||
JS_DefineFunction(cx, obj, name, nargs, flags)
|
||||
JSContext * cx
|
||||
JSObject * obj
|
||||
char * name
|
||||
int nargs
|
||||
int flags
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSFunction *rc;
|
||||
CODE:
|
||||
{
|
||||
rc = JS_DefineFunction(cx, obj,
|
||||
(const char *) name, FunctionDispatcher,
|
||||
(uintN) nargs, (uintN) flags);
|
||||
if(!rc) {
|
||||
XSRETURN_UNDEF;
|
||||
}
|
||||
RETVAL = (int) rc;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
int
|
||||
JS_SetErrorReporter(cx)
|
||||
JSContext * cx
|
||||
######################################################################
|
||||
CODE:
|
||||
{
|
||||
JS_SetErrorReporter(cx, ErrorReporter);
|
||||
RETVAL = 0;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
JSObject *
|
||||
JS_DefineObject(cx, obj, name, class, proto)
|
||||
JSContext * cx
|
||||
JSObject * obj
|
||||
char * name
|
||||
JSClass * class
|
||||
JSObject * proto
|
||||
######################################################################
|
||||
PREINIT:
|
||||
SV *sv = sv_newmortal();
|
||||
CODE:
|
||||
{
|
||||
RETVAL = JS_DefineObject(cx, obj, name, class, proto, 0);
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
int
|
||||
JS_DefineProperty(cx, obj, name, value)
|
||||
JSContext * cx
|
||||
JSObject * obj
|
||||
char * name
|
||||
char * value
|
||||
#JSPropertyOp getter
|
||||
#JSPropertyOp setter
|
||||
#uintN flags
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSBool rc;
|
||||
JSString *str;
|
||||
CODE:
|
||||
{
|
||||
str = JS_NewStringCopyZ(cx, value);
|
||||
|
||||
/* This implementation is somewhat sub-optimal, since it
|
||||
* calls back into perl even if no getters/setters have
|
||||
* been defined. The necessity for a callback is determined
|
||||
* at the perl level, where there's a data structure mapping
|
||||
* out each object's properties and their getter/setter settings.
|
||||
*/
|
||||
rc = JS_DefineProperty(cx, obj, name, STRING_TO_JSVAL(str),
|
||||
getter_dispatcher, setter_dispatcher, 0);
|
||||
RETVAL = (int) rc;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
void
|
||||
JS_GetProperty(cx, obj, name)
|
||||
JSContext * cx
|
||||
JSObject * obj
|
||||
char * name
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSBool rc;
|
||||
jsval vp;
|
||||
JSString *str;
|
||||
SV *sv = sv_newmortal();
|
||||
PPCODE:
|
||||
{
|
||||
rc = JS_TRUE;
|
||||
rc = JS_GetProperty(cx, obj, name, &vp);
|
||||
if(rc) {
|
||||
str = JS_ValueToString(cx, vp);
|
||||
if(strcmp(JS_GetStringBytes(str), "undefined") == 0) {
|
||||
sv = &PL_sv_undef;
|
||||
} else {
|
||||
sv_setpv(sv, JS_GetStringBytes(str));
|
||||
}
|
||||
} else {
|
||||
sv = &PL_sv_undef;
|
||||
}
|
||||
XPUSHs(sv);
|
||||
}
|
||||
|
||||
######################################################################
|
||||
JSObject *
|
||||
JS_NewArrayObject(cx)
|
||||
JSContext * cx
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSObject *rc;
|
||||
CODE:
|
||||
{
|
||||
rc = JS_NewArrayObject(cx, 0, NULL);
|
||||
RETVAL = rc;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
int
|
||||
JS_SetElement(cx, obj, idx, valptr)
|
||||
JSContext *cx
|
||||
JSObject *obj
|
||||
int idx
|
||||
char *valptr
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSBool rc;
|
||||
JSString *str;
|
||||
jsval val;
|
||||
CODE:
|
||||
{
|
||||
str = JS_NewStringCopyZ(cx, valptr);
|
||||
val = STRING_TO_JSVAL(str);
|
||||
rc = JS_SetElement(cx, obj, idx, &val);
|
||||
if(rc) {
|
||||
RETVAL = 1;
|
||||
} else {
|
||||
RETVAL = 0;
|
||||
}
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
int
|
||||
JS_SetElementAsObject(cx, obj, idx, elobj)
|
||||
JSContext *cx
|
||||
JSObject *obj
|
||||
int idx
|
||||
JSObject *elobj
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSBool rc;
|
||||
jsval val;
|
||||
CODE:
|
||||
{
|
||||
val = OBJECT_TO_JSVAL(elobj);
|
||||
rc = JS_SetElement(cx, obj, idx, &val);
|
||||
if(rc) {
|
||||
RETVAL = 1;
|
||||
} else {
|
||||
RETVAL = 0;
|
||||
}
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
void
|
||||
JS_GetElement(cx, obj, idx)
|
||||
JSContext *cx
|
||||
JSObject *obj
|
||||
int idx
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSBool rc;
|
||||
jsval vp;
|
||||
JSString *str;
|
||||
SV *sv = sv_newmortal();
|
||||
PPCODE:
|
||||
{
|
||||
rc = JS_GetElement(cx, obj, idx, &vp);
|
||||
if(rc) {
|
||||
str = JS_ValueToString(cx, vp);
|
||||
if(strcmp(JS_GetStringBytes(str), "undefined") == 0) {
|
||||
sv = &PL_sv_undef;
|
||||
} else {
|
||||
sv_setpv(sv, JS_GetStringBytes(str));
|
||||
}
|
||||
} else {
|
||||
sv = &PL_sv_undef;
|
||||
}
|
||||
XPUSHs(sv);
|
||||
}
|
||||
|
||||
######################################################################
|
||||
JSClass *
|
||||
JS_GetClass(cx, obj)
|
||||
JSContext * cx
|
||||
JSObject * obj
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSClass *rc;
|
||||
CODE:
|
||||
{
|
||||
#ifdef JS_THREADSAFE
|
||||
rc = JS_GetClass(cx, obj);
|
||||
#else
|
||||
rc = JS_GetClass(obj);
|
||||
#endif
|
||||
RETVAL = rc;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
|
||||
######################################################################
|
||||
void
|
||||
JS_SetMaxBranchOperations(cx, max_branch_operations)
|
||||
JSContext *cx
|
||||
int max_branch_operations
|
||||
######################################################################
|
||||
CODE:
|
||||
{
|
||||
PJS_Context* pcx = (PJS_Context *) JS_GetContextPrivate(cx);
|
||||
pcx->branch_count = 0;
|
||||
pcx->branch_max = max_branch_operations;
|
||||
JS_SetBranchCallback(cx, BranchHandler);
|
||||
}
|
||||
OUTPUT:
|
||||
|
||||
|
||||
######################################################################
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
######################################################################
|
||||
# Typemap for JavaScript::SpiderMonkey
|
||||
#
|
||||
# Revision: $Revision: 1.1.1.1 $
|
||||
# Last Checkin: $Date: 2006/02/01 06:00:49 $
|
||||
# By: $Author: mschilli $
|
||||
# Author: Mike Schilli mschilli1@aol.com, 2002
|
||||
######################################################################
|
||||
JSRuntime * T_PTRREF
|
||||
JSContext * T_PTRREF
|
||||
JSClass * T_PTRREF
|
||||
JSObject * T_PTRREF
|
||||
JSNative T_PTRREF
|
||||
JSPropertySpec * T_PTRREF
|
||||
JSFunctionSpec * T_PTRREF
|
||||
uintN T_SV
|
||||
JSBool T_SV
|
|
@ -1,94 +0,0 @@
|
|||
Revision history for Perl extension JavaScript::SpiderMonkey.
|
||||
|
||||
0.19 (05/09/2007)
|
||||
(tb) Allocate correct amount of memory for scripts that contain UTF-8
|
||||
characters with internal UTF-8 flag on.
|
||||
|
||||
0.18 (08/06/2007)
|
||||
(tb) Added protection against infinite loops
|
||||
(tb) Added support for JS_THREADSAFE
|
||||
|
||||
0.17 (27/07/2006)
|
||||
(tb) Made sure eval function doesn't produce warnings when script
|
||||
variable is uninitialized.
|
||||
[was supposed to be part of 0.16 but is actually part of 0.17]
|
||||
(tb) Added support for E4X
|
||||
|
||||
0.16 (13/06/2006)
|
||||
(tb) Added patch initially proposed by marc [at] igneousconsulting.com
|
||||
and subsequently modified by Agent Zhang that allows mapped perl
|
||||
functions to return varied datatypes back to JavaScript
|
||||
|
||||
0.15 (28/02/2006)
|
||||
(tb) Rewrote Makefile.PL to work on more platforms
|
||||
|
||||
0.14 (12/02/2006)
|
||||
(tb) Removed remaining debug info
|
||||
|
||||
0.13 (05/02/2006)
|
||||
(tb) Removed debug info
|
||||
(tb) Made sure Makefile.PL finds libjs if installed in /usr/lib or
|
||||
/usr/local/lib
|
||||
|
||||
0.12 (12/03/2005)
|
||||
(ms) Makefile.PL prerequisite changed from undef to '0'.
|
||||
(ms) Thomas Busch added a check to Makefile.PL to find an already
|
||||
installed JS lib.
|
||||
|
||||
0.11 (08/22/2004)
|
||||
* (ms) Added Log::Log4perl dependency in Makefile.PL as suggested
|
||||
by an anonymous posting on rt.cpan.org.
|
||||
* (ms) Added #define for MSC compiler as suggested in
|
||||
https://rt.cpan.org/Ticket/Display.html?id=6984
|
||||
* (ms) Roger Crew <crew@cs.stanford.edu> provided patches for
|
||||
a clean Win32 compile plus README text on installing the dll/so.
|
||||
|
||||
0.10 06/20/2004
|
||||
* Nikita Savin <nikita@savin.go2serve.net> provided a patch to
|
||||
set $@ instead of printing to STDERR in case of a JS error.
|
||||
* Added patch by Chris Blaise <cblaise@esoft.com>:
|
||||
- Different objects can have the same named function. If no
|
||||
object is specified on function_set, it's global.
|
||||
* Log4perl in for debugging
|
||||
* Chris Blaise submitted a patch to have a perl callback return
|
||||
an object to JS. Applied with modifications, longer term we need
|
||||
a solution on how the perl callback tells the JS wrapper what's coming
|
||||
back: A JS string, an object or an integer.
|
||||
|
||||
0.09 02/20/2004
|
||||
* Max Maischein added Win32 installation steps in Makefile.PL
|
||||
|
||||
0.08 09/19/2002
|
||||
* Doc bug fixed, reported by Yoz Grahame.
|
||||
|
||||
0.07 09/14/2002
|
||||
* Release mgmt changed
|
||||
|
||||
0.06 07/10/2002
|
||||
* Made M*PL smarter to detect the JS target platform
|
||||
|
||||
0.05 06/23/2002
|
||||
* Added installation instructions to README.
|
||||
|
||||
0.04 06/23/2002
|
||||
* Added test case for just setter or just getter
|
||||
* Added documentation
|
||||
* Updated todo list
|
||||
|
||||
0.03 06/23/2002
|
||||
* Added setters and getters for properties
|
||||
|
||||
0.02 01/20/2002
|
||||
* Fixed properties (get/set)
|
||||
|
||||
0.01 01/03/2002
|
||||
* Where it all began.
|
||||
|
||||
TODO:
|
||||
* setters/getters for arrays
|
||||
* Get rid of GLOBAL and the limitation to one instance
|
||||
* getter/setter called every time, callback settings checked
|
||||
at perl level only
|
||||
* Make fixed constants in init() configurable (1000000)
|
||||
* Allow for different contexts
|
||||
* Rethink function names (by_path, function_set etc.)
|
|
@ -1,33 +0,0 @@
|
|||
|
||||
How to install JavaScript::SpiderMonkey
|
||||
|
||||
Get the latest SpiderMonkey distribution from mozilla.org:
|
||||
http://www.mozilla.org/js/spidermonkey shows which releases are available.
|
||||
http://ftp.mozilla.org/pub/js/js-1.5-rc3a.tar.gz has been proven to work.
|
||||
|
||||
Untar it at the same directory level as the distribution of the
|
||||
JavaScript::SpiderMonkey perl module distribution whichs README
|
||||
you're currently reading:
|
||||
|
||||
cd ..
|
||||
tar zxfv js-1.5-rc3a.tar.gz
|
||||
|
||||
It's important that the js and JavaScript-SpiderMonkey-v.vv directories
|
||||
are at the same level:
|
||||
|
||||
$ls
|
||||
JavaScript-SpiderMonkey-1.00
|
||||
js
|
||||
js-1.5-rc3a.tar.gz
|
||||
|
||||
Now, build JavaScript::SpiderMonkey in the standard way:
|
||||
|
||||
cd JavaScript-SpiderMonkey-1.00
|
||||
perl Makefile.PL
|
||||
gmake
|
||||
gmake test
|
||||
gmake install
|
||||
|
||||
-- and you're good to go! Have fun.
|
||||
|
||||
Mike Schilli, m@perlmeister.com, 2002
|
|
@ -1,35 +0,0 @@
|
|||
Changes
|
||||
INSTALL
|
||||
Makefile.PL
|
||||
MANIFEST
|
||||
MANIFEST.SKIP
|
||||
META.yml Module meta-data (added by MakeMaker)
|
||||
README
|
||||
SpiderMonkey.pm
|
||||
SpiderMonkey.xs
|
||||
SpiderMonkey.h
|
||||
t/000readme.t
|
||||
t/001properties.t
|
||||
t/002functions.t
|
||||
t/003properties.t
|
||||
t/004setget.t
|
||||
t/005error.t
|
||||
t/006objmeth.t
|
||||
t/007funcret.t
|
||||
t/00array.t
|
||||
t/01doc-href.t
|
||||
t/02nav-appv.t
|
||||
t/03doc-write.t
|
||||
t/04loop.t
|
||||
t/05form.t
|
||||
t/06form2.t
|
||||
t/07func.t
|
||||
t/08func2.t
|
||||
t/09meth.t
|
||||
t/10elobj.t
|
||||
t/11intret.t
|
||||
t/12dblret.t
|
||||
t/13strret.t
|
||||
t/init.pl
|
||||
typemap
|
||||
util/download.pl
|
|
@ -1,11 +0,0 @@
|
|||
blib
|
||||
^Makefile$
|
||||
^Makefile.old$
|
||||
CVS
|
||||
.cvsignore
|
||||
docs
|
||||
MANIFEST.bak
|
||||
adm/release
|
||||
^SpiderMonkey.bs$
|
||||
^SpiderMonkey.c$
|
||||
^SpiderMonkey.o$
|
|
@ -1,15 +0,0 @@
|
|||
--- #YAML:1.0
|
||||
name: JavaScript-SpiderMonkey
|
||||
version: 0.19
|
||||
abstract: Perl interface to the JavaScript Engine
|
||||
license: ~
|
||||
generated_by: ExtUtils::MakeMaker version 6.36
|
||||
distribution_type: module
|
||||
requires:
|
||||
Data::Dumper: 0
|
||||
Log::Log4perl: 0
|
||||
meta-spec:
|
||||
url: http://module-build.sourceforge.net/META-spec-v1.2.html
|
||||
version: 1.2
|
||||
author:
|
||||
- Mike Schilli <m@perlmeister.com>
|
|
@ -1,166 +0,0 @@
|
|||
######################################################################
|
||||
#
|
||||
# MakeMaker file for JavaScript::SpiderMonkey
|
||||
#
|
||||
# Revision: $Revision: 1.5 $
|
||||
# Last Checkin: $Date: 2007/06/08 19:03:08 $
|
||||
# By: $Author: thomas_busch $
|
||||
#
|
||||
# Authors: Mike Schilli m@perlmeister.com, 2002-2005
|
||||
# Thomas Busch tbusch@cpan.org, 2006
|
||||
#
|
||||
######################################################################
|
||||
|
||||
use ExtUtils::MakeMaker;
|
||||
use Getopt::Long;
|
||||
|
||||
# Get the right lib and include dirs for different platforms
|
||||
|
||||
my $JS_LIB_DIR;
|
||||
my @JS_INCL_DIRS;
|
||||
|
||||
my @c_header_files = qw(
|
||||
jsapi.h
|
||||
jsautocfg.h
|
||||
);
|
||||
|
||||
my @possible_libraries = qw(
|
||||
libjs.a
|
||||
js32.dll
|
||||
libmozjs.so
|
||||
);
|
||||
|
||||
my %possible_install_paths = (
|
||||
"../js/src/*" => "../js/src",
|
||||
"/usr/lib" => "/usr/include",
|
||||
"/usr/local/lib" => "/usr/local/include",
|
||||
"/usr/lib/firefox" => "/usr/include/firefox",
|
||||
);
|
||||
|
||||
my ($JS_LIB_DIR, @JS_INCL_DIRS, $JS_LIB_NAME);
|
||||
|
||||
foreach my $install_path(keys %possible_install_paths) {
|
||||
foreach my $possible_lib(@possible_libraries) {
|
||||
foreach my $libfile(glob "$install_path/$possible_lib") {
|
||||
next if ! -f $libfile;
|
||||
my $include_path = $possible_install_paths{$install_path};
|
||||
foreach my $c_header(@c_header_files) {
|
||||
if (-f "$include_path/$c_header") {
|
||||
my $include_dir = "$include_path/$c_header";
|
||||
$include_dir =~ s/$c_header$//;
|
||||
push @JS_INCL_DIRS, $include_dir;
|
||||
}
|
||||
foreach my $headerfile(glob "$include_path/*/$c_header") {
|
||||
my $include_dir = $headerfile;
|
||||
$include_dir =~ s/$c_header$//;
|
||||
push @JS_INCL_DIRS, $include_dir;
|
||||
}
|
||||
}
|
||||
if (scalar(@JS_INCL_DIRS) == scalar(@c_header_files)) {
|
||||
$JS_LIB_DIR = $libfile;
|
||||
$JS_LIB_DIR =~ s/$possible_lib$//;
|
||||
|
||||
$JS_LIB_NAME = $possible_lib;
|
||||
$JS_LIB_NAME =~ s/\.(a|so|dll)$//;
|
||||
$JS_LIB_NAME =~ s/^lib//;
|
||||
|
||||
last;
|
||||
} else {
|
||||
@JS_INCL_DIRS = ();
|
||||
}
|
||||
}
|
||||
last if $JS_LIB_DIR;
|
||||
}
|
||||
last if $JS_LIB_DIR;
|
||||
}
|
||||
|
||||
if ($JS_INCL_DIRS[0] eq $JS_INCL_DIRS[1]) {
|
||||
shift @JS_INCL_DIRS;
|
||||
}
|
||||
|
||||
## If no SpiderMonkey library found report that and exit.
|
||||
## Otherwise print lib and include paths.
|
||||
|
||||
if (!$JS_LIB_DIR) {
|
||||
print <<EOT;
|
||||
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
This module requires the SpiderMonkey C library -- please read the
|
||||
README file on how to download, compile and link it.
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
|
||||
EOT
|
||||
exit 0;
|
||||
} else {
|
||||
print "JS_LIB_DIR: $JS_LIB_DIR\n";
|
||||
foreach my $include_dir(@JS_INCL_DIRS) {
|
||||
print "JS_INCL_DIR: $include_dir\n";
|
||||
}
|
||||
print "JS_LIB_NAME: $JS_LIB_NAME\n";
|
||||
}
|
||||
|
||||
#### Determine compile options
|
||||
##############################
|
||||
|
||||
my $JS_DEFINE;
|
||||
my $E4X = 0;
|
||||
my $JS_THREADSAFE = 0;
|
||||
|
||||
## Get options from command line
|
||||
GetOptions(
|
||||
"E4X" => \$E4X,
|
||||
"JS_THREADSAFE" => \$JS_THREADSAFE,
|
||||
);
|
||||
|
||||
|
||||
## Determine library name and system-related defines
|
||||
if ($^O ne 'MSWin32') {
|
||||
$JS_DEFINE = '-DXP_UNIX';
|
||||
} else {
|
||||
$JS_DEFINE = '-DXP_WIN';
|
||||
};
|
||||
|
||||
## Add E4X support if flag set.
|
||||
## For more info about E4X check http://en.wikipedia.org/wiki/E4X
|
||||
if ($E4X) {
|
||||
$JS_DEFINE .= " -DE4X";
|
||||
print "E4X support enabled\n";
|
||||
}
|
||||
|
||||
## Support compiling in thread safe environment
|
||||
if ($JS_THREADSAFE) {
|
||||
$JS_DEFINE .= " -DJS_THREADSAFE";
|
||||
print "Compiling with JS_THREADSAFE flag\n";
|
||||
}
|
||||
|
||||
|
||||
#### See lib/ExtUtils/MakeMaker.pm for details of how to influence
|
||||
#### the contents of the Makefile that is written.
|
||||
##################################################
|
||||
|
||||
WriteMakefile(
|
||||
'NAME' => 'JavaScript::SpiderMonkey',
|
||||
'VERSION_FROM' => 'SpiderMonkey.pm', # finds $VERSION
|
||||
'PREREQ_PM' => {
|
||||
'Log::Log4perl' => 0,
|
||||
'Data::Dumper' => 0,
|
||||
}, # e.g., Module::Name => 1.1
|
||||
($] >= 5.005 ? ## Add these new keywords supported since 5.005
|
||||
(ABSTRACT_FROM => 'SpiderMonkey.pm', # retrieve abstract from module
|
||||
AUTHOR => 'Mike Schilli <m@perlmeister.com>') : ()),
|
||||
'LIBS' => ["-L$JS_LIB_DIR -l$JS_LIB_NAME"], # e.g., '-lm'
|
||||
'DEFINE' => $JS_DEFINE, # e.g., '-DHAVE_SOMETHING'
|
||||
# Insert -I. if you add *.h files later:
|
||||
'INC' => "-I".join " -I", @JS_INCL_DIRS,
|
||||
# Un-comment this if you add C files to link with later:
|
||||
# 'OBJECT' => '$(O_FILES)', # link all the C files too
|
||||
);
|
||||
|
||||
######################################################################
|
||||
sub MY::postamble {
|
||||
######################################################################
|
||||
'
|
||||
README: SpiderMonkey.pm
|
||||
pod2text SpiderMonkey.pm >README
|
||||
';
|
||||
}
|
211
deps/JavaScript-SpiderMonkey-0.19-patched/README
vendored
211
deps/JavaScript-SpiderMonkey-0.19-patched/README
vendored
|
@ -1,211 +0,0 @@
|
|||
######################################################################
|
||||
JavaScript::SpiderMonkey 0.17
|
||||
######################################################################
|
||||
|
||||
NAME
|
||||
JavaScript::SpiderMonkey - Perl interface to the JavaScript Engine
|
||||
|
||||
SYNOPSIS
|
||||
use JavaScript::SpiderMonkey;
|
||||
|
||||
my $js = JavaScript::SpiderMonkey->new();
|
||||
|
||||
$js->init(); # Initialize Runtime/Context
|
||||
|
||||
# Define a perl callback for a new JavaScript function
|
||||
$js->function_set("print_to_perl", sub { print "@_\n"; });
|
||||
|
||||
# Create a new (nested) object and a property
|
||||
$js->property_by_path("document.location.href");
|
||||
|
||||
# Execute some code
|
||||
my $rc = $js->eval(q!
|
||||
document.location.href = append("http://", "www.aol.com");
|
||||
|
||||
print_to_perl("URL is ", document.location.href);
|
||||
|
||||
function append(first, second) {
|
||||
return first + second;
|
||||
}
|
||||
!);
|
||||
|
||||
# Get the value of a property set in JS
|
||||
my $url = $js->property_get("document.location.href");
|
||||
|
||||
$js->destroy();
|
||||
|
||||
INSTALL
|
||||
JavaScript::SpiderMonkey requires Mozilla's readily compiled
|
||||
SpiderMonkey 1.5 distribution or better. Please check "SpiderMonkey
|
||||
Installation".
|
||||
|
||||
DESCRIPTION
|
||||
JavaScript::SpiderMonkey is a Perl Interface to the SpiderMonkey
|
||||
JavaScript Engine. It is different from Claes Jacobsson's
|
||||
"JavaScript.pm" in that it offers two different levels of access:
|
||||
|
||||
[1] A 1:1 mapping of the SpiderMonkey API to Perl
|
||||
|
||||
[2] A more Perl-like API
|
||||
|
||||
This document describes [2], for [1], please check "SpiderMonkey.xs".
|
||||
|
||||
new()
|
||||
"$js = JavaScript::SpiderMonkey->new()" creates a new object to work
|
||||
with. To initialize the JS runtime, call "$js->init()" afterwards.
|
||||
|
||||
$js->destroy()
|
||||
"$js->destroy()" destroys the current runtime and frees up all memory.
|
||||
|
||||
$js->init()
|
||||
"$js->init()" initializes the SpiderMonkey engine by creating a context,
|
||||
default classes and objects and adding an error reporter.
|
||||
|
||||
$js->array_by_path($name)
|
||||
Creates an object of type *Array* in the JS runtime:
|
||||
|
||||
$js->array_by_path("document.form");
|
||||
|
||||
will first create an object with the name "document" (unless it exists
|
||||
already) and then define a property named "form" to it, which is an
|
||||
object of type *Array*. Therefore, in the JS code, you're going to be
|
||||
able define things like
|
||||
|
||||
document.form[0] = "value";
|
||||
|
||||
$js->function_set($name, $funcref, [$obj])
|
||||
Binds a Perl function provided as a coderef ($funcref) to a newly
|
||||
created JS function named $name in JS land. It's a real function
|
||||
(therefore bound to the global object) if $obj is omitted. However, if
|
||||
$obj is ref to a JS object (retrieved via "$js->object_by_path($path)"
|
||||
or the like), the function will be a *method* of the specified object.
|
||||
|
||||
$js->function_set("write", sub { print @_ });
|
||||
# write("hello"); // In JS land
|
||||
|
||||
$obj = $j->object_by_path("navigator");
|
||||
$js->function_set("write", sub { print @_ }, $obj);
|
||||
# navigator.write("hello"); // In JS land
|
||||
|
||||
$js->array_set_element($obj, $idx, $val)
|
||||
Sets the element of the array $obj at index position $idx to the value
|
||||
$val. $obj is a reference to an object of type array (retrieved via
|
||||
"$js->object_by_path($path)" or the like).
|
||||
|
||||
$js->array_set_element_as_object($obj, $idx, $elobj)
|
||||
Sets the element of the array $obj at index position $idx to the object
|
||||
$elobj (both $obj and $elobj have been retrieved via
|
||||
"$js->object_by_path($path)" or the like).
|
||||
|
||||
$js->array_get_element($obj, $idx)
|
||||
Gets the value of of the element at index $idx of the object of type
|
||||
Array $obj.
|
||||
|
||||
$js->property_by_path($path, $value, [$getter], [$setter])
|
||||
Sets the specified property of an object in $path to the value $value.
|
||||
$path is the full name of the property, including the object(s) in JS
|
||||
land it belongs to:
|
||||
|
||||
$js-E<gt>property_by_path("document.location.href", "abc");
|
||||
|
||||
This first creates the object "document" (if it doesn't exist already),
|
||||
then the object "document.location", then attaches the property "href"
|
||||
to it and sets it to "abc".
|
||||
|
||||
$getter and $setter are coderefs that will be called by the JavaScript
|
||||
engine when the respective property's value is requested or set:
|
||||
|
||||
sub getter {
|
||||
my($property_path, $value) = @_;
|
||||
print "$property_path has value $value\n";
|
||||
}
|
||||
|
||||
sub setter {
|
||||
my($property_path, $value) = @_;
|
||||
print "$property_path set to value $value\n";
|
||||
}
|
||||
|
||||
$js-E<gt>property_by_path("document.location.href", "abc",
|
||||
\&getter, \&setter);
|
||||
|
||||
If you leave out $getter and $setter, there's going to be no callbacks
|
||||
triggerd while the properity is set or queried. If you just want to
|
||||
specify a $setter, but no $getter, set the $getter to "undef".
|
||||
|
||||
$js->object_by_path($path, [$newobj])
|
||||
Get a pointer to an object with the path specified. Create it if it's
|
||||
not there yet. If $newobj is provided, the ref is used to bind the
|
||||
existing object to the name in $path.
|
||||
|
||||
$js->property_get($path)
|
||||
Fetch the property specified by the $path.
|
||||
|
||||
my $val = $js->property_get("document.location.href");
|
||||
|
||||
$js->eval($code)
|
||||
Runs the specified piece of <$code> in the JS engine. Afterwards,
|
||||
property values of objects previously defined will be available via
|
||||
"$j->property_get($path)" and the like.
|
||||
|
||||
my $rc = $js->eval("write('hello');");
|
||||
|
||||
The method returns 1 on success or else if there was an error in JS
|
||||
land. In case of an error, the JS error text will be available in $@.
|
||||
|
||||
SpiderMonkey Installation
|
||||
First, get the latest SpiderMonkey distribution from mozilla.org:
|
||||
http://www.mozilla.org/js/spidermonkey shows which releases are
|
||||
available. "js-1.5-rc3a.tar.gz" has been proven to work.
|
||||
|
||||
Untar it at the same directory level as you just untarred the
|
||||
"JavaScript::SpiderMonkey" distribution you're currently reading. So, if
|
||||
you're currently in "/my/path/JavaScript-SpiderMonkey-v.vv", do this:
|
||||
|
||||
cp js-1.5-rc3a.tar.gz /my/path
|
||||
cd /my/path
|
||||
tar zxfv js-1.5-rc3a.tar.gz
|
||||
|
||||
Then, compile the SpiderMonkey distribution, if you're on Linux, just
|
||||
use:
|
||||
|
||||
cd js/src
|
||||
make -f Makefile.ref
|
||||
|
||||
It's important that the js and JavaScript-SpiderMonkey-v.vv directories
|
||||
are at the same level:
|
||||
|
||||
[/my/path]$ ls
|
||||
JavaScript-SpiderMonkey-v.vv
|
||||
js
|
||||
js-1.5-rc3a.tar.gz
|
||||
[/my/path]$
|
||||
|
||||
(Note that you *can* untar the SpiderMonkey distribution elsewhere, but,
|
||||
if so, then you need to edit the setting of $JSLIBPATH in Makefile.PL).
|
||||
|
||||
Next, you need to copy the shared library file thus constructed (e.g.,
|
||||
libjs.so or js32.dll) to an appropriate directory on your library path.
|
||||
On Windows, this can also be the directory where the perl executable
|
||||
lives. On Unix, this has been shown to work without copying, but this
|
||||
way you need to keep the compiled binary in the "js" build directory
|
||||
forever. Copying "js/src/Your_OS_DBG.OBJ/libjs.so" to "/usr/local/lib"
|
||||
and making sure that "/usr/local/lib" is in your "LD_LIBRARY_PATH" seems
|
||||
to be safest bet.
|
||||
|
||||
Now, build JavaScript::SpiderMonkey in the standard way:
|
||||
|
||||
cd JavaScript-SpiderMonkey-v.vv
|
||||
perl Makefile.PL
|
||||
make
|
||||
make test
|
||||
make install
|
||||
|
||||
AUTHOR
|
||||
Mike Schilli, <m@perlmeister.com>
|
||||
|
||||
COPYRIGHT AND LICENSE
|
||||
Copyright 2002 by Mike Schilli
|
||||
|
||||
This library is free software; you can redistribute it and/or modify it
|
||||
under the same terms as Perl itself.
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
|
||||
/* Strucuture that keeps track of contexts */
|
||||
struct PJS_Context {
|
||||
/* total number of branch_operations the runtime went through in this context */
|
||||
int branch_count;
|
||||
|
||||
/* max number of branch_operations allowed in this context */
|
||||
int branch_max;
|
||||
};
|
||||
|
||||
typedef struct PJS_Context PJS_Context;
|
||||
|
|
@ -1,707 +0,0 @@
|
|||
######################################################################
|
||||
package JavaScript::SpiderMonkey;
|
||||
######################################################################
|
||||
# Revision: $Revision: 1.8 $
|
||||
# Last Checkin: $Date: 2007/09/05 12:00:17 $
|
||||
# By: $Author: thomas_busch $
|
||||
#
|
||||
# Author: Mike Schilli m@perlmeister.com, 2002
|
||||
######################################################################
|
||||
|
||||
=head1 NAME
|
||||
|
||||
JavaScript::SpiderMonkey - Perl interface to the JavaScript Engine
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
use JavaScript::SpiderMonkey;
|
||||
|
||||
my $js = JavaScript::SpiderMonkey->new();
|
||||
|
||||
$js->init(); # Initialize Runtime/Context
|
||||
|
||||
# Define a perl callback for a new JavaScript function
|
||||
$js->function_set("print_to_perl", sub { print "@_\n"; });
|
||||
|
||||
# Create a new (nested) object and a property
|
||||
$js->property_by_path("document.location.href");
|
||||
|
||||
# Execute some code
|
||||
my $rc = $js->eval(q!
|
||||
document.location.href = append("http://", "www.aol.com");
|
||||
|
||||
print_to_perl("URL is ", document.location.href);
|
||||
|
||||
function append(first, second) {
|
||||
return first + second;
|
||||
}
|
||||
!);
|
||||
|
||||
# Get the value of a property set in JS
|
||||
my $url = $js->property_get("document.location.href");
|
||||
|
||||
$js->destroy();
|
||||
|
||||
=head1 INSTALL
|
||||
|
||||
JavaScript::SpiderMonkey requires Mozilla's readily compiled
|
||||
SpiderMonkey 1.5 distribution or better. Please check
|
||||
L<SpiderMonkey Installation>.
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
JavaScript::SpiderMonkey is a Perl Interface to the
|
||||
SpiderMonkey JavaScript Engine. It is different from
|
||||
Claes Jacobsson's C<JavaScript.pm> in that it offers two
|
||||
different levels of access:
|
||||
|
||||
=over 4
|
||||
|
||||
=item [1]
|
||||
|
||||
A 1:1 mapping of the SpiderMonkey API to Perl
|
||||
|
||||
=item [2]
|
||||
|
||||
A more Perl-like API
|
||||
|
||||
=back
|
||||
|
||||
This document describes [2], for [1], please check C<SpiderMonkey.xs>.
|
||||
|
||||
=cut
|
||||
|
||||
use 5.006;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Data::Dumper;
|
||||
use Log::Log4perl qw(:easy);
|
||||
|
||||
require Exporter;
|
||||
require DynaLoader;
|
||||
|
||||
our $VERSION = '0.19';
|
||||
our @ISA = qw(Exporter DynaLoader);
|
||||
our %EXPORT_TAGS = ( 'all' => [ qw() ] );
|
||||
our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
|
||||
our @EXPORT = qw();
|
||||
|
||||
bootstrap JavaScript::SpiderMonkey $VERSION;
|
||||
|
||||
our $GLOBAL;
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 new()
|
||||
|
||||
C<$js = JavaScript::SpiderMonkey-E<gt>new()> creates a new object to work with.
|
||||
To initialize the JS runtime, call C<$js-E<gt>init()> afterwards.
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub new {
|
||||
##################################################
|
||||
my ($class) = @_;
|
||||
|
||||
my $self = {
|
||||
'runtime' => undef,
|
||||
'context' => undef,
|
||||
'global_object' => undef,
|
||||
'global_class' => undef,
|
||||
'objects' => { },
|
||||
};
|
||||
|
||||
# The function dispatcher is called from C and
|
||||
# doesn't have 'self'. Store it in a class var.
|
||||
# This means we can only have one instance of this
|
||||
# JavaScript::SpiderMonkey object. Ouch.
|
||||
our $GLOBAL = $self;
|
||||
|
||||
bless $self, $class;
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>destroy()
|
||||
|
||||
C<$js-E<gt>destroy()> destroys the current runtime and frees up all memory.
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub destroy {
|
||||
##################################################
|
||||
my ($self) = @_;
|
||||
JavaScript::SpiderMonkey::JS_DestroyContext($self->{context});
|
||||
JavaScript::SpiderMonkey::JS_DestroyRuntime($self->{runtime});
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>init()
|
||||
|
||||
C<$js-E<gt>init()> initializes the SpiderMonkey engine by creating a context,
|
||||
default classes and objects and adding an error reporter.
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub init {
|
||||
##################################################
|
||||
my ($self) = @_;
|
||||
|
||||
$self->{runtime} =
|
||||
JavaScript::SpiderMonkey::JS_Init(1000000);
|
||||
$self->{context} =
|
||||
JavaScript::SpiderMonkey::JS_NewContext($self->{runtime}, 8192);
|
||||
$self->{global_class} =
|
||||
JavaScript::SpiderMonkey::JS_GlobalClass();
|
||||
$self->{global_object} =
|
||||
JavaScript::SpiderMonkey::JS_NewObject(
|
||||
$self->{context}, $self->{global_class},
|
||||
$self->{global_class}, $self->{global_class});
|
||||
|
||||
JavaScript::SpiderMonkey::JS_InitStandardClasses($self->{context},
|
||||
$self->{global_object});
|
||||
JavaScript::SpiderMonkey::JS_SetErrorReporter($self->{context});
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>array_by_path($name)
|
||||
|
||||
Creates an object of type I<Array>
|
||||
in the JS runtime:
|
||||
|
||||
$js->array_by_path("document.form");
|
||||
|
||||
will first create an object with the name C<document> (unless
|
||||
it exists already) and then define a property named C<form> to it,
|
||||
which is an object of type I<Array>. Therefore, in the JS code,
|
||||
you're going to be able define things like
|
||||
|
||||
document.form[0] = "value";
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub array_by_path {
|
||||
##################################################
|
||||
my ($self, $path) = @_;
|
||||
|
||||
my $array = JavaScript::SpiderMonkey::JS_NewArrayObject($self->{context});
|
||||
return $self->object_by_path($path, $array);
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>function_set($name, $funcref, [$obj])
|
||||
|
||||
Binds a Perl function provided as a coderef (C<$funcref>)
|
||||
to a newly created JS function
|
||||
named C<$name> in JS land.
|
||||
It's a real function (therefore bound to the global object) if C<$obj>
|
||||
is omitted. However, if C<$obj> is ref to
|
||||
a JS object (retrieved via C<$js-E<gt>object_by_path($path)> or the like),
|
||||
the function will be a I<method> of the specified object.
|
||||
|
||||
$js->function_set("write", sub { print @_ });
|
||||
# write("hello"); // In JS land
|
||||
|
||||
$obj = $j->object_by_path("navigator");
|
||||
$js->function_set("write", sub { print @_ }, $obj);
|
||||
# navigator.write("hello"); // In JS land
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub function_set {
|
||||
##################################################
|
||||
my ($self, $name, $func, $obj) = @_;
|
||||
|
||||
$obj ||= $self->{global_object}; # Defaults to global object
|
||||
|
||||
$self->{functions}->{${$obj}}->{$name} = $func;
|
||||
|
||||
return JavaScript::SpiderMonkey::JS_DefineFunction(
|
||||
$self->{context}, $obj, $name, 0, 0);
|
||||
}
|
||||
|
||||
##################################################
|
||||
sub function_dispatcher {
|
||||
##################################################
|
||||
my ($obj, $name, @args) = @_;
|
||||
|
||||
DEBUG "Dispatching function $obj-$name-@args";
|
||||
|
||||
our $GLOBAL;
|
||||
|
||||
## Find the path for this object.
|
||||
my $found = 0;
|
||||
foreach( keys( %{$GLOBAL->{objects}} ) ){
|
||||
if( ${$GLOBAL->{objects}->{$_}} eq $obj &&
|
||||
exists( $GLOBAL->{functions}->{$obj}->{$name} ) ){
|
||||
DEBUG "Function found";
|
||||
$found = 1;
|
||||
}
|
||||
}
|
||||
$obj = ${$GLOBAL->{global_object}} unless $found;
|
||||
|
||||
if(! exists $GLOBAL->{functions}->{$obj}->{$name}) {
|
||||
LOGDIE "Dispatcher: Can't find mapping for function $obj" .
|
||||
${$GLOBAL->{global_object}} . " '$name'";
|
||||
}
|
||||
|
||||
my $val = $GLOBAL->{functions}->{$obj}->{$name}->(@args);
|
||||
|
||||
DEBUG "retval=$val";
|
||||
|
||||
return $val;
|
||||
}
|
||||
|
||||
##################################################
|
||||
sub getsetter_dispatcher {
|
||||
##################################################
|
||||
my ($obj, $propname, $what, $value) = @_;
|
||||
|
||||
our $GLOBAL;
|
||||
|
||||
DEBUG "Dispatcher obj=$obj";
|
||||
DEBUG "prop=$propname what=$what value=$value";
|
||||
|
||||
DEBUG "GETTING properties/$obj/$propname/$what";
|
||||
|
||||
if(exists $GLOBAL->{properties}->{$obj}->{$propname}->{$what}) {
|
||||
my $entry = $GLOBAL->{properties}->{$obj}->{$propname}->{$what};
|
||||
my $path = $entry->{path};
|
||||
DEBUG "DISPATCHING for object $path ($what)";
|
||||
$entry->{callback}->($path, $value);
|
||||
} else {
|
||||
DEBUG "properties/$obj/$propname/$what doesn't exist";
|
||||
}
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>array_set_element($obj, $idx, $val)
|
||||
|
||||
Sets the element of the array C<$obj>
|
||||
at index position C<$idx> to the value C<$val>.
|
||||
C<$obj> is a reference to an object of type array
|
||||
(retrieved via C<$js-E<gt>object_by_path($path)> or the like).
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub array_set_element {
|
||||
##################################################
|
||||
my ($self, $obj, $idx, $val) = @_;
|
||||
|
||||
DEBUG "Setting $idx of $obj ($self->{context}) to $val";
|
||||
JavaScript::SpiderMonkey::JS_SetElement(
|
||||
$self->{context}, $obj, $idx, $val);
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>array_set_element_as_object($obj, $idx, $elobj)
|
||||
|
||||
Sets the element of the array C<$obj>
|
||||
at index position C<$idx> to the object C<$elobj>
|
||||
(both C<$obj> and C<$elobj> have been retrieved
|
||||
via C<$js-E<gt>object_by_path($path)> or the like).
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub array_set_element_as_object {
|
||||
##################################################
|
||||
my ($self, $obj, $idx, $elobj) = @_;
|
||||
|
||||
JavaScript::SpiderMonkey::JS_SetElementAsObject(
|
||||
$self->{context}, $obj, $idx, $elobj);
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>array_get_element($obj, $idx)
|
||||
|
||||
Gets the value of of the element at index C<$idx>
|
||||
of the object of type Array C<$obj>.
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub array_get_element {
|
||||
##################################################
|
||||
my ($self, $obj, $idx) = @_;
|
||||
|
||||
my $rc = JavaScript::SpiderMonkey::JS_GetElement(
|
||||
$self->{context}, $obj, $idx);
|
||||
|
||||
DEBUG("Getting $idx of $obj ($self->{context}): ",
|
||||
($rc || "undef"));
|
||||
|
||||
return $rc;
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>property_by_path($path, $value, [$getter], [$setter])
|
||||
|
||||
Sets the specified property of an object in C<$path> to the
|
||||
value C<$value>. C<$path> is the full name of the property,
|
||||
including the object(s) in JS land it belongs to:
|
||||
|
||||
$js-E<gt>property_by_path("document.location.href", "abc");
|
||||
|
||||
This first creates the object C<document> (if it doesn't exist already),
|
||||
then the object C<document.location>, then attaches the property
|
||||
C<href> to it and sets it to C<"abc">.
|
||||
|
||||
C<$getter> and C<$setter> are coderefs that will be called by
|
||||
the JavaScript engine when the respective property's value is
|
||||
requested or set:
|
||||
|
||||
sub getter {
|
||||
my($property_path, $value) = @_;
|
||||
print "$property_path has value $value\n";
|
||||
}
|
||||
|
||||
sub setter {
|
||||
my($property_path, $value) = @_;
|
||||
print "$property_path set to value $value\n";
|
||||
}
|
||||
|
||||
$js-E<gt>property_by_path("document.location.href", "abc",
|
||||
\&getter, \&setter);
|
||||
|
||||
If you leave out C<$getter> and C<$setter>, there's going to be no
|
||||
callbacks triggerd while the properity is set or queried.
|
||||
If you just want to specify a C<$setter>, but no C<$getter>,
|
||||
set the C<$getter> to C<undef>.
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub property_by_path {
|
||||
##################################################
|
||||
my ($self, $path, $value, $getter, $setter) = @_;
|
||||
|
||||
DEBUG "Retrieve/Create property $path";
|
||||
|
||||
(my $opath = $path) =~ s/\.[^.]+$//;
|
||||
my $obj = $self->object_by_path($opath);
|
||||
unless(defined $obj) {
|
||||
LOGWARN "No object pointer found to $opath";
|
||||
return undef;
|
||||
}
|
||||
|
||||
DEBUG "$opath: obj=$obj";
|
||||
|
||||
$value = 'undef' unless defined $value;
|
||||
|
||||
DEBUG "Define property $self->{context}, $obj, $path, $value";
|
||||
|
||||
(my $property = $path) =~ s/.*\.//;
|
||||
|
||||
my $prop = JavaScript::SpiderMonkey::JS_DefineProperty(
|
||||
$self->{context}, $obj, $property, $value);
|
||||
|
||||
DEBUG "SETTING properties/$$obj/$property/getter";
|
||||
if($getter) {
|
||||
# Store it under the original C pointer's value. We get
|
||||
# back a PTRREF from JS_DefineObject, but we need the
|
||||
# original value for the callback dispatcher.
|
||||
$self->{properties}->{$$obj}->{$property}->{getter}->{callback}
|
||||
= $getter;
|
||||
$self->{properties}->{$$obj}->{$property}->{getter}->{path} = $path;
|
||||
}
|
||||
|
||||
if($setter) {
|
||||
$self->{properties}->{$$obj}->{$property}->{setter}->{callback}
|
||||
= $setter;
|
||||
$self->{properties}->{$$obj}->{$property}->{setter}->{path} = $path;
|
||||
}
|
||||
|
||||
return $prop;
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>object_by_path($path, [$newobj])
|
||||
|
||||
Get a pointer to an object with the path
|
||||
specified. Create it if it's not there yet.
|
||||
If C<$newobj> is provided, the ref is used to
|
||||
bind the existing object to the name in C<$path>.
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub object_by_path {
|
||||
##################################################
|
||||
my ($self, $path, $newobj) = @_;
|
||||
|
||||
DEBUG "Retrieve/Create object $path";
|
||||
|
||||
DEBUG "Got a ", defined $newobj ? "predefined" : "undefined",
|
||||
" object";
|
||||
|
||||
my $obj = $self->{global_object};
|
||||
|
||||
my @parts = split /\./, $path;
|
||||
my $full = "";
|
||||
|
||||
return undef unless @parts;
|
||||
|
||||
while(@parts >= 1) {
|
||||
my $part = shift @parts;
|
||||
$full .= "." if $full;
|
||||
$full .= "$part";
|
||||
|
||||
if(exists $self->{objects}->{$full}) {
|
||||
$obj = $self->{objects}->{$full};
|
||||
DEBUG "Object $full exists: $obj";
|
||||
} else {
|
||||
my $gobj = $self->{global_object};
|
||||
if(defined $newobj and $path eq $full) {
|
||||
DEBUG "Setting $path to predefined object";
|
||||
$obj = JavaScript::SpiderMonkey::JS_DefineObject(
|
||||
$self->{context}, $obj, $part,
|
||||
JavaScript::SpiderMonkey::JS_GetClass($self->{context}, $newobj),
|
||||
$newobj);
|
||||
} else {
|
||||
$obj = JavaScript::SpiderMonkey::JS_DefineObject(
|
||||
$self->{context}, $obj, $part,
|
||||
$self->{global_class}, $self->{global_object});
|
||||
}
|
||||
$self->{objects}->{$full} = $obj;
|
||||
DEBUG "Object $full created: $obj";
|
||||
}
|
||||
}
|
||||
|
||||
return $obj;
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>property_get($path)
|
||||
|
||||
Fetch the property specified by the C<$path>.
|
||||
|
||||
my $val = $js->property_get("document.location.href");
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub property_get {
|
||||
##################################################
|
||||
my ($self, $string) = @_;
|
||||
|
||||
my($path, $property) = ($string =~ /(.*)\.([^\.]+)$/);
|
||||
|
||||
if(!exists $self->{objects}->{$path}) {
|
||||
LOGWARN "Cannot find object $path via SpiderMonkey";
|
||||
return;
|
||||
}
|
||||
|
||||
DEBUG "Get property $self->{objects}->{$path}, $property";
|
||||
|
||||
return JavaScript::SpiderMonkey::JS_GetProperty(
|
||||
$self->{context}, $self->{objects}->{$path},
|
||||
$property);
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>eval($code)
|
||||
|
||||
Runs the specified piece of <$code> in the JS engine.
|
||||
Afterwards, property values of objects previously defined
|
||||
will be available via C<$j-E<gt>property_get($path)>
|
||||
and the like.
|
||||
|
||||
my $rc = $js->eval("write('hello');");
|
||||
|
||||
The method returns C<1> on success or else if
|
||||
there was an error in JS land. In case of an error, the JS
|
||||
error text will be available in C<$@>.
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub eval {
|
||||
##################################################
|
||||
my ($self, $script) = @_;
|
||||
|
||||
return 1 unless defined $script;
|
||||
|
||||
my $ok =
|
||||
JavaScript::SpiderMonkey::JS_EvaluateScript(
|
||||
$self->{context},
|
||||
$self->{global_object},
|
||||
$script,
|
||||
$] > 5.007 ? bytes::length($script) : length($script),
|
||||
"Perl",
|
||||
0);
|
||||
|
||||
return $ok;
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>ret_eval($code)
|
||||
|
||||
Runs the specified piece of <$code> in the JS engine.
|
||||
Differs from eval because it returns the results of
|
||||
the last executed expression from the JS context.
|
||||
|
||||
my $value = $js->ret_eval("2+2");
|
||||
|
||||
The method returns the result of the last evaluated
|
||||
JS expression. In case of an error, the JS
|
||||
error text will be available in C<$@>.
|
||||
|
||||
=cut
|
||||
|
||||
##################################################
|
||||
sub ret_eval {
|
||||
##################################################
|
||||
my ($self, $script) = @_;
|
||||
|
||||
return 1 unless defined $script;
|
||||
|
||||
no warnings 'uninitialized'; #Silence a spurious undef warning I can't track down.
|
||||
my $ok =
|
||||
JavaScript::SpiderMonkey::JS_RetEvaluateScript(
|
||||
$self->{context},
|
||||
$self->{global_object},
|
||||
$script,
|
||||
#$] > 5.007 ? bytes::length($script) : length($script),
|
||||
length($script),
|
||||
"Perl",
|
||||
0);
|
||||
|
||||
return $ok;
|
||||
}
|
||||
|
||||
##################################################
|
||||
|
||||
=head2 $js-E<gt>set_max_branch_operations($max_branch_operations)
|
||||
|
||||
Set the maximum number of allowed branch operations. This protects
|
||||
against infinite loops and guarantees that the eval operation
|
||||
will terminate.
|
||||
|
||||
=cut
|
||||
##################################################
|
||||
sub set_max_branch_operations {
|
||||
##################################################
|
||||
my ($self, $max_branch_operations) = @_;
|
||||
JavaScript::SpiderMonkey::JS_SetMaxBranchOperations($self->{context}, $max_branch_operations);
|
||||
}
|
||||
|
||||
##################################################
|
||||
sub dump {
|
||||
##################################################
|
||||
my ($self) = @_;
|
||||
|
||||
Data::Dumper::Dumper($self->{objects});
|
||||
}
|
||||
|
||||
##################################################
|
||||
sub debug_enabled {
|
||||
##################################################
|
||||
my $logger = Log::Log4perl::get_logger("JavaScript::SpiderMonkey");
|
||||
if(Log::Log4perl->initialized() and $logger->is_debug()) {
|
||||
# print "DEBUG IS ENABLED\n";
|
||||
return 1;
|
||||
} else {
|
||||
# print "DEBUG IS DISABLED\n";
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 SpiderMonkey Installation
|
||||
|
||||
First, get the latest SpiderMonkey distribution from mozilla.org:
|
||||
http://www.mozilla.org/js/spidermonkey shows which releases are available.
|
||||
C<js-1.6.tar.gz> has been proven to work.
|
||||
|
||||
Untar it at the same directory level as you just untarred the
|
||||
C<JavaScript::SpiderMonkey> distribution you're currently reading.
|
||||
So, if you're currently in C</my/path/JavaScript-SpiderMonkey-v.vv>, do
|
||||
this:
|
||||
|
||||
cp js-1.6.tar.gz /my/path
|
||||
cd /my/path
|
||||
tar zxfv js-1.6.tar.gz
|
||||
|
||||
Then, compile the SpiderMonkey distribution, if you're on Linux,
|
||||
just use:
|
||||
|
||||
cd js/src
|
||||
make -f Makefile.ref
|
||||
|
||||
It's important that the js and JavaScript-SpiderMonkey-v.vv directories
|
||||
are at the same level:
|
||||
|
||||
[/my/path]$ ls
|
||||
JavaScript-SpiderMonkey-v.vv
|
||||
js
|
||||
js-1.6.tar.gz
|
||||
[/my/path]$
|
||||
|
||||
(Note that you *can* untar the SpiderMonkey distribution elsewhere,
|
||||
but, if so, then you need to edit the setting of $JSLIBPATH in Makefile.PL).
|
||||
|
||||
Next, you need to copy the shared library file thus constructed
|
||||
(e.g., libjs.so or js32.dll) to an appropriate directory on your library path.
|
||||
On Windows, this can also be the directory where the perl executable
|
||||
lives. On Unix, this has been shown to work without copying, but this way
|
||||
you need to keep the compiled binary in the C<js> build directory forever.
|
||||
Copying
|
||||
C<js/src/Your_OS_DBG.OBJ/libjs.so> to C</usr/local/lib> and
|
||||
making sure that C</usr/local/lib> is in your C<LD_LIBRARY_PATH>
|
||||
seems to be safest bet.
|
||||
|
||||
Now, build JavaScript::SpiderMonkey in the standard way:
|
||||
|
||||
cd JavaScript-SpiderMonkey-v.vv
|
||||
perl Makefile.PL
|
||||
make
|
||||
make test
|
||||
make install
|
||||
|
||||
=head1 E4X SUPPORT
|
||||
|
||||
To build JavaScript-SpiderMonkey with E4X (ECMAScript for XML) support:
|
||||
|
||||
perl Makefile.PL -E4X
|
||||
|
||||
Please note that E4X support is only supported since SpiderMonkey release 1.6.
|
||||
|
||||
=head1 THREAD SAFETY
|
||||
|
||||
To build JavaScript-SpiderMonkey when using a thread safe version of SpiderMonkey:
|
||||
|
||||
perl Makefile.PL -JS_THREADSAFE
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Mike Schilli, <m at perlmeister dot com>
|
||||
Thomas Busch, <tbusch at cpan dot org> (current maintainer)
|
||||
|
||||
=head1 COPYRIGHT AND LICENSE
|
||||
|
||||
Copyright (c) 2002-2005 Mike Schilli
|
||||
Copyright (c) 2006-2007 Thomas Busch
|
||||
|
||||
This library is free software; you can redistribute it and/or modify
|
||||
it under the same terms as Perl itself.
|
|
@ -1,824 +0,0 @@
|
|||
/* --------------------------------------------------------------------- */
|
||||
/* SpiderMonkey.xs -- Perl Interface to the SpiderMonkey JavaScript */
|
||||
/* implementation. */
|
||||
/* */
|
||||
/* Revision: $Revision: 1.6 $ */
|
||||
/* Last Checkin: $Date: 2007/06/08 19:03:08 $ */
|
||||
/* By: $Author: thomas_busch $ */
|
||||
/* */
|
||||
/* Author: Mike Schilli mschilli1@aol.com, 2001 */
|
||||
/* --------------------------------------------------------------------- */
|
||||
|
||||
#include "EXTERN.h"
|
||||
#include "perl.h"
|
||||
#include "XSUB.h"
|
||||
#include "jsapi.h"
|
||||
#include "SpiderMonkey.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
/* As suggested in https://rt.cpan.org/Ticket/Display.html?id=6984 */
|
||||
#define snprintf _snprintf
|
||||
#endif
|
||||
|
||||
/* JSRuntime needs this global class */
|
||||
static
|
||||
JSClass global_class = {
|
||||
"Global", 0,
|
||||
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
|
||||
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub
|
||||
};
|
||||
|
||||
static int Debug = 0;
|
||||
|
||||
static int max_branch_operations = 0;
|
||||
|
||||
/*==================================*/
|
||||
/* Begin Dirty Hackery */
|
||||
/*==================================*/
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
int obj_to_str(
|
||||
JSContext *cx,
|
||||
JSObject *obj,
|
||||
SV *perl_str
|
||||
/* --------------------------------------------------------------------- */
|
||||
) {
|
||||
JSIdArray *fields = JS_Enumerate( cx, obj );
|
||||
int i = 0;
|
||||
jsval property;
|
||||
|
||||
sv_catpvn( perl_str, "{ ", 2 );
|
||||
/*printf("OBJ_TO_STR\n");
|
||||
printf("Length: %i\n", fields->length);*/
|
||||
|
||||
for( i = 0; i < fields->length; i++ )
|
||||
{
|
||||
jsid id = fields->vector[i];
|
||||
jsval id_val;
|
||||
char *prop_name;
|
||||
|
||||
JS_IdToValue( cx, id, &id_val );
|
||||
prop_name = JS_GetStringBytes(JS_ValueToString(cx, id_val));
|
||||
JS_GetProperty( cx, obj, prop_name, &property );
|
||||
|
||||
/* printf("Adding %s to pv\n", prop_name); */
|
||||
sv_catpvn( perl_str, prop_name, strlen( prop_name ) );
|
||||
sv_catpvn( perl_str, ": ", 2 );
|
||||
/* printf( "Str: %s\n", SvPVbyte_nolen( perl_str ) ); */
|
||||
|
||||
if( JSVAL_IS_OBJECT( property ) )
|
||||
{
|
||||
JSObject *prop_obj;
|
||||
JS_ValueToObject( cx, property, &prop_obj );
|
||||
obj_to_str( cx, prop_obj, perl_str );
|
||||
}
|
||||
else
|
||||
{
|
||||
JSString *prop_str = JS_ValueToString( cx, property );
|
||||
sv_catpvn( perl_str, JS_GetStringBytes( prop_str ), JS_GetStringLength( prop_str ) );
|
||||
/*sv_catpvn( perl_str, " ", 1 );*/
|
||||
}
|
||||
|
||||
if( i < ( fields->length - 1 ) )
|
||||
{
|
||||
sv_catpvn( perl_str, ", ", 2 );
|
||||
}
|
||||
}
|
||||
|
||||
sv_catpvn( perl_str, "}", 1 );
|
||||
JS_DestroyIdArray( cx, fields );
|
||||
return 1;
|
||||
}
|
||||
/*==================================*/
|
||||
/* End Dirty Hackery */
|
||||
/*==================================*/
|
||||
|
||||
/* It's kinda silly that we have to replicate this for getters and setters,
|
||||
* but there doesn't seem to be a way to distinguish between getters
|
||||
* and setters if we use the same function. (Somewhere I read in a
|
||||
* usenet posting there's something like IS_ASSIGN, but this doesn't
|
||||
* seem to be in SpiderMonkey 1.5).
|
||||
*/
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
JSBool getsetter_dispatcher(
|
||||
JSContext *cx,
|
||||
JSObject *obj,
|
||||
jsval id,
|
||||
jsval *vp,
|
||||
char *what
|
||||
/* --------------------------------------------------------------------- */
|
||||
) {
|
||||
dSP;
|
||||
|
||||
/* Call back into perl */
|
||||
ENTER ;
|
||||
SAVETMPS ;
|
||||
PUSHMARK(SP);
|
||||
/* A somewhat nasty trick: Since JS_DefineObject() down below
|
||||
* returns a *JS_Object, which is typemapped as T_PTRREF,
|
||||
* and which is a reference (!) pointing to the real C pointer,
|
||||
* we need to brutally obtain the obj's address by casting
|
||||
* it to an int and forming a scalar out of it.
|
||||
* On the other hand, when Spidermonkey.pm stores the
|
||||
* object's setters/getters, it will dereference
|
||||
* what it gets from JS_DefineObject() (therefore
|
||||
* obtain the object's address in memory) to index its
|
||||
* hash table.
|
||||
* I hope all reasonable machines can hold an address in
|
||||
* an int.
|
||||
*/
|
||||
XPUSHs(sv_2mortal(newSViv((int)obj)));
|
||||
XPUSHs(sv_2mortal(newSVpv(JS_GetStringBytes(JSVAL_TO_STRING(id)), 0)));
|
||||
XPUSHs(sv_2mortal(newSVpv(what, 0)));
|
||||
XPUSHs(sv_2mortal(newSVpv(JS_GetStringBytes(JSVAL_TO_STRING(*vp)), 0)));
|
||||
PUTBACK;
|
||||
call_pv("JavaScript::SpiderMonkey::getsetter_dispatcher", G_DISCARD);
|
||||
FREETMPS;
|
||||
LEAVE;
|
||||
|
||||
return JS_TRUE;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
JSBool getter_dispatcher(
|
||||
JSContext *cx,
|
||||
JSObject *obj,
|
||||
jsval id,
|
||||
jsval *vp
|
||||
/* --------------------------------------------------------------------- */
|
||||
) {
|
||||
return getsetter_dispatcher(cx, obj, id, vp, "getter");
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
JSBool setter_dispatcher(
|
||||
JSContext *cx,
|
||||
JSObject *obj,
|
||||
jsval id,
|
||||
jsval *vp
|
||||
/* --------------------------------------------------------------------- */
|
||||
) {
|
||||
return getsetter_dispatcher(cx, obj, id, vp, "setter");
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
int debug_enabled(
|
||||
/* --------------------------------------------------------------------- */
|
||||
) {
|
||||
dSP;
|
||||
|
||||
int enabled = 0;
|
||||
int count = 0;
|
||||
|
||||
/* Call back into perl */
|
||||
ENTER ;
|
||||
SAVETMPS ;
|
||||
PUTBACK;
|
||||
count = call_pv("JavaScript::SpiderMonkey::debug_enabled", G_SCALAR);
|
||||
if(count == 1) {
|
||||
if(POPi == 1) {
|
||||
enabled = 1;
|
||||
}
|
||||
}
|
||||
FREETMPS;
|
||||
LEAVE;
|
||||
|
||||
return enabled;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
static JSBool
|
||||
FunctionDispatcher(JSContext *cx, JSObject *obj, uintN argc,
|
||||
jsval *argv, jsval *rval) {
|
||||
/* --------------------------------------------------------------------- */
|
||||
dSP;
|
||||
SV *sv;
|
||||
char *n_jstr;
|
||||
int n_jnum;
|
||||
double n_jdbl;
|
||||
unsigned i;
|
||||
int count;
|
||||
JSFunction *fun;
|
||||
fun = JS_ValueToFunction(cx, argv[-2]);
|
||||
|
||||
/* printf("Function %s received %d arguments\n",
|
||||
(char *) JS_GetFunctionName(fun),
|
||||
(int) argc); */
|
||||
|
||||
/* Call back into perl */
|
||||
ENTER ;
|
||||
SAVETMPS ;
|
||||
PUSHMARK(SP);
|
||||
XPUSHs(sv_2mortal(newSViv((int)obj)));
|
||||
XPUSHs(sv_2mortal(newSVpv(
|
||||
JS_GetFunctionName(fun), 0)));
|
||||
for(i=0; i<argc; i++) {
|
||||
XPUSHs(sv_2mortal(newSVpv(
|
||||
JS_GetStringBytes(JS_ValueToString(cx, argv[i])), 0)));
|
||||
}
|
||||
PUTBACK;
|
||||
count = call_pv("JavaScript::SpiderMonkey::function_dispatcher", G_SCALAR);
|
||||
SPAGAIN;
|
||||
|
||||
if(Debug)
|
||||
fprintf(stderr, "DEBUG: Count is %d\n", count);
|
||||
|
||||
if( count > 0) {
|
||||
sv = POPs;
|
||||
if(SvROK(sv)) {
|
||||
/* Im getting a perl reference here, the user
|
||||
* seems to want to send a perl object to jscript
|
||||
* ok, we will do it, although it seems like a painful
|
||||
* thing to me.
|
||||
*/
|
||||
|
||||
if(Debug)
|
||||
fprintf(stderr, "DEBUG: %lx is a ref!\n", (long) sv);
|
||||
*rval = OBJECT_TO_JSVAL(SvIV(SvRV(sv)));
|
||||
}
|
||||
else if(SvIOK(sv)) {
|
||||
/* It appears that we have been sent an int return
|
||||
* value. Thats fine we can give javascript an int
|
||||
*/
|
||||
n_jnum=SvIV(sv);
|
||||
if(Debug)
|
||||
fprintf(stderr, "DEBUG: %lx is an int (%d)\n", (long) sv,n_jnum);
|
||||
*rval = INT_TO_JSVAL(n_jnum);
|
||||
} else if(SvNOK(sv)) {
|
||||
/* It appears that we have been sent an double return
|
||||
* value. Thats fine we can give javascript an double
|
||||
*/
|
||||
n_jdbl=SvNV(sv);
|
||||
|
||||
if(Debug)
|
||||
fprintf(stderr, "DEBUG: %lx is a double(%f)\n", (long) sv,n_jdbl);
|
||||
*rval = DOUBLE_TO_JSVAL(JS_NewDouble(cx, n_jdbl));
|
||||
} else if(SvPOK(sv)) {
|
||||
n_jstr = SvPV(sv, PL_na);
|
||||
//warn("DEBUG: %s (%d)\n", n_jstr);
|
||||
*rval = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, n_jstr));
|
||||
}
|
||||
}
|
||||
|
||||
PUTBACK;
|
||||
FREETMPS;
|
||||
LEAVE;
|
||||
|
||||
return JS_TRUE;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
static void
|
||||
ErrorReporter(JSContext *cx, const char *message, JSErrorReport *report) {
|
||||
/* --------------------------------------------------------------------- */
|
||||
char msg[400];
|
||||
snprintf(msg, sizeof(msg),
|
||||
"Error: %s at line %d: %s", message, report->lineno,
|
||||
report->linebuf);
|
||||
sv_setpv(get_sv("@", TRUE), msg);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
static JSBool
|
||||
BranchHandler(JSContext *cx, JSScript *script) {
|
||||
/* --------------------------------------------------------------------- */
|
||||
PJS_Context* pcx = (PJS_Context*) JS_GetContextPrivate(cx);
|
||||
|
||||
pcx->branch_count++;
|
||||
if (pcx->branch_count > pcx->branch_max) {
|
||||
return JS_FALSE;
|
||||
} else {
|
||||
return JS_TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
MODULE = JavaScript::SpiderMonkey PACKAGE = JavaScript::SpiderMonkey
|
||||
PROTOTYPES: DISABLE
|
||||
|
||||
######################################################################
|
||||
char *
|
||||
JS_GetImplementationVersion()
|
||||
######################################################################
|
||||
CODE:
|
||||
{
|
||||
RETVAL = (char *) JS_GetImplementationVersion();
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
JSRuntime *
|
||||
JS_NewRuntime(maxbytes)
|
||||
int maxbytes
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSRuntime *rt;
|
||||
CODE:
|
||||
{
|
||||
rt = JS_NewRuntime(maxbytes);
|
||||
if(!rt) {
|
||||
XSRETURN_UNDEF;
|
||||
}
|
||||
RETVAL = rt;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
int
|
||||
JS_DestroyRuntime(rt)
|
||||
JSRuntime *rt
|
||||
######################################################################
|
||||
CODE:
|
||||
{
|
||||
JS_DestroyRuntime(rt);
|
||||
RETVAL = 0;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
JSRuntime *
|
||||
JS_Init(maxbytes)
|
||||
int maxbytes
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSRuntime *rt;
|
||||
CODE:
|
||||
{
|
||||
rt = JS_Init(maxbytes);
|
||||
if(!rt) {
|
||||
XSRETURN_UNDEF;
|
||||
}
|
||||
/* Replace this by Debug = debug_enabled(); once
|
||||
* Log::Log4perl 0.47 is out */
|
||||
Debug = 0;
|
||||
RETVAL = rt;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
JSContext *
|
||||
JS_NewContext(rt, stack_chunk_size)
|
||||
JSRuntime *rt
|
||||
int stack_chunk_size
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSContext *cx;
|
||||
CODE:
|
||||
{
|
||||
PJS_Context* pcx;
|
||||
cx = JS_NewContext(rt, stack_chunk_size);
|
||||
if(!cx) {
|
||||
XSRETURN_UNDEF;
|
||||
}
|
||||
#ifdef E4X
|
||||
JS_SetOptions(cx,JSOPTION_XML);
|
||||
#endif
|
||||
|
||||
Newz(1, pcx, 1, PJS_Context);
|
||||
JS_SetContextPrivate(cx, (void *)pcx);
|
||||
|
||||
RETVAL = cx;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
int
|
||||
JS_DestroyContext(cx)
|
||||
JSContext *cx;
|
||||
######################################################################
|
||||
CODE:
|
||||
{
|
||||
JS_DestroyContext(cx);
|
||||
Safefree(JS_GetContextPrivate(cx));
|
||||
RETVAL = 0;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
JSObject *
|
||||
JS_NewObject(cx, class, proto, parent)
|
||||
JSContext * cx
|
||||
JSClass * class
|
||||
JSObject * proto
|
||||
JSObject * parent
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSObject *obj;
|
||||
CODE:
|
||||
{
|
||||
obj = JS_NewObject(cx, class, NULL, NULL);
|
||||
if(!obj) {
|
||||
XSRETURN_UNDEF;
|
||||
}
|
||||
RETVAL = obj;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
JSObject *
|
||||
JS_InitClass(cx, iobj, parent_proto, clasp, constructor, nargs, ps, fs, static_ps, static_fs)
|
||||
JSContext * cx
|
||||
JSObject *iobj
|
||||
JSObject *parent_proto
|
||||
JSClass *clasp
|
||||
JSNative constructor
|
||||
int nargs
|
||||
JSPropertySpec *ps
|
||||
JSFunctionSpec *fs
|
||||
JSPropertySpec *static_ps
|
||||
JSFunctionSpec *static_fs
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSObject *obj;
|
||||
uintN na;
|
||||
INIT:
|
||||
na = (uintN) nargs;
|
||||
CODE:
|
||||
{
|
||||
obj = JS_InitClass(cx, iobj, parent_proto, clasp,
|
||||
constructor, nargs, ps, fs, static_ps,
|
||||
static_fs);
|
||||
if(!obj) {
|
||||
XSRETURN_UNDEF;
|
||||
}
|
||||
RETVAL = obj;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
JSClass *
|
||||
JS_GlobalClass()
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSClass *gc;
|
||||
CODE:
|
||||
{
|
||||
gc = &global_class;
|
||||
RETVAL = gc;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
void
|
||||
JS_ForceLatest(cx)
|
||||
JSContext * cx
|
||||
######################################################################
|
||||
CODE:
|
||||
{
|
||||
JS_SetVersion(cx, JSVERSION_LATEST);
|
||||
}
|
||||
|
||||
######################################################################
|
||||
char*
|
||||
JS_RetEvaluateScript(cx, gobj, script, length, filename, lineno)
|
||||
JSContext * cx
|
||||
JSObject * gobj
|
||||
char * script
|
||||
int length
|
||||
char * filename
|
||||
int lineno
|
||||
######################################################################
|
||||
PREINIT:
|
||||
uintN len;
|
||||
uintN ln;
|
||||
int rc;
|
||||
jsval jsval;
|
||||
JSString *js_string;
|
||||
char *return_string;
|
||||
INIT:
|
||||
len = (uintN) length;
|
||||
ln = (uintN) lineno;
|
||||
CODE:
|
||||
{
|
||||
rc = JS_EvaluateScript(cx, gobj, script, len, filename,
|
||||
ln, &jsval);
|
||||
if(!rc) {
|
||||
XSRETURN_UNDEF;
|
||||
}
|
||||
|
||||
if( JSVAL_IS_OBJECT(jsval) )
|
||||
{
|
||||
SV* sv = NEWSV(5,10);
|
||||
JSObject *obj;
|
||||
JS_ValueToObject( cx, jsval, &obj );
|
||||
obj_to_str(cx,obj,sv);
|
||||
RETVAL = SvPVbyte_nolen( sv );
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
js_string = JS_ValueToString(cx, jsval);
|
||||
return_string = JS_GetStringBytes(js_string);
|
||||
RETVAL = return_string;
|
||||
}
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
int
|
||||
JS_EvaluateScript(cx, gobj, script, length, filename, lineno)
|
||||
JSContext * cx
|
||||
JSObject * gobj
|
||||
char * script
|
||||
int length
|
||||
char * filename
|
||||
int lineno
|
||||
######################################################################
|
||||
PREINIT:
|
||||
uintN len;
|
||||
uintN ln;
|
||||
int rc;
|
||||
jsval jsval;
|
||||
INIT:
|
||||
len = (uintN) length;
|
||||
ln = (uintN) lineno;
|
||||
CODE:
|
||||
{
|
||||
rc = JS_EvaluateScript(cx, gobj, script, len, filename,
|
||||
ln, &jsval);
|
||||
if(!rc) {
|
||||
XSRETURN_UNDEF;
|
||||
}
|
||||
RETVAL = rc;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
int
|
||||
JS_InitStandardClasses(cx, gobj)
|
||||
JSContext * cx
|
||||
JSObject * gobj
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSBool rc;
|
||||
CODE:
|
||||
{
|
||||
rc = JS_InitStandardClasses(cx, gobj);
|
||||
if(!rc) {
|
||||
XSRETURN_UNDEF;
|
||||
}
|
||||
RETVAL = (int) rc;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
int
|
||||
JS_DefineFunction(cx, obj, name, nargs, flags)
|
||||
JSContext * cx
|
||||
JSObject * obj
|
||||
char * name
|
||||
int nargs
|
||||
int flags
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSFunction *rc;
|
||||
CODE:
|
||||
{
|
||||
rc = JS_DefineFunction(cx, obj,
|
||||
(const char *) name, FunctionDispatcher,
|
||||
(uintN) nargs, (uintN) flags);
|
||||
if(!rc) {
|
||||
XSRETURN_UNDEF;
|
||||
}
|
||||
RETVAL = (int) rc;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
int
|
||||
JS_SetErrorReporter(cx)
|
||||
JSContext * cx
|
||||
######################################################################
|
||||
CODE:
|
||||
{
|
||||
JS_SetErrorReporter(cx, ErrorReporter);
|
||||
RETVAL = 0;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
JSObject *
|
||||
JS_DefineObject(cx, obj, name, class, proto)
|
||||
JSContext * cx
|
||||
JSObject * obj
|
||||
char * name
|
||||
JSClass * class
|
||||
JSObject * proto
|
||||
######################################################################
|
||||
PREINIT:
|
||||
SV *sv = sv_newmortal();
|
||||
CODE:
|
||||
{
|
||||
RETVAL = JS_DefineObject(cx, obj, name, class, proto, 0);
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
int
|
||||
JS_DefineProperty(cx, obj, name, value)
|
||||
JSContext * cx
|
||||
JSObject * obj
|
||||
char * name
|
||||
char * value
|
||||
#JSPropertyOp getter
|
||||
#JSPropertyOp setter
|
||||
#uintN flags
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSBool rc;
|
||||
JSString *str;
|
||||
CODE:
|
||||
{
|
||||
str = JS_NewStringCopyZ(cx, value);
|
||||
|
||||
/* This implementation is somewhat sub-optimal, since it
|
||||
* calls back into perl even if no getters/setters have
|
||||
* been defined. The necessity for a callback is determined
|
||||
* at the perl level, where there's a data structure mapping
|
||||
* out each object's properties and their getter/setter settings.
|
||||
*/
|
||||
rc = JS_DefineProperty(cx, obj, name, STRING_TO_JSVAL(str),
|
||||
getter_dispatcher, setter_dispatcher, 0);
|
||||
RETVAL = (int) rc;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
void
|
||||
JS_GetProperty(cx, obj, name)
|
||||
JSContext * cx
|
||||
JSObject * obj
|
||||
char * name
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSBool rc;
|
||||
jsval vp;
|
||||
JSString *str;
|
||||
SV *sv = sv_newmortal();
|
||||
PPCODE:
|
||||
{
|
||||
rc = JS_TRUE;
|
||||
rc = JS_GetProperty(cx, obj, name, &vp);
|
||||
if(rc) {
|
||||
str = JS_ValueToString(cx, vp);
|
||||
if(strcmp(JS_GetStringBytes(str), "undefined") == 0) {
|
||||
sv = &PL_sv_undef;
|
||||
} else {
|
||||
sv_setpv(sv, JS_GetStringBytes(str));
|
||||
}
|
||||
} else {
|
||||
sv = &PL_sv_undef;
|
||||
}
|
||||
XPUSHs(sv);
|
||||
}
|
||||
|
||||
######################################################################
|
||||
JSObject *
|
||||
JS_NewArrayObject(cx)
|
||||
JSContext * cx
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSObject *rc;
|
||||
CODE:
|
||||
{
|
||||
rc = JS_NewArrayObject(cx, 0, NULL);
|
||||
RETVAL = rc;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
int
|
||||
JS_SetElement(cx, obj, idx, valptr)
|
||||
JSContext *cx
|
||||
JSObject *obj
|
||||
int idx
|
||||
char *valptr
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSBool rc;
|
||||
JSString *str;
|
||||
jsval val;
|
||||
CODE:
|
||||
{
|
||||
str = JS_NewStringCopyZ(cx, valptr);
|
||||
val = STRING_TO_JSVAL(str);
|
||||
rc = JS_SetElement(cx, obj, idx, &val);
|
||||
if(rc) {
|
||||
RETVAL = 1;
|
||||
} else {
|
||||
RETVAL = 0;
|
||||
}
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
int
|
||||
JS_SetElementAsObject(cx, obj, idx, elobj)
|
||||
JSContext *cx
|
||||
JSObject *obj
|
||||
int idx
|
||||
JSObject *elobj
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSBool rc;
|
||||
jsval val;
|
||||
CODE:
|
||||
{
|
||||
val = OBJECT_TO_JSVAL(elobj);
|
||||
rc = JS_SetElement(cx, obj, idx, &val);
|
||||
if(rc) {
|
||||
RETVAL = 1;
|
||||
} else {
|
||||
RETVAL = 0;
|
||||
}
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
######################################################################
|
||||
void
|
||||
JS_GetElement(cx, obj, idx)
|
||||
JSContext *cx
|
||||
JSObject *obj
|
||||
int idx
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSBool rc;
|
||||
jsval vp;
|
||||
JSString *str;
|
||||
SV *sv = sv_newmortal();
|
||||
PPCODE:
|
||||
{
|
||||
rc = JS_GetElement(cx, obj, idx, &vp);
|
||||
if(rc) {
|
||||
str = JS_ValueToString(cx, vp);
|
||||
if(strcmp(JS_GetStringBytes(str), "undefined") == 0) {
|
||||
sv = &PL_sv_undef;
|
||||
} else {
|
||||
sv_setpv(sv, JS_GetStringBytes(str));
|
||||
}
|
||||
} else {
|
||||
sv = &PL_sv_undef;
|
||||
}
|
||||
XPUSHs(sv);
|
||||
}
|
||||
|
||||
######################################################################
|
||||
JSClass *
|
||||
JS_GetClass(cx, obj)
|
||||
JSContext * cx
|
||||
JSObject * obj
|
||||
######################################################################
|
||||
PREINIT:
|
||||
JSClass *rc;
|
||||
CODE:
|
||||
{
|
||||
#ifdef JS_THREADSAFE
|
||||
rc = JS_GetClass(cx, obj);
|
||||
#else
|
||||
rc = JS_GetClass(obj);
|
||||
#endif
|
||||
RETVAL = rc;
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
|
||||
######################################################################
|
||||
void
|
||||
JS_SetMaxBranchOperations(cx, max_branch_operations)
|
||||
JSContext *cx
|
||||
int max_branch_operations
|
||||
######################################################################
|
||||
CODE:
|
||||
{
|
||||
PJS_Context* pcx = (PJS_Context *) JS_GetContextPrivate(cx);
|
||||
pcx->branch_count = 0;
|
||||
pcx->branch_max = max_branch_operations;
|
||||
JS_SetBranchCallback(cx, BranchHandler);
|
||||
}
|
||||
OUTPUT:
|
||||
|
||||
|
||||
######################################################################
|
||||
|
|
@ -1,810 +0,0 @@
|
|||
10
|
||||
|
||||
dir
|
||||
475
|
||||
svn://erxz.com/bb3/branches/perlbuut/deps/JavaScript-SpiderMonkey-0.19-patched/t
|
||||
svn://erxz.com/bb3
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
dcb1cea6-7f7e-4c78-8a22-148ace8ce36e
|
||||
|
||||
04loop.t
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
052aecc1ebdaa0ead11238233ae9e5ae
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
has-props
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
543
|
||||
|
||||
001properties.t
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
74e475b5a99c51f2bb67598cf6697707
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
has-props
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
1837
|
||||
|
||||
000readme.t
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
289273fc220df68922686441714d5b5b
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
has-props
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
909
|
||||
|
||||
00array.t
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
02cac23a1988e6ab507d0c6036449959
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
has-props
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
487
|
||||
|
||||
006objmeth.t
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
e07e8e7be6e6bd4d3bb7dc8fd6976f80
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
has-props
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
1366
|
||||
|
||||
005error.t
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
e82e5ab0c2ba6981e9054865548c5c6c
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
has-props
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
640
|
||||
|
||||
004setget.t
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
388f649bb7374f728838a8b20f55caa8
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
has-props
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
2663
|
||||
|
||||
003properties.t
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
a65e4065a61c6e7f02f7f693760abca8
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
673
|
||||
|
||||
12dblret.t
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
a7916a2202255276a59f2e3f83ad9af9
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
763
|
||||
|
||||
08func2.t
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
66a09da3b8f4d7dc3b961cf10eab8bd2
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
487
|
||||
|
||||
13strret.t
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
59d3cecd83b3570288731abef7ad326a
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
819
|
||||
|
||||
01doc-href.t
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
e80d98b4a09abbb56324cdc372cf6002
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
has-props
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
487
|
||||
|
||||
02nav-appv.t
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
30e834fd2efb1165d28bc0f7269b931e
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
has-props
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
469
|
||||
|
||||
002functions.t
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
31f0487aee924b1494f2b235dbceb5c7
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
1605
|
||||
|
||||
06form2.t
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
655b103727acf1ab73e382a3f019a1e7
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
has-props
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
739
|
||||
|
||||
10elobj.t
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
37abbfec8a0e87939014be3fd21048f0
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
634
|
||||
|
||||
007funcret.t
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
afd19ff93c781c661046451392b9ed67
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
has-props
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
1367
|
||||
|
||||
03doc-write.t
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
2ef4539e393834a8311b43749cc6660c
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
has-props
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
449
|
||||
|
||||
07func.t
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
224aff71ecf2cd7afed1756111e69477
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
550
|
||||
|
||||
09meth.t
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
029ae9fa4c4690ed1983422785eea1b5
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
553
|
||||
|
||||
11intret.t
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
7f8d43a73df98e3cee3512d714d355df
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
923
|
||||
|
||||
05form.t
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
b7cf61e44e386e0d08e0028153c71847
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
has-props
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
602
|
||||
|
||||
init.pl
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
0197ac936fc64860a3175495240bde1d
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
778
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
K 14
|
||||
svn:executable
|
||||
V 1
|
||||
*
|
||||
END
|
|
@ -1,5 +0,0 @@
|
|||
K 14
|
||||
svn:executable
|
||||
V 1
|
||||
*
|
||||
END
|
|
@ -1,5 +0,0 @@
|
|||
K 14
|
||||
svn:executable
|
||||
V 1
|
||||
*
|
||||
END
|
|
@ -1,5 +0,0 @@
|
|||
K 14
|
||||
svn:executable
|
||||
V 1
|
||||
*
|
||||
END
|
|
@ -1,5 +0,0 @@
|
|||
K 14
|
||||
svn:executable
|
||||
V 1
|
||||
*
|
||||
END
|
|
@ -1,5 +0,0 @@
|
|||
K 14
|
||||
svn:executable
|
||||
V 1
|
||||
*
|
||||
END
|
|
@ -1,5 +0,0 @@
|
|||
K 14
|
||||
svn:executable
|
||||
V 1
|
||||
*
|
||||
END
|
|
@ -1,5 +0,0 @@
|
|||
K 14
|
||||
svn:executable
|
||||
V 1
|
||||
*
|
||||
END
|
|
@ -1,5 +0,0 @@
|
|||
K 14
|
||||
svn:executable
|
||||
V 1
|
||||
*
|
||||
END
|
|
@ -1,5 +0,0 @@
|
|||
K 14
|
||||
svn:executable
|
||||
V 1
|
||||
*
|
||||
END
|
|
@ -1,5 +0,0 @@
|
|||
K 14
|
||||
svn:executable
|
||||
V 1
|
||||
*
|
||||
END
|
|
@ -1,5 +0,0 @@
|
|||
K 14
|
||||
svn:executable
|
||||
V 1
|
||||
*
|
||||
END
|
|
@ -1,5 +0,0 @@
|
|||
K 14
|
||||
svn:executable
|
||||
V 1
|
||||
*
|
||||
END
|
|
@ -1,33 +0,0 @@
|
|||
######################################################################
|
||||
# Testcase: Run the sample code from the README file
|
||||
# Revision: $Revision: 1.1.1.1 $
|
||||
# Last Checkin: $Date: 2006/02/01 06:00:49 $
|
||||
# By: $Author: mschilli $
|
||||
#
|
||||
# Author: Mike Schilli m@perlmeister.com, 2002
|
||||
######################################################################
|
||||
|
||||
use warnings;
|
||||
use strict;
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
open FILE, "<SpiderMonkey.pm" or die "Cannot open";
|
||||
my $data = join '', <FILE>;
|
||||
close FILE;
|
||||
|
||||
my $buffer = "";
|
||||
|
||||
# Overwrite print() with our own routine filling $buffer
|
||||
if(my($code) = ($data =~ /SYNOPSIS(.*?)=head1 INSTALL/s)) {
|
||||
$code =~ s/print /myprint/g;
|
||||
eval "sub myprint { \$buffer .= join('', \@_) } $code;
|
||||
\$buffer.=\$rc;
|
||||
\$buffer.=\$url;";
|
||||
}
|
||||
|
||||
if($buffer ne "URL is http://www.aol.com\n1http://www.aol.com") {
|
||||
print "not ('$buffer')";
|
||||
}
|
||||
|
||||
print "ok 1\n";
|
|
@ -1,63 +0,0 @@
|
|||
######################################################################
|
||||
# Testcase: Set/Get properties of objects
|
||||
# Revision: $Revision: 1.1.1.1 $
|
||||
# Last Checkin: $Date: 2006/02/01 06:00:49 $
|
||||
# By: $Author: mschilli $
|
||||
#
|
||||
# Author: Mike Schilli m@perlmeister.com, 2002
|
||||
######################################################################
|
||||
|
||||
use warnings;
|
||||
use strict;
|
||||
|
||||
print "1..5\n";
|
||||
|
||||
use JavaScript::SpiderMonkey;
|
||||
my $js = JavaScript::SpiderMonkey->new();
|
||||
$js->init();
|
||||
|
||||
$js->property_by_path("navigator.appName");
|
||||
$js->property_by_path("navigator.userAgent");
|
||||
$js->property_by_path("navigator.appVersion");
|
||||
$js->property_by_path("document.cookie");
|
||||
$js->property_by_path("parent.location");
|
||||
$js->property_by_path("document.location.href");
|
||||
$js->property_by_path("document.location.yodel");
|
||||
|
||||
# Function to write something from JS to a Perl $buffer
|
||||
my $buffer;
|
||||
my $doc = $js->object_by_path("document");
|
||||
$js->function_set("write", sub { $buffer .= join('', @_) }, $doc);
|
||||
$buffer = "";
|
||||
|
||||
my $code = <<EOT;
|
||||
navigator.appName = "Netscape";
|
||||
navigator.appVersion = "3";
|
||||
navigator.userAgent = "Grugenheimer";
|
||||
document.cookie = "k=v; domain=.netscape.com";
|
||||
parent.location = "http://www.aol.com";
|
||||
document.write(navigator.userAgent);
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($code);
|
||||
|
||||
# Check return code
|
||||
print "not " if $rc != 1;
|
||||
print "ok 1\n";
|
||||
|
||||
# Check simple property
|
||||
print "not " unless $js->property_get("navigator.appName") eq "Netscape";
|
||||
print "ok 2\n";
|
||||
|
||||
# Check simple property
|
||||
print "not " unless $js->property_get("navigator.appVersion") eq "3";
|
||||
print "ok 3\n";
|
||||
|
||||
# Check simple property
|
||||
print "not " unless
|
||||
$js->property_get("document.cookie") eq "k=v; domain=.netscape.com";
|
||||
print "ok 4\n";
|
||||
|
||||
# Check buffer from document.write()
|
||||
print "not " unless $buffer eq "Grugenheimer";
|
||||
print "ok 5\n";
|
|
@ -1,60 +0,0 @@
|
|||
######################################################################
|
||||
# Testcase: Define Functions and Perl callbacks
|
||||
# Revision: $Revision: 1.1.1.1 $
|
||||
# Last Checkin: $Date: 2006/02/01 06:00:49 $
|
||||
# By: $Author: mschilli $
|
||||
#
|
||||
# Author: Mike Schilli m@perlmeister.com, 2002
|
||||
######################################################################
|
||||
|
||||
print "1..3\n";
|
||||
|
||||
use JavaScript::SpiderMonkey;
|
||||
my $js = JavaScript::SpiderMonkey->new();
|
||||
$js->init();
|
||||
|
||||
$js->object_by_path("navigator.appName");
|
||||
$js->object_by_path("document.location");
|
||||
my $parloc = $js->object_by_path("parent.location");
|
||||
$js->function_set("replace",
|
||||
sub { $buffer .= "URL:$_[0]"; }, $parloc);
|
||||
|
||||
# Function write()
|
||||
our $buffer;
|
||||
$js->function_set("write", sub { $buffer .= "f0" . join('', @_) });
|
||||
|
||||
# Method navigator.write()
|
||||
my $doc = $js->object_by_path("document.location");
|
||||
$js->function_set("slice", sub { $buffer .= "f1" . join('', @_) }, $doc);
|
||||
|
||||
# Method navigator.appName.write()
|
||||
$doc = $js->object_by_path("navigator.appName");
|
||||
$js->function_set("dice", sub { $buffer .= "f2" . join('', @_) }, $doc);
|
||||
|
||||
$buffer = "";
|
||||
|
||||
my $code = <<EOT;
|
||||
for(i = 0; i < 2; i++) {
|
||||
write("v1 ");
|
||||
document.location.slice("v2 ");
|
||||
navigator.appName.dice("v3 ");
|
||||
parent.location.replace("testurl");
|
||||
}
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($code);
|
||||
|
||||
# Check return code
|
||||
print "not " if $rc != 1;
|
||||
print "ok 1\n";
|
||||
|
||||
# print $buffer;
|
||||
# Check buffer for traces of function/method calls
|
||||
|
||||
print "not " unless $buffer eq
|
||||
"f0v1 f1v2 f2v3 URL:testurlf0v1 f1v2 f2v3 URL:testurl";
|
||||
print "ok 2\n";
|
||||
|
||||
$js->destroy();
|
||||
|
||||
print "ok 3\n";
|
|
@ -1,25 +0,0 @@
|
|||
######################################################################
|
||||
# Testcase: Properties of multi-tiered objects
|
||||
# Revision: $Revision: 1.1.1.1 $
|
||||
# Last Checkin: $Date: 2006/02/01 06:00:49 $
|
||||
# By: $Author: mschilli $
|
||||
#
|
||||
# Author: Mike Schilli m@perlmeister.com, 2002
|
||||
######################################################################
|
||||
|
||||
print "1..2\n";
|
||||
|
||||
use JavaScript::SpiderMonkey;
|
||||
my $js = JavaScript::SpiderMonkey->new();
|
||||
$js->init();
|
||||
|
||||
$js->property_by_path("parent.location.href", "abc");
|
||||
my $res = $js->property_get("parent.location.href");
|
||||
|
||||
# Check return code
|
||||
print "not " if $res ne "abc";
|
||||
print "ok 1\n";
|
||||
|
||||
$js->destroy();
|
||||
|
||||
print "ok 2\n";
|
|
@ -1,119 +0,0 @@
|
|||
######################################################################
|
||||
# Testcase: Set/Get properties of objects
|
||||
# Revision: $Revision: 1.1.1.1 $
|
||||
# Last Checkin: $Date: 2006/02/01 06:00:49 $
|
||||
# By: $Author: mschilli $
|
||||
#
|
||||
# Author: Mike Schilli m@perlmeister.com, 2002
|
||||
######################################################################
|
||||
|
||||
use warnings;
|
||||
use strict;
|
||||
|
||||
print "1..6\n";
|
||||
|
||||
use JavaScript::SpiderMonkey;
|
||||
my $js = JavaScript::SpiderMonkey->new();
|
||||
$js->init();
|
||||
|
||||
our $buffer = "";
|
||||
|
||||
sub getter {
|
||||
my(@args) = @_;
|
||||
$buffer .= "GETTER: @args\n";
|
||||
}
|
||||
|
||||
sub setter {
|
||||
my(@args) = @_;
|
||||
$buffer .= "SETTER: @args\n";
|
||||
}
|
||||
|
||||
$js->property_by_path("navigator.appName", "", \&getter, \&setter);
|
||||
|
||||
# Function to write something from JS to a Perl $buffer
|
||||
|
||||
my $code = <<EOT;
|
||||
navigator.appName = "Netscape";
|
||||
navigator.schnapp = navigator.appName;
|
||||
navigator.appName = "Netscape2";
|
||||
navigator.schnapp = navigator.appName;
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($code);
|
||||
|
||||
# Check return code
|
||||
print "not " if $rc != 1;
|
||||
print "ok 1\n";
|
||||
|
||||
# Check output
|
||||
my $wanted = "SETTER: navigator.appName Netscape\n" .
|
||||
"GETTER: navigator.appName Netscape\n" .
|
||||
"SETTER: navigator.appName Netscape2\n" .
|
||||
"GETTER: navigator.appName Netscape2\n";
|
||||
if($buffer ne $wanted) {
|
||||
print "not ok 2\n";
|
||||
print "Expected $wanted but got '$buffer'\n";
|
||||
} else {
|
||||
print "ok 2\n";
|
||||
}
|
||||
|
||||
$js->destroy();
|
||||
|
||||
##################################################
|
||||
# Setter only, no getter
|
||||
##################################################
|
||||
$js = JavaScript::SpiderMonkey->new();
|
||||
$js->init();
|
||||
|
||||
$buffer = "";
|
||||
|
||||
$js->property_by_path("navigator.appName", "", undef, \&setter);
|
||||
|
||||
$rc = $js->eval($code);
|
||||
|
||||
# Check return code
|
||||
print "not " if $rc != 1;
|
||||
print "ok 3\n";
|
||||
|
||||
# Check output
|
||||
$wanted = "SETTER: navigator.appName Netscape\n" .
|
||||
"SETTER: navigator.appName Netscape2\n";
|
||||
|
||||
if($buffer ne $wanted) {
|
||||
print "not ok 4\n";
|
||||
print "Expected $wanted but got '$buffer'\n";
|
||||
} else {
|
||||
print "ok 4\n";
|
||||
}
|
||||
|
||||
$js->destroy();
|
||||
|
||||
##################################################
|
||||
# Getter only, no setter
|
||||
##################################################
|
||||
$js = JavaScript::SpiderMonkey->new();
|
||||
$js->init();
|
||||
|
||||
$buffer = "";
|
||||
|
||||
$js->property_by_path("navigator.appName", "", \&getter);
|
||||
|
||||
$rc = $js->eval($code);
|
||||
|
||||
# Check return code
|
||||
print "not " if $rc != 1;
|
||||
print "ok 5\n";
|
||||
|
||||
# Check output
|
||||
$wanted = "GETTER: navigator.appName Netscape\n" .
|
||||
"GETTER: navigator.appName Netscape2\n";
|
||||
|
||||
if($buffer ne $wanted) {
|
||||
print "not ok 6\n";
|
||||
print "Expected $wanted but got '$buffer'\n";
|
||||
} else {
|
||||
print "ok 6\n";
|
||||
}
|
||||
|
||||
$js->destroy();
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
######################################################################
|
||||
# Testcase: Produce an error and check $@
|
||||
# Revision: $Revision: 1.1.1.1 $
|
||||
# Last Checkin: $Date: 2006/02/01 06:00:49 $
|
||||
# By: $Author: mschilli $
|
||||
#
|
||||
# Author: Mike Schilli m@perlmeister.com, 2004
|
||||
######################################################################
|
||||
|
||||
use warnings;
|
||||
use strict;
|
||||
|
||||
use JavaScript::SpiderMonkey;
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
my $js = JavaScript::SpiderMonkey->new();
|
||||
$js->init();
|
||||
|
||||
my $code = <<EOT;
|
||||
foo = "bar;
|
||||
EOT
|
||||
|
||||
$js->eval($code);
|
||||
|
||||
if($@ =~ /unterminated string literal/) {
|
||||
print "ok 1\n";
|
||||
} else {
|
||||
print "not ok 1\n";
|
||||
}
|
|
@ -1,44 +0,0 @@
|
|||
######################################################################
|
||||
# Testcase: Functions/Methods for different objects
|
||||
# Revision: $Revision: 1.1.1.1 $
|
||||
# Last Checkin: $Date: 2006/02/01 06:00:49 $
|
||||
# By: $Author: mschilli $
|
||||
#
|
||||
# Author: Mike Schilli m@perlmeister.com, 2004
|
||||
######################################################################
|
||||
|
||||
use warnings;
|
||||
use strict;
|
||||
|
||||
use Test::More qw(no_plan);
|
||||
|
||||
use JavaScript::SpiderMonkey;
|
||||
my $js = JavaScript::SpiderMonkey->new();
|
||||
$js->init();
|
||||
|
||||
$js->property_by_path("document.location.href");
|
||||
$js->property_by_path("document.location.yodel");
|
||||
$js->property_by_path("document.someobj.someprop");
|
||||
|
||||
# Function to write something from JS to a Perl $buffer
|
||||
my $location_buffer;
|
||||
my $doc = $js->object_by_path("document.location");
|
||||
$js->function_set("write", sub { $location_buffer .= join('', @_) }, $doc);
|
||||
|
||||
my $someobj_buffer;
|
||||
my $someobj = $js->object_by_path("document.someobj");
|
||||
$js->function_set("write", sub { $someobj_buffer .= join('', @_) }, $someobj);
|
||||
|
||||
my $code = <<EOT;
|
||||
document.location.write("location message");
|
||||
document.someobj.write("someobj message");
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($code);
|
||||
|
||||
# Check return code
|
||||
ok($rc, "JS return code");
|
||||
|
||||
# Check location buffer
|
||||
is($location_buffer, "location message", "check loc buffer");
|
||||
is($someobj_buffer, "someobj message", "check someobj buffer");
|
|
@ -1,47 +0,0 @@
|
|||
######################################################################
|
||||
# Testcase: Returning values from perl callbacks
|
||||
# Revision: $Revision: 1.2 $
|
||||
# Last Checkin: $Date: 2006/06/13 13:42:58 $
|
||||
# By: $Author: thomas_busch $
|
||||
#
|
||||
# Author: Mike Schilli m@perlmeister.com, 2004
|
||||
######################################################################
|
||||
|
||||
use warnings;
|
||||
use strict;
|
||||
|
||||
use Test::More qw(no_plan);
|
||||
|
||||
use JavaScript::SpiderMonkey;
|
||||
use Log::Log4perl qw(:easy);
|
||||
Log::Log4perl->easy_init($ERROR);
|
||||
|
||||
my $buffer = "";
|
||||
|
||||
my $js = JavaScript::SpiderMonkey->new();
|
||||
$js->init();
|
||||
|
||||
# Example by Chris Blaise:
|
||||
# Let new function document.getElementById('id') (defined in Perl space)
|
||||
# return an object into JS.
|
||||
|
||||
my $doc = $js->object_by_path('document' );
|
||||
$js->property_by_path('fooobj.style' );
|
||||
$js->function_set( 'getElementById', sub {
|
||||
if(exists $JavaScript::SpiderMonkey::GLOBAL->{objects}->{'fooobj'}) {
|
||||
return $JavaScript::SpiderMonkey::GLOBAL->{objects}->{'fooobj'};
|
||||
}
|
||||
}, $doc);
|
||||
$js->function_set("write", sub {
|
||||
$buffer .= join('', map { "[$_]" } @_) }, $doc);
|
||||
|
||||
my $code = q{
|
||||
document.getElementById('bleh').style = 'something';
|
||||
document.write(fooobj.style);
|
||||
};
|
||||
|
||||
my $rc = $js->eval($code);
|
||||
|
||||
# Check return code
|
||||
ok($rc, "Function returning object");
|
||||
is($buffer, "[something]", "Attribute assigned correctly");
|
|
@ -1,23 +0,0 @@
|
|||
######################################################################
|
||||
# Create an array as part of an object
|
||||
######################################################################
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
$init = "";
|
||||
require "t/init.pl";
|
||||
|
||||
$js->array_by_path("document.form");
|
||||
|
||||
my $source = <<EOT;
|
||||
$init
|
||||
document.form[0] = "abc";
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($source);
|
||||
die "eval returned undef" unless $rc;
|
||||
if($js->property_get("navigator.appVersion") ne "3") {
|
||||
print "not ";
|
||||
}
|
||||
|
||||
print "ok 1\n";
|
|
@ -1,24 +0,0 @@
|
|||
######################################################################
|
||||
# Set and retrieve document.location.href
|
||||
######################################################################
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
$init = "";
|
||||
|
||||
require "t/init.pl";
|
||||
|
||||
my $source = <<EOT;
|
||||
$init
|
||||
document.location.href = "http://www.com";
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($source);
|
||||
|
||||
die "eval returned undef" unless $rc;
|
||||
|
||||
if($js->property_get("document.location.href") ne "http://www.com") {
|
||||
print "not ";
|
||||
}
|
||||
|
||||
print "ok 1\n";
|
|
@ -1,21 +0,0 @@
|
|||
######################################################################
|
||||
# Set and retrieve document.location.href
|
||||
######################################################################
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
$init = "";
|
||||
require "t/init.pl";
|
||||
|
||||
my $source = <<EOT;
|
||||
$init
|
||||
document.location.href = "http://www.com";
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($source);
|
||||
die "eval returned undef" unless $rc;
|
||||
if($js->property_get("navigator.appVersion") ne "3") {
|
||||
print "not ";
|
||||
}
|
||||
|
||||
print "ok 1\n";
|
|
@ -1,21 +0,0 @@
|
|||
######################################################################
|
||||
# Set and retrieve document.location.href
|
||||
######################################################################
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
$init = "";
|
||||
require "t/init.pl";
|
||||
|
||||
my $source = <<EOT;
|
||||
$init
|
||||
document.write("abc");
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($source);
|
||||
die "eval returned undef" unless $rc;
|
||||
if($js->property_get("navigator.appVersion") ne "3") {
|
||||
print "not ";
|
||||
}
|
||||
|
||||
print "ok 1\n";
|
|
@ -1,31 +0,0 @@
|
|||
######################################################################
|
||||
# docwrite()
|
||||
######################################################################
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
$init = "";
|
||||
require "t/init.pl";
|
||||
|
||||
my $source = <<EOT;
|
||||
$init
|
||||
document.write("abc");
|
||||
EOT
|
||||
my $oks = 0;
|
||||
my $nof = 100;
|
||||
|
||||
for my $i (1..$nof) {
|
||||
my $rc = $js->eval($source);
|
||||
die "eval returned undef" unless $rc;
|
||||
if($js->property_get("navigator.appVersion") eq "3") {
|
||||
$oks++;
|
||||
}
|
||||
}
|
||||
|
||||
if($nof != $oks) {
|
||||
print "not ";
|
||||
}
|
||||
|
||||
print "ok 1\n";
|
||||
|
||||
$js->destroy();
|
|
@ -1,31 +0,0 @@
|
|||
######################################################################
|
||||
# docwrite()
|
||||
######################################################################
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
$init = "";
|
||||
require "t/init.pl";
|
||||
|
||||
my $source = <<EOT;
|
||||
$init
|
||||
function FormSubmit () {
|
||||
document.location.href = "submitted!";
|
||||
}
|
||||
function Form() {
|
||||
this.submit = FormSubmit;
|
||||
}
|
||||
|
||||
document.form[0] = new Form;
|
||||
document.form[0].submit();
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($source);
|
||||
die "eval returned undef" unless $rc;
|
||||
if($js->property_get("document.location.href") ne "submitted!") {
|
||||
print "not ";
|
||||
}
|
||||
|
||||
print "ok 1\n";
|
||||
|
||||
$js->destroy();
|
|
@ -1,35 +0,0 @@
|
|||
######################################################################
|
||||
# docwrite()
|
||||
######################################################################
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
$init = "";
|
||||
require "t/init.pl";
|
||||
|
||||
my $a = $js->array_by_path("document.array");
|
||||
my $e = $js->array_set_element($a, 0, "gurkenhobel");
|
||||
#print "SetElement returned $e\n";
|
||||
my $r = $js->array_get_element($a, 0);
|
||||
#print "r=$r\n";
|
||||
#print $js->dump();
|
||||
|
||||
my $source = <<EOT;
|
||||
$init
|
||||
document.location.href = document.array[0];
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($source);
|
||||
|
||||
die "eval returned undef" unless $rc;
|
||||
|
||||
my $val = $js->property_get("document.location.href");
|
||||
|
||||
if($val ne "gurkenhobel") {
|
||||
print STDERR "Val is '$val'\n";
|
||||
print "not ";
|
||||
}
|
||||
|
||||
print "ok 1\n";
|
||||
|
||||
$js->destroy();
|
|
@ -1,27 +0,0 @@
|
|||
######################################################################
|
||||
# functions
|
||||
######################################################################
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
$init = "";
|
||||
$buffer = "";
|
||||
require "t/init.pl";
|
||||
|
||||
my $source = <<EOT;
|
||||
$init
|
||||
document.write("abc", "def");
|
||||
document.write("abc2", "def2");
|
||||
document.write("abc3", "def3");
|
||||
document.write("abc4", "def4");
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($source);
|
||||
die "eval returned undef" unless $rc;
|
||||
|
||||
if($buffer ne "abcdefabc2def2abc3def3abc4def4") {
|
||||
print "not ";
|
||||
}
|
||||
print "ok 1\n";
|
||||
|
||||
$js->destroy();
|
|
@ -1,29 +0,0 @@
|
|||
######################################################################
|
||||
# functions2
|
||||
######################################################################
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
$init = "";
|
||||
require "t/init.pl";
|
||||
|
||||
$args = "";
|
||||
|
||||
$js->function_set("farz", sub { $args = join '', @_ });
|
||||
|
||||
my $source = <<EOT;
|
||||
$init
|
||||
farz("abc", "def", 3, 5, 8);
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($source);
|
||||
|
||||
die "eval returned undef" unless $rc;
|
||||
|
||||
if($args ne "abcdef358") {
|
||||
print "not ";
|
||||
}
|
||||
|
||||
print "ok 1\n";
|
||||
|
||||
$js->destroy();
|
|
@ -1,30 +0,0 @@
|
|||
######################################################################
|
||||
# functions2
|
||||
######################################################################
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
$init = "";
|
||||
require "t/init.pl";
|
||||
|
||||
$args = "";
|
||||
|
||||
my $docobj = $js->object_by_path("document");
|
||||
$js->function_set("schnubbel", sub { $args = join '', @_; });
|
||||
|
||||
my $source = <<EOT;
|
||||
$init
|
||||
document.schnubbel("abc", "def", 3, 5, 8);
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($source);
|
||||
|
||||
die "eval returned undef" unless $rc;
|
||||
|
||||
if($args ne "abcdef358") {
|
||||
print "not ";
|
||||
}
|
||||
|
||||
print "ok 1\n";
|
||||
|
||||
$js->destroy();
|
|
@ -1,33 +0,0 @@
|
|||
######################################################################
|
||||
# functions2
|
||||
######################################################################
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
$init = "";
|
||||
require "t/init.pl";
|
||||
|
||||
$submitted = "0";
|
||||
|
||||
my $obj = $js->object_by_path("submitter");
|
||||
$js->function_set("submit", sub { $submitted = 1 });
|
||||
|
||||
my $forms = $js->array_by_path("document.forms");
|
||||
my $e = $js->array_set_element_as_object($forms, 0, $obj);
|
||||
|
||||
my $source = <<EOT;
|
||||
$init
|
||||
document.forms[0].submit();
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($source);
|
||||
|
||||
die "eval returned undef" unless $rc;
|
||||
|
||||
if(!$submitted) {
|
||||
print "not ";
|
||||
}
|
||||
|
||||
print "ok 1\n";
|
||||
|
||||
$js->destroy();
|
|
@ -1,29 +0,0 @@
|
|||
######################################################################
|
||||
# Testcase: Returning integer values from perl
|
||||
# Revision: $Revision: 1.1 $
|
||||
# Last Checkin: $Date: 2006/06/13 13:43:51 $
|
||||
# By: $Author: thomas_busch $
|
||||
#
|
||||
# Author: Marc Relation marc@igneousconsulting.com
|
||||
######################################################################
|
||||
|
||||
use warnings;
|
||||
use strict;
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
use JavaScript::SpiderMonkey;
|
||||
|
||||
my $js=new JavaScript::SpiderMonkey;
|
||||
my $buffer;
|
||||
$js->init;
|
||||
$js->function_set('get_int',sub {return(1000);});
|
||||
$js->function_set('get_float',sub {return(10.21);});
|
||||
$js->function_set('booltest',sub {return 1==$_[0];});
|
||||
#$js->function_set('write',sub {print STDERR $_[0] . "\n"});
|
||||
$js->function_set("write",sub { $buffer .= join('', @_) });
|
||||
$js->eval("write(get_int()+1);");
|
||||
$js->destroy;
|
||||
# Check buffer from document.write()
|
||||
print "not " unless $buffer == 1001;
|
||||
print "ok 1\n";
|
|
@ -1,25 +0,0 @@
|
|||
######################################################################
|
||||
# Testcase: Returning double values from perl
|
||||
# Revision: $Revision: 1.1 $
|
||||
# Last Checkin: $Date: 2006/06/13 13:43:51 $
|
||||
# By: $Author: thomas_busch $
|
||||
#
|
||||
# Author: Marc Relation marc@igneousconsulting.com
|
||||
######################################################################
|
||||
|
||||
use warnings;
|
||||
use strict;
|
||||
|
||||
print "1..1\n";
|
||||
use JavaScript::SpiderMonkey;
|
||||
|
||||
my $js=new JavaScript::SpiderMonkey;
|
||||
my $buffer;
|
||||
$js->init;
|
||||
$js->function_set('get_double',sub {return(10.21);});
|
||||
$js->function_set("write",sub { $buffer .= join('', @_) });
|
||||
$js->eval("write(get_double()+1.2);");
|
||||
$js->destroy;
|
||||
# Check buffer from document.write()
|
||||
print "not " unless $buffer == 11.41;
|
||||
print "ok 1\n";
|
|
@ -1,25 +0,0 @@
|
|||
######################################################################
|
||||
# Testcase: Returning string values from perl
|
||||
# Revision: $Revision: 1.1 $
|
||||
# Last Checkin: $Date: 2006/06/13 13:43:51 $
|
||||
# By: $Author: thomas_busch $
|
||||
#
|
||||
# Author: Marc Relation marc@igneousconsulting.com
|
||||
######################################################################
|
||||
|
||||
use warnings;
|
||||
use strict;
|
||||
use Test::More tests => 1;
|
||||
|
||||
use JavaScript::SpiderMonkey;
|
||||
|
||||
my $js = new JavaScript::SpiderMonkey;
|
||||
my $buffer;
|
||||
$js->init;
|
||||
$js->function_set('get_string',sub { return "John Doe";});
|
||||
#$js->function_set('write',sub {print STDERR $_[0] . "\n"});
|
||||
$js->function_set("write",sub { $buffer .= join('', @_) });
|
||||
$js->eval("write(get_string()+' who');");
|
||||
$js->destroy;
|
||||
# Check buffer from document.write()
|
||||
is $buffer, 'John Doe who';
|
|
@ -1,28 +0,0 @@
|
|||
|
||||
use JavaScript::SpiderMonkey;
|
||||
|
||||
my $docloc = "http://wurks";
|
||||
$js = JavaScript::SpiderMonkey->new();
|
||||
$js->init();
|
||||
|
||||
$js->property_by_path("navigator.appName");
|
||||
$js->property_by_path("navigator.userAgent");
|
||||
$js->property_by_path("navigator.appVersion");
|
||||
$js->property_by_path("document.cookie");
|
||||
$js->property_by_path("parent.location");
|
||||
$js->property_by_path("document.location.href");
|
||||
|
||||
my $doc = $js->object_by_path("document");
|
||||
$js->function_set("write", sub { $buffer .= join('', @_) }, $doc);
|
||||
$buffer = "";
|
||||
|
||||
$init = <<EOT;
|
||||
navigator.appName = "Netscape";
|
||||
navigator.appVersion = "3";
|
||||
navigator.userAgent = "Grugenheimer";
|
||||
document.cookie = "";
|
||||
parent.location = "";
|
||||
document.location.href = "$docloc";
|
||||
document.form = new Array(100);
|
||||
EOT
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
######################################################################
|
||||
# Testcase: Run the sample code from the README file
|
||||
# Revision: $Revision: 1.1.1.1 $
|
||||
# Last Checkin: $Date: 2006/02/01 06:00:49 $
|
||||
# By: $Author: mschilli $
|
||||
#
|
||||
# Author: Mike Schilli m@perlmeister.com, 2002
|
||||
######################################################################
|
||||
|
||||
use warnings;
|
||||
use strict;
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
open FILE, "<SpiderMonkey.pm" or die "Cannot open";
|
||||
my $data = join '', <FILE>;
|
||||
close FILE;
|
||||
|
||||
my $buffer = "";
|
||||
|
||||
# Overwrite print() with our own routine filling $buffer
|
||||
if(my($code) = ($data =~ /SYNOPSIS(.*?)=head1 INSTALL/s)) {
|
||||
$code =~ s/print /myprint/g;
|
||||
eval "sub myprint { \$buffer .= join('', \@_) } $code;
|
||||
\$buffer.=\$rc;
|
||||
\$buffer.=\$url;";
|
||||
}
|
||||
|
||||
if($buffer ne "URL is http://www.aol.com\n1http://www.aol.com") {
|
||||
print "not ('$buffer')";
|
||||
}
|
||||
|
||||
print "ok 1\n";
|
|
@ -1,63 +0,0 @@
|
|||
######################################################################
|
||||
# Testcase: Set/Get properties of objects
|
||||
# Revision: $Revision: 1.1.1.1 $
|
||||
# Last Checkin: $Date: 2006/02/01 06:00:49 $
|
||||
# By: $Author: mschilli $
|
||||
#
|
||||
# Author: Mike Schilli m@perlmeister.com, 2002
|
||||
######################################################################
|
||||
|
||||
use warnings;
|
||||
use strict;
|
||||
|
||||
print "1..5\n";
|
||||
|
||||
use JavaScript::SpiderMonkey;
|
||||
my $js = JavaScript::SpiderMonkey->new();
|
||||
$js->init();
|
||||
|
||||
$js->property_by_path("navigator.appName");
|
||||
$js->property_by_path("navigator.userAgent");
|
||||
$js->property_by_path("navigator.appVersion");
|
||||
$js->property_by_path("document.cookie");
|
||||
$js->property_by_path("parent.location");
|
||||
$js->property_by_path("document.location.href");
|
||||
$js->property_by_path("document.location.yodel");
|
||||
|
||||
# Function to write something from JS to a Perl $buffer
|
||||
my $buffer;
|
||||
my $doc = $js->object_by_path("document");
|
||||
$js->function_set("write", sub { $buffer .= join('', @_) }, $doc);
|
||||
$buffer = "";
|
||||
|
||||
my $code = <<EOT;
|
||||
navigator.appName = "Netscape";
|
||||
navigator.appVersion = "3";
|
||||
navigator.userAgent = "Grugenheimer";
|
||||
document.cookie = "k=v; domain=.netscape.com";
|
||||
parent.location = "http://www.aol.com";
|
||||
document.write(navigator.userAgent);
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($code);
|
||||
|
||||
# Check return code
|
||||
print "not " if $rc != 1;
|
||||
print "ok 1\n";
|
||||
|
||||
# Check simple property
|
||||
print "not " unless $js->property_get("navigator.appName") eq "Netscape";
|
||||
print "ok 2\n";
|
||||
|
||||
# Check simple property
|
||||
print "not " unless $js->property_get("navigator.appVersion") eq "3";
|
||||
print "ok 3\n";
|
||||
|
||||
# Check simple property
|
||||
print "not " unless
|
||||
$js->property_get("document.cookie") eq "k=v; domain=.netscape.com";
|
||||
print "ok 4\n";
|
||||
|
||||
# Check buffer from document.write()
|
||||
print "not " unless $buffer eq "Grugenheimer";
|
||||
print "ok 5\n";
|
|
@ -1,60 +0,0 @@
|
|||
######################################################################
|
||||
# Testcase: Define Functions and Perl callbacks
|
||||
# Revision: $Revision: 1.1.1.1 $
|
||||
# Last Checkin: $Date: 2006/02/01 06:00:49 $
|
||||
# By: $Author: mschilli $
|
||||
#
|
||||
# Author: Mike Schilli m@perlmeister.com, 2002
|
||||
######################################################################
|
||||
|
||||
print "1..3\n";
|
||||
|
||||
use JavaScript::SpiderMonkey;
|
||||
my $js = JavaScript::SpiderMonkey->new();
|
||||
$js->init();
|
||||
|
||||
$js->object_by_path("navigator.appName");
|
||||
$js->object_by_path("document.location");
|
||||
my $parloc = $js->object_by_path("parent.location");
|
||||
$js->function_set("replace",
|
||||
sub { $buffer .= "URL:$_[0]"; }, $parloc);
|
||||
|
||||
# Function write()
|
||||
our $buffer;
|
||||
$js->function_set("write", sub { $buffer .= "f0" . join('', @_) });
|
||||
|
||||
# Method navigator.write()
|
||||
my $doc = $js->object_by_path("document.location");
|
||||
$js->function_set("slice", sub { $buffer .= "f1" . join('', @_) }, $doc);
|
||||
|
||||
# Method navigator.appName.write()
|
||||
$doc = $js->object_by_path("navigator.appName");
|
||||
$js->function_set("dice", sub { $buffer .= "f2" . join('', @_) }, $doc);
|
||||
|
||||
$buffer = "";
|
||||
|
||||
my $code = <<EOT;
|
||||
for(i = 0; i < 2; i++) {
|
||||
write("v1 ");
|
||||
document.location.slice("v2 ");
|
||||
navigator.appName.dice("v3 ");
|
||||
parent.location.replace("testurl");
|
||||
}
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($code);
|
||||
|
||||
# Check return code
|
||||
print "not " if $rc != 1;
|
||||
print "ok 1\n";
|
||||
|
||||
# print $buffer;
|
||||
# Check buffer for traces of function/method calls
|
||||
|
||||
print "not " unless $buffer eq
|
||||
"f0v1 f1v2 f2v3 URL:testurlf0v1 f1v2 f2v3 URL:testurl";
|
||||
print "ok 2\n";
|
||||
|
||||
$js->destroy();
|
||||
|
||||
print "ok 3\n";
|
|
@ -1,25 +0,0 @@
|
|||
######################################################################
|
||||
# Testcase: Properties of multi-tiered objects
|
||||
# Revision: $Revision: 1.1.1.1 $
|
||||
# Last Checkin: $Date: 2006/02/01 06:00:49 $
|
||||
# By: $Author: mschilli $
|
||||
#
|
||||
# Author: Mike Schilli m@perlmeister.com, 2002
|
||||
######################################################################
|
||||
|
||||
print "1..2\n";
|
||||
|
||||
use JavaScript::SpiderMonkey;
|
||||
my $js = JavaScript::SpiderMonkey->new();
|
||||
$js->init();
|
||||
|
||||
$js->property_by_path("parent.location.href", "abc");
|
||||
my $res = $js->property_get("parent.location.href");
|
||||
|
||||
# Check return code
|
||||
print "not " if $res ne "abc";
|
||||
print "ok 1\n";
|
||||
|
||||
$js->destroy();
|
||||
|
||||
print "ok 2\n";
|
|
@ -1,119 +0,0 @@
|
|||
######################################################################
|
||||
# Testcase: Set/Get properties of objects
|
||||
# Revision: $Revision: 1.1.1.1 $
|
||||
# Last Checkin: $Date: 2006/02/01 06:00:49 $
|
||||
# By: $Author: mschilli $
|
||||
#
|
||||
# Author: Mike Schilli m@perlmeister.com, 2002
|
||||
######################################################################
|
||||
|
||||
use warnings;
|
||||
use strict;
|
||||
|
||||
print "1..6\n";
|
||||
|
||||
use JavaScript::SpiderMonkey;
|
||||
my $js = JavaScript::SpiderMonkey->new();
|
||||
$js->init();
|
||||
|
||||
our $buffer = "";
|
||||
|
||||
sub getter {
|
||||
my(@args) = @_;
|
||||
$buffer .= "GETTER: @args\n";
|
||||
}
|
||||
|
||||
sub setter {
|
||||
my(@args) = @_;
|
||||
$buffer .= "SETTER: @args\n";
|
||||
}
|
||||
|
||||
$js->property_by_path("navigator.appName", "", \&getter, \&setter);
|
||||
|
||||
# Function to write something from JS to a Perl $buffer
|
||||
|
||||
my $code = <<EOT;
|
||||
navigator.appName = "Netscape";
|
||||
navigator.schnapp = navigator.appName;
|
||||
navigator.appName = "Netscape2";
|
||||
navigator.schnapp = navigator.appName;
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($code);
|
||||
|
||||
# Check return code
|
||||
print "not " if $rc != 1;
|
||||
print "ok 1\n";
|
||||
|
||||
# Check output
|
||||
my $wanted = "SETTER: navigator.appName Netscape\n" .
|
||||
"GETTER: navigator.appName Netscape\n" .
|
||||
"SETTER: navigator.appName Netscape2\n" .
|
||||
"GETTER: navigator.appName Netscape2\n";
|
||||
if($buffer ne $wanted) {
|
||||
print "not ok 2\n";
|
||||
print "Expected $wanted but got '$buffer'\n";
|
||||
} else {
|
||||
print "ok 2\n";
|
||||
}
|
||||
|
||||
$js->destroy();
|
||||
|
||||
##################################################
|
||||
# Setter only, no getter
|
||||
##################################################
|
||||
$js = JavaScript::SpiderMonkey->new();
|
||||
$js->init();
|
||||
|
||||
$buffer = "";
|
||||
|
||||
$js->property_by_path("navigator.appName", "", undef, \&setter);
|
||||
|
||||
$rc = $js->eval($code);
|
||||
|
||||
# Check return code
|
||||
print "not " if $rc != 1;
|
||||
print "ok 3\n";
|
||||
|
||||
# Check output
|
||||
$wanted = "SETTER: navigator.appName Netscape\n" .
|
||||
"SETTER: navigator.appName Netscape2\n";
|
||||
|
||||
if($buffer ne $wanted) {
|
||||
print "not ok 4\n";
|
||||
print "Expected $wanted but got '$buffer'\n";
|
||||
} else {
|
||||
print "ok 4\n";
|
||||
}
|
||||
|
||||
$js->destroy();
|
||||
|
||||
##################################################
|
||||
# Getter only, no setter
|
||||
##################################################
|
||||
$js = JavaScript::SpiderMonkey->new();
|
||||
$js->init();
|
||||
|
||||
$buffer = "";
|
||||
|
||||
$js->property_by_path("navigator.appName", "", \&getter);
|
||||
|
||||
$rc = $js->eval($code);
|
||||
|
||||
# Check return code
|
||||
print "not " if $rc != 1;
|
||||
print "ok 5\n";
|
||||
|
||||
# Check output
|
||||
$wanted = "GETTER: navigator.appName Netscape\n" .
|
||||
"GETTER: navigator.appName Netscape2\n";
|
||||
|
||||
if($buffer ne $wanted) {
|
||||
print "not ok 6\n";
|
||||
print "Expected $wanted but got '$buffer'\n";
|
||||
} else {
|
||||
print "ok 6\n";
|
||||
}
|
||||
|
||||
$js->destroy();
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
######################################################################
|
||||
# Testcase: Produce an error and check $@
|
||||
# Revision: $Revision: 1.1.1.1 $
|
||||
# Last Checkin: $Date: 2006/02/01 06:00:49 $
|
||||
# By: $Author: mschilli $
|
||||
#
|
||||
# Author: Mike Schilli m@perlmeister.com, 2004
|
||||
######################################################################
|
||||
|
||||
use warnings;
|
||||
use strict;
|
||||
|
||||
use JavaScript::SpiderMonkey;
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
my $js = JavaScript::SpiderMonkey->new();
|
||||
$js->init();
|
||||
|
||||
my $code = <<EOT;
|
||||
foo = "bar;
|
||||
EOT
|
||||
|
||||
$js->eval($code);
|
||||
|
||||
if($@ =~ /unterminated string literal/) {
|
||||
print "ok 1\n";
|
||||
} else {
|
||||
print "not ok 1\n";
|
||||
}
|
|
@ -1,44 +0,0 @@
|
|||
######################################################################
|
||||
# Testcase: Functions/Methods for different objects
|
||||
# Revision: $Revision: 1.1.1.1 $
|
||||
# Last Checkin: $Date: 2006/02/01 06:00:49 $
|
||||
# By: $Author: mschilli $
|
||||
#
|
||||
# Author: Mike Schilli m@perlmeister.com, 2004
|
||||
######################################################################
|
||||
|
||||
use warnings;
|
||||
use strict;
|
||||
|
||||
use Test::More qw(no_plan);
|
||||
|
||||
use JavaScript::SpiderMonkey;
|
||||
my $js = JavaScript::SpiderMonkey->new();
|
||||
$js->init();
|
||||
|
||||
$js->property_by_path("document.location.href");
|
||||
$js->property_by_path("document.location.yodel");
|
||||
$js->property_by_path("document.someobj.someprop");
|
||||
|
||||
# Function to write something from JS to a Perl $buffer
|
||||
my $location_buffer;
|
||||
my $doc = $js->object_by_path("document.location");
|
||||
$js->function_set("write", sub { $location_buffer .= join('', @_) }, $doc);
|
||||
|
||||
my $someobj_buffer;
|
||||
my $someobj = $js->object_by_path("document.someobj");
|
||||
$js->function_set("write", sub { $someobj_buffer .= join('', @_) }, $someobj);
|
||||
|
||||
my $code = <<EOT;
|
||||
document.location.write("location message");
|
||||
document.someobj.write("someobj message");
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($code);
|
||||
|
||||
# Check return code
|
||||
ok($rc, "JS return code");
|
||||
|
||||
# Check location buffer
|
||||
is($location_buffer, "location message", "check loc buffer");
|
||||
is($someobj_buffer, "someobj message", "check someobj buffer");
|
|
@ -1,47 +0,0 @@
|
|||
######################################################################
|
||||
# Testcase: Returning values from perl callbacks
|
||||
# Revision: $Revision: 1.2 $
|
||||
# Last Checkin: $Date: 2006/06/13 13:42:58 $
|
||||
# By: $Author: thomas_busch $
|
||||
#
|
||||
# Author: Mike Schilli m@perlmeister.com, 2004
|
||||
######################################################################
|
||||
|
||||
use warnings;
|
||||
use strict;
|
||||
|
||||
use Test::More qw(no_plan);
|
||||
|
||||
use JavaScript::SpiderMonkey;
|
||||
use Log::Log4perl qw(:easy);
|
||||
Log::Log4perl->easy_init($ERROR);
|
||||
|
||||
my $buffer = "";
|
||||
|
||||
my $js = JavaScript::SpiderMonkey->new();
|
||||
$js->init();
|
||||
|
||||
# Example by Chris Blaise:
|
||||
# Let new function document.getElementById('id') (defined in Perl space)
|
||||
# return an object into JS.
|
||||
|
||||
my $doc = $js->object_by_path('document' );
|
||||
$js->property_by_path('fooobj.style' );
|
||||
$js->function_set( 'getElementById', sub {
|
||||
if(exists $JavaScript::SpiderMonkey::GLOBAL->{objects}->{'fooobj'}) {
|
||||
return $JavaScript::SpiderMonkey::GLOBAL->{objects}->{'fooobj'};
|
||||
}
|
||||
}, $doc);
|
||||
$js->function_set("write", sub {
|
||||
$buffer .= join('', map { "[$_]" } @_) }, $doc);
|
||||
|
||||
my $code = q{
|
||||
document.getElementById('bleh').style = 'something';
|
||||
document.write(fooobj.style);
|
||||
};
|
||||
|
||||
my $rc = $js->eval($code);
|
||||
|
||||
# Check return code
|
||||
ok($rc, "Function returning object");
|
||||
is($buffer, "[something]", "Attribute assigned correctly");
|
|
@ -1,23 +0,0 @@
|
|||
######################################################################
|
||||
# Create an array as part of an object
|
||||
######################################################################
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
$init = "";
|
||||
require "t/init.pl";
|
||||
|
||||
$js->array_by_path("document.form");
|
||||
|
||||
my $source = <<EOT;
|
||||
$init
|
||||
document.form[0] = "abc";
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($source);
|
||||
die "eval returned undef" unless $rc;
|
||||
if($js->property_get("navigator.appVersion") ne "3") {
|
||||
print "not ";
|
||||
}
|
||||
|
||||
print "ok 1\n";
|
|
@ -1,24 +0,0 @@
|
|||
######################################################################
|
||||
# Set and retrieve document.location.href
|
||||
######################################################################
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
$init = "";
|
||||
|
||||
require "t/init.pl";
|
||||
|
||||
my $source = <<EOT;
|
||||
$init
|
||||
document.location.href = "http://www.com";
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($source);
|
||||
|
||||
die "eval returned undef" unless $rc;
|
||||
|
||||
if($js->property_get("document.location.href") ne "http://www.com") {
|
||||
print "not ";
|
||||
}
|
||||
|
||||
print "ok 1\n";
|
|
@ -1,21 +0,0 @@
|
|||
######################################################################
|
||||
# Set and retrieve document.location.href
|
||||
######################################################################
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
$init = "";
|
||||
require "t/init.pl";
|
||||
|
||||
my $source = <<EOT;
|
||||
$init
|
||||
document.location.href = "http://www.com";
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($source);
|
||||
die "eval returned undef" unless $rc;
|
||||
if($js->property_get("navigator.appVersion") ne "3") {
|
||||
print "not ";
|
||||
}
|
||||
|
||||
print "ok 1\n";
|
|
@ -1,21 +0,0 @@
|
|||
######################################################################
|
||||
# Set and retrieve document.location.href
|
||||
######################################################################
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
$init = "";
|
||||
require "t/init.pl";
|
||||
|
||||
my $source = <<EOT;
|
||||
$init
|
||||
document.write("abc");
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($source);
|
||||
die "eval returned undef" unless $rc;
|
||||
if($js->property_get("navigator.appVersion") ne "3") {
|
||||
print "not ";
|
||||
}
|
||||
|
||||
print "ok 1\n";
|
|
@ -1,31 +0,0 @@
|
|||
######################################################################
|
||||
# docwrite()
|
||||
######################################################################
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
$init = "";
|
||||
require "t/init.pl";
|
||||
|
||||
my $source = <<EOT;
|
||||
$init
|
||||
document.write("abc");
|
||||
EOT
|
||||
my $oks = 0;
|
||||
my $nof = 100;
|
||||
|
||||
for my $i (1..$nof) {
|
||||
my $rc = $js->eval($source);
|
||||
die "eval returned undef" unless $rc;
|
||||
if($js->property_get("navigator.appVersion") eq "3") {
|
||||
$oks++;
|
||||
}
|
||||
}
|
||||
|
||||
if($nof != $oks) {
|
||||
print "not ";
|
||||
}
|
||||
|
||||
print "ok 1\n";
|
||||
|
||||
$js->destroy();
|
|
@ -1,31 +0,0 @@
|
|||
######################################################################
|
||||
# docwrite()
|
||||
######################################################################
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
$init = "";
|
||||
require "t/init.pl";
|
||||
|
||||
my $source = <<EOT;
|
||||
$init
|
||||
function FormSubmit () {
|
||||
document.location.href = "submitted!";
|
||||
}
|
||||
function Form() {
|
||||
this.submit = FormSubmit;
|
||||
}
|
||||
|
||||
document.form[0] = new Form;
|
||||
document.form[0].submit();
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($source);
|
||||
die "eval returned undef" unless $rc;
|
||||
if($js->property_get("document.location.href") ne "submitted!") {
|
||||
print "not ";
|
||||
}
|
||||
|
||||
print "ok 1\n";
|
||||
|
||||
$js->destroy();
|
|
@ -1,35 +0,0 @@
|
|||
######################################################################
|
||||
# docwrite()
|
||||
######################################################################
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
$init = "";
|
||||
require "t/init.pl";
|
||||
|
||||
my $a = $js->array_by_path("document.array");
|
||||
my $e = $js->array_set_element($a, 0, "gurkenhobel");
|
||||
#print "SetElement returned $e\n";
|
||||
my $r = $js->array_get_element($a, 0);
|
||||
#print "r=$r\n";
|
||||
#print $js->dump();
|
||||
|
||||
my $source = <<EOT;
|
||||
$init
|
||||
document.location.href = document.array[0];
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($source);
|
||||
|
||||
die "eval returned undef" unless $rc;
|
||||
|
||||
my $val = $js->property_get("document.location.href");
|
||||
|
||||
if($val ne "gurkenhobel") {
|
||||
print STDERR "Val is '$val'\n";
|
||||
print "not ";
|
||||
}
|
||||
|
||||
print "ok 1\n";
|
||||
|
||||
$js->destroy();
|
|
@ -1,27 +0,0 @@
|
|||
######################################################################
|
||||
# functions
|
||||
######################################################################
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
$init = "";
|
||||
$buffer = "";
|
||||
require "t/init.pl";
|
||||
|
||||
my $source = <<EOT;
|
||||
$init
|
||||
document.write("abc", "def");
|
||||
document.write("abc2", "def2");
|
||||
document.write("abc3", "def3");
|
||||
document.write("abc4", "def4");
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($source);
|
||||
die "eval returned undef" unless $rc;
|
||||
|
||||
if($buffer ne "abcdefabc2def2abc3def3abc4def4") {
|
||||
print "not ";
|
||||
}
|
||||
print "ok 1\n";
|
||||
|
||||
$js->destroy();
|
|
@ -1,29 +0,0 @@
|
|||
######################################################################
|
||||
# functions2
|
||||
######################################################################
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
$init = "";
|
||||
require "t/init.pl";
|
||||
|
||||
$args = "";
|
||||
|
||||
$js->function_set("farz", sub { $args = join '', @_ });
|
||||
|
||||
my $source = <<EOT;
|
||||
$init
|
||||
farz("abc", "def", 3, 5, 8);
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($source);
|
||||
|
||||
die "eval returned undef" unless $rc;
|
||||
|
||||
if($args ne "abcdef358") {
|
||||
print "not ";
|
||||
}
|
||||
|
||||
print "ok 1\n";
|
||||
|
||||
$js->destroy();
|
|
@ -1,30 +0,0 @@
|
|||
######################################################################
|
||||
# functions2
|
||||
######################################################################
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
$init = "";
|
||||
require "t/init.pl";
|
||||
|
||||
$args = "";
|
||||
|
||||
my $docobj = $js->object_by_path("document");
|
||||
$js->function_set("schnubbel", sub { $args = join '', @_; });
|
||||
|
||||
my $source = <<EOT;
|
||||
$init
|
||||
document.schnubbel("abc", "def", 3, 5, 8);
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($source);
|
||||
|
||||
die "eval returned undef" unless $rc;
|
||||
|
||||
if($args ne "abcdef358") {
|
||||
print "not ";
|
||||
}
|
||||
|
||||
print "ok 1\n";
|
||||
|
||||
$js->destroy();
|
|
@ -1,33 +0,0 @@
|
|||
######################################################################
|
||||
# functions2
|
||||
######################################################################
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
$init = "";
|
||||
require "t/init.pl";
|
||||
|
||||
$submitted = "0";
|
||||
|
||||
my $obj = $js->object_by_path("submitter");
|
||||
$js->function_set("submit", sub { $submitted = 1 });
|
||||
|
||||
my $forms = $js->array_by_path("document.forms");
|
||||
my $e = $js->array_set_element_as_object($forms, 0, $obj);
|
||||
|
||||
my $source = <<EOT;
|
||||
$init
|
||||
document.forms[0].submit();
|
||||
EOT
|
||||
|
||||
my $rc = $js->eval($source);
|
||||
|
||||
die "eval returned undef" unless $rc;
|
||||
|
||||
if(!$submitted) {
|
||||
print "not ";
|
||||
}
|
||||
|
||||
print "ok 1\n";
|
||||
|
||||
$js->destroy();
|
|
@ -1,29 +0,0 @@
|
|||
######################################################################
|
||||
# Testcase: Returning integer values from perl
|
||||
# Revision: $Revision: 1.1 $
|
||||
# Last Checkin: $Date: 2006/06/13 13:43:51 $
|
||||
# By: $Author: thomas_busch $
|
||||
#
|
||||
# Author: Marc Relation marc@igneousconsulting.com
|
||||
######################################################################
|
||||
|
||||
use warnings;
|
||||
use strict;
|
||||
|
||||
print "1..1\n";
|
||||
|
||||
use JavaScript::SpiderMonkey;
|
||||
|
||||
my $js=new JavaScript::SpiderMonkey;
|
||||
my $buffer;
|
||||
$js->init;
|
||||
$js->function_set('get_int',sub {return(1000);});
|
||||
$js->function_set('get_float',sub {return(10.21);});
|
||||
$js->function_set('booltest',sub {return 1==$_[0];});
|
||||
#$js->function_set('write',sub {print STDERR $_[0] . "\n"});
|
||||
$js->function_set("write",sub { $buffer .= join('', @_) });
|
||||
$js->eval("write(get_int()+1);");
|
||||
$js->destroy;
|
||||
# Check buffer from document.write()
|
||||
print "not " unless $buffer == 1001;
|
||||
print "ok 1\n";
|
|
@ -1,25 +0,0 @@
|
|||
######################################################################
|
||||
# Testcase: Returning double values from perl
|
||||
# Revision: $Revision: 1.1 $
|
||||
# Last Checkin: $Date: 2006/06/13 13:43:51 $
|
||||
# By: $Author: thomas_busch $
|
||||
#
|
||||
# Author: Marc Relation marc@igneousconsulting.com
|
||||
######################################################################
|
||||
|
||||
use warnings;
|
||||
use strict;
|
||||
|
||||
print "1..1\n";
|
||||
use JavaScript::SpiderMonkey;
|
||||
|
||||
my $js=new JavaScript::SpiderMonkey;
|
||||
my $buffer;
|
||||
$js->init;
|
||||
$js->function_set('get_double',sub {return(10.21);});
|
||||
$js->function_set("write",sub { $buffer .= join('', @_) });
|
||||
$js->eval("write(get_double()+1.2);");
|
||||
$js->destroy;
|
||||
# Check buffer from document.write()
|
||||
print "not " unless $buffer == 11.41;
|
||||
print "ok 1\n";
|
|
@ -1,25 +0,0 @@
|
|||
######################################################################
|
||||
# Testcase: Returning string values from perl
|
||||
# Revision: $Revision: 1.1 $
|
||||
# Last Checkin: $Date: 2006/06/13 13:43:51 $
|
||||
# By: $Author: thomas_busch $
|
||||
#
|
||||
# Author: Marc Relation marc@igneousconsulting.com
|
||||
######################################################################
|
||||
|
||||
use warnings;
|
||||
use strict;
|
||||
use Test::More tests => 1;
|
||||
|
||||
use JavaScript::SpiderMonkey;
|
||||
|
||||
my $js = new JavaScript::SpiderMonkey;
|
||||
my $buffer;
|
||||
$js->init;
|
||||
$js->function_set('get_string',sub { return "John Doe";});
|
||||
#$js->function_set('write',sub {print STDERR $_[0] . "\n"});
|
||||
$js->function_set("write",sub { $buffer .= join('', @_) });
|
||||
$js->eval("write(get_string()+' who');");
|
||||
$js->destroy;
|
||||
# Check buffer from document.write()
|
||||
is $buffer, 'John Doe who';
|
|
@ -1,28 +0,0 @@
|
|||
|
||||
use JavaScript::SpiderMonkey;
|
||||
|
||||
my $docloc = "http://wurks";
|
||||
$js = JavaScript::SpiderMonkey->new();
|
||||
$js->init();
|
||||
|
||||
$js->property_by_path("navigator.appName");
|
||||
$js->property_by_path("navigator.userAgent");
|
||||
$js->property_by_path("navigator.appVersion");
|
||||
$js->property_by_path("document.cookie");
|
||||
$js->property_by_path("parent.location");
|
||||
$js->property_by_path("document.location.href");
|
||||
|
||||
my $doc = $js->object_by_path("document");
|
||||
$js->function_set("write", sub { $buffer .= join('', @_) }, $doc);
|
||||
$buffer = "";
|
||||
|
||||
$init = <<EOT;
|
||||
navigator.appName = "Netscape";
|
||||
navigator.appVersion = "3";
|
||||
navigator.userAgent = "Grugenheimer";
|
||||
document.cookie = "";
|
||||
parent.location = "";
|
||||
document.location.href = "$docloc";
|
||||
document.form = new Array(100);
|
||||
EOT
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
######################################################################
|
||||
# Typemap for JavaScript::SpiderMonkey
|
||||
#
|
||||
# Revision: $Revision: 1.1.1.1 $
|
||||
# Last Checkin: $Date: 2006/02/01 06:00:49 $
|
||||
# By: $Author: mschilli $
|
||||
# Author: Mike Schilli mschilli1@aol.com, 2002
|
||||
######################################################################
|
||||
JSRuntime * T_PTRREF
|
||||
JSContext * T_PTRREF
|
||||
JSClass * T_PTRREF
|
||||
JSObject * T_PTRREF
|
||||
JSNative T_PTRREF
|
||||
JSPropertySpec * T_PTRREF
|
||||
JSFunctionSpec * T_PTRREF
|
||||
uintN T_SV
|
||||
JSBool T_SV
|
|
@ -1,62 +0,0 @@
|
|||
10
|
||||
|
||||
dir
|
||||
475
|
||||
svn://erxz.com/bb3/branches/perlbuut/deps/JavaScript-SpiderMonkey-0.19-patched/util
|
||||
svn://erxz.com/bb3
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
dcb1cea6-7f7e-4c78-8a22-148ace8ce36e
|
||||
|
||||
download.pl
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2009-10-03T22:54:20.000000Z
|
||||
b5c784121a686894bb029b3cacdb1eae
|
||||
2009-10-03T22:53:42.528878Z
|
||||
475
|
||||
simcop
|
||||
has-props
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
861
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
K 14
|
||||
svn:executable
|
||||
V 1
|
||||
*
|
||||
END
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue