JSObject.call(method, ARGS) with Safari

Discussion in 'Java' started by Richard Maher, Apr 21, 2012.

  1. Hi.

    Has anyone been able to pass the ARGS parameter to JSObject's "call" method
    *and* pass arguments via the "args" parameter? An example of your
    work-around perhaps?

    I'm having no trouble calling methods on all sorts of complex Javascript
    objects but when it comes to passing the arguments array I keep getting
    nullpointerexception :-(

    Firefox, IE, Chrome, and Opera are all onboard and ok.

    Cheers Richard Maher
     
    Richard Maher, Apr 21, 2012
    #1
    1. Advertising

  2. "Richard Maher" <> wrote in message
    news:jmu16i$ij2$...
    > Hi.
    >
    > Has anyone been able to pass the ARGS parameter to JSObject's "call"
    > method *and* pass arguments via the "args" parameter? An example of your
    > work-around perhaps?
    >
    > I'm having no trouble calling methods on all sorts of complex Javascript
    > objects but when it comes to passing the arguments array I keep getting
    > nullpointerexception :-(
    >
    > Firefox, IE, Chrome, and Opera are all onboard and ok.
    >
    > Cheers Richard Maher
    >


    Don't know if this is relevant: -

    JSValueRef JSObjectCallAsFunction(JSContextRef ctx, JSObjectRef object,
    JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[],
    JSValueRef* exception)
    {


    JSValueRef result = toRef(jsObject->call(exec, jsThisObject, argList));
    // returns NULL if object->implementsCall() is false

    .. . . and if so, how one specifies "implementsCall()" as "true"
     
    Richard Maher, Apr 21, 2012
    #2
    1. Advertising

  3. Richard Maher

    Lew Guest

    Richard Maher wrote:
    >> Has anyone been able to pass the ARGS parameter to JSObject's "call"
    >> method *and* pass arguments via the "args" parameter? An example of your
    >> work-around perhaps?
    >>
    >> I'm having no trouble calling methods on all sorts of complex Javascript
    >> objects but when it comes to passing the arguments array I keep getting
    >> nullpointerexception [sic] :-(


    Maybe if you showed us any code, or better yet, an SSCCE, we could help.

    All I can say at this point is that you're passing it wrong.

    >> Firefox, IE, Chrome, and Opera are all onboard and ok.


    > Don't know if this is relevant: -
    >
    > JSValueRef JSObjectCallAsFunction(JSContextRef ctx, JSObjectRef object,
    > JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[],
    > JSValueRef* exception)
    > {
    >
    >
    > JSValueRef result = toRef(jsObject->call(exec, jsThisObject, argList));
    > // returns NULL if object->implementsCall() is false
    >
    > . . . and if so, how one specifies "implementsCall()" as "true"


    That isn't Java code.

    --
    Lew
    Honi soit qui mal y pense.
    http://upload.wikimedia.org/wikipedia/commons/c/cf/Friz.jpg
     
    Lew, Apr 21, 2012
    #3
  4. On 12-04-21 08:45 AM, Lew wrote:
    > Richard Maher wrote:
    >>> Has anyone been able to pass the ARGS parameter to JSObject's "call"
    >>> method *and* pass arguments via the "args" parameter? An example of your
    >>> work-around perhaps?
    >>>
    >>> I'm having no trouble calling methods on all sorts of complex Javascript
    >>> objects but when it comes to passing the arguments array I keep getting
    >>> nullpointerexception [sic] :-(

    >
    > Maybe if you showed us any code, or better yet, an SSCCE, we could help.
    >
    > All I can say at this point is that you're passing it wrong.
    >
    >>> Firefox, IE, Chrome, and Opera are all onboard and ok.

    >
    >> Don't know if this is relevant: -
    >>
    >> JSValueRef JSObjectCallAsFunction(JSContextRef ctx, JSObjectRef object,
    >> JSObjectRef thisObject, size_t argumentCount, const JSValueRef
    >> arguments[],
    >> JSValueRef* exception)
    >> {
    >>
    >>
    >> JSValueRef result = toRef(jsObject->call(exec, jsThisObject,
    >> argList));
    >> // returns NULL if object->implementsCall() is false
    >>
    >> . . . and if so, how one specifies "implementsCall()" as "true"

    >
    > That isn't Java code.
    >

    True, it's not, it's JavascriptCore. So this is a multi-language problem
    with both Java (netscape.javascript.JSObject) and JavaScript being
    involved. I think we can handle that.

    I spent a month earlier this year doing an integration for a customer in
    an Oracle Forms environment that involved Java, Oracle Forms PL/SQL, and
    some JavaScript. Much of last year was Java EE web apps where Java, XML,
    XSLT, XHTML, CSS and SQL figured. Right now I am working ESB
    integrations where Java is important but less than 50 percent.

    Most of us spend quality time doing hybrid work. Sometimes a problem is
    a one-language problem but often it's not. We can't get too picky about
    what we'll look at and what we won't. As long as Java is involved to
    some extent I think it's worth a first look.

    I agree that an SSCCE is called for in any case.

    AHS
    --
    A fly was very close to being called a "land," cause that's what they do
    half the time.
    -- Mitch Hedberg
     
    Arved Sandstrom, Apr 21, 2012
    #4
  5. "Arved Sandstrom" <> wrote in message
    news:49ykr.15811$...
    > 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
     
    Richard Maher, Apr 21, 2012
    #5
  6. Richard Maher

    Lew Guest

    Arved Sandstrom wrote:
    > Lew wrote:
    >> Richard Maher wrote:
    >>>> Has anyone been able to pass the ARGS parameter to JSObject's "call"
    >>>> method *and* pass arguments via the "args" parameter? An example of your
    >>>> work-around perhaps?
    >>>>
    >>>> I'm having no trouble calling methods on all sorts of complex Javascript
    >>>> objects but when it comes to passing the arguments array I keep getting
    >>>> nullpointerexception [sic] :-(

    >>
    >> Maybe if you showed us any code, or better yet, an SSCCE, we could help.
    >>
    >> All I can say at this point is that you're passing it wrong.
    >>
    >>>> Firefox, IE, Chrome, and Opera are all onboard and ok.

    >>
    >>> Don't know if this is relevant: -


    Nor do we, and how the heck could we with the paucity of information you provided?

    >>> JSValueRef JSObjectCallAsFunction(JSContextRef ctx, JSObjectRef object,
    >>> JSObjectRef thisObject, size_t argumentCount, const JSValueRef
    >>> arguments[],
    >>> JSValueRef* exception)
    >>> {
    >>>
    >>>
    >>> JSValueRef result = toRef(jsObject->call(exec, jsThisObject,
    >>> argList));
    >>> // returns NULL if object->implementsCall() is false
    >>>
    >>> . . . and if so, how one specifies "implementsCall()" as "true"

    >>
    >> That isn't Java code.
    >>

    > True, it's not, it's JavascriptCore. So this is a multi-language problem
    > with both Java (netscape.javascript.JSObject) and JavaScript being
    > involved. I think we can handle that.
    >
    > I spent a month earlier this year doing an integration for a customer in
    > an Oracle Forms environment that involved Java, Oracle Forms PL/SQL, and
    > some JavaScript. Much of last year was Java EE web apps where Java, XML,
    > XSLT, XHTML, CSS and SQL figured. Right now I am working ESB
    > integrations where Java is important but less than 50 percent.
    >
    > Most of us spend quality time doing hybrid work. Sometimes a problem is
    > a one-language problem but often it's not. We can't get too picky about
    > what we'll look at and what we won't. As long as Java is involved to
    > some extent I think it's worth a first look.
    >
    > I agree that an SSCCE is called for in any case.


    Since the OP's problem stems from their Java code, the fact that what they
    published was not is relevant.

    At no point did I suggest that the question was inappropriate for this forum.

    The OP has been around this newsgroup for far too long to be ignorant of the
    smart ways to ask questions here.

    --
    Lew
    Honi soit qui mal y pense.
    http://upload.wikimedia.org/wikipedia/commons/c/cf/Friz.jpg
     
    Lew, Apr 21, 2012
    #6
  7. Richard Maher

    Lew Guest

    Richard Maher wrote:
    > Arved Sandstrom wrote ..
    >> Lew wrote:
    >>> ... SSCCE ... [context restored]

    >> 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: -


    Thanks for this fragment of your problem. The missing fragment is what went
    wrong. Please copy and paste the actual output or errors and describe what you
    expect instead. You haven't even told us what the error is!

    > 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);


    Could this possibly be where the error occurs?

    > System.out.println("ans is " + ans.booleanValue());


    Really, 'System.out.println()'?

    Check out java.util.logger or log4j.

    > // 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
    > }


    Could this possibly be where the error occurs?

    > 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


    For this sort of thing, 'IllegalStateException' is a good match.

    > 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);


    Could this possibly be where the error occurs?

    > 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>


    --
    Lew
    Honi soit qui mal y pense.
    http://upload.wikimedia.org/wikipedia/commons/c/cf/Friz.jpg
     
    Lew, Apr 21, 2012
    #7
  8. Richard Maher

    Daniel Pitts Guest

    On 4/21/12 3:12 AM, Richard Maher wrote:
    > Hi.
    >
    > Has anyone been able to pass the ARGS parameter to JSObject's "call" method
    > *and* pass arguments via the "args" parameter? An example of your
    > work-around perhaps?
    >
    > I'm having no trouble calling methods on all sorts of complex Javascript
    > objects but when it comes to passing the arguments array I keep getting
    > nullpointerexception :-(
    >
    > Firefox, IE, Chrome, and Opera are all onboard and ok.
    >
    > Cheers Richard Maher

    Not sure if this helps, but in the past I've had to do some hacky
    work-arounds to work with JSObject.

    Check out:
    <http://virtualinfinity.net/wordpress/tools/2008/10/11/javascript-and-java-applets/>


    Hope this helps,
    Daniel.
     
    Daniel Pitts, Apr 21, 2012
    #8
  9. "Daniel Pitts" <> wrote in message
    news:YOGkr.11325$...
    > On 4/21/12 3:12 AM, Richard Maher wrote:
    >> Hi.
    >>
    >> Has anyone been able to pass the ARGS parameter to JSObject's "call"
    >> method
    >> *and* pass arguments via the "args" parameter? An example of your
    >> work-around perhaps?
    >>
    >> I'm having no trouble calling methods on all sorts of complex Javascript
    >> objects but when it comes to passing the arguments array I keep getting
    >> nullpointerexception :-(
    >>
    >> Firefox, IE, Chrome, and Opera are all onboard and ok.
    >>
    >> Cheers Richard Maher

    > Not sure if this helps, but in the past I've had to do some hacky
    > work-arounds to work with JSObject.
    >
    > Check out:
    > <http://virtualinfinity.net/wordpress/tools/2008/10/11/javascript-and-java-applets/>
    >


    Hi Daniel,

    Thanks as always for your replies.
    >
    > Hope this helps,


    It certainly helped a couple of years ago (with FireFox 2.n or 3.0?) when
    you first showed me your cunning solution. That was my first (well probably
    about 5th as is happens) port of call.

    You may not recall, but that's when I first introduced the JS
    "Tier3Client.launder" function that just took a JSObject a a parameter and
    returned the same JSObject which was automagically fixed/rinsed. This worked
    well back in the day but now FF, IE, Chrome, and Opera (and JSObject) all
    seemed to have moved on and the "fix" was looking redundant - until Safari
    and its insistence on the "First Generation plug-in" :-(

    The problem is my solution is not working with Safari and I think Safari has
    other issues. I used to getMember("Tier3Client") on the applet window and
    then call my "launder" on that. If you look at the code I posted just before
    you'll see that I was trying to be "clever" and use an anonymous JS function
    to return a launder function. As this could well have been an issue, I
    reverted to the tried and tested method but still no joy.

    Anyway, I'll give your code/solution a go shortly but I'm not hopeful given
    that I can't even get a simple appletWindow.call("topLevelFunction", args)
    to do other than return "null". Without arguments is not a problem.

    So in the meantime if anyone knows of an example JSObject.call("sayHello",
    WITHargs) that works in Safari can they please provide a pointer?

    > Daniel.


    Cheers Richard Maher

    PS. NO *NOT bloody EVAL* - call, Call, CALL()!
     
    Richard Maher, Apr 22, 2012
    #9
  10. "Richard Maher" <> wrote in message
    news:jn02en$5gp$...
    >
    > "Daniel Pitts" <> wrote in message
    > news:YOGkr.11325$...


    >> Not sure if this helps, but in the past I've had to do some hacky
    >> work-arounds to work with JSObject.
    >>
    >> Check out:
    >> <http://virtualinfinity.net/wordpress/tools/2008/10/11/javascript-and-java-applets/>
    >>

    >
    > Anyway, I'll give your code/solution a go shortly but I'm not hopeful
    > given that I can't even get a simple appletWindow.call("topLevelFunction",
    > args) to do other than return "null". Without arguments is not a problem.
    >
    > So in the meantime if anyone knows of an example JSObject.call("sayHello",
    > WITHargs) that works in Safari can they please provide a pointer?
    >
    >> Daniel.


    As expected, still no joy and a nullpointer. (And now IE complains that you
    can't cast a String to JSObject)

    Thanks anyway.

    Anyone else done this on Safari?
    >

    Cheers Richard Maher
    >
    > PS. NO *NOT bloody EVAL* - call, Call, CALL()!
    >
     
    Richard Maher, Apr 22, 2012
    #10
  11. On 12-04-22 04:07 AM, Richard Maher wrote:
    > "Richard Maher" <> wrote in message
    > news:jn02en$5gp$...
    >>
    >> "Daniel Pitts" <> wrote in message
    >> news:YOGkr.11325$...

    >
    >>> Not sure if this helps, but in the past I've had to do some hacky
    >>> work-arounds to work with JSObject.
    >>>
    >>> Check out:
    >>> <http://virtualinfinity.net/wordpress/tools/2008/10/11/javascript-and-java-applets/>
    >>>

    >>
    >> Anyway, I'll give your code/solution a go shortly but I'm not hopeful
    >> given that I can't even get a simple appletWindow.call("topLevelFunction",
    >> args) to do other than return "null". Without arguments is not a problem.
    >>
    >> So in the meantime if anyone knows of an example JSObject.call("sayHello",
    >> WITHargs) that works in Safari can they please provide a pointer?
    >>
    >>> Daniel.

    >
    > As expected, still no joy and a nullpointer. (And now IE complains that you
    > can't cast a String to JSObject)
    >
    > Thanks anyway.
    >
    > Anyone else done this on Safari?
    >>

    > Cheers Richard Maher
    >>
    >> PS. NO *NOT bloody EVAL* - call, Call, CALL()!
    >>


    I don't usually deal with Java applets of any kind, but this was
    interesting. I worked up a Swing JApplet and have a JavaScript function
    an a JSP page.

    Since you mentioned Safari I did Safari 5.1.2 on Mac OS X 10.6.8 with
    Java Plug-in 1.6.0_31.

    The applet has text fields to take 2 numbers, a result text field, and a
    "submit" button. The JavaScript function is

    function addNums(one,two) {
    return one+two;
    }

    and the important 2 lines of code in the applet are

    JSObject win = JSObject.getWindow(this);
    Object sum = win.call("addNums", new Object[] {num1, num2});

    where 'num1' and 'num2' are java.lang.Doubles. So is 'sum'.

    There is not anything more to it. It worked just fine.

    AHS

    --
    A fly was very close to being called a "land," cause that's what they do
    half the time.
    -- Mitch Hedberg
     
    Arved Sandstrom, Apr 23, 2012
    #11
  12. Hi Arved,

    On Apr 23, 8:17 am, Arved Sandstrom <>
    wrote:
    > On 12-04-22 04:07 AM, Richard Maher wrote:
    >


    > Since you mentioned Safari I did Safari 5.1.2 on


    >>> Mac OS X 10.6.8 with <<<<


    Well there goes 3 days of my life I'll never get back :-( I guess some
    would say I deserve it for not being a OS/X user. I should have
    pointed out that I was running Safari of Windows XP but on 2nd
    thoughts, who cares? I can't see many users choosing to browse with
    Safari on Windows so, in the grand scheme of things it can stay broke.
    (Shame to not be able to test there though).

    .. A couple of other observations on Safari Liveconnect support for
    those following at home
    1) removeMember is not support on WIN or OS/X (Either does Chrome for
    that matter)
    2) WIN Safari supports get/set Member but OS/X does not

    > Java Plug-in 1.6.0_31.
    >
    > The applet has text fields to take 2 numbers, a result text field, and a
    > "submit" button. The JavaScript function is
    >
    > function addNums(one,two) {
    >   return one+two;
    >
    > }
    >
    > and the important 2 lines of code in the applet are
    >
    > JSObject win = JSObject.getWindow(this);
    > Object sum = win.call("addNums", new Object[] {num1, num2});
    >
    > where 'num1' and 'num2' are java.lang.Doubles. So is 'sum'.
    >
    > There is not anything more to it. It worked just fine.


    Yep, pretty wonderful and useful stuff eh?

    Thanks for testing it for me.

    >
    > AHS
    >


    Cheers Richard Maher
     
    Richard Maher, Apr 23, 2012
    #12
  13. On 12-04-23 03:40 AM, Richard Maher wrote:
    > Hi Arved,
    >
    > On Apr 23, 8:17 am, Arved Sandstrom <>
    > wrote:
    >> On 12-04-22 04:07 AM, Richard Maher wrote:
    >>

    >
    >> Since you mentioned Safari I did Safari 5.1.2 on

    >
    >>>> Mac OS X 10.6.8 with <<<<

    >
    > Well there goes 3 days of my life I'll never get back :-( I guess some
    > would say I deserve it for not being a OS/X user. I should have
    > pointed out that I was running Safari of Windows XP but on 2nd
    > thoughts, who cares? I can't see many users choosing to browse with
    > Safari on Windows so, in the grand scheme of things it can stay broke.
    > (Shame to not be able to test there though).

    [ SNIP ]
    >
    > Thanks for testing it for me.
    >>
    >> AHS

    >
    > Cheers Richard Maher


    I'm not one to resist a challenge, I tested the applet against Safari on
    my Windows XP, and it worked also.

    Safari 5.0.3, Windows XP, JDK 1.6.0_31 (and corresponding plugin).

    FWIW my test environment is very spare. The JApplet itself is
    uncomplicated, and the 2 lines I showed you are the only ones that talk
    to JavaScript. The JavaScript is the function I showed, and it's the
    only JavaScript in the page that contains the applet. And my applet tag
    *is* an <applet> tag, not an <object> tag, with only the 'code' and
    'archive' attributes. I'm not saying you want to, or can, simplify that
    much (considering you want to support many browsers) but it's what
    worked for me in Safari on both Mac OS X and Win XP for this scenario.

    AHS
    --
    A fly was very close to being called a "land," cause that's what they do
    half the time.
    -- Mitch Hedberg
     
    Arved Sandstrom, Apr 24, 2012
    #13
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Ken Varn
    Replies:
    2
    Views:
    657
    Ken Varn
    Jun 22, 2005
  2. Replies:
    3
    Views:
    536
    David Eppstein
    Sep 17, 2003
  3. Pierre Fortin

    args v. *args passed to: os.path.join()

    Pierre Fortin, Sep 18, 2004, in forum: Python
    Replies:
    2
    Views:
    745
    Pierre Fortin
    Sep 18, 2004
  4. Richard Maher
    Replies:
    18
    Views:
    2,344
    Richard Maher
    Mar 27, 2009
  5. er
    Replies:
    2
    Views:
    541
Loading...

Share This Page