blob: d0d70cec38c7eb5d5bcf918ce15559ca64cad8c3 [file] [log] [blame]
// Copyright (c) 2012 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/cookie_info_view.h"
#include <algorithm>
#include "base/i18n/time_formatting.h"
#include "base/message_loop/message_loop.h"
#include "base/strings/string16.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/browsing_data/cookies_tree_model.h"
#include "grit/generated_resources.h"
#include "grit/locale_settings.h"
#include "net/cookies/canonical_cookie.h"
#include "net/cookies/parsed_cookie.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/color_utils.h"
#include "ui/native_theme/native_theme.h"
#include "ui/views/border.h"
#include "ui/views/controls/label.h"
#include "ui/views/controls/textfield/textfield.h"
#include "ui/views/layout/grid_layout.h"
#include "ui/views/layout/layout_constants.h"
#include "ui/views/window/dialog_delegate.h"
namespace {
const int kCookieInfoViewBorderSize = 1;
const int kCookieInfoViewInsetSize = 3;
// Adjustment to the spacing between subsequent label-field lines.
const int kExtraLineHeightPadding = 3;
} // namespace
///////////////////////////////////////////////////////////////////////////////
// CookieInfoView, public:
CookieInfoView::CookieInfoView()
: name_label_(NULL),
name_value_field_(NULL),
content_label_(NULL),
content_value_field_(NULL),
domain_label_(NULL),
domain_value_field_(NULL),
path_label_(NULL),
path_value_field_(NULL),
send_for_label_(NULL),
send_for_value_field_(NULL),
created_label_(NULL),
created_value_field_(NULL),
expires_label_(NULL),
expires_value_field_(NULL) {
}
CookieInfoView::~CookieInfoView() {
}
void CookieInfoView::SetCookie(const std::string& domain,
const net::CanonicalCookie& cookie) {
name_value_field_->SetText(UTF8ToUTF16(cookie.Name()));
content_value_field_->SetText(UTF8ToUTF16(cookie.Value()));
domain_value_field_->SetText(UTF8ToUTF16(domain));
path_value_field_->SetText(UTF8ToUTF16(cookie.Path()));
created_value_field_->SetText(
base::TimeFormatFriendlyDateAndTime(cookie.CreationDate()));
string16 expire_text = cookie.IsPersistent() ?
base::TimeFormatFriendlyDateAndTime(cookie.ExpiryDate()) :
l10n_util::GetStringUTF16(IDS_COOKIES_COOKIE_EXPIRES_SESSION);
expires_value_field_->SetText(expire_text);
send_for_value_field_->SetText(cookie.IsSecure() ?
l10n_util::GetStringUTF16(IDS_COOKIES_COOKIE_SENDFOR_SECURE) :
l10n_util::GetStringUTF16(IDS_COOKIES_COOKIE_SENDFOR_ANY));
EnableCookieDisplay(true);
Layout();
}
void CookieInfoView::SetCookieString(const GURL& url,
const std::string& cookie_line) {
net::ParsedCookie pc(cookie_line);
net::CanonicalCookie cookie(url, pc);
SetCookie(pc.HasDomain() ? pc.Domain() : url.host(), cookie);
}
void CookieInfoView::ClearCookieDisplay() {
string16 no_cookie_string =
l10n_util::GetStringUTF16(IDS_COOKIES_COOKIE_NONESELECTED);
name_value_field_->SetText(no_cookie_string);
content_value_field_->SetText(no_cookie_string);
domain_value_field_->SetText(no_cookie_string);
path_value_field_->SetText(no_cookie_string);
send_for_value_field_->SetText(no_cookie_string);
created_value_field_->SetText(no_cookie_string);
expires_value_field_->SetText(no_cookie_string);
EnableCookieDisplay(false);
}
void CookieInfoView::EnableCookieDisplay(bool enabled) {
name_value_field_->SetEnabled(enabled);
content_value_field_->SetEnabled(enabled);
domain_value_field_->SetEnabled(enabled);
path_value_field_->SetEnabled(enabled);
send_for_value_field_->SetEnabled(enabled);
created_value_field_->SetEnabled(enabled);
expires_value_field_->SetEnabled(enabled);
}
///////////////////////////////////////////////////////////////////////////////
// CookieInfoView, views::View overrides.
void CookieInfoView::ViewHierarchyChanged(
const ViewHierarchyChangedDetails& details) {
if (details.is_add && details.child == this)
Init();
}
void CookieInfoView::AddLabelRow(int layout_id, views::GridLayout* layout,
views::Label* label,
views::Textfield* text_field) {
layout->StartRow(0, layout_id);
layout->AddView(label);
layout->AddView(text_field, 2, 1, views::GridLayout::FILL,
views::GridLayout::CENTER);
layout->AddPaddingRow(0, views::DialogDelegate::UseNewStyle() ?
kExtraLineHeightPadding :
views::kRelatedControlSmallVerticalSpacing);
// Now that the Textfield is in the view hierarchy, it can be initialized.
text_field->SetReadOnly(true);
text_field->RemoveBorder();
// Color these borderless text areas the same as the containing dialog.
text_field->SetBackgroundColor(GetNativeTheme()->GetSystemColor(
ui::NativeTheme::kColorId_DialogBackground));
text_field->SetTextColor(SkColorSetRGB(0x78, 0x78, 0x78));
}
///////////////////////////////////////////////////////////////////////////////
// CookieInfoView, private:
void CookieInfoView::Init() {
// Ensure we don't run this more than once and leak memory.
DCHECK(!name_label_);
#if defined(USE_AURA) || !defined(OS_WIN)
SkColor border_color = SK_ColorGRAY;
#else
SkColor border_color = color_utils::GetSysSkColor(COLOR_3DSHADOW);
#endif
name_label_ = new views::Label(
l10n_util::GetStringUTF16(IDS_COOKIES_COOKIE_NAME_LABEL));
name_value_field_ = new views::Textfield;
content_label_ = new views::Label(
l10n_util::GetStringUTF16(IDS_COOKIES_COOKIE_CONTENT_LABEL));
content_value_field_ = new views::Textfield;
domain_label_ = new views::Label(
l10n_util::GetStringUTF16(IDS_COOKIES_COOKIE_DOMAIN_LABEL));
domain_value_field_ = new views::Textfield;
path_label_ = new views::Label(
l10n_util::GetStringUTF16(IDS_COOKIES_COOKIE_PATH_LABEL));
path_value_field_ = new views::Textfield;
send_for_label_ = new views::Label(
l10n_util::GetStringUTF16(IDS_COOKIES_COOKIE_SENDFOR_LABEL));
send_for_value_field_ = new views::Textfield;
created_label_ = new views::Label(
l10n_util::GetStringUTF16(IDS_COOKIES_COOKIE_CREATED_LABEL));
created_value_field_ = new views::Textfield;
expires_label_ = new views::Label(
l10n_util::GetStringUTF16(IDS_COOKIES_COOKIE_EXPIRES_LABEL));
expires_value_field_ = new views::Textfield;
using views::GridLayout;
using views::ColumnSet;
GridLayout* layout = new GridLayout(this);
if (views::DialogDelegate::UseNewStyle()) {
layout->SetInsets(
0, views::kButtonHEdgeMarginNew, 0, views::kButtonHEdgeMarginNew);
} else {
set_border(views::Border::CreateSolidBorder(kCookieInfoViewBorderSize,
border_color));
layout->SetInsets(kCookieInfoViewInsetSize,
kCookieInfoViewInsetSize,
kCookieInfoViewInsetSize,
kCookieInfoViewInsetSize);
}
SetLayoutManager(layout);
int three_column_layout_id = 0;
ColumnSet* column_set = layout->AddColumnSet(three_column_layout_id);
column_set->AddColumn(GridLayout::TRAILING, GridLayout::CENTER, 0,
GridLayout::USE_PREF, 0, 0);
column_set->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing);
column_set->AddColumn(GridLayout::TRAILING, GridLayout::CENTER, 0,
GridLayout::USE_PREF, 0, 0);
column_set->AddColumn(GridLayout::FILL, GridLayout::CENTER, 1,
GridLayout::USE_PREF, 0, 0);
AddLabelRow(three_column_layout_id, layout, name_label_, name_value_field_);
AddLabelRow(three_column_layout_id, layout, content_label_,
content_value_field_);
AddLabelRow(three_column_layout_id, layout, domain_label_,
domain_value_field_);
AddLabelRow(three_column_layout_id, layout, path_label_, path_value_field_);
AddLabelRow(three_column_layout_id, layout, send_for_label_,
send_for_value_field_);
AddLabelRow(three_column_layout_id, layout, created_label_,
created_value_field_);
AddLabelRow(three_column_layout_id, layout, expires_label_,
expires_value_field_);
}