extract styleSectionsEqual

This commit is contained in:
tophf 2018-01-04 16:43:54 +03:00
parent 9be2f942c7
commit 2374c88e1b
4 changed files with 41 additions and 39 deletions

View File

@ -1,4 +1,4 @@
/* global getStyleWithNoCode */ /* global getStyleWithNoCode styleSectionsEqual */
'use strict'; 'use strict';
const RX_NAMESPACE = new RegExp([/[\s\r\n]*/, const RX_NAMESPACE = new RegExp([/[\s\r\n]*/,
@ -539,44 +539,6 @@ function styleCodeEmpty(code) {
} }
function styleSectionsEqual({sections: a}, {sections: b}) {
if (!a || !b) {
return undefined;
}
if (a.length !== b.length) {
return false;
}
// order of sections should be identical to account for the case of multiple
// sections matching the same URL because the order of rules is part of cascading
return a.every((sectionA, index) => propertiesEqual(sectionA, b[index]));
function propertiesEqual(secA, secB) {
for (const name of ['urlPrefixes', 'urls', 'domains', 'regexps']) {
if (!equalOrEmpty(secA[name], secB[name], 'every', arrayMirrors)) {
return false;
}
}
return equalOrEmpty(secA.code, secB.code, 'substr', (a, b) => a === b);
}
function equalOrEmpty(a, b, telltale, comparator) {
const typeA = a && typeof a[telltale] === 'function';
const typeB = b && typeof b[telltale] === 'function';
return (
(a === null || a === undefined || (typeA && !a.length)) &&
(b === null || b === undefined || (typeB && !b.length))
) || typeA && typeB && a.length === b.length && comparator(a, b);
}
function arrayMirrors(array1, array2) {
return (
array1.every(el => array2.includes(el)) &&
array2.every(el => array1.includes(el))
);
}
}
function invalidateCache({added, updated, deletedId} = {}) { function invalidateCache({added, updated, deletedId} = {}) {
if (!cachedStyles.list) { if (!cachedStyles.list) {
return; return;

38
js/sections-equal.js Normal file
View File

@ -0,0 +1,38 @@
'use strict';
function styleSectionsEqual({sections: a}, {sections: b}) {
if (!a || !b) {
return undefined;
}
if (a.length !== b.length) {
return false;
}
// order of sections should be identical to account for the case of multiple
// sections matching the same URL because the order of rules is part of cascading
return a.every((sectionA, index) => propertiesEqual(sectionA, b[index]));
function propertiesEqual(secA, secB) {
for (const name of ['urlPrefixes', 'urls', 'domains', 'regexps']) {
if (!equalOrEmpty(secA[name], secB[name], 'every', arrayMirrors)) {
return false;
}
}
return equalOrEmpty(secA.code, secB.code, 'substr', (a, b) => a === b);
}
function equalOrEmpty(a, b, telltale, comparator) {
const typeA = a && typeof a[telltale] === 'function';
const typeB = b && typeof b[telltale] === 'function';
return (
(a === null || a === undefined || (typeA && !a.length)) &&
(b === null || b === undefined || (typeB && !b.length))
) || typeA && typeB && a.length === b.length && comparator(a, b);
}
function arrayMirrors(array1, array2) {
return (
array1.every(el => array2.includes(el)) &&
array2.every(el => array1.includes(el))
);
}
}

View File

@ -162,6 +162,7 @@
<script src="manage/import-export.js" async></script> <script src="manage/import-export.js" async></script>
<script src="msgbox/msgbox.js" async></script> <script src="msgbox/msgbox.js" async></script>
<script src="manage/incremental-search.js" async></script> <script src="manage/incremental-search.js" async></script>
<script src="js/sections-equal.js" async></script>
</head> </head>
<body id="stylus-manage" i18n-dragndrop-hint="dragDropMessage"> <body id="stylus-manage" i18n-dragndrop-hint="dragDropMessage">

View File

@ -22,6 +22,7 @@
"scripts": [ "scripts": [
"js/messaging.js", "js/messaging.js",
"js/storage-util.js", "js/storage-util.js",
"js/sections-equal.js",
"background/storage.js", "background/storage.js",
"js/prefs.js", "js/prefs.js",
"js/script-loader.js", "js/script-loader.js",