zero_suggest_provider.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file contains the zero-suggest autocomplete provider. This experimental 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// provider is invoked when the user focuses in the omnibox prior to editing, 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and generates search query suggestions based on the current URL. To enable 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this provider, point --experimental-zero-suggest-url-prefix at an 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// appropriate suggestion service. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HUGE DISCLAIMER: This is just here for experimenting and will probably be 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// deleted entirely as we revise how suggestions work with the omnibox. 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_AUTOCOMPLETE_ZERO_SUGGEST_PROVIDER_H_ 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_AUTOCOMPLETE_ZERO_SUGGEST_PROVIDER_H_ 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string16.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_provider.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutocompleteInput; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TemplateURLService; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Value; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLFetcher; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Autocomplete provider for searches based on the current URL. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The controller will call StartZeroSuggest when the user focuses in the 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// omnibox. After construction, the autocomplete controller repeatedly calls 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Start() with some user input, each time expecting to receive an updated 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// set of matches. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(jered): Consider deleting this class and building this functionality 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// into SearchProvider after dogfood and after we break the association between 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// omnibox text and suggestions. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ZeroSuggestProvider : public AutocompleteProvider, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public net::URLFetcherDelegate { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates and returns an instance of this provider if the feature is enabled. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns NULL if not enabled. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ZeroSuggestProvider* Create(AutocompleteProviderListener* listener, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AutocompleteProvider: 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Start(const AutocompleteInput& input, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool /*minimal_changes*/) OVERRIDE; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Stop(bool clear_cached_results) OVERRIDE; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // net::URLFetcherDelegate 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initiates a new fetch for the given |url|, limiting suggestions to those 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // matching |user_text|. |user_text| may be non-empty if the user previously 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // interacted with zero-suggest suggestions and then unfocused the omnibox. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jered): Rip out |user_text| once the first match is decoupled from 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the current typing in the omnibox. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartZeroSuggest(const GURL& url, const string16& user_text); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZeroSuggestProvider(AutocompleteProviderListener* listener, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& url_prefix); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ZeroSuggestProvider(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update matches given the user has typed |user_text|. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateMatches(const string16& user_text); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fetches zero-suggest suggestions for |current_query_|. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Run(); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parses results from the zero-suggest server and updates results. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if results were updated. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ParseSuggestResults(base::Value* root_val); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Converts the parsed results to a set of AutocompleteMatches and adds them 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to |matches_|. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ConvertResultsToAutocompleteMatches(); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds a URL suggestion for the current URL. This should be in the top 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // position so that pressing enter has the effect of reloading the page. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddMatchForCurrentURL(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds a query suggestion from response position |result_index| with text 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |result| to |matches_|. Uses |search_provider| to build a search URL for 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this match. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddMatchForResult(const TemplateURL* search_provider, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t result_index, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& result); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prefix of the URL from which to fetch zero-suggest suggestions. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string url_prefix_; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to build default search engine URLs for suggested queries. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateURLService* template_url_service_; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The URL for which a suggestion fetch is pending. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string current_query_; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // What the user has typed. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 user_text_; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fetcher used to retrieve results. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<net::URLFetcher> fetcher_; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Suggestions for the most recent query. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<string16> results_; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ZeroSuggestProvider); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_AUTOCOMPLETE_ZERO_SUGGEST_PROVIDER_H_ 126