Bug 153362 - Wrong method called for LiveConnect (js -> java applet)
Summary: Wrong method called for LiveConnect (js -> java applet)
Status: RESOLVED FIXED
Alias: None
Product: konqueror
Classification: Applications
Component: kjava (other bugs)
Version First Reported In: unspecified
Platform: Gentoo Packages Linux
: NOR normal
Target Milestone: ---
Assignee: Konqueror Bugs
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2007-12-03 18:21 UTC by Krzysztof Pawlik
Modified: 2007-12-03 20:40 UTC (History)
1 user (show)

See Also:
Latest Commit:
Version Fixed/Implemented In:
Sentry Crash Report:


Attachments
Test case: index.html (693 bytes, text/html)
2007-12-03 18:22 UTC, Krzysztof Pawlik
Details
Test case: testapplet.jar (1.89 KB, application/octet-stream)
2007-12-03 18:23 UTC, Krzysztof Pawlik
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Krzysztof Pawlik 2007-12-03 18:21:12 UTC
Version:            (using KDE KDE 3.5.8)
Installed from:    Gentoo Packages
Compiler:          gcc version 4.2.2 (Gentoo 4.2.2 p1.0) 
OS:                Linux

LiveConnect (calling methods in Java applets from JavaScript) calls wrong method when the argument is specified as "". It should call setChar(java.lang.String), but looks for setChar() (no arguments) (setChar() is a test method in applet).

It badly breaks logging in to some banks that use applets for utility functions not available in JavaScript.

I've created a test case - index.xml and testapplet.jar (source of applet included in jar file).

When calling the function with non-empty argument (for example enter "test value" - without quotes) in 'Input box' and clicking 'pass to testapplet' produces following debugging information:

kjas: KJavaProcess::send(): args = (0,0,1,0,setChar)
kjas: KJavaProcess::addArgs(): it = "0"
kjas: KJavaProcess::addArgs(): it = "0"
kjas: KJavaProcess::addArgs(): it = "1"
kjas: KJavaProcess::addArgs(): it = "0"
kjas: KJavaProcess::addArgs(): it = "setChar"
kjas: KJavaProcess::storeSize, size =       17
kjas: <KJavaProcess::send 16
kjas: >KJavaAppletServer::waitForReturnData
kjas: slotWroteData 0
kjas: slotJavaRequest: 0
kjas: args=(2,0,)
kjas: <KJavaAppletServer::waitForReturnData stacksize:1
kjas: call() func="setChar"
kjas: call() fargs="(test value)" (1)
kjas: callMember: args: (0,1,0,setChar,test value)
kjas: KJavaProcess::send(): args = (1,0,1,0,setChar,test value)
kjas: KJavaProcess::addArgs(): it = "1"
kjas: KJavaProcess::addArgs(): it = "0"
kjas: KJavaProcess::addArgs(): it = "1"
kjas: KJavaProcess::addArgs(): it = "0"
kjas: KJavaProcess::addArgs(): it = "setChar"
kjas: KJavaProcess::addArgs(): it = "test value"
kjas: KJavaProcess::storeSize, size =       28
kjas: <KJavaProcess::send 17
kjas: >KJavaAppletServer::waitForReturnData
kjas: slotWroteData 0
kjas: slotJavaRequest: 1
kjas: args=(5,0,Set variable to "test value")
kjas: <KJavaAppletServer::waitForReturnData stacksize:1

Notice the fargs="(test value)" (1) - it shows the argument value and number of arguments, in next line KJavaProcess::send() sees the argument correctly.

Now remove everything from 'Input box' (leave it empty) and click the button, following information is produced:

kjas: KJavaProcess::send(): args = (2,0,1,0,setChar)
kjas: KJavaProcess::addArgs(): it = "2"
kjas: KJavaProcess::addArgs(): it = "0"
kjas: KJavaProcess::addArgs(): it = "1"
kjas: KJavaProcess::addArgs(): it = "0"
kjas: KJavaProcess::addArgs(): it = "setChar"
kjas: KJavaProcess::storeSize, size =       17
kjas: <KJavaProcess::send 16
kjas: >KJavaAppletServer::waitForReturnData
kjas: slotWroteData 0
kjas: slotJavaRequest: 2
kjas: args=(2,0,)
kjas: <KJavaAppletServer::waitForReturnData stacksize:1
kjas: call() func="setChar"
kjas: call() fargs="()" (1)
kjas: callMember: args: (0,1,0,setChar,)
kjas: KJavaProcess::send(): args = (3,0,1,0,setChar,)
kjas: KJavaProcess::addArgs(): it = "3"
kjas: KJavaProcess::addArgs(): it = "0"
kjas: KJavaProcess::addArgs(): it = "1"
kjas: KJavaProcess::addArgs(): it = "0"
kjas: KJavaProcess::addArgs(): it = "setChar"
kjas: KJavaProcess::addArgs(): it = ""
kjas: KJavaProcess::storeSize, size =       18
kjas: <KJavaProcess::send 17
kjas: >KJavaAppletServer::waitForReturnData
kjas: slotWroteData 0
kjas: slotJavaRequest: 3
kjas: args=(5,0,Set variable to "Called no-arg!")
kjas: <KJavaAppletServer::waitForReturnData stacksize:1

The empty argument is correctly passed to KJavaProcess, but when it's being sent it gets lost - the setChar() is called. CallAction.apply() shows 0 arguments that were passed (added following line:

Main.info("args.size() = " + args.size());

after `try {').

I'll attach the above mentioned files.
Comment 1 Krzysztof Pawlik 2007-12-03 18:22:32 UTC
Created attachment 22307 [details]
Test case: index.html
Comment 2 Krzysztof Pawlik 2007-12-03 18:23:11 UTC
Created attachment 22308 [details]
Test case: testapplet.jar

Compiled applet with source.
Comment 3 Maksim Orlovich 2007-12-03 18:51:09 UTC
Thanks for testcasing and diagnosing this problem... CC'ing the person 
most familiar with this.
Comment 4 Koos Vriezen 2007-12-03 20:40:29 UTC
SVN commit 744487 by vriezen:

KJASProtocolHandler.getArg can't handle empty strings, so for calling a
member function from js we must add the number of arguments as extra param.
There's no way to see difference between NULL and "" though.

Note this needs regenerating the kjava.jar

BUG: 153362


 M  +1 -0      kjavaappletviewer.cpp  
 M  +4 -1      org/kde/kjas/server/KJASProtocolHandler.java  


WebSVN link: http://websvn.kde.org/?view=rev&revision=744487