{"version":3,"file":"static/js/services-group1.b9156ae5.chunk.js","mappings":"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","sources":["app-react/services/cms/cms-api/cms-api.service.ts","app-react/components/cms-banner/banner-content/banner-content.component.tsx","app-react/services/cms/cms-banners/banner-definition/banner-definition.tsx","app-react/services/cms/cms-banners/cms-banners.service.ts","app-react/services/cms/cms-pages/cms-pages.service.ts","app-react/services/cms/cms-segmentation/cms-segmentation.service.ts"],"sourcesContent":["import {ServiceBase} from '../../ServiceBase';\nimport {CmsBannerId} from '../cms-banners/cm-banner-id/cms-banner-id';\nimport {BannerData, CmsPageData, CmsSegmentsData, ICmsApiService} from './cms-api.service.interface';\nimport {LanguageSwitcherConfiguration} from '../../../app-bootstrap/config-interfaces/b2c-startup.configurations';\nimport {Check} from '@sparkware/app-utils';\nimport {UriParams} from \"../../location/uri-params/uri-params\";\n\n\nexport class CmsApiService extends ServiceBase implements ICmsApiService {\n\n private get _publicationID(): number {\n return this.services.configuration.cmsPublicationId;\n }\n\n public get apiOrigin(): string {\n return this.services.launcher.getCMSOrigin() || this.services.location.currentUri.origin\n }\n\n\n async getBanners(bannersIds: CmsBannerId[]): Promise {\n try {\n if(!bannersIds?.length){\n return [];\n }\n\n await this.services.abTestingFeatureDataProvider.waitForLoadTestData();\n\n let data;\n const options = {\n headers: this._getBannersRequestOptions()\n };\n\n if(this.services.configuration.servicesConfigs.Skin.isSiteInfraAWS) {\n data = await this.services.http.get(this._getBannersRequestUrl + this._getBannersRequestParamsGET(bannersIds), options);\n } else {\n options['body'] = this._getBannersRequestParamsPOST(bannersIds);\n data = await this.services.http.post(this._getBannersRequestUrl, options);\n }\n\n\n return data || [];\n } catch (err) {\n let bannersDescriptions = bannersIds.reduce((acc, curr) => acc + '\\n' + curr.toString(), '');\n this.services.logger.error('Failed read the following banners from CMS API: ' + bannersDescriptions + 'error message: ' ,err);\n return [];\n }\n }\n\n async getFallbackBanners(fileNames: string[]): Promise<{[key: string]: string}> {\n try {\n return await this._readFallbackBanners(fileNames);\n } catch (err) {\n let files = fileNames.reduce((acc, curr) => acc + '\\n' + curr, '');\n this.services.logger.error('Failed to read fallback banners for ' + files);\n return {};\n }\n }\n\n private _readFallbackBanners(fileNames: string[]): Promise<{[key: string]: string}> {\n\n\n let result = {};\n\n fileNames = fileNames || [];\n if(fileNames.length === 0) {\n return Promise.resolve(result);\n }\n\n\n let configuredFallbackUrl: string = this._getFallbackUrlFromConfig();\n if (!configuredFallbackUrl) {\n return Promise.resolve(result);\n }\n\n let promises: Promise[] = [];\n for (let i = 0; i < fileNames.length; i++ ) {\n let fileName = fileNames[i];\n let computedFallbackUrl = configuredFallbackUrl.replace('{fileName}', fileName);\n let promise = this.services.http.get(computedFallbackUrl).then(content => {\n result[fileName] = content;\n\n }).catch(err => {\n this.services.logger.error(`Failed to load fallback CMS banner! fallbackUrl: ${computedFallbackUrl}`, err);\n });\n\n promises.push(promise);\n }\n\n return Promise.all(promises).then(() => result);\n }\n\n\n getPageContent(url: string, customQueryParams?: UriParams): Promise {\n let options = {\n headers: this._getPagesRequestOptions()\n };\n\n if(this.services.miniOrbit.isEnabled) {\n url = url.replace(this.services.miniOrbit.currentMiniOrbitConfig.basePath, '/').replace('//', '/');\n }\n\n let uriParams = new UriParams('');\n\n uriParams.addParam('publicationid', this._publicationID.toString());\n uriParams.addParam('url', this._addSlashesInTheSides(url));\n\n if(customQueryParams) {\n customQueryParams.getAllParams().forEach(p => {\n if(!uriParams.hasParam(p.originalName)) {\n uriParams.addParam(p.originalName, p.value)\n }\n });\n }\n\n let cmsPageContentApiUrl = this.apiOrigin + '/api/pagecontent' + uriParams.toString();\n\n return this.services.http.get(cmsPageContentApiUrl, options);\n }\n\n private _404PageContent: CmsPageData | null = null;\n async get404PageContent() {\n if(this._404PageContent) {\n return this._404PageContent;\n }\n\n try {\n let data = await this.services.http.get(this.apiOrigin + '/api/pagecontent?publicationid=' + this._publicationID + '&url=error404.aspx');\n this._404PageContent = {\n title: null,\n location: null,\n content: data && data.content\n };\n\n return this._404PageContent;\n } catch (err) {\n this.services.logger.error(`Failed to get 404 page content!`, err);\n return {\n title: null,\n location: null,\n content: '
Something went wrong. Please try again.
'\n };\n }\n }\n\n private _getFallbackUrlFromConfig(): string {\n let configData = this.services.configuration.data;\n return configData && configData.generalSettings && configData.generalSettings.fallbackCMSComponentsPath;\n\n }\n\n\n private get _getBannersRequestUrl() {\n return this.apiOrigin + '/api/content/';\n }\n\n private _getBannersRequestParamsPOST(bannersIds: CmsBannerId[]): BodyInit {\n\n let params = this.services.http.createUrlSearchParams();\n params.append('publicationid', this._publicationID.toString());\n params.append('PagePlaceHoldersXML', 'PagePlaceholders_ValidKeyPagePlaceholders_ValidValue');\n\n for(let i = 0; i < bannersIds.length; i++) {\n let bannerId = bannersIds[i];\n\n params.append(`components[${i}][templateId]`, bannerId.templateID);\n params.append(`components[${i}][componentId]`, bannerId.componentID);\n\n\n }\n\n return params;\n }\n\n private _getBannersRequestParamsGET(bannersIds: CmsBannerId[]): string {\n\n const publicationid = this._publicationID.toString();\n const PagePlaceHoldersXML = encodeURIComponent('PagePlaceholders_ValidKeyPagePlaceholders_ValidValue');\n\n let queryParams = `?publicationId=${publicationid}&PagePlaceHoldersXML=${PagePlaceHoldersXML}&`;\n\n let componentsParams = [];\n for(let i = 0; i < bannersIds.length; i++) {\n let bannerId = bannersIds[i];\n\n componentsParams.push(`templateId=${bannerId.templateID}`);\n componentsParams.push(`componentId=${bannerId.componentID}`);\n }\n\n return queryParams + componentsParams.join('&');\n }\n\n private _getBannersRequestOptions(): HeadersInit {\n\n let headers = this.services.http.createHeaders();\n headers.append('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');\n return this.addXXContext(headers);\n }\n\n private _getPagesRequestOptions(): HeadersInit {\n\n let headers = this.services.http.createHeaders();\n return this.addXXContext(headers);\n }\n\n private _getSegmentesRequestOptions(): HeadersInit {\n let headers = this.services.http.createHeaders();\n return this.addXXContext(headers);\n }\n\n private addXXContext(headers: Headers): HeadersInit {\n\n let userSignature = this.services.sdk.getCmsUserSignature();\n if(!Check.isEmpty(userSignature)) {\n if(this.services.configuration.servicesConfigs.Skin.isSiteInfraAWS){\n headers.append('XX-Context', userSignature && userSignature.message);\n }else{\n headers.append('XX.Context', userSignature && userSignature.message);\n }\n }\n\n\n return headers;\n }\n\n async getSegments(): Promise {\n try {\n let options = {\n headers: this._getSegmentesRequestOptions()\n };\n return await this.services.http.get(`${this.apiOrigin}/api/segments`, options);\n }catch (err) {\n this.services.logger.error(`Failed to read segments from CMS API!`, err);\n return {};\n }\n }\n\n async getLanguageSwitcherConfiguration(url: string): Promise {\n try {\n return await this.services.http.get(`${this.apiOrigin}/api/languageswitcher?publicationid=${this._publicationID}&url=${this._addSlashesInTheSides(url)}`);\n } catch (err) {\n this.services.logger.error(`Failed to get language switcher configuration for page ${url}`, err);\n return null;\n }\n }\n\n private _isRouteToHtmlFile(pathName: string): boolean {\n return pathName.endsWith('.htm')\n || pathName.endsWith('.html');\n }\n\n\n private _addSlashesInTheSides(pathName) {\n if(pathName && pathName[0] !== '/') {\n pathName = '/' + pathName;\n }\n\n //we append the trailing slash if the path doesn't ends with slash and also the path doesn't ends with .html or .htm\n //we don't append the trailing slash for paths like /path/file.htm or /path/file.html\n if(pathName && !this._isRouteToHtmlFile(pathName) && pathName[pathName.length - 1] !== '/') {\n pathName = pathName + '/';\n }\n\n if(pathName) {\n return pathName;\n }\n\n return '/';\n }\n\n}\n","import React from 'react';\nimport {OrbitComponent} from '../../base-components/orbit-component/orbit-component';\nimport {CmsContentDecorator} from '../../../services/cms/cms-content-decorator/cms-content-decorator';\nimport {observer} from 'mobx-react';\nimport {CmsBannerId} from '../../../services/cms/cms-banners/cm-banner-id/cms-banner-id';\n\nexport interface BannerContentComponentProps {\n html: string;\n bannerId: CmsBannerId;\n}\n\nexport const BannerContentComponent = observer(\n class BannerContentComponent extends OrbitComponent {\n\n componentWillUnmount() {\n super.componentWillUnmount();\n this._disposeBannerContentDecorator();\n }\n\n componentDidUpdate() {\n this._redecorateBannerContent();\n }\n\n private _disposeBannerContentDecorator() {\n if(this._bannerContentDecorator) {\n this._bannerContentDecorator.dispose();\n this._bannerContentDecorator = null;\n }\n }\n\n private _redecorateBannerContent() {\n this._disposeBannerContentDecorator();\n if(this._bannerContentElementRef) {\n this._bannerContentElementRef.innerHTML = this.props.html;\n this._bannerContentDecorator = new CmsContentDecorator(this._bannerContentElementRef, this.services);\n }\n }\n\n private _bannerContentDecorator: CmsContentDecorator | null = null;\n\n private _bannerContentElementRef: HTMLSpanElement | null = null;\n\n private _captureBannerContentElementRef = (element: HTMLSpanElement | null) => {\n this._bannerContentElementRef = element;\n this._redecorateBannerContent();\n };\n\n render() {\n return ();\n }\n }\n);\n","import React from 'react';\nimport {BannerRenderProps, IBannerDefinition} from './banner-definition.interface';\nimport {BannerContentComponent} from '../../../../components/cms-banner/banner-content/banner-content.component';\nimport {CmsBannerId} from '../cm-banner-id/cms-banner-id';\n\n\nexport class BannerDefinition implements IBannerDefinition {\n constructor(public _html: string, private _bannerId: CmsBannerId) {\n }\n\n render(props: BannerRenderProps): React.ReactNode {\n return ();\n }\n}\n","import {ServiceBase} from '../../ServiceBase';\nimport {ICmsBannersService} from './cms-banners.service.interface';\nimport { action, observable, makeObservable } from 'mobx';\nimport {IBannerDefinition} from './banner-definition/banner-definition.interface';\nimport {IServiceFactoryExtended} from '../../service-factory-extended.interface';\nimport {CmsBannerId} from './cm-banner-id/cms-banner-id';\nimport {Check} from '@sparkware/app-utils';\nimport {BannerDefinition} from './banner-definition/banner-definition';\n\nimport {EmptyBannerDefinition} from './banner-definition/empty-banner-definition';\nimport {BannerData} from '../cms-api/cms-api.service.interface';\n\ntype ReadBannersResponse = Array<{id: CmsBannerId, definition: IBannerDefinition}>;\n\nexport class CmsBannersService extends ServiceBase implements ICmsBannersService {\n\n constructor(services: IServiceFactoryExtended) {\n super(services);\n\n makeObservable(this);\n\n this.reaction(\n () => this.services.user.isAuthorized,\n (isAuthorized) => {\n this._reloadBannersContent();\n }\n );\n }\n\n\n private _currentUsedBannersIds: {[key: string]: CmsBannerId} = {};\n\n @observable\n bannersMap: {[key: string]: IBannerDefinition} = {};\n\n async loadBanner(bannerId: CmsBannerId): Promise {\n if(!this.bannersMap[bannerId.key]) {\n let banners = await this._readBanners([bannerId]);\n this._setBanners(banners);\n }\n const hasBannerContent = Check.isObject(this.bannersMap[bannerId.key]);\n return hasBannerContent;\n }\n\n private _reloadBannersContent() {\n this._readBanners(Object.values(this._currentUsedBannersIds))\n .then(banners => {\n this._setBanners(banners);\n });\n }\n\n @action.bound\n private _setBanners(banners: ReadBannersResponse) {\n banners.forEach(newBanner => {\n this.bannersMap[newBanner.id.key] = newBanner.definition;\n this._currentUsedBannersIds[newBanner.id.key] = newBanner.id;\n });\n }\n\n private async _readBanners(bannersIds: CmsBannerId[]): Promise {\n let separatedBannersIds: {\n emptyBanners: CmsBannerId[];\n validBanners: CmsBannerId[];\n } = {\n emptyBanners: [],\n validBanners: []\n };\n\n bannersIds.reduce((acc, bId) => {\n if (bId.isValidCmsId()) {\n acc.validBanners.push(bId);\n } else {\n acc.emptyBanners.push(bId);\n }\n return acc;\n }, separatedBannersIds);\n\n let bannersIdsCollection = new BannersIdCollection(separatedBannersIds.validBanners);\n\n let bannersWithContent: ReadBannersResponse = [];\n if (separatedBannersIds.validBanners.length) {\n let cmsResponseData = await (await this.services.cmsApi).getBanners(separatedBannersIds.validBanners);\n //create definitions for bannersMap that we received some content\n bannersWithContent = this._extractBannersWithContent(bannersIdsCollection, cmsResponseData);\n }\n //for banners that we didn't receive any content try to load a default content and then merge the results\n let bannersIdsWithoutContent = bannersIdsCollection.exclude(bannersWithContent.map(bannerInfo => bannerInfo.id));\n\n let fallbackBanners = await this._readFallbackBanners([...separatedBannersIds.emptyBanners, ...bannersIdsWithoutContent]);\n\n return [...bannersWithContent, ...fallbackBanners];\n\n /*.catch((err) => {\n let msg = bannersIds.reduce((acc, curr) => acc + '\\n' + curr.toString(), '');\n this.services.logger.error(`Failed to load CMS banners for ${msg}`, err);\n return this._readFallbackBanners(bannersIds);\n });\n */\n }\n\n private _extractBannersWithContent(requestedBannersIdsCollection: BannersIdCollection, cmsResponseData: BannerData[]): ReadBannersResponse {\n if(!Check.isArray(cmsResponseData)) {\n return [];\n }\n\n return cmsResponseData\n .filter(bannerData => !Check.isEmpty(bannerData.Content))\n .map(bannerData => {\n let bannerId = requestedBannersIdsCollection.getOriginalBannerId(bannerData.ComponentId, bannerData.TemplateId);\n return {\n id: bannerId,\n definition: new BannerDefinition(bannerData.Content, bannerId)\n };\n });\n }\n\n private async _readFallbackBanners(bannersIds: CmsBannerId[]): Promise {\n if(bannersIds.length === 0) {\n return Promise.resolve([]);\n }\n // for bannersMap that have fallback file we try to read the default banner content and then merge with those without fallback file\n let bannersIdsWithFallbackFile = bannersIds.filter(id => !Check.isEmpty(id.fallbackFileName));\n let bannersIdsGroupedByFallbackFile = this._groupBannersIdsByFallbackFile(bannersIdsWithFallbackFile);\n let fileNames = Object.keys(bannersIdsGroupedByFallbackFile);\n\n\n let fallbackData = await (await this.services.cmsApi).getFallbackBanners(fileNames);\n\n let result: ReadBannersResponse = [];\n fileNames.forEach(file => {\n let bannerContent = fallbackData[file];\n if(bannerContent) {\n result = result.concat(this._createBannersDefinitionsWithContent(bannersIdsGroupedByFallbackFile[file], bannerContent));\n }\n });\n\n return result;\n }\n\n\n private _groupBannersIdsByFallbackFile(bannersIds: CmsBannerId[]): {[key: string]: CmsBannerId[]} {\n let result = {};\n bannersIds.forEach(bannerId => {\n if(!result[bannerId.fallbackFileName]) {\n result[bannerId.fallbackFileName] = [];\n }\n\n result[bannerId.fallbackFileName].push(bannerId);\n });\n\n return result;\n }\n\n private _createBannersDefinitionsWithContent(bannersIds: CmsBannerId[], bannerContent: string): ReadBannersResponse {\n return bannersIds.map(id => {\n let definition: IBannerDefinition;\n if(Check.isEmpty(bannerContent)) {\n definition = new EmptyBannerDefinition();\n } else {\n definition = new BannerDefinition(bannerContent, id);\n }\n\n return {id: id, definition: definition};\n });\n }\n}\n\n\nclass BannersIdCollection {\n\n private _originalBannersMap = {};\n\n constructor(private _originalBannersIds: CmsBannerId[]) {\n this._originalBannersIds.forEach(bannerId => {\n this._originalBannersMap[bannerId.key] = bannerId;\n });\n }\n\n getOriginalBannerId(componentId: number, templateId: number): CmsBannerId {\n for(let i = 0; i < this._originalBannersIds.length; i++) {\n let bannerId = this._originalBannersIds[i];\n if(bannerId.isMatch(componentId, templateId)) {\n return bannerId;\n }\n }\n \n throw new Error(`Cant't find original banner id for componentId=${componentId} and templateId=${templateId}`);\n }\n\n exclude(bannersIdsToExclude: CmsBannerId[]): CmsBannerId[] {\n let bannersIdsToExcludeMap = {};\n bannersIdsToExclude.forEach(bannerId => bannersIdsToExcludeMap[bannerId.key] = bannerId);\n\n return this._originalBannersIds.filter(bannerId => !bannersIdsToExcludeMap[bannerId.key]);\n }\n}\n","import {ServiceBase} from '../../ServiceBase';\nimport {ICmsPagesService} from './cms-pages.service.interface';\nimport {\n ICmsPageDefinition,\n ICmsPageDefinitionHeadTags,\n IInjectedHeadTag\n} from './page-definition/cms-page-definition.interface';\nimport { action, observable, makeObservable } from 'mobx';\nimport {IServiceFactoryExtended} from '../../service-factory-extended.interface';\nimport {CmsPageData} from '../cms-api/cms-api.service.interface';\nimport {Uri} from '../../location/uri/uri';\nimport {Check} from \"@sparkware/app-utils\";\nimport {UriPath} from \"../../location/uri-path/uri-path\";\nimport {UriParams} from \"../../location/uri-params/uri-params\";\n\nexport const LOAD_CONTENT_FROM_DIV_PAGE_DELAY = 250;\n\nexport class CmsPagesService extends ServiceBase implements ICmsPagesService {\n\n constructor(services: IServiceFactoryExtended) {\n super(services);\n\n makeObservable(this);\n\n this.reaction(\n () => this.services.location.currentUri,\n (uri) => this._loadCmsPage(uri),\n { fireImmediately: true }\n );\n\n this.reaction(\n () => this.services.user.isAuthorized,\n () => this._reloadCurrentPageContent(),\n { fireImmediately: true }\n );\n }\n\n private _currentUri: Uri | null = null;\n private _isFirstLoad = true;\n\n @observable.ref\n currentPage: ICmsPageDefinition | null = null;\n injectedPageMetaTags: IInjectedHeadTag[] = [];\n\n @action.bound\n private _setCurrentPage(pageDefinition: ICmsPageDefinition | null) {\n this.currentPage = pageDefinition;\n }\n\n private setCurrentPageMetaTags(headerTags: ICmsPageDefinitionHeadTags[]){\n\n const prepareElementSelector = (elementType:string, attributes = {}) => {\n const attributesQuery = Object.keys(attributes).reduce((query, attributeName) => {\n if(!Check.isString(attributes[attributeName]) || attributeName === 'tag')\n return query;\n\n return query + `[${attributeName}=\"${attributes[attributeName]}\"]`;\n }, '');\n\n return elementType + attributesQuery;\n }\n\n const setElementAttributes = (element, attributes = {}) => {\n Object.keys(attributes).forEach(attributeName => {\n if(attributeName !== 'tag')\n element.setAttribute(attributeName, attributes[attributeName]);\n });\n }\n\n const addMetaTags = (headerTags: ICmsPageDefinitionHeadTags[]) => {\n headerTags.forEach(headerTag => {\n const {tag, content, href, ...rest} = headerTag;\n try {\n if(tag){\n let metaTag = this.services.dom.querySelector(prepareElementSelector(tag, rest)) as HTMLElement;\n const injectedPageMetaTagPreviousElement = metaTag;\n\n if(!metaTag){\n metaTag = this.services.dom.createElement(tag);\n this.services.dom.head.appendChild(metaTag);\n }\n\n this.injectedPageMetaTags.push({element: metaTag, previous: injectedPageMetaTagPreviousElement ? (injectedPageMetaTagPreviousElement.cloneNode() as HTMLElement) : undefined});\n setElementAttributes(metaTag, headerTag);\n }\n }catch (err){\n this.services.logger.error(`Failed to add metaTag: ${tag}`, err);\n }\n\n })\n }\n\n const removeMetaTags = (injectedMetaTags: IInjectedHeadTag[]) => {\n (injectedMetaTags || []).forEach(({element, previous}) => {\n if(previous){\n element.parentNode?.replaceChild(previous, element);\n }else{\n element.remove();\n }\n });\n }\n\n /**\n * To have more meta tags allowed to be injected from pageContent, add an other Regex here\n */\n const allowedTags = '(link.*(?:\\\\[rel=\"canonical\"]))|' +\n '(meta.*(?:\\\\[property=\"og:updated_time\"]))|' +\n '(meta.*(?:\\\\[property=\"og:description\"]))|' +\n '(meta.*(?:\\\\[property=\"og:url\"]))|' +\n '(meta.*(?:\\\\[name=\"og:title\"]))|' +\n '(meta.*(?:\\\\[name=\"description\"]))'\n ;\n\n const metaTags = (headerTags || []).filter(({tag,content, ...rest}) => {\n const testIfTagAllowedRegex = new RegExp(allowedTags, 'i');\n return testIfTagAllowedRegex.test(prepareElementSelector(tag, rest));\n });\n\n if(this.injectedPageMetaTags.length > 0){\n removeMetaTags(this.injectedPageMetaTags);\n this.injectedPageMetaTags = [];\n }\n\n addMetaTags(metaTags);\n }\n\n\n private async _reloadCurrentPageContent(): Promise {\n if(this.currentPage) {\n this._currentUri = null;\n try {\n await this._loadCmsPage(this.services.location.currentUri);\n } catch (err) {\n this.services.logger.error(`Failed to reload CMS page ${this.currentPage.url}`, err);\n }\n }\n }\n\n\n private async _loadCmsPage(uri: Uri): Promise {\n\n if(this._currentUri && this._currentUri.pathName && uri.pathName.equals(this._currentUri.pathName)) {\n return;\n }\n\n this._currentUri = uri;\n\n let pageElement = this.services.dom.getElementById('page');\n if(this._isFirstLoad && pageElement && !this.services.routing.isOrbitRoute(uri.pathName)) {\n this._isFirstLoad = false;\n if(this.services.user.isAuthorized){\n //In case the user is login we must call the API and not use the DOM page since b2c need to get the XX.context to return the right segments,\n //But we must clean the #page div content to avoid duplicate b2c content on the page\n pageElement.remove();\n await this._loadPageContentWithSpinner(uri);\n } else{\n this._loadPageContentFromDOM(pageElement, uri);\n }\n\n } else {\n this._isFirstLoad = false;\n await this._loadPageContentWithSpinner(uri);\n }\n }\n\n\n private async _loadPageContentWithSpinner(uri: Uri): Promise {\n const isB2CRoute = !this.services.routing.isOrbitRoute(uri.pathName);\n if(isB2CRoute) {\n this.services.spinner.startSpinner();\n }\n\n try {\n await this._loadCmsPageFromApi(uri)\n } finally {\n if(isB2CRoute) {\n this.services.spinner.stopSpinner();\n }\n }\n\n }\n\n private _loadPageContentFromDOM(pageElement: HTMLElement, uri: Uri): void {\n // we introduced this delay because if some of the scripts in the innerHTML contains a