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' => 'cea72e09', 'conpherence.pkg.js' => '6249a1cf', 'core.pkg.css' => '46d588e4', - 'core.pkg.js' => '2d9fc958', + 'core.pkg.js' => 'c41f6e0a', 'darkconsole.pkg.js' => 'e7393ebb', 'differential.pkg.css' => 'e1d704ce', 'differential.pkg.js' => '634399e9', @@ -425,7 +425,7 @@ 'rsrc/image/texture/table_header_hover.png' => '038ec3b9', 'rsrc/image/texture/table_header_tall.png' => 'd56b434f', 'rsrc/js/application/aphlict/Aphlict.js' => '5359e785', - 'rsrc/js/application/aphlict/behavior-aphlict-dropdown.js' => '49e20786', + 'rsrc/js/application/aphlict/behavior-aphlict-dropdown.js' => '121a9c4c', 'rsrc/js/application/aphlict/behavior-aphlict-listen.js' => 'fb20ac8d', 'rsrc/js/application/aphlict/behavior-aphlict-status.js' => '5e2634b9', 'rsrc/js/application/aphlict/behavior-desktop-notifications-control.js' => 'edd1ba66', @@ -530,6 +530,7 @@ 'rsrc/js/core/Busy.js' => '59a7976a', 'rsrc/js/core/DragAndDropFileUpload.js' => '58dea2fa', 'rsrc/js/core/DraggableList.js' => '5a13c79f', + 'rsrc/js/core/Favicon.js' => '1fe2510c', 'rsrc/js/core/FileUpload.js' => '680ea2c8', 'rsrc/js/core/Hovercard.js' => '1bd28176', 'rsrc/js/core/KeyboardShortcut.js' => '1ae869f2', @@ -539,7 +540,7 @@ 'rsrc/js/core/Prefab.js' => 'cfd23f37', 'rsrc/js/core/ShapedRequest.js' => '7cbe244b', 'rsrc/js/core/TextAreaUtils.js' => '320810c8', - 'rsrc/js/core/Title.js' => 'df5e11d2', + 'rsrc/js/core/Title.js' => '4de96d86', 'rsrc/js/core/ToolTip.js' => '6323f942', 'rsrc/js/core/behavior-active-nav.js' => 'e379b58e', 'rsrc/js/core/behavior-audio-source.js' => '59b251eb', @@ -648,7 +649,7 @@ 'inline-comment-summary-css' => '51efda3a', 'javelin-aphlict' => '5359e785', 'javelin-behavior' => '61cbc29a', - 'javelin-behavior-aphlict-dropdown' => '49e20786', + 'javelin-behavior-aphlict-dropdown' => '121a9c4c', 'javelin-behavior-aphlict-listen' => 'fb20ac8d', 'javelin-behavior-aphlict-status' => '5e2634b9', 'javelin-behavior-aphront-basic-tokenizer' => 'b3a4b884', @@ -846,6 +847,7 @@ 'phabricator-drag-and-drop-file-upload' => '58dea2fa', 'phabricator-draggable-list' => '5a13c79f', 'phabricator-fatal-config-template-css' => '8f18fa41', + 'phabricator-favicon' => '1fe2510c', 'phabricator-feed-css' => 'ecd4ec57', 'phabricator-file-upload' => '680ea2c8', 'phabricator-filetree-view-css' => 'fccf9f82', @@ -867,7 +869,7 @@ 'phabricator-source-code-view-css' => 'cbeef983', 'phabricator-standard-page-view' => '79176f5a', 'phabricator-textareautils' => '320810c8', - 'phabricator-title' => 'df5e11d2', + 'phabricator-title' => '4de96d86', 'phabricator-tooltip' => '6323f942', 'phabricator-ui-example-css' => '528b19de', 'phabricator-uiexample-javelin-view' => 'd4a14807', @@ -1071,6 +1073,17 @@ 'javelin-vector', 'phuix-autocomplete', ), + '121a9c4c' => array( + 'javelin-behavior', + 'javelin-request', + 'javelin-stratcom', + 'javelin-vector', + 'javelin-dom', + 'javelin-uri', + 'javelin-behavior-device', + 'phabricator-title', + 'phabricator-favicon', + ), '12884df9' => array( 'javelin-behavior', 'javelin-stratcom', @@ -1139,6 +1152,10 @@ 'javelin-uri', 'javelin-routable', ), + '1fe2510c' => array( + 'javelin-install', + 'javelin-dom', + ), '21df4ff5' => array( 'javelin-install', 'javelin-workboard-card', @@ -1287,16 +1304,6 @@ 'javelin-dom', 'javelin-stratcom', ), - '49e20786' => array( - 'javelin-behavior', - 'javelin-request', - 'javelin-stratcom', - 'javelin-vector', - 'javelin-dom', - 'javelin-uri', - 'javelin-behavior-device', - 'phabricator-title', - ), '4a021c10' => array( 'javelin-install', 'javelin-util', @@ -1318,6 +1325,10 @@ 'javelin-uri', 'phabricator-notification', ), + '4de96d86' => array( + 'javelin-install', + 'phabricator-favicon', + ), '4e3e79a6' => array( 'javelin-behavior', 'javelin-stratcom', @@ -2092,9 +2103,6 @@ 'javelin-typeahead-ondemand-source', 'javelin-dom', ), - 'df5e11d2' => array( - 'javelin-install', - ), 'e0ec7f2f' => array( 'javelin-behavior', 'javelin-dom', diff --git a/src/view/page/PhabricatorBarePageView.php b/src/view/page/PhabricatorBarePageView.php --- a/src/view/page/PhabricatorBarePageView.php +++ b/src/view/page/PhabricatorBarePageView.php @@ -111,11 +111,12 @@ '/rsrc/favicons/apple-touch-icon-152x152.png'), )); - $apple_tag = phutil_tag( - 'meta', + $favicon_tag = phutil_tag( + 'link', array( - 'name' => 'apple-mobile-web-app-status-bar-style', - 'content' => 'black-translucent', + 'id' => 'favicon', + 'rel' => 'shortcut icon', + 'href' => '/favicon.ico', // celerity doesn't work on ico ? )); $referrer_tag = phutil_tag( @@ -146,7 +147,7 @@ $icon_tag_76, $icon_tag_120, $icon_tag_152, - $apple_tag, + $favicon_tag, $referrer_tag, CelerityStaticResourceResponse::renderInlineScript( $framebust.jsprintf('window.__DEV__=%d;', ($developer ? 1 : 0))), diff --git a/webroot/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js b/webroot/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js --- a/webroot/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js +++ b/webroot/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js @@ -8,6 +8,7 @@ * javelin-uri * javelin-behavior-device * phabricator-title + * phabricator-favicon */ JX.behavior('aphlict-dropdown', function(config, statics) { diff --git a/webroot/rsrc/js/core/Favicon.js b/webroot/rsrc/js/core/Favicon.js new file mode 100644 --- /dev/null +++ b/webroot/rsrc/js/core/Favicon.js @@ -0,0 +1,35 @@ +/** + * @provides phabricator-favicon + * @requires javelin-install + * javelin-dom + */ +JX.install('Favicon', { + statics: { + _favicon: null, + + setFavicon: function(favicon) { + var self = JX.Favicon; + self._favicon = favicon; + self._update(); + }, + + _update: function() { + var self = JX.Favicon; + var cur_favicon = JX.$('favicon'); + + if (self._favicon === null) { + self._favicon = cur_favicon.href; + } + + var new_favicon = JX.$N( + 'link', + {href: self._favicon, + id: 'favicon', + rel: 'shortcut icon', + }); + + JX.DOM.replace(cur_favicon, new_favicon); + + } + } +}); diff --git a/webroot/rsrc/js/core/Title.js b/webroot/rsrc/js/core/Title.js --- a/webroot/rsrc/js/core/Title.js +++ b/webroot/rsrc/js/core/Title.js @@ -1,7 +1,7 @@ /** - * @requires javelin-install * @provides phabricator-title - * @javelin + * @requires javelin-install + * phabricator-favicon */ /** @@ -11,9 +11,15 @@ statics: { _counts: {}, _title: null, + _favicon: null, setCount: function(k, v) { var self = JX.Title; + if ((k == 'messages') && (v)) { + self._favicon = '/rsrc/favicons/red/favicon.ico'; + } else { + self._favicon = '/favicon.ico'; + } self._counts[k] = v; self._update(); }, @@ -44,6 +50,11 @@ } document.title = title; + + if (self._favicon) { + JX.Favicon.setFavicon(self._favicon); + } + } } });