Slide 1

Slide 1 text

How QCLean works? Introduction to Browser Extensions @qcl Code & Beer 2015.03.06

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

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/

Slide 4

Slide 4 text

History ● Since 2013.02.28 (2 years old!) ● Popular add-on (Firefox) 2013.04.06 ● Popular extension (Chrome) 2013.08.21

Slide 5

Slide 5 text

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!

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

About icon

Slide 8

Slide 8 text

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)

Slide 9

Slide 9 text

Extensions ● Written by HTML/JavaScript/CSS ● chrome://extensions ● about://addons

Slide 10

Slide 10 text

Plugins ● Written by C/C++, depend on platform ○ NPAPI, NaCl (Chrome) ● chrome://plugins ● about://plugins

Slide 11

Slide 11 text

Plugins ● NPAPI ○ PCManX GTK2 on Chrome using NPAPI @qcl, @JeromeWu, 2010

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

manifest.json { “manifest_version” : 2, “name” : “extension_name”, “version” : “version_string” , “description” : “extension_description” ... } ● https://developer.chrome.com/extensions/manifest

Slide 14

Slide 14 text

manifest.json (QCLean)

Slide 15

Slide 15 text

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.

Slide 16

Slide 16 text

Permissions ● permissions: [“tabs”] ● https://developer.chrome.com/extensions/declare_permissions ● https://developer.chrome.com/extensions/permission_warnings

Slide 17

Slide 17 text

Content Scripts “content_scripts” : [ { “matches”: [match patterns], “css”: [“kerker.css”], “js”: [“haha.js”], “run_at”: “document_start” } ] ● https://developer.chrome.com/extensions/content_scripts

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

Remove Suggested Pages&Posts ● First commit of QCLean

Slide 21

Slide 21 text

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.

Slide 22

Slide 22 text

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)

Slide 23

Slide 23 text

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!

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

Prevent Requesting Ads ● Check AJAX requests by overriding XMLHttpRequest.prototype

Slide 26

Slide 26 text

Content Scripts ● Can not override the prototype of HTML DOM in web page (directly) ● But we can add new element into web page.

Slide 27

Slide 27 text

Override prototype is DANGEROUS

Slide 28

Slide 28 text

MutationObserver ● QCLean-Chrome-Experiment https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver

Slide 29

Slide 29 text

ClassName changed frequently ● Static classnames list is not enough ● I want to build a API for user, it can update classnames list.

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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/

Slide 32

Slide 32 text

Distribute Extensions Cost Review Publish Chrome $5 no directly publish Firefox free optional directly publish Opera free required after review Safari free required unknow*

Slide 33

Slide 33 text

Extension source ● Web Store / Addon Center ○ You don’t need to mantain a update server ● Mantain your own update server

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

How others write extensions? ● Install the extension ● Get the extension’s ID (chrome://extensions) ● Go to ○ ~/Library/Application Support/Google/Chrome/Default/Extensions (mac)

Slide 36

Slide 36 text

QCLean https://github.com/qcl/QCLean