| Index: chrome/browser/ui/libgtkui/gtk_ui.cc
 | 
| diff --git a/chrome/browser/ui/libgtkui/gtk_ui.cc b/chrome/browser/ui/libgtkui/gtk_ui.cc
 | 
| index cc35427af7dde23b9eb11e4b88504c18403e6448..02add34d434f5541555b4e3c4a4488f9423aa5a0 100644
 | 
| --- a/chrome/browser/ui/libgtkui/gtk_ui.cc
 | 
| +++ b/chrome/browser/ui/libgtkui/gtk_ui.cc
 | 
| @@ -379,6 +379,59 @@ views::LinuxUI::NonClientMiddleClickAction GetDefaultMiddleClickAction() {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| +#if GTK_MAJOR_VERSION > 2
 | 
| +// COLOR_TOOLBAR_TOP_SEPARATOR represents the border between tabs and the
 | 
| +// frame, as well as the border between tabs and the toolbar.  For this
 | 
| +// reason, it is difficult to calculate the One True Color that works well on
 | 
| +// all themes and is opaque.  However, we can cheat to get a good color that
 | 
| +// works well for both borders.  The idea is we have two variables: alpha and
 | 
| +// lightness.  And we have two constraints (on lightness):
 | 
| +// 1. the border color, when painted on |header_bg|, should give |header_fg|
 | 
| +// 2. the border color, when painted on |toolbar_bg|, should give |toolbar_fg|
 | 
| +// This gives the equations:
 | 
| +// alpha*lightness + (1 - alpha)*header_bg = header_fg
 | 
| +// alpha*lightness + (1 - alpha)*toolbar_bg = toolbar_fg
 | 
| +// The algorithm below is just a result of solving those equations for alpha
 | 
| +// and lightness.  If a problem is encountered, like division by zero, or
 | 
| +// |a| or |l| not in [0, 1], then fallback on |header_fg| or |toolbar_fg|.
 | 
| +SkColor GetToolbarTopSeparatorColor(SkColor header_fg,
 | 
| +                                    SkColor header_bg,
 | 
| +                                    SkColor toolbar_fg,
 | 
| +                                    SkColor toolbar_bg) {
 | 
| +  using namespace color_utils;
 | 
| +
 | 
| +  SkColor default_color = SkColorGetA(header_fg) ? header_fg : toolbar_fg;
 | 
| +  if (!SkColorGetA(default_color))
 | 
| +    return SK_ColorTRANSPARENT;
 | 
| +
 | 
| +  auto get_lightness = [](SkColor color) {
 | 
| +    HSL hsl;
 | 
| +    SkColorToHSL(color, &hsl);
 | 
| +    return hsl.l;
 | 
| +  };
 | 
| +
 | 
| +  double f1 = get_lightness(GetResultingPaintColor(header_fg, header_bg));
 | 
| +  double b1 = get_lightness(header_bg);
 | 
| +  double f2 = get_lightness(GetResultingPaintColor(toolbar_fg, toolbar_bg));
 | 
| +  double b2 = get_lightness(toolbar_bg);
 | 
| +
 | 
| +  if (b1 == b2)
 | 
| +    return default_color;
 | 
| +  double a = (f1 - f2 - b1 + b2) / (b2 - b1);
 | 
| +  if (a == 0)
 | 
| +    return default_color;
 | 
| +  double l = (f1 - (1 - a) * b1) / a;
 | 
| +  if (a < 0 || a > 1 || l < 0 || l > 1)
 | 
| +    return default_color;
 | 
| +  // Take the hue and saturation from |default_color|, but use the
 | 
| +  // calculated lightness.
 | 
| +  HSL border;
 | 
| +  SkColorToHSL(default_color, &border);
 | 
| +  border.l = l;
 | 
| +  return HSLToSkColor(border, a * 0xff);
 | 
| +}
 | 
| +#endif
 | 
| +
 | 
|  }  // namespace
 | 
|  
 | 
|  GtkUi::GtkUi() : middle_click_action_(GetDefaultMiddleClickAction()) {
 | 
| @@ -768,9 +821,29 @@ void GtkUi::LoadGtkValues() {
 | 
|    UpdateDeviceScaleFactor();
 | 
|    UpdateCursorTheme();
 | 
|  
 | 
| -  BuildFrameColors();
 | 
| -
 | 
|  #if GTK_MAJOR_VERSION == 2
 | 
| +  const color_utils::HSL kDefaultFrameShift = {-1, -1, 0.4};
 | 
| +  SkColor frame_color =
 | 
| +      native_theme_->GetSystemColor(ui::NativeTheme::kColorId_WindowBackground);
 | 
| +  frame_color = color_utils::HSLShift(frame_color, kDefaultFrameShift);
 | 
| +  GetChromeStyleColor("frame-color", &frame_color);
 | 
| +  colors_[ThemeProperties::COLOR_FRAME] = frame_color;
 | 
| +
 | 
| +  GtkStyle* style = gtk_rc_get_style(fake_window_);
 | 
| +  SkColor temp_color = color_utils::HSLShift(
 | 
| +      GdkColorToSkColor(style->bg[GTK_STATE_INSENSITIVE]), kDefaultFrameShift);
 | 
| +  GetChromeStyleColor("inactive-frame-color", &temp_color);
 | 
| +  colors_[ThemeProperties::COLOR_FRAME_INACTIVE] = temp_color;
 | 
| +
 | 
| +  temp_color = color_utils::HSLShift(frame_color, kDefaultTintFrameIncognito);
 | 
| +  GetChromeStyleColor("incognito-frame-color", &temp_color);
 | 
| +  colors_[ThemeProperties::COLOR_FRAME_INCOGNITO] = temp_color;
 | 
| +
 | 
| +  temp_color =
 | 
| +      color_utils::HSLShift(frame_color, kDefaultTintFrameIncognitoInactive);
 | 
| +  GetChromeStyleColor("incognito-inactive-frame-color", &temp_color);
 | 
| +  colors_[ThemeProperties::COLOR_FRAME_INCOGNITO_INACTIVE] = temp_color;
 | 
| +
 | 
|    SkColor toolbar_color =
 | 
|        native_theme_->GetSystemColor(ui::NativeTheme::kColorId_DialogBackground);
 | 
|    SkColor label_color = native_theme_->GetSystemColor(
 | 
| @@ -808,6 +881,16 @@ void GtkUi::LoadGtkValues() {
 | 
|    colors_[ThemeProperties::COLOR_NTP_HEADER] =
 | 
|        colors_[ThemeProperties::COLOR_FRAME];
 | 
|  #else
 | 
| +  SkColor frame_color = GetBgColor("#headerbar.header-bar.titlebar");
 | 
| +  SkColor frame_color_inactive =
 | 
| +      GetBgColor("#headerbar.header-bar.titlebar:backdrop");
 | 
| +  colors_[ThemeProperties::COLOR_FRAME] = frame_color;
 | 
| +  colors_[ThemeProperties::COLOR_FRAME_INACTIVE] = frame_color_inactive;
 | 
| +  colors_[ThemeProperties::COLOR_FRAME_INCOGNITO] =
 | 
| +      color_utils::HSLShift(frame_color, kDefaultTintFrameIncognito);
 | 
| +  colors_[ThemeProperties::COLOR_FRAME_INCOGNITO_INACTIVE] =
 | 
| +      color_utils::HSLShift(frame_color_inactive, kDefaultTintFrameIncognito);
 | 
| +
 | 
|    SkColor toolbar_color = GetBgColor("GtkToolbar#toolbar");
 | 
|    SkColor toolbar_text_color = color_utils::GetReadableColor(
 | 
|        GetFgColor("GtkToolbar#toolbar GtkLabel#label"),
 | 
| @@ -824,50 +907,54 @@ void GtkUi::LoadGtkValues() {
 | 
|  
 | 
|    SkColor location_bar_border =
 | 
|        GetBorderColor("GtkToolbar#toolbar GtkEntry#entry");
 | 
| -  if (SkColorGetA(location_bar_border)) {
 | 
| +  if (SkColorGetA(location_bar_border))
 | 
|      colors_[ThemeProperties::COLOR_LOCATION_BAR_BORDER] = location_bar_border;
 | 
| -  }
 | 
|  
 | 
| -  inactive_selection_bg_color_ = GetSelectedBgColor("GtkEntry#entry:backdrop");
 | 
| +  inactive_selection_bg_color_ =
 | 
| +      GetSelectedBgColor("GtkTextView#textview.view:backdrop");
 | 
|    inactive_selection_fg_color_ =
 | 
| -      GetSelectedTextColor("GtkEntry#entry:backdrop");
 | 
| +      GetSelectedTextColor("GtkTextView#textview.view:backdrop");
 | 
|  
 | 
| -  SkColor toolbar_separator_horizontal =
 | 
| -      GetSeparatorColor("GtkToolbar#toolbar GtkSeparator#separator.horizontal");
 | 
| -  SkColor toolbar_separator_vertical =
 | 
| -      GetSeparatorColor("GtkToolbar#toolbar GtkSeparator#separator.vertical");
 | 
| +  SkColor toolbar_button_border =
 | 
| +      GetBorderColor("GtkToolbar#toolbar GtkButton#button");
 | 
|    colors_[ThemeProperties::COLOR_DETACHED_BOOKMARK_BAR_BACKGROUND] =
 | 
|        toolbar_color;
 | 
|    colors_[ThemeProperties::COLOR_BOOKMARK_BAR_INSTRUCTIONS_TEXT] =
 | 
|        toolbar_text_color;
 | 
|    // Separates the toolbar from the bookmark bar or butter bars.
 | 
|    colors_[ThemeProperties::COLOR_TOOLBAR_BOTTOM_SEPARATOR] =
 | 
| -      toolbar_separator_horizontal;
 | 
| +      toolbar_button_border;
 | 
|    // Separates entries in the downloads bar.
 | 
|    colors_[ThemeProperties::COLOR_TOOLBAR_VERTICAL_SEPARATOR] =
 | 
| -      toolbar_separator_vertical;
 | 
| +      toolbar_button_border;
 | 
|    // Separates the bookmark bar from the web content.
 | 
|    colors_[ThemeProperties::COLOR_DETACHED_BOOKMARK_BAR_SEPARATOR] =
 | 
| -      toolbar_separator_horizontal;
 | 
| +      toolbar_button_border;
 | 
|  
 | 
|    // These colors represent the border drawn around tabs and between
 | 
|    // the tabstrip and toolbar.
 | 
| -  SkColor header_button_border =
 | 
| -      GetBorderColor("#headerbar.header-bar.titlebar GtkButton#button");
 | 
| -  SkColor header_button_inactive_border = GetBorderColor(
 | 
| -      "#headerbar.header-bar.titlebar:backdrop GtkButton#button");
 | 
| +  SkColor toolbar_top_separator = GetToolbarTopSeparatorColor(
 | 
| +      GetBorderColor("#headerbar.header-bar.titlebar GtkButton#button"),
 | 
| +      frame_color, toolbar_button_border, toolbar_color);
 | 
| +  SkColor toolbar_top_separator_inactive = GetToolbarTopSeparatorColor(
 | 
| +      GetBorderColor(
 | 
| +          "#headerbar.header-bar.titlebar:backdrop GtkButton#button"),
 | 
| +      frame_color_inactive, toolbar_button_border, toolbar_color);
 | 
|    // Unlike with toolbars, we always want a border around tabs, so let
 | 
|    // ThemeService choose the border color if the theme doesn't provide one.
 | 
| -  if (SkColorGetA(header_button_border) &&
 | 
| -      SkColorGetA(header_button_inactive_border)) {
 | 
| +  if (SkColorGetA(toolbar_top_separator) &&
 | 
| +      SkColorGetA(toolbar_top_separator_inactive)) {
 | 
|      colors_[ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR] =
 | 
| -        header_button_border;
 | 
| +        toolbar_top_separator;
 | 
|      colors_[ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR_INACTIVE] =
 | 
| -        header_button_inactive_border;
 | 
| +        toolbar_top_separator_inactive;
 | 
|    }
 | 
|  
 | 
| -  colors_[ThemeProperties::COLOR_NTP_BACKGROUND] = GetBgColor("GtkEntry#entry");
 | 
| -  colors_[ThemeProperties::COLOR_NTP_TEXT] = GetFgColor("GtkEntry#entry");
 | 
| +  colors_[ThemeProperties::COLOR_NTP_BACKGROUND] =
 | 
| +      native_theme_->GetSystemColor(
 | 
| +          ui::NativeTheme::kColorId_TextfieldDefaultBackground);
 | 
| +  colors_[ThemeProperties::COLOR_NTP_TEXT] = native_theme_->GetSystemColor(
 | 
| +      ui::NativeTheme::kColorId_TextfieldDefaultColor);
 | 
|    colors_[ThemeProperties::COLOR_NTP_HEADER] =
 | 
|        GetBorderColor("GtkButton#button");
 | 
|  #endif
 | 
| @@ -880,8 +967,8 @@ void GtkUi::LoadGtkValues() {
 | 
|  
 | 
|    // Generate the colors that we pass to WebKit.
 | 
|    SetScrollbarColors();
 | 
| -  focus_ring_color_ =
 | 
| -      native_theme_->GetSystemColor(ui::NativeTheme::kColorId_LinkEnabled);
 | 
| +  focus_ring_color_ = native_theme_->GetSystemColor(
 | 
| +      ui::NativeTheme::kColorId_FocusedBorderColor);
 | 
|  
 | 
|    // Some GTK themes only define the text selection colors on the GtkEntry
 | 
|    // class, so we need to use that for getting selection colors.
 | 
| @@ -890,12 +977,14 @@ void GtkUi::LoadGtkValues() {
 | 
|    active_selection_fg_color_ = native_theme_->GetSystemColor(
 | 
|        ui::NativeTheme::kColorId_TextfieldSelectionColor);
 | 
|  
 | 
| +  SkColor throbber_spinning = native_theme_->GetSystemColor(
 | 
| +      ui::NativeTheme::kColorId_ThrobberSpinningColor);
 | 
|    colors_[ThemeProperties::COLOR_TAB_THROBBER_SPINNING] =
 | 
| -      native_theme_->GetSystemColor(
 | 
| -          ui::NativeTheme::kColorId_ThrobberSpinningColor);
 | 
| +      color_utils::GetReadableColor(throbber_spinning, toolbar_color);
 | 
| +  SkColor throbber_waiting = native_theme_->GetSystemColor(
 | 
| +      ui::NativeTheme::kColorId_ThrobberWaitingColor);
 | 
|    colors_[ThemeProperties::COLOR_TAB_THROBBER_WAITING] =
 | 
| -      native_theme_->GetSystemColor(
 | 
| -          ui::NativeTheme::kColorId_ThrobberWaitingColor);
 | 
| +      color_utils::GetReadableColor(throbber_waiting, toolbar_color);
 | 
|  }
 | 
|  
 | 
|  void GtkUi::UpdateCursorTheme() {
 | 
| @@ -914,42 +1003,6 @@ void GtkUi::UpdateCursorTheme() {
 | 
|    g_free(theme);
 | 
|  }
 | 
|  
 | 
| -void GtkUi::BuildFrameColors() {
 | 
| -#if GTK_MAJOR_VERSION == 2
 | 
| -  const color_utils::HSL kDefaultFrameShift = {-1, -1, 0.4};
 | 
| -  SkColor frame_color =
 | 
| -      native_theme_->GetSystemColor(ui::NativeTheme::kColorId_WindowBackground);
 | 
| -  frame_color = color_utils::HSLShift(frame_color, kDefaultFrameShift);
 | 
| -  GetChromeStyleColor("frame-color", &frame_color);
 | 
| -  colors_[ThemeProperties::COLOR_FRAME] = frame_color;
 | 
| -
 | 
| -  GtkStyle* style = gtk_rc_get_style(fake_window_);
 | 
| -  SkColor temp_color = color_utils::HSLShift(
 | 
| -      GdkColorToSkColor(style->bg[GTK_STATE_INSENSITIVE]), kDefaultFrameShift);
 | 
| -  GetChromeStyleColor("inactive-frame-color", &temp_color);
 | 
| -  colors_[ThemeProperties::COLOR_FRAME_INACTIVE] = temp_color;
 | 
| -
 | 
| -  temp_color = color_utils::HSLShift(frame_color, kDefaultTintFrameIncognito);
 | 
| -  GetChromeStyleColor("incognito-frame-color", &temp_color);
 | 
| -  colors_[ThemeProperties::COLOR_FRAME_INCOGNITO] = temp_color;
 | 
| -
 | 
| -  temp_color =
 | 
| -      color_utils::HSLShift(frame_color, kDefaultTintFrameIncognitoInactive);
 | 
| -  GetChromeStyleColor("incognito-inactive-frame-color", &temp_color);
 | 
| -  colors_[ThemeProperties::COLOR_FRAME_INCOGNITO_INACTIVE] = temp_color;
 | 
| -#else
 | 
| -  SkColor color_frame = GetBgColor("#headerbar.header-bar.titlebar");
 | 
| -  SkColor color_frame_inactive =
 | 
| -      GetBgColor("#headerbar.header-bar.titlebar:backdrop");
 | 
| -  colors_[ThemeProperties::COLOR_FRAME] = color_frame;
 | 
| -  colors_[ThemeProperties::COLOR_FRAME_INACTIVE] = color_frame_inactive;
 | 
| -  colors_[ThemeProperties::COLOR_FRAME_INCOGNITO] =
 | 
| -      color_utils::HSLShift(color_frame, kDefaultTintFrameIncognito);
 | 
| -  colors_[ThemeProperties::COLOR_FRAME_INCOGNITO_INACTIVE] =
 | 
| -      color_utils::HSLShift(color_frame_inactive, kDefaultTintFrameIncognito);
 | 
| -#endif
 | 
| -}
 | 
| -
 | 
|  void GtkUi::UpdateDefaultFont() {
 | 
|    GtkWidget* fake_label = gtk_label_new(nullptr);
 | 
|    g_object_ref_sink(fake_label);  // Remove the floating reference.
 | 
| 
 |