kiến thức Tổng hợp những addon chất cho Firefox / Chromium

@toi la gay :sosad:
Sau 1 thời gian sử dụng FloorP em đã nhận ra rằng, cùng một tần suất sử dụng, cùng số tabs và thói quen sử dụng thì em dùng FP chưa bao giờ máy em bị nóng rồi kêu ầm ầm lên? trong khi ngày trước dùng Brave y hệt như này mà cứ thi thoảng nó lại kêu ầm. Bác có biết tại sao ko
Nhiều lý do lắm:

  • Chrome thuật toán tải của nó là liên tục hiện nội dung web, tuy cho cảm giác sướng nhưng mà không thực sự tăng tốc lướt web chút nào, thậm chí còn có thể giảm tốc bởi Chrome = Firefox với nglayout paint delay=0, còn nếu dùng tối ưu nglayout của mình thì gần như thay đổi thuật toán tải trang của Firefox luôn nghĩa là không còn bắt chước Chrome nữa thì Firefox sẽ tải trang tiết kiệm CPU thay vì hiện từng mảng "liên tiếp" và dùng CPU+GPU render trang "liên tiếp" thì nó tải một phát 100% trang web vào RAM, rồi đau thì đau đau một lần rồi thôi dùng CPU+GPU hiển thị "1 phát duy nhất" nên CPU+GPU chỉ nhảy vọt lên duy nhất 1 lần. Xem video sau sẽ thấy cách Firefox tải trang sau khi đã tối ưu: https://streamable.com/tq9tr9 hoặc https://streamable.com/1l8y13
  • Nhân Chrome luôn nổi tiếng với việc dùng nhiều pin, và nó cũng nói lên phần nào vì nhiều pin = nhiều CPU + GPU trong quá trình sử dụng, rất đơn giản là vậy, chi tiết xem tại bài này nha:
  • Floorp là Firefox đã tối ưu, nghĩa là tắt sạch tác vụ chạy nên như bài này của mình, các tác vụ tuy nhẹ nhưng tích tiểu thành đại cái gì nó cũng đóng góp vào tài nguyên CPU: Tắt sạch tác vụ chạy nền, chia sẻ trải nghiệm của Firefox (an toàn 1000%)
  • Floorp có Sleeping Tab xịn, nên bật nhé vì nó ngon hơn cả Auto Tab Discard, nói chung là tính năng unload tab ngon nhất mình từng dùng mà mình là đã dùng rất nhiều addon kiểu này rồi, tất cả thua xa Sleeping Tab của Floorp về hiệu năng và tính ổn định
  • Floorp được biên dịch tối ưu tập lệnh LTO+PGO, thật ra so với Firefox 115 ESR gốc là điểm benchmark của Floorp đã gấp 2x rồi do rất nhiều người dùng test.
 
Last edited:
T có thắc mắc
Có mấy trang đọc truyện chữ vs manwa nó chèn ads vào. T có chơi ublock+umatrix+ nextdns rồi block phần tử nhưng nó vẫn hiện là do gì nhỉ
Thử block 3rd party cũng k dc, mà nếu block 1st party thì nó bay màu cái ads đấy nhưng mà chữ vs tranh nó bay cmnl, nghĩa là nó chơi embed vô hả ngài? Có cách nào khống chế cứng tụi này k thưa ngài? Có trang thì ublock nó chặn dc vẫn bị chừa 1 khoảng trống, đọc khó chịu lắm, block phần tử xong rồi qua trang khác lại bị lại, quái quỉ vl
ybwXN2f.gif
@toi la gay :sosad:

Sent from Paimon using vozFApp
Đầu tiên nếu dùng bản Mobile thì làm theo bài này:
Còn cứ đưa trang web sẽ tiện kiểm tra hơn, ở đây nhiều cao thủ uBlock lắm. Không đâu xa cứ lên #1 mở spoiler uBlock ra sẽ thấy:

Cảm ơn bác nhiều nha. Firefox có bác nhiệt tình quá.
Nhưng mình hệ đơn giản bác ạ. Nên chắc test cho vui thôi chứ vọc cái này mất tg thiệt sự 😀
Cảm ơn bác nhé :)
Tìm tòi cũng không thực sự cần thiết vì những cái rule tốt nhất có thể kiếm ở thread rồi nên chỉ cần copy-paste là xong, ở đây biết khả năng của uBlock tới đâu cũng là biết rằng có thể kiếm cái rule nó mạnh tới mức nào. :D
 
Có cách nào bookmark ngay chỗ mình cần luôn không mấy fen ơi?

Vd mình cần bookmark trang https://nextdns.io/ đúng ngay chỗ Natively supported on all major platforms — it only takes a few seconds to set up.
Khi mở bookmard ra nó nhảy ngay tới chỗ đó luôn.

View attachment 2091568
Dùng Edge/Chrome : Copy link to Highlight
FF xài tạm : https://addons.mozilla.org/en-US/firefox/addon/link-to-text-fragment/
Hóng các fen khác coi có Extension/Script nào khác không.
 
Tối ưu cuộn mượt cho Firefox Android.

Vấn đề: Tốc độ cuộn mạnh rồi thả tay ra của Firefox Android chậm khiến mỏi tay mới cuộn được một trang dài.

Giải pháp:
  • about:config
  • Tìm apz.fling_curve_function
  • Sửa:
apz.fling_curve_function_x10.0
apz.fling_curve_function_x20.21
apz.fling_curve_function_y10.0
apz.fling_curve_function_y20.81

Như vậy khi cuộn sẽ đỡ mỏi tay hơn, kiểu khi cuộn mạnh thả tay nó sẽ nhảy một khoảng dài hơn, sẽ khiến bớt mệt mỏi khi xem trang dài toàn ảnh kiểu cuộn.

Nguồn:
 
Dùng Edge/Chrome : Copy link to Highlight
FF xài tạm : https://addons.mozilla.org/en-US/firefox/addon/link-to-text-fragment/
Hóng các fen khác coi có Extension/Script nào khác không.
cái gì có id thì dễ rồi còn scroll to text thì thằng firefox nó không support text fragment nên nó có thể hoạt động hoặc không
 
cái sleeping tabs của floorp không có icon zz cho tab đã bị unload nhỉ các bác
Thử giải pháp này xem sao, thật ra là để giải quyết trường hợp khi xài giao diện nhẹ hình nền.

userChrome.css, đổi màu tùy ý:
Code:
/* Unloaded Tab Color */
.tabbrowser-tab[pending=true] .tab-background {
    background: lightgray!important;
    opacity: 0.4!important;
}

Đánh dấu tab đã unload là màu xám nhạt, còn không unload thì nhìn xuyên thấu:
1695638232100.png



Vừa nghĩ lại, làm thế này mới xấu, ngược lại là tab đã unload trong suốt, tab thường màu nhạt:
Code:
/* Unloaded Tab Color */
.tabbrowser-tab:not([pending=true]):not([selected=true]) .tab-background {
    background: lightgreen!important;
    opacity: 0.4!important;
}

1695639121666.png
 
Last edited:
@Salad @mieuboy Đã tìm ra cách sửa lỗi:
  • Vào about:serviceworkers
  • Tìm voz.vn
  • Unregister
  • Vào My Filters, thêm:
Code:
voz.vn##^.p-body-sidebar
||voz.vn$csp=worker-src 'none'
voz.vn##.p-body-sidebarCol:style(display:none!important)

100% sạch nhé, kể cả có F5 mỏi tay: https://streamable.com/o3ly9l

Lý do là do thằng serviceworker nó cache trang web khiến uBlock tải thẳng từ cache chưa được lọc của serviceworker.
Bác ơi như vậy muốn chặn cái khác là phải thêm cái ||voz.vn$csp=worker-src 'none' vào hả
 
Bác ơi như vậy muốn chặn cái khác là phải thêm cái ||voz.vn$csp=worker-src 'none' vào hả
Không hẳn, tùy từng trang dùng serviceworker để cache nội dung web mới cần (Vâu là một ví dụ hiếm thấy: https://voz.vn/service_worker.js), nhiều trang không dùng tới sẽ không ảnh hưởng ví dụ trang ở ví dụ thứ nhất, thật ra cache kiểu này gây khó chịu cho người dùng hơn là hữu ích.

Đa phần trang web dùng cái serviceworker này để hiển thị thông báo kiểu ai đã gửi tin cho bạn, ai đã Like bài viết của bạn... như Facebook, Twitter, Tốc Tốc...

HE thì nó hiện đại hơn uBlock, không thèm xóa CSP worker-src mà vẫn chạy ngon mới vãi chứ :D
HE thì về khoản lọc nội dung web nó mạnh hơn nhiều và có hiệu năng tốt, vì RegEx so với HTML Parser (thật ra uBlock khi dùng HTML Filter đã parse trước nội dung web nên mới dùng được cú pháp CSS) hiệu năng tốt hơn, và quan trọng là HE can thiệp sâu vào những thẻ script, style được, tham khảo bài viết này sẽ thấy HTML Filter bó tay, còn HE xử đẹp:
 
Last edited:
Sửa lại script trên greasyfork để click vào thumbnail thì mở youtube bằng mpv, còn click vào tên thì mở trong trình duyệt
JavaScript:
// ==UserScript==
// @name        Click on video thumbnail to play in MPV
// @name:ru     Нажми на митиатюру для проигрывания в MPV
// @namespace   nsinister.scripts.videothumb2mpv
// @match       https://*.youtube.com/*
// @match       https://vimeo.com/*
// @grant       none
// @version     0.1
// @author      nSinister
// @license     MIT
// @description Opens videos in external player (mpv) by simply clicking on a thumbnail.
// @description:ru Проигрывает ролики во внешнем плеере (mpv) по нажатию на миниатюру
//
// ==/UserScript==

"use strict";


let observer;
let listeners = [];

let sites = {
  "youtube.com": { sel: "a.ytd-thumbnail", url: "https://www.youtube.com", needsFullUrl: true },
  "vimeo.com": { sel: "a.iris_video-vital__overlay", url: "https://vimeo.com", needsFullUrl: false },
};

// Watches for new elements based on selector to appear on page and assigns a function to them
function ready(selector, func) {
    listeners.push({ selector: selector, func: func });
    if (!observer) {
        observer = new MutationObserver(checkDOM);
        observer.observe(document.documentElement, { childList: true, subtree: true });
    }
    checkDOM();
}

function checkDOM() {
    for (let i = 0, len = listeners.length, listener, elements; i < len; i++) {
        listener = listeners[i];
        elements = document.querySelectorAll(listener.selector);
        for (let j = 0, jlen = elements.length, element; j < jlen; j++) {
            element = elements[j];
            if (!element.ready) {
                element.ready = true;
                listener.func.call(element, element);
            }
        }
    }
}

function GM_btoaUrl(url) {
  return btoa(url).replace(/\//g, "_").replace(/\+/g, "-").replace(/\=/g, "");
}


// Replaces https:// hyperlinks with mpv:// and overrides click event
function replaceLink(node, site) {
  if(node) {
    let hrefval = node.getAttribute('href');
    if (hrefval == null || hrefval.startsWith("mpv"))
      return;

    let full_url = (site.needsFullUrl ? site.url : "") + hrefval;
    if (full_url.startsWith('http')) {
      url = full_url;
    }
    if (url == '') {
      var url = location.href;
    }

    var subs = '';
    var s = url;
    var bs = GM_btoaUrl(s);
    var url2 = 'mpv://play/' + bs + '/' + "?referer=" + GM_btoaUrl(location.href);
    if (subs != '') {
      url2 = url2 + '?subs=' + GM_btoaUrl(subs);
    }

    node.setAttribute('href', url2);
    node.addEventListener('click', function(event){
      event.preventDefault();
      event.stopPropagation();
      location.href = url2;
    });
  }
}

// Detects and returns current site from the list of known websites
function detectSite(sites) {
  let site;
  for (let s in sites) {
    site = sites[s];
    if (location.href.includes(s)) {
      return site;
    }
  }
  return null;
}

let site = detectSite(sites)
if (site) {
  ready(site.sel, function(element) {
      replaceLink(element, site);
  });
}

Cơ chế là select a.ytd-thumbnail và đổi link thành protocol của mpv có dạng mpv://play/ Tuy nhiên, Youtube có 1 cái tính năng giời ơi là "Hovering to Play" (di chuột lên trên thumbnail để chạy) ở trang Home, Subscription, Search và mấy chỗ này sẽ không có a.ytd-thumbnail để đổi link. Cái thanh gợi ý bên tay phải lúc xem video trên trình duyệt thì vẫn hoạt động.

Giải pháp sẽ có 2 cách:
  1. Đăng nhập vào Google và settings để tắt Inline Playback
  2. Dùng Cookie Manager để sửa Cookie của Youtube: Thêm f7=1 vào PREF (Nếu PREF đang có giá trị thì thêm &f7=1 vào cuối cùng)
  3. Dùng Header Editor thêm Set-Cookie vào Response Header để trình duyệt tự lưu cookie
  • Rule type: Modify response header
  • Match type: Regular expression
  • Match rule: .*?youtube.*?/
  • Execute type: Custom function (cần bật Include request headers in custom function trong Options của HE)
JavaScript:
for (const a in val) {
    if (val[a].name.toLowerCase() === 'set-cookie') {
        val[a].value+='\nPREF=f7=1';
    }
}

1695633291370.png
 
Cơ chế là select a.ytd-thumbnail và đổi link thành protocol của mpv có dạng mpv://play/ Tuy nhiên, Youtube có 1 cái tính năng giời ơi là "Hovering to Play" (di chuột lên trên thumbnail để chạy) ở trang Home, Subscription, Search và mấy chỗ này sẽ không có a.ytd-thumbnail để đổi link. Cái thanh gợi ý bên tay phải lúc xem video trên trình duyệt thì vẫn hoạt động.
Mình góp gạo thêm một giải pháp nữa là dùng Youtube Mobile (tại trong thread này truyền bá Youtube Mobile đạo), mình vừa mod lại script xong tuy vẫn còn vụ khi search trên m.youtube.com thì url không được tự động chuyển thành dạng mpv:// mà MutationObserver thì mình ít dùng nên cũng không hiểu cơ chế lắm:

Code:
// ==UserScript==
// @name        Click on video thumbnail to play in MPV
// @name:ru     Нажми на митиатюру для проигрывания в MPV
// @namespace   nsinister.scripts.videothumb2mpv
// @match       https://*.youtube.com/*
// @match       https://vimeo.com/*
// @grant       none
// @version     0.2
// @author      nSinister
// @license     MIT
// @description Opens videos in external player (mpv) by simply clicking on a thumbnail.
// @description:ru Проигрывает ролики во внешнем плеере (mpv) по нажатию на миниатюру
//
// ==/UserScript==

"use strict";


let observer;
let listeners = [];

let sites = {
  "www.youtube.com": { sel: "a.ytd-thumbnail", url: "https://www.youtube.com", needsFullUrl: true },
  "m.youtube.com": { sel: "a.media-item-thumbnail-container", url: "https://m.youtube.com", needsFullUrl: true },
  "vimeo.com": { sel: "a.iris_video-vital__overlay", url: "https://vimeo.com", needsFullUrl: false },
};

// Watches for new elements based on selector to appear on page and assigns a function to them
function ready(selector, func) {
    listeners.push({ selector: selector, func: func });
    if (!observer) {
        observer = new MutationObserver(checkDOM);
        observer.observe(document.documentElement, { childList: true, subtree: true });
    }
    checkDOM();
}

function checkDOM() {
    for (let i = 0, len = listeners.length, listener, elements; i < len; i++) {
        listener = listeners[i];
        elements = document.querySelectorAll(listener.selector);
        for (let j = 0, jlen = elements.length, element; j < jlen; j++) {
            element = elements[j];
            if (!element.ready) {
                element.ready = true;
                listener.func.call(element, element);
            }
        }
    }
}

function GM_btoaUrl(url) {
  return btoa(url).replace(/\//g, "_").replace(/\+/g, "-").replace(/\=/g, "");
}


// Replaces https:// hyperlinks with mpv:// and overrides click event
function replaceLink(node, site) {
  if(node) {
    let hrefval = node.getAttribute('href');
    if (hrefval == null || hrefval.startsWith("mpv"))
      return;

    let full_url = (site.needsFullUrl ? site.url : "") + hrefval;
    if (full_url.startsWith('http')) {
      url = full_url;
    }
    if (url == '') {
      var url = location.href;
    }

    var subs = '';
    var s = url;
    var bs = GM_btoaUrl(s);
    var url2 = 'mpv://play/' + bs + '/' + "?referer=" + GM_btoaUrl(location.href);
    if (subs != '') {
      url2 = url2 + '?subs=' + GM_btoaUrl(subs);
    }

    node.setAttribute('href', url2);
    node.addEventListener('click', function(event){
      event.preventDefault();
      event.stopPropagation();
      location.href = url2;
    });
  }
}

// Detects and returns current site from the list of known websites
function detectSite(sites) {
  let site;
  for (let s in sites) {
    site = sites[s];
    if (location.href.includes(s)) {
      return site;
    }
  }
  return null;
}

let site = detectSite(sites)
if (site) {
  ready(site.sel, function(element) {
      replaceLink(element, site);
  });
}

1695642659361.png

Đã cập nhập lên #1, cảm ơn bạn đã đóng góp.
 

Attachments

  • 1695642894129.png
    1695642894129.png
    367.8 KB · Views: 42
Mình góp gạo thêm một giải pháp nữa là dùng Youtube Mobile (tại trong thread này truyền bá Youtube Mobile đạo), mình vừa mod lại script xong tuy vẫn còn vụ khi search trên m.youtube.com thì url không được tự động chuyển thành dạng mpv:// mà MutationObserver thì mình ít dùng nên cũng không hiểu cơ chế lắm:

Code:
// ==UserScript==
// @name        Click on video thumbnail to play in MPV
// @name:ru     Нажми на митиатюру для проигрывания в MPV
// @namespace   nsinister.scripts.videothumb2mpv
// @match       https://*.youtube.com/*
// @match       https://vimeo.com/*
// @grant       none
// @version     0.2
// @author      nSinister
// @license     MIT
// @description Opens videos in external player (mpv) by simply clicking on a thumbnail.
// @description:ru Проигрывает ролики во внешнем плеере (mpv) по нажатию на миниатюру
//
// ==/UserScript==

"use strict";


let observer;
let listeners = [];

let sites = {
  "www.youtube.com": { sel: "a.ytd-thumbnail", url: "https://www.youtube.com", needsFullUrl: true },
  "m.youtube.com": { sel: "a.media-item-thumbnail-container", url: "https://m.youtube.com", needsFullUrl: true },
  "vimeo.com": { sel: "a.iris_video-vital__overlay", url: "https://vimeo.com", needsFullUrl: false },
};

// Watches for new elements based on selector to appear on page and assigns a function to them
function ready(selector, func) {
    listeners.push({ selector: selector, func: func });
    if (!observer) {
        observer = new MutationObserver(checkDOM);
        observer.observe(document.documentElement, { childList: true, subtree: true });
    }
    checkDOM();
}

function checkDOM() {
    for (let i = 0, len = listeners.length, listener, elements; i < len; i++) {
        listener = listeners[i];
        elements = document.querySelectorAll(listener.selector);
        for (let j = 0, jlen = elements.length, element; j < jlen; j++) {
            element = elements[j];
            if (!element.ready) {
                element.ready = true;
                listener.func.call(element, element);
            }
        }
    }
}

function GM_btoaUrl(url) {
  return btoa(url).replace(/\//g, "_").replace(/\+/g, "-").replace(/\=/g, "");
}


// Replaces https:// hyperlinks with mpv:// and overrides click event
function replaceLink(node, site) {
  if(node) {
    let hrefval = node.getAttribute('href');
    if (hrefval == null || hrefval.startsWith("mpv"))
      return;

    let full_url = (site.needsFullUrl ? site.url : "") + hrefval;
    if (full_url.startsWith('http')) {
      url = full_url;
    }
    if (url == '') {
      var url = location.href;
    }

    var subs = '';
    var s = url;
    var bs = GM_btoaUrl(s);
    var url2 = 'mpv://play/' + bs + '/' + "?referer=" + GM_btoaUrl(location.href);
    if (subs != '') {
      url2 = url2 + '?subs=' + GM_btoaUrl(subs);
    }

    node.setAttribute('href', url2);
    node.addEventListener('click', function(event){
      event.preventDefault();
      event.stopPropagation();
      location.href = url2;
    });
  }
}

// Detects and returns current site from the list of known websites
function detectSite(sites) {
  let site;
  for (let s in sites) {
    site = sites[s];
    if (location.href.includes(s)) {
      return site;
    }
  }
  return null;
}

let site = detectSite(sites)
if (site) {
  ready(site.sel, function(element) {
      replaceLink(element, site);
  });
}


Đã cập nhập lên #1, cảm ơn bạn đã đóng góp.
Lỡ rồi múc luôn mấy cái streamlink như twitch đi bác =]]
7WYibTl.gif
 
Mình góp gạo thêm một giải pháp nữa là dùng Youtube Mobile (tại trong thread này truyền bá Youtube Mobile đạo), mình vừa mod lại script xong tuy vẫn còn vụ khi search trên m.youtube.com thì url không được tự động chuyển thành dạng mpv:// mà MutationObserver thì mình ít dùng nên cũng không hiểu cơ chế lắm:

Code:
// ==UserScript==
// @name        Click on video thumbnail to play in MPV
// @name:ru     Нажми на митиатюру для проигрывания в MPV
// @namespace   nsinister.scripts.videothumb2mpv
// @match       https://*.youtube.com/*
// @match       https://vimeo.com/*
// @grant       none
// @version     0.2
// @author      nSinister
// @license     MIT
// @description Opens videos in external player (mpv) by simply clicking on a thumbnail.
// @description:ru Проигрывает ролики во внешнем плеере (mpv) по нажатию на миниатюру
//
// ==/UserScript==

"use strict";


let observer;
let listeners = [];

let sites = {
  "www.youtube.com": { sel: "a.ytd-thumbnail", url: "https://www.youtube.com", needsFullUrl: true },
  "m.youtube.com": { sel: "a.media-item-thumbnail-container", url: "https://m.youtube.com", needsFullUrl: true },
  "vimeo.com": { sel: "a.iris_video-vital__overlay", url: "https://vimeo.com", needsFullUrl: false },
};

// Watches for new elements based on selector to appear on page and assigns a function to them
function ready(selector, func) {
    listeners.push({ selector: selector, func: func });
    if (!observer) {
        observer = new MutationObserver(checkDOM);
        observer.observe(document.documentElement, { childList: true, subtree: true });
    }
    checkDOM();
}

function checkDOM() {
    for (let i = 0, len = listeners.length, listener, elements; i < len; i++) {
        listener = listeners[i];
        elements = document.querySelectorAll(listener.selector);
        for (let j = 0, jlen = elements.length, element; j < jlen; j++) {
            element = elements[j];
            if (!element.ready) {
                element.ready = true;
                listener.func.call(element, element);
            }
        }
    }
}

function GM_btoaUrl(url) {
  return btoa(url).replace(/\//g, "_").replace(/\+/g, "-").replace(/\=/g, "");
}


// Replaces https:// hyperlinks with mpv:// and overrides click event
function replaceLink(node, site) {
  if(node) {
    let hrefval = node.getAttribute('href');
    if (hrefval == null || hrefval.startsWith("mpv"))
      return;

    let full_url = (site.needsFullUrl ? site.url : "") + hrefval;
    if (full_url.startsWith('http')) {
      url = full_url;
    }
    if (url == '') {
      var url = location.href;
    }

    var subs = '';
    var s = url;
    var bs = GM_btoaUrl(s);
    var url2 = 'mpv://play/' + bs + '/' + "?referer=" + GM_btoaUrl(location.href);
    if (subs != '') {
      url2 = url2 + '?subs=' + GM_btoaUrl(subs);
    }

    node.setAttribute('href', url2);
    node.addEventListener('click', function(event){
      event.preventDefault();
      event.stopPropagation();
      location.href = url2;
    });
  }
}

// Detects and returns current site from the list of known websites
function detectSite(sites) {
  let site;
  for (let s in sites) {
    site = sites[s];
    if (location.href.includes(s)) {
      return site;
    }
  }
  return null;
}

let site = detectSite(sites)
if (site) {
  ready(site.sel, function(element) {
      replaceLink(element, site);
  });
}


Đã cập nhập lên #1, cảm ơn bạn đã đóng góp.
Con script này ngon quá, càng ngày xem yt bằng mpv càng tiện rồi. Càng dễ dụ người mới dùng mpv để xem yt
vxE8C4d.png
 
dạo này họ nhà foxie cứ thích xua đuổi mình

flop 11.4 thì mất nút full screen trên toolbar trong khi phím f11 thì mình đã để làm việc khác

tete thì không có trang about performance

mercury với waterfox thì không biết build kiểu gì mà sửa file omni.ja không thấy có tác dụng :LOL:
 
dạo này họ nhà foxie cứ thích xua đuổi mình

flop 11.4 thì mất nút full screen trên toolbar trong khi phím f11 thì mình đã để làm việc khác

tete thì không có trang about performance

mercury với waterfox thì không biết build kiểu gì mà sửa file omni.ja không thấy có tác dụng :LOL:
nhảy qua khẩm dô với cromite đi nào :byebye:
 
tete thì không có trang about performance
Chửi những tên như ở trang Rách Nát này này, vì chúng mà giờ giọt nước tràn mợ nó ly rồi, nằng nặc nằng nặc đòi xóa, mất tính năng này rồi sao mình chứng minh cho người khác một addon chiếm bao nhiêu RAM nữa:


Nguyên nhân:
The organization found about:processes is much better than about:performance. To inform users os this change, the former now redirects to the latter.
 
Back
Top