Как установить время ожидания скрипта для браузера 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