Skip to content

Commit d751934

Browse files
committed
feat: inject inpage.js by chrome content-script
1 parent 66fd137 commit d751934

File tree

5 files changed

+46
-26
lines changed

5 files changed

+46
-26
lines changed

packages/background/src/service-worker.js

+25
Original file line numberDiff line numberDiff line change
@@ -147,3 +147,28 @@ async function initApp() {
147147
}
148148

149149
initApp()
150+
151+
let count = 0
152+
const registerInPageContentScript = async () => {
153+
count++
154+
try {
155+
await chrome.scripting.registerContentScripts([
156+
{
157+
id: 'inpage',
158+
matches: ['file://*/*', 'http://*/*', 'https://*/*'],
159+
js: ['inpage.js'],
160+
runAt: 'document_start',
161+
world: 'MAIN',
162+
allFrames: true,
163+
},
164+
])
165+
} catch (err) {
166+
console.error('registerInPageContentScript failed:', err)
167+
if (count < 3) {
168+
// retry
169+
registerInPageContentScript()
170+
}
171+
}
172+
}
173+
174+
registerInPageContentScript()

packages/content-script/indexTemplate.js

+5-20
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ import browser from 'webextension-polyfill'
22
import {stream} from '@thi.ng/rstream'
33
import {getSiteMetadata} from '@fluent-wallet/site-metadata'
44

5-
let INPAGE_INJECTED = false
6-
75
function _retry() {
86
let retryTimeout = 100
97
if (CONNECT_RETRY_COUNT >= 10) {
@@ -23,22 +21,6 @@ function _retry() {
2321
setTimeout(setup, retryTimeout)
2422
}
2523

26-
function injectInpage(content) {
27-
try {
28-
const container = document.head || document.documentElement
29-
const scriptTag = document.createElement('script')
30-
scriptTag.setAttribute('async', 'false')
31-
if (content) scriptTag.textContent = content
32-
else scriptTag.src = browser.runtime.getURL('inpage.js')
33-
container.insertBefore(scriptTag, container.children[0])
34-
container.removeChild(scriptTag)
35-
INPAGE_INJECTED = true
36-
registerSite()
37-
} catch (error) {
38-
console.error('Fluent Wallet: Provider injection failed.', error)
39-
}
40-
}
41-
4224
let CONNECT_RETRY_COUNT = 0
4325
let s
4426

@@ -91,6 +73,10 @@ function setup() {
9173
typeof e.data.msg !== 'object'
9274
)
9375
return
76+
if (e.data.msg.event === '__INPAGE_INJECTED__') {
77+
registerSite()
78+
return
79+
}
9480
if (!e.data.msg.method) return
9581
if (e.data.msg.jsonrpc !== '2.0') return
9682
if (!Number.isInteger(e.data.msg.id)) return
@@ -125,7 +111,6 @@ function setup() {
125111
)
126112
})
127113

128-
if (INPAGE_INJECTED) registerSite()
114+
registerSite()
129115
}
130-
injectInpage()
131116
setup()

packages/inpage/setup-inpage-provider.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ function setupProvider() {
6969
location.origin,
7070
)
7171

72+
post({
73+
event: '__INPAGE_INJECTED__',
74+
})
75+
7276
const {send: sendToBg, stream} = rpcStream({
7377
postMessage: post,
7478
onMessage: {
@@ -93,7 +97,6 @@ function setupProvider() {
9397
if (!window.ethereum) window.ethereum = PROVIDER
9498
Object.defineProperty(window, 'conflux', {value: PROVIDER, writable: false})
9599
takeOver(PROVIDER, 'cfx')
96-
97100
if (window.localStorage.getItem(FLUENT_OVERRIDE_WINDOW_DOT_ETHEREUM)) {
98101
try {
99102
Object.defineProperty(window, 'ethereum', {

packages/inpage/take-over-portal.js

+11-5
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,17 @@ function _takeOverEthereum(PROVIDER, resolve) {
2626
export async function takeOver(PROVIDER, type = 'cfx') {
2727
if (!PROVIDER) return
2828
const takeOverFn = type === 'cfx' ? _takeOverConflux : _takeOverEthereum
29-
return await new Promise(resolve => {
30-
TakeOverInterval[type] = setInterval(
31-
() => takeOverFn(PROVIDER, resolve),
32-
50,
33-
)
29+
return await new Promise((resolve, reject) => {
30+
TakeOverInterval[type] = setInterval(() => {
31+
try {
32+
takeOverFn(PROVIDER, resolve)
33+
} catch (error) {
34+
if (error?.message?.includes('Cannot redefine property')) {
35+
clearInterval(TakeOverInterval[type])
36+
reject(error)
37+
}
38+
}
39+
}, 50)
3440
})
3541
}
3642

packages/manifest/manifestv3.json

+1
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
"unlimitedStorage",
7979
"clipboardWrite",
8080
"tabs",
81+
"scripting",
8182
"activeTab",
8283
"notifications"
8384
],

0 commit comments

Comments
 (0)