From c31b2f9d8cf0aeeacf978861faf40a8f71c9d62e Mon Sep 17 00:00:00 2001 From: anoshenko Date: Sun, 18 Dec 2022 18:22:58 +0300 Subject: [PATCH] PropertyWithTag method of DataObject renamed to PropertyByTag --- app_scripts.js | 42 ++++++++++++++++++++++++++++++++++++++---- border.go | 2 +- data.go | 8 ++++---- filePicker.go | 2 +- session.go | 38 +++++++++++++++++++++++++++++++++++++- touchEvents.go | 2 +- 6 files changed, 82 insertions(+), 12 deletions(-) diff --git a/app_scripts.js b/app_scripts.js index 1162fae..a9ff7a7 100644 --- a/app_scripts.js +++ b/app_scripts.js @@ -52,6 +52,24 @@ function sessionInfo() { message += ",pixel-ratio=" + pixelRatio; } + if (localStorage.length > 0) { + message += ",storage=" + lead = "_{" + for (var i = 0; i < localStorage.length; i++) { + var key = localStorage.key(i) + var value = localStorage.getItem(key) + key = key.replaceAll(/\\/g, "\\\\") + key = key.replaceAll(/\"/g, "\\\"") + key = key.replaceAll(/\'/g, "\\\'") + value = value.replaceAll(/\\/g, "\\\\") + value = value.replaceAll(/\"/g, "\\\"") + value = value.replaceAll(/\'/g, "\\\'") + message += lead + "\"" + key + "\"=\"" + value + "\"" + lead = "," + } + message += "}" + } + return message + "}"; } @@ -940,8 +958,8 @@ function radioButtonKeyClickEvent(element, event) { function editViewInputEvent(element) { var text = element.value - text = text.replace(/\\/g, "\\\\") - text = text.replace(/\"/g, "\\\"") + text = text.replaceAll(/\\/g, "\\\\") + text = text.replaceAll(/\"/g, "\\\"") var message = "textChanged{session=" + sessionID + ",id=" + element.id + ",text=\"" + text + "\"}" sendMessage(message); } @@ -1147,7 +1165,7 @@ function loadImage(url) { img.addEventListener("error", function(event) { var message = "imageError{session=" + sessionID + ",url=\"" + url + "\""; if (event && event.message) { - var text = event.message.replace(new RegExp("\"", 'g'), "\\\"") + var text = event.message.replaceAll(new RegExp("\"", 'g'), "\\\"") message += ",message=\"" + text + "\""; } sendMessage(message + "}") @@ -1178,7 +1196,7 @@ function loadInlineImage(url, content) { img.addEventListener("error", function(event) { var message = "imageError{session=" + sessionID + ",url=\"" + url + "\""; if (event && event.message) { - var text = event.message.replace(new RegExp("\"", 'g'), "\\\"") + var text = event.message.replaceAll(new RegExp("\"", 'g'), "\\\"") message += ",message=\"" + text + "\""; } sendMessage(message + "}") @@ -1842,3 +1860,19 @@ function getCanvasContext(elementId) { } return null; } + +function localStorageSet(key, value) { + try { + localStorage.setItem(key, value) + } catch (err) { + sendMessage("storageError{session=" + sessionID + ", error=`" + err + "`}") + } +} + +function localStorageClear() { + try { + localStorage.setItem(key, value) + } catch (err) { + sendMessage("storageError{session=" + sessionID + ", error=`" + err + "`}") + } +} diff --git a/border.go b/border.go index 97a62f9..209ec9e 100644 --- a/border.go +++ b/border.go @@ -286,7 +286,7 @@ func (border *borderProperty) setBorderObject(obj DataObject) bool { result := true for _, side := range []string{Top, Right, Bottom, Left} { - if node := obj.PropertyWithTag(side); node != nil { + if node := obj.PropertyByTag(side); node != nil { if node.Type() == ObjectNode { if !border.setSingleBorderObject(side, node.Object()) { result = false diff --git a/data.go b/data.go index 0f26698..4e51271 100644 --- a/data.go +++ b/data.go @@ -18,7 +18,7 @@ type DataObject interface { Tag() string PropertyCount() int Property(index int) DataNode - PropertyWithTag(tag string) DataNode + PropertyByTag(tag string) DataNode PropertyValue(tag string) (string, bool) PropertyObject(tag string) DataObject SetPropertyValue(tag, value string) @@ -106,7 +106,7 @@ func (object *dataObject) Property(index int) DataNode { return object.property[index] } -func (object *dataObject) PropertyWithTag(tag string) DataNode { +func (object *dataObject) PropertyByTag(tag string) DataNode { if object.property != nil { for _, node := range object.property { if node.Tag() == tag { @@ -118,14 +118,14 @@ func (object *dataObject) PropertyWithTag(tag string) DataNode { } func (object *dataObject) PropertyValue(tag string) (string, bool) { - if node := object.PropertyWithTag(tag); node != nil && node.Type() == TextNode { + if node := object.PropertyByTag(tag); node != nil && node.Type() == TextNode { return node.Text(), true } return "", false } func (object *dataObject) PropertyObject(tag string) DataObject { - if node := object.PropertyWithTag(tag); node != nil && node.Type() == ObjectNode { + if node := object.PropertyByTag(tag); node != nil && node.Type() == ObjectNode { return node.Object() } return nil diff --git a/filePicker.go b/filePicker.go index 3e236f7..8081aab 100644 --- a/filePicker.go +++ b/filePicker.go @@ -270,7 +270,7 @@ func (picker *filePickerData) htmlDisabledProperties(self View, buffer *strings. func (picker *filePickerData) handleCommand(self View, command string, data DataObject) bool { switch command { case "fileSelected": - if node := data.PropertyWithTag("files"); node != nil && node.Type() == ArrayNode { + if node := data.PropertyByTag("files"); node != nil && node.Type() == ArrayNode { count := node.ArraySize() files := make([]FileInfo, count) for i := 0; i < count; i++ { diff --git a/session.go b/session.go index 41ea863..33cfd37 100644 --- a/session.go +++ b/session.go @@ -100,6 +100,10 @@ type Session interface { // OpenURL opens the url in the new browser tab OpenURL(url string) + ClientItem(key string) (string, bool) + SetClientItem(key, value string) + RemoveAllClientItems() + getCurrentTheme() Theme registerAnimation(props []AnimatedProperty) string @@ -183,6 +187,7 @@ type sessionData struct { animationCounter int animationCSS string updateScripts map[string]*strings.Builder + clientStorage map[string]string } func newSession(app Application, id int, customTheme string, params DataObject) Session { @@ -199,6 +204,7 @@ func newSession(app Application, id int, customTheme string, params DataObject) session.animationCounter = 0 session.animationCSS = "" session.updateScripts = map[string]*strings.Builder{} + session.clientStorage = map[string]string{} if customTheme != "" { if theme, ok := CreateThemeFromText(customTheme); ok { @@ -516,7 +522,7 @@ func (session *sessionData) handleRootSize(data DataObject) { } func (session *sessionData) handleResize(data DataObject) { - if node := data.PropertyWithTag("views"); node != nil && node.Type() == ArrayNode { + if node := data.PropertyByTag("views"); node != nil && node.Type() == ArrayNode { for _, el := range node.ArrayElements() { if el.IsObject() { obj := el.Object() @@ -591,6 +597,16 @@ func (session *sessionData) handleSessionInfo(params DataObject) { session.pixelRatio = f } } + + if node := params.PropertyByTag("storage"); node != nil && node.Type() == ObjectNode { + if obj := node.Object(); obj != nil { + for i := 0; i < obj.PropertyCount(); i++ { + if element := obj.Property(i); element.Type() == TextNode { + session.clientStorage[element.Tag()] = element.Text() + } + } + } + } } func (session *sessionData) handleEvent(command string, data DataObject) { @@ -610,6 +626,11 @@ func (session *sessionData) handleEvent(command string, data DataObject) { case "sessionInfo": session.handleSessionInfo(data) + case "storageError": + if text, ok := data.PropertyValue("error"); ok { + ErrorLog(text) + } + default: if viewID, ok := data.PropertyValue("id"); ok { if view := session.viewByHTMLID(viewID); view != nil { @@ -641,3 +662,18 @@ func (session *sessionData) OpenURL(urlStr string) { } session.callFunc("openURL", urlStr) } + +func (session *sessionData) ClientItem(key string) (string, bool) { + value, ok := session.clientStorage[key] + return value, ok +} + +func (session *sessionData) SetClientItem(key, value string) { + session.clientStorage[key] = value + session.bridge.callFunc("localStorageSet", key, value) +} + +func (session *sessionData) RemoveAllClientItems() { + session.clientStorage = map[string]string{} + session.bridge.callFunc("localStorageClear") +} diff --git a/touchEvents.go b/touchEvents.go index 7c2be24..8a4e92f 100644 --- a/touchEvents.go +++ b/touchEvents.go @@ -140,7 +140,7 @@ func (event *TouchEvent) init(data DataObject) { event.Touches = []Touch{} event.TimeStamp = getTimeStamp(data) - if node := data.PropertyWithTag("touches"); node != nil && node.Type() == ArrayNode { + if node := data.PropertyByTag("touches"); node != nil && node.Type() == ArrayNode { for i := 0; i < node.ArraySize(); i++ { if element := node.ArrayElement(i); element != nil && element.IsObject() { if obj := element.Object(); obj != nil {