AdguardTeam / ExtendedCss

A TypeScript library for non-standard element selecting — :contains(), :matches-css(), etc., and applying CSS styles with extended properties.
GNU General Public License v3.0
65 stars 9 forks source link

Pseudo-class combined with ':not()' does not work correctly #166

Open AdamWr opened 1 year ago

AdamWr commented 1 year ago

It looks like a regression and it started occurring in AdGuard Browser extension version 4.1.55, but works correctly in version 4.1.53. The same issue occurs in latest nightly build for Windows 7.13 nightly 8 (build 4242, CL 1.11.79).

Steps to reproduce:

  1. Add this rule:
    example.org#?#div:matches-css(margin: /./) > :not(p)

    or

    example.org#?#div:has(a) > :not(p)
  2. Go to - https://example.org/

Rule hides div but it should hide only h1 element.

Screenshots ![image](https://user-images.githubusercontent.com/29142494/230402041-1299cf8f-2711-4f89-95b6-3efd6826ded0.png) ![image](https://user-images.githubusercontent.com/29142494/230402309-44e9dabd-c55d-4119-b749-cc91f35b502a.png)

Related issues: https://github.com/AdguardTeam/AdguardFilters/issues/147558 https://github.com/AdguardTeam/AdguardFilters/issues/147319#issuecomment-1499966394


With extension version 4.1.53

Screenshots ![image](https://user-images.githubusercontent.com/29142494/230402605-3cde2a48-4d0d-4d4e-90e4-09fd57e1d5f9.png)
peace2000 commented 1 year ago

Another case:

This rule in Easylist Cookie list:

bloomberg.com##body:not(:has(div[class*="player" i][class*="_container"], #root .datastrip)) > div[id^="sp_message_container"]

Broke Bloomberg completely: https://www.bloomberg.com/news/articles/2023-04-27/electronic-arts-star-wars-jedi-survivor-was-made-in-record-time?leadSource=uverify+wall

The rule should target div[id^="sp_message_container"], not the body element.

peace2000 commented 1 year ago

Also simpler forms of the rule cause the breakage:

bloomberg.com##body:not(:has(div[class*="player" i][class*="_container"])) > div[id^="sp_message_container"]

bloomberg.com##body:not(:has(#root .datastrip)) > div[id^="sp_message_container"]