annotate js/ext/domita.js @ 0:633c9cb05555

Origination.
author Atul Varma <varmaa@toolness.com>
date Sun, 07 Jun 2009 19:29:10 -0700
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1 // Copyright (C) 2008 Google Inc.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2 //
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3 // Licensed under the Apache License, Version 2.0 (the "License");
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
4 // you may not use this file except in compliance with the License.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
5 // You may obtain a copy of the License at
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
6 //
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
7 // http://www.apache.org/licenses/LICENSE-2.0
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
8 //
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
9 // Unless required by applicable law or agreed to in writing, software
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
10 // distributed under the License is distributed on an "AS IS" BASIS,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
12 // See the License for the specific language governing permissions and
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
13 // limitations under the License.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
14
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
15 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
16 * @fileoverview
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
17 * A partially tamed browser object model based on
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
18 * <a href="http://www.w3.org/TR/DOM-Level-2-HTML/Overview.html"
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
19 * >DOM-Level-2-HTML</a> and specifically, the
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
20 * <a href="http://www.w3.org/TR/DOM-Level-2-HTML/ecma-script-binding.html"
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
21 * >ECMAScript Language Bindings</a>.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
22 *
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
23 * Caveats:<ul>
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
24 * <li>This is not a full implementation.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
25 * <li>Security Review is pending.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
26 * <li><code>===</code> and <code>!==</code> on node lists will not
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
27 * behave the same as with untamed node lists. Specifically, it is
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
28 * not always true that {@code nodeA.childNodes === nodeA.childNodes}.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
29 * <li>Properties backed by setters/getters like {@code HTMLElement.innerHTML}
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
30 * will not appear to uncajoled code as DOM nodes do, since they are
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
31 * implemented using cajita property handlers.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
32 * </ul>
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
33 *
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
34 * <p>
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
35 * TODO(ihab.awad): Our implementation of getAttribute (and friends)
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
36 * is such that standard DOM attributes which we disallow for security
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
37 * reasons (like 'form:enctype') are placed in the "virtual"
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
38 * attributes map (this.node___.attributes___). They appear to be
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
39 * settable and gettable, but their values are ignored and do not have
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
40 * the expected semantics per the DOM API. This is because we do not
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
41 * have a column in html4-defs.js stating that an attribute is valid
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
42 * but explicitly blacklisted. Alternatives would be to always throw
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
43 * upon access to these attributes; to make them always appear to be
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
44 * null; etc. Revisit this decision if needed.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
45 *
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
46 * @author mikesamuel@gmail.com
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
47 * @requires console, document, window
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
48 * @requires clearInterval, clearTimeout, setInterval, setTimeout
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
49 * @requires ___, bridal, cajita, css, html, html4, unicode
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
50 * @provides attachDocumentStub, plugin_dispatchEvent___
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
51 * @overrides domitaModules
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
52 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
53
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
54 var domitaModules;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
55 if (!domitaModules) { domitaModules = {}; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
56
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
57 domitaModules.classUtils = function() {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
58
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
59 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
60 * Add setter and getter hooks so that the caja {@code node.innerHTML = '...'}
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
61 * works as expected.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
62 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
63 function exportFields(object, fields) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
64 for (var i = fields.length; --i >= 0;) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
65 var field = fields[i];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
66 var fieldUCamel = field.charAt(0).toUpperCase() + field.substring(1);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
67 var getterName = 'get' + fieldUCamel;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
68 var setterName = 'set' + fieldUCamel;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
69 var count = 0;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
70 if (object[getterName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
71 ++count;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
72 ___.useGetHandler(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
73 object, field, object[getterName]);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
74 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
75 if (object[setterName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
76 ++count;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
77 ___.useSetHandler(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
78 object, field, object[setterName]);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
79 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
80 if (!count) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
81 throw new Error('Failed to export field ' + field + ' on ' + object);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
82 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
83 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
84 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
85
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
86 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
87 * Makes the first a subclass of the second.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
88 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
89 function extend(subClass, baseClass) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
90 var noop = function () {};
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
91 noop.prototype = baseClass.prototype;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
92 subClass.prototype = new noop();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
93 subClass.prototype.constructor = subClass;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
94 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
95
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
96 return {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
97 exportFields: exportFields,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
98 extend: extend
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
99 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
100 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
101
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
102 /** XMLHttpRequest or an equivalent on IE 6. */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
103 domitaModules.XMLHttpRequestCtor = function (XMLHttpRequest, ActiveXObject) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
104 if (XMLHttpRequest) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
105 return XMLHttpRequest;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
106 } else if (ActiveXObject) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
107 // The first time the ctor is called, find an ActiveX class supported by
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
108 // this version of IE.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
109 var activeXClassId;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
110 return function ActiveXObjectForIE() {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
111 if (activeXClassId === void 0) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
112 activeXClassId = null;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
113 /** Candidate Active X types. */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
114 var activeXClassIds = [
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
115 'MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
116 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
117 'MICROSOFT.XMLHTTP.1.0', 'MICROSOFT.XMLHTTP.1',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
118 'MICROSOFT.XMLHTTP'];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
119 for (var i = 0, n = activeXClassIds.length; i < n; i++) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
120 var candidate = activeXClassIds[i];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
121 try {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
122 void new ActiveXObject(candidate);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
123 activeXClassId = candidate;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
124 break;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
125 } catch (e) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
126 // do nothing; try next choice
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
127 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
128 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
129 activeXClassIds = null;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
130 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
131 return new ActiveXObject(activeXClassId);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
132 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
133 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
134 throw new Error('ActiveXObject not available');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
135 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
136 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
137
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
138 domitaModules.TameXMLHttpRequest = function(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
139 xmlHttpRequestMaker,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
140 uriCallback) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
141 var classUtils = domitaModules.classUtils();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
142
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
143 // See http://www.w3.org/TR/XMLHttpRequest/
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
144
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
145 // TODO(ihab.awad): Improve implementation (interleaving, memory leaks)
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
146 // per http://www.ilinsky.com/articles/XMLHttpRequest/
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
147
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
148 function TameXMLHttpRequest() {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
149 this.xhr___ = new xmlHttpRequestMaker();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
150 classUtils.exportFields(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
151 this,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
152 ['onreadystatechange', 'readyState', 'responseText', 'responseXML',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
153 'status', 'statusText']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
154 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
155 TameXMLHttpRequest.prototype.setOnreadystatechange = function (handler) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
156 // TODO(ihab.awad): Do we need more attributes of the event than 'target'?
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
157 // May need to implement full "tame event" wrapper similar to DOM events.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
158 var self = this;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
159 this.xhr___.onreadystatechange = function(event) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
160 var evt = { target: self };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
161 return ___.callPub(handler, 'call', [void 0, evt]);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
162 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
163 // Store for later direct invocation if need be
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
164 this.handler___ = handler;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
165 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
166 TameXMLHttpRequest.prototype.getReadyState = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
167 // The ready state should be a number
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
168 return Number(this.xhr___.readyState);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
169 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
170 TameXMLHttpRequest.prototype.open = function (
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
171 method, URL, opt_async, opt_userName, opt_password) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
172 method = String(method);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
173 // The XHR interface does not tell us the MIME type in advance, so we
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
174 // must assume the broadest possible.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
175 var safeUri = uriCallback.rewrite(String(URL), "*/*");
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
176 // If the uriCallback rejects the URL, we throw an exception, but we do not
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
177 // put the URI in the exception so as not to put the caller at risk of some
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
178 // code in its stack sniffing the URI.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
179 if (safeUri === void 0) { throw 'URI violates security policy'; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
180 switch (arguments.length) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
181 case 2:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
182 this.async___ = true;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
183 this.xhr___.open(method, safeUri);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
184 break;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
185 case 3:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
186 this.async___ = opt_async;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
187 this.xhr___.open(method, safeUri, Boolean(opt_async));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
188 break;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
189 case 4:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
190 this.async___ = opt_async;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
191 this.xhr___.open(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
192 method, safeUri, Boolean(opt_async), String(opt_userName));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
193 break;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
194 case 5:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
195 this.async___ = opt_async;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
196 this.xhr___.open(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
197 method, safeUri, Boolean(opt_async), String(opt_userName),
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
198 String(opt_password));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
199 break;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
200 default:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
201 throw 'XMLHttpRequest cannot accept ' + arguments.length + ' arguments';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
202 break;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
203 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
204 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
205 TameXMLHttpRequest.prototype.setRequestHeader = function (label, value) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
206 this.xhr___.setRequestHeader(String(label), String(value));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
207 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
208 TameXMLHttpRequest.prototype.send = function(opt_data) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
209 if (arguments.length === 0) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
210 // TODO(ihab.awad): send()-ing an empty string because send() with no
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
211 // args does not work on FF3, others?
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
212 this.xhr___.send('');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
213 } else if (typeof opt_data === 'string') {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
214 this.xhr___.send(opt_data);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
215 } else /* if XML document */ {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
216 // TODO(ihab.awad): Expect tamed XML document; unwrap and send
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
217 this.xhr___.send('');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
218 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
219
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
220 // Firefox does not call the 'onreadystatechange' handler in
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
221 // the case of a synchronous XHR. We simulate this behavior by
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
222 // calling the handler explicitly.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
223 if (this.xhr___.overrideMimeType) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
224 // This is Firefox
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
225 if (!this.async___ && this.handler___) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
226 var evt = { target: this };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
227 ___.callPub(this.handler___, 'call', [void 0, evt]);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
228 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
229 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
230 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
231 TameXMLHttpRequest.prototype.abort = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
232 this.xhr___.abort();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
233 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
234 TameXMLHttpRequest.prototype.getAllResponseHeaders = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
235 var result = this.xhr___.getAllResponseHeaders();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
236 return (result === undefined || result === null) ?
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
237 result : String(result);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
238 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
239 TameXMLHttpRequest.prototype.getResponseHeader = function (headerName) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
240 var result = this.xhr___.getResponseHeader(String(headerName));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
241 return (result === undefined || result === null) ?
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
242 result : String(result);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
243 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
244 TameXMLHttpRequest.prototype.getResponseText = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
245 var result = this.xhr___.responseText;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
246 return (result === undefined || result === null) ?
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
247 result : String(result);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
248 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
249 TameXMLHttpRequest.prototype.getResponseXML = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
250 // TODO(ihab.awad): Implement a taming layer for XML. Requires generalizing
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
251 // the HTML node hierarchy as well so we have a unified implementation.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
252 return {};
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
253 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
254 TameXMLHttpRequest.prototype.getStatus = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
255 var result = this.xhr___.status;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
256 return (result === undefined || result === null) ?
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
257 result : Number(result);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
258 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
259 TameXMLHttpRequest.prototype.getStatusText = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
260 var result = this.xhr___.statusText;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
261 return (result === undefined || result === null) ?
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
262 result : String(result);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
263 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
264 TameXMLHttpRequest.prototype.toString = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
265 return 'Not a real XMLHttpRequest';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
266 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
267 ___.ctor(TameXMLHttpRequest, void 0, 'TameXMLHttpRequest');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
268 ___.all2(___.grantTypedGeneric, TameXMLHttpRequest.prototype,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
269 ['open', 'setRequestHeader', 'send', 'abort',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
270 'getAllResponseHeaders', 'getResponseHeader']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
271
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
272 return TameXMLHttpRequest;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
273 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
274
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
275 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
276 * Add a tamed document implementation to a Gadget's global scope.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
277 *
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
278 * @param {string} idSuffix a string suffix appended to all node IDs.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
279 * @param {Object} uriCallback an object like <pre>{
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
280 * rewrite: function (uri, mimeType) { return safeUri }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
281 * }</pre>.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
282 * The rewrite function should be idempotent to allow rewritten HTML
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
283 * to be reinjected.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
284 * @param {Object} imports the gadget's global scope.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
285 * @param {Node} pseudoBodyNode an HTML node to act as the "body" of the
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
286 * virtual document provided to Cajoled code.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
287 * @param {Object} optPseudoWindowLocation a record containing the
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
288 * properties of the browser "window.location" object, which will
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
289 * be provided to the Cajoled code.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
290 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
291 var attachDocumentStub = (function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
292 // Array Remove - By John Resig (MIT Licensed)
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
293 function arrayRemove(array, from, to) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
294 var rest = array.slice((to || from) + 1 || array.length);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
295 array.length = from < 0 ? array.length + from : from;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
296 return array.push.apply(array, rest);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
297 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
298
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
299 var tameNodeTrademark = cajita.Trademark('tameNode');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
300 var tameEventTrademark = cajita.Trademark('tameEvent');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
301
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
302 // Define a wrapper type for known safe HTML, and a trademarker.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
303 // This does not actually use the trademarking functions since trademarks
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
304 // cannot be applied to strings.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
305 function Html(htmlFragment) { this.html___ = String(htmlFragment || ''); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
306 Html.prototype.valueOf = Html.prototype.toString
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
307 = function () { return this.html___; };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
308 function safeHtml(htmlFragment) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
309 return (htmlFragment instanceof Html)
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
310 ? htmlFragment.html___
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
311 : html.escapeAttrib(String(htmlFragment || ''));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
312 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
313 function blessHtml(htmlFragment) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
314 return (htmlFragment instanceof Html)
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
315 ? htmlFragment
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
316 : new Html(htmlFragment);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
317 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
318
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
319 var XML_SPACE = '\t\n\r ';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
320
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
321 var XML_NAME_PATTERN = new RegExp(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
322 '^[' + unicode.LETTER + '_:][' + unicode.LETTER + unicode.DIGIT + '.\\-_:'
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
323 + unicode.COMBINING_CHAR + unicode.EXTENDER + ']*$');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
324
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
325 var XML_NMTOKEN_PATTERN = new RegExp(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
326 '^[' + unicode.LETTER + unicode.DIGIT + '.\\-_:'
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
327 + unicode.COMBINING_CHAR + unicode.EXTENDER + ']+$');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
328
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
329 var XML_NMTOKENS_PATTERN = new RegExp(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
330 '^(?:[' + XML_SPACE + ']*[' + unicode.LETTER + unicode.DIGIT + '.\\-_:'
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
331 + unicode.COMBINING_CHAR + unicode.EXTENDER + ']+)+[' + XML_SPACE + ']*$'
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
332 );
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
333
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
334 var JS_SPACE = '\t\n\r ';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
335 // An identifier that does not end with __.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
336 var JS_IDENT = '(?:[a-zA-Z_][a-zA-Z0-9$_]*[a-zA-Z0-9$]|[a-zA-Z])_?';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
337 var SIMPLE_HANDLER_PATTERN = new RegExp(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
338 '^[' + JS_SPACE + ']*'
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
339 + '(return[' + JS_SPACE + ']+)?' // Group 1 is present if it returns.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
340 + '(' + JS_IDENT + ')[' + JS_SPACE + ']*' // Group 2 is a function name.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
341 // Which can be passed optionally this node, and optionally the event.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
342 + '\\((?:this'
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
343 + '(?:[' + JS_SPACE + ']*,[' + JS_SPACE + ']*event)?'
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
344 + '[' + JS_SPACE + ']*)?\\)'
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
345 // And it can end with a semicolon.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
346 + '[' + JS_SPACE + ']*(?:;?[' + JS_SPACE + ']*)$');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
347
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
348 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
349 * Coerces the string to a valid XML Name.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
350 * @see http://www.w3.org/TR/2000/REC-xml-20001006#NT-Name
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
351 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
352 function isXmlName(s) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
353 return XML_NAME_PATTERN.test(s);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
354 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
355
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
356 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
357 * Coerces the string to valid XML Nmtokens
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
358 * @see http://www.w3.org/TR/2000/REC-xml-20001006#NT-Nmtokens
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
359 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
360 function isXmlNmTokens(s) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
361 return XML_NMTOKENS_PATTERN.test(s);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
362 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
363
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
364 // Trim whitespace from the beginning and end of a CSS string.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
365
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
366 function trimCssSpaces(input) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
367 return input.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, '');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
368 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
369
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
370 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
371 * The plain text equivalent of a CSS string body.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
372 * @param {string} s the body of a CSS string literal w/o quotes
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
373 * or CSS identifier.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
374 * @return {string} plain text.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
375 * {@updoc
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
376 * $ decodeCssString('')
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
377 * # ''
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
378 * $ decodeCssString('foo')
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
379 * # 'foo'
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
380 * $ decodeCssString('foo\\\nbar\\\r\nbaz\\\rboo\\\ffar')
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
381 * # 'foobarbazboofar'
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
382 * $ decodeCssString('foo\\000a bar\\000Abaz')
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
383 * # 'foo' + '\n' + 'bar' + '\u0ABA' + 'z'
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
384 * $ decodeCssString('foo\\\\bar\\\'baz')
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
385 * # "foo\\bar'baz"
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
386 * }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
387 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
388 function decodeCssString(s) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
389 // Decode a CSS String literal.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
390 // From http://www.w3.org/TR/CSS21/grammar.html
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
391 // string1 \"([^\n\r\f\\"]|\\{nl}|{escape})*\"
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
392 // unicode \\{h}{1,6}(\r\n|[ \t\r\n\f])?
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
393 // escape {unicode}|\\[^\r\n\f0-9a-f]
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
394 // s [ \t\r\n\f]+
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
395 // nl \n|\r\n|\r|\f
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
396 return s.replace(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
397 /\\(?:(\r\n?|\n|\f)|([0-9a-f]{1,6})(?:\r\n?|[ \t\n\f])?|(.))/gi,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
398 function (_, nl, hex, esc) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
399 return esc || (nl ? '' : String.fromCharCode(parseInt(hex, 16)));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
400 });
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
401 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
402
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
403 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
404 * Sanitize the 'style' attribute value of an HTML element.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
405 *
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
406 * @param styleAttrValue the value of a 'style' attribute, which we
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
407 * assume has already been checked by the caller to be a plain String.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
408 *
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
409 * @return a sanitized version of the attribute value.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
410 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
411 function sanitizeStyleAttrValue(styleAttrValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
412 var sanitizedDeclarations = [];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
413 var declarations = styleAttrValue.split(/;/g);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
414
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
415 for (var i = 0; declarations && i < declarations.length; i++) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
416 var parts = declarations[i].split(':');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
417 var property = trimCssSpaces(parts[0]).toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
418 var value = trimCssSpaces(parts.slice(1).join(":"));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
419 if (css.properties.hasOwnProperty(property)
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
420 && css.properties[property].test(value + ' ')) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
421 sanitizedDeclarations.push(property + ': ' + value);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
422 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
423 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
424
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
425 return sanitizedDeclarations.join(' ; ');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
426 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
427
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
428 function mimeTypeForAttr(tagName, attribName) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
429 if (attribName === 'src') {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
430 if (tagName === 'img') { return 'image/*'; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
431 if (tagName === 'script') { return 'text/javascript'; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
432 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
433 return '*/*';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
434 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
435
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
436 // TODO(ihab.awad): Does this work on IE, where console output
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
437 // goes to a DOM node?
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
438 function assert(cond) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
439 if (!cond) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
440 if (typeof console !== 'undefined') {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
441 console.error('domita assertion failed');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
442 console.trace();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
443 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
444 throw new Error();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
445 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
446 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
447
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
448 var classUtils = domitaModules.classUtils();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
449
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
450 var cssSealerUnsealerPair = cajita.makeSealerUnsealerPair();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
451
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
452 // Implementations of setTimeout, setInterval, clearTimeout, and
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
453 // clearInterval that only allow simple functions as timeouts and
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
454 // that treat timeout ids as capabilities.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
455 // This is safe even if accessed across frame since the same
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
456 // trademark value is never used with more than one version of
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
457 // setTimeout.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
458 var timeoutIdTrademark = cajita.Trademark('timeoutId');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
459 function tameSetTimeout(timeout, delayMillis) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
460 // Existing browsers treat a timeout of null or undefined as a noop.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
461 var timeoutId;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
462 if (timeout) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
463 if (typeof timeout === 'string') {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
464 throw new Error(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
465 'setTimeout called with a string.'
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
466 + ' Please pass a function instead of a string of javascript');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
467 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
468 timeoutId = setTimeout(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
469 function () { ___.callPub(timeout, 'call', [___.USELESS]); },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
470 delayMillis | 0);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
471 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
472 // tameClearTimeout checks for NaN and handles it specially.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
473 timeoutId = NaN;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
474 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
475 return ___.freeze(___.stamp(timeoutIdTrademark,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
476 { timeoutId___: timeoutId }));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
477 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
478 ___.frozenFunc(tameSetTimeout);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
479 function tameClearTimeout(timeoutId) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
480 ___.guard(timeoutIdTrademark, timeoutId);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
481 var rawTimeoutId = timeoutId.timeoutId___;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
482 // Skip NaN values created for null timeouts above.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
483 if (rawTimeoutId === rawTimeoutId) { clearTimeout(rawTimeoutId); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
484 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
485 ___.frozenFunc(tameClearTimeout);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
486 var intervalIdTrademark = cajita.Trademark('intervalId');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
487 function tameSetInterval(interval, delayMillis) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
488 // Existing browsers treat an interval of null or undefined as a noop.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
489 var intervalId;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
490 if (interval) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
491 if (typeof interval === 'string') {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
492 throw new Error(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
493 'setInterval called with a string.'
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
494 + ' Please pass a function instead of a string of javascript');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
495 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
496 intervalId = setInterval(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
497 function () { ___.callPub(interval, 'call', [___.USELESS]); },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
498 delayMillis | 0);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
499 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
500 intervalId = NaN;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
501 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
502 return ___.freeze(___.stamp(intervalIdTrademark,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
503 { intervalId___: intervalId }));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
504 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
505 ___.frozenFunc(tameSetInterval);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
506 function tameClearInterval(intervalId) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
507 ___.guard(intervalIdTrademark, intervalId);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
508 var rawIntervalId = intervalId.intervalId___;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
509 if (rawIntervalId === rawIntervalId) { clearInterval(rawIntervalId); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
510 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
511 ___.frozenFunc(tameClearInterval);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
512
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
513 function makeScrollable(element) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
514 var overflow;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
515 if (element.currentStyle) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
516 overflow = element.currentStyle.overflow;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
517 } else if (window.getComputedStyle) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
518 overflow = window.getComputedStyle(element, void 0).overflow;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
519 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
520 overflow = null;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
521 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
522 switch (overflow && overflow.toLowerCase()) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
523 case 'visible':
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
524 case 'hidden':
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
525 element.style.overflow = 'auto';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
526 break;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
527 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
528 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
529
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
530 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
531 * Moves the given pixel within the element's frame of reference as close to
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
532 * the top-left-most pixel of the element's viewport as possible without
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
533 * moving the viewport beyond the bounds of the content.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
534 * @param {number} x x-coord of a pixel in the element's frame of reference.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
535 * @param {number} y y-coord of a pixel in the element's frame of reference.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
536 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
537 function tameScrollTo(element, x, y) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
538 if (x !== +x || y !== +y || x < 0 || y < 0) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
539 throw new Error('Cannot scroll to ' + x + ':' + typeof x + ','
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
540 + y + ' : ' + typeof y);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
541 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
542 element.scrollLeft = x;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
543 element.scrollTop = y;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
544 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
545
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
546 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
547 * Moves the origin of the given element's view-port by the given offset.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
548 * @param {number} dx a delta in pixels.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
549 * @param {number} dy a delta in pixels.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
550 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
551 function tameScrollBy(element, dx, dy) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
552 if (dx !== +dx || dy !== +dy) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
553 throw new Error('Cannot scroll by ' + dx + ':' + typeof dx + ', '
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
554 + dy + ':' + typeof dy);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
555 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
556 element.scrollLeft += dx;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
557 element.scrollTop += dy;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
558 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
559
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
560 function guessPixelsFromCss(cssStr) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
561 if (!cssStr) { return 0; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
562 var m = cssStr.match(/^([0-9]+)/);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
563 return m ? +m[1] : 0;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
564 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
565
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
566 function tameResizeTo(element, w, h) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
567 if (w !== +w || h !== +h) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
568 throw new Error('Cannot resize to ' + w + ':' + typeof w + ', '
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
569 + h + ':' + typeof h);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
570 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
571 element.style.width = w + 'px';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
572 element.style.height = h + 'px';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
573 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
574
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
575 function tameResizeBy(element, dw, dh) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
576 if (dw !== +dw || dh !== +dh) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
577 throw new Error('Cannot resize by ' + dw + ':' + typeof dw + ', '
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
578 + dh + ':' + typeof dh);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
579 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
580 if (!dw && !dh) { return; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
581
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
582 // scrollWidth is width + padding + border.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
583 // offsetWidth is width + padding + border, but excluding the non-visible
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
584 // area.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
585 // clientWidth iw width + padding, and like offsetWidth, clips to the
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
586 // viewport.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
587 // margin does not count in any of these calculations.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
588 //
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
589 // scrollWidth/offsetWidth
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
590 // +------------+
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
591 // | |
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
592 //
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
593 // +----------------+
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
594 // | | Margin-top
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
595 // | +------------+ |
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
596 // | |############| | Border-top
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
597 // | |#+--------+#| |
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
598 // | |#| |#| | Padding-top
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
599 // | |#| +----+ |#| |
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
600 // | |#| | | |#| | Height
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
601 // | |#| | | |#| |
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
602 // | |#| +----+ |#| |
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
603 // | |#| |#| |
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
604 // | |#+--------+#| |
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
605 // | |############| |
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
606 // | +------------+ |
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
607 // | |
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
608 // +----------------+
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
609 //
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
610 // | |
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
611 // +--------+
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
612 // clientWidth (but excludes content outside viewport)
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
613
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
614 var style = element.currentStyle;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
615 if (!style) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
616 style = window.getComputedStyle(element, void 0);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
617 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
618
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
619 // We guess the padding since it's not always expressed in px on IE
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
620 var extraHeight = guessPixelsFromCss(style.paddingBottom)
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
621 + guessPixelsFromCss(style.paddingTop);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
622 var extraWidth = guessPixelsFromCss(style.paddingLeft)
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
623 + guessPixelsFromCss(style.paddingRight);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
624
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
625 var goalHeight = element.clientHeight + dh;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
626 var goalWidth = element.clientWidth + dw;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
627
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
628 var h = goalHeight - extraHeight;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
629 var w = goalWidth - extraWidth;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
630
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
631 if (dh) { element.style.height = Math.max(0, h) + 'px'; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
632 if (dw) { element.style.width = Math.max(0, w) + 'px'; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
633
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
634 // Correct if our guesses re padding and borders were wrong.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
635 // We may still not be able to resize if e.g. the deltas would take
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
636 // a dimension negative.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
637 if (dh && element.clientHeight !== goalHeight) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
638 var hError = element.clientHeight - goalHeight;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
639 element.style.height = Math.max(0, h - hError) + 'px';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
640 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
641 if (dw && element.clientWidth !== goalWidth) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
642 var wError = element.clientWidth - goalWidth;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
643 element.style.width = Math.max(0, w - wError) + 'px';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
644 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
645 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
646
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
647 // See above for a description of this function.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
648 function attachDocumentStub(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
649 idSuffix, uriCallback, imports, pseudoBodyNode, optPseudoWindowLocation) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
650 if (arguments.length < 4) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
651 throw new Error('arity mismatch: ' + arguments.length);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
652 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
653 if (!optPseudoWindowLocation) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
654 optPseudoWindowLocation = {};
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
655 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
656 var elementPolicies = {};
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
657 elementPolicies.form = function (attribs) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
658 // Forms must have a gated onsubmit handler or they must have an
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
659 // external target.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
660 var sawHandler = false;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
661 for (var i = 0, n = attribs.length; i < n; i += 2) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
662 if (attribs[i] === 'onsubmit') {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
663 sawHandler = true;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
664 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
665 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
666 if (!sawHandler) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
667 attribs.push('onsubmit', 'return false');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
668 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
669 return attribs;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
670 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
671 elementPolicies.a = elementPolicies.area = function (attribs) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
672 // Anchor tags must have a target.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
673 attribs.push('target', '_blank');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
674 return attribs;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
675 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
676
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
677
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
678 /** Sanitize HTML applying the appropriate transformations. */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
679 function sanitizeHtml(htmlText) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
680 var out = [];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
681 htmlSanitizer(htmlText, out);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
682 return out.join('');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
683 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
684 var htmlSanitizer = html.makeHtmlSanitizer(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
685 function sanitizeAttributes(tagName, attribs) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
686 for (var i = 0; i < attribs.length; i += 2) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
687 var attribName = attribs[i];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
688 var value = attribs[i + 1];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
689 var atype = null, attribKey;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
690 if ((attribKey = tagName + ':' + attribName,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
691 html4.ATTRIBS.hasOwnProperty(attribKey))
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
692 || (attribKey = '*:' + attribName,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
693 html4.ATTRIBS.hasOwnProperty(attribKey))) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
694 atype = html4.ATTRIBS[attribKey];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
695 value = rewriteAttribute(tagName, attribName, atype, value);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
696 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
697 value = null;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
698 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
699 if (value !== null && value !== void 0) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
700 attribs[i + 1] = value;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
701 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
702 attribs.splice(i, 2);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
703 i -= 2;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
704 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
705 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
706 var policy = elementPolicies[tagName];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
707 if (policy && elementPolicies.hasOwnProperty(tagName)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
708 return policy(attribs);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
709 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
710 return attribs;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
711 });
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
712
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
713 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
714 * Undoes some of the changes made by sanitizeHtml, e.g. stripping ID
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
715 * prefixes.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
716 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
717 function tameInnerHtml(htmlText) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
718 var out = [];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
719 innerHtmlTamer(htmlText, out);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
720 return out.join('');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
721 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
722 var innerHtmlTamer = html.makeSaxParser({
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
723 startTag: function (tagName, attribs, out) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
724 out.push('<', tagName);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
725 for (var i = 0; i < attribs.length; i += 2) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
726 var attribName = attribs[i];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
727 if (attribName === 'target') { continue; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
728 var attribKey;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
729 var atype;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
730 if ((attribKey = tagName + ':' + attribName,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
731 html4.ATTRIBS.hasOwnProperty(attribKey))
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
732 || (attribKey = '*:' + attribName,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
733 html4.ATTRIBS.hasOwnProperty(attribKey))) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
734 atype = html4.ATTRIBS[attribKey];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
735 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
736 return;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
737 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
738 var value = attribs[i + 1];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
739 switch (atype) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
740 case html4.atype.ID:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
741 case html4.atype.IDREF:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
742 case html4.atype.IDREFS:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
743 if (value.length <= idSuffix.length
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
744 || (idSuffix
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
745 !== value.substring(value.length - idSuffix.length))) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
746 continue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
747 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
748 value = value.substring(0, value.length - idSuffix.length);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
749 break;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
750 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
751 if (value !== null) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
752 out.push(' ', attribName, '="', html.escapeAttrib(value), '"');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
753 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
754 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
755 out.push('>');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
756 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
757 endTag: function (name, out) { out.push('</', name, '>'); },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
758 pcdata: function (text, out) { out.push(text); },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
759 rcdata: function (text, out) { out.push(text); },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
760 cdata: function (text, out) { out.push(text); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
761 });
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
762
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
763 var illegalSuffix = /__(?:\s|$)/;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
764 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
765 * Returns a normalized attribute value, or null if the attribute should
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
766 * be omitted.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
767 * <p>This function satisfies the attribute rewriter interface defined in
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
768 * {@link html-sanitizer.js}. As such, the parameters are keys into
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
769 * data structures defined in {@link html4-defs.js}.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
770 *
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
771 * @param {string} tagName a canonical tag name.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
772 * @param {string} attribName a canonical tag name.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
773 * @param type as defined in html4-defs.js.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
774 *
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
775 * @return {string|null} null to indicate that the attribute should not
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
776 * be set.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
777 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
778 function rewriteAttribute(tagName, attribName, type, value) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
779 switch (type) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
780 case html4.atype.ID:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
781 case html4.atype.IDREF:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
782 case html4.atype.IDREFS:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
783 value = String(value);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
784 if (value && !illegalSuffix.test(value) && isXmlName(value)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
785 return value + idSuffix;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
786 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
787 return null;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
788 case html4.atype.CLASSES:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
789 case html4.atype.GLOBAL_NAME:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
790 case html4.atype.LOCAL_NAME:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
791 value = String(value);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
792 if (value && !illegalSuffix.test(value) && isXmlNmTokens(value)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
793 return value;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
794 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
795 return null;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
796 case html4.atype.SCRIPT:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
797 value = String(value);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
798 // Translate a handler that calls a simple function like
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
799 // return foo(this, event)
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
800
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
801 // TODO(mikesamuel): integrate cajita compiler to allow arbitrary
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
802 // cajita in event handlers.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
803 var match = value.match(SIMPLE_HANDLER_PATTERN);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
804 if (!match) { return null; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
805 var doesReturn = match[1];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
806 var fnName = match[2];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
807 var pluginId = ___.getId(imports);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
808 value = (doesReturn ? 'return ' : '') + 'plugin_dispatchEvent___('
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
809 + 'this, event, ' + pluginId + ', "'
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
810 + fnName + '");';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
811 if (attribName === 'onsubmit') {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
812 value = 'try { ' + value + ' } finally { return false; }';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
813 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
814 return value;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
815 case html4.atype.URI:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
816 value = String(value);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
817 if (!uriCallback) { return null; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
818 // TODO(mikesamuel): determine mime type properly.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
819 return uriCallback.rewrite(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
820 value, mimeTypeForAttr(tagName, attribName)) || null;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
821 case html4.atype.STYLE:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
822 if ('function' !== typeof value) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
823 return sanitizeStyleAttrValue(String(value));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
824 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
825 var cssPropertiesAndValues = cssSealerUnsealerPair.unseal(value);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
826 if (!cssPropertiesAndValues) { return null; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
827
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
828 var css = [];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
829 for (var i = 0; i < cssPropertiesAndValues.length; i += 2) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
830 var propName = cssPropertiesAndValues[i];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
831 var propValue = cssPropertiesAndValues[i + 1];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
832 // If the propertyName differs between DOM and CSS, there will
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
833 // be a semicolon between the two.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
834 // E.g., 'background-color;backgroundColor'
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
835 // See CssTemplate.toPropertyValueList.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
836 var semi = propName.indexOf(';');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
837 if (semi >= 0) { propName = propName.substring(0, semi); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
838 css.push(propName + ' : ' + propValue);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
839 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
840 return css.join(' ; ');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
841 case html4.atype.FRAME_TARGET:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
842 // Frames are ambient, so disallow reference.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
843 return null;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
844 default:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
845 return String(value);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
846 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
847 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
848
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
849 function makeCache() {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
850 var cache = cajita.newTable(false);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
851 cache.set(null, null);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
852 cache.set(void 0, null);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
853 return cache;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
854 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
855
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
856 var editableTameNodeCache = makeCache();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
857 var readOnlyTameNodeCache = makeCache();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
858
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
859 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
860 * returns a tame DOM node.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
861 * @param {Node} node
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
862 * @param {boolean} editable
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
863 * @see <a href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html"
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
864 * >DOM Level 2</a>
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
865 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
866 function tameNode(node, editable) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
867 if (node === null || node === void 0) { return null; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
868 // TODO(mikesamuel): make sure it really is a DOM node
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
869
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
870 var cache = editable ? editableTameNodeCache : readOnlyTameNodeCache;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
871 var tamed = cache.get(node);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
872 if (tamed !== void 0) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
873 return tamed;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
874 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
875
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
876 switch (node.nodeType) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
877 case 1: // Element
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
878 var tagName = node.tagName.toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
879 switch (tagName) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
880 case 'a':
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
881 tamed = new TameAElement(node, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
882 break;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
883 case 'form':
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
884 tamed = new TameFormElement(node, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
885 break;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
886 case 'select':
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
887 case 'button':
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
888 case 'option':
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
889 case 'textarea':
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
890 case 'input':
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
891 tamed = new TameInputElement(node, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
892 break;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
893 case 'img':
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
894 tamed = new TameImageElement(node, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
895 break;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
896 case 'script':
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
897 tamed = new TameScriptElement(node, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
898 break;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
899 case 'td':
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
900 case 'tr':
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
901 case 'thead':
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
902 case 'tfoot':
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
903 case 'tbody':
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
904 case 'th':
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
905 tamed = new TameTableCompElement(node, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
906 break;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
907 case 'table':
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
908 tamed = new TameTableElement(node, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
909 break;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
910 default:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
911 if (!html4.ELEMENTS.hasOwnProperty(tagName)
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
912 || (html4.ELEMENTS[tagName] & html4.eflags.UNSAFE)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
913 // If an unrecognized or unsafe node, return a
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
914 // placeholder that doesn't prevent tree navigation,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
915 // but that doesn't allow mutation or leak attribute
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
916 // information.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
917 tamed = new TameOpaqueNode(node, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
918 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
919 tamed = new TameElement(node, editable, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
920 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
921 break;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
922 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
923 break;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
924 case 2: // Attr
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
925 tamed = new TameAttrNode(node, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
926 break;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
927 case 3: // Text
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
928 tamed = new TameTextNode(node, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
929 break;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
930 case 8: // Comment
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
931 tamed = new TameCommentNode(node, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
932 break;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
933 default:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
934 tamed = new TameOpaqueNode(node, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
935 break;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
936 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
937
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
938 if (node.nodeType === 1) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
939 cache.set(node, tamed);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
940 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
941 return tamed;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
942 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
943
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
944 function tameRelatedNode(node, editable) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
945 if (node === null || node === void 0) { return null; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
946 // catch errors because node might be from a different domain
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
947 try {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
948 for (var ancestor = node; ancestor; ancestor = ancestor.parentNode) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
949 // TODO(mikesamuel): replace with cursors so that subtrees are
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
950 // delegable.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
951 // TODO: handle multiple classes.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
952 if (idClass === ancestor.className) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
953 return tameNode(node, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
954 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
955 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
956 } catch (e) {}
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
957 return null;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
958 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
959
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
960 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
961 * Returns a NodeList like object.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
962 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
963 function tameNodeList(nodeList, editable, opt_keyAttrib) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
964 var tamed = [];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
965 var node;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
966
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
967 // Work around NamedNodeMap bugs in IE, Opera, and Safari as discussed
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
968 // at http://code.google.com/p/google-caja/issues/detail?id=935
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
969 var limit = nodeList.length;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
970 if (limit !== +limit) { limit = 1/0; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
971 for (var i = 0; i < limit && (node = nodeList[i]); ++i) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
972 node = tameNode(nodeList.item(i), editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
973 tamed[i] = node;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
974 // Make the node available via its name if doing so would not mask
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
975 // any properties of tamed.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
976 var key = opt_keyAttrib && node.getAttribute(opt_keyAttrib);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
977 // TODO(mikesamuel): if key in tamed, we have an ambiguous match.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
978 // Include neither? This may happen with radio buttons in a form's
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
979 // elements list.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
980 if (key && !(key.charAt(key.length - 1) === '_' || (key in tamed)
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
981 || key === String(key & 0x7fffffff))) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
982 tamed[key] = node;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
983 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
984 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
985 node = nodeList = null;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
986
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
987 tamed.item = ___.frozenFunc(function (k) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
988 k &= 0x7fffffff;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
989 if (k !== k) { throw new Error(); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
990 return tamed[k] || null;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
991 });
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
992 // TODO(mikesamuel): if opt_keyAttrib, could implement getNamedItem
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
993 return cajita.freeze(tamed);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
994 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
995
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
996 function tameGetElementsByTagName(rootNode, tagName, editable) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
997 tagName = String(tagName);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
998 if (tagName !== '*') {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
999 tagName = tagName.toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1000 if (!___.hasOwnProp(html4.ELEMENTS, tagName)
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1001 || html4.ELEMENTS[tagName] & html4.ELEMENTS.UNSAFE) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1002 // Allowing getElementsByTagName to work for opaque element types
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1003 // would leak information about those elements.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1004 return new fakeNodeList([]);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1005 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1006 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1007 return tameNodeList(rootNode.getElementsByTagName(tagName), editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1008 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1009
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1010 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1011 * Implements http://www.whatwg.org/specs/web-apps/current-work/#dom-document-getelementsbyclassname
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1012 * using an existing implementation on browsers that have one.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1013 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1014 function tameGetElementsByClassName(rootNode, className, editable) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1015 className = String(className);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1016
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1017 // The quotes below are taken from the HTML5 draft referenced above.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1018
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1019 // "having obtained the classes by splitting a string on spaces"
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1020 // Instead of using split, we use match with the global modifier so that
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1021 // we don't have to remove leading and trailing spaces.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1022 var classes = className.match(/[^\t\n\f\r ]+/g);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1023
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1024 // Filter out classnames in the restricted namespace.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1025 for (var i = classes ? classes.length : 0; --i >= 0;) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1026 var classi = classes[i];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1027 if (illegalSuffix.test(classi) || !isXmlNmTokens(classi)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1028 classes[i] = classes[classes.length - 1];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1029 --classes.length;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1030 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1031 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1032
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1033 if (!classes || classes.length === 0) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1034 // "If there are no tokens specified in the argument, then the method
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1035 // must return an empty NodeList" [instead of all elements]
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1036 // This means that
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1037 // htmlEl.ownerDocument.getElementsByClassName(htmlEl.className)
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1038 // will return an HtmlCollection containing htmlElement iff
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1039 // htmlEl.className contains a non-space character.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1040 return fakeNodeList([]);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1041 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1042
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1043 // "unordered set of unique space-separated tokens representing classes"
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1044 if (typeof rootNode.getElementsByClassName === 'function') {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1045 return tameNodeList(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1046 rootNode.getElementsByClassName(classes.join(' ')), editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1047 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1048 // Add spaces around each class so that we can use indexOf later to find
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1049 // a match.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1050 // This use of indexOf is strictly incorrect since
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1051 // http://www.whatwg.org/specs/web-apps/current-work/#reflecting-content-attributes-in-dom-attributes
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1052 // does not normalize spaces in unordered sets of unique space-separated
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1053 // tokens. This is not a problem since HTML5 compliant implementations
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1054 // already have a getElementsByClassName implementation, and legacy
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1055 // implementations do normalize according to comments on issue 935.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1056
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1057 // We assume standards mode, so the HTML5 requirement that
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1058 // "If the document is in quirks mode, then the comparisons for the
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1059 // classes must be done in an ASCII case-insensitive manner,"
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1060 // is not operative.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1061 var nClasses = classes.length;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1062 for (var i = nClasses; --i >= 0;) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1063 classes[i] = ' ' + classes[i] + ' ';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1064 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1065
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1066 // We comply with the requirement that the result is a list
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1067 // "containing all the elements in the document, in tree order,"
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1068 // since the spec for getElementsByTagName has the same language.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1069 var candidates = rootNode.getElementsByTagName('*');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1070 var matches = [];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1071 var limit = candidates.length;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1072 if (limit !== +limit) { limit = 1/0; } // See issue 935
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1073 candidate_loop:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1074 for (var j = 0, candidate, k = -1;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1075 j < limit && (candidate = candidates[j]);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1076 ++j) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1077 var candidateClass = ' ' + candidate.className + ' ';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1078 for (var i = nClasses; --i >= 0;) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1079 if (-1 === candidateClass.indexOf(classes[i])) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1080 continue candidate_loop;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1081 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1082 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1083 var tamed = tameNode(candidate, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1084 if (tamed) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1085 matches[++k] = tamed;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1086 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1087 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1088 // "the method must return a live NodeList object"
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1089 return fakeNodeList(matches);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1090 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1091 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1092
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1093 function makeEventHandlerWrapper(thisNode, listener) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1094 if ('function' !== typeof listener
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1095 // Allow disfunctions
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1096 && !('object' === (typeof listener) && listener !== null
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1097 && ___.canCallPub(listener, 'call'))) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1098 throw new Error('Expected function not ' + typeof listener);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1099 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1100 function wrapper(event) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1101 return plugin_dispatchEvent___(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1102 thisNode, event, ___.getId(imports), listener);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1103 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1104 return wrapper;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1105 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1106
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1107 var NOT_EDITABLE = "Node not editable.";
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1108 var INVALID_SUFFIX = "Property names may not end in '__'.";
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1109 var UNSAFE_TAGNAME = "Unsafe tag name.";
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1110 var UNKNOWN_TAGNAME = "Unknown tag name.";
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1111
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1112 // Implementation of EventTarget::addEventListener
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1113 function tameAddEventListener(name, listener, useCapture) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1114 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1115 if (!this.wrappedListeners___) { this.wrappedListeners___ = []; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1116 useCapture = Boolean(useCapture);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1117 var wrappedListener = makeEventHandlerWrapper(this.node___, listener);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1118 wrappedListener = bridal.addEventListener(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1119 this.node___, name, wrappedListener, useCapture);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1120 wrappedListener.originalListener___ = listener;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1121 this.wrappedListeners___.push(wrappedListener);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1122 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1123
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1124 // Implementation of EventTarget::removeEventListener
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1125 function tameRemoveEventListener(name, listener, useCapture) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1126 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1127 if (!this.wrappedListeners___) { return; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1128 var wrappedListener = null;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1129 for (var i = this.wrappedListeners___.length; --i >= 0;) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1130 if (this.wrappedListeners___[i].originalListener___ === listener) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1131 wrappedListener = this.wrappedListeners___[i];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1132 arrayRemove(this.wrappedListeners___, i, i);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1133 break;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1134 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1135 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1136 if (!wrappedListener) { return; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1137 bridal.removeEventListener(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1138 this.node___, name, wrappedListener, useCapture);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1139 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1140
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1141 // A map of tamed node classes, keyed by DOM Level 2 standard name, which
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1142 // will be exposed to the client.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1143 var nodeClasses = {};
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1144
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1145 var tameNodeFields = [
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1146 'nodeType', 'nodeValue', 'nodeName', 'firstChild',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1147 'lastChild', 'nextSibling', 'previousSibling', 'parentNode',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1148 'ownerDocument', 'childNodes', 'attributes'];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1149
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1150 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1151 * Base class for a Node wrapper. Do not create directly -- use the
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1152 * tameNode factory instead.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1153 * @param {boolean} editable true if the node's value, attributes, children,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1154 * or custom properties are mutable.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1155 * @constructor
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1156 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1157 function TameNode(editable) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1158 this.editable___ = editable;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1159 ___.stamp(tameNodeTrademark, this, true);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1160 classUtils.exportFields(this, tameNodeFields);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1161 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1162 TameNode.prototype.getOwnerDocument = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1163 // TODO(mikesamuel): upward navigation breaks capability discipline.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1164 if (!this.editable___ && tameDocument.editable___) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1165 throw new Error(NOT_EDITABLE);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1166 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1167 return tameDocument;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1168 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1169 nodeClasses.Node = TameNode;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1170 ___.ctor(TameNode, void 0, 'TameNode');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1171 // abstract TameNode.prototype.getNodeType
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1172 // abstract TameNode.prototype.getNodeName
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1173 // abstract TameNode.prototype.getNodeValue
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1174 // abstract TameNode.prototype.cloneNode
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1175 // abstract TameNode.prototype.appendChild
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1176 // abstract TameNode.prototype.insertBefore
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1177 // abstract TameNode.prototype.removeChild
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1178 // abstract TameNode.prototype.replaceChild
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1179 // abstract TameNode.prototype.getFirstChild
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1180 // abstract TameNode.prototype.getLastChild
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1181 // abstract TameNode.prototype.getNextSibling
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1182 // abstract TameNode.prototype.getPreviousSibling
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1183 // abstract TameNode.prototype.getParentNode
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1184 // abstract TameNode.prototype.getElementsByTagName
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1185 // abstract TameNode.prototype.getElementsByClassName
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1186 // abstract TameNode.prototype.getChildNodes
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1187 // abstract TameNode.prototype.getAttributes
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1188 var tameNodeMembers = [
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1189 'getNodeType', 'getNodeValue', 'getNodeName', 'cloneNode',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1190 'appendChild', 'insertBefore', 'removeChild', 'replaceChild',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1191 'getFirstChild', 'getLastChild', 'getNextSibling', 'getPreviousSibling',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1192 'getElementsByClassName', 'getElementsByTagName',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1193 'getOwnerDocument',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1194 'dispatchEvent',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1195 'hasChildNodes'
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1196 ];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1197
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1198
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1199 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1200 * A tame node that is backed by a real node.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1201 * @param {boolean} childrenEditable true iff the child list is mutable.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1202 * @constructor
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1203 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1204 function TameBackedNode(node, editable, childrenEditable) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1205 if (!node) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1206 throw new Error('Creating tame node with undefined native delegate');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1207 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1208 this.node___ = node;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1209 this.childrenEditable___ = editable && childrenEditable;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1210 TameNode.call(this, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1211 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1212 classUtils.extend(TameBackedNode, TameNode);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1213 TameBackedNode.prototype.getNodeType = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1214 return this.node___.nodeType;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1215 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1216 TameBackedNode.prototype.getNodeName = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1217 return this.node___.nodeName;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1218 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1219 TameBackedNode.prototype.getNodeValue = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1220 return this.node___.nodeValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1221 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1222 TameBackedNode.prototype.cloneNode = function (deep) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1223 var clone = bridal.cloneNode(this.node___, Boolean(deep));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1224 // From http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-3A0ED0A4
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1225 // "Note that cloning an immutable subtree results in a mutable copy"
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1226 return tameNode(clone, true);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1227 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1228 TameBackedNode.prototype.appendChild = function (child) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1229 // Child must be editable since appendChild can remove it from its parent.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1230 cajita.guard(tameNodeTrademark, child);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1231 if (!this.childrenEditable___ || !child.editable___) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1232 throw new Error(NOT_EDITABLE);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1233 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1234 this.node___.appendChild(child.node___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1235 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1236 TameBackedNode.prototype.insertBefore = function (toInsert, child) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1237 cajita.guard(tameNodeTrademark, toInsert);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1238 if (child === void 0) { child = null; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1239 if (child !== null) { cajita.guard(tameNodeTrademark, child); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1240 if (!this.childrenEditable___ || !toInsert.editable___) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1241 throw new Error(NOT_EDITABLE);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1242 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1243 this.node___.insertBefore(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1244 toInsert.node___, child !== null ? child.node___ : null);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1245 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1246 TameBackedNode.prototype.removeChild = function (child) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1247 cajita.guard(tameNodeTrademark, child);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1248 if (!this.childrenEditable___ || !child.editable___) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1249 throw new Error(NOT_EDITABLE);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1250 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1251 this.node___.removeChild(child.node___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1252 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1253 TameBackedNode.prototype.replaceChild = function (child, replacement) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1254 cajita.guard(tameNodeTrademark, child);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1255 cajita.guard(tameNodeTrademark, replacement);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1256 if (!this.childrenEditable___ || !replacement.editable___) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1257 throw new Error(NOT_EDITABLE);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1258 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1259 this.node___.replaceChild(child.node___, replacement.node___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1260 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1261 TameBackedNode.prototype.getFirstChild = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1262 return tameNode(this.node___.firstChild, this.childrenEditable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1263 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1264 TameBackedNode.prototype.getLastChild = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1265 return tameNode(this.node___.lastChild, this.childrenEditable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1266 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1267 TameBackedNode.prototype.getNextSibling = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1268 // TODO(mikesamuel): replace with cursors so that subtrees are delegable
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1269 return tameNode(this.node___.nextSibling, this.editable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1270 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1271 TameBackedNode.prototype.getPreviousSibling = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1272 // TODO(mikesamuel): replace with cursors so that subtrees are delegable
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1273 return tameNode(this.node___.previousSibling, this.editable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1274 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1275 TameBackedNode.prototype.getParentNode = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1276 var parent = this.node___.parentNode;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1277 if (parent === tameDocument.body___) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1278 if (tameDocument.editable___ && !this.editable___) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1279 // FIXME: return a non-editable version of body.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1280 throw new Error(NOT_EDITABLE);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1281 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1282 return tameDocument.getBody();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1283 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1284 return tameRelatedNode(this.node___.parentNode, this.editable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1285 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1286 TameBackedNode.prototype.getElementsByTagName = function (tagName) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1287 return tameGetElementsByTagName(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1288 this.node___, tagName, this.childrenEditable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1289 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1290 TameBackedNode.prototype.getElementsByClassName = function (className) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1291 return tameGetElementsByClassName(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1292 this.node___, className, this.childrenEditable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1293 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1294 TameBackedNode.prototype.getChildNodes = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1295 return tameNodeList(this.node___.childNodes, this.childrenEditable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1296 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1297 TameBackedNode.prototype.getAttributes = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1298 return tameNodeList(this.node___.attributes, this.editable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1299 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1300 var endsWith__ = /__$/;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1301 // TODO(erights): Come up with some notion of a keeper chain so we can
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1302 // say, "let every other keeper try to handle this first".
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1303 TameBackedNode.prototype.handleRead___ = function (name) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1304 name = String(name);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1305 if (endsWith__.test(name)) { return void 0; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1306 var handlerName = name + '_getter___';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1307 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1308 return this[handlerName]();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1309 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1310 handlerName = handlerName.toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1311 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1312 return this[handlerName]();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1313 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1314 if (___.hasOwnProp(this.node___.properties___, name)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1315 return this.node___.properties___[name];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1316 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1317 return void 0;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1318 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1319 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1320 TameBackedNode.prototype.handleCall___ = function (name, args) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1321 name = String(name);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1322 if (endsWith__.test(name)) { throw new Error(INVALID_SUFFIX); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1323 var handlerName = name + '_handler___';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1324 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1325 return this[handlerName].call(this, args);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1326 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1327 handlerName = handlerName.toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1328 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1329 return this[handlerName].call(this, args);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1330 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1331 if (___.hasOwnProp(this.node___.properties___, name)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1332 return this.node___.properties___[name].call(this, args);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1333 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1334 throw new TypeError(name + ' is not a function.');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1335 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1336 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1337 TameBackedNode.prototype.handleSet___ = function (name, val) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1338 name = String(name);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1339 if (endsWith__.test(name)) { throw new Error(INVALID_SUFFIX); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1340 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1341 var handlerName = name + '_setter___';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1342 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1343 return this[handlerName](val);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1344 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1345 handlerName = handlerName.toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1346 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1347 return this[handlerName](val);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1348 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1349 if (!this.node___.properties___) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1350 this.node___.properties___ = {};
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1351 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1352 this[name + '_canEnum___'] = true;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1353 return this.node___.properties___[name] = val;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1354 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1355 TameBackedNode.prototype.handleDelete___ = function (name) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1356 name = String(name);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1357 if (endsWith__.test(name)) { throw new Error(INVALID_SUFFIX); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1358 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1359 var handlerName = name + '_deleter___';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1360 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1361 return this[handlerName]();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1362 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1363 handlerName = handlerName.toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1364 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1365 return this[handlerName]();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1366 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1367 if (this.node___.properties___) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1368 return (
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1369 delete this.node___.properties___[name]
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1370 && delete this[name + '_canEnum___']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1371 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1372 return true;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1373 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1374 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1375 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1376 * @param {boolean} ownFlag ignored
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1377 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1378 TameBackedNode.prototype.handleEnum___ = function (ownFlag) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1379 // TODO(metaweta): Add code to list all the other handled stuff we know
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1380 // about.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1381 if (this.node___.properties___) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1382 return cajita.allKeys(this.node___.properties___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1383 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1384 return [];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1385 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1386 TameBackedNode.prototype.hasChildNodes = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1387 return !!this.node___.hasChildNodes();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1388 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1389 // http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventTarget :
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1390 // "The EventTarget interface is implemented by all Nodes"
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1391 TameBackedNode.prototype.dispatchEvent = function dispatchEvent(evt) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1392 cajita.guard(tameEventTrademark, evt);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1393 bridal.dispatchEvent(this.node___, evt.event___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1394 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1395 ___.ctor(TameBackedNode, TameNode, 'TameBackedNode');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1396 ___.all2(___.grantTypedGeneric, TameBackedNode.prototype, tameNodeMembers);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1397 if (document.documentElement.contains) { // typeof is 'object' on IE
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1398 TameBackedNode.prototype.contains = function (other) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1399 cajita.guard(tameNodeTrademark, other);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1400 var otherNode = other.node___;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1401 return this.node___.contains(otherNode);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1402 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1403 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1404 if ('function' ===
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1405 typeof document.documentElement.compareDocumentPosition) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1406 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1407 * Speced in <a href="http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-compareDocumentPosition">DOM-Level-3</a>.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1408 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1409 TameBackedNode.prototype.compareDocumentPosition = function (other) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1410 cajita.guard(tameNodeTrademark, other);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1411 var otherNode = other.node___;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1412 if (!otherNode) { return 0; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1413 var bitmask = +this.node___.compareDocumentPosition(otherNode);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1414 // To avoid leaking information about the relative positioning of
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1415 // different roots, if neither contains the other, then we mask out
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1416 // the preceding/following bits.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1417 // 0x18 is (CONTAINS | CONTAINED)
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1418 // 0x1f is all the bits documented at
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1419 // http://www.w3.org/TR/DOM-Level-3-Core/core.html#DocumentPosition
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1420 // except IMPLEMENTATION_SPECIFIC
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1421 // 0x01 is DISCONNECTED
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1422 /*
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1423 if (!(bitmask & 0x18)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1424 // TODO: If they are not under the same virtual doc root, return
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1425 // DOCUMENT_POSITION_DISCONNECTED instead of leaking information
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1426 // about PRECEDING | FOLLOWING.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1427 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1428 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1429 // Firefox3 returns spurious PRECEDING and FOLLOWING bits for
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1430 // disconnected trees.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1431 // https://bugzilla.mozilla.org/show_bug.cgi?id=486002
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1432 if (bitmask & 1) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1433 bitmask &= ~6;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1434 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1435 return bitmask & 0x1f;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1436 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1437 if (!___.hasOwnProp(TameBackedNode.prototype, 'contains')) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1438 // http://www.quirksmode.org/blog/archives/2006/01/contains_for_mo.html
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1439 TameBackedNode.prototype.contains = function (other) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1440 var docPos = this.compareDocumentPosition(other);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1441 return !(!(docPos & 0x10) && docPos);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1442 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1443 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1444 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1445 ___.all2(function (o, k) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1446 if (___.hasOwnProp(o, k)) { ___.grantTypedGeneric(o, k); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1447 }, TameBackedNode.prototype,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1448 ['contains', 'compareDocumentPosition']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1449
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1450 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1451 * A fake node that is not backed by a real DOM node.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1452 * @constructor
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1453 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1454 function TamePseudoNode(editable) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1455 TameNode.call(this, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1456 this.properties___ = {};
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1457 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1458 classUtils.extend(TamePseudoNode, TameNode);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1459 TamePseudoNode.prototype.appendChild =
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1460 TamePseudoNode.prototype.insertBefore =
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1461 TamePseudoNode.prototype.removeChild =
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1462 TamePseudoNode.prototype.replaceChild = function (child) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1463 cajita.log("Node not editable; no action performed.");
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1464 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1465 TamePseudoNode.prototype.getFirstChild = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1466 var children = this.getChildNodes();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1467 return children.length ? children[0] : null;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1468 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1469 TamePseudoNode.prototype.getLastChild = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1470 var children = this.getChildNodes();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1471 return children.length ? children[children.length - 1] : null;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1472 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1473 TamePseudoNode.prototype.getNextSibling = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1474 var parentNode = this.getParentNode();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1475 if (!parentNode) { return null; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1476 var siblings = parentNode.getChildNodes();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1477 for (var i = siblings.length - 1; --i >= 0;) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1478 if (siblings[i] === this) { return siblings[i + 1]; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1479 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1480 return null;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1481 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1482 TamePseudoNode.prototype.getPreviousSibling = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1483 var parentNode = this.getParentNode();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1484 if (!parentNode) { return null; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1485 var siblings = parentNode.getChildNodes();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1486 for (var i = siblings.length; --i >= 1;) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1487 if (siblings[i] === this) { return siblings[i - 1]; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1488 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1489 return null;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1490 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1491 TamePseudoNode.prototype.handleRead___ = function (name) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1492 name = String(name);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1493 if (endsWith__.test(name)) { return void 0; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1494 var handlerName = name + '_getter___';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1495 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1496 return this[handlerName]();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1497 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1498 handlerName = handlerName.toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1499 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1500 return this[handlerName]();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1501 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1502 if (___.hasOwnProp(this.properties___, name)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1503 return this.properties___[name];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1504 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1505 return void 0;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1506 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1507 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1508 TamePseudoNode.prototype.handleCall___ = function (name, args) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1509 name = String(name);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1510 if (endsWith__.test(name)) { throw new Error(INVALID_SUFFIX); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1511 var handlerName = name + '_handler___';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1512 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1513 return this[handlerName].call(this, args);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1514 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1515 handlerName = handlerName.toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1516 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1517 return this[handlerName].call(this, args);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1518 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1519 if (___.hasOwnProp(this.properties___, name)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1520 return this.properties___[name].call(this, args);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1521 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1522 throw new TypeError(name + ' is not a function.');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1523 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1524 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1525 TamePseudoNode.prototype.handleSet___ = function (name, val) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1526 name = String(name);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1527 if (endsWith__.test(name)) { throw new Error(INVALID_SUFFIX); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1528 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1529 var handlerName = name + '_setter___';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1530 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1531 return this[handlerName](val);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1532 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1533 handlerName = handlerName.toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1534 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1535 return this[handlerName](val);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1536 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1537 if (!this.properties___) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1538 this.properties___ = {};
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1539 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1540 this[name + '_canEnum___'] = true;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1541 return this.properties___[name] = val;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1542 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1543 TamePseudoNode.prototype.handleDelete___ = function (name) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1544 name = String(name);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1545 if (endsWith__.test(name)) { throw new Error(INVALID_SUFFIX); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1546 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1547 var handlerName = name + '_deleter___';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1548 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1549 return this[handlerName]();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1550 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1551 handlerName = handlerName.toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1552 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1553 return this[handlerName]();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1554 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1555 if (this.properties___) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1556 return (
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1557 delete this.properties___[name]
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1558 && delete this[name + '_canEnum___']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1559 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1560 return true;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1561 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1562 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1563 TamePseudoNode.prototype.handleEnum___ = function (ownFlag) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1564 // TODO(metaweta): Add code to list all the other handled stuff we know
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1565 // about.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1566 if (this.properties___) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1567 return cajita.allKeys(this.properties___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1568 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1569 return [];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1570 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1571 TamePseudoNode.prototype.hasChildNodes = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1572 return this.getFirstChild() != null;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1573 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1574 ___.ctor(TamePseudoNode, TameNode, 'TamePseudoNode');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1575 ___.all2(___.grantTypedGeneric, TamePseudoNode.prototype, tameNodeMembers);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1576
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1577
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1578 function TamePseudoElement(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1579 tagName, tameDoc, childNodesGetter, parentNodeGetter, innerHTMLGetter,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1580 geometryDelegate, editable) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1581 TamePseudoNode.call(this, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1582 this.tagName___ = tagName;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1583 this.tameDoc___ = tameDoc;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1584 this.childNodesGetter___ = childNodesGetter;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1585 this.parentNodeGetter___ = parentNodeGetter;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1586 this.innerHTMLGetter___ = innerHTMLGetter;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1587 this.geometryDelegate___ = geometryDelegate;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1588 classUtils.exportFields(this, ['tagName', 'innerHTML']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1589 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1590 classUtils.extend(TamePseudoElement, TamePseudoNode);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1591 // TODO(mikesamuel): make nodeClasses work.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1592 TamePseudoElement.prototype.getNodeType = function () { return 1; };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1593 TamePseudoElement.prototype.getNodeName
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1594 = function () { return this.tagName___; };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1595 TamePseudoElement.prototype.getTagName
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1596 = function () { return this.tagName___; };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1597 TamePseudoElement.prototype.getNodeValue = function () { return null; };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1598 TamePseudoElement.prototype.getAttribute
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1599 = function (attribName) { return null; };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1600 TamePseudoElement.prototype.setAttribute
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1601 = function (attribName, value) { };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1602 TamePseudoElement.prototype.hasAttribute
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1603 = function (attribName) { return false; };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1604 TamePseudoElement.prototype.removeAttribute
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1605 = function (attribName) { };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1606 TamePseudoElement.prototype.getOwnerDocument
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1607 = function () { return this.tameDoc___; };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1608 TamePseudoElement.prototype.getChildNodes
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1609 = function () { return this.childNodesGetter___(); };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1610 TamePseudoElement.prototype.getAttributes
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1611 = function () { return tameNodeList([], false); };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1612 TamePseudoElement.prototype.getParentNode
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1613 = function () { return this.parentNodeGetter___(); };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1614 TamePseudoElement.prototype.getInnerHTML
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1615 = function () { return this.innerHTMLGetter___(); };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1616 TamePseudoElement.prototype.getElementsByTagName = function (tagName) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1617 tagName = String(tagName).toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1618 if (tagName === this.tagName___) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1619 // Works since html, head, body, and title can't contain themselves.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1620 return fakeNodeList([]);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1621 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1622 return this.getOwnerDocument().getElementsByTagName(tagName);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1623 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1624 TamePseudoElement.prototype.getElementsByClassName = function (className) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1625 return this.getOwnerDocument().getElementsByClassName(className);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1626 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1627 TamePseudoElement.prototype.getBoundingClientRect = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1628 return this.geometryDelegate___.getBoundingClientRect();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1629 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1630 TamePseudoElement.prototype.getGeometryDelegate___ = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1631 return this.geometryDelegate___;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1632 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1633 TamePseudoElement.prototype.toString = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1634 return '<' + this.tagName___ + '>';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1635 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1636 ___.ctor(TamePseudoElement, TamePseudoNode, 'TamePseudoElement');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1637 ___.all2(___.grantTypedGeneric, TamePseudoElement.prototype,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1638 ['getTagName', 'getAttribute', 'setAttribute',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1639 'hasAttribute', 'removeAttribute',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1640 'getBoundingClientRect', 'getElementsByTagName']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1641
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1642 function TameOpaqueNode(node, editable) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1643 TameBackedNode.call(this, node, editable, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1644 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1645 classUtils.extend(TameOpaqueNode, TameBackedNode);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1646 TameOpaqueNode.prototype.getNodeValue
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1647 = TameBackedNode.prototype.getNodeValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1648 TameOpaqueNode.prototype.getNodeType
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1649 = TameBackedNode.prototype.getNodeType;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1650 TameOpaqueNode.prototype.getNodeName
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1651 = TameBackedNode.prototype.getNodeName;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1652 TameOpaqueNode.prototype.getNextSibling
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1653 = TameBackedNode.prototype.getNextSibling;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1654 TameOpaqueNode.prototype.getPreviousSibling
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1655 = TameBackedNode.prototype.getPreviousSibling;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1656 TameOpaqueNode.prototype.getFirstChild
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1657 = TameBackedNode.prototype.getFirstChild;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1658 TameOpaqueNode.prototype.getLastChild
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1659 = TameBackedNode.prototype.getLastChild;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1660 TameOpaqueNode.prototype.getParentNode
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1661 = TameBackedNode.prototype.getParentNode;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1662 TameOpaqueNode.prototype.getChildNodes
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1663 = TameBackedNode.prototype.getChildNodes;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1664 TameOpaqueNode.prototype.getAttributes
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1665 = function () { return tameNodeList([], false); };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1666 for (var i = tameNodeMembers.length; --i >= 0;) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1667 var k = tameNodeMembers[i];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1668 if (!TameOpaqueNode.prototype.hasOwnProperty(k)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1669 TameOpaqueNode.prototype[k] = ___.frozenFunc(function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1670 throw new Error('Node is opaque');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1671 });
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1672 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1673 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1674 ___.all2(___.grantTypedGeneric, TameOpaqueNode.prototype, tameNodeMembers);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1675
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1676 function TameAttrNode(node, editable) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1677 assert(node.nodeType === 2);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1678 TameBackedNode.call(this, node, editable, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1679 classUtils.exportFields(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1680 this, ['name', 'nodeValue', 'value', 'specified']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1681 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1682 classUtils.extend(TameAttrNode, TameBackedNode);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1683 nodeClasses.Attr = TameAttrNode;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1684 TameAttrNode.prototype.setNodeValue = function (value) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1685 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1686 this.node___.nodeValue = String(value || '');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1687 return value;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1688 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1689 TameAttrNode.prototype.getName = TameAttrNode.prototype.getNodeName;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1690 TameAttrNode.prototype.getValue = TameAttrNode.prototype.getNodeValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1691 TameAttrNode.prototype.setValue = TameAttrNode.prototype.setNodeValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1692 TameAttrNode.prototype.getSpecified = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1693 return this.node___.specified;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1694 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1695 TameAttrNode.prototype.toString = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1696 return '#attr';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1697 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1698 ___.ctor(TameAttrNode, TameBackedNode, 'TameAttrNode');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1699
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1700 function TameTextNode(node, editable) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1701 assert(node.nodeType === 3);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1702
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1703 // The below should not be strictly necessary since childrenEditable for
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1704 // TameScriptElements is always false, but it protects against tameNode
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1705 // being called naively on a text node from container code.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1706 var pn = node.parentNode;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1707 if (editable && pn) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1708 if (1 === pn.nodeType
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1709 && (html4.ELEMENTS[pn.tagName.toLowerCase()]
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1710 & html4.eflags.UNSAFE)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1711 // Do not allow mutation of text inside script elements.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1712 // See the testScriptLoading testcase for examples of exploits.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1713 editable = false;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1714 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1715 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1716
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1717 TameBackedNode.call(this, node, editable, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1718 classUtils.exportFields(this, ['nodeValue', 'data']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1719 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1720 classUtils.extend(TameTextNode, TameBackedNode);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1721 nodeClasses.Text = TameTextNode;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1722 TameTextNode.prototype.setNodeValue = function (value) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1723 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1724 this.node___.nodeValue = String(value || '');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1725 return value;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1726 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1727 TameTextNode.prototype.getData = TameTextNode.prototype.getNodeValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1728 TameTextNode.prototype.setData = TameTextNode.prototype.setNodeValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1729 TameTextNode.prototype.toString = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1730 return '#text';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1731 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1732 ___.ctor(TameTextNode, TameBackedNode, 'TameTextNode');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1733 ___.all2(___.grantTypedGeneric, TameTextNode.prototype,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1734 ['setNodeValue', 'getData', 'setData']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1735
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1736 function TameCommentNode(node, editable) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1737 assert(node.nodeType === 8);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1738 TameBackedNode.call(this, node, editable, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1739 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1740 classUtils.extend(TameCommentNode, TameBackedNode);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1741 nodeClasses.CommentNode = TameCommentNode;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1742 TameCommentNode.prototype.toString = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1743 return '#comment';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1744 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1745 ___.ctor(TameCommentNode, TameBackedNode, 'TameCommentNode');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1746
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1747 function getAttributeType(tagName, attribName) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1748 var attribKey;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1749 attribKey = tagName + ':' + attribName;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1750 if (html4.ATTRIBS.hasOwnProperty(attribKey)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1751 return html4.ATTRIBS[attribKey];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1752 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1753 attribKey = '*:' + attribName;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1754 if (html4.ATTRIBS.hasOwnProperty(attribKey)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1755 return html4.ATTRIBS[attribKey];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1756 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1757 return void 0;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1758 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1759
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1760 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1761 * Plays the role of an Attr node for TameElement objects.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1762 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1763 function TameBackedAttributeNode(elem, name){
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1764 TameNode.call(this, false);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1765 classUtils.exportFields(this,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1766 ['name', 'specified', 'value', 'ownerElement']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1767 this.name___ = name;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1768 this.ownerElement___ = elem;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1769 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1770 classUtils.extend(TameBackedAttributeNode, TameNode);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1771 ___.ctor(TameBackedAttributeNode, TameNode, 'TameBackedAttributeNode');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1772 TameBackedAttributeNode.prototype.getNodeName =
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1773 TameBackedAttributeNode.prototype.getName =
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1774 function () { return this.name___; };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1775 TameBackedAttributeNode.prototype.getSpecified =
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1776 function () { return this.ownerElement___.hasAttribute(this.name___); };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1777 TameBackedAttributeNode.prototype.getNodeValue =
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1778 TameBackedAttributeNode.prototype.getValue =
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1779 function () { return this.ownerElement___.getAttribute(this.name___); };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1780 TameBackedAttributeNode.prototype.getOwnerElement =
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1781 function () { return this.ownerElement___; };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1782 TameBackedAttributeNode.prototype.getNodeType = function () { return 2; };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1783 TameBackedAttributeNode.prototype.cloneNode = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1784 return new TameBackedAttributeNode(this.ownerElement___, this.name___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1785 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1786 TameBackedAttributeNode.prototype.appendChild =
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1787 TameBackedAttributeNode.prototype.insertBefore =
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1788 TameBackedAttributeNode.prototype.removeChild =
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1789 TameBackedAttributeNode.prototype.replaceChild =
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1790 TameBackedAttributeNode.prototype.getFirstChild =
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1791 TameBackedAttributeNode.prototype.getLastChild =
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1792 TameBackedAttributeNode.prototype.getNextSibling =
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1793 TameBackedAttributeNode.prototype.getPreviousSibling =
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1794 TameBackedAttributeNode.prototype.getParentNode =
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1795 TameBackedAttributeNode.prototype.getElementsByTagName =
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1796 TameBackedAttributeNode.prototype.getElementsByClassName =
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1797 TameBackedAttributeNode.prototype.getChildNodes =
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1798 TameBackedAttributeNode.prototype.getAttributes = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1799 throw new Error ("Not implemented.");
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1800 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1801
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1802 function TameElement(node, editable, childrenEditable) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1803 assert(node.nodeType === 1);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1804 TameBackedNode.call(this, node, editable, childrenEditable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1805 classUtils.exportFields(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1806 this,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1807 ['className', 'id', 'innerHTML', 'tagName', 'style',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1808 'offsetParent', 'title', 'dir']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1809 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1810 classUtils.extend(TameElement, TameBackedNode);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1811 nodeClasses.Element = nodeClasses.HTMLElement = TameElement;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1812 TameElement.prototype.getId = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1813 return this.getAttribute('id') || '';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1814 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1815 TameElement.prototype.setId = function (newId) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1816 return this.setAttribute('id', newId);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1817 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1818 TameElement.prototype.getAttribute = function (attribName) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1819 attribName = String(attribName).toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1820 var tagName = this.node___.tagName.toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1821 var atype = getAttributeType(tagName, attribName);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1822 if (atype === void 0) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1823 // Unrecognized attribute; use virtual map
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1824 if (this.node___.attributes___) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1825 return this.node___.attributes___[attribName] || null;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1826 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1827 return null;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1828 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1829 var value = bridal.getAttribute(this.node___, attribName);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1830 if ('string' !== typeof value) { return value; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1831 switch (atype) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1832 case html4.atype.ID:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1833 case html4.atype.IDREF:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1834 case html4.atype.IDREFS:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1835 if (!value) { return null; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1836 var n = idSuffix.length;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1837 var len = value.length;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1838 var end = len - n;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1839 if (end > 0 && idSuffix === value.substring(end, len)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1840 return value.substring(0, end);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1841 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1842 return null;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1843 default:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1844 if ('' === value) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1845 // IE creates attribute nodes for any attribute in the HTML schema
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1846 // so even when they are deleted, there will be a value, usually
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1847 // the empty string.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1848 var attr = bridal.getAttributeNode(this.node___, attribName);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1849 if (attr && !attr.specified) { return null; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1850 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1851 return value;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1852 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1853 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1854 TameElement.prototype.getAttributeNode = function (name) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1855 return new TameBackedAttributeNode(this, name);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1856 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1857 TameElement.prototype.hasAttribute = function (attribName) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1858 attribName = String(attribName).toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1859 var tagName = this.node___.tagName.toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1860 var atype = getAttributeType(tagName, attribName);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1861 if (atype === void 0) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1862 // Unrecognized attribute; use virtual map
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1863 return !!(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1864 this.node___.attributes___ &&
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1865 ___.hasOwnProp(this.node___.attributes___, attribName));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1866 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1867 return bridal.hasAttribute(this.node___, attribName);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1868 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1869 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1870 TameElement.prototype.setAttribute = function (attribName, value) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1871 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1872 attribName = String(attribName).toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1873 var tagName = this.node___.tagName.toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1874 var atype = getAttributeType(tagName, attribName);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1875 if (atype === void 0) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1876 // Unrecognized attribute; use virtual map
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1877 if (!this.node___.attributes___) { this.node___.attributes___ = {}; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1878 this.node___.attributes___[attribName] = String(value);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1879 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1880 var sanitizedValue = rewriteAttribute(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1881 tagName, attribName, atype, value);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1882 if (sanitizedValue !== null) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1883 bridal.setAttribute(this.node___, attribName, sanitizedValue);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1884 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1885 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1886 return value;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1887 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1888 TameElement.prototype.removeAttribute = function (attribName) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1889 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1890 attribName = String(attribName).toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1891 var tagName = this.node___.tagName.toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1892 var atype = getAttributeType(tagName, attribName);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1893 if (atype === void 0) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1894 // Unrecognized attribute; use virtual map
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1895 if (this.node___.attributes___) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1896 delete this.node___.attributes___[attribName];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1897 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1898 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1899 this.node___.removeAttribute(attribName);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1900 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1901 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1902 TameElement.prototype.getBoundingClientRect = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1903 var elRect = bridal.getBoundingClientRect(this.node___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1904 var vbody = bridal.getBoundingClientRect(this.getOwnerDocument().body___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1905 var vbodyLeft = vbody.left, vbodyTop = vbody.top;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1906 return ({
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1907 top: elRect.top - vbodyTop,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1908 left: elRect.left - vbodyLeft,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1909 right: elRect.right - vbodyLeft,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1910 bottom: elRect.bottom - vbodyTop
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1911 });
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1912 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1913 TameElement.prototype.getClassName = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1914 return this.getAttribute('class') || '';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1915 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1916 TameElement.prototype.setClassName = function (classes) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1917 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1918 return this.setAttribute('class', String(classes));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1919 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1920 TameElement.prototype.getTitle = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1921 return this.getAttribute('title') || '';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1922 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1923 TameElement.prototype.setTitle = function (classes) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1924 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1925 return this.setAttribute('title', String(classes));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1926 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1927 TameElement.prototype.getDir = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1928 return this.getAttribute('dir') || '';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1929 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1930 TameElement.prototype.setDir = function (classes) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1931 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1932 return this.setAttribute('dir', String(classes));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1933 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1934 TameElement.prototype.getTagName = TameBackedNode.prototype.getNodeName;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1935 TameElement.prototype.getInnerHTML = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1936 var tagName = this.node___.tagName.toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1937 if (!html4.ELEMENTS.hasOwnProperty(tagName)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1938 return ''; // unknown node
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1939 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1940 var flags = html4.ELEMENTS[tagName];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1941 var innerHtml = this.node___.innerHTML;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1942 if (flags & html4.eflags.CDATA) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1943 innerHtml = html.escapeAttrib(innerHtml);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1944 } else if (flags & html4.eflags.RCDATA) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1945 // Make sure we return PCDATA.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1946 // For RCDATA we only need to escape & if they're not part of an entity.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1947 innerHtml = html.normalizeRCData(innerHtml);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1948 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1949 // If we blessed the resulting HTML, then this would round trip better
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1950 // but it would still not survive appending, and it would propagate
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1951 // event handlers where the setter of innerHTML does not expect it to.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1952 innerHtml = tameInnerHtml(innerHtml);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1953 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1954 return innerHtml;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1955 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1956 TameElement.prototype.setInnerHTML = function (htmlFragment) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1957 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1958 var tagName = this.node___.tagName.toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1959 if (!html4.ELEMENTS.hasOwnProperty(tagName)) { throw new Error(); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1960 var flags = html4.ELEMENTS[tagName];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1961 if (flags & html4.eflags.UNSAFE) { throw new Error(); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1962 var sanitizedHtml;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1963 if (flags & html4.eflags.RCDATA) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1964 sanitizedHtml = html.normalizeRCData(String(htmlFragment || ''));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1965 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1966 sanitizedHtml = (htmlFragment instanceof Html
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1967 ? safeHtml(htmlFragment)
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1968 : sanitizeHtml(String(htmlFragment || '')));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1969 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1970 this.node___.innerHTML = sanitizedHtml;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1971 return htmlFragment;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1972 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1973 TameElement.prototype.setStyle = function (style) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1974 this.setAttribute('style', style);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1975 return this.getStyle();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1976 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1977 TameElement.prototype.getStyle = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1978 return new TameStyle(this.node___.style, this.editable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1979 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1980 TameElement.prototype.updateStyle = function (style) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1981 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1982 var cssPropertiesAndValues = cssSealerUnsealerPair.unseal(style);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1983 if (!cssPropertiesAndValues) { throw new Error(); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1984
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1985 var styleNode = this.node___.style;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1986 for (var i = 0; i < cssPropertiesAndValues.length; i += 2) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1987 var propName = cssPropertiesAndValues[i];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1988 var propValue = cssPropertiesAndValues[i + 1];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1989 // If the propertyName differs between DOM and CSS, there will
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1990 // be a semicolon between the two.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1991 // E.g., 'background-color;backgroundColor'
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1992 // See CssTemplate.toPropertyValueList.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1993 var semi = propName.indexOf(';');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1994 if (semi >= 0) { propName = propName.substring(semi + 1); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1995 styleNode[propName] = propValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1996 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1997 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1998
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1999 TameElement.prototype.getOffsetParent = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2000 return tameRelatedNode(this.node___.offsetParent, this.editable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2001 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2002 TameElement.prototype.getGeometryDelegate___ = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2003 return this.node___;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2004 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2005 TameElement.prototype.toString = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2006 return '<' + this.node___.tagName + '>';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2007 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2008 TameElement.prototype.addEventListener = tameAddEventListener;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2009 TameElement.prototype.removeEventListener = tameRemoveEventListener;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2010 ___.ctor(TameElement, TameBackedNode, 'TameElement');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2011 ___.all2(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2012 ___.grantTypedGeneric, TameElement.prototype,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2013 ['addEventListener', 'removeEventListener',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2014 'getAttribute', 'setAttribute',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2015 'removeAttribute', 'hasAttribute',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2016 'getAttributeNode',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2017 'getBoundingClientRect',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2018 'getClassName', 'setClassName', 'getId', 'setId',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2019 'getInnerHTML', 'setInnerHTML', 'updateStyle', 'getStyle', 'setStyle',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2020 'getTagName']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2021
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2022 cajita.forOwnKeys({
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2023 clientWidth: {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2024 get: function () { return this.getGeometryDelegate___().clientWidth; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2025 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2026 clientHeight: {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2027 get: function () { return this.getGeometryDelegate___().clientHeight; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2028 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2029 offsetLeft: {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2030 get: function () { return this.getGeometryDelegate___().offsetLeft; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2031 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2032 offsetTop: {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2033 get: function () { return this.getGeometryDelegate___().offsetTop; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2034 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2035 offsetWidth: {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2036 get: function () { return this.getGeometryDelegate___().offsetWidth; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2037 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2038 offsetHeight: {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2039 get: function () { return this.getGeometryDelegate___().offsetHeight; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2040 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2041 scrollLeft: {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2042 get: function () { return this.getGeometryDelegate___().scrollLeft; },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2043 set: function (x) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2044 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2045 this.getGeometryDelegate___().scrollLeft = +x;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2046 return x;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2047 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2048 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2049 scrollTop: {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2050 get: function () { return this.getGeometryDelegate___().scrollTop; },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2051 set: function (y) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2052 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2053 this.getGeometryDelegate___().scrollTop = +y;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2054 return y;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2055 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2056 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2057 scrollWidth: {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2058 get: function () { return this.getGeometryDelegate___().scrollWidth; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2059 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2060 scrollHeight: {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2061 get: function () { return this.getGeometryDelegate___().scrollHeight; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2062 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2063 }, ___.func(function (propertyName, def) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2064 var setter = def.set || propertyOnlyHasGetter;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2065 ___.useGetHandler(TameElement.prototype, propertyName, def.get);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2066 ___.useSetHandler(TameElement.prototype, propertyName, setter);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2067 ___.useGetHandler(TamePseudoElement.prototype, propertyName, def.get);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2068 ___.useSetHandler(TamePseudoElement.prototype, propertyName, setter);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2069 }));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2070
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2071 // Register set handlers for onclick, onmouseover, etc.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2072 (function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2073 var attrNameRe = /:(.*)/;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2074 for (var html4Attrib in html4.ATTRIBS) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2075 if (html4.atype.SCRIPT === html4.ATTRIBS[html4Attrib]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2076 (function (attribName) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2077 ___.useSetHandler(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2078 TameElement.prototype,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2079 attribName,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2080 function eventHandlerSetter(listener) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2081 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2082 if (!listener) { // Clear the current handler
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2083 this.node___[attribName] = null;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2084 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2085 // This handler cannot be copied from one node to another
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2086 // which is why getters are not yet supported.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2087 this.node___[attribName] = makeEventHandlerWrapper(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2088 this.node___, listener);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2089 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2090 return listener;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2091 });
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2092 })(html4Attrib.match(attrNameRe)[1]);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2093 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2094 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2095 })();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2096
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2097 function TameAElement(node, editable) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2098 TameElement.call(this, node, editable, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2099 classUtils.exportFields(this, ['href']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2100 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2101 classUtils.extend(TameAElement, TameElement);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2102 nodeClasses.HTMLAnchorElement = TameAElement;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2103 TameAElement.prototype.focus = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2104 this.node___.focus();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2105 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2106 TameAElement.prototype.getHref = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2107 return this.node___.href;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2108 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2109 TameAElement.prototype.setHref = function (href) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2110 this.setAttribute('href', href);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2111 return href;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2112 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2113 ___.ctor(TameAElement, TameElement, 'TameAElement');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2114 ___.all2(___.grantTypedGeneric, TameAElement.prototype,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2115 ['getHref', 'setHref', 'focus']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2116
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2117 // http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-40002357
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2118 function TameFormElement(node, editable) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2119 TameElement.call(this, node, editable, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2120 this.length = node.length;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2121 classUtils.exportFields(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2122 this,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2123 ['action', 'elements', 'enctype', 'method', 'target']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2124 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2125 classUtils.extend(TameFormElement, TameElement);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2126 nodeClasses.HTMLFormElement = TameFormElement;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2127 TameFormElement.prototype.submit = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2128 return this.node___.submit();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2129 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2130 TameFormElement.prototype.reset = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2131 return this.node___.reset();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2132 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2133 TameFormElement.prototype.getAction = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2134 return this.getAttribute('action') || '';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2135 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2136 TameFormElement.prototype.setAction = function (newVal) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2137 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2138 return this.setAttribute('action', String(newVal));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2139 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2140 TameFormElement.prototype.getElements = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2141 return tameNodeList(this.node___.elements, this.editable___, 'name');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2142 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2143 TameFormElement.prototype.getEnctype = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2144 return this.getAttribute('enctype') || '';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2145 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2146 TameFormElement.prototype.setEnctype = function (newVal) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2147 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2148 return this.setAttribute('enctype', String(newVal));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2149 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2150 TameFormElement.prototype.getMethod = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2151 return this.getAttribute('method') || '';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2152 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2153 TameFormElement.prototype.setMethod = function (newVal) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2154 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2155 return this.setAttribute('method', String(newVal));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2156 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2157 TameFormElement.prototype.getTarget = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2158 return this.getAttribute('target') || '';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2159 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2160 TameFormElement.prototype.setTarget = function (newVal) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2161 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2162 return this.setAttribute('target', String(newVal));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2163 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2164 TameFormElement.prototype.reset = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2165 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2166 this.node___.reset();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2167 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2168 TameFormElement.prototype.submit = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2169 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2170 this.node___.submit();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2171 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2172 ___.ctor(TameFormElement, TameElement, 'TameFormElement');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2173 ___.all2(___.grantTypedGeneric, TameFormElement.prototype,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2174 ['getElements', 'reset', 'submit']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2175
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2176
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2177 function TameInputElement(node, editable) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2178 TameElement.call(this, node, editable, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2179 classUtils.exportFields(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2180 this,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2181 ['form', 'value', 'defaultValue',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2182 'checked', 'disabled', 'readOnly',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2183 'options', 'selected', 'selectedIndex',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2184 'name', 'accessKey', 'tabIndex', 'text',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2185 'defaultChecked', 'defaultSelected', 'maxLength',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2186 'size', 'type', 'index', 'label',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2187 'multiple', 'cols', 'rows']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2188 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2189 classUtils.extend(TameInputElement, TameElement);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2190 nodeClasses.HTMLInputElement = TameInputElement;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2191 TameInputElement.prototype.getChecked = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2192 return this.node___.checked;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2193 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2194 TameInputElement.prototype.setChecked = function (checked) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2195 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2196 return (this.node___.checked = !!checked);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2197 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2198 TameInputElement.prototype.getValue = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2199 // For <option> elements, Firefox returns a value even when no value
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2200 // attribute is present, using the contained text, but IE does not.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2201 var value = this.node___.value;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2202 return value === null || value === void 0 ? null : String(value);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2203 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2204 TameInputElement.prototype.setValue = function (newValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2205 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2206 this.node___.value = (
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2207 newValue === null || newValue === void 0 ? '' : '' + newValue);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2208 return newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2209 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2210 TameInputElement.prototype.getDefaultValue = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2211 var value = this.node___.defaultValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2212 return value === null || value === void 0 ? null : String(value);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2213 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2214 TameInputElement.prototype.setDefaultValue = function (newValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2215 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2216 this.node___.defaultValue = (
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2217 newValue === null || newValue === void 0 ? '' : '' + newValue);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2218 return newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2219 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2220 TameInputElement.prototype.focus = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2221 this.node___.focus();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2222 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2223 TameInputElement.prototype.blur = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2224 this.node___.blur();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2225 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2226 TameInputElement.prototype.select = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2227 this.node___.select();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2228 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2229 TameInputElement.prototype.getForm = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2230 return tameRelatedNode(this.node___.form, this.editable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2231 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2232 TameInputElement.prototype.getDisabled = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2233 return this.node___.disabled;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2234 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2235 TameInputElement.prototype.setDisabled = function (newValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2236 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2237 this.node___.disabled = newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2238 return newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2239 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2240 TameInputElement.prototype.getReadOnly = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2241 return this.node___.readOnly;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2242 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2243 TameInputElement.prototype.setReadOnly = function (newValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2244 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2245 this.node___.readOnly = newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2246 return newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2247 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2248 TameInputElement.prototype.getOptions = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2249 return tameNodeList(this.node___.options, this.editable___, 'name');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2250 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2251 TameInputElement.prototype.getDefaultSelected = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2252 return this.node___.defaultSelected;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2253 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2254 TameInputElement.prototype.setDefaultSelected = function (newValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2255 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2256 this.node___.defaultSelected = !!newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2257 return newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2258 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2259 TameInputElement.prototype.getSelected = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2260 return this.node___.selected;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2261 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2262 TameInputElement.prototype.setSelected = function (newValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2263 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2264 this.node___.selected = newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2265 return newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2266 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2267 TameInputElement.prototype.getSelectedIndex = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2268 return this.node___.selectedIndex;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2269 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2270 TameInputElement.prototype.setSelectedIndex = function (newValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2271 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2272 this.node___.selectedIndex = (newValue | 0);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2273 return newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2274 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2275 TameInputElement.prototype.getName = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2276 return this.node___.name;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2277 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2278 TameInputElement.prototype.setName = function (newValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2279 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2280 this.node___.name = newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2281 return newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2282 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2283 TameInputElement.prototype.getAccessKey = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2284 return this.node___.accessKey;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2285 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2286 TameInputElement.prototype.setAccessKey = function (newValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2287 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2288 this.node___.accessKey = newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2289 return newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2290 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2291 TameInputElement.prototype.getTabIndex = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2292 return this.node___.tabIndex;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2293 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2294 TameInputElement.prototype.getText = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2295 return String(this.node___.text);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2296 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2297 TameInputElement.prototype.setTabIndex = function (newValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2298 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2299 this.node___.tabIndex = newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2300 return newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2301 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2302 TameInputElement.prototype.getDefaultChecked = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2303 return this.node___.defaultChecked;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2304 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2305 TameInputElement.prototype.setDefaultChecked = function (newValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2306 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2307 this.node___.defaultChecked = newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2308 return newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2309 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2310 TameInputElement.prototype.getMaxLength = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2311 return this.node___.maxLength;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2312 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2313 TameInputElement.prototype.setMaxLength = function (newValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2314 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2315 this.node___.maxLength = newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2316 return newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2317 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2318 TameInputElement.prototype.getSize = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2319 return this.node___.size;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2320 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2321 TameInputElement.prototype.setSize = function (newValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2322 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2323 this.node___.size = newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2324 return newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2325 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2326 TameInputElement.prototype.getType = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2327 return String(this.node___.type);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2328 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2329 TameInputElement.prototype.setType = function (newValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2330 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2331 this.node___.type = newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2332 return newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2333 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2334 TameInputElement.prototype.getIndex = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2335 return this.node___.index;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2336 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2337 TameInputElement.prototype.setIndex = function (newValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2338 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2339 this.node___.index = newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2340 return newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2341 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2342 TameInputElement.prototype.getLabel = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2343 return this.node___.label;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2344 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2345 TameInputElement.prototype.setLabel = function (newValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2346 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2347 this.node___.label = newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2348 return newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2349 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2350 TameInputElement.prototype.getMultiple = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2351 return this.node___.multiple;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2352 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2353 TameInputElement.prototype.setMultiple = function (newValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2354 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2355 this.node___.multiple = newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2356 return newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2357 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2358 TameInputElement.prototype.getCols = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2359 return this.node___.cols;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2360 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2361 TameInputElement.prototype.setCols = function (newValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2362 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2363 this.node___.cols = newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2364 return newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2365 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2366 TameInputElement.prototype.getRows = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2367 return this.node___.rows;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2368 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2369 TameInputElement.prototype.setRows = function (newValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2370 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2371 this.node___.rows = newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2372 return newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2373 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2374 ___.ctor(TameInputElement, TameElement, 'TameInputElement');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2375 ___.all2(___.grantTypedGeneric, TameInputElement.prototype,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2376 ['getValue', 'setValue', 'focus', 'getForm', 'getType', 'select']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2377
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2378
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2379 function TameImageElement(node, editable) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2380 TameElement.call(this, node, editable, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2381 classUtils.exportFields(this, ['src', 'alt']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2382 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2383 classUtils.extend(TameImageElement, TameElement);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2384 nodeClasses.HTMLImageElement = TameImageElement;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2385 TameImageElement.prototype.getSrc = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2386 return this.node___.src;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2387 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2388 TameImageElement.prototype.setSrc = function (src) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2389 this.setAttribute('src', src);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2390 return src;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2391 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2392 TameImageElement.prototype.getAlt = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2393 return this.node___.alt;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2394 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2395 TameImageElement.prototype.setAlt = function (alt) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2396 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2397 this.node___.alt = String(alt);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2398 return alt;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2399 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2400 ___.ctor(TameImageElement, TameElement, 'TameImageElement');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2401 ___.all2(___.grantTypedGeneric, TameImageElement.prototype,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2402 ['getSrc', 'setSrc', 'getAlt', 'setAlt']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2403
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2404 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2405 * A script element wrapper that allows setting of a src that has been
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2406 * rewritten by a URL policy, but not modifying of textual content.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2407 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2408 function TameScriptElement(node, editable) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2409 // Make the child list immutable so that text content can't be added
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2410 // or removed.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2411 TameElement.call(this, node, editable, false);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2412 classUtils.exportFields(this, ['src']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2413 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2414 classUtils.extend(TameScriptElement, TameElement);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2415 nodeClasses.HTMLScriptElement = TameScriptElement;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2416 TameScriptElement.prototype.getSrc = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2417 return this.node___.src;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2418 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2419 TameScriptElement.prototype.setSrc = function (src) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2420 this.setAttribute('src', src);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2421 return src;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2422 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2423 ___.ctor(TameScriptElement, TameElement, 'TameScriptElement');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2424
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2425
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2426 function TameTableCompElement(node, editable) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2427 TameElement.call(this, node, editable, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2428 classUtils.exportFields(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2429 this,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2430 ['colSpan','cells','rowSpan','rows','rowIndex','align',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2431 'vAlign','nowrap']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2432 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2433 classUtils.extend(TameTableCompElement, TameElement);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2434 TameTableCompElement.prototype.getColSpan = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2435 return this.node___.colSpan;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2436 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2437 TameTableCompElement.prototype.setColSpan = function (newValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2438 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2439 this.node___.colSpan = newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2440 return newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2441 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2442 TameTableCompElement.prototype.getCells = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2443 return tameNodeList(this.node___.cells, this.editable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2444 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2445 TameTableCompElement.prototype.getRowSpan = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2446 return this.node___.rowSpan;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2447 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2448 TameTableCompElement.prototype.setRowSpan = function (newValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2449 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2450 this.node___.rowSpan = newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2451 return newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2452 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2453 TameTableCompElement.prototype.getRows = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2454 return tameNodeList(this.node___.rows, this.editable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2455 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2456 TameTableCompElement.prototype.getRowIndex = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2457 return this.node___.rowIndex;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2458 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2459 TameTableCompElement.prototype.getAlign = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2460 return this.node___.align;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2461 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2462 TameTableCompElement.prototype.setAlign = function (newValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2463 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2464 this.node___.align = newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2465 return newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2466 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2467 TameTableCompElement.prototype.getVAlign = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2468 return this.node___.vAlign;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2469 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2470 TameTableCompElement.prototype.setVAlign = function (newValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2471 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2472 this.node___.vAlign = newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2473 return newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2474 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2475 TameTableCompElement.prototype.getNowrap = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2476 return this.node___.nowrap;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2477 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2478 TameTableCompElement.prototype.setNowrap = function (newValue) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2479 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2480 this.node___.nowrap = newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2481 return newValue;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2482 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2483 ___.ctor(TameTableCompElement, TameElement, 'TameTableCompElement');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2484
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2485
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2486 function TameTableElement(node, editable) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2487 TameTableCompElement.call(this, node, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2488 classUtils.exportFields(this, ['tBodies','tHead','tFoot']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2489 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2490 classUtils.extend(TameTableElement, TameTableCompElement);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2491 nodeClasses.HTMLTableElement = TameTableElement;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2492 TameTableElement.prototype.getTBodies = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2493 return tameNodeList(this.node___.tBodies, this.editable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2494 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2495 TameTableElement.prototype.getTHead = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2496 return tameNode(this.node___.tHead, this.editable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2497 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2498 TameTableElement.prototype.getTFoot = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2499 return tameNode(this.node___.tFoot, this.editable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2500 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2501 TameTableElement.prototype.createTHead = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2502 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2503 return tameNode(this.node___.createTHead(), this.editable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2504 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2505 TameTableElement.prototype.deleteTHead = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2506 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2507 this.node___.deleteTHead();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2508 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2509 TameTableElement.prototype.createTFoot = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2510 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2511 return tameNode(this.node___.createTFoot(), this.editable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2512 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2513 TameTableElement.prototype.deleteTFoot = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2514 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2515 this.node___.deleteTFoot();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2516 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2517 ___.ctor(TameTableElement, TameTableCompElement, 'TameTableElement');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2518 ___.all2(___.grantTypedGeneric, TameTableElement.prototype,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2519 ['createTHead', 'deleteTHead','createTFoot', 'deleteTFoot']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2520
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2521 function tameEvent(event) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2522 if (event.tamed___) { return event.tamed___; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2523 return event.tamed___ = new TameEvent(event);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2524 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2525
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2526 function TameEvent(event) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2527 this.event___ = event;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2528 ___.stamp(tameEventTrademark, this, true);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2529 classUtils.exportFields(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2530 this,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2531 ['type', 'target', 'pageX', 'pageY', 'altKey',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2532 'ctrlKey', 'metaKey', 'shiftKey', 'button',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2533 'screenX', 'screenY',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2534 'currentTarget', 'relatedTarget',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2535 'fromElement', 'toElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2536 'srcElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2537 'clientX', 'clientY', 'keyCode', 'which']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2538 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2539 nodeClasses.Event = TameEvent;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2540 TameEvent.prototype.getType = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2541 return bridal.untameEventType(String(this.event___.type));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2542 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2543 TameEvent.prototype.getTarget = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2544 var event = this.event___;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2545 return tameRelatedNode(event.target || event.srcElement, true);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2546 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2547 TameEvent.prototype.getSrcElement = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2548 return tameRelatedNode(this.event___.srcElement, true);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2549 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2550 TameEvent.prototype.getCurrentTarget = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2551 var e = this.event___;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2552 return tameRelatedNode(e.currentTarget, true);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2553 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2554 TameEvent.prototype.getRelatedTarget = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2555 var e = this.event___;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2556 var t = e.relatedTarget;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2557 if (!t) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2558 if (e.type === 'mouseout') {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2559 t = e.toElement;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2560 } else if (e.type === 'mouseover') {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2561 t = e.fromElement;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2562 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2563 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2564 return tameRelatedNode(t, true);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2565 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2566 TameEvent.prototype.getFromElement = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2567 return tameRelatedNode(this.event___.fromElement, true);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2568 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2569 TameEvent.prototype.getToElement = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2570 return tameRelatedNode(this.event___.toElement, true);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2571 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2572 TameEvent.prototype.getPageX = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2573 return Number(this.event___.pageX);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2574 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2575 TameEvent.prototype.getPageY = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2576 return Number(this.event___.pageY);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2577 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2578 TameEvent.prototype.stopPropagation = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2579 // TODO(mikesamuel): make sure event doesn't propagate to dispatched
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2580 // events for this gadget only.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2581 // But don't allow it to stop propagation to the container.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2582 if (this.event___.stopPropagation) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2583 this.event___.stopPropagation();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2584 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2585 this.event___.cancelBubble = true;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2586 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2587 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2588 TameEvent.prototype.preventDefault = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2589 // TODO(mikesamuel): make sure event doesn't propagate to dispatched
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2590 // events for this gadget only.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2591 // But don't allow it to stop propagation to the container.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2592 if (this.event___.preventDefault) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2593 this.event___.preventDefault();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2594 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2595 this.event___.returnValue = false;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2596 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2597 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2598 TameEvent.prototype.getAltKey = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2599 return Boolean(this.event___.altKey);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2600 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2601 TameEvent.prototype.getCtrlKey = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2602 return Boolean(this.event___.ctrlKey);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2603 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2604 TameEvent.prototype.getMetaKey = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2605 return Boolean(this.event___.metaKey);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2606 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2607 TameEvent.prototype.getShiftKey = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2608 return Boolean(this.event___.shiftKey);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2609 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2610 TameEvent.prototype.getButton = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2611 var e = this.event___;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2612 return e.button && Number(e.button);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2613 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2614 TameEvent.prototype.getClientX = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2615 return Number(this.event___.clientX);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2616 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2617 TameEvent.prototype.getClientY = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2618 return Number(this.event___.clientY);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2619 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2620 TameEvent.prototype.getScreenX = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2621 return Number(this.event___.screenX);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2622 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2623 TameEvent.prototype.getScreenY = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2624 return Number(this.event___.screenY);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2625 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2626 TameEvent.prototype.getWhich = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2627 var w = this.event___.which;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2628 return w && Number(w);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2629 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2630 TameEvent.prototype.getKeyCode = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2631 var kc = this.event___.keyCode;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2632 return kc && Number(kc);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2633 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2634 TameEvent.prototype.toString = function () { return '[Fake Event]'; };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2635 ___.ctor(TameEvent, void 0, 'TameEvent');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2636 ___.all2(___.grantTypedGeneric, TameEvent.prototype,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2637 ['getType', 'getTarget', 'getPageX', 'getPageY', 'stopPropagation',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2638 'getAltKey', 'getCtrlKey', 'getMetaKey', 'getShiftKey',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2639 'getButton', 'getClientX', 'getClientY',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2640 'getScreenX', 'getScreenY',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2641 'getRelatedTarget',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2642 'getFromElement', 'getToElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2643 'getSrcElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2644 'preventDefault',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2645 'getKeyCode', 'getWhich']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2646
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2647 function TameCustomHTMLEvent(event) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2648 TameEvent.call(this, event);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2649 this.properties___ = {};
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2650 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2651 classUtils.extend(TameCustomHTMLEvent, TameEvent);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2652 TameCustomHTMLEvent.prototype.initEvent
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2653 = function (type, bubbles, cancelable) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2654 bridal.initEvent(this.event___, type, bubbles, cancelable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2655 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2656 TameCustomHTMLEvent.prototype.handleRead___ = function (name) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2657 name = String(name);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2658 if (endsWith__.test(name)) { return void 0; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2659 var handlerName = name + '_getter___';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2660 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2661 return this[handlerName]();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2662 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2663 handlerName = handlerName.toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2664 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2665 return this[handlerName]();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2666 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2667 if (___.hasOwnProp(this.event___.properties___, name)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2668 return this.event___.properties___[name];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2669 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2670 return void 0;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2671 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2672 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2673 TameCustomHTMLEvent.prototype.handleCall___ = function (name, args) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2674 name = String(name);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2675 if (endsWith__.test(name)) { throw new Error(INVALID_SUFFIX); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2676 var handlerName = name + '_handler___';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2677 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2678 return this[handlerName].call(this, args);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2679 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2680 handlerName = handlerName.toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2681 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2682 return this[handlerName].call(this, args);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2683 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2684 if (___.hasOwnProp(this.event___.properties___, name)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2685 return this.event___.properties___[name].call(this, args);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2686 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2687 throw new TypeError(name + ' is not a function.');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2688 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2689 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2690 TameCustomHTMLEvent.prototype.handleSet___ = function (name, val) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2691 name = String(name);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2692 if (endsWith__.test(name)) { throw new Error(INVALID_SUFFIX); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2693 var handlerName = name + '_setter___';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2694 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2695 return this[handlerName](val);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2696 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2697 handlerName = handlerName.toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2698 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2699 return this[handlerName](val);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2700 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2701 if (!this.event___.properties___) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2702 this.event___.properties___ = {};
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2703 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2704 this[name + '_canEnum___'] = true;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2705 return this.event___.properties___[name] = val;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2706 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2707 TameCustomHTMLEvent.prototype.handleDelete___ = function (name) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2708 name = String(name);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2709 if (endsWith__.test(name)) { throw new Error(INVALID_SUFFIX); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2710 var handlerName = name + '_deleter___';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2711 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2712 return this[handlerName]();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2713 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2714 handlerName = handlerName.toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2715 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2716 return this[handlerName]();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2717 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2718 if (this.event___.properties___) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2719 return (
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2720 delete this.event___.properties___[name]
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2721 && delete this[name + '_canEnum___']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2722 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2723 return true;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2724 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2725 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2726 TameCustomHTMLEvent.prototype.handleEnum___ = function (ownFlag) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2727 // TODO(metaweta): Add code to list all the other handled stuff we know
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2728 // about.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2729 if (this.event___.properties___) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2730 return cajita.allKeys(this.event___.properties___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2731 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2732 return [];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2733 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2734 TameCustomHTMLEvent.prototype.toString = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2735 return '[Fake CustomEvent]';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2736 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2737 ___.grantTypedGeneric(TameCustomHTMLEvent.prototype, 'initEvent');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2738 ___.ctor(TameCustomHTMLEvent, TameEvent, 'TameCustomHTMLEvent');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2739
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2740 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2741 * Return a fake node list containing tamed nodes.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2742 * @param {Array.<TameNode>} array of tamed nodes.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2743 * @return an array that duck types to a node list.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2744 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2745 function fakeNodeList(array) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2746 array.item = ___.frozenFunc(function(i) { return array[i]; });
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2747 return cajita.freeze(array);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2748 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2749
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2750 function TameHTMLDocument(doc, body, domain, editable) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2751 TamePseudoNode.call(this, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2752 this.doc___ = doc;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2753 this.body___ = body;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2754 this.domain___ = domain;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2755 this.onLoadListeners___ = [];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2756 var tameDoc = this;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2757
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2758 var tameBody = tameNode(body, editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2759 this.tameBody___ = tameBody;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2760 // TODO(mikesamuel): create a proper class for BODY, HEAD, and HTML along
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2761 // with all the other specialized node types.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2762 var tameBodyElement = new TamePseudoElement(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2763 'BODY',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2764 this,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2765 function () { return tameNodeList(body.childNodes, editable); },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2766 function () { return tameHtmlElement; },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2767 function () { return tameInnerHtml(body.innerHTML); },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2768 tameBody,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2769 editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2770 cajita.forOwnKeys(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2771 { appendChild: 0, removeChild: 0, insertBefore: 0, replaceChild: 0 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2772 ___.frozenFunc(function (k) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2773 tameBodyElement[k] = tameBody[k].bind(tameBody);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2774 ___.grantFunc(tameBodyElement, k);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2775 }));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2776
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2777 var title = doc.createTextNode(body.getAttribute('title') || '');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2778 var tameTitleElement = new TamePseudoElement(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2779 'TITLE',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2780 this,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2781 function () { return [tameNode(title, false)]; },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2782 function () { return tameHeadElement; },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2783 function () { return html.escapeAttrib(title.nodeValue); },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2784 null,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2785 editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2786 var tameHeadElement = new TamePseudoElement(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2787 'HEAD',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2788 this,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2789 function () { return [tameTitleElement]; },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2790 function () { return tameHtmlElement; },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2791 function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2792 return '<title>' + tameTitleElement.getInnerHTML() + '</title>';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2793 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2794 null,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2795 editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2796 var tameHtmlElement = new TamePseudoElement(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2797 'HTML',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2798 this,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2799 function () { return [tameHeadElement, tameBodyElement]; },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2800 function () { return tameDoc; },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2801 function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2802 return ('<head>' + tameHeadElement.getInnerHTML + '<\/head><body>'
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2803 + tameBodyElement.getInnerHTML() + '<\/body>');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2804 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2805 tameBody,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2806 editable);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2807 if (body.contains) { // typeof is 'object' on IE
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2808 tameHtmlElement.contains = function (other) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2809 cajita.guard(tameNodeTrademark, other);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2810 var otherNode = other.node___;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2811 return body.contains(otherNode);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2812 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2813 ___.grantFunc(tameHtmlElement, 'contains');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2814 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2815 if ('function' === typeof body.compareDocumentPosition) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2816 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2817 * Speced in <a href="http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-compareDocumentPosition">DOM-Level-3</a>.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2818 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2819 tameHtmlElement.compareDocumentPosition = function (other) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2820 cajita.guard(tameNodeTrademark, other);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2821 var otherNode = other.node___;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2822 if (!otherNode) { return 0; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2823 var bitmask = +body.compareDocumentPosition(otherNode);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2824 // To avoid leaking information about the relative positioning of
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2825 // different roots, if neither contains the other, then we mask out
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2826 // the preceding/following bits.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2827 // 0x18 is (CONTAINS | CONTAINED).
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2828 // 0x1f is all the bits documented at
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2829 // http://www.w3.org/TR/DOM-Level-3-Core/core.html#DocumentPosition
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2830 // except IMPLEMENTATION_SPECIFIC.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2831 // 0x01 is DISCONNECTED.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2832 /*
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2833 if (!(bitmask & 0x18)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2834 // TODO: If they are not under the same virtual doc root, return
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2835 // DOCUMENT_POSITION_DISCONNECTED instead of leaking information
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2836 // about PRECEEDED | FOLLOWING.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2837 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2838 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2839 return bitmask & 0x1f;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2840 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2841 if (!___.hasOwnProp(tameHtmlElement, 'contains')) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2842 // http://www.quirksmode.org/blog/archives/2006/01/contains_for_mo.html
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2843 tameHtmlElement.contains = (function (other) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2844 var docPos = this.compareDocumentPosition(other);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2845 return !(!(docPos & 0x10) && docPos);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2846 }).bind(tameHtmlElement);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2847 ___.grantFunc(tameHtmlElement, 'contains');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2848 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2849 ___.grantFunc(tameHtmlElement, 'compareDocumentPosition');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2850 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2851 this.documentElement___ = tameHtmlElement;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2852 classUtils.exportFields(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2853 this, ['documentElement', 'body', 'title', 'domain']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2854 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2855 classUtils.extend(TameHTMLDocument, TamePseudoNode);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2856 nodeClasses.HTMLDocument = TameHTMLDocument;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2857 TameHTMLDocument.prototype.getNodeType = function () { return 9; };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2858 TameHTMLDocument.prototype.getNodeName
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2859 = function () { return '#document'; };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2860 TameHTMLDocument.prototype.getNodeValue = function () { return null; };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2861 TameHTMLDocument.prototype.getChildNodes
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2862 = function () { return [this.documentElement___]; };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2863 TameHTMLDocument.prototype.getAttributes = function () { return []; };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2864 TameHTMLDocument.prototype.getParentNode = function () { return null; };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2865 TameHTMLDocument.prototype.getElementsByTagName = function (tagName) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2866 tagName = String(tagName).toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2867 switch (tagName) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2868 case 'body': return fakeNodeList([ this.getBody() ]);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2869 case 'head': return fakeNodeList([ this.getHead() ]);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2870 case 'title': return fakeNodeList([ this.getTitle() ]);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2871 case 'html': return fakeNodeList([ this.getDocumentElement() ]);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2872 default:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2873 return tameGetElementsByTagName(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2874 this.body___, tagName, this.editable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2875 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2876 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2877 TameHTMLDocument.prototype.getDocumentElement = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2878 return this.documentElement___;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2879 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2880 TameHTMLDocument.prototype.getBody = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2881 return this.documentElement___.getLastChild();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2882 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2883 TameHTMLDocument.prototype.getHead = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2884 return this.documentElement___.getFirstChild();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2885 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2886 TameHTMLDocument.prototype.getTitle = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2887 return this.getHead().getFirstChild();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2888 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2889 TameHTMLDocument.prototype.getDomain = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2890 return this.domain___;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2891 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2892 TameHTMLDocument.prototype.getElementsByClassName = function (className) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2893 return tameGetElementsByClassName(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2894 this.body___, className, this.editable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2895 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2896 TameHTMLDocument.prototype.addEventListener =
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2897 function (name, listener, useCapture) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2898 return this.tameBody___.addEventListener(name, listener, useCapture);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2899 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2900 TameHTMLDocument.prototype.removeEventListener =
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2901 function (name, listener, useCapture) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2902 return this.tameBody___.removeEventListener(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2903 name, listener, useCapture);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2904 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2905 TameHTMLDocument.prototype.createComment = function (text) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2906 return new TameCommentNode(this.doc___.createComment(" "), true);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2907 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2908 TameHTMLDocument.prototype.createDocumentFragment = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2909 return new TameBackedNode(this.doc___.createDocumentFragment(),
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2910 this.editable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2911 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2912 TameHTMLDocument.prototype.createElement = function (tagName) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2913 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2914 tagName = String(tagName).toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2915 if (!html4.ELEMENTS.hasOwnProperty(tagName)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2916 throw new Error(UNKNOWN_TAGNAME + "[" + tagName + "]");
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2917 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2918 var flags = html4.ELEMENTS[tagName];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2919 // Script exemption allows dynamic loading of proxied scripts.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2920 if ((flags & html4.eflags.UNSAFE) && !(flags & html4.eflags.SCRIPT)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2921 cajita.log(UNSAFE_TAGNAME + "[" + tagName + "]: no action performed");
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2922 return null;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2923 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2924 var newEl = this.doc___.createElement(tagName);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2925 if (elementPolicies.hasOwnProperty(tagName)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2926 var attribs = elementPolicies[tagName]([]);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2927 if (attribs) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2928 for (var i = 0; i < attribs.length; i += 2) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2929 bridal.setAttribute(newEl, attribs[i], attribs[i + 1]);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2930 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2931 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2932 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2933 return tameNode(newEl, true);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2934 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2935 TameHTMLDocument.prototype.createTextNode = function (text) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2936 if (!this.editable___) { throw new Error(NOT_EDITABLE); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2937 return tameNode(this.doc___.createTextNode(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2938 text !== null && text !== void 0 ? '' + text : ''), true);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2939 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2940 TameHTMLDocument.prototype.getElementById = function (id) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2941 id += idSuffix;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2942 var node = this.doc___.getElementById(id);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2943 return tameNode(node, this.editable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2944 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2945 TameHTMLDocument.prototype.toString = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2946 return '[Fake Document]';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2947 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2948 TameHTMLDocument.prototype.write = function (text) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2949 // TODO(mikesamuel): Needs implementation
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2950 cajita.log('Called document.write() with: ' + text);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2951 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2952 // http://www.w3.org/TR/DOM-Level-2-Events/events.html
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2953 // #Events-DocumentEvent-createEvent
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2954 TameHTMLDocument.prototype.createEvent = function (type) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2955 type = String(type);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2956 if (type !== 'HTMLEvents') {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2957 // See https://developer.mozilla.org/en/DOM/document.createEvent#Notes
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2958 // for a long list of event ypes.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2959 // See http://www.w3.org/TR/DOM-Level-2-Events/events.html
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2960 // #Events-eventgroupings
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2961 // for the DOM2 list.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2962 throw new Error('Unrecognized event type ' + type);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2963 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2964 var document = this.doc___;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2965 var rawEvent;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2966 if (document.createEvent) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2967 rawEvent = document.createEvent(type);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2968 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2969 rawEvent = document.createEventObject();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2970 rawEvent.eventType = 'ondataavailable';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2971 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2972 var tamedEvent = new TameCustomHTMLEvent(rawEvent);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2973 rawEvent.tamed___ = tamedEvent;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2974 return tamedEvent;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2975 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2976 TameHTMLDocument.prototype.getOwnerDocument = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2977 return null;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2978 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2979 // Called by the html-emitter when the virtual document has been loaded.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2980 TameHTMLDocument.prototype.signalLoaded___ = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2981 var listeners = this.onLoadListeners___;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2982 this.onLoadListeners___ = [];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2983 for (var i = 0, n = listeners.length; i < n; ++i) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2984 (function (listener) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2985 var listenerFn = ___.asFunc(listener);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2986 setTimeout(function () { listenerFn.call(cajita.USELESS); }, 0);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2987 })(listeners[i]);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2988 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2989 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2990
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2991 ___.ctor(TameHTMLDocument, TamePseudoNode, 'TameHTMLDocument');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2992 ___.all2(___.grantTypedGeneric, TameHTMLDocument.prototype,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2993 ['addEventListener', 'removeEventListener',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2994 'createComment', 'createDocumentFragment',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2995 'createElement', 'createEvent', 'createTextNode',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2996 'getElementById', 'getElementsByClassName',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2997 'getElementsByTagName',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2998 'write']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2999
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3000
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3001 imports.tameNode___ = tameNode;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3002 imports.tameEvent___ = tameEvent;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3003 imports.blessHtml___ = blessHtml;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3004 imports.blessCss___ = function (var_args) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3005 var arr = [];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3006 for (var i = 0, n = arguments.length; i < n; ++i) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3007 arr[i] = arguments[i];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3008 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3009 return cssSealerUnsealerPair.seal(arr);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3010 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3011 imports.htmlAttr___ = function (s) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3012 return html.escapeAttrib(String(s || ''));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3013 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3014 imports.html___ = safeHtml;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3015 imports.rewriteUri___ = function (uri, mimeType) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3016 var s = rewriteAttribute(null, null, html4.atype.URI, uri);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3017 if (!s) { throw new Error(); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3018 return s;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3019 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3020 imports.suffix___ = function (nmtokens) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3021 var p = String(nmtokens).replace(/^\s+|\s+$/g, '').split(/\s+/g);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3022 var out = [];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3023 for (var i = 0; i < p.length; ++i) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3024 var nmtoken = rewriteAttribute(null, null, html4.atype.ID, p[i]);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3025 if (!nmtoken) { throw new Error(nmtokens); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3026 out.push(nmtoken);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3027 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3028 return out.join(' ');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3029 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3030 imports.ident___ = function (nmtokens) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3031 var p = String(nmtokens).replace(/^\s+|\s+$/g, '').split(/\s+/g);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3032 var out = [];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3033 for (var i = 0; i < p.length; ++i) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3034 var nmtoken = rewriteAttribute(null, null, html4.atype.CLASSES, p[i]);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3035 if (!nmtoken) { throw new Error(nmtokens); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3036 out.push(nmtoken);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3037 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3038 return out.join(' ');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3039 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3040 // Maps a lower-cased style property name, e.g. background-image,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3041 // to a style object property name, e.g. backgroundImage, so that
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3042 // it can be used as a style object property name as in
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3043 // myHtmlElement.style['backgroundImage'].
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3044 var canonicalStylePropertyNames = {};
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3045 // Maps style property names, e.g. cssFloat, to property names, e.g. float.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3046 var cssPropertyNames = [];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3047
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3048 cajita.forOwnKeys(css.properties,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3049 ___.frozenFunc(function (cssPropertyName, pattern) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3050 var baseStylePropertyName = cssPropertyName.replace(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3051 /-([a-z])/g, function (_, letter) { return letter.toUpperCase(); });
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3052 var canonStylePropertyName = baseStylePropertyName;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3053 cssPropertyNames[baseStylePropertyName]
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3054 = cssPropertyNames[canonStylePropertyName]
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3055 = cssPropertyName;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3056 if (css.alternates.hasOwnProperty(canonStylePropertyName)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3057 var alts = css.alternates[canonStylePropertyName];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3058 for (var i = alts.length; --i >= 0;) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3059 cssPropertyNames[alts[i]] = cssPropertyName;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3060 // Handle oddities like cssFloat/styleFloat.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3061 if (alts[i] in document.documentElement.style
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3062 && !(canonStylePropertyName in document.documentElement.style)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3063 canonStylePropertyName = alts[i];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3064 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3065 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3066 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3067 canonicalStylePropertyNames[cssPropertyName] = canonStylePropertyName;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3068 }));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3069
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3070 function TameStyle(style, editable) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3071 this.style___ = style;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3072 this.editable___ = editable;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3073 ___.grantCall(this, 'getPropertyValue');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3074 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3075 nodeClasses.Style = TameStyle;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3076 TameStyle.prototype.allowProperty___ = function (cssPropertyName) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3077 return css.properties.hasOwnProperty(cssPropertyName);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3078 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3079 TameStyle.prototype.handleRead___ = function (stylePropertyName) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3080 if (!this.style___
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3081 || !cssPropertyNames.hasOwnProperty(stylePropertyName)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3082 return void 0;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3083 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3084 var cssPropertyName = cssPropertyNames[stylePropertyName];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3085 if (!this.allowProperty___(cssPropertyName)) { return void 0; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3086 var canonName = canonicalStylePropertyNames[cssPropertyName];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3087 return String(this.style___[canonName] || '');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3088 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3089 TameStyle.prototype.getPropertyValue = function (cssPropertyName) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3090 cssPropertyName = String(cssPropertyName || '').toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3091 if (!this.allowProperty___(cssPropertyName)) { return ''; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3092 var canonName = canonicalStylePropertyNames[cssPropertyName];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3093 return String(this.style___[canonName] || '');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3094 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3095 TameStyle.prototype.handleSet___ = function (stylePropertyName, value) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3096 if (!this.editable___) { throw new Error('style not editable'); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3097 if (!cssPropertyNames.hasOwnProperty(stylePropertyName)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3098 throw new Error('Unknown CSS property name ' + stylePropertyName);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3099 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3100 var cssPropertyName = cssPropertyNames[stylePropertyName];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3101 if (!this.allowProperty___(cssPropertyName)) { return void 0; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3102 var pattern = css.properties[cssPropertyName];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3103 if (!pattern) { throw new Error('style not editable'); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3104 var val = '' + (value || '');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3105 // CssPropertyPatterns.java only allows styles of the form
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3106 // url("..."). See the BUILTINS definition for the "uri" symbol.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3107 val = val.replace(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3108 /\burl\s*\(\s*\"([^\"]*)\"\s*\)/gi,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3109 function (_, url) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3110 var decodedUrl = decodeCssString(url);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3111 var rewrittenUrl = uriCallback
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3112 ? uriCallback.rewrite(decodedUrl, 'image/*')
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3113 : null;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3114 if (!rewrittenUrl) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3115 rewrittenUrl = 'about:blank';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3116 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3117 return 'url("'
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3118 + rewrittenUrl.replace(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3119 /[\"\'\{\}\(\):\\]/g,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3120 function (ch) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3121 return '\\' + ch.charCodeAt(0).toString(16) + ' ';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3122 })
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3123 + '")';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3124 });
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3125 if (val && !pattern.test(val + ' ')) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3126 throw new Error('bad value `' + val + '` for CSS property '
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3127 + stylePropertyName);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3128 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3129 var canonName = canonicalStylePropertyNames[cssPropertyName];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3130 this.style___[canonName] = val;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3131 return value;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3132 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3133 TameStyle.prototype.toString = function () { return '[Fake Style]'; };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3134
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3135 function TameComputedStyle(style) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3136 TameStyle.call(this, style, false);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3137 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3138 classUtils.extend(TameComputedStyle, TameStyle);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3139 TameComputedStyle.prototype.allowProperty___ = function (cssPropertyName) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3140 return css.COMPUTED_STYLE_WHITELIST.hasOwnProperty(cssPropertyName);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3141 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3142 TameComputedStyle.prototype.toString = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3143 return '[Fake Computed Style]';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3144 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3145
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3146 nodeClasses.XMLHttpRequest = domitaModules.TameXMLHttpRequest(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3147 domitaModules.XMLHttpRequestCtor(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3148 window.XMLHttpRequest,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3149 window.ActiveXObject),
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3150 uriCallback);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3151
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3152 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3153 * given a number, outputs the equivalent css text.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3154 * @param {number} num
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3155 * @return {string} an CSS representation of a number suitable for both html
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3156 * attribs and plain text.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3157 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3158 imports.cssNumber___ = function (num) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3159 if ('number' === typeof num && isFinite(num) && !isNaN(num)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3160 return '' + num;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3161 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3162 throw new Error(num);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3163 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3164 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3165 * given a number as 24 bits of RRGGBB, outputs a properly formatted CSS
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3166 * color.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3167 * @param {number} num
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3168 * @return {string} a CSS representation of num suitable for both html
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3169 * attribs and plain text.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3170 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3171 imports.cssColor___ = function (color) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3172 // TODO: maybe whitelist the color names defined for CSS if the arg is a
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3173 // string.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3174 if ('number' !== typeof color || (color != (color | 0))) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3175 throw new Error(color);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3176 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3177 var hex = '0123456789abcdef';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3178 return '#' + hex.charAt((color >> 20) & 0xf)
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3179 + hex.charAt((color >> 16) & 0xf)
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3180 + hex.charAt((color >> 12) & 0xf)
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3181 + hex.charAt((color >> 8) & 0xf)
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3182 + hex.charAt((color >> 4) & 0xf)
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3183 + hex.charAt(color & 0xf);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3184 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3185 imports.cssUri___ = function (uri, mimeType) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3186 var s = rewriteAttribute(null, null, html4.atype.URI, uri);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3187 if (!s) { throw new Error(); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3188 return s;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3189 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3190
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3191 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3192 * Create a CSS stylesheet with the given text and append it to the DOM.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3193 * @param {string} cssText a well-formed stylesheet production.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3194 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3195 imports.emitCss___ = function (cssText) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3196 this.getCssContainer___().appendChild(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3197 bridal.createStylesheet(document, cssText));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3198 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3199 /** The node to which gadget stylesheets should be added. */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3200 imports.getCssContainer___ = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3201 return document.getElementsByTagName('head')[0];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3202 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3203
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3204 if (!/^-/.test(idSuffix)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3205 throw new Error('id suffix "' + idSuffix + '" must start with "-"');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3206 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3207 var idClass = idSuffix.substring(1);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3208 /** A per-gadget class used to separate style rules. */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3209 imports.getIdClass___ = function () {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3210 return idClass;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3211 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3212
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3213 // TODO(mikesamuel): remove these, and only expose them via window once
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3214 // Valija works
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3215 imports.setTimeout = tameSetTimeout;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3216 imports.setInterval = tameSetInterval;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3217 imports.clearTimeout = tameClearTimeout;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3218 imports.clearInterval = tameClearInterval;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3219
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3220 var tameDocument = new TameHTMLDocument(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3221 document,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3222 pseudoBodyNode,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3223 String(optPseudoWindowLocation.hostname || 'nosuchhost.fake'),
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3224 true);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3225 imports.document = tameDocument;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3226
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3227 // TODO(mikesamuel): figure out a mechanism by which the container can
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3228 // specify the gadget's apparent URL.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3229 // See http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#location0
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3230 var tameLocation = ___.primFreeze({
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3231 toString: ___.frozenFunc(function () { return tameLocation.href; }),
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3232 href: String(optPseudoWindowLocation.href || 'http://nosuchhost.fake/'),
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3233 hash: String(optPseudoWindowLocation.hash || ''),
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3234 host: String(optPseudoWindowLocation.host || 'nosuchhost.fake'),
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3235 hostname: String(optPseudoWindowLocation.hostname || 'nosuchhost.fake'),
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3236 pathname: String(optPseudoWindowLocation.pathname || '/'),
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3237 port: String(optPseudoWindowLocation.port || ''),
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3238 protocol: String(optPseudoWindowLocation.protocol || 'http:'),
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3239 search: String(optPseudoWindowLocation.search || '')
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3240 });
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3241
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3242 // See spec at http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#navigator
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3243 var tameNavigator = ___.primFreeze({
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3244 appCodeName: 'Caja',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3245 appName: 'Sandbox',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3246 appVersion: '1.0', // Should we expose the user's Locale here?
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3247 language: '', // Should we expose the user's Locale here?
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3248 platform: 'Caja',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3249 oscpu: 'Caja',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3250 vendor: '',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3251 vendorSub: '',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3252 product: 'Caja',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3253 productSub: '',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3254 userAgent: 'Caja/1.0'
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3255 });
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3256
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3257 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3258 * Set of allowed pseudo elements as described at
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3259 * http://www.w3.org/TR/CSS2/selector.html#q20
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3260 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3261 var PSEUDO_ELEMENT_WHITELIST = {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3262 // after and before disallowed since they can leak information about
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3263 // arbitrary ancestor nodes.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3264 'first-letter': true,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3265 'first-line': true
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3266 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3267
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3268 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3269 * See http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#window for the full API.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3270 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3271 function TameWindow() {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3272 this.properties___ = {};
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3273 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3274
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3275 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3276 * An <a href=
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3277 * href=http://www.w3.org/TR/DOM-Level-2-Views/views.html#Views-AbstractView
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3278 * >AbstractView</a> implementation that exposes styling, positioning, and
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3279 * sizing information about the current document's pseudo-body.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3280 * <p>
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3281 * The AbstractView spec specifies very little in its IDL description, but
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3282 * mozilla defines it thusly:<blockquote>
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3283 * document.defaultView is generally a reference to the window object
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3284 * for the document, however that is not defined in the specification
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3285 * and can't be relied upon for all host environments, particularly as
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3286 * not all browsers implement it.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3287 * </blockquote>
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3288 * <p>
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3289 * We can't provide access to the tamed window directly from document
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3290 * since it is the global scope of valija code, and so access to another
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3291 * module's tamed window provides an unbounded amount of authority.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3292 * <p>
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3293 * Instead, we expose styling, positioning, and sizing properties
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3294 * via this class. All of this authority is already available from the
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3295 * document.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3296 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3297 function TameDefaultView() {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3298 // TODO(mikesamuel): Implement in terms of
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3299 // http://www.w3.org/TR/cssom-view/#the-windowview-interface
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3300 // TODO: expose a read-only version of the document
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3301 this.document = tameDocument;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3302 // Exposing an editable default view that pointed to a read-only
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3303 // tameDocument via document.defaultView would allow escalation of
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3304 // authority.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3305 assert(tameDocument.editable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3306 ___.grantRead(this, 'document');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3307 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3308
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3309 cajita.forOwnKeys({
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3310 document: tameDocument,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3311 location: tameLocation,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3312 navigator: tameNavigator,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3313 setTimeout: tameSetTimeout,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3314 setInterval: tameSetInterval,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3315 clearTimeout: tameClearTimeout,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3316 clearInterval: tameClearInterval,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3317 addEventListener: ___.frozenFunc(function (name, listener, useCapture) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3318 if (name === 'load') {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3319 ___.asFunc(listener);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3320 tameDocument.onLoadListeners___.push(listener);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3321 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3322 }),
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3323 removeEventListener: ___.frozenFunc(function (name, listener, useCapture) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3324 var listeners = tameDocument.onLoadListeners___;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3325 var k = 0;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3326 for (var i = 0, n = listeners.length; i < n; ++i) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3327 listeners[i - k] = listeners[i];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3328 if (listeners[i] === listener) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3329 ++k;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3330 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3331 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3332 listeners.length -= k;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3333 }),
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3334 dispathEvent: ___.frozenFunc(function (evt) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3335 // TODO(ihab.awad): Implement
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3336 })
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3337 }, ___.func(function (propertyName, value) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3338 TameWindow.prototype[propertyName] = value;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3339 ___.grantRead(TameWindow.prototype, propertyName);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3340 }));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3341 cajita.forOwnKeys({
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3342 scrollBy: ___.frozenFunc(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3343 function (dx, dy) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3344 // The window is always auto scrollable, so make the apparent window
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3345 // body scrollable if the gadget tries to scroll it.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3346 if (dx || dy) { makeScrollable(tameDocument.body___); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3347 tameScrollBy(tameDocument.body___, dx, dy);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3348 }),
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3349 scrollTo: ___.frozenFunc(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3350 function (x, y) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3351 // The window is always auto scrollable, so make the apparent window
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3352 // body scrollable if the gadget tries to scroll it.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3353 makeScrollable(tameDocument.body___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3354 tameScrollTo(tameDocument.body___, x, y);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3355 }),
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3356 resizeTo: ___.frozenFunc(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3357 function (w, h) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3358 tameResizeTo(tameDocument.body___, w, h);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3359 }),
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3360 resizeBy: ___.frozenFunc(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3361 function (dw, dh) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3362 tameResizeBy(tameDocument.body___, dw, dh);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3363 }),
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3364 /** A partial implementation of getComputedStyle. */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3365 getComputedStyle: ___.frozenFunc(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3366 // Pseudo elements are suffixes like :first-line which constrain to
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3367 // a portion of the element's content as defined at
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3368 // http://www.w3.org/TR/CSS2/selector.html#q20
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3369 function (tameElement, pseudoElement) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3370 cajita.guard(tameNodeTrademark, tameElement);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3371 // Coerce all nullish values to undefined, since that is the value
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3372 // for unspecified parameters.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3373 // Per bug 973: pseudoElement should be null according to the
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3374 // spec, but mozilla docs contradict this.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3375 // From https://developer.mozilla.org/En/DOM:window.getComputedStyle
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3376 // pseudoElt is a string specifying the pseudo-element to match.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3377 // Should be an empty string for regular elements.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3378 pseudoElement = (pseudoElement === null || pseudoElement === void 0
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3379 || '' === pseudoElement)
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3380 ? void 0 : String(pseudoElement).toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3381 if (pseudoElement !== void 0
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3382 && !PSEUDO_ELEMENT_WHITELIST.hasOwnProperty(pseudoElement)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3383 throw new Error('Bad pseudo class ' + pseudoElement);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3384 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3385 // No need to check editable since computed styles are readonly.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3386
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3387 var rawNode = tameElement.node___;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3388 if (rawNode.currentStyle && pseudoElement === void 0) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3389 return new TameComputedStyle(rawNode.currentStyle);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3390 } else if (window.getComputedStyle) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3391 var rawStyleNode = window.getComputedStyle(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3392 tameElement.node___, pseudoElement);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3393 return new TameComputedStyle(rawStyleNode);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3394 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3395 throw new Error(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3396 'Computed style not available for pseudo element '
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3397 + pseudoElement);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3398 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3399 })
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3400
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3401 // NOT PROVIDED
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3402 // event: a global on IE. We always define it in scopes that can handle
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3403 // events.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3404 // opera: defined only on Opera.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3405 }, ___.func(function (propertyName, value) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3406 TameWindow.prototype[propertyName] = value;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3407 ___.grantRead(TameWindow.prototype, propertyName);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3408 TameDefaultView.prototype[propertyName] = value;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3409 ___.grantRead(TameDefaultView.prototype, propertyName);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3410 }));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3411 TameWindow.prototype.handleRead___ = function (name) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3412 name = String(name);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3413 if (endsWith__.test(name)) { return void 0; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3414 var handlerName = name + '_getter___';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3415 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3416 return this[handlerName]();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3417 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3418 handlerName = handlerName.toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3419 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3420 return this[handlerName]();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3421 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3422 if (___.hasOwnProp(this, name)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3423 return this[name];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3424 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3425 return void 0;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3426 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3427 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3428 TameWindow.prototype.handleSet___ = function (name, val) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3429 name = String(name);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3430 if (endsWith__.test(name)) { throw new Error(INVALID_SUFFIX); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3431 var handlerName = name + '_setter___';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3432 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3433 return this[handlerName](val);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3434 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3435 handlerName = handlerName.toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3436 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3437 return this[handlerName](val);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3438 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3439 this[name + '_canEnum___'] = true;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3440 this[name + '_canRead___'] = true;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3441 return this[name] = val;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3442 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3443 TameWindow.prototype.handleDelete___ = function (name) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3444 name = String(name);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3445 if (endsWith__.test(name)) { throw new Error(INVALID_SUFFIX); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3446 var handlerName = name + '_deleter___';
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3447 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3448 return this[handlerName]();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3449 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3450 handlerName = handlerName.toLowerCase();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3451 if (this[handlerName]) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3452 return this[handlerName]();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3453 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3454 return (
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3455 delete this[name]
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3456 && delete this[name + '_canEnum___']
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3457 && delete this[name + '_canRead___']);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3458 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3459 TameWindow.prototype.handleEnum___ = function (ownFlag) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3460 // TODO(metaweta): Add code to list all the other handled stuff we know
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3461 // about.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3462 return cajita.allKeys(this);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3463 };
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3464
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3465 var tameWindow = new TameWindow();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3466 var tameDefaultView = new TameDefaultView(tameDocument.editable___);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3467
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3468 function propertyOnlyHasGetter(_) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3469 throw new TypeError('setting a property that only has a getter');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3470 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3471 cajita.forOwnKeys({
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3472 // We define all the window positional properties relative to
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3473 // the fake body element to maintain the illusion that the fake
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3474 // document is completely defined by the nodes under the fake body.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3475 clientLeft: {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3476 get: function () { return tameDocument.body___.clientLeft; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3477 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3478 clientTop: {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3479 get: function () { return tameDocument.body___.clientTop; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3480 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3481 clientHeight: {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3482 get: function () { return tameDocument.body___.clientHeight; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3483 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3484 clientWidth: {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3485 get: function () { return tameDocument.body___.clientWidth; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3486 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3487 offsetLeft: {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3488 get: function () { return tameDocument.body___.offsetLeft; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3489 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3490 offsetTop: {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3491 get: function () { return tameDocument.body___.offsetTop; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3492 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3493 offsetHeight: {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3494 get: function () { return tameDocument.body___.offsetHeight; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3495 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3496 offsetWidth: {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3497 get: function () { return tameDocument.body___.offsetWidth; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3498 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3499 // page{X,Y}Offset appear only as members of window, not on all elements
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3500 // but http://www.howtocreate.co.uk/tutorials/javascript/browserwindow
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3501 // says that they are identical to the scrollTop/Left on all browsers but
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3502 // old versions of Safari.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3503 pageXOffset: {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3504 get: function () { return tameDocument.body___.scrollLeft; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3505 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3506 pageYOffset: {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3507 get: function () { return tameDocument.body___.scrollTop; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3508 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3509 scrollLeft: {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3510 get: function () { return tameDocument.body___.scrollLeft; },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3511 set: function (x) { tameDocument.body___.scrollLeft = +x; return x; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3512 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3513 scrollTop: {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3514 get: function () { return tameDocument.body___.scrollTop; },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3515 set: function (y) { tameDocument.body___.scrollTop = +y; return y; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3516 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3517 scrollHeight: {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3518 get: function () { return tameDocument.body___.scrollHeight; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3519 },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3520 scrollWidth: {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3521 get: function () { return tameDocument.body___.scrollWidth; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3522 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3523 }, ___.func(function (propertyName, def) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3524 var setter = def.set || propertyOnlyHasGetter;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3525 // TODO(mikesamuel): define on prototype.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3526 ___.useGetHandler(tameWindow, propertyName, def.get);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3527 ___.useSetHandler(tameWindow, propertyName, setter);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3528 ___.useGetHandler(tameDefaultView, propertyName, def.get);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3529 ___.useSetHandler(tameDefaultView, propertyName, setter);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3530 var tameBody = tameDocument.getBody();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3531 ___.useGetHandler(tameBody, propertyName, def.get);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3532 ___.useSetHandler(tameBody, propertyName, setter);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3533 var tameDocEl = tameDocument.getDocumentElement();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3534 ___.useGetHandler(tameDocEl, propertyName, def.get);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3535 ___.useSetHandler(tameDocEl, propertyName, setter);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3536 }));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3537
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3538 cajita.forOwnKeys({
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3539 innerHeight: function () { return tameDocument.body___.clientHeight; },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3540 innerWidth: function () { return tameDocument.body___.clientWidth; },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3541 outerHeight: function () { return tameDocument.body___.clientHeight; },
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3542 outerWidth: function () { return tameDocument.body___.clientWidth; }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3543 }, ___.func(function (propertyName, handler) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3544 // TODO(mikesamuel): define on prototype.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3545 ___.useGetHandler(tameWindow, propertyName, handler);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3546 ___.useGetHandler(tameDefaultView, propertyName, handler);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3547 }));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3548
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3549 // Attach reflexive properties to 'window' object
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3550 var windowProps = ['top', 'self', 'opener', 'parent', 'window'];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3551 var wpLen = windowProps.length;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3552 for (var i = 0; i < wpLen; ++i) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3553 var prop = windowProps[i];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3554 tameWindow[prop] = tameWindow;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3555 ___.grantRead(tameWindow, prop);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3556 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3557
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3558 if (tameDocument.editable___) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3559 tameDocument.defaultView = tameDefaultView;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3560 ___.grantRead(tameDocument, 'defaultView');
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3561 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3562
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3563 // Iterate over all node classes, assigning them to the Window object
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3564 // under their DOM Level 2 standard name.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3565 cajita.forOwnKeys(nodeClasses, ___.func(function(name, ctor) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3566 ___.primFreeze(ctor);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3567 tameWindow[name] = ctor;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3568 ___.grantRead(tameWindow, name);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3569 }));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3570
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3571 // TODO(ihab.awad): Build a more sophisticated virtual class hierarchy by
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3572 // creating a table of actual subclasses and instantiating tame nodes by
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3573 // table lookups. This will allow the client code to see a truly consistent
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3574 // DOM class hierarchy.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3575 var defaultNodeClasses = [
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3576 'HTMLAppletElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3577 'HTMLAreaElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3578 'HTMLBaseElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3579 'HTMLBaseFontElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3580 'HTMLBodyElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3581 'HTMLBRElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3582 'HTMLButtonElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3583 'HTMLDirectoryElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3584 'HTMLDivElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3585 'HTMLDListElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3586 'HTMLFieldSetElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3587 'HTMLFontElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3588 'HTMLFrameElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3589 'HTMLFrameSetElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3590 'HTMLHeadElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3591 'HTMLHeadingElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3592 'HTMLHRElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3593 'HTMLHtmlElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3594 'HTMLIFrameElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3595 'HTMLIsIndexElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3596 'HTMLLabelElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3597 'HTMLLegendElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3598 'HTMLLIElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3599 'HTMLLinkElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3600 'HTMLMapElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3601 'HTMLMenuElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3602 'HTMLMetaElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3603 'HTMLModElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3604 'HTMLObjectElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3605 'HTMLOListElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3606 'HTMLOptGroupElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3607 'HTMLOptionElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3608 'HTMLParagraphElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3609 'HTMLParamElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3610 'HTMLPreElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3611 'HTMLQuoteElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3612 'HTMLScriptElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3613 'HTMLSelectElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3614 'HTMLStyleElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3615 'HTMLTableCaptionElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3616 'HTMLTableCellElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3617 'HTMLTableColElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3618 'HTMLTableElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3619 'HTMLTableRowElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3620 'HTMLTableSectionElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3621 'HTMLTextAreaElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3622 'HTMLTitleElement',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3623 'HTMLUListElement'
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3624 ];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3625
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3626 var defaultNodeClassCtor = ___.primFreeze(TameElement);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3627 for (var i = 0; i < defaultNodeClasses.length; i++) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3628 tameWindow[defaultNodeClasses[i]] = defaultNodeClassCtor;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3629 ___.grantRead(tameWindow, defaultNodeClasses[i]);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3630 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3631
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3632 var outers = imports.outers;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3633 if (___.isJSONContainer(outers)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3634 // For Valija, attach use the window object as outers.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3635 cajita.forOwnKeys(outers, ___.func(function(k, v) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3636 if (!(k in tameWindow)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3637 tameWindow[k] = v;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3638 ___.grantRead(tameWindow, k);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3639 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3640 }));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3641 imports.outers = tameWindow;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3642 } else {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3643 imports.window = tameWindow;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3644 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3645 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3646
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3647 return attachDocumentStub;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3648 })();
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3649
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3650 /**
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3651 * Function called from rewritten event handlers to dispatch an event safely.
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3652 */
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3653 function plugin_dispatchEvent___(thisNode, event, pluginId, handler) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3654 event = (event || window.event);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3655 var sig = String(handler).match(/^function\b[^\)]*\)/);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3656 cajita.log(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3657 'Dispatch ' + (event && event.type) +
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3658 'event thisNode=' + thisNode + ', ' +
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3659 'event=' + event + ', ' +
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3660 'pluginId=' + pluginId + ', ' +
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3661 'handler=' + (sig ? sig[0] : handler));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3662 var imports = ___.getImports(pluginId);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3663 switch (typeof handler) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3664 case 'string':
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3665 handler = imports[handler];
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3666 break;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3667 case 'function': case 'object':
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3668 break;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3669 default:
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3670 throw new Error(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3671 'Expected function as event handler, not ' + typeof handler);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3672 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3673 if (___.startCallerStack) { ___.startCallerStack(); }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3674 imports.isProcessingEvent___ = true;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3675 try {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3676 return ___.callPub(
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3677 handler, 'call',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3678 [___.USELESS,
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3679 imports.tameEvent___(event),
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3680 imports.tameNode___(thisNode, true)
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3681 ]);
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3682 } catch (ex) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3683 if (ex && ex.cajitaStack___ && 'undefined' !== (typeof console)) {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3684 console.error('Event dispatch %s: %s',
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3685 handler, ___.unsealCallerStack(ex.cajitaStack___).join('\n'));
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3686 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3687 throw ex;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3688 } finally {
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3689 imports.isProcessingEvent___ = false;
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3690 }
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3691 }