2012-11-04 32 views
0

Debugging Web Apps如何延長的WebView JavaScript控制檯(匹配ConsoleMessage.MessageLevel)

的Android的WebKit不會實現所有其他桌面瀏覽器提供的控制檯的API。你可以,但是,使用基本的文本記錄功能:

console.log(String) 
console.info(String) 
console.warn(String) 
console.error(String) 

其他控制檯功能不引發錯誤,但可能不具有相同的行爲,你從其他Web瀏覽器的期望。


android.webkit.ConsoleMessage.MessageLevel

ConsoleMessage.MessageLevel DEBUG
ConsoleMessage.MessageLevel ERROR
ConsoleMessage.MessageLevel LOG
ConsoleMessage.MessageLevel TIP
ConsoleMessage.MessageLevel警告


在開發web應用程序原生混合動力尤其是對於Android的設備我很高興能夠與普通的logcat合併的JavaScript控制檯。但是很可惜:有一個console.debug會導致MessageLevel.INFO並且根本沒有console.verbose()(引發錯誤)。

回答

2

爲了解決這個我會用一個簡單的(和真難看和不穩定)適配器延伸的控制檯的功能:

var c = window.console; 
window.console = { 
    debug: function(message) { c.error("(DEBUG)#" + message); }, 
    verbose: function(message) { c.error("(VERBOSE)#" + message); }, 
    error: function(message) { c.error(message); }, 
    warn: function(message) { c.warn(message); }, 
    log:  function(message) { c.log(message); }, 
    info: function(message) { c.info(message); } 
}; 

for (i in c) { 
    try { 
     window.console[c[i]](); 
    } catch(error) { 
     if(verbose) console.verbose("Funktion nicht implementiert: " + c[i]); 
     window.console[c[i]] = function(arguments) { 
      if(debug) console.debug("Aufruf nicht implementierter Funktion: " + this); 
      var funcDefArray = ("" + this).split(" "); 
      c[funcDefArray[1]](arguments); 
     }; 
    } 
} 

該適配器提供了記錄功能而添加前綴(DEBUG)#(VERBOSE)#到消息作爲參數給出,並從原始控制檯對象中調用error()。希望這將是最少使用的級別,所以這是檢查前綴的傳入消息的地方。 logcat中的希望日誌記錄級別得到由提取前綴選擇:

public class CustomWebChromeClient extends WebChromeClient { 
@Override 
public boolean onConsoleMessage(ConsoleMessage consoleMessage) { 
    String tag = TAG_JS; 
    StringBuffer message = new StringBuffer(consoleMessage.message()); 

    MessageLevel lvl = consoleMessage.messageLevel(); 
    if (lvl == MessageLevel.ERROR) { 
     int i = message.indexOf(")#"); 
     if(i > 0 && i < 8) { 
      String realLevel = message.substring(1, i); 
      message.replace(0, i+2, ""); 
      if("DEBUG".equals(realLevel)) lvl = MessageLevel.DEBUG; 
      else if("VERBOSE".equals(realLevel)) lvl = MessageLevel.TIP; 
      else tag += " (" + realLevel + ")"; 
     } else { 
      String source = consoleMessage.sourceId(); 
      source = source.substring(source.indexOf("/js/") + 1); 
      message.append(source); 
      message.append('(').append(consoleMessage.lineNumber()).append(')'); 
      message.append(" –> "); 
     } 
    } 

    message.append(consoleMessage.message()); 
    switch (lvl) { 
    case ERROR: 
     Log.e(tag, message.toString()); 
     break; 
    case WARNING: 
     Log.w(tag, message.toString()); 
     break; 
    case LOG: 
     Log.i(tag, message.toString()); 
     break; 
    case DEBUG: 
     Log.d(tag, message.toString()); 
     break; 
    case TIP: 
     Log.v(tag, message.toString()); 
     break; 
    default: 
     Log.println(Log.ASSERT, tag, message.toString()); 
     break; 
    } 
    return true; 
} 
} 

我試圖通過原型操縱控制檯的功能,但在這個時候,我沒有這個熟悉獲得工作結果現在。爲了我的目的,這已經足夠,最終其他人可以使用這個廢話。

如果有人願意爲我提供幾條原型,我會很高興,我希望下次我需要這樣的東西時,我可以自己做這件事;)