diff --git a/src/applications/dashboard/paneltype/PhabricatorDashboardPanelType.php b/src/applications/dashboard/paneltype/PhabricatorDashboardPanelType.php index 4bcc6200a7..377c56b39f 100644 --- a/src/applications/dashboard/paneltype/PhabricatorDashboardPanelType.php +++ b/src/applications/dashboard/paneltype/PhabricatorDashboardPanelType.php @@ -7,6 +7,29 @@ abstract class PhabricatorDashboardPanelType extends Phobject { abstract public function getPanelTypeDescription(); abstract public function getFieldSpecifications(); + abstract public function renderPanelContent( + PhabricatorUser $viewer, + PhabricatorDashboardPanel $panel, + PhabricatorDashboardPanelRenderingEngine $engine); + + /** + * Should this panel pull content in over AJAX? + * + * Normally, panels use AJAX to render their content. This makes the page + * interactable sooner, allows panels to render in parallel, and prevents one + * slow panel from slowing everything down. + * + * However, some panels are very cheap to build (i.e., no expensive service + * calls or complicated rendering). In these cases overall performance can be + * improved by disabling async rendering so the panel rendering happens in the + * same process. + * + * @return bool True to enable asynchronous rendering when appropriate. + */ + public function shouldRenderAsync() { + return true; + } + public static function getAllPanelTypes() { static $types; @@ -40,19 +63,4 @@ abstract class PhabricatorDashboardPanelType extends Phobject { return $types; } - - - public function renderPanelContent( - PhabricatorUser $viewer, - PhabricatorDashboardPanel $panel, - PhabricatorDashboardPanelRenderingEngine $engine) { - return pht('TODO: Panel content goes here.'); - } - - public function shouldRenderAsync() { - // TODO: For now, just make these things random so we can catch anything - // that breaks. - return (mt_rand(0, 1) == 1); - } - } diff --git a/src/applications/dashboard/paneltype/PhabricatorDashboardPanelTypeTabs.php b/src/applications/dashboard/paneltype/PhabricatorDashboardPanelTypeTabs.php index 90b2071dc8..2386eabcfb 100644 --- a/src/applications/dashboard/paneltype/PhabricatorDashboardPanelTypeTabs.php +++ b/src/applications/dashboard/paneltype/PhabricatorDashboardPanelTypeTabs.php @@ -25,6 +25,11 @@ final class PhabricatorDashboardPanelTypeTabs ); } + public function shouldRenderAsync() { + // The actual tab panel itself is cheap to render. + return false; + } + public function renderPanelContent( PhabricatorUser $viewer, PhabricatorDashboardPanel $panel, diff --git a/src/applications/dashboard/paneltype/PhabricatorDashboardPanelTypeText.php b/src/applications/dashboard/paneltype/PhabricatorDashboardPanelTypeText.php index 9c39b740fe..11e0e7e5d1 100644 --- a/src/applications/dashboard/paneltype/PhabricatorDashboardPanelTypeText.php +++ b/src/applications/dashboard/paneltype/PhabricatorDashboardPanelTypeText.php @@ -26,6 +26,11 @@ final class PhabricatorDashboardPanelTypeText ); } + public function shouldRenderAsync() { + // Rendering text panels is normally a cheap cache hit. + return false; + } + public function renderPanelContent( PhabricatorUser $viewer, PhabricatorDashboardPanel $panel,