Update default change options for async SRs The soy template controls what is sent in the index.html. Setting hex options here guarantees that preloading request matches request sent from the UI. Additionally add preloading query for submit requirements themselves. BUG: Google b/445644919 Release-Notes: skip Change-Id: Id6f777adec6c8000555129daa4a51006df9c2a87
diff --git a/java/com/google/gerrit/httpd/raw/IndexHtmlUtil.java b/java/com/google/gerrit/httpd/raw/IndexHtmlUtil.java index 2ef499f..2ed32e7 100644 --- a/java/com/google/gerrit/httpd/raw/IndexHtmlUtil.java +++ b/java/com/google/gerrit/httpd/raw/IndexHtmlUtil.java
@@ -19,6 +19,7 @@ import com.google.common.base.Strings; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import com.google.common.flogger.FluentLogger; import com.google.common.primitives.Ints; import com.google.gerrit.common.Nullable; @@ -27,12 +28,14 @@ import com.google.gerrit.extensions.api.GerritApi; import com.google.gerrit.extensions.api.accounts.AccountApi; import com.google.gerrit.extensions.api.config.Server; +import com.google.gerrit.extensions.client.ListChangesOption; import com.google.gerrit.extensions.client.ListOption; import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.restapi.RestApiException; import com.google.gerrit.httpd.raw.IndexPreloadingUtil.RequestedPage; import com.google.gerrit.json.OutputFormat; import com.google.gerrit.server.experiments.ExperimentFeatures; +import com.google.gerrit.server.experiments.ExperimentFeaturesConstants; import com.google.gson.Gson; import com.google.template.soy.data.SanitizedContent; import java.net.URI; @@ -41,6 +44,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; import java.util.function.Function; @@ -68,10 +72,13 @@ String requestedURL) throws URISyntaxException, RestApiException { ImmutableMap.Builder<String, Object> data = ImmutableMap.builder(); + boolean asyncSubmitRequirements = + experimentFeatures.isFeatureEnabled(ExperimentFeaturesConstants.ASYNC_SUBMIT_REQUIREMENTS); data.putAll( staticTemplateData( canonicalURL, cdnPath, faviconPath, urlParameterMap, urlInScriptTagOrdainer)) - .putAll(dynamicTemplateData(gerritApi, requestedURL, canonicalURL)); + .putAll( + dynamicTemplateData(gerritApi, requestedURL, canonicalURL, asyncSubmitRequirements)); Set<String> enabledExperiments = new HashSet<>(); enabledExperiments.addAll(experimentFeatures.getEnabledExperimentFeatures()); // Add all experiments enabled through url @@ -107,7 +114,10 @@ /** Returns dynamic parameters of {@code index.html}. */ public static ImmutableMap<String, Object> dynamicTemplateData( - GerritApi gerritApi, String requestedURL, String canonicalURL) + GerritApi gerritApi, + String requestedURL, + String canonicalURL, + boolean asyncSubmitRequirements) throws RestApiException, URISyntaxException { ImmutableMap.Builder<String, Object> data = ImmutableMap.builder(); Map<String, SanitizedContent> initialData = new HashMap<>(); @@ -127,15 +137,21 @@ Integer basePatchNum = computeBasePatchNum(requestedPath); switch (page) { case CHANGE, DIFF -> { - if (basePatchNum.equals(0)) { + LinkedHashSet<ListChangesOption> changeDetailOptions = + new LinkedHashSet<>( + basePatchNum.equals(0) + ? IndexPreloadingUtil.CHANGE_DETAIL_OPTIONS_WITHOUT_PARENTS + : IndexPreloadingUtil.CHANGE_DETAIL_OPTIONS_WITH_PARENTS); + if (asyncSubmitRequirements) { + changeDetailOptions.remove(ListChangesOption.SUBMIT_REQUIREMENTS); + changeDetailOptions.remove(ListChangesOption.SUBMITTABLE); data.put( - "defaultChangeDetailHex", - ListOption.toHex(IndexPreloadingUtil.CHANGE_DETAIL_OPTIONS_WITHOUT_PARENTS)); - } else { - data.put( - "defaultChangeDetailHex", - ListOption.toHex(IndexPreloadingUtil.CHANGE_DETAIL_OPTIONS_WITH_PARENTS)); + "submitRequirementsHex", + ListOption.toHex( + ImmutableSet.of( + ListChangesOption.SUBMIT_REQUIREMENTS, ListChangesOption.SUBMITTABLE))); } + data.put("defaultChangeDetailHex", ListOption.toHex(changeDetailOptions)); data.put( "changeRequestsPath", IndexPreloadingUtil.computeChangeRequestsPath(requestedPath, page).get());
diff --git a/java/com/google/gerrit/server/experiments/ExperimentFeaturesConstants.java b/java/com/google/gerrit/server/experiments/ExperimentFeaturesConstants.java index cd91745..ce96132 100644 --- a/java/com/google/gerrit/server/experiments/ExperimentFeaturesConstants.java +++ b/java/com/google/gerrit/server/experiments/ExperimentFeaturesConstants.java
@@ -60,4 +60,7 @@ /** Whether we allow fix suggestions in HumanComments. */ public static final String ALLOW_FIX_SUGGESTIONS_IN_COMMENTS = "GerritBackendFeature__allow_fix_suggestions_in_comments"; + + /** Whether UI should request Submit Requirements separately from change detail. */ + public static final String ASYNC_SUBMIT_REQUIREMENTS = "UiFeature__async_submit_requirements"; }
diff --git a/javatests/com/google/gerrit/acceptance/api/config/ListExperimentsIT.java b/javatests/com/google/gerrit/acceptance/api/config/ListExperimentsIT.java index fe3cb00..8dcd0f3 100644 --- a/javatests/com/google/gerrit/acceptance/api/config/ListExperimentsIT.java +++ b/javatests/com/google/gerrit/acceptance/api/config/ListExperimentsIT.java
@@ -52,7 +52,8 @@ .GERRIT_BACKEND_FEATURE_ALWAYS_REJECT_IMPLICIT_MERGES_ON_MERGE, ExperimentFeaturesConstants.GERRIT_BACKEND_FEATURE_ATTACH_NONCE_TO_DOCUMENTATION, ExperimentFeaturesConstants.GERRIT_BACKEND_FEATURE_CHECK_IMPLICIT_MERGES_ON_MERGE, - ExperimentFeaturesConstants.GERRIT_BACKEND_FEATURE_REJECT_IMPLICIT_MERGES_ON_MERGE) + ExperimentFeaturesConstants.GERRIT_BACKEND_FEATURE_REJECT_IMPLICIT_MERGES_ON_MERGE, + ExperimentFeaturesConstants.ASYNC_SUBMIT_REQUIREMENTS) .inOrder(); // "GerritBackendFeature__check_implicit_merges_on_merge",
diff --git a/javatests/com/google/gerrit/httpd/raw/IndexHtmlUtilTest.java b/javatests/com/google/gerrit/httpd/raw/IndexHtmlUtilTest.java index 2f6d565..68be60b 100644 --- a/javatests/com/google/gerrit/httpd/raw/IndexHtmlUtilTest.java +++ b/javatests/com/google/gerrit/httpd/raw/IndexHtmlUtilTest.java
@@ -117,7 +117,7 @@ String requestedPath = "/c/project/+/123/4..6"; assertThat(IndexHtmlUtil.computeBasePatchNum(requestedPath)).isEqualTo(4); - assertThat(dynamicTemplateData(gerritApi, requestedPath, "")) + assertThat(dynamicTemplateData(gerritApi, requestedPath, "", false)) .containsAtLeast( "defaultChangeDetailHex", "9996394", "changeRequestsPath", "changes/project~123"); @@ -145,12 +145,41 @@ String requestedPath = "/c/project/+/123"; assertThat(IndexHtmlUtil.computeBasePatchNum(requestedPath)).isEqualTo(0); - assertThat(dynamicTemplateData(gerritApi, requestedPath, "")) + assertThat(dynamicTemplateData(gerritApi, requestedPath, "", false)) .containsAtLeast( "defaultChangeDetailHex", "1996394", "changeRequestsPath", "changes/project~123"); } + @Test + public void usePreloadRestWithAsyncSRs() throws Exception { + Accounts accountsApi = mock(Accounts.class); + when(accountsApi.self()).thenThrow(new AuthException("user needs to be authenticated")); + + Server serverApi = mock(Server.class); + when(serverApi.getVersion()).thenReturn("123"); + when(serverApi.topMenus()).thenReturn(ImmutableList.of()); + ServerInfo serverInfo = new ServerInfo(); + serverInfo.defaultTheme = "my-default-theme"; + when(serverApi.getInfo()).thenReturn(serverInfo); + + Config configApi = mock(Config.class); + when(configApi.server()).thenReturn(serverApi); + + GerritApi gerritApi = mock(GerritApi.class); + when(gerritApi.accounts()).thenReturn(accountsApi); + when(gerritApi.config()).thenReturn(configApi); + + String requestedPath = "/c/project/+/123"; + assertThat(IndexHtmlUtil.computeBasePatchNum(requestedPath)).isEqualTo(0); + + assertThat(dynamicTemplateData(gerritApi, requestedPath, "", true)) + .containsAtLeast( + "defaultChangeDetailHex", "896394", + "submitRequirementsHex", "1100000", + "changeRequestsPath", "changes/project~123"); + } + private static SanitizedContent ordain(String s) { return UnsafeSanitizedContentOrdainer.ordainAsSafe( s, SanitizedContent.ContentKind.TRUSTED_RESOURCE_URI);
diff --git a/resources/com/google/gerrit/httpd/raw/PolyGerritIndexHtml.soy b/resources/com/google/gerrit/httpd/raw/PolyGerritIndexHtml.soy index bc6f619..eb84a2c 100644 --- a/resources/com/google/gerrit/httpd/raw/PolyGerritIndexHtml.soy +++ b/resources/com/google/gerrit/httpd/raw/PolyGerritIndexHtml.soy
@@ -33,6 +33,7 @@ {@param? defaultDashboardHex: ?} {@param? dashboardQuery: ?} {@param? userIsAuthenticated: ?} + {@param? submitRequirementsHex: ?} <!DOCTYPE html>{\n} <html lang="en">{\n} <meta charset="utf-8">{\n} @@ -95,6 +96,9 @@ {if $userIsAuthenticated} <link rel="preload" href="{$canonicalPath}/{$changeRequestsPath}/edit/?download-commands=true" as="fetch" type="application/json" crossorigin="anonymous"/>{\n} {/if} + {if $submitRequirementsHex} + <link rel="preload" href="{$canonicalPath}/{$changeRequestsPath}?O={$submitRequirementsHex}" as="fetch" type="application/json" crossorigin="anonymous"/>{\n} + {/if} {/if} <link rel="preload" href="{$canonicalPath}/{$changeRequestsPath}/comments?enable-context=true&context-padding=3" as="fetch" type="application/json" crossorigin="anonymous"/>{\n} <link rel="preload" href="{$canonicalPath}/changes/?q=change:{$changeNum}" as="fetch" type="application/json" crossorigin="anonymous"/>{\n}