blob: 6a8f18245f8ad1211bdd35871c92036ada76f1da [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import <UIKit/UIKit.h>
#import <objc/runtime.h>
#import "base/ios/ios_util.h"
#import "testing/gtest/include/gtest/gtest.h"
#import "testing/platform_test.h"
// Test fixture for DataControlsProtocolSmokeTest.
class DataControlsProtocolSmokeTest : public PlatformTest {};
// Verifies that the number of methods in the UIResponderStandardEditActions
// protocol has not changed. This acts as a smoke test to detect potential new
// vectors for data exfiltration that need to be covered by Data Controls.
TEST_F(DataControlsProtocolSmokeTest,
TestUIResponderStandardEditActionsMethodCount) {
if (!base::ios::IsRunningOnOrLater(18, 0, 0)) {
GTEST_SKIP() << "All relevant UIResponderStandardEditActions "
"methods before iOS 18 are covered by data controls.";
}
Protocol* protocol = @protocol(UIResponderStandardEditActions);
ASSERT_TRUE(protocol);
unsigned int required_method_count = 0;
struct objc_method_description* required_methods =
protocol_copyMethodDescriptionList(protocol, /*isRequiredMethod=*/true,
/*isInstanceMethod=*/true,
&required_method_count);
unsigned int optional_method_count = 0;
struct objc_method_description* optional_methods =
protocol_copyMethodDescriptionList(protocol, /*isRequiredMethod=*/false,
/*isInstanceMethod=*/true,
&optional_method_count);
if (required_methods) {
free(required_methods);
}
if (optional_methods) {
free(optional_methods);
}
unsigned int total_method_count =
required_method_count + optional_method_count;
// iOS 26 introduces more methods to UIResponderStandardEditActions. None of
// them need to be covered by Data Controls in CRWWebView.
const unsigned int kExpectedMethodCount =
base::ios::IsRunningOnOrLater(26, 0, 0) ? 36 : 28;
EXPECT_EQ(kExpectedMethodCount, total_method_count)
<< "The number of methods in UIResponderStandardEditActions has changed. "
<< "Expected: " << kExpectedMethodCount
<< ", Actual: " << total_method_count
<< ". This is a Data Controls smoke test failure. Please review the "
<< "protocol definition for new methods to ensure copy/paste/cut "
<< "overrides in CRWWebView are still comprehensive and update the "
"expected count in this test.";
}