migrate to typescript, with fixes
This commit is contained in:
		
							
								
								
									
										131
									
								
								src/background/actions.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								src/background/actions.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,131 @@ | ||||
| import { ACTION_GOTO_URL, ACTION_EXTRACT, ACTION_PING as ACTION_PING, ACTION_QUERY_URL, ACTION_SCROLL_BOTTOM } from "../common"; | ||||
| import { sendMessage } from "./messaging"; | ||||
|  | ||||
| /** | ||||
|  * redirect tab to url. | ||||
|  * @param {any} tab target tab | ||||
|  * @param {string} url target URL | ||||
|  * @returns {Promise<string[]>} a promise of target URL | ||||
|  */ | ||||
| export function redirectTab(tab: chrome.tabs.Tab, url: string) { | ||||
|     return queryUrl(tab).then(u => { | ||||
|         if (url !== u) { | ||||
|             let req = { | ||||
|                 action: ACTION_GOTO_URL, | ||||
|                 url: url | ||||
|             } | ||||
|             let checker = async (u, err, tryCount): Promise<string> => { | ||||
|                 let queryErr: any; | ||||
|                 let newURL = await queryUrl(tab).catch(e => queryErr = e); | ||||
|                 if (queryErr) { | ||||
|                     return Promise.reject(queryErr); | ||||
|                 } | ||||
|                 if (newURL == url) return url; | ||||
|                 if ( | ||||
|                     tryCount % 5 == 0 && | ||||
|                     !confirm('Cannot navigate to target url. \nPress OK to continue, Cancel to stop.') | ||||
|                 ) { | ||||
|                     return Promise.reject("Tasks stopped by user."); | ||||
|                 } | ||||
|                 return undefined; | ||||
|             } | ||||
|             return sendMessage<string>(tab, req, `Goto url: ${url}`, checker); | ||||
|         } | ||||
|     }); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * extract data in from the target tab. | ||||
|  * @param {any} tab target tab | ||||
|  * @param {string} itemsSelector items selectors for selecting items (data rows) | ||||
|  * @param {Array<string>} fieldSelectors fields selectors for selecting fields (data columns) under each item | ||||
|  * @returns {Promise<string[]>} a promise of extracted data | ||||
|  */ | ||||
| export function extractTabData(tab, itemsSelector, fieldSelectors) { | ||||
|     let req = { | ||||
|         action: ACTION_EXTRACT, | ||||
|         itemsSelector: itemsSelector, | ||||
|         fieldSelectors: fieldSelectors | ||||
|     } | ||||
|     let checker = (result, err, tryCount) => { | ||||
|         if (!result || !result.length) { | ||||
|             if (tryCount % 20 == 0 && confirm('No data found in current page. \n\nContinue to next page?')) { | ||||
|                 return []; | ||||
|             } else { | ||||
|                 return undefined; | ||||
|             } | ||||
|         } | ||||
|         return result; | ||||
|     }; | ||||
|     return sendMessage<string[][]>(tab, req, 'Extract data from the tab...', checker); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * ping target tab, usually used to detect if the content script is ready. | ||||
|  * @param {any} tab target tab | ||||
|  * @returns {Promise<boolean>} a promise of boolean value indicates if ping success | ||||
|  */ | ||||
| export async function ping(tab, count = 1) { | ||||
|     let req = { | ||||
|         action: ACTION_PING | ||||
|     } | ||||
|     let checker = (r: string, e, c) => r == "pong" ? r : undefined; | ||||
|     let pong = await sendMessage<string>(tab, req, 'Check tab availability...', checker, 1000, count).catch(() => { }); | ||||
|     return pong == "pong"; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * get the url of the target tab | ||||
|  * @param {any} tab target tab | ||||
|  * @returns {Promise<string>} a promise of the url | ||||
|  */ | ||||
| export function queryUrl(tab: chrome.tabs.Tab) { | ||||
|     let req = { | ||||
|         action: ACTION_QUERY_URL | ||||
|     } | ||||
|     return sendMessage<string>(tab, req); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * get the url of the target tab | ||||
|  * @param {any} tab target tab | ||||
|  * @param {string} expected if specified, queryUrl resolves only when tab url equals to expected | ||||
|  * @returns {Promise<string>} a promise of the url | ||||
|  */ | ||||
| export function scrollToBottom(tab: chrome.tabs.Tab) { | ||||
|     let req = { | ||||
|         action: ACTION_SCROLL_BOTTOM | ||||
|     } | ||||
|     return sendMessage(tab, req, 'Scroll to page bottom...'); | ||||
| } | ||||
|  | ||||
| export async function createTab(url: string, active: boolean) { | ||||
|     return new Promise((resolve, reject) => { | ||||
|         chrome.tabs.create({ | ||||
|             'url': url, | ||||
|             'active': active | ||||
|         }, function (tab) { | ||||
|             resolve(tab); | ||||
|         }) | ||||
|     }) | ||||
| } | ||||
|  | ||||
| export async function getActiveTab(currentWindow: boolean) { | ||||
|     return new Promise((resolve, reject) => { | ||||
|         chrome.tabs.query({ | ||||
|             active: true, | ||||
|             currentWindow: currentWindow | ||||
|         }, function (tabs) { | ||||
|             resolve(tabs[0]); | ||||
|         }) | ||||
|     }) | ||||
| } | ||||
|  | ||||
| export async function getTabByID(id: number) { | ||||
|     return new Promise((resolve, reject) => { | ||||
|         chrome.tabs.get(id, function (tab) { | ||||
|             chrome.runtime.lastError; | ||||
|             resolve(tab); | ||||
|         }) | ||||
|     }) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user