Skip to content
This repository was archived by the owner on Mar 22, 2018. It is now read-only.

Commit c50f87f

Browse files
authored
Merge pull request #19 from johnp/firefox-support
Firefox support v1
2 parents 31cd9f7 + 81c6bc0 commit c50f87f

File tree

5 files changed

+70
-35
lines changed

5 files changed

+70
-35
lines changed

extension/background.js

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,18 @@
1818
* along with this program. If not, see <http://www.gnu.org/licenses/>.
1919
*/
2020

21+
// TODO: Firefox on Windows needs the native messaging app manifest path to be in the registry:
22+
// https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Native_messaging
23+
// TODO: LocalStorage support for Firefox (how does this work here?)
24+
2125
var interruptDownloads = true;
2226
var ugetWrapperNotFound = true;
23-
var interruptDownload = false;
2427
var disposition = '';
2528
var hostName = 'com.javahelps.ugetchromewrapper';
2629
var ugetChromeWrapperVersion;
2730
var ugetVersion;
2831
var chromeVersion;
32+
var firefoxVersion;
2933
var filter = [];
3034
var keywords = [];
3135
var requestList = [{
@@ -47,6 +51,18 @@ try {
4751
} catch (ex) {
4852
chromeVersion = 33;
4953
}
54+
try {
55+
browser.runtime.getBrowserInfo().then(
56+
function(info) {
57+
if (info.name === 'Firefox') {
58+
firefoxVersion = info.version.replace(/[ab]\d+/, '');
59+
}
60+
}
61+
);
62+
} catch (ex) {
63+
firefoxVersion = 0;
64+
}
65+
5066
chromeVersion = parseInt(chromeVersion);
5167
sendMessageToHost({
5268
version: "2.0.3"
@@ -77,7 +93,7 @@ var message = {
7793
};
7894

7995
// Listen to the key press
80-
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
96+
browser.runtime.onMessage.addListener(function(request, sender, sendResponse) {
8197
var msg = request.message;
8298
if (msg === 'enable') {
8399
// Temporarily enable
@@ -93,7 +109,7 @@ chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
93109

94110
// Send message to the uget-chrome-wrapper
95111
function sendMessageToHost(message) {
96-
chrome.runtime.sendNativeMessage(hostName, message, function(response) {
112+
browser.runtime.sendNativeMessage(hostName, message, function(response) {
97113
ugetWrapperNotFound = (response == null);
98114
if (!ugetWrapperNotFound && !ugetChromeWrapperVersion) {
99115
ugetChromeWrapperVersion = response.version;
@@ -130,13 +146,13 @@ function postParams(source) {
130146
}
131147

132148
// Add to Chrome context menu
133-
chrome.contextMenus.create({
149+
browser.contextMenus.create({
134150
title: 'Download with uGet',
135151
id: "download_with_uget",
136152
contexts: ['link']
137153
});
138154

139-
chrome.contextMenus.onClicked.addListener(function(info, tab) {
155+
browser.contextMenus.onClicked.addListener(function(info, tab) {
140156
"use strict";
141157
if (info.menuItemId === "download_with_uget") {
142158
clearMessage();
@@ -147,8 +163,8 @@ chrome.contextMenus.onClicked.addListener(function(info, tab) {
147163
}
148164
});
149165

150-
// Interrupt Google Chrome download
151-
chrome.downloads.onCreated.addListener(function(downloadItem) {
166+
// Interrupt downloads on creation
167+
browser.downloads.onCreated.addListener(function(downloadItem) {
152168

153169
if (ugetWrapperNotFound || !interruptDownloads) { // uget-chrome-wrapper not installed
154170
return;
@@ -175,10 +191,13 @@ chrome.downloads.onCreated.addListener(function(downloadItem) {
175191
return;
176192
}
177193

178-
chrome.downloads.cancel(downloadItem.id); // Cancel the download
179-
chrome.downloads.erase({
180-
id: downloadItem.id
181-
}); // Erase the download from list
194+
// Cancel the download
195+
browser.downloads.cancel(downloadItem.id).then(
196+
function() {
197+
// Erase the download from list
198+
browser.downloads.erase({ id: downloadItem.id }); // ignore callbacks
199+
}
200+
);
182201

183202
clearMessage();
184203
message.url = url;
@@ -188,8 +207,8 @@ chrome.downloads.onCreated.addListener(function(downloadItem) {
188207
sendMessageToHost(message);
189208
});
190209

191-
chrome.webRequest.onBeforeRequest.addListener(function(details) {
192-
if (details.method == 'POST') {
210+
browser.webRequest.onBeforeRequest.addListener(function(details) {
211+
if (details.method === 'POST') {
193212
message.postdata = postParams(details.requestBody.formData);
194213
}
195214
return {
@@ -207,7 +226,7 @@ chrome.webRequest.onBeforeRequest.addListener(function(details) {
207226
'blocking',
208227
'requestBody'
209228
]);
210-
chrome.webRequest.onBeforeSendHeaders.addListener(function(details) {
229+
browser.webRequest.onBeforeSendHeaders.addListener(function(details) {
211230
clearMessage();
212231
currRequest++;
213232
if (currRequest > 2)
@@ -238,7 +257,7 @@ chrome.webRequest.onBeforeSendHeaders.addListener(function(details) {
238257
'blocking',
239258
'requestHeaders'
240259
]);
241-
chrome.webRequest.onHeadersReceived.addListener(function(details) {
260+
browser.webRequest.onHeadersReceived.addListener(function(details) {
242261

243262
if (ugetWrapperNotFound) { // uget-chrome-wrapper not installed
244263
return {
@@ -258,7 +277,7 @@ chrome.webRequest.onHeadersReceived.addListener(function(details) {
258277
};
259278
}
260279

261-
interruptDownload = false;
280+
var interruptDownload = false;
262281
message.url = details.url;
263282
var contentType = "";
264283

@@ -294,7 +313,7 @@ chrome.webRequest.onHeadersReceived.addListener(function(details) {
294313
}
295314
}
296315
}
297-
if (interruptDownload == true && interruptDownloads == true) {
316+
if (interruptDownload && interruptDownloads) {
298317
for (var i = 0; i < filter.length; i++) {
299318
if (filter[i] != "" && contentType.lastIndexOf(filter[i]) != -1) {
300319
return {
@@ -315,12 +334,12 @@ chrome.webRequest.onHeadersReceived.addListener(function(details) {
315334
sendMessageToHost(message);
316335
message.postdata = '';
317336
var scheme = /^https/.test(details.url) ? 'https' : 'http';
318-
if (chromeVersion >= 35) {
337+
if (chromeVersion >= 35 || firefoxVersion >= 51) {
319338
return {
320339
redirectUrl: "javascript:"
321340
};
322341
} else if (details.frameId === 0) {
323-
chrome.tabs.update(details.tabId, {
342+
browser.tabs.update(details.tabId, {
324343
url: "javascript:"
325344
});
326345
var responseHeaders = details.responseHeaders.filter(function(header) {
@@ -343,7 +362,6 @@ chrome.webRequest.onHeadersReceived.addListener(function(details) {
343362
cancel: true
344363
};
345364
}
346-
interruptDownloads == true;
347365
clearMessage();
348366
return {
349367
responseHeaders: details.responseHeaders
@@ -363,13 +381,13 @@ chrome.webRequest.onHeadersReceived.addListener(function(details) {
363381

364382
function updateKeywords(data) {
365383
keywords = data.split(/[\s,]+/);
366-
};
384+
}
367385

368386
function isBlackListed(url) {
369387
if (url.includes("//docs.google.com/") || url.includes("googleusercontent.com/docs")) { // Cannot download from Google Docs
370388
return true;
371389
}
372-
for (keyword of keywords) {
390+
for (var keyword of keywords) {
373391
if (url.includes(keyword)) {
374392
return true;
375393
}
@@ -381,11 +399,11 @@ function isBlackListed(url) {
381399
function setInterruptDownload(interrupt, writeToStorage) {
382400
interruptDownloads = interrupt;
383401
if (interrupt) {
384-
chrome.browserAction.setIcon({
402+
browser.browserAction.setIcon({
385403
path: "./icon_32.png"
386404
});
387405
} else {
388-
chrome.browserAction.setIcon({
406+
browser.browserAction.setIcon({
389407
path: "./icon_disabled_32.png"
390408
});
391409
}

extension/content.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@
2020

2121
window.onkeydown = function(event) {
2222
if (event.keyCode == 45) { // Insert
23-
chrome.extension.sendRequest({ message: 'disable' });
23+
browser.runtime.sendMessage({ message: 'disable' });
2424
}
2525
};
2626

2727
window.onkeyup = function(event) {
2828
if (event.keyCode == 45) { // Insert
29-
chrome.extension.sendRequest({ message: 'enable' });
29+
browser.runtime.sendMessage({ message: 'enable' });
3030
} else if (event.keyCode == 85 && event.ctrlKey && event.shiftKey) { // Ctrl + Shift + U
31-
chrome.extension.sendRequest({ message: 'toggle' });
31+
browser.runtime.sendMessage({ message: 'toggle' });
3232
}
3333
};

extension/manifest.json

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
{
2+
"applications": {
3+
"gecko": {
4+
"id": "uget-integration@slgobinath",
5+
"strict_min_version": "52.0"
6+
}
7+
},
8+
29
"background": {
310
"scripts": [
411
"background.js"
512
]
613
},
714
"browser_action": {
15+
"browser_style": true,
816
"default_icon": "icon_32.png",
9-
"default_popup": "popup.html"
17+
"default_popup": "popup.html"
1018
},
1119
"content_scripts": [
1220
{
@@ -41,7 +49,7 @@
4149
"nativeMessaging",
4250
"contextMenus",
4351
"downloads",
44-
"storage"
52+
"storage"
4553
],
4654
"version": "2.0.3"
4755
}

extension/popup.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@
2020

2121
function saveChanges() {
2222
var keywords = document.getElementById("keywords").value;
23-
var interrupt = document.getElementById('chk-interrupt').checked;
23+
var interrupt = document.getElementById('chk-interrupt').checked;
2424

2525
localStorage["uget-keywords"] = keywords;
2626

27-
chrome.runtime.getBackgroundPage(function(backgroundPage) {
27+
browser.runtime.getBackgroundPage(function(backgroundPage) {
2828
backgroundPage.updateKeywords(keywords);
2929
backgroundPage.setInterruptDownload(interrupt, true);
3030
});
@@ -35,9 +35,9 @@ function saveChanges() {
3535
// When the popup HTML has loaded
3636
window.addEventListener('load', function(evt) {
3737
// Show the system status
38-
chrome.runtime.getBackgroundPage(function(backgroundPage) {
39-
var message = backgroundPage.getInfo().replace(/<[^>]*>?/g, '');
40-
var label = 'error';
38+
browser.runtime.getBackgroundPage(function(backgroundPage) {
39+
var message = backgroundPage.getInfo().replace(/<[^>]*>?/g, '');
40+
var label = 'error';
4141
if(message.toLowerCase().startsWith("info")) {
4242
label = 'info';
4343
} else if(message.toLowerCase().startsWith("warn")) {
@@ -46,7 +46,7 @@ window.addEventListener('load', function(evt) {
4646
document.getElementById(label).innerHTML = message;
4747
});
4848

49-
var interrupt = (localStorage["uget-interrupt"] == "true");
49+
let interrupt = (localStorage["uget-interrupt"] == "true");
5050
document.getElementById('save').addEventListener('click', saveChanges);
5151
document.getElementById('keywords').value = localStorage["uget-keywords"];
5252
document.getElementById('chk-interrupt').checked = interrupt;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"name": "com.javahelps.ugetchromewrapper",
3+
"description": "Integrate uGet with Mozilla Firefox",
4+
"path": "/usr/bin/uget-chrome-wrapper",
5+
"type": "stdio",
6+
"allowed_extensions": [
7+
"uget-integration@sigobinath"
8+
]
9+
}

0 commit comments

Comments
 (0)