MediaWiki:Gadget-FixEcho.js
注意: 保存後、変更を確認するにはブラウザーのキャッシュを消去する必要がある場合があります。
- Firefox / Safari: Shift を押しながら 再読み込み をクリックするか、Ctrl-F5 または Ctrl-R を押してください (Mac では ⌘-R)
- Google Chrome: Ctrl-Shift-R を押してください (Mac では ⌘-Shift-R)
- Microsoft Edge: Ctrl を押しながら 最新の情報に更新 をクリックするか、Ctrl-F5 を押してください。
const ECHO_GET_ACTIONS = ['notifications', 'unreadnotificationpages'];
const ECHO_POST_ACTIONS = ['echomarkread'];
function inferWikiUrl(wikiId) {
if (typeof wikiId !== 'string') {
return;
}
const [lang, wiki] = wikiId.split('_');
if (!lang || !wiki) {
return;
}
if (window.location.host.includes('dev')) {
if (lang === 'en') {
return `https://dev.${wiki}.wiki`;
}
return `https://dev-${lang}.${wiki}.wiki`;
}
if (lang === 'en') {
return `https://${wiki}.wiki`;
}
return `https://${lang}.${wiki}.wiki`;
}
let circuitBreaker = false;
const originalAjax = mw.Api.prototype.ajax;
mw.Api.prototype.ajax = function(parameters, ajaxOptions) {
// OVERRIDEN BY THE FixEcho GADGET!
if (circuitBreaker) {
circuitBreaker = false;
return originalAjax.call(this, parameters, ajaxOptions);
}
if (typeof parameters !== 'object') {
return originalAjax.call(this, parameters, ajaxOptions);
}
const isGet = ajaxOptions.type === 'GET' &&
parameters.action === 'query' &&
ECHO_GET_ACTIONS.includes(parameters.meta);
const isPost = ajaxOptions.type === 'POST' &&
ECHO_POST_ACTIONS.includes(parameters.action);
if (!isGet && !isPost) {
return originalAjax.call(this, parameters, ajaxOptions);
}
const wikiParam = isGet ?
(parameters.notwikis || parameters.unpwikis) :
parameters.wikis;
if (!wikiParam) {
return originalAjax.call(this, parameters, ajaxOptions);
}
const wikiId = Array.isArray(wikiParam) ? wikiParam[0] : wikiParam;
const wikiUrl = inferWikiUrl(wikiId);
if (!wikiUrl) {
return originalAjax.call(this, parameters, ajaxOptions);
}
const newApi = new mw.ForeignApi(`${wikiUrl}/api.php`);
circuitBreaker = true;
return newApi.getToken('csrf').then(token => newApi.ajax(
Object.assign(parameters, {token}),
ajaxOptions
));
};
document.addEventListener('click', event => {
const target = event.target
.closest('a.mw-echo-ui-notificationItemWidget-unread');
if (
!target ||
event.ctrlKey ||
event.shiftKey ||
event.metaKey ||
event.altKey
) {
return;
}
const url = new URL(target.href);
if (url.pathname.startsWith('/d/')) {
const api = new mw.echo.api.EchoApi();
api.markItemsRead(
[Number(url.searchParams.get('markasread'))],
url.searchParams.get('markasreadwiki'),
true
);
}
});