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.
5 #ifndef CHROME_BROWSER_EXTENSIONS_API_TABS_WINDOWS_EVENT_ROUTER_H_
6 #define CHROME_BROWSER_EXTENSIONS_API_TABS_WINDOWS_EVENT_ROUTER_H_
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"
25 namespace extensions {
27 // The WindowsEventRouter sends chrome.windows.* events to listeners
28 // inside extension process renderers. The router listens to *all* events,
29 // but will only route eventes within a profile to extension processes in the
31 class WindowsEventRouter : public WindowControllerListObserver,
32 #if defined(TOOLKIT_VIEWS)
33 public views::WidgetFocusChangeListener,
35 public content::NotificationObserver {
37 explicit WindowsEventRouter(Profile* profile);
38 ~WindowsEventRouter() override;
40 // WindowControllerListObserver methods:
41 void OnWindowControllerAdded(WindowController* window_controller) override;
42 void OnWindowControllerRemoved(WindowController* window) override;
44 #if defined(TOOLKIT_VIEWS)
45 void OnNativeFocusChange(gfx::NativeView focused_before,
46 gfx::NativeView focused_now) override;
49 // content::NotificationObserver.
50 void Observe(int type,
51 const content::NotificationSource& source,
52 const content::NotificationDetails& details) override;
54 // |window_controller| is NULL to indicate a focused window has lost focus.
55 void OnActiveWindowChanged(WindowController* window_controller);
58 void DispatchEvent(const std::string& event_name,
60 scoped_ptr<base::ListValue> args);
62 content::NotificationRegistrar registrar_;
64 // The main profile that owns this event router.
67 // The profile the currently focused window belongs to; either the main or
68 // incognito profile or NULL (none of the above). We remember this in order
69 // to correctly handle focus changes between non-OTR and OTR windows.
70 Profile* focused_profile_;
72 // The currently focused window. We keep this so as to avoid sending multiple
73 // windows.onFocusChanged events with the same windowId.
74 int focused_window_id_;
76 DISALLOW_COPY_AND_ASSIGN(WindowsEventRouter);
79 } // namespace extensions
81 #endif // CHROME_BROWSER_EXTENSIONS_API_TABS_WINDOWS_EVENT_ROUTER_H_