Re: JSObject.call(method, ARGS) with Safari
"Arved Sandstrom" <asandstrom3minus1@eastlink.ca> wrote in message
news:49ykr.15811$FQ1.5673@newsfe12.iad...
On 12-04-21 08:45 AM, Lew wrote:
I agree that an SSCCE is called for in any case.
Thanks for the replies. I'll cut it down to just the jsobject.call(m, ARGS)
test tomorrow, but for now: -
import java.applet.Applet;
import netscape.javascript.JSObject;
import netscape.javascript.JSException;
public class JavaJSTest extends Applet {
JSObject laundry;
Object rinseArgs[] = new Object[1];
public synchronized void init() {
System.out.println("Starting Tests. . .");
JSObject window = JSObject.getWindow(this);
final String createLaundry =
"(function(){" +
"function Laundry(){" +
"this.launder = function(JSObject){" +
"alert('In Laundry');" +
"return JSObject;}}" +
"return new Laundry();" +
"})();";
laundry = (JSObject)window.eval(createLaundry);
// Test function calls
String str = (String) window.eval("getString();");
if (!str.equals("Hello, world!")) {
throw new RuntimeException(); // test failed
}
Number num = (Number) window.eval("getNumber()");
if (num.intValue() != 5) {
throw new RuntimeException(); // test failed
}
// Test field access
JSObject res = (JSObject) window.eval("new cities();");
if (!((String) res.getMember("b")).equals("Belgrade")) {
throw new RuntimeException(); // test failed
}
res.setMember("b", "Belfast");
if (!res.getMember("b").equals("Belfast")) {
throw new RuntimeException(); // test failed
}
// Test CALL
Boolean ans = (Boolean)res.call("d", null);
System.out.println("ans is " + ans.booleanValue());
// Test CALL with param
rinseArgs[0] = new String("A param");
Boolean pans = (Boolean)res.call("e", rinseArgs);
System.out.println("param ans is " + pans.booleanValue());
// Test array access
res = (JSObject) window.eval("getTestArray();");
if (!((String) res.getSlot(0)).equals("foo") ||
!((String) res.getSlot(1)).equals("bar")) {
throw new RuntimeException(); // test failed
}
res.setSlot(1, "baz");
if (!((String) res.getSlot(1)).equals("baz")) {
throw new RuntimeException(); // test failed
}
res.setSlot(2, "qux"); // Define new array element
if (!((String) res.getSlot(2)).equals("qux")) {
throw new RuntimeException(); // test failed
}
res.removeMember("b");
try {
res.getMember("b");
// throw new RuntimeException(); // test failed
System.out.println("This browser does not support
removeMember"); // test failed
} catch (JSException e) {
// Member should not be present any more
}
System.out.println(". . .Tests complete");
}
public void hello() {
System.out.println("Hello");
}
public boolean testCall(JSObject blob) {
System.out.println("In method - testCall()");
JSObject cleanBuf;
boolean retVal = false;
try {
rinseArgs[0] = blob;
System.out.println("before launder");
try {
cleanBuf = (JSObject)laundry.call("launder", rinseArgs);
}
catch (Exception e) {
throw e;
}
System.out.println("after launder");
// System.out.println("ans is " + abc.booleanValue());
System.out.println("blob.call()");
Boolean resp = (Boolean)cleanBuf.call("e",null);
System.out.println("Setting retVal");
retVal = resp.booleanValue();
} catch (JSException ex) {
Exception ex2 = (Exception)ex.getWrappedException();
if(ex2 != null) {
System.out.println(ex2.getClass().getName() + " " +
ex2.getMessage());
} else {
System.out.println(ex.getClass().getName() + " " +
ex.getMessage());
}
} catch (Exception ex) {
System.out.println(ex.getClass().getName() + " " +
ex.getMessage());
}
return retVal;
}
}
And the HTML: _
<html>
<head>
<script language="javascript">
var app;
function load() {
var objectTag = "<object ";
if (/Internet Explorer/.test(navigator.appName)) {
objectTag = objectTag +
'classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" ';
} else {
objectTag = objectTag +
'type="application/x-java-applet" ';
}
objectTag = objectTag +
'width= "0" height= "0" id="app">' +
'<param name="codebase" value="http://127.0.0.1">' +
'<param name="code" value="JavaJSTest">' +
'<param name="java_version" value="1.6+">' +
'<param name="mayscript" value="true">' +
'<param name="scriptable" value="true">' +
'</object>';
var appletDiv = document.createElement("div");
appletDiv.innerHTML = objectTag;
try {
document.body.appendChild(appletDiv);
chanG = document.getElementById("app");
}
catch(err) {
alert("Unable to append applet: -\n" +
(err.description||err.message));
chanG = null;
};
if (chanG == null) {
throw new Error("Was unable to initialize the applet");
};
var x = new cities();
var y = x.e();
alert("X = "+y);
}
// Return a string value to Java
function getString() {
return "Hello, world!";
}
function getNumber() {
return 5;
}
// Make an object with city names and an index letter.
function cities() {
var msg = "Good Bye";
this.a = "Athens";
this.b = "Belgrade";
this.c = "Cairo";
// this.e = function(){alert(msg); return true;};
// this.e = function(){if (window.console) {console.log("Message is "
+ msg)};return true;};
// this.e = function(){throw("A Wobbly");return true;};
}
cities.prototype = {
d : function(){alert("hello"); return true;}
,e : function(){alert("good-Bye"); return true;}
,f : function(param){alert("Param = " + param); return true;}
};
function getTestArray() {
return [ "foo", "bar" ];
}
function doIt() {
var list = new cities();
var reply = chanG.testCall(list);
alert("Reply = "+reply);
}
</script>
</head>
<body onload="load();">
STUFF
<input type="Button" id="btn1" value="HitMe" onclick="doIt();"/>
</body>
</html>
Thanks agin
Cheers Richard Maher