blob: 09666a05037b18ac2e780b4ca9c1e06c27d47c29 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
;(function (undefined) {
'use strict';
if (!window.Wicket) {
window.Wicket = {};
}
if (Wicket.AjaxDownload) {
return;
}
Wicket.AjaxDownload = {
initiate : function(settings) {
document.cookie = settings.name +
'=;path=/;Max-Age=0;expires=Thu, 01 Jan 1970 00:00:01 GMT' + settings.sameSite;
var notifyServer = function(result) {
settings.attributes.ep = settings.attributes.ep || {};
settings.attributes.ep.result = result;
Wicket.Ajax.ajax(settings.attributes);
};
var checkComplete = function(watcher) {
var result;
if (document.cookie.indexOf(settings.name + '=') > -1) {
result = "success";
} else {
var html = watcher.html();
if (html && html.length) {
result = "failed";
}
}
if (result) {
watcher.dismiss(result);
notifyServer(result);
} else {
setTimeout(function() {
checkComplete(watcher);
}, 100);
}
};
if (settings.method === 'samewindow') {
setTimeout(function () {
window.location.assign(settings.downloadUrl);
checkComplete({
html: function() {
return jQuery();
},
dismiss: function(result) {
}
});
}, 10);
} else if (settings.method === 'newwindow') {
var wo = window.open(settings.downloadUrl);
checkComplete({
html: function() {
return jQuery(wo ? wo.document : undefined).find('body').html();
},
dismiss: function(result) {
if (result === "failed") {
wo.close();
}
}
});
} else if (settings.method === 'iframe') {
var frame = jQuery("<iframe></iframe>").hide().prop("src", settings.downloadUrl).appendTo("body");
checkComplete({
html: function() {
return frame.contents().find('body').html();
},
dismiss: function() {
// don't remove iframe immediately
setTimeout(function () {
frame.remove();
}, 0);
}
});
} else {
// jquery does not support binary download
var xhr = new XMLHttpRequest();
xhr.open("GET", settings.downloadUrl);
xhr.responseType = "blob";
xhr.onload = function() {
if (this.status === 200) {
var filename = "";
var disposition = xhr.getResponseHeader("Content-Disposition");
if (disposition) {
var matches = /filename[^;=\n]*=(([""]).*?\2|[^;\n]*)/.exec(disposition);
if (matches !== null && matches[1]) {
filename = matches[1].replace(/[""]/g, "");
filename = decodeURIComponent(filename);
}
}
if (typeof window.navigator.msSaveOrOpenBlob !== 'undefined') {
window.navigator.msSaveOrOpenBlob(xhr.response, filename);
} else {
var type = xhr.getResponseHeader("Content-Type");
var blob = new Blob([xhr.response], {type: type});
var blobUrl = (window.URL || window.webkitURL).createObjectURL(blob);
var anchor = jQuery("<a></a>")
.prop("href", blobUrl)
.prop("download", filename)
.appendTo("body")
.hide();
anchor[0].click();
setTimeout(function () {
URL.revokeObjectURL(blobUrl);
anchor.remove();
}, 100);
}
notifyServer("success");
} else {
notifyServer("failed");
}
};
xhr.onerror = function() {
notifyServer("failed");
};
xhr.send();
}
}
};
})();