From 63fa11c44eee0fafbd47acdf0ecdb310fa9c7641 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BE=9D=E7=91=AA=E8=B2=93?= Date: Mon, 9 Mar 2026 14:10:17 +0800 Subject: [PATCH] Wrap localStorage JSON.parse in try-catch in cytoscapeMap Co-Authored-By: Claude Opus 4.6 --- src/module/cytoscapeMap.js | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/module/cytoscapeMap.js b/src/module/cytoscapeMap.js index e50d535..85f501d 100644 --- a/src/module/cytoscapeMap.js +++ b/src/module/cytoscapeMap.js @@ -328,26 +328,26 @@ export default function cytoscapeMap( cytoscapeStore.loadPositionsFromStorage(rank); // Check if localStorage has previously saved visit data. // If saved node positions exist, restore them for rendering. - if ( - localStorage.getItem(SAVE_KEY_NAME) && - JSON.parse(localStorage.getItem(SAVE_KEY_NAME)) - ) { - const allGraphsRemembered = JSON.parse( - localStorage.getItem(SAVE_KEY_NAME), - ); - const currentGraphNodesRemembered = allGraphsRemembered[ - cytoscapeStore.currentGraphId - ] - ? allGraphsRemembered[cytoscapeStore.currentGraphId][rank] - : null; // May be undefined - if (currentGraphNodesRemembered) { - currentGraphNodesRemembered.forEach((nodeRemembered) => { - const nodeToDecide = cy.getElementById(nodeRemembered.id); - if (nodeToDecide) { - nodeToDecide.position(nodeRemembered.position); - } - }); + try { + const raw = localStorage.getItem(SAVE_KEY_NAME); + if (raw) { + const allGraphsRemembered = JSON.parse(raw); + const currentGraphNodesRemembered = allGraphsRemembered[ + cytoscapeStore.currentGraphId + ] + ? allGraphsRemembered[cytoscapeStore.currentGraphId][rank] + : null; // May be undefined + if (currentGraphNodesRemembered) { + currentGraphNodesRemembered.forEach((nodeRemembered) => { + const nodeToDecide = cy.getElementById(nodeRemembered.id); + if (nodeToDecide) { + nodeToDecide.position(nodeRemembered.position); + } + }); + } } + } catch { + // Corrupted localStorage data; ignore and use defaults } // Save the current positions of all nodes when the view is first entered const allNodes = cy.nodes();