您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add a copy button to copy the gerrit link querying CR
当前为
// ==UserScript== // @name Copy gerrit CR query link // @namespace http://tampermonkey.net/ // @version 0.1 // @description Add a copy button to copy the gerrit link querying CR // @author Jackie // @match https://gerrit.mot.com* // @icon https://www.google.com/s2/favicons?sz=64&domain=mot.com // @run-at document-end // @grant GM.addStyle // ==/UserScript== (function() { 'use strict'; let action = ()=>{ sleep(100).then(()=>{ addButtons(); }); } //action(); sleep(200).then(()=>{ let c = document.getElementById("gerrit_header"); observeDOM(c, /*onAdd*/ action, /*onRemove*/ action); }); })(); function addButtons() { console.log(`=======================addButtons`) let btnCopyCrQueryLink = createButton("CopyQueryLink"); btnCopyCrQueryLink.onclick = () => { let msg = "CR not found!" let crDiv = document.getElementsByClassName("com-google-gerrit-client-change-CommitBox_BinderImpl_GenCss_style-text")[0]; if(crDiv && crDiv.firstElementChild){ msg = "https://gerrit.mot.com/#/q/" + crDiv.firstElementChild.text; } navigator.clipboard.writeText(msg); showSnackbar(msg); } let parent = document.getElementsByClassName("com-google-gerrit-client-change-ChangeScreen_BinderImpl_GenCss_style-infoLineHeaderButtons")[0]; if(parent) { parent.appendChild(btnCopyCrQueryLink); } } function showSnackbar(msg) { let snackbar = getSnackbar(); snackbar.className = "show"; setTimeout(function(){ snackbar.className = snackbar.className.replace("show", ""); }, 1500); } function getSnackbar() { let snackbar = document.getElementById('snackbar'); if(!snackbar) { snackbar = document.createElement("div"); snackbar.id="snackbar"; snackbar.innerHTML="Copied succesfully" document.getElementsByClassName('screen')[0].appendChild(snackbar); GM.addStyle(` #snackbar { visibility: hidden; min-width: 250px; margin-left: -125px; background-color: #333; color: #fff; text-align: center; border-radius: 2px; padding: 16px; position: fixed; z-index: 1; left: 50%; top: 50px; font-size: 17px; } #snackbar.show { visibility: visible; -webkit-animation: fadein 0.5s, fadeout 0.5s 2.5s; animation: fadein 0.5s, fadeout 0.5s 2.5s; } @-webkit-keyframes fadein { from {top: 0; opacity: 0;} to {top: 50px; opacity: 1;} } @keyframes fadein { from {top: 0; opacity: 0;} to {top: 50px; opacity: 1;} } @-webkit-keyframes fadeout { from {top: 50px; opacity: 1;} to {top: 0; opacity: 0;} } @keyframes fadeout { from {top: 50px; opacity: 1;} to {top: 0; opacity: 0;} } `); } return snackbar; } function createButton(text) { let button = createElement( { name:"button", class:"com-google-gerrit-client-change-ChangeScreen_BinderImpl_GenCss_style-highlight", } ); button.type = "button"; button.title = text; let div = document.createElement('div'); div.innerHTML=text; button.appendChild(div); return button; } function createElement(info) { if(!info.name) return undefined; let element = document.createElement(info.name); if(info.innerHTML) element.innerHTML = info.innerHTML; if(info.class) { /*if(info.class.__proto__ == String.prototype) { element.classList.add(info.class); } else { for (let cls of info.class) { element.classList.add(cls); } }*/ element.classList.add(info.class); } return element; } function sleep (time) { return new Promise((resolve) => setTimeout(resolve, time)); } const observeDOM = (function () { let MutationObserver = window.MutationObserver || window.WebKitMutationObserver; let eventListenerSupported = window.addEventListener; return function (obj, onAddCallback, onRemoveCallback) { if (MutationObserver) { // define a new observer let mutationObserver = new MutationObserver(function (mutations, observer) { if (mutations[0].addedNodes.length && onAddCallback != undefined) { onAddCallback(); } }); // have the observer observe foo for changes in children mutationObserver.observe(obj, { attributes: true, childList: true, subtree: true }); } else if (eventListenerSupported) { obj.addEventListener('DOMNodeInserted', onAddCallback, false); } }; })();