首页 > 解决方案 > 获取 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 是什么?

或者,获取这些事件以进行故障排除的正确方法是什么?

标签: javajavafx

解决方案


您可以通过 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

以下是对我如何计算出这一点的更深入的解释:

  1. WebConsoleListener#setDefaultListener(WebConsoleListener)调用WebPageClientImpl#setConsoleListener(WebConsoleListener)

  2. WebPageClientImpl#setConsoleListener(WebConsoleListener)将侦听器存储在其静态字段consoleListener中。

  3. consoleListener仅与WebPageClientImpl#addMessageToConsole(String,int,String)交互。

  4. WebPageClientImpl#addMessageToConsole(String,int,String)覆盖WebPageClient#addMessageToConsole(String,int,String)

  5. 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。


推荐阅读