Commit e13a84b7 authored by Tommy C. Li's avatar Tommy C. Li Committed by Commit Bot

Omnibox: Expose IsSecurityInfoInitialized() method in LocationBarModel

For Query in Omnibox, we want to avoid the URL flicker while the page
is navigating and the TLS security state has not been initialized.

This currently works on Android implementation by toggling a boolean
flag on navigation and TLS state update.

However, this duplicates a piece of state that's already
authoritatively stored within the VisibleSecurityState.

This CL:

 1. Exposes an IsSecurityInfoInitialized() method on LocationBarModel

 2. Updates the security_state::SecurityInfo struct to add a
    connection_info_initialized flag that's already present in
    security_state::VisibleSecurityState.

 3. Updates LocationBarModelDelegate to provide a general
    GetSecurityInfo method.

Planned followup work:

 1. Make Query in Omnibox actually use the IsSecurityInfoInitialized
    flag.

 2. Use LocationBarModelDelegate::GetSecurityInfo to remove some
    now-redundant methods such as FailsBillingCheck and
    FailsMalwareCheck.

Bug: 874592
Change-Id: I648b30859ec40bb741de1c31378e0a6cd8baeeaa
Reviewed-on: https://chromium-review.googlesource.com/c/1324879Reviewed-by: default avatarAdrienne Porter Felt <felt@chromium.org>
Reviewed-by: default avatarChristopher Thompson <cthomp@chromium.org>
Reviewed-by: default avatarScott Violet <sky@chromium.org>
Commit-Queue: Tommy Li <tommycli@chromium.org>
Cr-Commit-Position: refs/heads/master@{#607296}
parent de0711ea
...@@ -91,17 +91,17 @@ bool ChromeLocationBarModelDelegate::ShouldDisplayURL() const { ...@@ -91,17 +91,17 @@ bool ChromeLocationBarModelDelegate::ShouldDisplayURL() const {
return !profile || !search::IsInstantNTPURL(url, profile); return !profile || !search::IsInstantNTPURL(url, profile);
} }
security_state::SecurityLevel ChromeLocationBarModelDelegate::GetSecurityLevel() void ChromeLocationBarModelDelegate::GetSecurityInfo(
const { security_state::SecurityInfo* result) const {
content::WebContents* web_contents = GetActiveWebContents(); content::WebContents* web_contents = GetActiveWebContents();
// If there is no active WebContents (which can happen during toolbar // If there is no active WebContents (which can happen during toolbar
// initialization), assume no security style. // initialization), assume no security style.
if (!web_contents) if (!web_contents) {
return security_state::NONE; *result = security_state::SecurityInfo();
return;
}
auto* helper = SecurityStateTabHelper::FromWebContents(web_contents); auto* helper = SecurityStateTabHelper::FromWebContents(web_contents);
security_state::SecurityInfo security_info; helper->GetSecurityInfo(result);
helper->GetSecurityInfo(&security_info);
return security_info.security_level;
} }
scoped_refptr<net::X509Certificate> scoped_refptr<net::X509Certificate>
......
...@@ -38,7 +38,7 @@ class ChromeLocationBarModelDelegate : public LocationBarModelDelegate { ...@@ -38,7 +38,7 @@ class ChromeLocationBarModelDelegate : public LocationBarModelDelegate {
const GURL& url, const GURL& url,
const base::string16& formatted_url) const override; const base::string16& formatted_url) const override;
bool GetURL(GURL* url) const override; bool GetURL(GURL* url) const override;
SecurityLevel GetSecurityLevel() const override; void GetSecurityInfo(security_state::SecurityInfo* result) const override;
scoped_refptr<net::X509Certificate> GetCertificate() const override; scoped_refptr<net::X509Certificate> GetCertificate() const override;
bool FailsBillingCheck() const override; bool FailsBillingCheck() const override;
bool FailsMalwareCheck() const override; bool FailsMalwareCheck() const override;
......
...@@ -48,6 +48,10 @@ class LocationBarModel { ...@@ -48,6 +48,10 @@ class LocationBarModel {
virtual security_state::SecurityLevel GetSecurityLevel( virtual security_state::SecurityLevel GetSecurityLevel(
bool ignore_editing) const = 0; bool ignore_editing) const = 0;
// Returns whether the connection security fields have been initialized.
// After a navigation, this is false until the TLS state is updated.
virtual bool IsSecurityInfoInitialized() const = 0;
// Returns the id of the icon to show to the left of the address, based on the // Returns the id of the icon to show to the left of the address, based on the
// current URL. When search term replacement is active, this returns a search // current URL. When search term replacement is active, this returns a search
// icon. This doesn't cover specialized icons while the user is editing; see // icon. This doesn't cover specialized icons while the user is editing; see
......
...@@ -8,9 +8,9 @@ bool LocationBarModelDelegate::ShouldDisplayURL() const { ...@@ -8,9 +8,9 @@ bool LocationBarModelDelegate::ShouldDisplayURL() const {
return true; return true;
} }
LocationBarModelDelegate::SecurityLevel void LocationBarModelDelegate::GetSecurityInfo(
LocationBarModelDelegate::GetSecurityLevel() const { security_state::SecurityInfo* result) const {
return SecurityLevel::NONE; return;
} }
scoped_refptr<net::X509Certificate> LocationBarModelDelegate::GetCertificate() scoped_refptr<net::X509Certificate> LocationBarModelDelegate::GetCertificate()
......
...@@ -24,8 +24,6 @@ class X509Certificate; ...@@ -24,8 +24,6 @@ class X509Certificate;
// Delegate which is used by LocationBarModel class. // Delegate which is used by LocationBarModel class.
class LocationBarModelDelegate { class LocationBarModelDelegate {
public: public:
using SecurityLevel = security_state::SecurityLevel;
// Formats |url| using AutocompleteInput::FormattedStringWithEquivalentMeaning // Formats |url| using AutocompleteInput::FormattedStringWithEquivalentMeaning
// providing an appropriate AutocompleteSchemeClassifier for the embedder. // providing an appropriate AutocompleteSchemeClassifier for the embedder.
virtual base::string16 FormattedStringWithEquivalentMeaning( virtual base::string16 FormattedStringWithEquivalentMeaning(
...@@ -40,9 +38,9 @@ class LocationBarModelDelegate { ...@@ -40,9 +38,9 @@ class LocationBarModelDelegate {
// in the location bar. // in the location bar.
virtual bool ShouldDisplayURL() const; virtual bool ShouldDisplayURL() const;
// Returns the underlying security level of the page without regard to any // Returns the underlying security info of the page without regard to any
// user edits that may be in progress. // user edits that may be in progress.
virtual SecurityLevel GetSecurityLevel() const; virtual void GetSecurityInfo(security_state::SecurityInfo* result) const;
// Returns the certificate for the current navigation entry. // Returns the certificate for the current navigation entry.
virtual scoped_refptr<net::X509Certificate> GetCertificate() const; virtual scoped_refptr<net::X509Certificate> GetCertificate() const;
......
...@@ -95,9 +95,18 @@ GURL LocationBarModelImpl::GetURL() const { ...@@ -95,9 +95,18 @@ GURL LocationBarModelImpl::GetURL() const {
security_state::SecurityLevel LocationBarModelImpl::GetSecurityLevel( security_state::SecurityLevel LocationBarModelImpl::GetSecurityLevel(
bool ignore_editing) const { bool ignore_editing) const {
// When editing or empty, assume no security style. // When editing or empty, assume no security style.
return ((input_in_progress() && !ignore_editing) || !ShouldDisplayURL()) if ((input_in_progress() && !ignore_editing) || !ShouldDisplayURL())
? security_state::NONE return security_state::NONE;
: delegate_->GetSecurityLevel();
security_state::SecurityInfo info;
delegate_->GetSecurityInfo(&info);
return info.security_level;
}
bool LocationBarModelImpl::IsSecurityInfoInitialized() const {
security_state::SecurityInfo info;
delegate_->GetSecurityInfo(&info);
return info.connection_info_initialized;
} }
const gfx::VectorIcon& LocationBarModelImpl::GetVectorIcon() const { const gfx::VectorIcon& LocationBarModelImpl::GetVectorIcon() const {
......
...@@ -33,6 +33,7 @@ class LocationBarModelImpl : public LocationBarModel { ...@@ -33,6 +33,7 @@ class LocationBarModelImpl : public LocationBarModel {
GURL GetURL() const override; GURL GetURL() const override;
security_state::SecurityLevel GetSecurityLevel( security_state::SecurityLevel GetSecurityLevel(
bool ignore_editing) const override; bool ignore_editing) const override;
bool IsSecurityInfoInitialized() const override;
const gfx::VectorIcon& GetVectorIcon() const override; const gfx::VectorIcon& GetVectorIcon() const override;
base::string16 GetSecureVerboseText() const override; base::string16 GetSecureVerboseText() const override;
base::string16 GetSecureAccessibilityText() const override; base::string16 GetSecureAccessibilityText() const override;
......
...@@ -43,6 +43,10 @@ security_state::SecurityLevel TestLocationBarModel::GetSecurityLevel( ...@@ -43,6 +43,10 @@ security_state::SecurityLevel TestLocationBarModel::GetSecurityLevel(
return security_level_; return security_level_;
} }
bool TestLocationBarModel::IsSecurityInfoInitialized() const {
return true;
}
const gfx::VectorIcon& TestLocationBarModel::GetVectorIcon() const { const gfx::VectorIcon& TestLocationBarModel::GetVectorIcon() const {
return *icon_; return *icon_;
} }
......
...@@ -29,6 +29,7 @@ class TestLocationBarModel : public LocationBarModel { ...@@ -29,6 +29,7 @@ class TestLocationBarModel : public LocationBarModel {
GURL GetURL() const override; GURL GetURL() const override;
security_state::SecurityLevel GetSecurityLevel( security_state::SecurityLevel GetSecurityLevel(
bool ignore_editing) const override; bool ignore_editing) const override;
bool IsSecurityInfoInitialized() const override;
const gfx::VectorIcon& GetVectorIcon() const override; const gfx::VectorIcon& GetVectorIcon() const override;
base::string16 GetSecureVerboseText() const override; base::string16 GetSecureVerboseText() const override;
base::string16 GetSecureAccessibilityText() const override; base::string16 GetSecureAccessibilityText() const override;
......
...@@ -233,6 +233,7 @@ void SecurityInfoForRequest( ...@@ -233,6 +233,7 @@ void SecurityInfoForRequest(
SecurityInfo* security_info) { SecurityInfo* security_info) {
if (!visible_security_state.connection_info_initialized) { if (!visible_security_state.connection_info_initialized) {
*security_info = SecurityInfo(); *security_info = SecurityInfo();
security_info->connection_info_initialized = false;
security_info->malicious_content_status = security_info->malicious_content_status =
visible_security_state.malicious_content_status; visible_security_state.malicious_content_status;
if (security_info->malicious_content_status != if (security_info->malicious_content_status !=
...@@ -244,6 +245,7 @@ void SecurityInfoForRequest( ...@@ -244,6 +245,7 @@ void SecurityInfoForRequest(
} }
return; return;
} }
security_info->connection_info_initialized = true;
security_info->certificate = visible_security_state.certificate; security_info->certificate = visible_security_state.certificate;
security_info->sha1_in_chain = visible_security_state.certificate && security_info->sha1_in_chain = visible_security_state.certificate &&
...@@ -311,7 +313,8 @@ std::string GetHistogramSuffixForSecurityLevel( ...@@ -311,7 +313,8 @@ std::string GetHistogramSuffixForSecurityLevel(
} // namespace } // namespace
SecurityInfo::SecurityInfo() SecurityInfo::SecurityInfo()
: security_level(NONE), : connection_info_initialized(false),
security_level(NONE),
malicious_content_status(MALICIOUS_CONTENT_STATUS_NONE), malicious_content_status(MALICIOUS_CONTENT_STATUS_NONE),
sha1_in_chain(false), sha1_in_chain(false),
mixed_content_status(CONTENT_STATUS_NONE), mixed_content_status(CONTENT_STATUS_NONE),
......
...@@ -104,6 +104,9 @@ enum MaliciousContentStatus { ...@@ -104,6 +104,9 @@ enum MaliciousContentStatus {
struct SecurityInfo { struct SecurityInfo {
SecurityInfo(); SecurityInfo();
~SecurityInfo(); ~SecurityInfo();
// Whether the connection security fields are initialized.
bool connection_info_initialized;
// Describes the overall security state of the page.
SecurityLevel security_level; SecurityLevel security_level;
// Describes the nature of the page's malicious content, if any. // Describes the nature of the page's malicious content, if any.
MaliciousContentStatus malicious_content_status; MaliciousContentStatus malicious_content_status;
......
...@@ -29,7 +29,7 @@ class LocationBarModelDelegateIOS : public LocationBarModelDelegate { ...@@ -29,7 +29,7 @@ class LocationBarModelDelegateIOS : public LocationBarModelDelegate {
const base::string16& formatted_url) const override; const base::string16& formatted_url) const override;
bool GetURL(GURL* url) const override; bool GetURL(GURL* url) const override;
bool ShouldDisplayURL() const override; bool ShouldDisplayURL() const override;
SecurityLevel GetSecurityLevel() const override; void GetSecurityInfo(security_state::SecurityInfo* result) const override;
scoped_refptr<net::X509Certificate> GetCertificate() const override; scoped_refptr<net::X509Certificate> GetCertificate() const override;
bool FailsMalwareCheck() const override; bool FailsMalwareCheck() const override;
const gfx::VectorIcon* GetVectorIconOverride() const override; const gfx::VectorIcon* GetVectorIconOverride() const override;
......
...@@ -74,17 +74,17 @@ bool LocationBarModelDelegateIOS::ShouldDisplayURL() const { ...@@ -74,17 +74,17 @@ bool LocationBarModelDelegateIOS::ShouldDisplayURL() const {
return true; return true;
} }
security_state::SecurityLevel LocationBarModelDelegateIOS::GetSecurityLevel() void LocationBarModelDelegateIOS::GetSecurityInfo(
const { security_state::SecurityInfo* result) const {
web::WebState* web_state = GetActiveWebState(); web::WebState* web_state = GetActiveWebState();
// If there is no active WebState (which can happen during toolbar // If there is no active WebState (which can happen during toolbar
// initialization), assume no security style. // initialization), assume no security style.
if (!web_state) if (!web_state) {
return security_state::NONE; *result = security_state::SecurityInfo();
return;
}
auto* client = IOSSecurityStateTabHelper::FromWebState(web_state); auto* client = IOSSecurityStateTabHelper::FromWebState(web_state);
security_state::SecurityInfo result; client->GetSecurityInfo(result);
client->GetSecurityInfo(&result);
return result.security_level;
} }
scoped_refptr<net::X509Certificate> scoped_refptr<net::X509Certificate>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment