diff --git a/utils/localStorage.go b/utils/localStorage.go index 0c0da260755ec9336433195da4228e8fdeebd2b3..d4681c2bb76cee5ffcfa20dc11ee332da715d4b5 100644 --- a/utils/localStorage.go +++ b/utils/localStorage.go @@ -98,29 +98,34 @@ func (ls *LocalStorage) Clear() { ls.clear() } -// ClearWASM clears all the keys in storage created by WASM. -// TODO: add test. -func (ls *LocalStorage) ClearWASM() { - for i := 0; i < ls.Length(); i++ { - v := ls.key(i) - if !v.IsNull() && strings.HasPrefix(v.String(), localStorageWasmPrefix) { - ls.RemoveItem(strings.TrimPrefix(v.String(), localStorageWasmPrefix)) - - // Decrement to account for reduced length from removed key - i-- +// ClearPrefix clears all keys with the given prefix. +func (ls *LocalStorage) ClearPrefix(prefix string) { + // Get a copy of all key names at once + keys := js.Global().Get("Object").Call("keys", ls.v) + + // Loop through each key + for i := 0; i < keys.Length(); i++ { + if v := keys.Index(i); !v.IsNull() { + keyName := strings.TrimPrefix(v.String(), localStorageWasmPrefix) + if strings.HasPrefix(keyName, prefix) { + ls.RemoveItem(keyName) + } } } } -// ClearPrefix clears all keys with the given prefix. -func (ls *LocalStorage) ClearPrefix(prefix string) { - for i := 0; i < ls.Length(); i++ { - keyName, err := ls.Key(i) - if err == nil && strings.HasPrefix(keyName, prefix) { - ls.RemoveItem(keyName) - - // Decrement to account for reduced length from removed key - i-- +// ClearWASM clears all the keys in storage created by WASM. +func (ls *LocalStorage) ClearWASM() { + // Get a copy of all key names at once + keys := js.Global().Get("Object").Call("keys", ls.v) + + // Loop through each key + for i := 0; i < keys.Length(); i++ { + if v := keys.Index(i); !v.IsNull() { + keyName := v.String() + if strings.HasPrefix(keyName, localStorageWasmPrefix) { + ls.RemoveItem(strings.TrimPrefix(keyName, localStorageWasmPrefix)) + } } } } diff --git a/utils/localStorage_test.go b/utils/localStorage_test.go index 7f08f450f3f2189ca98ae8dbdc1dee4a174e8ff3..6d8968491d6153ea47a9d666d73d8ea0b0fa3d22 100644 --- a/utils/localStorage_test.go +++ b/utils/localStorage_test.go @@ -85,28 +85,31 @@ func TestLocalStorage_Clear(t *testing.T) { } } -// Tests that LocalStorage.ClearWASM deletes all the WASM keys from storage and -// does not remove any others -func TestLocalStorage_ClearWASM(t *testing.T) { +// Tests that LocalStorage.ClearPrefix deletes only the keys with the given +// prefix. +func TestLocalStorage_ClearPrefix(t *testing.T) { jsStorage.clear() prng := rand.New(rand.NewSource(11)) var yesPrefix, noPrefix []string + prefix := "keyNamePrefix/" + for i := 0; i < 10; i++ { keyName := "keyNum" + strconv.Itoa(i) if prng.Intn(2) == 0 { + keyName = prefix + keyName yesPrefix = append(yesPrefix, keyName) - jsStorage.SetItem(keyName, []byte(strconv.Itoa(i))) } else { noPrefix = append(noPrefix, keyName) - jsStorage.setItem(keyName, strconv.Itoa(i)) } + + jsStorage.SetItem(keyName, []byte(strconv.Itoa(i))) } - jsStorage.ClearWASM() + jsStorage.ClearPrefix(prefix) for _, keyName := range noPrefix { - if v := jsStorage.getItem(keyName); v.IsNull() { - t.Errorf("Could not get keyName %q.", keyName) + if _, err := jsStorage.GetItem(keyName); err != nil { + t.Errorf("Could not get keyName %q: %+v", keyName, err) } } for _, keyName := range yesPrefix { @@ -117,31 +120,28 @@ func TestLocalStorage_ClearWASM(t *testing.T) { } } -// Tests that LocalStorage.ClearPrefix deletes only the keys with the given -// prefix. -func TestLocalStorage_ClearPrefix(t *testing.T) { +// Tests that LocalStorage.ClearWASM deletes all the WASM keys from storage and +// does not remove any others +func TestLocalStorage_ClearWASM(t *testing.T) { jsStorage.clear() prng := rand.New(rand.NewSource(11)) var yesPrefix, noPrefix []string - prefix := "keyNamePrefix/" - for i := 0; i < 10; i++ { keyName := "keyNum" + strconv.Itoa(i) if prng.Intn(2) == 0 { - keyName = prefix + keyName yesPrefix = append(yesPrefix, keyName) + jsStorage.SetItem(keyName, []byte(strconv.Itoa(i))) } else { noPrefix = append(noPrefix, keyName) + jsStorage.setItem(keyName, strconv.Itoa(i)) } - - jsStorage.SetItem(keyName, []byte(strconv.Itoa(i))) } - jsStorage.ClearPrefix(prefix) + jsStorage.ClearWASM() for _, keyName := range noPrefix { - if _, err := jsStorage.GetItem(keyName); err != nil { - t.Errorf("Could not get keyName %q: %+v", keyName, err) + if v := jsStorage.getItem(keyName); v.IsNull() { + t.Errorf("Could not get keyName %q.", keyName) } } for _, keyName := range yesPrefix {