🧠 Optimiseur JavaScript Avancé pour X.com+

Améliorez les performances de X.com/Twitter : supprime les filtres CSS lourds, limite les FPS, réduit le DOM, met en pause les vidéos hors écran, bloque l’analytique et active le mode agressif en cas de ralentissement.

Version au 22/10/2025. Voir la dernière version.

// ==UserScript==
// @name         🧠 X.com Heavy JS Optimizer+
// @name:vi      🧠 Trình tối ưu JavaScript nặng cho X.com+
// @name:en      🧠 X.com Heavy JS Optimizer+
// @name:zh-CN   🧠 X.com 高级 JavaScript 优化器+
// @name:zh-TW   🧠 X.com 高級 JavaScript 優化器+
// @name:ja      🧠 X.com 高性能 JavaScript オプティマイザー+
// @name:ko      🧠 X.com 고급 JS 최적화기+
// @name:fr      🧠 Optimiseur JavaScript Avancé pour X.com+
// @name:de      🧠 X.com Erweiterter JS-Optimierer+
// @name:es      🧠 Optimizador JS Avanzado para X.com+
// @name:pt      🧠 Otimizador JS Avançado para X.com+
// @name:it      🧠 Ottimizzatore JS Avanzato per X.com+
// @name:ru      🧠 Расширенный оптимизатор JS для X.com+
// @name:pl      🧠 Zaawansowany optymalizator JS dla X.com+
// @name:tr      🧠 X.com Gelişmiş JS Optimize Edici+
// @name:ar      🧠 مُحسِّن JavaScript متقدم لـ X.com+
// @name:hi      🧠 X.com के लिए उन्नत JS ऑप्टिमाइज़र+
// @name:th      🧠 ตัวเพิ่มประสิทธิภาพ JS ระดับสูงสำหรับ X.com+
// @name:id      🧠 Pengoptimal JS Tingkat Lanjut untuk X.com+
// @name:nl      🧠 Geavanceerde JS-Optimizer voor X.com+
// @name:uk      🧠 Розширений оптимізатор JS для X.com+

// @description        Enhance X.com/Twitter performance by removing heavy CSS, throttling FPS, limiting feed DOM, blocking analytics, and optimizing offscreen videos.
// @description:vi     Cải thiện hiệu năng X.com/Twitter bằng cách loại bỏ CSS nặng, giới hạn FPS, giảm tải DOM feed, chặn theo dõi và tối ưu video ngoài màn hình.
// @description:en     Improve X.com/Twitter performance: removes heavy CSS, throttles FPS, limits DOM size, pauses offscreen videos, blocks analytics, and auto-enables aggressive mode when lag is detected.
// @description:zh-CN  优化 X.com/Twitter 性能:移除高负载 CSS、限制 FPS、减少 DOM、暂停屏幕外视频、屏蔽分析并在卡顿时自动启用高性能模式。
// @description:zh-TW  優化 X.com/Twitter 效能:移除高負載 CSS、限制 FPS、減少 DOM、暫停螢幕外影片、封鎖分析並在延遲時自動啟用高效模式。
// @description:ja      X.com/Twitter のパフォーマンスを向上: 重い CSS を削除し、FPS を制限し、フィード DOM を縮小し、画面外の動画を一時停止し、分析をブロックし、遅延時に自動的にアグレッシブモードを有効化。
// @description:ko      X.com/Twitter 성능 최적화: 무거운 CSS 제거, FPS 제한, 피드 DOM 축소, 화면 밖 동영상 일시정지, 분석 차단, 렉 발생 시 자동 공격적 모드 전환.
// @description:fr      Améliorez les performances de X.com/Twitter : supprime les filtres CSS lourds, limite les FPS, réduit le DOM, met en pause les vidéos hors écran, bloque l’analytique et active le mode agressif en cas de ralentissement.
// @description:de      Optimiert die Leistung von X.com/Twitter: Entfernt schwere CSS-Filter, begrenzt FPS, reduziert das DOM, pausiert Videos außerhalb des Bildschirms, blockiert Analysen und aktiviert bei Lag den aggressiven Modus automatisch.
// @description:es      Mejora el rendimiento de X.com/Twitter: elimina CSS pesados, limita FPS, reduce DOM, pausa videos fuera de pantalla, bloquea analíticas y activa modo agresivo automáticamente al detectar lag.
// @description:pt      Melhora o desempenho do X.com/Twitter: remove CSS pesado, limita FPS, reduz o DOM, pausa vídeos fora da tela, bloqueia análises e ativa o modo agressivo automaticamente quando há lag.
// @description:it      Migliora le prestazioni di X.com/Twitter: rimuove CSS pesanti, limita FPS, riduce DOM, mette in pausa i video fuori schermo, blocca le analisi e attiva la modalità aggressiva quando rileva lag.
// @description:ru      Оптимизирует X.com/Twitter: удаляет тяжелые CSS, ограничивает FPS, сокращает DOM, приостанавливает видео вне экрана, блокирует аналитику и автоматически включает агрессивный режим при лагах.
// @description:pl      Popraw wydajność X.com/Twitter: usuwa ciężkie style CSS, ogranicza FPS, zmniejsza DOM, wstrzymuje filmy poza ekranem, blokuje analitykę i automatycznie włącza tryb agresywny przy lagach.
// @description:tr      X.com/Twitter performansını artırır: ağır CSS filtrelerini kaldırır, FPS sınırlar, DOM’u küçültür, ekrandışı videoları duraklatır, analitiği engeller ve gecikme durumunda agresif modu otomatik açar.
// @description:ar      تحسين أداء X.com/Twitter: إزالة CSS الثقيل، تحديد معدل الإطارات، تقليل DOM، إيقاف الفيديوهات خارج الشاشة، حظر التحليلات، وتفعيل الوضع العدواني تلقائيًا عند التأخير.
// @description:hi      X.com/Twitter का प्रदर्शन बेहतर करें: भारी CSS हटाएं, FPS सीमित करें, DOM कम करें, ऑफस्क्रीन वीडियो रोकें, एनालिटिक्स ब्लॉक करें और लैग पर स्वतः आक्रामक मोड चालू करें.
// @description:th      ปรับปรุงประสิทธิภาพ X.com/Twitter: ลบ CSS หนัก, จำกัด FPS, ลด DOM, หยุดวิดีโอนอกหน้าจอ, บล็อกการวิเคราะห์ และเปิดโหมดแรงอัตโนมัติเมื่อแลค.
// @description:id      Meningkatkan performa X.com/Twitter: menghapus CSS berat, membatasi FPS, mengurangi DOM, menjeda video di luar layar, memblokir analitik, dan otomatis mengaktifkan mode agresif saat lag terdeteksi.
// @description:nl      Verbeter de prestaties van X.com/Twitter: verwijdert zware CSS, beperkt FPS, vermindert DOM, pauzeert video's buiten beeld, blokkeert analyses en activeert automatisch agressieve modus bij lag.
// @description:uk      Оптимізує X.com/Twitter: видаляє важкі CSS, обмежує FPS, скорочує DOM, призупиняє відео поза екраном, блокує аналітику та автоматично вмикає агресивний режим при лагах.

// @author       Oppai1442
// @namespace    https://greasyfork.org/users/oppai1442
// @license      MIT
// @homepageURL  https://greasyfork.org/scripts/xcom-heavy-js-optimizer
// @version 1.3.0
// @icon         https://x.com/favicon.ico
// @match        https://x.com/*
// @match        https://twitter.com/*
// @grant        GM_registerMenuCommand
// @run-at       document-start
// ==/UserScript==



(() => {
  'use strict';

  // ========= Config =========
  const LS_KEY_MODE = '__x_opt_aggressive__';
  const LS_KEY_LIMIT = '__x_opt_limit__';
  const LS_KEY_BLOCK = '__x_opt_block_metrics__';

  let AGGRESSIVE = localStorage.getItem(LS_KEY_MODE) === '1';
  let LIMIT_FEED = Number(localStorage.getItem(LS_KEY_LIMIT) ?? 60); // số tweet tối đa giữ lại trong DOM
  let BLOCK_METRICS = localStorage.getItem(LS_KEY_BLOCK) === '1';

  const TARGET_FPS = 45; // Aggressive rAF cap
  const LONGTASK_AUTO_ON_MS = 1500; // tổng longtask trong ~5s để tự bật aggressive
  const LONGTASK_ULTRA_ON_MS = 3000; // ngưỡng bật "siêu gắt" trong runtime
  const MAX_VIDEOS_DECODE = 1; // chỉ 1 video hoạt động

  // ========= Menu =========
  if (typeof GM_registerMenuCommand === 'function') {
    GM_registerMenuCommand(`Aggressive: ${AGGRESSIVE ? 'ON' : 'OFF'}`, () => {
      AGGRESSIVE = !AGGRESSIVE;
      localStorage.setItem(LS_KEY_MODE, AGGRESSIVE ? '1' : '0');
      location.reload();
    });
    GM_registerMenuCommand(`Giới hạn tweet DOM (hiện: ${LIMIT_FEED})`, () => {
      const v = prompt('Giới hạn số tweet giữ lại trong DOM (0 = không giới hạn):', String(LIMIT_FEED));
      if (v == null) return;
      const n = Math.max(0, parseInt(v, 10) || 0);
      LIMIT_FEED = n;
      localStorage.setItem(LS_KEY_LIMIT, String(n));
      alert('OK! Reload để áp dụng.');
    });
    GM_registerMenuCommand(`Block metrics rác: ${BLOCK_METRICS ? 'ON' : 'OFF'}`, () => {
      BLOCK_METRICS = !BLOCK_METRICS;
      localStorage.setItem(LS_KEY_BLOCK, BLOCK_METRICS ? '1' : '0');
      alert('OK! Reload để áp dụng.');
    });
  }

  // ========= Utils =========
  const onReady = (fn) => (document.readyState === 'loading')
    ? document.addEventListener('DOMContentLoaded', fn, { once: true })
    : fn();

  const injectCSS = (css) => {
    const el = document.createElement('style');
    el.textContent = css;
    document.documentElement.appendChild(el);
    return el;
  };

  // ========= CSS: dọn compositor nặng + skip paint offscreen =========
  // - content-visibility: auto → bỏ render offscreen, cực kỳ lợi cho feed dài
  // - contain-intrinsic-size: tránh layout nhảy; 800px là giá trị "đệm" hợp lý cho tweet có media
  injectCSS(`
    * { backdrop-filter: none !important; }
    [style*="backdrop-filter"], [style*="filter: blur"], *[style*="blur("] { filter: none !important; }
    html, body, * { scroll-behavior: auto !important; }
    video { transform: none !important; will-change: auto !important; background-color: black !important; }
    article[role="article"], [data-testid="cellInnerDiv"] {
      content-visibility: auto !important;
      contain: layout paint style !important;
      contain-intrinsic-size: 800px !important;
    }
    /* bớt gradient layer nặng */
    [style*="linear-gradient("] { background-image: none !important; }
  `);

  if (AGGRESSIVE) {
    injectCSS(`
      * { animation: none !important; transition: none !important; }
    `);
  }

  // ========= Ép passive listeners cho scroll/touch/wheel =========
  (function patchAddEventListener() {
    const origAdd = EventTarget.prototype.addEventListener;
    const passiveEvents = new Set(['touchstart','touchmove','wheel','mousewheel','scroll']);
    EventTarget.prototype.addEventListener = function (type, listener, options) {
      if (passiveEvents.has(type)) {
        if (options == null) options = { passive: true };
        else if (typeof options === 'boolean') options = { capture: options, passive: true };
        else if (typeof options === 'object' && options.passive == null) options = { ...options, passive: true };
      }
      return origAdd.call(this, type, listener, options);
    };
  })();

  // ========= Chặn preload/prefetch link =========
  const nukePreloads = () => {
    document.querySelectorAll('link[rel="preload"], link[rel="prefetch"]').forEach(l => l.remove());
  };
  new MutationObserver(nukePreloads).observe(document.documentElement, { childList: true, subtree: true });
  onReady(nukePreloads);

  // ========= (Tuỳ chọn) Block metrics rác (an toàn, không đụng feed chính) =========
  // Chặn những endpoint "client_event", "impression", "engagement", "scribe", "metrics" để bớt spam
  if (BLOCK_METRICS) {
    const noisy = /\/(client_event|impression|engagement|scribe|metrics|ad_event)/i;
    const origFetch = window.fetch.bind(window);
    window.fetch = (input, init) => {
      try {
        const url = (typeof input === 'string') ? input : (input?.url ?? '');
        if (noisy.test(url)) {
          // trả response rỗng 204
          return Promise.resolve(new Response(null, { status: 204 }));
        }
      } catch {}
      return origFetch(input, init);
    };
  }

  // ========= Video: tối ưu + pause offscreen + chỉ 1 video hoạt động =========
  const activeVideos = new Set();
  let playingNow = null;

  const optimizeVideo = (v) => {
    if (!v || v.__xOptimized) return;
    v.__xOptimized = true;
    v.autoplay = false;
    v.loop = false;
    v.removeAttribute('controls');
    v.preload = 'metadata';
    v.style.transform = 'none';
    v.style.willChange = 'auto';
    v.style.backgroundColor = 'black';

    // chỉ 1 video hoạt động → pause cái khác khi play cái này
    v.addEventListener('play', () => {
      if (playingNow && playingNow !== v) {
        try { playingNow.pause(); } catch {}
      }
      playingNow = v;
      activeVideos.add(v);
    }, { passive: true });

    v.addEventListener('pause', () => {
      activeVideos.delete(v);
      if (playingNow === v) playingNow = null;
    }, { passive: true });
  };

  const scanVideos = (root = document) => {
    root.querySelectorAll('video').forEach(optimizeVideo);
  };
  onReady(scanVideos);

  new MutationObserver((muts) => {
    for (const m of muts) {
      if (m.addedNodes) {
        m.addedNodes.forEach(node => {
          if (node && node.nodeType === 1) {
            if (node.tagName === 'VIDEO') optimizeVideo(node);
            else if (node.querySelectorAll) scanVideos(node);
          }
        });
      }
    }
  }).observe(document.documentElement, { childList: true, subtree: true });

  // Pause video khi offscreen (tiết kiệm decode)
  const io = new IntersectionObserver((entries) => {
    for (const e of entries) {
      const v = e.target;
      if (!(v instanceof HTMLVideoElement)) continue;
      if (e.isIntersecting) {
        // nếu không có video nào đang chạy, cho phép play khi user bấm
      } else {
        try { v.pause(); } catch {}
      }
    }
  }, { root: null, threshold: 0.001 });
  onReady(() => document.querySelectorAll('video').forEach(v => io.observe(v)));

  // ========= Giới hạn DOM feed: giữ tối đa N tweet để giảm memory/layout =========
  function gcFeed() {
    if (!LIMIT_FEED) return;
    const nodes = document.querySelectorAll('article[role="article"]');
    if (nodes.length <= LIMIT_FEED) return;
    // ẩn bớt mấy cái quá cũ (nhanh, ít rủi ro hơn remove)
    for (let i = 0; i < nodes.length - LIMIT_FEED; i++) {
      const el = nodes[i];
      if (!el.__xHidden) {
        el.style.display = 'none';
        el.__xHidden = true;
        // giải phóng video nếu có
        el.querySelectorAll('video').forEach(v => {
          try { v.pause(); } catch {}
        });
      }
    }
  }
  setInterval(gcFeed, 1500);

  // ========= Aggressive mode runtime (rAF cap + min setInterval) =========
  const origRAF = window.requestAnimationFrame.bind(window);
  const origSetInterval = window.setInterval.bind(window);
  let lastRAF = 0;
  let useRAFCap = AGGRESSIVE;
  let minInterval = AGGRESSIVE ? 100 : 0;

  window.requestAnimationFrame = (cb) => {
    if (!useRAFCap) return origRAF(cb);
    return origRAF((ts) => {
      if (ts - lastRAF >= (1000 / TARGET_FPS)) {
        lastRAF = ts;
        try { cb(ts); } catch {}
      } else {
        origRAF(cb);
      }
    });
  };
  window.setInterval = (fn, delay, ...args) => {
    const d = (delay == null || delay < minInterval) ? (minInterval || delay || 0) : delay;
    return origSetInterval(fn, d, ...args);
  };

  // ========= Auto-detect long tasks → tự bật Aggressive/Ultra =========
  try {
    // dùng PerformanceObserver (Long Task API)
    let bucket = 0;
    const po = new PerformanceObserver((list) => {
      for (const e of list.getEntries()) {
        bucket += e.duration || 0;
      }
    });
    po.observe({ type: 'longtask', buffered: true });

    setInterval(() => {
      const total = bucket; bucket = 0;
      // tự bật aggressive nếu lag nhiều
      if (!useRAFCap && total > LONGTASK_AUTO_ON_MS) {
        useRAFCap = true; minInterval = 100;
        console.warn('[Oppai1442] Aggressive ON (auto): longtasks=%dms', total|0);
      }
      // siêu gắt nếu quá nặng
      if (total > LONGTASK_ULTRA_ON_MS) {
        useRAFCap = true; minInterval = 150; // nâng min interval lên thêm
        document.documentElement.classList.add('x-ultra');
        injectCSS(`.x-ultra *{ animation:none!important; transition:none!important; }`);
        console.warn('[Oppai1442] Ultra mode ON: longtasks=%dms', total|0);
      }
    }, 5000);
  } catch {}

  // ========= Safety: pause hết khi tab ẩn =========
  document.addEventListener('visibilitychange', () => {
    if (document.hidden) {
      document.querySelectorAll('video').forEach(v => { try { v.pause(); } catch {} });
    }
  }, { passive: true });

  // ========= Ảnh: ép lazy/async decode (nhẹ layout) =========
  const tuneImg = (img) => {
    if (!img) return;
    img.loading = 'lazy';
    img.decoding = 'async';
  };
  const scanImg = (root=document) => root.querySelectorAll('img').forEach(tuneImg);
  onReady(scanImg);
  new MutationObserver((muts) => {
    for (const m of muts) for (const n of m.addedNodes) {
      if (n && n.nodeType === 1) {
        if (n.tagName === 'IMG') tuneImg(n);
        else if (n.querySelectorAll) scanImg(n);
      }
    }
  }).observe(document.documentElement, { childList:true, subtree:true });

})();