diff options
author | keishi@chromium.org <keishi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-26 02:45:53 +0000 |
---|---|---|
committer | keishi@chromium.org <keishi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-26 02:45:53 +0000 |
commit | 746b824e301ca413188ad074ff9ea17cc0447e82 (patch) | |
tree | 55b5da2c8be4e4df41e616c05bb0f340cafc5055 /chrome/browser/autocomplete | |
parent | b67fb930ca28a39b12cb40c769321df52cd0ddae (diff) | |
download | chromium_src-746b824e301ca413188ad074ff9ea17cc0447e82.zip chromium_src-746b824e301ca413188ad074ff9ea17cc0447e82.tar.gz chromium_src-746b824e301ca413188ad074ff9ea17cc0447e82.tar.bz2 |
Omnibox enters keyword search mode incorrectly
Happens when input starts with default search engine keyword.
BUG=95454
TEST=1. Set default search engine keyword to 'g'. 2. Type 'grand canyon' into omnibox. 3. Confirm that it is not in keyword search mode.
Review URL: http://codereview.chromium.org/7754008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@102688 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/autocomplete')
-rw-r--r-- | chrome/browser/autocomplete/autocomplete_popup_model.cc | 27 | ||||
-rw-r--r-- | chrome/browser/autocomplete/autocomplete_popup_model_unittest.cc | 118 |
2 files changed, 124 insertions, 21 deletions
diff --git a/chrome/browser/autocomplete/autocomplete_popup_model.cc b/chrome/browser/autocomplete/autocomplete_popup_model.cc index 041e1f0..0cc2412 100644 --- a/chrome/browser/autocomplete/autocomplete_popup_model.cc +++ b/chrome/browser/autocomplete/autocomplete_popup_model.cc @@ -132,27 +132,12 @@ bool AutocompletePopupModel::GetKeywordForMatch(const AutocompleteMatch& match, // Assume we have no keyword until we find otherwise. keyword->clear(); - if (match.template_url) { - TemplateURLService* url_service = - TemplateURLServiceFactory::GetForProfile(edit_model_->profile()); - if (!url_service) - return false; - - // Only show the keyword for the default provider if the user typed in - // the keyword and it isn't SEARCH_WHAT_YOU_TYPED. - const TemplateURL* default_url = url_service->GetDefaultSearchProvider(); - if (default_url && (default_url->id() == match.template_url->id())) { - if (StartsWith(autocomplete_controller()->input().text(), - default_url->keyword(), false) && - (match.type != AutocompleteMatch::SEARCH_WHAT_YOU_TYPED)) { - keyword->assign(match.template_url->keyword()); - return false; - } - } else if (TemplateURL::SupportsReplacement(match.template_url)) { - // The current match is a keyword, return that as the selected keyword. - keyword->assign(match.template_url->keyword()); - return false; - } + if (match.template_url && + TemplateURL::SupportsReplacement(match.template_url) && + match.transition == PageTransition::KEYWORD) { + // The current match is a keyword, return that as the selected keyword. + keyword->assign(match.template_url->keyword()); + return false; } // See if the current match's fill_into_edit corresponds to a keyword. diff --git a/chrome/browser/autocomplete/autocomplete_popup_model_unittest.cc b/chrome/browser/autocomplete/autocomplete_popup_model_unittest.cc new file mode 100644 index 0000000..e952df1 --- /dev/null +++ b/chrome/browser/autocomplete/autocomplete_popup_model_unittest.cc @@ -0,0 +1,118 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/autocomplete/autocomplete_popup_model.h" + +#include "base/utf_string_conversions.h" +#include "chrome/browser/autocomplete/autocomplete_match.h" +#include "chrome/browser/search_engines/template_url.h" +#include "chrome/browser/search_engines/template_url_service.h" +#include "chrome/browser/search_engines/template_url_service_factory.h" +#include "chrome/test/base/testing_profile.h" +#include "testing/gtest/include/gtest/gtest.h" + +class AutoCompletePopupModelTest : public testing::Test { + public: + AutoCompletePopupModelTest() { + } + + virtual void SetUp(); + virtual void TearDown(); + + protected: + AutocompleteMatch CreateMatch(const string16& keyword, + const string16& query_string, + AutocompleteMatch::Type type); + void RunTest(const char* input, AutocompleteMatch::Type type, + const char* keyword); + + scoped_ptr<TestingProfile> profile_; + scoped_ptr<AutocompletePopupModel> model_; + scoped_ptr<AutocompleteEditModel> edit_model_; +}; + +void AutoCompletePopupModelTest::SetUp() { + profile_.reset(new TestingProfile()); + profile_->CreateTemplateURLService(); + edit_model_.reset(new AutocompleteEditModel(NULL, NULL, profile_.get())); + model_.reset(new AutocompletePopupModel(NULL, edit_model_.get())); + + TemplateURLService* turl_model = + TemplateURLServiceFactory::GetForProfile(profile_.get()); + + turl_model->Load(); + + // Reset the default TemplateURL. + TemplateURL* default_t_url = new TemplateURL(); + default_t_url->set_keyword(ASCIIToUTF16("t")); + default_t_url->SetURL("http://defaultturl/{searchTerms}", 0, 0); + turl_model->Add(default_t_url); + turl_model->SetDefaultSearchProvider(default_t_url); + ASSERT_NE(0, default_t_url->id()); + + // Create another TemplateURL for KeywordProvider. + TemplateURL* keyword_t_url = new TemplateURL(); + keyword_t_url->set_short_name(ASCIIToUTF16("k")); + keyword_t_url->set_keyword(ASCIIToUTF16("k")); + keyword_t_url->SetURL("http://keyword/{searchTerms}", 0, 0); + turl_model->Add(keyword_t_url); + ASSERT_NE(0, keyword_t_url->id()); +} + +void AutoCompletePopupModelTest::TearDown() { + profile_.reset(); + model_.reset(); + edit_model_.reset(); +} + +AutocompleteMatch AutoCompletePopupModelTest::CreateMatch( + const string16& keyword, + const string16& query_string, + AutocompleteMatch::Type type) { + AutocompleteMatch match(NULL, 0, false, type); + match.contents = query_string; + TemplateURLService* template_url_service = + TemplateURLServiceFactory::GetForProfile(profile_.get()); + if (!keyword.empty()) { + const TemplateURL* template_url = + template_url_service->GetTemplateURLForKeyword(keyword); + match.template_url = + TemplateURL::SupportsReplacement(template_url) ? template_url : NULL; + } + if (match.template_url) + match.fill_into_edit = match.template_url->keyword() + char16(' '); + else + match.template_url = template_url_service->GetDefaultSearchProvider(); + match.fill_into_edit.append(query_string); + match.transition = keyword.empty() ? + PageTransition::GENERATED : PageTransition::KEYWORD; + return match; +} + +void AutoCompletePopupModelTest::RunTest(const char* input, + AutocompleteMatch::Type type, + const char* keyword) { + string16 keyword16(ASCIIToUTF16(keyword)); + string16 detected_keyword; + EXPECT_FALSE(model_->GetKeywordForMatch( + CreateMatch(keyword16, ASCIIToUTF16(input), type), &detected_keyword)); + EXPECT_EQ(keyword16, detected_keyword); +} + +TEST_F(AutoCompletePopupModelTest, GetKeywordForMatch) { + string16 keyword; + + // Possible matches when the input is "tfoo" + RunTest("tfoo", AutocompleteMatch::SEARCH_WHAT_YOU_TYPED, ""); + RunTest("tfoo", AutocompleteMatch::SEARCH_HISTORY, ""); + RunTest("tfoo", AutocompleteMatch::SEARCH_SUGGEST, ""); + + // Possible matches when the input is "t foo" + RunTest("foo", AutocompleteMatch::SEARCH_HISTORY, "t"); + RunTest("foo", AutocompleteMatch::SEARCH_OTHER_ENGINE, "t"); + + // Possible matches when the input is "k foo" + RunTest("foo", AutocompleteMatch::SEARCH_HISTORY, "k"); + RunTest("foo", AutocompleteMatch::SEARCH_OTHER_ENGINE, "k"); +} |