The trick is not to use the element.click method, but to create multiple MouseEvent . To do this, you need to create one MouseEvent for each click.
function clicker(el, clickCount) { var mousedownEvent; while(clickCount--) { mousedownEvent = document.createEvent("MouseEvent"); mousedownEvent.initMouseEvent("click", true, true, window, 0, null, null, null, null, false , false, false, false, 0, null); el.dispatchEvent(mousedownEvent); } } clicker(a, 3);
When using this method in Chrome, however, you get a warning from the browser asking, "This site is trying to upload multiple files. Do you want to allow this? [Deny] [Allow]." Thus, if you do this on an additional extension page, the background page receives a warning, the user cannot see it, so the user does not have the opportunity to click "Allow".
A (rude / unpleasant) workaround is to create a tab that "clicks" on the anchor. Something like that:
function _anchorDownloader(url, filename) { var timeout = 500; return 'javascript:\'<!doctype html><html>'+ '<head></head>' + '<script>' + 'function initDownload() {'+ 'var el = document.getElementById("anchor");'+ 'el.click();' + 'setTimeout(function() { window.close(); }, ' + timeout + ');' + '}'+ '</script>' + '<body onload="initDownload()">' + '<a id="anchor" href="' + url + '" download="'+ filename + '"></a>'+ '</body>' + '</html>\''; }; function downloadResource(info, tab) { // ... chrome.tabs.create( { 'url' : _anchorDownloader( url, filename ), 'active' : false } ); // ... } chrome.contextMenus.create({"title": "Save Image…", "contexts":["image"], "onclick": downloadResource });
For this to work, the extension must have "tabs" as permission in manifest.json . You can set a timeout to close the tab, however, if you close it too quickly, then the download will not happen.