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

Mới nâng lên 113 xong, ngon nuột nà, các trang dùng TLSv1.3 là không bao giờ bị nhà mạng nhìn thấy do dùng ECH, đợi tete ra 113 chiến luôn hiện tại đã là 113b9 rồi, tầm 1-2 bản nữa là nó thành chính thức :D
oài, thử cái speedometer được hẳn 130 luôn, hơn edge trên dưới 10 điểm, đợi bản của tete là hết ý
UqVn1q4.png

@conbimbiplun bác dùng bản của tete009 nhé, có tính năng của nightly nhưng mà là code của bản stable, không auto-update link đây: https://drive.google.com/drive/fold...sZklqUkk?resourcekey=0-4ZCt5bzhBybT_hL9JzsokQ
 
các bác đang dùng bản Firefox PC nào thế, e dùng Nightly để cài được Fastforward, mà thấy hay crash và update hoài :too_sad:
Crash nhiều khả năng vì nó là Nightly nên nó chưa ổn định, Firefox mình toàn bật 6 tháng tắt một lần có từng đấy thời gian không bị crash.

Thật ra bạn không cần dùng Nightly để cài FF đâu, dùng Tete009 là ok thôi: http://www1.plala.or.jp/tete009/en-US/software.html#FFDL

Tete này nó hơn Nightly ở chỗ nó dùng bản stable, mà vẫn là Nightly nên cài được FF.

Thử làm một số bước sau:
  • Cài uBlock và Auto Tab Discard ở #1, chặn quảng cáo giúp giảm crash, unload tab giúp giảm crash
  • Avast được tìm ra là khiến Firefox crash liên tục, nên ngoại lệ Firefox nếu dùng Avast, Avira cũng gây lỗi chả kém (link / 2)
 
Last edited:
Giới thiệu addon Checkmarks, một addon siêu nhẹ dùng để:

  • Kiểm tra bookmark chết và xóa
  • Tải lại những trang chưa tải favicon, hoặc cập nhập mới
  • Sắp xếp lại bookmark theo thứ tự
  • Và sau khi thực hiện xong các thao tác xử lý bookmark, tắt nó đi là xong khi nào cần lại bật lên dùng, tốn 0%CPU, 0% RAM.

Combo với addon Bookmark Batch Updater để sửa tên miền cho các bookmark chết, nhiều khi có để ý rất nhiều trang mình bookmark cứ 1 tháng nó đổi tên miền một lần, vậy nên addon này khắc phục điều đó.

Cả hai addon này toàn là kiểu dùng một lần xong cả năm may ra mới mở lên dùng tiếp, không muốn nó làm danh sách addon dài ra thì cứ mạnh dạn tắt đi.
 
Có cách nào để khi mình lưu ảnh nó không hỏi nữa không bạn ?
Giới thiệu addon Checkmarks, một addon siêu nhẹ dùng để:

  • Kiểm tra bookmark chết và xóa
  • Tải lại những trang chưa tải favicon, hoặc cập nhập mới
  • Sắp xếp lại bookmark theo thứ tự
  • Và sau khi thực hiện xong các thao tác xử lý bookmark, tắt nó đi là xong khi nào cần lại bật lên dùng, tốn 0%CPU, 0% RAM.
Mỗi lần cho thằng này quét là nó quét lại toàn bộ nên khá lâu, có cách để cho nó chỉ quét mấy bookmark mình vừa add hoặc 1 folder nhất định thôi không bạn ?
 
Last edited:
Giới thiệu addon Checkmarks, một addon siêu nhẹ dùng để:

  • Kiểm tra bookmark chết và xóa
  • Tải lại những trang chưa tải favicon, hoặc cập nhập mới
  • Sắp xếp lại bookmark theo thứ tự
  • Và sau khi thực hiện xong các thao tác xử lý bookmark, tắt nó đi là xong khi nào cần lại bật lên dùng, tốn 0%CPU, 0% RAM.

Combo với addon Bookmark Batch Updater để sửa tên miền cho các bookmark chết, nhiều khi có để ý rất nhiều trang mình bookmark cứ 1 tháng nó đổi tên miền một lần, vậy nên addon này khắc phục điều đó.

Cả hai addon này toàn là kiểu dùng một lần xong cả năm may ra mới mở lên dùng tiếp, không muốn nó làm danh sách addon dài ra thì cứ mạnh dạn tắt đi.
Có cái Pocket tính năng tương tự mà ít ai dùng thím nhỉ
 
thím @toi la gay :sosad: coi thử giùm iêm lỗi này là lỗi gì nhỉ:

Code:
[
    {
        "level": "error",
        "message": "Unknown error: CRASH",
        "date": "2023-04-29T02:48:27.104Z",
        "line": "/background/multithreaded-task.js:569:21",
        "extra": "CRASH",
        "stack": [
            "fail@moz-extension://63fdd7b4-1868-403f-95a8-b104beede934/background/multithreaded-task.js:569:21",
            "saveFile@moz-extension://63fdd7b4-1868-403f-95a8-b104beede934/background/multithreaded-task.js:478:22"
        ]
    }
]

Crash không save được. Để mình thử FF64bit xem sao.

1682736625076.png


EDIT: 64bit lại tải bình thường - thử lại 1 lần với FF 104.0.2 32bit lần nữa xem sao.
1682737475532.png


EDIT2: thử lần nữa với FF 104.0.2 32bit vẫn lỗi khi lưu => Qua xài x64 thôi :)))
1682738296585.png
 
Last edited:
Có cách nào để khi mình lưu ảnh nó không hỏi nữa không bạn ?
Bởi khi tải ảnh Firefox nó dùng Save As... nên cài tạm cái addon nhè nhẹ này vào là có tính năng Save không có As, nghĩa là lưu không bị hỏi: https://addons.mozilla.org/en-US/firefox/addon/save-image/

Addon này nhẹ cực kỳ, cái vào như không cài gì cả, nó còn nhẹ hơn cả Search By Image.
Mỗi lần cho thằng này quét là nó quét lại toàn bộ nên khá lâu, có cách để cho nó chỉ quét mấy bookmark mình vừa add hoặc 1 folder nhất định thôi không bạn ?
Được thì cũng được, cơ mà phải xoay sở chút:
  • Đầu tiên Ctrl+Shift+O mở Bookmark Manager
  • Tìm cái folder tên là Recently Bookmarked rồi quẳng vào Checkmarks hoặc cứ ném hết đống bookmark trong đó vào một folder rồi quẳng nó vào Checkmarks.
(Nếu không có folder tên Recently Bookmarked thì tạo mới một folder, sau đó copy đoạn này place:sort=12&excludeQueries=1&maxResults=20&queryType=1 vào rồi Save, có thể tăng số lượng bookmark xuất hiện trong folder bằng cách chỉnh 20 thành một con số tùy ý)

Như vậy Checkmarks nó sẽ chỉ kiểm tra 1 folder thay vì hàng triệu bookmark.

1682738181364.png
 
Last edited:
thím @toi la gay :sosad: coi thử giùm iêm lỗi này là lỗi gì nhỉ:

Crash không save được. Để mình thử FF64bit xem sao.

View attachment 1806337

EDIT: 64bit lại tải bình thường - thử lại 1 lần với FF 104.0.2 32bit lần nữa xem sao.
View attachment 1806351

EDIT2: thử lần nữa với FF 104.0.2 32bit vẫn lỗi khi lưu => Qua xài x64 thôi :)))
View attachment 1806361
Do đồ cổ 104 nên tính tương thích kém đó, tiếc là Tete giờ không còn 32bit nữa rồi và ông người Nhật chưa nghĩ ra cách để biên dịch 32bit với thiết lập của ổng, thôi dù sao sắp tới cũng buộc phải lên 113 thôi, bản này quá ngon không skip được vừa nhanh vừa có ECS. :D
 
thím @toi la gay :sosad: coi thử giùm iêm lỗi này là lỗi gì nhỉ:

Code:
[
    {
        "level": "error",
        "message": "Unknown error: CRASH",
        "date": "2023-04-29T02:48:27.104Z",
        "line": "/background/multithreaded-task.js:569:21",
        "extra": "CRASH",
        "stack": [
            "fail@moz-extension://63fdd7b4-1868-403f-95a8-b104beede934/background/multithreaded-task.js:569:21",
            "saveFile@moz-extension://63fdd7b4-1868-403f-95a8-b104beede934/background/multithreaded-task.js:478:22"
        ]
    }
]

Crash không save được. Để mình thử FF64bit xem sao.

View attachment 1806337

EDIT: 64bit lại tải bình thường - thử lại 1 lần với FF 104.0.2 32bit lần nữa xem sao.
View attachment 1806351

EDIT2: thử lần nữa với FF 104.0.2 32bit vẫn lỗi khi lưu => Qua xài x64 thôi :)))
View attachment 1806361
Có vẻ bác vẫn thích bản 32bit nhỉ, dùng 64bit đâu có chết ai đâu bác
PLJmXG1.png
 
Nhờ các bác xem giúp các bản portable firefox này ạ:

https://github.com/portapps/phyrox-portable

https://github.com/portapps/phyrox-esr-portable

https://github.com/portapps/phyrox-developer-portable

Em đang dùng bản esr của nó. Đây là phyrox-esr-portable.yml của em:

Code:
common:
    disable_log: true
    args: ["-private"]
    env: {}
    app_path: ""
app:
    profile: default
    multiple_instances: false
    disable_telemetry: true
    disable_firefox_studies: true
    locale: vi
    cleanup: true

100% an toàn, dev là CrazyMax đóng góp rất nhiều cho cộng đồng mã mở, nhược điểm là ông này một mình cân cả thế giới, nhìn vào Github sẽ thấy ông này đang ở trạng thái tự kỷ, không cập nhập gì gần đây: https://github.com/orgs/portapps/repositories

Nhìn chung là ngon ngang có chút hơn Portableapps.

1682763255338.png


Ngon mà, bản mới nhất đây diệt luôn alert mà bạn @8th_horcrux hôm qua mới hỏi đây, không nên biến nó thành Userscript nhé vì script này được viết ra để dùng làm bookmarklet, dùng làm Userscript sẽ chắc chắn lỗi nặng rất nhiều trang web:

JavaScript:
(function () {
  var hook_eventNames = "contextmenu|select|selectstart|copy|cut|dragstart".split("|");
  var unhook_eventNames = "mousedown|mouseup|keydown|keyup".split("|");
  var eventNames = hook_eventNames.concat(unhook_eventNames);
  var storageName = getRandStr('qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM', parseInt(Math.random() * 12 + 8));
  var EventTarget_addEventListener = EventTarget.prototype.addEventListener;
  var document_addEventListener = document.addEventListener;
  var Event_preventDefault = Event.prototype.preventDefault;
  function addEventListener(type, func, useCapture) {
    var _addEventListener = this === document ? document_addEventListener : EventTarget_addEventListener;
    if (hook_eventNames.indexOf(type) >= 0) {
      _addEventListener.apply(this, [type, returnTrue, useCapture]);
    } else if (unhook_eventNames.indexOf(type) >= 0) {
      var funcsName = storageName + type + (useCapture ? 't' : 'f');
      if (this[funcsName] === undefined) {
        this[funcsName] = [];
        _addEventListener.apply(this, [type, useCapture ? unhook_t : unhook_f, useCapture]);
      }
      this[funcsName].push(func);
    } else {
      _addEventListener.apply(this, arguments);
    }
  }
  function clearLoop() {
    var elements = getElements();
    for (var i in elements) {
      for (var j in eventNames) {
        var name = 'on' + eventNames[j];
        if (elements[i][name] != null && elements[i][name] != onxxx) {
          if (unhook_eventNames.indexOf(eventNames[j]) >= 0) {
            elements[i][storageName + name] = elements[i][name];
            elements[i][name] = onxxx;
          } else {
            elements[i][name] = null;
          }
        }
      }
    }
  }
  function returnTrue(e) {
    return true;
  }
  function unhook_t(e) {
    return unhook(e, this, storageName + e.type + 't');
  }
  function unhook_f(e) {
    return unhook(e, this, storageName + e.type + 'f');
  }
  function unhook(e, self, funcsName) {
    var list = self[funcsName];
    for (var i in list) {
      list[i](e);
    }
    e.returnValue = true;
    return true;
  }
  function onxxx(e) {
    var name = storageName + 'on' + e.type;
    this[name](e);
    e.returnValue = true;
    return true;
  }
  function getRandStr(chs, len) {
    var str = '';
    while (len--) {
      str += chs[parseInt(Math.random() * chs.length)];
    }
    return str;
  }
  function getElements() {
    var elements = Array.prototype.slice.call(document.getElementsByTagName('*'));
    elements.push(document);
    return elements;
  }
  function addStyle(css) {
    var style = document.createElement('style');
    style.innerHTML = css;
    document.head.appendChild(style);
  }
  function init() {
    setInterval(clearLoop, 30 * 1000);
    setTimeout(clearLoop, 2500);
    window.addEventListener('load', clearLoop, true);
    clearLoop();
    EventTarget.prototype.addEventListener = addEventListener;
    document.addEventListener = addEventListener;
    Event.prototype.preventDefault = function () {
      if (eventNames.indexOf(this.type) < 0) {
        Event_preventDefault.apply(this, arguments);
      }
    };
    Event.prototype.__defineSetter__('returnValue', function () {
      if (this.returnValue != true && eventNames.indexOf(this.type) >= 0) {
        console.log(this);
        this.returnValue = true;
      }
    });
    console.debug('storageName:' + storageName);
    addStyle('html, html:before, html:after, body, body:before, body:after,*,*:before,*:after,:not(input):not(textarea):not(select), input[type="image"], input[type="file"], input[type="submit"], input[type="button"], input[type="reset"] {-webkit-user-select:text!important;-moz-user-select:text!important;user-select:text!important;}');
    window.alert = function () {};
  }
  init();
})();
 
Có cách nào tự tắt mở addon như Miniman cho firefox không thím ey?
https://chrome.google.com/webstore/detail/miniman/bkgpdabchaofnadjlonknbncfplgdmaa?hl=en-US

Addon hay, tuy nhiên rất tiếc API addon của Firefox thì không thể làm được.

Firefox họ không cho phép dùng addon để bật tắt addon vì lý do bảo mật, cứ cảm tưởng đang dùng uBlock mà addon khác nó tắt phụt một cái, ngoài ra nó còn nhiều quyền khác như soi nói được API của addon khác nên nhìn chung nếu tác giả không đáng tin thì cài vào rất không an toàn, ví dụ addon VPN mà phải dùng tải khoản chẳng hạn, nó nhìn thấy API là nó lấy được tài khoản, cũng có thể tại API extension của Chrome tạp nham quá mà trên Chrome Store rất lắm extension là malware cài vào cướp mật khẩu, cookie... của người dùng như ngóe (ví dụ), lý do có thể tìm thấy ở đây.

Hiện tại addon của Firefox trừ khi cho phép nhìn thấy manifest.json (ví dụ cái MDM), không thì nó hoạt động riêng rẽ với nhau, và khả năng một addon của Firefox mà muốn tự động tắt bật addon khác thì điều đầu tiên phải làm là người dùng tự điển manifest.json của các addon khác vào cho nó "nhìn thấy".

Cách duy nhất là dùng xiaoxiaoflood script để tắt bật, cái này dùng API mạnh gần như nhất của Firefox nên làm được gần như mọi trò bệnh hoạn. Tất nhiên là hoàn toàn có thể thêm tính năng tự động tắt bật trên trang nếu biết Javascript hoặc là tạo Issue Github bảo tác giả thêm vào. :D
 
View attachment 1806750

Ngon mà, bản mới nhất đây diệt luôn alert mà bạn @8th_horcrux hôm qua mới hỏi đây, không nên biến nó thành Userscript nhé vì script này được viết ra để dùng làm bookmarklet, dùng làm Userscript sẽ chắc chắn lỗi nặng rất nhiều trang web:

JavaScript:
(function () {
  var hook_eventNames = "contextmenu|select|selectstart|copy|cut|dragstart".split("|");
  var unhook_eventNames = "mousedown|mouseup|keydown|keyup".split("|");
  var eventNames = hook_eventNames.concat(unhook_eventNames);
  var storageName = getRandStr('qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM', parseInt(Math.random() * 12 + 8));
  var EventTarget_addEventListener = EventTarget.prototype.addEventListener;
  var document_addEventListener = document.addEventListener;
  var Event_preventDefault = Event.prototype.preventDefault;
  function addEventListener(type, func, useCapture) {
    var _addEventListener = this === document ? document_addEventListener : EventTarget_addEventListener;
    if (hook_eventNames.indexOf(type) >= 0) {
      _addEventListener.apply(this, [type, returnTrue, useCapture]);
    } else if (unhook_eventNames.indexOf(type) >= 0) {
      var funcsName = storageName + type + (useCapture ? 't' : 'f');
      if (this[funcsName] === undefined) {
        this[funcsName] = [];
        _addEventListener.apply(this, [type, useCapture ? unhook_t : unhook_f, useCapture]);
      }
      this[funcsName].push(func);
    } else {
      _addEventListener.apply(this, arguments);
    }
  }
  function clearLoop() {
    var elements = getElements();
    for (var i in elements) {
      for (var j in eventNames) {
        var name = 'on' + eventNames[j];
        if (elements[i][name] != null && elements[i][name] != onxxx) {
          if (unhook_eventNames.indexOf(eventNames[j]) >= 0) {
            elements[i][storageName + name] = elements[i][name];
            elements[i][name] = onxxx;
          } else {
            elements[i][name] = null;
          }
        }
      }
    }
  }
  function returnTrue(e) {
    return true;
  }
  function unhook_t(e) {
    return unhook(e, this, storageName + e.type + 't');
  }
  function unhook_f(e) {
    return unhook(e, this, storageName + e.type + 'f');
  }
  function unhook(e, self, funcsName) {
    var list = self[funcsName];
    for (var i in list) {
      list[i](e);
    }
    e.returnValue = true;
    return true;
  }
  function onxxx(e) {
    var name = storageName + 'on' + e.type;
    this[name](e);
    e.returnValue = true;
    return true;
  }
  function getRandStr(chs, len) {
    var str = '';
    while (len--) {
      str += chs[parseInt(Math.random() * chs.length)];
    }
    return str;
  }
  function getElements() {
    var elements = Array.prototype.slice.call(document.getElementsByTagName('*'));
    elements.push(document);
    return elements;
  }
  function addStyle(css) {
    var style = document.createElement('style');
    style.innerHTML = css;
    document.head.appendChild(style);
  }
  function init() {
    setInterval(clearLoop, 30 * 1000);
    setTimeout(clearLoop, 2500);
    window.addEventListener('load', clearLoop, true);
    clearLoop();
    EventTarget.prototype.addEventListener = addEventListener;
    document.addEventListener = addEventListener;
    Event.prototype.preventDefault = function () {
      if (eventNames.indexOf(this.type) < 0) {
        Event_preventDefault.apply(this, arguments);
      }
    };
    Event.prototype.__defineSetter__('returnValue', function () {
      if (this.returnValue != true && eventNames.indexOf(this.type) >= 0) {
        console.log(this);
        this.returnValue = true;
      }
    });
    console.debug('storageName:' + storageName);
    addStyle('html, html:before, html:after, body, body:before, body:after,*,*:before,*:after,:not(input):not(textarea):not(select), input[type="image"], input[type="file"], input[type="submit"], input[type="button"], input[type="reset"] {-webkit-user-select:text!important;-moz-user-select:text!important;user-select:text!important;}');
    window.alert = function () {};
  }
  init();
})();
Nhờ bác biến tấu nó thành scriptlet cho Ublock ạ. Em cảm ơn.
 
Back
Top