1424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// found in the LICENSE file. 4424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 5424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_ASH_LAUNCHER_BROWSER_STATUS_MONITOR_H_ 6424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#define CHROME_BROWSER_UI_ASH_LAUNCHER_BROWSER_STATUS_MONITOR_H_ 7424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 8424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include <map> 9424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include <string> 10424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "ash/shelf/scoped_observer_with_duplicated_sources.h" 12424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/basictypes.h" 13424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/compiler_specific.h" 14424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/scoped_observer.h" 154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h" 16424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/browser/ui/browser_list_observer.h" 17424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model_observer.h" 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 19424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "ui/aura/client/activation_change_observer.h" 20424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "ui/aura/window_observer.h" 21424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "ui/gfx/display_observer.h" 22424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 23424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace aura { 24424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class Window; 25424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 26424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace client { 27424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class ActivationClient; 28424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 29424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} // namespace aura 30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class Browser; 32424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 33424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// BrowserStatusMonitor monitors creation/deletion of Browser and its 34424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// TabStripModel to keep the launcher representation up to date as the 35424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// active tab changes. 36424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class BrowserStatusMonitor : public aura::client::ActivationChangeObserver, 37424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) public aura::WindowObserver, 38424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) public chrome::BrowserListObserver, 39424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) public gfx::DisplayObserver, 40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) public TabStripModelObserver { 41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) public: 42424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) explicit BrowserStatusMonitor(ChromeLauncherController* launcher_controller); 43424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual ~BrowserStatusMonitor(); 44424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // A function which gets called when the current user has changed. 461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Note that this function is called by the ChromeLauncherController to be 471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // able to do the activation in a proper order - rather then setting an 481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // observer. 491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void ActiveUserChanged(const std::string& user_email) {} 501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // A shortcut to call the ChromeLauncherController's UpdateAppState(). 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void UpdateAppItemState(content::WebContents* contents, 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ChromeLauncherController::AppState app_state); 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // A shortcut to call the BrowserShortcutLauncherItemController's 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // UpdateBrowserItemState(). 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void UpdateBrowserItemState(); 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 59424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // aura::client::ActivationChangeObserver overrides: 60424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void OnWindowActivated(aura::Window* gained_active, 61424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) aura::Window* lost_active) OVERRIDE; 62424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 63424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // aura::WindowObserver overrides: 64424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE; 65424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 66424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // chrome::BrowserListObserver overrides: 67424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void OnBrowserAdded(Browser* browser) OVERRIDE; 68424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void OnBrowserRemoved(Browser* browser) OVERRIDE; 69424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 70424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // gfx::DisplayObserver overrides: 71424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void OnDisplayBoundsChanged(const gfx::Display& display) OVERRIDE; 72424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void OnDisplayAdded(const gfx::Display& new_display) OVERRIDE; 73424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void OnDisplayRemoved(const gfx::Display& old_display) OVERRIDE; 74424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 75424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // TabStripModelObserver overrides: 76424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void ActiveTabChanged(content::WebContents* old_contents, 77424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) content::WebContents* new_contents, 78424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) int index, 79424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) int reason) OVERRIDE; 80424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void TabReplacedAt(TabStripModel* tab_strip_model, 81424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) content::WebContents* old_contents, 82424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) content::WebContents* new_contents, 83424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) int index) OVERRIDE; 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void TabInsertedAt(content::WebContents* contents, 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int index, 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool foreground) OVERRIDE; 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void TabClosingAt(TabStripModel* tab_strip_mode, 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::WebContents* contents, 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int index) OVERRIDE; 90424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) protected: 921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Add a V1 application to the shelf. This can get overwritten for multi 931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // profile implementations. 941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void AddV1AppToShelf(Browser* browser); 951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Remove a V1 application from the shelf. This can get overwritten for multi 971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // profile implementations. 981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void RemoveV1AppFromShelf(Browser* browser); 991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Check if V1 application is currently in the shelf. 1011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool IsV1AppInShelf(Browser* browser); 1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 103424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) private: 1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // This class monitors the WebContent of the all tab and notifies a navigation 1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // to the BrowserStatusMonitor. 1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) class LocalWebContentsObserver : public content::WebContentsObserver { 1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LocalWebContentsObserver(content::WebContents* contents, 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) BrowserStatusMonitor* monitor); 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual ~LocalWebContentsObserver(); 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // content::WebContentsObserver overrides: 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void DidNavigateMainFrame( 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const content::LoadCommittedDetails& details, 1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const content::FrameNavigateParams& params) OVERRIDE; 1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private: 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) BrowserStatusMonitor* monitor_; 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(LocalWebContentsObserver); 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) }; 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 123424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) typedef std::map<Browser*, std::string> BrowserToAppIDMap; 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) typedef std::map<content::WebContents*, LocalWebContentsObserver*> 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebContentsToObserverMap; 126424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Create LocalWebContentsObserver for |contents|. 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void AddWebContentsObserver(content::WebContents* contents); 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Remove LocalWebContentsObserver for |contents|. 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void RemoveWebContentsObserver(content::WebContents* contents); 132424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Retruns the LauncherID for |contents|. 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ash::LauncherID GetLauncherIDForWebContents(content::WebContents* contents); 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 136424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ChromeLauncherController* launcher_controller_; 137424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 138424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Hold all observed activation clients. 139424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ScopedObserverWithDuplicatedSources<aura::client::ActivationClient, 140424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) aura::client::ActivationChangeObserver> observed_activation_clients_; 141424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 142424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Hold all observed root windows. 143424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ScopedObserver<aura::Window, aura::WindowObserver> observed_root_windows_; 144424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 145424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) BrowserToAppIDMap browser_to_app_id_map_; 146424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebContentsToObserverMap webcontents_to_observer_map_; 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 149424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BrowserStatusMonitor); 150424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}; 151424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 152424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#endif // CHROME_BROWSER_UI_ASH_LAUNCHER_BROWSER_STATUS_MONITOR_H_ 153