diff --git a/src/view/AphrontView.php b/src/view/AphrontView.php index c39a729413..4df6da5417 100644 --- a/src/view/AphrontView.php +++ b/src/view/AphrontView.php @@ -50,6 +50,22 @@ abstract class AphrontView extends Phobject { } } + final protected function renderHTMLView($child) { + if ($child instanceof AphrontView) { + return phutil_safe_html($child->render()); + } else if ($child instanceof PhutilSafeHTML) { + return $child; + } else if (is_array($child)) { + $out = array(); + foreach ($child as $element) { + $out[] = $this->renderHTMLView($element); + } + return phutil_safe_html(implode('', $out)); + } else { + return phutil_safe_html(phutil_escape_html($child)); + } + } + abstract public function render(); } diff --git a/src/view/layout/PhabricatorActionListView.php b/src/view/layout/PhabricatorActionListView.php index c09b6dc454..d4a9a22fdf 100644 --- a/src/view/layout/PhabricatorActionListView.php +++ b/src/view/layout/PhabricatorActionListView.php @@ -36,12 +36,13 @@ final class PhabricatorActionListView extends AphrontView { } require_celerity_resource('phabricator-action-list-view-css'); - return phutil_render_tag( + + return phutil_tag( 'ul', array( 'class' => 'phabricator-action-list-view', ), - $this->renderSingleView($actions)); + $this->renderHTMLView($actions)); } diff --git a/src/view/layout/PhabricatorHeaderView.php b/src/view/layout/PhabricatorHeaderView.php index 7d8a6e5109..8652de7095 100644 --- a/src/view/layout/PhabricatorHeaderView.php +++ b/src/view/layout/PhabricatorHeaderView.php @@ -39,12 +39,12 @@ final class PhabricatorHeaderView extends AphrontView { } if ($this->tags) { - $header[] = phutil_render_tag( + $header[] = phutil_tag( 'span', array( 'class' => 'phabricator-header-tags', ), - self::renderSingleView($this->tags)); + $this->renderHTMLView($this->tags)); } return phutil_tag(