Cross Browser Extensions
Geekcamp Singapore 2019
Jyotsna Gupta
-
Mozilla Representative
-
Add-ons Content Reviewer
-
Featured Add-ons Advisory Board Member
-
Judge at Firefox Quantum Extension Challenge'18
- Firefox Add-ons Mentor
@imJenal
-
Browser Add-ons
-
Web Extensions
-
Anatomy of Web Extensions
-
Web Extension API's
- Porting your web extension
Agenda
@imJenal
Browser Add-ons extend and modify the functionality of the browser.
Browser Add-ons?
@imJenal
Text
@imJenal
Source: theedublogger.com
@imJenal
@imJenal
Ghostery
@imJenal
Source: https://www.ghostery.com/
@imJenal
PrivateX
@imJenal
@imJenal
Facebook Container
@imJenal
Source: https://addons.mozilla.org/
@imJenal
Tabby Cat
Web Extensions
A cross-browser system for developing browser add-ons
@imJenal
-
Uses standard HTML, CSS and JS
-
e10s compatible (multi-process)
-
With Zero or minimal changes, run it on Chrome, Edge, and Opera
- Documentations from multiple resources.
Why WebExtensions?
@imJenal
Anatomy of Web Extensions
@imJenal
manifest.json
{
"manifest_version": 2,
"name": "PrivateX",
"version": "0.0.1",
"description": "Summary of PrivateX.",
"homepage_url": "https://github.com/jyotsna17gupta/PrivateX",
"icons": {
"32": "icons/icon-32.png",
"48": "icons/icon-48.png",
},
"permissions": [
"tabs"
],
"page_action": {
"browser_style": true,
"default_icon": {
"48": "icons/icon-48.png"
},
"default_title": "Click here for Private browsing!"
},
"background": {
"scripts": ["background.js"]
}
}
@imJenal
Background scripts
-
Executes as soon as the extension is loaded
-
Stay loaded until the extension is disabled/uninstalled
-
Use any of the WebExtension APIs in the script
"background": {
"scripts": ["background-script.js"]
}
@imJenal
Content Scripts
-
Similar to loading normal scripts in the page
-
Can access DOM structure and use a small subset of the
WebExtension APIs -
Exchange messages with their background scripts and can in this way indirectly access all the WebExtension APIs
"content_scripts": [
{
"matches": ["*://*.mozilla.org/*"],
"js": ["jquery.js", "content-script.js"]
}
]
@imJenal
Browser action
- Use this when your add-on's features are applicable to all websites else use Page action instead.
"browser_action": {
"default_icon": {
"19": "button/geo-19.png",
"38": "button/geo-38.png"
},
"default_title": "Whereami?",
"default_popup": "popup/choose_beast.html"
}
@imJenal
Page action
- Use this when your add-on's features are specific to a particular website.
"page_action": {
"default_icon": {
"16": "icons/icon-16.png",
"48": "icons/icon-48.png"
},
"default_title": "Title",
"default_popup": "popup/popup.html"
}
]]
@imJenal
Options Page
- Helps you to define preferences for your extension that your users can change
"options_ui": {
"page": "options.html",
"browser_style": true
},
@imJenal
@imJenal
WebExtension APIs
@imJenal
Few WebExtension APIs
@imJenal
Notifications API
browser.notifications.create(alertUser, {
"type": "basic",
"iconUrl": icon.png",
"title": "PrivateX",
"message": "This website is tracking you!",
});
@imJenal
Alarms API
const delayInMinutes = 5;
const periodInMinutes = 2;
browser.alarms.create("my-periodic-alarm", {
delayInMinutes,
periodInMinutes
});
@imJenal
Tabs API
function onCreated(tab) {
console.log(`Created new tab: ${tab.id}`)
}
function onError(error) {
console.log(`Error: ${error}`);
}
browser.browserAction.onClicked.addListener(function() {
var creating = browser.tabs.create({
url:"https://example.org"
});
creating.then(onCreated, onError);
});
function handleCreated(tab) {
console.log(tab.id);
}
browser.tabs.onCreated.addListener(handleCreated);
@imJenal
function onCreated(windowInfo) {
console.log(`Created window: ${windowInfo.id}`);
}
function onError(error) {
console.log(`Error: ${error}`);
}
browser.browserAction.onClicked.addListener((tab) => {
var creating = browser.windows.create({
url: ["https://developer.mozilla.org",
"https://addons.mozilla.org"]
});
creating.then(onCreated, onError);
});
Windows API
@imJenal
webRequest API
@imJenal
var target = "https://developer.mozilla.org/*";
function logResponse(responseDetails) {
console.log(responseDetails.url);
console.log(responseDetails.statusCode);
}
browser.webRequest.onCompleted.addListener(
logResponse,
{urls: [target]}
);
Sequence of events
@imJenal
Debug your add-on
@imJenal
Tools
@imJenal
@imJenal
https://webextensions.tech/
Web Extensions UI
web-ext
A command line tool to help build, run, and test WebExtensions.
@imJenal
npm install --global web-ext
- web-ext run: Run the extension
- web-ext lint: Validate the extension source
- web-ext build: Packaging your extension
Publish your Add-on
@imJenal
Resources:
@imJenal
Need help?
IRC Channels: #webextensions, #extdev, #addons
Mailing List: https://mail.mozilla.org/listinfo/dev-addons
Telegram: @addonschat
@imJenal
Questions?
@ imJenal
Cross Browser Add-ons : Workshop
By Jyotsna Gupta
Cross Browser Add-ons : Workshop
GeekCamp Singapore 2019
- 972