From 49b57eae7df52c189aef1d973823c697fc97fd4b Mon Sep 17 00:00:00 2001 From: epriestley Date: Wed, 22 Nov 2017 14:27:28 -0800 Subject: [PATCH] Revert partial/nonfunctional OpenGraph support Summary: Ref T13018. See that task and the Discourse thread for discussion. This doesn't work as-is and we need to `og:description` everything to make it work. I don't want to sink any more time into this so just back all the changes out for now. (The `` change is unnecessary anyway.) Test Plan: Strict revert. Reviewers: amckinley Reviewed By: amckinley Maniphest Tasks: T13018 Differential Revision: https://secure.phabricator.com/D18782 --- resources/celerity/map.php | 1 - .../PhabricatorCustomLogoConfigType.php | 33 ------------- src/view/page/AphrontPageView.php | 9 +--- src/view/page/PhabricatorStandardPageView.php | 46 +----------------- .../page/menu/PhabricatorMainMenuView.php | 36 +++++++++++--- webroot/rsrc/favicons/opengraph-144x144.png | Bin 13270 -> 0 bytes 6 files changed, 31 insertions(+), 94 deletions(-) delete mode 100644 webroot/rsrc/favicons/opengraph-144x144.png diff --git a/resources/celerity/map.php b/resources/celerity/map.php index 45da85c7f1..78ae8bd461 100644 --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -292,7 +292,6 @@ return array( 'rsrc/favicons/mstile-310x150.png' => '4a49d3ee', 'rsrc/favicons/mstile-310x310.png' => 'a52ab264', 'rsrc/favicons/mstile-70x70.png' => '5edce7b8', - 'rsrc/favicons/opengraph-144x144.png' => '648fb0fc', 'rsrc/image/BFCFDA.png' => 'd5ec91f4', 'rsrc/image/actions/edit.png' => '2fc41442', 'rsrc/image/avatar.png' => '17d346a4', diff --git a/src/applications/config/custom/PhabricatorCustomLogoConfigType.php b/src/applications/config/custom/PhabricatorCustomLogoConfigType.php index cf4dfda2b5..ff29050602 100644 --- a/src/applications/config/custom/PhabricatorCustomLogoConfigType.php +++ b/src/applications/config/custom/PhabricatorCustomLogoConfigType.php @@ -13,39 +13,6 @@ final class PhabricatorCustomLogoConfigType return idx($logo, 'wordmarkText'); } - public static function getLogoURI(PhabricatorUser $viewer) { - $logo_uri = null; - - $custom_header = self::getLogoImagePHID(); - if ($custom_header) { - $cache = PhabricatorCaches::getImmutableCache(); - $cache_key_logo = 'ui.custom-header.logo-phid.v3.'.$custom_header; - $logo_uri = $cache->getKey($cache_key_logo); - - if (!$logo_uri) { - // NOTE: If the file policy has been changed to be restrictive, we'll - // miss here and just show the default logo. The cache will fill later - // when someone who can see the file loads the page. This might be a - // little spooky, see T11982. - $files = id(new PhabricatorFileQuery()) - ->setViewer($viewer) - ->withPHIDs(array($custom_header)) - ->execute(); - $file = head($files); - if ($file) { - $logo_uri = $file->getViewURI(); - $cache->setKey($cache_key_logo, $logo_uri); - } - } - } - - if (!$logo_uri) { - $logo_uri = celerity_get_resource_uri('/rsrc/image/logo/light-eye.png'); - } - - return $logo_uri; - } - public function validateOption(PhabricatorConfigOption $option, $value) { if (!is_array($value)) { throw new Exception( diff --git a/src/view/page/AphrontPageView.php b/src/view/page/AphrontPageView.php index bea516a8cf..8f3704dca2 100644 --- a/src/view/page/AphrontPageView.php +++ b/src/view/page/AphrontPageView.php @@ -59,15 +59,9 @@ abstract class AphrontPageView extends AphrontView { ), array($body, $tail)); - if (PhabricatorEnv::getEnvConfig('policy.allow-public')) { - $html_open_tag = hsprintf(''); - } else { - $html_open_tag = hsprintf(''); - } - $response = hsprintf( ''. - '%s'. + ''. ''. ''. '%s'. @@ -75,7 +69,6 @@ abstract class AphrontPageView extends AphrontView { ''. '%s'. '', - $html_open_tag, $title, $head, $body); diff --git a/src/view/page/PhabricatorStandardPageView.php b/src/view/page/PhabricatorStandardPageView.php index b4e706ab0b..78ff716a44 100644 --- a/src/view/page/PhabricatorStandardPageView.php +++ b/src/view/page/PhabricatorStandardPageView.php @@ -426,11 +426,10 @@ final class PhabricatorStandardPageView extends PhabricatorBarePageView } return hsprintf( - '%s%s%s%s', + '%s%s%s', parent::getHead(), $font_css, - $response->renderSingleResource('javelin-magical-init', 'phabricator'), - $this->newOpenGraphTags()); + $response->renderSingleResource('javelin-magical-init', 'phabricator')); } public function setGlyph($glyph) { @@ -912,45 +911,4 @@ final class PhabricatorStandardPageView extends PhabricatorBarePageView return $response; } - private function newOpenGraphTags() { - // If we don't allow public access, there's no point in emitting OpenGraph - // tags because external systems can't fetch pages. - if (!PhabricatorEnv::getEnvConfig('policy.allow-public')) { - return array(); - } - - $viewer = $this->getViewer(); - - $properties = array( - array( - 'og:title', - $this->getTitle(), - ), - array( - 'og:type', - 'website', - ), - array( - 'og:url', - PhabricatorEnv::getProductionURI($this->getRequest()->getRequestURI()), - ), - array( - 'og:image', - celerity_get_resource_uri('rsrc/favicons/opengraph-144x144.png'), - ), - ); - - $tags = array(); - foreach ($properties as $property) { - $tags[] = phutil_tag( - 'meta', - array( - 'property' => $property[0], - 'content' => $property[1], - )); - } - - return $tags; - } - } diff --git a/src/view/page/menu/PhabricatorMainMenuView.php b/src/view/page/menu/PhabricatorMainMenuView.php index 2e5b5614ec..f9e4032d87 100644 --- a/src/view/page/menu/PhabricatorMainMenuView.php +++ b/src/view/page/menu/PhabricatorMainMenuView.php @@ -262,16 +262,35 @@ final class PhabricatorMainMenuView extends AphrontView { } private function renderPhabricatorLogo() { - $logo_style = array(); - $custom_header = PhabricatorCustomLogoConfigType::getLogoImagePHID(); - if ($custom_header) { - $viewer = $this->getViewer(); - $logo_uri = PhabricatorCustomLogoConfigType::getLogoURI($viewer); - $logo_style[] = 'background-size: 40px 40px;'; - $logo_style[] = 'background-position: 0 0;'; - $logo_style[] = 'background-image: url('.$logo_uri.')'; + $logo_style = array(); + if ($custom_header) { + $cache = PhabricatorCaches::getImmutableCache(); + $cache_key_logo = 'ui.custom-header.logo-phid.v3.'.$custom_header; + + $logo_uri = $cache->getKey($cache_key_logo); + if (!$logo_uri) { + // NOTE: If the file policy has been changed to be restrictive, we'll + // miss here and just show the default logo. The cache will fill later + // when someone who can see the file loads the page. This might be a + // little spooky, see T11982. + $files = id(new PhabricatorFileQuery()) + ->setViewer($this->getViewer()) + ->withPHIDs(array($custom_header)) + ->execute(); + $file = head($files); + if ($file) { + $logo_uri = $file->getViewURI(); + $cache->setKey($cache_key_logo, $logo_uri); + } + } + + if ($logo_uri) { + $logo_style[] = 'background-size: 40px 40px;'; + $logo_style[] = 'background-position: 0 0;'; + $logo_style[] = 'background-image: url('.$logo_uri.')'; + } } $logo_node = phutil_tag( @@ -281,6 +300,7 @@ final class PhabricatorMainMenuView extends AphrontView { 'style' => implode(' ', $logo_style), )); + $wordmark_text = PhabricatorCustomLogoConfigType::getLogoWordmark(); if (!strlen($wordmark_text)) { $wordmark_text = pht('Phabricator'); diff --git a/webroot/rsrc/favicons/opengraph-144x144.png b/webroot/rsrc/favicons/opengraph-144x144.png deleted file mode 100644 index 92f2114b205565d9029e10ede56cdf23827ee1e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13270 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 bFYpXZa^goDzqnxc>i`sG)nqEAOuzjf>K7hx