@@ -1942,15 +1942,15 @@ def end_headers(self):
19421942    def  do_POST (self ):
19431943      urlinfo  =  urlparse (self .path )
19441944      query  =  parse_qs (urlinfo .query )
1945-       # Mirror behaviour of emrun which is to write POST'd files to dump_out/ by default 
19461945      if  query ['file' ]:
19471946        print ('do_POST: got file: %s'  %  query ['file' ])
1948-         ensure_dir ('dump_out' )
1949-         filename  =  os .path .join ('dump_out' , query ['file' ][0 ])
1947+         filename  =  query ['file' ][0 ]
19501948        contentLength  =  int (self .headers ['Content-Length' ])
19511949        create_file (filename , self .rfile .read (contentLength ), binary = True )
19521950        self .send_response (200 )
19531951        self .end_headers ()
1952+       else :
1953+         print (f'do_POST: unexpected POST: { urlinfo .query }  )
19541954
19551955    def  do_GET (self ):
19561956      if  self .path  ==  '/run_harness' :
@@ -2237,15 +2237,32 @@ def make_reftest(self, expected, manually_trigger=False):
22372237                total += Math.abs(expected[y*width*4 + x*4 + 2] - actual[y*width*4 + x*4 + 2]); 
22382238              } 
22392239            } 
2240-             var wrong = Math.floor(total / (img.width*img.height*3)); // floor, to allow some margin of error for antialiasing 
2241-             // If the main JS file is in a worker, or modularize, then we need to supply our own reporting logic. 
2242-             if (typeof reportResultToServer === 'undefined') { 
2243-               (() => { 
2244-                 %s 
2245-                 reportResultToServer(wrong); 
2246-               })(); 
2240+             // floor, to allow some margin of error for antialiasing 
2241+             var wrong = Math.floor(total / (img.width*img.height*3)); 
2242+ 
2243+             function reportResult(result) { 
2244+               // If the main JS file is in a worker, or modularize, then we need to supply our own 
2245+               // reporting logic. 
2246+               if (typeof reportResultToServer === 'undefined') { 
2247+                 (() => { 
2248+                   %s 
2249+                   reportResultToServer(result); 
2250+                 })(); 
2251+               } else { 
2252+                 reportResultToServer(result); 
2253+               } 
2254+             } 
2255+ 
2256+             var rebaseline = %s; 
2257+             if (wrong || rebaseline) { 
2258+               // Generate a png of the actual rendered image and send it back 
2259+               // to the server. 
2260+               Module.canvas.toBlob((blob) => { 
2261+                 sendFileToServer('actual.png', blob); 
2262+                 reportResult(wrong); 
2263+               }) 
22472264            } else { 
2248-               reportResultToServer (wrong); 
2265+               reportResult (wrong); 
22492266            } 
22502267          }; 
22512268          actualImage.src = actualUrl; 
@@ -2256,7 +2273,8 @@ def make_reftest(self, expected, manually_trigger=False):
22562273      /** @suppress {uselessCode} */ 
22572274      function setupRefTest() { 
22582275        // Automatically trigger the reftest? 
2259-         if (!%s) { 
2276+         var manuallyTrigger = %s; 
2277+         if (!manuallyTrigger) { 
22602278          // Yes, automatically 
22612279
22622280          Module['postRun'] = doReftest; 
@@ -2293,7 +2311,7 @@ def make_reftest(self, expected, manually_trigger=False):
22932311      } 
22942312
22952313      setupRefTest(); 
2296- '''  %  (reporting , int (manually_trigger )))
2314+ '''  %  (reporting , EMTEST_REBASELINE ,  int (manually_trigger )))
22972315
22982316  def  compile_btest (self , filename , args , reporting = Reporting .FULL ):
22992317    # Inject support code for reporting results. This adds an include a header so testcases can 
@@ -2334,7 +2352,12 @@ def reftest(self, filename, reference, reference_slack=0, manual_reference=False
23342352      kwargs .setdefault ('args' , [])
23352353      kwargs ['args' ] +=  ['--pre-js' , 'reftest.js' , '-sGL_TESTING' ]
23362354
2337-     return  self .btest (filename , expected = expected , * args , ** kwargs )
2355+     try :
2356+       return  self .btest (filename , expected = expected , * args , ** kwargs )
2357+     finally :
2358+       if  EMTEST_REBASELINE  and  os .path .exists ('actual.png' ):
2359+         print (f'overwriting expected image: { reference }  )
2360+         self .run_process ('pngcrush -rem gAMA -rem cHRM -rem iCCP -rem sRGB actual.png' .split () +  [reference ])
23382361
23392362  def  btest_exit (self , filename , assert_returncode = 0 , * args , ** kwargs ):
23402363    """Special case of `btest` that reports its result solely via exiting 
0 commit comments