chromium/ios/chrome/browser/lens/model/lens_tab_helper.h

// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef IOS_CHROME_BROWSER_LENS_MODEL_LENS_TAB_HELPER_H_
#define IOS_CHROME_BROWSER_LENS_MODEL_LENS_TAB_HELPER_H_

#import <optional>

#import "ios/web/public/navigation/web_state_policy_decider.h"
#import "ios/web/public/web_state_user_data.h"

enum class LensEntrypoint;
@protocol LensCommands;

// A tab helper that handles navigation to Lens action links, i.e.
// links that start with googlechromeaction://lens, by potentially
// opening the Lens UI.
class LensTabHelper : public web::WebStatePolicyDecider,
                      public web::WebStateUserData<LensTabHelper> {
 public:
  ~LensTabHelper() override;

  LensTabHelper(const LensTabHelper&) = delete;
  LensTabHelper& operator=(const LensTabHelper&) = delete;

  // Sets the Lens CommandDispatcher.
  void SetLensCommandsHandler(id<LensCommands> commands_handler);

  // Returns the entry point that the googlechromeaction:// url path points to.
  static std::optional<LensEntrypoint> EntryPointForGoogleChromeActionURLPath(
      NSString* path);

  // web::WebStatePolicyDecider:
  void ShouldAllowRequest(
      NSURLRequest* request,
      web::WebStatePolicyDecider::RequestInfo request_info,
      web::WebStatePolicyDecider::PolicyDecisionCallback callback) override;

 private:
  explicit LensTabHelper(web::WebState* web_state);

  // Opens the Lens input selection UI with the given entry point.
  void OpenLensInputSelection(LensEntrypoint entry_point);

  // Handler used to request showing the password bottom sheet.
  __weak id<LensCommands> commands_handler_;

  friend class web::WebStateUserData<LensTabHelper>;
  WEB_STATE_USER_DATA_KEY_DECL();
};

#endif  // IOS_CHROME_BROWSER_LENS_MODEL_LENS_TAB_HELPER_H_