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>