Browse Source

Wrap localStorage API Access in try-catch (#1241)

Shriram Balaji 5 years ago
parent
commit
22160f50d3
2 changed files with 29 additions and 12 deletions
  1. 6 2
      src/components/TopErrorBoundary.tsx
  2. 23 10
      src/data/localStorage.ts

+ 6 - 2
src/components/TopErrorBoundary.tsx

@@ -81,8 +81,12 @@ export class TopErrorBoundary extends React.Component<
             {t("errorSplash.clearCanvasMessage")}
             <button
               onClick={() => {
-                localStorage.clear();
-                window.location.reload();
+                try {
+                  localStorage.clear();
+                  window.location.reload();
+                } catch (error) {
+                  console.error(error);
+                }
               }}
             >
               {t("errorSplash.clearCanvasMessage_button")}

+ 23 - 10
src/data/localStorage.ts

@@ -10,19 +10,32 @@ export function saveToLocalStorage(
   elements: readonly ExcalidrawElement[],
   appState: AppState,
 ) {
-  localStorage.setItem(
-    LOCAL_STORAGE_KEY,
-    JSON.stringify(elements.filter((element) => !element.isDeleted)),
-  );
-  localStorage.setItem(
-    LOCAL_STORAGE_KEY_STATE,
-    JSON.stringify(clearAppStateForLocalStorage(appState)),
-  );
+  try {
+    localStorage.setItem(
+      LOCAL_STORAGE_KEY,
+      JSON.stringify(elements.filter((element) => !element.isDeleted)),
+    );
+    localStorage.setItem(
+      LOCAL_STORAGE_KEY_STATE,
+      JSON.stringify(clearAppStateForLocalStorage(appState)),
+    );
+  } catch (error) {
+    // Unable to access window.localStorage
+    console.error(error);
+  }
 }
 
 export function restoreFromLocalStorage() {
-  const savedElements = localStorage.getItem(LOCAL_STORAGE_KEY);
-  const savedState = localStorage.getItem(LOCAL_STORAGE_KEY_STATE);
+  let savedElements = null;
+  let savedState = null;
+
+  try {
+    savedElements = localStorage.getItem(LOCAL_STORAGE_KEY);
+    savedState = localStorage.getItem(LOCAL_STORAGE_KEY_STATE);
+  } catch (error) {
+    // Unable to access localStorage
+    console.error(error);
+  }
 
   let elements = [];
   if (savedElements) {