Files
desktop/src/zen/common/modules/ZenCommonUtils.mjs

158 lines
4.0 KiB
JavaScript

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
window.gZenOperatingSystemCommonUtils = {
kZenOSToSmallName: {
WINNT: "windows",
Darwin: "macos",
Linux: "linux",
},
get currentOperatingSystem() {
let os = Services.appinfo.OS;
return this.kZenOSToSmallName[os];
},
};
export class nsZenMultiWindowFeature {
constructor() {}
static get browsers() {
return Services.wm.getEnumerator("navigator:browser");
}
static get currentBrowser() {
return Services.wm.getMostRecentWindow("navigator:browser");
}
static get isActiveWindow() {
return nsZenMultiWindowFeature.currentBrowser === window;
}
windowIsActive(browser) {
return browser === nsZenMultiWindowFeature.currentBrowser;
}
async foreachWindowAsActive(callback) {
if (!nsZenMultiWindowFeature.isActiveWindow) {
return;
}
await this.forEachWindow(callback);
}
async forEachWindow(callback) {
for (const browser of nsZenMultiWindowFeature.browsers) {
try {
if (browser.closed) {
continue;
}
await callback(browser);
} catch (e) {
console.error(e);
}
}
}
forEachWindowSync(callback) {
for (const browser of nsZenMultiWindowFeature.browsers) {
try {
if (browser.closed) {
continue;
}
callback(browser);
} catch (e) {
console.error(e);
}
}
}
}
export class nsZenDOMOperatedFeature {
constructor() {
var initBound = this.init.bind(this);
document.addEventListener("DOMContentLoaded", initBound, { once: true });
}
}
export class nsZenPreloadedFeature {
constructor() {
var initBound = this.init.bind(this);
document.addEventListener("MozBeforeInitialXULLayout", initBound, {
once: true,
});
}
}
window.gZenCommonActions = {
copyCurrentURLToClipboard() {
const [currentUrl, ClipboardHelper] = gURLBar.zenStrippedURI;
const displaySpec = currentUrl.displaySpec;
ClipboardHelper.copyString(displaySpec);
let button;
/* eslint-disable mozilla/valid-services */
if (Services.zen.canShare() && displaySpec.startsWith("http")) {
button = {
id: "zen-copy-current-url-button",
command: event => {
const buttonRect = event.target.getBoundingClientRect();
/* eslint-disable mozilla/valid-services */
Services.zen.share(
currentUrl,
"",
"",
buttonRect.left,
window.innerHeight - buttonRect.bottom,
buttonRect.width,
buttonRect.height
);
},
};
}
gZenUIManager.showToast("zen-copy-current-url-confirmation", {
button,
timeout: 3000,
});
},
copyCurrentURLAsMarkdownToClipboard() {
const [currentUrl, ClipboardHelper] = gURLBar.zenStrippedURI;
const tabTitle = gBrowser.selectedTab.label;
const markdownLink = `[${tabTitle}](${currentUrl.displaySpec})`;
ClipboardHelper.copyString(markdownLink);
gZenUIManager.showToast("zen-copy-current-url-as-markdown-confirmation", {
timeout: 3000,
});
},
throttle(f, delay) {
let timer = 0;
return function (...args) {
clearTimeout(timer);
timer = setTimeout(() => f.apply(this, args), delay);
};
},
/**
* Determines if a tab should be closed when navigating back with no history.
* Only tabs with an owner that are not pinned and not empty are eligible.
* Respects the user preference zen.tabs.close-on-back-with-no-history.
*
* @returns {boolean} True if the tab should be closed on back
*/
shouldCloseTabOnBack() {
if (
!Services.prefs.getBoolPref(
"zen.tabs.close-on-back-with-no-history",
true
)
) {
return false;
}
const tab = gBrowser.selectedTab;
return Boolean(
tab.owner && !tab.pinned && !tab.hasAttribute("zen-empty-tab")
);
},
};