Left: | ||
Right: |
LEFT | RIGHT |
---|---|
1 /* | 1 /* |
2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
3 * Copyright (C) 2006-present eyeo GmbH | 3 * Copyright (C) 2006-present eyeo GmbH |
4 * | 4 * |
5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
8 * | 8 * |
9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
268 filtersByDomain.delete(domain); | 268 filtersByDomain.delete(domain); |
269 } | 269 } |
270 } | 270 } |
271 } | 271 } |
272 | 272 |
273 knownFilters.delete(filter); | 273 knownFilters.delete(filter); |
274 filterNotifier.emit("elemhideupdate"); | 274 filterNotifier.emit("elemhideupdate"); |
275 }, | 275 }, |
276 | 276 |
277 /** | 277 /** |
278 * Determines from the current filter list which selectors should be applied | |
279 * on a particular host name. | |
280 * @param {string} domain | |
281 * @param {boolean} [specificOnly] true if generic filters should not apply. | |
282 * @returns {string[]} List of selectors. | |
283 */ | |
284 getSelectorsForDomain(domain, specificOnly = false) | |
285 { | |
286 let selectors = getConditionalSelectorsForDomain(domain, specificOnly); | |
287 | |
288 if (!specificOnly) | |
289 selectors = getUnconditionalSelectors().concat(selectors); | |
290 | |
291 return selectors; | |
292 }, | |
293 | |
294 /** | |
295 * @typedef {object} ElemHideStyleSheet | 278 * @typedef {object} ElemHideStyleSheet |
296 * @property {string} code CSS code. | 279 * @property {string} code CSS code. |
297 * @property {Array.<string>} selectors List of selectors. | 280 * @property {Array.<string>} selectors List of selectors. |
298 */ | 281 */ |
299 | 282 |
300 /** | 283 /** |
301 * Generates a style sheet for a given domain based on the current set of | 284 * Generates a style sheet for a given domain based on the current set of |
302 * filters. | 285 * filters. |
303 * | 286 * |
304 * @param {string} domain The domain. | 287 * @param {string} domain The domain. |
305 * @param {boolean} [specificOnly=false] Whether selectors from generic | 288 * @param {boolean} [specificOnly=false] Whether selectors from generic |
306 * filters should be included. | 289 * filters should be included. |
307 * | 290 * |
308 * @returns {ElemHideStyleSheet} An object containing the CSS code and the | 291 * @returns {ElemHideStyleSheet} An object containing the CSS code and the |
309 * list of selectors. | 292 * list of selectors. |
310 */ | 293 */ |
311 generateStyleSheetForDomain(domain, specificOnly = false) | 294 generateStyleSheetForDomain(domain, specificOnly = false) |
Manish Jethani
2018/09/20 12:27:24
The idea is that calling this function will be fas
Jon Sonesen
2018/09/23 18:01:59
Acknowledged.
| |
312 { | 295 { |
313 let selectors = getConditionalSelectorsForDomain(domain, specificOnly); | 296 let selectors = getConditionalSelectorsForDomain(domain, specificOnly); |
314 let code = (specificOnly ? "" : getDefaultStyleSheet()) + | 297 let code = specificOnly ? createStyleSheet(selectors) : |
315 createStyleSheet(selectors); | 298 (getDefaultStyleSheet() + createStyleSheet(selectors)); |
Jon Sonesen
2018/09/23 18:01:59
Regarding the use of this ternary operation, I won
Manish Jethani
2018/09/24 11:51:14
This function is supposed to be very performance c
Jon Sonesen
2018/09/24 15:09:44
Ah yeah, that's a good point here. My bad, haha I
Manish Jethani
2018/09/27 15:58:29
So I tested this by the way, it seems the Patch Se
Manish Jethani
2018/09/27 15:58:29
Acknowledged.
| |
316 | 299 |
317 if (!specificOnly) | 300 if (!specificOnly) |
318 selectors = getUnconditionalSelectors().concat(selectors); | 301 selectors = getUnconditionalSelectors().concat(selectors); |
319 | 302 |
320 return {code, selectors}; | 303 return {code, selectors}; |
321 } | 304 } |
322 }; | 305 }; |
323 | 306 |
324 /** | 307 /** |
325 * Splits a list of selectors into groups determined by the value of | 308 * Splits a list of selectors into groups determined by the value of |
(...skipping 13 matching lines...) Expand all Loading... | |
339 // calculate the sizes of the selectors and divide them up accordingly, but | 322 // calculate the sizes of the selectors and divide them up accordingly, but |
340 // this approach is more efficient and has worked well in practice. In theory | 323 // this approach is more efficient and has worked well in practice. In theory |
341 // this could still lead to some selectors not working on Chromium, but it is | 324 // this could still lead to some selectors not working on Chromium, but it is |
342 // highly unlikely. | 325 // highly unlikely. |
343 // See issue #6298 and https://crbug.com/804179 | 326 // See issue #6298 and https://crbug.com/804179 |
344 for (let i = 0; i < selectors.length; i += selectorGroupSize) | 327 for (let i = 0; i < selectors.length; i += selectorGroupSize) |
345 yield selectors.slice(i, i + selectorGroupSize); | 328 yield selectors.slice(i, i + selectorGroupSize); |
346 } | 329 } |
347 | 330 |
348 /** | 331 /** |
349 * Creates element hiding CSS rules for a given list of selectors. Each rule | 332 * Creates an element hiding CSS rule for a given list of selectors. |
350 * contains no more than the maximum number of selectors as determined by the | |
351 * value of <code>{@link selectorGroupSize}</code>. | |
352 * | 333 * |
353 * @param {Array.<string>} selectors | 334 * @param {Array.<string>} selectors |
354 * @yields {string} | 335 * @returns {string} |
355 */ | 336 */ |
356 function* createRules(selectors) | 337 function createRule(selectors) |
357 { | 338 { |
358 for (let selectorGroup of splitSelectors(selectors)) | 339 let rule = ""; |
359 yield selectorGroup.join(", ") + " {display: none !important;}"; | 340 |
341 for (let i = 0; i < selectors.length - 1; i++) | |
342 rule += selectors[i] + ", "; | |
343 | |
344 rule += selectors[selectors.length - 1] + " {display: none !important;}\n"; | |
345 | |
346 return rule; | |
360 } | 347 } |
361 | 348 |
362 /** | 349 /** |
363 * Creates an element hiding CSS style sheet from a given list of selectors. | 350 * Creates an element hiding CSS style sheet from a given list of selectors. |
364 * @param {Array.<string>} selectors | 351 * @param {Array.<string>} selectors |
365 * @returns {string} | 352 * @returns {string} |
366 */ | 353 */ |
367 function createStyleSheet(selectors) | 354 function createStyleSheet(selectors) |
368 { | 355 { |
369 let styleSheet = ""; | 356 let styleSheet = ""; |
370 | 357 |
371 for (let rule of createRules(selectors)) | 358 for (let selectorGroup of splitSelectors(selectors)) |
372 styleSheet += rule + "\n"; | 359 styleSheet += createRule(selectorGroup); |
373 | 360 |
374 return styleSheet; | 361 return styleSheet; |
375 } | 362 } |
376 | 363 |
377 exports.createStyleSheet = createStyleSheet; | 364 exports.createStyleSheet = createStyleSheet; |
LEFT | RIGHT |