| Index: content/browser/find_request_manager_browsertest.cc
|
| diff --git a/content/browser/find_request_manager_browsertest.cc b/content/browser/find_request_manager_browsertest.cc
|
| index d1432d65638abcc797cbcf1ec8ddc8b3bb27b440..c0df3d705d13899e94171d529f13cadd8aeb62b0 100644
|
| --- a/content/browser/find_request_manager_browsertest.cc
|
| +++ b/content/browser/find_request_manager_browsertest.cc
|
| @@ -24,9 +24,15 @@ const int kInvalidId = -1;
|
|
|
| // The results of a find request.
|
| struct FindResults {
|
| - int request_id = kInvalidId;
|
| - int number_of_matches = 0;
|
| - int active_match_ordinal = 0;
|
| + FindResults(int request_id, int number_of_matches, int active_match_ordinal)
|
| + : request_id(request_id),
|
| + number_of_matches(number_of_matches),
|
| + active_match_ordinal(active_match_ordinal) {}
|
| + FindResults() : FindResults(kInvalidId, 0, 0) {}
|
| +
|
| + int request_id;
|
| + int number_of_matches;
|
| + int active_match_ordinal;
|
| };
|
|
|
| } // namespace
|
| @@ -37,11 +43,12 @@ class TestWebContentsDelegate : public WebContentsDelegate {
|
| : last_request_id_(kInvalidId),
|
| last_finished_request_id_(kInvalidId),
|
| next_reply_received_(false),
|
| + record_replies_(false),
|
| waiting_for_(NOTHING) {}
|
| ~TestWebContentsDelegate() override {}
|
|
|
| // Returns the current find results.
|
| - FindResults GetFindResults() {
|
| + const FindResults& GetFindResults() const {
|
| return current_results_;
|
| }
|
|
|
| @@ -76,6 +83,21 @@ class TestWebContentsDelegate : public WebContentsDelegate {
|
| last_request_id_ = 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() {
|
| + reply_record_.clear();
|
| + record_replies_ = true;
|
| + }
|
| +
|
| + // 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() {
|
| + record_replies_ = false;
|
| + return reply_record_;
|
| + }
|
| +
|
| #if defined(OS_ANDROID)
|
| // Waits for all of the find match rects to be received.
|
| void WaitForMatchRects() {
|
| @@ -108,6 +130,11 @@ class TestWebContentsDelegate : public WebContentsDelegate {
|
| const gfx::Rect& selection_rect,
|
| int active_match_ordinal,
|
| bool final_update) override {
|
| + if (record_replies_) {
|
| + reply_record_.emplace_back(
|
| + request_id, number_of_matches, active_match_ordinal);
|
| + }
|
| +
|
| // Update the current results.
|
| if (request_id > current_results_.request_id)
|
| current_results_.request_id = request_id;
|
| @@ -187,6 +214,14 @@ class TestWebContentsDelegate : public WebContentsDelegate {
|
| // 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_;
|
|
|
| @@ -417,6 +452,7 @@ IN_PROC_BROWSER_TEST_P(FindRequestManagerTest, MAYBE(RemoveFrame)) {
|
|
|
| blink::WebFindOptions options;
|
| Find("result", options);
|
| + delegate()->WaitForFinalReply();
|
| options.findNext = true;
|
| options.forward = false;
|
| Find("result", options);
|
| @@ -488,6 +524,35 @@ IN_PROC_BROWSER_TEST_P(FindRequestManagerTest, MAYBE(FindNewMatches)) {
|
| EXPECT_EQ(4, results.active_match_ordinal);
|
| }
|
|
|
| +IN_PROC_BROWSER_TEST_F(FindRequestManagerTest, MAYBE(FindInPage_Issue627799)) {
|
| + LoadAndWait("/find_in_long_page.html");
|
| +
|
| + blink::WebFindOptions options;
|
| + Find("42", options);
|
| + delegate()->WaitForFinalReply();
|
| +
|
| + FindResults results = delegate()->GetFindResults();
|
| + EXPECT_EQ(last_request_id(), results.request_id);
|
| + EXPECT_EQ(970, results.number_of_matches);
|
| + EXPECT_EQ(1, results.active_match_ordinal);
|
| +
|
| + delegate()->StartReplyRecord();
|
| + options.findNext = true;
|
| + options.forward = false;
|
| + Find("42", options);
|
| + delegate()->WaitForFinalReply();
|
| +
|
| + // This is the crux of the issue that this test guards against. Searching
|
| + // across the frame boundary should not cause the frame to be re-scoped. If
|
| + // the re-scope occurs, then we will see the number of matches change in one
|
| + // of the recorded find replies.
|
| + for (auto& reply : delegate()->GetReplyRecord()) {
|
| + EXPECT_EQ(last_request_id(), reply.request_id);
|
| + EXPECT_TRUE(reply.number_of_matches == kInvalidId ||
|
| + reply.number_of_matches == results.number_of_matches);
|
| + }
|
| +}
|
| +
|
| #if defined(OS_ANDROID)
|
| // Tests requesting find match rects.
|
| IN_PROC_BROWSER_TEST_F(FindRequestManagerTest, MAYBE(FindMatchRects)) {
|
|
|