diff --git a/browser/actors/SearchSERPTelemetryChild.sys.mjs b/browser/actors/SearchSERPTelemetryChild.sys.mjs index 8afff9c5e1de..93d4e32a7dd9 100644 --- a/browser/actors/SearchSERPTelemetryChild.sys.mjs +++ b/browser/actors/SearchSERPTelemetryChild.sys.mjs @@ -230,6 +230,7 @@ class SearchAdImpression { let hrefToComponentMap = new Map(); let innerWindowHeight = document.ownerGlobal.innerHeight; + let scrollY = document.ownerGlobal.scrollY; // Iterate over the results: // - If it's searchbox add event listeners. @@ -278,7 +279,8 @@ class SearchAdImpression { element, data.adsLoaded, childElements, - innerWindowHeight + innerWindowHeight, + scrollY ); if (componentToVisibilityMap.has(data.type)) { let componentInfo = componentToVisibilityMap.get(data.type); @@ -642,6 +644,8 @@ class SearchAdImpression { * List of children belonging to element. * @param {number} innerWindowHeight * Current height of the window containing the elements. + * @param {number} scrollY + * Current distance the window has been scrolled. * @returns {object} * Contains adsVisible which is the number of ads shown for the element * and adsHidden, the number of ads not visible to the user. @@ -650,7 +654,8 @@ class SearchAdImpression { element, adsLoaded, childElements, - innerWindowHeight + innerWindowHeight, + scrollY ) { let elementRect = element.ownerGlobal.windowUtils.getBoundsWithoutFlushing(element); @@ -664,6 +669,18 @@ class SearchAdImpression { }; } + // If an ad is far above the possible visible area of a window, an + // adblocker might be doing it as a workaround for blocking the ad. + if ( + elementRect.bottom < 0 && + innerWindowHeight + scrollY + elementRect.bottom < 0 + ) { + return { + adsVisible: 0, + adsHidden: adsLoaded, + }; + } + // Since the parent element has dimensions but no child elements we want // to inspect, check the parent itself is within the viewable area. if (!childElements || !childElements.length) { diff --git a/browser/components/search/test/browser/browser_search_telemetry_adImpression_component.js b/browser/components/search/test/browser/browser_search_telemetry_adImpression_component.js index 60882cb67e42..c9a4c6a8bef5 100644 --- a/browser/components/search/test/browser/browser_search_telemetry_adImpression_component.js +++ b/browser/components/search/test/browser/browser_search_telemetry_adImpression_component.js @@ -268,9 +268,9 @@ add_task(async function test_ad_impressions_with_hidden_carousels() { assertAdImpressionEvents([ { component: SearchSERPTelemetryUtils.COMPONENTS.AD_CAROUSEL, - ads_loaded: "3", + ads_loaded: "4", ads_visible: "0", - ads_hidden: "3", + ads_hidden: "4", }, ]); diff --git a/browser/components/search/test/browser/searchTelemetryAd_components_carousel_hidden.html b/browser/components/search/test/browser/searchTelemetryAd_components_carousel_hidden.html index 778d833d19ad..cccd71432673 100644 --- a/browser/components/search/test/browser/searchTelemetryAd_components_carousel_hidden.html +++ b/browser/components/search/test/browser/searchTelemetryAd_components_carousel_hidden.html @@ -62,6 +62,26 @@ + +
ad_carousel that is far above the page
+