Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.
- Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
- Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
- Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
//Dokumentation unter [[Benutzer:Schnark/js/ajaxProxy]] <nowiki>
(function ($, mw, libs) {
function isCompatible () {
return window.postMessage &&
window.FormData &&
window.JSON && JSON.parse && JSON.stringify &&
window.HTMLCanvasElement && HTMLCanvasElement.prototype &&
(HTMLCanvasElement.prototype.mozGetAsFile || HTMLCanvasElement.prototype.toBlob);
}
function checkDomain (domain) {
if (typeof domain !== 'string') {
return false;
}
var projects = [
'wikipedia',
'wikimedia',
'wikibooks',
'wikisource',
'wikinews',
'wiktionary',
'wikiquote',
'wikiversity'
], re = '^' + $.escapeRE(document.location.protocol + '//') + '(?:[a-z\\-]+\\.)*(?:' + projects.join('|') + ')\\.org$';
return (new RegExp(re)).test(domain);
}
function prepareData (data) {
var formData = new FormData(), item;
for (item in data) {
if (data.hasOwnProperty(item)) {
formData.append(item, data[item]);
}
}
return formData;
}
function convertURLtoFile (url, callback) {
var img = new Image();
img.onload = function () {
var $canvas = $('<canvas>'), canvas = $canvas[0];
$canvas.attr({
width: img.width,
height: img.height
});
canvas.getContext('2d').drawImage(img, 0, 0);
if (canvas.toBlob) {
canvas.toBlob(function (file) {
$canvas.remove();
callback(file);
}, 'image/png');
} else {
callback(canvas.mozGetAsFile('blob', 'image/png'));
$canvas.remove();
}
};
img.src = url;
}
function initProxy (domain) {
if (!checkDomain(domain)) {
return;
}
window.addEventListener('message', function (event) {
if (event.origin !== domain || event.source !== window.parent) {
return;
}
var data = JSON.parse(event.data);
data.url = mw.util.wikiScript('api');
data.success = function (json) {
window.parent.postMessage(JSON.stringify({type: 'success', data: json}), domain);
};
data.error = function () {
window.parent.postMessage(JSON.stringify({type: 'error'}), domain);
};
if (data.data && data.data.action === 'upload') {
convertURLtoFile(data.data.file, function (file) {
data.data.file = file;
data.data = prepareData(data.data);
$.ajax(data);
});
} else {
$.ajax(data);
}
}, false);
window.parent.postMessage(JSON.stringify({type: 'init'}), domain);
}
//Ajax-Proxy
var currentProxy = {
domain: false,
$iframe: null,
window: null,
ready: false,
todo: [],
onSuccess: $.noop,
onError: $.noop
};
function messageHandler (event) {
if (event.origin !== currentProxy.domain || event.source !== currentProxy.window) {
return;
}
var eventData = JSON.parse(event.data);
switch (eventData.type) {
case 'init':
onProxyReady();
break;
case 'success':
currentProxy.onSuccess(eventData.data);
onProxyReady();
break;
case 'error':
currentProxy.onError();
onProxyReady();
}
}
function onProxyReady () {
currentProxy.ready = true;
if (currentProxy.todo.length) {
var todo = currentProxy.todo.shift();
sendToCurrentProxy(todo[0], todo[1], todo[2]);
}
}
function openProxy (domain) {
if (domain === currentProxy.domain) {
return;
}
if (currentProxy.domain) {
closeProxy();
}
window.addEventListener('message', messageHandler, false);
var $iframe = $(mw.html.element('iframe', {
style: 'display:none;',
src: domain + '/wiki/PageForAjaxProxy?' +
$.param({
domain: document.location.protocol + '//' + document.location.host
})
})).appendTo('body');
currentProxy = {
domain: domain,
$iframe: $iframe,
window: $iframe[0].contentWindow,
ready: false,
todo: [],
onSuccess: $.noop,
onError: $.noop
};
}
function ajaxProxy (domain, data, onSuccess, onError) {
openProxy(domain);
if (currentProxy.ready) {
sendToCurrentProxy(data, onSuccess, onError);
} else {
currentProxy.todo.push([data, onSuccess, onError]);
}
}
function sendToCurrentProxy (data, onSuccess, onError) {
currentProxy.ready = false;
currentProxy.onSuccess = onSuccess;
currentProxy.onError = onError;
currentProxy.window.postMessage(JSON.stringify(data), currentProxy.domain);
}
function closeProxy () {
if (currentProxy.domain) {
currentProxy.$iframe.remove();
window.removeEventListener('message', messageHandler, false);
}
currentProxy = {
domain: false,
$iframe: null,
window: null,
ready: false,
todo: [],
onSuccess: $.noop,
onError: $.noop
};
}
if (isCompatible()) {
if (mw.config.get('wgPageName') === 'PageForAjaxProxy' && window !== window.parent) { //Special:BlankPage hat X-Frame-Options: DENY
mw.loader.using(['mediawiki.util', 'jquery.mwExtension'], function () {
initProxy(mw.util.getParamValue('domain'));
});
} else {
libs.schnarkAjaxProxy = ajaxProxy;
}
}
})(jQuery, mediaWiki, mediaWiki.libs);
//</nowiki>