mirror of
https://github.com/SoPat712/Speeder.git
synced 2026-08-20 12:06:19 -04:00
160 lines
4.9 KiB
JavaScript
160 lines
4.9 KiB
JavaScript
(function(root, factory) {
|
|
var exports = factory();
|
|
|
|
if (typeof module === "object" && module.exports) {
|
|
module.exports = exports;
|
|
}
|
|
|
|
root.SpeederShared = root.SpeederShared || {};
|
|
root.SpeederShared.popupControls = exports;
|
|
})(typeof globalThis !== "undefined" ? globalThis : this, function() {
|
|
function normalizeExcludedIds(excludedIds) {
|
|
if (excludedIds instanceof Set) return excludedIds;
|
|
return new Set(Array.isArray(excludedIds) ? excludedIds : []);
|
|
}
|
|
|
|
function sanitizeButtonOrder(buttonIds, controllerButtonDefs, excludedIds) {
|
|
if (!Array.isArray(buttonIds)) return [];
|
|
|
|
var seen = new Set();
|
|
var excluded = normalizeExcludedIds(excludedIds);
|
|
|
|
return buttonIds.filter(function(id) {
|
|
if (!controllerButtonDefs[id] || excluded.has(id) || seen.has(id)) {
|
|
return false;
|
|
}
|
|
|
|
seen.add(id);
|
|
return true;
|
|
});
|
|
}
|
|
|
|
function resolvePopupButtons(storage, siteRule, options) {
|
|
var settings = storage || {};
|
|
var config = options || {};
|
|
var controllerButtonDefs = config.controllerButtonDefs || {};
|
|
var defaultButtons = Array.isArray(config.defaultButtons)
|
|
? config.defaultButtons
|
|
: [];
|
|
var excludedIds = config.excludedIds;
|
|
|
|
function sanitize(buttonIds) {
|
|
return sanitizeButtonOrder(buttonIds, controllerButtonDefs, excludedIds);
|
|
}
|
|
|
|
if (siteRule && Array.isArray(siteRule.popupControllerButtons)) {
|
|
return sanitize(siteRule.popupControllerButtons);
|
|
}
|
|
|
|
if (settings.popupMatchHoverControls) {
|
|
if (siteRule && Array.isArray(siteRule.controllerButtons)) {
|
|
return sanitize(siteRule.controllerButtons);
|
|
}
|
|
|
|
if (Array.isArray(settings.controllerButtons)) {
|
|
return sanitize(settings.controllerButtons);
|
|
}
|
|
}
|
|
|
|
if (Array.isArray(settings.popupControllerButtons)) {
|
|
return sanitize(settings.popupControllerButtons);
|
|
}
|
|
|
|
return sanitize(defaultButtons);
|
|
}
|
|
|
|
function pickBestFrameSpeedResult(results) {
|
|
if (!results || !results.length) return null;
|
|
|
|
function normalizeResult(result) {
|
|
var normalized = { speed: result.speed };
|
|
if (typeof result.frameToken === "string") {
|
|
normalized.frameToken = result.frameToken;
|
|
}
|
|
if (result.diagnostics && typeof result.diagnostics === "object") {
|
|
normalized.diagnostics = result.diagnostics;
|
|
}
|
|
if (typeof result.forceLastSavedSpeed === "boolean") {
|
|
normalized.forceLastSavedSpeed = result.forceLastSavedSpeed;
|
|
}
|
|
if (
|
|
typeof result.forceLastSavedSpeedControlledBySiteRule === "boolean"
|
|
) {
|
|
normalized.forceLastSavedSpeedControlledBySiteRule =
|
|
result.forceLastSavedSpeedControlledBySiteRule;
|
|
}
|
|
return normalized;
|
|
}
|
|
|
|
var fallback = null;
|
|
for (var i = 0; i < results.length; i++) {
|
|
var result = results[i];
|
|
if (!result || typeof result.speed !== "number") continue;
|
|
if (result.preferred) return normalizeResult(result);
|
|
if (!fallback) fallback = normalizeResult(result);
|
|
}
|
|
|
|
return fallback;
|
|
}
|
|
|
|
function getSafePageDetails(url) {
|
|
try {
|
|
var parsed = new URL(url);
|
|
return {
|
|
protocol: parsed.protocol,
|
|
hostname: parsed.hostname || null
|
|
};
|
|
} catch (_error) {
|
|
return { protocol: null, hostname: null };
|
|
}
|
|
}
|
|
|
|
function buildDiagnosticReport(context) {
|
|
var config = context || {};
|
|
var storage = config.storage || {};
|
|
var siteRule = config.siteRule || null;
|
|
var frame = config.frame || null;
|
|
|
|
return JSON.stringify(
|
|
{
|
|
speederVersion: config.speederVersion || null,
|
|
browser: config.browser || null,
|
|
platform: config.platform || null,
|
|
page: getSafePageDetails(config.url),
|
|
globalSettings: {
|
|
enabled: storage.enabled !== false,
|
|
rememberSpeed: storage.rememberSpeed === true,
|
|
forceLastSavedSpeed: storage.forceLastSavedSpeed === true,
|
|
audioEnabled: storage.audioBoolean === true,
|
|
startHidden: storage.startHidden === true,
|
|
hideWithControls: storage.hideWithControls === true,
|
|
controllerLocation: storage.controllerLocation,
|
|
shortcutTargetMode: storage.shortcutTargetMode
|
|
},
|
|
matchedSiteRule: {
|
|
matched: Boolean(siteRule),
|
|
disabled: config.siteRuleDisabled === true,
|
|
overrideKeys: siteRule
|
|
? Object.keys(siteRule)
|
|
.filter(function(key) {
|
|
return key !== "pattern" && key !== "title";
|
|
})
|
|
.sort()
|
|
: []
|
|
},
|
|
tabPaused: config.tabPaused === true,
|
|
frame: frame && frame.diagnostics ? frame.diagnostics : null
|
|
},
|
|
null,
|
|
2
|
|
);
|
|
}
|
|
|
|
return {
|
|
buildDiagnosticReport: buildDiagnosticReport,
|
|
pickBestFrameSpeedResult: pickBestFrameSpeedResult,
|
|
resolvePopupButtons: resolvePopupButtons,
|
|
sanitizeButtonOrder: sanitizeButtonOrder
|
|
};
|
|
});
|