Differential D11680 Diff 28251 src/applications/differential/render/DifferentialChangesetHTMLRenderer.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/differential/render/DifferentialChangesetHTMLRenderer.php
<?php | <?php | ||||
abstract class DifferentialChangesetHTMLRenderer | abstract class DifferentialChangesetHTMLRenderer | ||||
extends DifferentialChangesetRenderer { | extends DifferentialChangesetRenderer { | ||||
protected function renderChangeTypeHeader($force) { | protected function renderChangeTypeHeader($force) { | ||||
$changeset = $this->getChangeset(); | $changeset = $this->getChangeset(); | ||||
$change = $changeset->getChangeType(); | $change = $changeset->getChangeType(); | ||||
$file = $changeset->getFileType(); | $file = $changeset->getFileType(); | ||||
$messages = array(); | $messages = array(); | ||||
$none = hsprintf(''); | |||||
epriestley: This garbage is forcing `pht()` to return HTML. Without it, the `<strong>` tags in `pht()` will… | |||||
switch ($change) { | switch ($change) { | ||||
case DifferentialChangeType::TYPE_ADD: | case DifferentialChangeType::TYPE_ADD: | ||||
switch ($file) { | switch ($file) { | ||||
case DifferentialChangeType::FILE_TEXT: | case DifferentialChangeType::FILE_TEXT: | ||||
$messages[] = pht( | $messages[] = pht('This file was added.'); | ||||
'This file was <strong>added</strong>.', | |||||
$none); | |||||
break; | break; | ||||
case DifferentialChangeType::FILE_IMAGE: | case DifferentialChangeType::FILE_IMAGE: | ||||
$messages[] = pht( | $messages[] = pht('This image was added.'); | ||||
'This image was <strong>added</strong>.', | |||||
$none); | |||||
break; | break; | ||||
case DifferentialChangeType::FILE_DIRECTORY: | case DifferentialChangeType::FILE_DIRECTORY: | ||||
$messages[] = pht( | $messages[] = pht('This directory was added.'); | ||||
'This directory was <strong>added</strong>.', | |||||
$none); | |||||
break; | break; | ||||
case DifferentialChangeType::FILE_BINARY: | case DifferentialChangeType::FILE_BINARY: | ||||
$messages[] = pht( | $messages[] = pht('This binary file was added.'); | ||||
'This binary file was <strong>added</strong>.', | |||||
$none); | |||||
break; | break; | ||||
case DifferentialChangeType::FILE_SYMLINK: | case DifferentialChangeType::FILE_SYMLINK: | ||||
$messages[] = pht( | $messages[] = pht('This symlink was added.'); | ||||
'This symlink was <strong>added</strong>.', | |||||
$none); | |||||
break; | break; | ||||
case DifferentialChangeType::FILE_SUBMODULE: | case DifferentialChangeType::FILE_SUBMODULE: | ||||
$messages[] = pht( | $messages[] = pht('This submodule was added.'); | ||||
'This submodule was <strong>added</strong>.', | |||||
$none); | |||||
break; | break; | ||||
} | } | ||||
break; | break; | ||||
case DifferentialChangeType::TYPE_DELETE: | case DifferentialChangeType::TYPE_DELETE: | ||||
switch ($file) { | switch ($file) { | ||||
case DifferentialChangeType::FILE_TEXT: | case DifferentialChangeType::FILE_TEXT: | ||||
$messages[] = pht( | $messages[] = pht('This file was deleted.'); | ||||
'This file was <strong>deleted</strong>.', | |||||
$none); | |||||
break; | break; | ||||
case DifferentialChangeType::FILE_IMAGE: | case DifferentialChangeType::FILE_IMAGE: | ||||
$messages[] = pht( | $messages[] = pht('This image was deleted.'); | ||||
'This image was <strong>deleted</strong>.', | |||||
$none); | |||||
break; | break; | ||||
case DifferentialChangeType::FILE_DIRECTORY: | case DifferentialChangeType::FILE_DIRECTORY: | ||||
$messages[] = pht( | $messages[] = pht('This directory was deleted.'); | ||||
'This directory was <strong>deleted</strong>.', | |||||
$none); | |||||
break; | break; | ||||
case DifferentialChangeType::FILE_BINARY: | case DifferentialChangeType::FILE_BINARY: | ||||
$messages[] = pht( | $messages[] = pht('This binary file was deleted.'); | ||||
'This binary file was <strong>deleted</strong>.', | |||||
$none); | |||||
break; | break; | ||||
case DifferentialChangeType::FILE_SYMLINK: | case DifferentialChangeType::FILE_SYMLINK: | ||||
$messages[] = pht( | $messages[] = pht('This symlink was deleted.'); | ||||
'This symlink was <strong>deleted</strong>.', | |||||
$none); | |||||
break; | break; | ||||
case DifferentialChangeType::FILE_SUBMODULE: | case DifferentialChangeType::FILE_SUBMODULE: | ||||
$messages[] = pht( | $messages[] = pht('This submodule was deleted.'); | ||||
'This submodule was <strong>deleted</strong>.', | |||||
$none); | |||||
break; | break; | ||||
} | } | ||||
break; | break; | ||||
case DifferentialChangeType::TYPE_MOVE_HERE: | case DifferentialChangeType::TYPE_MOVE_HERE: | ||||
$from = phutil_tag('strong', array(), $changeset->getOldFile()); | $from = phutil_tag('strong', array(), $changeset->getOldFile()); | ||||
switch ($file) { | switch ($file) { | ||||
case DifferentialChangeType::FILE_TEXT: | case DifferentialChangeType::FILE_TEXT: | ||||
▲ Show 20 Lines • Show All 370 Lines • Show Last 20 Lines |
This garbage is forcing pht() to return HTML. Without it, the <strong> tags in pht() will be interpreted as text and escaped (I think? We don't do this anymore so I'm actually not 100% sure of the rule).
I think we should generally move toward preventing this; the number of cases where we use this technique is very, very small and it's virtually nonexistent in the modern codebase. Nearly all modern code which does this is putting stuff like tt around a command, and we now do %s ... phutil_tag('tt', array(), ...), which is slightly more cumbersome but far better from a translatability/security/consistency/simplicity/explicitness point of view.
I'd suggest this fix:
As written, I would expect this to now render the <strong> tags so they appear as text in the UI when presented to the viewer.