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