diff --git a/CHANGELOG.md b/CHANGELOG.md
index ed142c3c6..53bfd9a05 100755
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -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*
diff --git a/LICENSE b/LICENSE
index 8b714cf34..f4bc59e56 100755
--- a/LICENSE
+++ b/LICENSE
@@ -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
diff --git a/builds/4chan-X-beta.crx b/builds/4chan-X-beta.crx
index 1e5c12451..bc9d9af3d 100644
Binary files a/builds/4chan-X-beta.crx and b/builds/4chan-X-beta.crx differ
diff --git a/builds/4chan-X-beta.meta.js b/builds/4chan-X-beta.meta.js
index 4edcfef84..d13703be2 100644
--- a/builds/4chan-X-beta.meta.js
+++ b/builds/4chan-X-beta.meta.js
@@ -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
diff --git a/builds/4chan-X-beta.user.js b/builds/4chan-X-beta.user.js
index 951fd4420..dbb1c1982 100644
--- a/builds/4chan-X-beta.user.js
+++ b/builds/4chan-X-beta.user.js
@@ -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: "
"
+ innerHTML: ""
});
$.on($('.export', Settings.dialog), 'click', Settings["export"]);
$.on($('.import', Settings.dialog), 'click', Settings["import"]);
diff --git a/builds/4chan-X-noupdate.crx b/builds/4chan-X-noupdate.crx
index 855f83dd5..acc1bbd33 100644
Binary files a/builds/4chan-X-noupdate.crx and b/builds/4chan-X-noupdate.crx differ
diff --git a/builds/4chan-X-noupdate.user.js b/builds/4chan-X-noupdate.user.js
index b61ed1964..fe32c416a 100644
--- a/builds/4chan-X-noupdate.user.js
+++ b/builds/4chan-X-noupdate.user.js
@@ -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: ""
+ innerHTML: ""
});
$.on($('.export', Settings.dialog), 'click', Settings["export"]);
$.on($('.import', Settings.dialog), 'click', Settings["import"]);
diff --git a/builds/4chan-X.crx b/builds/4chan-X.crx
index 51067bdd9..8d9d3025a 100644
Binary files a/builds/4chan-X.crx and b/builds/4chan-X.crx differ
diff --git a/builds/4chan-X.meta.js b/builds/4chan-X.meta.js
index e31aef298..1870234b4 100644
--- a/builds/4chan-X.meta.js
+++ b/builds/4chan-X.meta.js
@@ -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
diff --git a/builds/4chan-X.user.js b/builds/4chan-X.user.js
index ee70f34bd..a456fddac 100644
--- a/builds/4chan-X.user.js
+++ b/builds/4chan-X.user.js
@@ -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: ""
+ innerHTML: ""
});
$.on($('.export', Settings.dialog), 'click', Settings["export"]);
$.on($('.import', Settings.dialog), 'click', Settings["import"]);
diff --git a/builds/4chan-X.zip b/builds/4chan-X.zip
index cd827312f..3d88a3c27 100644
Binary files a/builds/4chan-X.zip and b/builds/4chan-X.zip differ
diff --git a/builds/updates-beta.xml b/builds/updates-beta.xml
index 26c3d589f..53d48b22f 100644
--- a/builds/updates-beta.xml
+++ b/builds/updates-beta.xml
@@ -1,7 +1,7 @@
-
+
diff --git a/builds/updates.xml b/builds/updates.xml
index 42b0d8df9..5f8bb860a 100644
--- a/builds/updates.xml
+++ b/builds/updates.xml
@@ -1,7 +1,7 @@
-
+
diff --git a/package.json b/package.json
index d07959ea2..61a7515d0 100755
--- a/package.json
+++ b/package.json
@@ -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/",