Skip to content

Commit 71f0819

Browse files
committed
feat: avoid using try...catch in handling Map.prototype.set and Map.prototype.get
1 parent d2eb372 commit 71f0819

2 files changed

Lines changed: 20 additions & 7 deletions

File tree

userscript/source/index.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,15 @@ declare const unsafeWindow: unsafeWindow
1515
const Win = typeof unsafeWindow !== 'undefined' ? unsafeWindow : window
1616

1717
import { CheckDepthInASWeakMap } from './as-weakmap.js'
18+
import { SafeArrayToString } from './safe-ArrayToString.js'
1819

1920
export const OriginalRegExpTest = Win.RegExp.prototype.test
2021

2122
export function RunTinyShieldUserscript(BrowserWindow: typeof window, UserscriptName: string = 'tinyShield'): void {
22-
const OriginalArrayToString = BrowserWindow.Array.prototype.toString
2323
const OriginalRegExpTest = BrowserWindow.RegExp.prototype.test
24+
const OriginalArrayMap = BrowserWindow.Array.prototype.map
25+
const OriginalString = BrowserWindow.String
26+
const OriginalArrayJoin = BrowserWindow.Array.prototype.join
2427

2528
const ProtectedFunctionStrings = ['toString', 'get', 'set']
2629

@@ -46,7 +49,7 @@ export function RunTinyShieldUserscript(BrowserWindow: typeof window, Userscript
4649
return Reflect.apply(Target, ThisArg, Args)
4750
}
4851

49-
let ArgText = OriginalArrayToString.call(Args) as string
52+
let ArgText = SafeArrayToString(Args, { OriginalArrayMap, OriginalString, OriginalArrayJoin })
5053
if (ASInitPositiveRegExps.filter(ASInitPositiveRegExp => ASInitPositiveRegExp.filter(Index => OriginalRegExpTest.call(Index, ArgText) as boolean).length >= 2).length === 1) {
5154
console.debug(`[${UserscriptName}]: Map.prototype.get:`, ThisArg, Args)
5255
throw new Error()
@@ -68,11 +71,7 @@ export function RunTinyShieldUserscript(BrowserWindow: typeof window, Userscript
6871
BrowserWindow.Map.prototype.set = new Proxy(BrowserWindow.Map.prototype.set, {
6972
apply(Target: (key: unknown, value: unknown) => Map<unknown, unknown>, ThisArg: Map<unknown, unknown>, Args: [unknown, unknown]) {
7073
let ArgText = ''
71-
try {
72-
ArgText = OriginalArrayToString.call(Args) as string
73-
} catch {
74-
console.warn(`[${UserscriptName}]: Map.prototype.set:`, ThisArg, Args)
75-
}
74+
ArgText = SafeArrayToString(Args, { OriginalArrayMap, OriginalString, OriginalArrayJoin })
7675
if (ASReinsertedAdvInvenPositiveRegExps.filter(ASReinsertedAdvInvenPositiveRegExp => ASReinsertedAdvInvenPositiveRegExp.filter(Index => OriginalRegExpTest.call(Index, ArgText) as boolean).length >= 3).length === 1) {
7776
console.debug(`[${UserscriptName}]: Map.prototype.set:`, ThisArg, Args)
7877
throw new Error()
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
type OriginalAPI = {
2+
OriginalArrayMap: typeof Array.prototype.map
3+
OriginalString: typeof String
4+
OriginalArrayJoin: typeof Array.prototype.join
5+
}
6+
7+
export function SafeArrayToString(This: unknown[], OriginalAPI: OriginalAPI): string {
8+
const Mapped = OriginalAPI.OriginalArrayMap.call(
9+
This,
10+
(Value: unknown) => OriginalAPI.OriginalString(Value)
11+
) as string[]
12+
13+
return OriginalAPI.OriginalArrayJoin.call(Mapped) as string
14+
}

0 commit comments

Comments
 (0)