Files
tubestation/waterfox/browser/components/sidebar/common/api-tabs.js
2025-11-06 14:13:52 +00:00

138 lines
3.3 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/.
*/
'use strict';
import {
log as internalLogger,
configs
} from './common.js';
function log(...args) {
internalLogger('common/api-tabs', ...args);
}
export async function getIndexes(...queriedTabIds) {
log('getIndexes ', queriedTabIds);
if (queriedTabIds.length == 0)
return [];
const indexes = await Promise.all(queriedTabIds.map((tabId) => {
return browser.tabs.get(tabId)
.catch(e => {
handleMissingTabError(e);
return null;
});
}));
return indexes.map(tab => tab ? tab.index : -1);
}
export function isMissingTabError(error) {
return (
error &&
error.message &&
error.message.includes('Invalid tab ID:')
);
}
export function handleMissingTabError(error) {
if (!isMissingTabError(error))
throw error;
// otherwise, this error is caused from a tab already closed.
// we just ignore it.
//console.log('Invalid Tab ID error on: ' + error.stack);
}
export function isUnloadedError(error) {
return (
error &&
error.message &&
error.message.includes('can\'t access dead object')
);
}
export function handleUnloadedError(error) {
if (!isUnloadedError(error))
throw error;
}
export function isMissingHostPermissionError(error) {
return (
error &&
error.message &&
error.message.includes('Missing host permission for the tab')
);
}
export function handleMissingHostPermissionError(error) {
if (!isMissingHostPermissionError(error))
throw error;
}
export function createErrorHandler(...handlers) {
const stack = configs.debug && new Error().stack;
return (error) => {
try {
if (handlers.length > 0) {
let unhandledCount = 0;
handlers.forEach(handler => {
try {
handler(error);
}
catch(_error) {
unhandledCount++;
}
});
if (unhandledCount == handlers.length) // not handled
throw error;
}
else {
throw error;
}
}
catch(newError){
if (!configs.debug)
throw newError;
if (error == newError)
console.log('Unhandled Error: ', error, stack);
else
console.log('Unhandled Error: ', error, newError, stack);
}
};
}
export function createErrorSuppressor(...handlers) {
const stack = configs.debug && new Error().stack;
return (error) => {
try {
if (handlers.length > 0) {
let unhandledCount = 0;
handlers.forEach(handler => {
try {
handler(error);
}
catch(_error) {
unhandledCount++;
}
});
if (unhandledCount == handlers.length) // not handled
throw error;
}
else {
throw error;
}
}
catch(newError){
if (error &&
error.message &&
error.message.indexOf('Could not establish connection. Receiving end does not exist.') == 0)
return;
if (!configs.debug)
return;
if (error == newError)
console.log('Unhandled Error: ', error, stack);
else
console.log('Unhandled Error: ', error, newError, stack);
}
};
}