1
1
import { flagEnabled } from "../../scramjet" ;
2
+ import { SCRAMJETCLIENT , SCRAMJETCLIENTNAME } from "../../symbols" ;
2
3
import { ProxyCtx , ScramjetClient } from "../client" ;
3
4
4
5
enum RewriteType {
@@ -20,6 +21,8 @@ type Rewrite = {
20
21
}
21
22
) ;
22
23
24
+ export type SourceMaps = Record < string , Rewrite [ ] > ;
25
+
23
26
function getEnd ( rewrite : Rewrite ) : number {
24
27
if ( rewrite . type === RewriteType . Insert ) {
25
28
return rewrite . start + rewrite . size ;
@@ -31,6 +34,30 @@ function getEnd(rewrite: Rewrite): number {
31
34
32
35
const scramtag_ident = "/*scramtag " ;
33
36
37
+ // some sites like to steal funcs from frames and then unrewrite them
38
+ function searchRewrites ( tag : string ) : Rewrite [ ] | undefined {
39
+ function searchFrame ( globalThis : Self ) {
40
+ const SCRAMJETCLIENT = globalThis . Symbol . for ( SCRAMJETCLIENTNAME ) ;
41
+ if ( globalThis [ SCRAMJETCLIENT ] . sourcemaps [ tag ] )
42
+ return globalThis [ SCRAMJETCLIENT ] . sourcemaps [ tag ] ;
43
+
44
+ // no enhanced for :frowning2:
45
+ for ( let i = 0 ; i < globalThis . frames . length ; i ++ ) {
46
+ const rewrites = searchFrame ( globalThis . frames [ i ] . self ) ;
47
+ if ( rewrites ) return rewrites ;
48
+ }
49
+ }
50
+
51
+ let globalThis = self ;
52
+ let rewrites = searchFrame ( globalThis ) ;
53
+ if ( rewrites ) return rewrites ;
54
+ while ( globalThis . parent && globalThis . parent !== globalThis . window ) {
55
+ globalThis = globalThis . parent . self ;
56
+ let rewrites = searchFrame ( globalThis ) ;
57
+ if ( rewrites ) return rewrites ;
58
+ }
59
+ }
60
+
34
61
function registerRewrites ( buf : Array < number > , tag : string ) {
35
62
const sourcemap = Uint8Array . from ( buf ) ;
36
63
const view = new DataView ( sourcemap . buffer ) ;
@@ -65,7 +92,7 @@ function registerRewrites(buf: Array<number>, tag: string) {
65
92
}
66
93
}
67
94
68
- sourcemaps [ tag ] = rewrites ;
95
+ self [ SCRAMJETCLIENT ] . sourcemaps [ tag ] = rewrites ;
69
96
}
70
97
71
98
function doUnrewrite ( ctx : ProxyCtx ) {
@@ -94,7 +121,7 @@ function doUnrewrite(ctx: ProxyCtx) {
94
121
const scramtagend = stringified . indexOf ( "*/" , scramtagstart ) ;
95
122
const tag = stringified . substring ( firstspace + 1 , scramtagend ) ;
96
123
97
- const rewrites = sourcemaps [ tag ] ;
124
+ const rewrites = searchRewrites ( tag ) ;
98
125
99
126
if ( ! rewrites ) {
100
127
console . warn ( "failed to get rewrites for tag" , tag ) ;
@@ -137,8 +164,6 @@ function doUnrewrite(ctx: ProxyCtx) {
137
164
return ctx . return ( newString ) ;
138
165
}
139
166
140
- const sourcemaps : Record < string , Rewrite [ ] > = { } ;
141
-
142
167
export const enabled = ( client : ScramjetClient ) =>
143
168
flagEnabled ( "sourcemaps" , client . url ) ;
144
169
0 commit comments