diff options
Diffstat (limited to 'chrome/browser/views/page_info_window_win.cc')
-rw-r--r-- | chrome/browser/views/page_info_window_win.cc | 650 |
1 files changed, 0 insertions, 650 deletions
diff --git a/chrome/browser/views/page_info_window_win.cc b/chrome/browser/views/page_info_window_win.cc deleted file mode 100644 index 1d75602..0000000 --- a/chrome/browser/views/page_info_window_win.cc +++ /dev/null @@ -1,650 +0,0 @@ -// Copyright (c) 2006-2009 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/views/page_info_window_win.h" - -#if defined(OS_WIN) -#include <cryptuiapi.h> -#pragma comment(lib, "cryptui.lib") -#endif - -#include "app/l10n_util.h" -#include "app/resource_bundle.h" -#include "base/string_util.h" -#include "base/time_format.h" -#include "chrome/browser/browser_process.h" -#include "chrome/browser/cert_store.h" -#include "chrome/browser/history/history.h" -#include "chrome/browser/profile.h" -#include "chrome/browser/ssl/ssl_manager.h" -#include "chrome/common/pref_names.h" -#include "chrome/common/pref_service.h" -#include "grit/generated_resources.h" -#include "grit/locale_settings.h" -#include "grit/theme_resources.h" -#include "net/base/cert_status_flags.h" -#include "net/base/x509_certificate.h" -#include "third_party/skia/include/core/SkColor.h" -#include "views/background.h" -#include "views/grid_layout.h" -#include "views/controls/button/native_button.h" -#include "views/controls/button/button.h" -#include "views/controls/image_view.h" -#include "views/controls/label.h" -#include "views/controls/separator.h" -#include "views/standard_layout.h" - -#if defined(OS_WIN) -#include "app/win_util.h" -#endif - -using base::Time; - -const int kVerticalPadding = 10; -const int kHorizontalPadding = 10; - -//////////////////////////////////////////////////////////////////////////////// -// SecurityTabView -class SecurityTabView : public views::View { - public: - SecurityTabView(Profile* profile, - const GURL& url, - const NavigationEntry::SSLStatus& ssl, - NavigationEntry::PageType page_type, - bool show_history); - virtual ~SecurityTabView(); - - virtual void Layout(); - - // Add a section. - virtual void AddSection(const std::wstring& title, - bool state, - const std::wstring& head_line, - const std::wstring& description); - - private: - // A section contains an image that shows a status (good or bad), a title, - // an optional head-line (in bold) and a description. - class Section : public views::View { - public: - Section(const std::wstring& title, - bool state, - const std::wstring& head_line, - const std::wstring& description); - virtual ~Section(); - - virtual int GetHeightForWidth(int w); - virtual void Layout(); - - private: - // The text placed on top of the section (on the left of the separator bar). - std::wstring title_; - - // Whether to show the good/bad icon. - bool state_; - - // The first line of the description, show in bold. - std::wstring head_line_; - - // The description, displayed below the head line. - std::wstring description_; - - static SkBitmap* good_state_icon_; - static SkBitmap* bad_state_icon_; - - views::Label* title_label_; - views::Separator* separator_; - views::ImageView* status_image_; - views::Label* head_line_label_; - views::Label* description_label_; - - DISALLOW_EVIL_CONSTRUCTORS(Section); - }; - - // Callback from history service with number of visits to url. - void OnGotVisitCountToHost(HistoryService::Handle handle, - bool found_visits, - int count, - Time first_visit); - - std::vector<Section*> sections_; - - // Used to request number of visits. - CancelableRequestConsumer request_consumer_; - - DISALLOW_EVIL_CONSTRUCTORS(SecurityTabView); -}; - -// static -SkBitmap* SecurityTabView::Section::good_state_icon_ = NULL; -SkBitmap* SecurityTabView::Section::bad_state_icon_ = NULL; - -// Layout constants. -static const int kHGapToBorder = 6; -static const int kVGapToBorder = 6; -static const int kHGapTitleToSeparator = 2; -static const int kVGapTitleToImage = 6; -static const int kHGapImageToDescription = 6; -static const int kVGapHeadLineToDescription = 2; -static const int kVGapBetweenSections = 20; -static const int kHExtraSeparatorPadding = 2; - -SecurityTabView::Section::Section(const std::wstring& title, bool state, - const std::wstring& head_line, - const std::wstring& description) - : title_(title), - state_(state), - head_line_(head_line), - description_(description) { - if (!good_state_icon_) { - ResourceBundle& rb = ResourceBundle::GetSharedInstance(); - good_state_icon_ = rb.GetBitmapNamed(IDR_PAGEINFO_GOOD); - bad_state_icon_ = rb.GetBitmapNamed(IDR_PAGEINFO_BAD); - } - title_label_ = new views::Label(title); - title_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); - AddChildView(title_label_); - - separator_ = new views::Separator(); - AddChildView(separator_); - - status_image_ = new views::ImageView(); - status_image_->SetImage(state ? good_state_icon_ : bad_state_icon_); - AddChildView(status_image_); - - head_line_label_ = new views::Label(head_line); - head_line_label_->SetFont( - head_line_label_->GetFont().DeriveFont(0, gfx::Font::BOLD)); - head_line_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); - AddChildView(head_line_label_); - - description_label_ = new views::Label(description); - description_label_->SetMultiLine(true); - description_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); - AddChildView(description_label_); -} - -SecurityTabView::Section::~Section() { -} - -int SecurityTabView::Section::GetHeightForWidth(int width) { - // The height of the section depends on the height of the description label - // (multi-line). We need to know the width of the description label to know - // its height. - int height = 0; - gfx::Size size = title_label_->GetPreferredSize(); - height += size.height() + kVGapTitleToImage; - - gfx::Size image_size = status_image_->GetPreferredSize(); - - int text_height = 0; - if (!head_line_label_->GetText().empty()) { - size = head_line_label_->GetPreferredSize(); - text_height = size.height() + kVGapHeadLineToDescription; - } - - int description_width = - width - image_size.width() - kHGapImageToDescription - kHGapToBorder; - text_height += description_label_->GetHeightForWidth(description_width); - - height += std::max(image_size.height(), text_height); - - return height; -} - -void SecurityTabView::Section::Layout() { - // First, layout the title and separator. - int x = 0; - int y = 0; - gfx::Size size = title_label_->GetPreferredSize(); - title_label_->SetBounds(x, y, size.width(), size.height()); - x += size.width() + kHGapTitleToSeparator; - separator_->SetBounds(x + kHExtraSeparatorPadding, y, - width() - x - 2 * kHExtraSeparatorPadding, - size.height()); - - // Then the image, head-line and description. - x = kHGapToBorder; - y += title_label_->height() + kVGapTitleToImage; - size = status_image_->GetPreferredSize(); - status_image_->SetBounds(x, y, size.width(), size.height()); - x += size.width() + kHGapImageToDescription; - int w = width() - x; - if (!head_line_label_->GetText().empty()) { - size = head_line_label_->GetPreferredSize(); - head_line_label_->SetBounds(x, y, w > 0 ? w : 0, size.height()); - y += size.height() + kVGapHeadLineToDescription; - } else { - head_line_label_->SetBounds(x, y, 0, 0); - } - if (w > 0) { - description_label_->SetBounds(x, y, w, - description_label_->GetHeightForWidth(w)); - } else { - description_label_->SetBounds(x, y, 0, 0); - } -} - -SecurityTabView::SecurityTabView(Profile* profile, - const GURL& url, - const NavigationEntry::SSLStatus& ssl, - NavigationEntry::PageType page_type, - bool show_history) { - bool identity_ok = true; - bool connection_ok = true; - std::wstring identity_title; - std::wstring identity_msg; - std::wstring connection_msg; - scoped_refptr<net::X509Certificate> cert; - - // Identity section. - std::wstring subject_name(UTF8ToWide(url.host())); - bool empty_subject_name = false; - if (subject_name.empty()) { - subject_name.assign( - l10n_util::GetString(IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY)); - empty_subject_name = true; - } - if (page_type == NavigationEntry::NORMAL_PAGE && ssl.cert_id() && - CertStore::GetSharedInstance()->RetrieveCert(ssl.cert_id(), &cert) && - !net::IsCertStatusError(ssl.cert_status())) { - // OK HTTPS page. - if ((ssl.cert_status() & net::CERT_STATUS_IS_EV) != 0) { - DCHECK(!cert->subject().organization_names.empty()); - identity_title = - l10n_util::GetStringF(IDS_PAGE_INFO_EV_IDENTITY_TITLE, - UTF8ToWide(cert->subject().organization_names[0]), - UTF8ToWide(url.host())); - // An EV Cert is required to have a city (localityName) and country but - // state is "if any". - DCHECK(!cert->subject().locality_name.empty()); - DCHECK(!cert->subject().country_name.empty()); - std::wstring locality; - if (!cert->subject().state_or_province_name.empty()) { - locality = l10n_util::GetStringF( - IDS_PAGEINFO_ADDRESS, - UTF8ToWide(cert->subject().locality_name), - UTF8ToWide(cert->subject().state_or_province_name), - UTF8ToWide(cert->subject().country_name)); - } else { - locality = l10n_util::GetStringF( - IDS_PAGEINFO_PARTIAL_ADDRESS, - UTF8ToWide(cert->subject().locality_name), - UTF8ToWide(cert->subject().country_name)); - } - DCHECK(!cert->subject().organization_names.empty()); - identity_msg.assign(l10n_util::GetStringF( - IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY_EV, - UTF8ToWide(cert->subject().organization_names[0]), - locality, - UTF8ToWide(PageInfoWindow::GetIssuerName(cert->issuer())))); - } else { - // Non EV OK HTTPS. - if (empty_subject_name) - identity_title.clear(); // Don't display any title. - else - identity_title.assign(subject_name); - std::wstring issuer_name(UTF8ToWide( - PageInfoWindow::GetIssuerName(cert->issuer()))); - if (issuer_name.empty()) { - issuer_name.assign( - l10n_util::GetString(IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY)); - } else { - identity_msg.assign( - l10n_util::GetStringF(IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY, - issuer_name)); - } - } - } else { - // Bad HTTPS. - identity_msg.assign( - l10n_util::GetString(IDS_PAGE_INFO_SECURITY_TAB_INSECURE_IDENTITY)); - identity_ok = false; - } - - // Connection section. - // We consider anything less than 80 bits encryption to be weak encryption. - // TODO(wtc): Bug 1198735: report mixed/unsafe content for unencrypted and - // weakly encrypted connections. - if (ssl.security_bits() <= 0) { - connection_ok = false; - connection_msg.assign( - l10n_util::GetStringF( - IDS_PAGE_INFO_SECURITY_TAB_NOT_ENCRYPTED_CONNECTION_TEXT, - subject_name)); - } else if (ssl.security_bits() < 80) { - connection_ok = false; - connection_msg.assign( - l10n_util::GetStringF( - IDS_PAGE_INFO_SECURITY_TAB_WEAK_ENCRYPTION_CONNECTION_TEXT, - subject_name)); - } else { - connection_msg.assign( - l10n_util::GetStringF( - IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_CONNECTION_TEXT, - subject_name, - IntToWString(ssl.security_bits()))); - if (ssl.has_mixed_content()) { - connection_ok = false; - connection_msg.assign( - l10n_util::GetStringF( - IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_SENTENCE_LINK, - connection_msg, - l10n_util::GetString( - IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_MIXED_CONTENT_WARNING))); - } else if (ssl.has_unsafe_content()) { - connection_ok = false; - connection_msg.assign( - l10n_util::GetStringF( - IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_SENTENCE_LINK, - connection_msg, - l10n_util::GetString( - IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_BAD_HTTPS_WARNING))); - } - } - - // Let's add the different sections. - AddSection(l10n_util::GetString(IDS_PAGE_INFO_SECURITY_TAB_IDENTITY_TITLE), - identity_ok, identity_title, identity_msg); - AddSection(l10n_util::GetString(IDS_PAGE_INFO_SECURITY_TAB_CONNECTION_TITLE), - connection_ok, std::wstring(), connection_msg); - - // Request the number of visits. - HistoryService* history = profile->GetHistoryService( - Profile::EXPLICIT_ACCESS); - if (show_history && history) { - history->GetVisitCountToHost( - url, - &request_consumer_, - NewCallback(this, &SecurityTabView::OnGotVisitCountToHost)); - } -} - -SecurityTabView::~SecurityTabView() { -} - -void SecurityTabView::AddSection(const std::wstring& title, - bool state, - const std::wstring& head_line, - const std::wstring& description) { - Section* section = new Section(title, state, head_line, description); - sections_.push_back(section); - AddChildView(section); -} - -void SecurityTabView::Layout() { - int tab_width = width() - 2 * kHGapToBorder; - int x = kHGapToBorder; - int y = kVGapToBorder; - for (std::vector<Section*>::const_iterator iter = sections_.begin(); - iter != sections_.end(); ++iter) { - Section* section = *iter; - int h = section->GetHeightForWidth(tab_width); - section->SetBounds(x, y, tab_width, h); - section->Layout(); - y += h + kVGapBetweenSections; - } -} - -void SecurityTabView::OnGotVisitCountToHost(HistoryService::Handle handle, - bool found_visits, - int count, - Time first_visit) { - if (!found_visits) { - // This indicates an error, such as the page wasn't http/https; do nothing. - return; - } - - bool visited_before_today = false; - if (count) { - Time today = Time::Now().LocalMidnight(); - Time first_visit_midnight = first_visit.LocalMidnight(); - visited_before_today = (first_visit_midnight < today); - } - - if (!visited_before_today) { - AddSection( - l10n_util::GetString(IDS_PAGE_INFO_SECURITY_TAB_PERSONAL_HISTORY_TITLE), - false, std::wstring(), - l10n_util::GetString(IDS_PAGE_INFO_SECURITY_TAB_FIRST_VISITED_TODAY)); - } else { - AddSection( - l10n_util::GetString(IDS_PAGE_INFO_SECURITY_TAB_PERSONAL_HISTORY_TITLE), - true, std::wstring(), - l10n_util::GetStringF(IDS_PAGE_INFO_SECURITY_TAB_VISITED_BEFORE_TODAY, - base::TimeFormatShortDate(first_visit))); - } - Layout(); - SchedulePaint(); -} - -//////////////////////////////////////////////////////////////////////////////// -// PageInfoContentView -class PageInfoContentView : public views::View { - public: - PageInfoContentView() : cert_viewer_button_(NULL) {} - - void set_cert_viewer_button(views::NativeButton* cert_viewer_button) { - cert_viewer_button_ = cert_viewer_button; - } - - // views::View overrides: - virtual gfx::Size GetPreferredSize() { - return gfx::Size(views::Window::GetLocalizedContentsSize( - IDS_PAGEINFO_DIALOG_WIDTH_CHARS, - IDS_PAGEINFO_DIALOG_HEIGHT_LINES)); - } - - virtual void Layout() { - if (cert_viewer_button_) { - gfx::Size ps = cert_viewer_button_->GetPreferredSize(); - - gfx::Rect parent_bounds = GetParent()->GetLocalBounds(false); - int y_buttons = - parent_bounds.bottom() - ps.height() - kButtonVEdgeMargin; - cert_viewer_button_->SetBounds(kPanelHorizMargin, y_buttons, ps.width(), - ps.height()); - } - View::Layout(); - } - - private: - views::NativeButton* cert_viewer_button_; - - DISALLOW_EVIL_CONSTRUCTORS(PageInfoContentView); -}; - -//////////////////////////////////////////////////////////////////////////////// -// PageInfoWindowWin - -int PageInfoWindowWin::opened_window_count_ = 0; - -PageInfoWindow* PageInfoWindow::Factory() { - return new PageInfoWindowWin(); -} - -PageInfoWindowWin::PageInfoWindowWin() - : PageInfoWindow() { -} - -PageInfoWindowWin::~PageInfoWindowWin() { - DCHECK(opened_window_count_ > 0); - opened_window_count_--; -} - -void PageInfoWindowWin::Init(Profile* profile, - const GURL& url, - const NavigationEntry::SSLStatus& ssl, - NavigationEntry::PageType page_type, - bool show_history, - gfx::NativeView parent) { - cert_id_ = ssl.cert_id(); - - cert_info_button_ = new views::NativeButton( - this, l10n_util::GetString(IDS_PAGEINFO_CERT_INFO_BUTTON)); - - contents_ = new PageInfoContentView(); - DWORD sys_color = ::GetSysColor(COLOR_3DFACE); - SkColor color = SkColorSetRGB(GetRValue(sys_color), GetGValue(sys_color), - GetBValue(sys_color)); - contents_->set_background(views::Background::CreateSolidBackground(color)); - - views::GridLayout* layout = new views::GridLayout(contents_); - contents_->SetLayoutManager(layout); - views::ColumnSet* columns = layout->AddColumnSet(0); - columns->AddPaddingColumn(0, kHorizontalPadding); - columns->AddColumn(views::GridLayout::FILL, // Horizontal resize. - views::GridLayout::FILL, // Vertical resize. - 1, // Resize weight. - views::GridLayout::USE_PREF, // Size type. - 0, // Ignored for USE_PREF. - 0); // Minimum size. - columns->AddColumn(views::GridLayout::FILL, // Horizontal resize. - views::GridLayout::FILL, // Vertical resize. - 1, // Resize weight. - views::GridLayout::USE_PREF, // Size type. - 0, // Ignored for USE_PREF. - 0); // Minimum size. - columns->AddPaddingColumn(0, kHorizontalPadding); - - layout->AddPaddingRow(0, kHorizontalPadding); - layout->StartRow(1, 0); - layout->AddView(CreateSecurityTabView(profile, url, ssl, page_type, - show_history), 2, 1); - - layout->AddPaddingRow(0, kHorizontalPadding); - - if (opened_window_count_ > 0) { - // There already is a PageInfo window opened. Let's shift the location of - // the new PageInfo window so they don't overlap entirely. - // Window::Init will position the window from the stored location. - gfx::Rect bounds; - bool maximized = false; - if (GetSavedWindowBounds(&bounds) && GetSavedMaximizedState(&maximized)) { - CalculateWindowBounds(&bounds); - SaveWindowPlacement(bounds, maximized); - } - } - - views::Window::CreateChromeWindow(parent, gfx::Rect(), this); - // TODO(beng): (Cleanup) - cert viewer button should use GetExtraView. - - if (cert_id_) { - scoped_refptr<net::X509Certificate> cert; - CertStore::GetSharedInstance()->RetrieveCert(cert_id_, &cert); - // When running with Gears, we have no os certificate, so there is no cert - // to show. Don't bother showing the cert info button in that case. - if (cert.get() && cert->os_cert_handle()) { - contents_->GetParent()->AddChildView(cert_info_button_); - contents_->set_cert_viewer_button(cert_info_button_); - contents_->Layout(); - } - } -} - -views::View* PageInfoWindowWin::CreateGeneralTabView() { - return new views::View(); -} - -views::View* PageInfoWindowWin::CreateSecurityTabView( - Profile* profile, - const GURL& url, - const NavigationEntry::SSLStatus& ssl, - NavigationEntry::PageType page_type, - bool show_history) { - return new SecurityTabView(profile, url, ssl, page_type, show_history); -} - -void PageInfoWindowWin::Show() { - window()->Show(); - opened_window_count_++; -} - -int PageInfoWindowWin::GetDialogButtons() const { - return MessageBoxFlags::DIALOGBUTTON_CANCEL; -} - -std::wstring PageInfoWindowWin::GetWindowTitle() const { - return l10n_util::GetString(IDS_PAGEINFO_WINDOW_TITLE); -} - -std::wstring PageInfoWindowWin::GetWindowName() const { - return prefs::kPageInfoWindowPlacement; -} - -views::View* PageInfoWindowWin::GetContentsView() { - return contents_; -} - -void PageInfoWindowWin::ButtonPressed(views::Button* sender) { - if (sender == cert_info_button_) { - DCHECK(cert_id_ != 0); - ShowCertDialog(cert_id_); - } else { - NOTREACHED(); - } -} - -void PageInfoWindowWin::CalculateWindowBounds(gfx::Rect* bounds) { - const int kDefaultOffset = 15; - - gfx::Rect monitor_bounds(win_util::GetMonitorBoundsForRect(*bounds)); - if (monitor_bounds.IsEmpty()) - return; - - // If necessary, move the window so it is visible on the screen. - gfx::Rect adjusted_bounds = bounds->AdjustToFit(monitor_bounds); - if (adjusted_bounds != *bounds) { - // The bounds have moved, we are done. - *bounds = adjusted_bounds; - return; - } - - // Move the window from its specified position, trying to keep it entirely - // visible. - int x_offset, y_offset; - if (bounds->right() + kDefaultOffset >= monitor_bounds.right() && - abs(monitor_bounds.x() - bounds->x()) >= kDefaultOffset) { - x_offset = -kDefaultOffset; - } else { - x_offset = kDefaultOffset; - } - - if (bounds->bottom() + kDefaultOffset >= monitor_bounds.bottom() && - abs(monitor_bounds.y() - bounds->y()) >= kDefaultOffset) { - y_offset = -kDefaultOffset; - } else { - y_offset = kDefaultOffset; - } - - bounds->Offset(x_offset, y_offset); -} - -void PageInfoWindowWin::ShowCertDialog(int cert_id) { - scoped_refptr<net::X509Certificate> cert; - CertStore::GetSharedInstance()->RetrieveCert(cert_id, &cert); - if (!cert.get()) { - // The certificate was not found. Could be that the renderer crashed before - // we displayed the page info. - return; - } - - CRYPTUI_VIEWCERTIFICATE_STRUCT view_info = { 0 }; - view_info.dwSize = sizeof(view_info); - // We set our parent to the tab window. This makes the cert dialog created - // in CryptUIDlgViewCertificate modal to the browser. - view_info.hwndParent = window()->GetNativeWindow(); - view_info.dwFlags = CRYPTUI_DISABLE_EDITPROPERTIES | - CRYPTUI_DISABLE_ADDTOSTORE; - view_info.pCertContext = cert->os_cert_handle(); - // Search the cert store that 'cert' is in when building the cert chain. - HCERTSTORE cert_store = view_info.pCertContext->hCertStore; - view_info.cStores = 1; - view_info.rghStores = &cert_store; - BOOL properties_changed; - - // This next call blocks but keeps processing windows messages, making it - // modal to the browser window. - BOOL rv = ::CryptUIDlgViewCertificate(&view_info, &properties_changed); -} |