Reliably getting favicons in Chrome extensions, chrome://favicon?
favicon, google-chrome-extension, permissions
Solution
There is now the official documentation for Favicon Permission - Fetching favicons.
Add `favicon` to your permission
{
"name": "Favicon API in a popup",
"manifest_version": 3,
...
"permissions": ["favicon"],
...
}
Access the favicon URL
For my simple case:
const favIconUrl = `chrome-extension://${chrome.runtime.id}/_favicon/?pageUrl=${encodeURIComponent(url)}&size=32`;
From their example:
function faviconURL(u) {
const url = new URL(chrome.runtime.getURL("/_favicon/"));
url.searchParams.set("pageUrl", u);
url.searchParams.set("size", "32");
return url.toString();
}
const img = document.createElement('img');
img.src = faviconURL("https://www.google.com")
document.body.appendChild(img);
This also works on Chromium Edge, it automatically transform `chrome-extension://` into `extension://`
Note: when fetching favicons in content scripts, the "_favicon/*" folder must be declared as a web accessible resource. For example:
"web_accessible_resources": [
{
"resources": ["_favicon/*"],
"matches": ["<all_urls>"],
"extension_ids": ["*"]
}
]
Problem
I'm using the `chrome://favicon/` in my Google Chrome extension to get the favicon for RSS feeds. What I do is get the base path of linked page, and append it to `chrome://favicon/http://<domainpath>`. It's working really unreliably. A lot of the time it's reporting the standard "no-favicon"-icon, even when the page really has a favicon. There is almost 0 documentation regarding the `chrome://favicon` mechanism, so it's difficult to understand how it actually works. Is it just a cache of links that have been visited? Is it possible to detect if there was an icon or not? From some simple testing it's just a cache of favicons for pages you have visited. So if I subscribe to dribbble.com's RSS feed, it won't show a favicon in my extension. Then if I visit `chrome://favicon/http://dribbble.com/` it won't return right icon. Then I open dribbble.com in another tab, it shows its icon in the tab, then when I reload the `chrome://favicon/http://dribbble.com/`-tab, it will return the correct favicon. Then I open my extensions popup and it still shows the standard icon. But if I then restart Chrome it will get the correct icon everywhere. Now that's just from some basic research, and doesn't get me any closer to a solution. So my question is: Is the `chrome://favicon/` a correct use-case for what I'm doing. Is there any documentation for it? And what is this its intended behavior?