From d06646af9e8185046dca8451bbf8ead7cdb7d024 Mon Sep 17 00:00:00 2001 From: Jack Works Date: Tue, 19 Jul 2022 13:04:14 +0800 Subject: [PATCH] fix: firefox fetch --- packages/configuration/src/index.ts | 2 ++ packages/polyfills/types/firefox.d.ts | 5 +++++ packages/web3-providers/src/twitter/index.ts | 15 +++++++++++---- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/configuration/src/index.ts b/packages/configuration/src/index.ts index 69c3e9e18294..e68c1ea3f6bc 100644 --- a/packages/configuration/src/index.ts +++ b/packages/configuration/src/index.ts @@ -12,6 +12,8 @@ class Configuration { if (this.ac) this.ac.abort() this.ac = new AbortController() + // TODO: delegate the fetch to the background. + // because this DOES NOT work on Manifest V3 and Firefox. const response = await fetch(this.url, { signal: this.ac.signal, }) diff --git a/packages/polyfills/types/firefox.d.ts b/packages/polyfills/types/firefox.d.ts index b74fa8f5963a..649ea45b0b94 100644 --- a/packages/polyfills/types/firefox.d.ts +++ b/packages/polyfills/types/firefox.d.ts @@ -14,3 +14,8 @@ declare var exportFunction: /** @see https://mdn.io/Component.utils.cloneInto Firefox only */ declare var cloneInto: undefined | ((f: T, target: object, opts: { cloneFunctions: boolean }) => T) + +/** @deprecated Only available in Manifest V2. */ +declare var content: + | undefined + | { fetch: typeof fetch; WebSocket: typeof WebSocket; XMLHttpRequest: typeof XMLHttpRequest } diff --git a/packages/web3-providers/src/twitter/index.ts b/packages/web3-providers/src/twitter/index.ts index c0b8e02ec7c5..82856a5b4c41 100644 --- a/packages/web3-providers/src/twitter/index.ts +++ b/packages/web3-providers/src/twitter/index.ts @@ -1,3 +1,6 @@ +/// +/// + import { escapeRegExp } from 'lodash-unified' import urlcat from 'urlcat' import LRUCache from 'lru-cache' @@ -28,17 +31,21 @@ function getCSRFToken() { return value } -async function getScriptContent(url: string) { +async function fetchContentAsTwitterDotCom(url: string) { + if (process.env.engine === 'firefox' && process.env.manifest === '2' && typeof content === 'object') { + const response = await content.fetch(url) + return response.text() + } const response = await fetch(url) return response.text() } let swContent = '' async function getTokens(operationName?: string) { - swContent = swContent || (await getScriptContent('https://twitter.com/sw.js')) + swContent = swContent || (await fetchContentAsTwitterDotCom('https://twitter.com/sw.js')) const [mainContent, nftContent] = await Promise.all([ - getScriptContent(getScriptURL(swContent ?? '', 'main')), - getScriptContent(getScriptURL(swContent ?? '', 'bundle.UserNft')), + fetchContentAsTwitterDotCom(getScriptURL(swContent ?? '', 'main')), + fetchContentAsTwitterDotCom(getScriptURL(swContent ?? '', 'bundle.UserNft')), ]) const bearerToken = getScriptContentMatched(mainContent ?? '', /s="(\w+%3D\w+)"/)