blob: 333715077cc35960bdb34daba89a77e498084482 [file] [log] [blame]
// Copyright 2017 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 CONTENT_PUBLIC_TEST_FIND_TEST_UTILS_H_
#define CONTENT_PUBLIC_TEST_FIND_TEST_UTILS_H_
#include "content/public/browser/web_contents_delegate.h"
#include "content/public/test/test_utils.h"
namespace content {
// The results of a find request.
struct FindResults {
FindResults(int request_id,
int number_of_matches,
int active_match_ordinal);
FindResults();
int request_id;
int number_of_matches;
int active_match_ordinal;
};
// This test delegate is used during find-in-page tests, in order to directly
// access find replies going through the WebContentsDelegate. Tests functions in
// this delegate allow for waiting on specific or all find replies to come in,
// and observe find results within them.
class FindTestWebContentsDelegate : public WebContentsDelegate {
public:
FindTestWebContentsDelegate();
~FindTestWebContentsDelegate() override;
// Returns the current find results.
const FindResults& GetFindResults() const;
// Waits for all pending replies to be received.
void WaitForFinalReply();
// Waits for the next find reply. This is useful for waiting for a single
// match to be activated, or for a new frame to be searched.
void WaitForNextReply();
// Indicates that the next find reply from this point will be the one to wait
// for when WaitForNextReply() is called. It may be the case that the reply
// comes before the call to WaitForNextReply(), in which case it will return
// immediately.
void MarkNextReply();
// Called when a new find request is issued, so the delegate knows the last
// request ID.
void UpdateLastRequest(int request_id);
// From when this function is called, all replies coming in via FindReply()
// will be recorded. These replies can be retrieved via GetReplyRecord().
void StartReplyRecord();
// Retreives the results from the find replies recorded since the last call to
// StartReplyRecord(). Calling this function also stops the recording new find
// replies.
const std::vector<FindResults>& GetReplyRecord();
#if defined(OS_ANDROID)
// Waits for all of the find match rects to be received.
void WaitForMatchRects();
const std::vector<gfx::RectF>& find_match_rects() const {
return find_match_rects_;
}
const gfx::RectF& active_match_rect() const {
return active_match_rect_;
}
#endif
private:
enum WaitingFor {
NOTHING,
FINAL_REPLY,
NEXT_REPLY,
#if defined(OS_ANDROID)
MATCH_RECTS
#endif
};
// WebContentsDelegate override.
void FindReply(WebContents* web_contents,
int request_id,
int number_of_matches,
const gfx::Rect& selection_rect,
int active_match_ordinal,
bool final_update) override;
// Uses |message_loop_runner_| to wait for various things.
void WaitFor(WaitingFor wait_for);
// Stop waiting for |waiting_for_|.
void StopWaiting();
#if defined(OS_ANDROID)
// WebContentsDelegate override.
void FindMatchRectsReply(WebContents* web_contents,
int version,
const std::vector<gfx::RectF>& rects,
const gfx::RectF& active_rect) override;
std::vector<gfx::RectF> find_match_rects_;
gfx::RectF active_match_rect_;
#endif
// The latest known results from the current find request.
FindResults current_results_;
// The ID of the last find request issued.
int last_request_id_;
// The ID of the last find request to finish (all replies received).
int last_finished_request_id_;
// Indicates whether the next reply after MarkNextReply() has been received.
bool next_reply_received_;
// Indicates whether the find results from incoming find replies are currently
// being recorded.
bool record_replies_;
// A record of all find replies that have come in via FindReply() since
// StartReplyRecor() was last called.
std::vector<FindResults> reply_record_;
// Indicates what |message_loop_runner_| is waiting for, if anything.
WaitingFor waiting_for_;
scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
DISALLOW_COPY_AND_ASSIGN(FindTestWebContentsDelegate);
};
// Finds the set of all RenderFrameHosts that the FindRequestManager associated
// with |web_contents| has an ongoing find request. Note that the
// FindRequestManager could be owned by an outer WebContents of |web_contents|
// and the returned RenderFrameHosts are not necessarily part of |web_contents|
// frame tree.
std::unordered_set<RenderFrameHost*> GetRenderFrameHostsWithPendingFindResults(
WebContents* web_contents);
} // namespace content
#endif // CONTENT_PUBLIC_TEST_FIND_TEST_UTILS_H_a