// function extract(itemsSelector, fieldSelectors, url, from, to, interval) // function extract(itemsSelector, fieldSelectors, url, pages) function extract(itemsSelector, fieldSelectors, url, ...args) { let urls = []; if (url) { if (args[0] instanceof Array) { urls = args[0].map(p => url.replace("${page}", p)); } else if (args.length >= 3) { let from = args.shift(); let to = args.shift(); let interval = args.shift(); for (let i = from; i <= to; i += interval) { urls.push(url.replace("${page}", i)); } } } let data = []; return new Promise((resolve, reject) => { chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) { let pms; let tab = tabs[0]; if (urls.length) { pms = urls.reduce((p, url) => p.then( results => { data.push(...results); return redirectTab(tab, url).then( tab => extractTabData(tab, itemsSelector, fieldSelectors) ); }, () => p ), Promise.resolve([])); } else { pms = extractTabData(tab, itemsSelector, fieldSelectors); } pms.then( results => { data.push(...results); data.unshift(fieldSelectors); saveFileAsk(data); resolve("save done.") }, err => reject(err) ); }); }); } function extractTabData(tab, itemsSelector, fieldSelectors) { let done = false; return new Promise((resolve, reject) => { chrome.tabs.sendMessage( tab.id, { from: "doExtractRequest", itemsSelector: itemsSelector, fieldSelectors: fieldSelectors }, response => { done = true; resolve(response); } ); setTimeout(() => { if (!done) reject(`extractTabData failed after 2 second.`); }, 2000); }); } function redirectTab(tab, url) { let done = false; let timeOut; return new Promise((resolve, reject) => { let req = { from: "doExtractGotoUrl", url: url } chrome.tabs.sendMessage(tab.id, req, r => { // if (r != req.from) return; // detectLoop(); setTimeout(() => { detectLoop(); }, 500); }); setTimeout(() => { if (!done) { reject(`redirectTab failed after 10 second.`); clearTimeout(timeOut); } }, 10000); function detectLoop() { let req = { from: "doExtractReportIn" } chrome.tabs.sendMessage(tab.id, req, r => { if (r != req.from) return; resolve(tab) done = true; }); if (!done) { clearTimeout(timeOut); timeOut = setTimeout(() => { detectLoop(); }, 100); } } }); } function createTab(url) { return new Promise((resolve, reject) => { chrome.tabs.create({ active: true, url: url }, function (tab) { resolve(tab); }); }); }