Commit Graph

6735 Commits

Author SHA1 Message Date
Raymond Hill 5563f7fcc2
New revision for dev build 2019-05-01 06:38:23 -04:00
Raymond Hill 99212e3264
Code review: use function arrow properly 2019-05-01 06:35:47 -04:00
Raymond Hill 016625465e
Simplify a bit 9e43852 by using Array.every() 2019-04-30 16:18:40 -04:00
Raymond Hill 0714aceaaf
Simplify secret generation introduced in 9e4385243c 2019-04-30 15:19:10 -04:00
Raymond Hill e23cb71b1a
Make Firefox dev build auto-update 2019-04-30 14:56:26 -04:00
Raymond Hill 854b10eeae
New revision for dev build 2019-04-30 14:50:57 -04:00
Raymond Hill 9e4385243c
Web accessible secrets can be used for at most one second
Related issue:
- https://github.com/uBlockOrigin/uBlock-issues/issues/550

Related Chromium issue (I can't access it):
- https://bugs.chromium.org/p/chromium/issues/detail?id=957866

Findings so far: affects browsers based on Chromium 74.
I could not reproduce the issue with either Chromium 73 or
Google Chrome 75.

This commit is a mitigation: to prevent sites from using
uBO's internal WAR secret for tracking purpose. A secret
can be used for at most one second, after which a new secret
is generated.

The original issue related to the implementation of
secret-gated web accessible resources is:
- https://github.com/gorhill/uBlock/issues/2823
2019-04-30 14:36:07 -04:00
Raymond Hill 2cc60fb6e8
Make Firefox dev build auto-update 2019-04-30 10:15:19 -04:00
Raymond Hill 35aea15785
New revision for dev build 2019-04-30 10:10:00 -04:00
Raymond Hill 0991a1138e
Add Energized Blu Go as stock multipurpose list
Link to project page:
https://github.com/AdroitAdorKhan/EnergizedProtection
2019-04-30 09:35:10 -04:00
Raymond Hill 73e2f25e95
Add new cosmetic procedural operator: `:nth-ancestor(n)`
The purpose of this new `:nth-ancestor(n)` operator is to
lookup the nth ancestor relative to the currently selected
node.

It is essentially equivalent to `:xpath(..)`, where
ancestor distance is expressed as a number rather than a
sequence of slash-separated `..`.

The rationale to introduce this new procedural selector
is to have a low overhead way to accomplish ancestor
selection.
2019-04-30 09:02:14 -04:00
Raymond Hill 42bf659695
Revert "Order HNTrie nodes alphabetically to allow for early bailout"
This reverts commit f5f9e05071.
2019-04-30 07:00:52 -04:00
Raymond Hill f5f9e05071
Order HNTrie nodes alphabetically to allow for early bailout
This commit implements the alphabetical ordering of HNTrie
nodes, so as to make it possible to bail out early at
HNTrie.matches() time.

Contrary to what I expected, there is no performance gain
observed to HNTrie.matches() as per benchmarks -- I find
the results perplexing.

Because of this I will revert this commit immediately.
The purpose of this commit is to record the changes so
that I can bring them back to life in the future whenever
I want to investigate further.
2019-04-30 06:47:54 -04:00
Raymond Hill a73024ad7b
Make Firefox dev build auto-update 2019-04-29 18:14:01 -04:00
Raymond Hill 391bf9e44e
New revision for dev build 2019-04-29 18:10:22 -04:00
Raymond Hill adabb56dc9
Do not store impossible to match filters in HNTrie
Consider the two following filters:

    example.com
    www.example.com

This commit make it so that if the first filter is
already present in a given HNTrie, the second filter
will not be stored, since HNTrie will _always_
return the first filter as a match whenever the
hostname to match is example.com or any subdomain
of example.com.

The detection of such pointless filters is
virtually free when adding a hostname to an HNTrie
instance (given how data is stored in the trie), so
in practice no overhead is incurred to detect such
pointless filters.

The ability to ignore impossible to match filters
in HNTrie instances will _especially_ benefit those
using large hosts files.

Examples of how this helps using real configurations:

- Default lists:
  444 filters out of 100,382 were ignored as a result
  of this commit.

- Default lists + "Energized Ultimate Protection":
  283,669 filters out of 903,235 were ignored as a
  result of this commit.

Side note: There was no measurable difference between
the two configurations above in the performance of
the matching algorithm as reported by the built-in
benchmark tool.
2019-04-29 13:15:16 -04:00
Raymond Hill c4f9ae706a
Fix alternate code path introduced in 295f08da97 (oops) 2019-04-28 14:18:09 -04:00
Raymond Hill 295f08da97
Implement code path for when TextDecoder() is not available
The primary purpose is to unbreak
https://github.com/cliqz-oss/adblocker/tree/master/bench/comparison
2019-04-28 14:07:21 -04:00
Raymond Hill a207daee89
Make Firefox dev build auto-update 2019-04-28 11:22:48 -04:00
Raymond Hill 135049ef0b
New revision for dev build 2019-04-28 10:32:55 -04:00
Raymond Hill ac58b8e688
Make token hashes fit within a 32-bit integer
The staticNetFilteringEngine uses token hashes to store/lookup
filters into Map objects.

Before this commit, the tokens were encoded into token hashes
as JS numbers (not exceeding MAX_SAFE_INTEGER) using at most
the 8 first characters of the token.

With this commit, token hashes are now restricted to fit
into 32-bit integers, and are derived from at most the 7 first
characters. This improves filter look-up performance as per
built-in benchmark().
2019-04-28 10:15:15 -04:00
Raymond Hill 510cda0bc5
Support in logger's filter expression picker 2019-04-28 07:23:14 -04:00
Raymond Hill 93efba2014
Fix https://github.com/NanoMeow/QuickReports/issues/1091 2019-04-27 15:50:19 -04:00
Raymond Hill 9c154ac11c
Make Firefox dev build auto-update 2019-04-27 13:28:25 -04:00
Raymond Hill 367cdd6666
Make use of `X-DNS-Prefetch-Control` in Chromium-based browsers
Related issue:
- https://github.com/uBlockOrigin/uBlock-issues/issues/548

The fix applies only to Chromium-based browsers -- a
`X-DNS-Prefetch-Control` header[1] will be unconditionally
injected when uBO's "Disable pre-fetching" setting is
enabled (it is by default).

This is a mitigation, this does not completely fix the issue
of the setting "Disable pre-fetching" being disregarded on
Chromium-based browsers when sites use
`preconnect`/`preload`.

[1] https://developer.mozilla.org/docs/Web/HTTP/Headers/X-DNS-Prefetch-Control
2019-04-27 13:12:33 -04:00
Raymond Hill acb12d2a1d
New revision for dev build 2019-04-27 08:37:37 -04:00
Raymond Hill 96dce22218
Increase resolution of known-token lookup table
Related commit:
- 69a43e07c4

Using 32 bits of token hash rather than just the 16 lower
bits does help discard more unknown tokens.

Using the default filter lists, the known-token lookup
table is populated by 12,276 entries, out of 65,536, thus
making the case that theoretically there is a lot of
possible tokens which can be discarded.

In practice, running the built-in
staticNetFilteringEngine.benchmark() with default filter
lists, I find that 1,518,929 tokens were skipped out of
4,441,891 extracted tokens, or 34%.
2019-04-27 08:18:01 -04:00
Raymond Hill 60938451ab
Make Firefox dev build auto-update 2019-04-27 07:23:11 -04:00
Raymond Hill 8715dadd02
Nre revision for dev build 2019-04-27 07:17:07 -04:00
Raymond Hill a8946c8d73
Fix list lookup of multi-hostname `domain=` filters in logger
Related commit:
- 3f3a1543ea

The regression was preventing uBO to find from which list a filter
originated. This affected only filters for which the `domain=`
option had multiple hostnames.
2019-04-27 07:04:43 -04:00
Raymond Hill 761a0ef27c
Make Firefox dev build auto-update 2019-04-26 17:33:59 -04:00
Raymond Hill 4c9e760a10
Import translation work from https://crowdin.com/project/ublock 2019-04-26 17:30:19 -04:00
Raymond Hill 671908a45f
New revision for dev build 2019-04-26 17:27:41 -04:00
Raymond Hill 69a43e07c4
Ignore unknown tokens in urlTokenizer.getTokens()
Given that all tokens extracted from one single URL are potentially
iterated multiple times in a single URL-matching cycle, it pays to
ignore extracted tokens which are known to not be used anywhere in
the static filtering engine.

The gain in processing a single network request in the static
filtering engine can become especially high when dealing with
long and random-looking URLs, which URLs have a high likelihood
of containing a majority of tokens which are known to not be in
use.
2019-04-26 17:14:00 -04:00
Raymond Hill 19ece97b0c
Leverage compile-time token information in new fitler classes
Related commit:
- 99390390fc

The token information available at compile time can be stored
in the filter to be used at match() time. This allows the use of
startsWith() rather than a more costly indexOf() call as a first
quick test to detect mismatches.
2019-04-26 11:16:47 -04:00
Raymond Hill 1f8f616faf
Make Firefox dev build auto-update 2019-04-25 19:44:33 -04:00
Raymond Hill 74c24dbf37
New revision for dev build 2019-04-25 19:40:48 -04:00
Raymond Hill f667fc2d65
Fix page count computation in publicSuffixList.enableWASM() 2019-04-25 19:40:07 -04:00
Raymond Hill e0d2285da0
Convert HNTrie code to ES6 `class` 2019-04-25 19:38:07 -04:00
Raymond Hill 155abfba18
Cache and reuse result of HNTrieRef.matches() when possible
Due to how web pages typically load secondary resources and due
to how HNTrieContainer instances are used in uBO, there is a
great likelihood that the result of a previous call to
HNTrieRef.matches() can be reused in a subsequent call.
This has been confirmed by instrumenting HNTrieRef.matches().

Since uBO uses distinct HNTrieContainer instances to either
match against the request or the origin hostnames, this
means a high likelihood of repeated calls to HNTrieRef.matches()
with the same hostname as argument, hence a performance gain
when caching the argument+result -- as despite that
HNTrie.matches() is fast, comparing two short strings is even
faster if this allows to skip HNTrie.matches() altogether.
2019-04-25 18:36:03 -04:00
Raymond Hill 99390390fc
Introduce three more specialized filter classes to avoid regexes
Performance- and memory-related work. Three more classes have
been created to avoid regex-based filters internally.

Purpose is to enforce filters which have only one single
wildcard in their pattern, a common occurrence. The filter
pattern is split in two literal string segments.

Similar as above, with the added condition that the filter is
hostname-anchored (`||`). The "Wildcard2" variant is a further
specialization to enforce filters where the only wildcard
is immediately preceded by the `^` special character, again
a very common occurrence.

Using two literal string segments in lieu of regexes allows to
quickly detect a mismatch by just testing the first segment.
Additionally, this reduces memory footprint as regexes are
much more expensive memory-wise than plain strings.

These three new filter classes allow to replace the use of
5276 regex-based filters internally with plain string-based
filters.

Often-called isHnAnchored() has been further fine-tuned to
avoid as much work as possible. I have also observed that
using an arrow function for closure-purpose helps measurably
performance, as per built-in benchmark.
2019-04-25 17:48:08 -04:00
Raymond Hill dfd6076a5e
Make Firefox dev build auto-update 2019-04-24 08:37:58 -04:00
Raymond Hill b59f7d44ee
New revision for dev build 2019-04-24 08:32:33 -04:00
Raymond Hill fff2bb6290
Assume media elements with no Content-Length header to be of size 0
Related issue:
- https://github.com/uBlockOrigin/uBlock-issues/issues/543
2019-04-24 08:30:54 -04:00
Raymond Hill 72bbcdd93c
Prevent search expression in CodeMirror editor from crossing line boundaries
Related issue:
- https://github.com/uBlockOrigin/uBlock-issues/issues/493
2019-04-23 19:26:02 -04:00
Raymond Hill cd1a11fa9d
Update to CodeMirror version 5.46 2019-04-23 19:06:03 -04:00
Raymond Hill 3efb0daa66
Make Firefox dev build auto-update 2019-04-23 09:46:46 -04:00
Raymond Hill c535c624bd
Import translation work from https://crowdin.com/project/ublock 2019-04-23 09:32:15 -04:00
Raymond Hill dd7125378b
New revision for dev build 2019-04-23 09:29:49 -04:00
Raymond Hill 3c5102811a
Fix the logger's rendering of hostnames starting with digits
Related issue:
- https://github.com/uBlockOrigin/uBlock-issues/issues/541
2019-04-23 09:28:00 -04:00