-
Notifications
You must be signed in to change notification settings - Fork 35
/
Copy pathAutoSaveScreenshot.uc.js
125 lines (121 loc) · 6.19 KB
/
AutoSaveScreenshot.uc.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// ==UserScript==
// @name AutoSaveScreenshot.uc.js
// @description 一键保存截图,左键单击保存可见范围,Shift+左键保存整个页面
// @namespace https://github.com/benzBrake/FirefoxCustomize
// @author Ryan, aborix
// @include main
// @license MIT License
// @compatibility Firefox 127
// @homepageURL https://github.com/benzBrake/FirefoxCustomize/tree/master/userChromeJS
// @downloadURL https://github.com/benzBrake/FirefoxCustomize/raw/master/127/AutoSaveScreenshot.uc.js
// @version 0.0.3
// @note 0.0.3 修复总是在第一个窗口截图的问题
// @note 0.0.2 修复在 127 版本的兼容问题
// ==/UserScript==
(async function () {
const Services = globalThis.Services || ChromeUtils.import("resource://gre/modules/Services.jsm").Services;
const CustomizableUI = globalThis.CustomizableUI || ChromeUtils.import("resource:///modules/CustomizableUI.jsm").CustomizableUI;
document.addEventListener('DOMContentLoaded', async (e) => {
const { location } = e.target;
if (location.href.startsWith("chrome://browser/content/screenshots/screenshots-preview.html?")) {
let preview_area = await new Promise(resolve => {
let count = 0;
let timer = setInterval(() => {
let area = e.target.documentElement.querySelector("screenshots-preview");
count++;
if (area) {
clearInterval(timer);
resolve(area);
}
if (count > 300) {
clearInterval(timer);
reject(null);
}
}, 10);
});
if (preview_area) {
let download_btn = await new Promise(resolve => {
let count = 0;
let timer = setInterval(() => {
let btn = preview_area.shadowRoot.querySelector("#download");
count++;
if (btn) {
clearInterval(timer);
resolve(btn);
}
if (count > 300) {
clearInterval(timer);
reject(null);
}
}, 10);
});
download_btn.click();
}
}
})
window.AutoSaveScreenshot = {
BTN_ID: "AutoSaveScreenshot-button",
init() {
if (!(CustomizableUI.getWidget(this.BTN_ID) && CustomizableUI.getWidget(this.BTN_ID).forWindow(window)?.node)) {
CustomizableUI.createWidget({
id: this.BTN_ID,
removable: true,
defaultArea: CustomizableUI.AREA_NAVBAR,
type: "custom",
onBuild: doc => this.createButton(doc)
});
}
},
createButton(doc) {
let btn = createElement(doc, 'toolbarbutton', {
id: this.BTN_ID,
label: "AutoSaveScreenshot",
'data-l10n-id': 'auto-save-screenshot',
class: 'toolbarbutton-1 chromeclass-toolbar-additional',
image: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJjb250ZXh0LWZpbGwiIGZpbGwtb3BhY2l0eT0iY29udGV4dC1maWxsLW9wYWNpdHkiIHRyYW5zZm9ybT0ic2NhbGUoMS4zKSI+PHBhdGggZD0iTTUgM0MzLjg5NSAzIDMgMy44OTUgMyA1TDUgNUw1IDMgeiBNIDcgM0w3IDVMOSA1TDkgM0w3IDMgeiBNIDExIDNMMTEgNUwxMyA1TDEzIDNMMTEgMyB6IE0gMTUgM0wxNSA1TDE3IDVMMTcgM0wxNSAzIHogTSAxOSAzTDE5IDVMMjEgNUMyMSAzLjg5NSAyMC4xMDUgMyAxOSAzIHogTSAzIDdMMyA5TDUgOUw1IDdMMyA3IHogTSAxOSA3TDE5IDlMMjEgOUwyMSA3TDE5IDcgeiBNIDEyIDlMMTAuNjY3OTY5IDExTDguNSAxMUM3LjY3MiAxMSA3IDExLjY3MiA3IDEyLjVMNyAxOS41QzcgMjAuMzI4IDcuNjcyIDIxIDguNSAyMUwxOS41IDIxQzIwLjMyOCAyMSAyMSAyMC4zMjggMjEgMTkuNUwyMSAxMi41QzIxIDExLjY3MiAyMC4zMjggMTEgMTkuNSAxMUwxNy4zMzIwMzEgMTFMMTYgOUwxMiA5IHogTSAzIDExTDMgMTNMNSAxM0w1IDExTDMgMTEgeiBNIDEzLjA3MDMxMiAxMUwxNC45Mjk2ODggMTFMMTUuNjY5OTIyIDEyLjEwOTM3NUwxNi4yNjM2NzIgMTNMMTcuMzMyMDMxIDEzTDE5IDEzTDE5IDE5TDkgMTlMOSAxM0wxMC42Njc5NjkgMTNMMTEuNzM2MzI4IDEzTDEyLjMzMDA3OCAxMi4xMDkzNzVMMTMuMDcwMzEyIDExIHogTSAxNCAxNCBBIDIgMiAwIDAgMCAxMiAxNiBBIDIgMiAwIDAgMCAxNCAxOCBBIDIgMiAwIDAgMCAxNiAxNiBBIDIgMiAwIDAgMCAxNCAxNCB6IE0gMyAxNUwzIDE3TDUgMTdMNSAxNUwzIDE1IHogTSAzIDE5QzMgMjAuMTA1IDMuODk1IDIxIDUgMjFMNSAxOUwzIDE5IHoiLz48L3N2Zz4=",
style: "fill: #3AADE2" // 修改为你喜欢的颜色
});
btn.addEventListener('click', this, false);
return btn;
},
handleEvent(event) {
if (event.button === 0) {
this.takeScreenshot(event.target.ownerDocument, event.shiftKey);
}
},
async takeScreenshot(doc, isFullPage) {
doc.getElementById('key_screenshot').doCommand();
let btn = await this.getScreenSortButton(doc, isFullPage);
btn.click();
},
async getScreenSortButton(doc, isFullPage) {
let screenshotsPagePanel = await new Promise(resolve => {
let interval = setInterval(() => {
let screenshotsPagePanel = doc.getElementById("screenshotsPagePanel");
if (screenshotsPagePanel) {
clearInterval(interval);
resolve(screenshotsPagePanel);
}
}, 10);
});
return screenshotsPagePanel.querySelector("screenshots-buttons").shadowRoot.querySelector(isFullPage ? "#full-page" : "#visible-page");
}
}
window.AutoSaveScreenshot.init();
/**
* 创建 DOM 元素
*
* @param {Document} d HTML 文档
* @param {string} t DOM 元素标签
* @param {Object} o DOM 元素属性键值对
* @returns
*/
function createElement(d, t, o = {}) {
if (!d) return;
let e = /^html:/.test(t) ? d.createElement(t) : d.createXULElement(t);
for (let [k, v] of Object.entries(o)) {
e.setAttribute(k, v);
}
return e;
}
})()