-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathapi.js
More file actions
70 lines (59 loc) · 2.19 KB
/
api.js
File metadata and controls
70 lines (59 loc) · 2.19 KB
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
// api.js: browser compatibility shim
// Copyright (C) 2025 Selene ToyKeeper
// SPDX-License-Identifier: AGPL-3.0-or-later
"use strict";
// browser (Firefox) vs chrome (Chromium)
export let isFirefox = (typeof browser !== 'undefined')
&& (!! browser?.runtime?.getBrowserInfo);
// if not Firefox, it's some flavor of Chromium
export let isChrome = (! isFirefox);
// MS Edge
export let isEdge = / Edg\//.test(navigator.userAgent);
if (navigator.userAgentData?.brands) {
isEdge = navigator.userAgentData.brands
.some(b => b.brand === "Microsoft Edge");
}
// Brave
// Brave sets userAgentData.brands too, but this is easier
export const isBrave = (typeof navigator.brave !== 'undefined');
// Vivaldi ... is hard to detect
export const isVivaldi = isChrome
&& (0 === navigator?.userAgentData?.brands?.length);
// Maxthon
export const isMaxthon = (typeof maxthon !== 'undefined');
// Zen Browser ... sigh. This is a dirty kludge.
// https://github.com/zen-browser/desktop/issues/12198
// (can't be identified at import time without causing other problems,
// so it spins off a separate execution context to lazy-detect it,
// and results won't be available at boot time)
export let isZenBrowser = false; // false, true, 'waiting', or 'maybe'
if (isFirefox) {
isZenBrowser = 'waiting'; // waiting on browser to respond
(async () => {
try {
const info = await browser.runtime.getBrowserInfo();
// Zen 1.18.4? and above
if (info?.zen) isZenBrowser = true;
// Firefox newer than Zen 1.18.3b
else if (info?.version > '147.0.2') isZenBrowser = false;
// otherwise, Zen 1.18.3 and below, can't fkn tell
else isZenBrowser = 'maybe';
console.log(`isZenBrowser => ${isZenBrowser}`);
} catch { isZenBrowser = false; }
})();
}
if (isEdge || isBrave || isMaxthon || isVivaldi) {
isFirefox = false; isChrome = true;
}
// select a base symbol for all browser API calls
export const api = isFirefox ? browser : chrome;
// show browser type at boot time
console.log('Browser type:'
+ ` Firefox(${isFirefox})`
+ ` Chrome(${isChrome})`
+ ` Edge(${isEdge})`
+ ` Brave(${isBrave})`
+ ` Vivaldi(${isVivaldi})`
+ ` Maxthon(${isMaxthon})`
+ ` Zen(${isZenBrowser})`
);