History | Log In     View a printable version of the current page.  
Issue Details (XML | Word | Printable)

Key: LPP-3497
Type: Bug Bug
Status: Verified Verified
Resolution: Fixed
Priority: P1 P1
Assignee: Henry Minsky
Reporter: Frisco Del Rosario
Votes: 0
Watchers: 1
Operations

If you were logged in you would be able to see more operations.
OpenLaszlo

trimwhitespace attribute doesn't work

Created: 31/Jan/07 04:49 PM   Updated: 08/May/07 10:28 AM
Component/s: Server - XML
Affects Version/s: 4.0.0
Fix Version/s: 4.0.2, Legals

Time Tracking:
Not Specified

Severity: Minor
Fixed in Change#: 4,517
Runtime: N/A
Fix in hand: False


 Description  « Hide
This resulted from LPP-3414, which said LzDataset.trimwhitespace causes a compilation error. The reason is that trimwhitespace must be specified in script, not tag (filing a separate item to correct the LZX Reference about this).

However, after modifying the LPP-3414 testcase, it seems that trimwhitespace just doesn't work:

<canvas debug="true">
<include href="lzunit"/>

<handler name="oninit">
UOP.setAttribute('trimwhitespace', true);
</handler>


<dataset name="UOP">
<PacificXML>
<player team="tigers">
<playername>Lav en der</playername>
</player>
</PacificXML>
</dataset>

<text id="tiger" datapath="UOP:/PacificXML[1]/player[1]/playername[1]/text()"/>


<TestSuite>
<TestCase>
<method name="testTrimWhitespace">
assertEquals(true, UOP.trimwhitespace);
assertEquals("Lavender", tiger.text);
</method>
</TestCase>
</TestSuite>

</canvas>

 All   Comments   Work Log   Change History      Sort Order: Ascending order - Click to sort in descending order
Frisco Del Rosario - 15/Mar/07 11:41 AM
LzDataset.trimwhitespace does default to false:

<canvas debug="true">
<include href="lzunit"/>
<simplelayout axis="y" spacing="10"/>

<dataset name="myData">
<foo/>
</dataset>

<TestSuite>
<TestCase>
<method name="testTrimwhitespaceDefault">
assertFalse(myData.getAttribute('trimwhitespace'));
</method>
</TestCase>
</TestSuite>

</canvas>

Frisco Del Rosario - 15/Mar/07 12:25 PM
I think I have written the proper test to show that trimwhitespace is not working.

I copied the example data from http://127.0.0.1:8080/trunk/docs/guide/data-structures.html#d0e20889 (Chapter 35, Data, XML, and XPath, section 2.1 Whitespace):

In OpenLaszlo applications, the runtime doesn't trim whitespace. Rather, it totally removes text nodes which have all whitespace. Like, for example

<foo>
<bar/>

</foo>

would have two text nodes of all whitespace, before and after the <bar> tag.

I took that XML snippet, and made two identical datasets from it. On one, I set trimwhitespace to true. On the other, I set trimwhitespace to false. Then I attached a datapointer to the text from each. I expected the datapointers to be different, but they were the same:

<canvas debug="true">
<include href="lzunit"/>
<simplelayout axis="y"/>

<script>
myData.setAttribute('trimwhitespace', false);
myOtherData.setAttribute('trimwhitespace', true);
</script>

<dataset name="myData">
<myXML>
<foo>
<bar/>

</foo>
</myXML>
</dataset>

<dataset name="myOtherData">
<myOtherXML>
<otherFoo>
<bar/>

</otherFoo>
</myOtherXML>
</dataset>

<datapointer id='myDataDP' xpath="myData:/myXML/foo"/>
<datapointer id='myOtherDataDP' xpath="myOtherData:/myOtherXML/otherFoo"/>

<script>
var foo = myDataDP.getNodeText();
var bar = myOtherDataDP.getNodeText();
</script>


<TestSuite>
    <TestCase>
        <method name="testTrim">
assertNotSame(foo, bar); //The assertion should be true if the trimwhitespace attribute is trimming whitespace, correct?
        </method>
    </TestCase>
</TestSuite>

</canvas>


Frisco Del Rosario - 23/Mar/07 01:50 PM
The same type of test, but improved because the XML is imported (and therefore, linebreaks are included):

<!--mynode.xml-->
<myNode>
<text>

The quick brown fox


jumps over the

lazy dog

<foo/>

</text>


</myNode>

<!--end-->

<!--test-->

<canvas debug="true">
<include href="lzunit"/>

<dataset name="myDataset" src="/Users/laszlosystems/src/svn/openlaszlo/trunk/my-apps/mynode.xml" request="true"/>
<dataset name="myTrimDataset" src="/Users/laszlosystems/src/svn/openlaszlo/trunk/my-apps/mynode.xml" request="true"/>

<datapointer id="myDatapointer" xpath="myDataset:/"/>
<datapointer id="myTrimDatapointer" xpath="myTrimDataset:/"/>

<script>
myTrimDataset.setAttribute('trimwhitespace', true);
</script>

<TestSuite>
<TestCase>
<method name="testSrc">
Debug.write('myDataset.trimwhitespace is ', myDataset.trimwhitespace);
assertFalse(myDataset.trimwhitespace);
myDatapointer.selectChild();
myDatapointer.selectChild();
var foo = myDatapointer.getNodeText();

Debug.write('myTrimDataset.trimwhitespace is ', myTrimDataset.trimwhitespace);
assertTrue(myTrimDataset.trimwhitespace);
myTrimDatapointer.selectChild();
myTrimDatapointer.selectChild();
var bar = myTrimDatapointer.getNodeText();

assertNotSame(foo, bar, 'should not be the same if trimwhitespace is working');

</method>
</TestCase>
</TestSuite>

</canvas>

<!-- Copyright 2001-2006 Laszlo Systems, Inc. -->


Henry Minsky - 26/Mar/07 12:58 PM
This bug only occurs with data which is compiled in to the app. If the request type is set to http, or the src="http:mynode.xml", then it behaves properly.

The bug is that compile-time datasets expand in the lzx compiler into calls to lzAddLocalData

e.g.,
lzAddLocalData("myTrimDataset", "<datacontent><myNode>\r\n<text>\r\n\r\nThe quick brown fox\r\n\r\n\r\njumps over the\r\n\r\nlazy dog\r\n\r\n<foo />\r\n\r\n</text>\r\n\r\n\r\n</myNode></datacontent>");

And this does not seem to properly handle the trimwhitespace arg.

Henry Minsky - 26/Mar/07 01:58 PM
There is no need for "request=true" in datasets that are compiled into the app

<canvas debug="true">
<include href="lzunit"/>

<dataset name="myDataset" src="mynode.xml" />
<dataset name="myTrimDataset" src="mynode.xml" trimwhitespace="true" />

<datapointer id="myDatapointer" xpath="myDataset:/"/>
<datapointer id="myTrimDatapointer" xpath="myTrimDataset:/"/>

<TestSuite>
<TestCase>
<method name="testSrc">
Debug.write('myDataset.trimwhitespace is ', myDataset.trimwhitespace);
assertFalse(myDataset.trimwhitespace);
myDatapointer.selectChild();
myDatapointer.selectChild();
var foo = myDatapointer.getNodeText();

Debug.write('myTrimDataset.trimwhitespace is ', myTrimDataset.trimwhitespace);
assertTrue(myTrimDataset.trimwhitespace);
myTrimDatapointer.selectChild();
myTrimDatapointer.selectChild();
var bar = myTrimDatapointer.getNodeText();

assertNotSame(foo, bar, 'should not be the same if trimwhitespace is working');

</method>
</TestCase>
</TestSuite>

</canvas>

This passes with my proposed change (out for review to pga)

Henry Minsky - 26/Mar/07 01:59 PM
under review by pga

Frisco Del Rosario - 29/Mar/07 12:42 PM
Hold on.

In Henry's changed script, trimwhitespace is set in the tag, which isn't allowed. (Note that the debug.write line "myTrimDataset.trimwhitespace is' is returning false.)

I took Henry's script, and set trimwhitespace to true in script. The NotSame assertion continues to run red:

<canvas debug="true">
<include href="lzunit"/>

<dataset name="myDataset" src="mynode.xml" />
<dataset name="myTrimDataset" src="mynode.xml" />

<datapointer id="myDatapointer" xpath="myDataset:/"/>
<datapointer id="myTrimDatapointer" xpath="myTrimDataset:/"/>

<TestSuite>
<TestCase>
<method name="testSrc">
assertFalse(myDataset.trimwhitespace);
Debug.write('myDataset.trimwhitespace is ', myDataset.trimwhitespace);
myDatapointer.selectChild();
myDatapointer.selectChild();
var foo = myDatapointer.getNodeText();

myTrimDataset.setAttribute('trimwhitespace', true);
assertTrue(myTrimDataset.trimwhitespace);
Debug.write('myTrimDataset.trimwhitespace is ', myTrimDataset.trimwhitespace);
myTrimDatapointer.selectChild();
myTrimDatapointer.selectChild();
var bar = myTrimDatapointer.getNodeText();

assertNotSame(foo, bar, 'should not be the same if trimwhitespace is working');

</method>
</TestCase>
</TestSuite>

</canvas>

Henry Minsky - 29/Mar/07 01:08 PM
The changes went into legals in revisions changes: r4516:4517
(change got split into two checkins by accident).

The lzx schema does allow the trimwhitespace attribute on datasets, so there ought to be no warning.

Which build did you try this in? These changes have not been merged to OL4 branch yet, they are only in legals


Henry Minsky - 01/May/07 12:25 PM
4516:4517

I believe this is fixed

Frisco Del Rosario - 02/May/07 12:52 PM
<canvas debug="true">
<include href="lzunit"/>

<dataset name="myDataset" src="mynode.xml" />
<dataset name="myTrimDataset" src="mynode.xml" trimwhitespace="true"/>

<datapointer id="myDatapointer" xpath="myDataset:/"/>
<datapointer id="myTrimDatapointer" xpath="myTrimDataset:/"/>


<TestSuite>
<TestCase>
<method name="setUp">
Debug.write('myDataset.trimwhitespace is ', myDataset.trimwhitespace);
myDatapointer.selectChild();
myDatapointer.selectChild();

myTrimDataset.setAttribute('trimwhitespace', true);
Debug.write('myTrimDataset.trimwhitespace is ', myTrimDataset.trimwhitespace);
myTrimDatapointer.selectChild();
myTrimDatapointer.selectChild();
</method>

<method name="testSrc">
assertFalse(myDataset.trimwhitespace);
assertTrue(myTrimDataset.trimwhitespace);

foo = myDatapointer.getNodeText();
bar = myTrimDatapointer.getNodeText();

Debug.write(myDatapointer.serialize(foo));
Debug.write(myTrimDatapointer.serialize(bar));

assertNotSame(foo, bar, 'should not be the same if trimwhitespace is working');
</method>
</TestCase>
</TestSuite>

</canvas>