您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Colorize bug list based on status
当前为
- // ==UserScript==
- // @name crbug colorize
- // @description Colorize bug list based on status
- // @match https://bugs.chromium.org/*
- // @version 1.0.3
- // @author wOxxOm
- // @namespace wOxxOm.scripts
- // @license MIT License
- // @run-at document-start
- // @grant none
- // ==/UserScript==
- const sheet = new CSSStyleSheet();
- sheet.replaceSync(`
- .wOxxOm-Starred { font-weight: bold }
- .wOxxOm-Archived { color: gray }
- .wOxxOm-Assigned { color: #3f71b1 }
- .wOxxOm-Available { color: #92479a }
- .wOxxOm-Duplicate,
- .wOxxOm-Invalid { opacity: 0.3 }
- .wOxxOm-ExternalDependency { color: #ababab }
- .wOxxOm-Fixed { color: #227700 }
- .wOxxOm-Started,
- .wOxxOm-FixPending { color: #06908b }
- .wOxxOm-Unconfirmed,
- .wOxxOm-New { color: black }
- .wOxxOm-Untriaged { color: #947911 }
- .wOxxOm-Verified, .wOxxOm-Accepted { color: #6a846f }
- .wOxxOm-WontFix { color: #d00 }
- tr[class*="wOxxOm-"] td[width="100%"] a {
- color: inherit;
- text-decoration: underline;
- }
- `);
- (async () => {
- const app = await added('mr-app');
- const main = await added('main', app);
- while (true) await colorize(main);
- })();
- async function colorize(main) {
- const page = await added('mr-list-page', main);
- const list = await shadowOf(await added('mr-issue-list', page));
- const sheets = list.adoptedStyleSheets;
- if (!sheets.includes(sheet))
- list.adoptedStyleSheets = [...sheets, sheet];
- for (const el of list.querySelectorAll('td')) {
- const text = el.textContent.trim();
- switch (text) {
- case '':
- continue;
- case 'Accepted':
- case 'Archived':
- case 'Assigned':
- case 'Available':
- case 'Duplicate':
- case 'ExternalDependency':
- case 'FixPending':
- case 'Fixed':
- case 'Invalid':
- case 'New':
- case 'Started':
- case 'Unconfirmed':
- case 'Untriaged':
- case 'Verified':
- case 'WontFix':
- el.parentNode.classList.add('wOxxOm-' + text);
- continue;
- case '★':
- el.parentNode.classList.add('wOxxOm-Starred');
- continue;
- }
- if (el.align === 'right' && (text === '1' || text === '0')) {
- el.textContent = '';
- }
- if (/% regression in|\b\d(\.\d)?%(-\d(\.\d)?%)? improvement in|test.*?is flaky|^(Android|Chrome)$/.test(text) && el.parentNode) {
- el.parentNode.remove();
- }
- }
- await removed(page);
- }
- async function added(sel, parent = document.documentElement) {
- const target =
- parent.shadowRoot ||
- !parent.localName.includes('-') && parent ||
- await shadowOf(parent);
- return target.querySelector(sel) || new Promise(resolve => {
- const mo = new MutationObserver(() => {
- const el = target.querySelector(sel);
- if (el) {
- mo.disconnect();
- resolve(el);
- }
- });
- mo.observe(target, {childList: true, subtree: true});
- });
- }
- function removed(el) {
- const root = el.getRootNode();
- return root.contains(el) && new Promise(resolve => {
- const mo = new MutationObserver(() => {
- if (!root.contains(el)) {
- mo.disconnect();
- resolve();
- }
- });
- mo.observe(root, {childList: true, subtree: true});
- });
- }
- function shadowOf(el) {
- return el.shadowRoot || new Promise(resolve => {
- el.attachShadow = function (...args) {
- delete el.attachShadow;
- const root = el.attachShadow(...args);
- resolve(root);
- return root;
- };
- });
- }