从 7.16 到 7.17
在这份迁移指南中,我们描述了 7.17 版本中已移除的 API,以及您应该使用的替代方案。
导航
加载 HTML
v7.16
要将字符串中的 HTML 加载到网页中的某个 Frame 中,可以使用以下 Frame
方法:
loadHtml(String html)
loadHtml(LoadHtmlParams params)
loadData(LoadDataParams params)
v7.17
出于安全原因,最近的 Chromium 构建中更改了允许将 HTML 加载到网页 Frame 中的功能,并且不再正常工作。例如,如果加载的 HTML 包含位于 Web 服务器上的外部图像,则这些图像将无法加载和显示。
为了摆脱意外行为和潜在的 bug,我们决定移除这些方法,并建议以下替代方法来从字符串加载 HTML。
通过加载 Data URL:
String html = "<html><body>Hello</body></html>";
String base64Html = Base64.getEncoder().encodeToString(html.getBytes(UTF_8));
String dataUrl = "data:text/html;charset=utf-8;base64," + base64Html;
browser.navigation().loadUrl(dataUrl);
val html = "<html><body>Hello</body></html>"
val base64Html = Base64.getEncoder().encodeToString(html.toByteArray(UTF_8))
val dataUrl = "data:text/html;charset=utf-8;base64,$base64Html"
browser.navigation().loadUrl(dataUrl)
通过注册自定义方案并拦截所需的 URL 请求:
InterceptUrlRequestCallback interceptCallback = params -> {
if (params.urlRequest().url().endsWith("?hello")) {
byte[] bytes = "<html><body>Hello</body></html>".getBytes();
UrlRequestJob job = params.newUrlRequestJob(
UrlRequestJob.Options
.newBuilder(HttpStatus.OK)
.addHttpHeader(HttpHeader.of("Content-Type", "text/html"))
.build());
job.write(bytes);
job.complete();
return Response.intercept(job);
}
return Response.proceed();
};
EngineOptions options = EngineOptions.newBuilder(renderingMode)
.addScheme(HTTP, interceptCallback)
.build();
Engine engine = Engine.newInstance(options);
Browser browser = engine.newBrowser();
browser.navigation().loadUrl("http://load.html/?hello");
val interceptCallback = InterceptUrlRequestCallback { params ->
if (params.urlRequest().url().endsWith("?hello")) {
val bytes = "<html><body>Hello</body></html>".toByteArray()
val job = params.newUrlRequestJob(
UrlRequestJob.Options
.newBuilder(HttpStatus.OK)
.addHttpHeader(HttpHeader.of("Content-Type", "text/html"))
.build()
)
job.write(bytes)
job.complete()
Response.intercept(job)
} else {
Response.proceed()
}
}
val options = EngineOptions.newBuilder(renderingMode)
.addScheme(HTTP, interceptCallback)
.build()
val engine = Engine.newInstance(options)
val browser = engine.newBrowser()
browser.navigation().loadUrl("http://load.html/?hello"))
了解更多关于这些方法的信息,请查阅导航。
系统属性
以下内部系统属性已被移除:
jxbrowser.display.watcher.off
jxbrowser.enable.custom.dropdowns
请使用 jxbrowser.desktop.headless.on
系统属性来代替,以在离屏渲染模式下禁用显示监视器并启用自定义下拉菜单。