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, [EMAIL PROTECTED] 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 [EMAIL PROTECTED] 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
[EMAIL PROTECTED]
http://www.openlaszlo.org/mailman/listinfo/laszlo-checkins

Reply via email to