Merge "Allow diff file picker to not text transform gr-button text"
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java
index 5cdb583..b140a6e 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java
@@ -22,9 +22,11 @@
 import com.google.gerrit.common.data.Permission;
 import com.google.gerrit.extensions.api.projects.BranchInput;
 import com.google.gerrit.extensions.api.projects.DashboardInfo;
+import com.google.gerrit.extensions.api.projects.ProjectApi;
 import com.google.gerrit.extensions.restapi.BadRequestException;
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
 import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.server.project.DashboardsCollection;
 import java.util.List;
 import org.eclipse.jgit.junit.TestRepository;
@@ -43,20 +45,20 @@
   @Test
   public void defaultDashboardDoesNotExist() throws Exception {
     exception.expect(ResourceNotFoundException.class);
-    gApi.projects().name(project.get()).defaultDashboard().get();
+    project().defaultDashboard().get();
   }
 
   @Test
   public void dashboardDoesNotExist() throws Exception {
     exception.expect(ResourceNotFoundException.class);
-    gApi.projects().name(project.get()).dashboard("my:dashboard").get();
+    project().dashboard("my:dashboard").get();
   }
 
   @Test
   public void getDashboard() throws Exception {
     assertThat(dashboards()).isEmpty();
     DashboardInfo info = createDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test");
-    DashboardInfo result = gApi.projects().name(project.get()).dashboard(info.id).get();
+    DashboardInfo result = project().dashboard(info.id).get();
     assertThat(result.id).isEqualTo(info.id);
     assertThat(result.path).isEqualTo(info.path);
     assertThat(result.ref).isEqualTo(info.ref);
@@ -69,9 +71,24 @@
   public void setDefaultDashboard() throws Exception {
     DashboardInfo info = createDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test");
     assertThat(info.isDefault).isNull();
-    gApi.projects().name(project.get()).dashboard(info.id).setDefault();
-    assertThat(gApi.projects().name(project.get()).dashboard(info.id).get().isDefault).isTrue();
-    assertThat(gApi.projects().name(project.get()).defaultDashboard().get().id).isEqualTo(info.id);
+    project().dashboard(info.id).setDefault();
+    assertThat(project().dashboard(info.id).get().isDefault).isTrue();
+    assertThat(project().defaultDashboard().get().id).isEqualTo(info.id);
+  }
+
+  @Test
+  public void setDefaultDashboardByProject() throws Exception {
+    DashboardInfo info = createDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test");
+    assertThat(info.isDefault).isNull();
+    project().defaultDashboard(info.id);
+    assertThat(project().dashboard(info.id).get().isDefault).isTrue();
+    assertThat(project().defaultDashboard().get().id).isEqualTo(info.id);
+
+    project().removeDefaultDashboard();
+    assertThat(project().dashboard(info.id).get().isDefault).isNull();
+
+    exception.expect(ResourceNotFoundException.class);
+    project().defaultDashboard().get();
   }
 
   @Test
@@ -80,14 +97,14 @@
     DashboardInfo d2 = createDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test2");
     assertThat(d1.isDefault).isNull();
     assertThat(d2.isDefault).isNull();
-    gApi.projects().name(project.get()).dashboard(d1.id).setDefault();
-    assertThat(gApi.projects().name(project.get()).dashboard(d1.id).get().isDefault).isTrue();
-    assertThat(gApi.projects().name(project.get()).dashboard(d2.id).get().isDefault).isNull();
-    assertThat(gApi.projects().name(project.get()).defaultDashboard().get().id).isEqualTo(d1.id);
-    gApi.projects().name(project.get()).dashboard(d2.id).setDefault();
-    assertThat(gApi.projects().name(project.get()).defaultDashboard().get().id).isEqualTo(d2.id);
-    assertThat(gApi.projects().name(project.get()).dashboard(d1.id).get().isDefault).isNull();
-    assertThat(gApi.projects().name(project.get()).dashboard(d2.id).get().isDefault).isTrue();
+    project().dashboard(d1.id).setDefault();
+    assertThat(project().dashboard(d1.id).get().isDefault).isTrue();
+    assertThat(project().dashboard(d2.id).get().isDefault).isNull();
+    assertThat(project().defaultDashboard().get().id).isEqualTo(d1.id);
+    project().dashboard(d2.id).setDefault();
+    assertThat(project().defaultDashboard().get().id).isEqualTo(d2.id);
+    assertThat(project().dashboard(d1.id).get().isDefault).isNull();
+    assertThat(project().dashboard(d2.id).get().isDefault).isTrue();
   }
 
   @Test
@@ -95,18 +112,22 @@
     DashboardInfo info = createDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test");
     exception.expect(BadRequestException.class);
     exception.expectMessage("inherited flag can only be used with default");
-    gApi.projects().name(project.get()).dashboard(info.id).get(true);
+    project().dashboard(info.id).get(true);
   }
 
   private List<DashboardInfo> dashboards() throws Exception {
-    return gApi.projects().name(project.get()).dashboards().get();
+    return project().dashboards().get();
+  }
+
+  private ProjectApi project() throws RestApiException {
+    return gApi.projects().name(project.get());
   }
 
   private DashboardInfo createDashboard(String ref, String path) throws Exception {
     DashboardInfo info = DashboardsCollection.newDashboardInfo(ref, path);
     String canonicalRef = DashboardsCollection.normalizeDashboardRef(info.ref);
     try {
-      gApi.projects().name(project.get()).branch(canonicalRef).create(new BranchInput());
+      project().branch(canonicalRef).create(new BranchInput());
     } catch (ResourceConflictException e) {
       // The branch already exists if this method has already been called once.
       if (!e.getMessage().contains("already exists")) {
@@ -124,7 +145,7 @@
               + "query = is:open";
       cb.add(info.path, content);
       RevCommit c = cb.create();
-      gApi.projects().name(project.get()).commit(c.name());
+      project().commit(c.name());
     }
     return info;
   }
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java
index 3379edc..8320ef7 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java
@@ -154,6 +154,16 @@
    */
   DashboardApi defaultDashboard() throws RestApiException;
 
+  /**
+   * Set the project's default dashboard.
+   *
+   * @param name the dashboard to set as default.
+   */
+  void defaultDashboard(String name) throws RestApiException;
+
+  /** Remove the project's default dashboard. */
+  void removeDefaultDashboard() throws RestApiException;
+
   abstract class ListDashboardsRequest {
     public abstract List<DashboardInfo> get() throws RestApiException;
   }
@@ -284,5 +294,15 @@
     public ListDashboardsRequest dashboards() throws RestApiException {
       throw new NotImplementedException();
     }
+
+    @Override
+    public void defaultDashboard(String name) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void removeDefaultDashboard() throws RestApiException {
+      throw new NotImplementedException();
+    }
   }
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/DashboardApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/DashboardApiImpl.java
index f0a6009..0d4afd6 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/DashboardApiImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/DashboardApiImpl.java
@@ -16,6 +16,7 @@
 
 import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
 
+import com.google.gerrit.common.Nullable;
 import com.google.gerrit.extensions.api.projects.DashboardApi;
 import com.google.gerrit.extensions.api.projects.DashboardInfo;
 import com.google.gerrit.extensions.common.SetDashboardInput;
@@ -51,7 +52,7 @@
       Provider<GetDashboard> get,
       SetDashboard set,
       @Assisted ProjectResource project,
-      @Assisted String id) {
+      @Assisted @Nullable String id) {
     this.dashboards = dashboards;
     this.get = get;
     this.set = set;
@@ -80,7 +81,8 @@
     try {
       set.apply(DashboardResource.projectDefault(project.getControl()), input);
     } catch (Exception e) {
-      throw asRestApiException("Cannot set default dashboard", e);
+      String msg = String.format("Cannot %s default dashboard", id != null ? "set" : "remove");
+      throw asRestApiException(msg, e);
     }
   }
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java
index 89c92d0..9fd4d48 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java
@@ -486,6 +486,24 @@
   }
 
   @Override
+  public void defaultDashboard(String name) throws RestApiException {
+    try {
+      dashboardApi.create(checkExists(), name).setDefault();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot set default dashboard", e);
+    }
+  }
+
+  @Override
+  public void removeDefaultDashboard() throws RestApiException {
+    try {
+      dashboardApi.create(checkExists(), null).setDefault();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot remove default dashboard", e);
+    }
+  }
+
+  @Override
   public ListDashboardsRequest dashboards() throws RestApiException {
     return new ListDashboardsRequest() {
       @Override
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java
index db90199..f360734 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java
@@ -219,11 +219,6 @@
     return Capable.OK;
   }
 
-  /** Does this user have ownership on at least one reference name? */
-  public boolean isOwnerAnyRef() {
-    return canPerformOnAnyRef(Permission.OWNER) || isAdmin();
-  }
-
   /** Can the user run upload pack? */
   private boolean canRunUploadPack() {
     for (AccountGroup.UUID group : uploadGroups) {
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
index f6966683..e4eea51 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
@@ -200,13 +200,6 @@
       .showOnEdit {
         display: none;
       }
-      .patchInfo {
-        border: 1px solid #ddd;
-        margin: 1em var(--default-horizontal-margin);
-      }
-      #fileList {
-        padding: 0 calc(var(--default-horizontal-margin) / 2) .5em;
-      }
       .scrollable {
         overflow: auto;
       }
@@ -226,6 +219,9 @@
           min-width: 0;
         }
       }
+      .patchInfo {
+        margin-top: 1em;
+      }
       /* NOTE: If you update this breakpoint, also update the
       BREAKPOINT_RELATED_SMALL in the JS */
       @media screen and (max-width: 50em) {
diff --git a/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.html b/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.html
index b9c1328..2befcb2 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.html
+++ b/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.html
@@ -44,8 +44,9 @@
         display: initial;
       }
       .patchInfo-header {
-        background-color: #f6f6f6;
-        border-bottom: 1px solid #ebebeb;
+        background-color: #fafafa;
+        border-bottom: 1px solid #ddd;
+        border-top: 1px solid #ddd;
         display: flex;
         height: 3.2em;
         padding: 0 calc(var(--default-horizontal-margin) / 2);
@@ -56,9 +57,16 @@
         margin: 0 .25em;
         width: 100%;
       }
+      .patchInfo-left {
+        align-items: center;
+        display: flex;
+      }
       .latestPatchContainer {
         display: none;
       }
+      .latestPatchContainer a {
+        text-decoration: none;
+      }
       gr-editable-label.descriptionLabel {
         max-width: 100%;
       }
@@ -79,6 +87,13 @@
       .editLoaded .showOnEdit {
         display: initial;
       }
+      .patchInfo-header-wrapper .container {
+        align-items: center;
+        display: flex;
+      }
+      #modeSelect {
+        margin-left: .1em;
+      }
       .fileList-header {
         align-items: center;
         display: flex;
@@ -95,7 +110,13 @@
         justify-content: flex-end;
       }
       .separator {
-        margin: 0 .25em;
+        background-color: rgba(0, 0, 0, .3);
+        height: 1.5em;
+        margin: 0 .4em;
+        width: 1px;
+      }
+      .separator.transparent {
+        background-color: transparent;
       }
       .expandInline {
         padding-right: .25em;
@@ -118,7 +139,7 @@
     </style>
     <div class$="patchInfo-header [[_computeEditLoadedClass(editLoaded)]] [[_computePatchInfoClass(patchNum, allPatchSets)]]">
       <div class="patchInfo-header-wrapper">
-        <div>
+        <div class="patchInfo-left">
           <span class="label">Files</span>
           <gr-patch-range-select
               id="rangeSelect"
@@ -130,23 +151,23 @@
               revisions="[[change.revisions]]"
               on-patch-range-change="_handlePatchChange">
           </gr-patch-range-select>
-          /
+          <span class="separator"></span>
           <gr-commit-info
               change="[[change]]"
               server-config="[[serverConfig]]"
               commit-info="[[commitInfo]]"></gr-commit-info>
-          <span class="latestPatchContainer">
-            /
+          <span class="container latestPatchContainer">
+            <span class="separator"></span>
             <a href$="[[changeUrl]]">Go to latest patch set</a>
           </span>
-          <span class="downloadContainer desktop">
-            /
+          <span class="container downloadContainer desktop">
+            <span class="separator"></span>
             <gr-button link
                 class="download"
                 on-tap="_handleDownloadTap">Download</gr-button>
           </span>
-          <span class="descriptionContainer hideOnEdit">
-            /
+          <span class="container descriptionContainer hideOnEdit">
+            <span class="separator"></span>
             <gr-editable-label
                 id="descriptionLabel"
                 class="descriptionLabel"
@@ -176,7 +197,7 @@
               id="expandBtn"
               link
               on-tap="_expandAllDiffs">Show diffs</gr-button>
-          <span class="separator">/</span>
+          <span class="separator"></span>
           <gr-button
               id="collapseBtn"
               link
@@ -188,7 +209,7 @@
             Bulk actions disabled because there are too many files.
           </div>
         </template>
-        <span class="separator">/</span>
+        <span class="separator"></span>
         <gr-select
             id="modeSelect"
             bind-value="{{diffViewMode}}">
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
index c450fee..1a164b6 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
+++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
@@ -39,10 +39,10 @@
       }
       .row {
         align-items: center;
-        border-top: 1px solid #eee;
+        border-top: 1px solid #ddd;
         display: flex;
         height: 2.25em;
-        padding: 0 .25em;
+        padding: 0 calc(var(--default-horizontal-margin) / 2 + .25em);
       }
       :host(.loading) .row {
         opacity: .5;
diff --git a/polygerrit-ui/app/elements/change/gr-message/gr-message.html b/polygerrit-ui/app/elements/change/gr-message/gr-message.html
index c0e55ef..845bdaf 100644
--- a/polygerrit-ui/app/elements/change/gr-message/gr-message.html
+++ b/polygerrit-ui/app/elements/change/gr-message/gr-message.html
@@ -28,7 +28,7 @@
   <template>
     <style include="shared-styles">
       :host {
-        border-top: 1px solid #ddd;
+        border-bottom: 1px solid #ddd;
         display: block;
         position: relative;
         cursor: pointer;
diff --git a/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.html b/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.html
index 2eed88b..b2beb47 100644
--- a/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.html
+++ b/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.html
@@ -28,9 +28,13 @@
         display: block;
       }
       .header {
+        align-items: center;
+        background-color: #fafafa;
+        border-bottom: 1px solid #ddd;
+        border-top: 1px solid #ddd;
         display: flex;
+        height: 3.2em;
         justify-content: space-between;
-        margin-bottom: .35em;
       }
       .header,
       #messageControlsContainer {
@@ -45,25 +49,40 @@
       }
       #messageControlsContainer {
         align-items: center;
-        background-color: #fef;
+        border-bottom: 1px solid #ddd;
         display: flex;
+        height: 2.25em;
         justify-content: center;
       }
       #messageControlsContainer gr-button {
-        padding: 0.4em;
+        padding: 0.4em 0;
+      }
+      .separator {
+        background-color: rgba(0, 0, 0, .3);
+        height: 1.5em;
+        margin: 0 .4em;
+        width: 1px;
+      }
+      .separator.transparent {
+        background-color: transparent;
+      }
+      .container {
+        align-items: center;
+        display: flex;
       }
     </style>
     <div class="header">
       <h3>Messages</h3>
-      <div class="messageListControls">
+      <div class="messageListControls container">
         <gr-button id="collapse-messages" link
             on-tap="_handleExpandCollapseTap">
           [[_computeExpandCollapseMessage(_expanded)]]
         </gr-button>
         <span
             id="automatedMessageToggleContainer"
+            class="container"
             hidden$="[[!_hasAutomatedMessages(messages)]]">
-          /
+          <span class="transparent separator"></span>
           <gr-button id="automatedMessageToggle" link
               on-tap="_handleAutomatedMessageToggleTap">
             [[_computeAutomatedToggleText(_hideAutomated)]]
@@ -78,8 +97,9 @@
           [[_computeNumMessagesText(_visibleMessages, _processedMessages, _hideAutomated, _visibleMessages.length)]]
       </gr-button>
       <span
+          class="container"
           hidden$="[[_computeIncrementHidden(_visibleMessages, _processedMessages, _hideAutomated, _visibleMessages.length)]]">
-        /
+        <span class="transparent separator"></span>
         <gr-button id="incrementMessagesBtn" link
             on-tap="_handleIncrementShownMessages">
           [[_computeIncrementText(_visibleMessages, _processedMessages, _hideAutomated, _visibleMessages.length)]]
diff --git a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.html b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.html
index 4f90502..08e6c2c 100644
--- a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.html
+++ b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.html
@@ -30,6 +30,9 @@
       select {
         max-width: 15em;
       }
+      .arrow {
+        margin: 0 .5em;
+      }
       @media screen and (max-width: 50em) {
         .filesWeblinks {
           display: none;
@@ -49,7 +52,7 @@
            href$="[[weblink.url]]">[[weblink.name]]</a>
       </template>
     </span>
-    &rarr;
+    <span class="arrow">&rarr;</span>
     <span class="patchRange">
       <gr-dropdown-list
           id="patchNumDropdown"
diff --git a/polygerrit-ui/app/elements/shared/gr-button/gr-button.html b/polygerrit-ui/app/elements/shared/gr-button/gr-button.html
index 6f37981..c0b17af 100644
--- a/polygerrit-ui/app/elements/shared/gr-button/gr-button.html
+++ b/polygerrit-ui/app/elements/shared/gr-button/gr-button.html
@@ -60,6 +60,10 @@
         background-color: var(--color-link);
         color: #fff;
       }
+      :host([primary][disabled]) paper-button[raised],
+      :host([disabled]) paper-button {
+        opacity: .5;
+      }
       :host([link]) paper-button:hover,
       :host([link]) paper-button:focus,
       paper-button[raised]:hover,
@@ -91,14 +95,15 @@
       }
       :host:not([down-arrow]) .downArrow {display: none; }
       :host([down-arrow]) .downArrow {
+        border-top: .36em solid var(--gr-button-arrow-color, #ccc);
         border-left: .36em solid transparent;
         border-right: .36em solid transparent;
-        border-top: .36em solid #ccc;
+        margin-bottom: .05em;
         margin-left: .5em;
         transition: border-top-color 200ms;
       }
-      :host([down-arrow]):hover .downArrow {
-        border-top-color: #666;
+      :host([down-arrow]) paper-button:hover .downArrow {
+        border-top-color: var(--gr-button-arrow-hover-color, #666);
       }
       :host([loading]) paper-button,
       :host([disabled]) paper-button {
@@ -111,7 +116,7 @@
         color: #aaa;
       }
     </style>
-    <paper-button raised="[[!link]]">
+    <paper-button raised="[[!link]]" disabled="[[disabled]]">
       <content></content>
       <i class="downArrow"></i>
     </paper-button>
diff --git a/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list.html b/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list.html
index 8a3de33..91c2def 100644
--- a/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list.html
+++ b/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list.html
@@ -37,12 +37,6 @@
         -webkit-user-select: text;
         user-select: text;
       }
-      .downArrow {
-        display: inline-block;
-        font-size: .6em;
-        user-select: none;
-        vertical-align: middle;
-      }
       .dropdown-trigger {
         cursor: pointer;
         padding: 0;
@@ -52,7 +46,8 @@
         box-shadow: 0 1px 5px rgba(0, 0, 0, .3);
         max-height: 70vh;
         margin-top: 1.5em;
-        width: 266px;
+        min-width: 266px;
+        max-width: 300px;
       }
       paper-listbox {
         --paper-listbox: {
@@ -77,14 +72,15 @@
           background-color: #f2f2f2;
         }
       }
+      gr-button {
+        --gr-button-arrow-color: var(--color-link);
+        --gr-button-arrow-hover-color: var(--color-link-hover);
+      }
       paper-item:not(:last-of-type) {
         border-bottom: 1px solid #ddd;
       }
       #trigger {
-        color: black;
-        font: inherit;
         padding: .3em 0;
-        text-decoration: none;
       }
       .bottomContent {
         color: rgba(0,0,0,.54);
@@ -130,15 +126,13 @@
       }
     </style>
     <gr-button
+        down-arrow
         link
         id="trigger"
         class="dropdown-trigger"
         on-tap="_showDropdownTapHandler"
         slot="dropdown-trigger">
       <span>[[text]]</span>
-      <span
-          class="downArrow"
-          on-tap="_showDropdownTapHandler">&#9660;</span>
     </gr-button>
     <iron-dropdown
         id="dropdown"