Index: chrome/browser/ui/views/find_bar_view.cc |
diff --git a/chrome/browser/ui/views/find_bar_view.cc b/chrome/browser/ui/views/find_bar_view.cc |
index dcc61fc7cf2b9c500e9492db40dac393802e4336..6a998a320f34e93294a147838035c27f4a13f06d 100644 |
--- a/chrome/browser/ui/views/find_bar_view.cc |
+++ b/chrome/browser/ui/views/find_bar_view.cc |
@@ -397,37 +397,12 @@ void FindBarView::ButtonPressed( |
void FindBarView::ContentsChanged(views::Textfield* sender, |
const string16& new_contents) { |
- FindBarController* controller = find_bar_host()->GetFindBarController(); |
- DCHECK(controller); |
- content::WebContents* web_contents = controller->web_contents(); |
- // We must guard against a NULL web_contents, which can happen if the text |
- // in the Find box is changed right after the tab is destroyed. Otherwise, it |
- // can lead to crashes, as exposed by automation testing in issue 8048. |
- if (!web_contents) |
- return; |
- FindTabHelper* find_tab_helper = FindTabHelper::FromWebContents(web_contents); |
- |
- // When the user changes something in the text box we check the contents and |
- // if the textbox contains something we set it as the new search string and |
- // initiate search (even though old searches might be in progress). |
- if (!new_contents.empty()) { |
- // The last two params here are forward (true) and case sensitive (false). |
- find_tab_helper->StartFinding(new_contents, true, false); |
- } else { |
- find_tab_helper->StopFinding(FindBarController::kClearSelectionOnPage); |
- UpdateForResult(find_tab_helper->find_result(), string16()); |
- find_bar_host()->MoveWindowIfNecessary(gfx::Rect(), false); |
- |
- // Clearing the text box should clear the prepopulate state so that when |
- // we close and reopen the Find box it doesn't show the search we just |
- // deleted. We can't do this on ChromeOS yet because we get ContentsChanged |
- // sent for a lot more things than just the user nulling out the search |
- // terms. See http://crbug.com/45372. |
- Profile* profile = |
- Profile::FromBrowserContext(web_contents->GetBrowserContext()); |
- FindBarState* find_bar_state = FindBarStateFactory::GetForProfile(profile); |
- find_bar_state->set_last_prepopulate_text(string16()); |
- } |
+ // TextfieldController::OnAfterUserAction() is supported only by Views |
+ // implementation, and NativeTextfieldWin doesn't call OnAfterUserAction(). |
+ // Call DoFinding() here. |
+ // TODO(yukishiino): Remove this code after the migration to Views. |
+ if (!views::Textfield::IsViewsTextfieldEnabled()) |
+ DoFinding(sender); |
} |
bool FindBarView::HandleKeyEvent(views::Textfield* sender, |
@@ -457,6 +432,16 @@ bool FindBarView::HandleKeyEvent(views::Textfield* sender, |
return false; |
} |
+void FindBarView::OnAfterUserAction(views::Textfield* sender) { |
+ // The composition text wouldn't be what the user is really looking for. |
+ // We delay the search until the user commits the composition text. |
+ if (sender->IsIMEComposing() || |
+ sender->text() == last_searched_text_) |
msw
2013/06/04 01:30:23
nit: this fits on the line above; also invert the
Yuki
2013/06/04 03:35:04
Done.
|
+ return; |
+ |
+ DoFinding(sender); |
+} |
+ |
void FindBarView::OnAfterCutOrCopy() { |
Profile* profile = host()->browser_view()->browser()->profile(); |
ui::SourceTag source_tag = |
@@ -474,6 +459,50 @@ void FindBarView::OnAfterCutOrCopy() { |
} |
} |
+void FindBarView::OnAfterPaste() { |
+ // Clear the last search text so we always search for the user input after |
+ // a paste operation, even if the pasted text is the same as before. |
+ // See http://crbug.com/79002 |
+ last_searched_text_.clear(); |
+} |
+ |
+void FindBarView::DoFinding(views::Textfield* sender) { |
+ FindBarController* controller = find_bar_host()->GetFindBarController(); |
+ DCHECK(controller); |
+ content::WebContents* web_contents = controller->web_contents(); |
+ // We must guard against a NULL web_contents, which can happen if the text |
+ // in the Find box is changed right after the tab is destroyed. Otherwise, it |
+ // can lead to crashes, as exposed by automation testing in issue 8048. |
+ if (!web_contents) |
+ return; |
+ FindTabHelper* find_tab_helper = FindTabHelper::FromWebContents(web_contents); |
+ |
+ const string16& search_text = sender->text(); |
+ last_searched_text_ = search_text; |
+ |
+ // When the user changes something in the text box we check the contents and |
+ // if the textbox contains something we set it as the new search string and |
+ // initiate search (even though old searches might be in progress). |
+ if (!search_text.empty()) { |
+ // The last two params here are forward (true) and case sensitive (false). |
+ find_tab_helper->StartFinding(search_text, true, false); |
+ } else { |
+ find_tab_helper->StopFinding(FindBarController::kClearSelectionOnPage); |
+ UpdateForResult(find_tab_helper->find_result(), string16()); |
+ find_bar_host()->MoveWindowIfNecessary(gfx::Rect(), false); |
+ |
+ // Clearing the text box should clear the prepopulate state so that when |
+ // we close and reopen the Find box it doesn't show the search we just |
+ // deleted. We can't do this on ChromeOS yet because we get ContentsChanged |
+ // sent for a lot more things than just the user nulling out the search |
+ // terms. See http://crbug.com/45372. |
+ Profile* profile = |
+ Profile::FromBrowserContext(web_contents->GetBrowserContext()); |
+ FindBarState* find_bar_state = FindBarStateFactory::GetForProfile(profile); |
+ find_bar_state->set_last_prepopulate_text(string16()); |
+ } |
+} |
+ |
void FindBarView::UpdateMatchCountAppearance(bool no_match) { |
if (no_match) { |
match_count_text_->SetBackgroundColor(kBackgroundColorNoMatch); |