Debian package: Declare compliance with Debian Policy 4.3.0
[conkeror.git] / modules / favicon.js
blobaae69cd8241d433a824bfeec604516a580b60d59
1 /**
2  * (C) Copyright 2008 Jeremy Maitin-Shepard
3  * (C) Copyright 2010 John J. Foerch
4  *
5  * Portions of this file were derived from Mozilla,
6  * (C) Copyright 1998-2008 Mozilla Foundation.
7  *
8  * Use, modification, and distribution are subject to the terms specified in the
9  * COPYING file.
10 **/
12 const favicon_service = Cc["@mozilla.org/browser/favicon-service;1"]
13     .getService(Ci.nsIFaviconService);
15 define_variable("favicon_image_max_size", 1024,
16     "Maximum (pixel) width and height of an image document that "+
17     "is considered for use as a favicon.");
21     let favicon_set_internal;
22     if (version_compare(get_mozilla_version(), "18.0") >= 0) {
23         favicon_set_internal = function (buffer, icon_url) {
24             favicon_service.setAndFetchFaviconForPage(
25                 buffer.current_uri, icon_url, false,
26                 favicon_service.FAVICON_LOAD_NON_PRIVATE,
27                 function() { }, buffer.document.nodePrincipal);
28         };
29     } else {
30         favicon_set_internal = function (buffer, icon_url) {
31             favicon_service.setAndLoadFaviconForPage(
32                 buffer.current_uri, icon_url, false);
33         };
34     }
35     var favicon_set = function favicon_set (buffer, icon_url) {
36         favicon_set_internal(buffer, icon_url);
37         buffer.icon = icon_url.spec;
38     }
42 function favicon_content_buffer_started_loading (buffer) {
43     buffer.icon = null;
47 function favicon_content_buffer_finished_loading (buffer) {
48     if (buffer.icon != null)
49         return;
51     if (buffer.document instanceof Ci.nsIImageDocument) {
52         var req = buffer.document.imageRequest;
53         if (req && req.image &&
54             req.image.width <= favicon_image_max_size  &&
55             req.image.height <= favicon_image_max_size)
56         {
57             favicon_set(buffer, buffer.current_uri);
58             return;
59         }
60     }
62     var uri = buffer.current_uri;
63     // Only load favicons for http and https
64     if (!uri.schemeIs("http") && !uri.schemeIs("https"))
65         return;
67     var icon_url = make_uri(uri.prePath + "/favicon.ico");
68     if (!favicon_service.isFailedFavicon(icon_url))
69         favicon_set(buffer, icon_url);
73 function favicon_content_buffer_dom_link_added (buffer, event) {
74     var link = event.originalTarget;
75     if (!link || !link.ownerDocument || !link.rel || !link.href ||
76         link.ownerDocument != buffer.document)
77     {
78         return;
79     }
80     var rel = link.rel.toLowerCase();
81     var rel_strings = rel.split(/\s+/);
82     if (rel_strings.indexOf("icon") == -1)
83         return;
85     /* FIXME: perhaps worry about newURI throwing an exception */
86     var target_doc = link.ownerDocument;
87     var ios = Cc["@mozilla.org/network/io-service;1"]
88         .getService(Ci.nsIIOService);
89     var uri = ios.newURI(link.href, target_doc.characterSet, null);
91     if (favicon_service.isFailedFavicon(uri))
92         return;
94     // Verify that the load of this icon is legal.
95     // error pages can load their favicon, to be on the safe side,
96     // only allow chrome:// favicons
97     const about_neterr = "about:neterror?";
98     if (target_doc.documentURI.substr(0, about_neterr.length) != about_neterr
99         || !uri.schemeIs("chrome"))
100     {
101         var ssm = Cc["@mozilla.org/scriptsecuritymanager;1"]
102             .getService(Ci.nsIScriptSecurityManager);
103         try {
104             ssm.checkLoadURIWithPrincipal(
105                 target_doc.nodePrincipal, uri,
106                 Ci.nsIScriptSecurityManager.DISALLOW_SCRIPT);
107         } catch(e) {
108             return;
109         }
110     }
112     try {
113     } catch(e) {
114         return; // Refuse to load if we can't do a security check.
115     }
117     // Security says okay, now ask content policy
118     var content_policy_service = Cc["@mozilla.org/layout/content-policy;1"]
119         .getService(Ci.nsIContentPolicy);
120     if (content_policy_service.shouldLoad(Ci.nsIContentPolicy.TYPE_IMAGE,
121                                           uri, target_doc.documentURIObject,
122                                           link, link.type, null)
123         != Ci.nsIContentPolicy.ACCEPT)
124     {
125         return;
126     }
128     favicon_set(buffer, uri);
132 add_hook("content_buffer_started_loading_hook",
133          favicon_content_buffer_started_loading);
135 add_hook("content_buffer_finished_loading_hook",
136          favicon_content_buffer_finished_loading);
138 add_hook("content_buffer_dom_link_added_hook",
139          favicon_content_buffer_dom_link_added);
141 provide("favicon");