/[suikacvs]/webroot/www/js/enum/props.en.html
Suika

Contents of /webroot/www/js/enum/props.en.html

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.4 - (hide annotations) (download) (as text)
Sat Feb 28 04:08:35 2009 UTC (17 years, 4 months ago) by wakaba
Branch: MAIN
Changes since 1.3: +70 -8 lines
File MIME type: text/html
added submission of results

1 wakaba 1.1 <!DOCTYPE HTML>
2 wakaba 1.2 <title>JavaScript object properties</title>
3 wakaba 1.1 <link rel=stylesheet href="/www/style/html/xhtml">
4 wakaba 1.2 <link rel=license href="http://suika.fam.cx/c/pd" title="Public Domain. (This document and |prop-list| file.)">
5 wakaba 1.1
6     <style>
7     [name=result_ta] {
8     height: 40em;
9     }
10 wakaba 1.4 [hidden] {
11     display: none;
12     }
13 wakaba 1.1 </style>
14    
15     <body onload="
16     var xhr = new XMLHttpRequest ();
17     xhr.open ('GET', 'prop-list.txt?' + Math.random (), false);
18     xhr.send (null);
19     document.getElementsByName ('known_props_ta')[0].value = xhr.responseText;
20     ">
21    
22 wakaba 1.2 <h1>JavaScript object properties</h1>
23 wakaba 1.1
24     <form>
25 wakaba 1.2 <p><label>Code to be <code>eval</code>ed:<br>
26     <textarea name=code_ta></textarea></label>
27 wakaba 1.1
28     <p><label>List of known properties:<br>
29     <textarea name=known_props_ta>
30 wakaba 1.2 </textarea></label><br>
31     (<a href=prop-list>source</a>; ask <a
32     href="/~wakaba/who?">Wakaba</a> to add more properties)
33 wakaba 1.1
34     <p><button type=submit>Start</button>
35    
36     <h2>Result</h2>
37    
38     <p><textarea name=result_ta>
39     </textarea>
40    
41     </form>
42    
43 wakaba 1.4 <form id=submission hidden method=post accept-charset=utf-8>
44     <div style="display: none"></div>
45     <p><label>User-Agent: <input name=env-name></label>
46     <p><button type=submit>Submit result</button> (<a>Results</a>)
47     </form>
48    
49 wakaba 1.1 <script>
50     document.forms[0].onsubmit = function (event) {
51     if (window.event) window.event.returnValue = false;
52     if (event && event.preventDefault) event.preventDefault ();
53    
54     var objCode = this.code_ta.value;
55     var obj = eval (objCode);
56    
57     if (typeof (obj) === "undefined" || obj === null) {
58     obj = {};
59     objCode = '{}';
60     }
61    
62     var knownProps = this.known_props_ta.value.split (/[\r\n]+/);
63    
64     var newKnownProps = [];
65     var newKnownPropNames = {};
66    
67     var props = {};
68     var noProps = {};
69    
70     for (var i = 0; i < knownProps.length; i++) {
71     var propName = knownProps[i];
72     if (propName == '') continue;
73     if (propName.match (/^\s/)) continue;
74 wakaba 1.2 if (propName.match (/\S\s+\S/)) continue;
75 wakaba 1.1 propName = propName.replace (/\s+$/, '');
76    
77     try {
78     if (typeof (obj[propName]) !== 'undefined') {
79     if (!newKnownPropNames["name=" + propName]) newKnownProps.push (propName);
80     newKnownPropNames["name=" + propName] = true;
81     props["name="+propName] = {dontEnum: true};
82     } else {
83     if (!newKnownPropNames["name=" + propName]) newKnownProps.push (propName);
84     newKnownPropNames["name=" + propName] = true;
85     noProps["name="+propName] = {};
86     }
87     } catch (e) {
88     if (!newKnownPropNames["name=" + propName]) newKnownProps.push (propName);
89     newKnownPropNames["name=" + propName] = true;
90     props["name="+propName] = {error: '' + e};
91     }
92     }
93    
94     for (var propName in obj) {
95     if (!props["name="+propName]) {
96     props["name="+propName] = {notInList: true};
97     newKnownProps.push (propName);
98     }
99     props["name="+propName].dontEnum = false;
100     }
101    
102     var n = function (s) {
103     s = s || '';
104     s = s.toLowerCase ()
105     .replace (/_/g, '');
106     return s;
107     };
108    
109     var sort = function (l) {
110     var m;
111     try {
112 wakaba 1.3 m = l.sort (function (_a, _b) {
113     a = n (_a); b = n (_b);
114     return a < b ? -1 : a > b ? 1 : _a < _b ? -1 : _a > _b ? 1 : 0;
115 wakaba 1.1 });
116     } catch (e) { } // IE sometimes fails. Why?
117     return m || l;
118     };
119    
120     var propNames = [];
121     for (var propName in props) {
122     propNames.push (propName);
123     }
124     propNames = sort (propNames);
125    
126     var noPropNames = [];
127     for (var propName in noProps) {
128     noPropNames.push (propName);
129     }
130     noPropNames = sort (noPropNames);
131    
132 wakaba 1.4 var ri = [];
133    
134 wakaba 1.1 var result = 'UA: ' + navigator.userAgent + "\n";
135     result += 'Object: ' + objCode + "\n";
136     result += "\n";
137     result += 'Properties:\n';
138     for (var i = 0; i < propNames.length; i++) {
139     result += propNames[i].replace (/^name=/, '');
140     if (props[propNames[i]].dontEnum) result += '\tDontEnum';
141     if (props[propNames[i]].notInList) result += '\t_not_in_list_';
142     if (props[propNames[i]].error) result += '\t_error(' + props[propNames[i]].error + ')_';
143     result += '\n';
144 wakaba 1.4
145     ri.push ({name: propNames[i].replace (/^name=/, ''),
146     label: '',
147     className: 'has',
148     result: (props[propNames[i]].dontEnum ? 'DontEnum' : '')
149     + (props[propNames[i]].error ? '_error(' + props[propNames[i]].error + ')' : '')});
150     }
151     result += "\n";
152     result += "Not found:\n"
153     for (var i = 0; i < noPropNames.length; i++) {
154     result += noPropNames[i].replace (/^name=/, '') + '\n';
155    
156     /*
157     ri.push ({name: noPropNames[i].replace (/^name=/, ''),
158     label: '',
159     className: 'not-have',
160     result: ''});
161     */
162     }
163     this.result_ta.value = result;
164    
165     this.known_props_ta.value = sort (newKnownProps).join ("\n");
166 wakaba 1.1
167 wakaba 1.4 var trId = encodeURIComponent (objCode)
168     .replace (/%/g, '')
169     .replace (/[A-Z]+/g, function (s) { return s.toLowerCase () })
170     .replace (/[_.!~*'()]/g, function (s) { return s.charCodeAt (0).toString (16) });
171     var submission = document.forms.submission;
172    
173     submission.action = '/gate/test-results/list/enum-' + trId;
174     submission.getElementsByTagName ('a')[0].href = submission.action + '/all';
175    
176     submission['env-name'].value = navigator.userAgent;
177     var c = submission.getElementsByTagName ('div')[0];
178     c.innerHTML = '';
179     for (var i = 0; i < ri.length; i++) {
180     var p = document.createElement ('input');
181     p.name = 'test-name';
182     p.value = ri[i].name;
183     c.appendChild (p);
184    
185     var p = document.createElement ('input');
186     p.name = 'test-label';
187     p.value = ri[i].label;
188     c.appendChild (p);
189    
190     var p = document.createElement ('input');
191     p.name = 'test-class';
192     p.value = ri[i].className;
193     c.appendChild (p);
194    
195     var p = document.createElement ('input');
196     p.name = 'test-result';
197     p.value = ri[i].result;
198     c.appendChild (p);
199     }
200     submission.removeAttribute ('hidden');
201 wakaba 1.1
202     return false;
203     };
204     </script>
205 wakaba 1.4
206     <form action=dummy><input type=submit value=Dummy1></form>
207     <form action=/gate/test-results/list/_dummy_ method=post><input type=submit value=Dummy2></form>

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24