[Laszlo-dev] [Laszlo-checkins] r11021 - openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf
P T Withington
ptw at pobox.com
Wed Sep 17 06:10:38 PDT 2008
FWIW, JS2 was going to spec that iterating over an object had to
happen in the order the elements were inserted (what all but swf8
already do). I don't know if this is a fix that is going to go into
3.1.
On 2008-09-16, at 11:16EDT, bargull at openlaszlo.org wrote:
> Author: bargull
> Date: 2008-09-16 08:16:38 -0700 (Tue, 16 Sep 2008)
> New Revision: 11021
>
> Modified:
> openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf/LzLoader.lzs
> Log:
> Change 20080916-bargull-UDy by bargull at dell--p4--2-53 on 2008-09-16
> 14:31:15
> in /home/Admin/src/svn/openlaszlo/trunk
> for http://svn.openlaszlo.org/openlaszlo/trunk
>
> Summary: xml attribute order
>
> New Features:
>
> Bugs Fixed: LPP-3379
>
> Technical Reviewer: hminsky
> QA Reviewer: (pending)
> Doc Reviewer: (pending)
>
> Documentation:
>
> Release Notes:
>
> Details:
> Both, dhtml and swf9, preserve the xml-attribute order. But for swf8
> and a compiled-in dataset resp. a http-dataset with nsprefix=false,
> the xml-attribute order is reversed. This happens because flash
> iterates over an object in reversed insertion order. But if we
> insert every xml-attribute also in reversed order, both reversions
> nullify each other and people will stop complaining about this issue.
> Additionally, I've copied the "fast-path" attribute copy code from
> the iterative xml-copy version to the recursive one.
>
>
>
> Tests:
> alldata passes
> testcase at bugreport
>
>
>
> Modified: openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf/LzLoader.lzs
> ===================================================================
> --- openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf/LzLoader.lzs
> 2008-09-16 15:13:09 UTC (rev 11020)
> +++ openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf/LzLoader.lzs
> 2008-09-16 15:16:38 UTC (rev 11021)
> @@ -444,19 +444,34 @@
> }
> lfcnode = new LzDataText(nv);
> } else {
> - // slow but sure way to copy attributes
> - var nattrs = node.attributes;
> - var cattrs = {};
> - for (var key in nattrs) {
> - var nkey = key;
> - if (!nsprefix) {
> + if (! nsprefix) {
> + // slow but sure way to copy attributes
> + var nattrs = node.attributes;
> + var cattrs = {};
> + var attrlist = [];
> + for (var key in nattrs) {
> + var nkey = key;
> // strip namespace prefixes
> var colpos = key.indexOf(':');
> if (colpos >= 0) {
> - nkey = key.substring(colpos+1);
> + nkey = key.substring(colpos + 1);
> }
> + //cattrs[nkey] = nattrs[key];
> + attrlist.push(nkey, nattrs[key]);
> }
> - cattrs[nkey] = nattrs[key];
> +
> + // Flash iterates over an object in reversed insertion
> order.
> + // But as we want to preserve the original xml-
> attribute order,
> + // we need to insert the attributes also in reversed
> order.
> + for (var i = attrlist.length - 1; i >= 0; i -= 2) {
> + cattrs[attrlist[i - 1]] = attrlist[i];
> + }
> + } else {
> + // this is the fast path
> + var cattrs = node.attributes;
> + cattrs.__proto__ = Object.prototype;
> + cattrs.constructor = Object;
> + ASSetPropFlags(cattrs, ['__proto__', 'constructor'], 1,
> 7);
> }
>
> var nname = node.nodeName;
> @@ -597,23 +612,31 @@
> // After this works, try bashing the __proto__
> // and see if GC still works.
>
> - var stripnsprefix = !nsprefix;
> - var nattrs = node.attributes;
> - var cattrs;
> - if (stripnsprefix) {
> + if (! nsprefix) {
> // this is slow, we iterate over every attribute name
> - cattrs = {};
> + var nattrs = node.attributes;
> + var cattrs = {};
> + var attrlist = [];
> for (var key in nattrs) {
> var nkey = key;
> + // strip namespace prefixes
> var colpos = key.indexOf(':');
> if (colpos >= 0) {
> - nkey = key.substring(colpos+1);
> + nkey = key.substring(colpos + 1);
> }
> - cattrs[nkey] = nattrs[key];
> + //cattrs[nkey] = nattrs[key];
> + attrlist.push(nkey, nattrs[key]);
> }
> +
> + // Flash iterates over an object in reversed
> insertion order.
> + // But as we want to preserve the original xml-
> attribute order,
> + // we need to insert the attributes also in
> reversed order.
> + for (var i = attrlist.length - 1; i >= 0; i -= 2) {
> + cattrs[attrlist[i - 1]] = attrlist[i];
> + }
> } else {
> // this is the fast path
> - cattrs = node.attributes;
> + var cattrs = node.attributes;
> cattrs.__proto__ = oproto;
> cattrs.constructor = Object;
> ASSetPropFlags(cattrs, ['__proto__', 'constructor'],
> 1, 7);
> @@ -638,7 +661,6 @@
> attributes: cattrs,
> ownerDocument: lfcparent.ownerDocument,
> parentNode: lfcparent};
> -
> }
>
> // Add to the parent's childnodes.
>
>
> _______________________________________________
> Laszlo-checkins mailing list
> Laszlo-checkins at openlaszlo.org
> http://www.openlaszlo.org/mailman/listinfo/laszlo-checkins
More information about the Laszlo-dev
mailing list