55import os
66import subprocess
77import tempfile
8+ import time
89
910import mozinfo
1011from mozlog .formatters .process import strstatus
@@ -31,38 +32,90 @@ def dump_screen(utilityPath, log, prefix="mozilla-test-fail-screenshot_"):
3132
3233 is_structured_log = hasattr (log , "process_exit" )
3334
35+ # Get dir where to write the screenshot file
36+ parent_dir = os .environ .get ("MOZ_UPLOAD_DIR" , None )
37+ if not parent_dir :
38+ log .info ("Failed to retrieve MOZ_UPLOAD_DIR env var" )
39+ return
40+
3441 # Need to figure out which OS-dependent tool to use
3542 if mozinfo .isLinux :
3643 utility = [os .path .join (utilityPath , "screentopng" )]
3744 utilityname = "screentopng"
45+ # Run the capture
46+ try :
47+ tmpfd , imgfilename = tempfile .mkstemp (
48+ prefix = prefix , suffix = ".png" , dir = parent_dir
49+ )
50+ os .close (tmpfd )
51+ if is_structured_log :
52+ log .process_start (utilityname )
53+ returncode = subprocess .call (utility + [imgfilename ])
54+ if is_structured_log :
55+ log .process_exit (utilityname , returncode )
56+ else :
57+ printstatus (utilityname , returncode )
58+ except OSError as err :
59+ log .info ("Failed to start %s for screenshot: %s" % (utility [0 ], err .strerror ))
3860 elif mozinfo .isMac :
39- utility = ["/usr/sbin/screencapture" , "-C" , "-x" , "-t" , "png" ]
4061 utilityname = "screencapture"
62+ trigger_file = "/Users/cltbld/.trigger_screenshot"
63+ launchagent_plist = "/Users/cltbld/Library/LaunchAgents/com.mozilla.screencapture.plist"
64+
65+ # Check if trigger-based system is available (ARM workers)
66+ use_trigger = os .path .exists (launchagent_plist )
67+
68+ try :
69+ tmpfd , imgfilename = tempfile .mkstemp (
70+ prefix = prefix , suffix = ".png" , dir = parent_dir
71+ )
72+ os .close (tmpfd )
73+ if is_structured_log :
74+ log .process_start (utilityname )
75+
76+ if use_trigger :
77+ # Use trigger-based screenshot capture via LaunchAgent (ARM workers)
78+ # Write the desired output path to the trigger file
79+ with open (trigger_file , "w" ) as f :
80+ f .write (imgfilename )
81+ # Wait for the screenshot to be created (up to 5 seconds)
82+ for _ in range (50 ):
83+ if os .path .exists (imgfilename ) and os .path .getsize (imgfilename ) > 0 :
84+ returncode = 0
85+ break
86+ time .sleep (0.1 )
87+ else :
88+ log .info ("Screenshot was not created within timeout" )
89+ returncode = 1
90+ else :
91+ # Use direct screencapture command (Intel workers)
92+ utility = ["/usr/sbin/screencapture" , "-C" , "-x" , "-t" , "png" ]
93+ returncode = subprocess .call (utility + [imgfilename ])
94+
95+ if is_structured_log :
96+ log .process_exit (utilityname , returncode )
97+ else :
98+ printstatus (utilityname , returncode )
99+ except (OSError , IOError ) as err :
100+ log .info ("Failed to capture screenshot: %s" % str (err ))
41101 elif mozinfo .isWin :
42102 utility = [os .path .join (utilityPath , "screenshot.exe" )]
43103 utilityname = "screenshot"
44-
45- # Get dir where to write the screenshot file
46- parent_dir = os .environ .get ("MOZ_UPLOAD_DIR" , None )
47- if not parent_dir :
48- log .info ("Failed to retrieve MOZ_UPLOAD_DIR env var" )
49- return
50-
51- # Run the capture
52- try :
53- tmpfd , imgfilename = tempfile .mkstemp (
54- prefix = prefix , suffix = ".png" , dir = parent_dir
55- )
56- os .close (tmpfd )
57- if is_structured_log :
58- log .process_start (utilityname )
59- returncode = subprocess .call (utility + [imgfilename ])
60- if is_structured_log :
61- log .process_exit (utilityname , returncode )
62- else :
63- printstatus (utilityname , returncode )
64- except OSError as err :
65- log .info ("Failed to start %s for screenshot: %s" % (utility [0 ], err .strerror ))
104+ # Run the capture
105+ try :
106+ tmpfd , imgfilename = tempfile .mkstemp (
107+ prefix = prefix , suffix = ".png" , dir = parent_dir
108+ )
109+ os .close (tmpfd )
110+ if is_structured_log :
111+ log .process_start (utilityname )
112+ returncode = subprocess .call (utility + [imgfilename ])
113+ if is_structured_log :
114+ log .process_exit (utilityname , returncode )
115+ else :
116+ printstatus (utilityname , returncode )
117+ except OSError as err :
118+ log .info ("Failed to start %s for screenshot: %s" % (utility [0 ], err .strerror ))
66119
67120
68121def dump_device_screen (device , log , prefix = "mozilla-test-fail-screenshot_" ):
0 commit comments