/[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.5 - (hide annotations) (download) (as text)
Sat Feb 28 04:37:39 2009 UTC (17 years, 4 months ago) by wakaba
Branch: MAIN
Changes since 1.4: +2 -1 lines
File MIME type: text/html
variables are accidentally made global

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 wakaba 1.5 var a = n (_a);
114     var b = n (_b);
115 wakaba 1.3 return a < b ? -1 : a > b ? 1 : _a < _b ? -1 : _a > _b ? 1 : 0;
116 wakaba 1.1 });
117     } catch (e) { } // IE sometimes fails. Why?
118     return m || l;
119     };
120    
121     var propNames = [];
122     for (var propName in props) {
123     propNames.push (propName);
124     }
125     propNames = sort (propNames);
126    
127     var noPropNames = [];
128     for (var propName in noProps) {
129     noPropNames.push (propName);
130     }
131     noPropNames = sort (noPropNames);
132    
133 wakaba 1.4 var ri = [];
134    
135 wakaba 1.1 var result = 'UA: ' + navigator.userAgent + "\n";
136     result += 'Object: ' + objCode + "\n";
137     result += "\n";
138     result += 'Properties:\n';
139     for (var i = 0; i < propNames.length; i++) {
140     result += propNames[i].replace (/^name=/, '');
141     if (props[propNames[i]].dontEnum) result += '\tDontEnum';
142     if (props[propNames[i]].notInList) result += '\t_not_in_list_';
143     if (props[propNames[i]].error) result += '\t_error(' + props[propNames[i]].error + ')_';
144     result += '\n';
145 wakaba 1.4
146     ri.push ({name: propNames[i].replace (/^name=/, ''),
147     label: '',
148     className: 'has',
149     result: (props[propNames[i]].dontEnum ? 'DontEnum' : '')
150     + (props[propNames[i]].error ? '_error(' + props[propNames[i]].error + ')' : '')});
151     }
152     result += "\n";
153     result += "Not found:\n"
154     for (var i = 0; i < noPropNames.length; i++) {
155     result += noPropNames[i].replace (/^name=/, '') + '\n';
156    
157     /*
158     ri.push ({name: noPropNames[i].replace (/^name=/, ''),
159     label: '',
160     className: 'not-have',
161     result: ''});
162     */
163     }
164     this.result_ta.value = result;
165    
166     this.known_props_ta.value = sort (newKnownProps).join ("\n");
167 wakaba 1.1
168 wakaba 1.4 var trId = encodeURIComponent (objCode)
169     .replace (/%/g, '')
170     .replace (/[A-Z]+/g, function (s) { return s.toLowerCase () })
171     .replace (/[_.!~*'()]/g, function (s) { return s.charCodeAt (0).toString (16) });
172     var submission = document.forms.submission;
173    
174     submission.action = '/gate/test-results/list/enum-' + trId;
175     submission.getElementsByTagName ('a')[0].href = submission.action + '/all';
176    
177     submission['env-name'].value = navigator.userAgent;
178     var c = submission.getElementsByTagName ('div')[0];
179     c.innerHTML = '';
180     for (var i = 0; i < ri.length; i++) {
181     var p = document.createElement ('input');
182     p.name = 'test-name';
183     p.value = ri[i].name;
184     c.appendChild (p);
185    
186     var p = document.createElement ('input');
187     p.name = 'test-label';
188     p.value = ri[i].label;
189     c.appendChild (p);
190    
191     var p = document.createElement ('input');
192     p.name = 'test-class';
193     p.value = ri[i].className;
194     c.appendChild (p);
195    
196     var p = document.createElement ('input');
197     p.name = 'test-result';
198     p.value = ri[i].result;
199     c.appendChild (p);
200     }
201     submission.removeAttribute ('hidden');
202 wakaba 1.1
203     return false;
204     };
205     </script>
206 wakaba 1.4
207     <form action=dummy><input type=submit value=Dummy1></form>
208     <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