Commit dc74af3a authored by Eugene But's avatar Eugene But Committed by Commit Bot

Improve BreadcrumbManagerTabHelper::DidChangeVisibleSecurityState logging

Notable changes:
 - Log SecurityChange #mixed if page has mixed content
 - Log SecurityChange #broken if response has bad SSL cert
 - Do not log anything for other cases as it's not useful for finding
   steps

Bug: 2056565
Change-Id: Ieb7ce2f597eb0fb04680495b152d667fa3570a12
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2057756
Commit-Queue: Eugene But <eugenebut@chromium.org>
Reviewed-by: default avatarMike Dougherty <michaeldo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#741670}
parent b38d1d65
......@@ -24,6 +24,7 @@ source_set("breadcrumbs") {
"//ios/chrome/browser/web_state_list",
"//ios/net",
"//ios/web/public",
"//ios/web/public/security",
]
sources = [
......@@ -84,6 +85,7 @@ source_set("unit_tests") {
"//ios/chrome/browser/web_state_list",
"//ios/chrome/browser/web_state_list:test_support",
"//ios/chrome/test:test_support",
"//ios/web/public/security",
"//ios/web/public/test",
"//testing/gtest",
"//third_party/ocmock",
......
......@@ -21,12 +21,24 @@ extern const char kBreadcrumbDidFinishNavigation[];
// Name of PageLoaded event (see WebStateObserver::PageLoaded).
extern const char kBreadcrumbPageLoaded[];
// Name of DidChangeVisibleSecurityState event
// (see WebStateObserver::DidChangeVisibleSecurityState).
extern const char kBreadcrumbDidChangeVisibleSecurityState[];
// Constants below represent metadata for breadcrumb events.
// Appended to |kBreadcrumbDidChangeVisibleSecurityState| event if page has bad
// SSL cert.
extern const char kBreadcrumbAuthenticationBroken[];
// Appended to |kBreadcrumbDidFinishNavigation| event if
// navigation is a download.
extern const char kBreadcrumbDownload[];
// Appended to |kBreadcrumbDidChangeVisibleSecurityState| event if page has
// passive mixed content (f.e. an http served image on https served page).
extern const char kBreadcrumbMixedContent[];
// Appended to |kBreadcrumbPageLoaded| event if page load has
// failed.
extern const char kBreadcrumbPageLoadFailure[];
......
......@@ -12,6 +12,10 @@
#import "ios/net/protocol_handler_util.h"
#include "ios/web/public/favicon/favicon_url.h"
#import "ios/web/public/navigation/navigation_context.h"
#import "ios/web/public/navigation/navigation_item.h"
#import "ios/web/public/navigation/navigation_manager.h"
#include "ios/web/public/security/security_style.h"
#include "ios/web/public/security/ssl_status.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
......@@ -28,12 +32,16 @@ bool IsNptUrl(const GURL& url) {
const char kBreadcrumbDidStartNavigation[] = "StartNav";
const char kBreadcrumbDidFinishNavigation[] = "FinishNav";
const char kBreadcrumbPageLoaded[] = "PageLoad";
const char kBreadcrumbDidChangeVisibleSecurityState[] = "SecurityChange";
const char kBreadcrumbAuthenticationBroken[] = "#broken";
const char kBreadcrumbDownload[] = "#download";
const char kBreadcrumbMixedContent[] = "#mixed";
const char kBreadcrumbNtpNavigation[] = "#ntp";
const char kBreadcrumbPageLoadFailure[] = "#failure";
const char kBreadcrumbPageLoadSuccess[] = "#success";
const char kBreadcrumbRendererInitiatedByUser[] = "#renderer-user";
const char kBreadcrumbRendererInitiatedByScript[] = "#renderer-script";
const char kBreadcrumbPageLoadSuccess[] = "#success";
const char kBreadcrumbPageLoadFailure[] = "#failure";
const char kBreadcrumbDownload[] = "#download";
BreadcrumbManagerTabHelper::BreadcrumbManagerTabHelper(web::WebState* web_state)
: web_state_(web_state) {
......@@ -140,7 +148,26 @@ void BreadcrumbManagerTabHelper::PageLoaded(
void BreadcrumbManagerTabHelper::DidChangeVisibleSecurityState(
web::WebState* web_state) {
LogEvent("DidChangeVisibleSecurityState");
web::NavigationItem* visible_item =
web_state->GetNavigationManager()->GetVisibleItem();
if (!visible_item) {
return;
}
std::vector<std::string> event;
const web::SSLStatus& ssl = visible_item->GetSSL();
if (ssl.content_status & web::SSLStatus::DISPLAYED_INSECURE_CONTENT) {
event.push_back(kBreadcrumbMixedContent);
}
if (ssl.security_style == web::SECURITY_STYLE_AUTHENTICATION_BROKEN) {
event.push_back(kBreadcrumbAuthenticationBroken);
}
if (!event.empty()) {
event.insert(event.begin(), kBreadcrumbDidChangeVisibleSecurityState);
LogEvent(base::JoinString(event, " "));
}
}
void BreadcrumbManagerTabHelper::RenderProcessGone(web::WebState* web_state) {
......
......@@ -10,8 +10,10 @@
#include "ios/chrome/browser/chrome_url_constants.h"
#include "ios/chrome/browser/crash_report/breadcrumbs/breadcrumb_manager_keyed_service.h"
#include "ios/chrome/browser/crash_report/breadcrumbs/breadcrumb_manager_keyed_service_factory.h"
#include "ios/web/public/security/ssl_status.h"
#import "ios/web/public/test/error_test_util.h"
#import "ios/web/public/test/fakes/fake_navigation_context.h"
#import "ios/web/public/test/fakes/test_navigation_manager.h"
#import "ios/web/public/test/fakes/test_web_state.h"
#include "testing/gtest/include/gtest/gtest.h"
#import "testing/gtest_mac.h"
......@@ -339,3 +341,46 @@ TEST_F(BreadcrumbManagerTabHelperTest, NavigationError) {
net::ERR_INTERNET_DISCONNECTED)))
<< events.back();
}
// Tests changes in security states.
TEST_F(BreadcrumbManagerTabHelperTest, DidChangeVisibleSecurityState) {
BreadcrumbManagerTabHelper::CreateForWebState(&first_web_state_);
auto navigation_manager = std::make_unique<web::TestNavigationManager>();
web::TestNavigationManager* navigation_manager_ptr = navigation_manager.get();
first_web_state_.SetNavigationManager(std::move(navigation_manager));
ASSERT_EQ(0ul, breadcrumb_service_->GetEvents(0).size());
// Empty navigation manager.
first_web_state_.OnVisibleSecurityStateChanged();
ASSERT_EQ(0ul, breadcrumb_service_->GetEvents(0).size());
// Default navigation item.
auto visible_item = web::NavigationItem::Create();
navigation_manager_ptr->SetVisibleItem(visible_item.get());
first_web_state_.OnVisibleSecurityStateChanged();
ASSERT_EQ(0ul, breadcrumb_service_->GetEvents(0).size());
// Mixed content.
web::SSLStatus& status = visible_item->GetSSL();
status.content_status = web::SSLStatus::DISPLAYED_INSECURE_CONTENT;
first_web_state_.OnVisibleSecurityStateChanged();
std::list<std::string> events = breadcrumb_service_->GetEvents(0);
ASSERT_EQ(1ul, events.size());
EXPECT_NE(std::string::npos, events.back().find(kBreadcrumbMixedContent))
<< events.back();
EXPECT_EQ(std::string::npos,
events.back().find(kBreadcrumbAuthenticationBroken))
<< events.back();
// Broken authentication.
status.content_status = web::SSLStatus::NORMAL_CONTENT;
status.security_style = web::SECURITY_STYLE_AUTHENTICATION_BROKEN;
first_web_state_.OnVisibleSecurityStateChanged();
events = breadcrumb_service_->GetEvents(0);
ASSERT_EQ(2ul, events.size());
EXPECT_EQ(std::string::npos, events.back().find(kBreadcrumbMixedContent))
<< events.back();
EXPECT_NE(std::string::npos,
events.back().find(kBreadcrumbAuthenticationBroken))
<< events.back();
}
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