availablity check before run on active tab
This commit is contained in:
@ -110,16 +110,17 @@ function extractTabData(tab, itemsSelector, fieldSelectors) {
|
||||
}
|
||||
|
||||
/**
|
||||
* get report in from the target tab, usually used to detect if the content script is ready.
|
||||
* ping target tab, usually used to detect if the content script is ready.
|
||||
* @param {any} tab target tab
|
||||
* @returns {Promise<string>} a promise of the report in message
|
||||
* @returns {Promise<boolean>} a promise of boolean value indicates if ping success
|
||||
*/
|
||||
function reportIn(tab) {
|
||||
async function ping(tab, count = 1) {
|
||||
let req = {
|
||||
action: ACTION_REPORT_IN
|
||||
}
|
||||
let cond = r => r == req.action;
|
||||
return sendMessage(tab, req, 'Check tab availability...', cond);
|
||||
let pong = await sendMessage(tab, req, 'Check tab availability...', cond, 1000, count).catch(() => { });
|
||||
return pong == ACTION_REPORT_IN;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -56,6 +56,11 @@ class Extractor {
|
||||
tab = await createTab(task.urls[0], false);
|
||||
} else {
|
||||
tab = await getActiveTab(true) || await getActiveTab(false);
|
||||
let succ = await ping(tab);
|
||||
if (!succ) {
|
||||
console.log('Cannot contact with active tab.');
|
||||
return;
|
||||
}
|
||||
}
|
||||
this._running = true;
|
||||
return this._tasks.reduce((pms, task, i) => {
|
||||
|
||||
@ -4,12 +4,15 @@
|
||||
* @param {object} tab the table where to send the message
|
||||
* @param {object} req the request data.
|
||||
* @param {function} cond success condition function, r:any=>boolean
|
||||
* @param {number} interval interval for detecting
|
||||
* @param {number} interval retry interval, default: 500ms.
|
||||
* @param {number} limit retry limit, default: 0, no limit.
|
||||
* @param {string} log messages logged to console.
|
||||
* @return {Promise} a promise of the response.
|
||||
*/
|
||||
function sendMessage(tab, req, log, cond, interval) {
|
||||
function sendMessage(tab, req, log, cond, interval, limit = 0) {
|
||||
interval = interval || 500;
|
||||
limit = limit && !isNaN(limit) ? limit : 0;
|
||||
count = 0;
|
||||
return new Promise((resolve, reject) => {
|
||||
|
||||
loop();
|
||||
@ -22,6 +25,11 @@ function sendMessage(tab, req, log, cond, interval) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (limit && count >= limit) {
|
||||
reject(`sendMessage loop limit ${limit} reached.`);
|
||||
return;
|
||||
}
|
||||
count++;
|
||||
chrome.tabs.sendMessage(tab.id, req, r => {
|
||||
// check error but do nothing.
|
||||
// do not interrupt promise chains even if error, or the task always fail when:
|
||||
|
||||
Reference in New Issue
Block a user