@@ -14,10 +14,10 @@ export type ExecScriptEntry = {
1414
1515// 脚本执行器
1616export class ScriptExecutor {
17+ earlyScriptFlag : Set < string > = new Set ( ) ;
1718 execMap : Map < string , ExecScript > = new Map ( ) ;
1819
1920 envInfo : GMInfoEnv | undefined ;
20- earlyScriptFlag : string [ ] = [ ] ;
2121
2222 constructor ( private msg : Message ) { }
2323
@@ -51,41 +51,53 @@ export class ScriptExecutor {
5151 envInfo : this . envInfo ! ,
5252 } ) ;
5353 } ;
54+ // 监听脚本加载
5455 scripts . forEach ( ( script ) => {
5556 const flag = script . flag ;
5657 // 如果是EarlyScriptFlag,处理沙盒环境
57- if ( this . earlyScriptFlag . includes ( flag ) ) {
58+ if ( this . earlyScriptFlag . has ( flag ) ) {
5859 for ( const val of this . execMap . values ( ) ) {
5960 if ( val . scriptRes . flag === flag ) {
6061 // 处理早期脚本的沙盒环境
6162 val . updateEarlyScriptGMInfo ( this . envInfo ! ) ;
62- break ;
63+ return ;
6364 }
6465 }
65- return ;
6666 }
67-
6867 definePropertyListener ( window , flag , ( val : ScriptFunc ) => {
6968 loadExec ( script , val ) ;
7069 } ) ;
7170 } ) ;
7271 }
7372
74- checkEarlyStartScript ( earlyStarFlag : string [ ] ) {
75- this . earlyScriptFlag = earlyStarFlag ;
76- const loadExec = ( flag : string , scriptFunc : any ) => {
77- this . execScriptEntry ( {
78- scriptLoadInfo : scriptFunc . scriptInfo ,
79- scriptFunc : scriptFunc . func ,
80- scriptFlag : flag ,
81- envInfo : { } ,
82- } ) ;
83- } ;
84- this . earlyScriptFlag . forEach ( ( flag ) => {
85- definePropertyListener ( window , flag , ( val : PreScriptFunc ) => {
86- loadExec ( flag , val ) ;
87- } ) ;
73+ checkEarlyStartScript ( env : "content" | "inject" , messageFlags : MessageFlags ) {
74+ const eventNamePrefix = env === "content" ? messageFlags . contentFlag : messageFlags . injectFlag ;
75+ // 监听 脚本加载
76+ // 适用于此「通知环境加载完成」代码执行后的脚本加载
77+ window . addEventListener ( `${ eventNamePrefix } ${ messageFlags . scriptLoadComplete } ` , ( event ) => {
78+ if ( event instanceof CustomEvent ) {
79+ if ( typeof event . detail . scriptFlag === "string" ) {
80+ event . preventDefault ( ) ; // dispatchEvent 会回传 false -> 分离环境也能得知环境加载代码已执行
81+ const scriptFlag = event . detail . scriptFlag ;
82+ this . execEarlyScript ( scriptFlag ) ;
83+ }
84+ }
85+ } ) ;
86+ // 通知 环境 加载完成
87+ // 适用于此「通知环境加载完成」代码执行前的脚本加载
88+ const ev = new CustomEvent ( eventNamePrefix + messageFlags . envLoadComplete ) ;
89+ window . dispatchEvent ( ev ) ;
90+ }
91+
92+ execEarlyScript ( flag : string ) {
93+ const scriptFunc = ( window as any ) [ flag ] as PreScriptFunc ;
94+ this . execScriptEntry ( {
95+ scriptLoadInfo : scriptFunc . scriptInfo ,
96+ scriptFunc : scriptFunc . func ,
97+ scriptFlag : flag ,
98+ envInfo : { } ,
8899 } ) ;
100+ this . earlyScriptFlag . add ( flag ) ;
89101 }
90102
91103 execScriptEntry ( scriptEntry : ExecScriptEntry ) {
0 commit comments