Недавно я интегрировал Java Chromium Embedded Framework (https://github.com/chromiumembedded/java-cef) в проекте приложения Netbeans (RCP) (Java: JDK11).
Окно браузера отображается в Netbeans TopComponent и в целом работает нормально.
Однако у меня есть несколько довольно небольших, но неприятных ошибок, которые я заметил, которые всегда следуют одному и тому же шаблону: какой бы код я ни выполнял, относящийся к браузеру jcef, всегда работает только тогда, когда я запускаю его во второй раз, и практически игнорируется в первый раз. Однако нет сообщений об ошибках, журналов или чего-то подобного, и код, кажется, выполняется, когда я просматриваю его с помощью инструмента отладки.
Три примера:
- Реализация кнопки возврата:
Это просто проверяет, возвращает ли экземпляр CefBrowsertrue
вместоbrowser.canGoBack()
. Если он возвращаетtrue
, кнопка активирована.
Значение начинается правильно сfalse
, но возвращает true сразу после второго изменения URL. (Очевидно, что это должно произойти после первого)
С этого момента все работает нормально ....Если только вы не вернетесь (кнопкой возврата) на главную страницу. Затем он, очевидно, должен снова вернутьfalse
, чего не происходит.
Повторный вызов другого URL возвращаетfalse
вместоcanGoBack()
(который, очевидно, должен бытьtrue
) и возвращаетtrue
только после второго изменения URL.
Таким образом, return fromcanGoBack
всегда показывает доход, который он должен был показать от своего предыдущего выполнения, как если бы он отставал на один раз. - Реализация функции перехода
Эта функция просто перенаправляет вас на указанный веб-сайт, отличный от домашней страницы. Опять же, со второго раза работает нормально, но в первый раз код просто игнорируется. (хотя через отладчик я подтвердил, что код выполняется без ошибок даже с первого раза) - Реализация диалогового окна входа в систему.
Если браузер замечает, что требуется аутентификация, открывается диалоговое окно, в котором пользователь может ввести БАЗОВЫЕ учетные данные.
И снова открывается диалоговое окно, учетные данные возвращаются правильно (подтверждено через журнал), передаются соответствующей функции, и она работает со второй попытки, но не с первой. (учетные данные были идентичны)
Действительно, я подтвердил через Wireshark, что при первом выполненииcallback.Continue(ad.getUsername(), ad.getPassword());
на сервер вообще ничего не отправляется...
Код для третьего примера:
cefClient_.addRequestHandler(new CefRequestHandlerAdapter() {
@Override
public boolean getAuthCredentials(CefBrowser browser, String origin_url, boolean isProxy, String host,
int port, String realm, String scheme, CefAuthCallback callback) {
AuthenticationDialog ad = new AuthenticationDialog();
ad.authenticate(); // Shows Login Dialog
LOGGER.log(Level.INFO, String.format("--->%s:%s", ad.getUsername(), ad.getPassword())); //This confirms that the variables are indeed correct even the first time around
callback.Continue(ad.getUsername(), ad.getPassword());
return true;
}
});
К сожалению, я больше не знаю, что может вызвать эти проблемы.
Если у кого-то из вас были такие же проблемы или есть какие-либо идеи о том, как их исправить или даже где начать искать исправление, я был бы очень признателен за ваши комментарии.
Заранее спасибо!