From 739abd628688c5b0655e0995aac6252bd3fa9ba6 Mon Sep 17 00:00:00 2001 From: Jeroen Evens Date: Mon, 5 Nov 2018 21:47:32 +0100 Subject: [PATCH 01/23] added whitelist to cookie deletion logic on startup removed standard cookie deletion and replaced it with a loop deleting all cookies not found in whitelist storage of list and UI still needed --- js/back.js | 29 +++++++++++++++++++++++++++++ js/common.js | 6 ++++++ js/ui/tab_cookies.js | 2 +- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/js/back.js b/js/back.js index ce54e7b..02b4e6b 100644 --- a/js/back.js +++ b/js/back.js @@ -65,6 +65,34 @@ return accumulator; }, {}); + if (browsingDataObj.cookies) { + // delete cookies here + ignore whitelisted cookies + var domain_list = [["github.com", 'user_session'], ["slack.com", ''], ["twitter.com", '']] + getAllCookies({}, function(cookies) + { + var callbackCount = 0; + for (var i = 0; i < cookies.length; i++) + { + var cookie = cookies[i]; + var url = getUrl(cookie.domain, cookie.path, cookie.secure); + + var wl = false; + for (var x in domain_list) { + var wl_domain = domain_list[x][0] + var wl_name = domain_list[x][1] + if (cookie.domain.includes(wl_domain)) { + if (wl_name == "" || wl_name == cookie.name) { + wl = true + } + } + } + if (!wl) { + removeCookie({"url": url, "name": cookie.name}); + } + } + }); + browsingDataObj.cookies = false; + } chrome.browsingData.remove({}, browsingDataObj); } else @@ -141,4 +169,5 @@ // Fired on a profile start up chrome.runtime.onStartup.addListener(profileStart); + chrome.runtime.onInstalled.addListener(profileStart); })(this); diff --git a/js/common.js b/js/common.js index 35006cf..20cc1c7 100644 --- a/js/common.js +++ b/js/common.js @@ -26,6 +26,8 @@ const browsingData = ["removeAll", "appcache", "cache", "cookies", "downloads", "fileSystems", "formData", "history", "indexedDB", "localStorage", "serverBoundCertificates", "passwords", "pluginData", "serviceWorkers", "webSQL"]; +const getAllCookies = chrome.cookies.getAll; +const removeCookie = chrome.cookies.remove; function getStorage(keys, callback) { @@ -38,6 +40,10 @@ function setStorage(items, callback) chrome.storage.local.set(items, callback); } +function getUrl(domain, path, isSecure) +{ + return "http" + (isSecure ? "s" : "") + "://" + domain + path; +} function addRequestListener(onSendHeadersCallback, onHeadersReceivedCallback) { chrome.webRequest.onSendHeaders.addListener(onSendHeadersCallback, diff --git a/js/ui/tab_cookies.js b/js/ui/tab_cookies.js index 7fd6bfb..b8b7853 100644 --- a/js/ui/tab_cookies.js +++ b/js/ui/tab_cookies.js @@ -164,7 +164,7 @@ break; case "delete-domain-cookies": var domain = getParentData(element, "data-access"); - getAllCookies({"domain": domain}, function(cookies) + getAllCookies({}, function(cookies) { var callbackCount = 0; for (var i = 0; i < cookies.length; i++) From b7ed06d0133524883a3ce813d0ac5048f1c06aad Mon Sep 17 00:00:00 2001 From: Jeroen Evens Date: Mon, 5 Nov 2018 21:58:33 +0100 Subject: [PATCH 02/23] added cookieWhitelist for getting and setting whitelist --- js/back.js | 45 +++++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/js/back.js b/js/back.js index 02b4e6b..e3aeb1f 100644 --- a/js/back.js +++ b/js/back.js @@ -25,6 +25,7 @@ function profileStart() { + setStorage({'cookieWhitelist': [["github.com", 'user_session'], ["slack.com", ''], ["twitter.com", '']]}) getStorage("settingList", function(data) { deleteBrowsingData(data.settingList); @@ -67,30 +68,34 @@ }, {}); if (browsingDataObj.cookies) { // delete cookies here + ignore whitelisted cookies - var domain_list = [["github.com", 'user_session'], ["slack.com", ''], ["twitter.com", '']] - getAllCookies({}, function(cookies) - { - var callbackCount = 0; - for (var i = 0; i < cookies.length; i++) + getStorage("cookieWhitelist", function(data) { + var domain_list = data.cookieWhitelist + getAllCookies({}, function(cookies) { - var cookie = cookies[i]; - var url = getUrl(cookie.domain, cookie.path, cookie.secure); - - var wl = false; - for (var x in domain_list) { - var wl_domain = domain_list[x][0] - var wl_name = domain_list[x][1] - if (cookie.domain.includes(wl_domain)) { - if (wl_name == "" || wl_name == cookie.name) { - wl = true + var callbackCount = 0; + for (var i = 0; i < cookies.length; i++) + { + var cookie = cookies[i]; + var url = getUrl(cookie.domain, cookie.path, cookie.secure); + + var wl = false; + for (var x in domain_list) { + var wl_domain = domain_list[x][0] + var wl_name = domain_list[x][1] + if (cookie.domain.includes(wl_domain)) { + if (wl_name == "" || wl_name == cookie.name) { + wl = true + } } } + if (!wl) { + removeCookie({"url": url, "name": cookie.name}); + } } - if (!wl) { - removeCookie({"url": url, "name": cookie.name}); - } - } - }); + }); + }); + // var domain_list = [["github.com", 'user_session'], ["slack.com", ''], ["twitter.com", '']] + browsingDataObj.cookies = false; } chrome.browsingData.remove({}, browsingDataObj); From 623f4fc0835c17604e42aa83611f7b06e438d915 Mon Sep 17 00:00:00 2001 From: Jeroen Evens Date: Tue, 6 Nov 2018 21:19:36 +0100 Subject: [PATCH 03/23] added button to add cookiedomain + name to whitelist added image to represent whitelist button add update whitelist with cookiedomain change delete info to detect whitelisted cookies properly TODO: fix button styling TODO: fix button if whitelisted TODO: remove from whitelist if clicked on button of whitelisted cookie-whitelist TODO: don't place duplicate whitelist items TODO: make whitelist a dictionary instead of an array --- css/img/check-mark-circle.svg | 1 + css/img/check-mark-filled.svg | 1 + css/main.css | 22 ++++++++++++++++++++++ js/back.js | 3 +-- js/ui/tab_cookies.js | 10 ++++++++++ popup.html | 1 + 6 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 css/img/check-mark-circle.svg create mode 100644 css/img/check-mark-filled.svg diff --git a/css/img/check-mark-circle.svg b/css/img/check-mark-circle.svg new file mode 100644 index 0000000..850f5fd --- /dev/null +++ b/css/img/check-mark-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/css/img/check-mark-filled.svg b/css/img/check-mark-filled.svg new file mode 100644 index 0000000..2ff5a78 --- /dev/null +++ b/css/img/check-mark-filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/css/main.css b/css/main.css index 14bbab8..946c0b0 100644 --- a/css/main.css +++ b/css/main.css @@ -288,6 +288,10 @@ button[role="checkbox"][aria-checked="true"] > span:last-child #dialog[data-dialog="cookie-edit"] #dialog-content-cookie-form, #dialog[data-dialog="cookies-delete-all"] #dialog-content-cookie-delete-all, #dialog[data-dialog="setting-info"] #dialog-content-setting-info +{ + display: block; +}#dialog[data-dialog="cookies-delete-all"] #dialog-content-cookie-delete-all, +#dialog[data-dialog="setting-info"] #dialog-content-setting-info { display: block; } @@ -527,6 +531,24 @@ button.icon.edit:after background-image: url(/css/img/edit.svg); } +#cookiesList button.icon.edit +{ + margin: 0px 10px; +} + + +button.icon.whitelist +{ + background-image: url(/css/img/check-mark-circle.svg); +} + +button.icon.whitelist:hover:after +{ + background-image: url(/css/img/check-mark-filled.svg); +} + + + button.icon.edit:hover:after { background-image: url(/css/img/edit-hover.svg); diff --git a/js/back.js b/js/back.js index e3aeb1f..c5831a2 100644 --- a/js/back.js +++ b/js/back.js @@ -25,7 +25,6 @@ function profileStart() { - setStorage({'cookieWhitelist': [["github.com", 'user_session'], ["slack.com", ''], ["twitter.com", '']]}) getStorage("settingList", function(data) { deleteBrowsingData(data.settingList); @@ -82,7 +81,7 @@ for (var x in domain_list) { var wl_domain = domain_list[x][0] var wl_name = domain_list[x][1] - if (cookie.domain.includes(wl_domain)) { + if (wl_domain.includes(cookie.domain)) { if (wl_name == "" || wl_name == cookie.name) { wl = true } diff --git a/js/ui/tab_cookies.js b/js/ui/tab_cookies.js index b8b7853..1bf5987 100644 --- a/js/ui/tab_cookies.js +++ b/js/ui/tab_cookies.js @@ -156,6 +156,16 @@ } }); break; + case "whitelist-sublist-cookie": + var accessObj = JSON.parse(getParentData(element, "data-access")); + var domain = getParentData(getParentData(element, "data-access", true). + parentElement, "data-access"); + var url = getUrl(domain, accessObj.path, accessObj.secure); + getStorage("cookieWhitelist", function(data) { + data["cookieWhitelist"].push([url, accessObj.cookie]) + setStorage(data) + }); + break; case "close-expanded-domain": var domainElem = getParentData(element, "data-expanded", true); tableList.removeAllSubItems(domainElem.dataset.access); diff --git a/popup.html b/popup.html index 5ced4f9..b38dc24 100644 --- a/popup.html +++ b/popup.html @@ -135,6 +135,7 @@

+ From 1813414088fac90b6c1e75b101b28acc01edff12 Mon Sep 17 00:00:00 2001 From: Jeroen Evens Date: Wed, 7 Nov 2018 21:48:22 +0100 Subject: [PATCH 04/23] implement feedback making whitelist into a dict removing item from whitelist if clicked on button of whitelisted item changing location of cookie deletion on startup (not only deleted if delete all option is set) --- css/main.css | 2 +- js/back.js | 66 +++++++++++++++++++++++--------------------- js/ui/tab_cookies.js | 15 ++++++++-- 3 files changed, 48 insertions(+), 35 deletions(-) diff --git a/css/main.css b/css/main.css index 946c0b0..c9954b1 100644 --- a/css/main.css +++ b/css/main.css @@ -531,7 +531,7 @@ button.icon.edit:after background-image: url(/css/img/edit.svg); } -#cookiesList button.icon.edit +#cookiesList button.icon.whitelist { margin: 0px 10px; } diff --git a/js/back.js b/js/back.js index c5831a2..2a0d64d 100644 --- a/js/back.js +++ b/js/back.js @@ -25,6 +25,11 @@ function profileStart() { + getStorage("cookieWhitelist", function(data) { + if (data = {}) { + setStorage({"cookieWhitelist": {}}) + } + }) getStorage("settingList", function(data) { deleteBrowsingData(data.settingList); @@ -65,38 +70,7 @@ return accumulator; }, {}); - if (browsingDataObj.cookies) { - // delete cookies here + ignore whitelisted cookies - getStorage("cookieWhitelist", function(data) { - var domain_list = data.cookieWhitelist - getAllCookies({}, function(cookies) - { - var callbackCount = 0; - for (var i = 0; i < cookies.length; i++) - { - var cookie = cookies[i]; - var url = getUrl(cookie.domain, cookie.path, cookie.secure); - - var wl = false; - for (var x in domain_list) { - var wl_domain = domain_list[x][0] - var wl_name = domain_list[x][1] - if (wl_domain.includes(cookie.domain)) { - if (wl_name == "" || wl_name == cookie.name) { - wl = true - } - } - } - if (!wl) { - removeCookie({"url": url, "name": cookie.name}); - } - } - }); - }); - // var domain_list = [["github.com", 'user_session'], ["slack.com", ''], ["twitter.com", '']] - - browsingDataObj.cookies = false; - } + browsingDataObj.cookies = false; chrome.browsingData.remove({}, browsingDataObj); } else @@ -104,6 +78,34 @@ delete browsingDataObj.removeAll; chrome.browsingData.remove({}, browsingDataObj); } + if (browsingDataObj.cookies) { + // delete cookies here + ignore whitelisted cookies + getStorage("cookieWhitelist", function(data) { + let domainList = data.cookieWhitelist + getAllCookies({}, function(cookies) + { + let callbackCount = 0; + for (let cookie in cookies) + { + let url = getUrl(cookie.domain, cookie.path, cookie.secure); + + var whitelisted = false; + for (let item of domainList) { + let whitelistedDomain = item[0] + let whitelistedName = item[1] + if (whitelistedDomain.includes(cookie.domain)) { + if (whitelistedName == "" || whitelistedName == cookie.name) { + whitelisted = true + } + } + } + if (!whitelisted) { + removeCookie({"url": url, "name": cookie.name}); + } + } + }); + }); + } } global.startCollectingRequests = function() diff --git a/js/ui/tab_cookies.js b/js/ui/tab_cookies.js index 1bf5987..5abee67 100644 --- a/js/ui/tab_cookies.js +++ b/js/ui/tab_cookies.js @@ -162,8 +162,19 @@ parentElement, "data-access"); var url = getUrl(domain, accessObj.path, accessObj.secure); getStorage("cookieWhitelist", function(data) { - data["cookieWhitelist"].push([url, accessObj.cookie]) - setStorage(data) + let whitelist = data["cookieWhitelist"] + if (!whitelist.propertyIsEnumerable(domain)) { + whitelist[domain] = [] + } + if (!whitelist[domain].includes("user_session") && !whitelist[domain].includes("")) { + data["cookieWhitelist"][domain].push(accessObj.cookie) + setStorage(data) + } else { + // let index = whitelist[domain].indexOf("user_session") + // delete data["cookieWhitelist"][domain][index] + whitelist[domain] = whitelist[domain].filter(el => el !== accessObj.cookie) + setStorage(data) + } }); break; case "close-expanded-domain": From d2e5df16edcc56a30ae8dac1e0a2eee38e19fbca Mon Sep 17 00:00:00 2001 From: Jeroen Evens Date: Wed, 21 Nov 2018 18:33:08 +0100 Subject: [PATCH 05/23] fixing setting cookiewhitelist dict on startup refactoring code to extract cookiedeletion to separate function fixing dictionary handling in deletecookie method rewriting whitelist to cookie comparison logic making logic more compact --- js/back.js | 130 ++++++++++++++++++++++------------------------------- 1 file changed, 53 insertions(+), 77 deletions(-) diff --git a/js/back.js b/js/back.js index 2a0d64d..794e284 100644 --- a/js/back.js +++ b/js/back.js @@ -18,27 +18,23 @@ "use strict"; -(function(global) -{ +(function (global) { global.collectedRequests = []; const requestCollectionLength = 500; - function profileStart() - { - getStorage("cookieWhitelist", function(data) { - if (data = {}) { - setStorage({"cookieWhitelist": {}}) + function profileStart() { + getStorage("cookieWhitelist", function (data) { + if (data == {}) { + setStorage({ "cookieWhitelist": {} }) } }) - getStorage("settingList", function(data) - { + getStorage("settingList", function (data) { deleteBrowsingData(data.settingList); }); } //TODO: Find a solution to avoide duplication - getStorage("settingList", function(data) - { + getStorage("settingList", function (data) { if (data.settingList && data.settingList.collectHeaders) startCollectingRequests(); @@ -46,109 +42,91 @@ addBlockAgentListener(); }); - function deleteBrowsingData(data) - { + function deleteCookies() { + // delete cookies here + ignore whitelisted cookies + getStorage("cookieWhitelist", function (data) { + let domainList = data.cookieWhitelist + getAllCookies({}, function (cookies) { + let callbackCount = 0; + for (let cookie of cookies) { + let url = getUrl(cookie.domain, cookie.path, cookie.secure); + // replace leading dots sometimes present in cookie domains + let domainWhitelist = domainList[cookie.domain.replace(/^\./, "")] + if (!domainWhitelist || domainWhitelist.indexOf(cookie.name) < 0) { + removeCookie({ "url": url, "name": cookie.name }); + } + } + }); + }); + } + + function deleteBrowsingData(data) { if (!data) return; // Filter "data" object to only match properties from "browsingData". - var browsingDataObj = Object.keys(data).filter(function(key) - { + var browsingDataObj = Object.keys(data).filter(function (key) { return browsingData.includes(key); - }).reduce(function(accumulator, dataType) - { + }).reduce(function (accumulator, dataType) { accumulator[dataType] = data[dataType]; return accumulator; }, {}); - if (browsingDataObj.removeAll == true) - { - var browsingDataObj = browsingData.reduce(function(accumulator, dataType) - { + if (browsingDataObj.removeAll == true) { + var browsingDataObj = browsingData.reduce(function (accumulator, dataType) { if (dataType != "removeAll") accumulator[dataType] = true; return accumulator; }, {}); + + if (browsingDataObj.cookies) { + deleteCookies() + } browsingDataObj.cookies = false; chrome.browsingData.remove({}, browsingDataObj); } - else - { - delete browsingDataObj.removeAll; + else { + if (browsingDataObj.cookies) { + deleteCookies() + } + browsingDataObj.cookies = false; chrome.browsingData.remove({}, browsingDataObj); } - if (browsingDataObj.cookies) { - // delete cookies here + ignore whitelisted cookies - getStorage("cookieWhitelist", function(data) { - let domainList = data.cookieWhitelist - getAllCookies({}, function(cookies) - { - let callbackCount = 0; - for (let cookie in cookies) - { - let url = getUrl(cookie.domain, cookie.path, cookie.secure); - - var whitelisted = false; - for (let item of domainList) { - let whitelistedDomain = item[0] - let whitelistedName = item[1] - if (whitelistedDomain.includes(cookie.domain)) { - if (whitelistedName == "" || whitelistedName == cookie.name) { - whitelisted = true - } - } - } - if (!whitelisted) { - removeCookie({"url": url, "name": cookie.name}); - } - } - }); - }); - } } - global.startCollectingRequests = function() - { + global.startCollectingRequests = function () { addRequestListener(onSendHeaders, onHeadersReceived); }; - global.stopCollectingRequests = function() - { + global.stopCollectingRequests = function () { removeRequestListener(onSendHeaders, onHeadersReceived); }; - function onSendHeaders(details) - { + function onSendHeaders(details) { updateRequestObj(details, "send"); addToRequestArray(details); } - function onHeadersReceived(details) - { + function onHeadersReceived(details) { updateRequestObj(details, "receive"); addToRequestArray(details); } - function addToRequestArray(details) - { - if(collectedRequests.length > requestCollectionLength) + function addToRequestArray(details) { + if (collectedRequests.length > requestCollectionLength) collectedRequests.shift(); collectedRequests.push(details); } - chrome.storage.onChanged.addListener(function(change) - { - if (change.settingList) - { - chrome.permissions.contains(additionalPermission, function(result) - { + chrome.storage.onChanged.addListener(function (change) { + if (change.settingList) { + chrome.permissions.contains(additionalPermission, function (result) { var newValue = change.settingList.newValue.collectHeaders; var oldValue = change.settingList.oldValue; - if (oldValue && newValue != oldValue.collectHeaders) - { - if(result && newValue) + if (oldValue && newValue != oldValue.collectHeaders) { + if (result && newValue) startCollectingRequests(); else stopCollectingRequests(); @@ -156,9 +134,8 @@ var newValue = change.settingList.newValue.blockUserAgent; var oldValue = change.settingList.oldValue; - if (oldValue && newValue != oldValue.blockUserAgent) - { - if(result && newValue) + if (oldValue && newValue != oldValue.blockUserAgent) { + if (result && newValue) addBlockAgentListener(); else removeBlockAgentListener(); @@ -167,8 +144,7 @@ } }); - chrome.permissions.onRemoved.addListener(function(result) - { + chrome.permissions.onRemoved.addListener(function (result) { removeBlockAgentListener(); removeRequestListener(onSendHeaders, onHeadersReceived); }); From c87944fec1a68f7285ce7d2f0e3d79f890819975 Mon Sep 17 00:00:00 2001 From: Jeroen Evens Date: Wed, 21 Nov 2018 18:45:40 +0100 Subject: [PATCH 06/23] updated code to reuse the delete cookie logic on cookie tab --- js/back.js | 18 ------------------ js/common.js | 18 ++++++++++++++++++ js/ui/tab_cookies.js | 5 +---- 3 files changed, 19 insertions(+), 22 deletions(-) diff --git a/js/back.js b/js/back.js index 794e284..85f4ebb 100644 --- a/js/back.js +++ b/js/back.js @@ -42,24 +42,6 @@ addBlockAgentListener(); }); - function deleteCookies() { - // delete cookies here + ignore whitelisted cookies - getStorage("cookieWhitelist", function (data) { - let domainList = data.cookieWhitelist - getAllCookies({}, function (cookies) { - let callbackCount = 0; - for (let cookie of cookies) { - let url = getUrl(cookie.domain, cookie.path, cookie.secure); - // replace leading dots sometimes present in cookie domains - let domainWhitelist = domainList[cookie.domain.replace(/^\./, "")] - if (!domainWhitelist || domainWhitelist.indexOf(cookie.name) < 0) { - removeCookie({ "url": url, "name": cookie.name }); - } - } - }); - }); - } - function deleteBrowsingData(data) { if (!data) return; diff --git a/js/common.js b/js/common.js index 20cc1c7..1a1f36a 100644 --- a/js/common.js +++ b/js/common.js @@ -90,3 +90,21 @@ function blockUserAgent(details) } return {requestHeaders: details.requestHeaders}; } + +function deleteCookies() { + // delete cookies here + ignore whitelisted cookies + getStorage("cookieWhitelist", function (data) { + let domainList = data.cookieWhitelist + getAllCookies({}, function (cookies) { + let callbackCount = 0; + for (let cookie of cookies) { + let url = getUrl(cookie.domain, cookie.path, cookie.secure); + // replace leading dots sometimes present in cookie domains + let domainWhitelist = domainList[cookie.domain.replace(/^\./, "")] + if (!domainWhitelist || domainWhitelist.indexOf(cookie.name) < 0) { + removeCookie({ "url": url, "name": cookie.name }); + } + } + }); + }); +} diff --git a/js/ui/tab_cookies.js b/js/ui/tab_cookies.js index 5abee67..76d261a 100644 --- a/js/ui/tab_cookies.js +++ b/js/ui/tab_cookies.js @@ -287,10 +287,7 @@ }); break; case "delete-all-cookies": - chrome.browsingData.removeCookies({}, function() - { - populateDomainList(); - }); + deleteCookies() closeDialog(); break; } From 9e406e571d183e6674092caf8029049650c05402 Mon Sep 17 00:00:00 2001 From: Jeroen Evens Date: Wed, 21 Nov 2018 21:48:52 +0100 Subject: [PATCH 07/23] allowing whitelisting of domains fixing logic that removes item from whitelist updating code to use includes instead of indexOf >=0 replace regex dot removal with function --- js/common.js | 9 +++++++-- js/ui/tab_cookies.js | 21 ++++++++++++++++++--- popup.html | 1 + 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/js/common.js b/js/common.js index 1a1f36a..1cbc6d0 100644 --- a/js/common.js +++ b/js/common.js @@ -91,6 +91,11 @@ function blockUserAgent(details) return {requestHeaders: details.requestHeaders}; } +function removeStartDot(string) +{ + return string.replace(/^\./, ""); +} + function deleteCookies() { // delete cookies here + ignore whitelisted cookies getStorage("cookieWhitelist", function (data) { @@ -100,8 +105,8 @@ function deleteCookies() { for (let cookie of cookies) { let url = getUrl(cookie.domain, cookie.path, cookie.secure); // replace leading dots sometimes present in cookie domains - let domainWhitelist = domainList[cookie.domain.replace(/^\./, "")] - if (!domainWhitelist || domainWhitelist.indexOf(cookie.name) < 0) { + let domainWhitelist = domainList[removeStartDot(cookie.domain)] + if (!domainWhitelist || (!domainWhitelist.includes(cookie.name) && !domainWhitelist.includes(""))) { removeCookie({ "url": url, "name": cookie.name }); } } diff --git a/js/ui/tab_cookies.js b/js/ui/tab_cookies.js index 76d261a..23960fc 100644 --- a/js/ui/tab_cookies.js +++ b/js/ui/tab_cookies.js @@ -156,6 +156,23 @@ } }); break; + case "whitelist-cookie-domain": + var domain = getParentData(element, "data-access"); + var url = getUrl(domain, "", true); + getStorage("cookieWhitelist", function(data) { + let whitelist = data["cookieWhitelist"] + if (!whitelist.propertyIsEnumerable(domain)) { + whitelist[domain] = [] + } + if (!whitelist[domain].includes("")) { + data["cookieWhitelist"][domain].push("") + setStorage(data) + } else { + whitelist[domain] = whitelist[domain].filter(el => el !== "") + setStorage(data) + } + }); + break; case "whitelist-sublist-cookie": var accessObj = JSON.parse(getParentData(element, "data-access")); var domain = getParentData(getParentData(element, "data-access", true). @@ -166,12 +183,10 @@ if (!whitelist.propertyIsEnumerable(domain)) { whitelist[domain] = [] } - if (!whitelist[domain].includes("user_session") && !whitelist[domain].includes("")) { + if (!whitelist[domain].includes(accessObj.cookie)) { data["cookieWhitelist"][domain].push(accessObj.cookie) setStorage(data) } else { - // let index = whitelist[domain].indexOf("user_session") - // delete data["cookieWhitelist"][domain][index] whitelist[domain] = whitelist[domain].filter(el => el !== accessObj.cookie) setStorage(data) } diff --git a/popup.html b/popup.html index b38dc24..919ffce 100644 --- a/popup.html +++ b/popup.html @@ -114,6 +114,7 @@

+
From 9e2c93b82827cead628a7ea3c9fdbfece4e88975 Mon Sep 17 00:00:00 2001 From: Jeroen Evens Date: Thu, 22 Nov 2018 19:31:42 +0100 Subject: [PATCH 08/23] fixup! added whitelist to cookie deletion logic on startup --- js/ui/tab_cookies.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/ui/tab_cookies.js b/js/ui/tab_cookies.js index 23960fc..07d9a5a 100644 --- a/js/ui/tab_cookies.js +++ b/js/ui/tab_cookies.js @@ -200,7 +200,7 @@ break; case "delete-domain-cookies": var domain = getParentData(element, "data-access"); - getAllCookies({}, function(cookies) + getAllCookies({"domain": domain}, function(cookies) { var callbackCount = 0; for (var i = 0; i < cookies.length; i++) @@ -348,7 +348,7 @@ /** * Enable/disable control elements - * @param {Boolean} disabled + * @pa\ram {Boolean} disabled */ function disableControls(disabled) { From 9e66b77792ab7625947688d0e8b74105dfe3c72d Mon Sep 17 00:00:00 2001 From: Jeroen Evens Date: Thu, 22 Nov 2018 19:38:36 +0100 Subject: [PATCH 09/23] fixup! fixing setting cookiewhitelist dict on startup refactoring code to extract cookiedeletion to separate function fixing dictionary handling in deletecookie method rewriting whitelist to cookie comparison logic making logic more compact --- js/back.js | 66 +++++++++++++++++++++++++++++--------------- js/common.js | 15 ++++++---- js/ui/tab_cookies.js | 26 +++++++++++------ 3 files changed, 72 insertions(+), 35 deletions(-) diff --git a/js/back.js b/js/back.js index 85f4ebb..3538e92 100644 --- a/js/back.js +++ b/js/back.js @@ -18,23 +18,28 @@ "use strict"; -(function (global) { +(function (global) +{ global.collectedRequests = []; const requestCollectionLength = 500; function profileStart() { - getStorage("cookieWhitelist", function (data) { - if (data == {}) { + getStorage("cookieWhitelist", function (data) + { + if (data == {}) + { setStorage({ "cookieWhitelist": {} }) } }) - getStorage("settingList", function (data) { + getStorage("settingList", function (data) + { deleteBrowsingData(data.settingList); }); } //TODO: Find a solution to avoide duplication - getStorage("settingList", function (data) { + getStorage("settingList", function (data) + { if (data.settingList && data.settingList.collectHeaders) startCollectingRequests(); @@ -42,34 +47,41 @@ addBlockAgentListener(); }); - function deleteBrowsingData(data) { + function deleteBrowsingData(data) + { if (!data) return; // Filter "data" object to only match properties from "browsingData". - var browsingDataObj = Object.keys(data).filter(function (key) { + var browsingDataObj = Object.keys(data).filter(function (key) + { return browsingData.includes(key); - }).reduce(function (accumulator, dataType) { + }).reduce(function (accumulator, dataType) + { accumulator[dataType] = data[dataType]; return accumulator; }, {}); - if (browsingDataObj.removeAll == true) { - var browsingDataObj = browsingData.reduce(function (accumulator, dataType) { + if (browsingDataObj.removeAll == true) + { + var browsingDataObj = browsingData.reduce(function (accumulator, dataType) + { if (dataType != "removeAll") accumulator[dataType] = true; return accumulator; }, {}); - if (browsingDataObj.cookies) { + if (browsingDataObj.cookies) + { deleteCookies() } browsingDataObj.cookies = false; chrome.browsingData.remove({}, browsingDataObj); } else { - if (browsingDataObj.cookies) { + if (browsingDataObj.cookies) + { deleteCookies() } browsingDataObj.cookies = false; @@ -77,37 +89,45 @@ } } - global.startCollectingRequests = function () { + global.startCollectingRequests = function () + { addRequestListener(onSendHeaders, onHeadersReceived); }; - global.stopCollectingRequests = function () { + global.stopCollectingRequests = function () + { removeRequestListener(onSendHeaders, onHeadersReceived); }; - function onSendHeaders(details) { + function onSendHeaders(details) + { updateRequestObj(details, "send"); addToRequestArray(details); } - function onHeadersReceived(details) { + function onHeadersReceived(details) + { updateRequestObj(details, "receive"); addToRequestArray(details); } - function addToRequestArray(details) { + function addToRequestArray(details) + { if (collectedRequests.length > requestCollectionLength) collectedRequests.shift(); collectedRequests.push(details); } - chrome.storage.onChanged.addListener(function (change) { + chrome.storage.onChanged.addListener(function (change) + { if (change.settingList) { - chrome.permissions.contains(additionalPermission, function (result) { + chrome.permissions.contains(additionalPermission, function (result) + { var newValue = change.settingList.newValue.collectHeaders; var oldValue = change.settingList.oldValue; - if (oldValue && newValue != oldValue.collectHeaders) { + if (oldValue && newValue != oldValue.collectHeaders) + { if (result && newValue) startCollectingRequests(); else @@ -116,7 +136,8 @@ var newValue = change.settingList.newValue.blockUserAgent; var oldValue = change.settingList.oldValue; - if (oldValue && newValue != oldValue.blockUserAgent) { + if (oldValue && newValue != oldValue.blockUserAgent) + { if (result && newValue) addBlockAgentListener(); else @@ -126,7 +147,8 @@ } }); - chrome.permissions.onRemoved.addListener(function (result) { + chrome.permissions.onRemoved.addListener(function (result) + { removeBlockAgentListener(); removeRequestListener(onSendHeaders, onHeadersReceived); }); diff --git a/js/common.js b/js/common.js index 1cbc6d0..a575b30 100644 --- a/js/common.js +++ b/js/common.js @@ -96,17 +96,22 @@ function removeStartDot(string) return string.replace(/^\./, ""); } -function deleteCookies() { +function deleteCookies() +{ // delete cookies here + ignore whitelisted cookies - getStorage("cookieWhitelist", function (data) { + getStorage("cookieWhitelist", function (data) + { let domainList = data.cookieWhitelist - getAllCookies({}, function (cookies) { + getAllCookies({}, function (cookies) + { let callbackCount = 0; - for (let cookie of cookies) { + for (let cookie of cookies) + { let url = getUrl(cookie.domain, cookie.path, cookie.secure); // replace leading dots sometimes present in cookie domains let domainWhitelist = domainList[removeStartDot(cookie.domain)] - if (!domainWhitelist || (!domainWhitelist.includes(cookie.name) && !domainWhitelist.includes(""))) { + if (!domainWhitelist || (!domainWhitelist.includes(cookie.name) && !domainWhitelist.includes(""))) + { removeCookie({ "url": url, "name": cookie.name }); } } diff --git a/js/ui/tab_cookies.js b/js/ui/tab_cookies.js index 07d9a5a..ba91767 100644 --- a/js/ui/tab_cookies.js +++ b/js/ui/tab_cookies.js @@ -159,15 +159,20 @@ case "whitelist-cookie-domain": var domain = getParentData(element, "data-access"); var url = getUrl(domain, "", true); - getStorage("cookieWhitelist", function(data) { + getStorage("cookieWhitelist", function(data) + { let whitelist = data["cookieWhitelist"] - if (!whitelist.propertyIsEnumerable(domain)) { + if (!whitelist.propertyIsEnumerable(domain)) + { whitelist[domain] = [] } - if (!whitelist[domain].includes("")) { + if (!whitelist[domain].includes("")) + { data["cookieWhitelist"][domain].push("") setStorage(data) - } else { + } + else + { whitelist[domain] = whitelist[domain].filter(el => el !== "") setStorage(data) } @@ -178,15 +183,20 @@ var domain = getParentData(getParentData(element, "data-access", true). parentElement, "data-access"); var url = getUrl(domain, accessObj.path, accessObj.secure); - getStorage("cookieWhitelist", function(data) { + getStorage("cookieWhitelist", function(data) + { let whitelist = data["cookieWhitelist"] - if (!whitelist.propertyIsEnumerable(domain)) { + if (!whitelist.propertyIsEnumerable(domain)) + { whitelist[domain] = [] } - if (!whitelist[domain].includes(accessObj.cookie)) { + if (!whitelist[domain].includes(accessObj.cookie)) + { data["cookieWhitelist"][domain].push(accessObj.cookie) setStorage(data) - } else { + } + else + { whitelist[domain] = whitelist[domain].filter(el => el !== accessObj.cookie) setStorage(data) } From 3ae061aab2f1fab601f7f9f869bae9b1ac30101a Mon Sep 17 00:00:00 2001 From: Jeroen Evens Date: Sat, 24 Nov 2018 16:01:13 +0100 Subject: [PATCH 10/23] improved code based on feedback changed structure of cookiewhitelist adapted whitelisting and deleting logic accordingly --- js/back.js | 2 +- js/common.js | 2 +- js/ui/tab_cookies.js | 41 ++++++++++++++++++----------------------- 3 files changed, 20 insertions(+), 25 deletions(-) diff --git a/js/back.js b/js/back.js index 3538e92..3635121 100644 --- a/js/back.js +++ b/js/back.js @@ -148,7 +148,7 @@ }); chrome.permissions.onRemoved.addListener(function (result) - { + { removeBlockAgentListener(); removeRequestListener(onSendHeaders, onHeadersReceived); }); diff --git a/js/common.js b/js/common.js index a575b30..138aaea 100644 --- a/js/common.js +++ b/js/common.js @@ -110,7 +110,7 @@ function deleteCookies() let url = getUrl(cookie.domain, cookie.path, cookie.secure); // replace leading dots sometimes present in cookie domains let domainWhitelist = domainList[removeStartDot(cookie.domain)] - if (!domainWhitelist || (!domainWhitelist.includes(cookie.name) && !domainWhitelist.includes(""))) + if (!domainWhitelist || (!domainWhitelist.cookies.includes(cookie.name) && !domainWhitelist.domainWhitelist)) { removeCookie({ "url": url, "name": cookie.name }); } diff --git a/js/ui/tab_cookies.js b/js/ui/tab_cookies.js index ba91767..7d48ef2 100644 --- a/js/ui/tab_cookies.js +++ b/js/ui/tab_cookies.js @@ -158,48 +158,43 @@ break; case "whitelist-cookie-domain": var domain = getParentData(element, "data-access"); - var url = getUrl(domain, "", true); - getStorage("cookieWhitelist", function(data) + + getStorage("cookieWhitelist", function(cookieWhitelist) { - let whitelist = data["cookieWhitelist"] - if (!whitelist.propertyIsEnumerable(domain)) + let whitelist = cookieWhitelist["cookieWhitelist"] + if (!(domain in whitelist)) { - whitelist[domain] = [] + whitelist[domain] = {domainWhitelist: true, cookies: []} } - if (!whitelist[domain].includes("")) - { - data["cookieWhitelist"][domain].push("") - setStorage(data) - } - else + else { - whitelist[domain] = whitelist[domain].filter(el => el !== "") - setStorage(data) + whitelist[domain].domainWhitelist = !whitelist[domain].domainWhitelist; } + setStorage(cookieWhitelist) }); break; case "whitelist-sublist-cookie": var accessObj = JSON.parse(getParentData(element, "data-access")); var domain = getParentData(getParentData(element, "data-access", true). parentElement, "data-access"); - var url = getUrl(domain, accessObj.path, accessObj.secure); - getStorage("cookieWhitelist", function(data) + getStorage("cookieWhitelist", function(cookieWhitelist) { - let whitelist = data["cookieWhitelist"] - if (!whitelist.propertyIsEnumerable(domain)) + let whitelist = cookieWhitelist["cookieWhitelist"] + if (!(domain in whitelist)) { - whitelist[domain] = [] + whitelist[domain] = {domainWhitelist: false, cookies: [accessObj.cookie]} } - if (!whitelist[domain].includes(accessObj.cookie)) + else if (whitelist[domain].cookies.includes(accessObj.cookie)) { - data["cookieWhitelist"][domain].push(accessObj.cookie) - setStorage(data) + // filter out cookie name + whitelist[domain].cookies = whitelist[domain].cookies.filter(el => el !== accessObj.cookie) } else { - whitelist[domain] = whitelist[domain].filter(el => el !== accessObj.cookie) - setStorage(data) + // add cookie name + whitelist[domain].cookies.push(accessObj.cookie) } + setStorage(cookieWhitelist) }); break; case "close-expanded-domain": From aa943baff0aabac14bc04c382dd2cd55e3ad42e5 Mon Sep 17 00:00:00 2001 From: Jeroen Evens Date: Wed, 28 Nov 2018 22:13:58 +0100 Subject: [PATCH 11/23] update UI to update whitelist code for both domain and sublist cookies --- css/main.css | 40 ++++++++++++++++++++++++++++++++++------ js/ui/tab_cookies.js | 37 ++++++++++++++++++++++++++++++++++--- popup.html | 10 ++++++++-- 3 files changed, 76 insertions(+), 11 deletions(-) diff --git a/css/main.css b/css/main.css index c9954b1..7164c98 100644 --- a/css/main.css +++ b/css/main.css @@ -531,23 +531,51 @@ button.icon.edit:after background-image: url(/css/img/edit.svg); } -#cookiesList button.icon.whitelist +/* button[role="checkbox"][aria-checked="true"] > span:first-child { - margin: 0px 10px; + background-color: var(--color-primary); + color: #fff; } +button[role="checkbox"][aria-checked="true"] > span:last-child +{ + color: #000; + background: none; +} */ -button.icon.whitelist +.tableList > li[data-whitelist="true"] > div .icon.whitelist { - background-image: url(/css/img/check-mark-circle.svg); + background-color: var(--color-primary); + color: #fff; +} +.tableList > li[data-whitelist="true"] > div .icon.whitelist > span:last-child +{ + color: #000; + background: none; } -button.icon.whitelist:hover:after +.tableList li > ul li[data-whitelist="true"] > div .icon.whitelist { - background-image: url(/css/img/check-mark-filled.svg); + background-color: var(--color-primary); + color: #fff; +} + +.tableList li > ul li[data-whitelist="true"] > div .icon.whitelist > span:last-child +{ + color: #000; + background: none; } +/* .tableList li > ul li[data-whitelist="true"] .icon.whitelist +{ + background-image: url(/css/img/check-mark-filled.svg); +} +.tableList li > ul li[data-whitelist="false"] .icon.whitelist +{ + background-image: url(/css/img/check-mark-circle.svg); +} */ + button.icon.edit:hover:after { diff --git a/js/ui/tab_cookies.js b/js/ui/tab_cookies.js index 7d48ef2..e67847c 100644 --- a/js/ui/tab_cookies.js +++ b/js/ui/tab_cookies.js @@ -25,6 +25,7 @@ const getCookie = chrome.cookies.get; const setCookie = chrome.cookies.set; const onCookieChange = chrome.cookies.onChanged; + const onStorageChange = chrome.storage.onChanged; const activeTabCookieId = "activeTabCookies"; @@ -409,11 +410,12 @@ }; } - function createDomainObj(domain, cookienum) + function createDomainObj(domain, cookienum, whitelist = false) { return { dataset: { - access: domain + access: domain, + whitelist: whitelist }, texts: { domain: domain, @@ -421,7 +423,36 @@ } }; } - + onStorageChange.addListener(function(change) + { + if ("cookieWhitelist" in change) + { + let newValue = change.cookieWhitelist.newValue; + for (var domain in newValue) + { + domainElement.dataset.whitelist = newValue[domain].domainWhitelist; + tableList.updateItem(domainElement, domain); + let domainElement = tableList.getItem(domain); + if (domainElement) + { + let cookies = newValue[domain].cookies; + for (let subElement of domainElement.subItems) + { + if (cookies.includes(subElement.texts.name)) + { + subElement.dataset.whitelist = true; + } + else + { + subElement.dataset.whitelist = false; + } + tableList.removeSubItem(domain, subElement.dataset.access); + tableList.addSubItem(subElement, domain); + } + } + } + } + }); onCookieChange.addListener(function(changeInfo) { var cookie = changeInfo.cookie; diff --git a/popup.html b/popup.html index 919ffce..1e54aac 100644 --- a/popup.html +++ b/popup.html @@ -114,7 +114,10 @@

- +
@@ -136,7 +139,10 @@

- +
From 43a8e391c95efda1e72bb095987e145c35ee1d71 Mon Sep 17 00:00:00 2001 From: Jeroen Evens Date: Thu, 29 Nov 2018 19:07:03 +0100 Subject: [PATCH 12/23] update whitelist ckeckbox for subitems adding logic to update whitelist checkboxes on tab load and on domain cookie load --- js/ui/tab_cookies.js | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/js/ui/tab_cookies.js b/js/ui/tab_cookies.js index e67847c..bc3439b 100644 --- a/js/ui/tab_cookies.js +++ b/js/ui/tab_cookies.js @@ -129,6 +129,10 @@ } domainObjs.push(createDomainObj(lastDomain, cookiesNumber)); tableList.addItems(domainObjs); + getStorage("cookieWhitelist", function(cookieWhitelist) + { + updateWhitelistInList({cookieWhitelist: {newValue: cookieWhitelist["cookieWhitelist"]}}) + }); }); } @@ -155,6 +159,11 @@ tableList.addSubItem(createCookieSubitemObj(cookie), domain); } + // update whitelist + getStorage("cookieWhitelist", function(cookieWhitelist) + { + updateWhitelistInList({cookieWhitelist: {newValue: cookieWhitelist["cookieWhitelist"]}}) + }); }); break; case "whitelist-cookie-domain": @@ -423,36 +432,41 @@ } }; } - onStorageChange.addListener(function(change) + function updateWhitelistInList(change) { if ("cookieWhitelist" in change) { let newValue = change.cookieWhitelist.newValue; for (var domain in newValue) { - domainElement.dataset.whitelist = newValue[domain].domainWhitelist; - tableList.updateItem(domainElement, domain); let domainElement = tableList.getItem(domain); if (domainElement) { + domainElement.dataset.whitelist = newValue[domain].domainWhitelist; + tableList.updateItem(domainElement, domain); let cookies = newValue[domain].cookies; for (let subElement of domainElement.subItems) { if (cookies.includes(subElement.texts.name)) { subElement.dataset.whitelist = true; + let cookieAccessor = "li[data-access='" + subElement.dataset.access + "']" + document.querySelector(cookieAccessor).dataset.whitelist = true } else { subElement.dataset.whitelist = false; + let cookieAccessor = "li[data-access='" + subElement.dataset.access + "']" + document.querySelector(cookieAccessor).dataset.whitelist = false } - tableList.removeSubItem(domain, subElement.dataset.access); - tableList.addSubItem(subElement, domain); + // tableList.removeSubItem(domain, subElement.dataset.access); + // tableList.addSubItem(subElement, domain); } } } } - }); + }; + onStorageChange.addListener(updateWhitelistInList) onCookieChange.addListener(function(changeInfo) { var cookie = changeInfo.cookie; From a4bd5481585ac0edf836e064c2a248b469c7ef4a Mon Sep 17 00:00:00 2001 From: Jeroen Evens Date: Sat, 1 Dec 2018 15:53:20 +0100 Subject: [PATCH 13/23] added validation before updating sublist items fixing buttons to image in view instead of using switches updating css to fix scaling of buttons --- css/main.css | 48 ++++++++++++++------------------------------ js/back.js | 1 - js/ui/tab_cookies.js | 27 +++++++++++++------------ popup.html | 10 ++------- 4 files changed, 31 insertions(+), 55 deletions(-) diff --git a/css/main.css b/css/main.css index 7164c98..2937e1e 100644 --- a/css/main.css +++ b/css/main.css @@ -531,51 +531,33 @@ button.icon.edit:after background-image: url(/css/img/edit.svg); } -/* button[role="checkbox"][aria-checked="true"] > span:first-child +.tableList > li > div .icon.whitelist::after { - background-color: var(--color-primary); - color: #fff; -} - -button[role="checkbox"][aria-checked="true"] > span:last-child -{ - color: #000; - background: none; -} */ - -.tableList > li[data-whitelist="true"] > div .icon.whitelist -{ - background-color: var(--color-primary); - color: #fff; -} -.tableList > li[data-whitelist="true"] > div .icon.whitelist > span:last-child -{ - color: #000; - background: none; + background-image: url(/css/img/check-mark-circle.svg); + background-size: 105%; + background-repeat: no-repeat; } -.tableList li > ul li[data-whitelist="true"] > div .icon.whitelist +.tableList li > ul li > div .icon.whitelist::after { - background-color: var(--color-primary); - color: #fff; + background-image: url(/css/img/check-mark-circle.svg); + background-size: 105%; + background-repeat: no-repeat; } -.tableList li > ul li[data-whitelist="true"] > div .icon.whitelist > span:last-child +.tableList > li[data-whitelist="true"] > div .icon.whitelist::after { - color: #000; - background: none; + background-image: url(/css/img/check-mark-filled.svg); + background-size: 105%; + background-repeat: no-repeat; } - -/* .tableList li > ul li[data-whitelist="true"] .icon.whitelist +.tableList li > ul li[data-whitelist="true"] > div .icon.whitelist::after { background-image: url(/css/img/check-mark-filled.svg); + background-size: 105%; + background-repeat: no-repeat; } -.tableList li > ul li[data-whitelist="false"] .icon.whitelist -{ - background-image: url(/css/img/check-mark-circle.svg); -} */ - button.icon.edit:hover:after { diff --git a/js/back.js b/js/back.js index 3635121..f1dfb39 100644 --- a/js/back.js +++ b/js/back.js @@ -155,5 +155,4 @@ // Fired on a profile start up chrome.runtime.onStartup.addListener(profileStart); - chrome.runtime.onInstalled.addListener(profileStart); })(this); diff --git a/js/ui/tab_cookies.js b/js/ui/tab_cookies.js index bc3439b..7849824 100644 --- a/js/ui/tab_cookies.js +++ b/js/ui/tab_cookies.js @@ -445,22 +445,23 @@ domainElement.dataset.whitelist = newValue[domain].domainWhitelist; tableList.updateItem(domainElement, domain); let cookies = newValue[domain].cookies; - for (let subElement of domainElement.subItems) + if (domainElement.subItems) { - if (cookies.includes(subElement.texts.name)) + for (let subElement of domainElement.subItems) { - subElement.dataset.whitelist = true; - let cookieAccessor = "li[data-access='" + subElement.dataset.access + "']" - document.querySelector(cookieAccessor).dataset.whitelist = true - } - else - { - subElement.dataset.whitelist = false; - let cookieAccessor = "li[data-access='" + subElement.dataset.access + "']" - document.querySelector(cookieAccessor).dataset.whitelist = false + if (cookies.includes(subElement.texts.name)) + { + subElement.dataset.whitelist = true; + let cookieAccessor = "li[data-access='" + subElement.dataset.access + "']" + document.querySelector(cookieAccessor).dataset.whitelist = true + } + else + { + subElement.dataset.whitelist = false; + let cookieAccessor = "li[data-access='" + subElement.dataset.access + "']" + document.querySelector(cookieAccessor).dataset.whitelist = false + } } - // tableList.removeSubItem(domain, subElement.dataset.access); - // tableList.addSubItem(subElement, domain); } } } diff --git a/popup.html b/popup.html index 1e54aac..f2a745a 100644 --- a/popup.html +++ b/popup.html @@ -114,12 +114,9 @@

-
+
@@ -139,10 +136,7 @@

- + From 70ec9573f23e2f0fc3a98ce0b57c7dfb666e7176 Mon Sep 17 00:00:00 2001 From: Jeroen Evens Date: Sat, 1 Dec 2018 16:26:27 +0100 Subject: [PATCH 14/23] moved check for new whitelist data outside of the updateWhitelistInList method cleaned up calls to updateWhitelistInList --- js/ui/tab_cookies.js | 52 ++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/js/ui/tab_cookies.js b/js/ui/tab_cookies.js index 7849824..4c4f143 100644 --- a/js/ui/tab_cookies.js +++ b/js/ui/tab_cookies.js @@ -131,7 +131,7 @@ tableList.addItems(domainObjs); getStorage("cookieWhitelist", function(cookieWhitelist) { - updateWhitelistInList({cookieWhitelist: {newValue: cookieWhitelist["cookieWhitelist"]}}) + updateWhitelistInList(cookieWhitelist["cookieWhitelist"]); }); }); } @@ -162,7 +162,7 @@ // update whitelist getStorage("cookieWhitelist", function(cookieWhitelist) { - updateWhitelistInList({cookieWhitelist: {newValue: cookieWhitelist["cookieWhitelist"]}}) + updateWhitelistInList(cookieWhitelist["cookieWhitelist"]); }); }); break; @@ -432,42 +432,42 @@ } }; } - function updateWhitelistInList(change) + function updateWhitelistInList(newValue) { - if ("cookieWhitelist" in change) + for (var domain in newValue) { - let newValue = change.cookieWhitelist.newValue; - for (var domain in newValue) + let domainElement = tableList.getItem(domain); + if (domainElement) { - let domainElement = tableList.getItem(domain); - if (domainElement) + domainElement.dataset.whitelist = newValue[domain].domainWhitelist; + tableList.updateItem(domainElement, domain); + let cookies = newValue[domain].cookies; + if (domainElement.subItems) { - domainElement.dataset.whitelist = newValue[domain].domainWhitelist; - tableList.updateItem(domainElement, domain); - let cookies = newValue[domain].cookies; - if (domainElement.subItems) + for (let subElement of domainElement.subItems) { - for (let subElement of domainElement.subItems) + if (cookies.includes(subElement.texts.name)) { - if (cookies.includes(subElement.texts.name)) - { - subElement.dataset.whitelist = true; - let cookieAccessor = "li[data-access='" + subElement.dataset.access + "']" - document.querySelector(cookieAccessor).dataset.whitelist = true - } - else - { - subElement.dataset.whitelist = false; - let cookieAccessor = "li[data-access='" + subElement.dataset.access + "']" - document.querySelector(cookieAccessor).dataset.whitelist = false - } + subElement.dataset.whitelist = true; + let cookieAccessor = "li[data-access='" + subElement.dataset.access + "']" + document.querySelector(cookieAccessor).dataset.whitelist = true + } + else + { + subElement.dataset.whitelist = false; + let cookieAccessor = "li[data-access='" + subElement.dataset.access + "']" + document.querySelector(cookieAccessor).dataset.whitelist = false } } } } } }; - onStorageChange.addListener(updateWhitelistInList) + onStorageChange.addListener(function(changeInfo) + { + if ("cookieWhitelist" in changeInfo) + updateWhitelistInList(changeInfo.cookieWhitelist.newValue); + }); onCookieChange.addListener(function(changeInfo) { var cookie = changeInfo.cookie; From c0318453c07562f8f66f4e1147518f68af0c700a Mon Sep 17 00:00:00 2001 From: Jeroen Evens Date: Sat, 1 Dec 2018 18:28:54 +0100 Subject: [PATCH 15/23] filter out unchanged domains and cookies from whitelist before modifying tree --- js/ui/tab_cookies.js | 44 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/js/ui/tab_cookies.js b/js/ui/tab_cookies.js index 4c4f143..a20b563 100644 --- a/js/ui/tab_cookies.js +++ b/js/ui/tab_cookies.js @@ -129,9 +129,10 @@ } domainObjs.push(createDomainObj(lastDomain, cookiesNumber)); tableList.addItems(domainObjs); + // update getStorage("cookieWhitelist", function(cookieWhitelist) { - updateWhitelistInList(cookieWhitelist["cookieWhitelist"]); + updateWhitelistInList({oldValue: false, newValue: cookieWhitelist["cookieWhitelist"]}); }); }); } @@ -162,7 +163,7 @@ // update whitelist getStorage("cookieWhitelist", function(cookieWhitelist) { - updateWhitelistInList(cookieWhitelist["cookieWhitelist"]); + updateWhitelistInList({oldValue: false, newValue: cookieWhitelist["cookieWhitelist"]}); }); }); break; @@ -432,9 +433,42 @@ } }; } - function updateWhitelistInList(newValue) + function updateWhitelistInList(whitelistChange) { - for (var domain in newValue) + let newValue = whitelistChange.newValue + let oldValue = whitelistChange.oldValue + let changed = {} + if (oldValue) + { + for (let key in newValue) + { + let domainWhitelistChanged = false; + if (key in oldValue) { + if (oldValue[key].domainWhitelist != newValue[key].domainWhitelist) + { + domainWhitelistChanged = true; + } + let newCookie = newValue[key].cookies + let oldCookie = oldValue[key].cookies + let cookieWhitelistchanges = newCookie.filter(x => !oldCookie.includes(x)).concat(oldCookie.filter(x => !newCookie.includes(x))); + let cookieWhitelistchanged = cookieWhitelistchanges.length + if (domainWhitelistChanged || cookieWhitelistchanged) + { + changed[key] = newValue[key] + } + } + else + { + changed[key] = newValue[key] + } + } + } + else + { + changed = newValue + } + + for (var domain in changed) { let domainElement = tableList.getItem(domain); if (domainElement) @@ -466,7 +500,7 @@ onStorageChange.addListener(function(changeInfo) { if ("cookieWhitelist" in changeInfo) - updateWhitelistInList(changeInfo.cookieWhitelist.newValue); + updateWhitelistInList(changeInfo.cookieWhitelist); }); onCookieChange.addListener(function(changeInfo) { From 076e9d9a8c7d15a436de5ad8dba12f6aa7bc4564 Mon Sep 17 00:00:00 2001 From: Jeroen Evens Date: Sat, 1 Dec 2018 18:47:14 +0100 Subject: [PATCH 16/23] moved filtering of cookiewhitelistchanges out of updateWhitelistInList logic fixed up code updated getcookies to only update whitelist status for that domain --- js/ui/tab_cookies.js | 81 +++++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 39 deletions(-) diff --git a/js/ui/tab_cookies.js b/js/ui/tab_cookies.js index a20b563..bf2b727 100644 --- a/js/ui/tab_cookies.js +++ b/js/ui/tab_cookies.js @@ -132,7 +132,7 @@ // update getStorage("cookieWhitelist", function(cookieWhitelist) { - updateWhitelistInList({oldValue: false, newValue: cookieWhitelist["cookieWhitelist"]}); + updateWhitelistInList(cookieWhitelist["cookieWhitelist"]); }); }); } @@ -163,7 +163,9 @@ // update whitelist getStorage("cookieWhitelist", function(cookieWhitelist) { - updateWhitelistInList({oldValue: false, newValue: cookieWhitelist["cookieWhitelist"]}); + let domainCookies = {} + domainCookies[domain] = cookieWhitelist.cookieWhitelist[domain] + updateWhitelistInList(domainCookies); }); }); break; @@ -435,47 +437,14 @@ } function updateWhitelistInList(whitelistChange) { - let newValue = whitelistChange.newValue - let oldValue = whitelistChange.oldValue - let changed = {} - if (oldValue) - { - for (let key in newValue) - { - let domainWhitelistChanged = false; - if (key in oldValue) { - if (oldValue[key].domainWhitelist != newValue[key].domainWhitelist) - { - domainWhitelistChanged = true; - } - let newCookie = newValue[key].cookies - let oldCookie = oldValue[key].cookies - let cookieWhitelistchanges = newCookie.filter(x => !oldCookie.includes(x)).concat(oldCookie.filter(x => !newCookie.includes(x))); - let cookieWhitelistchanged = cookieWhitelistchanges.length - if (domainWhitelistChanged || cookieWhitelistchanged) - { - changed[key] = newValue[key] - } - } - else - { - changed[key] = newValue[key] - } - } - } - else - { - changed = newValue - } - - for (var domain in changed) + for (var domain in whitelistChange) { let domainElement = tableList.getItem(domain); if (domainElement) { - domainElement.dataset.whitelist = newValue[domain].domainWhitelist; + domainElement.dataset.whitelist = whitelistChange[domain].domainWhitelist; tableList.updateItem(domainElement, domain); - let cookies = newValue[domain].cookies; + let cookies = whitelistChange[domain].cookies; if (domainElement.subItems) { for (let subElement of domainElement.subItems) @@ -500,7 +469,41 @@ onStorageChange.addListener(function(changeInfo) { if ("cookieWhitelist" in changeInfo) - updateWhitelistInList(changeInfo.cookieWhitelist); + { + let newValue = changeInfo.cookieWhitelist.newValue + let oldValue = changeInfo.cookieWhitelist.oldValue + let changed = {} + if (oldValue) + { + for (let key in newValue) + { + let domainWhitelistChanged = false; + if (key in oldValue) { + if (oldValue[key].domainWhitelist != newValue[key].domainWhitelist) + { + domainWhitelistChanged = true; + } + let newCookie = newValue[key].cookies + let oldCookie = oldValue[key].cookies + let cookieWhitelistchanges = newCookie.filter(x => !oldCookie.includes(x)).concat(oldCookie.filter(x => !newCookie.includes(x))); + let cookieWhitelistchanged = cookieWhitelistchanges.length + if (domainWhitelistChanged || cookieWhitelistchanged) + { + changed[key] = newValue[key] + } + } + else + { + changed[key] = newValue[key] + } + } + } + else + { + changed = newValue + } + updateWhitelistInList(changed); + } }); onCookieChange.addListener(function(changeInfo) { From 558603e50dc078c970c65f0db541e3748fe5f305 Mon Sep 17 00:00:00 2001 From: Jeroen Evens Date: Tue, 4 Dec 2018 19:33:06 +0100 Subject: [PATCH 17/23] fix issue deleting whitelist fix error on opening cookies from domain without data in whitelist --- js/back.js | 5 +++-- js/ui/tab_cookies.js | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/js/back.js b/js/back.js index f1dfb39..4283dec 100644 --- a/js/back.js +++ b/js/back.js @@ -26,9 +26,9 @@ function profileStart() { getStorage("cookieWhitelist", function (data) { - if (data == {}) + if (!data || !data.cookieWhitelist) { - setStorage({ "cookieWhitelist": {} }) + setStorage({"cookieWhitelist": {} }) } }) getStorage("settingList", function (data) @@ -154,5 +154,6 @@ }); // Fired on a profile start up + chrome.runtime.onInstalled.addListener(profileStart); chrome.runtime.onStartup.addListener(profileStart); })(this); diff --git a/js/ui/tab_cookies.js b/js/ui/tab_cookies.js index bf2b727..dd2d103 100644 --- a/js/ui/tab_cookies.js +++ b/js/ui/tab_cookies.js @@ -165,7 +165,8 @@ { let domainCookies = {} domainCookies[domain] = cookieWhitelist.cookieWhitelist[domain] - updateWhitelistInList(domainCookies); + if (domainCookies[domain]) + updateWhitelistInList(domainCookies); }); }); break; From a9bda9eedab944ac2a46ec79767fcd6250f539b9 Mon Sep 17 00:00:00 2001 From: Jeroen Evens Date: Tue, 4 Dec 2018 22:10:21 +0100 Subject: [PATCH 18/23] adding message for whitelist buttons adding data-i18n to button --- _locales/en_US/messages.json | 8 ++++++++ popup.html | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/_locales/en_US/messages.json b/_locales/en_US/messages.json index 6f27b6a..e67f620 100644 --- a/_locales/en_US/messages.json +++ b/_locales/en_US/messages.json @@ -355,6 +355,14 @@ "description": "text in Cookies 'delete all' dialog", "message": "You are about to delete all cookies, are you sure ?" }, + "whitelistCookieDomain": { + "description": "text when hovering over Whitelist button for Cookie Domain", + "message": "This button adds all cookies from a domain to a Whitelist, preventing them from being automatically deleted, usefull if you want to stay logged in to some websites but still want all other cookies to be deleted" + }, + "whitelistSublistCookie": { + "description": "text when hovering over Whitelist button for Sublist Cookies", + "message": "This button adds a specific cookie to a Whitelist, preventing them from being automatically deleted, usefull if you want to stay logged in to some websites but still want all other cookies to be deleted" + }, "additionalPermissions": { "description": "Label for requesting additional permission setting", "message": "Additional permissions" diff --git a/popup.html b/popup.html index f2a745a..1587876 100644 --- a/popup.html +++ b/popup.html @@ -116,7 +116,7 @@

- + @@ -136,7 +136,7 @@

- + From 39df11d90521e5c5e85505971de12c2c588febb7 Mon Sep 17 00:00:00 2001 From: Jeroen Evens Date: Sat, 8 Dec 2018 18:19:53 +0100 Subject: [PATCH 19/23] reducing complexity of method checking changes in whitelist --- js/ui/tab_cookies.js | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/js/ui/tab_cookies.js b/js/ui/tab_cookies.js index dd2d103..6962650 100644 --- a/js/ui/tab_cookies.js +++ b/js/ui/tab_cookies.js @@ -476,28 +476,17 @@ let changed = {} if (oldValue) { - for (let key in newValue) + changed = Object.keys(newValue).reduce((acc, domain) => { - let domainWhitelistChanged = false; - if (key in oldValue) { - if (oldValue[key].domainWhitelist != newValue[key].domainWhitelist) - { - domainWhitelistChanged = true; - } - let newCookie = newValue[key].cookies - let oldCookie = oldValue[key].cookies - let cookieWhitelistchanges = newCookie.filter(x => !oldCookie.includes(x)).concat(oldCookie.filter(x => !newCookie.includes(x))); - let cookieWhitelistchanged = cookieWhitelistchanges.length - if (domainWhitelistChanged || cookieWhitelistchanged) - { - changed[key] = newValue[key] - } - } - else + let oldDomainObj = oldValue[domain] + let newDomainObj = newValue[domain] + if (!oldDomainObj || newDomainObj.domainWhitelist != oldDomainObj.domainWhitelist || + JSON.stringify(newDomainObj.cookies) != JSON.stringify(oldDomainObj.cookies)) { - changed[key] = newValue[key] + acc[domain] = newValue[domain]; } - } + return acc; + }, {}); } else { From 6037a4a805dde3fab76e37e479d120c2c3e5ccd2 Mon Sep 17 00:00:00 2001 From: Jeroen Evens Date: Sun, 16 Dec 2018 17:26:15 +0100 Subject: [PATCH 20/23] fix spaces and whitelist icon size --- css/main.css | 8 ++++---- js/back.js | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/css/main.css b/css/main.css index 2937e1e..cb3e008 100644 --- a/css/main.css +++ b/css/main.css @@ -534,28 +534,28 @@ button.icon.edit:after .tableList > li > div .icon.whitelist::after { background-image: url(/css/img/check-mark-circle.svg); - background-size: 105%; + background-size: 100%; background-repeat: no-repeat; } .tableList li > ul li > div .icon.whitelist::after { background-image: url(/css/img/check-mark-circle.svg); - background-size: 105%; + background-size: 100%; background-repeat: no-repeat; } .tableList > li[data-whitelist="true"] > div .icon.whitelist::after { background-image: url(/css/img/check-mark-filled.svg); - background-size: 105%; + background-size: 100%; background-repeat: no-repeat; } .tableList li > ul li[data-whitelist="true"] > div .icon.whitelist::after { background-image: url(/css/img/check-mark-filled.svg); - background-size: 105%; + background-size: 100%; background-repeat: no-repeat; } diff --git a/js/back.js b/js/back.js index 4283dec..4d5b007 100644 --- a/js/back.js +++ b/js/back.js @@ -18,7 +18,7 @@ "use strict"; -(function (global) +(function(global) { global.collectedRequests = []; const requestCollectionLength = 500; From d0da7712b2bf828301864a8a970965f4adf058cc Mon Sep 17 00:00:00 2001 From: Jeroen Evens Date: Sat, 29 Dec 2018 14:43:31 +0100 Subject: [PATCH 21/23] fixing title message displayed when hovering over whitelist button --- js/ui/common.js | 7 +++++++ js/ui/tab_cookies.js | 8 +++++++- popup.html | 4 ++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/js/ui/common.js b/js/ui/common.js index feaa478..529b58f 100644 --- a/js/ui/common.js +++ b/js/ui/common.js @@ -709,6 +709,13 @@ TableList.prototype._updateListElem = function(itemObj, listElem) if (textElement) textElement.textContent = textsObj[name]; } + var titleObjs = itemObj.titles; + for (var title in titleObjs) + { + var titleElement = listElem.querySelector("[data-text='"+ title +"']"); + if (titleElement) + titleElement.title = titleObjs[title]; + } // Set default tabindex to the first list Element if (this.listElem.childElementCount == 0) diff --git a/js/ui/tab_cookies.js b/js/ui/tab_cookies.js index 6962650..b5ea7c8 100644 --- a/js/ui/tab_cookies.js +++ b/js/ui/tab_cookies.js @@ -129,7 +129,7 @@ } domainObjs.push(createDomainObj(lastDomain, cookiesNumber)); tableList.addItems(domainObjs); - // update + // update whitelist getStorage("cookieWhitelist", function(cookieWhitelist) { updateWhitelistInList(cookieWhitelist["cookieWhitelist"]); @@ -419,6 +419,9 @@ texts: { name: cookie.name, value: cookie.value + }, + titles: { + whitelist: getMsg("whitelistSublistCookie") } }; } @@ -433,6 +436,9 @@ texts: { domain: domain, cookienum: cookienum + " Cookies" + }, + titles: { + whitelist: getMsg("whitelistCookieDomain") } }; } diff --git a/popup.html b/popup.html index 1587876..cdb579f 100644 --- a/popup.html +++ b/popup.html @@ -116,7 +116,7 @@

- + @@ -136,7 +136,7 @@

- + From 018daa0a0c8d07787789280383778e1880bf315b Mon Sep 17 00:00:00 2001 From: Jeroen Evens Date: Sat, 29 Dec 2018 14:51:49 +0100 Subject: [PATCH 22/23] update version in manifest --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 0bca27f..12d350a 100644 --- a/manifest.json +++ b/manifest.json @@ -20,5 +20,5 @@ "permissions": ["privacy", "cookies", "browsingData", "tabs", "webRequest", "webRequestBlocking", "storage"], "incognito": "split", "update_url": "https://clients2.google.com/service/update2/crx", - "version": "3.3.0" + "version": "3.4.0" } From db2c87c44cf843ccbec709436d103f284532b27e Mon Sep 17 00:00:00 2001 From: Jeroen Evens Date: Sun, 6 Jan 2019 14:15:28 +0100 Subject: [PATCH 23/23] adding constant for whitelistbutton titles and added comment for createDomainObj --- js/ui/tab_cookies.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/js/ui/tab_cookies.js b/js/ui/tab_cookies.js index b5ea7c8..3c32eb2 100644 --- a/js/ui/tab_cookies.js +++ b/js/ui/tab_cookies.js @@ -26,6 +26,8 @@ const setCookie = chrome.cookies.set; const onCookieChange = chrome.cookies.onChanged; const onStorageChange = chrome.storage.onChanged; + const cookieWhitelistButtonTitle = getMsg("whitelistSublistCookie") + const domainWhitelistButtonTitle = getMsg("whitelistCookieDomain") const activeTabCookieId = "activeTabCookies"; @@ -421,11 +423,17 @@ value: cookie.value }, titles: { - whitelist: getMsg("whitelistSublistCookie") + whitelist: cookieWhitelistButtonTitle } }; } + /** + * Create a Table List Item Structure Object + * @param {String} domain Domain name + * @param {Number} cookienum Number of domain cookies + * @param {Boolean} whitelist specifies whether domain is whitelisted + */ function createDomainObj(domain, cookienum, whitelist = false) { return { @@ -438,7 +446,7 @@ cookienum: cookienum + " Cookies" }, titles: { - whitelist: getMsg("whitelistCookieDomain") + whitelist: domainWhitelistButtonTitle } }; }