Skip to content

Commit

Permalink
Merge pull request #462 from privacy-tech-lab/issue-350-5
Browse files Browse the repository at this point in the history
Firefox MV3 Migration
  • Loading branch information
Mattm27 authored May 22, 2024
2 parents 13c0f83 + e079410 commit 621f83a
Show file tree
Hide file tree
Showing 17 changed files with 258 additions and 153 deletions.
27 changes: 12 additions & 15 deletions src/background/control.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,20 +28,12 @@ import {
} from "../common/editDomainlist.js";

async function enable() {
if ("$BROWSER" == "firefox") {
var initProtection = initProtection_ff;
} else {
var initProtection = initProtection_cr;
}
var initProtection = initProtection_cr;
initProtection();
}

function disable() {
if ("$BROWSER" == "firefox") {
var haltProtection = haltProtection_ff;
} else if ("$BROWSER" == "chrome") {
var haltProtection = haltProtection_cr;
}
var haltProtection = haltProtection_cr;
haltProtection();
}

Expand All @@ -50,7 +42,6 @@ function disable() {

// This is the very first thing the extension runs
(async () => {
if ("$BROWSER" == "chrome") {
chrome.scripting.registerContentScripts([
{
id: "1",
Expand All @@ -60,6 +51,14 @@ function disable() {
runAt: "document_start",
}
]);

// Check if the browser is Firefox
if ("$BROWSER" == "firefox") {
chrome.runtime.onInstalled.addListener(function (details) {
if (details.reason === 'install') {
chrome.runtime.openOptionsPage((result) => {});
}
});
}
// Initializes the default settings
let settingsDB = await storage.getStore(stores.settings);
Expand All @@ -74,10 +73,8 @@ function disable() {
if (isEnabled) {
// Turns on the extension
enable();
if ("$BROWSER" == "chrome") {
updateRemovalScript();
reloadDynamicRules();
}
updateRemovalScript();
reloadDynamicRules();
}

})();
Expand Down
4 changes: 4 additions & 0 deletions src/background/protection/listeners-firefox.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ function enableListeners(callbacks) {
onHeadersReceived,
onBeforeNavigate,
onCommitted,
onCompleted,
} = callbacks;

// (4) global Firefox listeners
Expand All @@ -47,6 +48,7 @@ function enableListeners(callbacks) {
);
chrome.webNavigation.onBeforeNavigate.addListener(onBeforeNavigate);
chrome.webNavigation.onCommitted.addListener(onCommitted);
chrome.webNavigation.onCompleted.addListener(onCompleted);
}

/**
Expand All @@ -58,12 +60,14 @@ function disableListeners(callbacks) {
onHeadersReceived,
onBeforeNavigate,
onCommitted,
onCompleted,
} = callbacks;

chrome.webRequest.onBeforeSendHeaders.removeListener(onBeforeSendHeaders);
chrome.webRequest.onHeadersReceived.removeListener(onHeadersReceived);
chrome.webNavigation.onBeforeNavigate.removeListener(onBeforeNavigate);
chrome.webNavigation.onCommitted.removeListener(onCommitted);
chrome.webNavigation.onCompleted.removeListener(onCompleted);
}

export { enableListeners, disableListeners };
10 changes: 6 additions & 4 deletions src/background/protection/protection-ff.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ var wellknown = {}; // Caches wellknown info to be sent to popup
var signalPerTab = {}; // Caches if a signal is sent to render the popup icon
var activeTabID = 0; // Caches current active tab id
var sendSignal = true; // Caches if the signal can be sent to the curr domain
var isFirefox = ("$BROWSER" === "firefox");
var domPrev3rdParties = {}; //stores all the 3rd parties by domain (resets when you quit chrome)
var globalParsedDomain;

Expand All @@ -48,6 +47,7 @@ async function reloadVars() {

reloadVars();


/******************************************************************************/
/******************************************************************************/
/********** # Lisetener callbacks - Main functionality **********/
Expand All @@ -69,7 +69,7 @@ const listenerCallbacks = {
onBeforeSendHeaders: async (details) => {
await updateDomainlist(details);

if (sendSignal) {
if (true) {
signalPerTab[details.tabId] = true;
return addHeaders(details);
}
Expand Down Expand Up @@ -100,7 +100,7 @@ const listenerCallbacks = {
*/
onCommitted: async (details) => {
initIAB(sendSignal);
if (sendSignal) {
if (true) {
addDomSignal(details);
updatePopupIcon(details);
}
Expand All @@ -119,6 +119,7 @@ const listenerCallbacks = {
* @returns {array} details.requestHeaders
*/
function addHeaders(details) {
console.log("addHeaders called");
for (let signal in headers) {
let s = headers[signal];
details.requestHeaders.push({ name: s.name, value: s.value });
Expand All @@ -131,7 +132,8 @@ function addHeaders(details) {
* @param {object} details - retrieved info passed into callback
*/
function addDomSignal(details) {
chrome.tabs.executeScript(details.tabId, {
console.log("addDomSignal called");
chrome.scripting.executeScript(details.tabId, {
file: "../../content-scripts/injection/gpc-dom.js",
frameId: details.frameId, // Supposed to solve multiple injections
// as opposed to allFrames: true
Expand Down
114 changes: 79 additions & 35 deletions src/background/protection/protection.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,8 @@ var signalPerTab = {}; // Caches if a signal is sent to render the popup icon
var activeTabID = 0; // Caches current active tab id
var sendSignal = true; // Caches if the signal can be sent to the curr domain
var domPrev3rdParties = {}; //stores all the 3rd parties by domain (resets when you quit chrome)
var isFirefox = ("$BROWSER" === "firefox");
var globalParsedDomain;

var isFirefox = "$BROWSER" === "firefox";
var setup = false;

async function reloadVars() {
let storedDomainlisted = await storage.get(
Expand Down Expand Up @@ -73,15 +71,21 @@ const listenerCallbacks = {
* @param {object} details - retrieved info passed into callback
* @returns {array}
*/
onBeforeSendHeaders: (details) => {
updateDomainlist(details);
onBeforeSendHeaders: async (details) => {
await updateDomainlist(details);
},

/**
* @param {object} details - retrieved info passed into callback
*/
onHeadersReceived: (details) => {
logData(details);
onHeadersReceived: async (details) => {
//if (!setup){
//initSetup();
//}
await logData(details);
await sendData();



},

Expand All @@ -97,8 +101,13 @@ const listenerCallbacks = {
* @param {object} details - retrieved info passed into callback
*/
onCommitted: async (details) => {
updateDomainlist(details);
await updateDomainlist(details);
},

onCompleted: async (details) => {
await sendData();
}

}; // closes listenerCallbacks object

/******************************************************************************/
Expand All @@ -108,6 +117,29 @@ const listenerCallbacks = {
/******************************************************************************/


async function sendData(){
// chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
// if (tabs.id) {
// activeTabID = tabs.id;
// }
// });

let activeTab = await chrome.tabs.query({ active: true, currentWindow: true });
let activeTabID = activeTab.length > 0 ? activeTab[0].id : null;

let currentDomain = await getCurrentParsedDomain();
let data = ["Please reload the site"];


let info = await domPrev3rdParties[activeTabID][currentDomain];
data = Object.keys(info);

await storage.set(stores.thirdParties, data, currentDomain);


}


function getCurrentParsedDomain() {
return new Promise((resolve, reject) => {
try {
Expand Down Expand Up @@ -141,23 +173,26 @@ async function updateDomainlist(details) {
let parsedUrl = psl.parse(url.hostname);
let parsedDomain = parsedUrl.domain;
let currDomainValue = await storage.get(stores.domainlist, parsedDomain);
let id = details.tabId;

if (currDomainValue === undefined) {
storage.set(stores.domainlist, null, parsedDomain); // Sets to storage async
await storage.set(stores.domainlist, null, parsedDomain); // Sets to storage async
}

//get the current parsed domain--this is used to store 3rd parties (using globalParsedDomain variable)

let currentDomain = await getCurrentParsedDomain();
//initialize the objects
if (!(activeTabID in domPrev3rdParties)){
domPrev3rdParties[activeTabID] = {};


//get the current parsed domain--this is used to store 3rd parties (using globalParsedDomain variable)
if (!(id in domPrev3rdParties)){
domPrev3rdParties[id] = {};
}
if (!(currentDomain in domPrev3rdParties[activeTabID]) ){
domPrev3rdParties[activeTabID][currentDomain] = {};
domPrev3rdParties[id][currentDomain] = {};
}
//as they come in, add the parsedDomain to the object with null value (just a placeholder)
domPrev3rdParties[activeTabID][currentDomain][parsedDomain] = null;
domPrev3rdParties[id][currentDomain][parsedDomain] = null;


}

function updatePopupIcon(tabId) {
Expand All @@ -167,7 +202,7 @@ function updatePopupIcon(tabId) {
});
}

function logData(details) {
async function logData(details) {
let url = new URL(details.url);
let parsed = psl.parse(url.hostname);

Expand Down Expand Up @@ -285,21 +320,20 @@ function handleSendMessageError() {
console.warn(error.message);
}
}
function dataToPopupHelper(){
async function dataToPopupHelper(){
//data gets sent back every time the popup is clicked
let requestsData = {};

if (tabs[activeTabID] !== undefined) {

requestsData = domPrev3rdParties[activeTabID][globalParsedDomain];
}
let requestsData = {};
let domain = await getCurrentParsedDomain();
let parties = await storage.get(stores.thirdParties, "parties");
parties = JSON.parse(parties);

requestsData = parties[domain];
return requestsData
}

// Info back to popup
function dataToPopup(wellknownData) {

let requestsData = dataToPopupHelper(); //get requests from the helper
async function dataToPopup(wellknownData) {
let requestsData = await dataToPopupHelper(); //get requests from the helper
chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
let popupData = {
requests: requestsData,
Expand All @@ -316,9 +350,9 @@ function dataToPopup(wellknownData) {
});
}

function dataToPopupRequests() {

let requestsData = dataToPopupHelper(); //get requests from the helper
async function dataToPopupRequests() {
let requestsData = await dataToPopupHelper(); //get requests from the helper
console.log("requests data in DTPR: ", requestsData)

chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
chrome.runtime.sendMessage(
Expand Down Expand Up @@ -392,10 +426,13 @@ async function onMessageHandlerAsync(message, sender, sendResponse) {
storage.set(stores.domainlist, key, domain); // Sets to long term storage
}
if (message.msg === "POPUP_PROTECTION_REQUESTS") {
dataToPopupRequests();
console.log("info queried");
await dataToPopupRequests();
}
if (message.msg === "CONTENT_SCRIPT_WELLKNOWN") {
let url = new URL(sender.origin);
// sender.origin not working for Firefox MV3, instead added a new message argument, message.origin_url
//let url = new URL(sender.origin);
let url = new URL(message.origin_url);
let parsed = psl.parse(url.hostname);
let domain = parsed.domain;

Expand All @@ -405,7 +442,13 @@ async function onMessageHandlerAsync(message, sender, sendResponse) {

wellknown[tabID] = message.data;
let wellknownData = message.data;

await storage.set(stores.wellknownInformation, wellknownData, domain);

//await sendData();

initIAB(!sendSignal);

if (wellknown[tabID] === null && sendSignal == null) {
updatePopupIcon(tabID);
} else if (wellknown[tabID]["gpc"] === true && sendSignal == null) {
Expand All @@ -414,9 +457,9 @@ async function onMessageHandlerAsync(message, sender, sendResponse) {
path: "assets/face-icons/optmeow-face-circle-green-128.png",
});
}
chrome.runtime.onMessage.addListener(function (message, _, __) {
chrome.runtime.onMessage.addListener(async function (message, _, __) {
if (message.msg === "POPUP_PROTECTION") {
dataToPopup(wellknownData);
await dataToPopup(wellknownData);
}
});
}
Expand Down Expand Up @@ -454,7 +497,6 @@ async function onMessageHandlerAsync(message, sender, sendResponse) {
initCookiesPerDomain(message.data);
}
if (message.msg === "DELETE_OPTOUT_COOKIES") {
console.log("Msg received. Info; ", message.data);
deleteCookiesPerDomain(message.data);
}

Expand Down Expand Up @@ -484,6 +526,7 @@ function closeMessagePassing() {
*/
function onActivatedProtectionMode(info) {
activeTabID = info.tabId;
console.log("onActivatedProtectionMode called");
}

// Handles misc. setup & setup listeners
Expand All @@ -498,6 +541,7 @@ function initSetup() {
});

chrome.tabs.onActivated.addListener(onActivatedProtectionMode);
setup = true;
}

function closeSetup() {
Expand Down
Loading

0 comments on commit 621f83a

Please sign in to comment.