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:
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]$
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.