You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by ha...@apache.org on 2021/11/13 18:50:11 UTC

[royale-asjs] branch develop updated: Fixed null and undefined in XML

This is an automated email from the ASF dual-hosted git repository.

harbs pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git


The following commit(s) were added to refs/heads/develop by this push:
     new 4c4e9ee  Fixed null and undefined in XML
4c4e9ee is described below

commit 4c4e9ee4e5f69d30b8bf25f3b236cf35aae70c4c
Author: Harbs <ha...@in-tools.com>
AuthorDate: Sat Nov 13 20:49:56 2021 +0200

    Fixed null and undefined in XML
---
 frameworks/projects/XML/src/main/royale/XML.as     | 57 +++++++-------
 .../XML/src/test/royale/flexUnitTests/XMLTester.as |  4 +-
 .../royale/flexUnitTests/xml/XMLTesterNullTest.as  | 91 ++++++++++++++++++++++
 3 files changed, 125 insertions(+), 27 deletions(-)

diff --git a/frameworks/projects/XML/src/main/royale/XML.as b/frameworks/projects/XML/src/main/royale/XML.as
index 1ebc43e..39cd4f2 100644
--- a/frameworks/projects/XML/src/main/royale/XML.as
+++ b/frameworks/projects/XML/src/main/royale/XML.as
@@ -342,7 +342,7 @@ package
 			var xml:XML = new XML();
 			xml._parent = parent;
 			xml._name = getQName(att.localName, '', att.namespaceURI, true);
-			xml._value = att.value;
+			xml.setValue(att.value);
 			parent.addChildInternal(xml);
 			return xml;
 		}
@@ -609,7 +609,7 @@ package
 				{
 					// _nodeKind = TEXT;
 					if (ignoreWhitespace) xmlStr = xmlStr.trim();
-					_value = xmlStr;
+					setValue(xmlStr);
 				}
 				else
 				{
@@ -618,7 +618,7 @@ package
 			} else {
 				if (!_internal) {
 					// _nodeKind = TEXT;
-					_value = '';
+					setValue('');
 				}
 			}
 
@@ -969,7 +969,7 @@ package
 			if (child is XML  && (child as XML).getNodeRef() == ATTRIBUTE){
 				//convert to text node
 				var xml:XML= new XML();
-				xml._value = child.toString();
+				xml.setValue(child.toString());
 				child = xml;
 				isTextSet = true;
 			}
@@ -1049,7 +1049,7 @@ package
 				{
 					if (isTextSet)
 					{
-						xml$_notify("textSet", child, child._value, null);
+						xml$_notify("textSet", child, child.getValue(), null);
 					}
 					xml$_notify("attributeAdded", this, child.name().toString(), child.getValue());
 				}
@@ -1057,7 +1057,7 @@ package
 				{
 					// the node with the _value may have a wrapper (with single child)
 					var childValueNode:XML = (child._children ? child._children[0] : child);
-					xml$_notify("textSet", childValueNode, childValueNode._value, null);
+					xml$_notify("textSet", childValueNode, childValueNode.getValue(), null);
 					// if no wrapper, then childValueNode._parent == this and childValueNode == child
 					xml$_notify("nodeAdded", childValueNode._parent, childValueNode, null);
 				}
@@ -1297,9 +1297,7 @@ package
 			xml.resetNodeKind();
 			xml.setNodeKind(getNodeKindInternal());
 			xml._name = _name;
-			if(_value){
-				xml.setValue(_value);
-			}
+			xml.setValue(_value);
 			var len:int;
 			len = namespaceLength();
 			for(i=0;i<len;i++)
@@ -1576,7 +1574,7 @@ package
 		
 		public function getValue():String
 		{
-			return _value;
+			return _value ? _value : "";
 		}
 		
 		public function hasAncestor(obj:*):Boolean
@@ -2228,7 +2226,7 @@ package
 						removed._parent = null;
 						_attributes.splice(i,1);
 						// "_name as QName" (and ignorecoercion) needed to avoid compiler from writing ".child()" due to "removed" being XML
-						xml$_notify("attributeRemoved", this, (removed._name as QName).localName, removed._value);
+						xml$_notify("attributeRemoved", this, (removed._name as QName).localName, removed.getValue());
 						return true;
 					}
 				}
@@ -2268,7 +2266,7 @@ package
 						_attributes.splice(i,1);
 						removedItem = true;
 						// "_name as QName" (and ignorecoercion) needed to avoid compiler from writing ".child()" due to "child" being XML
-						xml$_notify("attributeRemoved", this, (child._name as QName).localName, child._value);
+						xml$_notify("attributeRemoved", this, (child._name as QName).localName, child.getValue());
 					}
 				}
 				return removedItem;
@@ -2546,6 +2544,8 @@ package
 		public function setAttribute(attr:*,value:String):String
 		{
 			var i:int;
+			// stringify the value if not already a string
+			value = "" + value;
 			//make sure _attributes is not null
 			getAttributes();
 			
@@ -2564,8 +2564,7 @@ package
 							return value;
 						}
 					}
-					if(value)
-						attr.setValue(value);
+					attr.setValue(value);
 					addChild(attr);
 				}
 				return value;
@@ -2865,7 +2864,7 @@ package
 			var oldName:QName = _name;
 			_name = getQName(name,_name.prefix,_name.uri,_name.isAttribute)
 			// _name.localName = name;
-			xml$_notify("nameSet", (getNodeRef() == ATTRIBUTE ? xmlFromStringable(_value) : this), _name.toString(), oldName.toString());
+			xml$_notify("nameSet", (getNodeRef() == ATTRIBUTE ? xmlFromStringable(getValue()) : this), _name.toString(), oldName.toString());
 		}
 		
 		/**
@@ -2904,7 +2903,7 @@ package
 				delete this._nodeKind;
 			}
 			// oldName cannot be null, normally, but we're calling setName() from within parseXMLStr() for processing instructions
-			if (oldName) xml$_notify("nameSet", (ref == ATTRIBUTE ? xmlFromStringable(_value) : this), (name is QName ? _name : _name.toString()), oldName.toString());
+			if (oldName) xml$_notify("nameSet", (ref == ATTRIBUTE ? xmlFromStringable(getValue()) : this), (name is QName ? _name : _name.toString()), oldName.toString());
 		}
 		
 		/**
@@ -2971,7 +2970,12 @@ package
 		
 		public function setValue(value:String):void
 		{
-			_value = value;
+			if(value)
+			{
+				_value = value;
+			} else {
+				delete this._value;
+			}
 		}
 		
 		/**
@@ -3031,10 +3035,10 @@ package
 			// text, comment, processing-instruction, attribute, or element
 			var kind:String = getNodeRef();
 			if( kind == ATTRIBUTE)
-				return _value == null ? "" : _value;
+				return getValue();
 			if(kind == TEXT)
 			{
-				var textVal:String = _value == null ? "" : _value;
+				var textVal:String = getValue();
 				return textVal.indexOf('<![CDATA[') == 0 ? textVal.substring(9, textVal.length-3): textVal;
 			}
 			if(kind == COMMENT)
@@ -3226,28 +3230,29 @@ package
 			
 			var indent:String = indentArr.join("");
 			const nodeType:String = getNodeRef();
+			var strValue:String = getValue();
 			if(nodeType == TEXT) //4.
 			{
 				if(prettyPrinting)
 				{
-					var v:String = (_value+'').trim();
+					var v:String = strValue.trim();
 					if (v.indexOf('<![CDATA[') == 0) {
 						return indent + v;
 					}
 					return indent + escapeElementValue(v);
 				}
-				if (_value.indexOf('<![CDATA[') == 0)
-					return _value;
-				return escapeElementValue(_value);
+				if (strValue.indexOf('<![CDATA[') == 0)
+					return strValue;
+				return escapeElementValue(strValue);
 			}
 			if(nodeType == ATTRIBUTE)
-				return indent + escapeAttributeValue(_value);
+				return indent + escapeAttributeValue(strValue);
 			
 			if(nodeType == COMMENT)
-				return indent + "<!--" +  _value + "-->";
+				return indent + "<!--" +  strValue + "-->";
 			
 			if(nodeType == PROCESSING_INSTRUCTION)
-				return indent + "<?" + name().localName + " " + _value + "?>";
+				return indent + "<?" + name().localName + " " + strValue + "?>";
 			
 			// We excluded the other types, so it's a normal element
 			// step 8.
diff --git a/frameworks/projects/XML/src/test/royale/flexUnitTests/XMLTester.as b/frameworks/projects/XML/src/test/royale/flexUnitTests/XMLTester.as
index c7c0347..6f2f450 100644
--- a/frameworks/projects/XML/src/test/royale/flexUnitTests/XMLTester.as
+++ b/frameworks/projects/XML/src/test/royale/flexUnitTests/XMLTester.as
@@ -53,6 +53,8 @@ package flexUnitTests
         public var xmlLiteralTest:XMLLiteralTest;
 
         public var xmlNotificationTest:XMLNotificationTest;
-        
+
+        public var xmlNullTest:XMLTesterNullTest;
+
     }
 }
diff --git a/frameworks/projects/XML/src/test/royale/flexUnitTests/xml/XMLTesterNullTest.as b/frameworks/projects/XML/src/test/royale/flexUnitTests/xml/XMLTesterNullTest.as
new file mode 100644
index 0000000..12de99d
--- /dev/null
+++ b/frameworks/projects/XML/src/test/royale/flexUnitTests/xml/XMLTesterNullTest.as
@@ -0,0 +1,91 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package flexUnitTests.xml
+{
+    
+    
+    import org.apache.royale.test.asserts.*;
+    
+    //import testshim.RoyaleUnitTestRunner;
+    
+    /**
+     * @royalesuppresspublicvarwarning
+     */
+    public class XMLTesterNullTest
+    {
+    
+        public static var isJS:Boolean = COMPILE::JS;
+    
+        private var settings:Object;
+        
+        [Before]
+        public function setUp():void
+        {
+            settings = XML.settings();
+        }
+        
+        [After]
+        public function tearDown():void
+        {
+            XML.setSettings(settings);
+        }
+        
+        [BeforeClass]
+        public static function setUpBeforeClass():void
+        {
+        }
+        
+        [AfterClass]
+        public static function tearDownAfterClass():void
+        {
+        }
+        
+        
+        [Test]
+        public function testSettingAttributes():void
+        {
+            var xml:XML = <foo/>;
+            xml.@name = "";
+            assertEquals( xml.toXMLString(), '<foo name=""/>', 'Error in blank attribute');
+
+            xml = <foo/>;
+            xml.@name = undefined;
+            assertEquals( xml.toXMLString(), '<foo name="undefined"/>', 'Error in undefined attribute');
+
+            xml = <foo/>;
+            xml.@name = null;
+            assertEquals( xml.toXMLString(), '<foo name="null"/>', 'Error in null attribute');
+
+            xml = <foo name="undefined"/>;
+            assertEquals( xml.toXMLString(), '<foo name="undefined"/>', 'Error in undefined attribute');
+
+            xml = <foo name="null"/>;
+            assertEquals( xml.toXMLString(), '<foo name="null"/>', 'Error in null attribute');
+
+            xml = new XML('<foo name="undefined"/>');
+            assertEquals( xml.toXMLString(), '<foo name="undefined"/>', 'Error in undefined attribute');
+
+            xml = new XML('<foo name="null"/>');
+            assertEquals( xml.toXMLString(), '<foo name="null"/>', 'Error in null attribute');
+
+        }
+
+        
+    }
+}