diff --git a/core/constants.js b/core/constants.js
index bd4550ec..5f2f39ad 100644
--- a/core/constants.js
+++ b/core/constants.js
@@ -216,6 +216,7 @@ const Links = {
'LOCALCDN_TEST': 'https://www.localcdn.org/test',
'LOCALCDN_TEST_WEBSITE': 'https://www.localcdn.org/test/check',
'WEBLATE': 'https://hosted.weblate.org/projects/localcdn/localcdn/',
+ 'LOGGING': chrome.extension.getURL('pages/logging/logging.html'),
};
const CDNs = {
diff --git a/core/interceptor.js b/core/interceptor.js
index 88f0221a..47323484 100644
--- a/core/interceptor.js
+++ b/core/interceptor.js
@@ -41,7 +41,7 @@ interceptor.handleRequest = function (requestDetails, tabIdentifier, tab) {
};
}
- targetDetails = requestAnalyzer.getLocalTarget(requestDetails);
+ targetDetails = requestAnalyzer.getLocalTarget(requestDetails, tab.url);
targetPath = targetDetails.path;
if (Regex.GOOGLE_FONTS.test(requestDetails.url)) {
diff --git a/core/messenger.js b/core/messenger.js
index 394bf106..e959f9a8 100644
--- a/core/messenger.js
+++ b/core/messenger.js
@@ -107,6 +107,15 @@ messenger._handleMessageReceived = function (message, sender, sendResponse) {
'runAt': 'document_start'
});
}
+
+ if (topic === 'logs:get') {
+ sendResponse({'logs': log.data});
+ return MessageResponse.SYNCHRONOUS;
+ }
+
+ if (topic === 'logs:delete') {
+ log.data = [];
+ }
};
diff --git a/core/request-analyzer.js b/core/request-analyzer.js
index 5c3a4334..86209f2e 100644
--- a/core/request-analyzer.js
+++ b/core/request-analyzer.js
@@ -65,7 +65,7 @@ requestAnalyzer.isValidCandidate = function (requestDetails, tabDetails) {
return requestDetails.method === WebRequest.GET;
};
-requestAnalyzer.getLocalTarget = function (requestDetails) {
+requestAnalyzer.getLocalTarget = function (requestDetails, initiator) {
let destinationUrl, destinationHost, destinationPath, hostMappings, basePath,
resourceMappings, destinationSearchString;
@@ -95,7 +95,7 @@ requestAnalyzer.getLocalTarget = function (requestDetails) {
// Return either the local target's path or false.
// eslint-disable-next-line max-len
- return requestAnalyzer._findLocalTarget(resourceMappings, basePath, destinationHost, destinationPath, destinationSearchString);
+ return requestAnalyzer._findLocalTarget(resourceMappings, basePath, destinationHost, destinationPath, destinationSearchString, initiator);
};
@@ -114,7 +114,7 @@ requestAnalyzer._matchBasePath = function (hostMappings, channelPath) {
};
// eslint-disable-next-line max-len
-requestAnalyzer._findLocalTarget = function (resourceMappings, basePath, channelHost, channelPath, destinationSearchString) {
+requestAnalyzer._findLocalTarget = function (resourceMappings, basePath, channelHost, channelPath, destinationSearchString, initiator) {
let resourcePath, versionNumber, resourcePattern, filename, shorthandResource;
storageManager.type.get(Setting.LOGGING, function (items) {
diff --git a/icons/logging-dark.svg b/icons/logging-dark.svg
new file mode 100644
index 00000000..f06babd7
--- /dev/null
+++ b/icons/logging-dark.svg
@@ -0,0 +1,120 @@
+
+
+
+
\ No newline at end of file
diff --git a/icons/logging-light.svg b/icons/logging-light.svg
new file mode 100644
index 00000000..1506d4b2
--- /dev/null
+++ b/icons/logging-light.svg
@@ -0,0 +1,120 @@
+
+
+
+
\ No newline at end of file
diff --git a/modules/internal/log.js b/modules/internal/log.js
new file mode 100644
index 00000000..e6e2e6c1
--- /dev/null
+++ b/modules/internal/log.js
@@ -0,0 +1,28 @@
+/**
+ * Log
+ * Belongs to LocalCDN
+ *
+ * @author nobody
+ * @since 2021-02-19
+ *
+ * @license MPL 2.0
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+'use strict';
+
+
+/**
+ * Log
+ */
+
+var log = {};
+
+log.append = function (initiator, resource, target, highlight) {
+ log.data.push({initiator, resource, target, highlight});
+};
+
+log.data = [];
diff --git a/pages/background/background.html b/pages/background/background.html
index 938ba589..2058612d 100644
--- a/pages/background/background.html
+++ b/pages/background/background.html
@@ -12,6 +12,7 @@
+
diff --git a/pages/options/options.html b/pages/options/options.html
index 8d4d4ce4..8b815dba 100644
--- a/pages/options/options.html
+++ b/pages/options/options.html
@@ -302,7 +302,8 @@
Changelog (In-App)
Donate (In-App)
FAQ (In-App)
- Statistics (In-App)
+ Statistics (In-App)
+ Logs (In-App)
Source (www.codeberg.org)
Website (www.localcdn.org)
Testing Utility (www.localcdn.org/test)
diff --git a/pages/options/options.js b/pages/options/options.js
index cfa54777..cf07ee78 100644
--- a/pages/options/options.js
+++ b/pages/options/options.js
@@ -260,6 +260,12 @@ options.onOptionChanged = function ({target}) {
case Setting.SELECTED_ICON:
optionsOther._setIcon(optionValue);
break;
+ case Setting.LOGGING:
+ console.log(optionValue);
+ if (optionValue === false) {
+ chrome.runtime.sendMessage({'topic': 'logs:delete', 'value': ''});
+ }
+ break;
}
storageManager.type.set({
diff --git a/pages/popup/popup.css b/pages/popup/popup.css
index 2b75bc42..336b42e5 100644
--- a/pages/popup/popup.css
+++ b/pages/popup/popup.css
@@ -196,7 +196,7 @@ footer {
float: right;
font-size: 12px;
margin-left: 10px;
- padding: 5px 22px;
+ padding: 5px 10px;
-moz-user-select: none;
-ms-user-select: none;
-webkit-user-select: none;
@@ -265,12 +265,18 @@ footer {
#statistics-button:hover {
filter: contrast(0.5);
+#logging-button-svg {
+ background-image: url("../../icons/logging-dark.svg");
}
-#statistics-button {
+#statistics-button, #logging-button {
display: none;
}
+#options-button:hover, #statistics-button:hover, #logging-button:hover {
+ filter: contrast(0.5);
+}
+
/**
* Toggles
*/
@@ -497,6 +503,10 @@ input:checked + .slider:hover {
background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgNDUyLjU5NCA0NTIuNTk0IgogICBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA0NTIuNTk0IDQ1Mi41OTQiCiAgIGlkPSJzdmcxNCIKICAgc29kaXBvZGk6ZG9jbmFtZT0ic3RhdGlzdGljcy1saWdodC5zdmciCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTIuMyAoMjQwNTU0NiwgMjAxOC0wMy0xMSkiPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTIwIj4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzMTgiIC8+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxIgogICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxNjgwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9Ijk5NyIKICAgICBpZD0ibmFtZWR2aWV3MTYiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjAuMzY4NzEyOCIKICAgICBpbmtzY2FwZTpjeD0iLTM3Ni44MTQ2OCIKICAgICBpbmtzY2FwZTpjeT0iNjIzLjQ3MTU4IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIyNSIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImcxMiIgLz4KICA8ZwogICAgIGlkPSJnMTIiCiAgICAgc3R5bGU9ImZpbGw6Izc3Nzc3NztmaWxsLW9wYWNpdHk6MSI+CiAgICA8cGF0aAogICAgICAgZD0ibTQzMC41MTEsNDQuNjU0aC00MDguNDI5Yy0xMi4xNzYsMC0yMi4wODIsOS45MDYtMjIuMDgyLDIyLjA4MnYyNTAuMjI0YzAsMTIuMTc2IDkuOTA2LDIyLjA4MiAyMi4wODIsMjIuMDgyaDE1NC4zMjNsLTYuNDI4LDQ4Ljg5OGgtMjcuNTA1Yy01LjUyMiwwLTEwLDQuNDc3LTEwLDEwczQuNDc4LDEwIDEwLDEwaDE2Ny42NWM1LjUyMiwwIDEwLTQuNDc3IDEwLTEwcy00LjQ3OC0xMC0xMC0xMGgtMjcuNTA2bC02LjQyOC00OC44OThoMTU0LjMyMmMxMi4xNzcsMCAyMi4wODMtOS45MDYgMjIuMDgzLTIyLjA4MnYtMjUwLjIyNGMwLjAwMS0xMi4xNzYtOS45MDUtMjIuMDgyLTIyLjA4Mi0yMi4wODJ6bS00MDguNDI5LDIwaDQwOC40MjljMS4xNDgsMCAyLjA4MywwLjkzNCAyLjA4MywyLjA4MnYyMTEuMzU5aC00MTIuNTk0di0yMTEuMzU5YzAtMS4xNDggMC45MzQtMi4wODIgMi4wODItMi4wODJ6bTI0MC4zNjIsMzIzLjI4NmgtNzIuMjk2bDYuNDI5LTQ4Ljg5OGg1OS40MzlsNi40MjgsNDguODk4em0xNjguMDY3LTY4Ljg5OGgtNDA4LjQyOWMtMS4xNDgsMC0yLjA4Mi0wLjkzNC0yLjA4Mi0yLjA4MnYtMTguODY1aDQxMi41OTR2MTguODY1YzAsMS4xNDgtMC45MzUsMi4wODItMi4wODMsMi4wODJ6IgogICAgICAgaWQ9InBhdGgyIgogICAgICAgc3R5bGU9ImZpbGw6I2YyZjJmMjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDg2LjI5NywyNTkuMDQyIGggNDAgYyA1LjUyMiwwIDEwLC00LjQ3NyAxMCwtMTAgdiAtNjIgYyAwLC01LjUyMyAtNC40NzgsLTEwIC0xMCwtMTAgaCAtNDAgYyAtNS41MjIsMCAtMTAsNC40NzcgLTEwLDEwIHYgNjIgYyAwLDUuNTIzIDQuNDc3LDEwIDEwLDEwIHoiCiAgICAgICBpZD0icGF0aDQiCiAgICAgICBzdHlsZT0iZmlsbDojZjJmMmYyO2ZpbGwtb3BhY2l0eToxIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0ic3Nzc3Nzc3NzIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzI2LjI5NywyNTguNTU1IGggNDAgYyA1LjUyMiwwIDEwLC00LjQ3NyAxMCwtMTAgdiAtMjkuNTUgYyAwLC01LjUyMyAtNC40NzgsLTEwIC0xMCwtMTAgaCAtNDAgYyAtNS41MjIsMCAtMTAsNC40NzcgLTEwLDEwIHYgMjkuNTUgYyAwLDUuNTIzIDQuNDc3LDEwIDEwLDEwIHoiCiAgICAgICBpZD0icGF0aDYiCiAgICAgICBzdHlsZT0iZmlsbDojZjJmMmYyO2ZpbGwtb3BhY2l0eToxIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0ic3Nzc3Nzc3NzIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMjQ2LjI5NywyNTkuMDQyIGggNDAgYyA1LjUyMiwwIDEwLC00LjQ3NyAxMCwtMTAgViAxNjAuNjIgYyAwLC01LjUyMyAtNC40NzgsLTEwIC0xMCwtMTAgaCAtNDAgYyAtNS41MjIsMCAtMTAsNC40NzcgLTEwLDEwIHYgODguNDIyIGMgMCw1LjUyMyA0LjQ3NywxMCAxMCwxMCB6IgogICAgICAgaWQ9InBhdGg4IgogICAgICAgc3R5bGU9ImZpbGw6I2YyZjJmMjtmaWxsLW9wYWNpdHk6MSIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9InNzc3Nzc3NzcyIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDE2Ni4yOTcsMjU5LjA0MiBoIDQwIGMgNS41MjIsMCAxMCwtNC40NzcgMTAsLTEwIFYgMTMwLjI0NSBjIDAsLTUuNTIzIC00LjQ3OCwtMTAgLTEwLC0xMCBoIC00MCBjIC01LjUyMiwwIC0xMCw0LjQ3NyAtMTAsMTAgdiAxMTguNzk3IGMgMCw1LjUyMyA0LjQ3NywxMCAxMCwxMCB6IgogICAgICAgaWQ9InBhdGgxMCIKICAgICAgIHN0eWxlPSJmaWxsOiNmMmYyZjI7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJzc3Nzc3Nzc3MiIC8+CiAgPC9nPgo8L3N2Zz4K");
}
+ #logging-button-svg {
+ background-image: url("../../icons/logging-light.svg");
+ }
+
input:checked + .slider {
background-color: #6bb798;
}
diff --git a/pages/popup/popup.html b/pages/popup/popup.html
index 97498199..fa01ba74 100644
--- a/pages/popup/popup.html
+++ b/pages/popup/popup.html
@@ -57,6 +57,9 @@
+
diff --git a/pages/popup/popup.js b/pages/popup/popup.js
index 07a21b8f..09192393 100644
--- a/pages/popup/popup.js
+++ b/pages/popup/popup.js
@@ -77,6 +77,11 @@ popup._renderNonContextualContents = function () {
document.getElementById('statistics-button').style.display = 'block';
document.getElementById('statistics-button').addEventListener('mouseup', popup._onStatisticsButtonClicked);
}
+
+ if (popup._loggingStatus) {
+ document.getElementById('logging-button').style.display = 'block';
+ document.getElementById('logging-button').addEventListener('mouseup', popup._onLoggingButtonClicked);
+ }
};
popup._renderContextualContents = function () {
@@ -261,8 +266,12 @@ popup._readLocalStorage = function () {
popup._readStorage = function () {
return new Promise((resolve) => {
- storageManager.type.get([Setting.NEGATE_HTML_FILTER_LIST], function (items) {
+ storageManager.type.get([
+ Setting.NEGATE_HTML_FILTER_LIST,
+ Setting.LOGGING
+ ], function (items) {
popup.negateHtmlFilterList = items.negateHtmlFilterList;
+ popup._loggingStatus = items.enableLogging;
resolve();
});
});
@@ -538,6 +547,17 @@ popup._onStatisticsButtonClicked = function () {
}
};
+popup._onLoggingButtonClicked = function () {
+ if (event.button === 0 || event.button === 1) {
+ chrome.tabs.create({
+ 'url': Links.LOGGING,
+ 'active': event.button === 0,
+ });
+ }
+ if (event.button === 0) {
+ window.close();
+ }
+};
/**
* Initializations
@@ -545,5 +565,6 @@ popup._onStatisticsButtonClicked = function () {
popup.negateHtmlFilterList = false;
popup._statisticsStatus = false;
+popup._loggingStatus = false;
document.addEventListener('DOMContentLoaded', popup._onDocumentLoaded);
diff --git a/pages/updates/updates.html b/pages/updates/updates.html
index 9fba07a7..c4ccc5e9 100644
--- a/pages/updates/updates.html
+++ b/pages/updates/updates.html
@@ -26,6 +26,7 @@
- Fixed: Check status code in HTML filter (#277)
+ - Implemented: Simple logging page (#279)