function extract(...args) { let message = { from: "DataExtracter:Extract", args: args } chrome.runtime.sendMessage(message, r => { if (r) console.log(r); }); } chrome.runtime.onMessage.addListener( function (request, sender, sendResponse) { if (!request.from) return; let [ext, act] = request.from.split(":"); if (ext.toLowerCase() !== 'dataextracter') return; // console.log(request); switch (act.toLowerCase()) { case "extract": let data = extractTabData(request.itemsSelector, request.fieldSelectors); if (sendResponse) sendResponse(data); break; case "gotourl": window.location.replace(request.url); if (sendResponse) sendResponse(request.url); break; case "reportin": if (sendResponse) sendResponse(request.from); break; case "queryurl": if (sendResponse) sendResponse(window.location.href); break; default: break; } } ); function extractTabData(itemsSelector, fieldSelectors) { let fieldNotFound = false; let results = $(itemsSelector).toArray().map( item => { return fieldSelectors.map( selector => { let [cls, attr] = selector.split('@').slice(0, 2); // TODO: close tab to cancel task tip if (fieldNotFound) return; let fieldVals = $(item).find(cls).toArray(); if (!fieldVals.length) { fieldNotFound = true; return; } return fieldVals.map(find => attr ? find[attr] : find.textContent.trim()).join('\n') } ) } ); return fieldNotFound ? [] : results }