| // Copyright 2019 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef IOS_WEB_FIND_IN_PAGE_FIND_IN_PAGE_REQUEST_H_ |
| #define IOS_WEB_FIND_IN_PAGE_FIND_IN_PAGE_REQUEST_H_ |
| |
| #include <list> |
| #include <map> |
| #include <string> |
| |
| #import <Foundation/Foundation.h> |
| |
| @class NSString; |
| |
| namespace web { |
| |
| class WebFrame; |
| |
| // Keeps track of the state of a FindInPageManager::Find() request. |
| class FindInPageRequest { |
| public: |
| FindInPageRequest(); |
| ~FindInPageRequest(); |
| // Clears properties and sets new |query| and |pending_frame_call_count|. |
| void Reset(NSString* query, int pending_frame_call_count); |
| int GetTotalMatchCount() const; |
| int GetRequestId() const; |
| NSString* GetRequestQuery() const; |
| |
| // Sets |selected_frame_id| and |selected_match_index_in_selected_frame| to |
| // the first match on the page. No-op if no known matches exist. Returns |
| // true if selected a match, false otherwise. |
| bool GoToFirstMatch(); |
| // Sets |selected_frame_id| and |selected_match_index_in_selected_frame| to |
| // the next match on the page. No-op if no known matches exist. Returns true |
| // if selected a match, false otherwise. |
| bool GoToNextMatch(); |
| // Sets |selected_frame_id| and |selected_match_index_in_selected_frame| to |
| // the previous match on the page. No-op if no known matches exist. Returns |
| // true if selected a match, false otherwise. |
| bool GoToPreviousMatch(); |
| |
| // Returns the number of matches in |selected_frame_id|. If no match is |
| // currently selected, then returns -1; |
| int GetMatchCountForSelectedFrame(); |
| // Sets |match_count| for |selected_frame_id|, if one exists. |
| void SetMatchCountForSelectedFrame(int match_count); |
| |
| // Returns the index of the currently selected match for all matches on the |
| // page. If no match is selected, then returns -1. |
| int GetCurrentSelectedMatchPageIndex(); |
| // Returns the id of the WebFrame containing the currently selected match. |
| // Returns empty string if no currently selected match. |
| std::string GetSelectedFrameId(); |
| |
| // Returns the index of the currently selected match relative to the matches |
| // within its frame. If no match is selected, then returns -1. |
| int GetCurrentSelectedMatchFrameIndex() const; |
| // Sets |index| as the currently selected index relative to the selected |
| // frame. |
| void SetCurrentSelectedMatchFrameIndex(int index); |
| |
| // Returns the number of matches in |frame_id|. If |frame_id| is invalid, |
| // then returns -1. |
| int GetMatchCountForFrame(const std::string& frame_id); |
| // Sets |match_count| for |frame_id|. |
| void SetMatchCountForFrame(int match_count, const std::string& frame_id); |
| |
| // Removes frame with Id |frame_id| from |frame_order| and |
| // |frame_match_count|. Resets |selected_frame_id| and |
| // |selected_match_index_in_selected_frame| if the frame with |frame_id| |
| // contains the currently selected match. |
| void RemoveFrame(const std::string& frame_id); |
| // Adds new frame to |frame_order_| and |frame_match_count_|. |
| void AddFrame(WebFrame* web_frame); |
| |
| // After each frame's Find request has finished, call this method to |
| // decrement |pending_frame_counts| to indicate to the receiver of the |
| // request completion. |
| void DidReceiveFindResponseFromOneFrame(); |
| // Returns true if there are no more pending Find requests, false |
| // otherwise. |
| bool AreAllFindResponsesReturned(); |
| |
| private: |
| // Unique identifier for each find used to check that it is the most recent |
| // find. This ensures that an old find doesn't decrement |
| // |pending_frame_calls_count| after it has been reset by the new find. |
| int unique_id_ = 0; |
| // Query string of find request. NSString type to ensure query passed to |
| // delegate methods is the same type as what is passed into Find(). |
| NSString* query_ = nil; |
| // Counter to keep track of pending frame JavaScript calls. |
| int pending_frame_call_count_ = 0; |
| // Holds number of matches found for each frame keyed by frame_id. |
| std::map<std::string, int> frame_match_count_; |
| // List of frame_ids used for sorting matches. |
| std::list<std::string> frame_order_; |
| // Id of frame which has the currently selected match. Set to |
| // frame_order.end() if there is no currently selected match. All matches |
| // from the last find will be highlighted. However, the match at |
| // |selected_match_index_in_selected_frame| will be highlighted in a |
| // visually unique manner. This match is referred to as the "selected match" |
| // and can be changed with the FindInPageNext and FindInPagePrevious |
| // commands. |
| std::list<std::string>::iterator selected_frame_id_ = frame_order_.end(); |
| // Index of the currently selected match or -1 if there is none. |
| int selected_match_index_in_selected_frame_ = -1; |
| // Returns true if |frame_id| contains the currently selected match, false |
| // otherwise. |
| bool IsSelectedFrame(const std::string& frame_id); |
| }; |
| |
| } // namespace web |
| |
| #endif // IOS_WEB_FIND_IN_PAGE_FIND_IN_PAGE_REQUEST_H_ |