版本

新版本已发布
JxBrowser 7 的支持将于 2025 年 10 月终止,届时将不再提供 Chromium 更新和关键修复。 我们建议您升级至 JxBrowser 8,以享受新功能和改进带来的更多优势。 如果您有任何疑问或在升级过程中需要帮助,欢迎随时 。
目录

发布日期

JxBrowser 7.20

JxBrowser 7.20 已发布!我们已将 Chromium 升级至 94.0.4606.113 版本,启用了对 Windows 11 的支持,扩展了包含新 JavaScript 类型和打印设置的 API,引入了屏幕共享 API,并添加了重要的修复和改进。阅读下文了解更多详细信息!

在此版本中,我们对 API 进行了几处重大更改。请查看迁移指南了解 API 的具体更改。

Chromium 94 

Chromium 已升级至 94.0.4606.113 版本。

Chrome/Chromium 的最低系统要求在版本 94 中发生了变化,因此 JxBrowser 的系统要求也进行了更新。

2021 年 3 月,Google 宣布 Chrome/Chromium 计划从 2021 年第三季度开始,每 4 周发布一个新的里程碑版本,从 Chrome/Chromium 94 开始。此外,他们还添加了一个新的扩展稳定版(Extended Stable)选项,里程碑更新周期为 8 周。扩展稳定版的安全更新将每两周发布一次,以修复重要问题,但这些更新不会包含 4 周更新选项中的新功能或所有安全修复。

此 Chromium 版本属于扩展稳定版更新。它包含 Chromium 94 中引入的所有安全修复和新功能。

一如既往,我们建议您使用最新的 JxBrowser 版本和最新的 Chromium 构建。

Windows 11 

Windows 11 已被列入支持的平台列表,现在已正式支持。

JxBrowser on Windows 11

JavaScript 

JavaScript Java API 已扩展了新类型:

  • JsArray
  • JsSet
  • JsMap
  • JsArrayBuffer

这些类型中的一个 JavaScript 对象可以作为方法参数或返回值在 Java 和 JavaScript 之间传递。这个对象的生命周期绑定到它所属的 Frame 的生命周期。当拥有者 Frame 被卸载时,所有的 JavaScript 对象都会自动被销毁。尝试访问一个已被销毁的 JavaScript 对象将会导致 IllegalStateException。

Array, Set, Map 

要与 JavaScript 的 Array、Set 和 Map 进行交互,请使用 Java 中对应的类型:

JsArray array = frame.executeJavaScript("['苹果', '香蕉']");
JsSet set = frame.executeJavaScript("new Set([1, 2, 3, 4])");
JsMap map = frame.executeJavaScript("new Map([['李白', '32'], ['李清照', '26']])");

转换为 Java 集合 

每种类型都允许获取一个包含转换后的 JavaScript 集合元素的相应不可修改的 Java 集合:

JsArray array = frame.executeJavaScript("['苹果', '香蕉']");
java.util.List<String> list = array.toList(String.class);

JavaScript 集合元素的类型映射规则如下:

JavaScriptJava
NumberDouble
StringString
BooleanBoolean
null 和 undefinednull
NodeNode、JsObject
ArrayBufferbyte[]
ArrayList<?>
SetSet<?>
MapMap<?,?>
ObjectJsObject
Proxy ObjectObject

自动类型转换 

当您向 JavaScript 集合添加或插入元素时,它将根据以下类型映射规则自动转换为相应的 JavaScript 类型:

JavaJavaScript
DoubleNumber
StringString
BooleanBoolean
nullnull
JsObjectObject
NodeNode
List<?>Array 或 Proxy Object
Set<?>Set 或 Proxy Object
Map<?,?>Map 或 Proxy Object
byte[]ArrayBuffer
ObjectProxy Object

如果您将一个非原始类型的 Java 对象传递给 JavaScript,它将被转换为一个 Proxy Object(代理对象)。对该对象的方法和属性调用将委托给 Java 对象。出于安全原因,JavaScript 只能访问那些被显式标记为可访问的方法和字段,可以通过 @JsAccessible 注解或 JsAccessibleTypes 类来实现。

未使用 @JsAccessible 注解或 JsAccessibleTypes 类将 Java 集合暴露给 JavaScript 的情况下,这些集合将被转换为 JavaScript 集合。转换后的集合内容是 Java 集合的深拷贝。JavaScript 中对转换后集合的修改不会影响 Java 中的集合。

通过使用 @JsAccessible 注解或通过 JsAccessibleTypes Java 集合可以暴露给 JavaScript,并且这些集合将被封装为 JavaScript 代理对象。这样的代理对象可以用于在 Java 中修改集合。

二进制数据 

您可以使用 JavaScript 的 ArrayBuffer 及其 JsArrayBuffer Java 包装器在 JavaScript 和 Java 之间互相传输二进制数据。例如:

JsArrayBuffer arrayBuffer = frame.executeJavaScript("new ArrayBuffer(8)");
byte[] bytes = arrayBuffer.bytes();

@JsAccessible 

我们扩展了支持此注解的情况列表,并添加了对接口的支持。

现在您可以使以下内容对 JavaScript 可见:

  • 顶级类或接口
  • 嵌套的静态类或接口
  • 类或接口的非静态方法
  • 类的非静态字段

您可以在注解规则中找到关于如何使用此注解的更多信息。

屏幕共享 

该库已扩展了新的 API,允许您访问 Chromium 的屏幕共享功能。现在,如果一个网页想要共享您的屏幕,您将会看到如下所示的标准 Chromium 对话框:

WebRTC Screen Sharing Dialog

在此对话框中,您可以选择是否共享整个屏幕、特定窗口或其他 Browser 实例中加载的网页。

我们还扩展了 API,以便您能够以编程方式处理来自网页的屏幕共享请求。

以下示例展示了如何以编程方式启动主屏幕的捕获会话并在 5 秒后停止它:

browser.set(StartCaptureSessionCallback.class, (params, tell) -> {
    CaptureSources sources = params.sources();
    CaptureSource screen = sources.screens().get(0);
    // 告诉 Browser 实例以给定的捕获源(即第一个完整屏幕)开始一个新的捕获会话。
    tell.selectSource(screen, AudioCaptureMode.CAPTURE);
});

browser.on(CaptureSessionStarted.class, event -> {
    CaptureSession captureSession = event.capture();
    new java.util.Timer().schedule(new TimerTask() {
        @Override public void run() {
            // 以编程方式在 5 秒后停止捕获会话。
            captureSession.stop();
        }
    }, 5000);
});

Web 表单自动填充 

在此版本中,Web 表单自动填充功能已经实现。默认情况下,它是启用的。您可以使用 Profile Preferences API 来禁用它:

profile.preferences().disableAutofill();

密码存储 

Chromium 有一个内置功能,可以在用户提交包含用户名和密码的新表单时记住输入的凭据。该库将询问您是否要保存这些凭据。

如果您保存了这些凭据,下次您加载表单时,该库将建议自动填充它们。

Web Form Autofill Passwords

要访问和管理所有保存的密码,请使用 PasswordStore,您可以通过以下方式访问它:

PasswordStore passwordStore = profile.passwordStore();

默认字体大小 

使用新设置来修改在 Browser 中加载的网页的默认字体大小:

browser.settings().defaultFontSize(FontSizeInPixels.of(12));

打印 

Printing API 已经扩展了新的设置和属性。

页眉和页脚 

现在,当您以编程方式打印而不显示 Print Preview(打印预览) 对话框时,可以在打印文档的页眉和页脚中设置自定义 HTML。例如:

browser.set(PrintHtmlCallback.class, (params, tell) -> {
    PdfPrinter<HtmlSettings> pdfPrinter = params.printers().pdfPrinter();
    PrintJob<HtmlSettings> printJob = pdfPrinter.printJob();
    HtmlSettings settings = printJob.settings();

    // 配置包含自定义文本和文档标题的页眉。
    settings.header("<span style=\"font-size: 12px;\">"
            + "Page header: <span class=title></span></div>");

    // 配置包含自定义文本和当前页码的页脚。
    settings.footer("<span style=\"font-size: 12px;\">"
            + "Page footer: <span class=pageNumber></span></div>");

    // 应用打印设置。 
    settings.apply();

    tell.proceed(pdfPrinter);
});

缩放 

您可以更改打印文档的缩放比例。在自定义缩放的情况下,缩放比例必须是一个介于 10 到 200 之间的数字。

browser.set(PrintHtmlCallback.class, (params, tell) -> {
    PdfPrinter<HtmlSettings> pdfPrinter = params.printers().pdfPrinter();
    PrintJob<HtmlSettings> printJob = pdfPrinter.printJob();
    HtmlSettings settings = printJob.settings();

    // 配置打印内容的自定义缩放比例。
    settings.scaling(Scaling.custom(150));

    // 应用打印设置。
    settings.apply();

    tell.proceed(pdfPrinter);
});

打印机名称 

除了打印机设备名称之外,您还可以获取操作系统所理解的打印机名称:

browser.set(PrintHtmlCallback.class, (params, tell) -> {
    PdfPrinter<HtmlSettings> pdfPrinter = params.printers().pdfPrinter();

    // Print Preview 中显示的此打印机设备名称。
    String deviceName = pdfPrinter.deviceName();
    
    // 操作系统理解的此打印机名称。
    String printerName = pdfPrinter.printerName();
    ...
});

改进 

  • 从启动打印到调用 PrintHtmlCallback 和 PrintPdfCallback 回调之间的时间已经减少。之前性能问题的根本原因是,库在调用回调之前会收集可用的打印机及其功能。在这个版本中,库仅收集可用的打印机(不收集其功能),并根据需求为具体打印机请求其功能。
  • 现在,可以使用 --enable-logging 和 --vmodule=*/webrtc/*=1 Chromium 开关来启用 WebRTC 日志记录。

已修复的问题 

  • 已修复:JavaScript 性能在 BrowserView 操作后下降。为解决该问题,我们在两种渲染模式下禁用了 Windows 上的遮挡管理功能。Chromium 有一个逻辑来追踪其窗口何时被遮挡(即被系统中的另一个窗口遮挡),并在渲染过程中执行相应的通知,随后优化 CPU 使用率。此优化会减慢 JavaScript 执行速度。
  • 已修复:在 Linux 上尝试删除刚被聚焦的 Browser 的 Profile 后,Main Chromium 进程崩溃。
  • 已修复:在 Windows 上处理鼠标和键盘事件期间关闭 Browser 时,Main Chromium 进程崩溃。
  • 已修复:在 Linux 上关闭由网页发起的 JavaScript 对话框后,关闭 Browser 实例时发生的崩溃问题。
  • 已修复:使用 PageRange 程序化打印网页时,PrintCompleted 事件从不触发。
  • 已修复:在 Windows 上隐藏并显示视图后,BrowserView 在辅助 HiDPI 显示器上缩放 150% 时会变得模糊。

下载 JxBrowser 7.20

请提供您的电子邮箱地址,我们会尽快将下载说明发送给您。

发送...
EmailBox 请检查您的收件箱。

我们无法发送电子邮件。请使用直接链接下载JxBrowser。

如果您已经是我们的注册客户,您无需任何操作,即可轻松享受此次更新。

如果您希望深入了解并体验我们的产品,您可以申请评估许可证。

获取免费 30 天体验