У меня проблемы с последним jxBrowser.
Я добавил Javascript-ява-мост с onScriptContextCreated:Javascript-Java-Bridge иногда не работает (JxBrowser 6.3)
mainBrowser.addScriptContextListener(new ScriptContextAdapter()
{
@Override
public void onScriptContextCreated(ScriptContextEvent event)
{
Browser browser = event.getBrowser();
JSValue jsValue = browser.executeJavaScriptAndReturnValue("window");
jsValue.asObject().setProperty("app", new JavascriptBridge());
logger.info("Set app context in JS");
}
});
В JS У меня есть функция под названием 'gwtAdapter', в котором называются две Java-функции:
function gwtAdapter(name, params, callback)
{
try
{
if (name == "saveSelectedLoginData")
{
app.sendMessageNew(name, params, callback);
console.log("DURCH DURCH DURCH");
}
else
{
console.log("Call sendMessage: \n\tName:" + name + "\n\tParams: " + params);
app.sendMessage(name, [params]);
console.log("Call sendMessage: \n\tName:" + name + "\n\tCallback: " + callback);
app.setMessageCallback(name, callback);
}
}
catch(err)
{
console.log("Error in gwtAdapter: " + err.message);
}
}
Пожалуйста, не обсуждать разумность этих функций;) У них есть причина.
В некоторых случаях браузер висит, когда он достигает app.sendMessage, а затем я не получаю никаких журналов или сообщений об ошибках. Тогда я больше не могу взаимодействовать с консолью DevTools.
Я не знаю, какую информацию я должен добавить, потому что я не могу найти что-то, что я могу добавить, что может быть полезно.
LogLevel уже на Level.ALL.
Если у вас есть вопросы, вы можете задать вопрос, чтобы я мог что-то добавить.
Edit_1:
JxBrowser-browser.log:
Mai 10, 2016 11:51:04 AM com.teamdev.jxbrowser.chromium.BrowserType getDefault
INFORMATION: JxBrowser type: HEAVYWEIGHT
JxBrowser-chromium.log: пусто
JxBrowser-ipc.log: Он ничего полезного не журнал для этой ошибки
Edit_2:
Странно ... После прошивки потребовалось около 8 минут, чтобы передать функцию, но потом разрушен javascript-java-мост.
Вот некоторые журналы:
Mai 10, 2016 2:52:55 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelReader a
INFORMATION: READ: OnConsoleMessage{type=OnConsoleMessage, uid=907, level=0, message='Save LoginData now!', lineNumber=568, sourceId='file:///workspace/xxxxxxx/processes/Contents/Login/js/functions.js'}, SocketInfo{cid=0, bid=0, channelType=Browser}
Mai 10, 2016 2:52:55 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelReader a
INFORMATION: READ: OnInvokeJSJavaMessage{type=OnInvokeJSJavaEvent, uid=13, javaObjectId=0, contextPtr=140448130669824, methodName='sendMessageNew', parameters='s21:saveSelectedLoginData:s158:{"saveLoginData": {"selectedUser": "testuser", "selectedPassword": "testuser", "selectedSystem": "xxxxxx", "selectedLanguage": "de"}}:of140448149924128:', returnValue='', errorMessage=''}, SocketInfo{cid=0, bid=0, channelType=Render}
Mai 10, 2016 3:01:15 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelWriter run
INFORMATION: WRITE: OnInvokeJSJavaMessage{type=OnInvokeJSJavaEvent, uid=12, javaObjectId=0, contextPtr=140448130669824, methodName='setMessageCallback', parameters='s6:getUrl:of140448129618576:', returnValue='', errorMessage='Failed to send message.'}, SocketInfo{cid=0, bid=0, channelType=Render}
Mai 10, 2016 3:01:15 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelWriter run
INFORMATION: WRITE: ExecuteJavaScriptMessage{type=ExecuteJavaScript, uid = 40, frameId=-1, javaScript='window', hasReturnValue=true, returnValue='null'}, SocketInfo{cid=0, bid=0, channelType=Render}
Mai 10, 2016 3:01:15 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelReader a
INFORMATION: READ: ExecuteJavaScriptMessage{type=ExecuteJavaScript, uid = 40, frameId=-1, javaScript='window', hasReturnValue=true, returnValue='oo140448128891328:'}, SocketInfo{cid=0, bid=0, channelType=Render}
Mai 10, 2016 3:01:15 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelWriter run
INFORMATION: WRITE: JSInvokeFunctionMessage{type=JSInvokeFunction, uid=41, objectPtr=140448128891328, functionPtr=140448149924128, contextPtr=140448130669824, frameId=-1, args='on:', result='null', error='null'}, SocketInfo{cid=0, bid=0, channelType=Render}
Mai 10, 2016 3:01:15 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelReader a
INFORMATION: READ: JSInvokeFunctionMessage{type=JSInvokeFunction, uid=41, objectPtr=140448128891328, functionPtr=140448149924128, contextPtr=140448130669824, frameId=-1, args='on:', result='ou:', error=''}, SocketInfo{cid=0, bid=0, channelType=Render}
Mai 10, 2016 3:01:15 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelWriter run
INFORMATION: WRITE: OnInvokeJSJavaMessage{type=OnInvokeJSJavaEvent, uid=13, javaObjectId=0, contextPtr=140448130669824, methodName='sendMessageNew', parameters='s21:saveSelectedLoginData:s158:{"saveLoginData": {"selectedUser": "testuser", "selectedPassword": "testuser", "selectedSystem": "xxxxxxx", "selectedLanguage": "de"}}:of140448149924128:', returnValue='', errorMessage=''}, SocketInfo{cid=0, bid=0, channelType=Render}
Mai 10, 2016 3:01:15 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelReader a
INFORMATION: READ: OnConsoleMessage{type=OnConsoleMessage, uid=1119, level=0, message='voidFunction called', lineNumber=1153, sourceId='file:///workspace/xxxxxxxxx/processes/Contents/Login/js/functions.js'}, SocketInfo{cid=0, bid=0, channelType=Browser}
Mai 10, 2016 3:01:15 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelReader a
INFORMATION: READ: OnConsoleMessage{type=OnConsoleMessage, uid=1120, level=0, message='voidFunction-response: null', lineNumber=1156, sourceId='file:///workspace/xxxxxx/processes/Contents/Login/js/functions.js'}, SocketInfo{cid=0, bid=0, channelType=Browser}
Mai 10, 2016 3:01:15 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelReader a
INFORMATION: READ: OnConsoleMessage{type=OnConsoleMessage, uid=1121, level=0, message='DURCH DURCH DURCH', lineNumber=95, sourceId='file:///workspace/xxxxxx/processes/Contents/Login/js/functions.js'}, SocketInfo{cid=0, bid=0, channelType=Browser}
Mai 10, 2016 3:01:15 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelReader a
INFORMATION: READ: JSInvokeFunctionMessage{type=JSInvokeFunction, uid=39, objectPtr=140448151648656, functionPtr=140448129618576, contextPtr=140448130669824, frameId=-1, args='s234:{"response":{"url":"xxxxxxxxx"},"exceptions":{},"success":true}:', result='xxxxxxxx', error=''}, SocketInfo{cid=0, bid=0, channelType=Render}
Mai 10, 2016 3:01:15 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelReader a
INFORMATION: READ: OnConsoleMessage{type=OnConsoleMessage, uid=1122, level=0, message='Login now!', lineNumber=570, sourceId='file:///workspace/xxxxx/processes/Contents/Login/js/functions.js'}, SocketInfo{cid=0, bid=0, channelType=Browser}
Mai 10, 2016 3:01:15 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelReader a
INFORMATION: READ: OnConsoleMessage{type=OnConsoleMessage, uid=1123, level=0, message='Error in gwtAdapter: undefined', lineNumber=110, sourceId='file:///workspace/xxxxxx/processes/Contents/Login/js/functions.js'}, SocketInfo{cid=0, bid=0, channelType=Browser}
я заменил некоторые детали с хххххх
Edit_3:
Я думаю, что я получил его. Может быть, это ошибка?
На первый некоторый код:
function testFunction()
{
gwtAdapter("testFunction", '{"gwtIndexGuiReady":true, "xxxxx":1000, "isNewItem":true}', testFunc2);
}
function testFunc2()
{
gwtAdapter("testFunc2", '{"gwtIndexGuiReady":true, "xxxxx":1000, "isNewItem":true}', voidFunction);
}
function voidFunction(response)
{
console.log("voidFunction called");
if(typeof response !== 'undefined')
{
console.log("voidFunction-response: " + response);
}
}
Действия для воспроизведения ошибки:
- Начало JxBrowser
- Открыть DevTools
- Установить точку останова на app.sendMessage в gwtAdapter
- Вызов функции теста();
- Посмотрите, как мост правильно не работает на второй gwtAdapter вызова
Первый вызов функции (SendMessage из функции теста) работает нормально, но второй вызов функции (SendMessage из testFunc2) не будет работать.
Небольшое пояснение:
последний параметр из gwtAdapter является обратного вызова, которая будет выполнена из Java (где функция является обратный вызов, как Функция JsFunction):
JSValue jsValue = mainBrowser.executeJavaScriptAndReturnValue("window");
logger.info("Call callback for: " + name);
function.invoke(jsValue.asObject(), messageMap.get(name));
в этом обратном есть другой вызов gwtAdapter и sendMessage будет ломаться там, или, другими словами, он зависает в sendMessage примерно за 8: 30 минут, а затем передает эту функцию.
Edit_4:
Может быть, это проблема многопоточности? Я думаю, что он выполняет javascript-обратный вызов, и в этом обратном вызове он пытается выполнить функцию в Java (sendMessage). Я думаю, что он не может выполнять javascript и получать вызовы параллельно.
В этом случае сообщения журнала очень важны. Например, я вижу в сообщении OnConsoleMessage, что в коде JavaScript есть ошибка - «Ошибка в gwtAdapter: undefined», строка «Номер_1 = 110, sourceId =» file: /// workspace/xxxxxx/процессы/Содержание/Вход/js/functions. js 'похоже, что обратный вызов Java не вызывается из-за некоторых ошибок в JavaScript-коде. Убедитесь, что код JavaScript не вызывает ошибок в функции gwtAdapter(). – Vladimir