Index: content/browser/find_request_manager.cc |
diff --git a/content/browser/find_request_manager.cc b/content/browser/find_request_manager.cc |
index ba97753698a77a8e8f00fe80181909fb083d17a5..09415ec800a4785b62fea855aad2bb9c5ddcc7a3 100644 |
--- a/content/browser/find_request_manager.cc |
+++ b/content/browser/find_request_manager.cc |
@@ -91,6 +91,7 @@ FindRequestManager::FindRequestManager(WebContentsImpl* web_contents) |
: WebContentsObserver(web_contents), |
contents_(web_contents), |
current_session_id_(kInvalidId), |
+ pending_find_next_reply_(nullptr), |
pending_active_match_ordinal_(false), |
number_of_matches_(0), |
active_frame_(nullptr), |
@@ -190,16 +191,27 @@ void FindRequestManager::OnFindReply(RenderFrameHost* rfh, |
// This is the final update for this frame for the current find operation. |
- pending_replies_.erase(rfh); |
- if (request_id == current_session_id_ && !pending_replies_.empty()) { |
- NotifyFindReply(request_id, false /* final_update */); |
+ pending_initial_replies_.erase(rfh); |
+ if (request_id == current_session_id_ && !pending_initial_replies_.empty()) |
lfg
2016/08/18 18:50:42
Why did you remove the NotifyFindReply() from this
paulmeyer
2016/08/29 22:27:41
I can't remember why I did that. It may have been
|
return; |
- } |
- DCHECK(request_id == current_session_id_ || |
- current_request_.options.findNext); |
// This is the final update for the current find operation. |
- FinalUpdate(request_id, rfh); |
+ |
+ if (request_id == current_request_.id && request_id != current_session_id_) { |
+ DCHECK(current_request_.options.findNext); |
+ DCHECK(pending_find_next_reply_ == rfh); |
lfg
2016/08/18 18:50:42
nit: DCHECK_EQ.
paulmeyer
2016/08/29 22:27:41
Done.
|
+ pending_find_next_reply_ = nullptr; |
+ } |
+ |
+ // The find results are normally reported under the ID of the find reply they |
+ // came from (|request_id|), but if this really is the last update, then they |
+ // need to be reported with the latest find request ID |
+ // (|current_request_.id|), so that the receiver can know for sure that all |
+ // issued find requests have completed. |
lfg
2016/08/18 18:50:42
See my comment above, I don't think we should ever
paulmeyer
2016/08/29 22:27:41
Done.
|
+ int report_id = request_id; |
+ if (pending_initial_replies_.empty() && !pending_find_next_reply_) |
+ report_id = current_request_.id; |
+ FinalUpdate(report_id, rfh); |
} |
void FindRequestManager::RemoveFrame(RenderFrameHost* rfh) { |
@@ -218,6 +230,7 @@ void FindRequestManager::RemoveFrame(RenderFrameHost* rfh) { |
if (active_frame_ == rfh) { |
active_frame_ = nullptr; |
relative_active_match_ordinal_ = 0; |
+ selection_rect_ = gfx::Rect(); |
} |
UpdateActiveMatchOrdinal(); |
@@ -239,17 +252,28 @@ void FindRequestManager::RemoveFrame(RenderFrameHost* rfh) { |
RemoveFindMatchRectsPendingReply(rfh); |
#endif |
- if (pending_replies_.count(rfh)) { |
+ // If no pending find replies are expected for the removed frame, then just |
+ // report the updated results. |
+ if (!pending_initial_replies_.count(rfh) && pending_find_next_reply_ != rfh) { |
+ bool final_update = |
+ pending_initial_replies_.empty() && !pending_find_next_reply_; |
+ NotifyFindReply(current_session_id_, final_update); |
lfg
2016/08/18 18:50:42
I don't understand why we avoid calling FinalUpdat
paulmeyer
2016/08/29 22:27:41
See comment on FinalUpdate(). In this case, a fram
lfg
2016/08/30 14:57:38
Is it possible that the final update will be sent
paulmeyer
2016/08/30 15:40:12
Yes, that is possible, and intended. Once all fram
|
+ return; |
+ } |
+ |
+ if (pending_initial_replies_.count(rfh)) { |
// A reply should not be expected from the removed frame. |
- pending_replies_.erase(rfh); |
- if (pending_replies_.empty()) { |
- FinalUpdate(current_request_.id, rfh); |
- return; |
+ pending_initial_replies_.erase(rfh); |
+ if (pending_initial_replies_.empty()) { |
+ FinalUpdate(current_session_id_, rfh); |
lfg
2016/08/18 18:50:42
Do we want to send a FinalUpdate if pending_find_n
paulmeyer
2016/08/29 22:27:41
See comment on FinalUpdate().
|
} |
} |
- NotifyFindReply(current_session_id_, |
- pending_replies_.empty() /* final_update */); |
+ if (pending_find_next_reply_ == rfh) { |
+ // A reply should not be expected from the removed frame. |
+ pending_find_next_reply_ = nullptr; |
+ FinalUpdate(current_request_.id, rfh); |
lfg
2016/08/18 18:50:42
Same as above, do we want to send a FinalUpdate if
paulmeyer
2016/08/29 22:27:41
See comment on FinalUpdate().
|
+ } |
} |
#if defined(OS_ANDROID) |
@@ -264,7 +288,7 @@ void FindRequestManager::ActivateNearestFindResult(float x, float y) { |
for (FrameTreeNode* node : contents_->GetFrameTree()->Nodes()) { |
RenderFrameHost* rfh = node->current_frame_host(); |
- if (!CheckFrame(rfh)) |
+ if (!CheckFrame(rfh) || !rfh->IsRenderFrameLive()) |
continue; |
activate_.pending_replies.insert(rfh); |
@@ -299,7 +323,7 @@ void FindRequestManager::RequestFindMatchRects(int current_version) { |
for (FrameTreeNode* node : contents_->GetFrameTree()->Nodes()) { |
RenderFrameHost* rfh = node->current_frame_host(); |
- if (!CheckFrame(rfh)) |
+ if (!CheckFrame(rfh) || !rfh->IsRenderFrameLive()) |
continue; |
match_rects_.pending_replies.insert(rfh); |
@@ -343,7 +367,8 @@ void FindRequestManager::FrameDeleted(RenderFrameHost* rfh) { |
void FindRequestManager::Reset(const FindRequest& initial_request) { |
current_session_id_ = initial_request.id; |
current_request_ = initial_request; |
- pending_replies_.clear(); |
+ pending_initial_replies_.clear(); |
+ pending_find_next_reply_ = nullptr; |
pending_active_match_ordinal_ = true; |
matches_per_frame_.clear(); |
number_of_matches_ = 0; |
@@ -400,7 +425,14 @@ void FindRequestManager::AdvanceQueue(int request_id) { |
void FindRequestManager::SendFindIPC(const FindRequest& request, |
RenderFrameHost* rfh) { |
- pending_replies_.insert(rfh); |
+ DCHECK(CheckFrame(rfh)); |
+ DCHECK(rfh->IsRenderFrameLive()); |
+ |
+ if (request.options.findNext) |
+ pending_find_next_reply_ = rfh; |
+ else |
+ pending_initial_replies_.insert(rfh); |
+ |
rfh->Send(new FrameMsg_Find(rfh->GetRoutingID(), request.id, |
request.search_text, request.options)); |
} |
@@ -437,7 +469,7 @@ RenderFrameHost* FindRequestManager::Traverse(RenderFrameHost* from_rfh, |
continue; |
RenderFrameHost* current_rfh = node->current_frame_host(); |
if (!matches_only || matches_per_frame_.find(current_rfh)->second || |
- pending_replies_.count(current_rfh)) { |
+ pending_initial_replies_.count(current_rfh)) { |
// Note that if there is still a pending reply expected for this frame, |
// then it may have unaccounted matches and will not be skipped via |
// |matches_only|. |
@@ -466,7 +498,7 @@ void FindRequestManager::AddFrame(RenderFrameHost* rfh) { |
} |
bool FindRequestManager::CheckFrame(RenderFrameHost* rfh) const { |
- return rfh && rfh->IsRenderFrameLive() && matches_per_frame_.count(rfh); |
+ return rfh && matches_per_frame_.count(rfh); |
lfg
2016/08/18 18:50:42
I don't understand the reason for this change.
paulmeyer
2016/08/29 22:27:41
I discovered that I don't actually want to check I
lfg
2016/08/30 14:57:38
Can you add add a comment in the places that this
paulmeyer
2016/08/30 15:40:12
I don't think that is necessary. If you look at th
lfg
2016/08/30 15:43:23
Acknowledged.
|
} |
void FindRequestManager::UpdateActiveMatchOrdinal() { |
@@ -492,9 +524,13 @@ void FindRequestManager::UpdateActiveMatchOrdinal() { |
void FindRequestManager::FinalUpdate(int request_id, RenderFrameHost* rfh) { |
if (!number_of_matches_ || |
- !pending_active_match_ordinal_ || |
+ (active_match_ordinal_ && !pending_active_match_ordinal_) || |
request_id != current_request_.id) { |
- NotifyFindReply(request_id, true /* final_update */); |
+ // All the find results for |request_id| are in and ready to report. Note |
+ // that |final_update| will be set to false if there are still pending |
+ // replies expected from the initial find request. |
+ NotifyFindReply(request_id, |
+ pending_initial_replies_.empty() /* final_update */); |
lfg
2016/08/18 18:50:42
The fact that FinalUpdate() doesn't always send a
paulmeyer
2016/08/29 22:27:41
FinalUpdate() is called once all the replies have
lfg
2016/08/30 14:57:38
Can you update the comment on the header to reflec
paulmeyer
2016/08/30 15:40:12
Done. I also renamed FinalUpdate() to FinalUpdateR
|
AdvanceQueue(request_id); |
return; |
} |