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
|
* @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 = {
|
let req = {
|
||||||
action: ACTION_REPORT_IN
|
action: ACTION_REPORT_IN
|
||||||
}
|
}
|
||||||
let cond = r => r == req.action;
|
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);
|
tab = await createTab(task.urls[0], false);
|
||||||
} else {
|
} else {
|
||||||
tab = await getActiveTab(true) || await getActiveTab(false);
|
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;
|
this._running = true;
|
||||||
return this._tasks.reduce((pms, task, i) => {
|
return this._tasks.reduce((pms, task, i) => {
|
||||||
|
|||||||
@ -4,12 +4,15 @@
|
|||||||
* @param {object} tab the table where to send the message
|
* @param {object} tab the table where to send the message
|
||||||
* @param {object} req the request data.
|
* @param {object} req the request data.
|
||||||
* @param {function} cond success condition function, r:any=>boolean
|
* @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.
|
* @param {string} log messages logged to console.
|
||||||
* @return {Promise} a promise of the response.
|
* @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;
|
interval = interval || 500;
|
||||||
|
limit = limit && !isNaN(limit) ? limit : 0;
|
||||||
|
count = 0;
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
|
||||||
loop();
|
loop();
|
||||||
@ -22,6 +25,11 @@ function sendMessage(tab, req, log, cond, interval) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (limit && count >= limit) {
|
||||||
|
reject(`sendMessage loop limit ${limit} reached.`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
count++;
|
||||||
chrome.tabs.sendMessage(tab.id, req, r => {
|
chrome.tabs.sendMessage(tab.id, req, r => {
|
||||||
// check error but do nothing.
|
// check error but do nothing.
|
||||||
// do not interrupt promise chains even if error, or the task always fail when:
|
// do not interrupt promise chains even if error, or the task always fail when:
|
||||||
|
|||||||
Reference in New Issue
Block a user