172 lines
6.0 KiB
Java
172 lines
6.0 KiB
Java
/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
*
|
|
* ***** BEGIN LICENSE BLOCK *****
|
|
* Version: MPL 1.1/GPL 2.0
|
|
*
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at
|
|
* http://www.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
* for the specific language governing rights and limitations under the
|
|
* License.
|
|
*
|
|
* The Original Code is Rhino code, released
|
|
* May 6, 1998.
|
|
*
|
|
* The Initial Developer of the Original Code is
|
|
* Netscape Communications Corporation.
|
|
* Portions created by the Initial Developer are Copyright (C) 1997-1999
|
|
* the Initial Developer. All Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
*
|
|
* Alternatively, the contents of this file may be used under the terms of
|
|
* the GNU General Public License Version 2 or later (the "GPL"), in which
|
|
* case the provisions of the GPL are applicable instead of those above. If
|
|
* you wish to allow use of your version of this file only under the terms of
|
|
* the GPL and not to allow others to use your version of this file under the
|
|
* MPL, indicate your decision by deleting the provisions above and replacing
|
|
* them with the notice and other provisions required by the GPL. If you do
|
|
* not delete the provisions above, a recipient may use your version of this
|
|
* file under either the MPL or the GPL.
|
|
*
|
|
* ***** END LICENSE BLOCK ***** */
|
|
|
|
import org.mozilla.javascript.*;
|
|
|
|
/**
|
|
* An example host object class.
|
|
*
|
|
* Here's a shell session showing the Foo object in action:
|
|
* <pre>
|
|
* js> defineClass("Foo")
|
|
* js> foo = new Foo(); <i>A constructor call, see <a href="#Foo">Foo</a> below.</i>
|
|
* [object Foo] <i>The "Foo" here comes from <a href"#getClassName">getClassName</a>.</i>
|
|
* js> foo.counter; <i>The counter property is defined by the <code>defineProperty</code></i>
|
|
* 0 <i>call below and implemented by the <a href="#getCounter">getCounter</a></i>
|
|
* js> foo.counter; <i>method below.</i>
|
|
* 1
|
|
* js> foo.counter;
|
|
* 2
|
|
* js> foo.resetCounter(); <i>Results in a call to <a href="#resetCounter">resetCounter</a>.</i>
|
|
* js> foo.counter; <i>Now the counter has been reset.</i>
|
|
* 0
|
|
* js> foo.counter;
|
|
* 1
|
|
* js> bar = new Foo(37); <i>Create a new instance.</i>
|
|
* [object Foo]
|
|
* js> bar.counter; <i>This instance's counter is distinct from</i>
|
|
* 37 <i>the other instance's counter.</i>
|
|
* js> foo.varargs(3, "hi"); <i>Calls <a href="#varargs">varargs</a>.</i>
|
|
* this = [object Foo]; args = [3, hi]
|
|
* js> foo[7] = 34; <i>Since we extended ScriptableObject, we get</i>
|
|
* 34 <i>all the behavior of a JavaScript object</i>
|
|
* js> foo.a = 23; <i>for free.</i>
|
|
* 23
|
|
* js> foo.a + foo[7];
|
|
* 57
|
|
* js>
|
|
* </pre>
|
|
*
|
|
* @see org.mozilla.javascript.Context
|
|
* @see org.mozilla.javascript.Scriptable
|
|
* @see org.mozilla.javascript.ScriptableObject
|
|
*
|
|
* @author Norris Boyd
|
|
*/
|
|
|
|
public class Foo extends ScriptableObject {
|
|
private static final long serialVersionUID = -3833489808933339159L;
|
|
|
|
/**
|
|
* The zero-parameter constructor.
|
|
*
|
|
* When Context.defineClass is called with this class, it will
|
|
* construct Foo.prototype using this constructor.
|
|
*/
|
|
public Foo() {
|
|
}
|
|
|
|
/**
|
|
* The Java method defining the JavaScript Foo constructor.
|
|
*
|
|
* Takes an initial value for the counter property.
|
|
* Note that in the example Shell session above, we didn't
|
|
* supply a argument to the Foo constructor. This means that
|
|
* the Undefined value is used as the value of the argument,
|
|
* and when the argument is converted to an integer, Undefined
|
|
* becomes 0.
|
|
*/
|
|
public Foo(int counterStart) {
|
|
counter = counterStart;
|
|
}
|
|
|
|
/**
|
|
* Returns the name of this JavaScript class, "Foo".
|
|
*/
|
|
@Override
|
|
public String getClassName() {
|
|
return "Foo";
|
|
}
|
|
|
|
/**
|
|
* The Java method defining the JavaScript resetCounter function.
|
|
*
|
|
* Resets the counter to 0.
|
|
*/
|
|
public void jsFunction_resetCounter() {
|
|
counter = 0;
|
|
}
|
|
|
|
/**
|
|
* The Java method implementing the getter for the counter property.
|
|
* <p>
|
|
* If "setCounter" had been defined in this class, the runtime would
|
|
* call the setter when the property is assigned to.
|
|
*/
|
|
public int jsGet_counter() {
|
|
return counter++;
|
|
}
|
|
|
|
/**
|
|
* An example of a variable-arguments method.
|
|
*
|
|
* All variable arguments methods must have the same number and
|
|
* types of parameters, and must be static. <p>
|
|
* @param cx the Context of the current thread
|
|
* @param thisObj the JavaScript 'this' value.
|
|
* @param args the array of arguments for this call
|
|
* @param funObj the function object of the invoked JavaScript function
|
|
* This value is useful to compute a scope using
|
|
* Context.getTopLevelScope().
|
|
* @return computes the string values and types of 'this' and
|
|
* of each of the supplied arguments and returns them in a string.
|
|
*
|
|
* @see org.mozilla.javascript.ScriptableObject#getTopLevelScope
|
|
*/
|
|
public static Object jsFunction_varargs(Context cx, Scriptable thisObj,
|
|
Object[] args, Function funObj)
|
|
{
|
|
StringBuffer buf = new StringBuffer();
|
|
buf.append("this = ");
|
|
buf.append(Context.toString(thisObj));
|
|
buf.append("; args = [");
|
|
for (int i=0; i < args.length; i++) {
|
|
buf.append(Context.toString(args[i]));
|
|
if (i+1 != args.length)
|
|
buf.append(", ");
|
|
}
|
|
buf.append("]");
|
|
return buf.toString();
|
|
}
|
|
|
|
/**
|
|
* A piece of private data for this class.
|
|
*/
|
|
private int counter;
|
|
}
|
|
|