improve redirect tab
This commit is contained in:
		| @ -5,13 +5,16 @@ | ||||
|             // console.log(request); | ||||
|             let data = extractData(request.itemsSelector, request.fieldSelectors); | ||||
|             // console.log(data); | ||||
|             sendResponse(data); | ||||
|             if (sendResponse) sendResponse(data); | ||||
|         } else if (request.from == "doExtractGotoUrl") { | ||||
|             // console.log(request); | ||||
|             window.location.replace(request.url); | ||||
|         } else if (request.from == "doExtractReportIn") { | ||||
|             // console.log("doExtractReportIn"); | ||||
|             sendResponse(request.from); | ||||
|             if (sendResponse) sendResponse(request.from); | ||||
|         } else if (request.from == "doExtractQueryUrl") { | ||||
|             // console.log("doExtractReportIn"); | ||||
|             if (sendResponse) sendResponse(window.location.href); | ||||
|         } | ||||
|     } | ||||
| ); | ||||
|  | ||||
| @ -69,42 +69,76 @@ function extractTabData(tab, itemsSelector, fieldSelectors) { | ||||
| } | ||||
|  | ||||
| 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); | ||||
|         let curUrl = ""; | ||||
|         queryUrl(tab) | ||||
|             .then(u => { | ||||
|                 if (url !== u) { | ||||
|                     curUrl = u; | ||||
|                     chrome.tabs.sendMessage(tab.id, req); | ||||
|                 } | ||||
|             }) | ||||
|             .then(() => queryUrl(tab, curUrl)) | ||||
|             .then(() => reportIn(tab)) | ||||
|             .then(tab => resolve(tab)) | ||||
|             .catch(err => reject(err)); | ||||
|     }); | ||||
| } | ||||
|  | ||||
|         function detectLoop() { | ||||
|             let req = { | ||||
|                 from: "doExtractReportIn" | ||||
|             } | ||||
| function reportIn(tab) { | ||||
|     let req = { | ||||
|         from: "doExtractReportIn" | ||||
|     } | ||||
|     return new Promise((resolve, reject) => { | ||||
|         let timeOut; | ||||
|         let rejectTimeout = setTimeout(() => { | ||||
|             reject(`reportIn failed after 10 second.`); | ||||
|             clearTimeout(timeOut); | ||||
|         }, 10000); | ||||
|         loop(); | ||||
|  | ||||
|         function loop() { | ||||
|             chrome.tabs.sendMessage(tab.id, req, r => { | ||||
|                 if (r != req.from) return; | ||||
|                 resolve(tab) | ||||
|                 done = true; | ||||
|                 if (r == req.from) { | ||||
|                     resolve(tab); | ||||
|                     clearTimeout(rejectTimeout); | ||||
|                 } else { | ||||
|                     timeOut = setTimeout(() => { | ||||
|                         loop(); | ||||
|                     }, 500); | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|     }); | ||||
| } | ||||
|  | ||||
| function queryUrl(tab, urlExcluded) { | ||||
|     let req = { | ||||
|         from: "doExtractQueryUrl" | ||||
|     } | ||||
|     return new Promise((resolve, reject) => { | ||||
|         let timeOut; | ||||
|         let rejectTimeout = setTimeout(() => { | ||||
|             reject(`queryUrl failed after 10 second.`); | ||||
|             clearTimeout(timeOut); | ||||
|         }, 10000); | ||||
|         loop(); | ||||
|  | ||||
|         function loop() { | ||||
|             chrome.tabs.sendMessage(tab.id, req, url => { | ||||
|                 if (url && (!urlExcluded || (urlExcluded && urlExcluded != url))) { | ||||
|                     resolve(url); | ||||
|                     clearTimeout(rejectTimeout); | ||||
|                 } else { | ||||
|                     timeOut = setTimeout(() => { | ||||
|                         loop(); | ||||
|                     }, 500); | ||||
|                 } | ||||
|             }); | ||||
|             if (!done) { | ||||
|                 clearTimeout(timeOut); | ||||
|                 timeOut = setTimeout(() => { | ||||
|                     detectLoop(); | ||||
|                 }, 100); | ||||
|             } | ||||
|         } | ||||
|     }); | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user