]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
Fix: delay iframe DOM removal for print in FF
authorshamoon <4887959+shamoon@users.noreply.github.com>
Thu, 30 Oct 2025 21:54:28 +0000 (14:54 -0700)
committershamoon <4887959+shamoon@users.noreply.github.com>
Fri, 31 Oct 2025 00:00:15 +0000 (17:00 -0700)
src-ui/src/app/components/document-detail/document-detail.component.spec.ts
src-ui/src/app/components/document-detail/document-detail.component.ts

index 752df3b21c73e0ef545c31e161cd262fb54c9ce8..db537e1b28dce86cd69e42585ae7d5f91b9b5e93 100644 (file)
@@ -1489,6 +1489,8 @@ describe('DocumentDetailComponent', () => {
       mockContentWindow.onafterprint(new Event('afterprint'))
     }
 
+    tick(500)
+
     expect(removeChildSpy).toHaveBeenCalledWith(mockIframe)
     expect(revokeObjectURLSpy).toHaveBeenCalledWith('blob:mock-url')
 
@@ -1563,6 +1565,8 @@ describe('DocumentDetailComponent', () => {
       mockIframe.onload(new Event('load'))
     }
 
+    tick(500)
+
     expect(toastSpy).toHaveBeenCalled()
     expect(removeChildSpy).toHaveBeenCalledWith(mockIframe)
     expect(revokeObjectURLSpy).toHaveBeenCalledWith('blob:mock-url')
index 48ddf61e5b100664162f609ee3b27827bf3a1c9a..4e0d3259f8ac62b0b507cc7af6e826b14350b442 100644 (file)
@@ -21,7 +21,7 @@ import { dirtyCheck, DirtyComponent } from '@ngneat/dirty-check-forms'
 import { PDFDocumentProxy, PdfViewerModule } from 'ng2-pdf-viewer'
 import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons'
 import { DeviceDetectorService } from 'ngx-device-detector'
-import { BehaviorSubject, Observable, of, Subject } from 'rxjs'
+import { BehaviorSubject, Observable, of, Subject, timer } from 'rxjs'
 import {
   catchError,
   debounceTime,
@@ -1448,13 +1448,19 @@ export class DocumentDetailComponent
               iframe.contentWindow.focus()
               iframe.contentWindow.print()
               iframe.contentWindow.onafterprint = () => {
-                document.body.removeChild(iframe)
-                URL.revokeObjectURL(blobUrl)
+                timer(500).subscribe(() => {
+                  // delay to avoid print failure
+                  document.body.removeChild(iframe)
+                  URL.revokeObjectURL(blobUrl)
+                })
               }
             } catch (err) {
               this.toastService.showError($localize`Print failed.`, err)
-              document.body.removeChild(iframe)
-              URL.revokeObjectURL(blobUrl)
+              timer(500).subscribe(() => {
+                // delay to avoid print failure
+                document.body.removeChild(iframe)
+                URL.revokeObjectURL(blobUrl)
+              })
             }
           }
         },