172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h" 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autocomplete/autocomplete.h" 11513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/autocomplete/autocomplete_match.h" 124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/autocomplete/keyword_provider.h" 134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/autocomplete/search_provider.h" 144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/search_engines/template_url.h" 154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/search_engines/template_url_model.h" 16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/test/testing_browser_process.h" 17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/test/testing_browser_process_test.h" 184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/test/testing_profile.h" 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_observer.h" 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h" 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic std::ostream& operator<<(std::ostream& os, 25731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const AutocompleteResult::const_iterator& it) { 26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return os << static_cast<const AutocompleteMatch*>(&(*it)); 27731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace { 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst size_t num_results_per_provider = 3; 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Autocomplete provider that provides known results. Note that this is 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// refcounted so that it can also be a task on the message loop. 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TestProvider : public AutocompleteProvider { 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TestProvider(int relevance, const string16& prefix) 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : AutocompleteProvider(NULL, NULL, ""), 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch relevance_(relevance), 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch prefix_(prefix) { 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void Start(const AutocompleteInput& input, 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool minimal_changes); 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void set_listener(ACProviderListener* listener) { 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch listener_ = listener; 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ~TestProvider() {} 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Run(); 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void AddResults(int start_at, int num); 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int relevance_; 5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const string16 prefix_; 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid TestProvider::Start(const AutocompleteInput& input, 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool minimal_changes) { 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (minimal_changes) 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch matches_.clear(); 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Generate one result synchronously, the rest later. 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddResults(0, 1); 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (input.matches_requested() == AutocompleteInput::ALL_MATCHES) { 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch done_ = false; 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod( 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch this, &TestProvider::Run)); 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid TestProvider::Run() { 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK_GT(num_results_per_provider, 0U); 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddResults(1, num_results_per_provider); 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch done_ = true; 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(listener_); 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch listener_->OnProviderUpdate(true); 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid TestProvider::AddResults(int start_at, int num) { 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (int i = start_at; i < num; i++) { 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutocompleteMatch match(this, relevance_ - i, false, 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutocompleteMatch::URL_WHAT_YOU_TYPED); 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen match.fill_into_edit = prefix_ + UTF8ToUTF16(base::IntToString(i)); 9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen match.destination_url = GURL(UTF16ToUTF8(match.fill_into_edit)); 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch match.contents = match.fill_into_edit; 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch match.contents_class.push_back( 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ACMatchClassification(0, ACMatchClassification::NONE)); 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch match.description = match.fill_into_edit; 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch match.description_class.push_back( 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ACMatchClassification(0, ACMatchClassification::NONE)); 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch matches_.push_back(match); 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutocompleteProviderTest : public testing::Test, 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public NotificationObserver { 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 1084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void ResetControllerWithTestProviders(bool same_destinations); 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Runs a query on the input "a", and makes sure both providers' input is 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // properly collected. 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void RunTest(); 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void ResetControllerWithTestProvidersWithKeywordAndSearchProviders(); 1154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void RunExactKeymatchTest(bool allow_exact_keyword_match); 1164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // These providers are owned by the controller once it's created. 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ACProviders providers_; 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutocompleteResult result_; 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // NotificationObserver 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void Observe(NotificationType type, 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NotificationSource& source, 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NotificationDetails& details); 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ScopedTestingBrowserProcess browser_process_; 129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoopForUI message_loop_; 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<AutocompleteController> controller_; 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationRegistrar registrar_; 1334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch TestingProfile profile_; 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid AutocompleteProviderTest::ResetControllerWithTestProviders( 1374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool same_destinations) { 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Forget about any existing providers. The controller owns them and will 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Release() them below, when we delete it during the call to reset(). 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch providers_.clear(); 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Construct two new providers, with either the same or different prefixes. 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestProvider* providerA = new TestProvider(num_results_per_provider, 14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASCIIToUTF16("http://a")); 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch providerA->AddRef(); 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch providers_.push_back(providerA); 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestProvider* providerB = new TestProvider(num_results_per_provider * 2, 14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen same_destinations ? ASCIIToUTF16("http://a") : ASCIIToUTF16("http://b")); 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch providerB->AddRef(); 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch providers_.push_back(providerB); 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Reset the controller to contain our new providers. 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutocompleteController* controller = new AutocompleteController(providers_); 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch controller_.reset(controller); 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch providerA->set_listener(controller); 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch providerB->set_listener(controller); 1584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The providers don't complete synchronously, so listen for "result updated" 1604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // notifications. 161dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen registrar_.Add(this, NotificationType::AUTOCOMPLETE_CONTROLLER_RESULT_READY, 1624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch NotificationService::AllSources()); 1634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 1644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid AutocompleteProviderTest:: 1664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ResetControllerWithTestProvidersWithKeywordAndSearchProviders() { 1674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch profile_.CreateTemplateURLModel(); 1684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Reset the default TemplateURL. 1704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch TemplateURL* default_t_url = new TemplateURL(); 1714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch default_t_url->SetURL("http://defaultturl/{searchTerms}", 0, 0); 1724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch TemplateURLModel* turl_model = profile_.GetTemplateURLModel(); 1734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch turl_model->Add(default_t_url); 1744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch turl_model->SetDefaultSearchProvider(default_t_url); 1754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch TemplateURLID default_provider_id = default_t_url->id(); 1764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ASSERT_NE(0, default_provider_id); 1774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Create another TemplateURL for KeywordProvider. 1794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch TemplateURL* keyword_t_url = new TemplateURL(); 18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen keyword_t_url->set_short_name(ASCIIToUTF16("k")); 18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen keyword_t_url->set_keyword(ASCIIToUTF16("k")); 1824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch keyword_t_url->SetURL("http://keyword/{searchTerms}", 0, 0); 1834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch profile_.GetTemplateURLModel()->Add(keyword_t_url); 1844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ASSERT_NE(0, keyword_t_url->id()); 1854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Forget about any existing providers. The controller owns them and will 1874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Release() them below, when we delete it during the call to reset(). 1884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch providers_.clear(); 1894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Create both a keyword and search provider, and add them in that order. 1914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // (Order is important; see comments in RunExactKeymatchTest().) 1924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch AutocompleteProvider* keyword_provider = new KeywordProvider(NULL, 1934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch &profile_); 1944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch keyword_provider->AddRef(); 1954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch providers_.push_back(keyword_provider); 1964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch AutocompleteProvider* search_provider = new SearchProvider(NULL, &profile_); 1974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch search_provider->AddRef(); 1984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch providers_.push_back(search_provider); 1994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch AutocompleteController* controller = new AutocompleteController(providers_); 2014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch controller_.reset(controller); 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AutocompleteProviderTest::RunTest() { 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch result_.Reset(); 206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen controller_->Start(ASCIIToUTF16("a"), string16(), true, false, true, 207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutocompleteInput::ALL_MATCHES); 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The message loop will terminate when all autocomplete input has been 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // collected. 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->Run(); 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid AutocompleteProviderTest::RunExactKeymatchTest( 2154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool allow_exact_keyword_match) { 2164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Send the controller input which exactly matches the keyword provider we 2174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // created in ResetControllerWithKeywordAndSearchProviders(). The default 2184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // match should thus be a keyword match iff |allow_exact_keyword_match| is 2194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // true. 22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen controller_->Start(ASCIIToUTF16("k test"), string16(), true, false, 221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen allow_exact_keyword_match, 222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutocompleteInput::SYNCHRONOUS_MATCHES); 2234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch EXPECT_TRUE(controller_->done()); 2244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // ResetControllerWithKeywordAndSearchProviders() adds the keyword provider 2254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // first, then the search provider. So if the default match is a keyword 2264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // match, it will come from provider 0, otherwise from provider 1. 2274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch EXPECT_EQ(providers_[allow_exact_keyword_match ? 0 : 1], 2284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch controller_->result().default_match()->provider); 2294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 2304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AutocompleteProviderTest::Observe(NotificationType type, 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NotificationSource& source, 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NotificationDetails& details) { 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (controller_->done()) { 23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen result_.CopyFrom(controller_->result()); 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->Quit(); 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that the default selection is set properly when updating results. 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(AutocompleteProviderTest, Query) { 2424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ResetControllerWithTestProviders(false); 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RunTest(); 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Make sure the default match gets set to the highest relevance match. The 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // highest relevance matches should come from the second provider. 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(num_results_per_provider * 2, result_.size()); // two providers 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_NE(result_.end(), result_.default_match()); 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(providers_[1], result_.default_match()->provider); 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(AutocompleteProviderTest, RemoveDuplicates) { 2534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ResetControllerWithTestProviders(true); 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RunTest(); 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Make sure all the first provider's results were eliminated by the second 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // provider's. 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(num_results_per_provider, result_.size()); 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (AutocompleteResult::const_iterator i(result_.begin()); 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch i != result_.end(); ++i) 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(providers_[1], i->provider); 2624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST_F(AutocompleteProviderTest, AllowExactKeywordMatch) { 2654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ResetControllerWithTestProvidersWithKeywordAndSearchProviders(); 2664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch RunExactKeymatchTest(true); 2674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch RunExactKeymatchTest(false); 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 270dc0f95d653279beabeb9817299e2902918ba123eKristian Monsentypedef TestingBrowserProcessTest AutocompleteTest; 271dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 272dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(AutocompleteTest, InputType) { 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct test_data { 27472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const string16 input; 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const AutocompleteInput::Type type; 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } input_cases[] = { 27772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16(""), AutocompleteInput::INVALID }, 27872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("?"), AutocompleteInput::FORCED_QUERY }, 27972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("?foo"), AutocompleteInput::FORCED_QUERY }, 28072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("?foo bar"), AutocompleteInput::FORCED_QUERY }, 28172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("?http://foo.com/bar"), AutocompleteInput::FORCED_QUERY }, 28272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("foo"), AutocompleteInput::UNKNOWN }, 28372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("foo.c"), AutocompleteInput::UNKNOWN }, 28472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("foo.com"), AutocompleteInput::URL }, 28572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("-.com"), AutocompleteInput::UNKNOWN }, 28672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("foo/bar"), AutocompleteInput::URL }, 28772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("foo;bar"), AutocompleteInput::QUERY }, 28872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("foo/bar baz"), AutocompleteInput::UNKNOWN }, 28972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("foo bar.com"), AutocompleteInput::QUERY }, 29072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("foo bar"), AutocompleteInput::QUERY }, 29172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("foo+bar"), AutocompleteInput::QUERY }, 29272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("foo+bar.com"), AutocompleteInput::UNKNOWN }, 29372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("\"foo:bar\""), AutocompleteInput::QUERY }, 29472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("link:foo.com"), AutocompleteInput::UNKNOWN }, 29572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("foo:81"), AutocompleteInput::URL }, 29672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("www.foo.com:81"), AutocompleteInput::URL }, 29772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("localhost:8080"), AutocompleteInput::URL }, 29872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("foo.com:123456"), AutocompleteInput::QUERY }, 29972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("foo.com:abc"), AutocompleteInput::QUERY }, 30072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("1.2.3.4:abc"), AutocompleteInput::QUERY }, 30172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("user@foo.com"), AutocompleteInput::UNKNOWN }, 30272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("user:pass@"), AutocompleteInput::UNKNOWN }, 30372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("user:pass@!foo.com"), AutocompleteInput::UNKNOWN }, 30472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("user:pass@foo"), AutocompleteInput::URL }, 30572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("user:pass@foo.c"), AutocompleteInput::URL }, 30672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("user:pass@foo.com"), AutocompleteInput::URL }, 30772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("user:pass@foo.com:81"), AutocompleteInput::URL }, 30872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("user:pass@foo:81"), AutocompleteInput::URL }, 30972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("1.2"), AutocompleteInput::UNKNOWN }, 31072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("1.2/45"), AutocompleteInput::UNKNOWN }, 31172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("1.2:45"), AutocompleteInput::UNKNOWN }, 31272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("user@1.2:45"), AutocompleteInput::UNKNOWN }, 31372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("user:pass@1.2:45"), AutocompleteInput::URL }, 31472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("ps/2 games"), AutocompleteInput::UNKNOWN }, 31572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("en.wikipedia.org/wiki/James Bond"), 31672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AutocompleteInput::URL }, 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // In Chrome itself, mailto: will get handled by ShellExecute, but in 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // unittest mode, we don't have the data loaded in the external protocol 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // handler to know this. 32072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // { ASCIIToUTF16("mailto:abuse@foo.com"), AutocompleteInput::URL }, 32172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("view-source:http://www.foo.com/"), AutocompleteInput::URL }, 32272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("javascript:alert(\"Hey there!\");"), 32372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AutocompleteInput::URL }, 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN) 32572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("C:\\Program Files"), AutocompleteInput::URL }, 32672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("\\\\Server\\Folder\\File"), AutocompleteInput::URL }, 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // defined(OS_WIN) 32872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("http:foo"), AutocompleteInput::URL }, 32972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("http://foo"), AutocompleteInput::URL }, 33072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("http://foo.c"), AutocompleteInput::URL }, 33172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("http://foo.com"), AutocompleteInput::URL }, 33272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("http://foo_bar.com"), AutocompleteInput::URL }, 33372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("http://foo/bar baz"), AutocompleteInput::URL }, 33472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("http://-.com"), AutocompleteInput::UNKNOWN }, 33572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("http://_foo_.com"), AutocompleteInput::UNKNOWN }, 33672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("http://foo.com:abc"), AutocompleteInput::QUERY }, 33772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("http://foo.com:123456"), AutocompleteInput::QUERY }, 33872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("http://1.2.3.4:abc"), AutocompleteInput::QUERY }, 33972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("http:user@foo.com"), AutocompleteInput::URL }, 34072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("http://user@foo.com"), AutocompleteInput::URL }, 34172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("http:user:pass@foo.com"), AutocompleteInput::URL }, 34272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("http://user:pass@foo.com"), AutocompleteInput::URL }, 34372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("http://1.2"), AutocompleteInput::URL }, 34472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("http://1.2/45"), AutocompleteInput::URL }, 34572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("http:ps/2 games"), AutocompleteInput::URL }, 34672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("http://ps/2 games"), AutocompleteInput::URL }, 34772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("https://foo.com"), AutocompleteInput::URL }, 34872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("127.0.0.1"), AutocompleteInput::URL }, 34972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("127.0.1"), AutocompleteInput::UNKNOWN }, 35072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("127.0.1/"), AutocompleteInput::UNKNOWN }, 35172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("browser.tabs.closeButtons"), AutocompleteInput::UNKNOWN }, 35272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { WideToUTF16(L"\u6d4b\u8bd5"), AutocompleteInput::UNKNOWN }, 35372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("[2001:]"), AutocompleteInput::QUERY }, // Not a valid IP 35472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("[2001:dB8::1]"), AutocompleteInput::URL }, 35572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("192.168.0.256"), 35672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AutocompleteInput::QUERY }, // Invalid IPv4 literal. 35772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("[foo.com]"), 35872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AutocompleteInput::QUERY }, // Invalid IPv6 literal. 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = 0; i < ARRAYSIZE_UNSAFE(input_cases); ++i) { 36221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen SCOPED_TRACE(input_cases[i].input); 36372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AutocompleteInput input(input_cases[i].input, string16(), true, false, 364ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen true, AutocompleteInput::ALL_MATCHES); 36521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(input_cases[i].type, input.type()); 366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 369dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(AutocompleteTest, InputTypeWithDesiredTLD) { 370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct test_data { 37172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const string16 input; 372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const AutocompleteInput::Type type; 373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } input_cases[] = { 37472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("401k"), AutocompleteInput::REQUESTED_URL }, 37572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("999999999999999"), AutocompleteInput::REQUESTED_URL }, 376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = 0; i < ARRAYSIZE_UNSAFE(input_cases); ++i) { 37972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AutocompleteInput input(input_cases[i].input, ASCIIToUTF16("com"), true, 380ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen false, true, AutocompleteInput::ALL_MATCHES); 381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(input_cases[i].type, input.type()) << "Input: " << 382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch input_cases[i].input; 383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This tests for a regression where certain input in the omnibox caused us to 387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// crash. As long as the test completes without crashing, we're fine. 388dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(AutocompleteTest, InputCrash) { 38972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AutocompleteInput input(WideToUTF16(L"\uff65@s"), string16(), true, false, 390ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen true, AutocompleteInput::ALL_MATCHES); 391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 39372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Test comparing matches relevance. 394c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(AutocompleteMatch, MoreRelevant) { 395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct RelevantCases { 396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int r1; 397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int r2; 398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool expected_result; 399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } cases[] = { 400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 10, 0, true }, 401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 10, -5, true }, 402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { -5, 10, false }, 403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 0, 10, false }, 40472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { -10, -5, false }, 40572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { -5, -10, true }, 406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutocompleteMatch m1(NULL, 0, false, AutocompleteMatch::URL_WHAT_YOU_TYPED); 409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutocompleteMatch m2(NULL, 0, false, AutocompleteMatch::URL_WHAT_YOU_TYPED); 410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { 412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch m1.relevance = cases[i].r1; 413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch m2.relevance = cases[i].r2; 414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(cases[i].expected_result, 415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutocompleteMatch::MoreRelevant(m1, m2)); 416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 419c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(AutocompleteInput, ParseForEmphasizeComponent) { 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch using url_parse::Component; 421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Component kInvalidComponent(0, -1); 422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct test_data { 42372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const string16 input; 424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const Component scheme; 425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const Component host; 426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } input_cases[] = { 42772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16(""), kInvalidComponent, kInvalidComponent }, 42872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("?"), kInvalidComponent, kInvalidComponent }, 42972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("?http://foo.com/bar"), kInvalidComponent, 43072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen kInvalidComponent }, 43172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("foo/bar baz"), kInvalidComponent, Component(0, 3) }, 43272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("http://foo/bar baz"), Component(0, 4), Component(7, 3) }, 43372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("link:foo.com"), Component(0, 4), kInvalidComponent }, 43472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("www.foo.com:81"), kInvalidComponent, Component(0, 11) }, 43572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { WideToUTF16(L"\u6d4b\u8bd5"), kInvalidComponent, Component(0, 2) }, 43672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("view-source:http://www.foo.com/"), Component(12, 4), 43772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Component(19, 11) }, 43872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("view-source:https://example.com/"), 439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Component(12, 5), Component(20, 11) }, 44072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("view-source:www.foo.com"), kInvalidComponent, 44172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Component(12, 11) }, 44272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("view-source:"), Component(0, 11), kInvalidComponent }, 44372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("view-source:garbage"), kInvalidComponent, 44472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Component(12, 7) }, 44572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("view-source:http://http://foo"), Component(12, 4), 44672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Component(19, 4) }, 44772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { ASCIIToUTF16("view-source:view-source:http://example.com/"), 44872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Component(12, 11), kInvalidComponent } 449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 451dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ScopedTestingBrowserProcess browser_process; 452dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = 0; i < ARRAYSIZE_UNSAFE(input_cases); ++i) { 454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Component scheme, host; 455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutocompleteInput::ParseForEmphasizeComponents(input_cases[i].input, 45672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen string16(), 457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &scheme, 458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &host); 45972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AutocompleteInput input(input_cases[i].input, string16(), true, false, 460ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen true, AutocompleteInput::ALL_MATCHES); 461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(input_cases[i].scheme.begin, scheme.begin) << "Input: " << 462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch input_cases[i].input; 463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(input_cases[i].scheme.len, scheme.len) << "Input: " << 464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch input_cases[i].input; 465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(input_cases[i].host.begin, host.begin) << "Input: " << 466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch input_cases[i].input; 467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(input_cases[i].host.len, host.len) << "Input: " << 468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch input_cases[i].input; 469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace 473