// ==UserScript== // @name Opens “Tools” Menu by Default on Google // @name:zh-TW 預設開啟 Google 的「工具」選單 // @name:zh-CN 预设开启 Google 的“工具”选单 // @description Opens the “Tools” menu on Google Search automatically when page loaded. // @description:zh-TW 在 Google 搜尋載入後自動打開「工具」選單。 // @description:zh-CN 在 Google 搜索载入后自动打开“工具”选单。 // @icon https://wsrv.nl/?url=https://www.google.com/images/branding/googleg/1x/googleg_standard_color_128dp.png // @author Jason Kwok // @namespace https://jasonhk.dev/ // @version 1.1.4 // @license MIT // @match https://www.google.com/search // @match https://www.google.com/search?* // @run-at document-end // @grant none // @supportURL https://greasyfork.org/scripts/460247/feedback // @downloadURL none // ==/UserScript== const TOOLS_BUTTON_ATTRIBUTES = [ ["aria-controls", "hdtbMenus"], ["jsname", "I4bIT"], ["jscontroller", "LbcJwc"], ]; const TOOLS_BUTTON_SELECTOR = TOOLS_BUTTON_ATTRIBUTES.map(([name, value]) => `[${name}=${value}]`).join(","); function handleToolsButton(button) { console.debug("“Tools” button found, activating the “Tools” menu..."); clearTimeout(observerTimeout); observer.disconnect(); const interval = setInterval(() => { if (button.getAttribute("aria-expanded") === "true") { console.debug("“Tools” menu activated, congration!"); clearTimeout(activateTimeout); clearInterval(interval); } else { button.click(); } }, 250); const activateTimeout = setTimeout(() => { console.debug("“Tools” menu not opened, aborting..."); clearInterval(interval); }, 120000); } const observer = new MutationObserver((records) => { for (const record of records) { for (const node of record.addedNodes) { if (node instanceof Element) { if (TOOLS_BUTTON_ATTRIBUTES.some(([name, value]) => (node.getAttribute(name) === value))) { handleToolsButton(node); } else { const button = node.querySelector(TOOLS_BUTTON_SELECTOR); if (button) { handleToolsButton(button); } } } } } }); observer.observe(document.body, { subtree: true, childList: true }); const observerTimeout = setTimeout(() => { console.debug("“Tools” button still not exist, aborting..."); observer.disconnect(); }, 120000); const button = document.querySelector(TOOLS_BUTTON_SELECTOR); if (button) { handleToolsButton(button); } else { console.debug("“Tools” button not exist, attempting the MutationObserver method..."); }