1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CHROME_BROWSER_UI_ASH_LAUNCHER_APP_SHORTCUT_LAUNCHER_ITEM_CONTROLLER_H_ 6#define CHROME_BROWSER_UI_ASH_LAUNCHER_APP_SHORTCUT_LAUNCHER_ITEM_CONTROLLER_H_ 7 8#include <string> 9 10#include "base/time/time.h" 11#include "chrome/browser/ui/ash/launcher/launcher_item_controller.h" 12#include "url/gurl.h" 13 14class Browser; 15class URLPattern; 16 17namespace aura { 18class Window; 19} 20 21namespace extensions { 22class Extension; 23} 24 25class ChromeLauncherController; 26 27// Item controller for an app shortcut. Shortcuts track app and launcher ids, 28// but do not have any associated windows (opening a shortcut will replace the 29// item with the appropriate LauncherItemController type). 30class AppShortcutLauncherItemController : public LauncherItemController { 31 public: 32 AppShortcutLauncherItemController(const std::string& app_id, 33 ChromeLauncherController* controller); 34 35 virtual ~AppShortcutLauncherItemController(); 36 37 std::vector<content::WebContents*> GetRunningApplications(); 38 39 // LauncherItemController overrides: 40 virtual bool IsOpen() const OVERRIDE; 41 virtual bool IsVisible() const OVERRIDE; 42 virtual void Launch(ash::LaunchSource source, int event_flags) OVERRIDE; 43 virtual bool Activate(ash::LaunchSource source) OVERRIDE; 44 virtual ChromeLauncherAppMenuItems GetApplicationList( 45 int event_flags) OVERRIDE; 46 virtual bool ItemSelected(const ui::Event& event) OVERRIDE; 47 virtual base::string16 GetTitle() OVERRIDE; 48 virtual ui::MenuModel* CreateContextMenu( 49 aura::Window* root_window) OVERRIDE; 50 virtual ash::ShelfMenuModel* CreateApplicationMenu(int event_flags) OVERRIDE; 51 virtual bool IsDraggable() OVERRIDE; 52 virtual bool ShouldShowTooltip() OVERRIDE; 53 virtual void Close() OVERRIDE; 54 55 // Get the refocus url pattern, which can be used to identify this application 56 // from a URL link. 57 const GURL& refocus_url() const { return refocus_url_; } 58 // Set the refocus url pattern. Used by unit tests. 59 void set_refocus_url(const GURL& refocus_url) { refocus_url_ = refocus_url; } 60 61 private: 62 // Get the last running application. 63 content::WebContents* GetLRUApplication(); 64 65 // Returns true if this app matches the given |web_contents|. To accelerate 66 // the matching, the app managing |extension| as well as the parsed 67 // |refocus_pattern| get passed. If |is_app| is true, the application gets 68 // first checked against its original URL since a windowed app might have 69 // navigated away from its app domain. 70 bool WebContentMatchesApp(const extensions::Extension* extension, 71 const URLPattern& refocus_pattern, 72 content::WebContents* web_contents, 73 Browser* browser); 74 75 // Activate the browser with the given |content| and show the associated tab. 76 void ActivateContent(content::WebContents* content); 77 78 // Advance to the next item if an owned item is already active. The function 79 // will return true if it has sucessfully advanced. 80 bool AdvanceToNextApp(); 81 82 // Returns true if the application is a V2 app. 83 bool IsV2App(); 84 85 // Returns true if it is allowed to try starting a V2 app again. 86 bool AllowNextLaunchAttempt(); 87 88 GURL refocus_url_; 89 90 // Since V2 applications can be undetectable after launching, this timer is 91 // keeping track of the last launch attempt. 92 base::Time last_launch_attempt_; 93 94 ChromeLauncherController* chrome_launcher_controller_; 95 96 DISALLOW_COPY_AND_ASSIGN(AppShortcutLauncherItemController); 97}; 98 99#endif // CHROME_BROWSER_UI_ASH_LAUNCHER_APP_SHORTCUT_LAUNCHER_ITEM_CONTROLLER_H_ 100