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