2016-05-10 2 views
0

У меня проблемы с последним 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); 
    } 
} 

Действия для воспроизведения ошибки:

  1. Начало JxBrowser
  2. Открыть DevTools
  3. Установить точку останова на app.sendMessage в gwtAdapter
  4. Вызов функции теста();
  5. Посмотрите, как мост правильно не работает на второй 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 и получать вызовы параллельно.

+1

В этом случае сообщения журнала очень важны. Например, я вижу в сообщении OnConsoleMessage, что в коде JavaScript есть ошибка - «Ошибка в gwtAdapter: undefined», строка «Номер_1 = 110, sourceId =» file: /// workspace/xxxxxx/процессы/Содержание/Вход/js/functions. js 'похоже, что обратный вызов Java не вызывается из-за некоторых ошибок в JavaScript-коде. Убедитесь, что код JavaScript не вызывает ошибок в функции gwtAdapter(). – Vladimir

ответ

0

Вчера TeamDev выпустила версию 6.4 (Chromium v49) для jxBrowser, в которой проблема решена.

Смежные вопросы