Opened on 06/23/2016 at 04:07:06 PM

Closed on 08/11/2016 at 01:24:27 PM

Last modified on 08/22/2016 at 01:50:26 PM

#4191 closed defect (fixed) shadowRoot stylesheet circumvention

Reported by: Lain_13 Assignee: kzar
Priority: P2 Milestone: Adblock-Plus-1.12.2-for-Chrome-Opera-Safari
Module: Platform Keywords:
Cc: sebastian, kzar, greiner, mapx, Ross, scheer Blocked By:
Blocking: Platform: Chrome
Ready: yes Confidential: no
Tester: Scheer Verified working: yes
Review URL(s):

Description (last modified by kzar)


Google Chrome 51.0.2704.103 with Adblock Plus for Chrome 1.12.1.

How to reproduce

  1. Disable all filter subscriptions and filters. Add the subscription "RuAdList+EasyList" and the filter
  2. Sign up for a account:
  3. Navigate to your inbox:

Observed behaviour

The menu on the left is hidden, but after a few seconds it becomes visible again.

Expected behaviour

The menu on the left should stay hidden.


  • Running document.body.parentNode.shadowRoot.styleSheets[0].rules.length returns ~139 before the menu reappears but 0 afterwards.

Hints for testers

  • Ensure element hiding still works.
  • Follow the "How to reproduce" steps and ensure the problem no longer happens.
  • Make sure YouTube advert blocking for older versions of Safari still works. (That a regression like #4141 didn't happen again.)
  • Make sure WebSocket blocking still works #1727.

Attachments (0)

Change History (35)

comment:1 Changed on 06/23/2016 at 05:47:19 PM by mapx

  • Cc sebastian kzar greiner mapx added

comment:2 Changed on 06/23/2016 at 05:47:52 PM by mapx

example pages ?

comment:3 Changed on 06/23/2016 at 05:52:42 PM by Lain_13

Oh, accidentally pasted wrong text instead of URL and haven't noticed that.
For example, here:
Look for objects with class "rb-slot".

Last edited on 06/23/2016 at 05:54:15 PM by Lain_13

comment:4 Changed on 06/23/2016 at 06:09:48 PM by mapx

I guess it's about the old issue (or ABP approach with hiding filters) with !important styles

comment:5 Changed on 06/23/2016 at 06:12:58 PM by mapx

"it's not important" userscript does not work either on this kind of !important stuff

comment:6 Changed on 06/23/2016 at 06:43:58 PM by mapx

  • Component changed from Unknown to Platform
  • Platform changed from Unknown / Cross platform to Chrome

comment:7 Changed on 06/23/2016 at 06:47:18 PM by Lain_13

There are no style attribute in the first place. At least on the '.rb-slot' blocks. Also, I can see in the page inspector how at the moment when scripts loads whole block of ABPs styles disappears from the list of applied styles and "STYLE" element in the shadow root blinks like something changed in it.

Last edited on 06/23/2016 at 06:47:49 PM by Lain_13

comment:8 Changed on 06/29/2016 at 02:10:10 PM by Lain_13

Looks like since recently they also dynamically add STYLE trick to everything that got hidden. Not sure if they still attempting to change stylesheets since "It's not important" now enough to counter this issue. However, when I tried to change blocks position with Stylish styles were removed. So, it doesn't seems like they gave up on the idea. Just replaced it with a more reliable solution. BTW, instead of disabling they are removing styles from the style.sheet list.

comment:9 Changed on 06/30/2016 at 08:34:34 AM by Lain_13

Today I encountered this behavior in an unexpected place and this time it was done without using a script loaded through websocket.
One user requested to hide tooltips and I suggested to use
The filter worked for me... but only for a ~5 seconds if you refresh a page. Then all ABP styles attached to the element disappears.
It's the same if you try to hide anything on that page. For example, that menu on the left: - the menu will disappear, but it will reappear in ~5 seconds and all ABP styles will be deleted.

Try to paste this into console: document.body.parentNode.shadowRoot.styleSheets[0].rules.length as start it shows number of rules created by ABP, but later on it changes to zero.

Last edited on 07/18/2016 at 10:24:48 AM by Lain_13

comment:10 Changed on 07/25/2016 at 11:21:04 AM by kzar

Attempting to reproduce this in order to triage the issue but so far haven't managed.

I disabled all filters + subscriptions and then added the following filters:

I then browsed to and the article's title and the page menu was hidden like I expected. I waited for longer than 5 seconds and the hidden elements did not reappear. I refreshed the page a few more times and still did not witness the elements reappearing.

Could you guys help provide me with some concrete steps I can follow to reproduce the problem? (Preferably without requiring a account.)

comment:11 Changed on 07/25/2016 at 12:04:17 PM by Lain_13

As I told they returned to WebSocket trick there.
Also, as I told I've encountered this script in a different place: (you need to have an account there)
Try to use filter:
The page will load without a menu on the left, but it will became visible again in a few seconds.
Not sure why they removed it from all of their pages, but emails, but the code is still there and works.

Also, as I told above, to see that styles were removed you have to perform this code:
Right after page load and then after menu being restored. In second case it will return 0.
Actually, in my case I don't even need to add custom filters. They remove all the filters added by ABP anyway.

Last edited on 07/25/2016 at 12:06:10 PM by Lain_13

comment:12 Changed on 07/25/2016 at 12:13:26 PM by Lain_13

Try to use this one: abp_test_email / ABP!123

Last edited on 07/25/2016 at 12:14:33 PM by Lain_13

comment:13 Changed on 07/25/2016 at 12:29:01 PM by kzar

  • Description modified (diff)
  • Summary changed from, large news, games and all the other stuff portal in Runet, manipulates ABP's stylesheet to manipulates ABP's stylesheet

Thanks, I've updated the issue description to include those steps.

Unfortunately I still can't reproduce the problem however, when using both our latest code and Adblock Plus for Chrome 1.12.1 the menu stays hidden. (I'm running on Chrome Version 51.0.2704.106 (64-bit) which is pretty close to what you're using.)

comment:14 Changed on 07/25/2016 at 02:56:20 PM by Lain_13

I've decided to make a video:

Last edited on 07/25/2016 at 03:05:51 PM by Lain_13

comment:15 Changed on 07/25/2016 at 03:09:33 PM by mapx

in the video I can see easylist, ruadlist enabled.

comment:16 Changed on 07/25/2016 at 03:32:19 PM by Lain_13

Oh! Have you tried to reproduce it only with that example filter? Sorry, I had to mention that I've used extra lists. I just used that filter as some visible example. That "feature" isn't necessary triggered by that filter... Most likely they check all stylesheets for some known filters. As I told above I can see how number of ABP rules drops to zero even without that example filter.

comment:17 Changed on 07/25/2016 at 06:45:42 PM by kzar

  • Description modified (diff)
  • Priority changed from Unknown to P2
  • Ready set
  • Summary changed from manipulates ABP's stylesheet to shadowRoot stylesheet circumvention

OK finally managed to reproduce this, thanks for your patience. (Interestingly this does not seem to be a problem for Safari, couldn't reproduce on Safari 9.1.2.)

comment:18 Changed on 07/29/2016 at 12:59:06 PM by kzar

The website is removing our style element, but only when we've used the Shadow DOM. That explains why I couldn't reproduce the problem on Safari 9.1.2.

We actually already handle this situation and put the style element back again. The weird part is that when this happens the style element's sheet is replaced with a different empty one:

var shadowRoot = document.body.parentNode.shadowRoot;
var style = shadowRoot.childNodes[1];
var sheet = style.sheet;


  console.log(sheet == style.sheet, sheet.rules.length, style.sheet.rules.length);
}, 0);

=> false 87 0

I've just tested as far back as Chrome 30 and this always seems to happen, so I'm not sure how the stylesheet reinjection logic was ever effective. I guess I'm still missing something... will continue to investigate.

comment:19 Changed on 07/29/2016 at 09:38:51 PM by kzar

  • Review URL(s) modified (diff)
  • Status changed from new to reviewing

Well I have a fix working, I simply put all the rules back again if they're gone after the stylesheet is reinjected! (Perhaps there's a smarter way to go, so looking forward to hear what Sebastian thinks.)

Either way this was a good catch, thanks for the filing the issue!

comment:20 Changed on 07/30/2016 at 01:43:45 AM by Lain_13

Is there no way to prevent removal of filters in the first place?

comment:21 Changed on 07/30/2016 at 01:44:10 AM by Lain_13

[removed: accidental doublepost]

Last edited on 07/30/2016 at 01:45:02 AM by Lain_13

comment:22 Changed on 08/05/2016 at 11:24:00 AM by kzar

  • Owner set to kzar

comment:23 Changed on 08/10/2016 at 06:34:53 PM by Lain_13

If I understand right this commit:
had to fix this issue as well. At least code supposed to prevent meddling with ABP stylesheets were updated there. However, I've tested this with "Adblock Plus development build" and the issue is still there.

comment:24 Changed on 08/10/2016 at 06:38:05 PM by mapx

I don't see the changes here:

in the commit above.

comment:25 Changed on 08/11/2016 at 01:19:50 PM by abpbot

A commit referencing this issue has landed:
Issue 4191 - Protect our shadowRoot

comment:26 Changed on 08/11/2016 at 01:24:27 PM by kzar

  • Cc Ross scheer added
  • Description modified (diff)
  • Milestone set to Adblock-Plus-for-Chrome-Opera-Safari-next
  • Resolution set to fixed
  • Status changed from reviewing to closed

comment:27 Changed on 08/11/2016 at 01:31:25 PM by Lain_13

Tested on 1632. Works for me, thanks.

comment:28 Changed on 08/11/2016 at 01:44:12 PM by kzar

Ace good to hear, thanks for letting us know :)

comment:29 Changed on 08/11/2016 at 03:33:42 PM by kzar

  • Review URL(s) modified (diff)

comment:30 Changed on 08/11/2016 at 03:35:46 PM by abpbot

A commit referencing this issue has landed:
Issue 4191 - Check shadowRoot getter exists before wrapping

comment:31 Changed on 08/12/2016 at 12:19:30 PM by mapx


conifgurable: true, enumerable: true, get: function()

comment:32 Changed on 08/12/2016 at 12:28:36 PM by kzar

Dang, thanks well spotted. Will open a review and fix that shortly.

comment:33 Changed on 08/12/2016 at 12:32:55 PM by kzar

  • Review URL(s) modified (diff)

comment:34 Changed on 08/12/2016 at 01:38:22 PM by abpbot

A commit referencing this issue has landed:
Issue 4191 - Fix typo in shadowRoot descriptor

comment:35 Changed on 08/22/2016 at 01:50:26 PM by scheer

  • Tester changed from Unknown to Scheer
  • Verified working set
  • Ads do not load on or as per the previous regression with #4141
  • The filter now correctly blocks the left sidebar permanently in
  • Element hiding works correctly on and
  • Websocket blocking still functions on Sites with WebSockets load correctly, such as and

Chrome 30
Chrome 51
Opera 38
Safari 9
Safari 6

Add Comment

Modify Ticket

Change Properties
as closed .
The resolution will be deleted. Next status will be 'reopened'.
to The owner will be changed from kzar.
Note: See TracTickets for help on using tickets.