Release 4chan X v1.9.1.0.

This commit is contained in:
ccd0 2014-08-31 23:20:41 -07:00
parent 7d6566b4cb
commit 741cee51f9
14 changed files with 370 additions and 276 deletions

View File

@ -1,3 +1,13 @@
### v1.9.1.0
*2014-08-31*
**ccd0**
- Work around restriction on loading HTTP content from HTTPS pages in Chromium.
This applies to files posted via the `Post from URL` mechanism and posts loaded from HTTP-only archives if `Except Archives from Encryption` is selected.
Although not done using this workaround, 4chan X also requests HTTP content from HTTPS pages when you embed content from HTTP-only sites such as Vocaroo.
- Start GIF/WebM files from the beginning when re-opened via inlining or hover view. Inlining a GIF/WebM that you are already watching via hover view does not restart it.
- Fix a bug that sometimes caused the QR's captcha response line to be pushed offscreen when a captcha was loaded.
### v1.9.0.6
*2014-08-31*

View File

@ -1,5 +1,5 @@
/*
* 4chan X - Version 1.9.0.6
* 4chan X - Version 1.9.1.0
*
* Licensed under the MIT license.
* https://github.com/ccd0/4chan-x/blob/master/LICENSE

Binary file not shown.

View File

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

View File

@ -1,7 +1,7 @@
// Generated by CoffeeScript
// ==UserScript==
// @name 4chan X
// @version 1.9.0.6
// @version 1.9.1.0
// @minGMVer 1.14
// @minFFVer 26
// @namespace 4chan-X
@ -24,7 +24,7 @@
// ==/UserScript==
/*
* 4chan X - Version 1.9.0.6
* 4chan X - Version 1.9.1.0
*
* Licensed under the MIT license.
* https://github.com/ccd0/4chan-x/blob/master/LICENSE
@ -374,7 +374,7 @@
doc = d.documentElement;
g = {
VERSION: '1.9.0.6',
VERSION: '1.9.1.0',
NAMESPACE: '4chan X.',
NAME: '4chan X',
FAQ: 'https://github.com/ccd0/4chan-x/wiki/Frequently-Asked-Questions',
@ -1359,6 +1359,7 @@
if ((_ref4 = this.file.fullImage) != null) {
_ref4.removeAttribute('id');
}
delete file.isHovered;
}
if (origin.isDead) {
this.isDead = true;
@ -4010,14 +4011,21 @@
}
};
drag = function(e) {
var bottom, clientX, clientY, left, right, style, top;
var bottom, clientX, clientY, left, right, style, top, x, y;
clientX = e.clientX, clientY = e.clientY;
left = clientX - this.dx;
left = left < 10 ? 0 : this.width - left < 10 ? null : left / this.screenWidth * 100 + '%';
top = clientY - this.dy;
top = top < (10 + this.topBorder) ? this.topBorder + 'px' : this.height - top < (10 + this.bottomBorder) ? null : top / this.screenHeight * 100 + '%';
right = left === null ? 0 : null;
bottom = top === null ? this.bottomBorder + 'px' : null;
x = clientX - this.dx;
y = clientY - this.dy;
left = right = top = bottom = null;
if (x <= this.width / 2) {
left = x < 10 ? '0px' : x / this.screenWidth * 100 + '%';
} else {
right = this.width - x < 10 ? '0px' : (this.width - x) / this.screenWidth * 100 + '%';
}
if (y <= this.height / 2) {
top = y < 10 + this.topBorder ? this.topBorder + 'px' : y / this.screenHeight * 100 + '%';
} else {
bottom = this.height - y < 10 + this.bottomBorder ? this.bottomBorder + 'px' : (this.height - y) / this.screenHeight * 100 + '%';
}
style = this.style;
style.left = left;
style.right = right;
@ -4130,85 +4138,87 @@
};
})();
CrossOrigin = {
file: (function() {
var makeBlob;
makeBlob = function(urlBlob, contentType, contentDisposition, url) {
var blob, match, mime, name, _ref, _ref1, _ref2;
name = (_ref = url.match(/([^\/]+)\/*$/)) != null ? _ref[1] : void 0;
mime = (contentType != null ? contentType.match(/[^;]*/)[0] : void 0) || 'application/octet-stream';
match = (contentDisposition != null ? (_ref1 = contentDisposition.match(/\bfilename\s*=\s*"((\\"|[^"])+)"/i)) != null ? _ref1[1] : void 0 : void 0) || (contentType != null ? (_ref2 = contentType.match(/\bname\s*=\s*"((\\"|[^"])+)"/i)) != null ? _ref2[1] : void 0 : void 0);
if (match) {
name = match.replace(/\\"/g, '"');
}
blob = new Blob([urlBlob], {
type: mime
});
blob.name = name;
return blob;
};
return function(url, cb) {
return GM_xmlhttpRequest({
method: "GET",
url: url,
overrideMimeType: "text/plain; charset=x-user-defined",
onload: function(xhr) {
var contentDisposition, contentType, data, i, r, _ref, _ref1;
r = xhr.responseText;
data = new Uint8Array(r.length);
i = 0;
while (i < r.length) {
data[i] = r.charCodeAt(i);
i++;
}
contentType = (_ref = xhr.responseHeaders.match(/Content-Type:\s*(.*)/i)) != null ? _ref[1] : void 0;
contentDisposition = (_ref1 = xhr.responseHeaders.match(/Content-Disposition:\s*(.*)/i)) != null ? _ref1[1] : void 0;
return cb(makeBlob(data, contentType, contentDisposition, url));
},
onerror: function() {
return cb(null);
CrossOrigin = (function() {
return {
file: (function() {
var makeBlob;
makeBlob = function(urlBlob, contentType, contentDisposition, url) {
var blob, match, mime, name, _ref, _ref1, _ref2;
name = (_ref = url.match(/([^\/]+)\/*$/)) != null ? _ref[1] : void 0;
mime = (contentType != null ? contentType.match(/[^;]*/)[0] : void 0) || 'application/octet-stream';
match = (contentDisposition != null ? (_ref1 = contentDisposition.match(/\bfilename\s*=\s*"((\\"|[^"])+)"/i)) != null ? _ref1[1] : void 0 : void 0) || (contentType != null ? (_ref2 = contentType.match(/\bname\s*=\s*"((\\"|[^"])+)"/i)) != null ? _ref2[1] : void 0 : void 0);
if (match) {
name = match.replace(/\\"/g, '"');
}
});
};
})(),
json: (function() {
var callbacks, responses;
callbacks = {};
responses = {};
return function(url, cb) {
if (responses[url]) {
cb(responses[url]);
return;
}
if (callbacks[url]) {
callbacks[url].push(cb);
return;
}
callbacks[url] = [cb];
return GM_xmlhttpRequest({
method: "GET",
url: url,
onload: function(xhr) {
var response, _i, _len, _ref;
response = JSON.parse(xhr.responseText);
_ref = callbacks[url];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
cb = _ref[_i];
cb(response);
blob = new Blob([urlBlob], {
type: mime
});
blob.name = name;
return blob;
};
return function(url, cb) {
return GM_xmlhttpRequest({
method: "GET",
url: url,
overrideMimeType: "text/plain; charset=x-user-defined",
onload: function(xhr) {
var contentDisposition, contentType, data, i, r, _ref, _ref1;
r = xhr.responseText;
data = new Uint8Array(r.length);
i = 0;
while (i < r.length) {
data[i] = r.charCodeAt(i);
i++;
}
contentType = (_ref = xhr.responseHeaders.match(/Content-Type:\s*(.*)/i)) != null ? _ref[1] : void 0;
contentDisposition = (_ref1 = xhr.responseHeaders.match(/Content-Disposition:\s*(.*)/i)) != null ? _ref1[1] : void 0;
return cb(makeBlob(data, contentType, contentDisposition, url));
},
onerror: function() {
return cb(null);
}
delete callbacks[url];
return responses[url] = response;
},
onerror: function() {
return delete callbacks[url];
},
onabort: function() {
return delete callbacks[url];
});
};
})(),
json: (function() {
var callbacks, responses;
callbacks = {};
responses = {};
return function(url, cb) {
if (responses[url]) {
cb(responses[url]);
return;
}
});
};
})()
};
if (callbacks[url]) {
callbacks[url].push(cb);
return;
}
callbacks[url] = [cb];
return GM_xmlhttpRequest({
method: "GET",
url: url,
onload: function(xhr) {
var response, _i, _len, _ref;
response = JSON.parse(xhr.responseText);
_ref = callbacks[url];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
cb = _ref[_i];
cb(response);
}
delete callbacks[url];
return responses[url] = response;
},
onerror: function() {
return delete callbacks[url];
},
onabort: function() {
return delete callbacks[url];
}
});
};
})()
};
})();
Anonymize = {
init: function() {
@ -6221,7 +6231,7 @@
},
handleUrl: function() {
var url;
url = prompt("Insert an url:");
url = prompt('Enter a URL:');
if (url === null) {
return;
}
@ -8362,6 +8372,14 @@
$.on(el, 'error', ImageExpand.error);
if (file.fullImage) {
TrashQueue.remove(el);
if (!file.isHovered) {
if (/\.gif$/.test(el.src)) {
el.src = el.src;
}
if (isVideo) {
el.currentTime = 0;
}
}
} else {
el.src = src || file.URL;
$.after(thumb, el);
@ -8570,12 +8588,19 @@
post = Get.postFromNode(this);
file = post.file;
isVideo = file.isVideo;
if (post.file.isExpanding || post.file.isExpanded) {
if (file.isExpanding || file.isExpanded) {
return;
}
file.isHovered = true;
if (el = file.fullImage) {
el.id = 'ihover';
TrashQueue.remove(el);
if (/\.gif$/.test(el.src)) {
el.src = el.src;
}
if (isVideo) {
el.currentTime = 0;
}
} else {
file.fullImage = el = $.el((isVideo ? 'video' : 'img'), {
className: 'full-image',
@ -8610,7 +8635,10 @@
el.pause();
TrashQueue.add(el, post);
}
return el.removeAttribute('id');
el.removeAttribute('id');
return $.queueTask(function() {
return delete file.isHovered;
});
}
});
},
@ -12786,7 +12814,7 @@
className: 'dialog'
});
$.extend(dialog, {
innerHTML: "<nav><div class=sections-list></div><p class='imp-exp-result warning'></p><div class=credits><a class=export>Export</a>&nbsp|&nbsp<a class=import>Import</a>&nbsp|&nbsp<a class=reset>Reset Settings</a>&nbsp|&nbsp<input type=file hidden><a href='https://github.com/ccd0/4chan-x' target=_blank>4chan X</a>&nbsp|&nbsp<a href='https://github.com/ccd0/4chan-x/blob/master/CHANGELOG.md' target=_blank>1.9.0.6</a>&nbsp|&nbsp<a href='https://github.com/ccd0/4chan-x/issues' target=_blank>Issues</a>&nbsp|&nbsp<a href=javascript:; class='close fa fa-times' title=Close></a></div></nav><div class=section-container><section></section></div>"
innerHTML: "<nav><div class=sections-list></div><p class='imp-exp-result warning'></p><div class=credits><a class=export>Export</a>&nbsp|&nbsp<a class=import>Import</a>&nbsp|&nbsp<a class=reset>Reset Settings</a>&nbsp|&nbsp<input type=file hidden><a href='https://github.com/ccd0/4chan-x' target=_blank>4chan X</a>&nbsp|&nbsp<a href='https://github.com/ccd0/4chan-x/blob/master/CHANGELOG.md' target=_blank>1.9.1.0</a>&nbsp|&nbsp<a href='https://github.com/ccd0/4chan-x/issues' target=_blank>Issues</a>&nbsp|&nbsp<a href=javascript:; class='close fa fa-times' title=Close></a></div></nav><div class=section-container><section></section></div>"
});
$.on($('.export', Settings.dialog), 'click', Settings["export"]);
$.on($('.import', Settings.dialog), 'click', Settings["import"]);

Binary file not shown.

View File

@ -1,7 +1,7 @@
// Generated by CoffeeScript
// ==UserScript==
// @name 4chan X
// @version 1.9.0.6
// @version 1.9.1.0
// @minGMVer 1.14
// @minFFVer 26
// @namespace 4chan-X
@ -23,7 +23,7 @@
// ==/UserScript==
/*
* 4chan X - Version 1.9.0.6
* 4chan X - Version 1.9.1.0
*
* Licensed under the MIT license.
* https://github.com/ccd0/4chan-x/blob/master/LICENSE
@ -373,7 +373,7 @@
doc = d.documentElement;
g = {
VERSION: '1.9.0.6',
VERSION: '1.9.1.0',
NAMESPACE: '4chan X.',
NAME: '4chan X',
FAQ: 'https://github.com/ccd0/4chan-x/wiki/Frequently-Asked-Questions',
@ -1358,6 +1358,7 @@
if ((_ref4 = this.file.fullImage) != null) {
_ref4.removeAttribute('id');
}
delete file.isHovered;
}
if (origin.isDead) {
this.isDead = true;
@ -4009,14 +4010,21 @@
}
};
drag = function(e) {
var bottom, clientX, clientY, left, right, style, top;
var bottom, clientX, clientY, left, right, style, top, x, y;
clientX = e.clientX, clientY = e.clientY;
left = clientX - this.dx;
left = left < 10 ? 0 : this.width - left < 10 ? null : left / this.screenWidth * 100 + '%';
top = clientY - this.dy;
top = top < (10 + this.topBorder) ? this.topBorder + 'px' : this.height - top < (10 + this.bottomBorder) ? null : top / this.screenHeight * 100 + '%';
right = left === null ? 0 : null;
bottom = top === null ? this.bottomBorder + 'px' : null;
x = clientX - this.dx;
y = clientY - this.dy;
left = right = top = bottom = null;
if (x <= this.width / 2) {
left = x < 10 ? '0px' : x / this.screenWidth * 100 + '%';
} else {
right = this.width - x < 10 ? '0px' : (this.width - x) / this.screenWidth * 100 + '%';
}
if (y <= this.height / 2) {
top = y < 10 + this.topBorder ? this.topBorder + 'px' : y / this.screenHeight * 100 + '%';
} else {
bottom = this.height - y < 10 + this.bottomBorder ? this.bottomBorder + 'px' : (this.height - y) / this.screenHeight * 100 + '%';
}
style = this.style;
style.left = left;
style.right = right;
@ -4129,85 +4137,87 @@
};
})();
CrossOrigin = {
file: (function() {
var makeBlob;
makeBlob = function(urlBlob, contentType, contentDisposition, url) {
var blob, match, mime, name, _ref, _ref1, _ref2;
name = (_ref = url.match(/([^\/]+)\/*$/)) != null ? _ref[1] : void 0;
mime = (contentType != null ? contentType.match(/[^;]*/)[0] : void 0) || 'application/octet-stream';
match = (contentDisposition != null ? (_ref1 = contentDisposition.match(/\bfilename\s*=\s*"((\\"|[^"])+)"/i)) != null ? _ref1[1] : void 0 : void 0) || (contentType != null ? (_ref2 = contentType.match(/\bname\s*=\s*"((\\"|[^"])+)"/i)) != null ? _ref2[1] : void 0 : void 0);
if (match) {
name = match.replace(/\\"/g, '"');
}
blob = new Blob([urlBlob], {
type: mime
});
blob.name = name;
return blob;
};
return function(url, cb) {
return GM_xmlhttpRequest({
method: "GET",
url: url,
overrideMimeType: "text/plain; charset=x-user-defined",
onload: function(xhr) {
var contentDisposition, contentType, data, i, r, _ref, _ref1;
r = xhr.responseText;
data = new Uint8Array(r.length);
i = 0;
while (i < r.length) {
data[i] = r.charCodeAt(i);
i++;
}
contentType = (_ref = xhr.responseHeaders.match(/Content-Type:\s*(.*)/i)) != null ? _ref[1] : void 0;
contentDisposition = (_ref1 = xhr.responseHeaders.match(/Content-Disposition:\s*(.*)/i)) != null ? _ref1[1] : void 0;
return cb(makeBlob(data, contentType, contentDisposition, url));
},
onerror: function() {
return cb(null);
CrossOrigin = (function() {
return {
file: (function() {
var makeBlob;
makeBlob = function(urlBlob, contentType, contentDisposition, url) {
var blob, match, mime, name, _ref, _ref1, _ref2;
name = (_ref = url.match(/([^\/]+)\/*$/)) != null ? _ref[1] : void 0;
mime = (contentType != null ? contentType.match(/[^;]*/)[0] : void 0) || 'application/octet-stream';
match = (contentDisposition != null ? (_ref1 = contentDisposition.match(/\bfilename\s*=\s*"((\\"|[^"])+)"/i)) != null ? _ref1[1] : void 0 : void 0) || (contentType != null ? (_ref2 = contentType.match(/\bname\s*=\s*"((\\"|[^"])+)"/i)) != null ? _ref2[1] : void 0 : void 0);
if (match) {
name = match.replace(/\\"/g, '"');
}
});
};
})(),
json: (function() {
var callbacks, responses;
callbacks = {};
responses = {};
return function(url, cb) {
if (responses[url]) {
cb(responses[url]);
return;
}
if (callbacks[url]) {
callbacks[url].push(cb);
return;
}
callbacks[url] = [cb];
return GM_xmlhttpRequest({
method: "GET",
url: url,
onload: function(xhr) {
var response, _i, _len, _ref;
response = JSON.parse(xhr.responseText);
_ref = callbacks[url];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
cb = _ref[_i];
cb(response);
blob = new Blob([urlBlob], {
type: mime
});
blob.name = name;
return blob;
};
return function(url, cb) {
return GM_xmlhttpRequest({
method: "GET",
url: url,
overrideMimeType: "text/plain; charset=x-user-defined",
onload: function(xhr) {
var contentDisposition, contentType, data, i, r, _ref, _ref1;
r = xhr.responseText;
data = new Uint8Array(r.length);
i = 0;
while (i < r.length) {
data[i] = r.charCodeAt(i);
i++;
}
contentType = (_ref = xhr.responseHeaders.match(/Content-Type:\s*(.*)/i)) != null ? _ref[1] : void 0;
contentDisposition = (_ref1 = xhr.responseHeaders.match(/Content-Disposition:\s*(.*)/i)) != null ? _ref1[1] : void 0;
return cb(makeBlob(data, contentType, contentDisposition, url));
},
onerror: function() {
return cb(null);
}
delete callbacks[url];
return responses[url] = response;
},
onerror: function() {
return delete callbacks[url];
},
onabort: function() {
return delete callbacks[url];
});
};
})(),
json: (function() {
var callbacks, responses;
callbacks = {};
responses = {};
return function(url, cb) {
if (responses[url]) {
cb(responses[url]);
return;
}
});
};
})()
};
if (callbacks[url]) {
callbacks[url].push(cb);
return;
}
callbacks[url] = [cb];
return GM_xmlhttpRequest({
method: "GET",
url: url,
onload: function(xhr) {
var response, _i, _len, _ref;
response = JSON.parse(xhr.responseText);
_ref = callbacks[url];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
cb = _ref[_i];
cb(response);
}
delete callbacks[url];
return responses[url] = response;
},
onerror: function() {
return delete callbacks[url];
},
onabort: function() {
return delete callbacks[url];
}
});
};
})()
};
})();
Anonymize = {
init: function() {
@ -6220,7 +6230,7 @@
},
handleUrl: function() {
var url;
url = prompt("Insert an url:");
url = prompt('Enter a URL:');
if (url === null) {
return;
}
@ -8361,6 +8371,14 @@
$.on(el, 'error', ImageExpand.error);
if (file.fullImage) {
TrashQueue.remove(el);
if (!file.isHovered) {
if (/\.gif$/.test(el.src)) {
el.src = el.src;
}
if (isVideo) {
el.currentTime = 0;
}
}
} else {
el.src = src || file.URL;
$.after(thumb, el);
@ -8569,12 +8587,19 @@
post = Get.postFromNode(this);
file = post.file;
isVideo = file.isVideo;
if (post.file.isExpanding || post.file.isExpanded) {
if (file.isExpanding || file.isExpanded) {
return;
}
file.isHovered = true;
if (el = file.fullImage) {
el.id = 'ihover';
TrashQueue.remove(el);
if (/\.gif$/.test(el.src)) {
el.src = el.src;
}
if (isVideo) {
el.currentTime = 0;
}
} else {
file.fullImage = el = $.el((isVideo ? 'video' : 'img'), {
className: 'full-image',
@ -8609,7 +8634,10 @@
el.pause();
TrashQueue.add(el, post);
}
return el.removeAttribute('id');
el.removeAttribute('id');
return $.queueTask(function() {
return delete file.isHovered;
});
}
});
},
@ -12785,7 +12813,7 @@
className: 'dialog'
});
$.extend(dialog, {
innerHTML: "<nav><div class=sections-list></div><p class='imp-exp-result warning'></p><div class=credits><a class=export>Export</a>&nbsp|&nbsp<a class=import>Import</a>&nbsp|&nbsp<a class=reset>Reset Settings</a>&nbsp|&nbsp<input type=file hidden><a href='https://github.com/ccd0/4chan-x' target=_blank>4chan X</a>&nbsp|&nbsp<a href='https://github.com/ccd0/4chan-x/blob/master/CHANGELOG.md' target=_blank>1.9.0.6</a>&nbsp|&nbsp<a href='https://github.com/ccd0/4chan-x/issues' target=_blank>Issues</a>&nbsp|&nbsp<a href=javascript:; class='close fa fa-times' title=Close></a></div></nav><div class=section-container><section></section></div>"
innerHTML: "<nav><div class=sections-list></div><p class='imp-exp-result warning'></p><div class=credits><a class=export>Export</a>&nbsp|&nbsp<a class=import>Import</a>&nbsp|&nbsp<a class=reset>Reset Settings</a>&nbsp|&nbsp<input type=file hidden><a href='https://github.com/ccd0/4chan-x' target=_blank>4chan X</a>&nbsp|&nbsp<a href='https://github.com/ccd0/4chan-x/blob/master/CHANGELOG.md' target=_blank>1.9.1.0</a>&nbsp|&nbsp<a href='https://github.com/ccd0/4chan-x/issues' target=_blank>Issues</a>&nbsp|&nbsp<a href=javascript:; class='close fa fa-times' title=Close></a></div></nav><div class=section-container><section></section></div>"
});
$.on($('.export', Settings.dialog), 'click', Settings["export"]);
$.on($('.import', Settings.dialog), 'click', Settings["import"]);

Binary file not shown.

View File

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

View File

@ -1,7 +1,7 @@
// Generated by CoffeeScript
// ==UserScript==
// @name 4chan X
// @version 1.9.0.6
// @version 1.9.1.0
// @minGMVer 1.14
// @minFFVer 26
// @namespace 4chan-X
@ -24,7 +24,7 @@
// ==/UserScript==
/*
* 4chan X - Version 1.9.0.6
* 4chan X - Version 1.9.1.0
*
* Licensed under the MIT license.
* https://github.com/ccd0/4chan-x/blob/master/LICENSE
@ -374,7 +374,7 @@
doc = d.documentElement;
g = {
VERSION: '1.9.0.6',
VERSION: '1.9.1.0',
NAMESPACE: '4chan X.',
NAME: '4chan X',
FAQ: 'https://github.com/ccd0/4chan-x/wiki/Frequently-Asked-Questions',
@ -1359,6 +1359,7 @@
if ((_ref4 = this.file.fullImage) != null) {
_ref4.removeAttribute('id');
}
delete file.isHovered;
}
if (origin.isDead) {
this.isDead = true;
@ -4010,14 +4011,21 @@
}
};
drag = function(e) {
var bottom, clientX, clientY, left, right, style, top;
var bottom, clientX, clientY, left, right, style, top, x, y;
clientX = e.clientX, clientY = e.clientY;
left = clientX - this.dx;
left = left < 10 ? 0 : this.width - left < 10 ? null : left / this.screenWidth * 100 + '%';
top = clientY - this.dy;
top = top < (10 + this.topBorder) ? this.topBorder + 'px' : this.height - top < (10 + this.bottomBorder) ? null : top / this.screenHeight * 100 + '%';
right = left === null ? 0 : null;
bottom = top === null ? this.bottomBorder + 'px' : null;
x = clientX - this.dx;
y = clientY - this.dy;
left = right = top = bottom = null;
if (x <= this.width / 2) {
left = x < 10 ? '0px' : x / this.screenWidth * 100 + '%';
} else {
right = this.width - x < 10 ? '0px' : (this.width - x) / this.screenWidth * 100 + '%';
}
if (y <= this.height / 2) {
top = y < 10 + this.topBorder ? this.topBorder + 'px' : y / this.screenHeight * 100 + '%';
} else {
bottom = this.height - y < 10 + this.bottomBorder ? this.bottomBorder + 'px' : (this.height - y) / this.screenHeight * 100 + '%';
}
style = this.style;
style.left = left;
style.right = right;
@ -4130,85 +4138,87 @@
};
})();
CrossOrigin = {
file: (function() {
var makeBlob;
makeBlob = function(urlBlob, contentType, contentDisposition, url) {
var blob, match, mime, name, _ref, _ref1, _ref2;
name = (_ref = url.match(/([^\/]+)\/*$/)) != null ? _ref[1] : void 0;
mime = (contentType != null ? contentType.match(/[^;]*/)[0] : void 0) || 'application/octet-stream';
match = (contentDisposition != null ? (_ref1 = contentDisposition.match(/\bfilename\s*=\s*"((\\"|[^"])+)"/i)) != null ? _ref1[1] : void 0 : void 0) || (contentType != null ? (_ref2 = contentType.match(/\bname\s*=\s*"((\\"|[^"])+)"/i)) != null ? _ref2[1] : void 0 : void 0);
if (match) {
name = match.replace(/\\"/g, '"');
}
blob = new Blob([urlBlob], {
type: mime
});
blob.name = name;
return blob;
};
return function(url, cb) {
return GM_xmlhttpRequest({
method: "GET",
url: url,
overrideMimeType: "text/plain; charset=x-user-defined",
onload: function(xhr) {
var contentDisposition, contentType, data, i, r, _ref, _ref1;
r = xhr.responseText;
data = new Uint8Array(r.length);
i = 0;
while (i < r.length) {
data[i] = r.charCodeAt(i);
i++;
}
contentType = (_ref = xhr.responseHeaders.match(/Content-Type:\s*(.*)/i)) != null ? _ref[1] : void 0;
contentDisposition = (_ref1 = xhr.responseHeaders.match(/Content-Disposition:\s*(.*)/i)) != null ? _ref1[1] : void 0;
return cb(makeBlob(data, contentType, contentDisposition, url));
},
onerror: function() {
return cb(null);
CrossOrigin = (function() {
return {
file: (function() {
var makeBlob;
makeBlob = function(urlBlob, contentType, contentDisposition, url) {
var blob, match, mime, name, _ref, _ref1, _ref2;
name = (_ref = url.match(/([^\/]+)\/*$/)) != null ? _ref[1] : void 0;
mime = (contentType != null ? contentType.match(/[^;]*/)[0] : void 0) || 'application/octet-stream';
match = (contentDisposition != null ? (_ref1 = contentDisposition.match(/\bfilename\s*=\s*"((\\"|[^"])+)"/i)) != null ? _ref1[1] : void 0 : void 0) || (contentType != null ? (_ref2 = contentType.match(/\bname\s*=\s*"((\\"|[^"])+)"/i)) != null ? _ref2[1] : void 0 : void 0);
if (match) {
name = match.replace(/\\"/g, '"');
}
});
};
})(),
json: (function() {
var callbacks, responses;
callbacks = {};
responses = {};
return function(url, cb) {
if (responses[url]) {
cb(responses[url]);
return;
}
if (callbacks[url]) {
callbacks[url].push(cb);
return;
}
callbacks[url] = [cb];
return GM_xmlhttpRequest({
method: "GET",
url: url,
onload: function(xhr) {
var response, _i, _len, _ref;
response = JSON.parse(xhr.responseText);
_ref = callbacks[url];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
cb = _ref[_i];
cb(response);
blob = new Blob([urlBlob], {
type: mime
});
blob.name = name;
return blob;
};
return function(url, cb) {
return GM_xmlhttpRequest({
method: "GET",
url: url,
overrideMimeType: "text/plain; charset=x-user-defined",
onload: function(xhr) {
var contentDisposition, contentType, data, i, r, _ref, _ref1;
r = xhr.responseText;
data = new Uint8Array(r.length);
i = 0;
while (i < r.length) {
data[i] = r.charCodeAt(i);
i++;
}
contentType = (_ref = xhr.responseHeaders.match(/Content-Type:\s*(.*)/i)) != null ? _ref[1] : void 0;
contentDisposition = (_ref1 = xhr.responseHeaders.match(/Content-Disposition:\s*(.*)/i)) != null ? _ref1[1] : void 0;
return cb(makeBlob(data, contentType, contentDisposition, url));
},
onerror: function() {
return cb(null);
}
delete callbacks[url];
return responses[url] = response;
},
onerror: function() {
return delete callbacks[url];
},
onabort: function() {
return delete callbacks[url];
});
};
})(),
json: (function() {
var callbacks, responses;
callbacks = {};
responses = {};
return function(url, cb) {
if (responses[url]) {
cb(responses[url]);
return;
}
});
};
})()
};
if (callbacks[url]) {
callbacks[url].push(cb);
return;
}
callbacks[url] = [cb];
return GM_xmlhttpRequest({
method: "GET",
url: url,
onload: function(xhr) {
var response, _i, _len, _ref;
response = JSON.parse(xhr.responseText);
_ref = callbacks[url];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
cb = _ref[_i];
cb(response);
}
delete callbacks[url];
return responses[url] = response;
},
onerror: function() {
return delete callbacks[url];
},
onabort: function() {
return delete callbacks[url];
}
});
};
})()
};
})();
Anonymize = {
init: function() {
@ -6221,7 +6231,7 @@
},
handleUrl: function() {
var url;
url = prompt("Insert an url:");
url = prompt('Enter a URL:');
if (url === null) {
return;
}
@ -8362,6 +8372,14 @@
$.on(el, 'error', ImageExpand.error);
if (file.fullImage) {
TrashQueue.remove(el);
if (!file.isHovered) {
if (/\.gif$/.test(el.src)) {
el.src = el.src;
}
if (isVideo) {
el.currentTime = 0;
}
}
} else {
el.src = src || file.URL;
$.after(thumb, el);
@ -8570,12 +8588,19 @@
post = Get.postFromNode(this);
file = post.file;
isVideo = file.isVideo;
if (post.file.isExpanding || post.file.isExpanded) {
if (file.isExpanding || file.isExpanded) {
return;
}
file.isHovered = true;
if (el = file.fullImage) {
el.id = 'ihover';
TrashQueue.remove(el);
if (/\.gif$/.test(el.src)) {
el.src = el.src;
}
if (isVideo) {
el.currentTime = 0;
}
} else {
file.fullImage = el = $.el((isVideo ? 'video' : 'img'), {
className: 'full-image',
@ -8610,7 +8635,10 @@
el.pause();
TrashQueue.add(el, post);
}
return el.removeAttribute('id');
el.removeAttribute('id');
return $.queueTask(function() {
return delete file.isHovered;
});
}
});
},
@ -12786,7 +12814,7 @@
className: 'dialog'
});
$.extend(dialog, {
innerHTML: "<nav><div class=sections-list></div><p class='imp-exp-result warning'></p><div class=credits><a class=export>Export</a>&nbsp|&nbsp<a class=import>Import</a>&nbsp|&nbsp<a class=reset>Reset Settings</a>&nbsp|&nbsp<input type=file hidden><a href='https://github.com/ccd0/4chan-x' target=_blank>4chan X</a>&nbsp|&nbsp<a href='https://github.com/ccd0/4chan-x/blob/master/CHANGELOG.md' target=_blank>1.9.0.6</a>&nbsp|&nbsp<a href='https://github.com/ccd0/4chan-x/issues' target=_blank>Issues</a>&nbsp|&nbsp<a href=javascript:; class='close fa fa-times' title=Close></a></div></nav><div class=section-container><section></section></div>"
innerHTML: "<nav><div class=sections-list></div><p class='imp-exp-result warning'></p><div class=credits><a class=export>Export</a>&nbsp|&nbsp<a class=import>Import</a>&nbsp|&nbsp<a class=reset>Reset Settings</a>&nbsp|&nbsp<input type=file hidden><a href='https://github.com/ccd0/4chan-x' target=_blank>4chan X</a>&nbsp|&nbsp<a href='https://github.com/ccd0/4chan-x/blob/master/CHANGELOG.md' target=_blank>1.9.1.0</a>&nbsp|&nbsp<a href='https://github.com/ccd0/4chan-x/issues' target=_blank>Issues</a>&nbsp|&nbsp<a href=javascript:; class='close fa fa-times' title=Close></a></div></nav><div class=section-container><section></section></div>"
});
$.on($('.export', Settings.dialog), 'click', Settings["export"]);
$.on($('.import', Settings.dialog), 'click', Settings["import"]);

Binary file not shown.

View File

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

View File

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

View File

@ -3,7 +3,7 @@
"description": "Cross-browser userscript for maximum lurking on 4chan.",
"meta": {
"name": "4chan X",
"version": "1.9.0.6",
"version": "1.9.1.0",
"repo": "https://github.com/ccd0/4chan-x/",
"page": "https://github.com/ccd0/4chan-x",
"downloads": "https://ccd0.github.io/4chan-x/builds/",