Remove views::Label::SetDisabledColor(). Replace with typography colors.

Everything calling Label::SetDisabledColor() is just using it as a
roundabout way to make the text grey instead of black. This is bad
because "disabled" is a property that is fed through to a11y clients.
Alternatively, a consumer calls SetDisabledColor(), but the Label is
never actually disabled.

In Harmony, the typography spec distinguishes between "secondary" grey
and "hint" grey which is what consumers should actually use to describe
their text (once there's a mock which says which should be used).

Bootstrap views::style::GetColor() to support consumers that want a grey
Label to specify style::STYLE_DISABLED, or STYLE_HINT when creating a
Label.

Only LabelButton was using SetDisabledColor() properly. It sometimes
gets a disabled color from the NativeTheme and sometimes overrides it.
Nothing else needs this, so move disabled-label functionality to a Label
subclass in a follow-up: crrev.com/2913933002

BUG=691891

Review-Url: https://codereview.chromium.org/2910153002
Cr-Commit-Position: refs/heads/master@{#476897}
diff --git a/ash/accelerators/exit_warning_handler.cc b/ash/accelerators/exit_warning_handler.cc
index 747a413..e240ec0 100644
--- a/ash/accelerators/exit_warning_handler.cc
+++ b/ash/accelerators/exit_warning_handler.cc
@@ -57,7 +57,6 @@
     label->SetHorizontalAlignment(gfx::ALIGN_CENTER);
     label->SetFontList(font_list);
     label->SetEnabledColor(kTextColor);
-    label->SetDisabledColor(kTextColor);
     label->SetAutoColorReadabilityEnabled(false);
     label->SetSubpixelRenderingEnabled(false);
     AddChildView(label);
diff --git a/ash/sticky_keys/sticky_keys_overlay.cc b/ash/sticky_keys/sticky_keys_overlay.cc
index 4fc8c3a..36931e8 100644
--- a/ash/sticky_keys/sticky_keys_overlay.cc
+++ b/ash/sticky_keys/sticky_keys_overlay.cc
@@ -38,7 +38,6 @@
 
 // Duration of slide animation when overlay is shown or hidden.
 const int kSlideAnimationDurationMs = 100;
-}
 
 ///////////////////////////////////////////////////////////////////////////////
 //  StickyKeyOverlayLabel
@@ -67,7 +66,6 @@
   SetFontList(rb->GetFontList(kKeyLabelFontStyle));
   SetAutoColorReadabilityEnabled(false);
   SetEnabledColor(SkColorSetARGB(0x80, 0xFF, 0xFF, 0xFF));
-  SetDisabledColor(SkColorSetARGB(0x80, 0xFF, 0xFF, 0xFF));
   SetSubpixelRenderingEnabled(false);
 }
 
@@ -92,10 +90,11 @@
   }
 
   SetEnabledColor(label_color);
-  SetDisabledColor(label_color);
   SetFontList(font_list().DeriveWithStyle(style));
 }
 
+}  // namespace
+
 ///////////////////////////////////////////////////////////////////////////////
 //  StickyKeysOverlayView
 class StickyKeysOverlayView : public views::View {
diff --git a/ash/system/toast/toast_overlay.cc b/ash/system/toast/toast_overlay.cc
index d825617..48d5b92 100644
--- a/ash/system/toast/toast_overlay.cc
+++ b/ash/system/toast/toast_overlay.cc
@@ -53,8 +53,6 @@
       ->GetUserWorkAreaBounds();
 }
 
-}  // anonymous namespace
-
 ///////////////////////////////////////////////////////////////////////////////
 //  ToastOverlayLabel
 class ToastOverlayLabel : public views::Label {
@@ -72,7 +70,6 @@
   SetAutoColorReadabilityEnabled(false);
   SetMultiLine(true);
   SetEnabledColor(SK_ColorWHITE);
-  SetDisabledColor(SK_ColorWHITE);
   SetSubpixelRenderingEnabled(false);
 
   int verticalSpacing =
@@ -83,6 +80,8 @@
 
 ToastOverlayLabel::~ToastOverlayLabel() {}
 
+}  // namespace
+
 ///////////////////////////////////////////////////////////////////////////////
 //  ToastOverlayButton
 class ToastOverlayButton : public views::LabelButton {
diff --git a/chrome/browser/chromeos/display/touch_calibrator/touch_calibrator_view.cc b/chrome/browser/chromeos/display/touch_calibrator/touch_calibrator_view.cc
index b653898..68336d8 100644
--- a/chrome/browser/chromeos/display/touch_calibrator/touch_calibrator_view.cc
+++ b/chrome/browser/chromeos/display/touch_calibrator/touch_calibrator_view.cc
@@ -541,7 +541,6 @@
   tap_label_->SetBounds(0, kThrobberCircleViewWidth, kTapLabelWidth,
                         kTapLabelHeight);
   tap_label_->SetEnabledColor(kTapHereLabelColor);
-  tap_label_->SetDisabledColor(kTapHereLabelColor);
   tap_label_->SetHorizontalAlignment(gfx::ALIGN_CENTER);
   tap_label_->SetAutoColorReadabilityEnabled(false);
   tap_label_->SetSubpixelRenderingEnabled(false);
diff --git a/chrome/browser/chromeos/ui/idle_app_name_notification_view.cc b/chrome/browser/chromeos/ui/idle_app_name_notification_view.cc
index 5b35927..ee06a41 100644
--- a/chrome/browser/chromeos/ui/idle_app_name_notification_view.cc
+++ b/chrome/browser/chromeos/ui/idle_app_name_notification_view.cc
@@ -191,7 +191,6 @@
     label->SetHorizontalAlignment(gfx::ALIGN_CENTER);
     label->SetFontList(font);
     label->SetEnabledColor(text_color);
-    label->SetDisabledColor(text_color);
     label->SetAutoColorReadabilityEnabled(false);
     AddChildView(label);
   }
diff --git a/chrome/browser/chromeos/ui/kiosk_external_update_notification.cc b/chrome/browser/chromeos/ui/kiosk_external_update_notification.cc
index 253bd2b..795a05d 100644
--- a/chrome/browser/chromeos/ui/kiosk_external_update_notification.cc
+++ b/chrome/browser/chromeos/ui/kiosk_external_update_notification.cc
@@ -75,7 +75,6 @@
     ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance();
     label_->SetFontList(rb->GetFontList(ui::ResourceBundle::BoldFont));
     label_->SetEnabledColor(kTextColor);
-    label_->SetDisabledColor(kTextColor);
     label_->SetAutoColorReadabilityEnabled(false);
     label_->SetMultiLine(true);
     AddChildView(label_);
diff --git a/chrome/browser/ui/views/harmony/chrome_typography.cc b/chrome/browser/ui/views/harmony/chrome_typography.cc
index 5fc7051..ddeb5633 100644
--- a/chrome/browser/ui/views/harmony/chrome_typography.cc
+++ b/chrome/browser/ui/views/harmony/chrome_typography.cc
@@ -7,20 +7,20 @@
 #include "ui/base/default_style.h"
 #include "ui/base/resource/resource_bundle.h"
 
-const gfx::FontList& LegacyTypographyProvider::GetFont(int text_context,
-                                                       int text_style) const {
+const gfx::FontList& LegacyTypographyProvider::GetFont(int context,
+                                                       int style) const {
   constexpr int kHeadlineDelta = 8;
   constexpr int kDialogMessageDelta = 1;
 
   int size_delta;
   gfx::Font::Weight font_weight;
-  GetDefaultFont(text_context, text_style, &size_delta, &font_weight);
+  GetDefaultFont(context, style, &size_delta, &font_weight);
 
 #if defined(USE_ASH)
-  ash::ApplyAshFontStyles(text_context, text_style, &size_delta, &font_weight);
+  ash::ApplyAshFontStyles(context, style, &size_delta, &font_weight);
 #endif
 
-  switch (text_context) {
+  switch (context) {
     case CONTEXT_HEADLINE:
       size_delta = kHeadlineDelta;
       break;
@@ -36,7 +36,7 @@
       break;
   }
 
-  switch (text_style) {
+  switch (style) {
     case STYLE_EMPHASIZED:
       font_weight = gfx::Font::Weight::BOLD;
       break;
@@ -45,3 +45,13 @@
   return ui::ResourceBundle::GetSharedInstance().GetFontListWithDelta(
       size_delta, kFontStyle, font_weight);
 }
+
+SkColor LegacyTypographyProvider::GetColor(int context,
+                                           int style,
+                                           const ui::NativeTheme& theme) const {
+  // Use "disabled grey" for HINT and SECONDARY when Harmony is disabled.
+  if (style == STYLE_HINT || style == STYLE_SECONDARY)
+    style = views::style::STYLE_DISABLED;
+
+  return DefaultTypographyProvider::GetColor(context, style, theme);
+}
diff --git a/chrome/browser/ui/views/harmony/chrome_typography.h b/chrome/browser/ui/views/harmony/chrome_typography.h
index 394b048..84bb16f 100644
--- a/chrome/browser/ui/views/harmony/chrome_typography.h
+++ b/chrome/browser/ui/views/harmony/chrome_typography.h
@@ -61,7 +61,10 @@
   LegacyTypographyProvider() = default;
 
   // DefaultTypographyProvider:
-  const gfx::FontList& GetFont(int text_context, int text_style) const override;
+  const gfx::FontList& GetFont(int context, int style) const override;
+  SkColor GetColor(int context,
+                   int style,
+                   const ui::NativeTheme& theme) const override;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(LegacyTypographyProvider);
diff --git a/chrome/browser/ui/views/harmony/harmony_typography_provider.cc b/chrome/browser/ui/views/harmony/harmony_typography_provider.cc
index 3f34d88e..3f7f245 100644
--- a/chrome/browser/ui/views/harmony/harmony_typography_provider.cc
+++ b/chrome/browser/ui/views/harmony/harmony_typography_provider.cc
@@ -6,14 +6,16 @@
 
 #include "chrome/browser/ui/views/harmony/chrome_typography.h"
 #include "ui/base/resource/resource_bundle.h"
+#include "ui/gfx/color_palette.h"
 #include "ui/gfx/platform_font.h"
+#include "ui/native_theme/native_theme.h"
 
 #if defined(USE_ASH)
 #include "ash/public/cpp/ash_typography.h"  // nogncheck
 #endif
 
-const gfx::FontList& HarmonyTypographyProvider::GetFont(int text_context,
-                                                        int text_style) const {
+const gfx::FontList& HarmonyTypographyProvider::GetFont(int context,
+                                                        int style) const {
   // "Target" font size constants from the Harmony spec.
   constexpr int kHeadlineSize = 20;
   constexpr int kTitleSize = 15;
@@ -30,10 +32,10 @@
   gfx::Font::Weight font_weight = gfx::Font::Weight::NORMAL;
 
 #if defined(USE_ASH)
-  ash::ApplyAshFontStyles(text_context, text_style, &size_delta, &font_weight);
+  ash::ApplyAshFontStyles(context, style, &size_delta, &font_weight);
 #endif
 
-  switch (text_context) {
+  switch (context) {
     case views::style::CONTEXT_BUTTON_MD:
       font_weight = WeightNotLighterThanNormal(kButtonFontWeight);
       break;
@@ -50,20 +52,63 @@
       break;
   }
 
-  // Ignore |text_style| since it only affects color in the Harmony spec.
+  // Ignore |style| since it only affects color in the Harmony spec.
 
   return ui::ResourceBundle::GetSharedInstance().GetFontListWithDelta(
       size_delta, gfx::Font::NORMAL, font_weight);
 }
 
-SkColor HarmonyTypographyProvider::GetColor(int text_context,
-                                            int text_style) const {
-  // TODO(tapted): Look up colors from the spec.
-  return SK_ColorBLACK;
+SkColor HarmonyTypographyProvider::GetColor(
+    int context,
+    int style,
+    const ui::NativeTheme& theme) const {
+  const SkColor foreground_color =
+      theme.GetSystemColor(ui::NativeTheme::kColorId_LabelEnabledColor);
+
+  // If the default foreground color from the native theme isn't black, the rest
+  // of the Harmony spec isn't going to work. TODO(tapted): Something more
+  // generic would be nice here, but that requires knowing the background color
+  // for the text. At the time of writing, very few UI surfaces need native-
+  // themed typography with a custom native theme. Typically just incognito
+  // browser windows, when the native theme is NativeThemeDarkAura.
+  if (foreground_color != SK_ColorBLACK) {
+    switch (style) {
+      case views::style::STYLE_DISABLED:
+      case STYLE_SECONDARY:
+      case STYLE_HINT:
+        return theme.GetSystemColor(
+            ui::NativeTheme::kColorId_LabelDisabledColor);
+      case views::style::STYLE_LINK:
+        return theme.GetSystemColor(ui::NativeTheme::kColorId_LinkEnabled);
+      case STYLE_RED:
+        return foreground_color == SK_ColorWHITE ? gfx::kGoogleRed300
+                                                 : gfx::kGoogleRed700;
+      case STYLE_GREEN:
+        return foreground_color == SK_ColorWHITE ? gfx::kGoogleGreen300
+                                                 : gfx::kGoogleGreen700;
+    }
+    return foreground_color;
+  }
+
+  switch (style) {
+    case views::style::STYLE_DIALOG_BUTTON_DEFAULT:
+      return SK_ColorWHITE;
+    case views::style::STYLE_DISABLED:
+      return SkColorSetRGB(0x9e, 0x9e, 0x9e);
+    case views::style::STYLE_LINK:
+      return gfx::kGoogleBlue700;
+    case STYLE_SECONDARY:
+    case STYLE_HINT:
+      return SkColorSetRGB(0x75, 0x75, 0x75);
+    case STYLE_RED:
+      return gfx::kGoogleRed700;
+    case STYLE_GREEN:
+      return gfx::kGoogleGreen700;
+  }
+  return SkColorSetRGB(0x21, 0x21, 0x21);  // Primary for everything else.
 }
 
-int HarmonyTypographyProvider::GetLineHeight(int text_context,
-                                             int text_style) const {
+int HarmonyTypographyProvider::GetLineHeight(int context, int style) const {
   // "Target" line height constants from the Harmony spec. A default OS
   // configuration should use these heights. However, if the user overrides OS
   // defaults, then GetLineHeight() should return the height that would add the
@@ -116,7 +161,7 @@
       GetFont(CONTEXT_BODY_TEXT_SMALL, kTemplateStyle).GetHeight() -
       kBodyTextSmallPlatformHeight + kBodyHeight;
 
-  switch (text_context) {
+  switch (context) {
     case views::style::CONTEXT_BUTTON:
     case views::style::CONTEXT_BUTTON_MD:
       return kButtonAbsoluteHeight;
diff --git a/chrome/browser/ui/views/harmony/harmony_typography_provider.h b/chrome/browser/ui/views/harmony/harmony_typography_provider.h
index 7885f2ce..d3b4a8e 100644
--- a/chrome/browser/ui/views/harmony/harmony_typography_provider.h
+++ b/chrome/browser/ui/views/harmony/harmony_typography_provider.h
@@ -14,8 +14,10 @@
   HarmonyTypographyProvider() = default;
 
   // TypographyProvider:
-  const gfx::FontList& GetFont(int text_context, int text_style) const override;
-  SkColor GetColor(int context, int style) const override;
+  const gfx::FontList& GetFont(int context, int style) const override;
+  SkColor GetColor(int context,
+                   int style,
+                   const ui::NativeTheme& theme) const override;
   int GetLineHeight(int context, int style) const override;
 
  private:
diff --git a/chrome/browser/ui/views/payments/credit_card_editor_view_controller.cc b/chrome/browser/ui/views/payments/credit_card_editor_view_controller.cc
index ad3e26a6..6a2ce102 100644
--- a/chrome/browser/ui/views/payments/credit_card_editor_view_controller.cc
+++ b/chrome/browser/ui/views/payments/credit_card_editor_view_controller.cc
@@ -204,13 +204,10 @@
       views::BoxLayout::CROSS_AXIS_ALIGNMENT_START);
   view->SetLayoutManager(layout);
 
-  // "Cards accepted" label is "disabled" grey.
-  std::unique_ptr<views::Label> label = base::MakeUnique<views::Label>(
-      l10n_util::GetStringUTF16(IDS_PAYMENTS_ACCEPTED_CARDS_LABEL));
-  label->SetDisabledColor(label->GetNativeTheme()->GetSystemColor(
-      ui::NativeTheme::kColorId_LabelDisabledColor));
-  label->SetEnabled(false);
-  view->AddChildView(label.release());
+  // "Cards accepted" label is "hint" grey.
+  view->AddChildView(CreateHintLabel(l10n_util::GetStringUTF16(
+                                         IDS_PAYMENTS_ACCEPTED_CARDS_LABEL))
+                         .release());
 
   // 8dp padding is required between icons.
   constexpr int kPaddingBetweenCardIcons = 8;
diff --git a/chrome/browser/ui/views/payments/editor_view_controller.cc b/chrome/browser/ui/views/payments/editor_view_controller.cc
index 1eacd6c0..40b4fc8 100644
--- a/chrome/browser/ui/views/payments/editor_view_controller.cc
+++ b/chrome/browser/ui/views/payments/editor_view_controller.cc
@@ -325,20 +325,16 @@
   // Validate all fields and disable the primary (Done) button if necessary.
   primary_button()->SetEnabled(ValidateInputFields());
 
-  // Adds the "* indicates a required field" label in "disabled" grey text.
-  std::unique_ptr<views::Label> required_field = base::MakeUnique<views::Label>(
-      l10n_util::GetStringUTF16(IDS_PAYMENTS_REQUIRED_FIELD_MESSAGE));
-  required_field->SetDisabledColor(
-      required_field->GetNativeTheme()->GetSystemColor(
-          ui::NativeTheme::kColorId_LabelDisabledColor));
-  required_field->SetEnabled(false);
-
   views::ColumnSet* required_field_columns = editor_layout->AddColumnSet(2);
   required_field_columns->AddColumn(views::GridLayout::LEADING,
                                     views::GridLayout::CENTER, 1,
                                     views::GridLayout::USE_PREF, 0, 0);
   editor_layout->StartRow(0, 2);
-  editor_layout->AddView(required_field.release());
+  // Adds the "* indicates a required field" label in "hint" grey text.
+  editor_layout->AddView(
+      CreateHintLabel(
+          l10n_util::GetStringUTF16(IDS_PAYMENTS_REQUIRED_FIELD_MESSAGE))
+          .release());
 
   editor_view->SetLayoutManager(editor_layout.release());
 
diff --git a/chrome/browser/ui/views/payments/order_summary_view_controller.cc b/chrome/browser/ui/views/payments/order_summary_view_controller.cc
index 731ca2f..fff3282 100644
--- a/chrome/browser/ui/views/payments/order_summary_view_controller.cc
+++ b/chrome/browser/ui/views/payments/order_summary_view_controller.cc
@@ -79,11 +79,7 @@
     amount_text = CreateMediumLabel(amount);
   } else {
     label_text = base::MakeUnique<views::Label>(label);
-    currency_text = base::MakeUnique<views::Label>(currency);
-    currency_text->SetDisabledColor(
-        currency_text->GetNativeTheme()->GetSystemColor(
-            ui::NativeTheme::kColorId_LabelDisabledColor));
-    currency_text->SetEnabled(false);
+    currency_text = CreateHintLabel(currency);
     amount_text = base::MakeUnique<views::Label>(amount);
   }
   amount_text->set_id(static_cast<int>(amount_label_id));
diff --git a/chrome/browser/ui/views/payments/payment_request_views_util.cc b/chrome/browser/ui/views/payments/payment_request_views_util.cc
index 56dab1e..2866859 100644
--- a/chrome/browser/ui/views/payments/payment_request_views_util.cc
+++ b/chrome/browser/ui/views/payments/payment_request_views_util.cc
@@ -331,6 +331,15 @@
   return label;
 }
 
+std::unique_ptr<views::Label> CreateHintLabel(
+    const base::string16& text,
+    gfx::HorizontalAlignment alignment) {
+  std::unique_ptr<views::Label> label = base::MakeUnique<views::Label>(
+      text, views::style::CONTEXT_LABEL, STYLE_HINT);
+  label->SetHorizontalAlignment(alignment);
+  return label;
+}
+
 std::unique_ptr<views::View> CreateShippingOptionLabel(
     payments::mojom::PaymentShippingOption* shipping_option,
     const base::string16& formatted_amount,
diff --git a/chrome/browser/ui/views/payments/payment_request_views_util.h b/chrome/browser/ui/views/payments/payment_request_views_util.h
index 093cf06..480b5a0 100644
--- a/chrome/browser/ui/views/payments/payment_request_views_util.h
+++ b/chrome/browser/ui/views/payments/payment_request_views_util.h
@@ -12,6 +12,7 @@
 #include "components/payments/mojom/payment_request.mojom.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/geometry/insets.h"
+#include "ui/gfx/text_constants.h"
 
 namespace autofill {
 class AutofillProfile;
@@ -122,6 +123,11 @@
 // default font with a heavier weight.
 std::unique_ptr<views::Label> CreateMediumLabel(const base::string16& text);
 
+// Creates a label with grey, "hint" text and the provided |alignment|.
+std::unique_ptr<views::Label> CreateHintLabel(
+    const base::string16& text,
+    gfx::HorizontalAlignment alignment = gfx::ALIGN_CENTER);
+
 // Creates a 2 line label containing |shipping_option|'s label and amount. If
 // |emphasize_label| is true, the label part will be in medium weight.
 std::unique_ptr<views::View> CreateShippingOptionLabel(
diff --git a/chrome/browser/ui/views/payments/payment_sheet_view_controller.cc b/chrome/browser/ui/views/payments/payment_sheet_view_controller.cc
index ed4a6347..aef2527 100644
--- a/chrome/browser/ui/views/payments/payment_sheet_view_controller.cc
+++ b/chrome/browser/ui/views/payments/payment_sheet_view_controller.cc
@@ -20,6 +20,7 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/chrome_pages.h"
+#include "chrome/browser/ui/views/harmony/chrome_typography.h"
 #include "chrome/browser/ui/views/payments/payment_request_dialog_view.h"
 #include "chrome/browser/ui/views/payments/payment_request_dialog_view_ids.h"
 #include "chrome/browser/ui/views/payments/payment_request_row_view.h"
@@ -85,8 +86,9 @@
   // and |n| is the "N more" item count.
   PreviewEliderLabel(const base::string16& preview_text,
                      const base::string16& format_string,
-                     int n)
-      : views::Label(base::string16()),
+                     int n,
+                     int text_style)
+      : views::Label(base::string16(), views::style::CONTEXT_LABEL, text_style),
         preview_text_(preview_text),
         format_string_(format_string),
         n_(n) {}
@@ -194,7 +196,7 @@
 std::unique_ptr<views::View> CreateInlineCurrencyAmountItem(
     const base::string16& currency,
     const base::string16& amount,
-    bool disabled_color,
+    bool hint_color,
     bool bold) {
   std::unique_ptr<views::View> item_amount_line =
       base::MakeUnique<views::View>();
@@ -208,15 +210,15 @@
                                  views::GridLayout::LEADING, 1,
                                  views::GridLayout::USE_PREF, 0, 0);
 
-  std::unique_ptr<views::Label> currency_label =
-      bold ? CreateBoldLabel(currency)
-           : base::MakeUnique<views::Label>(currency);
-  if (disabled_color) {
-    currency_label->SetDisabledColor(
-        currency_label->GetNativeTheme()->GetSystemColor(
-            ui::NativeTheme::kColorId_LabelDisabledColor));
-    currency_label->SetEnabled(false);
-  }
+  DCHECK(!bold || !hint_color);
+  std::unique_ptr<views::Label> currency_label;
+  if (bold)
+    currency_label = CreateBoldLabel(currency);
+  else if (hint_color)
+    currency_label = CreateHintLabel(currency);
+  else
+    currency_label = base::MakeUnique<views::Label>(currency);
+
   std::unique_ptr<views::Label> amount_label =
       bold ? CreateBoldLabel(amount) : base::MakeUnique<views::Label>(amount);
   amount_label->SetMultiLine(true);
@@ -288,15 +290,8 @@
       const base::string16& truncated_content,
       const base::string16& button_string,
       bool button_enabled) {
-    std::unique_ptr<views::Label> content_view =
-        base::MakeUnique<views::Label>(truncated_content);
-    content_view->SetHorizontalAlignment(gfx::ALIGN_LEFT);
-    content_view->SetDisabledColor(
-        content_view->GetNativeTheme()->GetSystemColor(
-            ui::NativeTheme::kColorId_LabelDisabledColor));
-    content_view->SetEnabled(false);
-    return CreateWithButton(std::move(content_view), button_string,
-                            button_enabled);
+    return CreateWithButton(CreateHintLabel(truncated_content, gfx::ALIGN_LEFT),
+                            button_string, button_enabled);
   }
 
   // Creates a row with a button in place of the chevron with the string between
@@ -313,12 +308,9 @@
       const base::string16& button_string,
       bool button_enabled) {
     std::unique_ptr<PreviewEliderLabel> content_view =
-        base::MakeUnique<PreviewEliderLabel>(preview_text, format_string, n);
+        base::MakeUnique<PreviewEliderLabel>(preview_text, format_string, n,
+                                             STYLE_HINT);
     content_view->SetHorizontalAlignment(gfx::ALIGN_LEFT);
-    content_view->SetDisabledColor(
-        content_view->GetNativeTheme()->GetSystemColor(
-            ui::NativeTheme::kColorId_LabelDisabledColor));
-    content_view->SetEnabled(false);
     return CreateWithButton(std::move(content_view), button_string,
                             button_enabled);
   }
@@ -557,20 +549,13 @@
   if (hidden_item_count > 0) {
     layout->StartRow(0, 0);
     std::unique_ptr<views::Label> label =
-        base::MakeUnique<views::Label>(l10n_util::GetPluralStringFUTF16(
+        CreateHintLabel(l10n_util::GetPluralStringFUTF16(
             IDS_PAYMENT_REQUEST_ORDER_SUMMARY_MORE_ITEMS, hidden_item_count));
-    label->SetDisabledColor(label->GetNativeTheme()->GetSystemColor(
-        ui::NativeTheme::kColorId_LabelDisabledColor));
-    label->SetEnabled(false);
     layout->AddView(label.release());
     if (is_mixed_currency) {
       std::unique_ptr<views::Label> multiple_currency_label =
-          base::MakeUnique<views::Label>(l10n_util::GetStringUTF16(
+          CreateHintLabel(l10n_util::GetStringUTF16(
               IDS_PAYMENT_REQUEST_ORDER_SUMMARY_MULTIPLE_CURRENCY_INDICATOR));
-      multiple_currency_label->SetDisabledColor(
-          multiple_currency_label->GetNativeTheme()->GetSystemColor(
-              ui::NativeTheme::kColorId_LabelDisabledColor));
-      multiple_currency_label->SetEnabled(false);
       layout->AddView(multiple_currency_label.release());
     }
   }
diff --git a/chrome/browser/ui/views/profiles/profile_chooser_view.cc b/chrome/browser/ui/views/profiles/profile_chooser_view.cc
index 918acaa..41e5d35a 100644
--- a/chrome/browser/ui/views/profiles/profile_chooser_view.cc
+++ b/chrome/browser/ui/views/profiles/profile_chooser_view.cc
@@ -244,6 +244,9 @@
   }
 
   void UpdateColors() {
+    // TODO(tapted): This should use views::style::GetColor() to obtain grey
+    // text where it's needed. But note |subtitle_| is used to draw an email,
+    // which might not be grey in Harmony.
     bool is_selected = HasFocus();
 
     SetBackground(
@@ -260,8 +263,7 @@
       title_->SetEnabledColor(text_color);
 
     if (subtitle_) {
-      DCHECK(!subtitle_->enabled());
-      subtitle_->SetDisabledColor(GetNativeTheme()->GetSystemColor(
+      subtitle_->SetEnabledColor(GetNativeTheme()->GetSystemColor(
           is_selected
               ? ui::NativeTheme::kColorId_DisabledMenuItemForegroundColor
               : ui::NativeTheme::kColorId_LabelDisabledColor));
@@ -1169,7 +1171,6 @@
       current_profile_card->set_subtitle(email_label);
       email_label->SetAutoColorReadabilityEnabled(false);
       email_label->SetElideBehavior(gfx::ELIDE_EMAIL);
-      email_label->SetEnabled(false);
       email_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
       grid_layout->StartRow(1, 0);
       // Skip first column for the profile icon.
diff --git a/chrome/browser/ui/views/sad_tab_view.cc b/chrome/browser/ui/views/sad_tab_view.cc
index 544917a4..2c7b8f3c 100644
--- a/chrome/browser/ui/views/sad_tab_view.cc
+++ b/chrome/browser/ui/views/sad_tab_view.cc
@@ -10,6 +10,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
 #include "chrome/app/vector_icons/vector_icons.h"
+#include "chrome/browser/ui/views/harmony/chrome_typography.h"
 #include "content/public/browser/web_contents.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
@@ -36,10 +37,10 @@
 constexpr int kBulletPadding = 13;
 
 views::Label* CreateFormattedLabel(const base::string16& message) {
-  views::Label* label = new views::Label(message);
+  views::Label* label =
+      new views::Label(message, views::style::CONTEXT_LABEL, STYLE_SECONDARY);
 
   label->SetMultiLine(true);
-  label->SetEnabled(false);
   label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
   label->SetLineHeight(views::kPanelSubVerticalSpacing);
 
diff --git a/ui/chromeos/ime/candidate_view.cc b/ui/chromeos/ime/candidate_view.cc
index 26e78c0..af67e84 100644
--- a/ui/chromeos/ime/candidate_view.cc
+++ b/ui/chromeos/ime/candidate_view.cc
@@ -53,6 +53,7 @@
   // |wrapped_shortcut_label| is deleted.
   views::Label* shortcut_label = new views::Label;
 
+  // TODO(tapted): Get this FontList from views::style.
   if (orientation == ui::CandidateWindow::VERTICAL) {
     shortcut_label->SetFontList(shortcut_label->font_list().Derive(
         kFontSizeDelta, gfx::Font::NORMAL, gfx::Font::Weight::BOLD));
@@ -62,10 +63,6 @@
   }
   // TODO(satorux): Maybe we need to use language specific fonts for
   // candidate_label, like Chinese font for Chinese input method?
-  shortcut_label->SetEnabledColor(theme.GetSystemColor(
-      ui::NativeTheme::kColorId_LabelEnabledColor));
-  shortcut_label->SetDisabledColor(theme.GetSystemColor(
-      ui::NativeTheme::kColorId_LabelDisabledColor));
 
   // Setup paddings.
   const gfx::Insets kVerticalShortcutLabelInsets(1, 6, 1, 6);
@@ -224,7 +221,10 @@
 }
 
 void CandidateView::StateChanged(ButtonState old_state) {
-  shortcut_label_->SetEnabled(state() != STATE_DISABLED);
+  int text_style = state() == STATE_DISABLED ? views::style::STYLE_DISABLED
+                                             : views::style::STYLE_PRIMARY;
+  shortcut_label_->SetEnabledColor(views::style::GetColor(
+      views::style::CONTEXT_LABEL, text_style, GetNativeTheme()));
   if (state() == STATE_PRESSED)
     SetHighlighted(true);
 }
diff --git a/ui/views/controls/button/label_button.cc b/ui/views/controls/button/label_button.cc
index 50e17d9..0051f23 100644
--- a/ui/views/controls/button/label_button.cc
+++ b/ui/views/controls/button/label_button.cc
@@ -99,7 +99,7 @@
 void LabelButton::SetTextColor(ButtonState for_state, SkColor color) {
   button_state_colors_[for_state] = color;
   if (for_state == STATE_DISABLED)
-    label_->SetDisabledColor(color);
+    label_->SetDisabledColorForLabelButton(color);
   else if (for_state == state())
     label_->SetEnabledColor(color);
   explicitly_set_colors_[for_state] = true;
diff --git a/ui/views/controls/label.cc b/ui/views/controls/label.cc
index c5e3fc5e..1db98e3 100644
--- a/ui/views/controls/label.cc
+++ b/ui/views/controls/label.cc
@@ -53,13 +53,19 @@
     : Label(text, style::CONTEXT_LABEL, style::STYLE_PRIMARY) {}
 
 Label::Label(const base::string16& text, int text_context, int text_style)
-    : context_menu_contents_(this) {
+    : text_context_(text_context), context_menu_contents_(this) {
   Init(text, style::GetFont(text_context, text_style));
   SetLineHeight(style::GetLineHeight(text_context, text_style));
+
+  // If an explicit style is given, ignore color changes due to the NativeTheme.
+  if (text_style != style::STYLE_PRIMARY) {
+    SetEnabledColor(
+        style::GetColor(text_context, text_style, GetNativeTheme()));
+  }
 }
 
 Label::Label(const base::string16& text, const CustomFont& font)
-    : context_menu_contents_(this) {
+    : text_context_(style::CONTEXT_LABEL), context_menu_contents_(this) {
   Init(text, font.font_list);
 }
 
@@ -103,7 +109,8 @@
   RecalculateColors();
 }
 
-void Label::SetDisabledColor(SkColor color) {
+// TODO(tapted): Move this into a subclass used only by LabelButton.
+void Label::SetDisabledColorForLabelButton(SkColor color) {
   if (disabled_color_set_ && requested_disabled_color_ == color)
     return;
   is_first_paint_text_ = true;
@@ -998,12 +1005,12 @@
 
 void Label::UpdateColorsFromTheme(const ui::NativeTheme* theme) {
   if (!enabled_color_set_) {
-    requested_enabled_color_ = theme->GetSystemColor(
-        ui::NativeTheme::kColorId_LabelEnabledColor);
+    requested_enabled_color_ =
+        style::GetColor(text_context_, style::STYLE_PRIMARY, theme);
   }
   if (!disabled_color_set_) {
-    requested_disabled_color_ = theme->GetSystemColor(
-        ui::NativeTheme::kColorId_LabelDisabledColor);
+    requested_disabled_color_ =
+        style::GetColor(text_context_, style::STYLE_DISABLED, theme);
   }
   if (!background_color_set_) {
     background_color_ =
diff --git a/ui/views/controls/label.h b/ui/views/controls/label.h
index 0881558c..1beccd7 100644
--- a/ui/views/controls/label.h
+++ b/ui/views/controls/label.h
@@ -82,10 +82,9 @@
   // Sets the color.  This will automatically force the color to be readable
   // over the current background color, if auto color readability is enabled.
   virtual void SetEnabledColor(SkColor color);
-  void SetDisabledColor(SkColor color);
+  void SetDisabledColorForLabelButton(SkColor color);
 
   SkColor enabled_color() const { return actual_enabled_color_; }
-  SkColor disabled_color() const { return actual_disabled_color_; }
 
   // Sets the background color. This won't be explicitly drawn, but the label
   // will force the text color to be readable over it.
@@ -326,6 +325,10 @@
   // Builds |context_menu_contents_|.
   void BuildContextMenuContents();
 
+  // Where the label appears in the UI. Passed in from the constructor. This is
+  // a value from views::style::TextContext or an enum that extends it.
+  const int text_context_;
+
   // An un-elided and single-line RenderText object used for preferred sizing.
   std::unique_ptr<gfx::RenderText> render_text_;
 
diff --git a/ui/views/controls/link.cc b/ui/views/controls/link.cc
index 2fced0be..3d4257b2 100644
--- a/ui/views/controls/link.cc
+++ b/ui/views/controls/link.cc
@@ -170,7 +170,7 @@
 
 void Link::OnEnabledChanged() {
   RecalculateFont();
-  View::OnEnabledChanged();
+  View::OnEnabledChanged();  // Jump over Label.
 }
 
 void Link::OnFocus() {
@@ -199,15 +199,13 @@
 
 void Link::OnNativeThemeChanged(const ui::NativeTheme* theme) {
   Label::OnNativeThemeChanged(theme);
-  Label::SetEnabledColor(GetEnabledColor());
-  SetDisabledColor(
-      theme->GetSystemColor(ui::NativeTheme::kColorId_LinkDisabled));
+  Label::SetEnabledColor(GetColor());
 }
 
 void Link::SetEnabledColor(SkColor color) {
   requested_enabled_color_set_ = true;
   requested_enabled_color_ = color;
-  Label::SetEnabledColor(GetEnabledColor());
+  Label::SetEnabledColor(GetColor());
 }
 
 bool Link::IsSelectionSupported() const {
@@ -237,7 +235,7 @@
 void Link::SetPressed(bool pressed) {
   if (pressed_ != pressed) {
     pressed_ = pressed;
-    Label::SetEnabledColor(GetEnabledColor());
+    Label::SetEnabledColor(GetColor());
     RecalculateFont();
     SchedulePaint();
   }
@@ -269,17 +267,18 @@
   }
 }
 
-SkColor Link::GetEnabledColor() {
+SkColor Link::GetColor() {
+  const ui::NativeTheme* theme = GetNativeTheme();
+  DCHECK(theme);
+  if (!enabled())
+    return theme->GetSystemColor(ui::NativeTheme::kColorId_LinkDisabled);
+
   if (requested_enabled_color_set_)
     return requested_enabled_color_;
 
-  if (GetNativeTheme()) {
-    return GetNativeTheme()->GetSystemColor(
-        pressed_ ? ui::NativeTheme::kColorId_LinkPressed
-                 : ui::NativeTheme::kColorId_LinkEnabled);
-  }
-
-  return gfx::kPlaceholderColor;
+  return GetNativeTheme()->GetSystemColor(
+      pressed_ ? ui::NativeTheme::kColorId_LinkPressed
+               : ui::NativeTheme::kColorId_LinkEnabled);
 }
 
 }  // namespace views
diff --git a/ui/views/controls/link.h b/ui/views/controls/link.h
index 448adc55..70bab2b 100644
--- a/ui/views/controls/link.h
+++ b/ui/views/controls/link.h
@@ -89,8 +89,7 @@
 
   void ConfigureFocus();
 
-  SkColor GetEnabledColor();
-  SkColor GetPressedColor();
+  SkColor GetColor();
 
   LinkListener* listener_;
 
@@ -104,10 +103,6 @@
   SkColor requested_enabled_color_;
   bool requested_enabled_color_set_;
 
-  // The color when the link is pressed.
-  SkColor requested_pressed_color_;
-  bool requested_pressed_color_set_;
-
   DISALLOW_COPY_AND_ASSIGN(Link);
 };
 
diff --git a/ui/views/style/typography.cc b/ui/views/style/typography.cc
index 034d56d..a9ad8ac 100644
--- a/ui/views/style/typography.cc
+++ b/ui/views/style/typography.cc
@@ -5,6 +5,7 @@
 #include "ui/views/style/typography.h"
 
 #include "base/logging.h"
+#include "ui/native_theme/native_theme.h"
 #include "ui/views/layout/layout_provider.h"
 #include "ui/views/style/typography_provider.h"
 
@@ -26,10 +27,13 @@
                                                                 text_style);
 }
 
-SkColor GetColor(int text_context, int text_style) {
+SkColor GetColor(int text_context,
+                 int text_style,
+                 const ui::NativeTheme* theme) {
   ValidateContextAndStyle(text_context, text_style);
-  return LayoutProvider::Get()->GetTypographyProvider().GetColor(text_context,
-                                                                 text_style);
+  DCHECK(theme);
+  return LayoutProvider::Get()->GetTypographyProvider().GetColor(
+      text_context, text_style, *theme);
 }
 
 int GetLineHeight(int text_context, int text_style) {
diff --git a/ui/views/style/typography.h b/ui/views/style/typography.h
index 66a683c7..ef17cc1 100644
--- a/ui/views/style/typography.h
+++ b/ui/views/style/typography.h
@@ -12,6 +12,10 @@
 class FontList;
 }
 
+namespace ui {
+class NativeTheme;
+}
+
 namespace views {
 namespace style {
 
@@ -84,12 +88,14 @@
   VIEWS_TEXT_STYLE_END
 };
 
-// Helpers to obtain font properties from the TypographyProvider given by the
-// current ViewsDelegate. |context| can be an enum value from TextContext, or a
-// value understood by the embedder's TypographyProvider. Similarly,
+// Helpers to obtain text properties from the TypographyProvider given by the
+// current ViewsDelegate. |text_context| can be an enum value from TextContext,
+// or a value understood by the embedder's TypographyProvider. Similarly,
 // |text_style| corresponds to TextStyle.
 VIEWS_EXPORT const gfx::FontList& GetFont(int text_context, int text_style);
-VIEWS_EXPORT SkColor GetColor(int text_context, int text_style);
+VIEWS_EXPORT SkColor GetColor(int text_context,
+                              int text_style,
+                              const ui::NativeTheme* theme);
 VIEWS_EXPORT int GetLineHeight(int text_context, int text_style);
 
 }  // namespace style
diff --git a/ui/views/style/typography_provider.cc b/ui/views/style/typography_provider.cc
index ab46a0a9..11bce4e 100644
--- a/ui/views/style/typography_provider.cc
+++ b/ui/views/style/typography_provider.cc
@@ -7,6 +7,7 @@
 #include "base/logging.h"
 #include "ui/base/default_style.h"
 #include "ui/base/resource/resource_bundle.h"
+#include "ui/native_theme/native_theme.h"
 #include "ui/views/style/typography.h"
 
 using gfx::Font;
@@ -47,8 +48,14 @@
       size_delta, Font::NORMAL, font_weight);
 }
 
-SkColor DefaultTypographyProvider::GetColor(int context, int style) const {
-  return SK_ColorBLACK;
+SkColor DefaultTypographyProvider::GetColor(
+    int context,
+    int style,
+    const ui::NativeTheme& theme) const {
+  return theme.GetSystemColor(
+      (style == style::STYLE_DISABLED)
+          ? ui::NativeTheme::kColorId_LabelDisabledColor
+          : ui::NativeTheme::kColorId_LabelEnabledColor);
 }
 
 int DefaultTypographyProvider::GetLineHeight(int context, int style) const {
diff --git a/ui/views/style/typography_provider.h b/ui/views/style/typography_provider.h
index 76d6b68..978df456 100644
--- a/ui/views/style/typography_provider.h
+++ b/ui/views/style/typography_provider.h
@@ -14,6 +14,10 @@
 class FontList;
 }
 
+namespace ui {
+class NativeTheme;
+}
+
 namespace views {
 
 // Provides fonts to use in toolkit-views UI.
@@ -24,9 +28,11 @@
   // Gets the FontList for the given |context| and |style|.
   virtual const gfx::FontList& GetFont(int context, int style) const = 0;
 
-  // Gets the color for the given |context| and |style|. This may consult
-  // ui::NativeTheme.
-  virtual SkColor GetColor(int context, int style) const = 0;
+  // Gets the color for the given |context| and |style|, optionally consulting
+  // |theme|.
+  virtual SkColor GetColor(int context,
+                           int style,
+                           const ui::NativeTheme& theme) const = 0;
 
   // Gets the line spacing, or 0 if it should be provided by gfx::FontList.
   virtual int GetLineHeight(int context, int style) const = 0;
@@ -54,7 +60,9 @@
 
   // TypographyProvider:
   const gfx::FontList& GetFont(int context, int style) const override;
-  SkColor GetColor(int context, int style) const override;
+  SkColor GetColor(int context,
+                   int style,
+                   const ui::NativeTheme& theme) const override;
   int GetLineHeight(int context, int style) const override;
 
   // Sets the |size_delta| and |font_weight| that the the default GetFont()