omnibox_api.h revision 868fa2fe829687343ffae624259930155e16dbd8
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)#ifndef CHROME_BROWSER_EXTENSIONS_API_OMNIBOX_OMNIBOX_API_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_API_OMNIBOX_OMNIBOX_API_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_match.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/profile_keyed_api_factory.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_function.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_icon_manager.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/api/omnibox.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_observer.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_registrar.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/window_open_disposition.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Profile; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TemplateURL; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TemplateURLService; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ListValue; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content { 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebContents; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gfx { 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Image; 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Event router class for events related to the omnibox API. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionOmniboxEventRouter { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The user has just typed the omnibox keyword. This is sent exactly once in 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a given input session, before any OnInputChanged events. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void OnInputStarted( 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, const std::string& extension_id); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The user has changed what is typed into the omnibox while in an extension 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // keyword session. Returns true if someone is listening to this event, and 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // thus we have some degree of confidence we'll get a response. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool OnInputChanged( 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extension_id, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& input, int suggest_id); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The user has accepted the omnibox input. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void OnInputEntered( 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* web_contents, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extension_id, 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& input, 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WindowOpenDisposition disposition); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The user has cleared the keyword, or closed the omnibox popup. This is 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sent at most once in a give input session, after any OnInputChanged events. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void OnInputCancelled( 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, const std::string& extension_id); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ExtensionOmniboxEventRouter); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OmniboxSendSuggestionsFunction : public SyncExtensionFunction { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_EXTENSION_FUNCTION("omnibox.sendSuggestions", OMNIBOX_SENDSUGGESTIONS) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~OmniboxSendSuggestionsFunction() {} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ExtensionFunction: 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool RunImpl() OVERRIDE; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class OmniboxAPI : public ProfileKeyedAPI, 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public content::NotificationObserver { 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit OmniboxAPI(Profile* profile); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~OmniboxAPI(); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ProfileKeyedAPI implementation. 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static ProfileKeyedAPIFactory<OmniboxAPI>* GetFactoryInstance(); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Convenience method to get the OmniboxAPI for a profile. 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static OmniboxAPI* Get(Profile* profile); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // content::NotificationObserver implementation. 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Observe(int type, 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationSource& source, 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the icon to display in the omnibox for the given extension. 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Image GetOmniboxIcon(const std::string& extension_id); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the icon to display in the omnibox popup window for the given 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // extension. 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Image GetOmniboxPopupIcon(const std::string& extension_id); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class ProfileKeyedAPIFactory<OmniboxAPI>; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::set<const Extension*> PendingExtensions; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ProfileKeyedAPI implementation. 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const char* service_name() { 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return "OmniboxAPI"; 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const bool kServiceRedirectedInIncognito = true; 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile_; 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TemplateURLService* url_service_; 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // List of extensions waiting for the TemplateURLService to Load to 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // have keywords registered. 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PendingExtensions pending_extensions_; 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::NotificationRegistrar registrar_; 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Keeps track of favicon-sized omnibox icons for extensions. 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionIconManager omnibox_icon_manager_; 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionIconManager omnibox_popup_icon_manager_; 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(OmniboxAPI); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <> 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ProfileKeyedAPIFactory<OmniboxAPI>::DeclareFactoryDependencies(); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OmniboxSetDefaultSuggestionFunction : public SyncExtensionFunction { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_EXTENSION_FUNCTION("omnibox.setDefaultSuggestion", 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OMNIBOX_SETDEFAULTSUGGESTION) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~OmniboxSetDefaultSuggestionFunction() {} 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ExtensionFunction: 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool RunImpl() OVERRIDE; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If the extension has set a custom default suggestion via 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// omnibox.setDefaultSuggestion, apply that to |match|. Otherwise, do nothing. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ApplyDefaultSuggestionForExtensionKeyword( 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TemplateURL* keyword, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& remaining_input, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteMatch* match); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This function converts style information populated by the JSON schema 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// // compiler into an ACMatchClassifications object. 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ACMatchClassifications StyleTypesToACMatchClassifications( 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const api::omnibox::SuggestResult &suggestion); 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_EXTENSIONS_API_OMNIBOX_OMNIBOX_API_H_ 167