Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Firefox MV3 Migration #462

Merged
merged 17 commits into from
May 22, 2024
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
Loading