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) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/scoped_observer.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/extensions/chrome_extension_function.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_icon_manager.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/api/omnibox.h" 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_match.h" 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_service.h" 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/browser_context_keyed_api_factory.h" 205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "extensions/browser/extension_registry_observer.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 { 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class BrowserContext; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebContents; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gfx { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Image; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass ExtensionRegistry; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Event router class for events related to the omnibox API. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionOmniboxEventRouter { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The user has just typed the omnibox keyword. This is sent exactly once in 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a given input session, before any OnInputChanged events. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void OnInputStarted( 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, const std::string& extension_id); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The user has changed what is typed into the omnibox while in an extension 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // keyword session. Returns true if someone is listening to this event, and 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // thus we have some degree of confidence we'll get a response. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool OnInputChanged( 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extension_id, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& input, int suggest_id); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The user has accepted the omnibox input. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void OnInputEntered( 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* web_contents, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extension_id, 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& input, 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WindowOpenDisposition disposition); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The user has cleared the keyword, or closed the omnibox popup. This is 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sent at most once in a give input session, after any OnInputChanged events. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void OnInputCancelled( 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, const std::string& extension_id); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ExtensionOmniboxEventRouter); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class OmniboxSendSuggestionsFunction : public ChromeSyncExtensionFunction { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_EXTENSION_FUNCTION("omnibox.sendSuggestions", OMNIBOX_SENDSUGGESTIONS) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~OmniboxSendSuggestionsFunction() {} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ExtensionFunction: 835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual bool RunSync() OVERRIDE; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class OmniboxAPI : public BrowserContextKeyedAPI, 875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public ExtensionRegistryObserver { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) explicit OmniboxAPI(content::BrowserContext* context); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~OmniboxAPI(); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // BrowserContextKeyedAPI implementation. 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static BrowserContextKeyedAPIFactory<OmniboxAPI>* GetFactoryInstance(); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Convenience method to get the OmniboxAPI for a profile. 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static OmniboxAPI* Get(content::BrowserContext* context); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // KeyedService implementation. 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void Shutdown() OVERRIDE; 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (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: 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) friend class BrowserContextKeyedAPIFactory<OmniboxAPI>; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::set<const Extension*> PendingExtensions; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void OnTemplateURLsLoaded(); 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // ExtensionRegistryObserver implementation. 1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void OnExtensionLoaded(content::BrowserContext* browser_context, 1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const Extension* extension) OVERRIDE; 1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void OnExtensionUnloaded( 1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content::BrowserContext* browser_context, 1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const Extension* extension, 1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu UnloadedExtensionInfo::Reason reason) OVERRIDE; 1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // BrowserContextKeyedAPI implementation. 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const char* service_name() { 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return "OmniboxAPI"; 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const bool kServiceRedirectedInIncognito = true; 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile_; 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TemplateURLService* url_service_; 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // List of extensions waiting for the TemplateURLService to Load to 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // have keywords registered. 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PendingExtensions pending_extensions_; 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Listen to extension load, unloaded notifications. 1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver> 1395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu extension_registry_observer_; 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Keeps track of favicon-sized omnibox icons for extensions. 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionIconManager omnibox_icon_manager_; 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionIconManager omnibox_popup_icon_manager_; 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<TemplateURLService::Subscription> template_url_sub_; 1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(OmniboxAPI); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <> 151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void BrowserContextKeyedAPIFactory<OmniboxAPI>::DeclareFactoryDependencies(); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class OmniboxSetDefaultSuggestionFunction : public ChromeSyncExtensionFunction { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_EXTENSION_FUNCTION("omnibox.setDefaultSuggestion", 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OMNIBOX_SETDEFAULTSUGGESTION) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~OmniboxSetDefaultSuggestionFunction() {} 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ExtensionFunction: 1625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual bool RunSync() OVERRIDE; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If the extension has set a custom default suggestion via 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// omnibox.setDefaultSuggestion, apply that to |match|. Otherwise, do nothing. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ApplyDefaultSuggestionForExtensionKeyword( 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TemplateURL* keyword, 170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& remaining_input, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteMatch* match); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This function converts style information populated by the JSON schema 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// // compiler into an ACMatchClassifications object. 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ACMatchClassifications StyleTypesToACMatchClassifications( 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const api::omnibox::SuggestResult &suggestion); 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_EXTENSIONS_API_OMNIBOX_OMNIBOX_API_H_ 181