138 lines
3.3 KiB
JavaScript
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);
|
|
}
|
|
};
|
|
}
|