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