From 69b107b6344609a11b4c211277415d3dcc0f8a1a Mon Sep 17 00:00:00 2001 From: ccd0 Date: Fri, 18 Jul 2014 14:41:11 -0700 Subject: [PATCH 01/35] point users toward GM2.1 beta --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 12b382a5b..61418f679 100755 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ https://github.com/Nebukazar/OneeChan ## [Install](https://ccd0.github.io/4chan-x/builds/4chan-X.user.js) (Firefox) Install [Greasemonkey](https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/), then click the link above to install. +You may want to try the [Greasemonkey 2.1 beta](https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/versions/2.1beta1), which fixes bugs in 2.0 that can prevent 4chan X from updating [[1]](https://github.com/greasemonkey/greasemonkey/issues/1938) or, in some versions of Firefox, break posting images from URLs and downloading with the original filename [[2]](https://github.com/greasemonkey/greasemonkey/issues/1937). + **Note**: The combination of Firefox 29 and Greasemonkey 2.0 may cause 4chan X not to work. Try [upgrading Firefox](http://www.mozilla.org/en-US/firefox/new/) to version 30 or higher. Alternatively, you can downgrade to [Greasemonkey 1.15](https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/versions/#version-1.15) and turn off automatic updates for Greasemonkey ([see pic](https://raw.githubusercontent.com/ccd0/4chan-x/master/img/2014-07-12_16-19-32.png)). From cc9a0d28d9f842532e10d8e9859999037d6f0642 Mon Sep 17 00:00:00 2001 From: ccd0 Date: Fri, 18 Jul 2014 14:57:44 -0700 Subject: [PATCH 02/35] fix bad word wrap --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 61418f679..4481a57ed 100755 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ https://github.com/Nebukazar/OneeChan ## [Install](https://ccd0.github.io/4chan-x/builds/4chan-X.user.js) (Firefox) Install [Greasemonkey](https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/), then click the link above to install. -You may want to try the [Greasemonkey 2.1 beta](https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/versions/2.1beta1), which fixes bugs in 2.0 that can prevent 4chan X from updating [[1]](https://github.com/greasemonkey/greasemonkey/issues/1938) or, in some versions of Firefox, break posting images from URLs and downloading with the original filename [[2]](https://github.com/greasemonkey/greasemonkey/issues/1937). +You may want to try the [Greasemonkey 2.1 beta](https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/versions/2.1beta1), which fixes bugs in 2.0 that can prevent 4chan X from updating[[1]](https://github.com/greasemonkey/greasemonkey/issues/1938) or, in some versions of Firefox, break posting images from URLs and downloading with the original filename[[2]](https://github.com/greasemonkey/greasemonkey/issues/1937). **Note**: The combination of Firefox 29 and Greasemonkey 2.0 may cause 4chan X not to work. Try [upgrading Firefox](http://www.mozilla.org/en-US/firefox/new/) to version 30 or higher. From f6641ee54e0863dbd015e524dc250df77c73fd5c Mon Sep 17 00:00:00 2001 From: ccd0 Date: Fri, 18 Jul 2014 19:23:45 -0700 Subject: [PATCH 03/35] fix hover bug, some code cleanup --- src/Images/ImageHover.coffee | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/Images/ImageHover.coffee b/src/Images/ImageHover.coffee index c0ff4beb6..dcc5a2379 100755 --- a/src/Images/ImageHover.coffee +++ b/src/Images/ImageHover.coffee @@ -10,20 +10,16 @@ ImageHover = $.on @file.thumb, 'mouseover', ImageHover.mouseover mouseover: (e) -> post = Get.postFromNode @ - {isVideo} = post.file - if post.file.fullImage - el = post.file.fullImage + {file} = post + {isVideo} = file + if el = file.fullImage TrashQueue.remove el else el = $.el (if isVideo then 'video' else 'img'), className: 'full-image' - src: post.file.URL - post.file.fullImage = el - {thumb} = post.file - if d.body.contains thumb - $.after thumb, el unless el is thumb.nextSibling - else - $.add Header.hover, el if el.parentNode isnt Header.hover + src: file.URL + file.fullImage = el + $.after file.thumb, el unless el is file.thumb.nextSibling el.id = 'ihover' el.dataset.fullID = post.fullID if isVideo From 246b43da74c181f6209720dc117e54efcdf03e08 Mon Sep 17 00:00:00 2001 From: ccd0 Date: Fri, 18 Jul 2014 20:15:07 -0700 Subject: [PATCH 04/35] make (embed) link point to the URL --- src/Linkification/Linkify.coffee | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Linkification/Linkify.coffee b/src/Linkification/Linkify.coffee index bcb34ed21..33e19a82a 100755 --- a/src/Linkification/Linkify.coffee +++ b/src/Linkification/Linkify.coffee @@ -151,13 +151,12 @@ Linkify = embed: (data) -> [key, uid, options, link, post] = data - href = link.href embed = $.el 'a', className: 'embedder' - href: 'javascript:;' + href: link.href textContent: '(embed)' - embed.dataset[name] = value for name, value of {key, href, uid, options} + embed.dataset[name] = value for name, value of {key, uid, options} $.addClass link, "#{embed.dataset.key}" @@ -181,7 +180,8 @@ Linkify = return cb: - toggle: -> + toggle: (e) -> + e?.preventDefault() if $.hasClass @, "embedded" $.rm @previousElementSibling @previousElementSibling.hidden = false @@ -253,7 +253,7 @@ Linkify = el: (a) -> el = $.el 'div' el.innerHTML = '' - el.firstChild.href = el.firstChild.firstChild.src = a.dataset.href + el.firstChild.href = el.firstChild.firstChild.src = a.href el , key: 'InstallGentoo' @@ -302,7 +302,7 @@ Linkify = el.firstChild.children[i].src = "https://mediacru.sh/#{a.dataset.uid}.#{ext}" when 'image/svg+xml', 'image/png', 'image/gif', 'image/jpeg' el.innerHTML = '' - el.firstChild.href = a.dataset.href + el.firstChild.href = a.href el.firstChild.firstChild.src = "https://mediacru.sh/#{file.file}" when 'audio/mpeg', 'audio/ogg' el.innerHTML = '' From e6f058a136fa05d02c7276ca2c1a6a0e68605b46 Mon Sep 17 00:00:00 2001 From: ccd0 Date: Fri, 18 Jul 2014 21:07:29 -0700 Subject: [PATCH 05/35] update protocols (http/https) for embedded services --- src/Linkification/Linkify.coffee | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Linkification/Linkify.coffee b/src/Linkification/Linkify.coffee index 33e19a82a..278d58579 100755 --- a/src/Linkification/Linkify.coffee +++ b/src/Linkification/Linkify.coffee @@ -260,7 +260,7 @@ Linkify = regExp: /.*(?:paste.installgentoo.com\/view\/)([0-9a-z_]+)/ el: (a) -> $.el 'iframe', - src: "http://paste.installgentoo.com/view/embed/#{a.dataset.uid}" + src: "https://paste.installgentoo.com/view/embed/#{a.dataset.uid}" , key: 'Twitter' regExp: /.*twitter.com\/(.+\/status\/\d+)/ @@ -322,14 +322,14 @@ Linkify = regExp: /.*gfycat.com\/(?:iframe\/)?(\S*)/ el: (a) -> div = $.el 'iframe', - src: "http://gfycat.com/iframe/#{a.dataset.uid}" + src: "//gfycat.com/iframe/#{a.dataset.uid}" , key: 'SoundCloud' regExp: /.*(?:soundcloud.com\/|snd.sc\/)([^#\&\?]*).*/ style: 'border: 0; width: 500px; height: 400px;' el: (a) -> $.el 'iframe', - src: "//w.soundcloud.com/player/?visual=true&show_comments=false&url=https%3A%2F%2Fsoundcloud.com%2F#{encodeURIComponent a.dataset.uid}" + src: "https://w.soundcloud.com/player/?visual=true&show_comments=false&url=https%3A%2F%2Fsoundcloud.com%2F#{encodeURIComponent a.dataset.uid}" title: api: (uid) -> "//soundcloud.com/oembed?format=json&url=https%3A%2F%2Fsoundcloud.com%2F#{encodeURIComponent uid}" text: (_) -> _.title From d4bea6380f9a0f252780b19ecaadb6368019cf14 Mon Sep 17 00:00:00 2001 From: ccd0 Date: Fri, 18 Jul 2014 21:47:33 -0700 Subject: [PATCH 06/35] embed strawpoll results page --- src/Linkification/Linkify.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Linkification/Linkify.coffee b/src/Linkification/Linkify.coffee index 278d58579..24293cdc5 100755 --- a/src/Linkification/Linkify.coffee +++ b/src/Linkification/Linkify.coffee @@ -335,7 +335,7 @@ Linkify = text: (_) -> _.title , key: 'StrawPoll' - regExp: /strawpoll\.me\/(?:embed_\d+\/)?(\d+)/ + regExp: /strawpoll\.me\/(?:embed_\d+\/)?(\d+(?:\/r)?)/ style: 'border: 0; width: 600px; height: 406px;' el: (a) -> $.el 'iframe', From d5fb02e98e476633865b2a59e6d01392c099f5eb Mon Sep 17 00:00:00 2001 From: Mayhem Date: Fri, 31 Jan 2014 16:10:30 +0100 Subject: [PATCH 07/35] Slightly safer Chrome storage setting. try/catch is probably useless. --- src/General/lib/$.coffee | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/General/lib/$.coffee b/src/General/lib/$.coffee index 083ce408b..ab5cb117e 100755 --- a/src/General/lib/$.coffee +++ b/src/General/lib/$.coffee @@ -338,7 +338,6 @@ $.set = do -> setArea = (area) -> data = items[area] return if !Object.keys(data).length or timeout[area] - items[area] = {} chrome.storage[area].set data, -> if chrome.runtime.lastError c.error chrome.runtime.lastError.message @@ -347,23 +346,20 @@ $.set = do -> timeout[area] = setTimeout setArea, $.MINUTE, area return delete timeout[area] + items[area] = {} - setAll = $.debounce $.SECOND, -> - for key in $.localKeys - if key of items.sync - items.local[key] = items.sync[key] - delete items.sync[key] - try - setArea 'local' - setArea 'sync' - catch err - c.error err.stack + setAll = $.debounce 5 * $.SECOND, -> + setArea 'local' + setArea 'sync' (key, val) -> if typeof key is 'string' items.sync[key] = val else $.extend items.sync, key + for key in $.localKeys when key of items.sync + items.local[key] = items.sync[key] + delete items.sync[key] setAll() $.clear = (cb) -> count = 2 From 8d4ea7d8f97fd695a6262e940f147723b8790abc Mon Sep 17 00:00:00 2001 From: ccd0 Date: Fri, 18 Jul 2014 23:01:36 -0700 Subject: [PATCH 08/35] remove $.desync --- src/General/lib/$.coffee | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/General/lib/$.coffee b/src/General/lib/$.coffee index ab5cb117e..12f94f262 100755 --- a/src/General/lib/$.coffee +++ b/src/General/lib/$.coffee @@ -276,8 +276,6 @@ $.sync = do -> return (key, cb) -> $.syncing[key] = cb -$.desync = (key) -> delete $.syncing[key] - $.localKeys = [ # filters 'name', @@ -363,13 +361,13 @@ $.set = do -> setAll() $.clear = (cb) -> count = 2 - done = -> + done = -> if chrome.runtime.lastError c.error chrome.runtime.lastError.message return cb?() unless --count chrome.storage.local.clear done - chrome.storage.sync.clear done + chrome.storage.sync.clear done <% } else { %> # http://wiki.greasespot.net/Main_Page @@ -379,8 +377,6 @@ $.sync = do -> cb JSON.parse(newValue), key (key, cb) -> $.syncing[g.NAMESPACE + key] = cb -$.desync = (key) -> delete $.syncing[g.NAMESPACE + key] - $.delete = (keys) -> unless keys instanceof Array keys = [keys] From c606cc05a0f4be48dde5f63780fd17390a3ca51a Mon Sep 17 00:00:00 2001 From: ccd0 Date: Fri, 18 Jul 2014 23:06:30 -0700 Subject: [PATCH 09/35] temp reformatting --- src/General/lib/$.coffee | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/General/lib/$.coffee b/src/General/lib/$.coffee index 12f94f262..5afb18530 100755 --- a/src/General/lib/$.coffee +++ b/src/General/lib/$.coffee @@ -275,7 +275,6 @@ $.sync = do -> cb changes[key].newValue, key return (key, cb) -> $.syncing[key] = cb - $.localKeys = [ # filters 'name', @@ -293,18 +292,16 @@ $.localKeys = [ # custom css 'usercss' ] - # https://developer.chrome.com/extensions/storage.html - $.delete = (keys) -> chrome.storage.sync.remove keys - $.get = (key, val, cb) -> if typeof cb is 'function' items = $.item key, val else items = key cb = val + localItems = null syncItems = null for key, val of items @@ -326,7 +323,6 @@ $.get = (key, val, cb) -> if syncItems count++ chrome.storage.sync.get syncItems, done - $.set = do -> items = sync: {} From 7f0e719d19b2fc9387e84dc3582bd1c8043356e5 Mon Sep 17 00:00:00 2001 From: Mayhem Date: Tue, 4 Feb 2014 15:15:02 +0100 Subject: [PATCH 10/35] Harden the Chrome storage API lib. Clear/delete should clear/delete data that's about to get set. --- src/General/lib/$.coffee | 98 ++++++++++++++++++++++------------------ 1 file changed, 54 insertions(+), 44 deletions(-) diff --git a/src/General/lib/$.coffee b/src/General/lib/$.coffee index 5afb18530..7578b27b0 100755 --- a/src/General/lib/$.coffee +++ b/src/General/lib/$.coffee @@ -293,42 +293,49 @@ $.localKeys = [ 'usercss' ] # https://developer.chrome.com/extensions/storage.html -$.delete = (keys) -> - chrome.storage.sync.remove keys -$.get = (key, val, cb) -> - if typeof cb is 'function' - items = $.item key, val - else - items = key - cb = val - - localItems = null - syncItems = null - for key, val of items - if key in $.localKeys - (localItems or= {})[key] = val - else - (syncItems or= {})[key] = val - - count = 0 - done = (item) -> - if chrome.runtime.lastError - c.error chrome.runtime.lastError.message - $.extend items, item - cb items unless --count - - if localItems - count++ - chrome.storage.local.get localItems, done - if syncItems - count++ - chrome.storage.sync.get syncItems, done -$.set = do -> +do -> items = - sync: {} local: {} - timeout = {} + sync: {} + $.delete = (keys) -> + if typeof keys is 'string' + keys = [keys] + for key in keys + delete items.local[key] + delete items.sync[key] + chrome.storage.sync.remove keys + + $.get = (key, val, cb) -> + if typeof cb is 'function' + data = $.item key, val + else + data = key + cb = val + + localItems = null + syncItems = null + for key, val of data + if key in $.localKeys + (localItems or= {})[key] = val + else + (syncItems or= {})[key] = val + + count = 0 + done = (result) -> + if chrome.runtime.lastError + c.error chrome.runtime.lastError.message + $.extend data, result + cb data unless --count + + if localItems + count++ + chrome.storage.local.get localItems, done + if syncItems + count++ + chrome.storage.sync.get syncItems, done + + timeout = {} setArea = (area) -> data = items[area] return if !Object.keys(data).length or timeout[area] @@ -342,11 +349,11 @@ $.set = do -> delete timeout[area] items[area] = {} - setAll = $.debounce 5 * $.SECOND, -> + setAll = $.debounce $.SECOND, -> setArea 'local' setArea 'sync' - (key, val) -> + $.set = (key, val) -> if typeof key is 'string' items.sync[key] = val else @@ -355,15 +362,18 @@ $.set = do -> items.local[key] = items.sync[key] delete items.sync[key] setAll() -$.clear = (cb) -> - count = 2 - done = -> - if chrome.runtime.lastError - c.error chrome.runtime.lastError.message - return - cb?() unless --count - chrome.storage.local.clear done - chrome.storage.sync.clear done + + $.clear = (cb) -> + items.local = {} + items.sync = {} + count = 2 + done = -> + if chrome.runtime.lastError + c.error chrome.runtime.lastError.message + return + cb?() unless --count + chrome.storage.local.clear done + chrome.storage.sync.clear done <% } else { %> # http://wiki.greasespot.net/Main_Page From 8643b8e9af1a11017fb9e6a2b02290d586e19615 Mon Sep 17 00:00:00 2001 From: Mayhem Date: Tue, 4 Feb 2014 15:37:35 +0100 Subject: [PATCH 11/35] Drop data that exceeds QUOTA_BYTES_PER_ITEM. --- src/General/lib/$.coffee | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/General/lib/$.coffee b/src/General/lib/$.coffee index 7578b27b0..1b29eb85e 100755 --- a/src/General/lib/$.coffee +++ b/src/General/lib/$.coffee @@ -343,6 +343,9 @@ do -> if chrome.runtime.lastError c.error chrome.runtime.lastError.message for key, val of data when key not of items[area] + if area is 'sync' and chrome.storage.sync.QUOTA_BYTES_PER_ITEM < JSON.stringify(val).length + key.length + c.error chrome.runtime.lastError.message, key, val + continue items[area][key] = val timeout[area] = setTimeout setArea, $.MINUTE, area return From 79758ec37b9d8196954c2cd13e78c652d7e850fd Mon Sep 17 00:00:00 2001 From: Mayhem Date: Mon, 10 Feb 2014 17:06:25 +0100 Subject: [PATCH 12/35] Fix setArea never actually retrying after an error. --- src/General/lib/$.coffee | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/General/lib/$.coffee b/src/General/lib/$.coffee index 1b29eb85e..4d2d88d58 100755 --- a/src/General/lib/$.coffee +++ b/src/General/lib/$.coffee @@ -338,7 +338,7 @@ do -> timeout = {} setArea = (area) -> data = items[area] - return if !Object.keys(data).length or timeout[area] + return if !Object.keys(data).length or timeout[area] > Date.now() chrome.storage[area].set data, -> if chrome.runtime.lastError c.error chrome.runtime.lastError.message @@ -347,7 +347,8 @@ do -> c.error chrome.runtime.lastError.message, key, val continue items[area][key] = val - timeout[area] = setTimeout setArea, $.MINUTE, area + setTimeout setArea, $.MINUTE, area + timeout[area] = Date.now() + $.MINUTE return delete timeout[area] items[area] = {} From 039464603af5f597bbe53a3c3235bb8ae9867721 Mon Sep 17 00:00:00 2001 From: Mayhem Date: Thu, 13 Feb 2014 14:41:24 +0100 Subject: [PATCH 13/35] Setting local data on Chrome is not throttled, only debounce sync. --- src/General/lib/$.coffee | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/General/lib/$.coffee b/src/General/lib/$.coffee index 4d2d88d58..730cb0623 100755 --- a/src/General/lib/$.coffee +++ b/src/General/lib/$.coffee @@ -353,8 +353,7 @@ do -> delete timeout[area] items[area] = {} - setAll = $.debounce $.SECOND, -> - setArea 'local' + setSync = $.debounce $.SECOND, -> setArea 'sync' $.set = (key, val) -> @@ -365,7 +364,8 @@ do -> for key in $.localKeys when key of items.sync items.local[key] = items.sync[key] delete items.sync[key] - setAll() + setArea 'local' + setSync() $.clear = (cb) -> items.local = {} From 13cffb606dfb308bb49d408f9448b78a36648bc3 Mon Sep 17 00:00:00 2001 From: Mayhem Date: Mon, 24 Feb 2014 21:48:35 +0100 Subject: [PATCH 14/35] $.delete needs to take into account $.localKeys. --- src/General/lib/$.coffee | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/General/lib/$.coffee b/src/General/lib/$.coffee index 730cb0623..a0b8fcaab 100755 --- a/src/General/lib/$.coffee +++ b/src/General/lib/$.coffee @@ -301,10 +301,17 @@ do -> $.delete = (keys) -> if typeof keys is 'string' keys = [keys] + local = [] + sync = [] for key in keys - delete items.local[key] - delete items.sync[key] - chrome.storage.sync.remove keys + if key in $.localKeys + local.push key + delete items.local[key] + else + sync.push key + delete items.sync[key] + chrome.storage.local.remove local + chrome.storage.sync.remove sync $.get = (key, val, cb) -> if typeof cb is 'function' From 4ce947d6865f6eb4dcd8fe9f4825364af5d7b01a Mon Sep 17 00:00:00 2001 From: ccd0 Date: Sat, 19 Jul 2014 10:28:29 -0700 Subject: [PATCH 15/35] more informative messages for Adblock/Noscript induced errors --- src/General/lib/$.coffee | 15 ++++++++++++++- src/General/lib/notice.class | 3 ++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/General/lib/$.coffee b/src/General/lib/$.coffee index a0b8fcaab..1574641c7 100755 --- a/src/General/lib/$.coffee +++ b/src/General/lib/$.coffee @@ -42,11 +42,24 @@ $.ajax = do -> # With the `If-Modified-Since` header we only receive the HTTP headers and no body for 304 responses. # This saves a lot of bandwidth and CPU time for both the users and the servers. lastModified = {} + blockedURLs = {} + blockedError = (url) -> + return if blockedURLs[url] + blockedURLs[url] = true + h_message = '<%= meta.name %> was blocked from loading the following URL:

' + h_message += '[More info]' + message = $.el 'div', innerHTML: h_message + $('span', message).textContent = (if /^\/\//.test url then location.protocol else '') + url + new Notice 'error', message, 30, -> delete blockedURLs[url] (url, options, extra={}) -> {type, whenModified, upCallbacks, form} = extra r = new XMLHttpRequest() type or= form and 'post' or 'get' - r.open type, url, true + try + r.open type, url, true + catch err + blockedError url + return options.onerror?() if whenModified r.setRequestHeader 'If-Modified-Since', lastModified[url] if url of lastModified $.on r, 'load', -> lastModified[url] = r.getResponseHeader 'Last-Modified' diff --git a/src/General/lib/notice.class b/src/General/lib/notice.class index dad665e3e..0d4ae079a 100644 --- a/src/General/lib/notice.class +++ b/src/General/lib/notice.class @@ -1,5 +1,5 @@ class Notice - constructor: (type, content, @timeout) -> + constructor: (type, content, @timeout, @onclose) -> @el = $.el 'div', innerHTML: '
' @el.style.opacity = 0 @@ -27,3 +27,4 @@ class Notice close: => $.off d, 'visibilitychange', @add $.rm @el + @onclose?() From 4db6743c30d6fe92e8ecab1a9a7ffb8f1ad75305 Mon Sep 17 00:00:00 2001 From: ccd0 Date: Sat, 19 Jul 2014 10:36:01 -0700 Subject: [PATCH 16/35] add note about recent Chromium bugs --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4481a57ed..294b19e30 100755 --- a/README.md +++ b/README.md @@ -8,7 +8,8 @@ Install [Greasemonkey](https://addons.mozilla.org/en-US/firefox/addon/greasemonk You may want to try the [Greasemonkey 2.1 beta](https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/versions/2.1beta1), which fixes bugs in 2.0 that can prevent 4chan X from updating[[1]](https://github.com/greasemonkey/greasemonkey/issues/1938) or, in some versions of Firefox, break posting images from URLs and downloading with the original filename[[2]](https://github.com/greasemonkey/greasemonkey/issues/1937). -**Note**: The combination of Firefox 29 and Greasemonkey 2.0 may cause 4chan X not to work. +### Known issues +The combination of Firefox 29 and Greasemonkey 2.0 may cause 4chan X not to work. Try [upgrading Firefox](http://www.mozilla.org/en-US/firefox/new/) to version 30 or higher. Alternatively, you can downgrade to [Greasemonkey 1.15](https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/versions/#version-1.15) and turn off automatic updates for Greasemonkey ([see pic](https://raw.githubusercontent.com/ccd0/4chan-x/master/img/2014-07-12_16-19-32.png)). @@ -18,6 +19,9 @@ This should also work for non-Windows/dev/canary Chrome and Chromium-based versi **Note**: The stable and beta releases of Chrome on Windows will disable extensions not installed from the Chrome store, so users will need to install 4chan X from [here](https://chrome.google.com/webstore/detail/4chan-x/ohnjgmpcibpbafdlkimncjhflgedgpam). +### Known issues +Some recent versions of Chromium (starting at 38.0.2085.0) suffer from a [bug](https://crbug.com/393686) that prevents extensions from making HTTP requests in the usual way. This breaks, among other things, thread updating, quick reply, and, when `JSON Navigation` is enabled, the thread index. Until this is fixed, try another version or a different browser. + ## Other browsers This fork of 4chan X is not guaranteed to work correctly in other browsers, but you are welcome to try your luck. Pull requests to fix the bugs you will likely find are always welcome. From eee78a18d879969c346c4634e9d7f32bcc262e9a Mon Sep 17 00:00:00 2001 From: ccd0 Date: Sat, 19 Jul 2014 10:39:48 -0700 Subject: [PATCH 17/35] README.md tweak --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 294b19e30..374b7c721 100755 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ New features and non-urgent bugfixes are released on the beta channel for furthe - [Firefox version](https://ccd0.github.io/4chan-x/builds/4chan-X-beta.user.js) - [Chromium version](https://ccd0.github.io/4chan-x/builds/4chan-X-beta.crx) -## [Frequently Asked Questions](https://github.com/ccd0/4chan-x/wiki/Frequently-Asked-Questions) - -## [Reporting Bugs and Contributing](https://github.com/ccd0/4chan-x/blob/master/CONTRIBUTING.md) +## More information +### [Frequently Asked Questions](https://github.com/ccd0/4chan-x/wiki/Frequently-Asked-Questions) +### [Reporting Bugs and Contributing](https://github.com/ccd0/4chan-x/blob/master/CONTRIBUTING.md) From c7ceac089ddf7e7aad8a67ca32e59136ace7646a Mon Sep 17 00:00:00 2001 From: ccd0 Date: Sat, 19 Jul 2014 10:51:32 -0700 Subject: [PATCH 18/35] move changelog images out of src directory --- CHANGELOG.md | 18 +++++++++--------- {src/General/img/changelog => img}/1.1.18.png | Bin {src/General/img/changelog => img}/1.2.0.png | Bin .../img/changelog => img}/1.2.28-2.png | Bin {src/General/img/changelog => img}/1.2.28.png | Bin {src/General/img/changelog => img}/1.2.31.png | Bin {src/General/img/changelog => img}/1.2.46.png | Bin {src/General/img/changelog => img}/1.3.6.gif | Bin {src/General/img/changelog => img}/1.4.1.png | Bin 9 files changed, 9 insertions(+), 9 deletions(-) rename {src/General/img/changelog => img}/1.1.18.png (100%) rename {src/General/img/changelog => img}/1.2.0.png (100%) rename {src/General/img/changelog => img}/1.2.28-2.png (100%) rename {src/General/img/changelog => img}/1.2.28.png (100%) rename {src/General/img/changelog => img}/1.2.31.png (100%) rename {src/General/img/changelog => img}/1.2.46.png (100%) rename {src/General/img/changelog => img}/1.3.6.gif (100%) rename {src/General/img/changelog => img}/1.4.1.png (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7a26fcf5..46533fb84 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -641,7 +641,7 @@ Remove /v/ from stable Foolz archive. **Spittie** - Check image dimension before uploading -![Check image dimension](src/General/img/changelog/1.4.1.png) +![Check image dimension](img/1.4.1.png) - Bug fixes - Update archives @@ -689,7 +689,7 @@ Remove /v/ from stable Foolz archive. **Spittie** - Upload images directly from urls -![Upload from url](src/General/img/changelog/1.3.6.gif) +![Upload from url](img/1.3.6.gif) - Add gfycat.com embedding - Replace some icons with fontawesome - Add Metro favicons (lel) @@ -765,7 +765,7 @@ Remove /v/ from stable Foolz archive. - The last index refresh timer will now indicate the last time the index changed from 4chan's side, instead of the last time you refreshed the index. - You can now refresh the index page you are on with the refresh shortcut in the header bar or the same keybind for refreshing threads. - You can now switch between paged and all-threads index modes via the "Index Navigation" header sub-menu (note that this replaces infinite scrolling):
- ![index navigation](src/General/img/changelog/1.2.46.png) + ![index navigation](img/1.2.46.png) - Threads in the index can now be sorted by: