Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JavaScript validation error when calling a JakartaEE10 MyFaces page #883

Open
WolfgangHG opened this issue Oct 15, 2024 · 6 comments
Open

Comments

@WolfgangHG
Copy link

Using HtmlUnitDriver 4.23.0, I observe an ugly EvaluatorException when calling a minimal Jakarta Faces page with just an Ajax call:

org.htmlunit.corejs.javascript.EvaluatorException: syntax error (http://localhost:8080/test/jakarta.faces.resource/faces.js.jsf;jsessionid=6C2C888968266540AA88DD3A0FCD95C5?ln=jakarta.faces&stage=Development#194)
    at org.htmlunit.javascript.HtmlUnitContextFactory$HtmlUnitErrorReporter.error (HtmlUnitContextFactory.java:399)
    at org.htmlunit.corejs.javascript.Parser.addError (Parser.java:241)
    … (a lot of parser methods)...
    at org.htmlunit.corejs.javascript.Context.parse (Context.java:2550)
    at org.htmlunit.corejs.javascript.Context.compileImpl (Context.java:2481)
    at org.htmlunit.corejs.javascript.Context.compileString (Context.java:1443)
    at org.htmlunit.javascript.HtmlUnitContextFactory$TimeoutContext.compileString (HtmlUnitContextFactory.java:193)
    at org.htmlunit.corejs.javascript.Context.compileString (Context.java:1431)
    at org.htmlunit.javascript.JavaScriptEngine$1.doRun (JavaScriptEngine.java:722)
    at org.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run (JavaScriptEngine.java:930)
    at org.htmlunit.corejs.javascript.Context.call (Context.java:586)
    at org.htmlunit.corejs.javascript.ContextFactory.call (ContextFactory.java:481)
    at org.htmlunit.javascript.HtmlUnitContextFactory.callSecured (HtmlUnitContextFactory.java:315)
    at org.htmlunit.javascript.JavaScriptEngine.compile (JavaScriptEngine.java:731)
    at org.htmlunit.javascript.JavaScriptEngine.compile (JavaScriptEngine.java:112)
    at org.htmlunit.html.HtmlPage.loadJavaScriptFromUrl (HtmlPage.java:1124)
    at org.htmlunit.html.HtmlPage.loadExternalJavaScriptFile (HtmlPage.java:1015)
    at org.htmlunit.html.ScriptElementSupport.executeScriptIfNeeded (ScriptElementSupport.java:191)
    at org.htmlunit.html.ScriptElementSupport$1.execute (ScriptElementSupport.java:112)
    at org.htmlunit.html.ScriptElementSupport.onAllChildrenAddedToPage (ScriptElementSupport.java:135)
    at org.htmlunit.html.HtmlScript.onAllChildrenAddedToPage (HtmlScript.java:192)
    at org.htmlunit.html.parser.neko.HtmlUnitNekoDOMBuilder.endElement (HtmlUnitNekoDOMBuilder.java:508)
    at org.htmlunit.cyberneko.xerces.parsers.AbstractSAXParser.endElement (AbstractSAXParser.java:291)
    at org.htmlunit.html.parser.neko.HtmlUnitNekoDOMBuilder.endElement (HtmlUnitNekoDOMBuilder.java:454)
    at org.htmlunit.cyberneko.HTMLTagBalancer.callEndElement (HTMLTagBalancer.java:1220)
    at org.htmlunit.cyberneko.HTMLTagBalancer.endElement (HTMLTagBalancer.java:1164)
    at org.htmlunit.cyberneko.filters.DefaultFilter.endElement (DefaultFilter.java:168)
    at org.htmlunit.cyberneko.filters.NamespaceBinder.endElement (NamespaceBinder.java:266)
    at org.htmlunit.cyberneko.HTMLScanner$ContentScanner.scanEndElement (HTMLScanner.java:3208)
    at org.htmlunit.cyberneko.HTMLScanner$ContentScanner.scan (HTMLScanner.java:2098)
    at org.htmlunit.cyberneko.HTMLScanner.scanDocument (HTMLScanner.java:909)
    at org.htmlunit.cyberneko.HTMLConfiguration.parse (HTMLConfiguration.java:336)
    at org.htmlunit.cyberneko.HTMLConfiguration.parse (HTMLConfiguration.java:294)
    at org.htmlunit.cyberneko.xerces.parsers.AbstractXMLDocumentParser.parse (AbstractXMLDocumentParser.java:80)
    at org.htmlunit.html.parser.neko.HtmlUnitNekoDOMBuilder.parse (HtmlUnitNekoDOMBuilder.java:753)
    at org.htmlunit.html.parser.neko.HtmlUnitNekoHtmlParser.parse (HtmlUnitNekoHtmlParser.java:195)
    at org.htmlunit.DefaultPageCreator.createHtmlPage (DefaultPageCreator.java:300)
    at org.htmlunit.DefaultPageCreator.createPage (DefaultPageCreator.java:219)
    at org.htmlunit.WebClient.loadWebResponseInto (WebClient.java:681)
    at org.htmlunit.WebClient.loadWebResponseInto (WebClient.java:575)
    at org.htmlunit.WebClient.getPage (WebClient.java:493)
    at org.htmlunit.WebClient.getPage (WebClient.java:402)
    at org.openqa.selenium.htmlunit.HtmlUnitDriver.get (HtmlUnitDriver.java:638)
    at org.openqa.selenium.htmlunit.HtmlUnitDriver.lambda$get$7 (HtmlUnitDriver.java:619)
    at org.openqa.selenium.htmlunit.HtmlUnitDriver.lambda$runAsync$0 (HtmlUnitDriver.java:351)
    at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1136)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:635)
    at java.lang.Thread.run (Thread.java:842)

Posting the full stacktrace probably does not bring any additional information.

I have a sample to reprocuce, but i requires a few steps:

  1. download TomEE 10.0M2 from https://tomee.apache.org/download.html (you need "TomEE Webprofile zip") and unzip
  2. you need Java 17
  3. rename attached "test.war.zip" to "test.war" and copy it to to TOMEE_HOME\webapps:
    test.war.zip
  4. start TomEE: TOMEE_HOME\bin\startup.bat (or startup.sh)
  5. you can test the app by browsing to http://localhost:8080/test/index.jsf
  6. now launch attached sample "htmlunittest.zip" (a small Eclipse maven project): mvn clean compile exec:java - you should see a large exception.
    htmlunittest.zip

From the log output, I picked this JavaScript file:
test.js.zip

I ran my sample also on WildFly, which includes the Mojarra Jakarta Faces implementation, and here the error did not happen. So maybe it is really a syntax error?

@rbri
Copy link
Member

rbri commented Oct 16, 2024

@WolfgangHG many thanks for the issue and the test case. Will have a more detailed look during the next days.

But i fear this is similar to #732. Maybe you can simply run your test app and download the http://localhost:8080/test/jakarta.faces.resource/faces.js.jsf file and attach it here. Then i can have a look.

@WolfgangHG
Copy link
Author

WolfgangHG commented Oct 16, 2024

Just for the records: the file URL is http://localhost:8080/test/jakarta.faces.resource/faces.js.jsf?ln=jakarta.faces#2 - without the parameters, no file is returned.
The file is exactly the same that I attached to the initial report ("test.js.zip")

TomEE 10.0M2 bundles "myfaces-api-4.0.2.jar", the same version as in #732

@WolfgangHG
Copy link
Author

And I have set my faces sample to development mode (web.xml parameter "jakarta.faces.PROJECT_STAGE" = "Development"), so it seems to return "faces-development.js" from "myfaces-api-4.0.2.jar"

@rbri
Copy link
Member

rbri commented Oct 16, 2024

@WolfgangHG ah, ok... the

the #194 point to the error line - i thing my initial guess is correct the line uses the spread syntax that is currently not supported by Rhino.

    function chain(source, event, ...funcs) {
        return AjaxImpl_1.Implementation.chain(source, event, ...funcs);
    }

For the moment you can only write some Preprocessor the converts the js into something that htmlunit can handle (or ask your boss to sponsor some work to add that to rhino).

For writing a preprocessor you can have a look at https://github.com/HtmlUnit/htmlunit/blob/152560e88dac21cd792cc1f716224443ce19cd48/src/main/java/org/htmlunit/javascript/preprocessor/HtmxOneNineTenScriptPreProcessor.java. And reach out to me if you have any questions regarding this.

Will have a look at the spread support in rhino again, but this will require some time.

@rbri
Copy link
Member

rbri commented Oct 16, 2024

@WolfgangHG and of course you can also 'patch' the jar itself and replace that not supported constructs (babylon has rhino support)

@WolfgangHG
Copy link
Author

Sorry, no chance for a sponsorship ;-) - the issue happens in a small open source project, and it happens only in one tiny unit test that actually uses a Ajax request. And it happens only in the TomEE test suite, while the project mainly focuses on WildFly. So it is also not worth the effort to write a PreProcessor workaround. Hopefully you come up with a fix some time...

As the same issue is also tracked by #732, you can close this issue as "duplicate".

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants