首先配置manifest.json文件,添加download权限:
{
"manifest_version": 2,
"name": "download artworks",
"description": "download artworks",
"version": "1.1",
"update_url": "http://example.com",
"background": {
"scripts": ["js/main.js"]
},
"icons":{
"16":"img/icon.png",
"48":"img/icon.png",
"128":"img/icon.png"
},
"permissions": [
"https://debugger.eu2.netsuite.com/*",
"downloads"
],
"browser_action": {
"default_icon": {
"16":"img/icon.png",
"48":"img/icon.png",
"128":"img/icon.png"
},
"default_title": ""
},
"content_scripts":[
]
}
创建main.js作为background js, 注意,如果manifest.json中的broser_action项配置了default_pop页面,那么插件将不响应click事件,而是打开设置的pop页面。因为我们此次要达到的效果是在点击插件时便开始执行下载,所以去掉了default_pop选项,并在main.js中设置了browserAction.onClicked的监听器。代码如下:
chrome.browserAction.onClicked.addListener(function (tab){
chrome.tabs.executeScript(tab.id, {
file: "js/jquery.min.js",
allFrames: true,
runAt: "document_idle"
});
chrome.tabs.executeScript(tab.id, {
file: "js/content.js",
allFrames: true,
runAt: "document_idle"
});
});
chrome.downloads.onCreated.addListener(function (item){
});
chrome.downloads.onDeterminingFilename.addListener(function (item, __suggest){
var filename;
var searchParams = new URLSearchParams(item.url.replace(/.*\?/,''));
var proofId = searchParams.get('proofid');
var fname = searchParams.get('custfilename');
console.log(fname);
if (fname) {
filename = fname + '.meta';
__suggest({filename: 'artworks/' + proofId + '/' + filename,conflict_action: 'overwrite',conflictAction: 'overwrite'});
} else {
filename = item.filename;
__suggest({filename: 'artworks/' + proofId + '/' + filename,conflict_action: 'overwrite',conflictAction: 'overwrite'});
}
});
chrome.extension.onRequest.addListener(function(data) {
chrome.downloads.download({url: data[0],
conflictAction:'overwrite'});
});
可以在main.js中引入其它脚本,比如jquery等。
content.js负责解析页面dom,并将需要下载的url传递给main.js,因为只有在main.js中才能调用download相关api.
在main.js中利用chrome.extension.onRequest来监听页面脚本投递的消息(消息体可以是string,array,object等)。
而在content.js中,利用chrome.extension.sendRequest(mixedType)来向main.js发送消息。
chrome.downloads.onDeterminingFilename用来重写下载文件名,conflictAction选项用来处理文件名冲突的处理方式。
注意,downloads下载的文件只会放在浏览器设置的下载目录下,如果在onDeterminingFilename中,将文件名前面加上子目录名的话,会自动创建此子目录。
content.js代码如下:
var currSearch = new URLSearchParams(window.location.search.replace(/^\?/, ''));
var proofId = currSearch.get('id');
var fileId = currSearch.get('justfileid');
function foreachLink(callback){
jQuery('#custom3_form .smalltext').each(function (i, ele){
if (i % 2 === 0 ) {
var fname = ele.innerText.replace(/^preview/i, '').trim();
var fid = ele.getAttribute('onclick').replace(/^preview\(/,'').replace(/\,.+$/,'');
if (fileId && fileId != fid) return;
console.log('File id&name: ' + fid + ',' + fname);
downloadMeta(fname, fid);
} else {
var fid = new URLSearchParams(ele.href.replace(/.*\?/,'')).get('id');
if (fileId && fileId != fid) return;
console.log('File download: ' + ele.href);
download(ele);
}
});
}
function sendDownloadUrl(url){
chrome.extension.sendRequest([url + '&proofid=' + proofId]);
}
function download(ele){
sendDownloadUrl(ele.href);
//ele.click();
}
function downloadMeta(filename, fileid){
var metaDataUrl = 'https://xxxx.com/app/site/hosting/scriptlet.nl?script=151&deploy=1&fileid=' + fileid;
sendDownloadUrl(metaDataUrl + '&custfilename=' + encodeURIComponent(filename));
/*
jQuery.getJSON(metaDataUrl, function(data){
//console.log(data);
});
fetch(metaDataUrl).then(function(response) {
//console.log(response);
if(response.ok) {
response.blob().then(function(myBlob) {
var blob = new Blob([myBlob]);
var url = window.URL.createObjectURL(blob);
var aBtn = document.createElement('a');
aBtn.href = url ;
aBtn.download = decodeURIComponent(filename);
//aBtn.click();
download(aBtn)
});
} else {
alert(filename + ' download error.');
}
});*/
}
foreachLink();