]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
Fix: catch sessionStorage errors for large documents (#6150)
authorshamoon <4887959+shamoon@users.noreply.github.com>
Thu, 21 Mar 2024 13:31:25 +0000 (06:31 -0700)
committerGitHub <noreply@github.com>
Thu, 21 Mar 2024 13:31:25 +0000 (06:31 -0700)
src-ui/setup-jest.ts
src-ui/src/app/services/open-documents.service.spec.ts
src-ui/src/app/services/open-documents.service.ts

index 39f018c6df216e088a6d317c308a2c2a991b7f9c..8e754589b614da18869ba78a8b3f581c5d7e448a 100644 (file)
@@ -76,7 +76,10 @@ const mock = () => {
   let storage: { [key: string]: string } = {}
   return {
     getItem: (key: string) => (key in storage ? storage[key] : null),
-    setItem: (key: string, value: string) => (storage[key] = value || ''),
+    setItem: (key: string, value: string) => {
+      if (value.length > 1000000) throw new Error('localStorage overflow')
+      storage[key] = value || ''
+    },
     removeItem: (key: string) => delete storage[key],
     clear: () => (storage = {}),
   }
index 69d2a4a37fa685387ce4024a2c2db1e5c89d9db1..09341da623cc58f396c02b7dbf994e167ace299b 100644 (file)
@@ -5,10 +5,11 @@ import {
   HttpTestingController,
 } from '@angular/common/http/testing'
 import { environment } from 'src/environments/environment'
-import { Subscription } from 'rxjs'
+import { Subscription, throwError } from 'rxjs'
 import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
 import { ConfirmDialogComponent } from '../components/common/confirm-dialog/confirm-dialog.component'
 import { OPEN_DOCUMENT_SERVICE } from '../data/storage-keys'
+import { wind } from 'ngx-bootstrap-icons'
 
 const documents = [
   {
@@ -233,4 +234,12 @@ describe('OpenDocumentsService', () => {
     req.error(new ErrorEvent('timeout'))
     expect(openDocumentsService.getOpenDocuments()).toHaveLength(0)
   })
+
+  it('should log error on sessionStorage save', () => {
+    const doc = { ...documents[0] }
+    doc.content = 'a'.repeat(1000000)
+    const consoleSpy = jest.spyOn(console, 'error').mockImplementation()
+    openDocumentsService.openDocument(doc)
+    expect(consoleSpy).toHaveBeenCalled()
+  })
 })
index 71b1586fdfa056b7606d41918c7cc32a2303b3bb..363a51b037aada26e637df85e9ba9218f58732b7 100644 (file)
@@ -152,9 +152,13 @@ export class OpenDocumentsService {
   }
 
   save() {
-    sessionStorage.setItem(
-      OPEN_DOCUMENT_SERVICE.DOCUMENTS,
-      JSON.stringify(this.openDocuments)
-    )
+    try {
+      sessionStorage.setItem(
+        OPEN_DOCUMENT_SERVICE.DOCUMENTS,
+        JSON.stringify(this.openDocuments)
+      )
+    } catch (e) {
+      console.error('Error saving open documents to session storage', e)
+    }
   }
 }