{"version":3,"file":"static/js/services-group1.690eccad.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 if(!this.services.user.isAuthorized) {\n await this.services.sdk.waitForAnonymousAbTestingData();\n }\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 try {\n let pageElement = this.services.dom.getElementById('page');\n if(this._isFirstLoad && pageElement && !this.services.routing.isOrbitRoute(uri.pathName)) {\n\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 await this._loadPageContentWithSpinner(uri);\n }\n } finally {\n this._isFirstLoad = false;\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