summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkeishi@chromium.org <keishi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-18 01:21:00 +0000
committerkeishi@chromium.org <keishi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-18 01:21:00 +0000
commit316db2e3e199e8857d686e29584697768ab62a70 (patch)
tree960c5731d6a0b902930328ae54462232401855dd
parent577f3711b105dc0ab2921773acbdc4d3848d55ed (diff)
downloadchromium_src-316db2e3e199e8857d686e29584697768ab62a70.zip
chromium_src-316db2e3e199e8857d686e29584697768ab62a70.tar.gz
chromium_src-316db2e3e199e8857d686e29584697768ab62a70.tar.bz2
Merge 102688 - 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 TBR=keishi@chromium.org Review URL: http://codereview.chromium.org/8329008 git-svn-id: svn://svn.chromium.org/chrome/branches/874/src@105989 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/autocomplete/autocomplete_popup_model.cc27
-rw-r--r--chrome/browser/autocomplete/autocomplete_popup_model_unittest.cc118
-rw-r--r--chrome/chrome_tests.gypi1
3 files changed, 125 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");
+}
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi
index fe2be86..3e4ef87 100644
--- a/chrome/chrome_tests.gypi
+++ b/chrome/chrome_tests.gypi
@@ -1273,6 +1273,7 @@
'browser/accessibility/browser_accessibility_win_unittest.cc',
'browser/app_controller_mac_unittest.mm',
'browser/autocomplete/autocomplete_edit_unittest.cc',
+ 'browser/autocomplete/autocomplete_popup_model_unittest.cc',
'browser/autocomplete/autocomplete_result_unittest.cc',
'browser/autocomplete/autocomplete_unittest.cc',
'browser/autocomplete/builtin_provider_unittest.cc',