[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