Skip to content

Commit 675770b

Browse files
committed
10x performance boosts
1 parent 28874ba commit 675770b

7 files changed

Lines changed: 51 additions & 39 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,5 @@ node_modules
4848
# built
4949
dest/asset/js/content.js
5050
test/index.build.js
51+
test/index.build.js.map
5152
.cache

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
**ver 2.4.0 | 06/09/2019**
2+
3+
1. Code optimization: 10x speed up!
4+
2. Build tool: switch browserify to parcel
5+
16
**ver 2.3.2 | 18/11/2018**
27

38
1. More friendly prompt text for first use or error display.

dest/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "CSS Used",
3-
"version": "2.3.3",
3+
"version": "2.4.0",
44
"permissions": ["<all_urls>","tabs"],
55
"author": "Bob",
66
"icons": {

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "css-used-chrome-ext",
3-
"version": "2.3.3",
3+
"version": "2.4.0",
44
"description": "A chrome extension to get all css rules used by the selected DOM and its children.",
55
"main": "./src/main.js",
66
"scripts": {

src/filterRules.js

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,17 @@
55
// each testing is wrapped by a settimeout timmer to make it async
66
// because the testing can be a long time if too many.
77

8-
var debugMode = false;
8+
var debugMode = process.env.NODE_ENV!=='production';
99
const cssHelper = require('./cssHelper');
1010

1111
// may match accoding to interaction
12-
const pseudocls = '((-(webkit|moz|ms|o)-)?(full-screen|fullscreen))|-o-prefocus|active|checked|disabled|empty|enabled|focus|hover|in-range|invalid|link|out-of-range|target|valid|visited',
13-
pseudoele = '((-(webkit|moz|ms|o)-)?(focus-inner|input-placeholder|placeholder|selection|resizer|scrollbar(-(button|thumb|corner|track(-piece)?))?))|-ms-(clear|reveal|expand)|-moz-(focusring)|-webkit-(details-marker)|after|before|first-letter|first-line';
12+
const PseudoClass = '((-(webkit|moz|ms|o)-)?(full-screen|fullscreen))|-o-prefocus|active|checked|disabled|empty|enabled|focus|hover|in-range|invalid|link|out-of-range|target|valid|visited',
13+
PseudoElement = '((-(webkit|moz|ms|o)-)?(focus-inner|input-placeholder|placeholder|selection|resizer|scrollbar(-(button|thumb|corner|track(-piece)?))?))|-ms-(clear|reveal|expand)|-moz-(focusring)|-webkit-(details-marker)|after|before|first-letter|first-line',
14+
MaxPossiblePseudoLength=30,
15+
REG0=new RegExp('^(:(' + PseudoClass + ')|::?(' + PseudoElement + '))+$', ''),
16+
REG1=new RegExp('( |^)(:(' + PseudoClass + ')|::?(' + PseudoElement + '))+( |$)', 'ig'),
17+
REG2=new RegExp('\\((:(' + PseudoClass + ')|::?(' + PseudoElement + '))+\\)', 'ig'),
18+
REG3=new RegExp('(:(' + PseudoClass + ')|::?(' + PseudoElement + '))+', 'ig');
1419

1520
function filterRules($0, objCss, taskTimerRecord) {
1621
var promises = [];
@@ -29,7 +34,7 @@ function filterRules($0, objCss, taskTimerRecord) {
2934
objCss.normRule.forEach(function (rule, idx) {
3035
promises.push(new Promise(function (res, rej) {
3136
var timer = setTimeout(function () {
32-
if (idx % 100 === 0) {
37+
if (idx % 1000 === 0) {
3338
chrome.runtime.sendMessage({
3439
dom: domlist.length - 1,
3540
rule: objCss.normRule.length,
@@ -53,21 +58,21 @@ function filterRules($0, objCss, taskTimerRecord) {
5358
// but wont apply now
5459
// eg. :active{xxx}
5560
// only works when clicked on and actived
56-
if (sel.match(new RegExp('^(:(' + pseudocls + ')|::?(' + pseudoele + '))+$', ''))) {
61+
if (sel.length<MaxPossiblePseudoLength && sel.match(REG0)){
5762
selMatched.push(sel);
5863
} else {
5964
let count = [];
60-
let replacedSel = sel.replace(new RegExp('( |^)(:(' + pseudocls + ')|::?(' + pseudoele + '))+( |$)', 'ig'), ' * ');
61-
replacedSel = replacedSel.replace(new RegExp('\\((:(' + pseudocls + ')|::?(' + pseudoele + '))+\\)', 'ig'), '(*)');
62-
replacedSel = replacedSel.replace(new RegExp('(:(' + pseudocls + ')|::?(' + pseudoele + '))+', 'ig'), '');
63-
try {
64-
if ($0.matches(sel) || $0.querySelectorAll(sel).length !== 0) {
65-
selMatched.push(sel);
66-
}
67-
} catch (e) {
68-
count.push(sel);
69-
count.push(e);
70-
}
65+
let replacedSel = sel.replace(REG1, ' * ')
66+
.replace(REG2, '(*)')
67+
.replace(REG3, '');
68+
// try {
69+
// if ($0.matches(sel) || $0.querySelectorAll(sel).length !== 0) {
70+
// selMatched.push(sel);
71+
// }
72+
// } catch (e) {
73+
// count.push(sel);
74+
// count.push(e);
75+
// }
7176
try {
7277
if ($0.matches(replacedSel) || $0.querySelectorAll(replacedSel).length !== 0) {
7378
selMatched.push(sel);

test/index.js

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,23 @@
1+
let wSocket = new WebSocket('ws://' + 'localhost' + ':' + '12345' + '');
2+
3+
wSocket.onopen = function() {
4+
// console.log("Primary Socket Connected.");
5+
};
6+
7+
wSocket.onmessage = function(evt) {
8+
// console.log(evt);
9+
location.reload();
10+
}
11+
12+
wSocket.onclose = function() {
13+
console.log("Primary Socket Closed.");
14+
wSocket = null;
15+
};
16+
17+
wSocket.onerror = function(evt) {
18+
console.error(evt);
19+
}
20+
121
import expected from './expected.js'
222
import getCssUsed from '../src/main.js'
323

@@ -18,24 +38,5 @@ window.chrome = {
1838
}
1939
}
2040
}
21-
getCssUsed(document.documentElement);
22-
23-
let wSocket = new WebSocket('ws://' + 'localhost' + ':' + '12345' + '');
24-
25-
wSocket.onopen = function() {
26-
// console.log("Primary Socket Connected.");
27-
};
28-
29-
wSocket.onmessage = function(evt) {
30-
// console.log(evt);
31-
location.reload();
32-
}
33-
34-
wSocket.onclose = function() {
35-
console.log("Primary Socket Closed.");
36-
wSocket = null;
37-
};
3841

39-
wSocket.onerror = function(evt) {
40-
console.error(evt);
41-
}
42+
getCssUsed(document.documentElement);

test/test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const entryFiles = Path.join(__dirname, './index.js');
66
const options = {
77
outDir: './test',
88
outFile: 'index.build.js',
9-
scopeHoist: true, // Turn on experimental scope hoisting/tree shaking flag, for smaller production bundles
9+
// sourceMaps: true,
1010
hmrPort: 12345, // hmr socket port
1111
};
1212

0 commit comments

Comments
 (0)