Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: static/src/js/vendor/classList.js

Issue 29624561: Issue 6104 - Minified code in help center repository (Closed) Base URL: https://hg.adblockplus.org/help.eyeo.com
Patch Set: Consolidated gulp tasks Created Dec. 7, 2017, 2:48 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /*!
2 * classList.js: Cross-browser full element.classList implementation.
3 * 1.2.201711092
4 *
5 * By Eli Grey, http://eligrey.com
6 * License: Dedicated to the public domain.
7 * See https://github.com/eligrey/classList.js/blob/master/LICENSE.md
8 */
9
10 /*global self, document, DOMException */
11
12 /*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js */
13
14 if ("document" in self) {
15
16 // Full polyfill for browsers with no classList support
17 // Including IE < Edge missing SVGElement.classList
18 if (
19 !("classList" in document.createElement("_"))
20 || document.createElementNS
21 && !("classList" in document.createElementNS("http://www.w3.org/2000/svg","g "))
22 ) {
23
24 (function (view) {
25
26 "use strict";
27
28 if (!('Element' in view)) return;
29
30 var
31 classListProp = "classList"
32 , protoProp = "prototype"
33 , elemCtrProto = view.Element[protoProp]
34 , objCtr = Object
35 , strTrim = String[protoProp].trim || function () {
36 return this.replace(/^\s+|\s+$/g, "");
37 }
38 , arrIndexOf = Array[protoProp].indexOf || function (item) {
39 var
40 i = 0
41 , len = this.length
42 ;
43 for (; i < len; i++) {
44 if (i in this && this[i] === item) {
45 return i;
46 }
47 }
48 return -1;
49 }
50 // Vendors: please allow content code to instantiate DOMExceptions
51 , DOMEx = function (type, message) {
52 this.name = type;
53 this.code = DOMException[type];
54 this.message = message;
55 }
56 , checkTokenAndGetIndex = function (classList, token) {
57 if (token === "") {
58 throw new DOMEx(
59 "SYNTAX_ERR"
60 , "The token must not be empty."
61 );
62 }
63 if (/\s/.test(token)) {
64 throw new DOMEx(
65 "INVALID_CHARACTER_ERR"
66 , "The token must not contain space characters."
67 );
68 }
69 return arrIndexOf.call(classList, token);
70 }
71 , ClassList = function (elem) {
72 var
73 trimmedClasses = strTrim.call(elem.getAttribute("class") || "")
74 , classes = trimmedClasses ? trimmedClasses.split(/\s+/) : []
75 , i = 0
76 , len = classes.length
77 ;
78 for (; i < len; i++) {
79 this.push(classes[i]);
80 }
81 this._updateClassName = function () {
82 elem.setAttribute("class", this.toString());
83 };
84 }
85 , classListProto = ClassList[protoProp] = []
86 , classListGetter = function () {
87 return new ClassList(this);
88 }
89 ;
90 // Most DOMException implementations don't allow calling DOMException's toStri ng()
91 // on non-DOMExceptions. Error's toString() is sufficient here.
92 DOMEx[protoProp] = Error[protoProp];
93 classListProto.item = function (i) {
94 return this[i] || null;
95 };
96 classListProto.contains = function (token) {
97 return !~checkTokenAndGetIndex(this, token + "");
98 };
99 classListProto.add = function () {
100 var
101 tokens = arguments
102 , i = 0
103 , l = tokens.length
104 , token
105 , updated = false
106 ;
107 do {
108 token = tokens[i] + "";
109 if (~checkTokenAndGetIndex(this, token)) {
110 this.push(token);
111 updated = true;
112 }
113 }
114 while (++i < l);
115
116 if (updated) {
117 this._updateClassName();
118 }
119 };
120 classListProto.remove = function () {
121 var
122 tokens = arguments
123 , i = 0
124 , l = tokens.length
125 , token
126 , updated = false
127 , index
128 ;
129 do {
130 token = tokens[i] + "";
131 index = checkTokenAndGetIndex(this, token);
132 while (~index) {
133 this.splice(index, 1);
134 updated = true;
135 index = checkTokenAndGetIndex(this, token);
136 }
137 }
138 while (++i < l);
139
140 if (updated) {
141 this._updateClassName();
142 }
143 };
144 classListProto.toggle = function (token, force) {
145 var
146 result = this.contains(token)
147 , method = result ?
148 force !== true && "remove"
149 :
150 force !== false && "add"
151 ;
152
153 if (method) {
154 this[method](token);
155 }
156
157 if (force === true || force === false) {
158 return force;
159 } else {
160 return !result;
161 }
162 };
163 classListProto.replace = function (token, replacement_token) {
164 var index = checkTokenAndGetIndex(token + "");
165 if (~index) {
166 this.splice(index, 1, replacement_token);
167 this._updateClassName();
168 }
169 }
170 classListProto.toString = function () {
171 return this.join(" ");
172 };
173
174 if (objCtr.defineProperty) {
175 var classListPropDesc = {
176 get: classListGetter
177 , enumerable: true
178 , configurable: true
179 };
180 try {
181 objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
182 } catch (ex) { // IE 8 doesn't support enumerable:true
183 // adding undefined to fight this issue https://github.com/eligrey/classLi st.js/issues/36
184 // modernie IE8-MSW7 machine has IE8 8.0.6001.18702 and is affected
185 if (ex.number === undefined || ex.number === -0x7FF5EC54) {
186 classListPropDesc.enumerable = false;
187 objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
188 }
189 }
190 } else if (objCtr[protoProp].__defineGetter__) {
191 elemCtrProto.__defineGetter__(classListProp, classListGetter);
192 }
193
194 }(self));
195
196 }
197
198 // There is full or partial native classList support, so just check if we need
199 // to normalize the add/remove and toggle APIs.
200
201 (function () {
202 "use strict";
203
204 var testElement = document.createElement("_");
205
206 testElement.classList.add("c1", "c2");
207
208 // Polyfill for IE 10/11 and Firefox <26, where classList.add and
209 // classList.remove exist but support only one argument at a time.
210 if (!testElement.classList.contains("c2")) {
211 var createMethod = function(method) {
212 var original = DOMTokenList.prototype[method];
213
214 DOMTokenList.prototype[method] = function(token) {
215 var i, len = arguments.length;
216
217 for (i = 0; i < len; i++) {
218 token = arguments[i];
219 original.call(this, token);
220 }
221 };
222 };
223 createMethod('add');
224 createMethod('remove');
225 }
226
227 testElement.classList.toggle("c3", false);
228
229 // Polyfill for IE 10 and Firefox <24, where classList.toggle does not
230 // support the second argument.
231 if (testElement.classList.contains("c3")) {
232 var _toggle = DOMTokenList.prototype.toggle;
233
234 DOMTokenList.prototype.toggle = function(token, force) {
235 if (1 in arguments && !this.contains(token) === !force) {
236 return force;
237 } else {
238 return _toggle.call(this, token);
239 }
240 };
241
242 }
243
244 // replace() polyfill
245 if (!("replace" in document.createElement("_").classList)) {
246 DOMTokenList.prototype.replace = function (token, replacement_token) {
247 var
248 tokens = this.toString().split(" ")
249 , index = tokens.indexOf(token + "")
250 ;
251 if (~index) {
252 tokens = tokens.slice(index);
253 this.remove.apply(this, tokens);
254 this.add(replacement_token);
255 this.add.apply(this, tokens.slice(1));
256 }
257 }
258 }
259
260 testElement = null;
261 }());
262
263 }
OLDNEW

Powered by Google App Engine
This is Rietveld