NAME
WWW::Scripter::Plugin::JavaScript - JavaScript plugin for WWW::Scripter
VERSION
Version 0.002 (alpha)
SYNOPSIS
use WWW::Scripter;
$w = new WWW::Scripter;
$w->use_plugin('JavaScript');
$w->get('http://www.cpan.org/');
$w->get('javascript:alert("Hello!")'); # prints Hello!
$w->use_plugin(JavaScript =>
engine => 'SpiderMonkey',
init => \&init, # initialisation function
); # for the JS environment
DESCRIPTION
This module is a plugin for WWW::Scripter that provides JavaScript capabilities (who would have guessed?).
To load the plugin, just use WWW::Scripter's use_plugin
method:
$w = new WWW::Scripter;
$w->use_plugin('JavaScript');
You can pass options to the plugin via the use_plugin
method. It takes hash-style arguments and they are as follows:
- engine
-
Which JavaScript back end to use. Currently, this module only supports JE, a pure-Perl JavaScript interpreter. Later it will support SpiderMonkey via either JavaScript::SpiderMonkey or JavaScript.pm. If this option is not specified, either SpiderMonkey or JE will be used, whichever is available. It is possible to write one's own bindings for a particular JavaScript engine. See below, under "BACK ENDS".
- init
-
Pass to this option a reference to a subroutine and it will be run every time a new JavaScript environment is initialised. This happens after the functions above have been created. The first argument will be the WWW::Scripter object. You can use this, for instance, to make your own functions available to JavaScript.
METHODS
WWW::Scripter's use_plugin
method will return a plugin object. The same object can be retrieved via $w->plugin('JavaScript')
after the plugin is loaded. The following methods can be called on that object:
new_function
This creates a new global JavaScript function out of a coderef. Pass the name as the first argument and the code ref as the second.
set
Sets the named variable to the value given. If you want to assign to a property of a property ... of a global property, pass each property name as a separate argument:
$w->plugin('JavaScript')->set(
'document', 'location', 'href' => 'http://www.perl.org/'
);
bind_classes
Instead of using this method, you might consider WWW::Scripter's class_info
method, which is more general-purpose (it applies also to whatever other scripting languages might be available).
With this you can bind Perl classes to JavaScript, so that JavaScript can handle objects of those classes. These class bindings will persist from one page to the next.
You should pass a hash ref that has the structure described in HTML::DOM::Interface, except that this method also accepts a _constructor
hash element, which should be set to the name of the method to be called when the constructor function is called within JavaScript; e.g., _constructor => 'new'
.
JAVASCRIPT FEATURES
The members of the HTML DOM that are available depend on the versions of HTML::DOM and CSS::DOM installed. See HTML::DOM::Interface and CSS::DOM::Interface.
For a list of the properties of the window object, see WWW::Scripter.
The JavaScript plugin itself provides just the screen
object, which is empty. Later this may be moved to the WWW::Scripter, but that should make little difference to you, unless you are writing bindings for another scripting language.
BACK ENDS
A back end has to be in the WWW::Scripter::Plugin::JavaScript:: name space. It will be require
d by this plugin implicitly when its name is passed to the engine
option.
The following methods must be implemented:
Class methods
- new
-
This method is passed a window (WWW::Scripter) object.
It has to create a JavaScript environment, in which the global object delegates to the window object for the members listed in
%WWW::Scripter::WindowInterface
.When the window object or its frames collection (WWW::Scripter::Frames object) is passed to the JavaScript environment, the global object must be returned instead.
This method can optionally create
window
,self
andframes
properties that refer to the global object, but this is not necessary. It might make things a little more efficient.Finally, it has to return an object that implements the interface below.
The back end has to do some magic to make sure that, when the global object is passed to another JS environment, references to it automatically point to a new global object when the user (or calling code) browses to another page.
For instance, it could wrap up the global object in a proxy object that delegates to whichever global object corresponds to the document.
Object Methods
- eval
-
This should accept up to three arguments: a string of code, the file name or URL, and the first line number.
- new_function
- set
- bind_classes
-
These correspond to those listed above for the plugin object. Those methods are simply delegated to the back end, except that
bind_classes
also does some caching if the back end hasn't been initialised yet.new_function
must also accept a third argument, indicating the return type. This (when specified) will be the name of a JavaScript function that does the type conversion. Only 'Number' is used right now. - event2sub ($code, $elem, $url, $first_line)
-
This method needs to turn the event handler code in
$code
into a coderef, or an object that can be used as such, and then return it. That coderef will be called with an HTML::DOM::Event object as its sole argument. It's return value, if defined, will be used to determine whether the event'spreventDefault
method should be called. - define_setter
-
This will be called with a list of property names representing the 'path' to the property. The last argument will be a coderef that must be called with the value assigned to the property.
Note: This is actually not used right now. The requirement for this may be removed some time before version 1.
PREREQUISITES
perl 5.8.3 or higher (5.8.4 or higher recommended)
HTML::DOM 0.010 or later
JE 0.022 or later (when there is a SpiderMonkey binding available it will become optional)
CSS::DOM
WWW::Scripter
URI
Hash::Util::FieldHash::Compat
LWP 5.815 or higher
BUGS
There is currently no system in place for preventing pages from different sites from communicating with each other.
To report bugs, please e-mail the author.
AUTHOR & COPYRIGHT
Copyright (C) 2009 Father Chrysostomos <join '@', sprout => join '.', reverse org => 'cpan'
>
This program is free software; you may redistribute it and/or modify it under the same terms as perl.
SEE ALSO
- -
- -
- -
- -
- -
- -
-
WWW::Mechanize::Plugin::JavaScript (the original version of this module)
2 POD Errors
The following errors were encountered while parsing the POD:
- Around line 262:
You can't have =items (as at line 277) unless the first thing after the =over is an =item
- Around line 414:
You forgot a '=back' before '=head1'