无法影响Web浏览器控件的渲染引擎选择

时间:2014-04-29 11:41:39

标签: silverlight internet-explorer webbrowser-control internet-explorer-10

据我所知,有三种技术可以影响在Internet Explorer中呈现给定网页的方式(不改变页面代码):

  • 文档类型声明(<!DOCTYPE>标记)。这会影响页面是以标准,几乎标准还是Quirks模式呈现。

  • X-UA-Compatible元标记。这将导致浏览器使用特定的渲染引擎(如果可能)。

  • FEATURE_BROWSER_EMULATION注册表项。 According to MSDN,此设置如何影响页面呈现方式有时会受到文档类型声明的影响。
    (对于在64位机器上运行的32位程序,注册表项的确切路径位于wow6432node子树下)

我有一个Silverlight应用程序包含在一个简单的html页面中,我控制了这两个页面。在Silverlight应用程序中,我可以访问BrowserInformation类,通过该类我可以访问有关运行该应用程序的浏览器上下文的各种详细信息。这些包括:

注意:我没有确认我在SL中获得的数字实际上与我从JavaScript调用Navigator.appVersion时获得的数字相同。

此时,使用表格概述我正在观察的行为是最简单的。据我所知,SO不支持答案中的表格,所以请耐心等待。

在安装了IE10(10.0.9200.16866)的Windows 7 SP1(64位)上,我按如下方式安排测试:

FEATURE_BROWSER_EMULATION:

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]
"iexplore.exe"=dword:000022b8

dword:000022b8相当于小数值8888,如the MSDN article中所述)

DOCTYPE:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

(几乎标准的)

X-UA META:

<meta http-equiv="X-UA-Compatible" content="IE=9,chrome=IE8">

我假设IE10会忽略元标记的chrome=IE8部分,但为了完整性,我将其包含在此处。也可能有必要提一下,DOCTYPE是html文件中的第一个条目,而X-UA元标记是head标记内的第一个元素。

通过此设置,我使用Silverlight应用程序查找ProductVersion和BrowserVersion的值。结果分别为9.0和5.0。通过删除三个不同组合来执行此测试的各种其他排列,当存在X-UA元标记时,PV:9.0 / BV:5.0,PV:8.0 / BV:4.0,当x-UA被删除但注册表项存在时。仅存在DOCTYPE时,ProductVersion为10.0,BrowserVersion为5.0。

这些结果对我来说似乎是合理的,假设覆盖注册表项的X-UA元标记是预期的行为。我没有理由不这么认为。

现在,如果我切换到.net网络浏览器控件中托管Silverlight应用程序,我会看到非常不同的结果。

对于这一系列测试,我需要稍微调整注册表项,如下所示:

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]
"iexplore.exe"=dword:000022b8
"foo.exe"=dword:000022b8

其中foo.exe是包含Web浏览器控件的简单WPF应用程序的名称。

通过这个修改后的设置,结果是PV:7.0 / BV:4.0,当注册表项不存在时,PV:10.0 / BV:5.0。这似乎与X-UA元标记的任何更改无关,并且似乎完全忽略了注册表项的实际值。

所以,总结一下我的问题:

  1. 还有其他影响渲染的东西我不知道吗?(特别是在网页浏览器控件中)
  2. 网络浏览器控件报告的版本号是怎么回事?
  3. 版本号实际上是否表示正在使用渲染引擎?(根据我的观察,当PV报告10.0时,似乎Web浏览器控件在IE10模式下渲染)
  4. 最后,这个设置可能看起来有点奇怪。我可以通过更简单的方法(例如,没有SL)轻松地执行相同的测试。不用说,这个问题比我在这里描述的更多。希望我删除的细节实际上与我所看到的奇怪的网络浏览器控制行为无关。

1 个答案:

答案 0 :(得分:2)

  1. 在应用程序中托管WebBrowser ActiveX控件时,默认为IE7 doc模式以实现兼容性。当IE8发布时,托管该控件的大多数应用程序都期望IE7行为,并且如果切换到IE8 doc模式则会中断。如您所述,您可以使用注册表设置更改此默认值。

  2. 我不是Silverlight的专家,但我认为ProductVersion来自UA字符串的Mozilla / x.x部分。 IE使用Mozilla / 5.0进行所有最新版本。鉴于the values we needed to set in IE for interop今天的网络内容,依赖于ProductVersion和BrowserVersion可能不是一个好主意。 document.documentMode会更可靠地告诉您文档模式。

  3. 我不确定PV会为IE11报告什么 - 可能不是11. document.documentMode可能更好但是需要你从DOM中检索它。