Skip to content

Commit 8863763

Browse files
committed
Implement StorageUtil for cross-context storage management and update references in existing scripts
1 parent bd45f20 commit 8863763

File tree

6 files changed

+148
-14
lines changed

6 files changed

+148
-14
lines changed

game/index.html

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,18 @@
33
<link rel="stylesheet" href="Custom.css" />
44
<meta http-equiv="X-Frame-Options" content="DENY" />
55
<title>Plants vs. Zombies - MODDED Official</title>
6+
<script>
7+
// Scale document to 0.9 if running in an extension (localStorage is unavailable)
8+
try {
9+
localStorage.setItem("__test__", "1");
10+
localStorage.removeItem("__test__");
11+
console.log("Not running in an extension, no scaling applied");
12+
} catch (e) {
13+
console.log("Running in an extension, scaling down to 90%");
14+
document.documentElement.style.transform = "scale(0.9)";
15+
document.documentElement.style.transformOrigin = "top center";
16+
}
17+
</script>
618
<link rel="icon" href="https://pvzm.net/game/images/gameicon2.png" type="image/png" />
719
<script>
820
window.addEventListener("beforeunload", function (e) {
@@ -1133,6 +1145,8 @@
11331145
</svg>
11341146
<!-- cloudflare turnstile -->
11351147
<script async defer src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit"></script>
1148+
<!-- storage utility -->
1149+
<script src="js/StorageUtil.js"></script>
11361150
<!-- cfunction -->
11371151
<script src="js/Cfunction.js"></script>
11381152
<script src="js/Welcome.js"></script>

game/js/Cfunction.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ var oS = {
217217
this.HaveFog = 0;
218218

219219
// AutoSun Logic
220-
const savedAutoSun = localStorage.getItem("JSPVZAutoSun");
220+
const savedAutoSun = StorageUtil.getItem("JSPVZAutoSun");
221221
if (savedAutoSun !== null) {
222222
this.AutoSun = parseInt(savedAutoSun);
223223
if (this.AutoSun) {
@@ -2769,7 +2769,7 @@ var CheckAutoSun = function (checkbox) {
27692769
const val = checkbox.checked ? 1 : 0;
27702770
if (val !== oS.AutoSun) {
27712771
oS.AutoSun = val;
2772-
localStorage.setItem("JSPVZAutoSun", val);
2772+
StorageUtil.setItem("JSPVZAutoSun", val);
27732773
if (val) {
27742774
AutoClickSun();
27752775
}

game/js/Custom.js

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,10 @@ let checkInterval = setInterval(() => {
157157
console.log(`Starting adventure with level: ${hLvl}`);
158158
StartAdventure(hLvl);
159159
};
160-
} else if (typeof localStorage.getItem("level") === "undefined") {
161-
$("dAdventure").onclick = function () {
162-
console.log("Starting adventure with level: " + localStorage.getItem("level") + " (from localStorage)");
163-
StartAdventure(localStorage.getItem("level"));
160+
} else if (typeof StorageUtil.getItem("level") === "undefined") {
161+
$("dAdventure").onclick = function () {
162+
console.log("Starting adventure with level: " + StorageUtil.getItem("level") + " (from localStorage)");
163+
StartAdventure(StorageUtil.getItem("level"));
164164
};
165165
} else {
166166
$("dAdventure").onclick = function () {
@@ -171,7 +171,7 @@ let checkInterval = setInterval(() => {
171171
}
172172
if (saveWhitelist.includes(oS.Lvl)) {
173173
console.log(`Saving level ${oS.Lvl} to localStorage.`);
174-
localStorage.setItem("level", oS.Lvl);
174+
StorageUtil.setItem("level", oS.Lvl);
175175
} else {
176176
console.log(`Level ${oS.Lvl} isn't whitelisted, not saving to localStorage.`);
177177
}
@@ -189,11 +189,11 @@ function startInterval2() {
189189
/*console.log(
190190
"Checking if dAdventure is defined and saved level exists & is not blacklisted..."
191191
);*/
192-
if ($("dAdventure") && localStorage.getItem("level") && saveWhitelist.includes(localStorage.getItem("level"))) {
192+
if ($("dAdventure") && StorageUtil.getItem("level") && saveWhitelist.includes(StorageUtil.getItem("level"))) {
193193
console.log("dAdventure is defined and level is valid, setting onclick...");
194194
$("dAdventure").onclick = function () {
195-
console.log(`Starting adventure with level from localStorage: ${localStorage.getItem("level")}`);
196-
StartAdventure(localStorage.getItem("level"));
195+
console.log(`Starting adventure with level from localStorage: ${StorageUtil.getItem("level")}`);
196+
StartAdventure(StorageUtil.getItem("level"));
197197
};
198198
clearInterval(checkInterval2);
199199
}
@@ -363,8 +363,8 @@ $User.Visitor.SaveLvlCallBack = function (o) {
363363
// save logic
364364
let levels = {};
365365
// check if "levels" exists in localStorage
366-
if (localStorage.getItem("levels")) {
367-
levels = JSON.parse(localStorage.getItem("levels"));
366+
if (StorageUtil.getItem("levels")) {
367+
levels = JSON.parse(StorageUtil.getItem("levels"));
368368
}
369369
// add the level to the levels object if it doesn't exist
370370
if (!levels[o.Lvl]) {

game/js/StorageUtil.js

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
/**
2+
* StorageUtil - Abstraction layer for storage that works in both extension and web contexts
3+
* Automatically detects if running in a browser extension and uses the appropriate API
4+
*/
5+
const StorageUtil = (() => {
6+
// Detect if we're running in a browser extension by checking if localStorage is unavailable
7+
let isExtension = false;
8+
try {
9+
localStorage.setItem("__test__", "1");
10+
localStorage.removeItem("__test__");
11+
} catch (e) {
12+
// If localStorage is unavailable, we're likely in an extension
13+
isExtension = true;
14+
}
15+
16+
// Check if localStorage is available
17+
const localStorageAvailable = !isExtension;
18+
19+
/**
20+
* Get an item from storage
21+
* @param {string} key - The storage key
22+
* @returns {string|null} - The stored value or null if not found
23+
*/
24+
const getItem = (key) => {
25+
if (isExtension && typeof chrome !== "undefined" && chrome.storage) {
26+
// For extension, use chrome.storage.sync
27+
let result = null;
28+
chrome.storage.sync.get([key], (data) => {
29+
result = data[key] !== undefined ? data[key] : null;
30+
});
31+
return result;
32+
} else if (localStorageAvailable) {
33+
// Use localStorage for web
34+
try {
35+
return localStorage.getItem(key);
36+
} catch (e) {
37+
console.warn(`Failed to get item from localStorage: ${e}`);
38+
return null;
39+
}
40+
} else {
41+
return null;
42+
}
43+
};
44+
45+
/**
46+
* Set an item in storage
47+
* @param {string} key - The storage key
48+
* @param {string} value - The value to store
49+
*/
50+
const setItem = (key, value) => {
51+
if (isExtension && typeof chrome !== "undefined" && chrome.storage) {
52+
// For extension, use chrome.storage.sync
53+
chrome.storage.sync.set({ [key]: value }, () => {
54+
if (chrome.runtime.lastError) {
55+
console.warn(`Failed to set item in extension storage: ${chrome.runtime.lastError.message}`);
56+
}
57+
});
58+
} else if (localStorageAvailable) {
59+
// Use localStorage for web
60+
try {
61+
localStorage.setItem(key, value);
62+
} catch (e) {
63+
console.warn(`Failed to set item in localStorage: ${e}`);
64+
}
65+
}
66+
};
67+
68+
/**
69+
* Remove an item from storage
70+
* @param {string} key - The storage key
71+
*/
72+
const removeItem = (key) => {
73+
if (isExtension && typeof chrome !== "undefined" && chrome.storage) {
74+
// For extension, use chrome.storage.sync
75+
chrome.storage.sync.remove([key], () => {
76+
if (chrome.runtime.lastError) {
77+
console.warn(`Failed to remove item from extension storage: ${chrome.runtime.lastError.message}`);
78+
}
79+
});
80+
} else if (localStorageAvailable) {
81+
// Use localStorage for web
82+
try {
83+
localStorage.removeItem(key);
84+
} catch (e) {
85+
console.warn(`Failed to remove item from localStorage: ${e}`);
86+
}
87+
}
88+
};
89+
90+
/**
91+
* Clear all storage
92+
*/
93+
const clear = () => {
94+
if (isExtension && typeof chrome !== "undefined" && chrome.storage) {
95+
// For extension, use chrome.storage.sync
96+
chrome.storage.sync.clear(() => {
97+
if (chrome.runtime.lastError) {
98+
console.warn(`Failed to clear extension storage: ${chrome.runtime.lastError.message}`);
99+
}
100+
});
101+
} else if (localStorageAvailable) {
102+
// Use localStorage for web
103+
try {
104+
localStorage.clear();
105+
} catch (e) {
106+
console.warn(`Failed to clear localStorage: ${e}`);
107+
}
108+
}
109+
};
110+
111+
return {
112+
getItem,
113+
setItem,
114+
removeItem,
115+
clear,
116+
isExtension: () => isExtension,
117+
isLocalStorageAvailable: () => localStorageAvailable,
118+
};
119+
})();

game/menu/js/izombieonline.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ function getDefaultSortIndex() {
2828
const sortKeys = Object.keys(sorts);
2929
const saved = (() => {
3030
try {
31-
return localStorage.getItem(SORT_STORAGE_KEY);
31+
return StorageUtil.getItem(SORT_STORAGE_KEY);
3232
} catch {
3333
return null;
3434
}
@@ -47,7 +47,7 @@ let currentSortIndex = getDefaultSortIndex();
4747

4848
function persistCurrentSort() {
4949
try {
50-
localStorage.setItem(SORT_STORAGE_KEY, Object.keys(sorts)[currentSortIndex]);
50+
StorageUtil.setItem(SORT_STORAGE_KEY, Object.keys(sorts)[currentSortIndex]);
5151
} catch {
5252
// Ignore storage errors (private mode, disabled storage, etc.)
5353
}

game/tester.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<link rel="stylesheet" href="Custom.css" />
77
<link rel="stylesheet" href="UI.css" />
88
<script src="js/WebComponents.js"></script>
9+
<script src="js/StorageUtil.js"></script>
910
<script src="js/Cfunction.js"></script>
1011
<script src="js/CPlants.js"></script>
1112
<title>Document</title>

0 commit comments

Comments
 (0)