Merge branch 'develop' into 'master'

Develop

Closes #21

See merge request nobody42/localcdn!6
This commit is contained in:
nobody 2020-03-22 15:30:58 +00:00
commit 222589db1e
18 changed files with 611 additions and 29 deletions

View File

@ -60,6 +60,7 @@ var files = {
'resources/fontawesome/5.7.2/css/all.css': true,
// jQuery
'resources/jquery/1.8.3/jquery.min.jsm': true,
'resources/jquery/1.12.4/jquery.min.jsm': true,
'resources/jquery/2.2.4/jquery.min.jsm': true,
'resources/jquery/3.4.1/jquery.min.jsm': true,

View File

@ -104,16 +104,11 @@ interceptor._handleMissingCandidate = function (requestUrl, preserveUrl) {
requestUrlSegments.protocol = Address.HTTPS;
requestUrl = requestUrlSegments.toString();
return {
'redirectUrl': requestUrl
};
} else {
return {
'cancel': false
};
}
return {
'redirectUrl': requestUrl
};
};
interceptor._handleStorageChanged = function (changes) {

View File

@ -105,9 +105,8 @@ requestAnalyzer._findLocalTarget = function (resourceMappings, basePath, channel
targetPath = resourceMappings[resourceMold].path;
targetPath = targetPath.replace(Resource.VERSION_PLACEHOLDER, versionNumber);
// Replace
version = helpers.setLastVersion(targetPath);
// Replace the requested version with the latest depending on major version
version = helpers.setLastVersion(targetPath, versionNumber);
targetPath = targetPath.replace(versionNumber, version);
hostShorthands = shorthands[channelHost];

View File

@ -1,7 +1,7 @@
{
"manifest_version": 2,
"name": "LocalCDN (fork from Decentraleyes)",
"version": "2.1.5",
"version": "2.1.5.2",
"browser_specific_settings": {
"gecko": {
"id": "{b86e4813-687a-43e6-ab65-0bde4ab75758}",

View File

@ -1,8 +1,9 @@
/**
* Internal Helper Module
* Belongs to Decentraleyes.
* Belongs to Decentraleyes/LocalCDN.
*
* @author Thomas Rientjes
* @author nobody42
* @since 2017-10-26
* @license MPL 2.0
*
@ -273,9 +274,11 @@ helpers.formatVersion = function (version) {
}
};
helpers.setLastVersion = function (type) {
helpers.setLastVersion = function (type, versionNumber) {
let version;
let version, requestVersion;
requestVersion = versionNumber.toString();
if (type.includes('/angularjs/1.')) {
version = '1.7.9';
@ -308,7 +311,7 @@ helpers.setLastVersion = function (type) {
} else if (type.includes('/fontawesome/5.')) {
version = '5.7.2';
} else if (type.includes('/jquery/1.')) {
version = '1.12.4';
version = ( helpers.compareVersion('1.8.3', requestVersion )) ? '1.8.3' : '1.12.4';
} else if (type.includes('/jquery/2.')) {
version = '2.2.4';
} else if (type.includes('/jquery/3.')) {
@ -335,3 +338,22 @@ helpers.setLastVersion = function (type) {
return version;
};
helpers.compareVersion = function (v1, v2) {
/**
* compareVersion( '1.5.7' , '1.5.8' ) is TRUE
* compareVersion( '1.5.8' , '1.5.7' ) is FALSE
* compareVersion( '1.5.7' , '1.5.7' ) is TRUE
*/
v1 = v1.split('.');
v2 = v2.split('.');
const k = Math.min(v1.length, v2.length);
for (let i = 0; i < k; ++ i) {
v1[i] = parseInt(v1[i], 10);
v2[i] = parseInt(v2[i], 10);
if (v1[i] > v2[i]) return true;
if (v1[i] < v2[i]) return false;
}
return v1.length == v2.length ? true: (v1.length < v2.length ? false : true);
}

View File

@ -64,7 +64,7 @@
<footer>
<span id="testing-utility-link" class="link-text">decentraleyes.org/test</span>
<span id="testing-utility-link" class="link-text">localcdn.de/test</span>
<div id="options-button" class="button" data-i18n-title="optionsTitle">
<div id="options-button-svg"></div>

View File

@ -326,7 +326,7 @@ popup._onTestingUtilityLinkClicked = function (event) {
if (event.button === 0 || event.button === 1) {
chrome.tabs.create({
'url': 'https://decentraleyes.org/test',
'url': 'https://localcdn.de/test',
'active': (event.button === 0)
});
}

BIN
pages/test/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -0,0 +1,105 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
viewBox="0 0 294.361 294.361"
style="enable-background:new 0 0 294.361 294.361;"
xml:space="preserve"
sodipodi:docname="security-svgrepo-com.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)"><metadata
id="metadata2411"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs2409" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1680"
inkscape:window-height="997"
id="namedview2407"
showgrid="false"
inkscape:zoom="0.80173666"
inkscape:cx="147.1805"
inkscape:cy="147.1805"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1" />
<g
id="g2374"
style="fill:#058300;fill-opacity:1">
<path
d="M154.444,127.639l26.045,26.044c6.639-18.818,11.328-38.756,13.101-56.781c0.06-0.608-0.276-1.16-0.835-1.373 l-70.484-26.933c-0.152-0.058-0.312-0.088-0.475-0.088c-0.163,0-0.323,0.029-0.475,0.088L50.836,95.529 c-0.551,0.21-0.894,0.775-0.835,1.373c2.922,29.705,13.73,64.62,28.206,91.12c14.162,25.923,30.457,41.4,43.589,41.4 c5.948,0,12.545-3.184,19.298-9.067l-39.684-39.683c-14.644-14.645-14.644-38.388,0-53.033 C116.056,112.995,139.8,112.995,154.444,127.639z"
id="path2368"
style="fill:#058300;fill-opacity:1" />
<path
d="M155.255,234.516c-10.37,9.333-21.651,14.906-33.459,14.906c-46.932,0-85.544-87.976-91.7-150.562 c-0.94-9.56,4.627-18.585,13.6-22.013l70.486-26.933c2.451-0.937,5.032-1.405,7.614-1.405c2.581,0,5.162,0.468,7.613,1.405 l70.484,26.932c8.987,3.434,14.542,12.439,13.6,22.014c-0.969,9.846-2.742,20.322-5.223,30.984l34.029-34.029 c0.432-2.986,0.814-5.947,1.129-8.869c1.339-12.425-5.599-24.245-17.109-29.112L132.822,18.3c-7.048-2.98-15.002-2.98-22.05,0 L17.273,57.833C5.777,62.694-1.174,74.535,0.164,86.945c8.821,81.833,64.496,191.35,121.633,191.35 c19.371,0,38.571-12.598,55.837-32.427c-7.931-1.024-15.598-4.572-21.69-10.664L155.255,234.516z"
id="path2370"
style="fill:#058300;fill-opacity:1" />
<path
d="M288.504,102.645c-7.811-7.811-20.475-7.811-28.285,0l-77.758,77.759l-40.392-40.391 c-7.811-7.811-20.474-7.81-28.284,0.001c-7.811,7.811-7.809,20.474,0.001,28.284l54.533,54.532 c3.905,3.905,9.023,5.857,14.142,5.857c5.118,0,10.237-1.952,14.143-5.857l91.9-91.9 C296.313,123.12,296.313,110.456,288.504,102.645z"
id="path2372"
style="fill:#058300;fill-opacity:1" />
</g>
<g
id="g2376">
</g>
<g
id="g2378">
</g>
<g
id="g2380">
</g>
<g
id="g2382">
</g>
<g
id="g2384">
</g>
<g
id="g2386">
</g>
<g
id="g2388">
</g>
<g
id="g2390">
</g>
<g
id="g2392">
</g>
<g
id="g2394">
</g>
<g
id="g2396">
</g>
<g
id="g2398">
</g>
<g
id="g2400">
</g>
<g
id="g2402">
</g>
<g
id="g2404">
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -0,0 +1,105 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
viewBox="0 0 283.722 283.722"
style="enable-background:new 0 0 283.722 283.722;"
xml:space="preserve"
sodipodi:docname="disabled-connection-svgrepo-com.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)"><metadata
id="metadata1740"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs1738" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1680"
inkscape:window-height="997"
id="namedview1736"
showgrid="false"
inkscape:zoom="0.83180019"
inkscape:cx="141.86099"
inkscape:cy="141.86099"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1" />
<g
id="g1703"
style="fill:#be0000;fill-opacity:1">
<path
d="M184.721,128.156c4.398-14.805,7.516-29.864,8.885-43.783c0.06-0.607-0.276-1.159-0.835-1.373l-70.484-26.932 c-0.152-0.058-0.312-0.088-0.475-0.088c-0.163,0-0.322,0.03-0.474,0.088L50.851,83c-0.551,0.21-0.894,0.775-0.835,1.373 c2.922,29.705,13.73,64.62,28.206,91.12c14.162,25.923,30.457,41.4,43.589,41.4c8.439,0,18.183-6.4,27.828-17.846l-16.375-16.375 c-14.645-14.645-14.645-38.389,0-53.033C147.396,115.509,169.996,115.017,184.721,128.156z"
id="path1697"
style="fill:#be0000;fill-opacity:1" />
<path
d="M121.812,236.893c-46.932,0-85.544-87.976-91.7-150.562c-0.94-9.56,4.627-18.585,13.601-22.013l70.486-26.933 c2.451-0.937,5.032-1.405,7.613-1.405c2.581,0,5.162,0.468,7.614,1.405l70.484,26.932c8.987,3.434,14.542,12.439,13.6,22.013 c-1.773,18.028-6.244,38.161-12.826,57.693l11.068,11.068l17.865-17.866c6.907-20.991,11.737-42.285,13.845-61.972 c1.322-12.347-5.53-24.102-16.934-29.017l-93.512-40.3c-7.152-3.082-15.257-3.082-22.409,0l-93.512,40.3 C5.705,51.147-1.159,62.922,0.162,75.255c8.765,81.851,64.476,191.512,121.65,191.512c0.356,0,0.712-0.023,1.068-0.032 c-1.932-10.793,0.888-22.262,8.456-31.06C128.205,236.465,125.029,236.893,121.812,236.893z"
id="path1699"
style="fill:#be0000;fill-opacity:1" />
<path
d="M240.037,208.125c7.327-7.326,30.419-30.419,37.827-37.827c7.81-7.811,7.81-20.475,0-28.285 c-7.811-7.811-20.475-7.811-28.285,0c-7.41,7.41-30.5,30.5-37.827,37.827l-37.827-37.827c-7.81-7.811-20.475-7.811-28.285,0 c-7.811,7.811-7.811,20.475,0,28.285l37.827,37.827c-7.326,7.326-30.419,30.419-37.827,37.827c-7.811,7.811-7.811,20.475,0,28.285 c7.809,7.809,20.474,7.811,28.285,0c7.41-7.41,30.5-30.499,37.827-37.827l37.827,37.827c7.809,7.809,20.474,7.811,28.285,0 c7.81-7.81,7.81-20.475,0-28.285L240.037,208.125z"
id="path1701"
style="fill:#be0000;fill-opacity:1" />
</g>
<g
id="g1705">
</g>
<g
id="g1707">
</g>
<g
id="g1709">
</g>
<g
id="g1711">
</g>
<g
id="g1713">
</g>
<g
id="g1715">
</g>
<g
id="g1717">
</g>
<g
id="g1719">
</g>
<g
id="g1721">
</g>
<g
id="g1723">
</g>
<g
id="g1725">
</g>
<g
id="g1727">
</g>
<g
id="g1729">
</g>
<g
id="g1731">
</g>
<g
id="g1733">
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

226
pages/test/style.css Normal file
View File

@ -0,0 +1,226 @@
/**
* Sections
*/
html {
background-color: #f8fcee;
box-sizing: border-box;
height: 100%;
}
body {
background-color: #eff4e2;
box-sizing: border-box;
color: #777;
font-size: 14px;
margin: 0 auto;
max-width: 982px;
min-height: 100%;
min-width: 256px;
padding: 33px 18px;
}
h1,h2 {
font-family: 'Noto Sans', Arial, sans-serif;
font-size: 24px;
font-weight: 400;
margin: 20px auto;
max-width: 750px;
}
h2 {
font-size: 20px;
}
a {
color: #777;
}
.btn-panel {
cursor: default;
font-family: 'Noto Sans', Arial, sans-serif;
margin: 35px auto;
max-width: 750px;
display: flex;
}
/**
* Fonts
*/
@font-face {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 400;
src: url('./noto-sans/noto-sans.woff2')
format('woff2');
}
@font-face {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 600;
src: url('./noto-sans/noto-sans-bold.woff2')
format('woff2');
}
@font-face {
font-family: 'Noto Sans';
font-style: italic;
font-weight: 400;
src: url('./noto-sans/noto-sans-italic.woff2')
format('woff2');
}
/**
* Buttons
*/
.btn {
color: #fff;
font-weight: 600;
margin-right: 15px;
padding: 11px 17px;
text-decoration: none;
text-align: center;
}
.btn-gitlab {
background-color: #24292e;
}
.btn-gitlab:hover {
background-color: #42474c;
}
.btn-website {
background-color: #007bbd;
}
.btn-website:hover {
background-color: #00679e;
}
.btn-donate {
background-color: #f7931a;
}
.btn-donate:hover {
background-color: #f58700;
}
.btn-author {
background-color: #00bd7f;
}
.btn-author:hover {
background-color: #009e69;
}
/**
* Miscellaneous
*/
.notice {
align-items: center;
font-family: 'Noto Sans', Arial, sans-serif;
margin-left: auto;
margin-right: auto;
max-width: 750px;
text-align: left;
}
.logo {
display: block;
height: 145px;
margin: 15px auto 50px;
}
.subtle-hint {
background-color: #fcfcfc;
border-radius: 4px;
border: 1px solid #e6e6e6;
color: #777;
font-size: 14px;
margin-bottom: 20px;
padding: 8px 11px;
}
.message {
background-color: #fff;
border-bottom: 1px solid #f5f5f5;
color: #575757;
overflow: hidden;
padding: 15px 15px 12px;
font-weight: bold;
}
.message-information {
background-color: #fff;
border: 1px solid #e3e3e3;
-webkit-box-shadow: none;
box-shadow: none;
color: #fff;
margin-top: 25px;
padding: 0;
}
.message-header {
background-color: #f3f3f3;
border-right: 1px solid #e9e9e9;
font-size: 20px;
margin-right: 8px;
padding: 16px 14.4px;
padding: 1rem .9rem;
vertical-align: middle;
}
.message-body, .message-header {
-webkit-box-sizing: border-box;
box-sizing: border-box;
display: table-cell;
}
.message-body {
background-color: #fff;
color: #5f5f5f;
font-weight: 400;
padding: 16px;
padding: 1rem;
}
.message-warning {
color: #c57400;
}
.message-success {
color: #339a6f;
}
.message-success a {
color: #268f5c;
}
.message-error {
color: #9a3333;
}
/**
* Media Queries
*/
@media screen and (max-width: 982px) {
body {
box-shadow: none;
}
}
@media screen and (max-width: 733px) {
.btn-panel {
flex-wrap: wrap;
}
.btn {
padding: 13px 18px 12px;
width: 100%;
margin-bottom: 10px;
}
.btn-text {
width: 100%;
}
}

39
pages/test/test.html Normal file
View File

@ -0,0 +1,39 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>LocalCDN | Testing Utility</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="style.css">
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
<link rel="icon" href="favicon.ico" type="image/x-icon">
<script type="text/javascript" src="test.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<body>
<img src="" alt="" class="logo" id="logo"/>
<div class="container">
<h1>LocalCDN | Testing Utility</h1>
<div class="notice">
<div class="subtle-hint">
<div id="message-log" class="log">
<div id="progress-indicator" class="message"><i class="message-icon far fa-cog fa-fw"></i> Determining status...</div>
</div>
<noscript>
<br><span style="color: #9a3333; font-weight: 600;">This tool relies on JavaScript. Please enable it, and try again.</span>
</noscript>
</div>
</div>
<h2>Learn more, or contribute</h2>
<div class="btn-panel">
<a class="btn btn-website" href="https://decentraleyes.org" target="_blank"><i class="btn-icon fai fa-globe" data-fa-transform="grow-2"></i><span class="btn-text">Website of Decentraleyes</span></a>
<a class="btn btn-gitlab" href="https://gitlab.com/nobody42/localcdn" target="_blank"><i class="btn-icon fai fa-gitlab" data-fa-transform="grow-2"></i><span class="btn-text">LocalCDN @GitLab</span></a>
<a class="btn btn-gitlab" href="https://git.synz.io/Synzvato/decentraleyes" target="_blank"><i class="btn-icon fai fa-gitlab" data-fa-transform="grow-2"></i><span class="btn-text">Decentraleyes @GitLab</span></a>
<a class="btn btn-donate" href="https://decentraleyes.org/donate" target="_blank"><i class="btn-icon fai fa-donate" data-fa-transform="grow-2"></i><span class="btn-text">Donate to Decentraleyes</span></a>
<a class="btn btn-author" href="https://synz.io" target="_blank"><i class="btn-icon fai fa-user-circle" data-fa-transform="grow-3"></i><span class="btn-text">Author of Decentraleyes</span></a>
</div>
</div>
</body>
</html>

83
pages/test/test.js Normal file
View File

@ -0,0 +1,83 @@
function _logMessage(message) {
var messageLog = document.getElementById('message-log');
var contents = messageLog.innerHTML;
contents = contents + message;
messageLog.innerHTML = contents;
}
function _logWarningMessage(warningMessage) {
_logMessage('<div class="message message-warning"><i class="message-icon far fa-exclamation-triangle fa-fw"></i> ' + warningMessage + '</div>');
}
function _logSuccessMessage(successMessage) {
_logMessage('<div class="message message-success"><i class="message-icon far fa-check-circle fa-fw"></i> ' + successMessage + '</div>');
}
function _logErrorMessage(errorMessage) {
_logMessage('<div class="message message-error"><i class="message-icon far fa-times-hexagon fa-fw"></i> ' + errorMessage + '</div>');
}
function _logoUnprotected() {
document.getElementById('logo').src = "logo-unprotected.svg";
}
function _logoProtected() {
document.getElementById('logo').src = "logo-protected.svg";
}
function updateProgress() {
var progressIndicatorElement = document.getElementById('progress-indicator');
progressIndicatorElement.innerHTML = '<i class="message-icon far fa-comment-alt-lines fa-fw"></i> All tests completed.';
}
function logOperationalNotice() {
_logSuccessMessage('LocalCDN is fully operational.');
_logoProtected();
}
function logUnprotectedNotice() {
_logWarningMessage('Your browser was able to connect to a blacklisted CDN.');
_logErrorMessage('LocalCDN is not working as intended.');
_logoUnprotected();
}
function logUnavailableNotice() {
_logWarningMessage('The test resource could not be fetched locally or remotely.');
_logErrorMessage('LocalCDN is not working as intended.');
}
window.onload = function () {
if (window.jQuery) {
jQuery.globalEval = function () {};
$.get('https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js', function (data, status, response) {
updateProgress('completed');
if (response.getResponseHeader('cache-control') === 'no-cache') {
logOperationalNotice();
} else if (response.getResponseHeader('content-type') === 'application/javascript;charset=UTF-8') {
logOperationalNotice();
} else {
logUnprotectedNotice();
}
}).fail(function() {
updateProgress('completed');
logOperationalNotice();
});
} else {
updateProgress('completed');
logUnavailableNotice();
}
};

View File

@ -23,16 +23,8 @@
New in LocalCDN:
</div>
<ul>
<li>Simple enable/disable button replaced with toggle switch</li>
<li>Added: Moment.js (v2.24.0)</li>
<li>Added: bootstrap-slider (v10.6.2)</li>
<li>Size reduced: For each request the latest framework (depends on major release) is selected</li>
<li>Updated: cdn.jsdelivr.net (UNPKG)</li>
<li>Updated: Backbone.js (v1.4.0)</li>
<li>Updated: Dojo Toolkit (v1.14.1)</li>
<li>Updated: Ember.js (v1.13.13, v2.18.2, v3.12.3)</li>
<li>Updated: MooTools (v1.6.0)</li>
<li>Updated: Web Font Loader (v1.6.28)</li>
<li>URL of testing utility updated</li>
<li>Fixed: <a href="https://gitlab.com/nobody42/localcdn/-/issues/21">"Search on serienjunkies.org not working"</a></li>
</ul>
<div class="topic-label">
Please update your uBlock/uMatrix rules
@ -49,6 +41,19 @@
<input id="button-copy-rule-set" type="button" value="Copy">
<hr/>
<h2>History</h2>
<p>2020-03-17 (v2.1.5)</p><br/>
<ul>
<li>Simple enable/disable button replaced with toggle switch</li>
<li>Added: Moment.js (v2.24.0)</li>
<li>Added: bootstrap-slider (v10.6.2)</li>
<li>Size reduced: For each request the latest framework (depends on major release) is selected</li>
<li>Updated: cdn.jsdelivr.net (UNPKG)</li>
<li>Updated: Backbone.js (v1.4.0)</li>
<li>Updated: Dojo Toolkit (v1.14.1)</li>
<li>Updated: Ember.js (v1.13.13, v2.18.2, v3.12.3)</li>
<li>Updated: MooTools (v1.6.0)</li>
<li>Updated: Web Font Loader (v1.6.28)</li>
</ul>
<p>2020-03-13 (v2.1.4)<br/>
<ul>
<li>Fixed: <a href="https://gitlab.com/nobody42/localcdn/-/issues/16">"Weird behavior of signed extension"</a></li>

File diff suppressed because one or more lines are too long