diff --git a/dist/chromium/background.js b/dist/chromium/background.js index a137362..54a6197 100644 --- a/dist/chromium/background.js +++ b/dist/chromium/background.js @@ -757,8 +757,8 @@ function createAuthConsumerSession({ if (restarted) restartedDocument = documentId; } } else if (page?.status === "ready" && documentId) { - // Confirm a stable, fully loaded document, not a transient SAML page. - await wait(500); + // Confirm the parsed application document without waiting for visual assets. + await wait(100); let confirmed; try { confirmed = await inspectPage(tab); } catch { /* A redirect started during validation. */ } if (confirmed?.status === "ready" && confirmed.documentId === documentId && !state?.failedStatus) { @@ -1553,7 +1553,7 @@ function createFusionSrDetails({ fetchJson, tabsCreate, tabsRemove, supportsFire let session = sessions.get(key); if (!session) { const details = { - url: "https://comcipapic-oalprod.integration.ocp.oraclecloud.com/ic/builder/rt/oalset_semc/live/webApps/Dashboard/?page=shell&shell=main&main=manageresourcerequests", + url: "https://comcipapic-oalprod.integration.ocp.oraclecloud.com/ic/builder/rt/SeaaS_initiation/live/webApps/external/", active: false }; if (Number.isInteger(sender?.tab?.windowId)) details.windowId = sender.tab.windowId; diff --git a/dist/chromium/manifest.json b/dist/chromium/manifest.json index 1f4ed40..bb07527 100644 --- a/dist/chromium/manifest.json +++ b/dist/chromium/manifest.json @@ -34,7 +34,7 @@ "spa-page.js" ], "all_frames": false, - "run_at": "document_idle" + "run_at": "document_end" } ], "background": { diff --git a/dist/chromium/spa-page.js b/dist/chromium/spa-page.js index 37c0ef4..6ebd8c2 100644 --- a/dist/chromium/spa-page.js +++ b/dist/chromium/spa-page.js @@ -16,7 +16,7 @@ function createSpaPage() { else if (/^\/(?:cloudgate|login|signin|sso|oauth)(?:\/|$)/i.test(location.pathname) || /\b(?:sign(?:ing)? in|log in|single sign.on|oracle access manager)\b/i.test(document.title) || document.querySelector('input[name="SAMLResponse"], input[name="SAMLRequest"], input[type="password"], form[action*="/sso"], form[action*="/login"], meta[http-equiv="refresh" i]')) status = "login"; - else if (document.readyState === "complete" && text + else if ((document.readyState === "interactive" || document.readyState === "complete") && text && document.querySelector('a[href], button, input, [role="main"], main, nav')) status = "ready"; return { status, documentId }; } diff --git a/dist/firefox/background.js b/dist/firefox/background.js index a137362..54a6197 100644 --- a/dist/firefox/background.js +++ b/dist/firefox/background.js @@ -757,8 +757,8 @@ function createAuthConsumerSession({ if (restarted) restartedDocument = documentId; } } else if (page?.status === "ready" && documentId) { - // Confirm a stable, fully loaded document, not a transient SAML page. - await wait(500); + // Confirm the parsed application document without waiting for visual assets. + await wait(100); let confirmed; try { confirmed = await inspectPage(tab); } catch { /* A redirect started during validation. */ } if (confirmed?.status === "ready" && confirmed.documentId === documentId && !state?.failedStatus) { @@ -1553,7 +1553,7 @@ function createFusionSrDetails({ fetchJson, tabsCreate, tabsRemove, supportsFire let session = sessions.get(key); if (!session) { const details = { - url: "https://comcipapic-oalprod.integration.ocp.oraclecloud.com/ic/builder/rt/oalset_semc/live/webApps/Dashboard/?page=shell&shell=main&main=manageresourcerequests", + url: "https://comcipapic-oalprod.integration.ocp.oraclecloud.com/ic/builder/rt/SeaaS_initiation/live/webApps/external/", active: false }; if (Number.isInteger(sender?.tab?.windowId)) details.windowId = sender.tab.windowId; diff --git a/dist/firefox/manifest.json b/dist/firefox/manifest.json index e11ccb3..85f99db 100644 --- a/dist/firefox/manifest.json +++ b/dist/firefox/manifest.json @@ -34,7 +34,7 @@ "spa-page.js" ], "all_frames": false, - "run_at": "document_idle" + "run_at": "document_end" } ], "background": { diff --git a/dist/firefox/spa-page.js b/dist/firefox/spa-page.js index 37c0ef4..6ebd8c2 100644 --- a/dist/firefox/spa-page.js +++ b/dist/firefox/spa-page.js @@ -16,7 +16,7 @@ function createSpaPage() { else if (/^\/(?:cloudgate|login|signin|sso|oauth)(?:\/|$)/i.test(location.pathname) || /\b(?:sign(?:ing)? in|log in|single sign.on|oracle access manager)\b/i.test(document.title) || document.querySelector('input[name="SAMLResponse"], input[name="SAMLRequest"], input[type="password"], form[action*="/sso"], form[action*="/login"], meta[http-equiv="refresh" i]')) status = "login"; - else if (document.readyState === "complete" && text + else if ((document.readyState === "interactive" || document.readyState === "complete") && text && document.querySelector('a[href], button, input, [role="main"], main, nav')) status = "ready"; return { status, documentId }; } diff --git a/scripts/build.mjs b/scripts/build.mjs index b3d97be..03e566d 100644 --- a/scripts/build.mjs +++ b/scripts/build.mjs @@ -41,7 +41,7 @@ const baseManifest = { matches: ["https://spa.oracle.com/*"], js: ["spa-page.js"], all_frames: false, - run_at: "document_idle" + run_at: "document_end" } ] }; diff --git a/src/auth/consumer-session.js b/src/auth/consumer-session.js index 806893d..a724edc 100644 --- a/src/auth/consumer-session.js +++ b/src/auth/consumer-session.js @@ -334,8 +334,8 @@ function createAuthConsumerSession({ if (restarted) restartedDocument = documentId; } } else if (page?.status === "ready" && documentId) { - // Confirm a stable, fully loaded document, not a transient SAML page. - await wait(500); + // Confirm the parsed application document without waiting for visual assets. + await wait(100); let confirmed; try { confirmed = await inspectPage(tab); } catch { /* A redirect started during validation. */ } if (confirmed?.status === "ready" && confirmed.documentId === documentId && !state?.failedStatus) { diff --git a/src/auth/spa-page.js b/src/auth/spa-page.js index 3f38351..f24b6f4 100644 --- a/src/auth/spa-page.js +++ b/src/auth/spa-page.js @@ -13,7 +13,7 @@ function createSpaPage() { else if (/^\/(?:cloudgate|login|signin|sso|oauth)(?:\/|$)/i.test(location.pathname) || /\b(?:sign(?:ing)? in|log in|single sign.on|oracle access manager)\b/i.test(document.title) || document.querySelector('input[name="SAMLResponse"], input[name="SAMLRequest"], input[type="password"], form[action*="/sso"], form[action*="/login"], meta[http-equiv="refresh" i]')) status = "login"; - else if (document.readyState === "complete" && text + else if ((document.readyState === "interactive" || document.readyState === "complete") && text && document.querySelector('a[href], button, input, [role="main"], main, nav')) status = "ready"; return { status, documentId }; } diff --git a/src/services/fusion/sr-details.js b/src/services/fusion/sr-details.js index ea7cb8a..c392b45 100644 --- a/src/services/fusion/sr-details.js +++ b/src/services/fusion/sr-details.js @@ -85,7 +85,7 @@ function createFusionSrDetails({ fetchJson, tabsCreate, tabsRemove, supportsFire let session = sessions.get(key); if (!session) { const details = { - url: "https://comcipapic-oalprod.integration.ocp.oraclecloud.com/ic/builder/rt/oalset_semc/live/webApps/Dashboard/?page=shell&shell=main&main=manageresourcerequests", + url: "https://comcipapic-oalprod.integration.ocp.oraclecloud.com/ic/builder/rt/SeaaS_initiation/live/webApps/external/", active: false }; if (Number.isInteger(sender?.tab?.windowId)) details.windowId = sender.tab.windowId; diff --git a/tests/characterization.test.cjs b/tests/characterization.test.cjs index abf20d6..0880aaf 100644 --- a/tests/characterization.test.cjs +++ b/tests/characterization.test.cjs @@ -46,7 +46,7 @@ test("distribution contracts: manifests, execution boundaries and deterministic matches: ["https://eeho.fa.us2.oraclecloud.com/hcmUI/faces/FuseWelcome*", "https://eeho.fa.us2.oraclecloud.com/fscmUI/faces/FuseWelcome*"], js: ["content.js"], all_frames: true, run_at: "document_idle" }, { - matches: ["https://spa.oracle.com/*"], js: ["spa-page.js"], all_frames: false, run_at: "document_idle" + matches: ["https://spa.oracle.com/*"], js: ["spa-page.js"], all_frames: false, run_at: "document_end" }] }; for (const target of ["chromium", "firefox"]) { diff --git a/tests/crmSrDetails.test.cjs b/tests/crmSrDetails.test.cjs index bdadeab..f4d84aa 100644 --- a/tests/crmSrDetails.test.cjs +++ b/tests/crmSrDetails.test.cjs @@ -74,7 +74,7 @@ test("preparation closes immediately on the second cookie event even while getAl assert.equal(listeners.size, 0); }); -test("explicit preparation opens resource requests Dashboard and observes cookies without any API requests", async () => { +test("explicit preparation opens SeaaS initiation and observes cookies without any API requests", async () => { let calls = 0; let reads = 0; const domain = "comcipapic-oalprod.integration.ocp.oraclecloud.com"; @@ -97,7 +97,7 @@ test("explicit preparation opens resource requests Dashboard and observes cookie assert.deepEqual(result.debugRequests, []); assert.ok(!JSON.stringify(result).includes("secret")); assert.equal(h.tabs[0].active, false); - assert.equal(h.tabs[0].url, "https://comcipapic-oalprod.integration.ocp.oraclecloud.com/ic/builder/rt/oalset_semc/live/webApps/Dashboard/?page=shell&shell=main&main=manageresourcerequests"); + assert.equal(h.tabs[0].url, "https://comcipapic-oalprod.integration.ocp.oraclecloud.com/ic/builder/rt/SeaaS_initiation/live/webApps/external/"); assert.deepEqual(h.removedTabs, [91]); }); @@ -191,7 +191,7 @@ for (const family of ["chrome", "firefox"]) { assert.equal(h.tabs.length, 1); assert.equal(h.tabs[0].active, false); assert.equal(h.tabs[0].windowId, 3); - assert.equal(h.tabs[0].url, "https://comcipapic-oalprod.integration.ocp.oraclecloud.com/ic/builder/rt/oalset_semc/live/webApps/Dashboard/?page=shell&shell=main&main=manageresourcerequests"); + assert.equal(h.tabs[0].url, "https://comcipapic-oalprod.integration.ocp.oraclecloud.com/ic/builder/rt/SeaaS_initiation/live/webApps/external/"); assert.equal(h.tabs[0].cookieStoreId, family === "firefox" ? "test-store" : undefined); assert.deepEqual(h.removedTabs, [91]); }); diff --git a/tests/spaPage.test.cjs b/tests/spaPage.test.cjs index b6e8ca1..f0faced 100644 --- a/tests/spaPage.test.cjs +++ b/tests/spaPage.test.cjs @@ -55,7 +55,6 @@ test("error, SAML/login, blank and incomplete pages never authorize a fetch", as [{ loginSelector: 'input[name="SAMLRequest"]' }, "login"], [{ loginSelector: 'input[type="password"]' }, "login"], [{ loginSelector: 'meta[http-equiv="refresh" i]' }, "login"], - [{ readyState: "interactive" }, "loading"], [{ readyState: "loading" }, "loading"], [{ title: "", body: "" }, "loading"], [{ controls: false }, "loading"] @@ -72,6 +71,7 @@ test("error, SAML/login, blank and incomplete pages never authorize a fetch", as for (const family of ["chrome", "browser"]) { test(`${family}: a loaded application reads identity once per document in its own authenticated context`, async () => { const h = harness({ family }); + h.dom.readyState = "interactive"; const page = await h.send(inspect); assert.equal(page.status, "ready"); const [first, second] = await Promise.all([h.send(read, page.documentId), h.send(read, page.documentId)]);