@@ -440,7 +440,12 @@ describe.concurrent("GM_value", () => {
440440 // 设置再删除
441441 GM_setValue("a", undefined);
442442 let ret2 = GM_getValue("a", 456);
443- return {ret1, ret2};
443+ // 设置错误的对象
444+ GM_setValue("proxy-key", new Proxy({}, {}));
445+ let ret3 = GM_getValue("proxy-key");
446+ GM_setValue("window",window);
447+ let ret4 = GM_getValue("window");
448+ return {ret1, ret2, ret3, ret4};
444449 ` ;
445450 const mockSendMessage = vi . fn ( ) . mockResolvedValue ( { code : 0 } ) ;
446451 const mockMessage = {
@@ -452,7 +457,7 @@ describe.concurrent("GM_value", () => {
452457 const ret = await exec . exec ( ) ;
453458
454459 expect ( mockSendMessage ) . toHaveBeenCalled ( ) ;
455- expect ( mockSendMessage ) . toHaveBeenCalledTimes ( 2 ) ;
460+ expect ( mockSendMessage ) . toHaveBeenCalledTimes ( 4 ) ;
456461
457462 // 第一次调用:设置值为 123
458463 expect ( mockSendMessage ) . toHaveBeenNthCalledWith (
@@ -482,11 +487,45 @@ describe.concurrent("GM_value", () => {
482487 } )
483488 ) ;
484489
485- expect ( ret ) . toEqual ( { ret1 : 123 , ret2 : 456 } ) ;
490+ // 第三次调用:设置值为 Proxy 对象(应失败)
491+ expect ( mockSendMessage ) . toHaveBeenNthCalledWith (
492+ 3 ,
493+ expect . objectContaining ( {
494+ action : "content/runtime/gmApi" ,
495+ data : {
496+ api : "GM_setValue" ,
497+ params : [ expect . any ( String ) , "proxy-key" , { } ] , // Proxy 会被转换为空对象
498+ runFlag : expect . any ( String ) ,
499+ uuid : undefined ,
500+ } ,
501+ } )
502+ ) ;
503+
504+ // 第四次调用:设置值为 window 对象(应失败)
505+ expect ( mockSendMessage ) . toHaveBeenNthCalledWith (
506+ 4 ,
507+ expect . objectContaining ( {
508+ action : "content/runtime/gmApi" ,
509+ data : {
510+ api : "GM_setValue" ,
511+ params : [ expect . any ( String ) , "window" ] , // window 会被转换为空对象
512+ runFlag : expect . any ( String ) ,
513+ uuid : undefined ,
514+ } ,
515+ } )
516+ ) ;
517+
518+ expect ( ret ) . toEqual ( {
519+ ret1 : 123 ,
520+ ret2 : 456 ,
521+ ret3 : { } ,
522+ ret4 : undefined ,
523+ } ) ;
486524 } ) ;
487525
488526 it . concurrent ( "value引用问题 #1141" , async ( ) => {
489527 const script = Object . assign ( { } , scriptRes ) as ScriptLoadInfo ;
528+ script . value = { } ;
490529 script . metadata . grant = [ "GM_getValue" , "GM_setValue" , "GM_getValues" ] ;
491530 script . code = `
492531const value1 = {
@@ -646,7 +685,12 @@ return { value1, value2, value3, values1,values2, allValues1, allValues2, value4
646685 // 设置再删除
647686 GM_setValues({"a": undefined, "c": undefined});
648687 let ret2 = GM_getValues(["a","b","c"]);
649- return {ret1, ret2};
688+ // 设置错误的对象
689+ GM_setValues({"proxy-key": new Proxy({}, {})});
690+ let ret3 = GM_getValues(["proxy-key"]);
691+ GM_setValues({"window": window});
692+ let ret4 = GM_getValues(["window"]);
693+ return {ret1, ret2, ret3, ret4};
650694 ` ;
651695 const mockSendMessage = vi . fn ( ) . mockResolvedValue ( { code : 0 } ) ;
652696 const mockMessage = {
@@ -658,7 +702,7 @@ return { value1, value2, value3, values1,values2, allValues1, allValues2, value4
658702 const ret = await exec . exec ( ) ;
659703
660704 expect ( mockSendMessage ) . toHaveBeenCalled ( ) ;
661- expect ( mockSendMessage ) . toHaveBeenCalledTimes ( 2 ) ;
705+ expect ( mockSendMessage ) . toHaveBeenCalledTimes ( 4 ) ;
662706
663707 const keyValuePairs1 = [
664708 [ "a" , encodeRValue ( 123 ) ] ,
@@ -709,7 +753,60 @@ return { value1, value2, value3, values1,values2, allValues1, allValues2, value4
709753 } )
710754 ) ;
711755
712- expect ( ret ) . toEqual ( { ret1 : { a : 123 , b : 456 , c : "789" } , ret2 : { b : 456 } } ) ;
756+ // 第三次调用:设置值为 Proxy 对象(应失败)
757+ expect ( mockSendMessage ) . toHaveBeenNthCalledWith (
758+ 3 ,
759+ expect . objectContaining ( {
760+ action : "content/runtime/gmApi" ,
761+ data : {
762+ api : "GM_setValues" ,
763+ params : [
764+ // event id
765+ expect . stringMatching ( / ^ .+ : : \d + $ / ) ,
766+ // the object payload
767+ expect . objectContaining ( {
768+ k : expect . stringMatching ( / ^ # # [ \d . ] + # # $ / ) ,
769+ m : expect . objectContaining ( {
770+ "proxy-key" : { } ,
771+ } ) ,
772+ } ) ,
773+ ] ,
774+ runFlag : expect . any ( String ) ,
775+ uuid : undefined ,
776+ } ,
777+ } )
778+ ) ;
779+
780+ // 第四次调用:设置值为 window 对象(应失败)
781+ expect ( mockSendMessage ) . toHaveBeenNthCalledWith (
782+ 4 ,
783+ expect . objectContaining ( {
784+ action : "content/runtime/gmApi" ,
785+ data : {
786+ api : "GM_setValues" ,
787+ params : [
788+ // event id
789+ expect . stringMatching ( / ^ .+ : : \d + $ / ) ,
790+ // the object payload
791+ expect . objectContaining ( {
792+ k : expect . stringMatching ( / ^ # # [ \d . ] + # # $ / ) ,
793+ m : expect . objectContaining ( {
794+ window : expect . stringMatching ( / ^ # # [ \d . ] + # # u n d e f i n e d $ / ) ,
795+ } ) ,
796+ } ) ,
797+ ] ,
798+ runFlag : expect . any ( String ) ,
799+ uuid : undefined ,
800+ } ,
801+ } )
802+ ) ;
803+
804+ expect ( ret ) . toEqual ( {
805+ ret1 : { a : 123 , b : 456 , c : "789" } ,
806+ ret2 : { b : 456 } ,
807+ ret3 : { "proxy-key" : { } } ,
808+ ret4 : { window : undefined } ,
809+ } ) ;
713810 } ) ;
714811
715812 it . concurrent ( "GM_deleteValue" , async ( ) => {
0 commit comments