1 if(!dojo._hasResource["dojox.dtl.tests.html.util"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
2 dojo._hasResource["dojox.dtl.tests.html.util"] = true;
3 dojo.provide("dojox.dtl.tests.html.util");
5 dojo.require("dojox.dtl.html");
6 dojo.require("dojox.dtl.render.html");
7 dojo.require("dojox.string.Builder");
9 dojox.dtl.HtmlBuffer.prototype.onClone = function(from, to){
10 var clones = this._clones = this._clones || [];
12 for(var i = 0, group; group = clones[i]; i++){
13 for(var j = 0, item; item = group[j]; j++){
17 }else if(item === to){
24 clones.push([from, to]);
26 dojox.dtl.HtmlBuffer.prototype.onAddEvent = function(node, type, description){
27 var events = this._events = this._events || [];
30 for(var i = 0, evt; evt = events[i]; i++){
39 events.push([node, type, description]);
43 dojox.dtl.tests.html.util.render = function(/*HtmlTemplate*/ template, /*Context*/ context) {
45 var div = document.createElement("div");
46 dojo.style(div, "visibility", "hidden");
47 var attach = document.createElement("div");
48 div.appendChild(attach);
49 dojo.body().appendChild(div);
51 var buffer = template.getBuffer();
52 var canvas = new dojox.dtl.render.html.Render(attach, template);
53 canvas.render(context, template, buffer);
54 var clones = buffer._clones;
55 var events = buffer._events;
57 var first = dojox.dtl.tests.html.util.serialize(canvas.domNode, template.tokens, clones, events).toString();
59 buffer = template.getBuffer();
60 buffer._clones = clones;
61 buffer._events = events;
62 canvas.render(context, template, buffer);
64 var second = dojox.dtl.tests.html.util.serialize(canvas.domNode, template.tokens, clones, events).toString();
66 doh.is("Compare re-render: " + first, "Compare re-render: " + second);
72 div.parentNode.removeChild(div);
76 dojox.dtl.tests.html.util.serialize = function(node, tokens, clones, events, output) {
77 var types = dojox.dtl.html.types;
78 clones = clones || [];
79 events = events || [];
81 if (node.nodeType == 3) {
82 output.append(node.nodeValue);
84 var name = node.nodeName.toLowerCase();
87 output = new dojox.string.Builder();
89 output.append("<").append(name);
91 var attributes = dojo.filter(tokens, function(token){
92 if(token[0] == types.attr){
93 for(var i = 0, group; group = clones[i]; i++){
94 // group is any set of nodes that were originally the sam
96 for(var j = 0, item; item = group[j]; j++){
97 if(item === token[1] || item === node){
99 // This is entered when we have 2 hits within a clone group.
100 // The first would be the original node
101 // The second would be if our current node is a clone
111 for(var i = 0, attribute; attribute = attributes[i]; i++){
113 if(attribute[2] == "class"){
114 value = node.className || value;
115 }else if(attribute[2] == "for"){
116 value = node.htmlFor || value;
117 }else if(node.getAttribute){
118 value = node.getAttribute(attribute[2], 2) || value;
119 if(dojo.isIE && (attribute[2] == "href" || attribute[2] == "src")){
121 var hash = location.href.lastIndexOf(location.hash);
122 var href = location.href.substring(0, hash).split("/");
124 href = href.join("/") + "/";
125 if(value.indexOf(href) == 0){
126 value = value.replace(href, "");
128 value = decodeURIComponent(value);
133 output.append(" ").append(attribute[2]).append('="').append(value.replace(/"/g, '\\"')).append('"');
139 for(var i = 0, evt; evt = events[i]; i++){
141 output.append(" ").append(evt[1]).append('="').append(evt[2]).append('"');
146 if(!node.childNodes.length){
150 dojo.forEach(node.childNodes, function(node){
151 dojox.dtl.tests.html.util.serialize(node, tokens, clones, events, output);
153 output.append("</").append(name).append(">");