Merge "Fix ctrl+enter and meta+enter for comments"
diff --git a/Documentation/config-labels.txt b/Documentation/config-labels.txt
index 4737460..f5346c1 100644
--- a/Documentation/config-labels.txt
+++ b/Documentation/config-labels.txt
@@ -296,6 +296,12 @@
Matches votes where the new patch set was uploaded by a member of `groupUUID`.
+==== has:unchanged-files
+
+Matches when the new patch-set includes the same files as the old patch-set.
+
+Only 'unchanged-files' is supported for 'has'.
+
==== Example
----
diff --git a/java/com/google/gerrit/server/approval/ApprovalInference.java b/java/com/google/gerrit/server/approval/ApprovalInference.java
index 59df7ff..0185598 100644
--- a/java/com/google/gerrit/server/approval/ApprovalInference.java
+++ b/java/com/google/gerrit/server/approval/ApprovalInference.java
@@ -26,7 +26,6 @@
import com.google.gerrit.entities.Account;
import com.google.gerrit.entities.LabelType;
import com.google.gerrit.entities.LabelTypes;
-import com.google.gerrit.entities.Patch.ChangeType;
import com.google.gerrit.entities.PatchSet;
import com.google.gerrit.entities.PatchSetApproval;
import com.google.gerrit.exceptions.StorageException;
@@ -47,6 +46,7 @@
import com.google.gerrit.server.project.ProjectState;
import com.google.gerrit.server.query.approval.ApprovalContext;
import com.google.gerrit.server.query.approval.ApprovalQueryBuilder;
+import com.google.gerrit.server.query.approval.ListOfFilesUnchangedPredicate;
import com.google.gerrit.server.util.ManualRequestContext;
import com.google.gerrit.server.util.OneOffRequestContext;
import com.google.inject.Inject;
@@ -75,6 +75,7 @@
private final PatchListCache patchListCache;
private final ApprovalQueryBuilder approvalQueryBuilder;
private final OneOffRequestContext requestContext;
+ private final ListOfFilesUnchangedPredicate listOfFilesUnchangedPredicate;
@Inject
ApprovalInference(
@@ -83,13 +84,15 @@
LabelNormalizer labelNormalizer,
PatchListCache patchListCache,
ApprovalQueryBuilder approvalQueryBuilder,
- OneOffRequestContext requestContext) {
+ OneOffRequestContext requestContext,
+ ListOfFilesUnchangedPredicate listOfFilesUnchangedPredicate) {
this.projectCache = projectCache;
this.changeKindCache = changeKindCache;
this.labelNormalizer = labelNormalizer;
this.patchListCache = patchListCache;
this.approvalQueryBuilder = approvalQueryBuilder;
this.requestContext = requestContext;
+ this.listOfFilesUnchangedPredicate = listOfFilesUnchangedPredicate;
}
/**
@@ -116,7 +119,7 @@
}
}
- private static boolean canCopyBasedOnBooleanLabelConfigs(
+ private boolean canCopyBasedOnBooleanLabelConfigs(
ProjectState project,
PatchSetApproval psa,
PatchSet.Id psId,
@@ -183,12 +186,7 @@
project.getName());
return true;
} else if (type.isCopyAllScoresIfListOfFilesDidNotChange()
- && patchList.getPatches().stream()
- .noneMatch(
- p ->
- p.getChangeType() == ChangeType.ADDED
- || p.getChangeType() == ChangeType.DELETED
- || p.getChangeType() == ChangeType.RENAMED)) {
+ && listOfFilesUnchangedPredicate.match(patchList)) {
logger.atFine().log(
"approval %d on label %s of patch set %d of change %d can be copied"
+ " to patch set %d because the label has set "
diff --git a/java/com/google/gerrit/server/query/approval/ApprovalQueryBuilder.java b/java/com/google/gerrit/server/query/approval/ApprovalQueryBuilder.java
index cd79cb2..c3594f5 100644
--- a/java/com/google/gerrit/server/query/approval/ApprovalQueryBuilder.java
+++ b/java/com/google/gerrit/server/query/approval/ApprovalQueryBuilder.java
@@ -33,18 +33,21 @@
private final UserInPredicate.Factory userInPredicate;
private final GroupResolver groupResolver;
private final GroupControl.Factory groupControl;
+ private final ListOfFilesUnchangedPredicate listOfFilesUnchangedPredicate;
@Inject
protected ApprovalQueryBuilder(
MagicValuePredicate.Factory magicValuePredicate,
UserInPredicate.Factory userInPredicate,
GroupResolver groupResolver,
- GroupControl.Factory groupControl) {
+ GroupControl.Factory groupControl,
+ ListOfFilesUnchangedPredicate listOfFilesUnchangedPredicate) {
super(mydef, null);
this.magicValuePredicate = magicValuePredicate;
this.userInPredicate = userInPredicate;
this.groupResolver = groupResolver;
this.groupControl = groupControl;
+ this.listOfFilesUnchangedPredicate = listOfFilesUnchangedPredicate;
}
@Operator
@@ -67,6 +70,17 @@
return userInPredicate.create(UserInPredicate.Field.UPLOADER, parseGroupOrThrow(group));
}
+ @Operator
+ public Predicate<ApprovalContext> has(String value) throws QueryParseException {
+ if (value.equals("unchanged-files")) {
+ return listOfFilesUnchangedPredicate;
+ }
+ throw error(
+ String.format(
+ "'%s' is not a supported argument for has. only 'unchanged-files' is supported",
+ value));
+ }
+
private static <T extends Enum<T>> T toEnumValue(Class<T> clazz, String term)
throws QueryParseException {
try {
diff --git a/java/com/google/gerrit/server/query/approval/ListOfFilesUnchangedPredicate.java b/java/com/google/gerrit/server/query/approval/ListOfFilesUnchangedPredicate.java
new file mode 100644
index 0000000..30097d8
--- /dev/null
+++ b/java/com/google/gerrit/server/query/approval/ListOfFilesUnchangedPredicate.java
@@ -0,0 +1,91 @@
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.query.approval;
+
+import com.google.gerrit.entities.Patch.ChangeType;
+import com.google.gerrit.entities.PatchSet;
+import com.google.gerrit.exceptions.StorageException;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.server.patch.PatchList;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gerrit.server.patch.PatchListKey;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Objects;
+
+/** Predicate that matches when the new patch-set includes the same files as the old patch-set. */
+@Singleton
+public class ListOfFilesUnchangedPredicate extends ApprovalPredicate {
+ private final PatchListCache patchListCache;
+
+ @Inject
+ public ListOfFilesUnchangedPredicate(PatchListCache patchListCache) {
+ this.patchListCache = patchListCache;
+ }
+
+ @Override
+ public boolean match(ApprovalContext ctx) {
+ PatchSet currentPatchset = ctx.changeNotes().getCurrentPatchSet();
+ Map.Entry<PatchSet.Id, PatchSet> priorPatchSet =
+ ctx.changeNotes().getPatchSets().lowerEntry(currentPatchset.id());
+ PatchListKey key =
+ PatchListKey.againstCommit(
+ priorPatchSet.getValue().commitId(),
+ currentPatchset.commitId(),
+ DiffPreferencesInfo.Whitespace.IGNORE_NONE);
+ try {
+ return match(patchListCache.get(key, ctx.changeNotes().getProjectName()));
+ } catch (PatchListNotAvailableException ex) {
+ throw new StorageException(
+ "failed to compute difference in files, so won't copy"
+ + " votes on labels even if list of files is the same and "
+ + "copyAllIfListOfFilesDidNotChange",
+ ex);
+ }
+ }
+
+ public boolean match(PatchList patchList) {
+ return patchList.getPatches().stream()
+ .noneMatch(
+ p ->
+ p.getChangeType() == ChangeType.ADDED
+ || p.getChangeType() == ChangeType.DELETED
+ || p.getChangeType() == ChangeType.RENAMED);
+ }
+
+ @Override
+ public Predicate<ApprovalContext> copy(
+ Collection<? extends Predicate<ApprovalContext>> children) {
+ return new ListOfFilesUnchangedPredicate(patchListCache);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(patchListCache);
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (!(other instanceof ListOfFilesUnchangedPredicate)) {
+ return false;
+ }
+ ListOfFilesUnchangedPredicate o = (ListOfFilesUnchangedPredicate) other;
+ return Objects.equals(o.patchListCache, patchListCache);
+ }
+}
diff --git a/javatests/com/google/gerrit/acceptance/server/query/ApprovalQueryIT.java b/javatests/com/google/gerrit/acceptance/server/query/ApprovalQueryIT.java
index 3bb9b35..9392219 100644
--- a/javatests/com/google/gerrit/acceptance/server/query/ApprovalQueryIT.java
+++ b/javatests/com/google/gerrit/acceptance/server/query/ApprovalQueryIT.java
@@ -22,6 +22,7 @@
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.PushOneCommit;
import com.google.gerrit.acceptance.testsuite.change.ChangeKindCreator;
+import com.google.gerrit.acceptance.testsuite.change.ChangeOperations;
import com.google.gerrit.entities.Account;
import com.google.gerrit.entities.Change;
import com.google.gerrit.entities.LabelId;
@@ -42,6 +43,7 @@
@Inject private ChangeKindCreator changeKindCreator;
@Inject private ChangeNotes.Factory changeNotesFactory;
@Inject private ChangeKindCache changeKindCache;
+ @Inject private ChangeOperations changeOperations;
@Test
public void magicValuePredicate() throws Exception {
@@ -66,60 +68,66 @@
public void changeKindPredicate_noCodeChange() throws Exception {
String change = changeKindCreator.createChange(ChangeKind.NO_CODE_CHANGE, testRepo, admin);
changeKindCreator.updateChange(change, ChangeKind.NO_CODE_CHANGE, testRepo, admin, project);
- PatchSet.Id ps1 = PatchSet.id(Change.id(gApi.changes().id(change).get()._number), 1 /* psId */);
+ PatchSet.Id ps1 =
+ PatchSet.id(Change.id(gApi.changes().id(change).get()._number), /* psId= */ 1);
assertTrue(
queryBuilder
.parse("changekind:no-code-change")
.asMatchable()
- .match(contextForCodeReviewLabel(-2 /* value */, ps1, admin.id())));
+ .match(contextForCodeReviewLabel(/* value= */ -2, ps1, admin.id())));
changeKindCreator.updateChange(change, ChangeKind.TRIVIAL_REBASE, testRepo, admin, project);
- PatchSet.Id ps2 = PatchSet.id(Change.id(gApi.changes().id(change).get()._number), 2 /* psId */);
+ PatchSet.Id ps2 =
+ PatchSet.id(Change.id(gApi.changes().id(change).get()._number), /* psId= */ 2);
assertFalse(
queryBuilder
.parse("changekind:no-code-change")
.asMatchable()
- .match(contextForCodeReviewLabel(-2 /* value */, ps2, admin.id())));
+ .match(contextForCodeReviewLabel(/* value= */ -2, ps2, admin.id())));
}
@Test
public void changeKindPredicate_trivialRebase() throws Exception {
String change = changeKindCreator.createChange(ChangeKind.TRIVIAL_REBASE, testRepo, admin);
changeKindCreator.updateChange(change, ChangeKind.TRIVIAL_REBASE, testRepo, admin, project);
- PatchSet.Id ps1 = PatchSet.id(Change.id(gApi.changes().id(change).get()._number), 1 /* psId */);
+ PatchSet.Id ps1 =
+ PatchSet.id(Change.id(gApi.changes().id(change).get()._number), /* psId= */ 1);
assertTrue(
queryBuilder
.parse("changekind:trivial-rebase")
.asMatchable()
- .match(contextForCodeReviewLabel(-2 /* value */, ps1, admin.id())));
+ .match(contextForCodeReviewLabel(/* value= */ -2, ps1, admin.id())));
changeKindCreator.updateChange(change, ChangeKind.REWORK, testRepo, admin, project);
- PatchSet.Id ps2 = PatchSet.id(Change.id(gApi.changes().id(change).get()._number), 2 /* psId */);
+ PatchSet.Id ps2 =
+ PatchSet.id(Change.id(gApi.changes().id(change).get()._number), /* psId= */ 2);
assertFalse(
queryBuilder
.parse("changekind:trivial-rebase")
.asMatchable()
- .match(contextForCodeReviewLabel(-2 /* value */, ps2, admin.id())));
+ .match(contextForCodeReviewLabel(/* value= */ -2, ps2, admin.id())));
}
@Test
public void changeKindPredicate_reworkAndNotRework() throws Exception {
String change = changeKindCreator.createChange(ChangeKind.REWORK, testRepo, admin);
changeKindCreator.updateChange(change, ChangeKind.REWORK, testRepo, admin, project);
- PatchSet.Id ps1 = PatchSet.id(Change.id(gApi.changes().id(change).get()._number), 1 /* psId */);
+ PatchSet.Id ps1 =
+ PatchSet.id(Change.id(gApi.changes().id(change).get()._number), /* psId= */ 1);
assertTrue(
queryBuilder
.parse("changekind:rework")
.asMatchable()
- .match(contextForCodeReviewLabel(-2 /* value */, ps1, admin.id())));
+ .match(contextForCodeReviewLabel(/* value= */ -2, ps1, admin.id())));
changeKindCreator.updateChange(change, ChangeKind.REWORK, testRepo, admin, project);
- PatchSet.Id ps2 = PatchSet.id(Change.id(gApi.changes().id(change).get()._number), 2 /* psId */);
+ PatchSet.Id ps2 =
+ PatchSet.id(Change.id(gApi.changes().id(change).get()._number), /* psId= */ 2);
assertFalse(
queryBuilder
.parse("-changekind:rework")
.asMatchable()
- .match(contextForCodeReviewLabel(-2 /* value */, ps2, admin.id())));
+ .match(contextForCodeReviewLabel(/* value= */ -2, ps2, admin.id())));
}
@Test
@@ -141,8 +149,8 @@
.asMatchable()
.match(
contextForCodeReviewLabel(
- 2 /* value */,
- PatchSet.id(pushResult.getChange().getId(), 1 /* psId */),
+ /* value= */ 2,
+ PatchSet.id(pushResult.getChange().getId(), /* psId= */ 1),
admin.id())));
// can not copy approval from patchset 2 -> 3
assertFalse(
@@ -151,8 +159,8 @@
.asMatchable()
.match(
contextForCodeReviewLabel(
- 2 /* value */,
- PatchSet.id(pushResult.getChange().getId(), 2 /* psId */),
+ /* value= */ 2,
+ PatchSet.id(pushResult.getChange().getId(), /* psId= */ 2),
admin.id())));
}
@@ -170,8 +178,8 @@
.asMatchable()
.match(
contextForCodeReviewLabel(
- 2 /* value */,
- PatchSet.id(pushResult.getChange().getId(), 1 /* psId */),
+ /* value= */ 2,
+ PatchSet.id(pushResult.getChange().getId(), /* psId= */ 1),
admin.id())));
// can not copy approval from patchset 2 -> 3
assertFalse(
@@ -180,8 +188,8 @@
.asMatchable()
.match(
contextForCodeReviewLabel(
- 2 /* value */,
- PatchSet.id(pushResult.getChange().getId(), 2 /* psId */),
+ /* value= */ 2,
+ PatchSet.id(pushResult.getChange().getId(), /* psId= */ 2),
user.id())));
}
@@ -194,10 +202,52 @@
queryBuilder
.parse("uploaderin:foobar")
.asMatchable()
- .match(contextForCodeReviewLabel(2)));
+ .match(contextForCodeReviewLabel(/* value= */ 2)));
assertThat(thrown).hasMessageThat().contains("Group foobar not found");
}
+ @Test
+ public void hasChangedFilesPredicate() throws Exception {
+ Change.Id changeId =
+ changeOperations.newChange().project(project).file("file").content("content").create();
+ changeOperations.change(changeId).newPatchset().file("file").content("new content").create();
+
+ // can copy approval from patch-set 1 -> 2
+ assertTrue(
+ queryBuilder
+ .parse("has:unchanged-files")
+ .asMatchable()
+ .match(
+ contextForCodeReviewLabel(
+ /* value= */ 2, PatchSet.id(changeId, /* psId= */ 1), admin.id())));
+ changeOperations.change(changeId).newPatchset().file("file").delete().create();
+
+ // can not copy approval from patch-set 2 -> 3
+ assertFalse(
+ queryBuilder
+ .parse("has:unchanged-files")
+ .asMatchable()
+ .match(
+ contextForCodeReviewLabel(
+ /* value= */ 2, PatchSet.id(changeId, /* psId= */ 2), admin.id())));
+ }
+
+ @Test
+ public void hasChangedFilesPredicate_unsupportedOperator() {
+ QueryParseException thrown =
+ assertThrows(
+ QueryParseException.class,
+ () ->
+ queryBuilder
+ .parse("has:invalid")
+ .asMatchable()
+ .match(contextForCodeReviewLabel(/* value= */ 2)));
+ assertThat(thrown)
+ .hasMessageThat()
+ .contains(
+ "'invalid' is not a supported argument for has. only 'unchanged-files' is supported");
+ }
+
private ApprovalContext contextForCodeReviewLabel(int value) throws Exception {
PushOneCommit.Result result = createChange();
amendChange(result.getChangeId());
diff --git a/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager.ts b/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager.ts
index 4985c1b..351e1bb 100644
--- a/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager.ts
+++ b/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager.ts
@@ -217,6 +217,8 @@
url,
trace,
});
+ } else if (response.status === 429) {
+ this._showQuotaExceeded({status, statusText});
} else {
this._showErrorDialog(
this._constructServerErrorMsg({
@@ -260,6 +262,19 @@
});
}
+ _showQuotaExceeded({status, statusText}: ErrorMsg) {
+ const tip = 'Try again later';
+ const errorText = 'Too many requests from this client';
+ this._showErrorDialog(
+ this._constructServerErrorMsg({
+ status,
+ statusText,
+ errorText,
+ tip,
+ })
+ );
+ }
+
_constructServerErrorMsg({
errorText,
status,
diff --git a/polygerrit-ui/app/elements/diff/gr-ranged-comment-themes/gr-ranged-comment-theme.ts b/polygerrit-ui/app/elements/diff/gr-ranged-comment-themes/gr-ranged-comment-theme.ts
index 131825a..948578d 100644
--- a/polygerrit-ui/app/elements/diff/gr-ranged-comment-themes/gr-ranged-comment-theme.ts
+++ b/polygerrit-ui/app/elements/diff/gr-ranged-comment-themes/gr-ranged-comment-theme.ts
@@ -36,9 +36,3 @@
</dom-module>`;
document.head.appendChild($_documentContainer.content);
-
-/*
- FIXME(polymer-modulizer): the above comments were extracted
- from HTML and may be out of place here. Review them and
- then delete this comment!
-*/
diff --git a/polygerrit-ui/app/elements/diff/gr-syntax-themes/gr-syntax-theme.ts b/polygerrit-ui/app/elements/diff/gr-syntax-themes/gr-syntax-theme.ts
index ac015e1..df0d71a 100644
--- a/polygerrit-ui/app/elements/diff/gr-syntax-themes/gr-syntax-theme.ts
+++ b/polygerrit-ui/app/elements/diff/gr-syntax-themes/gr-syntax-theme.ts
@@ -118,9 +118,3 @@
</dom-module>`;
document.head.appendChild($_documentContainer.content);
-
-/*
- FIXME(polymer-modulizer): the above comments were extracted
- from HTML and may be out of place here. Review them and
- then delete this comment!
-*/
diff --git a/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text_test.js b/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text_test.ts
similarity index 68%
rename from polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text_test.js
rename to polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text_test.ts
index a67fbc4..b2cdba1 100644
--- a/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text_test.js
+++ b/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text_test.ts
@@ -15,27 +15,30 @@
* limitations under the License.
*/
-import '../../../test/common-test-setup-karma.js';
-import './gr-linked-text.js';
-import {GerritNav} from '../../core/gr-navigation/gr-navigation.js';
-import {html} from '@polymer/polymer/lib/utils/html-tag.js';
+import '../../../test/common-test-setup-karma';
+import './gr-linked-text';
+import {GerritNav} from '../../core/gr-navigation/gr-navigation';
+import {html} from '@polymer/polymer/lib/utils/html-tag';
+import {GrLinkedText} from './gr-linked-text';
+import {CommentLinks} from '../../../types/common';
+import {queryAndAssert} from '../../../test/test-utils';
const basicFixture = fixtureFromTemplate(html`
-<gr-linked-text>
- <div id="output"></div>
- </gr-linked-text>
+ <gr-linked-text>
+ <div id="output"></div>
+ </gr-linked-text>
`);
suite('gr-linked-text tests', () => {
- let element;
+ let element: GrLinkedText;
- let originalCanonicalPath;
+ let originalCanonicalPath: string | undefined;
setup(() => {
originalCanonicalPath = window.CANONICAL_PATH;
- element = basicFixture.instantiate();
+ element = basicFixture.instantiate() as GrLinkedText;
- sinon.stub(GerritNav, 'mapCommentlinks').value( x => x);
+ sinon.stub(GerritNav, 'mapCommentlinks').value((x: CommentLinks) => x);
element.config = {
ph: {
match: '([Bb]ug|[Ii]ssue)\\s*#?(\\d+)',
@@ -86,7 +89,8 @@
// Regular inline link.
const url = 'https://bugs.chromium.org/p/gerrit/issues/detail?id=3650';
element.content = url;
- const linkEl = element.$.output.childNodes[0];
+ const linkEl = queryAndAssert(element, '#output')
+ .childNodes[0] as HTMLAnchorElement;
assert.equal(linkEl.target, '_blank');
assert.equal(linkEl.rel, 'noopener');
assert.equal(linkEl.href, url);
@@ -97,14 +101,16 @@
// "Issue/Bug" pattern.
element.content = 'Issue 3650';
- let linkEl = element.$.output.childNodes[0];
+ let linkEl = queryAndAssert(element, '#output')
+ .childNodes[0] as HTMLAnchorElement;
const url = 'https://bugs.chromium.org/p/gerrit/issues/detail?id=3650';
assert.equal(linkEl.target, '_blank');
assert.equal(linkEl.href, url);
assert.equal(linkEl.textContent, 'Issue 3650');
element.content = 'Bug 3650';
- linkEl = element.$.output.childNodes[0];
+ linkEl = queryAndAssert(element, '#output')
+ .childNodes[0] as HTMLAnchorElement;
assert.equal(linkEl.target, '_blank');
assert.equal(linkEl.rel, 'noopener');
assert.equal(linkEl.href, url);
@@ -115,8 +121,9 @@
// Pattern starts with the same prefix (`http`) as the url.
element.content = 'httpexample 3650';
- assert.equal(element.$.output.childNodes.length, 1);
- const linkEl = element.$.output.childNodes[0];
+ assert.equal(queryAndAssert(element, '#output').childNodes.length, 1);
+ const linkEl = queryAndAssert(element, '#output')
+ .childNodes[0] as HTMLAnchorElement;
const url = 'https://bugs.chromium.org/p/gerrit/issues/detail?id=3650';
assert.equal(linkEl.target, '_blank');
assert.equal(linkEl.href, url);
@@ -129,8 +136,9 @@
const prefix = 'Change-Id: ';
element.content = prefix + changeID;
- const textNode = element.$.output.childNodes[0];
- const linkEl = element.$.output.childNodes[1];
+ const textNode = queryAndAssert(element, '#output').childNodes[0];
+ const linkEl = queryAndAssert(element, '#output')
+ .childNodes[1] as HTMLAnchorElement;
assert.equal(textNode.textContent, prefix);
const url = '/q/' + changeID;
assert.isFalse(linkEl.hasAttribute('target'));
@@ -147,8 +155,9 @@
const prefix = 'Change-Id: ';
element.content = prefix + changeID;
- const textNode = element.$.output.childNodes[0];
- const linkEl = element.$.output.childNodes[1];
+ const textNode = queryAndAssert(element, '#output').childNodes[0];
+ const linkEl = queryAndAssert(element, '#output')
+ .childNodes[1] as HTMLAnchorElement;
assert.equal(textNode.textContent, prefix);
const url = '/r/q/' + changeID;
assert.isFalse(linkEl.hasAttribute('target'));
@@ -159,17 +168,23 @@
test('Multiple matches', () => {
element.content = 'Issue 3650\nIssue 3450';
- const linkEl1 = element.$.output.childNodes[0];
- const linkEl2 = element.$.output.childNodes[2];
+ const linkEl1 = queryAndAssert(element, '#output')
+ .childNodes[0] as HTMLAnchorElement;
+ const linkEl2 = queryAndAssert(element, '#output')
+ .childNodes[2] as HTMLAnchorElement;
assert.equal(linkEl1.target, '_blank');
- assert.equal(linkEl1.href,
- 'https://bugs.chromium.org/p/gerrit/issues/detail?id=3650');
+ assert.equal(
+ linkEl1.href,
+ 'https://bugs.chromium.org/p/gerrit/issues/detail?id=3650'
+ );
assert.equal(linkEl1.textContent, 'Issue 3650');
assert.equal(linkEl2.target, '_blank');
- assert.equal(linkEl2.href,
- 'https://bugs.chromium.org/p/gerrit/issues/detail?id=3450');
+ assert.equal(
+ linkEl2.href,
+ 'https://bugs.chromium.org/p/gerrit/issues/detail?id=3450'
+ );
assert.equal(linkEl2.textContent, 'Issue 3450');
});
@@ -186,9 +201,11 @@
element.content = prefix + changeID + bug;
- const textNode = element.$.output.childNodes[0];
- const changeLinkEl = element.$.output.childNodes[1];
- const bugLinkEl = element.$.output.childNodes[2];
+ const textNode = queryAndAssert(element, '#output').childNodes[0];
+ const changeLinkEl = queryAndAssert(element, '#output')
+ .childNodes[1] as HTMLAnchorElement;
+ const bugLinkEl = queryAndAssert(element, '#output')
+ .childNodes[2] as HTMLAnchorElement;
assert.equal(textNode.textContent, prefix);
@@ -203,15 +220,19 @@
test('html field in link config', () => {
element.content = 'google:do a barrel roll';
- const linkEl = element.$.output.childNodes[0];
- assert.equal(linkEl.getAttribute('href'),
- 'https://google.com/search?q=do a barrel roll');
+ const linkEl = queryAndAssert(element, '#output')
+ .childNodes[0] as HTMLAnchorElement;
+ assert.equal(
+ linkEl.getAttribute('href'),
+ 'https://google.com/search?q=do a barrel roll'
+ );
assert.equal(linkEl.textContent, 'do a barrel roll');
});
test('removing hash from links', () => {
element.content = 'hash:foo';
- const linkEl = element.$.output.childNodes[0];
+ const linkEl = queryAndAssert(element, '#output')
+ .childNodes[0] as HTMLAnchorElement;
assert.isTrue(linkEl.href.endsWith('/awesomesauce'));
assert.equal(linkEl.textContent, 'foo');
});
@@ -220,7 +241,8 @@
window.CANONICAL_PATH = '/r';
element.content = 'test foo';
- const linkEl = element.$.output.childNodes[0];
+ const linkEl = queryAndAssert(element, '#output')
+ .childNodes[0] as HTMLAnchorElement;
assert.isTrue(linkEl.href.endsWith('/r/awesomesauce'));
assert.equal(linkEl.textContent, 'foo');
});
@@ -229,7 +251,8 @@
window.CANONICAL_PATH = '/r';
element.content = 'a test foo';
- const linkEl = element.$.output.childNodes[1];
+ const linkEl = queryAndAssert(element, '#output')
+ .childNodes[1] as HTMLAnchorElement;
assert.isTrue(linkEl.href.endsWith('/r/awesomesauce'));
assert.equal(linkEl.textContent, 'foo');
});
@@ -238,94 +261,119 @@
window.CANONICAL_PATH = '/r';
element.content = 'hash:foo';
- const linkEl = element.$.output.childNodes[0];
+ const linkEl = queryAndAssert(element, '#output')
+ .childNodes[0] as HTMLAnchorElement;
assert.isTrue(linkEl.href.endsWith('/r/awesomesauce'));
assert.equal(linkEl.textContent, 'foo');
});
test('disabled config', () => {
element.content = 'foo:baz';
- assert.equal(element.$.output.innerHTML, 'foo:baz');
+ assert.equal(queryAndAssert(element, '#output').innerHTML, 'foo:baz');
});
test('R=email labels link correctly', () => {
element.removeZeroWidthSpace = true;
element.content = 'R=\u200Btest@google.com';
- assert.equal(element.$.output.textContent, 'R=test@google.com');
- assert.equal(element.$.output.innerHTML.match(/(R=<a)/g).length, 1);
+ assert.equal(
+ queryAndAssert(element, '#output').textContent,
+ 'R=test@google.com'
+ );
+ assert.equal(
+ queryAndAssert(element, '#output').innerHTML.match(/(R=<a)/g)!.length,
+ 1
+ );
});
test('CC=email labels link correctly', () => {
element.removeZeroWidthSpace = true;
element.content = 'CC=\u200Btest@google.com';
- assert.equal(element.$.output.textContent, 'CC=test@google.com');
- assert.equal(element.$.output.innerHTML.match(/(CC=<a)/g).length, 1);
+ assert.equal(
+ queryAndAssert(element, '#output').textContent,
+ 'CC=test@google.com'
+ );
+ assert.equal(
+ queryAndAssert(element, '#output').innerHTML.match(/(CC=<a)/g)!.length,
+ 1
+ );
});
test('only {http,https,mailto} protocols are linkified', () => {
element.content = 'xx mailto:test@google.com yy';
- let links = element.$.output.querySelectorAll('a');
+ let links = queryAndAssert(element, '#output').querySelectorAll('a');
assert.equal(links.length, 1);
assert.equal(links[0].getAttribute('href'), 'mailto:test@google.com');
assert.equal(links[0].innerHTML, 'mailto:test@google.com');
element.content = 'xx http://google.com yy';
- links = element.$.output.querySelectorAll('a');
+ links = queryAndAssert(element, '#output').querySelectorAll('a');
assert.equal(links.length, 1);
assert.equal(links[0].getAttribute('href'), 'http://google.com');
assert.equal(links[0].innerHTML, 'http://google.com');
element.content = 'xx https://google.com yy';
- links = element.$.output.querySelectorAll('a');
+ links = queryAndAssert(element, '#output').querySelectorAll('a');
assert.equal(links.length, 1);
assert.equal(links[0].getAttribute('href'), 'https://google.com');
assert.equal(links[0].innerHTML, 'https://google.com');
element.content = 'xx ssh://google.com yy';
- links = element.$.output.querySelectorAll('a');
+ links = queryAndAssert(element, '#output').querySelectorAll('a');
assert.equal(links.length, 0);
element.content = 'xx ftp://google.com yy';
- links = element.$.output.querySelectorAll('a');
+ links = queryAndAssert(element, '#output').querySelectorAll('a');
assert.equal(links.length, 0);
});
test('links without leading whitespace are linkified', () => {
element.content = 'xx abcmailto:test@google.com yy';
- assert.equal(element.$.output.innerHTML.substr(0, 6), 'xx abc');
- let links = element.$.output.querySelectorAll('a');
+ assert.equal(
+ queryAndAssert(element, '#output').innerHTML.substr(0, 6),
+ 'xx abc'
+ );
+ let links = queryAndAssert(element, '#output').querySelectorAll('a');
assert.equal(links.length, 1);
assert.equal(links[0].getAttribute('href'), 'mailto:test@google.com');
assert.equal(links[0].innerHTML, 'mailto:test@google.com');
element.content = 'xx defhttp://google.com yy';
- assert.equal(element.$.output.innerHTML.substr(0, 6), 'xx def');
- links = element.$.output.querySelectorAll('a');
+ assert.equal(
+ queryAndAssert(element, '#output').innerHTML.substr(0, 6),
+ 'xx def'
+ );
+ links = queryAndAssert(element, '#output').querySelectorAll('a');
assert.equal(links.length, 1);
assert.equal(links[0].getAttribute('href'), 'http://google.com');
assert.equal(links[0].innerHTML, 'http://google.com');
element.content = 'xx qwehttps://google.com yy';
- assert.equal(element.$.output.innerHTML.substr(0, 6), 'xx qwe');
- links = element.$.output.querySelectorAll('a');
+ assert.equal(
+ queryAndAssert(element, '#output').innerHTML.substr(0, 6),
+ 'xx qwe'
+ );
+ links = queryAndAssert(element, '#output').querySelectorAll('a');
assert.equal(links.length, 1);
assert.equal(links[0].getAttribute('href'), 'https://google.com');
assert.equal(links[0].innerHTML, 'https://google.com');
// Non-latin character
element.content = 'xx абвhttps://google.com yy';
- assert.equal(element.$.output.innerHTML.substr(0, 6), 'xx абв');
- links = element.$.output.querySelectorAll('a');
+ assert.equal(
+ queryAndAssert(element, '#output').innerHTML.substr(0, 6),
+ 'xx абв'
+ );
+ links = queryAndAssert(element, '#output').querySelectorAll('a');
assert.equal(links.length, 1);
assert.equal(links[0].getAttribute('href'), 'https://google.com');
assert.equal(links[0].innerHTML, 'https://google.com');
element.content = 'xx ssh://google.com yy';
- links = element.$.output.querySelectorAll('a');
+ links = queryAndAssert(element, '#output').querySelectorAll('a');
assert.equal(links.length, 0);
element.content = 'xx ftp://google.com yy';
- links = element.$.output.querySelectorAll('a');
+ links = queryAndAssert(element, '#output').querySelectorAll('a');
assert.equal(links.length, 0);
});
@@ -341,11 +389,13 @@
},
};
element.content = '- B: 123, 45';
- const links = element.root.querySelectorAll('a');
+ const links = element.root!.querySelectorAll('a');
assert.equal(links.length, 2);
- assert.equal(element.shadowRoot
- .querySelector('span').textContent, '- B: 123, 45');
+ assert.equal(
+ queryAndAssert<HTMLSpanElement>(element, 'span').textContent,
+ '- B: 123, 45'
+ );
assert.equal(links[0].href, 'ftp://foo/123');
assert.equal(links[0].textContent, '123');
@@ -362,4 +412,3 @@
assert.isTrue(contentConfigStub.called);
});
});
-
diff --git a/polygerrit-ui/app/services/checks/checks-model.ts b/polygerrit-ui/app/services/checks/checks-model.ts
index 7d5f053..5d3da42 100644
--- a/polygerrit-ui/app/services/checks/checks-model.ts
+++ b/polygerrit-ui/app/services/checks/checks-model.ts
@@ -299,7 +299,7 @@
internalResultId: 'f0r1',
category: Category.ERROR,
summary: 'Running the mighty test has failed by crashing.',
- message: `Btw, 1 is also not equal to 3. Did you know?`,
+ message: 'Btw, 1 is also not equal to 3. Did you know?',
actions: [
{
name: 'Ignore',
diff --git a/polygerrit-ui/app/styles/dashboard-header-styles.ts b/polygerrit-ui/app/styles/dashboard-header-styles.ts
index 2354f65..0c9f38d 100644
--- a/polygerrit-ui/app/styles/dashboard-header-styles.ts
+++ b/polygerrit-ui/app/styles/dashboard-header-styles.ts
@@ -55,9 +55,3 @@
</dom-module>`;
document.head.appendChild($_documentContainer.content);
-
-/*
- FIXME(polymer-modulizer): the above comments were extracted
- from HTML and may be out of place here. Review them and
- then delete this comment!
-*/
diff --git a/polygerrit-ui/app/styles/gr-change-list-styles.ts b/polygerrit-ui/app/styles/gr-change-list-styles.ts
index d1fcdc9..e0a7a28 100644
--- a/polygerrit-ui/app/styles/gr-change-list-styles.ts
+++ b/polygerrit-ui/app/styles/gr-change-list-styles.ts
@@ -202,9 +202,3 @@
</dom-module>`;
document.head.appendChild($_documentContainer.content);
-
-/*
- FIXME(polymer-modulizer): the above comments were extracted
- from HTML and may be out of place here. Review them and
- then delete this comment!
-*/
diff --git a/polygerrit-ui/app/styles/gr-change-metadata-shared-styles.ts b/polygerrit-ui/app/styles/gr-change-metadata-shared-styles.ts
index 3d07d2e..67a6963 100644
--- a/polygerrit-ui/app/styles/gr-change-metadata-shared-styles.ts
+++ b/polygerrit-ui/app/styles/gr-change-metadata-shared-styles.ts
@@ -55,9 +55,3 @@
</dom-module>`;
document.head.appendChild($_documentContainer.content);
-
-/*
- FIXME(polymer-modulizer): the above comments were extracted
- from HTML and may be out of place here. Review them and
- then delete this comment!
-*/
diff --git a/polygerrit-ui/app/styles/gr-change-view-integration-shared-styles.ts b/polygerrit-ui/app/styles/gr-change-view-integration-shared-styles.ts
index 57c8d78..145f0d5 100644
--- a/polygerrit-ui/app/styles/gr-change-view-integration-shared-styles.ts
+++ b/polygerrit-ui/app/styles/gr-change-view-integration-shared-styles.ts
@@ -22,6 +22,15 @@
const $_documentContainer = document.createElement('template');
+/*
+ These are shared styles for change-view-integration endpoints.
+ All plugins that registered that endpoint should include this in
+ the component to have a consistent UX:
+
+ <style include="gr-change-view-integration-shared-styles"></style>
+
+ And use those defined class to apply these styles.
+*/
$_documentContainer.innerHTML = `<dom-module id="gr-change-view-integration-shared-styles">
<template>
<style include="shared-styles">
@@ -61,18 +70,3 @@
</dom-module>`;
document.head.appendChild($_documentContainer.content);
-
-/*
- This is shared styles for change-view-integration endpoints.
- All plugins that registered that endpoint should include this in
- the component to have a consistent UX:
-
- <style include="gr-change-view-integration-shared-styles"></style>
-
- And use those defined class to apply these styles.
-*/
-/*
- FIXME(polymer-modulizer): the above comments were extracted
- from HTML and may be out of place here. Review them and
- then delete this comment!
-*/
diff --git a/polygerrit-ui/app/styles/gr-form-styles.ts b/polygerrit-ui/app/styles/gr-form-styles.ts
index 3284ad5..f58a02c 100644
--- a/polygerrit-ui/app/styles/gr-form-styles.ts
+++ b/polygerrit-ui/app/styles/gr-form-styles.ts
@@ -124,9 +124,3 @@
</dom-module>`;
document.head.appendChild($_documentContainer.content);
-
-/*
- FIXME(polymer-modulizer): the above comments were extracted
- from HTML and may be out of place here. Review them and
- then delete this comment!
-*/
diff --git a/polygerrit-ui/app/styles/gr-menu-page-styles.ts b/polygerrit-ui/app/styles/gr-menu-page-styles.ts
index e9a79c1f..d46f136 100644
--- a/polygerrit-ui/app/styles/gr-menu-page-styles.ts
+++ b/polygerrit-ui/app/styles/gr-menu-page-styles.ts
@@ -79,9 +79,3 @@
</dom-module>`;
document.head.appendChild($_documentContainer.content);
-
-/*
- FIXME(polymer-modulizer): the above comments were extracted
- from HTML and may be out of place here. Review them and
- then delete this comment!
-*/
diff --git a/polygerrit-ui/app/styles/gr-page-nav-styles.ts b/polygerrit-ui/app/styles/gr-page-nav-styles.ts
index 9010b2d..8c29b85 100644
--- a/polygerrit-ui/app/styles/gr-page-nav-styles.ts
+++ b/polygerrit-ui/app/styles/gr-page-nav-styles.ts
@@ -72,9 +72,3 @@
</dom-module>`;
document.head.appendChild($_documentContainer.content);
-
-/*
- FIXME(polymer-modulizer): the above comments were extracted
- from HTML and may be out of place here. Review them and
- then delete this comment!
-*/
diff --git a/polygerrit-ui/app/styles/gr-subpage-styles.ts b/polygerrit-ui/app/styles/gr-subpage-styles.ts
index 41ee952..5aab0dc 100644
--- a/polygerrit-ui/app/styles/gr-subpage-styles.ts
+++ b/polygerrit-ui/app/styles/gr-subpage-styles.ts
@@ -42,9 +42,3 @@
</dom-module>`;
document.head.appendChild($_documentContainer.content);
-
-/*
- FIXME(polymer-modulizer): the above comments were extracted
- from HTML and may be out of place here. Review them and
- then delete this comment!
-*/
diff --git a/polygerrit-ui/app/styles/gr-table-styles.ts b/polygerrit-ui/app/styles/gr-table-styles.ts
index 52fdc67..09d1161 100644
--- a/polygerrit-ui/app/styles/gr-table-styles.ts
+++ b/polygerrit-ui/app/styles/gr-table-styles.ts
@@ -116,9 +116,3 @@
</dom-module>`;
document.head.appendChild($_documentContainer.content);
-
-/*
- FIXME(polymer-modulizer): the above comments were extracted
- from HTML and may be out of place here. Review them and
- then delete this comment!
-*/
diff --git a/polygerrit-ui/app/styles/gr-voting-styles.ts b/polygerrit-ui/app/styles/gr-voting-styles.ts
index b50aee6..cb8b0be8 100644
--- a/polygerrit-ui/app/styles/gr-voting-styles.ts
+++ b/polygerrit-ui/app/styles/gr-voting-styles.ts
@@ -48,9 +48,3 @@
</dom-module>`;
document.head.appendChild($_documentContainer.content);
-
-/*
- FIXME(polymer-modulizer): the above comments were extracted
- from HTML and may be out of place here. Review them and
- then delete this comment!
-*/
diff --git a/polygerrit-ui/app/styles/shared-styles.ts b/polygerrit-ui/app/styles/shared-styles.ts
index 1bee660..287cf68 100644
--- a/polygerrit-ui/app/styles/shared-styles.ts
+++ b/polygerrit-ui/app/styles/shared-styles.ts
@@ -304,9 +304,3 @@
</dom-module>`;
document.head.appendChild($_documentContainer.content);
-
-/*
- FIXME(polymer-modulizer): the above comments were extracted
- from HTML and may be out of place here. Review them and
- then delete this comment!
-*/