Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(695)

Side by Side Diff: content/browser/find_request_manager.cc

Issue 2363993003: Revert of Handling new frames and frame navigations with find-in-page during a find session. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/find_request_manager.h" 5 #include "content/browser/find_request_manager.h"
6 6
7 #include "content/browser/frame_host/render_frame_host_impl.h" 7 #include "content/browser/frame_host/render_frame_host_impl.h"
8 #include "content/browser/web_contents/web_contents_impl.h" 8 #include "content/browser/web_contents/web_contents_impl.h"
9 #include "content/common/frame_messages.h" 9 #include "content/common/frame_messages.h"
10 #include "content/common/input_messages.h" 10 #include "content/common/input_messages.h"
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 DCHECK(CheckFrame(rfh)); 144 DCHECK(CheckFrame(rfh));
145 145
146 // Update the stored find results. 146 // Update the stored find results.
147 147
148 DCHECK_GE(number_of_matches, -1); 148 DCHECK_GE(number_of_matches, -1);
149 DCHECK_GE(active_match_ordinal, -1); 149 DCHECK_GE(active_match_ordinal, -1);
150 150
151 // Check for an update to the number of matches. 151 // Check for an update to the number of matches.
152 if (number_of_matches != -1) { 152 if (number_of_matches != -1) {
153 DCHECK_GE(number_of_matches, 0); 153 DCHECK_GE(number_of_matches, 0);
154 // Increment the global number of matches by the number of additional
155 // matches found for this frame.
154 auto matches_per_frame_it = matches_per_frame_.find(rfh); 156 auto matches_per_frame_it = matches_per_frame_.find(rfh);
155 if (int matches_delta = number_of_matches - matches_per_frame_it->second) { 157 number_of_matches_ += number_of_matches - matches_per_frame_it->second;
156 // Increment the global number of matches by the number of additional 158 matches_per_frame_it->second = number_of_matches;
157 // matches found for this frame.
158 number_of_matches_ += matches_delta;
159 matches_per_frame_it->second = number_of_matches;
160
161 // The active match ordinal may need updating since the number of matches
162 // before the active match may have changed.
163 if (rfh != active_frame_)
164 UpdateActiveMatchOrdinal();
165 }
166 } 159 }
167 160
168 // Check for an update to the selection rect. 161 // Check for an update to the selection rect.
169 if (!selection_rect.IsEmpty()) 162 if (!selection_rect.IsEmpty())
170 selection_rect_ = selection_rect; 163 selection_rect_ = selection_rect;
171 164
172 // Check for an update to the active match ordinal. 165 // Check for an update to the active match ordinal.
173 if (active_match_ordinal > 0) { 166 if (active_match_ordinal > 0) {
174 if (rfh == active_frame_) { 167 if (rfh == active_frame_) {
175 active_match_ordinal_ += 168 active_match_ordinal_ +=
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 // New version of rects has been received, so update the data. 339 // New version of rects has been received, so update the data.
347 match_rects_.frame_rects[rfh] = FrameRects(rects, version); 340 match_rects_.frame_rects[rfh] = FrameRects(rects, version);
348 ++match_rects_.known_version; 341 ++match_rects_.known_version;
349 } 342 }
350 if (!active_rect.IsEmpty()) 343 if (!active_rect.IsEmpty())
351 match_rects_.active_rect = active_rect; 344 match_rects_.active_rect = active_rect;
352 RemoveFindMatchRectsPendingReply(rfh); 345 RemoveFindMatchRectsPendingReply(rfh);
353 } 346 }
354 #endif 347 #endif
355 348
356 void FindRequestManager::DidFinishLoad(RenderFrameHost* rfh,
357 const GURL& validated_url) {
358 if (current_session_id_ == kInvalidId)
359 return;
360
361 RemoveFrame(rfh);
362 AddFrame(rfh, true /* force */);
363 }
364
365 void FindRequestManager::RenderFrameDeleted(RenderFrameHost* rfh) { 349 void FindRequestManager::RenderFrameDeleted(RenderFrameHost* rfh) {
366 RemoveFrame(rfh); 350 RemoveFrame(rfh);
367 } 351 }
368 352
369 void FindRequestManager::RenderFrameHostChanged(RenderFrameHost* old_host, 353 void FindRequestManager::RenderFrameHostChanged(RenderFrameHost* old_host,
370 RenderFrameHost* new_host) { 354 RenderFrameHost* new_host) {
371 RemoveFrame(old_host); 355 RemoveFrame(old_host);
372 } 356 }
373 357
374 void FindRequestManager::FrameDeleted(RenderFrameHost* rfh) { 358 void FindRequestManager::FrameDeleted(RenderFrameHost* rfh) {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 398
415 SendFindIPC(request, target_rfh); 399 SendFindIPC(request, target_rfh);
416 current_request_ = request; 400 current_request_ = request;
417 pending_active_match_ordinal_ = true; 401 pending_active_match_ordinal_ = true;
418 return; 402 return;
419 } 403 }
420 404
421 // This is an initial find operation. 405 // This is an initial find operation.
422 Reset(request); 406 Reset(request);
423 for (FrameTreeNode* node : contents_->GetFrameTree()->Nodes()) 407 for (FrameTreeNode* node : contents_->GetFrameTree()->Nodes())
424 AddFrame(node->current_frame_host(), false /* force */); 408 AddFrame(node->current_frame_host());
425 } 409 }
426 410
427 void FindRequestManager::AdvanceQueue(int request_id) { 411 void FindRequestManager::AdvanceQueue(int request_id) {
428 if (find_request_queue_.empty() || 412 if (find_request_queue_.empty() ||
429 request_id != find_request_queue_.front().id) { 413 request_id != find_request_queue_.front().id) {
430 return; 414 return;
431 } 415 }
432 416
433 find_request_queue_.pop(); 417 find_request_queue_.pop();
434 if (!find_request_queue_.empty()) 418 if (!find_request_queue_.empty())
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
493 // |matches_only|. 477 // |matches_only|.
494 return node->current_frame_host(); 478 return node->current_frame_host();
495 } 479 }
496 if (wrap && node->current_frame_host() == from_rfh) 480 if (wrap && node->current_frame_host() == from_rfh)
497 return nullptr; 481 return nullptr;
498 } 482 }
499 483
500 return nullptr; 484 return nullptr;
501 } 485 }
502 486
503 void FindRequestManager::AddFrame(RenderFrameHost* rfh, bool force) { 487 void FindRequestManager::AddFrame(RenderFrameHost* rfh) {
504 if (!rfh || !rfh->IsRenderFrameLive()) 488 if (!rfh || !rfh->IsRenderFrameLive())
505 return; 489 return;
506 490
507 // A frame that is already being searched should not normally be added again. 491 // A frame that is already being searched should not be added again.
508 DCHECK(force || !CheckFrame(rfh)); 492 DCHECK(!CheckFrame(rfh));
509 493
510 matches_per_frame_[rfh] = 0; 494 matches_per_frame_[rfh] = 0;
511 495
512 FindRequest request = current_request_; 496 FindRequest request = current_request_;
513 request.id = current_session_id_; 497 request.id = current_session_id_;
514 request.options.findNext = false; 498 request.options.findNext = false;
515 request.options.force = force;
516 SendFindIPC(request, rfh); 499 SendFindIPC(request, rfh);
517 } 500 }
518 501
519 bool FindRequestManager::CheckFrame(RenderFrameHost* rfh) const { 502 bool FindRequestManager::CheckFrame(RenderFrameHost* rfh) const {
520 return rfh && matches_per_frame_.count(rfh); 503 return rfh && matches_per_frame_.count(rfh);
521 } 504 }
522 505
523 void FindRequestManager::UpdateActiveMatchOrdinal() { 506 void FindRequestManager::UpdateActiveMatchOrdinal() {
524 active_match_ordinal_ = 0; 507 active_match_ordinal_ = 0;
525 508
(...skipping 12 matching lines...) Expand all
538 false /* wrap */)) != nullptr) { 521 false /* wrap */)) != nullptr) {
539 active_match_ordinal_ += matches_per_frame_[frame]; 522 active_match_ordinal_ += matches_per_frame_[frame];
540 } 523 }
541 active_match_ordinal_ += relative_active_match_ordinal_; 524 active_match_ordinal_ += relative_active_match_ordinal_;
542 } 525 }
543 526
544 void FindRequestManager::FinalUpdateReceived(int request_id, 527 void FindRequestManager::FinalUpdateReceived(int request_id,
545 RenderFrameHost* rfh) { 528 RenderFrameHost* rfh) {
546 if (!number_of_matches_ || 529 if (!number_of_matches_ ||
547 (active_match_ordinal_ && !pending_active_match_ordinal_) || 530 (active_match_ordinal_ && !pending_active_match_ordinal_) ||
548 pending_find_next_reply_) { 531 request_id != current_request_.id) {
549 // All the find results for |request_id| are in and ready to report. Note 532 // All the find results for |request_id| are in and ready to report. Note
550 // that |final_update| will be set to false if there are still pending 533 // that |final_update| will be set to false if there are still pending
551 // replies expected from the initial find request. 534 // replies expected from the initial find request.
552 NotifyFindReply(request_id, 535 NotifyFindReply(request_id,
553 pending_initial_replies_.empty() /* final_update */); 536 pending_initial_replies_.empty() /* final_update */);
554 AdvanceQueue(request_id); 537 AdvanceQueue(request_id);
555 return; 538 return;
556 } 539 }
557 540
558 // There are matches, but no active match was returned, so another find next 541 // There are matches, but no active match was returned, so another find next
559 // request must be sent. 542 // request must be sent.
560 543
561 RenderFrameHost* target_rfh; 544 RenderFrameHost* target_rfh;
562 if (request_id == current_request_.id && current_request_.options.findNext) { 545 if (current_request_.options.findNext) {
563 // If this was a find next operation, then the active match will be in the 546 // If this was a find next operation, then the active match will be in the
564 // next frame with matches after this one. 547 // next frame with matches after this one.
565 target_rfh = Traverse(rfh, 548 target_rfh = Traverse(rfh,
566 current_request_.options.forward, 549 current_request_.options.forward,
567 true /* matches_only */, 550 true /* matches_only */,
568 true /* wrap */); 551 true /* wrap */);
569 } else if ((target_rfh = contents_->GetFocusedFrame()) != nullptr) { 552 } else if ((target_rfh = contents_->GetFocusedFrame()) != nullptr) {
570 // Otherwise, if there is a focused frame, then the active match will be in 553 // Otherwise, if there is a focused frame, then the active match will be in
571 // the next frame with matches after that one. 554 // the next frame with matches after that one.
572 target_rfh = Traverse(target_rfh, 555 target_rfh = Traverse(target_rfh,
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
636 aggregate_rects.end(), frame_rects.begin(), frame_rects.end()); 619 aggregate_rects.end(), frame_rects.begin(), frame_rects.end());
637 } 620 }
638 } 621 }
639 contents_->NotifyFindMatchRectsReply( 622 contents_->NotifyFindMatchRectsReply(
640 match_rects_.known_version, aggregate_rects, match_rects_.active_rect); 623 match_rects_.known_version, aggregate_rects, match_rects_.active_rect);
641 } 624 }
642 } 625 }
643 #endif 626 #endif
644 627
645 } // namespace content 628 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/find_request_manager.h ('k') | content/browser/find_request_manager_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698