From 88787a054a93b6b03c5a2568437888f0f6a5a6ec Mon Sep 17 00:00:00 2001 From: Paulo Porto Date: Wed, 6 May 2026 14:32:03 -0300 Subject: [PATCH] =?UTF-8?q?Corre=C3=A7=C3=A3o=20na=20abertura=20dos=20work?= =?UTF-8?q?load=20workbench=20quando=20n=C3=A3o=20estiver=20dispon=C3=ADve?= =?UTF-8?q?l?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- background.js | 83 +++++++++++++++++++++++++++++++++++++++++++++++ content-script.js | 45 +++++++++++++++++++++---- manifest.json | 3 +- 3 files changed, 123 insertions(+), 8 deletions(-) diff --git a/background.js b/background.js index 5ff62a3..d54f415 100644 --- a/background.js +++ b/background.js @@ -14,6 +14,10 @@ const COMCIP_TAB_URL_PATTERN = `${COMCIP_ORIGIN}/ic/builder/rt/oalset_semc/live*`; const COMCIP_TIME_ENTRY_TAB_URL_PATTERN = `${COMCIP_ORIGIN}/ic/builder/rt/oalset_timeentrymobile/live*`; +const SPA_WORKBENCH_FRAME_URL = + "https://spa.oracle.com/oalcrm/web/api/g2m-consumer-application/ui/index.html?ojr=workload_workbench"; +const SPA_WORKBENCH_FRAME_ID = "arch-panel-extension-spa-frame"; +const SPA_WORKBENCH_FRAME_HOST_ID = "arch-panel-extension-spa-frame-host"; const SPA_FRAME_DNR_RULE_ID = 92001; void installSpaFrameHeaderRules(); @@ -169,6 +173,7 @@ async function executeSpaFrameFetch({ senderTabId, url, options = {} }) { } await installSpaFrameHeaderRules(); + await ensureSpaFrameElementInTab(senderTabId); await waitForSpaFramePresent(senderTabId); await ensureSpaBridgeInFrames(senderTabId); await waitForSpaFrameCapturedAuth(senderTabId, url); @@ -176,6 +181,84 @@ async function executeSpaFrameFetch({ senderTabId, url, options = {} }) { return executeSpaFrameScriptFetch(senderTabId, url, options); } +async function ensureSpaFrameElementInTab(tabId) { + await chrome.scripting.executeScript({ + target: { tabId, frameIds: [0] }, + world: "MAIN", + args: [ + SPA_WORKBENCH_FRAME_HOST_ID, + SPA_WORKBENCH_FRAME_ID, + SPA_WORKBENCH_FRAME_URL, + ], + func: (hostId, frameId, frameUrl) => { + const desiredParent = document.body || document.documentElement; + + if (!desiredParent) { + return false; + } + + let host = document.getElementById(hostId); + + if (!host) { + host = document.createElement("div"); + host.id = hostId; + host.setAttribute("aria-hidden", "true"); + } + + Object.assign(host.style, { + position: "fixed", + width: "1440px", + height: "1000px", + overflow: "hidden", + opacity: "0", + pointerEvents: "none", + border: "0", + left: "-20000px", + top: "0", + zIndex: "0", + }); + + if (host.parentElement !== desiredParent) { + desiredParent.appendChild(host); + } + + let frame = document.getElementById(frameId); + + if (!(frame instanceof HTMLIFrameElement)) { + frame = document.createElement("iframe"); + frame.id = frameId; + frame.name = frameId; + frame.setAttribute("aria-hidden", "true"); + frame.setAttribute("referrerpolicy", "no-referrer-when-downgrade"); + frame.tabIndex = -1; + } + + frame.name = frameId; + frame.dataset.archPanelFrame = "spa-workbench"; + Object.assign(frame.style, { + position: "absolute", + width: "1440px", + height: "1000px", + opacity: "0", + pointerEvents: "none", + border: "0", + left: "0", + top: "0", + }); + + if (frame.parentElement !== host) { + host.appendChild(frame); + } + + if (!frame.src || frame.src === "about:blank" || frame.src !== frameUrl) { + frame.src = frameUrl; + } + + return true; + }, + }).catch(() => {}); +} + async function waitForSpaFramePresent(tabId) { const startedAt = Date.now(); let lastFrames = ""; diff --git a/content-script.js b/content-script.js index ebe1c9f..38a8322 100644 --- a/content-script.js +++ b/content-script.js @@ -4590,7 +4590,7 @@ frameHost.appendChild(existingFrame); } - if (existingFrame.src !== frameUrl) { + if (shouldNavigateSpaFrame(existingFrame, frameUrl)) { navigateSpaFrame(existingFrame, frameUrl); } @@ -4600,6 +4600,7 @@ const frame = document.createElement("iframe"); frame.id = IDS.spaFrame; frame.name = IDS.spaFrame; + frame.dataset.archPanelFrame = "spa-workbench"; frame.setAttribute("aria-hidden", "true"); frame.setAttribute("referrerpolicy", "no-referrer-when-downgrade"); frame.tabIndex = -1; @@ -4624,6 +4625,25 @@ const existingHost = document.getElementById(IDS.spaFrameHost); if (existingHost) { + const desiredParent = document.body || document.documentElement; + + if (desiredParent && existingHost.parentElement !== desiredParent) { + desiredParent.appendChild(existingHost); + } + + Object.assign(existingHost.style, { + position: "fixed", + width: "1440px", + height: "1000px", + overflow: "hidden", + opacity: "0", + pointerEvents: "none", + border: "0", + left: "-20000px", + top: "0", + zIndex: "0", + }); + return existingHost; } @@ -4640,20 +4660,31 @@ border: "0", left: "-20000px", top: "0", - zIndex: "-1", + zIndex: "0", }); - document.documentElement.appendChild(host); + (document.body || document.documentElement).appendChild(host); return host; } + function shouldNavigateSpaFrame(frame, frameUrl) { + const currentSrc = cleanString(frame.getAttribute("src") || frame.src); + + if (!currentSrc || currentSrc === "about:blank") { + return true; + } + + try { + return new URL(currentSrc, window.location.href).toString() !== frameUrl; + } catch { + return currentSrc !== frameUrl; + } + } + function navigateSpaFrame(frame, frameUrl) { frame.dataset.archPanelLoaded = "false"; - frame.removeAttribute("src"); - window.setTimeout(() => { - frame.src = frameUrl; - }, 0); + frame.src = frameUrl; } function waitForFrameLoad(frame) { diff --git a/manifest.json b/manifest.json index 0e74fda..3be7de0 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "Arch Panel Injector", - "version": "1.0.1", + "version": "1.0.2", "description": "Insere o botao Arch panel no header do Oracle Workload Workbench.", "permissions": [ "cookies", @@ -173,5 +173,6 @@ +