summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShawn O. Pearce <sop@google.com>2009-03-01 10:17:07 -0800
committerShawn O. Pearce <sop@google.com>2009-03-01 10:17:07 -0800
commit4505b19403cd04a78766ad7ce76cdc7c947aa4bd (patch)
tree7f59a438cabe3b2995f9e0d30fd8863dc067b42a
parent01d1376e77f6d16e7ed0a468ac3683f3101b55d6 (diff)
Replace DomUtil with SafeHtmlBuilder
The SafeHtmlBuilder utility is much easier to keep clean content with, as the objects use (some) Java type safety to help protect the safe strings from unsafe ones. Signed-off-by: Shawn O. Pearce <sop@google.com>
-rw-r--r--src/main/java/com/google/gerrit/Gerrit.gwt.xml2
-rw-r--r--src/main/java/com/google/gerrit/client/account/AgreementPanel.java10
-rw-r--r--src/main/java/com/google/gerrit/client/admin/AccountGroupScreen.java2
-rw-r--r--src/main/java/com/google/gerrit/client/admin/ProjectRightsPanel.java18
-rw-r--r--src/main/java/com/google/gerrit/client/changes/ChangeDescriptionBlock.java6
-rw-r--r--src/main/java/com/google/gerrit/client/changes/MessagePanel.java8
-rw-r--r--src/main/java/com/google/gerrit/client/changes/PatchSetPanel.java32
-rw-r--r--src/main/java/com/google/gerrit/client/changes/PatchTable.java154
-rw-r--r--src/main/java/com/google/gerrit/client/changes/PublishCommentScreen.java3
-rw-r--r--src/main/java/com/google/gerrit/client/patches/LineCommentPanel.java11
-rw-r--r--src/main/java/com/google/gerrit/client/patches/PatchSideBySideScreen.java83
-rw-r--r--src/main/java/com/google/gerrit/client/patches/PatchUtil.java31
-rw-r--r--src/main/java/com/google/gerrit/client/patches/SideBySideTable.java137
-rw-r--r--src/main/java/com/google/gerrit/client/patches/UnifiedDiffTable.java58
-rw-r--r--src/main/java/com/google/gerrit/client/ui/DomUtil.java42
-rw-r--r--src/main/java/com/google/gerrit/client/ui/FancyFlexTable.java3
-rw-r--r--src/main/java/com/google/gerrit/client/ui/FancyFlexTableImpl.java6
-rw-r--r--src/main/java/com/google/gerrit/client/ui/FancyFlexTableImplIE6.java14
-rw-r--r--src/main/java/com/google/gerrit/public/gerrit2.cache.css (renamed from src/main/java/com/google/gerrit/public/gerrit1.cache.css)7
19 files changed, 361 insertions, 266 deletions
diff --git a/src/main/java/com/google/gerrit/Gerrit.gwt.xml b/src/main/java/com/google/gerrit/Gerrit.gwt.xml
index e5dde027fd..8d73d5cb44 100644
--- a/src/main/java/com/google/gerrit/Gerrit.gwt.xml
+++ b/src/main/java/com/google/gerrit/Gerrit.gwt.xml
@@ -12,7 +12,7 @@
<entry-point class='com.google.gerrit.client.Gerrit'/>
- <stylesheet src='gerrit1.cache.css' />
+ <stylesheet src='gerrit2.cache.css' />
<servlet path='/Gerrit'
class='com.google.gerrit.server.HostPageServlet'/>
diff --git a/src/main/java/com/google/gerrit/client/account/AgreementPanel.java b/src/main/java/com/google/gerrit/client/account/AgreementPanel.java
index a6f7bf5ed2..6fbbcd2b21 100644
--- a/src/main/java/com/google/gerrit/client/account/AgreementPanel.java
+++ b/src/main/java/com/google/gerrit/client/account/AgreementPanel.java
@@ -27,6 +27,8 @@ import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.SourcesTableEvents;
import com.google.gwt.user.client.ui.TableListener;
import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
+import com.google.gwtexpui.safehtml.client.SafeHtml;
+import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
class AgreementPanel extends Composite {
private AgreementTable agreements;
@@ -127,8 +129,12 @@ class AgreementPanel extends Composite {
}
table.setText(row, 3, cla.getShortDescription());
}
- table.setHTML(row, 4, FormatUtil.mediumFormat(k.getAcceptedOn())
- + "<br>\n" + FormatUtil.mediumFormat(k.getReviewedOn()));
+
+ final SafeHtmlBuilder b = new SafeHtmlBuilder();
+ b.append(FormatUtil.mediumFormat(k.getAcceptedOn()));
+ b.br();
+ b.append(FormatUtil.mediumFormat(k.getReviewedOn()));
+ SafeHtml.set(table, row, 4, b);
final FlexCellFormatter fmt = table.getFlexCellFormatter();
for (int c = 1; c <= 4; c++) {
diff --git a/src/main/java/com/google/gerrit/client/admin/AccountGroupScreen.java b/src/main/java/com/google/gerrit/client/admin/AccountGroupScreen.java
index 595f024999..e5c42b16e3 100644
--- a/src/main/java/com/google/gerrit/client/admin/AccountGroupScreen.java
+++ b/src/main/java/com/google/gerrit/client/admin/AccountGroupScreen.java
@@ -22,7 +22,6 @@ import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.ui.AccountDashboardLink;
import com.google.gerrit.client.ui.AccountGroupSuggestOracle;
import com.google.gerrit.client.ui.AccountScreen;
-import com.google.gerrit.client.ui.AccountSuggestOracle;
import com.google.gerrit.client.ui.AddMemberBox;
import com.google.gerrit.client.ui.FancyFlexTable;
import com.google.gerrit.client.ui.SmallHeading;
@@ -31,7 +30,6 @@ import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.FlowPanel;
-import com.google.gwt.user.client.ui.FocusListenerAdapter;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.SourcesTableEvents;
diff --git a/src/main/java/com/google/gerrit/client/admin/ProjectRightsPanel.java b/src/main/java/com/google/gerrit/client/admin/ProjectRightsPanel.java
index 15584466b9..658b66a719 100644
--- a/src/main/java/com/google/gerrit/client/admin/ProjectRightsPanel.java
+++ b/src/main/java/com/google/gerrit/client/admin/ProjectRightsPanel.java
@@ -24,7 +24,6 @@ import com.google.gerrit.client.reviewdb.ProjectRight;
import com.google.gerrit.client.rpc.Common;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.ui.AccountGroupSuggestOracle;
-import com.google.gerrit.client.ui.DomUtil;
import com.google.gerrit.client.ui.FancyFlexTable;
import com.google.gerrit.client.ui.SmallHeading;
import com.google.gwt.user.client.ui.Button;
@@ -43,6 +42,8 @@ import com.google.gwt.user.client.ui.TableListener;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
+import com.google.gwtexpui.safehtml.client.SafeHtml;
+import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
import com.google.gwtjsonrpc.client.VoidResult;
import java.util.HashSet;
@@ -383,17 +384,17 @@ public class ProjectRightsPanel extends Composite {
}
{
- final StringBuilder m = new StringBuilder();
+ final SafeHtmlBuilder m = new SafeHtmlBuilder();
final ApprovalCategoryValue min, max;
min = ar != null ? ar.getValue(k.getMinValue()) : null;
max = ar != null ? ar.getValue(k.getMaxValue()) : null;
formatValue(m, k.getMinValue(), min);
if (k.getMinValue() != k.getMaxValue()) {
- m.append("<br>");
+ m.br();
formatValue(m, k.getMaxValue(), max);
}
- table.setHTML(row, 4, m.toString());
+ SafeHtml.set(table, row, 4, m);
}
final FlexCellFormatter fmt = table.getFlexCellFormatter();
@@ -406,19 +407,20 @@ public class ProjectRightsPanel extends Composite {
setRowItem(row, k);
}
- private void formatValue(final StringBuilder m, final short v,
+ private void formatValue(final SafeHtmlBuilder m, final short v,
final ApprovalCategoryValue e) {
- m.append("<span class=\"gerrit-ProjectAdmin-ApprovalCategoryValue\">");
+ m.openSpan();
+ m.setStyleName("gerrit-ProjectAdmin-ApprovalCategoryValue");
if (v == 0) {
m.append(' ');
} else if (v > 0) {
m.append('+');
}
m.append(v);
- m.append("</span>");
+ m.closeSpan();
if (e != null) {
m.append(": ");
- m.append(DomUtil.escape(e.getName()));
+ m.append(e.getName());
}
}
}
diff --git a/src/main/java/com/google/gerrit/client/changes/ChangeDescriptionBlock.java b/src/main/java/com/google/gerrit/client/changes/ChangeDescriptionBlock.java
index c975b5e0e9..cdb7a97bd3 100644
--- a/src/main/java/com/google/gerrit/client/changes/ChangeDescriptionBlock.java
+++ b/src/main/java/com/google/gerrit/client/changes/ChangeDescriptionBlock.java
@@ -17,12 +17,13 @@ package com.google.gerrit.client.changes;
import com.google.gerrit.client.data.AccountInfoCache;
import com.google.gerrit.client.reviewdb.Change;
import com.google.gerrit.client.reviewdb.PatchSetInfo;
-import com.google.gerrit.client.ui.DomUtil;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DisclosurePanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
+import com.google.gwtexpui.safehtml.client.SafeHtml;
+import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
public class ChangeDescriptionBlock extends Composite {
private final DisclosurePanel descriptionPanel;
@@ -50,7 +51,8 @@ public class ChangeDescriptionBlock extends Composite {
public void display(final Change chg, final PatchSetInfo info,
final AccountInfoCache acc) {
infoBlock.display(chg, acc);
- description.setHTML(DomUtil.linkify(DomUtil.escape(info.getMessage())));
+ SafeHtml.set(description, new SafeHtmlBuilder().append(info.getMessage())
+ .linkify());
descriptionPanel.setOpen(true);
}
}
diff --git a/src/main/java/com/google/gerrit/client/changes/MessagePanel.java b/src/main/java/com/google/gerrit/client/changes/MessagePanel.java
index f1e29ef4a6..fbb23d5943 100644
--- a/src/main/java/com/google/gerrit/client/changes/MessagePanel.java
+++ b/src/main/java/com/google/gerrit/client/changes/MessagePanel.java
@@ -15,15 +15,17 @@
package com.google.gerrit.client.changes;
import com.google.gerrit.client.reviewdb.ChangeMessage;
-import com.google.gerrit.client.ui.DomUtil;
import com.google.gwt.user.client.ui.Composite;
-import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.Widget;
+import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
public class MessagePanel extends Composite {
boolean isRecent;
public MessagePanel(final ChangeMessage msg) {
- final HTML l = new HTML(DomUtil.wikify(msg.getMessage().trim()));
+ final Widget l =
+ new SafeHtmlBuilder().append(msg.getMessage().trim()).wikify()
+ .toBlockWidget();
l.setStyleName("gerrit-ChangeMessage-Message");
initWidget(l);
}
diff --git a/src/main/java/com/google/gerrit/client/changes/PatchSetPanel.java b/src/main/java/com/google/gerrit/client/changes/PatchSetPanel.java
index 34b7c0ada9..4d110b5b42 100644
--- a/src/main/java/com/google/gerrit/client/changes/PatchSetPanel.java
+++ b/src/main/java/com/google/gerrit/client/changes/PatchSetPanel.java
@@ -31,7 +31,6 @@ import com.google.gerrit.client.reviewdb.Project;
import com.google.gerrit.client.reviewdb.UserIdentity;
import com.google.gerrit.client.rpc.Common;
import com.google.gerrit.client.rpc.GerritCallback;
-import com.google.gerrit.client.ui.DomUtil;
import com.google.gerrit.client.ui.RefreshListener;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
@@ -45,6 +44,8 @@ import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
import com.google.gwtexpui.clippy.client.CopyableLabel;
+import com.google.gwtexpui.safehtml.client.SafeHtml;
+import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
import com.google.gwtjsonrpc.client.VoidResult;
import java.util.ArrayList;
@@ -228,38 +229,37 @@ class PatchSetPanel extends Composite implements DisclosureHandler {
return;
}
- final StringBuilder r = new StringBuilder();
+ final SafeHtmlBuilder m = new SafeHtmlBuilder();
if (who.getName() != null) {
final Account.Id aId = who.getAccount();
if (aId != null) {
- r.append("<a href=\"#");
- r.append(Link.toAccountDashboard(aId));
- r.append("\">");
+ m.openAnchor();
+ m.setAttribute("href", "#" + Link.toAccountDashboard(aId));
}
- r.append(DomUtil.escape(who.getName()));
+ m.append(who.getName());
if (aId != null) {
- r.append("</a>");
+ m.closeAnchor();
}
}
if (who.getEmail() != null) {
- if (r.length() > 0) {
- r.append(' ');
+ if (m.hasContent()) {
+ m.append(' ');
}
- r.append("&lt;");
- r.append(DomUtil.escape(who.getEmail()));
- r.append("&gt;");
+ m.append('<');
+ m.append(who.getEmail());
+ m.append('>');
}
if (who.getDate() != null) {
- if (r.length() > 0) {
- r.append(' ');
+ if (m.hasContent()) {
+ m.append(' ');
}
- r.append(DomUtil.escape(FormatUtil.mediumFormat(who.getDate())));
+ m.append(FormatUtil.mediumFormat(who.getDate()));
}
- infoTable.setHTML(row, 1, r.toString());
+ SafeHtml.set(infoTable, row, 1, m);
}
private void populateActions(final PatchSetDetail detail) {
diff --git a/src/main/java/com/google/gerrit/client/changes/PatchTable.java b/src/main/java/com/google/gerrit/client/changes/PatchTable.java
index 3c60775667..2dd821e6a9 100644
--- a/src/main/java/com/google/gerrit/client/changes/PatchTable.java
+++ b/src/main/java/com/google/gerrit/client/changes/PatchTable.java
@@ -17,7 +17,6 @@ package com.google.gerrit.client.changes;
import com.google.gerrit.client.Link;
import com.google.gerrit.client.reviewdb.Patch;
import com.google.gerrit.client.reviewdb.PatchSet;
-import com.google.gerrit.client.ui.DomUtil;
import com.google.gerrit.client.ui.FancyFlexTable;
import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.History;
@@ -25,6 +24,7 @@ import com.google.gwt.user.client.IncrementalCommand;
import com.google.gwt.user.client.ui.SourcesTableEvents;
import com.google.gwt.user.client.ui.TableListener;
import com.google.gwtexpui.progress.client.ProgressBar;
+import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
import java.util.List;
@@ -50,44 +50,66 @@ public class PatchTable extends FancyFlexTable<Patch> {
}
}
- private void appendHeader(final StringBuilder nc) {
- nc.append("<tr>");
- nc.append("<td class=\"" + S_ICON_HEADER + " LeftMostCell\">&nbsp;</td>");
- nc.append("<td class=\"" + S_ICON_HEADER + "\">&nbsp;</td>");
+ private void appendHeader(final SafeHtmlBuilder m) {
+ m.openTr();
- nc.append("<td class=\"" + S_DATA_HEADER + "\">");
- nc.append(Util.C.patchTableColumnName());
- nc.append("</td>");
+ m.openTd();
+ m.addStyleName(S_ICON_HEADER);
+ m.addStyleName("LeftMostCell");
+ m.nbsp();
+ m.closeTd();
- nc.append("<td class=\"" + S_DATA_HEADER + "\">");
- nc.append(Util.C.patchTableColumnComments());
- nc.append("</td>");
+ m.openTd();
+ m.setStyleName(S_ICON_HEADER);
+ m.nbsp();
+ m.closeTd();
- nc.append("<td class=\"" + S_DATA_HEADER + "\" colspan=\"2\">");
- nc.append(Util.C.patchTableColumnDiff());
- nc.append("</td>");
+ m.openTd();
+ m.setStyleName(S_DATA_HEADER);
+ m.append(Util.C.patchTableColumnName());
+ m.closeTd();
- nc.append("</tr>");
+ m.openTd();
+ m.setStyleName(S_DATA_HEADER);
+ m.append(Util.C.patchTableColumnComments());
+ m.closeTd();
+
+ m.openTd();
+ m.setStyleName(S_DATA_HEADER);
+ m.setAttribute("colspan", 2);
+ m.append(Util.C.patchTableColumnDiff());
+ m.closeTd();
+
+ m.closeTr();
}
- private void appendRow(final StringBuilder nc, final Patch p) {
- nc.append("<tr>");
- nc.append("<td class=\"" + S_ICON_CELL + " LeftMostCell\">&nbsp;</td>");
+ private void appendRow(final SafeHtmlBuilder m, final Patch p) {
+ m.openTr();
+
+ m.openTd();
+ m.addStyleName(S_ICON_CELL);
+ m.addStyleName("LeftMostCell");
+ m.nbsp();
+ m.closeTd();
- nc.append("<td class=\"ChangeTypeCell\">");
- nc.append(p.getChangeType().getCode());
- nc.append("</td>");
+ m.openTd();
+ m.setStyleName("ChangeTypeCell");
+ m.append(p.getChangeType().getCode());
+ m.closeTd();
- nc.append("<td class=\"" + S_DATA_CELL + " FilePathCell\">");
- nc.append("<a href=\"#");
+ m.openTd();
+ m.addStyleName(S_DATA_CELL);
+ m.addStyleName("FilePathCell");
+
+ m.openAnchor();
if (p.getPatchType() == Patch.PatchType.UNIFIED) {
- nc.append(Link.toPatchSideBySide(p.getKey()));
+ m.setAttribute("href", "#" + Link.toPatchSideBySide(p.getKey()));
} else {
- nc.append(Link.toPatchUnified(p.getKey()));
+ m.setAttribute("href", "#" + Link.toPatchUnified(p.getKey()));
}
- nc.append("\">");
- nc.append(DomUtil.escape(p.getFileName()));
- nc.append("</a>");
+ m.append(p.getFileName());
+ m.closeAnchor();
+
if (p.getSourceFileName() != null) {
final String secondLine;
if (p.getChangeType() == Patch.ChangeType.RENAMED) {
@@ -99,48 +121,54 @@ public class PatchTable extends FancyFlexTable<Patch> {
} else {
secondLine = Util.M.otherFrom(p.getSourceFileName());
}
- nc.append("<br>");
- nc.append("<span class=\"SourceFilePath\">");
- nc.append(DomUtil.escape(secondLine));
- nc.append("</span>");
+ m.br();
+ m.openSpan();
+ m.setStyleName("SourceFilePath");
+ m.append(secondLine);
+ m.closeSpan();
}
- nc.append("</td>");
+ m.closeTd();
- nc.append("<td class=\"" + S_DATA_CELL + " CommentCell\">");
+ m.openTd();
+ m.addStyleName(S_DATA_CELL);
+ m.addStyleName("CommentCell");
if (p.getCommentCount() > 0) {
- nc.append(Util.M.patchTableComments(p.getCommentCount()));
+ m.append(Util.M.patchTableComments(p.getCommentCount()));
}
if (p.getDraftCount() > 0) {
if (p.getCommentCount() > 0) {
- nc.append(", ");
+ m.append(", ");
}
- nc.append("<span class=\"Drafts\">");
- nc.append(Util.M.patchTableDrafts(p.getDraftCount()));
- nc.append("</span>");
+ m.openSpan();
+ m.setStyleName("Drafts");
+ m.append(Util.M.patchTableDrafts(p.getDraftCount()));
+ m.closeSpan();
}
- nc.append("</td>");
+ m.closeTd();
- nc.append("<td class=\"" + S_DATA_CELL + " DiffLinkCell\">");
+ m.openTd();
+ m.addStyleName(S_DATA_CELL);
+ m.addStyleName("DiffLinkCell");
if (p.getPatchType() == Patch.PatchType.UNIFIED) {
- nc.append("<a href=\"#");
- nc.append(Link.toPatchSideBySide(p.getKey()));
- nc.append("\">");
- nc.append(Util.C.patchTableDiffSideBySide());
- nc.append("</a>");
+ m.openAnchor();
+ m.setAttribute("href", "#" + Link.toPatchSideBySide(p.getKey()));
+ m.append(Util.C.patchTableDiffSideBySide());
+ m.closeAnchor();
} else {
- nc.append("&nbsp;");
+ m.nbsp();
}
- nc.append("</td>");
+ m.closeTd();
- nc.append("<td class=\"" + S_DATA_CELL + " DiffLinkCell\">");
- nc.append("<a href=\"#");
- nc.append(Link.toPatchUnified(p.getKey()));
- nc.append("\">");
- nc.append(Util.C.patchTableDiffUnified());
- nc.append("</a>");
- nc.append("</td>");
+ m.openTd();
+ m.addStyleName(S_DATA_CELL);
+ m.addStyleName("DiffLinkCell");
+ m.openAnchor();
+ m.setAttribute("href", "#" + Link.toPatchUnified(p.getKey()));
+ m.append(Util.C.patchTableDiffUnified());
+ m.closeAnchor();
+ m.closeTd();
- nc.append("</tr>");
+ m.closeTr();
}
@Override
@@ -156,7 +184,7 @@ public class PatchTable extends FancyFlexTable<Patch> {
private final class DisplayCommand implements IncrementalCommand {
private final List<Patch> list;
private boolean attached;
- private StringBuilder nc = new StringBuilder();
+ private SafeHtmlBuilder nc = new SafeHtmlBuilder();
private int stage;
private int row;
private double start;
@@ -169,7 +197,7 @@ public class PatchTable extends FancyFlexTable<Patch> {
@SuppressWarnings("fallthrough")
public boolean execute() {
final boolean attachedNow = isAttached();
- if(!attached && attachedNow){
+ if (!attached && attachedNow) {
// Remember that we have been attached at least once. If
// later we find we aren't attached we should stop running.
//
@@ -194,7 +222,7 @@ public class PatchTable extends FancyFlexTable<Patch> {
return true;
}
}
- resetHtml(nc.toString());
+ resetHtml(nc);
nc = null;
meter = null;
@@ -215,7 +243,13 @@ public class PatchTable extends FancyFlexTable<Patch> {
void initMeter() {
if (meter == null) {
- resetHtml("<tr><td></td></tr>");
+ final SafeHtmlBuilder b = new SafeHtmlBuilder();
+ b.openTr();
+ b.openTd();
+ b.closeTd();
+ b.closeTr();
+ resetHtml(b);
+
meter = new ProgressBar(Util.M.loadingPatchSet(psid.get()));
table.setWidget(0, 0, meter);
}
diff --git a/src/main/java/com/google/gerrit/client/changes/PublishCommentScreen.java b/src/main/java/com/google/gerrit/client/changes/PublishCommentScreen.java
index a3a1e50d00..7f774728f8 100644
--- a/src/main/java/com/google/gerrit/client/changes/PublishCommentScreen.java
+++ b/src/main/java/com/google/gerrit/client/changes/PublishCommentScreen.java
@@ -47,6 +47,7 @@ import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
+import com.google.gwtexpui.safehtml.client.SafeHtml;
import com.google.gwtjsonrpc.client.VoidResult;
import java.util.ArrayList;
@@ -238,7 +239,7 @@ public class PublishCommentScreen extends AccountScreen implements
panel.add(m);
m = new DoubleClickLinkLabel(patchKey);
- DOM.setInnerHTML(m.getElement(), LineCommentPanel.toHTML(c));
+ SafeHtml.set(m.getElement(), LineCommentPanel.toSafeHtml(c));
m.setStyleName("gerrit-PatchLineComment");
panel.add(m);
}
diff --git a/src/main/java/com/google/gerrit/client/patches/LineCommentPanel.java b/src/main/java/com/google/gerrit/client/patches/LineCommentPanel.java
index 5e05656b27..97a1225087 100644
--- a/src/main/java/com/google/gerrit/client/patches/LineCommentPanel.java
+++ b/src/main/java/com/google/gerrit/client/patches/LineCommentPanel.java
@@ -15,13 +15,14 @@
package com.google.gerrit.client.patches;
import com.google.gerrit.client.reviewdb.PatchLineComment;
-import com.google.gerrit.client.ui.DomUtil;
import com.google.gwt.user.client.ui.Composite;
-import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.Widget;
+import com.google.gwtexpui.safehtml.client.SafeHtml;
+import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
public class LineCommentPanel extends Composite {
- public static String toHTML(final PatchLineComment comment) {
- return DomUtil.wikify(comment.getMessage().trim());
+ public static SafeHtml toSafeHtml(final PatchLineComment msg) {
+ return new SafeHtmlBuilder().append(msg.getMessage().trim()).wikify();
}
PatchLineComment comment;
@@ -29,7 +30,7 @@ public class LineCommentPanel extends Composite {
public LineCommentPanel(final PatchLineComment msg) {
comment = msg;
- final HTML l = new HTML(toHTML(comment));
+ final Widget l = toSafeHtml(msg).toBlockWidget();
l.setStyleName("gerrit-PatchLineComment");
initWidget(l);
}
diff --git a/src/main/java/com/google/gerrit/client/patches/PatchSideBySideScreen.java b/src/main/java/com/google/gerrit/client/patches/PatchSideBySideScreen.java
index 5d4ad9de1b..0a0f0bd219 100644
--- a/src/main/java/com/google/gerrit/client/patches/PatchSideBySideScreen.java
+++ b/src/main/java/com/google/gerrit/client/patches/PatchSideBySideScreen.java
@@ -21,7 +21,6 @@ import com.google.gerrit.client.reviewdb.PatchSet;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.rpc.NoDifferencesException;
import com.google.gerrit.client.rpc.ScreenLoadCallback;
-import com.google.gerrit.client.ui.DomUtil;
import com.google.gerrit.client.ui.FancyFlexTable;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
@@ -32,6 +31,7 @@ import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.SourcesTableEvents;
import com.google.gwt.user.client.ui.TableListener;
import com.google.gwt.user.client.ui.Widget;
+import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
import com.google.gwtjsonrpc.client.RemoteJsonException;
import java.util.ArrayList;
@@ -208,14 +208,14 @@ public class PatchSideBySideScreen extends PatchScreen {
void display(final List<Patch> result) {
all.clear();
- final StringBuilder nc = new StringBuilder();
+ final SafeHtmlBuilder nc = new SafeHtmlBuilder();
appendHeader(nc);
for (int p = result.size() - 1; p >= 0; p--) {
final Patch k = result.get(p);
appendRow(nc, k);
}
appendRow(nc, null);
- resetHtml(nc.toString());
+ resetHtml(nc);
final int fileCnt = sbsTable.getFileCount();
int row = 1;
@@ -250,43 +250,72 @@ public class PatchSideBySideScreen extends PatchScreen {
return 2 + file;
}
- private void appendHeader(final StringBuilder nc) {
- nc.append("<tr>");
- nc.append("<td class=\"" + S_ICON_HEADER + " LeftMostCell\">&nbsp;</td>");
- nc.append("<td class=\"" + S_DATA_HEADER + "\">&nbsp;</td>");
+ private void appendHeader(final SafeHtmlBuilder m) {
+ m.openTr();
+
+ m.openTd();
+ m.addStyleName(S_ICON_HEADER);
+ m.addStyleName("LeftMostCell");
+ m.nbsp();
+ m.closeTd();
+
+ m.openTd();
+ m.setStyleName(S_DATA_HEADER);
+ m.nbsp();
+ m.closeTd();
+
for (int file = 0; file < sbsTable.getFileCount(); file++) {
- nc.append("<td class=\"" + S_DATA_HEADER + "\">");
- nc.append(DomUtil.escape(sbsTable.getFileTitle(file)));
- nc.append("</td>");
+ m.openTd();
+ m.setStyleName(S_DATA_HEADER);
+ m.append(sbsTable.getFileTitle(file));
+ m.closeTd();
}
- nc.append("<td class=\"" + S_DATA_HEADER + "\">");
- nc.append(DomUtil.escape("Comments"));
- nc.append("</td>");
- nc.append("</tr>");
+
+ m.openTd();
+ m.setStyleName(S_DATA_HEADER);
+ m.append(Util.C.patchTableColumnComments());
+ m.closeTd();
+
+ m.closeTr();
}
- private void appendRow(final StringBuilder nc, final Patch k) {
- nc.append("<tr>");
- nc.append("<td class=\"" + S_ICON_CELL + " LeftMostCell\">&nbsp;</td>");
- nc.append("<td class=\"" + S_DATA_CELL + "\" align=\"right\">");
+ private void appendRow(final SafeHtmlBuilder m, final Patch k) {
+ m.openTr();
+
+ m.openTd();
+ m.addStyleName(S_ICON_CELL);
+ m.addStyleName("LeftMostCell");
+ m.nbsp();
+ m.closeTd();
+
+ m.openTd();
+ m.setStyleName(S_DATA_CELL);
+ m.setAttribute("align", "right");
if (k != null) {
final PatchSet.Id psId = k.getKey().getParentKey();
- nc.append(Util.M.patchSetHeader(psId.get()));
+ m.append(Util.M.patchSetHeader(psId.get()));
} else {
- nc.append("Base");
+ m.append("Base");
}
- nc.append("</td>");
+ m.closeTd();
+
for (int file = 0; file < sbsTable.getFileCount(); file++) {
- nc.append("<td class=\"" + S_DATA_CELL + "\">&nbsp;</td>");
+ m.openTd();
+ m.setStyleName(S_DATA_CELL);
+ m.nbsp();
+ m.closeTd();
}
- nc.append("<td class=\"" + S_DATA_CELL + "\">");
+
+ m.openTd();
+ m.setStyleName(S_DATA_CELL);
if (k != null && k.getCommentCount() > 0) {
- nc.append(Util.M.patchTableComments(k.getCommentCount()));
+ m.append(Util.M.patchTableComments(k.getCommentCount()));
} else {
- nc.append("&nbsp;");
+ m.nbsp();
}
- nc.append("</td>");
- nc.append("</tr>");
+ m.closeTd();
+
+ m.closeTr();
}
private class HistoryRadio extends RadioButton {
diff --git a/src/main/java/com/google/gerrit/client/patches/PatchUtil.java b/src/main/java/com/google/gerrit/client/patches/PatchUtil.java
index 1e95950b3f..70206c79a8 100644
--- a/src/main/java/com/google/gerrit/client/patches/PatchUtil.java
+++ b/src/main/java/com/google/gerrit/client/patches/PatchUtil.java
@@ -14,8 +14,9 @@
package com.google.gerrit.client.patches;
-import com.google.gerrit.client.ui.DomUtil;
import com.google.gwt.core.client.GWT;
+import com.google.gwtexpui.safehtml.client.SafeHtml;
+import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
import com.google.gwtjsonrpc.client.JsonUtil;
public class PatchUtil {
@@ -29,11 +30,11 @@ public class PatchUtil {
JsonUtil.bind(DETAIL_SVC, "rpc/PatchDetailService");
}
- public static String lineToHTML(final String src, final int lineLength,
+ public static SafeHtml lineToSafeHtml(final String src, final int lineLength,
final boolean showWhiteSpaceErrors) {
final boolean hasTab = src.indexOf('\t') >= 0;
String brokenSrc = wrapLines(src, hasTab, lineLength);
- String html = DomUtil.escape(brokenSrc);
+ SafeHtml html = new SafeHtmlBuilder().append(brokenSrc);
if (showWhiteSpaceErrors) {
html = showTabAfterSpace(html);
html = showTrailingWhitespace(html);
@@ -81,15 +82,23 @@ public class PatchUtil {
return r.toString();
}
- private native static String expandTabs(String src)
- /*-{ return src.replace(/\t/g, '<span title="Visual Tab" class="gerrit-visualtab">&raquo;</span>\t'); }-*/;
+ private static SafeHtml expandTabs(SafeHtml src) {
+ return src
+ .replaceAll("\t",
+ "<span title=\"Visual Tab\" class=\"gerrit-visualtab\">&raquo;</span>\t");
+ }
- private native static String expandLFs(String src)
- /*-{ return src.replace(/\n/g, '<br>'); }-*/;
+ private static SafeHtml expandLFs(SafeHtml src) {
+ return src.replaceAll("\n", "<br />");
+ }
- private native static String showTabAfterSpace(String src)
- /*-{ return src.replace(/^( *\t)/, '<span class="gerrit-whitespaceerror">$1</span>'); }-*/;
+ private static SafeHtml showTabAfterSpace(SafeHtml src) {
+ return src.replaceFirst("^( *\t)",
+ "<span class=\"gerrit-whitespaceerror\">$1</span>");
+ }
- private native static String showTrailingWhitespace(String src)
- /*-{ return src.replace(/([ \t][ \t]*)(\r?\n?)$/, '<span class="gerrit-whitespaceerror">$1</span>$2'); }-*/;
+ private static SafeHtml showTrailingWhitespace(SafeHtml src) {
+ return src.replaceFirst("([ \t][ \t]*)(\r?\n?)$",
+ "<span class=\"gerrit-whitespaceerror\">$1</span>$2");
+ }
}
diff --git a/src/main/java/com/google/gerrit/client/patches/SideBySideTable.java b/src/main/java/com/google/gerrit/client/patches/SideBySideTable.java
index d051b1bb67..f343479c2b 100644
--- a/src/main/java/com/google/gerrit/client/patches/SideBySideTable.java
+++ b/src/main/java/com/google/gerrit/client/patches/SideBySideTable.java
@@ -18,10 +18,10 @@ import com.google.gerrit.client.data.SideBySideLine;
import com.google.gerrit.client.data.SideBySidePatchDetail;
import com.google.gerrit.client.reviewdb.PatchLineComment;
import com.google.gerrit.client.ui.ComplexDisclosurePanel;
-import com.google.gerrit.client.ui.DomUtil;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.InlineLabel;
import com.google.gwt.user.client.ui.Widget;
+import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
import java.util.Iterator;
import java.util.List;
@@ -128,7 +128,7 @@ public class SideBySideTable extends AbstractPatchContentTable {
// This pass does not include the line comments; they need full
// GWT widgets and are relatively infrequent. We do them later.
//
- final StringBuilder nc = new StringBuilder();
+ final SafeHtmlBuilder nc = new SafeHtmlBuilder();
appendHeader(nc);
for (final List<SideBySideLine> pLine : detail.getLines()) {
if (skipped(prior, pLine) > 0) {
@@ -140,7 +140,7 @@ public class SideBySideTable extends AbstractPatchContentTable {
if (skipped(prior, null) > 0) {
appendSkipLine(nc);
}
- resetHtml(nc.toString());
+ resetHtml(nc);
// Insert the comment widgets now that the table DOM has been
// parsed out of the HTML by the browser. We also bind each
@@ -201,37 +201,57 @@ public class SideBySideTable extends AbstractPatchContentTable {
}
}
- private void appendHeader(final StringBuilder nc) {
+ private void appendHeader(final SafeHtmlBuilder m) {
final String width = (100 / fileCnt) + "%";
- nc.append("<tr>");
- nc.append("<td class=\"FileColumnHeader " + S_ICON_CELL + "\">&nbsp;</td>");
+ m.openTr();
+
+ m.openTd();
+ m.addStyleName(S_ICON_CELL);
+ m.addStyleName("FileColumnHeader");
+ m.nbsp();
+ m.closeTd();
if (fileCnt == 2) {
- nc.append("<td class=\"FileColumnHeader LineNumber\">&nbsp;</td>");
- nc.append("<td class=\"FileColumnHeader\" width=\"");
- nc.append(width);
- nc.append("\">");
- nc.append(DomUtil.escape(PatchUtil.C.patchHeaderOld()));
- nc.append("</td>");
+ m.openTd();
+ m.addStyleName("FileColumnHeader");
+ m.addStyleName("LineNumber");
+ m.nbsp();
+ m.closeTd();
+
+ m.openTd();
+ m.setStyleName("FileColumnHeader");
+ m.setAttribute("width", width);
+ m.append(PatchUtil.C.patchHeaderOld());
+ m.closeTd();
} else {
for (int fileId = 0; fileId < fileCnt - 1; fileId++) {
- nc.append("<td class=\"FileColumnHeader LineNumber\">&nbsp;</td>");
- nc.append("<td class=\"FileColumnHeader\" width=\"");
- nc.append(width);
- nc.append("\">");
- nc.append(DomUtil.escape(PatchUtil.M.patchHeaderAncestor(fileId + 1)));
- nc.append("</td>");
+ m.openTd();
+ m.addStyleName("FileColumnHeader");
+ m.addStyleName("LineNumber");
+ m.nbsp();
+ m.closeTd();
+
+ m.openTd();
+ m.setStyleName("FileColumnHeader");
+ m.setAttribute("width", width);
+ m.append(PatchUtil.M.patchHeaderAncestor(fileId + 1));
+ m.closeTd();
}
}
- nc.append("<td class=\"FileColumnHeader LineNumber\">&nbsp;</td>");
- nc.append("<td class=\"FileColumnHeader\" width=\"");
- nc.append(width);
- nc.append("\">");
- nc.append(DomUtil.escape(PatchUtil.C.patchHeaderNew()));
- nc.append("</td>");
+ m.openTd();
+ m.addStyleName("FileColumnHeader");
+ m.addStyleName("LineNumber");
+ m.nbsp();
+ m.closeTd();
+
+ m.openTd();
+ m.setStyleName("FileColumnHeader");
+ m.setAttribute("width", width);
+ m.append(PatchUtil.C.patchHeaderNew());
+ m.closeTd();
- nc.append("</tr>");
+ m.closeTr();
}
private int skipped(List<SideBySideLine> prior,
@@ -279,14 +299,19 @@ public class SideBySideTable extends AbstractPatchContentTable {
return existCnt == gapCnt ? lines : 0;
}
- private void appendSkipLine(final StringBuilder body) {
- body.append("<tr>");
- body.append("<td class=\"" + S_ICON_CELL + "\">&nbsp;</td>");
- body.append("<td class=\"SkipLine\" colspan=\"");
- body.append(fileCnt * 2);
- body.append("\">");
- body.append("</td>");
- body.append("</tr>");
+ private void appendSkipLine(final SafeHtmlBuilder m) {
+ m.openTr();
+
+ m.openTd();
+ m.setStyleName(S_ICON_CELL);
+ m.nbsp();
+ m.closeTd();
+
+ m.openTd();
+ m.setStyleName("SkipLine");
+ m.setAttribute("colspan", fileCnt * 2);
+ m.closeTd();
+ m.closeTr();
}
private void bindSkipLine(int row, final int skipCnt) {
@@ -295,21 +320,27 @@ public class SideBySideTable extends AbstractPatchContentTable {
table.setWidget(row, 1, skipPanel);
}
- private void appendFileLine(final StringBuilder nc,
+ private void appendFileLine(final SafeHtmlBuilder m,
final List<SideBySideLine> line) {
- nc.append("<tr valign=\"top\">");
- nc.append("<td class=\"" + S_ICON_CELL + "\">&nbsp;</td>");
+ m.openTr();
+ m.setAttribute("valign", "top");
+
+ m.openTd();
+ m.setStyleName(S_ICON_CELL);
+ m.nbsp();
+ m.closeTd();
for (int fileId = 0; fileId < fileCnt; fileId++) {
final SideBySideLine s = line.get(fileId);
if (s != null) {
- nc.append("<td class=\"LineNumber\">");
- nc.append(s.getLineNumber());
- nc.append("</td>");
-
- nc.append("<td class=\"FileLine FileLine-");
- nc.append(s.getType().name());
- nc.append("\">");
+ m.openTd();
+ m.setStyleName("LineNumber");
+ m.append(s.getLineNumber());
+ m.closeTd();
+
+ m.openTd();
+ m.addStyleName("FileLine");
+ m.addStyleName("FileLine-" + s.getType().name());
if (!"".equals(s.getText())) {
boolean showWhitespaceErrors = false;
if (fileId == fileCnt - 1
@@ -319,19 +350,27 @@ public class SideBySideTable extends AbstractPatchContentTable {
//
showWhitespaceErrors = true;
}
- nc.append(PatchUtil.lineToHTML(s.getText(),
+ m.append(PatchUtil.lineToSafeHtml(s.getText(),
PatchUtil.DEFAULT_LINE_LENGTH, showWhitespaceErrors));
} else {
- nc.append("&nbsp;");
+ m.nbsp();
}
- nc.append("</td>");
+ m.closeTd();
} else {
- nc.append("<td class=\"LineNumber\">&nbsp;</td>");
- nc.append("<td class=\"FileLine FileLineNone\">&nbsp;</td>");
+ m.openTd();
+ m.setStyleName("LineNumber");
+ m.nbsp();
+ m.closeTd();
+
+ m.openTd();
+ m.addStyleName("FileLine");
+ m.addStyleName("FileLineNone");
+ m.nbsp();
+ m.closeTd();
}
}
- nc.append("</tr>");
+ m.closeTr();
}
private static class SideBySideLineList {
diff --git a/src/main/java/com/google/gerrit/client/patches/UnifiedDiffTable.java b/src/main/java/com/google/gerrit/client/patches/UnifiedDiffTable.java
index 68d3bda509..c071e8879e 100644
--- a/src/main/java/com/google/gerrit/client/patches/UnifiedDiffTable.java
+++ b/src/main/java/com/google/gerrit/client/patches/UnifiedDiffTable.java
@@ -16,6 +16,7 @@ package com.google.gerrit.client.patches;
import com.google.gerrit.client.data.PatchLine;
import com.google.gerrit.client.reviewdb.PatchLineComment;
+import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
import java.util.Iterator;
import java.util.List;
@@ -81,11 +82,11 @@ public class UnifiedDiffTable extends AbstractPatchContentTable {
public void display(final List<PatchLine> list) {
initVersions(2);
- final StringBuilder nc = new StringBuilder();
+ final SafeHtmlBuilder nc = new SafeHtmlBuilder();
for (final PatchLine pLine : list) {
appendLine(nc, pLine);
}
- resetHtml(nc.toString());
+ resetHtml(nc);
int row = 0;
for (final PatchLine pLine : list) {
@@ -106,41 +107,54 @@ public class UnifiedDiffTable extends AbstractPatchContentTable {
}
}
- private void appendLine(final StringBuilder nc, final PatchLine line) {
- nc.append("<tr>");
- nc.append("<td class=\"" + S_ICON_CELL + "\">&nbsp;</td>");
+ private void appendLine(final SafeHtmlBuilder m, final PatchLine line) {
+ m.openTr();
+ m.openTd();
+ m.setStyleName(S_ICON_CELL);
+ m.nbsp();
+ m.closeTd();
switch (line.getType()) {
case FILE_HEADER:
case HUNK_HEADER:
- nc.append("<td class=\"LineNumber\">&nbsp;</td>");
- nc.append("<td class=\"LineNumber\">&nbsp;</td>");
+ m.openTd();
+ m.setStyleName("LineNumber");
+ m.nbsp();
+ m.closeTd();
+
+ m.openTd();
+ m.setStyleName("LineNumber");
+ m.nbsp();
+ m.closeTd();
break;
+
default:
- nc.append("<td class=\"LineNumber\">");
+ m.openTd();
+ m.setStyleName("LineNumber");
if (line.getOldLineNumber() != 0
&& (line.getType() == PatchLine.Type.CONTEXT || line.getType() == PatchLine.Type.PRE_IMAGE)) {
- nc.append(line.getOldLineNumber());
+ m.append(line.getOldLineNumber());
} else {
- nc.append("&nbsp;");
+ m.nbsp();
}
- nc.append("</td>");
+ m.closeTd();
- nc.append("<td class=\"LineNumber\">");
+ m.openTd();
+ m.setStyleName("LineNumber");
if (line.getNewLineNumber() != 0
&& (line.getType() == PatchLine.Type.CONTEXT || line.getType() == PatchLine.Type.POST_IMAGE)) {
- nc.append(line.getNewLineNumber());
+ m.append(line.getNewLineNumber());
} else {
- nc.append("&nbsp;");
+ m.nbsp();
}
- nc.append("</td>");
+ m.closeTd();
break;
}
- nc.append("<td class=\"DiffText DiffText-");
- nc.append(line.getType().name());
- nc.append("\">");
+ m.openTd();
+ m.addStyleName("DiffText");
+ m.addStyleName("DiffText-" + line.getType().name());
if (!"".equals(line.getText())) {
boolean showWhitespaceErrors = false;
switch (line.getType()) {
@@ -150,12 +164,12 @@ public class UnifiedDiffTable extends AbstractPatchContentTable {
showWhitespaceErrors = true;
break;
}
- nc.append(PatchUtil.lineToHTML(line.getText(), 0, showWhitespaceErrors));
+ m.append(PatchUtil.lineToSafeHtml(line.getText(), 0, showWhitespaceErrors));
} else {
- nc.append("&nbsp;");
+ m.nbsp();
}
- nc.append("</td>");
+ m.closeTd();
- nc.append("</tr>");
+ m.closeTr();
}
}
diff --git a/src/main/java/com/google/gerrit/client/ui/DomUtil.java b/src/main/java/com/google/gerrit/client/ui/DomUtil.java
deleted file mode 100644
index 3ae0abf3f4..0000000000
--- a/src/main/java/com/google/gerrit/client/ui/DomUtil.java
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2008 Google Inc.
-//
-// 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.client.ui;
-
-import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
-
-/** Utilities for dealing with the DOM. */
-public abstract class DomUtil {
- /** Escape XML/HTML special characters in the input string. */
- public static String escape(final String in) {
- return new SafeHtmlBuilder().append(in).asString();
- }
-
- /** Convert bare URLs into &lt;a href&gt; tags. */
- public static String linkify(final String in) {
- return in.replaceAll("(https?://[^ \n\r\t]*)", "<a href=\"$1\">$1</a>");
- }
-
- /** Do wiki style formatting to make it pretty */
- public static String wikify(String in) {
- in = escape(in);
- in = linkify(in);
- in = in.replaceAll("(^|\n)([ \t][^\n]*)", "$1<span class=\"gerrit-preformat\">$2</span><br />");
- in = in.replaceAll("\n\n", "<p>\n");
- return in;
- }
-
- private DomUtil() {
- }
-}
diff --git a/src/main/java/com/google/gerrit/client/ui/FancyFlexTable.java b/src/main/java/com/google/gerrit/client/ui/FancyFlexTable.java
index 37bf00ba6f..a3beabbc72 100644
--- a/src/main/java/com/google/gerrit/client/ui/FancyFlexTable.java
+++ b/src/main/java/com/google/gerrit/client/ui/FancyFlexTable.java
@@ -32,6 +32,7 @@ import com.google.gwt.user.client.ui.KeyboardListenerAdapter;
import com.google.gwt.user.client.ui.UIObject;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
+import com.google.gwtexpui.safehtml.client.SafeHtml;
import java.util.Iterator;
import java.util.LinkedHashMap;
@@ -110,7 +111,7 @@ public abstract class FancyFlexTable<RowItem> extends Composite implements
setRowItem(table.getCellFormatter().getElement(row, 0), item);
}
- protected void resetHtml(final String body) {
+ protected void resetHtml(final SafeHtml body) {
for (final Iterator<Widget> i = table.iterator(); i.hasNext();) {
i.next();
i.remove();
diff --git a/src/main/java/com/google/gerrit/client/ui/FancyFlexTableImpl.java b/src/main/java/com/google/gerrit/client/ui/FancyFlexTableImpl.java
index 02b752e4c1..d11919e0b0 100644
--- a/src/main/java/com/google/gerrit/client/ui/FancyFlexTableImpl.java
+++ b/src/main/java/com/google/gerrit/client/ui/FancyFlexTableImpl.java
@@ -15,13 +15,13 @@
package com.google.gerrit.client.ui;
import com.google.gerrit.client.ui.FancyFlexTable.MyFlexTable;
-import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.ui.HTMLTable;
+import com.google.gwtexpui.safehtml.client.SafeHtml;
public class FancyFlexTableImpl {
- public void resetHtml(final MyFlexTable myTable, final String body) {
- DOM.setInnerHTML(getBodyElement(myTable), body);
+ public void resetHtml(final MyFlexTable myTable, final SafeHtml body) {
+ SafeHtml.set(getBodyElement(myTable), body);
}
protected static native Element getBodyElement(HTMLTable myTable)
diff --git a/src/main/java/com/google/gerrit/client/ui/FancyFlexTableImplIE6.java b/src/main/java/com/google/gerrit/client/ui/FancyFlexTableImplIE6.java
index 2b3eb503d1..de0c07de8c 100644
--- a/src/main/java/com/google/gerrit/client/ui/FancyFlexTableImplIE6.java
+++ b/src/main/java/com/google/gerrit/client/ui/FancyFlexTableImplIE6.java
@@ -18,10 +18,12 @@ import com.google.gerrit.client.ui.FancyFlexTable.MyFlexTable;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.ui.HTMLTable;
+import com.google.gwtexpui.safehtml.client.SafeHtml;
+import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
public class FancyFlexTableImplIE6 extends FancyFlexTableImpl {
@Override
- public void resetHtml(final MyFlexTable myTable, final String bodyHtml) {
+ public void resetHtml(final MyFlexTable myTable, final SafeHtml bodyHtml) {
final Element oldBody = getBodyElement(myTable);
final Element newBody = parseBody(bodyHtml);
assert newBody != null;
@@ -32,11 +34,13 @@ public class FancyFlexTableImplIE6 extends FancyFlexTableImpl {
DOM.appendChild(tableElem, newBody);
}
- private static Element parseBody(final String body) {
- final Element div = DOM.createDiv();
- DOM.setInnerHTML(div, "<table>" + body + "</table>");
+ private static Element parseBody(final SafeHtml body) {
+ final SafeHtmlBuilder b = new SafeHtmlBuilder();
+ b.openElement("table");
+ b.append(body);
+ b.closeElement("table");
- final Element newTable = DOM.getChild(div, 0);
+ final Element newTable = SafeHtml.parse(b);
for (Element e = DOM.getFirstChild(newTable); e != null; e =
DOM.getNextSibling(e)) {
if ("tbody".equals(e.getTagName().toLowerCase())) {
diff --git a/src/main/java/com/google/gerrit/public/gerrit1.cache.css b/src/main/java/com/google/gerrit/public/gerrit2.cache.css
index 59d1f4f527..69512fe775 100644
--- a/src/main/java/com/google/gerrit/public/gerrit1.cache.css
+++ b/src/main/java/com/google/gerrit/public/gerrit2.cache.css
@@ -57,12 +57,6 @@
background: red;
}
-.gerrit-preformat {
- white-space: pre;
- font-family: monospace;
- font-size: small;
-}
-
.gerrit-InputFieldTypeHint {
color: grey;
}
@@ -185,6 +179,7 @@
padding-right: 5px;
border-right: 1px solid #d4e9a9;
border-bottom: 1px solid #d4e9a9;
+ vertical-align: top;
}
.gerrit-ChangeTable .CommentCell {