diff --git a/4chan_x.user.js b/4chan_x.user.js index 7577a2ede..05998b5be 100644 --- a/4chan_x.user.js +++ b/4chan_x.user.js @@ -780,6 +780,11 @@ el.removeEventListener(event, handler, false); } }, + event: function(event, detail) { + return d.dispatchEvent(new CustomEvent(event, { + detail: detail + })); + }, open: function(url) { return (GM_openInTab || window.open)(url, '_blank'); }, @@ -1017,12 +1022,10 @@ href: 'javascript:;' }); $.on(link, 'click', Settings.open); - d.dispatchEvent(new CustomEvent('AddMenuEntry', { - detail: { - type: 'header', - el: link - } - })); + $.event('AddMenuEntry', { + type: 'header', + el: link + }); link = $.el('a', { className: 'fourchan-settings-link', textContent: '4chan Settings', @@ -1031,15 +1034,13 @@ $.on(link, 'click', function() { return $.id('settingsWindowLink').click(); }); - d.dispatchEvent(new CustomEvent('AddMenuEntry', { - detail: { - type: 'header', - el: link, - open: function() { - return !Conf['Disable 4chan\'s extension']; - } + $.event('AddMenuEntry', { + type: 'header', + el: link, + open: function() { + return !Conf['Disable 4chan\'s extension']; } - })); + }); if (!Conf['Disable 4chan\'s extension']) { return; } @@ -1275,9 +1276,7 @@ type = _ref[_i]; entry.subEntries.push(Filter.menu.createSubEntry(type[0], type[1])); } - return d.dispatchEvent(new CustomEvent('AddMenuEntry', { - detail: entry - })); + return $.event('AddMenuEntry', entry); }, createSubEntry: function(text, type) { var el; @@ -1423,28 +1422,26 @@ makeStub = $.el('label', { innerHTML: " Make stub" }); - return d.dispatchEvent(new CustomEvent('AddMenuEntry', { - detail: { - type: 'post', - el: div, - open: function(_arg) { - var isReply, thread; - thread = _arg.thread, isReply = _arg.isReply; - if (isReply || thread.isHidden) { - return false; - } - ThreadHiding.menu.thread = thread; - return true; - }, - subEntries: [ - { - el: apply - }, { - el: makeStub - } - ] - } - })); + return $.event('AddMenuEntry', { + type: 'post', + el: div, + open: function(_arg) { + var isReply, thread; + thread = _arg.thread, isReply = _arg.isReply; + if (isReply || thread.isHidden) { + return false; + } + ThreadHiding.menu.thread = thread; + return true; + }, + subEntries: [ + { + el: apply + }, { + el: makeStub + } + ] + }); }, hide: function() { var makeStub, thread; @@ -1634,30 +1631,28 @@ makeStub = $.el('label', { innerHTML: " Make stub" }); - return d.dispatchEvent(new CustomEvent('AddMenuEntry', { - detail: { - type: 'post', - el: div, - open: function(post) { - if (!post.isReply || post.isClone) { - return false; - } - ReplyHiding.menu.post = post; - return true; - }, - subEntries: [ - { - el: apply - }, { - el: thisPost - }, { - el: replies - }, { - el: makeStub - } - ] - } - })); + return $.event('AddMenuEntry', { + type: 'post', + el: div, + open: function(post) { + if (!post.isReply || post.isClone) { + return false; + } + ReplyHiding.menu.post = post; + return true; + }, + subEntries: [ + { + el: apply + }, { + el: thisPost + }, { + el: replies + }, { + el: makeStub + } + ] + }); }, hide: function() { var makeStub, parent, post, replies, thisPost; @@ -1875,16 +1870,14 @@ textContent: 'Report this post' }); $.on(a, 'click', ReportLink.report); - return d.dispatchEvent(new CustomEvent('AddMenuEntry', { - detail: { - type: 'post', - el: a, - open: function(post) { - ReportLink.post = post; - return !post.isDead; - } + return $.event('AddMenuEntry', { + type: 'post', + el: a, + open: function(post) { + ReportLink.post = post; + return !post.isDead; } - })); + }); }, report: function() { var id, post, set, url; @@ -1932,29 +1925,27 @@ return !!file; } }; - d.dispatchEvent(new CustomEvent('AddMenuEntry', { - detail: { - type: 'post', - el: div, - open: function(post) { - var node, seconds; - if (post.isDead) { - return false; - } - DeleteLink.post = post; - node = div.firstChild; - if (seconds = DeleteLink.cooldown[post.fullID]) { - node.textContent = "Delete (" + seconds + ")"; - DeleteLink.cooldown.el = node; - } else { - node.textContent = 'Delete'; - delete DeleteLink.cooldown.el; - } - return true; - }, - subEntries: [postEntry, fileEntry] - } - })); + $.event('AddMenuEntry', { + type: 'post', + el: div, + open: function(post) { + var node, seconds; + if (post.isDead) { + return false; + } + DeleteLink.post = post; + node = div.firstChild; + if (seconds = DeleteLink.cooldown[post.fullID]) { + node.textContent = "Delete (" + seconds + ")"; + DeleteLink.cooldown.el = node; + } else { + node.textContent = 'Delete'; + delete DeleteLink.cooldown.el; + } + return true; + }, + subEntries: [postEntry, fileEntry] + }); return $.on(d, 'QRPostSuccessful', this.cooldown.start); }, "delete": function() { @@ -2045,22 +2036,20 @@ className: 'download-link', textContent: 'Download file' }); - return d.dispatchEvent(new CustomEvent('AddMenuEntry', { - detail: { - type: 'post', - el: a, - open: function(_arg) { - var file; - file = _arg.file; - if (!file) { - return false; - } - a.href = file.URL; - a.download = file.name; - return true; + return $.event('AddMenuEntry', { + type: 'post', + el: a, + open: function(_arg) { + var file; + file = _arg.file; + if (!file) { + return false; } + a.href = file.URL; + a.download = file.name; + return true; } - })); + }); } }; @@ -2093,9 +2082,7 @@ type = _ref[_i]; entry.subEntries.push(this.createSubEntry(type[0], type[1])); } - return d.dispatchEvent(new CustomEvent('AddMenuEntry', { - detail: entry - })); + return $.event('AddMenuEntry', entry); }, createSubEntry: function(text, type) { var el, open; diff --git a/lib/$.coffee b/lib/$.coffee index 4ff3a0715..29c1fd5ba 100644 --- a/lib/$.coffee +++ b/lib/$.coffee @@ -134,6 +134,8 @@ $.extend $, for event in events.split ' ' el.removeEventListener event, handler, false return + event: (event, detail) -> + d.dispatchEvent new CustomEvent event, {detail} open: (url) -> (GM_openInTab or window.open) url, '_blank' hidden: -> diff --git a/src/features.coffee b/src/features.coffee index 3e4e42752..9c77df8e3 100644 --- a/src/features.coffee +++ b/src/features.coffee @@ -101,10 +101,9 @@ Settings = textContent: '4chan X Settings' href: 'javascript:;' $.on link, 'click', Settings.open - d.dispatchEvent new CustomEvent 'AddMenuEntry', - detail: - type: 'header' - el: link + $.event 'AddMenuEntry', + type: 'header' + el: link # 4chan settings link link = $.el 'a', @@ -112,11 +111,10 @@ Settings = textContent: '4chan Settings' href: 'javascript:;' $.on link, 'click', -> $.id('settingsWindowLink').click() - d.dispatchEvent new CustomEvent 'AddMenuEntry', - detail: - type: 'header' - el: link - open: -> !Conf['Disable 4chan\'s extension'] + $.event 'AddMenuEntry', + type: 'header' + el: link + open: -> !Conf['Disable 4chan\'s extension'] return unless Conf['Disable 4chan\'s extension'] settings = JSON.parse(localStorage.getItem '4chan-settings') or {} @@ -328,8 +326,7 @@ Filter = # Add a sub entry for each filter type. entry.subEntries.push Filter.menu.createSubEntry type[0], type[1] - d.dispatchEvent new CustomEvent 'AddMenuEntry', - detail: entry + $.event 'AddMenuEntry', entry createSubEntry: (text, type) -> el = $.el 'a', @@ -481,16 +478,15 @@ ThreadHiding = makeStub = $.el 'label', innerHTML: " Make stub" - d.dispatchEvent new CustomEvent 'AddMenuEntry', - detail: - type: 'post' - el: div - open: ({thread, isReply}) -> - if isReply or thread.isHidden - return false - ThreadHiding.menu.thread = thread - true - subEntries: [el: apply; el: makeStub] + $.event 'AddMenuEntry', + type: 'post' + el: div + open: ({thread, isReply}) -> + if isReply or thread.isHidden + return false + ThreadHiding.menu.thread = thread + true + subEntries: [el: apply; el: makeStub] hide: -> makeStub = $('input', @parentNode).checked {thread} = ThreadHiding.menu @@ -634,16 +630,15 @@ ReplyHiding = makeStub = $.el 'label', innerHTML: " Make stub" - d.dispatchEvent new CustomEvent 'AddMenuEntry', - detail: - type: 'post' - el: div - open: (post) -> - if !post.isReply or post.isClone - return false - ReplyHiding.menu.post = post - true - subEntries: [{el: apply}, {el: thisPost}, {el: replies}, {el: makeStub}] + $.event 'AddMenuEntry', + type: 'post' + el: div + open: (post) -> + if !post.isReply or post.isClone + return false + ReplyHiding.menu.post = post + true + subEntries: [{el: apply}, {el: thisPost}, {el: replies}, {el: makeStub}] hide: -> parent = @parentNode thisPost = $('input[name=thisPost]', parent).checked @@ -804,13 +799,12 @@ ReportLink = href: 'javascript:;' textContent: 'Report this post' $.on a, 'click', ReportLink.report - d.dispatchEvent new CustomEvent 'AddMenuEntry', - detail: - type: 'post' - el: a - open: (post) -> - ReportLink.post = post - !post.isDead + $.event 'AddMenuEntry', + type: 'post' + el: a + open: (post) -> + ReportLink.post = post + !post.isDead report: -> {post} = ReportLink url = "//sys.4chan.org/#{post.board}/imgboard.php?mode=report&no=#{post}" @@ -845,22 +839,21 @@ DeleteLink = $.on fileEl, 'click', DeleteLink.delete !!file - d.dispatchEvent new CustomEvent 'AddMenuEntry', - detail: - type: 'post' - el: div - open: (post) -> - return false if post.isDead - DeleteLink.post = post - node = div.firstChild - if seconds = DeleteLink.cooldown[post.fullID] - node.textContent = "Delete (#{seconds})" - DeleteLink.cooldown.el = node - else - node.textContent = 'Delete' - delete DeleteLink.cooldown.el - true - subEntries: [postEntry, fileEntry] + $.event 'AddMenuEntry', + type: 'post' + el: div + open: (post) -> + return false if post.isDead + DeleteLink.post = post + node = div.firstChild + if seconds = DeleteLink.cooldown[post.fullID] + node.textContent = "Delete (#{seconds})" + DeleteLink.cooldown.el = node + else + node.textContent = 'Delete' + delete DeleteLink.cooldown.el + true + subEntries: [postEntry, fileEntry] $.on d, 'QRPostSuccessful', @cooldown.start @@ -935,15 +928,14 @@ DownloadLink = a = $.el 'a', className: 'download-link' textContent: 'Download file' - d.dispatchEvent new CustomEvent 'AddMenuEntry', - detail: - type: 'post' - el: a - open: ({file}) -> - return false unless file - a.href = file.URL - a.download = file.name - true + $.event 'AddMenuEntry', + type: 'post' + el: a + open: ({file}) -> + return false unless file + a.href = file.URL + a.download = file.name + true ArchiveLink = init: -> @@ -975,8 +967,7 @@ ArchiveLink = # Add a sub entry for each type. entry.subEntries.push @createSubEntry type[0], type[1] - d.dispatchEvent new CustomEvent 'AddMenuEntry', - detail: entry + $.event 'AddMenuEntry', entry createSubEntry: (text, type) -> el = $.el 'a',