从 2.6 迁移到 2.7
在本迁移指南中,我们将介绍 2.7 中已删除/更改的 API,以及应该使用的替代方案。
已删除的 API
加载 HTML
v2.6
在某些情况下,可以使用 IFrame.LoadHtml()
或 IFrame.LoadData()
加载简单的 HTML 文档。 这就是它的样子:
var html = "<html><head></head><body><h1>Hello world!</h1></body></html>";
browser.MainFrame.LoadHtml(html).Wait();
Dim html = "<html><head></head><body><h1>Hello world!</h1></body></html>"
browser.MainFrame.LoadHtml(html).Wait()
v2.7
安全限制变得更加严格。 因此,当使用 LoadHtml()
加载依赖于外部脚本的 HTML 文档时,它永远不会加载这些脚本,并记录错误信息 Failed to load resource: net::ERR_NOT_IMPLEMENTED
。 同样的行为也可以在 HTML 中的图像中观察到。
没有办法在不破坏 Chromium 安全性的情况下修复此行为,这就是 IFrame.LoadHtml
和 IFrame.LoadData
都从 API 中完全删除的原因。
可能的解决方法是使用 data:
编码 URI,然后使用常规的 LoadUrl 调用加载它。 下面是一个例子:
var html = "<html><head></head><body><h1>Html Encoded in URL!</h1></body></html>";
var base64EncodedHtml = Convert.ToBase64String(Encoding.UTF8.GetBytes(html));
browser.Navigation.LoadUrl("data:text/html;base64," + base64EncodedHtml).Wait();
Dim html = "<html><head></head><body><h1>Html Encoded in URL!</h1></body></html>"
Dim base64EncodedHtml = Convert.ToBase64String(Encoding.UTF8.GetBytes(html))
browser.Navigation.LoadUrl("data:text/html;base64," & base64EncodedHtml).Wait()
不过,使用这种解决方法时无法设置基本 URL。
另一种可能的方法是使用处理程序注册一个 Scheme
并拦截相应的请求以提供 HTML。 请参阅相应的文章.
更新的 API
Cookie 存储
v2.6 之前,在设置 cookie 时需要传递网页 URL:
Cookie cookie = new Cookie.Builder
{
Name = "name",
Value = "value",
DomainName = ".google.com",
Path = "/"
}.Build();
bool success = engine.CookieStore.SetCookie("https://www.google.com",cookie).Result;
engine.CookieStore.Flush();
Dim cookie As Cookie = New Cookie.Builder With {
.Name = "name",
.Value = "value",
.DomainName = ".google.com",
.Path = "/"
}.Build()
Dim success As Boolean = engine.CookieStore.SetCookie("https://www.google.com",cookie).Result
engine.CookieStore.Flush()
v2.7
ICookieStore.SetCookie()
现在没有 URL 参数,因为之前它仅用于验证目的:
Cookie cookie = new Cookie.Builder
{
Name = "name",
Value = "value",
DomainName = ".google.com",
Path = "/"
}.Build();
bool success = engine.Profiles.Default.CookieStore.SetCookie(cookie).Result;
engine.Profiles.Default.CookieStore.Flush();
Dim cookie As Cookie = New Cookie.Builder With {
.Name = "name",
.Value = "value",
.DomainName = ".google.com",
.Path = "/"
}.Build()
Dim success As Boolean = engine.Profiles.Default.CookieStore.SetCookie(cookie).Result
engine.Profiles.Default.CookieStore.Flush()
此外, ICookieStore.Delete()
现在返回 Task
,而不是 Task<bool>
。
添加的 API
默认背景颜色
当 Chromium 不知道网页的背景颜色,或者根本未指定颜色时,它使用白色。 在 2.7 版本中,我们通过新功能扩展了 API,允许您配置 Chromium 在这种情况下应使用的默认背景色,而不是默认的白色。
以下代码演示了如何为 about:blank 页面设置所需的背景颜色:
Color purple = new Color(0.6f, 0.3f, 0.6f);
browser.Settings.DefaultBackgroundColor = purple;
Dim purple As New Color(0.6F, 0.3F, 0.6F)
browser.Settings.DefaultBackgroundColor = purple
以文本形式获取框架内容
IFrame.Text
属性以纯文本形式返回框架及其子框架的内容:
string text = browser.MainFrame?.Text;
Dim text As String = browser.MainFrame?.Text
查看页面来源
现在,你可以像在 Google Chrome 浏览器中一样,通过 IFrame.ViewSource
查看已加载网页或框架的源代码:
browser.MainFrame?.ViewSource();
browser.MainFrame?.ViewSource()
上面的代码告诉 Chromium 使用主框架的 HTML 源代码创建并打开一个弹出窗口。
JavaScript Promise
支持
现在,您可以直接使用 JavaScript promises(承诺),而无需在 IJsObject
上创建一个包装器。 例如:
IJsPromise promise = browser.MainFrame
.ExecuteJavaScript<IJsPromise>("Promise.resolve(\"test\")")
.Result;
// 当 promise 被履行或拒绝时调用一些 .NET 代码。
promise.Then(o => Console.WriteLine("Promise fulfilled"),
e => Console.WriteLine("Promise rejected"));
Dim promise As IJsPromise =
browser.MainFrame
.ExecuteJavaScript(Of IJsPromise)("Promise.resolve(""test"")")
.Result
' 当 promise 被履行或拒绝时调用一些 .NET 代码。
promise.Then(Sub(o) Console.WriteLine("Promise fulfilled"),
Sub(e) Console.WriteLine("Promise rejected"))
首选配色方案
可以通过浏览器设置强制使用首选配色方案:
// 强制启用深色模式。.
browser.Settings.PreferredColorScheme = PreferredColorScheme.Dark;
// 强制启用浅色模式。
browser.Settings.PreferredColorScheme = PreferredColorScheme.Light;
' 强制启用深色模式。
browser.Settings.PreferredColorScheme = PreferredColorScheme.Dark;
// 强制启用浅色模式。
browser.Settings.PreferredColorScheme = PreferredColorScheme.Light
遵循 prefers-color-scheme
媒体查询的网站将相应地切换到浅色或深色模式。
Chromium 配置文件支持
每个引擎都有一个默认的 Profile
,您可以通过以下方式访问:
IProfile defaultProfile = engine.Profiles.Default;
Dim defaultProfile As IProfile = engine.Profiles.Default
以下服务现属于 Profile
。 您可以独立管理每个配置文件的 cookie、下载、权限、插件等内容:
ZoomLevels
Plugins
Proxy
Network
SpellChecker
CookieStore
HttpCache
Downloads
Permissions
欲了解更多信息,请参阅相应的指南。