BACKGROUND WEB OPTIMIZER (Ultra Performance) - v10.0 Optimized

Extreme performance optimization using a unified blocker, MutationObserver for SPAs, idle tasks, and more efficient caching.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==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);
  }

})();