• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_EXTENSIONS_API_TABS_WINDOWS_EVENT_ROUTER_H_
6 #define CHROME_BROWSER_EXTENSIONS_API_TABS_WINDOWS_EVENT_ROUTER_H_
7 
8 #include <string>
9 
10 #include "base/basictypes.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "chrome/browser/extensions/window_controller_list_observer.h"
13 #include "content/public/browser/notification_observer.h"
14 #include "content/public/browser/notification_registrar.h"
15 #if defined(TOOLKIT_VIEWS)
16 #include "ui/views/focus/widget_focus_manager.h"
17 #elif defined(TOOLKIT_GTK)
18 #include "ui/base/x/active_window_watcher_x_observer.h"
19 #endif
20 
21 class Profile;
22 
23 namespace base {
24 class ListValue;
25 }
26 
27 namespace extensions {
28 
29 // The WindowsEventRouter sends chrome.windows.* events to listeners
30 // inside extension process renderers. The router listens to *all* events,
31 // but will only route eventes within a profile to extension processes in the
32 // same profile.
33 class WindowsEventRouter : public WindowControllerListObserver,
34 #if defined(TOOLKIT_VIEWS)
35                           public views::WidgetFocusChangeListener,
36 #elif defined(TOOLKIT_GTK)
37                           public ui::ActiveWindowWatcherXObserver,
38 #endif
39                           public content::NotificationObserver {
40  public:
41   explicit WindowsEventRouter(Profile* profile);
42   virtual ~WindowsEventRouter();
43 
44   // WindowControllerListObserver methods:
45   virtual void OnWindowControllerAdded(
46       WindowController* window_controller) OVERRIDE;
47   virtual void OnWindowControllerRemoved(
48       WindowController* window) OVERRIDE;
49 
50 #if defined(TOOLKIT_VIEWS)
51   virtual void OnNativeFocusChange(gfx::NativeView focused_before,
52                                    gfx::NativeView focused_now) OVERRIDE;
53 #elif defined(TOOLKIT_GTK)
54   virtual void ActiveWindowChanged(GdkWindow* active_window) OVERRIDE;
55 #endif
56 
57   // content::NotificationObserver.
58   virtual void Observe(int type,
59                        const content::NotificationSource& source,
60                        const content::NotificationDetails& details) OVERRIDE;
61 
62   // |window_controller| is NULL to indicate a focused window has lost focus.
63   void OnActiveWindowChanged(WindowController* window_controller);
64 
65  private:
66   void DispatchEvent(const std::string& event_name,
67                      Profile* profile,
68                      scoped_ptr<base::ListValue> args);
69 
70   content::NotificationRegistrar registrar_;
71 
72   // The main profile that owns this event router.
73   Profile* profile_;
74 
75   // The profile the currently focused window belongs to; either the main or
76   // incognito profile or NULL (none of the above). We remember this in order
77   // to correctly handle focus changes between non-OTR and OTR windows.
78   Profile* focused_profile_;
79 
80   // The currently focused window. We keep this so as to avoid sending multiple
81   // windows.onFocusChanged events with the same windowId.
82   int focused_window_id_;
83 
84   DISALLOW_COPY_AND_ASSIGN(WindowsEventRouter);
85 };
86 
87 }  // namespace extensions
88 
89 #endif  // CHROME_BROWSER_EXTENSIONS_API_TABS_WINDOWS_EVENT_ROUTER_H_
90