From 096575cd896dd8213ac5354f416961c81a070edf Mon Sep 17 00:00:00 2001 From: Eric Chen <159481679+echen-adobe@users.noreply.github.com> Date: Fri, 3 Apr 2026 11:32:48 -0500 Subject: [PATCH 1/8] init --- express/code/libs/features/google-login.js | 58 ++++++++++++++++++++++ express/code/scripts/express-delayed.js | 17 ++++++- 2 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 express/code/libs/features/google-login.js diff --git a/express/code/libs/features/google-login.js b/express/code/libs/features/google-login.js new file mode 100644 index 000000000..a1ffa478a --- /dev/null +++ b/express/code/libs/features/google-login.js @@ -0,0 +1,58 @@ +const GOOGLE_SCRIPT = 'https://accounts.google.com/gsi/client'; +const GOOGLE_ID = '530526366930-l874a90ipfkn26naa71r010u8epp39jt.apps.googleusercontent.com'; +const PLACEHOLDER = 'feds-googleLogin'; +const WRAPPER = 'feds-profile'; + +const onToken = async (getMetadata, data, getConfig) => { + let destination; + const config = getConfig(); + const acceptedTouList = getMetadata('google-login-accepted-tou-list')?.trim(); + try { + destination = new URL(typeof config.googleLoginURLCallback === 'function' ? await config.googleLoginURLCallback() + : getMetadata('google-login-redirect'))?.href; + } catch { + // Do nothing + } + + await window.adobeIMS.socialHeadlessSignIn({ + provider_id: 'google', + idp_token: data?.credential, + client_id: window.adobeid?.client_id, + scope: window.adobeid?.scope, + accepted_tou_list: acceptedTouList || '', + }).then(() => { + if (window.DISABLE_PAGE_RELOAD === true) return; + // Existing account + if (destination) { + window.location.assign(destination); + } else { + window.location.reload(); + } + }).catch(() => { + // New account + window.adobeIMS.signInWithSocialProvider('google', { redirect_uri: destination || window.location.href }); + }); +}; + +export default async function initGoogleLogin(loadIms, getMetadata, loadScript, getConfig) { + try { + await loadIms(); + } catch { + return; + } + if (window.adobeIMS?.isSignedInUser()) return; + + await loadScript(GOOGLE_SCRIPT); + const placeholder = document.createElement('div'); + placeholder.id = PLACEHOLDER; + document.querySelector(`.${WRAPPER}`)?.append(placeholder); + + window.google?.accounts?.id?.initialize({ + client_id: GOOGLE_ID, + callback: (data) => onToken(getMetadata, data, getConfig), + prompt_parent_id: PLACEHOLDER, + cancel_on_tap_outside: false, + auto_select: getMetadata('google-yolo-zero-tap')?.toLowerCase() === 'on', + }); + window.google?.accounts?.id?.prompt(); +} diff --git a/express/code/scripts/express-delayed.js b/express/code/scripts/express-delayed.js index cda9a8dd4..0b6172590 100644 --- a/express/code/scripts/express-delayed.js +++ b/express/code/scripts/express-delayed.js @@ -3,6 +3,8 @@ import BlockMediator from './block-mediator.min.js'; let createTag; let getMetadata; let getConfig; let loadStyle; +let loadIMS; let loadScript; + export function getDestination() { const pepDestinationMeta = getMetadata('pep-destination'); return pepDestinationMeta || BlockMediator.get('primaryCtaUrl') @@ -63,20 +65,33 @@ async function addJapaneseSectionHeaderSizing() { } } +async function loadGoogleLogin() { + const googleLogin = getMetadata('google-login')?.toLowerCase(); + if (window.adobeIMS?.isSignedInUser() || !['mobile', 'desktop', 'on'].includes(googleLogin)) return; + const desktopViewport = window.matchMedia('(min-width: 900px)').matches; + if (googleLogin === 'mobile' && desktopViewport) return; + if (googleLogin === 'desktop' && !desktopViewport) return; + + const { default: initGoogleLogin } = await import('../libs/features/google-login.js'); + initGoogleLogin(loadIMS, getMetadata, loadScript, getConfig); +}; + /** * Executes everything that happens a lot later, without impacting the user experience. */ export default async function loadDelayed() { try { await Promise.all([import(`${getLibs()}/utils/utils.js`)]).then(([utils]) => { - ({ createTag, getMetadata, getConfig, loadStyle } = utils); + ({ createTag, getMetadata, getConfig, loadStyle, loadIMS, loadScript } = utils); }); addJapaneseSectionHeaderSizing(); turnContentLinksIntoButtons(); preloadSUSILight(); + loadGoogleLogin(); return null; } catch (error) { window.lana?.log(`Express-Delayed Error: ${error?.message || error?.detail || error}`, { tags: 'express-delayed', severity: 'error' }); return null; } } + From d143cf0c9e1fc089471cf8b27a80e703de516c7d Mon Sep 17 00:00:00 2001 From: Eric Chen <159481679+echen-adobe@users.noreply.github.com> Date: Fri, 3 Apr 2026 11:38:16 -0500 Subject: [PATCH 2/8] Update google-login.js --- express/code/libs/features/google-login.js | 1 + 1 file changed, 1 insertion(+) diff --git a/express/code/libs/features/google-login.js b/express/code/libs/features/google-login.js index a1ffa478a..4f0f81cc5 100644 --- a/express/code/libs/features/google-login.js +++ b/express/code/libs/features/google-login.js @@ -35,6 +35,7 @@ const onToken = async (getMetadata, data, getConfig) => { }; export default async function initGoogleLogin(loadIms, getMetadata, loadScript, getConfig) { + console.log('[local] initGoogleLogin called'); try { await loadIms(); } catch { From 7db41dcd025bbb9db5cfe280aadb284671326574 Mon Sep 17 00:00:00 2001 From: Eric Chen <159481679+echen-adobe@users.noreply.github.com> Date: Mon, 6 Apr 2026 11:57:41 -0500 Subject: [PATCH 3/8] Update google-login.js --- express/code/libs/features/google-login.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/express/code/libs/features/google-login.js b/express/code/libs/features/google-login.js index 4f0f81cc5..0318b96f9 100644 --- a/express/code/libs/features/google-login.js +++ b/express/code/libs/features/google-login.js @@ -38,7 +38,8 @@ export default async function initGoogleLogin(loadIms, getMetadata, loadScript, console.log('[local] initGoogleLogin called'); try { await loadIms(); - } catch { + } catch (error) { + console.error('[local] error loading IMS', error); return; } if (window.adobeIMS?.isSignedInUser()) return; From 84fb84f622802d33d02680b6e01b174ca7b73b20 Mon Sep 17 00:00:00 2001 From: Eric Chen <159481679+echen-adobe@users.noreply.github.com> Date: Mon, 6 Apr 2026 11:59:52 -0500 Subject: [PATCH 4/8] Update express-delayed.js --- express/code/scripts/express-delayed.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/express/code/scripts/express-delayed.js b/express/code/scripts/express-delayed.js index 0b6172590..f0a731bac 100644 --- a/express/code/scripts/express-delayed.js +++ b/express/code/scripts/express-delayed.js @@ -3,7 +3,7 @@ import BlockMediator from './block-mediator.min.js'; let createTag; let getMetadata; let getConfig; let loadStyle; -let loadIMS; let loadScript; +let loadIms; let loadScript; export function getDestination() { const pepDestinationMeta = getMetadata('pep-destination'); @@ -73,7 +73,7 @@ async function loadGoogleLogin() { if (googleLogin === 'desktop' && !desktopViewport) return; const { default: initGoogleLogin } = await import('../libs/features/google-login.js'); - initGoogleLogin(loadIMS, getMetadata, loadScript, getConfig); + initGoogleLogin(loadIms, getMetadata, loadScript, getConfig); }; /** @@ -82,7 +82,7 @@ async function loadGoogleLogin() { export default async function loadDelayed() { try { await Promise.all([import(`${getLibs()}/utils/utils.js`)]).then(([utils]) => { - ({ createTag, getMetadata, getConfig, loadStyle, loadIMS, loadScript } = utils); + ({ createTag, getMetadata, getConfig, loadStyle, loadScript, loadIms } = utils); }); addJapaneseSectionHeaderSizing(); turnContentLinksIntoButtons(); From 2c38c87404cd3e82ab3993e912196efbe8e0d7bf Mon Sep 17 00:00:00 2001 From: Eric Chen <159481679+echen-adobe@users.noreply.github.com> Date: Tue, 7 Apr 2026 13:53:14 -0500 Subject: [PATCH 5/8] getting redirect link --- express/code/libs/features/google-login.js | 10 ++++------ express/code/scripts/express-delayed.js | 5 +++-- express/code/scripts/scripts.js | 2 -- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/express/code/libs/features/google-login.js b/express/code/libs/features/google-login.js index 0318b96f9..ffdf340e9 100644 --- a/express/code/libs/features/google-login.js +++ b/express/code/libs/features/google-login.js @@ -3,13 +3,11 @@ const GOOGLE_ID = '530526366930-l874a90ipfkn26naa71r010u8epp39jt.apps.googleuser const PLACEHOLDER = 'feds-googleLogin'; const WRAPPER = 'feds-profile'; -const onToken = async (getMetadata, data, getConfig) => { +const onToken = async (getMetadata, data) => { let destination; - const config = getConfig(); const acceptedTouList = getMetadata('google-login-accepted-tou-list')?.trim(); try { - destination = new URL(typeof config.googleLoginURLCallback === 'function' ? await config.googleLoginURLCallback() - : getMetadata('google-login-redirect'))?.href; + destination = new URL(getMetadata('google-login-redirect'))?.href; } catch { // Do nothing } @@ -34,7 +32,7 @@ const onToken = async (getMetadata, data, getConfig) => { }); }; -export default async function initGoogleLogin(loadIms, getMetadata, loadScript, getConfig) { +export default async function initGoogleLogin(loadIms, getMetadata, loadScript) { console.log('[local] initGoogleLogin called'); try { await loadIms(); @@ -51,7 +49,7 @@ export default async function initGoogleLogin(loadIms, getMetadata, loadScript, window.google?.accounts?.id?.initialize({ client_id: GOOGLE_ID, - callback: (data) => onToken(getMetadata, data, getConfig), + callback: (data) => onToken(getMetadata, data), prompt_parent_id: PLACEHOLDER, cancel_on_tap_outside: false, auto_select: getMetadata('google-yolo-zero-tap')?.toLowerCase() === 'on', diff --git a/express/code/scripts/express-delayed.js b/express/code/scripts/express-delayed.js index f0a731bac..73869c818 100644 --- a/express/code/scripts/express-delayed.js +++ b/express/code/scripts/express-delayed.js @@ -71,9 +71,10 @@ async function loadGoogleLogin() { const desktopViewport = window.matchMedia('(min-width: 900px)').matches; if (googleLogin === 'mobile' && desktopViewport) return; if (googleLogin === 'desktop' && !desktopViewport) return; - + console.log('[google-login] redirect:', getConfig().googleLoginURLCallback()); + console.log('[google-login] redirect:', getMetadata('google-login-redirect')); const { default: initGoogleLogin } = await import('../libs/features/google-login.js'); - initGoogleLogin(loadIms, getMetadata, loadScript, getConfig); + initGoogleLogin(loadIms, getMetadata, loadScript); }; /** diff --git a/express/code/scripts/scripts.js b/express/code/scripts/scripts.js index 133c4a0d8..88071de5e 100644 --- a/express/code/scripts/scripts.js +++ b/express/code/scripts/scripts.js @@ -16,7 +16,6 @@ import { decorateArea, getMetadata, preDecorateSections, - getRedirectUri, getIconElementDeprecated, } from './utils.js'; @@ -97,7 +96,6 @@ const CONFIG = { 'eb0dcb78-3e56-4b10-89f9-51831f2cc37f': 'express-pep', }, links: 'on', - googleLoginURLCallback: getRedirectUri, autoBlocks: [ { axfaas: '/tools/axfaas' }, ], From 6ff77a52f5a5eb4b0ca410187388a7b9566ec348 Mon Sep 17 00:00:00 2001 From: Eric Chen <159481679+echen-adobe@users.noreply.github.com> Date: Thu, 9 Apr 2026 14:34:20 -0500 Subject: [PATCH 6/8] Update express-delayed.js --- express/code/scripts/express-delayed.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/express/code/scripts/express-delayed.js b/express/code/scripts/express-delayed.js index 73869c818..b8d541c0b 100644 --- a/express/code/scripts/express-delayed.js +++ b/express/code/scripts/express-delayed.js @@ -71,8 +71,8 @@ async function loadGoogleLogin() { const desktopViewport = window.matchMedia('(min-width: 900px)').matches; if (googleLogin === 'mobile' && desktopViewport) return; if (googleLogin === 'desktop' && !desktopViewport) return; - console.log('[google-login] redirect:', getConfig().googleLoginURLCallback()); - console.log('[google-login] redirect:', getMetadata('google-login-redirect')); + // console.log('[google-login] redirect:', getConfig().googleLoginURLCallback()); + // console.log('[google-login] redirect:', getMetadata('google-login-redirect')); const { default: initGoogleLogin } = await import('../libs/features/google-login.js'); initGoogleLogin(loadIms, getMetadata, loadScript); }; From ce2706a0e2a7aa89b2e679bf9e454f297c3e6788 Mon Sep 17 00:00:00 2001 From: Eric Chen <159481679+echen-adobe@users.noreply.github.com> Date: Thu, 9 Apr 2026 15:31:26 -0500 Subject: [PATCH 7/8] Update scripts.js --- express/code/scripts/scripts.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/express/code/scripts/scripts.js b/express/code/scripts/scripts.js index 88071de5e..1e2f43f00 100644 --- a/express/code/scripts/scripts.js +++ b/express/code/scripts/scripts.js @@ -361,10 +361,6 @@ async function loadPage() { const adobeHomeRedirect = createTag('meta', { name: 'adobe-home-redirect', content: 'on' }); document.head.append(adobeHomeRedirect); - const googleLoginRedirect = createTag('meta', { name: 'google-login', content: 'desktop' }); - document.head.append(googleLoginRedirect); - // end TODO remove metadata after we go live - const config = setConfig({ ...CONFIG, miloLibs }); if (getMetadata('template-search-page') === 'Y') { @@ -417,6 +413,9 @@ async function loadPage() { await loadArea(); + // Set after loadArea so milo's delayed doesn't pick it up — express-delayed owns google login + document.head.append(createTag('meta', { name: 'google-login', content: 'desktop' })); + const { fixIcons } = await import('./utils.js'); document.querySelectorAll('.section>.text').forEach((block) => fixIcons(block)); From 688bad00b7821cf85c08e190c041617c95ff781f Mon Sep 17 00:00:00 2001 From: Eric Chen <159481679+echen-adobe@users.noreply.github.com> Date: Fri, 10 Apr 2026 15:38:15 -0500 Subject: [PATCH 8/8] restore config --- express/code/libs/features/google-login.js | 16 +++++++--------- express/code/scripts/express-delayed.js | 4 +--- express/code/scripts/scripts.js | 2 ++ 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/express/code/libs/features/google-login.js b/express/code/libs/features/google-login.js index ffdf340e9..604129314 100644 --- a/express/code/libs/features/google-login.js +++ b/express/code/libs/features/google-login.js @@ -3,13 +3,13 @@ const GOOGLE_ID = '530526366930-l874a90ipfkn26naa71r010u8epp39jt.apps.googleuser const PLACEHOLDER = 'feds-googleLogin'; const WRAPPER = 'feds-profile'; -const onToken = async (getMetadata, data) => { - let destination; +const onToken = async (getMetadata, getConfig, data) => { const acceptedTouList = getMetadata('google-login-accepted-tou-list')?.trim(); + let destination; try { - destination = new URL(getMetadata('google-login-redirect'))?.href; + destination = new URL(getMetadata('google-login-redirect'))?.href || await getConfig()?.googleLoginURLCallback?.() ; } catch { - // Do nothing + window.lana?.log('[local] error parsing google-login-redirect', getMetadata('google-login-redirect'), { tags: 'google-login', severity: 'error' }); } await window.adobeIMS.socialHeadlessSignIn({ @@ -32,12 +32,10 @@ const onToken = async (getMetadata, data) => { }); }; -export default async function initGoogleLogin(loadIms, getMetadata, loadScript) { - console.log('[local] initGoogleLogin called'); +export default async function initGoogleLogin(loadIms, getMetadata, loadScript, getConfig) { try { await loadIms(); - } catch (error) { - console.error('[local] error loading IMS', error); + } catch { return; } if (window.adobeIMS?.isSignedInUser()) return; @@ -49,7 +47,7 @@ export default async function initGoogleLogin(loadIms, getMetadata, loadScript) window.google?.accounts?.id?.initialize({ client_id: GOOGLE_ID, - callback: (data) => onToken(getMetadata, data), + callback: (data) => onToken(getMetadata, getConfig, data), prompt_parent_id: PLACEHOLDER, cancel_on_tap_outside: false, auto_select: getMetadata('google-yolo-zero-tap')?.toLowerCase() === 'on', diff --git a/express/code/scripts/express-delayed.js b/express/code/scripts/express-delayed.js index b8d541c0b..35d4eb1bf 100644 --- a/express/code/scripts/express-delayed.js +++ b/express/code/scripts/express-delayed.js @@ -71,10 +71,8 @@ async function loadGoogleLogin() { const desktopViewport = window.matchMedia('(min-width: 900px)').matches; if (googleLogin === 'mobile' && desktopViewport) return; if (googleLogin === 'desktop' && !desktopViewport) return; - // console.log('[google-login] redirect:', getConfig().googleLoginURLCallback()); - // console.log('[google-login] redirect:', getMetadata('google-login-redirect')); const { default: initGoogleLogin } = await import('../libs/features/google-login.js'); - initGoogleLogin(loadIms, getMetadata, loadScript); + initGoogleLogin(loadIms, getMetadata, loadScript, getConfig); }; /** diff --git a/express/code/scripts/scripts.js b/express/code/scripts/scripts.js index 1e2f43f00..0db301db4 100644 --- a/express/code/scripts/scripts.js +++ b/express/code/scripts/scripts.js @@ -16,6 +16,7 @@ import { decorateArea, getMetadata, preDecorateSections, + getRedirectUri, getIconElementDeprecated, } from './utils.js'; @@ -96,6 +97,7 @@ const CONFIG = { 'eb0dcb78-3e56-4b10-89f9-51831f2cc37f': 'express-pep', }, links: 'on', + googleLoginURLCallback: getRedirectUri, autoBlocks: [ { axfaas: '/tools/axfaas' }, ],