Как да зададете таймаут на скрипта за JX браузър

Ние използваме jxbrowser версия 6.21 (най-нова към момента на писане).

Ако скриптът заседне в безкраен цикъл, jxbrowser просто замръзва и остава без отговор. Чаках повече от 2 минути.

Има ли някакъв начин това да се справи гладко?

Съвременните браузъри откриват това и показват наслагване на потребителя, за да спре скрипта.

SSCCE: html-файл с това съдържание:

<html>
    <body>
        <script>
            function badLoop() {
                var nextTime = new Date().getTime();
                while (true) {
                    var now = new Date().getTime();
                    if (now > nextTime) {
                        console.log('badLoop() running: ' + now);
                        nextTime = now + 500;
                    }
                }
            }
        </script>
        <input type="button" value="startLoop" onClick="badLoop()" />
    </body>
</html>

Тестове с други браузъри:

  • Firefox след около 15 секунди:
    Firefox
  • При натискане на „стоп уебсайт“ Firefox просто спира скрипта, но запазва уебсайта отворен и регистрира това в конзолата: FirefoxConsole

  • Google Chrome след около 30 секунди:
    GoogleChrome

  • Google Chrome (различен от firefox) всъщност напуска уеб сайта след натискане на напускане (и показва тази грешка):
    въведете описание на изображението тук

Възможно ли е това с jxbrowser? Напълно автоматично или с потвърждение от потребителя?


person Frederic Leitenberger    schedule 09.08.2018    source източник
comment
Бихте ли добавили SSCCE, който може да се използва за възпроизвеждане на описаното поведение в JxBrowser? В допълнение, правилно ли е да използвате метода Browser.executeJavaScriptAndReturnValue() за стартиране на такъв скрипт?   -  person Anna Dolbina    schedule 13.08.2018
comment
Добавени са SSCCE и примерни екранни снимки от FF и Chrome. НЕ използвам тази команда за изпълнение. Вижте моя SSCCE.   -  person Frederic Leitenberger    schedule 13.08.2018


Отговори (1)


Ето пример, който демонстрира как да прихванете съответното onRenderUnresponsive събитие в JxBrowser и да откриете, че уеб страницата е престанала да реагира:

public class BrowserSample {

    public static void main(String[] args) {
        Browser browser = new Browser();
        BrowserView view = new BrowserView(browser);

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(view, BorderLayout.CENTER);
        frame.setSize(700, 500);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        browser.addRenderListener(new RenderAdapter() {
            @Override
            public void onRenderUnresponsive(RenderEvent event) {
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        JOptionPane.showMessageDialog(view, "The web page is unresponsive.");
                    }
                });
            }
        });

        browser.loadHTML("<html>\n"
                + "    <body>\n"
                + "        <script>\n"
                + "            function badLoop() {\n"
                + "                var nextTime = new Date().getTime();\n"
                + "                while (true) {\n"
                + "                    var now = new Date().getTime();\n"
                + "                    if (now > nextTime) {\n"
                + "                        console.log('badLoop() running: ' + now);\n"
                + "                        nextTime = now + 500;\n"
                + "                    }\n"
                + "                }\n"
                + "            }\n"
                + "        </script>\n"
                + "        <input type=\"button\" value=\"startLoop\" onClick=\"badLoop()\" />\n"
                + "    </body>\n"
                + "</html>");
    }
}

Вижте https://jxbrowser.support.teamdev.com/support/solutions/articles/9000091687-detecting-unresponsive-web-page

person Anna Dolbina    schedule 14.08.2018