62 lines
1.8 KiB
JavaScript
62 lines
1.8 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 {
|
|
configs,
|
|
} from '/common/common.js';
|
|
import * as Constants from '/common/constants.js';
|
|
|
|
import { Tab } from '/common/TreeItem.js';
|
|
|
|
async function doTest() {
|
|
const win = await browser.windows.getLastFocused({ populate: true });
|
|
const tab = win.tabs.find(tab => tab.active);
|
|
|
|
const maxTry = 10;
|
|
const promises = [];
|
|
const duplicatedTabIds = [];
|
|
for (let i = 0; i < maxTry; i++) {
|
|
promises.push(browser.tabs.duplicate(tab.id).then(async duplicated => {
|
|
await Tab.waitUntilTracked(duplicated.id);
|
|
const tracked = Tab.get(duplicated.id);
|
|
const uniqueId = await tracked.$TST.promisedUniqueId;
|
|
duplicatedTabIds.push(duplicated.id);
|
|
return uniqueId?.duplicated;
|
|
}));
|
|
}
|
|
const successCount = (await Promise.all(promises)).filter(result => !!result).length;
|
|
await browser.tabs.remove(duplicatedTabIds);
|
|
return successCount / maxTry;
|
|
}
|
|
|
|
async function autoDetectSuitableDelay() {
|
|
configs.delayForDuplicatedTabDetection = 0;
|
|
let successRate = await doTest();
|
|
if (successRate == 1)
|
|
return;
|
|
|
|
configs.delayForDuplicatedTabDetection = 10;
|
|
while (successRate < 1) {
|
|
configs.delayForDuplicatedTabDetection = Math.round(configs.delayForDuplicatedTabDetection * (1 / Math.max(successRate, 0.5)));
|
|
successRate = await doTest();
|
|
}
|
|
}
|
|
|
|
browser.runtime.onMessage.addListener((message, _sender) => {
|
|
if (!message || !message.type)
|
|
return;
|
|
|
|
switch (message.type) {
|
|
case Constants.kCOMMAND_TEST_DUPLICATED_TAB_DETECTION:
|
|
return doTest();
|
|
|
|
case Constants.kCOMMAND_AUTODETECT_DUPLICATED_TAB_DETECTION_DELAY:
|
|
autoDetectSuitableDelay();
|
|
return;
|
|
}
|
|
});
|