1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
// Copyright 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 "components/toolbar/toolbar_model_impl.h"
#include "base/logging.h"
#include "base/strings/utf_string_conversions.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "components/prefs/pref_service.h"
#include "components/security_state/core/security_state.h"
#include "components/strings/grit/components_strings.h"
#include "components/toolbar/toolbar_model_delegate.h"
#include "components/url_formatter/elide_url.h"
#include "components/url_formatter/url_formatter.h"
#include "net/cert/cert_status_flags.h"
#include "net/cert/x509_certificate.h"
#include "net/ssl/ssl_connection_status_flags.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/gfx/text_elider.h"
#include "ui/gfx/vector_icons_public.h"
ToolbarModelImpl::ToolbarModelImpl(ToolbarModelDelegate* delegate,
size_t max_url_display_chars)
: delegate_(delegate), max_url_display_chars_(max_url_display_chars) {
DCHECK(delegate_);
}
ToolbarModelImpl::~ToolbarModelImpl() {
}
// ToolbarModelImpl Implementation.
base::string16 ToolbarModelImpl::GetFormattedURL(size_t* prefix_end) const {
GURL url(GetURL());
// Note that we can't unescape spaces here, because if the user copies this
// and pastes it into another program, that program may think the URL ends at
// the space.
const base::string16 formatted_text =
delegate_->FormattedStringWithEquivalentMeaning(
url, url_formatter::FormatUrl(
url, url_formatter::kFormatUrlOmitAll,
net::UnescapeRule::NORMAL, nullptr, prefix_end, nullptr));
if (formatted_text.length() <= max_url_display_chars_)
return formatted_text;
// Truncating the URL breaks editing and then pressing enter, but hopefully
// people won't try to do much with such enormous URLs anyway. If this becomes
// a real problem, we could perhaps try to keep some sort of different "elided
// visible URL" where editing affects and reloads the "real underlying URL",
// but this seems very tricky for little gain.
return gfx::TruncateString(formatted_text, max_url_display_chars_ - 1,
gfx::CHARACTER_BREAK) +
gfx::kEllipsisUTF16;
}
GURL ToolbarModelImpl::GetURL() const {
GURL url;
return delegate_->GetURL(&url) ? url : GURL(url::kAboutBlankURL);
}
security_state::SecurityLevel ToolbarModelImpl::GetSecurityLevel(
bool ignore_editing) const {
// When editing or empty, assume no security style.
return ((input_in_progress() && !ignore_editing) || !ShouldDisplayURL())
? security_state::NONE
: delegate_->GetSecurityLevel();
}
gfx::VectorIconId ToolbarModelImpl::GetVectorIcon() const {
#if !defined(OS_ANDROID) && !defined(OS_IOS)
const auto icon_override = delegate_->GetVectorIconOverride();
if (icon_override != gfx::VectorIconId::VECTOR_ICON_NONE)
return icon_override;
switch (GetSecurityLevel(false)) {
case security_state::NONE:
case security_state::HTTP_SHOW_WARNING:
return gfx::VectorIconId::LOCATION_BAR_HTTP;
case security_state::EV_SECURE:
case security_state::SECURE:
return gfx::VectorIconId::LOCATION_BAR_HTTPS_VALID;
case security_state::SECURITY_WARNING:
// Surface Dubious as Neutral.
return gfx::VectorIconId::LOCATION_BAR_HTTP;
case security_state::SECURE_WITH_POLICY_INSTALLED_CERT:
return gfx::VectorIconId::BUSINESS;
case security_state::DANGEROUS:
return gfx::VectorIconId::LOCATION_BAR_HTTPS_INVALID;
}
#endif
NOTREACHED();
return gfx::VectorIconId::VECTOR_ICON_NONE;
}
base::string16 ToolbarModelImpl::GetEVCertName() const {
if (GetSecurityLevel(false) != security_state::EV_SECURE)
return base::string16();
// Note: cert is guaranteed non-NULL or the security level would be NONE.
scoped_refptr<net::X509Certificate> cert = delegate_->GetCertificate();
DCHECK(cert.get());
// EV are required to have an organization name and country.
DCHECK(!cert->subject().organization_names.empty());
DCHECK(!cert->subject().country_name.empty());
return l10n_util::GetStringFUTF16(
IDS_SECURE_CONNECTION_EV,
base::UTF8ToUTF16(cert->subject().organization_names[0]),
base::UTF8ToUTF16(cert->subject().country_name));
}
base::string16 ToolbarModelImpl::GetSecureVerboseText() const {
switch (GetSecurityLevel(false)) {
case security_state::HTTP_SHOW_WARNING:
return l10n_util::GetStringUTF16(IDS_NOT_SECURE_VERBOSE_STATE);
case security_state::SECURE:
return l10n_util::GetStringUTF16(IDS_SECURE_VERBOSE_STATE);
case security_state::DANGEROUS:
return l10n_util::GetStringUTF16(delegate_->FailsMalwareCheck()
? IDS_DANGEROUS_VERBOSE_STATE
: IDS_NOT_SECURE_VERBOSE_STATE);
default:
return base::string16();
}
}
bool ToolbarModelImpl::ShouldDisplayURL() const {
return delegate_->ShouldDisplayURL();
}
|