blob: 836349f1bbcc130e4dc3bf6a1d9e0d3c9bc09db7 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/views/profiles/incognito_menu_view.h"
#include <algorithm>
#include <string>
#include <utility>
#include "base/bind.h"
#include "base/macros.h"
#include "base/metrics/histogram_macros.h"
#include "base/metrics/user_metrics.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
#include "chrome/app/vector_icons/vector_icons.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/views/chrome_layout_provider.h"
#include "chrome/grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/views/accessibility/view_accessibility.h"
#include "ui/views/controls/image_view.h"
#include "ui/views/style/typography.h"
IncognitoMenuView::IncognitoMenuView(views::Button* anchor_button,
const gfx::Rect& anchor_rect,
gfx::NativeView parent_window,
Browser* browser)
: ProfileMenuViewBase(anchor_button, anchor_rect, parent_window, browser) {
DCHECK(browser->profile()->IsIncognito());
GetViewAccessibility().OverrideName(GetAccessibleWindowTitle());
chrome::RecordDialogCreation(
chrome::DialogIdentifier::INCOGNITO_WINDOW_COUNT);
base::RecordAction(base::UserMetricsAction("IncognitoMenu_Show"));
}
IncognitoMenuView::~IncognitoMenuView() = default;
void IncognitoMenuView::Reset() {
ProfileMenuViewBase::Reset();
exit_button_ = nullptr;
}
void IncognitoMenuView::Init() {
Reset();
AddIncognitoWindowCountView();
RepopulateViewFromMenuItems();
}
base::string16 IncognitoMenuView::GetAccessibleWindowTitle() const {
return l10n_util::GetPluralStringFUTF16(
IDS_INCOGNITO_BUBBLE_ACCESSIBLE_TITLE,
BrowserList::GetIncognitoSessionsActiveForProfile(browser()->profile()));
}
void IncognitoMenuView::ButtonPressed(views::Button* sender,
const ui::Event& event) {
DCHECK_EQ(sender, exit_button_);
// Skipping before-unload trigger to give incognito mode users a chance to
// quickly close all incognito windows without needing to confirm closing the
// open forms.
BrowserList::CloseAllBrowsersWithIncognitoProfile(
browser()->profile(), base::DoNothing(), base::DoNothing(),
true /* skip_beforeunload */);
}
void IncognitoMenuView::AddIncognitoWindowCountView() {
ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
int incognito_window_count =
BrowserList::GetIncognitoSessionsActiveForProfile(browser()->profile());
// The icon color is set to match the menu text, which guarantees sufficient
// contrast and a consistent visual appearance.
const SkColor icon_color = provider->GetTypographyProvider().GetColor(
*this, views::style::CONTEXT_LABEL, views::style::STYLE_PRIMARY);
auto incognito_icon = std::make_unique<views::ImageView>();
incognito_icon->SetImage(
gfx::CreateVectorIcon(kIncognitoProfileIcon, icon_color));
AddMenuGroup(false /* add_separator */);
CreateAndAddTitleCard(
std::move(incognito_icon),
l10n_util::GetStringUTF16(IDS_INCOGNITO_PROFILE_MENU_TITLE),
incognito_window_count > 1
? l10n_util::GetPluralStringFUTF16(IDS_INCOGNITO_WINDOW_COUNT_MESSAGE,
incognito_window_count)
: base::string16(),
false);
AddMenuGroup();
exit_button_ = CreateAndAddButton(
gfx::CreateVectorIcon(kCloseAllIcon, 16, gfx::kChromeIconGrey),
l10n_util::GetStringUTF16(IDS_INCOGNITO_PROFILE_MENU_CLOSE_BUTTON));
}