Chromium Embedded Framework图标

时间:2013-01-14 21:35:01

标签: delphi delphi-xe2 chromium favicon chromium-embedded

如何使用Chromium Embedded Framework获取favicon网站?我可以查看源代码并获取图标的URL,但有些网站(如Facebook)不使用标准程序添加图标,那么,我如何获得图标?感谢。

4 个答案:

答案 0 :(得分:4)

favicon的规则都在Wikipedia页面上解释。

  

标准在文档的<head>部分使用带有rel属性的link元素来指定文件格式,文件名和可以为任何网站目录指定位置。

您需要在<head>元素中查看此表单的link元素:

<link rel="shortcut icon" href="http://example.com/myicon.ico" />

<link rel="icon" type="image/vnd.microsoft.icon"
    href="http://example.com/image.ico" />

如果您没有找到此类链接,请使用在根目录中查找favicon.ico的后退。


我不确定为什么你认为Facebook不遵守标准。我只是看了一个包含这个的FB页面:

<link rel="shortcut icon" 
    href="http://static.ak.fbcdn.net/rsrc.php/yP/r/Ivn-CVe5TGK.ico" />

网站不可能使用其他机制来获取浏览器的优惠。浏览器遵循明确定义的获取favicon的规则。如果网站做了不同的事情,浏览器将找不到图标。

答案 1 :(得分:3)

从这个blog entry开始,跨浏览器支持的favicons的最佳做法是包括

<link rel="icon" type="image/vnd.microsoft.icon" href="http://www.example.com/image.ico"> <!-- For good browsers. -->
<link rel="SHORTCUT ICON" href="http://www.example.com/image.ico"/> <!-- For Internet Explorer-->

第一个链接适用于真正的浏览器,第二个链接适用于垃圾。在某些网站上,您会在type="image/x-icon"标记中看到link。曾经有一段时间这是正确的实现,但image/x-icon现已被image/vnd.microsoft.icon取代,现在已成为MIME类型的IANA标准的一部分。

顺便说一句,旧版本的ie只是寻找一个硬编码的文件名/favicon.ico。如果您想要超级安全,则应将您的favicon命名为favicon.ico。当然,如果您的域名为不同目的托管多个网站,这对您没有帮助。

注意:如果您不需要支持IE的favicon,那么您可以自由地为您的favicon使用png,gif和jpg格式,如下所示......

<link rel="icon" type="image/png" href="http://www.example.com/image.png">
<link rel="icon" type="image/gif" href="http://www.example.com/image.gif">
<link rel="icon" type="image/jpeg" href="http://www.example.com/image.jpg">

答案 2 :(得分:1)

CEF1有一个名为OnFaviconURLChange的回调,只要页面的favicon URL发生变化,就会调用该回调。根据CEF问题跟踪器中的this bug,CEF3还不支持此回调。

答案 3 :(得分:0)

您需要实现客户端处理程序和至少CefDisplayHandler。这个类有OnFaviconURLChange(不确定在哪个版本中出现,但肯定存在于分支2357及更高版本中)。 C ++原型是:

void OnFaviconURLChange(CefRefPtr<CefBrowser> browser, 
  const std::vector<CefString>& icon_urls);

icon_urls通常包含一个条目(如果有),这是favicon的URL。

考虑还检查favicon URL的安全性,我将URL传递给HTMLayout应用程序,仅发现自签名的https://资源,并且各种wininet安全错误(例如InternetErrorDlg)开始抛出所有地方