Release 4chan X v1.10.12.0.

This commit is contained in:
ccd0 2015-05-04 20:31:17 -07:00
parent 24a7311a7a
commit 245548b1bc
13 changed files with 231 additions and 111 deletions

View File

@ -2,6 +2,15 @@ Sometimes the changelog has notes (not comprehensive) acknowledging people's wor
The links to individual versions below are to copies of the script with the update URL removed. If you want automatic updates, install the script from the links on the [main page](https://github.com/ccd0/4chan-x). The links to individual versions below are to copies of the script with the update URL removed. If you want automatic updates, install the script from the links on the [main page](https://github.com/ccd0/4chan-x).
### v1.10.12
**v1.10.12.0** *(2015-05-04)* - [[Firefox](https://raw.githubusercontent.com/ccd0/4chan-x/1.10.12.0/builds/4chan-X-noupdate.user.js "Firefox version")] [[Chromium](https://raw.githubusercontent.com/ccd0/4chan-x/1.10.12.0/builds/4chan-X-noupdate.crx "Chromium version")]
- Based on v1.10.11.12.
- Fix files dropped on captcha causing navigation to the file.
- Fix size of report window when Javascript is disabled.
- QR character count now handles surrogate pairs correctly and turns red when the limit of 2000 is reached.
- Add `;sandbox` option to sauce links to open links without scripts or popups. Re-add swfchan.
### v1.10.11 ### v1.10.11
**v1.10.11.12** *(2015-05-03)* - [[Firefox](https://raw.githubusercontent.com/ccd0/4chan-x/1.10.11.12/builds/4chan-X-noupdate.user.js "Firefox version")] [[Chromium](https://raw.githubusercontent.com/ccd0/4chan-x/1.10.11.12/builds/4chan-X-noupdate.crx "Chromium version")] **v1.10.11.12** *(2015-05-03)* - [[Firefox](https://raw.githubusercontent.com/ccd0/4chan-x/1.10.11.12/builds/4chan-X-noupdate.user.js "Firefox version")] [[Chromium](https://raw.githubusercontent.com/ccd0/4chan-x/1.10.11.12/builds/4chan-X-noupdate.crx "Chromium version")]

Binary file not shown.

View File

@ -1,6 +1,6 @@
// ==UserScript== // ==UserScript==
// @name 4chan X beta // @name 4chan X beta
// @version 1.10.11.12 // @version 1.10.12.0
// @minGMVer 1.14 // @minGMVer 1.14
// @minFFVer 26 // @minFFVer 26
// @namespace 4chan-X // @namespace 4chan-X

View File

@ -1,7 +1,7 @@
// Generated by CoffeeScript // Generated by CoffeeScript
// ==UserScript== // ==UserScript==
// @name 4chan X beta // @name 4chan X beta
// @version 1.10.11.12 // @version 1.10.12.0
// @minGMVer 1.14 // @minGMVer 1.14
// @minFFVer 26 // @minFFVer 26
// @namespace 4chan-X // @namespace 4chan-X
@ -292,7 +292,7 @@
filesize: '', filesize: '',
MD5: '' MD5: ''
}, },
sauces: "https://www.google.com/searchbyimage?image_url=%IMG\nhttp://iqdb.org/?url=%IMG\n#//tineye.com/search?url=%IMG\n#https://www.yandex.com/images/search?rpt=imageview&img_url=%IMG\n#//saucenao.com/search.php?url=%IMG\n#http://3d.iqdb.org/?url=%IMG\n#http://regex.info/exif.cgi?imgurl=%URL\n# uploaders:\n#//imgur.com/upload?url=%URL;types:gif,jpg,png,pdf;text:Upload to imgur\n# \"View Same\" in archives:\n#https://archive.moe/_/search/image/%MD5/;text:View same on archive.moe\n#https://archive.moe/%board/search/image/%MD5/;text:View same on archive.moe/%board/;boards:a,biz,c,co,diy,fit,gd,h,i,jp,k,m,mlp,po,qa,r9k,s4s,sci,tg,u,v,vg,vp,vr,wsg\n#https://rbt.asia/%board/image/%MD5;text:View same on RBT /%board/;boards:cgl,g,mu,qa,w", sauces: "https://www.google.com/searchbyimage?image_url=%IMG\nhttp://iqdb.org/?url=%IMG\nhttp://eye.swfchan.com/search/?q=%name;types:swf;sandbox\n#//tineye.com/search?url=%IMG\n#https://www.yandex.com/images/search?rpt=imageview&img_url=%IMG\n#//saucenao.com/search.php?url=%IMG\n#http://3d.iqdb.org/?url=%IMG\n#http://regex.info/exif.cgi?imgurl=%URL\n# uploaders:\n#//imgur.com/upload?url=%URL;types:gif,jpg,png,pdf;text:Upload to imgur\n# \"View Same\" in archives:\n#https://archive.moe/_/search/image/%MD5/;text:View same on archive.moe\n#https://archive.moe/%board/search/image/%MD5/;text:View same on archive.moe/%board/;boards:a,biz,c,co,diy,fit,gd,h,i,jp,k,m,mlp,po,qa,r9k,s4s,sci,tg,u,v,vg,vp,vr,wsg\n#https://rbt.asia/%board/image/%MD5;text:View same on RBT /%board/;boards:cgl,g,mu,qa,w",
FappeT: { FappeT: {
werk: false werk: false
}, },
@ -396,7 +396,7 @@
doc = d.documentElement; doc = d.documentElement;
g = { g = {
VERSION: '1.10.11.12', VERSION: '1.10.12.0',
NAMESPACE: '4chan X.', NAMESPACE: '4chan X.',
boards: {} boards: {}
}; };
@ -430,6 +430,10 @@
return html; return html;
}; };
E.url = function(content) {
return "data:text/html;charset=utf-8,<!doctype html>" + (encodeURIComponent(content.innerHTML));
};
$ = function(selector, root) { $ = function(selector, root) {
if (root == null) { if (root == null) {
root = d.body; root = d.body;
@ -6710,7 +6714,6 @@
if (g.VIEW === 'archive') { if (g.VIEW === 'archive') {
return; return;
} }
$.globalEval('document.documentElement.classList.add("js-enabled");');
noscript = Conf['Force Noscript Captcha'] || !$.hasClass(doc, 'js-enabled'); noscript = Conf['Force Noscript Captcha'] || !$.hasClass(doc, 'js-enabled');
this.captcha = Captcha[noscript ? 'noscript' : 'v2']; this.captcha = Captcha[noscript ? 'noscript' : 'v2'];
$.on(d, '4chanXInitFinished', this.initReady); $.on(d, '4chanXInitFinished', this.initReady);
@ -6783,6 +6786,8 @@
$.on(d, 'dragover', QR.dragOver); $.on(d, 'dragover', QR.dragOver);
$.on(d, 'drop', QR.dropFile); $.on(d, 'drop', QR.dropFile);
$.on(d, 'dragstart dragend', QR.drag); $.on(d, 'dragstart dragend', QR.drag);
$.on(d, 'dragenter', QR.dragEnter);
$.on(d, 'dragleave', QR.dragLeave);
$.on(d, 'IndexRefresh', QR.generatePostableThreadsList); $.on(d, 'IndexRefresh', QR.generatePostableThreadsList);
$.on(d, 'ThreadUpdate', QR.statusCheck); $.on(d, 'ThreadUpdate', QR.statusCheck);
if (!Conf['Persistent QR']) { if (!Conf['Persistent QR']) {
@ -7063,10 +7068,10 @@
characterCount: function() { characterCount: function() {
var count, counter; var count, counter;
counter = QR.nodes.charCount; counter = QR.nodes.charCount;
count = QR.nodes.com.textLength; count = QR.nodes.com.value.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, '_').length;
counter.textContent = count; counter.textContent = count;
counter.hidden = count < 1000; counter.hidden = count < 1000;
return (count > 1500 ? $.addClass : $.rmClass)(counter, 'warning'); return (count > 2000 ? $.addClass : $.rmClass)(counter, 'warning');
}, },
getFile: function() { getFile: function() {
var ref; var ref;
@ -7092,6 +7097,8 @@
return e.dataTransfer.dropEffect = 'copy'; return e.dataTransfer.dropEffect = 'copy';
}, },
dropFile: function(e) { dropFile: function(e) {
delete QR.dragTarget;
$.rmClass(doc, 'dragging');
if (!e.dataTransfer.files.length) { if (!e.dataTransfer.files.length) {
return; return;
} }
@ -7099,6 +7106,16 @@
QR.open(); QR.open();
return QR.handleFiles(e.dataTransfer.files); return QR.handleFiles(e.dataTransfer.files);
}, },
dragEnter: function(e) {
QR.dragTarget = e.target;
return $.addClass(doc, 'dragging');
},
dragLeave: function(e) {
if (QR.dragTarget === e.target) {
delete QR.dragTarget;
return $.rmClass(doc, 'dragging');
}
},
paste: function(e) { paste: function(e) {
var blob, files, item, k, len1, ref; var blob, files, item, k, len1, ref;
if (!e.clipboardData.items) { if (!e.clipboardData.items) {
@ -10590,19 +10607,24 @@
cb: this.node cb: this.node
}); });
}, },
sandbox: function(url) {
return E.url({
innerHTML: "<html><head><title>[sb] " + E(url) + "</title><style>iframe {width: 100vw;height: 100vh;border: 0;}body {margin: 0;overflow: hidden;}</style></head><body><iframe sandbox=\"allow-forms\" src=\"" + E(url) + "\"></iframe></body></html>"
});
},
createSauceLink: function(link, post) { createSauceLink: function(link, post) {
var a, ext, i, k, key, len1, m, part, parts, ref, ref1, ref2, skip; var a, ext, i, k, key, len1, m, part, parts, ref, ref1, ref2, skip, url;
if (!(link = link.trim())) { if (!(link = link.trim())) {
return null; return null;
} }
parts = {}; parts = {};
ref = link.split(/;(?=(?:text|boards|types):)/); ref = link.split(/;(?=(?:text|boards|types|sandbox):?)/);
for (i = k = 0, len1 = ref.length; k < len1; i = ++k) { for (i = k = 0, len1 = ref.length; k < len1; i = ++k) {
part = ref[i]; part = ref[i];
if (i === 0) { if (i === 0) {
parts['url'] = part; parts['url'] = part;
} else { } else {
m = part.match(/^(\w*):(.*)$/); m = part.match(/^(\w*):?(.*)$/);
parts[m[1]] = m[2]; parts[m[1]] = m[2];
} }
} }
@ -10644,8 +10666,12 @@
if (!(!parts['types'] || indexOf.call(parts['types'].split(','), ext) >= 0)) { if (!(!parts['types'] || indexOf.call(parts['types'].split(','), ext) >= 0)) {
return null; return null;
} }
url = parts['url'];
if (parts['sandbox'] != null) {
url = Sauce.sandbox(url);
}
a = Sauce.link.cloneNode(true); a = Sauce.link.cloneNode(true);
a.href = parts['url']; a.href = url;
a.textContent = parts['text']; a.textContent = parts['text'];
if (/^javascript:/i.test(parts['url'])) { if (/^javascript:/i.test(parts['url'])) {
a.removeAttribute('target'); a.removeAttribute('target');
@ -11082,7 +11108,7 @@
content = { content = {
innerHTML: "<html><head><title>" + E(a.dataset.uid) + "</title></head><body><script src=\"https://gist.github.com/" + E(a.dataset.uid) + ".js\"></script></body></html>" innerHTML: "<html><head><title>" + E(a.dataset.uid) + "</title></head><body><script src=\"https://gist.github.com/" + E(a.dataset.uid) + ".js\"></script></body></html>"
}; };
el.src = "data:text/html;charset=utf-8,<!doctype html>" + (encodeURIComponent(content.innerHTML)); el.src = E.url(content);
return el; return el;
}, },
title: { title: {
@ -15383,6 +15409,7 @@
}; };
Report = { Report = {
css: ':root:not(.js-enabled) #g-recaptcha {\n height: auto;\n}',
init: function() { init: function() {
var match; var match;
if (!(/\bmode=report\b/.test(location.search) && (match = location.search.match(/\bno=(\d+)/)))) { if (!(/\bmode=report\b/.test(location.search) && (match = location.search.match(/\bno=(\d+)/)))) {
@ -15392,21 +15419,28 @@
return $.ready(this.ready); return $.ready(this.ready);
}, },
ready: function() { ready: function() {
new MutationObserver(Report.resize).observe(d.body, { $.addStyle(Report.css);
childList: true,
attributes: true,
subtree: true
});
if (Conf['Archive Report']) { if (Conf['Archive Report']) {
return Report.archive(); Report.archive();
}
if ($.hasClass(doc, 'js-enabled')) {
return new MutationObserver(function() {
return Report.fit('.gc-bubbleDefault');
}).observe(d.body, {
childList: true,
attributes: true,
subtree: true
});
} else {
return Report.fit('body');
} }
}, },
resize: function() { fit: function(selector) {
var bubble, dy; var dy, el;
if (!(bubble = $('.gc-bubbleDefault'))) { if (!(el = $(selector, doc))) {
return; return;
} }
dy = bubble.getBoundingClientRect().bottom - doc.clientHeight; dy = el.getBoundingClientRect().bottom - doc.clientHeight + 8;
if (dy > 0) { if (dy > 0) {
return window.resizeBy(0, dy); return window.resizeBy(0, dy);
} }
@ -15944,7 +15978,7 @@
sauce: function(section) { sauce: function(section) {
var ta; var ta;
$.extend(section, { $.extend(section, {
innerHTML: "<div class=\"warning\"><code>Sauce</code> is disabled.</div><div>Lines starting with a <code>#</code> will be ignored.</div><div>You can specify a display text by appending <code>;text:[text]</code> to the URL.</div><div>You can specify the applicable boards by appending <code>;boards:[board1],[board2]</code>.</div><div>You can specify the applicable file types by appending <code>;types:[extension1],[extension2]</code>.</div><ul>These parameters will be replaced by their corresponding values:<li><code>%TURL</code>: Thumbnail URL.</li><li><code>%URL</code>: Full image URL.</li><li><code>%IMG</code>: Full image URL for GIF, JPG, and PNG; thumbnail URL for other types.</li><li><code>%MD5</code>: MD5 hash.</li><li><code>%name</code>: Original file name.</li><li><code>%board</code>: Current board.</li><li><code>%%</code>, <code>%semi</code>: Literal <code>%</code> and <code>;</code>.</li></ul><textarea name=\"sauces\" class=\"field\" spellcheck=\"false\"></textarea>" innerHTML: "<div class=\"warning\"><code>Sauce</code> is disabled.</div><div>Lines starting with a <code>#</code> will be ignored.</div><div>You can specify a display text by appending <code>;text:[text]</code> to the URL.</div><div>You can specify the applicable boards by appending <code>;boards:[board1],[board2]</code>.</div><div>You can specify the applicable file types by appending <code>;types:[extension1],[extension2]</code>.</div><div>You can open links with scripts and popups disabled by appending <code>;sandbox</code>.</div><ul>These parameters will be replaced by their corresponding values:<li><code>%TURL</code>: Thumbnail URL.</li><li><code>%URL</code>: Full image URL.</li><li><code>%IMG</code>: Full image URL for GIF, JPG, and PNG; thumbnail URL for other types.</li><li><code>%MD5</code>: MD5 hash.</li><li><code>%name</code>: Original file name.</li><li><code>%board</code>: Current board.</li><li><code>%%</code>, <code>%semi</code>: Literal <code>%</code> and <code>;</code>.</li></ul><textarea name=\"sauces\" class=\"field\" spellcheck=\"false\"></textarea>"
}); });
$('.warning', section).hidden = Conf['Sauce']; $('.warning', section).hidden = Conf['Sauce'];
ta = $('textarea', section); ta = $('textarea', section);
@ -16316,7 +16350,10 @@
}); });
}, },
initFeatures: function() { initFeatures: function() {
var err, feature, k, len1, name, pathname, ref, ref1; var err, feature, k, len1, name, pathname, ref, ref1, ref2;
if ((ref = location.hostname) === 'boards.4chan.org' || ref === 'sys.4chan.org') {
$.globalEval('document.documentElement.classList.add("js-enabled");');
}
switch (location.hostname) { switch (location.hostname) {
case 'a.4cdn.org': case 'a.4cdn.org':
return; return;
@ -16330,8 +16367,8 @@
$.asap((function() { $.asap((function() {
return d.readyState !== 'loading'; return d.readyState !== 'loading';
}), function() { }), function() {
var URL, pathname, ref, video; var URL, pathname, ref1, video;
if (Conf['404 Redirect'] && ((ref = d.title) === '4chan - Temporarily Offline' || ref === '4chan - 404 Not Found')) { if (Conf['404 Redirect'] && ((ref1 = d.title) === '4chan - Temporarily Offline' || ref1 === '4chan - 404 Not Found')) {
Redirect.init(); Redirect.init();
pathname = location.pathname.split('/'); pathname = location.pathname.split('/');
URL = Redirect.to('file', { URL = Redirect.to('file', {
@ -16360,9 +16397,9 @@
history.replaceState(null, '', pathname.slice(0, 4).join('/') + location.hash); history.replaceState(null, '', pathname.slice(0, 4).join('/') + location.hash);
} }
} }
ref = Main.features; ref1 = Main.features;
for (k = 0, len1 = ref.length; k < len1; k++) { for (k = 0, len1 = ref1.length; k < len1; k++) {
ref1 = ref[k], name = ref1[0], feature = ref1[1]; ref2 = ref1[k], name = ref2[0], feature = ref2[1];
try { try {
feature.init(); feature.init();
} catch (_error) { } catch (_error) {
@ -18351,13 +18388,6 @@
" float: right;\n" + " float: right;\n" +
" padding: 0 3px;\n" + " padding: 0 3px;\n" +
"}\n" + "}\n" +
"#qr .warning {\n" +
" min-height: 1.6em;\n" +
" vertical-align: middle;\n" +
" padding: 0 1px;\n" +
" border-width: 1px;\n" +
" border-style: solid;\n" +
"}\n" +
".qr-link-container {\n" + ".qr-link-container {\n" +
" text-align: center;\n" + " text-align: center;\n" +
"}\n" + "}\n" +
@ -18467,6 +18497,10 @@
".goog-bubble-content iframe {\n" + ".goog-bubble-content iframe {\n" +
" position: static !important;\n" + " position: static !important;\n" +
"}\n" + "}\n" +
"/* Prevent dragging files into captcha */\n" +
":root.dragging iframe {\n" +
" pointer-events: none;\n" +
"}\n" +
"/* File Input, Submit Button */\n" + "/* File Input, Submit Button */\n" +
"#file-n-submit {\n" + "#file-n-submit {\n" +
" display: -webkit-flex;\n" + " display: -webkit-flex;\n" +
@ -18671,6 +18705,9 @@
" right: 1px;\n" + " right: 1px;\n" +
" pointer-events: none;\n" + " pointer-events: none;\n" +
"}\n" + "}\n" +
"#char-count.warning {\n" +
" color: red;\n" +
"}\n" +
"/* Menu */\n" + "/* Menu */\n" +
".menu-button:not(.fa-bars) {\n" + ".menu-button:not(.fa-bars) {\n" +
" display: inline-block;\n" + " display: inline-block;\n" +

Binary file not shown.

View File

@ -1,7 +1,7 @@
// Generated by CoffeeScript // Generated by CoffeeScript
// ==UserScript== // ==UserScript==
// @name 4chan X // @name 4chan X
// @version 1.10.11.12 // @version 1.10.12.0
// @minGMVer 1.14 // @minGMVer 1.14
// @minFFVer 26 // @minFFVer 26
// @namespace 4chan-X // @namespace 4chan-X
@ -291,7 +291,7 @@
filesize: '', filesize: '',
MD5: '' MD5: ''
}, },
sauces: "https://www.google.com/searchbyimage?image_url=%IMG\nhttp://iqdb.org/?url=%IMG\n#//tineye.com/search?url=%IMG\n#https://www.yandex.com/images/search?rpt=imageview&img_url=%IMG\n#//saucenao.com/search.php?url=%IMG\n#http://3d.iqdb.org/?url=%IMG\n#http://regex.info/exif.cgi?imgurl=%URL\n# uploaders:\n#//imgur.com/upload?url=%URL;types:gif,jpg,png,pdf;text:Upload to imgur\n# \"View Same\" in archives:\n#https://archive.moe/_/search/image/%MD5/;text:View same on archive.moe\n#https://archive.moe/%board/search/image/%MD5/;text:View same on archive.moe/%board/;boards:a,biz,c,co,diy,fit,gd,h,i,jp,k,m,mlp,po,qa,r9k,s4s,sci,tg,u,v,vg,vp,vr,wsg\n#https://rbt.asia/%board/image/%MD5;text:View same on RBT /%board/;boards:cgl,g,mu,qa,w", sauces: "https://www.google.com/searchbyimage?image_url=%IMG\nhttp://iqdb.org/?url=%IMG\nhttp://eye.swfchan.com/search/?q=%name;types:swf;sandbox\n#//tineye.com/search?url=%IMG\n#https://www.yandex.com/images/search?rpt=imageview&img_url=%IMG\n#//saucenao.com/search.php?url=%IMG\n#http://3d.iqdb.org/?url=%IMG\n#http://regex.info/exif.cgi?imgurl=%URL\n# uploaders:\n#//imgur.com/upload?url=%URL;types:gif,jpg,png,pdf;text:Upload to imgur\n# \"View Same\" in archives:\n#https://archive.moe/_/search/image/%MD5/;text:View same on archive.moe\n#https://archive.moe/%board/search/image/%MD5/;text:View same on archive.moe/%board/;boards:a,biz,c,co,diy,fit,gd,h,i,jp,k,m,mlp,po,qa,r9k,s4s,sci,tg,u,v,vg,vp,vr,wsg\n#https://rbt.asia/%board/image/%MD5;text:View same on RBT /%board/;boards:cgl,g,mu,qa,w",
FappeT: { FappeT: {
werk: false werk: false
}, },
@ -395,7 +395,7 @@
doc = d.documentElement; doc = d.documentElement;
g = { g = {
VERSION: '1.10.11.12', VERSION: '1.10.12.0',
NAMESPACE: '4chan X.', NAMESPACE: '4chan X.',
boards: {} boards: {}
}; };
@ -429,6 +429,10 @@
return html; return html;
}; };
E.url = function(content) {
return "data:text/html;charset=utf-8,<!doctype html>" + (encodeURIComponent(content.innerHTML));
};
$ = function(selector, root) { $ = function(selector, root) {
if (root == null) { if (root == null) {
root = d.body; root = d.body;
@ -6709,7 +6713,6 @@
if (g.VIEW === 'archive') { if (g.VIEW === 'archive') {
return; return;
} }
$.globalEval('document.documentElement.classList.add("js-enabled");');
noscript = Conf['Force Noscript Captcha'] || !$.hasClass(doc, 'js-enabled'); noscript = Conf['Force Noscript Captcha'] || !$.hasClass(doc, 'js-enabled');
this.captcha = Captcha[noscript ? 'noscript' : 'v2']; this.captcha = Captcha[noscript ? 'noscript' : 'v2'];
$.on(d, '4chanXInitFinished', this.initReady); $.on(d, '4chanXInitFinished', this.initReady);
@ -6782,6 +6785,8 @@
$.on(d, 'dragover', QR.dragOver); $.on(d, 'dragover', QR.dragOver);
$.on(d, 'drop', QR.dropFile); $.on(d, 'drop', QR.dropFile);
$.on(d, 'dragstart dragend', QR.drag); $.on(d, 'dragstart dragend', QR.drag);
$.on(d, 'dragenter', QR.dragEnter);
$.on(d, 'dragleave', QR.dragLeave);
$.on(d, 'IndexRefresh', QR.generatePostableThreadsList); $.on(d, 'IndexRefresh', QR.generatePostableThreadsList);
$.on(d, 'ThreadUpdate', QR.statusCheck); $.on(d, 'ThreadUpdate', QR.statusCheck);
if (!Conf['Persistent QR']) { if (!Conf['Persistent QR']) {
@ -7062,10 +7067,10 @@
characterCount: function() { characterCount: function() {
var count, counter; var count, counter;
counter = QR.nodes.charCount; counter = QR.nodes.charCount;
count = QR.nodes.com.textLength; count = QR.nodes.com.value.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, '_').length;
counter.textContent = count; counter.textContent = count;
counter.hidden = count < 1000; counter.hidden = count < 1000;
return (count > 1500 ? $.addClass : $.rmClass)(counter, 'warning'); return (count > 2000 ? $.addClass : $.rmClass)(counter, 'warning');
}, },
getFile: function() { getFile: function() {
var ref; var ref;
@ -7091,6 +7096,8 @@
return e.dataTransfer.dropEffect = 'copy'; return e.dataTransfer.dropEffect = 'copy';
}, },
dropFile: function(e) { dropFile: function(e) {
delete QR.dragTarget;
$.rmClass(doc, 'dragging');
if (!e.dataTransfer.files.length) { if (!e.dataTransfer.files.length) {
return; return;
} }
@ -7098,6 +7105,16 @@
QR.open(); QR.open();
return QR.handleFiles(e.dataTransfer.files); return QR.handleFiles(e.dataTransfer.files);
}, },
dragEnter: function(e) {
QR.dragTarget = e.target;
return $.addClass(doc, 'dragging');
},
dragLeave: function(e) {
if (QR.dragTarget === e.target) {
delete QR.dragTarget;
return $.rmClass(doc, 'dragging');
}
},
paste: function(e) { paste: function(e) {
var blob, files, item, k, len1, ref; var blob, files, item, k, len1, ref;
if (!e.clipboardData.items) { if (!e.clipboardData.items) {
@ -10589,19 +10606,24 @@
cb: this.node cb: this.node
}); });
}, },
sandbox: function(url) {
return E.url({
innerHTML: "<html><head><title>[sb] " + E(url) + "</title><style>iframe {width: 100vw;height: 100vh;border: 0;}body {margin: 0;overflow: hidden;}</style></head><body><iframe sandbox=\"allow-forms\" src=\"" + E(url) + "\"></iframe></body></html>"
});
},
createSauceLink: function(link, post) { createSauceLink: function(link, post) {
var a, ext, i, k, key, len1, m, part, parts, ref, ref1, ref2, skip; var a, ext, i, k, key, len1, m, part, parts, ref, ref1, ref2, skip, url;
if (!(link = link.trim())) { if (!(link = link.trim())) {
return null; return null;
} }
parts = {}; parts = {};
ref = link.split(/;(?=(?:text|boards|types):)/); ref = link.split(/;(?=(?:text|boards|types|sandbox):?)/);
for (i = k = 0, len1 = ref.length; k < len1; i = ++k) { for (i = k = 0, len1 = ref.length; k < len1; i = ++k) {
part = ref[i]; part = ref[i];
if (i === 0) { if (i === 0) {
parts['url'] = part; parts['url'] = part;
} else { } else {
m = part.match(/^(\w*):(.*)$/); m = part.match(/^(\w*):?(.*)$/);
parts[m[1]] = m[2]; parts[m[1]] = m[2];
} }
} }
@ -10643,8 +10665,12 @@
if (!(!parts['types'] || indexOf.call(parts['types'].split(','), ext) >= 0)) { if (!(!parts['types'] || indexOf.call(parts['types'].split(','), ext) >= 0)) {
return null; return null;
} }
url = parts['url'];
if (parts['sandbox'] != null) {
url = Sauce.sandbox(url);
}
a = Sauce.link.cloneNode(true); a = Sauce.link.cloneNode(true);
a.href = parts['url']; a.href = url;
a.textContent = parts['text']; a.textContent = parts['text'];
if (/^javascript:/i.test(parts['url'])) { if (/^javascript:/i.test(parts['url'])) {
a.removeAttribute('target'); a.removeAttribute('target');
@ -11081,7 +11107,7 @@
content = { content = {
innerHTML: "<html><head><title>" + E(a.dataset.uid) + "</title></head><body><script src=\"https://gist.github.com/" + E(a.dataset.uid) + ".js\"></script></body></html>" innerHTML: "<html><head><title>" + E(a.dataset.uid) + "</title></head><body><script src=\"https://gist.github.com/" + E(a.dataset.uid) + ".js\"></script></body></html>"
}; };
el.src = "data:text/html;charset=utf-8,<!doctype html>" + (encodeURIComponent(content.innerHTML)); el.src = E.url(content);
return el; return el;
}, },
title: { title: {
@ -15382,6 +15408,7 @@
}; };
Report = { Report = {
css: ':root:not(.js-enabled) #g-recaptcha {\n height: auto;\n}',
init: function() { init: function() {
var match; var match;
if (!(/\bmode=report\b/.test(location.search) && (match = location.search.match(/\bno=(\d+)/)))) { if (!(/\bmode=report\b/.test(location.search) && (match = location.search.match(/\bno=(\d+)/)))) {
@ -15391,21 +15418,28 @@
return $.ready(this.ready); return $.ready(this.ready);
}, },
ready: function() { ready: function() {
new MutationObserver(Report.resize).observe(d.body, { $.addStyle(Report.css);
childList: true,
attributes: true,
subtree: true
});
if (Conf['Archive Report']) { if (Conf['Archive Report']) {
return Report.archive(); Report.archive();
}
if ($.hasClass(doc, 'js-enabled')) {
return new MutationObserver(function() {
return Report.fit('.gc-bubbleDefault');
}).observe(d.body, {
childList: true,
attributes: true,
subtree: true
});
} else {
return Report.fit('body');
} }
}, },
resize: function() { fit: function(selector) {
var bubble, dy; var dy, el;
if (!(bubble = $('.gc-bubbleDefault'))) { if (!(el = $(selector, doc))) {
return; return;
} }
dy = bubble.getBoundingClientRect().bottom - doc.clientHeight; dy = el.getBoundingClientRect().bottom - doc.clientHeight + 8;
if (dy > 0) { if (dy > 0) {
return window.resizeBy(0, dy); return window.resizeBy(0, dy);
} }
@ -15943,7 +15977,7 @@
sauce: function(section) { sauce: function(section) {
var ta; var ta;
$.extend(section, { $.extend(section, {
innerHTML: "<div class=\"warning\"><code>Sauce</code> is disabled.</div><div>Lines starting with a <code>#</code> will be ignored.</div><div>You can specify a display text by appending <code>;text:[text]</code> to the URL.</div><div>You can specify the applicable boards by appending <code>;boards:[board1],[board2]</code>.</div><div>You can specify the applicable file types by appending <code>;types:[extension1],[extension2]</code>.</div><ul>These parameters will be replaced by their corresponding values:<li><code>%TURL</code>: Thumbnail URL.</li><li><code>%URL</code>: Full image URL.</li><li><code>%IMG</code>: Full image URL for GIF, JPG, and PNG; thumbnail URL for other types.</li><li><code>%MD5</code>: MD5 hash.</li><li><code>%name</code>: Original file name.</li><li><code>%board</code>: Current board.</li><li><code>%%</code>, <code>%semi</code>: Literal <code>%</code> and <code>;</code>.</li></ul><textarea name=\"sauces\" class=\"field\" spellcheck=\"false\"></textarea>" innerHTML: "<div class=\"warning\"><code>Sauce</code> is disabled.</div><div>Lines starting with a <code>#</code> will be ignored.</div><div>You can specify a display text by appending <code>;text:[text]</code> to the URL.</div><div>You can specify the applicable boards by appending <code>;boards:[board1],[board2]</code>.</div><div>You can specify the applicable file types by appending <code>;types:[extension1],[extension2]</code>.</div><div>You can open links with scripts and popups disabled by appending <code>;sandbox</code>.</div><ul>These parameters will be replaced by their corresponding values:<li><code>%TURL</code>: Thumbnail URL.</li><li><code>%URL</code>: Full image URL.</li><li><code>%IMG</code>: Full image URL for GIF, JPG, and PNG; thumbnail URL for other types.</li><li><code>%MD5</code>: MD5 hash.</li><li><code>%name</code>: Original file name.</li><li><code>%board</code>: Current board.</li><li><code>%%</code>, <code>%semi</code>: Literal <code>%</code> and <code>;</code>.</li></ul><textarea name=\"sauces\" class=\"field\" spellcheck=\"false\"></textarea>"
}); });
$('.warning', section).hidden = Conf['Sauce']; $('.warning', section).hidden = Conf['Sauce'];
ta = $('textarea', section); ta = $('textarea', section);
@ -16315,7 +16349,10 @@
}); });
}, },
initFeatures: function() { initFeatures: function() {
var err, feature, k, len1, name, pathname, ref, ref1; var err, feature, k, len1, name, pathname, ref, ref1, ref2;
if ((ref = location.hostname) === 'boards.4chan.org' || ref === 'sys.4chan.org') {
$.globalEval('document.documentElement.classList.add("js-enabled");');
}
switch (location.hostname) { switch (location.hostname) {
case 'a.4cdn.org': case 'a.4cdn.org':
return; return;
@ -16329,8 +16366,8 @@
$.asap((function() { $.asap((function() {
return d.readyState !== 'loading'; return d.readyState !== 'loading';
}), function() { }), function() {
var URL, pathname, ref, video; var URL, pathname, ref1, video;
if (Conf['404 Redirect'] && ((ref = d.title) === '4chan - Temporarily Offline' || ref === '4chan - 404 Not Found')) { if (Conf['404 Redirect'] && ((ref1 = d.title) === '4chan - Temporarily Offline' || ref1 === '4chan - 404 Not Found')) {
Redirect.init(); Redirect.init();
pathname = location.pathname.split('/'); pathname = location.pathname.split('/');
URL = Redirect.to('file', { URL = Redirect.to('file', {
@ -16359,9 +16396,9 @@
history.replaceState(null, '', pathname.slice(0, 4).join('/') + location.hash); history.replaceState(null, '', pathname.slice(0, 4).join('/') + location.hash);
} }
} }
ref = Main.features; ref1 = Main.features;
for (k = 0, len1 = ref.length; k < len1; k++) { for (k = 0, len1 = ref1.length; k < len1; k++) {
ref1 = ref[k], name = ref1[0], feature = ref1[1]; ref2 = ref1[k], name = ref2[0], feature = ref2[1];
try { try {
feature.init(); feature.init();
} catch (_error) { } catch (_error) {
@ -18350,13 +18387,6 @@
" float: right;\n" + " float: right;\n" +
" padding: 0 3px;\n" + " padding: 0 3px;\n" +
"}\n" + "}\n" +
"#qr .warning {\n" +
" min-height: 1.6em;\n" +
" vertical-align: middle;\n" +
" padding: 0 1px;\n" +
" border-width: 1px;\n" +
" border-style: solid;\n" +
"}\n" +
".qr-link-container {\n" + ".qr-link-container {\n" +
" text-align: center;\n" + " text-align: center;\n" +
"}\n" + "}\n" +
@ -18466,6 +18496,10 @@
".goog-bubble-content iframe {\n" + ".goog-bubble-content iframe {\n" +
" position: static !important;\n" + " position: static !important;\n" +
"}\n" + "}\n" +
"/* Prevent dragging files into captcha */\n" +
":root.dragging iframe {\n" +
" pointer-events: none;\n" +
"}\n" +
"/* File Input, Submit Button */\n" + "/* File Input, Submit Button */\n" +
"#file-n-submit {\n" + "#file-n-submit {\n" +
" display: -webkit-flex;\n" + " display: -webkit-flex;\n" +
@ -18670,6 +18704,9 @@
" right: 1px;\n" + " right: 1px;\n" +
" pointer-events: none;\n" + " pointer-events: none;\n" +
"}\n" + "}\n" +
"#char-count.warning {\n" +
" color: red;\n" +
"}\n" +
"/* Menu */\n" + "/* Menu */\n" +
".menu-button:not(.fa-bars) {\n" + ".menu-button:not(.fa-bars) {\n" +
" display: inline-block;\n" + " display: inline-block;\n" +

Binary file not shown.

View File

@ -1,6 +1,6 @@
// ==UserScript== // ==UserScript==
// @name 4chan X // @name 4chan X
// @version 1.10.11.12 // @version 1.10.12.0
// @minGMVer 1.14 // @minGMVer 1.14
// @minFFVer 26 // @minFFVer 26
// @namespace 4chan-X // @namespace 4chan-X

View File

@ -1,7 +1,7 @@
// Generated by CoffeeScript // Generated by CoffeeScript
// ==UserScript== // ==UserScript==
// @name 4chan X // @name 4chan X
// @version 1.10.11.12 // @version 1.10.12.0
// @minGMVer 1.14 // @minGMVer 1.14
// @minFFVer 26 // @minFFVer 26
// @namespace 4chan-X // @namespace 4chan-X
@ -292,7 +292,7 @@
filesize: '', filesize: '',
MD5: '' MD5: ''
}, },
sauces: "https://www.google.com/searchbyimage?image_url=%IMG\nhttp://iqdb.org/?url=%IMG\n#//tineye.com/search?url=%IMG\n#https://www.yandex.com/images/search?rpt=imageview&img_url=%IMG\n#//saucenao.com/search.php?url=%IMG\n#http://3d.iqdb.org/?url=%IMG\n#http://regex.info/exif.cgi?imgurl=%URL\n# uploaders:\n#//imgur.com/upload?url=%URL;types:gif,jpg,png,pdf;text:Upload to imgur\n# \"View Same\" in archives:\n#https://archive.moe/_/search/image/%MD5/;text:View same on archive.moe\n#https://archive.moe/%board/search/image/%MD5/;text:View same on archive.moe/%board/;boards:a,biz,c,co,diy,fit,gd,h,i,jp,k,m,mlp,po,qa,r9k,s4s,sci,tg,u,v,vg,vp,vr,wsg\n#https://rbt.asia/%board/image/%MD5;text:View same on RBT /%board/;boards:cgl,g,mu,qa,w", sauces: "https://www.google.com/searchbyimage?image_url=%IMG\nhttp://iqdb.org/?url=%IMG\nhttp://eye.swfchan.com/search/?q=%name;types:swf;sandbox\n#//tineye.com/search?url=%IMG\n#https://www.yandex.com/images/search?rpt=imageview&img_url=%IMG\n#//saucenao.com/search.php?url=%IMG\n#http://3d.iqdb.org/?url=%IMG\n#http://regex.info/exif.cgi?imgurl=%URL\n# uploaders:\n#//imgur.com/upload?url=%URL;types:gif,jpg,png,pdf;text:Upload to imgur\n# \"View Same\" in archives:\n#https://archive.moe/_/search/image/%MD5/;text:View same on archive.moe\n#https://archive.moe/%board/search/image/%MD5/;text:View same on archive.moe/%board/;boards:a,biz,c,co,diy,fit,gd,h,i,jp,k,m,mlp,po,qa,r9k,s4s,sci,tg,u,v,vg,vp,vr,wsg\n#https://rbt.asia/%board/image/%MD5;text:View same on RBT /%board/;boards:cgl,g,mu,qa,w",
FappeT: { FappeT: {
werk: false werk: false
}, },
@ -396,7 +396,7 @@
doc = d.documentElement; doc = d.documentElement;
g = { g = {
VERSION: '1.10.11.12', VERSION: '1.10.12.0',
NAMESPACE: '4chan X.', NAMESPACE: '4chan X.',
boards: {} boards: {}
}; };
@ -430,6 +430,10 @@
return html; return html;
}; };
E.url = function(content) {
return "data:text/html;charset=utf-8,<!doctype html>" + (encodeURIComponent(content.innerHTML));
};
$ = function(selector, root) { $ = function(selector, root) {
if (root == null) { if (root == null) {
root = d.body; root = d.body;
@ -6710,7 +6714,6 @@
if (g.VIEW === 'archive') { if (g.VIEW === 'archive') {
return; return;
} }
$.globalEval('document.documentElement.classList.add("js-enabled");');
noscript = Conf['Force Noscript Captcha'] || !$.hasClass(doc, 'js-enabled'); noscript = Conf['Force Noscript Captcha'] || !$.hasClass(doc, 'js-enabled');
this.captcha = Captcha[noscript ? 'noscript' : 'v2']; this.captcha = Captcha[noscript ? 'noscript' : 'v2'];
$.on(d, '4chanXInitFinished', this.initReady); $.on(d, '4chanXInitFinished', this.initReady);
@ -6783,6 +6786,8 @@
$.on(d, 'dragover', QR.dragOver); $.on(d, 'dragover', QR.dragOver);
$.on(d, 'drop', QR.dropFile); $.on(d, 'drop', QR.dropFile);
$.on(d, 'dragstart dragend', QR.drag); $.on(d, 'dragstart dragend', QR.drag);
$.on(d, 'dragenter', QR.dragEnter);
$.on(d, 'dragleave', QR.dragLeave);
$.on(d, 'IndexRefresh', QR.generatePostableThreadsList); $.on(d, 'IndexRefresh', QR.generatePostableThreadsList);
$.on(d, 'ThreadUpdate', QR.statusCheck); $.on(d, 'ThreadUpdate', QR.statusCheck);
if (!Conf['Persistent QR']) { if (!Conf['Persistent QR']) {
@ -7063,10 +7068,10 @@
characterCount: function() { characterCount: function() {
var count, counter; var count, counter;
counter = QR.nodes.charCount; counter = QR.nodes.charCount;
count = QR.nodes.com.textLength; count = QR.nodes.com.value.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, '_').length;
counter.textContent = count; counter.textContent = count;
counter.hidden = count < 1000; counter.hidden = count < 1000;
return (count > 1500 ? $.addClass : $.rmClass)(counter, 'warning'); return (count > 2000 ? $.addClass : $.rmClass)(counter, 'warning');
}, },
getFile: function() { getFile: function() {
var ref; var ref;
@ -7092,6 +7097,8 @@
return e.dataTransfer.dropEffect = 'copy'; return e.dataTransfer.dropEffect = 'copy';
}, },
dropFile: function(e) { dropFile: function(e) {
delete QR.dragTarget;
$.rmClass(doc, 'dragging');
if (!e.dataTransfer.files.length) { if (!e.dataTransfer.files.length) {
return; return;
} }
@ -7099,6 +7106,16 @@
QR.open(); QR.open();
return QR.handleFiles(e.dataTransfer.files); return QR.handleFiles(e.dataTransfer.files);
}, },
dragEnter: function(e) {
QR.dragTarget = e.target;
return $.addClass(doc, 'dragging');
},
dragLeave: function(e) {
if (QR.dragTarget === e.target) {
delete QR.dragTarget;
return $.rmClass(doc, 'dragging');
}
},
paste: function(e) { paste: function(e) {
var blob, files, item, k, len1, ref; var blob, files, item, k, len1, ref;
if (!e.clipboardData.items) { if (!e.clipboardData.items) {
@ -10590,19 +10607,24 @@
cb: this.node cb: this.node
}); });
}, },
sandbox: function(url) {
return E.url({
innerHTML: "<html><head><title>[sb] " + E(url) + "</title><style>iframe {width: 100vw;height: 100vh;border: 0;}body {margin: 0;overflow: hidden;}</style></head><body><iframe sandbox=\"allow-forms\" src=\"" + E(url) + "\"></iframe></body></html>"
});
},
createSauceLink: function(link, post) { createSauceLink: function(link, post) {
var a, ext, i, k, key, len1, m, part, parts, ref, ref1, ref2, skip; var a, ext, i, k, key, len1, m, part, parts, ref, ref1, ref2, skip, url;
if (!(link = link.trim())) { if (!(link = link.trim())) {
return null; return null;
} }
parts = {}; parts = {};
ref = link.split(/;(?=(?:text|boards|types):)/); ref = link.split(/;(?=(?:text|boards|types|sandbox):?)/);
for (i = k = 0, len1 = ref.length; k < len1; i = ++k) { for (i = k = 0, len1 = ref.length; k < len1; i = ++k) {
part = ref[i]; part = ref[i];
if (i === 0) { if (i === 0) {
parts['url'] = part; parts['url'] = part;
} else { } else {
m = part.match(/^(\w*):(.*)$/); m = part.match(/^(\w*):?(.*)$/);
parts[m[1]] = m[2]; parts[m[1]] = m[2];
} }
} }
@ -10644,8 +10666,12 @@
if (!(!parts['types'] || indexOf.call(parts['types'].split(','), ext) >= 0)) { if (!(!parts['types'] || indexOf.call(parts['types'].split(','), ext) >= 0)) {
return null; return null;
} }
url = parts['url'];
if (parts['sandbox'] != null) {
url = Sauce.sandbox(url);
}
a = Sauce.link.cloneNode(true); a = Sauce.link.cloneNode(true);
a.href = parts['url']; a.href = url;
a.textContent = parts['text']; a.textContent = parts['text'];
if (/^javascript:/i.test(parts['url'])) { if (/^javascript:/i.test(parts['url'])) {
a.removeAttribute('target'); a.removeAttribute('target');
@ -11082,7 +11108,7 @@
content = { content = {
innerHTML: "<html><head><title>" + E(a.dataset.uid) + "</title></head><body><script src=\"https://gist.github.com/" + E(a.dataset.uid) + ".js\"></script></body></html>" innerHTML: "<html><head><title>" + E(a.dataset.uid) + "</title></head><body><script src=\"https://gist.github.com/" + E(a.dataset.uid) + ".js\"></script></body></html>"
}; };
el.src = "data:text/html;charset=utf-8,<!doctype html>" + (encodeURIComponent(content.innerHTML)); el.src = E.url(content);
return el; return el;
}, },
title: { title: {
@ -15383,6 +15409,7 @@
}; };
Report = { Report = {
css: ':root:not(.js-enabled) #g-recaptcha {\n height: auto;\n}',
init: function() { init: function() {
var match; var match;
if (!(/\bmode=report\b/.test(location.search) && (match = location.search.match(/\bno=(\d+)/)))) { if (!(/\bmode=report\b/.test(location.search) && (match = location.search.match(/\bno=(\d+)/)))) {
@ -15392,21 +15419,28 @@
return $.ready(this.ready); return $.ready(this.ready);
}, },
ready: function() { ready: function() {
new MutationObserver(Report.resize).observe(d.body, { $.addStyle(Report.css);
childList: true,
attributes: true,
subtree: true
});
if (Conf['Archive Report']) { if (Conf['Archive Report']) {
return Report.archive(); Report.archive();
}
if ($.hasClass(doc, 'js-enabled')) {
return new MutationObserver(function() {
return Report.fit('.gc-bubbleDefault');
}).observe(d.body, {
childList: true,
attributes: true,
subtree: true
});
} else {
return Report.fit('body');
} }
}, },
resize: function() { fit: function(selector) {
var bubble, dy; var dy, el;
if (!(bubble = $('.gc-bubbleDefault'))) { if (!(el = $(selector, doc))) {
return; return;
} }
dy = bubble.getBoundingClientRect().bottom - doc.clientHeight; dy = el.getBoundingClientRect().bottom - doc.clientHeight + 8;
if (dy > 0) { if (dy > 0) {
return window.resizeBy(0, dy); return window.resizeBy(0, dy);
} }
@ -15944,7 +15978,7 @@
sauce: function(section) { sauce: function(section) {
var ta; var ta;
$.extend(section, { $.extend(section, {
innerHTML: "<div class=\"warning\"><code>Sauce</code> is disabled.</div><div>Lines starting with a <code>#</code> will be ignored.</div><div>You can specify a display text by appending <code>;text:[text]</code> to the URL.</div><div>You can specify the applicable boards by appending <code>;boards:[board1],[board2]</code>.</div><div>You can specify the applicable file types by appending <code>;types:[extension1],[extension2]</code>.</div><ul>These parameters will be replaced by their corresponding values:<li><code>%TURL</code>: Thumbnail URL.</li><li><code>%URL</code>: Full image URL.</li><li><code>%IMG</code>: Full image URL for GIF, JPG, and PNG; thumbnail URL for other types.</li><li><code>%MD5</code>: MD5 hash.</li><li><code>%name</code>: Original file name.</li><li><code>%board</code>: Current board.</li><li><code>%%</code>, <code>%semi</code>: Literal <code>%</code> and <code>;</code>.</li></ul><textarea name=\"sauces\" class=\"field\" spellcheck=\"false\"></textarea>" innerHTML: "<div class=\"warning\"><code>Sauce</code> is disabled.</div><div>Lines starting with a <code>#</code> will be ignored.</div><div>You can specify a display text by appending <code>;text:[text]</code> to the URL.</div><div>You can specify the applicable boards by appending <code>;boards:[board1],[board2]</code>.</div><div>You can specify the applicable file types by appending <code>;types:[extension1],[extension2]</code>.</div><div>You can open links with scripts and popups disabled by appending <code>;sandbox</code>.</div><ul>These parameters will be replaced by their corresponding values:<li><code>%TURL</code>: Thumbnail URL.</li><li><code>%URL</code>: Full image URL.</li><li><code>%IMG</code>: Full image URL for GIF, JPG, and PNG; thumbnail URL for other types.</li><li><code>%MD5</code>: MD5 hash.</li><li><code>%name</code>: Original file name.</li><li><code>%board</code>: Current board.</li><li><code>%%</code>, <code>%semi</code>: Literal <code>%</code> and <code>;</code>.</li></ul><textarea name=\"sauces\" class=\"field\" spellcheck=\"false\"></textarea>"
}); });
$('.warning', section).hidden = Conf['Sauce']; $('.warning', section).hidden = Conf['Sauce'];
ta = $('textarea', section); ta = $('textarea', section);
@ -16316,7 +16350,10 @@
}); });
}, },
initFeatures: function() { initFeatures: function() {
var err, feature, k, len1, name, pathname, ref, ref1; var err, feature, k, len1, name, pathname, ref, ref1, ref2;
if ((ref = location.hostname) === 'boards.4chan.org' || ref === 'sys.4chan.org') {
$.globalEval('document.documentElement.classList.add("js-enabled");');
}
switch (location.hostname) { switch (location.hostname) {
case 'a.4cdn.org': case 'a.4cdn.org':
return; return;
@ -16330,8 +16367,8 @@
$.asap((function() { $.asap((function() {
return d.readyState !== 'loading'; return d.readyState !== 'loading';
}), function() { }), function() {
var URL, pathname, ref, video; var URL, pathname, ref1, video;
if (Conf['404 Redirect'] && ((ref = d.title) === '4chan - Temporarily Offline' || ref === '4chan - 404 Not Found')) { if (Conf['404 Redirect'] && ((ref1 = d.title) === '4chan - Temporarily Offline' || ref1 === '4chan - 404 Not Found')) {
Redirect.init(); Redirect.init();
pathname = location.pathname.split('/'); pathname = location.pathname.split('/');
URL = Redirect.to('file', { URL = Redirect.to('file', {
@ -16360,9 +16397,9 @@
history.replaceState(null, '', pathname.slice(0, 4).join('/') + location.hash); history.replaceState(null, '', pathname.slice(0, 4).join('/') + location.hash);
} }
} }
ref = Main.features; ref1 = Main.features;
for (k = 0, len1 = ref.length; k < len1; k++) { for (k = 0, len1 = ref1.length; k < len1; k++) {
ref1 = ref[k], name = ref1[0], feature = ref1[1]; ref2 = ref1[k], name = ref2[0], feature = ref2[1];
try { try {
feature.init(); feature.init();
} catch (_error) { } catch (_error) {
@ -18351,13 +18388,6 @@
" float: right;\n" + " float: right;\n" +
" padding: 0 3px;\n" + " padding: 0 3px;\n" +
"}\n" + "}\n" +
"#qr .warning {\n" +
" min-height: 1.6em;\n" +
" vertical-align: middle;\n" +
" padding: 0 1px;\n" +
" border-width: 1px;\n" +
" border-style: solid;\n" +
"}\n" +
".qr-link-container {\n" + ".qr-link-container {\n" +
" text-align: center;\n" + " text-align: center;\n" +
"}\n" + "}\n" +
@ -18467,6 +18497,10 @@
".goog-bubble-content iframe {\n" + ".goog-bubble-content iframe {\n" +
" position: static !important;\n" + " position: static !important;\n" +
"}\n" + "}\n" +
"/* Prevent dragging files into captcha */\n" +
":root.dragging iframe {\n" +
" pointer-events: none;\n" +
"}\n" +
"/* File Input, Submit Button */\n" + "/* File Input, Submit Button */\n" +
"#file-n-submit {\n" + "#file-n-submit {\n" +
" display: -webkit-flex;\n" + " display: -webkit-flex;\n" +
@ -18671,6 +18705,9 @@
" right: 1px;\n" + " right: 1px;\n" +
" pointer-events: none;\n" + " pointer-events: none;\n" +
"}\n" + "}\n" +
"#char-count.warning {\n" +
" color: red;\n" +
"}\n" +
"/* Menu */\n" + "/* Menu */\n" +
".menu-button:not(.fa-bars) {\n" + ".menu-button:not(.fa-bars) {\n" +
" display: inline-block;\n" + " display: inline-block;\n" +

Binary file not shown.

View File

@ -1,7 +1,7 @@
<?xml version='1.0' encoding='UTF-8'?> <?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'> <gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
<app appid='lacclbnghgdicfifcamcmcnilckjamag'> <app appid='lacclbnghgdicfifcamcmcnilckjamag'>
<updatecheck codebase='https://ccd0.github.io/4chan-x/builds/4chan-X-beta.crx' version='1.10.11.12' /> <updatecheck codebase='https://ccd0.github.io/4chan-x/builds/4chan-X-beta.crx' version='1.10.12.0' />
</app> </app>
</gupdate> </gupdate>

View File

@ -1,7 +1,7 @@
<?xml version='1.0' encoding='UTF-8'?> <?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'> <gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
<app appid='lacclbnghgdicfifcamcmcnilckjamag'> <app appid='lacclbnghgdicfifcamcmcnilckjamag'>
<updatecheck codebase='https://ccd0.github.io/4chan-x/builds/4chan-X.crx' version='1.10.11.12' /> <updatecheck codebase='https://ccd0.github.io/4chan-x/builds/4chan-X.crx' version='1.10.12.0' />
</app> </app>
</gupdate> </gupdate>

View File

@ -3,8 +3,8 @@
"description": "Cross-browser userscript for maximum lurking on 4chan.", "description": "Cross-browser userscript for maximum lurking on 4chan.",
"meta": { "meta": {
"name": "4chan X", "name": "4chan X",
"version": "1.10.11.12", "version": "1.10.12.0",
"date": "2015-05-03T22:48:31.015Z", "date": "2015-05-05T03:30:07.989Z",
"repo": "https://github.com/ccd0/4chan-x/", "repo": "https://github.com/ccd0/4chan-x/",
"page": "https://github.com/ccd0/4chan-x", "page": "https://github.com/ccd0/4chan-x",
"downloads": "https://ccd0.github.io/4chan-x/builds/", "downloads": "https://ccd0.github.io/4chan-x/builds/",