chromium/ios/web/web_state/user_interaction_state.h

// Copyright 2019 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_WEB_WEB_STATE_USER_INTERACTION_STATE_H_
#define IOS_WEB_WEB_STATE_USER_INTERACTION_STATE_H_

#import <WebKit/WebKit.h>
#include <memory>

#include "base/time/time.h"
#import "ios/web/web_state/user_interaction_event.h"

namespace web {

// Records user's interaction state with web content.
class UserInteractionState {
 public:
  UserInteractionState();
  ~UserInteractionState();

  // Returns `user_interaction_registered_since_page_loaded_`.
  bool UserInteractionRegisteredSincePageLoaded() const;
  // Sets `user_interaction_registered_since_page_loaded_`. If true, also sets
  // `user_interaction_registered_since_last_url_change_` and
  // `user_interaction_registered_since_web_view_created_` to true;
  void SetUserInteractionRegisteredSincePageLoaded(
      bool user_interaction_registered_since_page_loaded);

  // Returns `user_interaction_registered_since_last_url_change_`.
  bool UserInteractionRegisteredSinceLastUrlChange() const;
  // Sets `user_interaction_registered_since_last_url_change_`. If true, also
  // sets `user_interaction_registered_since_web_view_created_` to true.
  void SetUserInteractionRegisteredSinceLastUrlChange(
      bool interaction_registered_since_last_url_change);

  // Returns `user_interaction_registered_since_web_view_created_`.
  bool UserInteractionRegisteredSinceWebViewCreated() const;

  // Sets `tap_in_progress_`.
  void SetTapInProgress(bool tap_in_progress);

  // Resets `last_transfer_time_` to current time.
  void ResetLastTransferTime();

  // Returns the raw pointer managed by `last_user_interaction_`.
  web::UserInteractionEvent* LastUserInteraction() const;
  // Sets `last_user_interaction_`.
  void SetLastUserInteraction(
      std::unique_ptr<web::UserInteractionEvent> last_user_interaction);

  // Returns true if the user interacted with the page recently.
  bool HasUserTappedRecently(WKWebView* web_view) const;
  // Returns whether the user is interacting with the page.
  bool IsUserInteracting(WKWebView* web_view) const;

 private:
  // Whether a user interaction has been registered since the page has loaded.
  bool user_interaction_registered_since_page_loaded_;
  // Whether a user interaction has been registered since the last URL change.
  bool user_interaction_registered_since_last_url_change_;
  // Whether a user interaction has been registered since the web view is
  // created.
  bool user_interaction_registered_since_web_view_created_;
  // Whether a tap is in progress.
  bool tap_in_progress_;
  // The time of the last page transfer start.
  base::TimeTicks last_transfer_time_;
  // Data on the recorded last user interaction.
  std::unique_ptr<web::UserInteractionEvent> last_user_interaction_;
};

}  // namespace web

#endif  // IOS_WEB_WEB_STATE_USER_INTERACTION_STATE_H_