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;
?>
-
+