@@ -992,21 +992,16 @@ def test_process_frame_returns_none_on_script_injection_failure(self):
992992
993993 self .assertIsNone (result )
994994
995- def test_get_serialized_dom_stitches_cross_origin_iframes (self ):
996- """get_serialized_dom stitches cross-origin iframe HTML into srcdoc."""
995+ def test_get_serialized_dom_populates_cors_iframes (self ):
997996 driver = Mock ()
998- # process_frame calls execute_script twice inside the iframe:
999- # 1. inject percy_dom_script 2. serialize the frame DOM
1000997 driver .execute_script .side_effect = [
1001998 {
1002999 "html" : '<html><body><iframe data-percy-element-id="cid-1"></iframe></body></html>' ,
1003- "resources" : [{"url" : "https://cdn/main.css" , "content" : "m" }]
1004- }, # main page serialize (get_serialized_dom)
1005- None , # inject percy_dom_script into frame
1000+ "resources" : [{"url" : "https://cdn/main.css" , "content" : "m" }]},
1001+ None ,
10061002 {
10071003 "html" : "<iframe-html/>" ,
1008- "resources" : [{"url" : "https://cdn/frame.css" , "content" : "f" }]
1009- }, # frame DOM serialize
1004+ "resources" : [{"url" : "https://cdn/frame.css" , "content" : "f" }]},
10101005 ]
10111006 driver .current_url = "http://main.example.com/"
10121007
@@ -1022,11 +1017,14 @@ def test_get_serialized_dom_stitches_cross_origin_iframes(self):
10221017
10231018 dom = local .get_serialized_dom (driver , [], percy_dom_script = "some_script" )
10241019
1025- self .assertNotIn ("corsIframes" , dom )
1026- self .assertIn ('data-percy-element-id="cid-1"' , dom ["html" ])
1027- self .assertIn ('srcdoc="<iframe-html/>"' , dom ["html" ])
1028- urls = [resource ["url" ] for resource in dom ["resources" ]]
1029- self .assertEqual (urls , ["https://cdn/main.css" , "https://cdn/frame.css" ])
1020+ self .assertIn ("corsIframes" , dom )
1021+ self .assertEqual (len (dom ["corsIframes" ]), 1 )
1022+ entry = dom ["corsIframes" ][0 ]
1023+ self .assertEqual (entry ["iframeData" ]["percyElementId" ], "cid-1" )
1024+ self .assertEqual (entry ["iframeSnapshot" ]["html" ], "<iframe-html/>" )
1025+ self .assertEqual (entry ["frameUrl" ], "https://cross.example.com/page" )
1026+ # HTML is left unchanged (no srcdoc injection here — core handles that)
1027+ self .assertNotIn ("srcdoc" , dom ["html" ])
10301028
10311029 def test_get_serialized_dom_skips_blank_src_frames (self ):
10321030 """Frames with no src or src='about:blank' are not processed."""
@@ -1044,7 +1042,7 @@ def test_get_serialized_dom_skips_blank_src_frames(self):
10441042
10451043 dom = local .get_serialized_dom (driver , [], percy_dom_script = "some_script" )
10461044
1047- self .assertNotIn ("srcdoc= " , dom [ "html" ] )
1045+ self .assertNotIn ("corsIframes " , dom )
10481046
10491047 def test_get_serialized_dom_no_cors_iframes_without_script (self ):
10501048 """Without a percy_dom_script, cross-origin iframes are not processed."""
@@ -1062,7 +1060,7 @@ def test_get_serialized_dom_no_cors_iframes_without_script(self):
10621060
10631061 dom = local .get_serialized_dom (driver , [], percy_dom_script = None )
10641062
1065- self .assertNotIn ("srcdoc= " , dom [ "html" ] )
1063+ self .assertNotIn ("corsIframes " , dom )
10661064
10671065 def test_get_serialized_dom_cookies_always_attached (self ):
10681066 """Cookies are always added to the dom_snapshot regardless of iframes."""
@@ -1096,7 +1094,8 @@ def test_get_serialized_dom_same_host_different_scheme_is_cross_origin(self):
10961094
10971095 dom = local .get_serialized_dom (driver , [], percy_dom_script = "script" )
10981096
1099- self .assertIn ('srcdoc="<frame/>"' , dom ["html" ])
1097+ self .assertIn ("corsIframes" , dom )
1098+ self .assertEqual (dom ["corsIframes" ][0 ]["iframeSnapshot" ]["html" ], "<frame/>" )
11001099
11011100 def test_get_serialized_dom_same_host_different_port_is_cross_origin (self ):
11021101 """http://example.com:3000 and http://example.com:4000 differ in port → cross-origin."""
@@ -1116,7 +1115,8 @@ def test_get_serialized_dom_same_host_different_port_is_cross_origin(self):
11161115
11171116 dom = local .get_serialized_dom (driver , [], percy_dom_script = "script" )
11181117
1119- self .assertIn ('srcdoc="<frame/>"' , dom ["html" ])
1118+ self .assertIn ("corsIframes" , dom )
1119+ self .assertEqual (dom ["corsIframes" ][0 ]["iframeSnapshot" ]["html" ], "<frame/>" )
11201120
11211121 def test_get_serialized_dom_same_origin_is_not_cross_origin (self ):
11221122 """http://main.example.com/page1 and http://main.example.com/page2 share origin."""
@@ -1132,7 +1132,7 @@ def test_get_serialized_dom_same_origin_is_not_cross_origin(self):
11321132
11331133 dom = local .get_serialized_dom (driver , [], percy_dom_script = "script" )
11341134
1135- self .assertNotIn ("srcdoc= " , dom [ "html" ] )
1135+ self .assertNotIn ("corsIframes " , dom )
11361136
11371137 def test_process_frame_passes_enable_javascript_option (self ):
11381138 """process_frame serializes the frame with enableJavaScript=True, mirroring
@@ -1169,31 +1169,30 @@ def test_process_frame_uses_unknown_src_fallback(self):
11691169 self .assertIsNotNone (result )
11701170 self .assertEqual (result ["frameUrl" ], "unknown-src" )
11711171
1172- def test_stitch_cors_iframes_injects_srcdoc_and_merges_resources (self ):
1173- """stitch_cors_iframes injects iframe HTML into srcdoc and deduplicates resources by URL."""
1174- dom_snapshot = {
1175- "html" : '<html><body><iframe data-percy-element-id="cid-1"></iframe></body></html>' ,
1176- "resources" : [{"url" : "https://cdn/main.css" , "content" : "m" }]
1177- }
1178- processed_frames = [{
1179- "iframeData" : {"percyElementId" : "cid-1" },
1180- "iframeSnapshot" : {
1181- "html" : '<html><body><h1>F & "Q"</h1></body></html>' ,
1182- "resources" : [
1183- {"url" : "https://cdn/main.css" , "content" : "dup" },
1184- {"url" : "https://cdn/frame.css" , "content" : "f" }
1185- ]
1186- }
1187- }]
1172+ def test_get_serialized_dom_corsIframes_entry_has_correct_structure (self ):
1173+ dom_html = '<html><body><iframe data-percy-element-id="cid-1"></iframe></body></html>'
1174+ frame_resource = {"url" : "https://cdn/frame.css" , "content" : "f" }
1175+ driver = Mock ()
1176+ driver .execute_script .side_effect = [
1177+ {"html" : dom_html , "resources" : []},
1178+ None ,
1179+ {"html" : '<html><body><h1>Frame</h1></body></html>' , "resources" : [frame_resource ]},
1180+ ]
1181+ driver .current_url = "http://main.example.com/"
1182+ frame = Mock ()
1183+ frame .get_attribute = lambda attr : (
1184+ "https://cross.example.com/page" if attr == 'src' else "cid-1"
1185+ )
1186+ driver .find_elements .return_value = [frame ]
11881187
1189- stitched = local .stitch_cors_iframes ( dom_snapshot , processed_frames )
1188+ dom = local .get_serialized_dom ( driver , [], percy_dom_script = "some_script" )
11901189
1191- self .assertIn (
1192- 'srcdoc="<html><body><h1>F & "Q"</h1></body></html>"' ,
1193- stitched [ "html" ]
1194- )
1195- urls = [ resource [ "url" ] for resource in stitched [ "resources" ]]
1196- self .assertEqual ( urls , [ "https://cdn/main.css" , "https://cdn/frame.css " ])
1190+ self .assertIn ("corsIframes" , dom )
1191+ entry = dom [ "corsIframes" ][ 0 ]
1192+ self . assertEqual ( entry [ "frameUrl" ], "https://cross.example.com/page" )
1193+ self . assertEqual ( entry [ "iframeData" ], { "percyElementId" : "cid-1" } )
1194+ self . assertIn ( "Frame" , entry [ "iframeSnapshot" ][ "html" ])
1195+ self .assertIn ( frame_resource , entry [ "iframeSnapshot" ][ "resources " ])
11971196
11981197 def test_get_serialized_dom_multiple_cross_origin_frames (self ):
11991198 """All cross-origin frames are collected; same-origin frames are skipped."""
@@ -1225,9 +1224,12 @@ def test_get_serialized_dom_multiple_cross_origin_frames(self):
12251224
12261225 dom = local .get_serialized_dom (driver , [], percy_dom_script = "script" )
12271226
1228- self .assertIn ('data-percy-element-id="pid-1" srcdoc="<frame1/>"' , dom ["html" ])
1229- self .assertIn ('data-percy-element-id="pid-2" srcdoc="<frame2/>"' , dom ["html" ])
1230- self .assertNotIn ('data-percy-element-id="pid-same" srcdoc=' , dom ["html" ])
1227+ self .assertIn ("corsIframes" , dom )
1228+ self .assertEqual (len (dom ["corsIframes" ]), 2 )
1229+ pids = [e ["iframeData" ]["percyElementId" ] for e in dom ["corsIframes" ]]
1230+ self .assertIn ("pid-1" , pids )
1231+ self .assertIn ("pid-2" , pids )
1232+ self .assertNotIn ("pid-same" , pids )
12311233
12321234 def test_get_serialized_dom_handles_find_elements_exception (self ):
12331235 """If find_elements raises, the error is swallowed, cookies are still attached,
@@ -1240,7 +1242,7 @@ def test_get_serialized_dom_handles_find_elements_exception(self):
12401242 dom = local .get_serialized_dom (driver , [{"name" : "k" , "value" : "v" }],
12411243 percy_dom_script = "script" )
12421244
1243- self .assertNotIn ("srcdoc= " , dom [ "html" ] )
1245+ self .assertNotIn ("corsIframes " , dom )
12441246 self .assertEqual (dom ["cookies" ], [{"name" : "k" , "value" : "v" }])
12451247
12461248 def test_get_serialized_dom_process_frame_failure_is_skipped (self ):
@@ -1270,8 +1272,10 @@ def test_get_serialized_dom_process_frame_failure_is_skipped(self):
12701272
12711273 dom = local .get_serialized_dom (driver , [], percy_dom_script = "script" )
12721274
1273- self .assertIn ('data-percy-element-id="pid-ok" srcdoc="<ok/>"' , dom ["html" ])
1274- self .assertNotIn ('data-percy-element-id="pid-fail" srcdoc=' , dom ["html" ])
1275+ self .assertIn ("corsIframes" , dom )
1276+ self .assertEqual (len (dom ["corsIframes" ]), 1 )
1277+ self .assertEqual (dom ["corsIframes" ][0 ]["iframeData" ]["percyElementId" ], "pid-ok" )
1278+ self .assertEqual (dom ["corsIframes" ][0 ]["iframeSnapshot" ]["html" ], "<ok/>" )
12751279
12761280
12771281class TestCreateRegion (unittest .TestCase ):
0 commit comments