@@ -416,7 +416,12 @@ describe.concurrent("GM_value", () => {
416416 // 设置再删除
417417 GM_setValue("a", undefined);
418418 let ret2 = GM_getValue("a", 456);
419- return {ret1, ret2};
419+ // 设置错误的对象
420+ GM_setValue("proxy-key", new Proxy({}, {}));
421+ let ret3 = GM_getValue("proxy-key");
422+ GM_setValue("window",window);
423+ let ret4 = GM_getValue("window");
424+ return {ret1, ret2, ret3, ret4};
420425 ` ;
421426 const mockSendMessage = vi . fn ( ) . mockResolvedValue ( { code : 0 } ) ;
422427 const mockMessage = {
@@ -428,7 +433,7 @@ describe.concurrent("GM_value", () => {
428433 const ret = await exec . exec ( ) ;
429434
430435 expect ( mockSendMessage ) . toHaveBeenCalled ( ) ;
431- expect ( mockSendMessage ) . toHaveBeenCalledTimes ( 2 ) ;
436+ expect ( mockSendMessage ) . toHaveBeenCalledTimes ( 4 ) ;
432437
433438 // 第一次调用:设置值为 123
434439 expect ( mockSendMessage ) . toHaveBeenNthCalledWith (
@@ -458,11 +463,45 @@ describe.concurrent("GM_value", () => {
458463 } )
459464 ) ;
460465
461- expect ( ret ) . toEqual ( { ret1 : 123 , ret2 : 456 } ) ;
466+ // 第三次调用:设置值为 Proxy 对象(应失败)
467+ expect ( mockSendMessage ) . toHaveBeenNthCalledWith (
468+ 3 ,
469+ expect . objectContaining ( {
470+ action : "content/runtime/gmApi" ,
471+ data : {
472+ api : "GM_setValue" ,
473+ params : [ expect . any ( String ) , "proxy-key" , { } ] , // Proxy 会被转换为空对象
474+ runFlag : expect . any ( String ) ,
475+ uuid : undefined ,
476+ } ,
477+ } )
478+ ) ;
479+
480+ // 第四次调用:设置值为 window 对象(应失败)
481+ expect ( mockSendMessage ) . toHaveBeenNthCalledWith (
482+ 4 ,
483+ expect . objectContaining ( {
484+ action : "content/runtime/gmApi" ,
485+ data : {
486+ api : "GM_setValue" ,
487+ params : [ expect . any ( String ) , "window" ] , // window 会被转换为空对象
488+ runFlag : expect . any ( String ) ,
489+ uuid : undefined ,
490+ } ,
491+ } )
492+ ) ;
493+
494+ expect ( ret ) . toEqual ( {
495+ ret1 : 123 ,
496+ ret2 : 456 ,
497+ ret3 : { } ,
498+ ret4 : undefined ,
499+ } ) ;
462500 } ) ;
463501
464502 it . concurrent ( "value引用问题 #1141" , async ( ) => {
465503 const script = Object . assign ( { } , scriptRes ) as ScriptLoadInfo ;
504+ script . value = { } ;
466505 script . metadata . grant = [ "GM_getValue" , "GM_setValue" , "GM_getValues" ] ;
467506 script . code = `
468507const value1 = {
@@ -622,7 +661,12 @@ return { value1, value2, value3, values1,values2, allValues1, allValues2, value4
622661 // 设置再删除
623662 GM_setValues({"a": undefined, "c": undefined});
624663 let ret2 = GM_getValues(["a","b","c"]);
625- return {ret1, ret2};
664+ // 设置错误的对象
665+ GM_setValues({"proxy-key": new Proxy({}, {})});
666+ let ret3 = GM_getValues(["proxy-key"]);
667+ GM_setValues({"window": window});
668+ let ret4 = GM_getValues(["window"]);
669+ return {ret1, ret2, ret3, ret4};
626670 ` ;
627671 const mockSendMessage = vi . fn ( ) . mockResolvedValue ( { code : 0 } ) ;
628672 const mockMessage = {
@@ -634,7 +678,7 @@ return { value1, value2, value3, values1,values2, allValues1, allValues2, value4
634678 const ret = await exec . exec ( ) ;
635679
636680 expect ( mockSendMessage ) . toHaveBeenCalled ( ) ;
637- expect ( mockSendMessage ) . toHaveBeenCalledTimes ( 2 ) ;
681+ expect ( mockSendMessage ) . toHaveBeenCalledTimes ( 4 ) ;
638682
639683 // 第一次调用:设置值为 123
640684 expect ( mockSendMessage ) . toHaveBeenNthCalledWith (
@@ -687,7 +731,60 @@ return { value1, value2, value3, values1,values2, allValues1, allValues2, value4
687731 } )
688732 ) ;
689733
690- expect ( ret ) . toEqual ( { ret1 : { a : 123 , b : 456 , c : "789" } , ret2 : { b : 456 } } ) ;
734+ // 第三次调用:设置值为 Proxy 对象(应失败)
735+ expect ( mockSendMessage ) . toHaveBeenNthCalledWith (
736+ 3 ,
737+ expect . objectContaining ( {
738+ action : "content/runtime/gmApi" ,
739+ data : {
740+ api : "GM_setValues" ,
741+ params : [
742+ // event id
743+ expect . stringMatching ( / ^ .+ : : \d + $ / ) ,
744+ // the object payload
745+ expect . objectContaining ( {
746+ k : expect . stringMatching ( / ^ # # [ \d . ] + # # $ / ) ,
747+ m : expect . objectContaining ( {
748+ "proxy-key" : { } ,
749+ } ) ,
750+ } ) ,
751+ ] ,
752+ runFlag : expect . any ( String ) ,
753+ uuid : undefined ,
754+ } ,
755+ } )
756+ ) ;
757+
758+ // 第四次调用:设置值为 window 对象(应失败)
759+ expect ( mockSendMessage ) . toHaveBeenNthCalledWith (
760+ 4 ,
761+ expect . objectContaining ( {
762+ action : "content/runtime/gmApi" ,
763+ data : {
764+ api : "GM_setValues" ,
765+ params : [
766+ // event id
767+ expect . stringMatching ( / ^ .+ : : \d + $ / ) ,
768+ // the object payload
769+ expect . objectContaining ( {
770+ k : expect . stringMatching ( / ^ # # [ \d . ] + # # $ / ) ,
771+ m : expect . objectContaining ( {
772+ window : expect . stringMatching ( / ^ # # [ \d . ] + # # u n d e f i n e d $ / ) ,
773+ } ) ,
774+ } ) ,
775+ ] ,
776+ runFlag : expect . any ( String ) ,
777+ uuid : undefined ,
778+ } ,
779+ } )
780+ ) ;
781+
782+ expect ( ret ) . toEqual ( {
783+ ret1 : { a : 123 , b : 456 , c : "789" } ,
784+ ret2 : { b : 456 } ,
785+ ret3 : { "proxy-key" : { } } ,
786+ ret4 : { window : undefined } ,
787+ } ) ;
691788 } ) ;
692789
693790 it . concurrent ( "GM_deleteValue" , async ( ) => {
0 commit comments