Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I programmatically download a file created on the file with a Firefox WebExtension?

I am trying to port a Chrome Extension that programmatically creates and downloads a file to a Firefox WebExtension, using Firefox 45.0.1.

This is the Javascript code:

  text = '{"greeting":"Hello, World!"}';
  var a = document.createElement('a');
  var file = new Blob([text], {type: 'text/json'});
  a.href = URL.createObjectURL(file);
  a.download = 'hello.world';   // Filename  
  a.click();                    // Trigger download 

All lines seem to execute fine, but no file is downloaded (I put a console.log() after the a.click()).

As of now there is no chrome.downloads API in Firefox WebExtensions.

Is there any incompatibility with Firefox in the code above? Is there any other alternative to programmatically download a file using a Firefox WebExtension?

like image 861
Pep Avatar asked Nov 08 '22 18:11

Pep


1 Answers

One way to do this, would be to add an event listener to the a tag.

text = '{"greeting":"Hello, World!"}';
var a = document.createElement('a');
var file = new Blob([text], {type: 'text/json'});
a.href = URL.createObjectURL(file);
a.download = 'hello.world';   // Filename  
a.addEventListener('click', dlLinkClicked);


function dlLinkClicked(e){
    var link = e.currentTarget.href;
    var filename = e.currentTarget.download;

    /*downloadVidWithChromeApi downloads using the chrome download API, 
    otherwise returns false and starts downloading the file 
    using the html5 download - you don't have to do anything else*/

    if(downloadVidWithChromeApi(link, filename)){
        e.preventDefault();
    }
}

function downloadVidWithChromeApi(link, fileName){
    if(chrome.downloads && chrome.downloads.download){
        chrome.downloads.download({
            url: link,
            saveAs: false,
            filename: fileName // Optional
        });
        return true;
    }else{
        return false;
    }
}

Notice that I use the downloadVidWithChromeApi function like so, to check if chrome.downloads is supported.

Therefore this code can run in both firefox, chrome, AND opera web extensions AS IS.

like image 128
SudoPlz Avatar answered Jan 04 '23 03:01

SudoPlz