|
| 1 | +// ==UserScript== |
| 2 | +// @name GM_registerMenuCommand Example |
| 3 | +// @namespace http://tampermonkey.net/ |
| 4 | +// @version 1.0 |
| 5 | +// @description Simple demo for GM_registerMenuCommand |
| 6 | +// @match *://*/* |
| 7 | +// @grant GM_registerMenuCommand |
| 8 | +// @grant GM_unregisterMenuCommand |
| 9 | +// ==/UserScript== |
| 10 | + |
| 11 | +(async function () { |
| 12 | + 'use strict'; |
| 13 | + |
| 14 | + const checkSubFrameIdSequence = false; |
| 15 | + |
| 16 | + const intervalChanging = false; |
| 17 | + |
| 18 | + const skipClickCheck = false; |
| 19 | + |
| 20 | + let myResolve = () => { }; |
| 21 | + const waitNext = async () => { |
| 22 | + await new Promise((resolve) => { |
| 23 | + myResolve = () => { setTimeout(resolve, 50) }; |
| 24 | + }); |
| 25 | + }; |
| 26 | + |
| 27 | + const waitActions = async (...messages) => { |
| 28 | + if (skipClickCheck) return; |
| 29 | + messages = messages.flat(); |
| 30 | + for (const message of messages) { |
| 31 | + console.log(message); |
| 32 | + await waitNext(); |
| 33 | + } |
| 34 | + }; |
| 35 | + |
| 36 | + const isInSubFrame = () => { |
| 37 | + |
| 38 | + try { |
| 39 | + return window.top !== window; |
| 40 | + } catch { |
| 41 | + return true; |
| 42 | + } |
| 43 | + } |
| 44 | + |
| 45 | + if (intervalChanging) { |
| 46 | + // TM: 在打开菜单时,显示会不断改变 |
| 47 | + let i = 1000; |
| 48 | + let p = 0; |
| 49 | + setInterval(() => { |
| 50 | + if (p) GM_unregisterMenuCommand(p); |
| 51 | + i++; |
| 52 | + GM_registerMenuCommand(`interval-m-${i}`, () => { console.log(`${i}`); }, {id: "m"}); |
| 53 | + p = GM_registerMenuCommand(`interval-n-${i}`, () => { console.log(`${i}`); }); |
| 54 | + }, 1000); |
| 55 | + // return; |
| 56 | + } |
| 57 | + if (checkSubFrameIdSequence) { |
| 58 | + const key = Math.floor(Math.random() * 99999 + 99999).toString(); |
| 59 | + |
| 60 | + let arr = []; |
| 61 | + arr.push( |
| 62 | + GM_registerMenuCommand("test", () => { console.log(`${key}-1`); }), |
| 63 | + GM_registerMenuCommand("test", () => { console.log(`${key}-2`); }), |
| 64 | + GM_registerMenuCommand("test", () => { console.log(`${key}-3`); }) |
| 65 | + ); |
| 66 | + if (isInSubFrame()) { |
| 67 | + arr.push(GM_registerMenuCommand("test-sub", () => { console.log(`${key}-sub`); })); |
| 68 | + } else { |
| 69 | + arr.push(GM_registerMenuCommand("test-main", () => { console.log(`${key}-main`); })); |
| 70 | + } |
| 71 | + arr.push(GM_registerMenuCommand(`test-${location.origin}`, () => { console.log(`${key}-origin`); })); |
| 72 | + console.log(`checkSubFrameIdSequence (key=${key}, frame=${isInSubFrame()})`, arr.join("...")); |
| 73 | + // return; |
| 74 | + } |
| 75 | + |
| 76 | + let obj1 = { id: "abc" }; |
| 77 | + |
| 78 | + const r01 = GM_registerMenuCommand("MenuReg abc-1", () => { |
| 79 | + |
| 80 | + console.log("abc-1"); |
| 81 | + myResolve(); |
| 82 | + }, obj1); |
| 83 | + |
| 84 | + const r02 = GM_registerMenuCommand("MenuReg abc-2", () => { |
| 85 | + |
| 86 | + console.log("abc-2"); |
| 87 | + myResolve(); |
| 88 | + }, obj1); |
| 89 | + |
| 90 | + console.log("abc-1 id === abc", r01 === "abc"); |
| 91 | + console.log("abc-2 id === abc", r02 === "abc"); |
| 92 | + |
| 93 | + // there shall be only "MenuReg abc-2" in the menu. |
| 94 | + await waitActions("There shall be only 'MenuReg abc-2'. Click it to continue."); |
| 95 | + |
| 96 | + GM_registerMenuCommand("MenuReg abc-1", () => { |
| 97 | + |
| 98 | + console.log("abc-1.abd"); |
| 99 | + myResolve(); |
| 100 | + }, { id: "abd" }); |
| 101 | + |
| 102 | + GM_registerMenuCommand("MenuReg abc-2", () => { |
| 103 | + |
| 104 | + console.log("abc-2.abe"); |
| 105 | + myResolve(); |
| 106 | + }, { id: "abe" }); |
| 107 | + |
| 108 | + |
| 109 | + // there shall be only "MenuReg abc-1" and "MenuReg abc-2" in the menu. |
| 110 | + await waitActions("There shall be 'MenuReg abc-2' and 'MenuReg abc-1'. Click either them to continue."); |
| 111 | + |
| 112 | + |
| 113 | + GM_registerMenuCommand("MenuReg abc-2", () => { |
| 114 | + |
| 115 | + console.log("abc-2.abf"); |
| 116 | + myResolve(); |
| 117 | + }, { id: "abf", accessKey: "h" }); |
| 118 | + |
| 119 | + // there shall be only "MenuReg abc-1" and "MenuReg abc-2" in the menu. |
| 120 | + await waitActions("There shall be 'MenuReg abc-2', 'MenuReg abc-1' and 'MenuReg abc-2 (H)'. Click either them to continue."); |
| 121 | + |
| 122 | + GM_unregisterMenuCommand("abc"); |
| 123 | + GM_unregisterMenuCommand("abd"); |
| 124 | + GM_unregisterMenuCommand("abe"); |
| 125 | + GM_unregisterMenuCommand("abf"); |
| 126 | + |
| 127 | + |
| 128 | + |
| 129 | + const p10 = GM_registerMenuCommand("MenuReg D-23", () => { |
| 130 | + |
| 131 | + console.log(110); |
| 132 | + myResolve(); |
| 133 | + }, "b"); |
| 134 | + |
| 135 | + |
| 136 | + const p20 = GM_registerMenuCommand("MenuReg D-23", () => { |
| 137 | + |
| 138 | + console.log(120); |
| 139 | + myResolve(); |
| 140 | + }, "b"); |
| 141 | + |
| 142 | + console.log("p10 === 1", p10 === 1); |
| 143 | + console.log("p20 === 2", p20 === 2); |
| 144 | + |
| 145 | + // MenuReg D-23 clicking shall give both 110 and 120 |
| 146 | + await waitActions("Click [MenuReg D-23] -> 110, 120"); |
| 147 | + |
| 148 | + |
| 149 | + const p30 = GM_registerMenuCommand("MenuReg D-26", () => { |
| 150 | + |
| 151 | + console.log(130); |
| 152 | + myResolve(); |
| 153 | + }, { id: "2" }); |
| 154 | + console.log("p30 === '2'", p30 === "2"); |
| 155 | + |
| 156 | + // MenuReg D-23 clicking shall give 110 |
| 157 | + // MenuReg D-26 clicking shall give 130 |
| 158 | + |
| 159 | + await waitActions("Click [MenuReg D-23] -> 110", "Click [MenuReg D-26] -> 130"); |
| 160 | + |
| 161 | + |
| 162 | + const p32 = GM_registerMenuCommand("MenuReg D-26", () => { |
| 163 | + |
| 164 | + console.log(210); |
| 165 | + myResolve(); |
| 166 | + }, { id: 2 }); |
| 167 | + console.log("p32 === 2", p32 === 2); |
| 168 | + |
| 169 | + // MenuReg D-23 clicking shall give 110 |
| 170 | + // MenuReg D-26 clicking shall give 210 |
| 171 | + |
| 172 | + await waitActions("Click [MenuReg D-23] -> 110", "Click [MenuReg D-26] -> 210"); |
| 173 | + |
| 174 | + |
| 175 | + const p33 = GM_registerMenuCommand("MenuReg D-26", () => { |
| 176 | + |
| 177 | + console.log(220); |
| 178 | + myResolve(); |
| 179 | + }, { id: 3 }); |
| 180 | + console.log("p33 === 3", p33 === 3); |
| 181 | + |
| 182 | + // MenuReg D-23 clicking shall give 110 |
| 183 | + // MenuReg D-26 clicking shall give 210 220 |
| 184 | + |
| 185 | + await waitActions("Click [MenuReg D-23] -> 110", "Click [MenuReg D-26] -> 210, 220"); |
| 186 | + |
| 187 | + |
| 188 | + |
| 189 | + const p34 = GM_registerMenuCommand("MenuReg D-26", () => { |
| 190 | + |
| 191 | + console.log(230); |
| 192 | + myResolve(); |
| 193 | + }, { id: "4" }); |
| 194 | + console.log("p34 === '4'", p34 === "4"); |
| 195 | + |
| 196 | + // MenuReg D-23 clicking shall give 110 |
| 197 | + // MenuReg D-26 clicking shall give 210 220 230 |
| 198 | + await waitActions("Click [MenuReg D-23] -> 110", "Click [MenuReg D-26] -> 210, 220, 230"); |
| 199 | + |
| 200 | + GM_unregisterMenuCommand("4"); |
| 201 | + |
| 202 | + |
| 203 | + // MenuReg D-23 clicking shall give 110 |
| 204 | + // MenuReg D-26 clicking shall give 210 220 |
| 205 | + await waitActions("Click [MenuReg D-23] -> 110", "Click [MenuReg D-26] -> 210, 220"); |
| 206 | + |
| 207 | + |
| 208 | + |
| 209 | + const p40 = GM_registerMenuCommand("MenuReg D-40", () => { |
| 210 | + |
| 211 | + console.log(601); |
| 212 | + }); |
| 213 | + |
| 214 | + const p50 = GM_registerMenuCommand("MenuReg D-50", () => { |
| 215 | + |
| 216 | + console.log(602); |
| 217 | + }); |
| 218 | + console.log("p40, p50", [p40, p50]); // TM gives 3&4 |
| 219 | + |
| 220 | + |
| 221 | + |
| 222 | +})().finally(() => { |
| 223 | + console.log("finish"); |
| 224 | +}); |
| 225 | + |
0 commit comments