]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
Coverage
authorshamoon <4887959+shamoon@users.noreply.github.com>
Thu, 30 Oct 2025 23:59:49 +0000 (16:59 -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

index db537e1b28dce86cd69e42585ae7d5f91b9b5e93..e1bc0bf2baa241df795a3551f7ef842457060fec 100644 (file)
@@ -1577,4 +1577,71 @@ describe('DocumentDetailComponent', () => {
     createObjectURLSpy.mockRestore()
     revokeObjectURLSpy.mockRestore()
   }))
+
+  it('should suppress toast if cross-origin afterprint error occurs', fakeAsync(() => {
+    initNormally()
+
+    const appendChildSpy = jest
+      .spyOn(document.body, 'appendChild')
+      .mockImplementation((node: Node) => node)
+    const removeChildSpy = jest
+      .spyOn(document.body, 'removeChild')
+      .mockImplementation((node: Node) => node)
+    const createObjectURLSpy = jest
+      .spyOn(URL, 'createObjectURL')
+      .mockReturnValue('blob:mock-url')
+    const revokeObjectURLSpy = jest
+      .spyOn(URL, 'revokeObjectURL')
+      .mockImplementation(() => {})
+
+    const toastSpy = jest.spyOn(toastService, 'showError')
+
+    const mockContentWindow = {
+      focus: jest.fn().mockImplementation(() => {
+        throw new DOMException(
+          'Accessing onafterprint triggered a cross-origin violation',
+          'SecurityError'
+        )
+      }),
+      print: jest.fn(),
+      onafterprint: null,
+    }
+
+    const mockIframe: any = {
+      style: {},
+      src: '',
+      onload: null,
+      contentWindow: mockContentWindow,
+    }
+
+    const createElementSpy = jest
+      .spyOn(document, 'createElement')
+      .mockReturnValue(mockIframe as any)
+
+    const blob = new Blob(['test'], { type: 'application/pdf' })
+    component.printDocument()
+
+    const req = httpTestingController.expectOne(
+      `${environment.apiBaseUrl}documents/${doc.id}/download/`
+    )
+    req.flush(blob)
+
+    tick()
+
+    if (mockIframe.onload) {
+      mockIframe.onload(new Event('load'))
+    }
+
+    tick(200)
+
+    expect(toastSpy).not.toHaveBeenCalled()
+    expect(removeChildSpy).toHaveBeenCalledWith(mockIframe)
+    expect(revokeObjectURLSpy).toHaveBeenCalledWith('blob:mock-url')
+
+    createElementSpy.mockRestore()
+    appendChildSpy.mockRestore()
+    removeChildSpy.mockRestore()
+    createObjectURLSpy.mockRestore()
+    revokeObjectURLSpy.mockRestore()
+  }))
 })