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/",