chromium/components/autofill/ios/browser/suggestion_controller_java_script_feature.h

// 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.

#ifndef COMPONENTS_AUTOFILL_IOS_BROWSER_SUGGESTION_CONTROLLER_JAVA_SCRIPT_FEATURE_H_
#define COMPONENTS_AUTOFILL_IOS_BROWSER_SUGGESTION_CONTROLLER_JAVA_SCRIPT_FEATURE_H_

#include <string>

#include "base/functional/callback.h"
#include "base/no_destructor.h"
#include "ios/web/public/js_messaging/java_script_feature.h"

namespace web {
class WebFrame;
}  // namespace web

namespace autofill {

class SuggestionControllerJavaScriptFeature : public web::JavaScriptFeature {
 public:
  // This feature holds no state, so only a single static instance is ever
  // needed.
  static SuggestionControllerJavaScriptFeature* GetInstance();

  // Focuses the next focusable element in tab order inside |frame|. No action
  // if there is no such element.
  void SelectNextElementInFrame(web::WebFrame* frame);

  // Focuses the next focusable element in tab order after the element specified
  // by |form_name| and |field_name| in tab order inside |frame|. No action if
  // there is no such element.
  void SelectNextElementInFrame(web::WebFrame* frame,
                                const std::string& form_name,
                                const std::string& field_name);

  // Focuses the previous focusable element in tab order inside |frame|. No
  // action if there is no such element.
  void SelectPreviousElementInFrame(web::WebFrame* frame);

  // Focuses the previous focusable element in tab order from the element
  // specified by |form_name| and |field_name| in tab order inside |frame|. No
  // action if there is no such element.
  void SelectPreviousElementInFrame(web::WebFrame* frame,
                                    const std::string& form_name,
                                    const std::string& field_name);

  // Checks if |frame| contains a next and previous element.
  // |completionHandler| is called with 2 bools, the first indicating if a
  // previous element was found, and the second indicating if a next element was
  // found. |completion_handler| cannot be nil.
  void FetchPreviousAndNextElementsPresenceInFrame(
      web::WebFrame* frame,
      base::OnceCallback<void(bool, bool)> completion_handler);

  // Checks if |frame| contains a next and previous element starting from the
  // field specified by |form_name| and |field_name|.
  // |completionHandler| is called with 2 BOOLs, the first indicating if a
  // previous element was found, and the second indicating if a next element was
  // found. |completion_handler| cannot be nil.
  void FetchPreviousAndNextElementsPresenceInFrame(
      web::WebFrame* frame,
      const std::string& form_name,
      const std::string& field_name,
      base::OnceCallback<void(bool, bool)> completion_handler);

 private:
  friend class base::NoDestructor<SuggestionControllerJavaScriptFeature>;

  SuggestionControllerJavaScriptFeature();
  ~SuggestionControllerJavaScriptFeature() override;

  SuggestionControllerJavaScriptFeature(
      const SuggestionControllerJavaScriptFeature&) = delete;
  SuggestionControllerJavaScriptFeature& operator=(
      const SuggestionControllerJavaScriptFeature&) = delete;
};

}  // namespace autofill

#endif  // COMPONENTS_AUTOFILL_IOS_BROWSER_SUGGESTION_CONTROLLER_JAVA_SCRIPT_FEATURE_H_