diff --git a/CHANGELOG.md b/CHANGELOG.md
index ebb8d41a6..70d981116 100755
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,9 @@ The links to individual versions below are to copies of the script with the upda
### v1.10.8
+**v1.10.8.10** *(2015-04-13)* - [[Firefox](https://raw.githubusercontent.com/ccd0/4chan-x/1.10.8.10/builds/4chan-X-noupdate.user.js "Firefox version")] [[Chromium](https://raw.githubusercontent.com/ccd0/4chan-x/1.10.8.10/builds/4chan-X-noupdate.crx "Chromium version")]
+- Fix unwanted focusing on the submit button if you focus on the comment field too soon after entering the captcha.
+
**v1.10.8.9** *(2015-04-13)* - [[Firefox](https://raw.githubusercontent.com/ccd0/4chan-x/1.10.8.9/builds/4chan-X-noupdate.user.js "Firefox version")] [[Chromium](https://raw.githubusercontent.com/ccd0/4chan-x/1.10.8.9/builds/4chan-X-noupdate.crx "Chromium version")]
- (fgts) Remove /fit/ from fgts archive.
diff --git a/Gruntfile.coffee b/Gruntfile.coffee
index 188cf337b..ba1d5a8c3 100755
--- a/Gruntfile.coffee
+++ b/Gruntfile.coffee
@@ -1,4 +1,6 @@
+path = require 'path'
crx = require 'crx'
+JSZip = require 'jszip'
module.exports = (grunt) ->
grunt.util.linefeed = '\n'
@@ -234,25 +236,6 @@ module.exports = (grunt) ->
]
tasks: 'build'
- crx:
- prod:
- src: 'testbuilds/crx<%= pkg.meta.suffix[pkg.channel] %>/'
- dest: 'testbuilds/<%= pkg.name %><%= pkg.meta.suffix[pkg.channel] %>.crx'
- privateKey: '../<%= pkg.name %>-keys/<%= pkg.name %>.pem'
-
- compress:
- crx:
- options:
- archive: 'testbuilds/<%= pkg.name %><%= pkg.meta.suffix[pkg.channel] %>.crx.zip'
- level: 9
- pretty: true
- expand: true
- flatten: true
- src: 'testbuilds/crx<%= pkg.meta.suffix[pkg.channel] %>/*'
- dest: '/'
- date: '<%= pkg.meta.date %>'
- mode: parseInt('644', 8)
-
clean:
builds: 'builds'
testbuilds: 'testbuilds'
@@ -335,7 +318,7 @@ module.exports = (grunt) ->
grunt.registerTask 'build-crx-channel', [
'concat:crx'
'copy:crx'
- 'compress:crx'
+ 'zip-crx'
]
grunt.registerTask 'build-crx', [
@@ -354,6 +337,17 @@ module.exports = (grunt) ->
'clean:tmpcrx'
]
+ grunt.registerTask 'zip-crx', 'Pack CRX contents in ZIP file', ->
+ pkg = grunt.config 'pkg'
+ zip = new JSZip()
+ for file in grunt.file.expand "testbuilds/crx#{pkg.meta.suffix[pkg.channel]}/*"
+ zip.file path.basename(file), grunt.file.read(file, {encoding: null}), {date: new Date(pkg.meta.date)}
+ output = zip.generate
+ type: 'nodebuffer'
+ compression: 'DEFLATE'
+ compressionOptions: {level: 9}
+ grunt.file.write "testbuilds/#{pkg.name}#{pkg.meta.suffix[pkg.channel]}.crx.zip", output
+
grunt.registerTask 'sign-channel', 'Sign CRX package', (channel) ->
done = @async()
pkg = grunt.config 'pkg'
diff --git a/builds/4chan-X-beta.crx b/builds/4chan-X-beta.crx
index 755e3ff6f..0aa8adce8 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 d51d96bc2..ae8e67bf0 100644
--- a/builds/4chan-X-beta.meta.js
+++ b/builds/4chan-X-beta.meta.js
@@ -1,6 +1,6 @@
// ==UserScript==
// @name 4chan X beta
-// @version 1.10.8.9
+// @version 1.10.8.10
// @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 c78dc1b86..ec3a6db7e 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 beta
-// @version 1.10.8.9
+// @version 1.10.8.10
// @minGMVer 1.14
// @minFFVer 26
// @namespace 4chan-X
@@ -396,7 +396,7 @@
doc = d.documentElement;
g = {
- VERSION: '1.10.8.9',
+ VERSION: '1.10.8.10',
NAMESPACE: '4chan X.',
boards: {}
};
@@ -8132,7 +8132,7 @@
}
},
save: function(pasted) {
- var base1;
+ var base1, focus, ref, ref1;
$.forceSync('captchas');
this.captchas.push({
response: $('textarea', this.nodes.container).value,
@@ -8148,6 +8148,7 @@
}
this.reload();
} else {
+ focus = ((ref = d.activeElement) != null ? ref.nodeName : void 0) === 'IFRAME' && ((ref1 = d.activeElement.src) != null ? ref1.slice(0, 38) : void 0) === 'https://www.google.com/recaptcha/api2/';
if (pasted) {
this.destroy();
} else {
@@ -8155,7 +8156,9 @@
base1.destroy = setTimeout(this.destroy.bind(this), 3 * $.SECOND);
}
}
- QR.nodes.status.focus();
+ if (focus) {
+ QR.nodes.status.focus();
+ }
}
if (Conf['Post on Captcha Completion'] && !QR.cooldown.auto) {
return QR.submit();
diff --git a/builds/4chan-X-noupdate.crx b/builds/4chan-X-noupdate.crx
index 47840c735..72343fe48 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 d2066020b..688559074 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.10.8.9
+// @version 1.10.8.10
// @minGMVer 1.14
// @minFFVer 26
// @namespace 4chan-X
@@ -395,7 +395,7 @@
doc = d.documentElement;
g = {
- VERSION: '1.10.8.9',
+ VERSION: '1.10.8.10',
NAMESPACE: '4chan X.',
boards: {}
};
@@ -8131,7 +8131,7 @@
}
},
save: function(pasted) {
- var base1;
+ var base1, focus, ref, ref1;
$.forceSync('captchas');
this.captchas.push({
response: $('textarea', this.nodes.container).value,
@@ -8147,6 +8147,7 @@
}
this.reload();
} else {
+ focus = ((ref = d.activeElement) != null ? ref.nodeName : void 0) === 'IFRAME' && ((ref1 = d.activeElement.src) != null ? ref1.slice(0, 38) : void 0) === 'https://www.google.com/recaptcha/api2/';
if (pasted) {
this.destroy();
} else {
@@ -8154,7 +8155,9 @@
base1.destroy = setTimeout(this.destroy.bind(this), 3 * $.SECOND);
}
}
- QR.nodes.status.focus();
+ if (focus) {
+ QR.nodes.status.focus();
+ }
}
if (Conf['Post on Captcha Completion'] && !QR.cooldown.auto) {
return QR.submit();
diff --git a/builds/4chan-X.crx b/builds/4chan-X.crx
index 2bd888c58..2f7f5e1ce 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 6f9db5ad5..20a800ebf 100644
--- a/builds/4chan-X.meta.js
+++ b/builds/4chan-X.meta.js
@@ -1,6 +1,6 @@
// ==UserScript==
// @name 4chan X
-// @version 1.10.8.9
+// @version 1.10.8.10
// @minGMVer 1.14
// @minFFVer 26
// @namespace 4chan-X
diff --git a/builds/4chan-X.user.js b/builds/4chan-X.user.js
index ac91991ec..9f6db8a86 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.10.8.9
+// @version 1.10.8.10
// @minGMVer 1.14
// @minFFVer 26
// @namespace 4chan-X
@@ -396,7 +396,7 @@
doc = d.documentElement;
g = {
- VERSION: '1.10.8.9',
+ VERSION: '1.10.8.10',
NAMESPACE: '4chan X.',
boards: {}
};
@@ -8132,7 +8132,7 @@
}
},
save: function(pasted) {
- var base1;
+ var base1, focus, ref, ref1;
$.forceSync('captchas');
this.captchas.push({
response: $('textarea', this.nodes.container).value,
@@ -8148,6 +8148,7 @@
}
this.reload();
} else {
+ focus = ((ref = d.activeElement) != null ? ref.nodeName : void 0) === 'IFRAME' && ((ref1 = d.activeElement.src) != null ? ref1.slice(0, 38) : void 0) === 'https://www.google.com/recaptcha/api2/';
if (pasted) {
this.destroy();
} else {
@@ -8155,7 +8156,9 @@
base1.destroy = setTimeout(this.destroy.bind(this), 3 * $.SECOND);
}
}
- QR.nodes.status.focus();
+ if (focus) {
+ QR.nodes.status.focus();
+ }
}
if (Conf['Post on Captcha Completion'] && !QR.cooldown.auto) {
return QR.submit();
diff --git a/builds/4chan-X.zip b/builds/4chan-X.zip
index f3ffaec7d..128e0a82e 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 a39527fa2..e5b8161a7 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 a97440e34..709f70a64 100644
--- a/builds/updates.xml
+++ b/builds/updates.xml
@@ -1,7 +1,7 @@
-
+
diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json
index 46cc83a2c..686d074f5 100644
--- a/npm-shrinkwrap.json
+++ b/npm-shrinkwrap.json
@@ -465,198 +465,6 @@
}
}
},
- "grunt-contrib-compress": {
- "version": "0.13.0",
- "resolved": "https://registry.npmjs.org/grunt-contrib-compress/-/grunt-contrib-compress-0.13.0.tgz",
- "dependencies": {
- "archiver": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/archiver/-/archiver-0.13.1.tgz",
- "dependencies": {
- "async": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/async/-/async-0.9.0.tgz"
- },
- "buffer-crc32": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.5.tgz"
- },
- "glob": {
- "version": "4.3.5",
- "resolved": "https://registry.npmjs.org/glob/-/glob-4.3.5.tgz",
- "dependencies": {
- "inflight": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz",
- "dependencies": {
- "wrappy": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz"
- }
- }
- },
- "inherits": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
- },
- "minimatch": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.1.tgz",
- "dependencies": {
- "brace-expansion": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.0.tgz",
- "dependencies": {
- "balanced-match": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.0.tgz"
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
- }
- }
- }
- }
- },
- "once": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/once/-/once-1.3.1.tgz",
- "dependencies": {
- "wrappy": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz"
- }
- }
- }
- }
- },
- "lazystream": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-0.1.0.tgz"
- },
- "lodash": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz"
- },
- "readable-stream": {
- "version": "1.0.33",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz",
- "dependencies": {
- "core-util-is": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz"
- },
- "inherits": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
- },
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz"
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz"
- }
- }
- },
- "tar-stream": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.1.2.tgz",
- "dependencies": {
- "bl": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.3.tgz"
- },
- "end-of-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.1.0.tgz",
- "dependencies": {
- "once": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/once/-/once-1.3.1.tgz",
- "dependencies": {
- "wrappy": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz"
- }
- }
- }
- }
- },
- "xtend": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.0.tgz"
- }
- }
- },
- "zip-stream": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-0.5.0.tgz",
- "dependencies": {
- "compress-commons": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-0.2.0.tgz",
- "dependencies": {
- "crc32-stream": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-0.3.1.tgz"
- },
- "node-int64": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.3.3.tgz"
- }
- }
- }
- }
- }
- }
- },
- "chalk": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz",
- "dependencies": {
- "ansi-styles": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz"
- },
- "escape-string-regexp": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz"
- },
- "has-ansi": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz",
- "dependencies": {
- "ansi-regex": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz"
- }
- }
- },
- "strip-ansi": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz",
- "dependencies": {
- "ansi-regex": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz"
- }
- }
- },
- "supports-color": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz"
- }
- }
- },
- "prettysize": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/prettysize/-/prettysize-0.0.3.tgz"
- }
- }
- },
"grunt-contrib-concat": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-0.5.1.tgz",
@@ -1081,6 +889,16 @@
}
}
},
+ "jszip": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/jszip/-/jszip-2.5.0.tgz",
+ "dependencies": {
+ "pako": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.6.tgz"
+ }
+ }
+ },
"load-grunt-tasks": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/load-grunt-tasks/-/load-grunt-tasks-3.1.0.tgz",
diff --git a/package.json b/package.json
index f63b265c9..bd924b3a7 100755
--- a/package.json
+++ b/package.json
@@ -3,8 +3,8 @@
"description": "Cross-browser userscript for maximum lurking on 4chan.",
"meta": {
"name": "4chan X",
- "version": "1.10.8.9",
- "date": "2015-04-13T15:07:30.185Z",
+ "version": "1.10.8.10",
+ "date": "2015-04-14T03:57:38.704Z",
"repo": "https://github.com/ccd0/4chan-x/",
"page": "https://github.com/ccd0/4chan-x",
"downloads": "https://ccd0.github.io/4chan-x/builds/",
@@ -49,7 +49,6 @@
"grunt-concurrent": "^1.0.0",
"grunt-contrib-clean": "^0.6.0",
"grunt-contrib-coffee": "^0.13.0",
- "grunt-contrib-compress": "^0.13.0",
"grunt-contrib-concat": "^0.5.1",
"grunt-contrib-copy": "^0.8.0",
"grunt-contrib-jshint": "^0.11.1",
@@ -57,6 +56,7 @@
"grunt-markdown": "^0.7.0",
"grunt-shell": "^1.1.2",
"grunt-webstore-upload": "^0.8.2",
+ "jszip": "^2.5.0",
"load-grunt-tasks": "^3.1.0",
"npm-shrinkwrap": "^5.3.0"
},
diff --git a/src/Posting/Captcha.v2.coffee b/src/Posting/Captcha.v2.coffee
index 1aad5b1d7..f090df6bc 100644
--- a/src/Posting/Captcha.v2.coffee
+++ b/src/Posting/Captcha.v2.coffee
@@ -155,11 +155,12 @@ Captcha.v2 =
QR.nodes.status.focus()
@reload()
else
+ focus = d.activeElement?.nodeName is 'IFRAME' and d.activeElement.src?[...38] is 'https://www.google.com/recaptcha/api2/'
if pasted
@destroy()
else
@timeouts.destroy ?= setTimeout @destroy.bind(@), 3 * $.SECOND
- QR.nodes.status.focus()
+ QR.nodes.status.focus() if focus
QR.submit() if Conf['Post on Captcha Completion'] and !QR.cooldown.auto