code optimize
This commit is contained in:
		| @ -1,19 +1,22 @@ | |||||||
| chrome.runtime.onMessage.addListener( | chrome.runtime.onMessage.addListener( | ||||||
|     function (request, sender, sendResponse) { |     function (request, sender, sendResponse) { | ||||||
|  |         if (!request.from) return; | ||||||
|  |         let [ext, act] = request.from.split(":"); | ||||||
|  |         if (ext.toLowerCase() !== 'dataextracter') return; | ||||||
|         // console.log(request); |         // console.log(request); | ||||||
|         switch (request.from) { |         switch (act.toLowerCase()) { | ||||||
|             case "DataExtracter:Extract": |             case "extract": | ||||||
|                 let data = extractTabData(request.itemsSelector, request.fieldSelectors); |                 let data = extractTabData(request.itemsSelector, request.fieldSelectors); | ||||||
|                 if (sendResponse) sendResponse(data); |                 if (sendResponse) sendResponse(data); | ||||||
|                 break; |                 break; | ||||||
|             case "DataExtracter:GotoUrl": |             case "gotourl": | ||||||
|                 window.location.replace(request.url); |                 window.location.replace(request.url); | ||||||
|                 if (sendResponse) sendResponse(request.url); |                 if (sendResponse) sendResponse(request.url); | ||||||
|                 break; |                 break; | ||||||
|             case "DataExtracter:ReportIn": |             case "reportin": | ||||||
|                 if (sendResponse) sendResponse(request.from); |                 if (sendResponse) sendResponse(request.from); | ||||||
|                 break; |                 break; | ||||||
|             case "DataExtracter:QueryUrl": |             case "queryurl": | ||||||
|                 if (sendResponse) sendResponse(window.location.href); |                 if (sendResponse) sendResponse(window.location.href); | ||||||
|                 break; |                 break; | ||||||
|             default: |             default: | ||||||
| @ -22,19 +25,7 @@ | |||||||
|     } |     } | ||||||
| ); | ); | ||||||
|  |  | ||||||
| function extractTabData(itemsSelector, fieldSelectors) { | const sig = ` | ||||||
|     return $(itemsSelector).toArray().map( |  | ||||||
|         item => fieldSelectors.map( |  | ||||||
|             selector => { |  | ||||||
|                 let [cls, attr] = selector.split('@').slice(0, 2); |  | ||||||
|                 return $(item).find(cls).toArray().map(find => attr ? find[attr] : find.textContent.trim()).join('\n') |  | ||||||
|             } |  | ||||||
|         ) |  | ||||||
|     ); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function extract(...args) { |  | ||||||
|     let sig = ` |  | ||||||
| # DataExtracter Help | # DataExtracter Help | ||||||
| ---------------------------- | ---------------------------- | ||||||
|  |  | ||||||
| @ -66,7 +57,24 @@ extract(".list-item", ["a.title", "p.content"], "http://sample.com/?pn=\${page}" | |||||||
|  |  | ||||||
| ### Extract link text and target (use 'selector@attribute') | ### Extract link text and target (use 'selector@attribute') | ||||||
| extract('.list-item', ['a.title', 'a.title@href']) | extract('.list-item', ['a.title', 'a.title@href']) | ||||||
|  |  | ||||||
|  | ### Collect links from page(s) & Extract data of each link (only available in console of extension background page) | ||||||
|  |  | ||||||
|  | extract('body',["a.title", "p.content"], await getData('.list-item', ['.item a@href'],["http://sample.com/abc"])) | ||||||
| `.trim(); | `.trim(); | ||||||
|  |  | ||||||
|  | function extractTabData(itemsSelector, fieldSelectors) { | ||||||
|  |     return $(itemsSelector).toArray().map( | ||||||
|  |         item => fieldSelectors.map( | ||||||
|  |             selector => { | ||||||
|  |                 let [cls, attr] = selector.split('@').slice(0, 2); | ||||||
|  |                 return $(item).find(cls).toArray().map(find => attr ? find[attr] : find.textContent.trim()).join('\n') | ||||||
|  |             } | ||||||
|  |         ) | ||||||
|  |     ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function extract(...args) { | ||||||
|     if (!testArgs(...args)) { |     if (!testArgs(...args)) { | ||||||
|         console.log(sig); |         console.log(sig); | ||||||
|         return; |         return; | ||||||
| @ -90,12 +98,41 @@ extract('.list-item', ['a.title', 'a.title@href']) | |||||||
| } | } | ||||||
|  |  | ||||||
| function testArgs(...args) { | function testArgs(...args) { | ||||||
|     if (args.length < 2) return false; |     switch (args.length) { | ||||||
|     if (args.length == 2) |         case 0, 1: | ||||||
|         return (args[0] && args[1] && (typeof args[0] == "string") && (args[1] instanceof Array)) |             return false; | ||||||
|     let urls = []; |         case 2: | ||||||
|     if (args.length > 2) return (typeof args[2] == "string") && ( |             return args[0] && args[1] && | ||||||
|         (args[3] instanceof Array) || |                 (typeof args[0] == "string") && | ||||||
|         (!isNaN(args[3]) && !isNaN(args[4]) && !isNaN(args[5])) |                 (args[1] instanceof Array) && | ||||||
|     ) |                 testArrayVals(args[1], v => typeof v == "string"); | ||||||
|  |         case 3: | ||||||
|  |             return args[0] && args[1] && | ||||||
|  |                 typeof args[0] == "string" && | ||||||
|  |                 args[1] instanceof Array && | ||||||
|  |                 testArrayVals(args[1], v => typeof v == "string") && | ||||||
|  |                 args[2] instanceof Array && | ||||||
|  |                 testArrayVals(args[2], v => typeof v == "string"); | ||||||
|  |         case 4: | ||||||
|  |             return args[0] && args[1] && | ||||||
|  |                 typeof args[0] == "string" && | ||||||
|  |                 args[1] instanceof Array && | ||||||
|  |                 testArrayVals(args[1], v => typeof v == "string") && | ||||||
|  |                 typeof args[2] == "string" && | ||||||
|  |                 args[3] instanceof Array && | ||||||
|  |                 testArrayVals(args[3], v => typeof v == "number"); | ||||||
|  |         case 5: | ||||||
|  |             return args[0] && args[1] && | ||||||
|  |                 typeof args[0] == "string" && | ||||||
|  |                 args[1] instanceof Array && | ||||||
|  |                 testArrayVals(args[1], v => typeof v == "string") && | ||||||
|  |                 typeof args[2] == "string" && | ||||||
|  |                 !isNaN(args[3]) && !isNaN(args[4]) && !isNaN(args[5]); | ||||||
|  |         default: | ||||||
|  |             return false; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function testArrayVals(arr, tester) { | ||||||
|  |         return arr.reduce((p, c) => p && tester(c), true); | ||||||
|  |     } | ||||||
| } | } | ||||||
| @ -75,10 +75,10 @@ function redirectTab(tab, url) { | |||||||
|             if (url !== u) { |             if (url !== u) { | ||||||
|                 curUrl = u; |                 curUrl = u; | ||||||
|                 let req = { |                 let req = { | ||||||
|                     from: "DataExtracter:GotoUrl", |                     from: "GotoUrl", | ||||||
|                     url: url |                     url: url | ||||||
|                 } |                 } | ||||||
|                 chrome.tabs.sendMessage(tab.id, req); |                 sendMessage(tab, req); | ||||||
|             } |             } | ||||||
|         }) |         }) | ||||||
|         .then(() => queryUrl(tab, curUrl)) |         .then(() => queryUrl(tab, curUrl)) | ||||||
| @ -94,13 +94,12 @@ function redirectTab(tab, url) { | |||||||
|  */ |  */ | ||||||
| function extractTabData(tab, itemsSelector, fieldSelectors) { | function extractTabData(tab, itemsSelector, fieldSelectors) { | ||||||
|     let req = { |     let req = { | ||||||
|         from: "DataExtracter:Extract", |         from: "Extract", | ||||||
|         itemsSelector: itemsSelector, |         itemsSelector: itemsSelector, | ||||||
|         fieldSelectors: fieldSelectors |         fieldSelectors: fieldSelectors | ||||||
|     } |     } | ||||||
|     let failMsg = "extractTabData failed after 10 second."; |  | ||||||
|     let cond = r => !!r; |     let cond = r => !!r; | ||||||
|     return sendMessageAndDetect(tab, req, cond, failMsg); |     return sendMessage(tab, req, cond); | ||||||
| } | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @ -110,11 +109,10 @@ function extractTabData(tab, itemsSelector, fieldSelectors) { | |||||||
|  */ |  */ | ||||||
| function reportIn(tab) { | function reportIn(tab) { | ||||||
|     let req = { |     let req = { | ||||||
|         from: "DataExtracter:ReportIn" |         from: "ReportIn" | ||||||
|     } |     } | ||||||
|     let failMsg = "reportIn failed after 10 second."; |  | ||||||
|     let cond = r => r == req.from; |     let cond = r => r == req.from; | ||||||
|     return sendMessageAndDetect(tab, req, cond, failMsg); |     return sendMessage(tab, req, cond); | ||||||
| } | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @ -125,11 +123,10 @@ function reportIn(tab) { | |||||||
|  */ |  */ | ||||||
| function queryUrl(tab, urlExcluded) { | function queryUrl(tab, urlExcluded) { | ||||||
|     let req = { |     let req = { | ||||||
|         from: "DataExtracter:QueryUrl" |         from: "QueryUrl" | ||||||
|     } |     } | ||||||
|     let failMsg = "queryUrl failed after 10 second."; |  | ||||||
|     let cond = url => url && (!urlExcluded || (urlExcluded && urlExcluded != url)); |     let cond = url => url && (!urlExcluded || (urlExcluded && urlExcluded != url)); | ||||||
|     return sendMessageAndDetect(tab, req, cond, failMsg); |     return sendMessage(tab, req, cond); | ||||||
| } | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @ -137,27 +134,27 @@ function queryUrl(tab, urlExcluded) { | |||||||
|  * @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 {string} failMsg message when failed after time out |  | ||||||
|  * @param {number} failedTimeOut fail time out |  * @param {number} failedTimeOut fail time out | ||||||
|  * @param {number} detectInterval interval for detecting |  * @param {number} detectInterval interval for detecting | ||||||
|  * @return {Promise} a promise of the response. |  * @return {Promise} a promise of the response. | ||||||
|  */ |  */ | ||||||
| function sendMessageAndDetect(tab, req, cond, failMsg, failedTimeOut, detectInterval) { | function sendMessage(tab, req, cond, failedTimeOut, detectInterval) { | ||||||
|  |     req.from = "DataExtracter:" + req.from; | ||||||
|     failedTimeOut = failedTimeOut || 10000; |     failedTimeOut = failedTimeOut || 10000; | ||||||
|     detectInterval = detectInterval || 500; |     detectInterval = detectInterval || 500; | ||||||
|     return new Promise((resolve, reject) => { |     return new Promise((resolve, reject) => { | ||||||
|         let timeOut; |         let timeOut; | ||||||
|         let rejectTimeout = setTimeout(() => { |         let rejectTimeout = setTimeout(() => { | ||||||
|             reject(failMsg); |             reject(`${req.from} failed after ${failedTimeOut/1000} seconds.`); | ||||||
|             clearTimeout(timeOut); |             clearTimeout(timeOut); | ||||||
|         }, failedTimeOut); |         }, failedTimeOut); | ||||||
|         loop(); |         loop(); | ||||||
|  |  | ||||||
|         function loop() { |         function loop() { | ||||||
|             chrome.tabs.sendMessage(tab.id, req, r => { |             chrome.tabs.sendMessage(tab.id, req, r => { | ||||||
|                 if (cond(r)) { |                 if (!cond || cond(r)) { | ||||||
|                     resolve(r); |  | ||||||
|                     clearTimeout(rejectTimeout); |                     clearTimeout(rejectTimeout); | ||||||
|  |                     resolve(r); | ||||||
|                 } else { |                 } else { | ||||||
|                     timeOut = setTimeout(() => { |                     timeOut = setTimeout(() => { | ||||||
|                         loop(); |                         loop(); | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user