Verdant

Welcome to Verdant,

`) // Remove body margins .replace(/]*)>/i, '') // Handle CSP and security headers .replace(/]*http-equiv=["']?content-security-policy["']?[^>]*>/gi, '') .replace(/]*http-equiv=["']?x-frame-options["']?[^>]*>/gi, ''); } // Main proxy load function that routes to different methods async function proxyLoad(url, frame, loadingOverlay) { if (loadingOverlay) loadingOverlay.style.display = 'flex'; let actualTargetUrl = url; const verdantProxyPrefix = window.location.origin + '/route/'; // Handle Verdant proxy URLs if (url.startsWith(verdantProxyPrefix)) { const encodedPart = url.substring(verdantProxyPrefix.length); const decodedUrl = decodeBase64(encodedPart); if (decodedUrl) { actualTargetUrl = decodedUrl; console.log(`Decoded Verdant proxy URL: ${actualTargetUrl}`); } } else { actualTargetUrl = actualTargetUrl.replace(/^(https?:\/\/)?/, ''); } // Determine if it's a search query or URL const urlToFetch = actualTargetUrl.includes('.') ? `https://${actualTargetUrl}` : `https://html.duckduckgo.com/html?q=${encodeURIComponent(actualTargetUrl)}`; let success = false; // Route to appropriate proxy method switch (currentProxyMethod) { case 'advanced': success = await advancedProxyLoad(urlToFetch, frame, loadingOverlay); break; case 'ultraviolet': success = await ultravioletProxyLoad(urlToFetch, frame, loadingOverlay); break; case 'rammerhead': success = await rammerheadProxyLoad(urlToFetch, frame, loadingOverlay); break; case 'workerproxy': success = await workerProxyLoad(urlToFetch, frame, loadingOverlay); break; default: success = await advancedProxyLoad(urlToFetch, frame, loadingOverlay); } // If primary method fails, try fallback methods if (!success) { console.log('Primary proxy method failed, trying fallbacks...'); const fallbackMethods = ['advanced', 'ultraviolet', 'rammerhead', 'workerproxy'] .filter(method => method !== currentProxyMethod); for (const method of fallbackMethods) { console.log(`Trying fallback method: ${method}`); switch (method) { case 'advanced': success = await advancedProxyLoad(urlToFetch, frame, loadingOverlay); break; case 'ultraviolet': success = await ultravioletProxyLoad(urlToFetch, frame, loadingOverlay); break; case 'rammerhead': success = await rammerheadProxyLoad(urlToFetch, frame, loadingOverlay); break; case 'workerproxy': success = await workerProxyLoad(urlToFetch, frame, loadingOverlay); break; } if (success) break; } } if (!success) { console.error('All proxy methods failed'); if (loadingOverlay) loadingOverlay.style.display = 'none'; showErrorPage(frame, 'All proxy methods failed. The site may be heavily protected or unavailable.'); updateUrlBar(''); } } // Enhanced frame handlers function setupFrameHandlers(frame, loadingOverlay) { frame.onload = () => { console.log('Frame loaded successfully!'); if (loadingOverlay) loadingOverlay.style.display = 'none'; // Try to inject additional compatibility scripts try { const iframeDoc = frame.contentDocument || frame.contentWindow?.document; if (iframeDoc && iframeDoc.body) { // Enhanced click interception iframeDoc.body.addEventListener('click', (e) => { handleIframeClick(e, frame, loadingOverlay, iframeDoc); }, true); // Handle form submissions const forms = iframeDoc.querySelectorAll('form'); forms.forEach(form => { form.addEventListener('submit', (e) => { if (form.method?.toLowerCase() === 'get') { e.preventDefault(); const formData = new FormData(form); const params = new URLSearchParams(formData); const actionUrl = form.action || iframeDoc.location.href; const fullUrl = `${actionUrl}?${params.toString()}`; proxyLoad(fullUrl, frame, loadingOverlay); } }); }); // Inject additional compatibility for modern sites const script = iframeDoc.createElement('script'); script.textContent = ` // Additional modern site compatibility (function() { // Override console methods to prevent errors if (typeof console !== 'undefined') { const originalError = console.error; console.error = function(...args) { if (!args[0] || !args[0].toString().includes('X-Frame-Options')) { originalError.apply(console, args); } }; } // Handle dynamic imports for modern JS apps if (typeof window.import === 'undefined') { window.import = function(url) { return new Promise((resolve, reject) => { const script = document.createElement('script'); script.type = 'module'; script.onload = () => resolve(); script.onerror = reject; script.src = url; document.head.appendChild(script); }); }; } })(); `; iframeDoc.head.appendChild(script); } } catch (e) { console.warn('Frame access limited due to cross-origin restrictions:', e.message); } }; frame.onerror = () => { console.error('Frame failed to load'); if (loadingOverlay) loadingOverlay.style.display = 'none'; showErrorPage(frame, 'Failed to load content'); }; } // Enhanced click handler for modern sites function handleIframeClick(e, frame, loadingOverlay, iframeDoc) { let targetElement = e.target; let urlToRedirect = ''; let isHandled = false; // Walk up the DOM tree to find clickable elements while (targetElement && targetElement !== iframeDoc.body) { if (targetElement.tagName === 'A' && targetElement.href) { urlToRedirect = targetElement.href; isHandled = true; break; } // Handle modern SPA navigation elements if (targetElement.hasAttribute('data-href') || targetElement.hasAttribute('data-url') || targetElement.hasAttribute('data-link') || targetElement.hasAttribute('data-navigate') || targetElement.classList.contains('link') || targetElement.classList.contains('navigate')) { urlToRedirect = targetElement.getAttribute('data-href') || targetElement.getAttribute('data-url') || targetElement.getAttribute('data-link') || targetElement.getAttribute('data-navigate') || ''; if (urlToRedirect) { isHandled = true; break; } } // Handle onclick navigation if (targetElement.onclick) { const onclickString = targetElement.onclick.toString(); const urlMatch = /(?:location\.href|window\.location|location\.assign|window\.open|navigate)\s*[=\(]\s*['"`]([^'"`]+)['"`]/.exec(onclickString); if (urlMatch && urlMatch[1]) { urlToRedirect = urlMatch[1]; isHandled = true; break; } } targetElement = targetElement.parentElement; } if (isHandled && urlToRedirect) { // Check if it's an external link that should be proxied try { const currentOrigin = new URL(frame.src).origin; const linkUrl = new URL(urlToRedirect, currentOrigin); // Only intercept if it's a different origin or looks like a navigation if (linkUrl.origin !== currentOrigin || urlToRedirect.startsWith('http')) { e.preventDefault(); e.stopPropagation(); console.log(`Intercepted navigation to: ${linkUrl.href}`); proxyLoad(linkUrl.href, frame, loadingOverlay); } } catch (urlError) { console.warn("Invalid URL, trying fallback:", urlToRedirect); if (urlToRedirect.includes('.') || urlToRedirect.startsWith('http')) { e.preventDefault(); e.stopPropagation(); proxyLoad(urlToRedirect, frame, loadingOverlay); } } } } function updateUrlBar(actualLoadedUrl) { const verdantProxyPrefix = window.location.origin + '/route/'; const encodedUrl = encodeBase64(actualLoadedUrl); urlBarInput.value = verdantProxyPrefix + encodedUrl; } // Enhanced error page for better user experience function showErrorPage(frame, errorMessage) { frame.srcdoc = ` Proxy Error

🚫 Unable to Load Content

Error: ${errorMessage}

Current Method: ${currentProxyMethod.toUpperCase()}

Why this might happen:

  • The website has advanced anti-proxy measures
  • The site requires specific authentication or cookies
  • Cloudflare or similar protection is blocking access
  • The proxy servers are temporarily unavailable
  • The site uses complex JavaScript that doesn't work in iframes

Try these solutions:

  • Switch to a different proxy method above
  • Try accessing a mobile version (add 'm.' to the domain)
  • Wait a few minutes and try again
  • Check if the site works without proxy first
`; } // DOM elements and event handlers const homeLink = document.getElementById('home-link'); const searchInput = document.getElementById('search-input'); const proxyContentArea = document.getElementById('proxy-content-area'); const loadingOverlay = document.getElementById('loading-overlay'); const mainTitle = document.querySelector('.main-title'); const searchBarContainer = document.querySelector('.search-bar-container'); const footerContainer = document.querySelector('.footer-container'); const personalGreeting = document.getElementById('personal-greeting'); const controlBar = document.getElementById('control-bar'); const backButton = document.getElementById('back-button'); const forwardButton = document.getElementById('forward-button'); const refreshButton = document.getElementById('refresh-button'); const urlBarInput = document.getElementById('url-bar-input'); const goButton = document.getElementById('go-button'); const minimizeButton = document.getElementById('minimize-button'); const nameModalOverlay = document.getElementById('name-modal-overlay'); const nameInput = document.getElementById('name-input'); const saveNameButton = document.getElementById('save-name-button'); // Proxy method selector const proxyMethodBtns = document.querySelectorAll('.proxy-method-btn'); proxyMethodBtns.forEach(btn => { btn.addEventListener('click', () => { proxyMethodBtns.forEach(b => b.classList.remove('active')); btn.classList.add('active'); currentProxyMethod = btn.dataset.method; console.log(`Switched to proxy method: ${currentProxyMethod}`); }); }); function updatePersonalGreeting() { const userName = localStorage.getItem('userName'); if (userName) { personalGreeting.textContent = `${userName}`; personalGreeting.classList.remove('hidden'); } else { personalGreeting.textContent = ''; personalGreeting.classList.add('hidden'); } } function resetHomePage() { document.body.classList.remove('proxy-active'); proxyContentArea.classList.add('hidden'); controlBar.classList.add('hidden'); searchInput.value = ''; updateUrlBar(''); mainTitle.style.display = ''; searchBarContainer.style.display = ''; footerContainer.style.display = ''; updatePersonalGreeting(); controlBar.classList.remove('minimized'); minimizeButton.innerHTML = ` `; minimizeButton.title = 'Minimize Control Bar'; let existingIframe = proxyContentArea.querySelector('iframe'); if (existingIframe) { existingIframe.remove(); } } // Make resetHomePage globally available window.resetHomePage = resetHomePage; searchInput.addEventListener('keypress', (event) => { if (event.key === 'Enter') { const query = searchInput.value.trim(); if (query) { document.body.classList.add('proxy-active'); mainTitle.style.display = 'none'; personalGreeting.style.display = 'none'; searchBarContainer.style.display = 'none'; footerContainer.style.display = 'none'; proxyContentArea.classList.remove('hidden'); controlBar.classList.remove('hidden'); controlBar.classList.remove('minimized'); minimizeButton.innerHTML = ` `; minimizeButton.title = 'Minimize Control Bar'; let existingIframe = proxyContentArea.querySelector('iframe'); if (existingIframe) { existingIframe.remove(); } const newIframe = document.createElement('iframe'); proxyContentArea.appendChild(newIframe); proxyLoad(query, newIframe, loadingOverlay); } } }); homeLink.addEventListener('click', (event) => { event.preventDefault(); resetHomePage(); }); backButton.addEventListener('click', () => { const currentIframe = proxyContentArea.querySelector('iframe'); if (currentIframe && currentIframe.contentWindow) { try { currentIframe.contentWindow.history.back(); } catch (e) { console.warn("Could not go back in iframe history:", e); } } }); forwardButton.addEventListener('click', () => { const currentIframe = proxyContentArea.querySelector('iframe'); if (currentIframe && currentIframe.contentWindow) { try { currentIframe.contentWindow.history.forward(); } catch (e) { console.warn("Could not go forward in iframe history:", e); } } }); refreshButton.addEventListener('click', () => { const currentIframe = proxyContentArea.querySelector('iframe'); if (currentIframe && currentIframe.contentWindow) { try { const currentVerdantUrl = urlBarInput.value; proxyLoad(currentVerdantUrl, currentIframe, loadingOverlay); } catch (e) { console.warn("Could not refresh iframe:", e); } } }); function handleUrlBarNavigation() { const newUrl = urlBarInput.value.trim(); if (newUrl) { const currentIframe = proxyContentArea.querySelector('iframe'); if (currentIframe) { proxyLoad(newUrl, currentIframe, loadingOverlay); } else { document.body.classList.add('proxy-active'); proxyContentArea.classList.remove('hidden'); controlBar.classList.remove('hidden'); const newIframe = document.createElement('iframe'); proxyContentArea.appendChild(newIframe); proxyLoad(newUrl, newIframe, loadingOverlay); } } } goButton.addEventListener('click', handleUrlBarNavigation); urlBarInput.addEventListener('keypress', (event) => { if (event.key === 'Enter') { handleUrlBarNavigation(); } }); minimizeButton.addEventListener('click', () => { controlBar.classList.toggle('minimized'); if (controlBar.classList.contains('minimized')) { minimizeButton.innerHTML = ` `; minimizeButton.title = 'Maximize Control Bar'; } else { minimizeButton.innerHTML = ` `; minimizeButton.title = 'Minimize Control Bar'; } }); saveNameButton.addEventListener('click', () => { const userName = nameInput.value.trim(); if (userName) { localStorage.setItem('userName', userName); nameModalOverlay.style.display = 'none'; updatePersonalGreeting(); } else { nameInput.placeholder = "Please enter your name!"; } }); nameInput.addEventListener('keypress', (event) => { if (event.key === 'Enter') { saveNameButton.click(); } }); window.addEventListener('load', () => { const userName = localStorage.getItem('userName'); if (!userName) { nameModalOverlay.style.display = 'flex'; nameInput.focus(); } else { updatePersonalGreeting(); } const path = window.location.pathname; const verdantProxyPrefixPath = '/route/'; if (path.startsWith(verdantProxyPrefixPath)) { const encodedUrl = path.substring(verdantProxyPrefixPath.length); const decodedUrl = decodeBase64(encodedUrl); if (decodedUrl) { document.body.classList.add('proxy-active'); proxyContentArea.classList.remove('hidden'); controlBar.classList.remove('hidden'); const newIframe = document.createElement('iframe'); proxyContentArea.appendChild(newIframe); proxyLoad(decodedUrl, newIframe, loadingOverlay); } } }); function showMessageBox(message) { const messageBoxOverlay = document.getElementById('message-box-overlay'); const messageBoxText = document.getElementById('message-box-text'); const messageBoxOkButton = document.getElementById('message-box-ok'); if (!messageBoxOverlay || !messageBoxText || !messageBoxOkButton) { console.error("Message box elements not found."); return; } messageBoxText.textContent = message; messageBoxOverlay.classList.remove('hidden'); const hideMessageBox = () => { messageBoxOverlay.classList.add('hidden'); messageBoxOkButton.removeEventListener('click', hideMessageBox); }; messageBoxOkButton.addEventListener('click', hideMessageBox); } // Panic key and other settings functionality function launchSiteInAboutBlank() { const siteURL = window.location.origin + '/index.html'; const newTab = window.open('about:blank', '_blank'); if (newTab) { newTab.opener = null; const content = ` about:blank `; newTab.document.write(content); newTab.document.close(); } else { showMessageBox("Please allow pop-ups for this site to launch in about:blank."); console.error("Pop-up blocked: Unable to launch in about:blank."); } } document.addEventListener('DOMContentLoaded', () => { const launchBlankButton = document.getElementById('launch-blank-button'); const panicKeyInput = document.getElementById('panic-key-input'); const redirectUrlInput = document.getElementById('redirect-url-input'); const togglePanicKeyButton = document.getElementById('toggle-panic-key-button'); const panicKeyStatus = document.getElementById('panic-key-status'); let storedPanicKey = localStorage.getItem('verdantPanicKey') || ''; let storedRedirectUrl = localStorage.getItem('verdantRedirectUrl') || 'https://google.com'; let isPanicKeyEnabled = (localStorage.getItem('verdantPanicKeyEnabled') === 'true'); function updatePanicKeyStatus() { if (panicKeyStatus) { if (isPanicKeyEnabled) { panicKeyStatus.textContent = `Panic Key: Enabled (Key: '${storedPanicKey || 'Not Set'}', Redirect: '${storedRedirectUrl}')`; panicKeyStatus.classList.remove('text-red-400'); panicKeyStatus.classList.add('text-emerald-400'); } else { panicKeyStatus.textContent = `Panic Key: Disabled`; panicKeyStatus.classList.remove('text-emerald-400'); panicKeyStatus.classList.add('text-red-400'); } } } if (panicKeyInput) { panicKeyInput.value = storedPanicKey; panicKeyInput.addEventListener('keydown', (e) => { e.preventDefault(); panicKeyInput.value = e.key; storedPanicKey = e.key; showMessageBox(`Panic key set to: '${e.key}'`); }); } if (redirectUrlInput) { redirectUrlInput.value = storedRedirectUrl; } updatePanicKeyStatus(); if (togglePanicKeyButton) { togglePanicKeyButton.addEventListener('click', () => { storedPanicKey = panicKeyInput ? panicKeyInput.value.trim() : localStorage.getItem('verdantPanicKey') || ''; storedRedirectUrl = redirectUrlInput ? redirectUrlInput.value.trim() : localStorage.getItem('verdantRedirectUrl') || 'https://google.com'; if (storedRedirectUrl && !storedRedirectUrl.startsWith('http://') && !storedRedirectUrl.startsWith('https://')) { showMessageBox("Please enter a valid URL (e.g., https://google.com)."); return; } isPanicKeyEnabled = !isPanicKeyEnabled; localStorage.setItem('verdantPanicKey', storedPanicKey); localStorage.setItem('verdantRedirectUrl', storedRedirectUrl); localStorage.setItem('verdantPanicKeyEnabled', isPanicKeyEnabled); updatePanicKeyStatus(); showMessageBox(`Panic Key ${isPanicKeyEnabled ? 'Enabled' : 'Disabled'}! Settings Saved.`); }); } if (launchBlankButton) { launchBlankButton.addEventListener('click', launchSiteInAboutBlank); } document.addEventListener('keydown', (e) => { const currentPanicKey = localStorage.getItem('verdantPanicKey') || ''; const currentRedirectUrl = localStorage.getItem('verdantRedirectUrl') || 'https://google.com'; const currentIsPanicKeyEnabled = (localStorage.getItem('verdantPanicKeyEnabled') === 'true'); if (currentIsPanicKeyEnabled && currentPanicKey && e.key.toLowerCase() === currentPanicKey.toLowerCase()) { e.preventDefault(); if (currentRedirectUrl) { window.location.replace(currentRedirectUrl); } else { console.warn("Panic key pressed but no redirect URL set in localStorage."); } } }); });