{ "version": 3, "sources": ["../../../node_modules/@carwow/carwow_google_ads/app/javascript/make_model_menu_ad.js", "../../../node_modules/@carwow/carwow_google_ads/app/javascript/setup/ad_slot_setup.js", "../../../node_modules/@carwow/carwow_google_ads/app/javascript/setup/cookie_consent.js", "../../../node_modules/@carwow/carwow_google_ads/app/javascript/error_reporting/error_reporting.js", "../../../node_modules/@carwow/carwow_google_ads/app/javascript/ad_lifecycle_callbacks/slot_render_ended.js", "../../../node_modules/@carwow/carwow_google_ads/app/javascript/ad_lifecycle_callbacks/viewable_impression.js", "../../../node_modules/@carwow/carwow_google_ads/app/javascript/ad_lifecycle_callbacks/index.js", "../../../node_modules/@carwow/carwow_google_ads/app/javascript/ad_behaviours/ad_click.js", "../../../node_modules/@carwow/carwow_google_ads/app/javascript/ad_behaviours/standard_ad_sizing.js", "../../../node_modules/@carwow/carwow_google_ads/app/javascript/ad_behaviours/update_container_height.js", "../../../node_modules/@carwow/carwow_google_ads/app/javascript/ad_behaviours/update_theme_tag.js", "../../../node_modules/@carwow/carwow_google_ads/app/javascript/ad_behaviours/index.js", "../../../node_modules/@carwow/carwow_google_ads/app/javascript/setup/pub_ads_service_setup.js", "../../../node_modules/@carwow/carwow_google_ads/app/javascript/setup/blocker_scanner.js", "../../../node_modules/@carwow/carwow_google_ads/app/javascript/initializer.js", "../../javascript/pages/google_ads.js"], "sourcesContent": ["/*\nDEPRECATED\nThis class allows the MakeModelMenu elm app to dynamically interact with an ad\nthat was not rendered immediately.\nIts use is considered deprecated, along with elm. If you're looking to\nextend this, please instead consider using something else\n*/\nexport class MakeModelMenuAd extends HTMLElement {\n connectedCallback () {\n if (!this.isConnected) return;\n\n this.setupAd(document.querySelector('carwow-make-model-menu-ad'), this)\n }\n\n setupAd (adNode) {\n // Pushing to the intermediate array just in case the googletag is not loaded yet.\n window.carwowGoogleTag.push(() => {\n window.googletag.cmd.push(() => {\n // be careful of the lexical value of `this` if you move this.\n this.innerHTML = adNode.innerHTML\n this.setDisplayOnChildGoogleAdElements()\n this.displayAdSlotLater(adNode)\n })\n })\n }\n\n // There's a chance that .google-ad elements will be initialized with display:none\n // This is because we might want to run A/B tests on multiple ads.\n // GOTCHA: be careful not to accidentally target script elements.\n setDisplayOnChildGoogleAdElements () {\n const googleAdElement = Array.from(this.childNodes).find((node) =>\n node.classList?.contains('google-ad')\n );\n\n if (googleAdElement) {\n googleAdElement.display = 'block'\n }\n }\n\n displayAdSlotLater (adNode) {\n const adSlot = this.findAdSlot(adNode)\n\n // We push the slot to the carwowGoogleAdSlots array whose contents\n // are passed to pubads.refresh() inside the initializer function\n // once the user has interacted with the cookie consent UI.\n window.carwowGoogleAdSlots.push(adSlot)\n }\n\n findAdSlot (adNode) {\n return window.googletag\n .pubads()\n .getSlots()\n .find((slot) => slot.getSlotElementId() === adNode.querySelector('.google-ad').id)\n }\n}\n", "/*\nThis module contains functions that we bind to the window to setup slots\nand control the display of ads.\nThese functions are called by the views that load the ads in Rails,\nusually from inside an intermediate 'command array' that will execute after\nthe google library is loaded.\n*/\nexport const createWindowFunctionsForAdSetup = () => {\n window.googletag = window.googletag || { cmd: [] };\n window.carwowGoogleTag = window.carwowGoogleTag || [];\n window.carwowGoogleAdSlots = window.carwowGoogleAdSlots || [];\n\n window.defineGoogleAdSlot = defineGoogleAdSlot\n window.displayGoogleAd = displayGoogleAd\n}\n\nconst defineGoogleAdSlot = (googleAdJson) => {\n const googleAd = JSON.parse(googleAdJson);\n\n window.googletag.cmd.push(() => {\n const slot = (googleAd.native) ? buildNativeAdSlot(googleAd) : buildStandardAdSlot(googleAd)\n\n addBlueconicTargetingValues(slot)\n\n // Run our first-party targeting values last, so that it takes precedence over any duplicate keys\n // from the third party targeting (via blueconic)\n for (const [key, value] of Object.entries(googleAd.targetingKeyValues)) {\n slot.setTargeting(key, value);\n }\n\n if (new RegExp(\"(?:^|;\\\\s*)carwow_admin_token\\\\s*\\\\=\").test(document.cookie)) {\n slot.setTargeting('carwow_admin', true);\n }\n });\n}\n\nconst buildNativeAdSlot = ({ unitPath, divId }) => {\n const slot = window.googletag.defineSlot(unitPath, ['fluid'], divId)\n\n slot.addService(window.googletag.pubads())\n\n return slot\n}\n\nconst buildStandardAdSlot = (googleAd) => {\n const slot = window.googletag.defineSlot(googleAd.unitPath, googleAd.allDeviceSizes, googleAd.divId)\n\n const mapping = window.googletag.sizeMapping()\n .addSize([1167, 0], googleAd.largeDesktopSizes)\n .addSize([1025, 0], googleAd.desktopSizes)\n .addSize([791, 0], googleAd.largeTabletSizes)\n .addSize([651, 0], googleAd.tabletSizes)\n .addSize([0, 0], googleAd.mobileSizes)\n .build();\n\n slot.defineSizeMapping(mapping);\n\n slot.addService(window.googletag.pubads())\n\n return slot\n}\n\nconst addBlueconicTargetingValues = (slot) => {\n // Blueconic docs say that these values might be (very slightly) outdated\n // if BC hasn't yet updated the user's attributes.\n // See https://support.blueconic.com/hc/en-us/articles/115004519689-Google-Ad-Manager-for-Publishers-Targeting-Only-Connection#adjust-your-google-ad-manager-implementation-code-0-1\n const targetingParams = JSON.parse(localStorage.getItem(\"bcDFPTargetingParams\"))\n\n if (targetingParams) {\n targetingParams.forEach(({ key, value }) => {\n slot.setTargeting(key, value)\n })\n }\n}\n\n// This function is useful to remove any old ads when re-rendering parts of the page\n// ie in Turbo Frames where the new response does not contain the previously rendered ad element\nconst removeAnyAdsNoLongerInTheDOM = () => {\n const slotsToBeRemoved = googletag.pubads().getSlots().filter(slot => document.getElementById(slot.getSlotElementId()) === null)\n if (slotsToBeRemoved.length) {\n googletag.destroySlots(slotsToBeRemoved)\n }\n}\n\nconst displayGoogleAd = (elementId, display) => {\n window.googletag.cmd.push(function() {\n removeAnyAdsNoLongerInTheDOM();\n // Gotcha: if we call disableInitialLoad() when initializing the service\n // this only *registers* the slot rather than displaying it\n googletag.display(elementId);\n\n if (display) {\n const slot = googletag.pubads().getSlots().find(slot => slot.getSlotElementId() === elementId);\n // to display the ad we need to call pubads().refresh(slot)\n // but we pass it into this array because we need to ensure the user has interacted\n // with GDPR consent before this happens\n window.carwowGoogleAdSlots.push(slot)\n } else {\n // If display was false, we want to hide this element, perhaps as part of an AB-test or\n // because it is loaded and controlled later.\n document.getElementById(elementId).style.display = 'none';\n }\n });\n}\n", "/*\nOur implementation of the pubads service depends on the TCF API because we wait for a user to indicate their consent before loading ads.\nThe expected behaviour is that the ads service plumbing will be set up immediately (using the intermediate carwowGoogleAdSlots array on the window)\nbut that the ads themselves will just be 'loading' until the user interacts with cookie consent.\nThis listener fires at various times in the lifecycle of the TCF API, including before, after and instead of the consent UI showing.\nhttps://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/3485190b99f13a68c9e4c3b60760210903b7baaf/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md#addeventlistener\n*/\nexport const listenForCookieConsentThenDisplayAds = () => {\n window.__tcfapi('addEventListener', 2, (tcData, callbackRegisteredSuccessfully) => {\n // do not fire this event if the event indicates something went wrong\n // or if the event is to indicate the user has to interact with the UI (it will be fired again subsequently)\n if (!callbackRegisteredSuccessfully || tcData.eventStatus === 'cmpuishown') { return; }\n\n window.googletag.cmd.push(() => {\n // If there are slots waiting in our intermediate array, we can safely refresh them (to display the ad)\n // now that we have consent from the user. Consent is passed to Google by our CMP.\n if (window.carwowGoogleAdSlots.length) {\n window.googletag.pubads().refresh(window.carwowGoogleAdSlots)\n // remove them from the array so they don't accidentally get refreshed again\n window.carwowGoogleAdSlots.splice(0,window.carwowGoogleAdSlots.length)\n }\n })\n\n // Now that the consent has been dealt with, we can refresh each ad as it is pushed into the array\n window.carwowGoogleAdSlots.push = (slot) => { window.googletag.pubads().refresh([slot]) }\n });\n}\n", "/*\nThis module contains common error reporting logic, such as\nsending volume errors to our proxy server\n*/\nexport const sendEmptyGoogleAdEventVolumeError = (adUnitPath) => {\n if (!window.jsVolumeErrorAttributes) {\n // These need to have been set beforehand. Check the window function setup.\n return;\n }\n\n const event = createErrorEvent(window.location.pathname, navigator, adUnitPath)\n\n const payload = {\n serviceName: window.jsVolumeErrorAttributes.serviceName,\n commit: window.jsVolumeErrorAttributes.commit,\n country: window.jsVolumeErrorAttributes.country,\n controller: window.jsVolumeErrorAttributes.controller,\n action: window.jsVolumeErrorAttributes.action,\n payload: event,\n };\n\n let xhr = new XMLHttpRequest();\n xhr.open('POST', 'https://errors.carwow.com');\n xhr.setRequestHeader('Content-Type', 'application/json');\n xhr.send(JSON.stringify(payload));\n}\n\nconst createErrorEvent = (pathname, navigator, adUnitPath) => {\n return {\n context: pathname,\n device: { userAgent: navigator.userAgent },\n exceptions: [\n {\n errorClass: 'EmptyGoogleAdEvent',\n errorMessage: `Ad-slot not filled: ${adUnitPath}`\n }\n ]\n }\n}\n", "import { sendEmptyGoogleAdEventVolumeError } from \"../error_reporting/error_reporting\";\n\nexport const handleSlotRenderEnded = (event) => {\n const adElement = document.getElementById(event.slot.getSlotElementId());\n const iframe = adElement.querySelector('iframe');\n\n // When an ad-slot isn't filled.\n // We don't expect this to happen, because we should \"always\" at least serve a house ad\n if (event.isEmpty) {\n sendEmptyGoogleAdEventVolumeError(event.slot.getAdUnitPath());\n return;\n }\n\n const clickDataElement = document.createElement('div');\n clickDataElement.classList.add('click_data_element');\n clickDataElement.style.display = 'none';\n\n // If the ad is from a 3rd party source, we cannot access iframe.contentDocument\n const iframeClickElement = iframe.contentDocument && iframe.contentDocument.body.querySelector('a');\n const googleClickThroughUrl = iframeClickElement ? iframeClickElement.href : null;\n const clickThroughUrl = googleClickThroughUrl ? new URL(googleClickThroughUrl).searchParams.get('adurl') : null;\n\n // do not mess with this! we base most of our reporting from attributes in this event. Check with the wider team first.\n const clickDataElementProperties = {\n interactionType: 'google ad',\n adLineItemId: event.lineItemId,\n adUnitPath: event.slot.getAdUnitPath(),\n advertiserId: event.advertiserId,\n campaignId: event.campaignId,\n creativeId: event.creativeId,\n size: event.size,\n googleClickThroughUrl: googleClickThroughUrl,\n clickThroughUrl: clickThroughUrl,\n ...event.slot.getTargetingMap(),\n };\n\n Object.assign(clickDataElement.dataset, clickDataElementProperties);\n adElement.appendChild(clickDataElement);\n\n window.dataLayer.push({\n event: 'trackable event',\n eventName: 'Google impression',\n eventParams: clickDataElement.dataset,\n });\n\n if (adElement.dataset.fullHeight) {\n iframe.style.height = '100%';\n iframe.parentNode.style.height = '100%';\n }\n\n window.googleAdIframes = window.googleAdIframes || [];\n window.googleAdIframes.push(iframe);\n\n if (clickThroughUrl) {\n iframe.contentDocument.body.addEventListener('click', () => {\n window.dataLayer.push({\n event: 'gtm.click',\n 'gtm.element': clickDataElement,\n 'gtm.elementUrl': clickThroughUrl,\n });\n });\n }\n}\n", "export const pushViewableImpressionToDataLayer = (impressionEvent) => {\n const adParent = document.getElementById(impressionEvent.slot.getSlotElementId());\n const adChild = adParent?.getElementsByClassName('click_data_element')[0]\n\n if (!adChild) { return; }\n\n window.dataLayer.push({\n event: 'trackable event',\n eventName: 'Google viewable impression',\n eventParams: adChild.dataset,\n });\n}\n", "import { handleSlotRenderEnded } from \"./slot_render_ended\"\nimport { pushViewableImpressionToDataLayer } from \"./viewable_impression\"\n\nexport const registerListenersForAdLifecycleEvents = () => {\n window.googletag.cmd.push(() => {\n window.googletag.pubads().addEventListener('slotRenderEnded', handleSlotRenderEnded)\n window.googletag.pubads().addEventListener('impressionViewable', pushViewableImpressionToDataLayer)\n })\n}\n", "export const handleAdClick = (event) => {\n const clickFromAd = event.origin.endsWith('safeframe.googlesyndication.com')\n\n if (!clickFromAd || !window.googleAdIframes) {\n return;\n }\n\n const matchedIframe = window.googleAdIframes.find((iframe) => {\n return event.source.window === iframe.contentWindow;\n });\n\n if (matchedIframe) {\n const parentElement = matchedIframe.parentElement.parentElement;\n const clickDataElement = parentElement.getElementsByClassName('click_data_element')[0];\n Object.assign(clickDataElement.dataset, event.data.dataset);\n clickDataElement.innerText = event.data.text;\n\n window.dataLayer.push({\n event: 'gtm.click',\n 'gtm.element': clickDataElement,\n 'gtm.elementUrl': new URL(event.data.href).searchParams.get('adurl'),\n });\n }\n}\n", "/*\nThis function updates the styling of a standard ad iframe depending\non the size that was served -- we declare a range of sizes we accept\nand Google decides which of the creatives to inject. This function\nadds some padding and max-width according to the size of the creative served.\n*/\nexport const iabStandardFlexibleAdSizesCallback = (event) => {\n const iframe = document.getElementById(event.source.name);\n const parentElement = iframe.parentElement.parentElement;\n const paddingBottom = `min(${event.data.aspectRatio}, ${event.data.maxHeight})`;\n parentElement.style.paddingBottom = paddingBottom;\n iframe.style.maxWidth = event.data.maxWidth;\n}\n", "/*\nDuring the billboard rollout, we need to dynamically update the height\nof the ad containers, because we don't know beforehand whether we will\nserve a billboard style or an old style ad - both of which have completely\ndifferent heights. This code should be removed once we migrate entirely to\nbillboards.\n*/\nexport const updateAdContainerHeight = (event) => {\n const matchedIframe = window.googleAdIframes.find((iframe) => {\n return event.source.window === iframe.contentWindow;\n });\n\n if (matchedIframe) {\n const parentElement = matchedIframe.closest('.google-ad');\n parentElement.style.height = event.data.newHeight\n }\n}\n", "/*\nAdds an event listener for events emitted from _inside google ads_ that\nwill change the HTML meta tag controlling the theme of the device menu (eg: mobile top menu).\nUseful for keeping the theme in sync with a banner ad served via google ads.\n */\nexport const updateThemeTag = (event) => {\n const newColor = event.data?.newColor\n\n if (CSS.supports('background-color', newColor)) {\n document.querySelector('meta[name=\"theme-color\"]').content = newColor\n }\n}\n\n// Paste this function and call itm from any ad native to emit the correct message that'll be updated by the code here\nconst changeThemeInMainSite = (newColor) => {\n window.top.postMessage({\n eventType: 'carwow-update-theme-color',\n newColor\n })\n}\n", "import { handleAdClick } from \"./ad_click\"\nimport { iabStandardFlexibleAdSizesCallback } from \"./standard_ad_sizing\"\nimport { updateAdContainerHeight } from \"./update_container_height\"\nimport { updateThemeTag } from \"./update_theme_tag\"\n\nexport const registerListenersForEventsInsideAds = () => {\n window.googletag.cmd.push(() => {\n handleEventsFromInsideAd('click', handleAdClick)\n handleEventsFromInsideAd('iabStandardFlexibleAdSizes', iabStandardFlexibleAdSizesCallback)\n handleEventsFromInsideAd('resize-carwow-google-ad', updateAdContainerHeight)\n handleEventsFromInsideAd('carwow-update-theme-color', updateThemeTag)\n })\n}\n\n/*\nThis function will register an eventListener for postMessage events sent from inside ad native code.\nProvide a callback function that will receive any message events of EventType, and any arguments you\nwant to pass into the callback (after the message event)\n*/\nexport const handleEventsFromInsideAd = (eventType, callback, ...callbackArguments) => {\n window.addEventListener('message', (message) => {\n if (message.data?.eventType === eventType) {\n callback(message, callbackArguments)\n }\n }, false)\n}\n", " /*\n initialize the pubads service\n\n With initial load disabled, calls to display() will only register the ad slot.\n No ad content will be loaded until .refresh is called on the slot.\n THIS IS LEGALLY IMPORTANT because we need cookie consent from users before\n we show any ads. See the cookie consent module for the place we actually do this.\n\n We set collapseEmptyDivs to prevent any ads that didn't render from staying\n open in the DOM\n */\nexport const setupAndEnablePubAdsService = () => {\n window.googletag.cmd.push(() => {\n window.googletag.pubads().disableInitialLoad();\n window.googletag.pubads().enableSingleRequest();\n window.googletag.pubads().collapseEmptyDivs();\n window.googletag.enableServices(); //Remember, this will not *display* ads, only get ready to after consent\n })\n}\n", "\nconst userHasBlockedAds = async () => {\n try {\n const url = `https://securepubads.g.doubleclick.net/pagead/ppub_config?ippd=www.carwow.co.uk&cachebust=${new Date().getTime()}`\n await fetch(url, { mode: 'no-cors' })\n } catch (error) {\n return true\n }\n return false\n}\n\nexport const hideSlotsIfUserBlocksAds = () => {\n userHasBlockedAds().then(adsAreBlocked => {\n if (adsAreBlocked) {\n window.addEventListener('DOMContentLoaded', (_e) => {\n console.log('Looks like you are running ad blocker.')\n document.querySelectorAll('.google-ad').forEach(node =>{\n node.style.display = 'none';\n })\n })\n }\n })\n}\n", "import { MakeModelMenuAd } from \"./make_model_menu_ad\";\nimport { createWindowFunctionsForAdSetup } from \"./setup/ad_slot_setup\";\nimport { listenForCookieConsentThenDisplayAds } from \"./setup/cookie_consent\";\nimport { registerListenersForAdLifecycleEvents } from \"./ad_lifecycle_callbacks\";\nimport { registerListenersForEventsInsideAds } from \"./ad_behaviours\";\nimport { setupAndEnablePubAdsService } from \"./setup/pub_ads_service_setup\";\nimport { hideSlotsIfUserBlocksAds } from \"./setup/blocker_scanner\";\n\nexport default function initializeGoogleAd() {\n // Do not run this function more than once, or we register all the event listeners twice.\n if (window.carwowGoogleAdsInitialized) {\n return;\n }\n\n createWindowFunctionsForAdSetup();\n\n customElements.define('carwow-google-ads', MakeModelMenuAd);\n\n registerListenersForAdLifecycleEvents();\n registerListenersForEventsInsideAds();\n\n setupAndEnablePubAdsService()\n\n // callbacks in this array were queued from Rails views.\n // We've waited because they rely on the service being setup and all the eventListeners from being setup\n // Now we can run them\n window.carwowGoogleTag.forEach( callback => callback());\n // From now on, execute callbacks as soon as they're added to the array\n window.carwowGoogleTag.push = (callback) => { callback(); };\n\n listenForCookieConsentThenDisplayAds();\n hideSlotsIfUserBlocksAds()\n\n // Stop the function from running subsequently.\n window.carwowGoogleAdsInitialized = true;\n\n}\n", "import initializeGoogleAd from '@carwow/carwow_google_ads/app/javascript/initializer'\n\ninitializeGoogleAd()\n"], "mappings": "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", "names": ["MakeModelMenuAd", "adNode", "googleAdElement", "node", "_a", "adSlot", "slot", "createWindowFunctionsForAdSetup", "defineGoogleAdSlot", "displayGoogleAd", "googleAdJson", "googleAd", "slot", "buildNativeAdSlot", "buildStandardAdSlot", "addBlueconicTargetingValues", "key", "value", "unitPath", "divId", "mapping", "targetingParams", "removeAnyAdsNoLongerInTheDOM", "slotsToBeRemoved", "elementId", "display", "listenForCookieConsentThenDisplayAds", "tcData", "callbackRegisteredSuccessfully", "slot", "sendEmptyGoogleAdEventVolumeError", "adUnitPath", "event", "createErrorEvent", "payload", "xhr", "pathname", "navigator", "handleSlotRenderEnded", "event", "adElement", "iframe", "sendEmptyGoogleAdEventVolumeError", "clickDataElement", "iframeClickElement", "googleClickThroughUrl", "clickThroughUrl", "clickDataElementProperties", "__spreadValues", "pushViewableImpressionToDataLayer", "impressionEvent", "adParent", "adChild", "registerListenersForAdLifecycleEvents", "handleSlotRenderEnded", "pushViewableImpressionToDataLayer", "handleAdClick", "event", "matchedIframe", "iframe", "clickDataElement", "iabStandardFlexibleAdSizesCallback", "event", "iframe", "parentElement", "paddingBottom", "updateAdContainerHeight", "event", "matchedIframe", "iframe", "parentElement", "updateThemeTag", "event", "_a", "newColor", "registerListenersForEventsInsideAds", "handleEventsFromInsideAd", "handleAdClick", "iabStandardFlexibleAdSizesCallback", "updateAdContainerHeight", "updateThemeTag", "eventType", "callback", "callbackArguments", "message", "_a", "setupAndEnablePubAdsService", "userHasBlockedAds", "__async", "url", "error", "hideSlotsIfUserBlocksAds", "adsAreBlocked", "_e", "node", "initializeGoogleAd", "createWindowFunctionsForAdSetup", "MakeModelMenuAd", "registerListenersForAdLifecycleEvents", "registerListenersForEventsInsideAds", "setupAndEnablePubAdsService", "callback", "listenForCookieConsentThenDisplayAds", "hideSlotsIfUserBlocksAds", "initializeGoogleAd"] }