| Index: chrome/browser/toolbar_model.cc
 | 
| ===================================================================
 | 
| --- chrome/browser/toolbar_model.cc	(revision 42491)
 | 
| +++ chrome/browser/toolbar_model.cc	(working copy)
 | 
| @@ -16,6 +16,7 @@
 | 
|  #include "chrome/common/pref_names.h"
 | 
|  #include "chrome/common/url_constants.h"
 | 
|  #include "grit/generated_resources.h"
 | 
| +#include "grit/theme_resources.h"
 | 
|  #include "net/base/cert_status_flags.h"
 | 
|  #include "net/base/net_util.h"
 | 
|  
 | 
| @@ -37,7 +38,6 @@
 | 
|      languages = navigation_controller->profile()->GetPrefs()->GetString(
 | 
|                      prefs::kAcceptLanguages);
 | 
|      NavigationEntry* entry = navigation_controller->GetActiveEntry();
 | 
| -    // We may not have a navigation entry yet
 | 
|      if (!navigation_controller->tab_contents()->ShouldDisplayURL()) {
 | 
|        // Explicitly hide the URL for this tab.
 | 
|        url = GURL();
 | 
| @@ -51,138 +51,113 @@
 | 
|  
 | 
|  ToolbarModel::SecurityLevel ToolbarModel::GetSecurityLevel() const {
 | 
|    if (input_in_progress_)  // When editing, assume no security style.
 | 
| -    return ToolbarModel::NORMAL;
 | 
| +    return NONE;
 | 
|  
 | 
|    NavigationController* navigation_controller = GetNavigationController();
 | 
|    if (!navigation_controller)  // We might not have a controller on init.
 | 
| -    return ToolbarModel::NORMAL;
 | 
| +    return NONE;
 | 
|  
 | 
|    NavigationEntry* entry = navigation_controller->GetActiveEntry();
 | 
|    if (!entry)
 | 
| -    return ToolbarModel::NORMAL;
 | 
| +    return NONE;
 | 
|  
 | 
| -  switch (entry->ssl().security_style()) {
 | 
| -    case SECURITY_STYLE_AUTHENTICATED:
 | 
| -      if (entry->ssl().has_mixed_content())
 | 
| -        return ToolbarModel::NORMAL;
 | 
| -      return ToolbarModel::SECURE;
 | 
| -    case SECURITY_STYLE_AUTHENTICATION_BROKEN:
 | 
| -      return ToolbarModel::INSECURE;
 | 
| +  const NavigationEntry::SSLStatus& ssl = entry->ssl();
 | 
| +  switch (ssl.security_style()) {
 | 
|      case SECURITY_STYLE_UNKNOWN:
 | 
|      case SECURITY_STYLE_UNAUTHENTICATED:
 | 
| -      return ToolbarModel::NORMAL;
 | 
| -    default:
 | 
| -      NOTREACHED();
 | 
| -      return ToolbarModel::NORMAL;
 | 
| -  }
 | 
| -}
 | 
| +      return NONE;
 | 
|  
 | 
| -ToolbarModel::SecurityLevel ToolbarModel::GetSchemeSecurityLevel() const {
 | 
| -  // For now, in sync with the security level.
 | 
| -  return GetSecurityLevel();
 | 
| -}
 | 
| +    case SECURITY_STYLE_AUTHENTICATION_BROKEN:
 | 
| +      return SECURITY_ERROR;
 | 
|  
 | 
| -ToolbarModel::Icon ToolbarModel::GetIcon() const {
 | 
| -  if (input_in_progress_)
 | 
| -    return ToolbarModel::NO_ICON;
 | 
| -
 | 
| -  NavigationController* navigation_controller = GetNavigationController();
 | 
| -  if (!navigation_controller)  // We might not have a controller on init.
 | 
| -    return ToolbarModel::NO_ICON;
 | 
| -
 | 
| -  NavigationEntry* entry = navigation_controller->GetActiveEntry();
 | 
| -  if (!entry)
 | 
| -    return ToolbarModel::NO_ICON;
 | 
| -
 | 
| -  const NavigationEntry::SSLStatus& ssl = entry->ssl();
 | 
| -  switch (ssl.security_style()) {
 | 
|      case SECURITY_STYLE_AUTHENTICATED:
 | 
|        if (ssl.has_mixed_content())
 | 
| -        return ToolbarModel::WARNING_ICON;
 | 
| -      return ToolbarModel::LOCK_ICON;
 | 
| -    case SECURITY_STYLE_AUTHENTICATION_BROKEN:
 | 
| -      return ToolbarModel::WARNING_ICON;
 | 
| -    case SECURITY_STYLE_UNKNOWN:
 | 
| -    case SECURITY_STYLE_UNAUTHENTICATED:
 | 
| -      return ToolbarModel::NO_ICON;
 | 
| +        return SECURITY_WARNING;
 | 
| +      if ((ssl.cert_status() & net::CERT_STATUS_IS_EV) &&
 | 
| +          CertStore::GetSharedInstance()->RetrieveCert(ssl.cert_id(), NULL))
 | 
| +        return EV_SECURE;
 | 
| +      return SECURE;
 | 
| +
 | 
|      default:
 | 
|        NOTREACHED();
 | 
| -      return ToolbarModel::NO_ICON;
 | 
| +      return NONE;
 | 
|    }
 | 
|  }
 | 
|  
 | 
| +int ToolbarModel::GetSecurityIcon() const {
 | 
| +  static int icon_ids[NUM_SECURITY_LEVELS] = {
 | 
| +    0,
 | 
| +    IDR_EV_SECURE,
 | 
| +    IDR_SECURE,
 | 
| +    IDR_SECURITY_WARNING,
 | 
| +    IDR_SECURITY_ERROR,
 | 
| +  };
 | 
| +  DCHECK(arraysize(icon_ids) == NUM_SECURITY_LEVELS);
 | 
| +  return icon_ids[GetSecurityLevel()];
 | 
| +}
 | 
| +
 | 
|  void ToolbarModel::GetIconHoverText(std::wstring* text) const {
 | 
|    DCHECK(text);
 | 
| +  text->clear();
 | 
|  
 | 
| -  NavigationController* navigation_controller = GetNavigationController();
 | 
| -  // We don't expect to be called during initialization, so the controller
 | 
| -  // should never be NULL.
 | 
| -  DCHECK(navigation_controller);
 | 
| -  NavigationEntry* entry = navigation_controller->GetActiveEntry();
 | 
| -  DCHECK(entry);
 | 
| +  switch (GetSecurityLevel()) {
 | 
| +    case NONE:
 | 
| +      // There's no security icon, and thus no hover text.
 | 
| +      return;
 | 
|  
 | 
| -
 | 
| -  const NavigationEntry::SSLStatus& ssl = entry->ssl();
 | 
| -  switch (ssl.security_style()) {
 | 
| -    case SECURITY_STYLE_AUTHENTICATED: {
 | 
| -      if (ssl.has_mixed_content()) {
 | 
| -        SSLErrorInfo error_info = SSLErrorInfo::CreateError(
 | 
| -            SSLErrorInfo::MIXED_CONTENTS, NULL, GURL());
 | 
| -        text->assign(error_info.short_description());
 | 
| -      } else {
 | 
| -        DCHECK(entry->url().has_host());
 | 
| -        text->assign(l10n_util::GetStringF(IDS_SECURE_CONNECTION,
 | 
| -                                           UTF8ToWide(entry->url().host())));
 | 
| -      }
 | 
| -      break;
 | 
| +    case EV_SECURE:
 | 
| +    case SECURE: {
 | 
| +      // Note: Navigation controller and active entry are guaranteed non-NULL or
 | 
| +      // the security level would be NONE.
 | 
| +      GURL url(GetNavigationController()->GetActiveEntry()->url());
 | 
| +      DCHECK(url.has_host());
 | 
| +      *text = l10n_util::GetStringF(IDS_SECURE_CONNECTION,
 | 
| +                                    UTF8ToWide(url.host()));
 | 
| +      return;
 | 
|      }
 | 
| -    case SECURITY_STYLE_AUTHENTICATION_BROKEN: {
 | 
| -      CreateErrorText(entry, text);
 | 
| -      if (text->empty()) {
 | 
| -        // If the authentication is broken, we should always have at least one
 | 
| -        // error.
 | 
| -        NOTREACHED();
 | 
| -        return;
 | 
| -      }
 | 
| -      break;
 | 
| -    }
 | 
| +
 | 
| +    case SECURITY_WARNING:
 | 
| +      *text = SSLErrorInfo::CreateError(SSLErrorInfo::MIXED_CONTENTS, NULL,
 | 
| +                                        GURL()).short_description();
 | 
| +      return;
 | 
| +
 | 
| +    case SECURITY_ERROR:
 | 
| +      // See note above.
 | 
| +      CreateErrorText(GetNavigationController()->GetActiveEntry(), text);
 | 
| +      // If the authentication is broken, we should always have at least one
 | 
| +      // error.
 | 
| +      DCHECK(!text->empty());
 | 
| +      return;
 | 
| +
 | 
|      default:
 | 
| -      // Don't show the info bubble in any other cases.
 | 
| -      text->clear();
 | 
| -      break;
 | 
| +      NOTREACHED();
 | 
| +      return;
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -ToolbarModel::InfoTextType ToolbarModel::GetInfoText(
 | 
| -    std::wstring* text,
 | 
| -    std::wstring* tooltip) const {
 | 
| -  DCHECK(text && tooltip);
 | 
| -  text->clear();
 | 
| -  tooltip->clear();
 | 
| +std::wstring ToolbarModel::GetSecurityInfoText() const {
 | 
| +  switch (GetSecurityLevel()) {
 | 
| +    case NONE:
 | 
| +    case SECURE:
 | 
| +    case SECURITY_WARNING:
 | 
| +      return std::wstring();
 | 
|  
 | 
| -  if (input_in_progress_)
 | 
| -    return INFO_NO_INFO;
 | 
| +    case EV_SECURE: {
 | 
| +      scoped_refptr<net::X509Certificate> cert;
 | 
| +      // See note in GetIconHoverText().
 | 
| +      CertStore::GetSharedInstance()->RetrieveCert(
 | 
| +          GetNavigationController()->GetActiveEntry()->ssl().cert_id(),
 | 
| +          &cert);
 | 
| +      return SSLManager::GetEVCertName(*cert);
 | 
| +    }
 | 
|  
 | 
| -  NavigationController* navigation_controller = GetNavigationController();
 | 
| -  if (!navigation_controller)  // We might not have a controller on init.
 | 
| -    return INFO_NO_INFO;
 | 
| +    case SECURITY_ERROR:
 | 
| +      return l10n_util::GetString(IDS_SECURITY_BROKEN);
 | 
|  
 | 
| -  NavigationEntry* entry = navigation_controller->GetActiveEntry();
 | 
| -  const NavigationEntry::SSLStatus& ssl = entry->ssl();
 | 
| -  if (!entry || ssl.has_mixed_content() ||
 | 
| -      net::IsCertStatusError(ssl.cert_status()) ||
 | 
| -      ((ssl.cert_status() & net::CERT_STATUS_IS_EV) == 0))
 | 
| -    return INFO_NO_INFO;
 | 
| -
 | 
| -  scoped_refptr<net::X509Certificate> cert;
 | 
| -  CertStore::GetSharedInstance()->RetrieveCert(ssl.cert_id(), &cert);
 | 
| -  if (!cert.get()) {
 | 
| -    NOTREACHED();
 | 
| -    return INFO_NO_INFO;
 | 
| +    default:
 | 
| +      NOTREACHED();
 | 
| +      return std::wstring();
 | 
|    }
 | 
| -
 | 
| -  SSLManager::GetEVCertNames(*cert, text, tooltip);
 | 
| -  return INFO_EV_TEXT;
 | 
|  }
 | 
|  
 | 
|  NavigationController* ToolbarModel::GetNavigationController() const {
 | 
| @@ -197,10 +172,8 @@
 | 
|                                     std::wstring* text) const {
 | 
|    const NavigationEntry::SSLStatus& ssl = entry->ssl();
 | 
|    std::vector<SSLErrorInfo> errors;
 | 
| -  SSLErrorInfo::GetErrorsForCertStatus(ssl.cert_id(),
 | 
| -                                       ssl.cert_status(),
 | 
| -                                       entry->url(),
 | 
| -                                       &errors);
 | 
| +  SSLErrorInfo::GetErrorsForCertStatus(ssl.cert_id(), ssl.cert_status(),
 | 
| +                                       entry->url(), &errors);
 | 
|    if (ssl.has_mixed_content()) {
 | 
|      errors.push_back(SSLErrorInfo::CreateError(SSLErrorInfo::MIXED_CONTENTS,
 | 
|                                                 NULL, GURL()));
 | 
| @@ -210,19 +183,16 @@
 | 
|                                                 NULL, GURL()));
 | 
|    }
 | 
|  
 | 
| -  int error_count = static_cast<int>(errors.size());
 | 
| -  if (error_count == 0) {
 | 
| -    text->assign(L"");
 | 
| -  } else if (error_count == 1) {
 | 
| -    text->assign(errors[0].short_description());
 | 
| +  if (errors.empty()) {
 | 
| +    text->clear();
 | 
| +  } else if (errors.size() == 1) {
 | 
| +    *text = errors[0].short_description();
 | 
|    } else {
 | 
|      // Multiple errors.
 | 
| -    text->assign(l10n_util::GetString(IDS_SEVERAL_SSL_ERRORS));
 | 
| -    text->append(L"\n");
 | 
| -    for (int i = 0; i < error_count; ++i) {
 | 
| +    *text = l10n_util::GetString(IDS_SEVERAL_SSL_ERRORS);
 | 
| +    for (size_t i = 0; i < errors.size(); ++i) {
 | 
| +      text->append(L"\n");
 | 
|        text->append(errors[i].short_description());
 | 
| -      if (i != error_count - 1)
 | 
| -        text->append(L"\n");
 | 
|      }
 | 
|    }
 | 
|  }
 | 
| 
 |