<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-FastRollback.js</id>
	<title>MediaWiki:Gadget-FastRollback.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-FastRollback.js"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-FastRollback.js&amp;action=history"/>
	<updated>2026-04-11T07:42:09Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://linguifex.com/w/index.php?title=MediaWiki:Gadget-FastRollback.js&amp;diff=474999&amp;oldid=prev</id>
		<title>Sware: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-FastRollback.js&amp;diff=474999&amp;oldid=prev"/>
		<updated>2025-11-04T17:52:14Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 17:52, 4 November 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=MediaWiki:Gadget-FastRollback.js&amp;diff=474998&amp;oldid=prev</id>
		<title>wikt&gt;Ioaxxere: mw:Migrating mw.Uri to URL</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-FastRollback.js&amp;diff=474998&amp;oldid=prev"/>
		<updated>2025-09-17T22:36:28Z</updated>

		<summary type="html">&lt;p&gt;&lt;a href=&quot;http://www.mediawiki.org/wiki/Migrating_mw.Uri_to_URL&quot; class=&quot;extiw&quot; title=&quot;mw:Migrating mw.Uri to URL&quot;&gt;mw:Migrating mw.Uri to URL&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;// {{documentation}}&lt;br /&gt;
/*jshint undef:true, latedef:true, undef:true, shadow:true, scripturl:true */&lt;br /&gt;
/*global mw, jQuery */&lt;br /&gt;
(function () {&lt;br /&gt;
	&lt;br /&gt;
var api = new mw.Api();&lt;br /&gt;
	&lt;br /&gt;
function processLink(link, title, token, user, markbot) {&lt;br /&gt;
	var wrapper = link.parentNode;&lt;br /&gt;
	var bracketed = (wrapper.textContent[0] === &amp;#039;[&amp;#039;);&lt;br /&gt;
	&lt;br /&gt;
	link.addEventListener(&amp;#039;click&amp;#039;, function (ev) {&lt;br /&gt;
		ev.preventDefault();&lt;br /&gt;
&lt;br /&gt;
		var summary = prompt(&amp;#039;About to rollback edits by [[User:&amp;#039; + user + &amp;#039;]] to [[&amp;#039; + title + &amp;#039;]].\n\nEdit summary (empty for default):&amp;#039;,&lt;br /&gt;
			&amp;#039;Reverted edits by [[Special:Contributions/&amp;#039; + user + &amp;#039;|&amp;#039; + user + &amp;#039;]]. If you think this rollback is in error, please leave a message on my [[User talk:&amp;#039; + mw.config.get(&amp;#039;wgUserName&amp;#039;) + &amp;#039;|talk page]].&amp;#039;);&lt;br /&gt;
		if (summary === null)&lt;br /&gt;
			return;&lt;br /&gt;
		&lt;br /&gt;
		wrapper.textContent = bracketed ? &amp;#039;[wait]&amp;#039; : &amp;#039;wait&amp;#039;;&lt;br /&gt;
		api.post({&lt;br /&gt;
			action: &amp;#039;rollback&amp;#039;,&lt;br /&gt;
			title: title,&lt;br /&gt;
			user: user,&lt;br /&gt;
			token: token,&lt;br /&gt;
			markbot: markbot ? &amp;#039;1&amp;#039; : void(0),&lt;br /&gt;
			summary: summary ? summary : void(0)&lt;br /&gt;
		}).then(function (result) {&lt;br /&gt;
			var diffLink = document.createElement(&amp;#039;a&amp;#039;);&lt;br /&gt;
			diffLink.href = mw.config.get(&amp;#039;wgScript&amp;#039;) + &amp;#039;?diff=&amp;#039; + result.rollback.revid + &amp;#039;&amp;amp;diffonly=1&amp;#039;;&lt;br /&gt;
			diffLink.textContent = &amp;#039;diff&amp;#039;;&lt;br /&gt;
			&lt;br /&gt;
			var reloadLink = document.createElement(&amp;#039;a&amp;#039;);&lt;br /&gt;
			reloadLink.href = &amp;#039;javascript:location.reload();&amp;#039;;&lt;br /&gt;
			reloadLink.textContent = &amp;#039;reload&amp;#039;;&lt;br /&gt;
			&lt;br /&gt;
			wrapper.textContent = &amp;#039;&amp;#039;;&lt;br /&gt;
			if (bracketed) wrapper.appendChild(document.createTextNode(&amp;#039;[&amp;#039;));&lt;br /&gt;
			wrapper.appendChild(document.createTextNode(&amp;#039;done: &amp;#039;));&lt;br /&gt;
			wrapper.appendChild(diffLink);&lt;br /&gt;
			wrapper.appendChild(document.createTextNode(&amp;#039; | &amp;#039;));&lt;br /&gt;
			wrapper.appendChild(reloadLink);&lt;br /&gt;
			if (bracketed) wrapper.appendChild(document.createTextNode(&amp;#039;]&amp;#039;));&lt;br /&gt;
		}, function (code, result, xhr) {&lt;br /&gt;
			link.textContent = &amp;#039;retry&amp;#039;;&lt;br /&gt;
			&lt;br /&gt;
			var cnode = document.createElement(&amp;#039;code&amp;#039;);&lt;br /&gt;
			cnode.style.borderBottom = &amp;#039;1px dotted black&amp;#039;;&lt;br /&gt;
			cnode.style.cursor = &amp;#039;help&amp;#039;;&lt;br /&gt;
			&lt;br /&gt;
			cnode.textContent = code;&lt;br /&gt;
			switch (code) {&lt;br /&gt;
			case &amp;#039;http&amp;#039;:&lt;br /&gt;
				cnode.title = &amp;#039;HTTP error: &amp;#039; + result.textStatus;&lt;br /&gt;
				break;&lt;br /&gt;
			case &amp;#039;ok-but-empty&amp;#039;:&lt;br /&gt;
				cnode.title = &amp;#039;Received empty response from the server&amp;#039;;&lt;br /&gt;
				break;&lt;br /&gt;
			default:&lt;br /&gt;
				cnode.title = result.error.info;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			wrapper.textContent = &amp;#039;&amp;#039;;&lt;br /&gt;
			if (bracketed) wrapper.appendChild(document.createTextNode(&amp;#039;[&amp;#039;));&lt;br /&gt;
			wrapper.appendChild(document.createTextNode(&amp;#039;error: &amp;#039;));&lt;br /&gt;
			wrapper.appendChild(cnode);&lt;br /&gt;
			wrapper.appendChild(document.createTextNode(&amp;#039; (&amp;#039;));&lt;br /&gt;
			wrapper.appendChild(link);&lt;br /&gt;
			wrapper.appendChild(document.createTextNode(&amp;#039;)&amp;#039;));&lt;br /&gt;
			if (bracketed) wrapper.appendChild(document.createTextNode(&amp;#039;]&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
			console.error(result);&lt;br /&gt;
		});&lt;br /&gt;
	}, false);&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
&lt;br /&gt;
var rolllinks = document.getElementsByClassName(&amp;#039;mw-rollback-link&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
for (var i = 0; i &amp;lt; rolllinks.length; ++i) {&lt;br /&gt;
	var links = rolllinks[i].getElementsByTagName(&amp;#039;a&amp;#039;);&lt;br /&gt;
	if (links.length !== 1)&lt;br /&gt;
		continue;&lt;br /&gt;
	var link = links[0];&lt;br /&gt;
	try {&lt;br /&gt;
		var uri = new URL(link.href);&lt;br /&gt;
		if (uri.searchParams.get(&amp;quot;action&amp;quot;) === &amp;#039;rollback&amp;#039;)&lt;br /&gt;
			processLink(link, uri.searchParams.get(&amp;quot;title&amp;quot;), uri.searchParams.get(&amp;quot;token&amp;quot;), uri.searchParams.get(&amp;quot;from&amp;quot;), uri.searchParams.get(&amp;quot;bot&amp;quot;) &amp;amp;&amp;amp; true);&lt;br /&gt;
	} catch (e) {&lt;br /&gt;
		/* swallow */&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function makeRestoreLink(oldid, uname) {&lt;br /&gt;
	var link = document.createElement(&amp;#039;a&amp;#039;);&lt;br /&gt;
	var span = document.createElement(&amp;#039;span&amp;#039;);&lt;br /&gt;
	link.href = mw.config.get(&amp;#039;wgScript&amp;#039;) + &amp;#039;?action=edit&amp;amp;oldid=&amp;#039; + oldid;&lt;br /&gt;
&lt;br /&gt;
	function doRestore() {&lt;br /&gt;
		function showError(action, code, result) {&lt;br /&gt;
			var cnode = document.createElement(&amp;#039;code&amp;#039;);&lt;br /&gt;
			cnode.textContent = code;&lt;br /&gt;
			switch (code) {&lt;br /&gt;
			case &amp;#039;http&amp;#039;:&lt;br /&gt;
				cnode.title = &amp;#039;HTTP error: &amp;#039; + result.textStatus;&lt;br /&gt;
				break;&lt;br /&gt;
			case &amp;#039;ok-but-empty&amp;#039;:&lt;br /&gt;
				cnode.title = &amp;#039;Received empty response from the server&amp;#039;;&lt;br /&gt;
				break;&lt;br /&gt;
			case &amp;#039;edit-failure&amp;#039;:&lt;br /&gt;
				cnode.textContent = result.edit.code;&lt;br /&gt;
				cnode.title = &amp;#039;Edit error: &amp;#039; + result.edit.info;&lt;br /&gt;
				break;&lt;br /&gt;
			default:&lt;br /&gt;
				cnode.title = result.error.info;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var retryLink = document.createElement(&amp;#039;a&amp;#039;);&lt;br /&gt;
			retryLink.href = link.href;&lt;br /&gt;
			retryLink.textContent = &amp;#039;retry&amp;#039;;&lt;br /&gt;
			retryLink.addEventListener(&amp;#039;click&amp;#039;, function (ev) {&lt;br /&gt;
				ev.preventDefault();&lt;br /&gt;
				doRestore();&lt;br /&gt;
			}, false);&lt;br /&gt;
&lt;br /&gt;
			span.textContent = &amp;#039;&amp;#039;;&lt;br /&gt;
			span.appendChild(document.createTextNode(&amp;#039;error: &amp;#039;));&lt;br /&gt;
			span.appendChild(cnode);&lt;br /&gt;
			span.appendChild(document.createTextNode(&amp;#039; (&amp;#039;));&lt;br /&gt;
			span.appendChild(retryLink);&lt;br /&gt;
			span.appendChild(document.createTextNode(&amp;#039;)&amp;#039;));&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var summary = prompt(&amp;#039;Edit summary for this reversion:&amp;#039;, &amp;#039;Restored [[Special:Permalink/&amp;#039; + oldid + &amp;#039;|revision &amp;#039; + oldid + &amp;#039;]] by [[User:&amp;#039; + uname + &amp;#039;]]&amp;#039;);&lt;br /&gt;
		if (summary === null)&lt;br /&gt;
			return;&lt;br /&gt;
&lt;br /&gt;
		span.textContent = &amp;#039;grabbing oldid&amp;#039;;&lt;br /&gt;
		if (link.parentNode) {&lt;br /&gt;
			link.parentNode.insertBefore(span, link);&lt;br /&gt;
			link.parentNode.removeChild(link);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		api.get({&lt;br /&gt;
			action: &amp;#039;query&amp;#039;,&lt;br /&gt;
			pageids: mw.config.get(&amp;#039;wgArticleId&amp;#039;),&lt;br /&gt;
			prop: &amp;#039;revisions&amp;#039;,&lt;br /&gt;
			rvstartid: oldid,&lt;br /&gt;
			rvlimit: 1,&lt;br /&gt;
			rvprop: &amp;#039;content&amp;#039;&lt;br /&gt;
		}).then(function (result, xhr) {&lt;br /&gt;
			console.info(result);&lt;br /&gt;
			var starttimestamp = (new Date(xhr.getResponseHeader(&amp;#039;Date&amp;#039;))).toISOString(); // XXX: acceptable?&lt;br /&gt;
			var content = result.query.pages[mw.config.get(&amp;#039;wgArticleId&amp;#039;)].revisions[0][&amp;#039;*&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
			span.textContent = &amp;#039;grabbing latest revision&amp;#039;;&lt;br /&gt;
			api.get({&lt;br /&gt;
				action: &amp;#039;query&amp;#039;,&lt;br /&gt;
				pageids: mw.config.get(&amp;#039;wgArticleId&amp;#039;),&lt;br /&gt;
				prop: &amp;#039;revisions&amp;#039;,&lt;br /&gt;
				rvlimit: 1,&lt;br /&gt;
				rvprop: &amp;#039;ids|timestamp&amp;#039;&lt;br /&gt;
			}).then(function (result) {&lt;br /&gt;
				console.info(result);&lt;br /&gt;
				var basetimestamp = result.query.pages[mw.config.get(&amp;#039;wgArticleId&amp;#039;)].revisions[0].timestamp;&lt;br /&gt;
				if (result.query.pages[mw.config.get(&amp;#039;wgArticleId&amp;#039;)].revisions[0].revid === Number(oldid)) {&lt;br /&gt;
					span.textContent = &amp;#039;this is already the latest revision&amp;#039;;&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				span.textContent = &amp;#039;reverting&amp;#039;;&lt;br /&gt;
				api.post({&lt;br /&gt;
					action: &amp;#039;edit&amp;#039;,&lt;br /&gt;
					pageid: mw.config.get(&amp;#039;wgArticleId&amp;#039;),&lt;br /&gt;
					token: mw.user.tokens.get(&amp;#039;csrfToken&amp;#039;),&lt;br /&gt;
					basetimestamp: basetimestamp,&lt;br /&gt;
					starttimestamp: starttimestamp,&lt;br /&gt;
					nocreate: &amp;#039;1&amp;#039;,&lt;br /&gt;
					text: content,&lt;br /&gt;
					summary: summary&lt;br /&gt;
				}).then(function (result) {&lt;br /&gt;
					if (result.edit.result === &amp;#039;Success&amp;#039;) {&lt;br /&gt;
						span.textContent = &amp;#039;done&amp;#039;;&lt;br /&gt;
					} else {&lt;br /&gt;
						showError(&amp;#039;saving&amp;#039;, &amp;#039;edit-failure&amp;#039;, result);&lt;br /&gt;
					}&lt;br /&gt;
				}, function (code, result) {&lt;br /&gt;
					showError(&amp;#039;saving&amp;#039;, code, result);&lt;br /&gt;
				});&lt;br /&gt;
			}, function (code, result) {&lt;br /&gt;
				showError(&amp;#039;grabbing latest revision data&amp;#039;, code, result);&lt;br /&gt;
			});&lt;br /&gt;
		}, function (code, result) {&lt;br /&gt;
			showError(&amp;#039;grabbing old revision text&amp;#039;, code, result);&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	link.addEventListener(&amp;#039;click&amp;#039;, function (ev) {&lt;br /&gt;
		ev.preventDefault();&lt;br /&gt;
		doRestore();&lt;br /&gt;
	}, false);&lt;br /&gt;
&lt;br /&gt;
	return link;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// are we viewing an old revision?&lt;br /&gt;
var revnav = document.getElementById(&amp;#039;mw-revision-nav&amp;#039;);&lt;br /&gt;
if (revnav) {&lt;br /&gt;
	var uname = document.getElementById(&amp;#039;mw-revision-info&amp;#039;).getElementsByClassName(&amp;#039;mw-userlink&amp;#039;)[0].textContent;&lt;br /&gt;
	var oldid = mw.config.get(&amp;#039;wgRevisionId&amp;#039;); // XXX: suppress if this is the latest revid&lt;br /&gt;
&lt;br /&gt;
	var link = makeRestoreLink(oldid, uname);&lt;br /&gt;
	link.textContent = &amp;#039;restore this version&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	revnav.appendChild(document.createTextNode(&amp;#039; (&amp;#039;));&lt;br /&gt;
	revnav.appendChild(link);&lt;br /&gt;
	revnav.appendChild(document.createTextNode(&amp;#039;)&amp;#039;));&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// intentionally not enabled on history pages;&lt;br /&gt;
// I want the user to see to what version they are reverting&lt;br /&gt;
// either directly or at least a diff&lt;br /&gt;
// may be changed on request, though&lt;br /&gt;
&lt;br /&gt;
function addRestoreLink(titlenode) {&lt;br /&gt;
	if (!titlenode)&lt;br /&gt;
		return;&lt;br /&gt;
&lt;br /&gt;
	var titlelinks = titlenode.getElementsByTagName(&amp;#039;a&amp;#039;);&lt;br /&gt;
	var userlink = titlenode.parentNode.getElementsByClassName(&amp;#039;mw-userlink&amp;#039;)[0];&lt;br /&gt;
	var uname = userlink.textContent;&lt;br /&gt;
	&lt;br /&gt;
	var uri = new URL(titlelinks[0].href);&lt;br /&gt;
	// XXX: suppress for latest revid&lt;br /&gt;
	var rlink = makeRestoreLink(uri.searchParams.get(&amp;quot;oldid&amp;quot;), userlink.textContent);&lt;br /&gt;
	rlink.textContent = &amp;#039;restore&amp;#039;;&lt;br /&gt;
	titlelinks[1].parentNode.insertBefore(rlink, titlelinks[1].nextSibling);&lt;br /&gt;
	titlelinks[1].parentNode.insertBefore(document.createTextNode(&amp;#039; | &amp;#039;), titlelinks[1].nextSibling);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// are we viewing a diff?&lt;br /&gt;
var ot = document.getElementById(&amp;#039;mw-diff-otitle1&amp;#039;);&lt;br /&gt;
var nt = document.getElementById(&amp;#039;mw-diff-ntitle1&amp;#039;);&lt;br /&gt;
var ri = document.getElementById(&amp;#039;mw-revision-info&amp;#039;);&lt;br /&gt;
if ((nt || ot) &amp;amp;&amp;amp; mw.config.get(&amp;#039;wgArticleId&amp;#039;)) {&lt;br /&gt;
	addRestoreLink(ot);&lt;br /&gt;
	addRestoreLink(nt);&lt;br /&gt;
} else if (ri &amp;amp;&amp;amp; (mw.config.get(&amp;#039;wgRevisionId&amp;#039;) !== mw.config.get(&amp;#039;wgCurRevisionId&amp;#039;))) {&lt;br /&gt;
	var userlink = ri.getElementsByClassName(&amp;#039;mw-userlink&amp;#039;)[0];&lt;br /&gt;
	var rlink = makeRestoreLink(mw.config.get(&amp;#039;wgRevisionId&amp;#039;), userlink.textContent);&lt;br /&gt;
	rlink.textContent = &amp;#039;restore&amp;#039;;&lt;br /&gt;
	var fh = document.getElementById(&amp;#039;firstHeading&amp;#039;);&lt;br /&gt;
	var span = document.createElement(&amp;#039;span&amp;#039;);&lt;br /&gt;
	span.className = &amp;#039;mw-editsection&amp;#039;;&lt;br /&gt;
	span.appendChild(document.createTextNode(&amp;#039;[&amp;#039;));&lt;br /&gt;
	span.appendChild(rlink);&lt;br /&gt;
	span.appendChild(document.createTextNode(&amp;#039;]&amp;#039;));&lt;br /&gt;
	fh.appendChild(span);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>wikt&gt;Ioaxxere</name></author>
	</entry>
</feed>