blob: 5ea9d662ee6f250f8151a969048e0424cf8f9903 [file]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "components/autofill/ios/form_util/form_activity_observer_bridge.h"
#import "components/autofill/core/common/form_data.h"
#import "components/autofill/ios/form_util/test_form_activity_observer.h"
#import "ios/web/public/test/fakes/fake_web_frame.h"
#import "ios/web/public/test/fakes/fake_web_state.h"
#import "testing/platform_test.h"
@interface FakeFormActivityObserver : NSObject<FormActivityObserver>
// Arguments passed to
// |webState:didSubmitDocumentWithFormData:userInitiated:inFrame:perfectFilling:|.
@property(nonatomic, readonly)
autofill::TestSubmitDocumentInfo* submitDocumentInfo;
// Arguments passed to
// |webState:didRegisterFormActivity:inFrame:|.
@property(nonatomic, readonly) autofill::TestFormActivityInfo* formActivityInfo;
@end
@implementation FakeFormActivityObserver {
// Arguments passed to
// |webState:senderFrame:submittedDocumentWithFormNamed:
// hasUserGesture:formInMainFrame:inFrame|.
std::unique_ptr<autofill::TestSubmitDocumentInfo> _submitDocumentInfo;
// Arguments passed to
// |webState:senderFrame:didRegisterFormActivity:inFrame:|.
std::unique_ptr<autofill::TestFormActivityInfo> _formActivityInfo;
// Arguments passed to
// |webState:senderFrame:didRegisterFormRemoval:inFrame:|.
std::unique_ptr<autofill::TestFormRemovalInfo> _formRemovalInfo;
}
- (autofill::TestSubmitDocumentInfo*)submitDocumentInfo {
return _submitDocumentInfo.get();
}
- (autofill::TestFormActivityInfo*)formActivityInfo {
return _formActivityInfo.get();
}
- (autofill::TestFormRemovalInfo*)formRemovalInfo {
return _formRemovalInfo.get();
}
- (void)webState:(web::WebState*)webState
didSubmitDocumentWithFormData:(const autofill::FormData&)formData
hasUserGesture:(BOOL)hasUserGesture
inFrame:(web::WebFrame*)frame
perfectFilling:(BOOL)perfectFilling {
_submitDocumentInfo = std::make_unique<autofill::TestSubmitDocumentInfo>();
_submitDocumentInfo->web_state = webState;
_submitDocumentInfo->sender_frame = frame;
_submitDocumentInfo->form_data = formData;
_submitDocumentInfo->has_user_gesture = hasUserGesture;
}
- (void)webState:(web::WebState*)webState
didRegisterFormActivity:(const autofill::FormActivityParams&)params
inFrame:(web::WebFrame*)frame {
_formActivityInfo = std::make_unique<autofill::TestFormActivityInfo>();
_formActivityInfo->web_state = webState;
_formActivityInfo->sender_frame = frame;
_formActivityInfo->form_activity = params;
}
- (void)webState:(web::WebState*)webState
didRegisterFormRemoval:(const autofill::FormRemovalParams&)params
inFrame:(web::WebFrame*)frame {
_formRemovalInfo = std::make_unique<autofill::TestFormRemovalInfo>();
_formRemovalInfo->web_state = webState;
_formRemovalInfo->sender_frame = frame;
_formRemovalInfo->form_removal_params = params;
}
@end
// Test fixture to test WebStateObserverBridge class.
class FormActivityObserverBridgeTest : public PlatformTest {
public:
FormActivityObserverBridgeTest()
: observer_([[FakeFormActivityObserver alloc] init]),
observer_bridge_(&fake_web_state_, observer_) {}
protected:
web::FakeWebState fake_web_state_;
FakeFormActivityObserver* observer_;
autofill::FormActivityObserverBridge observer_bridge_;
};
// Tests |webState:didRegisterFormActivityWithParams:inFrame:| forwarding.
TEST_F(FormActivityObserverBridgeTest, DocumentSubmitted) {
ASSERT_FALSE([observer_ submitDocumentInfo]);
autofill::FormData kTestFormData;
bool has_user_gesture = true;
bool perfect_filling = true;
auto sender_frame = web::FakeWebFrame::Create("sender_frame", true);
observer_bridge_.DocumentSubmitted(&fake_web_state_, sender_frame.get(),
kTestFormData, has_user_gesture,
perfect_filling);
ASSERT_TRUE([observer_ submitDocumentInfo]);
EXPECT_EQ(&fake_web_state_, [observer_ submitDocumentInfo]->web_state);
EXPECT_EQ(sender_frame.get(), [observer_ submitDocumentInfo]->sender_frame);
EXPECT_EQ(kTestFormData, [observer_ submitDocumentInfo]->form_data);
EXPECT_EQ(has_user_gesture, [observer_ submitDocumentInfo]->has_user_gesture);
}
// Tests |webState:didRegisterFormActivity:...| forwarding.
TEST_F(FormActivityObserverBridgeTest, FormActivityRegistered) {
ASSERT_FALSE([observer_ formActivityInfo]);
autofill::FormActivityParams params;
auto sender_frame = web::FakeWebFrame::Create("sender_frame", true);
params.form_name = "form-name";
params.field_type = "field-type";
params.type = "type";
params.value = "value";
params.input_missing = true;
observer_bridge_.FormActivityRegistered(&fake_web_state_, sender_frame.get(),
params);
ASSERT_TRUE([observer_ formActivityInfo]);
EXPECT_EQ(&fake_web_state_, [observer_ formActivityInfo]->web_state);
EXPECT_EQ(sender_frame.get(), [observer_ formActivityInfo]->sender_frame);
EXPECT_EQ(params.form_name,
[observer_ formActivityInfo]->form_activity.form_name);
EXPECT_EQ(params.field_type,
[observer_ formActivityInfo]->form_activity.field_type);
EXPECT_EQ(params.type, [observer_ formActivityInfo]->form_activity.type);
EXPECT_EQ(params.value, [observer_ formActivityInfo]->form_activity.value);
EXPECT_TRUE([observer_ formActivityInfo]->form_activity.input_missing);
}
// Tests |webState:didRegisterFormRemoval:...| forwarding.
TEST_F(FormActivityObserverBridgeTest, FormRemovalRegistered) {
ASSERT_FALSE([observer_ formRemovalInfo]);
autofill::FormRemovalParams params;
auto sender_frame = web::FakeWebFrame::Create("sender_frame", true);
params.removed_forms = {autofill::FormRendererId(1)};
observer_bridge_.FormRemoved(&fake_web_state_, sender_frame.get(), params);
ASSERT_TRUE([observer_ formRemovalInfo]);
EXPECT_EQ(&fake_web_state_, [observer_ formRemovalInfo]->web_state);
EXPECT_EQ(sender_frame.get(), [observer_ formRemovalInfo]->sender_frame);
EXPECT_EQ(params.removed_forms,
[observer_ formRemovalInfo]->form_removal_params.removed_forms);
}