blob: 3884b41e14f025fc759134381d815bdd7b8d5ded [file]
// Copyright 2021 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_handlers_java_script_feature.h"
#import "base/feature_list.h"
#import "base/no_destructor.h"
#import "base/values.h"
#import "components/autofill/core/common/autofill_features.h"
#import "components/autofill/ios/common/features.h"
#import "components/autofill/ios/common/javascript_feature_util.h"
#import "components/autofill/ios/form_util/autofill_form_features_java_script_feature.h"
#import "components/autofill/ios/form_util/form_activity_tab_helper.h"
#import "components/autofill/ios/form_util/remote_frame_registration_java_script_feature.h"
#import "ios/web/public/js_messaging/java_script_feature.h"
#import "ios/web/public/js_messaging/java_script_feature_util.h"
#import "ios/web/public/js_messaging/script_message.h"
namespace {
using FeatureScript = web::JavaScriptFeature::FeatureScript;
constexpr char kFormHandlerScriptName[] = "form_handlers";
constexpr char kRemoteTokenRegistrationScriptName[] =
"register_remote_frame_token";
constexpr char kScriptMessageName[] = "FormHandlersMessage";
std::vector<web::JavaScriptFeature::FeatureScript> GetFeatureScripts() {
std::vector<FeatureScript> feature_scripts;
auto placeholder_replacements_callback = base::BindRepeating(
[]() -> web::JavaScriptFeature::FeatureScript::PlaceholderReplacements {
// Override the placeholder for setting the capture mode of the form
// submission listener.
bool use_capture = base::FeatureList::IsEnabled(
kAutofillFormSubmissionEventsInCaptureMode);
return @{
@"{{PlaceholderFormSubmissionListenerCapture}}" :
use_capture ? @"true" : @"false"
};
});
feature_scripts.push_back(FeatureScript::CreateWithFilename(
kFormHandlerScriptName, FeatureScript::InjectionTime::kDocumentStart,
FeatureScript::TargetFrames::kAllFrames,
FeatureScript::ReinjectionBehavior::kReinjectOnDocumentRecreation,
placeholder_replacements_callback));
feature_scripts.push_back(FeatureScript::CreateWithFilename(
kRemoteTokenRegistrationScriptName,
FeatureScript::InjectionTime::kDocumentStart,
FeatureScript::TargetFrames::kAllFrames,
FeatureScript::ReinjectionBehavior::kReinjectOnDocumentRecreation));
return feature_scripts;
}
} // namespace
namespace autofill {
// static
FormHandlersJavaScriptFeature* FormHandlersJavaScriptFeature::GetInstance() {
static base::NoDestructor<FormHandlersJavaScriptFeature> instance;
return instance.get();
}
FormHandlersJavaScriptFeature::FormHandlersJavaScriptFeature()
: web::JavaScriptFeature(
ContentWorldForAutofillJavascriptFeatures(),
GetFeatureScripts(),
{
web::java_script_features::GetCommonJavaScriptFeature(),
autofill::AutofillFormFeaturesJavaScriptFeature::GetInstance(),
RemoteFrameRegistrationJavaScriptFeature::GetInstance(),
}) {}
FormHandlersJavaScriptFeature::~FormHandlersJavaScriptFeature() = default;
void FormHandlersJavaScriptFeature::TrackFormMutations(
web::WebFrame* frame,
int mutation_tracking_delay) {
CallJavaScriptFunction(frame, "formHandlers.trackFormMutations",
base::Value::List().Append(mutation_tracking_delay));
}
std::optional<std::string>
FormHandlersJavaScriptFeature::GetScriptMessageHandlerName() const {
return kScriptMessageName;
}
void FormHandlersJavaScriptFeature::ScriptMessageReceived(
web::WebState* web_state,
const web::ScriptMessage& message) {
// Delegate to FormActivityTabHelper for all other messages.
FormActivityTabHelper* helper =
FormActivityTabHelper::GetOrCreateForWebState(web_state);
helper->OnFormMessageReceived(web_state, message);
}
FormHandlersJavaScriptFeature::FormHandlersJavaScriptFeature(
RemoteFrameRegistrationJavaScriptFeature*
remote_frame_registration_java_script_feature)
: web::JavaScriptFeature(
ContentWorldForAutofillJavascriptFeatures(),
GetFeatureScripts(),
{
web::java_script_features::GetCommonJavaScriptFeature(),
remote_frame_registration_java_script_feature,
}) {}
} // namespace autofill