diff --git a/resources/celerity/map.php b/resources/celerity/map.php --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -10,7 +10,7 @@ 'conpherence.pkg.css' => 'e68cf1fa', 'conpherence.pkg.js' => '15191c65', 'core.pkg.css' => '8be474cc', - 'core.pkg.js' => 'e1f0f7bd', + 'core.pkg.js' => 'e452721e', 'differential.pkg.css' => '06dc617c', 'differential.pkg.js' => 'c2ca903a', 'diffusion.pkg.css' => 'a2d17c7d', @@ -259,7 +259,7 @@ 'rsrc/externals/javelin/lib/__tests__/URI.js' => '1e45fda9', 'rsrc/externals/javelin/lib/__tests__/behavior.js' => '1ea62783', 'rsrc/externals/javelin/lib/behavior.js' => '61cbc29a', - 'rsrc/externals/javelin/lib/control/tokenizer/Tokenizer.js' => '8d3bc1b2', + 'rsrc/externals/javelin/lib/control/tokenizer/Tokenizer.js' => 'dfaf006b', 'rsrc/externals/javelin/lib/control/typeahead/Typeahead.js' => '70baed2f', 'rsrc/externals/javelin/lib/control/typeahead/normalizer/TypeaheadNormalizer.js' => '185bbd53', 'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadCompositeSource.js' => '503e17fd', @@ -710,7 +710,7 @@ 'javelin-scrollbar' => '9065f639', 'javelin-sound' => '949c0fe5', 'javelin-stratcom' => '327f418a', - 'javelin-tokenizer' => '8d3bc1b2', + 'javelin-tokenizer' => 'dfaf006b', 'javelin-typeahead' => '70baed2f', 'javelin-typeahead-composite-source' => '503e17fd', 'javelin-typeahead-normalizer' => '185bbd53', @@ -1573,12 +1573,6 @@ 'javelin-stratcom', 'javelin-behavior', ), - '8d3bc1b2' => array( - 'javelin-dom', - 'javelin-util', - 'javelin-stratcom', - 'javelin-install', - ), '8d4a8c72' => array( 'javelin-install', 'javelin-dom', @@ -2025,6 +2019,12 @@ 'phuix-icon-view', 'phabricator-prefab', ), + 'dfaf006b' => array( + 'javelin-dom', + 'javelin-util', + 'javelin-stratcom', + 'javelin-install', + ), 'e1d25dfb' => array( 'javelin-behavior', 'javelin-stratcom', diff --git a/src/applications/paste/conduit/PasteCreateConduitAPIMethod.php b/src/applications/paste/conduit/PasteCreateConduitAPIMethod.php --- a/src/applications/paste/conduit/PasteCreateConduitAPIMethod.php +++ b/src/applications/paste/conduit/PasteCreateConduitAPIMethod.php @@ -64,9 +64,12 @@ ->setTransactionType(PhabricatorPasteTitleTransaction::TRANSACTIONTYPE) ->setNewValue($title); - $xactions[] = id(new PhabricatorPasteTransaction()) - ->setTransactionType(PhabricatorPasteLanguageTransaction::TRANSACTIONTYPE) - ->setNewValue($language); + if (strlen($language)) { + $xactions[] = id(new PhabricatorPasteTransaction()) + ->setTransactionType( + PhabricatorPasteLanguageTransaction::TRANSACTIONTYPE) + ->setNewValue($language); + } $editor = id(new PhabricatorPasteEditor()) ->setActor($viewer) diff --git a/src/applications/paste/xaction/PhabricatorPasteLanguageTransaction.php b/src/applications/paste/xaction/PhabricatorPasteLanguageTransaction.php --- a/src/applications/paste/xaction/PhabricatorPasteLanguageTransaction.php +++ b/src/applications/paste/xaction/PhabricatorPasteLanguageTransaction.php @@ -38,4 +38,20 @@ $this->renderLanguageValue($this->getNewValue())); } + public function validateTransactions($object, array $xactions) { + $errors = array(); + + foreach ($xactions as $xaction) { + $new = $xaction->getNewValue(); + + if ($new !== null && !strlen($new)) { + $errors[] = $this->newInvalidError( + pht('Paste language must be null or a nonempty string.'), + $xaction); + } + } + + return $errors; + } + } diff --git a/webroot/rsrc/externals/javelin/lib/control/tokenizer/Tokenizer.js b/webroot/rsrc/externals/javelin/lib/control/tokenizer/Tokenizer.js --- a/webroot/rsrc/externals/javelin/lib/control/tokenizer/Tokenizer.js +++ b/webroot/rsrc/externals/javelin/lib/control/tokenizer/Tokenizer.js @@ -395,8 +395,12 @@ break; case 'delete': if (!this._focus.value.length) { + // In unusual cases, it's possible for us to end up with a token + // that has the empty string ("") as a value. Support removal of + // this unusual token. + var tok; - while ((tok = this._tokens.pop())) { + while ((tok = this._tokens.pop()) !== null) { if (this._remove(tok, true)) { break; }