Skip to content

Commit 029c808

Browse files
Manifest migration (#146)
* preparing for migration to manifest v3 * update manifest file * Change $.Deferred() to native Promise * Add fetchAdapter to axios(hotfix) * refactor jquery.whencallsequentially.js to native Promise(local scraper fix) * little fixes and improvements * interceptors fix * refactor all calls of removeCurrentContentSelector() to native Promise * removing axios fetchAdapter where its not needed * update version * update yarn.lock * update yarn.lock2
1 parent 9bcf6cd commit 029c808

File tree

15 files changed

+3146
-2921
lines changed

15 files changed

+3146
-2921
lines changed

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "web-scraper-chrome-extension",
3-
"version": "0.4.14",
3+
"version": "0.5",
44
"description": "Web data extraction tool implemented as chrome extension",
55
"scripts": {
66
"lint": "eslint --ext .js src",
@@ -18,8 +18,9 @@
1818
}
1919
},
2020
"dependencies": {
21+
"@vespaiach/axios-fetch-adapter": "^0.3.1",
2122
"@babel/runtime": "^7.10.5",
22-
"axios": "^0.21.1",
23+
"axios": "^0.26.1",
2324
"bootstrap": "3.4.1",
2425
"d3": "^3.3.8",
2526
"icanhaz": "0.10.3",
@@ -34,7 +35,7 @@
3435
"spark-md5": "^3.0.1",
3536
"sugar": "^1.5.0",
3637
"url-join": "^5.0.0",
37-
"webextension-polyfill": "^0.7.0"
38+
"webextension-polyfill": "^0.12.0"
3839
},
3940
"devDependencies": {
4041
"@babel/core": "^7.10.5",

src/background/background.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ browser.runtime.onMessage.addListener(async request => {
190190
const backgroundScript = getBackgroundScript('BackgroundScript');
191191
// TODO change to promises
192192
const deferredResponse = backgroundScript[request.fn](request.request);
193-
deferredResponse.done(resolve).catch(reject);
193+
deferredResponse.then(resolve).catch(reject);
194194
});
195195
}
196196
});

src/content_script/content_script.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ browser.runtime.onMessage.addListener(request => {
3939
console.log('received ContentScript request', request);
4040

4141
const deferredResponse = contentScript[request.fn](request.request);
42-
deferredResponse.done(function (response) {
42+
deferredResponse.then(function (response) {
4343
resolve(response, null);
4444
});
4545

Lines changed: 8 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,14 @@
1-
/**
2-
* @author Martins Balodis
3-
*
4-
* An alternative version of $.when which can be used to execute asynchronous
5-
* calls sequentially one after another.
6-
*
7-
* @returns $.Deferred().promise()
8-
*/
91
$.whenCallSequentially = function (functionCalls) {
10-
const deferredResonse = $.Deferred();
11-
const resultData = new Array();
2+
let promiseChain = Promise.resolve([]);
123

13-
// nothing to do
14-
if (functionCalls.length === 0) {
15-
return deferredResonse.resolve(resultData).promise();
16-
}
17-
18-
let currentDeferred = functionCalls.shift()();
19-
// execute synchronous calls synchronously
20-
while (currentDeferred.state() === 'resolved') {
21-
currentDeferred.done(function (data) {
22-
resultData.push(data);
23-
});
24-
if (functionCalls.length === 0) {
25-
return deferredResonse.resolve(resultData).promise();
26-
}
27-
currentDeferred = functionCalls.shift()();
28-
}
29-
30-
// handle async calls
31-
var interval = setInterval(function () {
32-
// handle mixed sync calls
33-
while (currentDeferred.state() === 'resolved') {
34-
currentDeferred.done(function (data) {
4+
functionCalls.forEach(func => {
5+
promiseChain = promiseChain.then(resultData => {
6+
return func().then(data => {
357
resultData.push(data);
8+
return resultData;
369
});
37-
if (functionCalls.length === 0) {
38-
clearInterval(interval);
39-
deferredResonse.resolve(resultData);
40-
break;
41-
}
42-
currentDeferred = functionCalls.shift()();
43-
}
44-
}, 10);
10+
});
11+
});
4512

46-
return deferredResonse.promise();
13+
return promiseChain;
4714
};

src/manifest.json

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
{
2-
"manifest_version": 2,
2+
"manifest_version": 3,
33
"version": "",
44
"name": "__MSG_extension_name__",
55
"short_name": "__MSG_extension_short_name__",
66
"description": "__MSG_extension_description__",
77
"permissions": [
8-
"<all_urls>",
98
"tabs",
109
"notifications",
1110
"storage",
1211
"unlimitedStorage",
1312
"downloads",
1413
"webRequest"
1514
],
15+
"host_permissions": ["<all_urls>"],
1616
"icons": {
1717
"16": "icons/icon16.png",
1818
"48": "icons/icon48.png",
1919
"128": "icons/icon128.png"
2020
},
21-
"browser_action": {
21+
"action": {
2222
"default_icon": {
2323
"19": "icons/icon19.png",
2424
"38": "icons/icon38.png"
@@ -33,15 +33,20 @@
3333
},
3434
"devtools_page": "devtools/devtools.html",
3535
"background": {
36-
"scripts": ["background/background.js"]
36+
"service_worker": "background/background.js"
3737
},
3838
"web_accessible_resources": [
39-
"icons/icon16.png",
40-
"icons/icon19.png",
41-
"icons/icon38.png",
42-
"icons/icon48.png",
43-
"icons/icon128.png",
44-
"content_script/AttachedToolbar.html"
39+
{
40+
"resources": [
41+
"icons/icon16.png",
42+
"icons/icon19.png",
43+
"icons/icon38.png",
44+
"icons/icon48.png",
45+
"icons/icon128.png",
46+
"content_script/AttachedToolbar.html"
47+
],
48+
"matches": ["*://*/*"]
49+
}
4550
],
4651
"content_scripts": [
4752
{

src/options/options.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1+
import * as $ from 'jquery';
12
import 'bootstrap/dist/css/bootstrap.css';
23
import 'bootstrap/dist/js/bootstrap';
34
import * as browser from 'webextension-polyfill';
4-
import * as $ from 'jquery';
55
import Config from '../scripts/Config';
66
import Translator from '../scripts/Translator';
77

src/scripts/BackgroundScript.js

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import * as browser from 'webextension-polyfill';
55
*/
66
const BackgroundScript = {
77
dummy() {
8-
return $.Deferred().resolve('dummy').promise();
8+
return Promise.resolve('dummy');
99
},
1010

1111
/**
@@ -42,17 +42,9 @@ const BackgroundScript = {
4242
fn: request.fn,
4343
request: request.request,
4444
};
45-
const deferredResponse = $.Deferred();
46-
this.getActiveTabId()
47-
.then(tabId => {
48-
browser.tabs
49-
.sendMessage(tabId, reqToContentScript)
50-
.then(deferredResponse.resolve)
51-
.catch(deferredResponse.reject);
52-
})
53-
.catch(deferredResponse.reject);
54-
55-
return deferredResponse;
45+
return this.getActiveTabId().then(tabId =>
46+
browser.tabs.sendMessage(tabId, reqToContentScript)
47+
);
5648
},
5749
};
5850

@@ -77,15 +69,7 @@ export default function getBackgroundScript(location) {
7769
fn: attr,
7870
request,
7971
};
80-
81-
const deferredResponse = $.Deferred();
82-
83-
browser.runtime
84-
.sendMessage(reqToBackgroundScript)
85-
.then(deferredResponse.resolve)
86-
.catch(deferredResponse.reject);
87-
88-
return deferredResponse;
72+
return browser.runtime.sendMessage(reqToBackgroundScript);
8973
};
9074
} else {
9175
backgroundScript[attr] = BackgroundScript[attr];

src/scripts/ContentScript.js

Lines changed: 48 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import * as $ from 'jquery';
12
import getBackgroundScript from './BackgroundScript';
23
import ContentSelector from './ContentSelector';
34

@@ -11,28 +12,22 @@ const ContentScript = {
1112
* @returns $.Deferred()
1213
*/
1314
getHTML(request) {
14-
const deferredHTML = $.Deferred();
1515
const html = $(request.CSSSelector).clone().wrap('<p>').parent().html();
16-
deferredHTML.resolve(html);
17-
return deferredHTML.promise();
16+
return Promise.resolve(html);
1817
},
1918

2019
/**
2120
* Removes current content selector if is in use within the page
2221
* @returns $.Deferred()
2322
*/
2423
removeCurrentContentSelector() {
25-
const deferredResponse = $.Deferred();
2624
const contentSelector = window.cs;
2725
if (contentSelector === undefined) {
28-
deferredResponse.resolve();
29-
} else {
30-
contentSelector.removeGUI();
31-
window.cs = undefined;
32-
deferredResponse.resolve();
26+
return Promise.resolve();
3327
}
34-
35-
return deferredResponse.promise();
28+
contentSelector.removeGUI();
29+
window.cs = undefined;
30+
return Promise.resolve();
3631
},
3732

3833
/**
@@ -41,34 +36,32 @@ const ContentScript = {
4136
* @param request.allowedElements
4237
*/
4338
selectSelector(request) {
44-
const deferredResponse = $.Deferred();
45-
46-
this.removeCurrentContentSelector().done(
47-
function () {
48-
const contentSelector = new ContentSelector({
49-
parentCSSSelector: request.parentCSSSelector,
50-
allowedElements: request.allowedElements,
51-
});
52-
window.cs = contentSelector;
53-
54-
const deferredCSSSelector = contentSelector.getCSSSelector();
55-
deferredCSSSelector
56-
.done(
57-
function (response) {
58-
this.removeCurrentContentSelector().done(function () {
59-
deferredResponse.resolve(response);
60-
window.cs = undefined;
61-
});
62-
}.bind(this)
63-
)
64-
.fail(function (message) {
65-
deferredResponse.reject(message);
66-
window.cs = undefined;
39+
return new Promise((resolve, reject) => {
40+
this.removeCurrentContentSelector().then(
41+
function () {
42+
const contentSelector = new ContentSelector({
43+
parentCSSSelector: request.parentCSSSelector,
44+
allowedElements: request.allowedElements,
6745
});
68-
}.bind(this)
69-
);
46+
window.cs = contentSelector;
7047

71-
return deferredResponse.promise();
48+
const deferredCSSSelector = contentSelector.getCSSSelector();
49+
deferredCSSSelector
50+
.then(
51+
function (response) {
52+
this.removeCurrentContentSelector().then(function () {
53+
resolve(response);
54+
window.cs = undefined;
55+
});
56+
}.bind(this)
57+
)
58+
.catch(function (message) {
59+
reject(message);
60+
window.cs = undefined;
61+
});
62+
}.bind(this)
63+
);
64+
});
7265
},
7366

7467
/**
@@ -77,26 +70,26 @@ const ContentScript = {
7770
* @param request.elementCSSSelector
7871
*/
7972
previewSelector(request) {
80-
const deferredResponse = $.Deferred();
81-
this.removeCurrentContentSelector().done(function () {
82-
const contentSelector = new ContentSelector({
83-
parentCSSSelector: request.parentCSSSelector,
84-
});
85-
window.cs = contentSelector;
86-
87-
const deferredSelectorPreview = contentSelector.previewSelector(
88-
request.elementCSSSelector
89-
);
90-
deferredSelectorPreview
91-
.done(function () {
92-
deferredResponse.resolve();
93-
})
94-
.fail(function (message) {
95-
deferredResponse.reject(message);
96-
window.cs = undefined;
73+
return new Promise((resolve, reject) => {
74+
this.removeCurrentContentSelector().then(function () {
75+
const contentSelector = new ContentSelector({
76+
parentCSSSelector: request.parentCSSSelector,
9777
});
78+
window.cs = contentSelector;
79+
80+
const deferredSelectorPreview = contentSelector.previewSelector(
81+
request.elementCSSSelector
82+
);
83+
deferredSelectorPreview
84+
.then(function () {
85+
resolve();
86+
})
87+
.catch(function (message) {
88+
reject(message);
89+
window.cs = undefined;
90+
});
91+
});
9892
});
99-
return deferredResponse;
10093
},
10194
};
10295

0 commit comments

Comments
 (0)