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