SlideShare a Scribd company logo
How QCLean works?
Introduction to Browser Extensions
@qcl
Code & Beer 2015.03.06
How QCLean Works? Introduction to Browser Extensions
What is QCLean?
● A browser extension/add-on that removing
ads, suggested pages and posts on
Facebook news feed for Chrome, Firefox,
Safari, Opera and IE users.
● http://qcl.github.io/QCLean/
History
● Since 2013.02.28 (2 years old!)
● Popular add-on (Firefox) 2013.04.06
● Popular extension (Chrome) 2013.08.21
Overview
● Support 5 browsers
○ Chrome/Chromium, Firefox, Safari, Opera, IE
● More than 30,000 users over the world.
○ GC ~30,000
○ FF ~8,500
● Donated mainly by Firefox user!
○ Receive about $24
○ Donate NOW!
Overview
● Rating
○ ★★★★★ 4.5/5.0 Chrome
○ ★★★★ 4.0/5.0 Firefox
○ ★★★★ 4.0/5.0 Opera
● Operating System
○ 93% Windows
● Languages
○ Chrome 74% zh-tw
○ Firefox 53% en-us
About icon
Extension/Add-on v.s. Plugin
● Extension/Add-on
○ Extensions are small software programs that can
modify and enhance the functionality of the browser.
You write them using web technologies such as
HTML, JavaScript, and CSS. (Chrome)
● Plugin
○ Plugins are shared libraries that users can install to
display content that the application itself can't display
natively. (MDN)
Extensions
● Written by HTML/JavaScript/CSS
● chrome://extensions
● about://addons
Plugins
● Written by C/C++, depend on platform
○ NPAPI, NaCl (Chrome)
● chrome://plugins
● about://plugins
Plugins
● NPAPI
○ PCManX GTK2 on Chrome using NPAPI
@qcl, @JeromeWu, 2010
Extension developing 101
● Firefox
○ http://blog.qcl.tw/2013/08/sdkfirefox-add-on.html
● Chrome
○ Create a file named manifest.json
○ Open your Chrome, go to chrome://extensions
○ Click Developer Mode
○ Then import the folder which contains manifest.json
manifest.json
{
“manifest_version” : 2,
“name” : “extension_name”,
“version” : “version_string” ,
“description” : “extension_description”
...
}
● https://developer.chrome.com/extensions/manifest
manifest.json (QCLean)
Background
background: {
“script”:[“background.js”]
}
● It exists for the lifetime of your extension.
● Only ONE instance of it at a time.
● It can be used to manage some task or state.
Permissions
● permissions: [“tabs”]
● https://developer.chrome.com/extensions/declare_permissions
● https://developer.chrome.com/extensions/permission_warnings
Content Scripts
“content_scripts” : [
{
“matches”: [match patterns],
“css”: [“kerker.css”],
“js”: [“haha.js”],
“run_at”: “document_start”
}
]
● https://developer.chrome.com/extensions/content_scripts
Content Scripts
● Content scripts are JS that run in the content
of web page
● Can not use chrome.* API of extension,
i18n, runtime, storage
● Can not use functions defined by extension
page
● Can not use functions defined by web page
or other content script
● Match Pattern
○ https://developer.chrome.com/extensions/match_patterns
Content Script
● run_at
○ doucment_start
■ Before any other DOM is constructed or any
other script is run
○ doucment_end
■ After DOM is complete, but before subresources
like images and frames have loaded
○ doucment_idle (defualt)
■ After window.onload
Remove Suggested Pages&Posts
● First commit of QCLean
Remove Suggested Pages&Posts
● What will happen when all posts on your
newsfeed use the same class name?
○ All the posts will be removed :p
● Or the class name used by other elements
on the page
○ Those elements will be removed, too :p
● Or you can not get Ad elements directly
● Select elements that you can identify then try
to do something.
Remove Suggested Pages&Posts
● Select some special elements, try to find the
Ad block, then remove it.
● If Facebook changes the structure of page,
this method will GG
● It will run once when page did load. (run_at)
Facebook infinite scrolling
● When to run the script?
○ document_start? document_end? document_idle?
○ setInterval?
● When you scrolls down the page, it will load
more and more post (and Ads)
● Need to find a trigger point to remove Ads!
Override the prototype of DOM
● Check Ads when appending new elements
into the page.
● Override the prototype of some DOM
○ HTMLDivElement.prototype.appendChild
○ HTMLUlElement.prototype.appendChild
Prevent Requesting Ads
● Check AJAX requests by overriding
XMLHttpRequest.prototype
Content Scripts
● Can not override the prototype of HTML
DOM in web page (directly)
● But we can add new element into web page.
Override prototype is DANGEROUS
MutationObserver
● QCLean-Chrome-Experiment
https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
ClassName changed frequently
● Static classnames list is not enough
● I want to build a API for user, it can update
classnames list.
Some QCLean API
● Story API
○ http://qcl.github.io/QCLean/api/story.js
● Line Tagging API
○ http://qcl.github.io/QCLean/api/lineTagging.js
● XHR Cross-origin request issue
● Content security policy issue
Content Security Policy
“content_security_policy” : “policy”
● It can not be show on permission warning
● CSP works as a black/whitelisting mechanism
for resources loaded or executed by your
extension.
https://developer.chrome.com/extensions/contentSecurityPolicy
http://www.html5rocks.com/en/tutorials/security/content-security-policy/
Distribute Extensions
Cost Review Publish
Chrome $5 no directly publish
Firefox free optional directly publish
Opera free required after review
Safari free required unknow*
Extension source
● Web Store / Addon Center
○ You don’t need to mantain a update server
● Mantain your own update server
Update URL
update_url : “http://qcl.github.io/QCLean/chrome_update.xml”
● Packaging your extension (with key)
○ extension.crx
● Write update XML
○ https://developer.chrome.com/extensions/autoupdate
How others write extensions?
● Install the extension
● Get the extension’s ID (chrome://extensions)
● Go to
○ ~/Library/Application Support/Google/Chrome/Default/Extensions (mac)
QCLean
https://github.com/qcl/QCLean

More Related Content

PDF
From devOps to front end Ops, test first
PDF
html5 & phonegap
PDF
Automated Testing in WordPress, Really?!
PDF
Continuous Testing With React Storybook & WebdriverIO
PDF
Spring Boot
PDF
[CLIW] Web testing
PDF
Show an Open Source Project Some Love and Start Using Travis-CI
PDF
Visual testing for wordpress sites
From devOps to front end Ops, test first
html5 & phonegap
Automated Testing in WordPress, Really?!
Continuous Testing With React Storybook & WebdriverIO
Spring Boot
[CLIW] Web testing
Show an Open Source Project Some Love and Start Using Travis-CI
Visual testing for wordpress sites

What's hot (20)

PDF
Java Web Start czyli jak żyć z tą dziwną technologią? & Continuous Delivery w...
PDF
How Testing Changed My Life
PPTX
That worked before
PPT
Headless BDD & Responsive Test Automation
PDF
Swt J Face 3/3
PDF
Роман Лютиков "Web Apps Performance & JavaScript Compilers"
PDF
Acceptance testing with Geb
PDF
行動應用開發實務 - Gradle 介紹
PDF
Node.js meets jenkins
PPTX
Working Software Over Comprehensive Documentation
PDF
Spring framework 4.0
PDF
Continuous integration with docker, buildbot and git
PDF
Hands on the Gradle
PDF
Selenium camp v1
PDF
Continuous Integration JUG Hannover
ODP
iOS Developers Conference-iOS Automation with Cucumber, Appium and Saucelabs
PDF
Moderne Android Builds mit Gradle
ODP
Xdebug for Beginners
PDF
Codemotion Amsterdam 2016 - The DevOps Disaster
PDF
Running jenkins in a public cloud - common issues and some solutions
Java Web Start czyli jak żyć z tą dziwną technologią? & Continuous Delivery w...
How Testing Changed My Life
That worked before
Headless BDD & Responsive Test Automation
Swt J Face 3/3
Роман Лютиков "Web Apps Performance & JavaScript Compilers"
Acceptance testing with Geb
行動應用開發實務 - Gradle 介紹
Node.js meets jenkins
Working Software Over Comprehensive Documentation
Spring framework 4.0
Continuous integration with docker, buildbot and git
Hands on the Gradle
Selenium camp v1
Continuous Integration JUG Hannover
iOS Developers Conference-iOS Automation with Cucumber, Appium and Saucelabs
Moderne Android Builds mit Gradle
Xdebug for Beginners
Codemotion Amsterdam 2016 - The DevOps Disaster
Running jenkins in a public cloud - common issues and some solutions
Ad

Similar to How QCLean Works? Introduction to Browser Extensions (20)

ODP
9 Useful Things that Every Web Developer Needs to Know
PDF
You Can Work on the Web Patform! (GOSIM 2023)
PDF
WordPress: After The Install
PPTX
Top 10 WordPress Plugins
ODP
Beginners Guide to Drupal
PPTX
Scraping the web with Laravel, Dusk, Docker, and PHP
PPTX
Javascript & SEO 2019
PDF
Extending WordPress' TinyMCE
PDF
Building Chrome Extensions
PPTX
Shining a light on performance (js meetup)
PDF
How to develop browser extension
PDF
EuroPython 2013 - Python3 TurboGears Training
PDF
Chrome extensions
PDF
Architektura html, css i javascript - Jan Kraus
ODP
Build and Deploy a Python Web App to Amazon in 30 Mins
ODP
Drupal in 5mins + Previewing Drupal 8.x
PDF
Creating Extensible Plugins for WordPress
PDF
Introducing chrome apps (ogura)
PPTX
Developing word press professionally
PDF
How Brave update works
9 Useful Things that Every Web Developer Needs to Know
You Can Work on the Web Patform! (GOSIM 2023)
WordPress: After The Install
Top 10 WordPress Plugins
Beginners Guide to Drupal
Scraping the web with Laravel, Dusk, Docker, and PHP
Javascript & SEO 2019
Extending WordPress' TinyMCE
Building Chrome Extensions
Shining a light on performance (js meetup)
How to develop browser extension
EuroPython 2013 - Python3 TurboGears Training
Chrome extensions
Architektura html, css i javascript - Jan Kraus
Build and Deploy a Python Web App to Amazon in 30 Mins
Drupal in 5mins + Previewing Drupal 8.x
Creating Extensible Plugins for WordPress
Introducing chrome apps (ogura)
Developing word press professionally
How Brave update works
Ad

Recently uploaded (20)

PPTX
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
PDF
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
PDF
How to Choose the Right IT Partner for Your Business in Malaysia
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PDF
How Creative Agencies Leverage Project Management Software.pdf
PPTX
Reimagine Home Health with the Power of Agentic AI​
PDF
Design an Analysis of Algorithms I-SECS-1021-03
PDF
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PPTX
Operating system designcfffgfgggggggvggggggggg
PDF
top salesforce developer skills in 2025.pdf
PDF
Navsoft: AI-Powered Business Solutions & Custom Software Development
PPTX
history of c programming in notes for students .pptx
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PPTX
Transform Your Business with a Software ERP System
PDF
2025 Textile ERP Trends: SAP, Odoo & Oracle
PDF
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
How to Choose the Right IT Partner for Your Business in Malaysia
Internet Downloader Manager (IDM) Crack 6.42 Build 41
How Creative Agencies Leverage Project Management Software.pdf
Reimagine Home Health with the Power of Agentic AI​
Design an Analysis of Algorithms I-SECS-1021-03
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
Adobe Illustrator 28.6 Crack My Vision of Vector Design
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
Operating system designcfffgfgggggggvggggggggg
top salesforce developer skills in 2025.pdf
Navsoft: AI-Powered Business Solutions & Custom Software Development
history of c programming in notes for students .pptx
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
Transform Your Business with a Software ERP System
2025 Textile ERP Trends: SAP, Odoo & Oracle
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free

How QCLean Works? Introduction to Browser Extensions

  • 1. How QCLean works? Introduction to Browser Extensions @qcl Code & Beer 2015.03.06
  • 3. What is QCLean? ● A browser extension/add-on that removing ads, suggested pages and posts on Facebook news feed for Chrome, Firefox, Safari, Opera and IE users. ● http://qcl.github.io/QCLean/
  • 4. History ● Since 2013.02.28 (2 years old!) ● Popular add-on (Firefox) 2013.04.06 ● Popular extension (Chrome) 2013.08.21
  • 5. Overview ● Support 5 browsers ○ Chrome/Chromium, Firefox, Safari, Opera, IE ● More than 30,000 users over the world. ○ GC ~30,000 ○ FF ~8,500 ● Donated mainly by Firefox user! ○ Receive about $24 ○ Donate NOW!
  • 6. Overview ● Rating ○ ★★★★★ 4.5/5.0 Chrome ○ ★★★★ 4.0/5.0 Firefox ○ ★★★★ 4.0/5.0 Opera ● Operating System ○ 93% Windows ● Languages ○ Chrome 74% zh-tw ○ Firefox 53% en-us
  • 8. Extension/Add-on v.s. Plugin ● Extension/Add-on ○ Extensions are small software programs that can modify and enhance the functionality of the browser. You write them using web technologies such as HTML, JavaScript, and CSS. (Chrome) ● Plugin ○ Plugins are shared libraries that users can install to display content that the application itself can't display natively. (MDN)
  • 9. Extensions ● Written by HTML/JavaScript/CSS ● chrome://extensions ● about://addons
  • 10. Plugins ● Written by C/C++, depend on platform ○ NPAPI, NaCl (Chrome) ● chrome://plugins ● about://plugins
  • 11. Plugins ● NPAPI ○ PCManX GTK2 on Chrome using NPAPI @qcl, @JeromeWu, 2010
  • 12. Extension developing 101 ● Firefox ○ http://blog.qcl.tw/2013/08/sdkfirefox-add-on.html ● Chrome ○ Create a file named manifest.json ○ Open your Chrome, go to chrome://extensions ○ Click Developer Mode ○ Then import the folder which contains manifest.json
  • 13. manifest.json { “manifest_version” : 2, “name” : “extension_name”, “version” : “version_string” , “description” : “extension_description” ... } ● https://developer.chrome.com/extensions/manifest
  • 15. Background background: { “script”:[“background.js”] } ● It exists for the lifetime of your extension. ● Only ONE instance of it at a time. ● It can be used to manage some task or state.
  • 16. Permissions ● permissions: [“tabs”] ● https://developer.chrome.com/extensions/declare_permissions ● https://developer.chrome.com/extensions/permission_warnings
  • 17. Content Scripts “content_scripts” : [ { “matches”: [match patterns], “css”: [“kerker.css”], “js”: [“haha.js”], “run_at”: “document_start” } ] ● https://developer.chrome.com/extensions/content_scripts
  • 18. Content Scripts ● Content scripts are JS that run in the content of web page ● Can not use chrome.* API of extension, i18n, runtime, storage ● Can not use functions defined by extension page ● Can not use functions defined by web page or other content script ● Match Pattern ○ https://developer.chrome.com/extensions/match_patterns
  • 19. Content Script ● run_at ○ doucment_start ■ Before any other DOM is constructed or any other script is run ○ doucment_end ■ After DOM is complete, but before subresources like images and frames have loaded ○ doucment_idle (defualt) ■ After window.onload
  • 20. Remove Suggested Pages&Posts ● First commit of QCLean
  • 21. Remove Suggested Pages&Posts ● What will happen when all posts on your newsfeed use the same class name? ○ All the posts will be removed :p ● Or the class name used by other elements on the page ○ Those elements will be removed, too :p ● Or you can not get Ad elements directly ● Select elements that you can identify then try to do something.
  • 22. Remove Suggested Pages&Posts ● Select some special elements, try to find the Ad block, then remove it. ● If Facebook changes the structure of page, this method will GG ● It will run once when page did load. (run_at)
  • 23. Facebook infinite scrolling ● When to run the script? ○ document_start? document_end? document_idle? ○ setInterval? ● When you scrolls down the page, it will load more and more post (and Ads) ● Need to find a trigger point to remove Ads!
  • 24. Override the prototype of DOM ● Check Ads when appending new elements into the page. ● Override the prototype of some DOM ○ HTMLDivElement.prototype.appendChild ○ HTMLUlElement.prototype.appendChild
  • 25. Prevent Requesting Ads ● Check AJAX requests by overriding XMLHttpRequest.prototype
  • 26. Content Scripts ● Can not override the prototype of HTML DOM in web page (directly) ● But we can add new element into web page.
  • 29. ClassName changed frequently ● Static classnames list is not enough ● I want to build a API for user, it can update classnames list.
  • 30. Some QCLean API ● Story API ○ http://qcl.github.io/QCLean/api/story.js ● Line Tagging API ○ http://qcl.github.io/QCLean/api/lineTagging.js ● XHR Cross-origin request issue ● Content security policy issue
  • 31. Content Security Policy “content_security_policy” : “policy” ● It can not be show on permission warning ● CSP works as a black/whitelisting mechanism for resources loaded or executed by your extension. https://developer.chrome.com/extensions/contentSecurityPolicy http://www.html5rocks.com/en/tutorials/security/content-security-policy/
  • 32. Distribute Extensions Cost Review Publish Chrome $5 no directly publish Firefox free optional directly publish Opera free required after review Safari free required unknow*
  • 33. Extension source ● Web Store / Addon Center ○ You don’t need to mantain a update server ● Mantain your own update server
  • 34. Update URL update_url : “http://qcl.github.io/QCLean/chrome_update.xml” ● Packaging your extension (with key) ○ extension.crx ● Write update XML ○ https://developer.chrome.com/extensions/autoupdate
  • 35. How others write extensions? ● Install the extension ● Get the extension’s ID (chrome://extensions) ● Go to ○ ~/Library/Application Support/Google/Chrome/Default/Extensions (mac)