@@ -14,19 +14,30 @@ export type ExecScriptEntry = {
1414 scriptFunc : any ;
1515} ;
1616
17+ export let initEnvInfo : GMInfoEnv ;
18+
19+ try {
20+ initEnvInfo = {
21+ userAgentData : UserAgentData , // 从全局变量获取
22+ sandboxMode : "raw" , // 预留字段,当前固定为 raw
23+ isIncognito : false , // inject 环境下无法判断,固定为 false
24+ } ;
25+ } catch {
26+ // 如果 UserAgentData 不存在,可能是在非inject/content环境下运行
27+ initEnvInfo = {
28+ userAgentData : { } ,
29+ sandboxMode : "raw" ,
30+ isIncognito : false ,
31+ } ;
32+ }
33+
1734// 脚本执行器
1835export class ScriptExecutor {
1936 earlyScriptFlag : Set < string > = new Set ( ) ;
2037 execMap : Map < string , ExecScript > = new Map ( ) ;
2138
22- envInfo : GMInfoEnv | undefined ;
23-
2439 constructor ( private msg : Message ) { }
2540
26- setEnvInfo ( envInfo : GMInfoEnv ) {
27- this . envInfo = envInfo ;
28- }
29-
3041 emitEvent ( data : EmitEventRequest ) {
3142 // 转发给脚本
3243 const exec = this . execMap . get ( data . uuid ) ;
@@ -44,13 +55,13 @@ export class ScriptExecutor {
4455 }
4556 }
4657
47- startScripts ( scripts : TScriptInfo [ ] ) {
58+ startScripts ( scripts : TScriptInfo [ ] , envInfo : GMInfoEnv ) {
4859 const loadExec = ( script : TScriptInfo , scriptFunc : any ) => {
4960 this . execScriptEntry ( {
5061 scriptLoadInfo : script ,
5162 scriptFlag : script . flag ,
5263 scriptFunc,
53- envInfo : this . envInfo ! ,
64+ envInfo : envInfo ,
5465 } ) ;
5566 } ;
5667 // 监听脚本加载
@@ -61,7 +72,7 @@ export class ScriptExecutor {
6172 for ( const val of this . execMap . values ( ) ) {
6273 if ( val . scriptRes . flag === flag ) {
6374 // 处理早期脚本的沙盒环境
64- val . updateEarlyScriptGMInfo ( this . envInfo ! ) ;
75+ val . updateEarlyScriptGMInfo ( envInfo ) ;
6576 return ;
6677 }
6778 }
@@ -72,34 +83,34 @@ export class ScriptExecutor {
7283 } ) ;
7384 }
7485
75- checkEarlyStartScript ( env : "content" | "inject" , messageFlag : string ) {
86+ checkEarlyStartScript ( env : "content" | "inject" , messageFlag : string , envInfo : GMInfoEnv ) {
7687 const isContent = env === "content" ;
7788 const eventNamePrefix = `evt${ messageFlag } ${ isContent ? DefinedFlags . contentFlag : DefinedFlags . injectFlag } ` ;
7889 const scriptLoadCompleteEvtName = `${ eventNamePrefix } ${ DefinedFlags . scriptLoadComplete } ` ;
7990 const envLoadCompleteEvtName = `${ eventNamePrefix } ${ DefinedFlags . envLoadComplete } ` ;
8091 // 监听 脚本加载
8192 // 适用于此「通知环境加载完成」代码执行后的脚本加载
82- window . addEventListener ( scriptLoadCompleteEvtName , ( ev ) => {
93+ performance . addEventListener ( scriptLoadCompleteEvtName , ( ev ) => {
8394 const detail = ( ev as CustomEvent ) . detail ;
8495 const scriptFlag = detail ?. scriptFlag ;
8596 if ( typeof scriptFlag === "string" ) {
8697 ev . preventDefault ( ) ; // dispatchEvent 会回传 false -> 分离环境也能得知环境加载代码已执行
87- this . execEarlyScript ( scriptFlag , detail . scriptInfo ) ;
98+ this . execEarlyScript ( scriptFlag , detail . scriptInfo , envInfo ) ;
8899 }
89100 } ) ;
90101 // 通知 环境 加载完成
91102 // 适用于此「通知环境加载完成」代码执行前的脚本加载
92103 const ev = new CustomEvent ( envLoadCompleteEvtName ) ;
93- window . dispatchEvent ( ev ) ;
104+ performance . dispatchEvent ( ev ) ;
94105 }
95106
96- execEarlyScript ( flag : string , scriptInfo : TScriptInfo ) {
107+ execEarlyScript ( flag : string , scriptInfo : TScriptInfo , envInfo : GMInfoEnv ) {
97108 const scriptFunc = ( window as any ) [ flag ] as ScriptFunc ;
98109 this . execScriptEntry ( {
99110 scriptLoadInfo : scriptInfo ,
100111 scriptFunc : scriptFunc ,
101112 scriptFlag : flag ,
102- envInfo : { } ,
113+ envInfo : envInfo ,
103114 } ) ;
104115 this . earlyScriptFlag . add ( flag ) ;
105116 }
0 commit comments