[Laszlo-checkins] r13709 - in openlaszlo/trunk: WEB-INF/lps/lfc/data WEB-INF/lps/lfc/kernel/swf WEB-INF/lps/lfc/kernel/swf9 test/lfc/data

bargull@openlaszlo.org bargull at openlaszlo.org
Sun Apr 19 10:08:30 PDT 2009


Author: bargull
Date: 2009-04-19 10:08:25 -0700 (Sun, 19 Apr 2009)
New Revision: 13709

Modified:
   openlaszlo/trunk/WEB-INF/lps/lfc/data/LzDataElement.lzs
   openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf/LzXMLParser.as
   openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf/LzXMLTranslator.as
   openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf9/LzXMLParser.as
   openlaszlo/trunk/test/lfc/data/datapointer.lzx
   openlaszlo/trunk/test/lfc/data/datapointerServerless.lzx
   openlaszlo/trunk/test/lfc/data/xmlparser.lzx
Log:
Change 20090418-bargull-EOc by bargull at dell--p4--2-53 on 2009-04-18 15:58:16
    in /home/Admin/src/svn/openlaszlo/trunk
    for http://svn.openlaszlo.org/openlaszlo/trunk

Summary: make LzXMLParser more consistent across runtimes

New Features:

Bugs Fixed: LPP-8066 (LzXMLParser cross-runtime inconsistencies), LPP-7461 (Issues in test/lfc/data/alldata.lzx)

Technical Reviewer: hminsky
QA Reviewer: (pending)
Doc Reviewer: (pending)

Documentation:

Release Notes:

Details:
LzXMLParser (swf8):
- respect function contract: return `null` when xml-string doesn't contain a single root-element or just a simple string
- return firstChild for compatibility with dhtml and swf9
LzXMLTranslator (swf8):
- LzXMLParser.parseXML returns now firstChild of xml-object, need to compensate here for backward compatibility (see LPP-7537)
LzXMLParser (swf9):
- respect function contract: return `null` when xml-string is a simple string
LzDataElement:
- handle null-return from LzXMLParser.parseXML
- only wrap LzXMLParser.parseXML in try..catch

xmlparser.lzx:
- add tests from LPP-8066

datapointer.lzx and datapointerServerless.lzx:
- change test to match new contract of lz.datapointer#deleteNode()
    

Tests:
alldata x (swf8, swf9, dhtml)



Modified: openlaszlo/trunk/WEB-INF/lps/lfc/data/LzDataElement.lzs
===================================================================
--- openlaszlo/trunk/WEB-INF/lps/lfc/data/LzDataElement.lzs	2009-04-19 17:02:25 UTC (rev 13708)
+++ openlaszlo/trunk/WEB-INF/lps/lfc/data/LzDataElement.lzs	2009-04-19 17:08:25 UTC (rev 13709)
@@ -855,16 +855,18 @@
   */
 static function stringToLzData (str:String, trimwhitespace:Boolean = false, nsprefix:Boolean = false) :LzDataElement {
     if (str != null && str != "") {
+        var nativexml:*;
         try {
-            var nativexml:* = LzXMLParser.parseXML(str, trimwhitespace, nsprefix);
-            var lfcnode:LzDataElement = LzXMLTranslator.copyXML(nativexml, trimwhitespace, nsprefix);
-            return lfcnode;
+            nativexml = LzXMLParser.parseXML(str, trimwhitespace, nsprefix);
         } catch (e) {
             if ($debug) {
                 Debug.warn("Cannot parse xml-string '%s': %w", str, e);
             }
-            return null;
         }
+        if (nativexml != null) {
+            var lfcnode:LzDataElement = LzXMLTranslator.copyXML(nativexml, trimwhitespace, nsprefix);
+            return lfcnode;
+        }
     }
     return null;
 }

Modified: openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf/LzXMLParser.as
===================================================================
--- openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf/LzXMLParser.as	2009-04-19 17:02:25 UTC (rev 13708)
+++ openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf/LzXMLParser.as	2009-04-19 17:08:25 UTC (rev 13709)
@@ -24,10 +24,17 @@
   */
 LzXMLParser.parseXML = function( str, trimwhitespace, nsprefix ){
         var xmlobj = new XML();
+        // always ignore full whitespace nodes
         xmlobj.ignoreWhite = true;
         xmlobj.parseXML( str );
         if (xmlobj.status == 0) {
-            return xmlobj;
+            var fc = xmlobj.firstChild;
+            if (xmlobj.childNodes.length == 1 && fc.nodeType == 1) {
+                return fc;
+            } else {
+                // no single root element or string is simple text
+                return null;
+            }
         } else {
             // error descriptions from flash docs
             var errors = ["A CDATA section was not properly terminated.", 

Modified: openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf/LzXMLTranslator.as
===================================================================
--- openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf/LzXMLTranslator.as	2009-04-19 17:02:25 UTC (rev 13708)
+++ openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf/LzXMLTranslator.as	2009-04-19 17:08:25 UTC (rev 13709)
@@ -1,7 +1,7 @@
 /**
   * LzXMLTranslator.as
   *
-  * @copyright Copyright 2001-2008 Laszlo Systems, Inc.  All Rights Reserved.
+  * @copyright Copyright 2001-2009 Laszlo Systems, Inc.  All Rights Reserved.
   *            Use is subject to license terms.
   *
   * @topic Kernel
@@ -11,12 +11,15 @@
 /**
   * @shortdesc: Utility for converting native XML DOM object into LzDataNode tree
   */
-
 var LzXMLTranslator = new Object;
 
 LzXMLTranslator.copyXML = function (xmlobj, trimwhitespace, nsprefix) {
     var lfcnode = LzXMLLoader.prototype.copyFlashXML(xmlobj, trimwhitespace, nsprefix);
-    var fc = lfcnode.childNodes[0];
-    if ( fc instanceof LzDataText ) return null;
-    return fc;
+    if (lfcnode instanceof LzDataElement) {
+        // create a new, empty ownerDocument (LPP-7537)
+        new LzDataElement(null, {}, [lfcnode]);
+        return lfcnode;
+    } else {
+        return null;
+    }
 }

Modified: openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf9/LzXMLParser.as
===================================================================
--- openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf9/LzXMLParser.as	2009-04-19 17:02:25 UTC (rev 13708)
+++ openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf9/LzXMLParser.as	2009-04-19 17:08:25 UTC (rev 13709)
@@ -11,7 +11,6 @@
 /**
   * @shortdesc Utility for parsing text into native XML DOM object
   */
-
 public class LzXMLParser {
 
 /**
@@ -24,10 +23,17 @@
   * @return nativeXMLObject: An XML DOM object native to the runtime platform
   */
 public static function parseXML (str:String, trimwhitespace:Boolean, nsprefix:Boolean) :XML {
+    // if true : trims whitespace and ignores full whitespace nodes
+    // otherwise : leaves whitespace unaffected
     XML.ignoreWhitespace = trimwhitespace;
     var xmlobj:XML = XML(str);
+    // always remove full whitespace nodes
     xmlobj.normalize();
-    return xmlobj;
+    if (xmlobj.nodeKind() == "element") {
+        return xmlobj;
+    } else {
+        return null;
+    }
 }
 
 } // End of LzXMLParser

Modified: openlaszlo/trunk/test/lfc/data/datapointer.lzx
===================================================================
--- openlaszlo/trunk/test/lfc/data/datapointer.lzx	2009-04-19 17:02:25 UTC (rev 13708)
+++ openlaszlo/trunk/test/lfc/data/datapointer.lzx	2009-04-19 17:08:25 UTC (rev 13709)
@@ -29,7 +29,7 @@
             this.doIt( dp1 , 'localme');
         </method>
 
-        <method name="test2" args="...ignore">
+        <method name="test2" args="ignore=null">
             if ( ! this.dp2ready ){
                 if ( ! this.t2del ){
                     Debug.write( "test isn't done until async test runs" );
@@ -62,6 +62,7 @@
 
             assertFalse( dp.setXPath  ( dsname + ":/ff"  ) );
             assertTrue( dp.setXPath  ( dsname+ ":/data"  ) );
+            Debug.info("debug-error '[...] matched 2 nodes' is intended");
             assertFalse( dp.setXPath  ( "match2"  ) );
             assertTrue( dp.setXPath  ( dsname+ ":/data" ) );
             assertTrue( dp.setXPath  ( "match2[2]"  ) );
@@ -79,8 +80,10 @@
 
 
             assertTrue( dp.isValid  ( ) );
+            assertSame( dp.p.parentNode.getLastChild(), dp.p);
             dp.deleteNode();
-            assertFalse( dp.isValid  ( ) );
+            assertTrue( dp.isValid  ( ) );
+            assertSame( dp.p.parentNode.getLastChild(), dp.p);
             assertTrue( dp.setXPath( dsname +":/" ) );
             assertTrue( dp.setXPath( "data/match2" ) );
             var ndp = dp.dupePointer  ();
@@ -152,6 +155,6 @@
 
 </library>
 <!-- * X_LZ_COPYRIGHT_BEGIN ***************************************************
-* Copyright 2001-2008 Laszlo Systems, Inc.  All Rights Reserved.              *
+* Copyright 2001-2009 Laszlo Systems, Inc.  All Rights Reserved.              *
 * Use is subject to license terms.                                            *
 * X_LZ_COPYRIGHT_END ****************************************************** -->

Modified: openlaszlo/trunk/test/lfc/data/datapointerServerless.lzx
===================================================================
--- openlaszlo/trunk/test/lfc/data/datapointerServerless.lzx	2009-04-19 17:02:25 UTC (rev 13708)
+++ openlaszlo/trunk/test/lfc/data/datapointerServerless.lzx	2009-04-19 17:08:25 UTC (rev 13709)
@@ -13,7 +13,7 @@
         <datapointer xpath="loadme2:/data" name="dp2" 
                      ondata="parent.dp2ready = true"/>
 
-        <method name="test2">
+        <method name="test2" args="ignore=null">
             if ( ! this.dp2ready ){
                 if ( ! this.t2del ){
                     Debug.write( "test isn't done until async test runs" );
@@ -47,6 +47,7 @@
             assertEquals( 'data' , dp.getNodeName() );
             assertFalse( dp.setXPath  ( dsname + ":/ff"  ) );
             assertTrue( dp.setXPath  ( dsname+ ":/data"  ) );
+            Debug.info("debug-error '[...] matched 2 nodes' is intended");
             assertFalse( dp.setXPath  ( "match2"  ) );
             assertTrue( dp.setXPath  ( dsname+ ":/data" ) );
             assertTrue( dp.setXPath  ( "match2[2]"  ) );
@@ -60,11 +61,12 @@
             assertEquals( canvas.datasets[ dsname ], dp.getDataset( ) );
             dp.setNodeName ("bunny");
             assertEquals( '<bunny x="22"><ee/><ff/><bb>otherbb</bb><bb last="true"/></bunny>' ,  dp.serialize() );
-            //broken;
 
             assertTrue( dp.isValid  ( ) );
+            assertSame( dp.p.parentNode.getLastChild(), dp.p);
             dp.deleteNode();
-            assertFalse( dp.isValid  ( ) );
+            assertTrue( dp.isValid  ( ) );
+            assertSame( dp.p.parentNode.getLastChild(), dp.p);
             assertTrue( dp.setXPath( dsname +":/" ) );
             assertTrue( dp.setXPath( "data/match2" ) );
             var ndp = dp.dupePointer  ();
@@ -117,6 +119,6 @@
 
 </library>
 <!-- * X_LZ_COPYRIGHT_BEGIN ***************************************************
-* Copyright 2001-2008 Laszlo Systems, Inc.  All Rights Reserved.              *
+* Copyright 2001-2009 Laszlo Systems, Inc.  All Rights Reserved.              *
 * Use is subject to license terms.                                            *
 * X_LZ_COPYRIGHT_END ****************************************************** -->

Modified: openlaszlo/trunk/test/lfc/data/xmlparser.lzx
===================================================================
--- openlaszlo/trunk/test/lfc/data/xmlparser.lzx	2009-04-19 17:02:25 UTC (rev 13708)
+++ openlaszlo/trunk/test/lfc/data/xmlparser.lzx	2009-04-19 17:08:25 UTC (rev 13709)
@@ -3,9 +3,17 @@
   <include href="lzunit" />
 
   <class name="TestXmlParser" extends="TestCase" >
-    <method name="addTests" >this.addTest("testXmlParser");</method>
+    <method name="addTests" >
+        // test LzDataElement.stringToLzData
+        this.addTest("testXmlParser");
+        // test native xml-parser
+        this.addTest("testValidXml");
+        this.addTest("testInvalidXml");
+        // test whitespace handling in parser
+        this.addTest("testWhitespace");
+    </method>
     <method name="testXmlParser" ><![CDATA[
-        Debug.info("debug-warnings are intended for this test");
+        Debug.info("BEGIN :: debug-warnings are intended for this test");
         assertNull(LzDataElement.stringToLzData(null));
         assertNull(LzDataElement.stringToLzData(""));
         assertNull(LzDataElement.stringToLzData("a"));
@@ -49,7 +57,58 @@
             assertNull(LzDataElement.stringToLzData("<?xml version=\"1.0\" ?>"));
             assertNull(LzDataElement.stringToLzData("<?xml version=\"1.0\" ?><?xml version=\"1.0\" ?>"));
         }
+        Debug.info("END :: debug-warnings are intended for this test");
     ]]></method>
+    <method name="testValidXml" ><![CDATA[
+        var valid:Array = ["<a/>"];
+        for (var i:int = 0; i < valid.length; ++i) {
+            var s:String = valid[i];
+            try {
+                var parsed:* = LzXMLParser.parseXML(s, true, true);
+                assertNotNull(parsed);
+            } catch (e) {
+                // some runtimes throw exceptions
+                Debug.warn("runtime error %w for '%s'", e, s);
+                assertTrue(false);
+            }
+        }
+    ]]></method>
+    <method name="testInvalidXml"><![CDATA[
+        Debug.info("BEGIN :: debug-infos are intended for this test");
+        var invalid:Array = [null, "", "simple string", "<a/><a/>"];
+        for (var i:int = 0; i < invalid.length; ++i) {
+            var s:String = invalid[i];
+            try {
+                var parsed:* = LzXMLParser.parseXML(s, true, true);
+                assertNull(parsed);
+            } catch (e) {
+                // some runtimes throw exceptions
+                Debug.info("runtime error %w for '%s'", e, s);
+                assertTrue(true);
+            }
+        }
+        Debug.info("END :: debug-infos are intended for this test");
+    ]]></method>
+    <method name="testWhitespace"><![CDATA[
+        for (var i:int = 0; i < 2; ++i) {
+            var s:String = "<a> content </a>";
+            var trimwhite:Boolean = (i != 0);
+            var node:LzDataElement = lz.DataElement.stringToLzData(s, trimwhite);
+            assertNotNull(node);
+            var text:LzDataText = node.getFirstChild() cast LzDataText;
+            assertNotNull(text);
+            assertEquals([" content ", "content"][i], text.data);
+        }
+
+        for (var i:int = 0; i < 2; ++i) {
+            var s:String = "<a>  </a>";
+            var trimwhite:Boolean = (i != 0);
+            var node:LzDataElement = lz.DataElement.stringToLzData(s, trimwhite);
+            assertNotNull(node);
+            // full whitespace text nodes are always ignored
+            assertEquals(0, node.childNodes.length);
+        }
+    ]]></method>
   </class>
 
 </library>



More information about the Laszlo-checkins mailing list