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

Unified Diff: chrome/browser/autocomplete/autocomplete_popup_model.cc

Issue 6340012: Fix a DCHECK failure in AutocompleteEditModel::OnPopupDataChanged() (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Wrap long lines. Created 9 years, 11 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/autocomplete/autocomplete_popup_model.cc
diff --git a/chrome/browser/autocomplete/autocomplete_popup_model.cc b/chrome/browser/autocomplete/autocomplete_popup_model.cc
index 588683dc4b96148ec578265f0f47516c8cd3aae8..d683a73c9a35bc8e55d3116686a9aa01f688d4da 100644
--- a/chrome/browser/autocomplete/autocomplete_popup_model.cc
+++ b/chrome/browser/autocomplete/autocomplete_popup_model.cc
@@ -122,12 +122,21 @@ void AutocompletePopupModel::SetSelectedLine(size_t line,
// that when the edit notifies its controller that something has changed, the
// controller can get the correct updated data.
//
- // NOTE: We should never reach here with no selected line; the same code that
- // opened the popup and made it possible to get here should have also set a
- // selected line.
- CHECK(selected_line_ != kNoMatch);
- GURL current_destination(result.match_at(selected_line_).destination_url);
- view_->InvalidateLine(selected_line_);
+ // |selected_line_| could be kNoMatch only when the previously selected line
+ // has just been deleted. In this case, the |edit_model_| has already been
+ // reverted to the default match, so we need to use the default match for
+ // |current_destination|, to make sure |edit_model_| can record it properly.
+ // This step is necessary because the default match may have been changed if
+ // the deleted item was the default match.
+ GURL current_destination;
+ if (selected_line_ != kNoMatch) {
+ current_destination = result.match_at(selected_line_).destination_url;
+ view_->InvalidateLine(selected_line_);
+ } else {
+ // We must have a default match if we get here.
+ CHECK(result.default_match() != result.end());
+ current_destination = result.default_match()->destination_url;
+ }
selected_line_ = line;
view_->InvalidateLine(selected_line_);
@@ -288,6 +297,9 @@ void AutocompletePopupModel::TryDeletingCurrentItem() {
// the results have changed.
const AutocompleteResult& result = controller_->result();
if (!result.empty()) {
Peter Kasting 2011/01/24 23:25:52 If I'm not mistaken, we can change this conditiona
James Su 2011/01/25 02:24:55 It has an issue for the deleting default match cas
Peter Kasting 2011/01/25 02:36:20 But your code has an opposite problem: If we don't
James Su 2011/01/25 02:51:51 Isn't that guaranteed by above if (match.deletable
Peter Kasting 2011/01/25 04:23:20 Why don't we do this: Add a DCHECK(updated_latest_
James Su 2011/01/25 05:30:11 I just checked the source code, and yes it's proba
+ // Set |selected_line_| to kNoMatch to forcely select the line, even if
Peter Kasting 2011/01/24 23:25:52 I think if we change the conditional as I note abo
James Su 2011/01/25 02:24:55 See above.
Peter Kasting 2011/01/25 02:36:20 OK, but I still think this can be done more cleanl
James Su 2011/01/25 02:51:51 Ok I'll do it. It's actually my original approach.
+ // the value is not changed at all.
+ selected_line_ = kNoMatch;
// Move the selection to the next choice after the deleted one.
// SetSelectedLine() will clamp to take care of the case where we deleted
// the last item.
@@ -311,6 +323,9 @@ void AutocompletePopupModel::Observe(NotificationType type,
kNoMatch : static_cast<size_t>(result->default_match() - result->begin());
// There had better not be a nonempty result set with no default match.
CHECK((selected_line_ != kNoMatch) || result->empty());
+ // We need to clear |manually_selected_match_|, as |selected_line_| has been
+ // reverted to the default match.
Peter Kasting 2011/01/24 23:25:52 Nit: I don't think this comment is necessary; it's
James Su 2011/01/25 02:24:55 Done.
+ manually_selected_match_.Clear();
// If we're going to trim the window size to no longer include the hovered
// line, turn hover off. Practically, this shouldn't happen, but it
// doesn't hurt to be defensive.

Powered by Google App Engine
This is Rietveld 408576698