blob: 2e3f68c913f765f9577039184ca0d8444ee8d99a [file] [log] [blame]
// Copyright 2017 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.
#import "ios/chrome/browser/ssl/ios_security_state_tab_helper.h"
#include "components/security_state/core/security_state.h"
#include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
#import "ios/chrome/browser/ssl/insecure_input_tab_helper.h"
#import "ios/chrome/browser/web/chrome_web_test.h"
#import "ios/web/public/navigation_item.h"
#import "ios/web/public/navigation_manager.h"
#include "ios/web/public/ssl_status.h"
#import "ios/web/public/test/web_test_with_web_state.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
// This test fixture enables Incognito mode and creates an
// IOSSecurityStateTabHelper for the WebState.
class IOSSecurityStateTabHelperIncognitoTest : public ChromeWebTest {
protected:
void SetUp() override {
ChromeWebTest::SetUp();
ASSERT_TRUE(web_state()->GetBrowserState()->IsOffTheRecord());
IOSSecurityStateTabHelper::CreateForWebState(web_state());
}
// Returns the SecurityInfo for current WebState().
void GetSecurityInfo(security_state::SecurityInfo* result) const {
IOSSecurityStateTabHelper::FromWebState(web_state())
->GetSecurityInfo(result);
}
// WebTest
web::BrowserState* GetBrowserState() override {
return chrome_browser_state_->GetOffTheRecordChromeBrowserState();
}
};
// Ensures that the security level of an HTTPS page loaded in Incognito mode
// is not downgraded.
TEST_F(IOSSecurityStateTabHelperIncognitoTest,
SecurityInfoNotDowngradedForHTTPS) {
LoadHtml(@"<html><body></body></html>", GURL("https://chromium.test"));
security_state::SecurityInfo security_info;
GetSecurityInfo(&security_info);
EXPECT_FALSE(security_info.incognito_downgraded_security_level);
}
// Ensures that the security level of an HTTP page loaded in Incognito mode
// is downgraded.
TEST_F(IOSSecurityStateTabHelperIncognitoTest, SecurityInfoDowngradedForHTTP) {
LoadHtml(@"<html><body></body></html>", GURL("http://chromium.test"));
security_state::SecurityInfo security_info;
GetSecurityInfo(&security_info);
EXPECT_EQ(security_state::HTTP_SHOW_WARNING, security_info.security_level);
}
// This test fixture creates an IOSSecurityStateTabHelper and an
// InsecureInputTabHelper for the WebState, then loads a non-secure
// HTML document.
class IOSSecurityStateTabHelperTest : public web::WebTestWithWebState {
protected:
void SetUp() override {
web::WebTestWithWebState::SetUp();
InsecureInputTabHelper::CreateForWebState(web_state());
insecure_input_ = InsecureInputTabHelper::FromWebState(web_state());
ASSERT_TRUE(insecure_input_);
IOSSecurityStateTabHelper::CreateForWebState(web_state());
LoadHtml(@"<html><body></body></html>", GURL("http://chromium.test"));
}
// Returns the InsecureInputEventData for current WebState().
security_state::InsecureInputEventData GetInsecureInputEventData() const {
security_state::SecurityInfo info;
IOSSecurityStateTabHelper::FromWebState(web_state())
->GetSecurityInfo(&info);
return info.insecure_input_events;
}
InsecureInputTabHelper* insecure_input() { return insecure_input_; }
private:
InsecureInputTabHelper* insecure_input_;
};
// Ensures that an HTTP page in non-Incognito mode does not downgrade to
// non-secure.
TEST_F(IOSSecurityStateTabHelperTest, SecurityInfoNotDowngradedInNonIncognito) {
LoadHtml(@"<html><body></body></html>", GURL("http://chromium.test"));
security_state::SecurityInfo security_info;
IOSSecurityStateTabHelper::FromWebState(web_state())
->GetSecurityInfo(&security_info);
EXPECT_FALSE(security_info.incognito_downgraded_security_level);
}
// Ensures that |insecure_field_edited| is set only when an editing event has
// been reported.
TEST_F(IOSSecurityStateTabHelperTest, SecurityInfoAfterEditing) {
// Verify |insecure_field_edited| is not set prematurely.
security_state::InsecureInputEventData events = GetInsecureInputEventData();
EXPECT_FALSE(events.insecure_field_edited);
// Simulate an edit and verify |insecure_field_edited| is noted in the
// insecure_input_events.
insecure_input()->DidEditFieldInInsecureContext();
events = GetInsecureInputEventData();
EXPECT_TRUE(events.insecure_field_edited);
}
// Ensures that |password_field_shown| is set only when a password field has
// been reported.
TEST_F(IOSSecurityStateTabHelperTest, SecurityInfoWithInsecurePasswordField) {
// Verify |password_field_shown| is not set prematurely.
security_state::InsecureInputEventData events = GetInsecureInputEventData();
EXPECT_FALSE(events.password_field_shown);
// Simulate a password field display and verify |password_field_shown|
// is noted in the insecure_input_events.
insecure_input()->DidShowPasswordFieldInInsecureContext();
events = GetInsecureInputEventData();
EXPECT_TRUE(events.password_field_shown);
}
// Ensures that |credit_card_field_edited| is set only when a credit card field
// interaction has been reported.
TEST_F(IOSSecurityStateTabHelperTest, SecurityInfoWithInsecureCreditCardField) {
// Verify |credit_card_field_edited| is not set prematurely.
security_state::InsecureInputEventData events = GetInsecureInputEventData();
EXPECT_FALSE(events.credit_card_field_edited);
// Simulate a credit card field display and verify |credit_card_field_edited|
// is noted in the insecure_input_events.
insecure_input()->DidInteractWithNonsecureCreditCardInput();
events = GetInsecureInputEventData();
EXPECT_TRUE(events.credit_card_field_edited);
}
// Ensures that re-navigating to the same page does not keep
// |insecure_field_set| set.
TEST_F(IOSSecurityStateTabHelperTest, InsecureInputClearedOnRenavigation) {
// Simulate an edit and verify |insecure_field_edited| is noted in the
// insecure_input_events.
insecure_input()->DidEditFieldInInsecureContext();
security_state::InsecureInputEventData events = GetInsecureInputEventData();
EXPECT_TRUE(events.insecure_field_edited);
// Navigate to the same page again.
LoadHtml(@"<html><body></body></html>", GURL("http://chromium.test"));
events = GetInsecureInputEventData();
EXPECT_FALSE(events.insecure_field_edited);
}