您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Extreme performance optimization using a unified blocker, MutationObserver for SPAs, idle tasks, and more efficient caching.
// ==UserScript== // @name BACKGROUND WEB OPTIMIZER (Ultra Performance) - v10.0 Optimized // @namespace http://gemini/ // @version 10.0 // @description Extreme performance optimization using a unified blocker, MutationObserver for SPAs, idle tasks, and more efficient caching. // @author Gugu8 // @match *://*/* // @grant GM_addStyle // @grant GM_getValue // @grant GM_setValue // @grant GM_registerMenuCommand // @grant GM_xmlhttpRequest // @run-at document-start // ==/UserScript== (function () { 'use strict'; // Basic safety guard: only top window try { if (window.top !== window.self) return; } catch (e) {} // --- Core identifiers --- const CONFIG_KEY = 'gemini_optimizer_config_v10'; const CONFIG_VERSION = 10; const CACHE_NAME = 'gemini-ultra-cache-v10'; const CACHE_META_KEY = 'gemini_ultra_cache_meta_v10'; // --- 1) Granular Network Blocking: Fast host checks --- const BLOCKED_PATTERNS = [ 'google-analytics.com', 'googletagmanager.com', 'facebook.net', 'doubleclick.net', 'hotjar.com', 'sentry.io', 'addthis.com', 'sharethis.com', 'segment.com', 'optimizely.com', 'mixpanel.com', 'amplitude.com', 'newrelic.com', 'amazon-adsystem.com', 'googlesyndication.com', 'scorecardresearch.com', 'quantserve.com', 'outbrain.com', 'taboola.com' ]; const BLOCKED_HOSTS_SET = new Set(BLOCKED_PATTERNS); // Simple host-based matcher (fast path, scalable) function matchesBlocked(url) { if (!url) return false; try { const host = (new URL(url, location.origin)).hostname; if (BLOCKED_HOSTS_SET.has(host)) return true; // Suffix matching (subdomains) for (const pat of BLOCKED_PATTERNS) { if (host === pat || host.endsWith(`.${pat}`)) return true; } } catch { // ignore } return false; } // --- 3) Advanced Memory Leak Prevention helpers (with Debounced Save) --- class TTLCacheStore { constructor(storageKey = CACHE_META_KEY) { this.storageKey = storageKey; this.saveTimeout = null; this._load(); } _load() { try { const raw = localStorage.getItem(this.storageKey); this.map = raw ? JSON.parse(raw) : {}; } catch { this.map = {}; } } _save() { clearTimeout(this.saveTimeout); this.saveTimeout = setTimeout(() => { try { localStorage.setItem(this.storageKey, JSON.stringify(this.map)); } catch {} }, 500); } get(url) { const rec = this.map[url]; if (!rec) return null; if (Date.now() > rec.expiry) { delete this.map[url]; this._save(); return null; } return rec; } set(url, ttl) { this.map[url] = { expiry: Date.now() + (ttl || 600000) }; this._save(); } delete(url) { delete this.map[url]; this._save(); } clear() { this.map = {}; this._save(); } } // --- 4) Selector Cache (Selective DOM optimization) --- class SelectorCache { constructor() { this.cache = new Map(); this.ttlMs = 30000; } queryAll(sel) { const t = Date.now(); if (this.cache.has(sel)) { const { value, time } = this.cache.get(sel); if (t - time < this.ttlMs) return value; } const value = Array.from(document.querySelectorAll(sel)); this.cache.set(sel, { value, time: t }); return value; } clear() { this.cache.clear(); } } // --- 6) Dynamic Font Loading (Font Loading API) --- class DynamicFontLoader { constructor() { this.loaded = false; } loadFromCSS() { if (this.loaded) return; try { for (const sheet of document.styleSheets) { let rules; try { rules = sheet.cssRules; } catch { continue; } if (!rules) continue; for (const r of rules) { if (r.type === CSSRule.FONT_FACE_RULE) { const family = r.style.getPropertyValue('font-family'); const src = r.style.getPropertyValue('src'); if (family && src) { try { const f = new FontFace(family.replace(/['"]/g, ''), src); f.load().then(loaded => { document.fonts.add(loaded); }).catch(() => {}); } catch {} } } } } } catch { /* ignore cross-origin */ } this.loaded = true; } } // --- 7) Web Worker for Heavy Tasks (parse large HTML-ish data in a worker) --- class WorkerManager { constructor() { this.worker = null; this.nextId = 1; this.callbacks = new Map(); this._initWorker(); } _initWorker() { if (typeof Worker === 'undefined') return; const code = ` self.onmessage = function(e) { const { id, type, payload } = e.data || {}; if (type === 'parseHTML') { const html = payload || ''; // Naive extraction of hrefs const urls = (html.match(/href\\s*=\\s*["']([^"']+)["']/gi) || []) .map(s => s.match(/["']([^""]+)["']/)[1] || s.replace(/href\\s*=\\s*["']/, '')) .filter(u => !!u); const uniq = Array.from(new Set(urls)).slice(0, 150); self.postMessage({ id, urls: uniq }); } else { self.postMessage({ id, result: null }); } }; `; try { const blob = new Blob([code], { type: 'application/javascript' }); const blobURL = URL.createObjectURL(blob); this.worker = new Worker(blobURL); this.worker.onmessage = (evt) => { const { id, urls } = evt.data; const cb = this.callbacks.get(id); if (cb) cb(urls); this.callbacks.delete(id); }; } catch (e) { console.error('[Gemini Ultra] Web Worker init failed:', e); this.worker = null; } } parseHTML(html) { return new Promise((resolve) => { if (!this.worker) { try { const urls = (html || '').match(/href\\s*=\\s*["']([^"']+)["']/gi) || []; resolve(urls.map(s => s.match(/["']([^"']+)["']/)[1]).filter(Boolean).slice(0,150)); } catch { resolve([]); } return; } const id = this.nextId++; this.callbacks.set(id, resolve); this.worker.postMessage({ id, type: 'parseHTML', payload: html }); }); } } // --- 8) Request Idle Callback Queue (safe idle/allocation) --- class IdleTaskQueue { constructor() { this.queue = []; this.running = false; } enqueue(fn) { if (typeof fn !== 'function') return; this.queue.push(fn); this._schedule(); } _schedule() { if (this.running) return; this.running = true; const run = (deadline) => { try { while (this.queue.length && (!deadline || deadline.timeRemaining() > 0)) { const t = this.queue.shift(); if (typeof t === 'function') t(); } } catch {} if (this.queue.length) { if (typeof requestIdleCallback === 'function') requestIdleCallback(run); else setTimeout(() => run({ timeRemaining: () => 50 }), 0); } else { this.running = false; } }; if (typeof requestIdleCallback === 'function') requestIdleCallback(run); else setTimeout(() => run({ timeRemaining: () => 50 }), 0); } } // --- 9) Cache API wrapper (persistent) --- class CacheManager { constructor(cacheName = CACHE_NAME) { this.cacheName = cacheName; } async match(request) { if (!('caches' in window)) return null; try { const cache = await caches.open(this.cacheName); return await cache.match(request); } catch { return null; } } async put(request, response) { if (!('caches' in window)) return; try { const cache = await caches.open(this.cacheName); await cache.put(request, response.clone()); } catch { } } async delete(request) { if (!('caches' in window)) return; try { const cache = await caches.open(this.cacheName); await cache.delete(request); } catch { } } } // --- 10) Prefetcher (Quicklink-style) --- class Prefetcher { constructor(limit = 6) { this.limit = limit; this.prefetched = new Set(); this.init(); } init() { if ('IntersectionObserver' in window) { const anchors = Array.from(document.querySelectorAll('a[href]')); const io = new IntersectionObserver((entries) => { entries.forEach(e => { if (e.isIntersecting) { const a = e.target; if (a && a.href) this._prefetch(a.href); io.unobserve(a); } }); }, { rootMargin: '200px' }); anchors.forEach(a => io.observe(a)); this.io = io; } else { document.addEventListener('mouseover', (ev) => { const a = ev.target.closest('a[href]'); if (a && a.href) this._prefetch(a.href); }, { passive: true }); } } _prefetch(url) { if (!url || this.prefetched.has(url)) return; try { const u = new URL(url, location.href); if (u.origin !== location.origin) return; } catch { return; } // Lightweight prefetch const link = document.createElement('link'); link.rel = 'prefetch'; link.href = url; document.head.appendChild(link); this.prefetched.add(url); if (this.prefetched.size > this.limit) { const first = Array.from(this.prefetched)[0]; this.prefetched.delete(first); } } } // --- 11) Iframe Sandbox / isolation (minimal wrapper) --- class IframeGuard { constructor() { this._patch(); } _patch() { const origSetAttr = HTMLIFrameElement.prototype.setAttribute; HTMLIFrameElement.prototype.setAttribute = function(name, value) { if (name.toLowerCase() === 'src') { try { const u = new URL(value, location.href); if (u.origin !== location.origin) { this.src = 'about:blank'; this.setAttribute('data-gemini-blocked', 'true'); return; } } catch {} } return origSetAttr.call(this, name, value); }; const origAppend = Element.prototype.appendChild; Element.prototype.appendChild = function(el) { if (el instanceof HTMLIFrameElement) { try { const u = new URL(el.src || '', location.href); if (u.origin !== location.origin) { el.src = 'about:blank'; el.setAttribute('data-gemini-blocked', 'true'); return el; } } catch {} } return origAppend.call(this, el); }; } } // --- 12) MutationObserver throttling for dynamic content --- // We'll implement as a helper function to reuse in the main class function throttleMutationObserver(target, callback, debounceMs = 100) { if (!('MutationObserver' in window)) return; let timer = null; const observer = new MutationObserver((mutations) => { if (timer) clearTimeout(timer); timer = setTimeout(() => { callback(mutations); timer = null; }, debounceMs); }); observer.observe(target, { childList: true, subtree: true }); return observer; } // --- 13) Default Configuration --- const defaultConfig = { version: CONFIG_VERSION, ultraPerformanceMode: true, aggressiveCaching: true, preloadCriticalResources: true, deferAllScripts: true, removeAllAnimations: true, blockAllTrackers: true, enableResourceHints: true, enableServiceWorkerCache: true, enableMemoryOptimization: true, enableGPUAcceleration: true, enableWebAssemblyOptimization: true, // Network enableHTTP2Push: true, enableBrotliCompression: true, maxParallelRequests: 8, requestTimeout: 8000, // Caching memoryCacheSize: 80, diskCacheSize: 400, cacheExpiry: 604800000, // 7 days logLevel: 2, disableAnimations: true, lazyLoadElements: true, optimizeImages: true, disableAutoPlayingMedia: true, mobileOptimization: true, reduceDOMManipulation: true, blockTrackers: true, optimizeDataFetching: true, apiCacheTTL: 300000, staticCacheTTL: 604800000, enableRetryOnTimeout: true, useStorage: true, cacheStaticResources: true, removeAdsAndPopups: true, removeUnnecessaryScripts: true, removeUnnecessaryCSS: true, removeExternalFonts: true, limitIframes: true, disableUnnecessaryWebSockets: true, improveLinkHandling: true, improveCookieManagement: true, disableGeolocation: true, disableNotifications: true, disableJSInBackgroundTabs: true, preventSessionTimeout: true, preventRedirects: false, limitMemoryLeaks: true }; // Simple in-memory LRU cache (tiny, memory-safe) class UltraCache { constructor(maxSize = 1000) { this.cache = new Map(); this.maxSize = maxSize; this.order = []; } get(key) { if (!this.cache.has(key)) return null; // Move to MRU const idx = this.order.indexOf(key); if (idx > -1) this.order.splice(idx, 1); this.order.push(key); return this.cache.get(key); } set(key, value) { if (this.cache.size >= this.maxSize && !this.cache.has(key)) { const lru = this.order.shift(); if (lru != null) this.cache.delete(lru); } this.cache.set(key, value); const idx = this.order.indexOf(key); if (idx > -1) this.order.splice(idx, 1); this.order.push(key); } clear() { this.cache.clear(); this.order = []; } } // --- 14) Core Optimizer Class --- class GeminiUltraOptimizer { constructor() { this.config = this.loadConfig(); this.setupLogger(); this.metrics = { blocked: 0, cached: 0, optimized: 0, savedBytes: 0 }; this.elementCache = new UltraCache(1000); this.selectorCache = new SelectorCache(); this.ttlStore = new TTLCacheStore(CACHE_META_KEY); this.fontLoader = new DynamicFontLoader(); this.idleQueue = new IdleTaskQueue(); this.cacheMgr = new CacheManager(CACHE_NAME); this.workerMgr = new WorkerManager(); this.prefetcher = new Prefetcher(6); this.iframeGuard = new IframeGuard(); // Mutation observer throttling helper this.mutationObserver = null; // Initialize immediately this.initializeUltraMode(); // DOMReady if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => this.onDOMReady(), { once: true, passive: true }); } else { this.onDOMReady(); } // Schedule a safe metrics report this.idleQueue.enqueue(() => this.reportMetrics()); } loadConfig() { try { const stored = GM_getValue(CONFIG_KEY); if (stored && typeof stored === 'object') return { ...defaultConfig, ...stored }; } catch { /* ignore GM unavailability */ } return { ...defaultConfig }; } saveConfig() { try { GM_setValue(CONFIG_KEY, this.config); this.log(3, 'Configuration saved. Reloading...'); window.location.reload(); } catch (e) { this.log(1, `Failed to save config: ${e?.message ?? e}`); } } setupLogger() { this.log = (level, msg) => { const lvl = this.config?.logLevel ?? 2; if (lvl >= level) { const color = level === 1 ? '#ff4d4d' : level === 2 ? '#ffd966' : '#6bdc8b'; console.log(`%c[Gemini Ultra] ${msg}`, `color: ${color}; font-weight: bold;`); } }; } initializeUltraMode() { // Critical preloads this.injectCriticalCSS(); // No-op: placeholder for any additional preloads if (this.config.enableGPUAcceleration) this.enableGPUAcceleration(); // Interceptors and caches this.setupNetworkInterceptor(); this.setupResourceHints(); // Font loading and mutation observer this.fontLoader.loadFromCSS(); this.mutateThrottleSetup(); // Memory optimizations this.optimizeMemoryUsage(); // Performance observer (optional) this.setupPerformanceObserver(); } injectCriticalCSS() { const css = ` * { animation: none !important; transition: none !important; transform: translateZ(0); } html { scroll-behavior: auto !important; } body { font-family: system-ui, -apple-system, "Segoe UI", Roboto, Arial, sans-serif !important; text-rendering: optimizeSpeed; } .ad, .ads, .advertisement, [id*="ad-"], [class*="ad-"], [class*="banner"], .social-share, .newsletter, .cookie { display: none !important; visibility: hidden !important; opacity: 0 !important; pointer-events: none !important; position: absolute !important; left: -9999px !important; } `; if (typeof GM_addStyle === 'function') GM_addStyle(css); } mutateThrottleSetup() { // Throttle MutationObserver to batch DOM work if (!('MutationObserver' in window)) return; const batch = new Set(); const flush = () => { const nodes = Array.from(batch); batch.clear(); nodes.forEach(n => this.optimizeNode(n)); }; const observer = new MutationObserver((mutations) => { mutations.forEach(m => { if (m.type === 'childList') { m.addedNodes.forEach(n => { if (n.nodeType === 1) batch.add(n); }); } }); if (batch.size) this.idleQueue.enqueue(flush); }); observer.observe(document.body, { childList: true, subtree: true }); this.mutationObserver = observer; } setupPerformanceObserver() { // Optional: lightweight performance telemetry if (!('PerformanceObserver' in window)) return; try { const obs = new PerformanceObserver((list) => { for (const entry of list.getEntries()) { if (entry.entryType === 'resource' && entry.duration > 1000) { this.log(2, `Slow resource: ${entry.name} (${Math.round(entry.duration)}ms)`); } if (entry.transferSize) { this.metrics.savedBytes += (entry.encodedBodySize ?? 0) - entry.transferSize; } } }); obs.observe({ entryTypes: ['resource', 'navigation', 'paint'] }); } catch (e) { /* ignore */ } } setupNetworkInterceptor() { const originalFetch = window.fetch.bind(window); const cfg = this.config; window.fetch = async (resource, init = {}) => { const url = (typeof resource === 'string') ? resource : resource?.url; if (!url) return originalFetch(resource, init); // Block trackers quicker if (matchesBlocked(url)) { this.metrics.blocked++; return new Response('', { status: 204 }); } // Cache-first with Cache API (TTL) try { const req = (typeof resource === 'string') ? new Request(resource, init) : resource; const cached = await this.cacheMgr.match(req); if (cached) { this.metrics.cached++; // Background refresh (async () => { try { const fresh = await originalFetch(req, init); if (fresh && fresh.ok) await this.cacheMgr.put(req, fresh.clone()); } catch { /* ignore */ } })(); return cached.clone(); } } catch { /* ignore cache errors gracefully */ } // Network fetch try { const controller = new AbortController(); const timer = setTimeout(() => controller.abort(), cfg.requestTimeout); const resp = await originalFetch(resource, { ...init, signal: controller.signal }); clearTimeout(timer); if (resp && resp.ok) { try { const req = (typeof resource === 'string') ? new Request(resource, init) : resource; await this.cacheMgr.put(req, resp.clone()); this.ttlStore.set(req.url, cfg.apiCacheTTL); } catch { /* ignore */ } } return resp; } catch (e) { if (cfg.enableRetryOnTimeout && e?.name === 'AbortError') { try { return await originalFetch(resource, init); } catch { throw e; } } throw e; } }; // XHR interception const XHR = XMLHttpRequest.prototype; const origOpen = XHR.open; const origSend = XHR.send; XHR.open = function (method, url, ...args) { this._gemini_url = url; this._gemini_method = method; return origOpen.call(this, method, url, ...args); }; XHR.send = function (...args) { const url = this._gemini_url; if (url) { try { if (matchesBlocked(url)) { this.abort(); return; } } catch {} } return origSend.call(this, ...args); }; } onDOMReady() { this.log(3, 'DOM ready, applying optimizations...'); this.applyDOMOptimizations(); this.setupDynamicContentObserver(); this.setupLazyLoadingObserver(); this.optimizeScripts(); this.postLoadCleanup(); // Phase 2: idle tasks this.idleQueue.enqueue(() => this.reportMetrics()); } setupResourceHints() { // Preconnect to discovered origins; gate by network type const origins = new Set(); document.querySelectorAll('link[href], script[src], img[src]').forEach(el => { const url = el.href || el.src; if (!url) return; try { const u = new URL(url, location.href); if (u.origin !== location.origin && !matchesBlocked(url)) { origins.add(u.origin); } } catch { /* ignore */ } }); origins.forEach(origin => { const link = document.createElement('link'); link.rel = 'preconnect'; link.href = origin; link.crossOrigin = 'anonymous'; document.head.appendChild(link); }); // Lightweight preloads document.querySelectorAll('link[rel="stylesheet"][href], script[src]').forEach(el => { const href = el.href || el.getAttribute('src') || ''; if (!href) return; if (matchesBlocked(href)) return; const pre = document.createElement('link'); pre.rel = 'preload'; pre.as = href.endsWith('.css') ? 'style' : 'script'; pre.href = href; document.head.appendChild(pre); }); } enableGPUAcceleration() { // Simple, safe GPU hints const style = document.createElement('style'); style.textContent = ` body { transform: translateZ(0); will-change: transform; } img, video, canvas, iframe { will-change: transform; } `; document.head.appendChild(style); } setupEventListenerOptimizer() { // Throttle common high-frequency listeners if (!('addEventListener' in EventTarget.prototype)) return; // Simple global patch could be extended if desired } optimizeMemoryUsage() { // Debounced memory cleanup on visibility change const cleanup = () => { if (window.gc) { try { window.gc(); } catch {} } // Evict old in-memory caches if needed if (this.elementCache && this.elementCache.cache && this.elementCache.cache.size > 800) { const toRemove = this.elementCache.cache.size - 800; const keys = Array.from(this.elementCache.cache.keys()).slice(0, toRemove); keys.forEach(k => this.elementCache.cache.delete(k)); } }; document.addEventListener('visibilitychange', () => { if (document.visibilityState === 'hidden') this.idleQueue.enqueue(cleanup); }); window.addEventListener('beforeunload', cleanup); // Periodic extra cleanup const t = setInterval(cleanup, 30000); this.timers = this.timers || []; this.timers.push(t); } setupDynamicContentObserver() { // Debounced/batched mutation handling if (!('MutationObserver' in window)) return; const batch = new Set(); const flush = () => { const nodes = Array.from(batch); batch.clear(); nodes.forEach(n => this.optimizeNode(n)); }; const obs = new MutationObserver((mutations) => { mutations.forEach(m => { if (m.type === 'childList') { m.addedNodes.forEach(n => { if (n.nodeType === 1) batch.add(n); }); } }); this.idleQueue.enqueue(flush); }); obs.observe(document.body, { childList: true, subtree: true }); this._dynamicObs = obs; } setupLazyLoadingObserver() { if (!('IntersectionObserver' in window)) return; const io = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { const img = entry.target; if (img.dataset.src && !img.src) { img.src = img.dataset.src; img.removeAttribute('data-src'); } if (img.dataset.webpSrc && this.supportsWebP()) { img.src = img.dataset.webpSrc; img.removeAttribute('data-webp-src'); } io.unobserve(img); } }); }, { rootMargin: '50px 0px', threshold: 0.01 }); document.querySelectorAll('img[data-src], img[data-webp-src]').forEach(img => io.observe(img)); this._lazyIO = io; } optimizeNode(node) { if (!node || !node.querySelectorAll) return; // Quick cleanup in given node const unwanted = node.querySelectorAll('.ad, .popup, .modal, [class*="ad-"], [id*="ad-"]'); unwanted.forEach(el => el.remove()); // Images inside the node node.querySelectorAll('img').forEach(img => { if (!img.loading) img.loading = 'lazy'; if (!img.decoding) img.decoding = 'async'; this.metrics.optimized++; }); // Iframes node.querySelectorAll('iframe').forEach(iframe => { const src = iframe.src || iframe.getAttribute('src') || ''; if (src && matchesBlocked(src)) { iframe.remove(); this.metrics.blocked = (this.metrics.blocked || 0) + 1; return; } if (!iframe.loading) iframe.loading = 'lazy'; if (!iframe.sandbox) iframe.sandbox = 'allow-scripts allow-same-origin'; }); } optimizeMedia() { document.querySelectorAll('video').forEach(video => { try { video.preload = 'metadata'; } catch {} video.autoplay = false; if (video.muted === false) video.muted = true; video.removeAttribute('autoplay'); if (!video.paused) video.pause(); this.metrics.optimized++; }); document.querySelectorAll('audio').forEach(audio => { audio.preload = 'metadata'; audio.autoplay = false; audio.muted = true; if (!audio.paused) audio.pause(); this.metrics.optimized++; }); } optimizeAllImages() { const images = document.querySelectorAll('img'); const viewportHeight = window.innerHeight; images.forEach((img, index) => { if (img.dataset.optimized) return; if (!img.loading) img.loading = index < 3 ? 'eager' : 'lazy'; if (!img.decoding) img.decoding = 'async'; try { if (index < 3 && img.getBoundingClientRect().top < viewportHeight) img.fetchpriority = 'high'; } catch {} // WebP hint const src = img.src || img.dataset.src; if (src && !src.includes('.webp') && /\.(jpg|jpeg|png)$/i.test(src)) { img.dataset.webpSrc = src.replace(/\.(jpg|jpeg|png)$/i, '.webp'); } img.dataset.optimized = 'true'; this.metrics.optimized++; }); } cleanupCSS() { document.querySelectorAll('link[rel="stylesheet"]').forEach(link => { const href = link.href || ''; try { if (href && matchesBlocked(href)) { link.remove(); this.metrics.blocked = (this.metrics.blocked || 0) + 1; } } catch {} }); document.querySelectorAll('[style*="animation"], [style*="transition"]').forEach(el => { const style = el.getAttribute('style') || ''; const newStyle = style.replace(/animation[^;]+;?/gi, '').replace(/transition[^;]+;?/gi, ''); el.setAttribute('style', newStyle); this.metrics.optimized++; }); } supportsWebP() { try { const c = document.createElement('canvas'); c.width = c.height = 1; return c.toDataURL('image/webp').indexOf('image/webp') > -1; } catch { return false; } } optimizeFonts() { // Remove Google Fonts (as part of blocking) document.querySelectorAll('link[href*="fonts.googleapis.com"], link[href*="fonts.gstatic.com"]') .forEach(l => { l.remove(); this.metrics.blocked++; }); // Preload font cleanup document.querySelectorAll('link[rel="preload"][as="font"]').forEach(l => { l.remove(); this.metrics.blocked++; }); // Load dynamic fonts this.fontLoader.loadFromCSS(); } optimizeScripts() { const scripts = document.querySelectorAll('script'); scripts.forEach(script => { const src = script.src || ''; if (src) { try { const host = new URL(src, location.href).hostname; if (matchesBlocked(src)) { script.remove(); this.metrics.blocked++; return; } if (!script.async && !script.defer) { script.defer = true; this.metrics.optimized++; } } catch {} } else { const content = script.textContent || ''; if (/(google-analytics|gtag|fbq|_gaq|analytics|tracking)/i.test(content)) { script.remove(); this.metrics.blocked++; } } }); } postLoadCleanup() { // Remove empty style tags document.querySelectorAll('style').forEach(style => { if (!style.textContent || style.textContent.trim() === '') style.remove(); }); // Remove comments const it = document.createNodeIterator(document.body, NodeFilter.SHOW_COMMENT, null, false); const toRemove = []; let node; while ((node = it.nextNode())) toRemove.push(node); toRemove.forEach(n => n.remove()); } reportMetrics() { const elapsed = performance.now(); // approx const report = ` Performance Report: - Uptime snapshot: ${Math.round(elapsed)}ms - Blocked requests: ${this.metrics.blocked} - Cached requests: ${this.metrics.cached} - Optimized elements: ${this.metrics.optimized} - Estimated data saved: ${(this.metrics.savedBytes / 1024).toFixed(2)} KB `; this.log(3, report); } logBlockEntry(kind, msg) { this.log(2, `[Block ${kind}] ${msg}`); } log(levelMsg, msg) { if (!this.config || this.config.logLevel == null) return; const lvl = this.config.logLevel; if (lvl >= levelMsg) { console.log(`%c[Gemini Ultra] ${msg}`, 'color: #28a745; font-weight: bold;'); } } setupMenuCommands() { try { GM_registerMenuCommand('🚀 Toggle Ultra Performance Mode', () => { this.config.ultraPerformanceMode = !this.config.ultraPerformanceMode; this.saveConfig(); }); GM_registerMenuCommand('💾 Toggle Aggressive Caching', () => { this.config.aggressiveCaching = !this.config.aggressiveCaching; this.saveConfig(); }); GM_registerMenuCommand('🚫 Toggle Ad Blocking', () => { this.config.removeAdsAndPopups = !this.config.removeAdsAndPopups; this.saveConfig(); }); GM_registerMenuCommand('📊 Show Performance Metrics', () => this.reportMetrics()); GM_registerMenuCommand('🔧 Reset Configuration', () => { if (confirm('Reset all settings to default?')) { GM_setValue(CONFIG_KEY, { version: CONFIG_VERSION }); window.location.reload(); } }); } catch { /* GM missing */ } } // Utility: Supports webp (tiny helper) supportsWebP() { try { const c = document.createElement('canvas'); c.width = c.height = 1; return c.toDataURL('image/webp').indexOf('image/webp') > -1; } catch { return false; } } // Cleanup on unload cleanup() { if (this.mutationObserver) this.mutationObserver.disconnect(); if (this._dynamicObs) this._dynamicObs.disconnect(); this.elementCache.clear(); this.selectorCache.clear(); } } // Instantiate the optimizer try { new GeminiUltraOptimizer(); } catch (e) { console.error('[Gemini Ultra] Failed to initialize:', e); } })();