diff --git a/extension/manifest.json b/extension/manifest.json index c342834..9ab7a74 100644 --- a/extension/manifest.json +++ b/extension/manifest.json @@ -53,6 +53,7 @@ "tabs", "storage", "webRequest", + "webRequestBlocking", "" ] } diff --git a/src/bg/index.ts b/src/bg/index.ts index ca22c2c..d66b0fe 100644 --- a/src/bg/index.ts +++ b/src/bg/index.ts @@ -21,6 +21,9 @@ interface Config { let E_USER_CONFIG: Config = {}; +// ref: header editor +const IS_CHROME = /Chrome\/(\d+)\.(\d+)/.test(navigator.userAgent); + async function sendMsgToCurrentTab( payload: LogMsg & Record ) { @@ -28,7 +31,9 @@ async function sendMsgToCurrentTab( active: true, currentWindow: true, }); - browser.tabs.sendMessage(tabs[0].id, payload); + if (tabs && Array.isArray(tabs) && tabs[0]) { + browser.tabs.sendMessage(tabs[0].id, payload); + } } async function handleMessage(request: ExtMsg) { @@ -137,7 +142,9 @@ async function updateAuxData(payload: { duration: 0, }); console.info('the start of updating aux data'); + window._fetch_url_bg = auxSite; const auxData = await getWikiDataByURL(auxSite, auxSiteOpts); + window._fetch_url_bg = null; const obj = await browser.storage.local.get(['wikiData']); console.info('current wikiData: ', obj.wikiData); if (!auxData || (auxData && auxData.length === 0)) { @@ -186,6 +193,18 @@ async function updateAuxData(payload: { } } +function createHeaderListener(type: string): any { + const result = ['blocking']; + result.push(type); + if ( + IS_CHROME && + // @ts-ignore + chrome.webRequest.OnBeforeSendHeadersOptions.hasOwnProperty('EXTRA_HEADERS') + ) { + result.push('extraHeaders'); + } + return result; +} async function init() { // 初始化设置 const obj = await browser.storage.local.get(['version', 'config']); @@ -213,6 +232,23 @@ async function init() { console.log('E_CONFIG: ', E_USER_CONFIG); } }); + browser.webRequest.onBeforeSendHeaders.addListener( + (obj) => { + let m = (obj?.url ?? '').match(/brandnew\/(\d+)/); + if (m) { + obj.requestHeaders.push({ + name: 'Referer', + value: `http://www.getchu.com/soft.phtml?id=${m[1]}`, + }); + } + return { requestHeaders: obj.requestHeaders }; + }, + { + // urls: ['http://*/brandnew/*'], + urls: ['http://www.getchu.com/brandnew/*'], + }, + createHeaderListener('requestHeaders') + ); } init(); diff --git a/src/global.d.ts b/src/global.d.ts index a8d58c3..93b4736 100644 --- a/src/global.d.ts +++ b/src/global.d.ts @@ -10,4 +10,6 @@ declare var GM_getResourceText: any; // @TODO avoid use global variable interface Window { _parsedEl: Element | Document; + // 后台的 url + _fetch_url_bg?: string; } diff --git a/src/sites/erogamescape.ts b/src/sites/erogamescape.ts index 031027e..2e3f885 100644 --- a/src/sites/erogamescape.ts +++ b/src/sites/erogamescape.ts @@ -155,6 +155,9 @@ export const erogamescapeTools: SiteTools = { cookie: 'getchu_adalt_flag=getchu.com', decode: 'EUC-JP', }, + prefs: { + targetNames: ['cover'], + }, }, }, }; diff --git a/src/sites/lib.ts b/src/sites/lib.ts index e798641..b5d237f 100644 --- a/src/sites/lib.ts +++ b/src/sites/lib.ts @@ -11,6 +11,12 @@ export async function getCover($d: Element, site: ModelKey) { } if (!url) return; try { + // 在其它网站上获取的相对路径的链接 + // @TODO 这里临时使用的全局变量来处理 + if (window._fetch_url_bg && !/^https?:/.test(url)) { + const urlObj = new URL(window._fetch_url_bg); + url = `${urlObj.origin}/${url.replace(/^\.?\/?/, '')}`; + } // 跨域的图片不能用这种方式 // dataUrl = convertImgToBase64($d as any); let opts: any = {}; @@ -18,6 +24,9 @@ export async function getCover($d: Element, site: ModelKey) { opts.headers = { Referer: location.href, }; + if (!location.href.includes('getchu.com') && window._fetch_url_bg) { + opts.headers.Referer = window._fetch_url_bg; + } } dataUrl = await getImageDataByURL(url, opts); if (dataUrl) { diff --git a/src/user-script/index.ts b/src/user-script/index.ts index d0ae5de..4b33676 100644 --- a/src/user-script/index.ts +++ b/src/user-script/index.ts @@ -42,7 +42,9 @@ async function updateAuxData(payload: { duration: 0, }); console.info('the start of updating aux data'); + window._fetch_url_bg = auxSite; const auxData = await getWikiDataByURL(auxSite, auxSiteOpts); + window._fetch_url_bg = null; if (!auxData || (auxData && auxData.length === 0)) { logMessage({ type: 'error', diff --git a/src/utils/domUtils.ts b/src/utils/domUtils.ts index dd1f89e..7944141 100644 --- a/src/utils/domUtils.ts +++ b/src/utils/domUtils.ts @@ -305,3 +305,11 @@ export function genAnonymousLinkText(url: string, text: string): string { ${text} `; } + +export function addHTMLBase(html: string, url: string): string { + if (html.match(//)) { + return html; + } + const obj = new URL(url); + return html.replace('', ``); +}