java - 获取 JavaFX WebView 控制台事件的公共 API 是什么?
问题描述
我想记录 WebView 控制台事件。他们有时会在使用的底层浏览器中发现怪癖,并可以帮助进行故障排除。
可以使用 Sun 实现类与 WebView 控制台交互:
import
//...
WebConsoleListener.setDefaultListener((webView, message, lineNumber, sourceId) ->
LOGGER.info(() -> "WebConsoleListener: " + message + "[" + webEngine.getLocation() + ":" + lineNumber + "]")
);
但是,com.sun.javafx.webkit.WebConsoleListener是一个实现类,而不是 JavaFX 公共 API 的一部分。
获取 JavaFX WebView 控制台事件的公共 API 是什么?
或者,获取这些事件以进行故障排除的正确方法是什么?
解决方案
您可以通过 Java™ 2 平台的核心日志记录工具启用浏览器控制台日志记录,方法是将其添加到 logging.properties:
com.sun.webkit.WebPage.level = FINE
确保日志记录配置中存在具有 FINE 或更低级别的日志处理程序,否则日志将在记录之前被过滤。例子:
handlers = java.util.logging.ConsoleHandler
.level = INFO
java.util.logging.ConsoleHandler.level = ALL
java.util.logging.ConsoleHandler.formatter = java.util.logging.XMLFormatter
com.sun.webkit.WebPage.level = FINE
以下是对我如何计算出这一点的更深入的解释:
WebConsoleListener#setDefaultListener(WebConsoleListener)调用WebPageClientImpl#setConsoleListener(WebConsoleListener)。
WebPageClientImpl#setConsoleListener(WebConsoleListener)将侦听器存储在其静态字段consoleListener中。
consoleListener仅与WebPageClientImpl#addMessageToConsole(String,int,String)交互。
WebPageClientImpl#addMessageToConsole(String,int,String)覆盖WebPageClient#addMessageToConsole(String,int,String)。
WebPageClient#addMessageToConsole(String,int,String)由WebPage#fwkAddMessageToConsole(String,int,String)调用。在撰写本文时,代码库中没有其他调用站点。
同样的方法记录控制台信息:
log.log(Level.FINE, "fwkAddMessageToConsole(): message = " + message
+ ", lineNumber = " + lineNumber + ", sourceId = " + sourceId);
这意味着您可以通过在com.sun.webkit.WebPage上启用FINE日志记录来获得所需的日志记录,从而将实现级别的依赖性限制为日志记录配置:
com.sun.webkit.WebPage.level = FINE
我找不到为此的公共 API。
根据我对 OpenJDK JFX 存储库源的审查,没有用于此的公共 API。
此解决方案仍然不理想,因为它依赖于私有实现类名,但该依赖关系位于配置文件中,如果实现类更改或消失,影响是日志记录丢失,而不是可能致命的 NoClassDefFoundError 或 NoSuchMethodError。
推荐阅读
- java - Map-Reduce 中的洗牌
- java - Java UTF-8 URLEncoder 编码不应该的特殊字符
- javascript - 输入 autocomplete="off" 在 Chrome 最新版本中不起作用
- flutter - 在小部件之间画一条线
- docker - 无法启动容器“catalina,sh”:在 $PATH 中找不到可执行文件
- ios - 在 Swift 中使用 Alamofire 5.0 获取 3 级深度 JSON 值
- python - Add a new column to Dataframe and set MultiIndex
- python - 尝试使用 conda 时出现“语法错误:生成器表达式必须加括号”
- mongodb - 如何将 Mongodb 的默认存储引擎(wiredtiger)更改为我修改后的wiredtiger(git source build)?
- java - 如何从 Android 的匿名类中引用接口?