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_AUTOCOMPLETE_EXTENSION_APP_PROVIDER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_AUTOCOMPLETE_EXTENSION_APP_PROVIDER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_input.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_match.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_provider.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/window_open_disposition.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This provider is responsible for keeping track of which Extension Apps are 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// installed and their URLs. An instance of it gets created and managed by 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AutocompleteController. 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionAppProvider : public AutocompleteProvider, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public content::NotificationObserver { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionAppProvider(AutocompleteProviderListener* listener, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AutocompleteProvider: 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Start(const AutocompleteInput& input, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool minimal_changes) OVERRIDE; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Launch an Extension App from |match| details provided by the Omnibox. If 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the application wants to launch as a window or panel, |disposition| is 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ignored; otherwise it's used to determine in which tab we'll launch the 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // application. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void LaunchAppFromOmnibox(const AutocompleteMatch& match, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ExtensionAppProviderTest; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ExtensionAppProviderTest, CreateMatchSanitize); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ExtensionApp stores the minimal metadata that we need to match against 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // eligible apps. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExtensionApp { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // App's name. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 name; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // App's launch URL (for platform apps, which don't have a launch URL, this 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // just points to the app's origin). 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 launch_url; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If false, then the launch_url will not be considered for matching, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not shown next to the match, and not displayed as the editable text if 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the user selects the match with the arrow keys. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_match_against_launch_url; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::vector<ExtensionApp> ExtensionApps; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ExtensionAppProvider(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddExtensionAppForTesting(const ExtensionApp& extension_app); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Construct a match for the specified parameters. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteMatch CreateAutocompleteMatch(const AutocompleteInput& input, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ExtensionApp& app, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t name_match_index, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t url_match_index); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fetch the current app list and cache it locally. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RefreshAppList(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calculate the relevance of the match. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int CalculateRelevance(AutocompleteInput::Type type, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int input_length, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int target_length, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content::NotificationObserver implementation: 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Our cache of ExtensionApp objects (name + url) representing the extension 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // apps we know/care about. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionApps extension_apps_; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ExtensionAppProvider); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_AUTOCOMPLETE_EXTENSION_APP_PROVIDER_H_ 94