Skip to content
Snippets Groups Projects
Commit 6938b69d authored by Jono Wenger's avatar Jono Wenger
Browse files

Fix LocalStorage.ClearPrefix bug

parent 6afbf09a
No related branches found
No related tags found
1 merge request!18XX-4272 / Purge
......@@ -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)
// 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)
// Decrement to account for reduced length from removed key
i--
// 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))
}
}
}
}
......
......@@ -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 {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment