Greasy Fork

Greasy Fork is available in English.

Faviconize Startpage.com

Replaces Anonymous view with duckduckgo.com icons

当前为 2024-03-10 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Faviconize Startpage.com
// @namespace    http://tampermonkey.net/
// @version      2024-03-10
// @description  Replaces Anonymous view with duckduckgo.com icons
// @author       Retro
// @include      /https?:\/\/(www\.|[a-z0-9-]*\.)?startpage\.com\/.*/
// @icon         https://icons.duckduckgo.com/ip3/startpage.com.ico
// @grant        GM_xmlhttpRequest
// @license MIT
// ==/UserScript==

async function asyncRequest(options) {
    return new Promise((res, rej) => {
        options.onload = res
        options.onabort = rej
        options.onerror = rej
        options.ontimeout = rej
        GM_xmlhttpRequest(options)
    })
}

async function asyncReadAsDataURL(blob) {
    return new Promise((res, rej) => {
        const reader = new FileReader()
        reader.onload = () => res(reader.result)
        reader.onerror = rej
        reader.readAsDataURL(blob)
    })
}

function getElementsFromList(root, list) {
    return list.reduce((r, v) => r.concat(Array.from(root.getElementsByClassName(v))), [])
}

// Replace anonymous view with favicons
async function injectFavicon(container, favicon_url) {
    let res = await asyncRequest({
        method: "GET",
        url: favicon_url,
        anonymous: true,
        responseType: "blob",
    })

    let favicon = document.createElement("img")
    favicon.src = await asyncReadAsDataURL(res.response)
    favicon.loading = "lazy"
    favicon.width = 16
    favicon.height = 16
    favicon.style.marginRight = "0.5em"

    let upper = getElementsFromList(container, ["upper", "w-gl__result-url-container"])[0]
    upper.children[0].remove() // remove anonymous view button
    upper.prepend(favicon) // prepend our favicon :)
}

const FAVICON_URL = "https://icons.duckduckgo.com/ip3/?.ico"
let urls = getElementsFromList(document, ["result", "w-gl__result__main"])

for (const container of urls) {
    let link = container.getElementsByClassName("result-link")[0].href
    let host = new URL(link).host

    injectFavicon(container, FAVICON_URL.replace("?", host))
}