Bug 153362

Summary: Wrong method called for LiveConnect (js -> java applet)
Product: [Applications] konqueror Reporter: Krzysztof Pawlik <nelchael>
Component: kjavaAssignee: Konqueror Bugs <konqueror-bugs-null>
Status: RESOLVED FIXED    
Severity: normal CC: koos.vriezen
Priority: NOR    
Version First Reported In: unspecified   
Target Milestone: ---   
Platform: Gentoo Packages   
OS: Linux   
Latest Commit: Version Fixed/Implemented In:
Sentry Crash Report:
Attachments: Test case: index.html
Test case: testapplet.jar

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