From fa02cab6643da3987fb28c88a060ac077d2009c4 Mon Sep 17 00:00:00 2001 From: lenacohen Date: Tue, 25 Feb 2025 16:25:58 -0500 Subject: [PATCH 01/10] Move widget placeholder iframe inside shadow dom --- src/js/contentscripts/socialwidgets.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/js/contentscripts/socialwidgets.js b/src/js/contentscripts/socialwidgets.js index 426b5d7d03..97c372fc2d 100644 --- a/src/js/contentscripts/socialwidgets.js +++ b/src/js/contentscripts/socialwidgets.js @@ -408,6 +408,9 @@ function createReplacementWidget(widget, elToReplace) { let name = widget.name; let widgetFrame = document.createElement('iframe'); + let shadowHost = document.createElement("div"); + let shadowRoot = shadowHost.attachShadow({ mode: "closed" }); + shadowRoot.appendChild(widgetFrame); // widget replacement frame styles let border_width = 1; @@ -648,7 +651,7 @@ function createReplacementWidget(widget, elToReplace) { } let data = { parentNode: elToReplace.parentNode, - replacement: widgetFrame, + replacement: shadowHost, origWidgetElem: elToReplace }; if (widget.scriptSelectors) { @@ -690,9 +693,9 @@ function createReplacementWidget(widget, elToReplace) { return; } e.preventDefault(); - WIDGET_ELS[name] = WIDGET_ELS[name].filter(d => d.replacement != widgetFrame); + WIDGET_ELS[name] = WIDGET_ELS[name].filter(d => d.replacement != shadowHost); doNotReplace.add(elToReplace); - widgetFrame.replaceWith(elToReplace); + shadowHost.replaceWith(elToReplace); }, { once: true }); }, false); // end of click handler @@ -796,7 +799,7 @@ a:hover { widgetFrame.srcdoc = '' + widgetDiv.outerHTML + ''; - return widgetFrame; + return shadowHost; } /** From dd9cb1ce8e112df3cad535a609a2587ec22b4705 Mon Sep 17 00:00:00 2001 From: lenacohen Date: Tue, 25 Feb 2025 16:48:41 -0500 Subject: [PATCH 02/10] Fix widget placeholder overlapping with content on some sites --- src/js/contentscripts/socialwidgets.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/js/contentscripts/socialwidgets.js b/src/js/contentscripts/socialwidgets.js index 97c372fc2d..94f3357b84 100644 --- a/src/js/contentscripts/socialwidgets.js +++ b/src/js/contentscripts/socialwidgets.js @@ -414,11 +414,12 @@ function createReplacementWidget(widget, elToReplace) { // widget replacement frame styles let border_width = 1; + let min_height = 210; let styleAttrs = [ "background-color: #fff", "border: " + border_width + "px solid #ec9329", "min-width: 220px", - "min-height: 210px", + `min-height: ${min_height}px`, "max-height: 600px", "pointer-events: all", "z-index: 999", @@ -457,6 +458,10 @@ function createReplacementWidget(widget, elToReplace) { } } } + if (parseFloat(window.getComputedStyle(elToReplace.parentNode).height) < min_height) { + elToReplace.parentNode.style.minHeight = `${min_height}px`; + } + widgetFrame.style = styleAttrs.join(" !important;") + " !important"; let widgetDiv = document.createElement('div'); From 8ff6eb68c38265939ebacc7adf6f15726e913f30 Mon Sep 17 00:00:00 2001 From: lenacohen Date: Wed, 26 Feb 2025 17:43:30 -0500 Subject: [PATCH 03/10] Remove code that's unecessary within a shadow DOM --- src/js/contentscripts/socialwidgets.js | 69 ++++++++++++-------------- 1 file changed, 32 insertions(+), 37 deletions(-) diff --git a/src/js/contentscripts/socialwidgets.js b/src/js/contentscripts/socialwidgets.js index 94f3357b84..bd2cc5248f 100644 --- a/src/js/contentscripts/socialwidgets.js +++ b/src/js/contentscripts/socialwidgets.js @@ -396,10 +396,6 @@ function replaceSubsequentTrackerButtonsHelper(tracker_domain) { }); } -function _make_id(prefix) { - return prefix + "-" + Math.random().toString().replace(".", ""); -} - function createReplacementWidget(widget, elToReplace) { if (!elToReplace.parentNode) { return null; @@ -424,7 +420,6 @@ function createReplacementWidget(widget, elToReplace) { "pointer-events: all", "z-index: 999", ]; - // TODO shouldn't need this (nor !important, nor _make_id, nor ...) if we use shadow DOM let elToReplaceStyles = window.getComputedStyle(elToReplace); if (elToReplaceStyles.position == "absolute") { styleAttrs.push("position: absolute"); @@ -462,7 +457,7 @@ function createReplacementWidget(widget, elToReplace) { elToReplace.parentNode.style.minHeight = `${min_height}px`; } - widgetFrame.style = styleAttrs.join(" !important;") + " !important"; + widgetFrame.style = styleAttrs.join(";"); let widgetDiv = document.createElement('div'); @@ -478,7 +473,7 @@ function createReplacementWidget(widget, elToReplace) { if (TRANSLATIONS.rtl) { styleAttrs.push("direction: rtl"); } - widgetDiv.style = styleAttrs.join(" !important;") + " !important"; + widgetDiv.style = styleAttrs.join(";"); // child div styles styleAttrs = [ @@ -492,7 +487,7 @@ function createReplacementWidget(widget, elToReplace) { ]; let textDiv = document.createElement('div'); - textDiv.style = styleAttrs.join(" !important;") + " !important"; + textDiv.style = styleAttrs.join(";"); let summary = TRANSLATIONS.widget_placeholder_pb_has_replaced.replace("XXX", name), link_start = "YYY", @@ -595,13 +590,13 @@ function createReplacementWidget(widget, elToReplace) { } let closeIcon = document.createElement('a'), - close_icon_id = _make_id("ico-close"); + close_icon_id = "ico-close"; closeIcon.id = close_icon_id; closeIcon.href = "javascript:void(0)"; // eslint-disable-line no-script-url textDiv.appendChild(closeIcon); let infoIcon = document.createElement('a'), - info_icon_id = _make_id("ico-help"); + info_icon_id = "ico-help"; infoIcon.id = info_icon_id; infoIcon.href = "https://privacybadger.org/#How-does-Privacy-Badger-handle-social-media-widgets"; infoIcon.rel = "noreferrer"; @@ -611,11 +606,11 @@ function createReplacementWidget(widget, elToReplace) { let buttonDiv = document.createElement('div'); styleAttrs.push("width: 100%"); - buttonDiv.style = styleAttrs.join(" !important;") + " !important"; + buttonDiv.style = styleAttrs.join(";"); // allow once button let button = document.createElement('button'), - button_id = _make_id("btn-once"); + button_id = "btn-once"; button.id = button_id; styleAttrs = [ "transition: background-color 0.25s ease-out, border-color 0.25s ease-out, color 0.25s ease-out", @@ -634,13 +629,13 @@ function createReplacementWidget(widget, elToReplace) { "width: 70%", "max-width: 280px", ]; - button.style = styleAttrs.join(" !important;") + " !important"; + button.style = styleAttrs.join(";"); // allow on this site button let site_button = document.createElement('button'), - site_button_id = _make_id("btn-site"); + site_button_id = "btn-site"; site_button.id = site_button_id; - site_button.style = styleAttrs.join(" !important;") + " !important"; + site_button.style = styleAttrs.join(";"); button.appendChild(document.createTextNode(TRANSLATIONS.allow_once)); site_button.appendChild(document.createTextNode(TRANSLATIONS.allow_on_site)); @@ -707,27 +702,27 @@ function createReplacementWidget(widget, elToReplace) { let head_styles = ` html, body { - color: #303030 !important; - height: 100% !important; - overflow: hidden !important; + color: #303030; + height: 100%; + overflow: hidden; } #${button_id} { - border: 2px solid #f06a0a !important; - background-color: #f06a0a !important; - color: #fefefe !important; + border: 2px solid #f06a0a; + background-color: #f06a0a; + color: #fefefe; } #${site_button_id} { - border: 2px solid #333 !important; - background-color: #fefefe !important; - color: #333 !important; + border: 2px solid #333; + background-color: #fefefe; + color: #333; } #${button_id}:hover { - background-color: #fefefe !important; - color: #333 !important; + background-color: #fefefe; + color: #333; } #${site_button_id}:hover { - background-color: #fefefe !important; - border: 2px solid #f06a0a !important; + background-color: #fefefe; + border: 2px solid #f06a0a; } #${info_icon_id}, #${close_icon_id} { position: absolute; @@ -778,26 +773,26 @@ a:hover { color-scheme: dark; } body { - background-color: #333 !important; - color: #ddd !important; + background-color: #333; + color: #ddd; } a, a:visited { - color: #ddd !important; + color: #ddd; } a:hover { - color: #f06a0a !important; + color: #f06a0a; } #${info_icon_id}:before, #${close_icon_id}:before { color: #aaa; } #${site_button_id} { - background-color: #333 !important; - border: solid 2px #ddd !important; - color: #ddd !important; + background-color: #333; + border: solid 2px #ddd; + color: #ddd; } #${button_id}:hover, #${site_button_id}:hover { - background-color: #333 !important; - color: #ddd !important; + background-color: #333; + color: #ddd; } } `.trim(); From 0d7a37c20c998ff5daa57acb9b12eca780db694e Mon Sep 17 00:00:00 2001 From: lenacohen Date: Fri, 28 Feb 2025 14:42:44 -0500 Subject: [PATCH 04/10] Update Selenium tests to handle widget shadow root --- src/js/contentscripts/socialwidgets.js | 3 ++- tests/selenium/widgets_test.py | 20 +++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/js/contentscripts/socialwidgets.js b/src/js/contentscripts/socialwidgets.js index bd2cc5248f..1459f79886 100644 --- a/src/js/contentscripts/socialwidgets.js +++ b/src/js/contentscripts/socialwidgets.js @@ -405,7 +405,8 @@ function createReplacementWidget(widget, elToReplace) { let widgetFrame = document.createElement('iframe'); let shadowHost = document.createElement("div"); - let shadowRoot = shadowHost.attachShadow({ mode: "closed" }); + shadowHost.className = "widget-shadow-host"; + let shadowRoot = shadowHost.attachShadow({ mode: "open" }); shadowRoot.appendChild(widgetFrame); // widget replacement frame styles diff --git a/tests/selenium/widgets_test.py b/tests/selenium/widgets_test.py index 76ab02b924..276dab090b 100644 --- a/tests/selenium/widgets_test.py +++ b/tests/selenium/widgets_test.py @@ -78,6 +78,12 @@ def set_up_widgets(self): "}(arguments[0]));" ), widgetsJson) + def switch_to_shadow_host_frame(self, selector): + shadow_host = self.driver.find_element(By.CSS_SELECTOR, "div.widget-shadow-host") + shadow_root = self.driver.execute_script("return arguments[0].shadowRoot", shadow_host) + iframe = shadow_root.find_element(By.CSS_SELECTOR, selector) + self.driver.switch_to.frame(iframe) + def switch_to_frame(self, selector): self.wait_for_and_switch_to_frame(selector, timeout=1) @@ -114,13 +120,13 @@ def assert_replacement(self, widget_name=None): widget_name = self.TYPE3_WIDGET_NAME try: - self.switch_to_frame(f'iframe[srcdoc*="{widget_name}"]') - except (StaleElementReferenceException, TimeoutException): + self.switch_to_shadow_host_frame(f'iframe[srcdoc*="{widget_name}"]') + except (StaleElementReferenceException, TimeoutException, NoSuchElementException): self.fail("Unable to find widget placeholder frame") try: - self.find_el_by_css("button[id^='btn-once-']") - self.find_el_by_css("button[id^='btn-site-']") + self.find_el_by_css("button[id^='btn-once']") + self.find_el_by_css("button[id^='btn-site']") except TimeoutException: self.fail("Unable to find expected widget placeholder buttons") @@ -151,9 +157,9 @@ def assert_no_replacement(self, widget_name=None): if not widget_name: widget_name = self.TYPE3_WIDGET_NAME try: - self.switch_to_frame(f'iframe[srcdoc*="{widget_name}"]') + self.switch_to_shadow_host_frame(f'iframe[srcdoc*="{widget_name}"]') self.fail("Widget placeholder frame should be missing") - except TimeoutException: + except (TimeoutException, NoSuchElementException): pass self.driver.switch_to.default_content() @@ -161,7 +167,7 @@ def activate_widget(self, widget_name=None, once=True): if not widget_name: widget_name = self.TYPE3_WIDGET_NAME id_prefix = 'btn-once' if once else 'btn-site' - self.switch_to_frame(f'iframe[srcdoc*="{widget_name}"]') + self.switch_to_shadow_host_frame(f'iframe[srcdoc*="{widget_name}"]') self.find_el_by_css(f"button[id^='{id_prefix}']").click() self.driver.switch_to.default_content() # wait a bit for the widget to get reinserted From 5edadb3f1f36b9e8c444bd80ef126fad8619131a Mon Sep 17 00:00:00 2001 From: lenacohen Date: Fri, 28 Feb 2025 14:59:29 -0500 Subject: [PATCH 05/10] Make shadow root closed on all pages except EFF test pages, where shadow root must be open for Selenium access --- src/js/contentscripts/socialwidgets.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/js/contentscripts/socialwidgets.js b/src/js/contentscripts/socialwidgets.js index 1459f79886..eb9a864753 100644 --- a/src/js/contentscripts/socialwidgets.js +++ b/src/js/contentscripts/socialwidgets.js @@ -406,7 +406,8 @@ function createReplacementWidget(widget, elToReplace) { let widgetFrame = document.createElement('iframe'); let shadowHost = document.createElement("div"); shadowHost.className = "widget-shadow-host"; - let shadowRoot = shadowHost.attachShadow({ mode: "open" }); + // Use an open shadow root on EFF test pages to allow our Selenium tests to access placeholder buttons + let shadowRoot = shadowHost.attachShadow({ mode: window.location.host === "efforg.github.io" ? "open" : "closed"}); shadowRoot.appendChild(widgetFrame); // widget replacement frame styles From b2b3a89165e35addc51e12e60ba5dd329d0915cf Mon Sep 17 00:00:00 2001 From: lenacohen Date: Fri, 28 Feb 2025 16:43:24 -0500 Subject: [PATCH 06/10] Fix failing Travis test runs by adding wait --- tests/selenium/widgets_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/selenium/widgets_test.py b/tests/selenium/widgets_test.py index 276dab090b..4aa7a5bb6d 100644 --- a/tests/selenium/widgets_test.py +++ b/tests/selenium/widgets_test.py @@ -79,7 +79,7 @@ def set_up_widgets(self): ), widgetsJson) def switch_to_shadow_host_frame(self, selector): - shadow_host = self.driver.find_element(By.CSS_SELECTOR, "div.widget-shadow-host") + shadow_host = self.find_el_by_css("div.widget-shadow-host") shadow_root = self.driver.execute_script("return arguments[0].shadowRoot", shadow_host) iframe = shadow_root.find_element(By.CSS_SELECTOR, selector) self.driver.switch_to.frame(iframe) From ca9d736a64e5550a13ec7aee7f79c7dfc8f8e11f Mon Sep 17 00:00:00 2001 From: lenacohen Date: Mon, 28 Apr 2025 16:39:50 -0400 Subject: [PATCH 07/10] Address PR feedback --- src/js/contentscripts/socialwidgets.js | 3 +-- tests/selenium/widgets_test.py | 24 +++++++++++++++--------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/js/contentscripts/socialwidgets.js b/src/js/contentscripts/socialwidgets.js index eb9a864753..3304520e54 100644 --- a/src/js/contentscripts/socialwidgets.js +++ b/src/js/contentscripts/socialwidgets.js @@ -405,9 +405,8 @@ function createReplacementWidget(widget, elToReplace) { let widgetFrame = document.createElement('iframe'); let shadowHost = document.createElement("div"); - shadowHost.className = "widget-shadow-host"; // Use an open shadow root on EFF test pages to allow our Selenium tests to access placeholder buttons - let shadowRoot = shadowHost.attachShadow({ mode: window.location.host === "efforg.github.io" ? "open" : "closed"}); + let shadowRoot = shadowHost.attachShadow({ mode: "closed"}); shadowRoot.appendChild(widgetFrame); // widget replacement frame styles diff --git a/tests/selenium/widgets_test.py b/tests/selenium/widgets_test.py index 4aa7a5bb6d..e8fec0926d 100644 --- a/tests/selenium/widgets_test.py +++ b/tests/selenium/widgets_test.py @@ -10,7 +10,8 @@ from selenium.common.exceptions import ( NoSuchElementException, StaleElementReferenceException, - TimeoutException + TimeoutException, + NoSuchShadowRootException ) from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import Select @@ -78,11 +79,16 @@ def set_up_widgets(self): "}(arguments[0]));" ), widgetsJson) - def switch_to_shadow_host_frame(self, selector): - shadow_host = self.find_el_by_css("div.widget-shadow-host") - shadow_root = self.driver.execute_script("return arguments[0].shadowRoot", shadow_host) - iframe = shadow_root.find_element(By.CSS_SELECTOR, selector) - self.driver.switch_to.frame(iframe) + def switch_to_placeholder_frame(self, selector): + for el in self.driver.find_elements(By.CSS_SELECTOR, "div"): + try: + shadow_root = el.shadow_root + except NoSuchShadowRootException: + continue + iframe = shadow_root.find_element(By.CSS_SELECTOR, selector) + self.driver.switch_to.frame(iframe) + return + raise NoSuchElementException("Failed to find placeholder frame") def switch_to_frame(self, selector): self.wait_for_and_switch_to_frame(selector, timeout=1) @@ -120,7 +126,7 @@ def assert_replacement(self, widget_name=None): widget_name = self.TYPE3_WIDGET_NAME try: - self.switch_to_shadow_host_frame(f'iframe[srcdoc*="{widget_name}"]') + self.switch_to_placeholder_frame(f'iframe[srcdoc*="{widget_name}"]') except (StaleElementReferenceException, TimeoutException, NoSuchElementException): self.fail("Unable to find widget placeholder frame") @@ -157,7 +163,7 @@ def assert_no_replacement(self, widget_name=None): if not widget_name: widget_name = self.TYPE3_WIDGET_NAME try: - self.switch_to_shadow_host_frame(f'iframe[srcdoc*="{widget_name}"]') + self.switch_to_placeholder_frame(f'iframe[srcdoc*="{widget_name}"]') self.fail("Widget placeholder frame should be missing") except (TimeoutException, NoSuchElementException): pass @@ -167,7 +173,7 @@ def activate_widget(self, widget_name=None, once=True): if not widget_name: widget_name = self.TYPE3_WIDGET_NAME id_prefix = 'btn-once' if once else 'btn-site' - self.switch_to_shadow_host_frame(f'iframe[srcdoc*="{widget_name}"]') + self.switch_to_placeholder_frame(f'iframe[srcdoc*="{widget_name}"]') self.find_el_by_css(f"button[id^='{id_prefix}']").click() self.driver.switch_to.default_content() # wait a bit for the widget to get reinserted From e9bb8d0138391a321d7be16db3ca3f9891ce742e Mon Sep 17 00:00:00 2001 From: lenacohen Date: Tue, 29 Apr 2025 10:54:27 -0400 Subject: [PATCH 08/10] Switch to open shadow root Closed shadow roots interfere with testing, and possibly accessibility: https://jschof.dev/posts/2024/4/web-components-and-you-7/. We don't need to prevent the placeholder from being accessed by outside JS to prevent the known UI bugs --- src/js/contentscripts/socialwidgets.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/js/contentscripts/socialwidgets.js b/src/js/contentscripts/socialwidgets.js index 3304520e54..7328880a1f 100644 --- a/src/js/contentscripts/socialwidgets.js +++ b/src/js/contentscripts/socialwidgets.js @@ -405,8 +405,7 @@ function createReplacementWidget(widget, elToReplace) { let widgetFrame = document.createElement('iframe'); let shadowHost = document.createElement("div"); - // Use an open shadow root on EFF test pages to allow our Selenium tests to access placeholder buttons - let shadowRoot = shadowHost.attachShadow({ mode: "closed"}); + let shadowRoot = shadowHost.attachShadow({ mode: "open"}); shadowRoot.appendChild(widgetFrame); // widget replacement frame styles From 671d3174f61d5bec7cf641a6febabc914be94636 Mon Sep 17 00:00:00 2001 From: Alexei Date: Wed, 14 May 2025 12:55:00 -0400 Subject: [PATCH 09/10] Fix nits --- src/js/contentscripts/socialwidgets.js | 6 ++++-- tests/selenium/widgets_test.py | 12 ++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/js/contentscripts/socialwidgets.js b/src/js/contentscripts/socialwidgets.js index 7328880a1f..94e14f37fd 100644 --- a/src/js/contentscripts/socialwidgets.js +++ b/src/js/contentscripts/socialwidgets.js @@ -453,12 +453,14 @@ function createReplacementWidget(widget, elToReplace) { } } } + widgetFrame.style = styleAttrs.join(";"); + + // fix widget placeholder sometimes overlapping page content: + // https://github.com/EFForg/privacybadger/issues/3024 if (parseFloat(window.getComputedStyle(elToReplace.parentNode).height) < min_height) { elToReplace.parentNode.style.minHeight = `${min_height}px`; } - widgetFrame.style = styleAttrs.join(";"); - let widgetDiv = document.createElement('div'); // parent div styles diff --git a/tests/selenium/widgets_test.py b/tests/selenium/widgets_test.py index e8fec0926d..8a68d7e9f9 100644 --- a/tests/selenium/widgets_test.py +++ b/tests/selenium/widgets_test.py @@ -127,12 +127,12 @@ def assert_replacement(self, widget_name=None): try: self.switch_to_placeholder_frame(f'iframe[srcdoc*="{widget_name}"]') - except (StaleElementReferenceException, TimeoutException, NoSuchElementException): + except (NoSuchElementException, StaleElementReferenceException): self.fail("Unable to find widget placeholder frame") try: - self.find_el_by_css("button[id^='btn-once']") - self.find_el_by_css("button[id^='btn-site']") + self.find_el_by_css("button[id='btn-once']") + self.find_el_by_css("button[id='btn-site']") except TimeoutException: self.fail("Unable to find expected widget placeholder buttons") @@ -165,16 +165,16 @@ def assert_no_replacement(self, widget_name=None): try: self.switch_to_placeholder_frame(f'iframe[srcdoc*="{widget_name}"]') self.fail("Widget placeholder frame should be missing") - except (TimeoutException, NoSuchElementException): + except NoSuchElementException: pass self.driver.switch_to.default_content() def activate_widget(self, widget_name=None, once=True): if not widget_name: widget_name = self.TYPE3_WIDGET_NAME - id_prefix = 'btn-once' if once else 'btn-site' + btn_id = 'btn-once' if once else 'btn-site' self.switch_to_placeholder_frame(f'iframe[srcdoc*="{widget_name}"]') - self.find_el_by_css(f"button[id^='{id_prefix}']").click() + self.find_el_by_css(f"button[id='{btn_id}']").click() self.driver.switch_to.default_content() # wait a bit for the widget to get reinserted sleep(1) From 42ee2b4c7f637c35a86e1f2daa2126a4cb71a06f Mon Sep 17 00:00:00 2001 From: Alexei Date: Wed, 14 May 2025 14:11:53 -0400 Subject: [PATCH 10/10] Revert the content overlapping min-height fix As it adds unwanted space below the placeholder on livestream.eff.org --- src/js/contentscripts/socialwidgets.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/js/contentscripts/socialwidgets.js b/src/js/contentscripts/socialwidgets.js index 94e14f37fd..9d8d193710 100644 --- a/src/js/contentscripts/socialwidgets.js +++ b/src/js/contentscripts/socialwidgets.js @@ -410,12 +410,11 @@ function createReplacementWidget(widget, elToReplace) { // widget replacement frame styles let border_width = 1; - let min_height = 210; let styleAttrs = [ "background-color: #fff", "border: " + border_width + "px solid #ec9329", "min-width: 220px", - `min-height: ${min_height}px`, + "min-height: 210px", "max-height: 600px", "pointer-events: all", "z-index: 999", @@ -455,12 +454,6 @@ function createReplacementWidget(widget, elToReplace) { } widgetFrame.style = styleAttrs.join(";"); - // fix widget placeholder sometimes overlapping page content: - // https://github.com/EFForg/privacybadger/issues/3024 - if (parseFloat(window.getComputedStyle(elToReplace.parentNode).height) < min_height) { - elToReplace.parentNode.style.minHeight = `${min_height}px`; - } - let widgetDiv = document.createElement('div'); // parent div styles