diff --git a/CHANGELOG.md b/CHANGELOG.md index 94754ea4..b1b1aa1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ * **1.4 (not yet released)** * ADDED: Translation for Bulgarian (#455) * CHANGED: Improved mobile UI - obscured send button and hard to click shortener button (#477) + * CHANGED: Enhanced URL shortener integration (#479) + * FIXED: Clicking 'New' on a previously submitted paste does not blank address bar (#354) + * FIXED: Clear address bar when create new paste from existing paste (#479) + * FIXED: Discussion section not hiding when new/clone paste is clicked on (#484) * **1.3 (2019-07-09)** * ADDED: Translation for Czech (#424) * ADDED: Threat modeled the application (#177) diff --git a/js/privatebin.js b/js/privatebin.js index 1669d7b0..72b73403 100644 --- a/js/privatebin.js +++ b/js/privatebin.js @@ -1711,8 +1711,58 @@ jQuery.PrivateBin = (function($, RawDeflate) { */ function sendToShortener() { - window.location.href = $shortenButton.data('shortener') + - encodeURIComponent($pasteUrl.attr('href')); + if ($shortenButton.hasClass('buttondisabled')) { + return; + } + $.ajax({ + type: 'GET', + url: `${$shortenButton.data('shortener')}${encodeURIComponent($pasteUrl.attr('href'))}`, + headers: {'Accept': 'text/html, application/xhtml+xml, application/xml, application/json'}, + processData: false, + timeout: 10000, + xhrFields: { + withCredentials: false + }, + success: function(response) { + let responseString = response; + if (typeof responseString === 'object') { + responseString = JSON.stringify(responseString); + } + if (typeof responseString === 'string' && responseString.length > 0) { + const shortUrlMatcher = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/g; + const shortUrl = (responseString.match(shortUrlMatcher) || []).sort(function(a, b) { + return a.length - b.length; + })[0]; + if (typeof shortUrl === 'string' && shortUrl.length > 0) { + $('#pastelink').html( + I18n._( + 'Your paste is %s (Hit [Ctrl]+[c] to copy)', + shortUrl, shortUrl + ) + ); + // we disable the button to avoid calling shortener again + $shortenButton.addClass('buttondisabled'); + // save newly created element + $pasteUrl = $('#pasteurl'); + // we pre-select the link so that the user only has to [Ctrl]+[c] the link + Helper.selectText($pasteUrl[0]); + return; + } + } + Alert.showError( + I18n._('Cannot parse response from URL shortener.') + ); + } + }) + .fail(function(data, textStatus, errorThrown) { + console.error(textStatus, errorThrown); + // we don't know why it failed, could be CORS of the external server not setup properly, in which case we follow old behavior to open it in new tab + window.open( + `${$shortenButton.data('shortener')}${encodeURIComponent($pasteUrl.attr('href'))}`, + '_blank', + 'noopener, noreferrer' + ) + }); } /** @@ -1754,9 +1804,12 @@ jQuery.PrivateBin = (function($, RawDeflate) { // and add click event $pasteUrl.click(pasteLinkClick); - // shorten button + // delete link $('#deletelink').html('' + I18n._('Delete data') + ''); + // enable shortener button + $shortenButton.removeClass('buttondisabled'); + // show result $pasteSuccess.removeClass('hidden'); // we pre-select the link so that the user only has to [Ctrl]+[c] the link @@ -4688,6 +4741,10 @@ jQuery.PrivateBin = (function($, RawDeflate) { TopNav.showCreateButtons(); Alert.hideLoading(); + history.pushState({type: 'create'}, document.title, Helper.baseUri()); + + // clear discussion + DiscussionViewer.prepareNewDiscussion(); }; /** @@ -4800,6 +4857,9 @@ jQuery.PrivateBin = (function($, RawDeflate) { Editor.show(); TopNav.showCreateButtons(); + + // clear discussion + DiscussionViewer.prepareNewDiscussion(); }; /** diff --git a/tpl/bootstrap.php b/tpl/bootstrap.php index 2ace4343..3715baa4 100644 --- a/tpl/bootstrap.php +++ b/tpl/bootstrap.php @@ -71,7 +71,7 @@ if ($MARKDOWN): endif; ?> - + diff --git a/tpl/page.php b/tpl/page.php index c330720b..49bcc107 100644 --- a/tpl/page.php +++ b/tpl/page.php @@ -49,7 +49,7 @@ if ($MARKDOWN): endif; ?> - +