Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(253)

Side by Side Diff: chrome/browser/extensions/api/tabs/windows_event_router.cc

Issue 1099553002: extensions: windows: list all windows from the current profile (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add application windows resize constraint test Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/api/tabs/windows_event_router.h" 5 #include "chrome/browser/extensions/api/tabs/windows_event_router.h"
6 6
7 #include "base/values.h" 7 #include "base/values.h"
8 #include "chrome/browser/chrome_notification_types.h" 8 #include "chrome/browser/chrome_notification_types.h"
9 #include "chrome/browser/extensions/api/tabs/app_window_controller.h"
9 #include "chrome/browser/extensions/extension_service.h" 10 #include "chrome/browser/extensions/extension_service.h"
10 #include "chrome/browser/extensions/extension_util.h" 11 #include "chrome/browser/extensions/extension_util.h"
11 #include "chrome/browser/extensions/window_controller.h" 12 #include "chrome/browser/extensions/window_controller.h"
12 #include "chrome/browser/extensions/window_controller_list.h" 13 #include "chrome/browser/extensions/window_controller_list.h"
13 #include "chrome/browser/profiles/profile.h" 14 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/common/extensions/api/windows.h" 15 #include "chrome/common/extensions/api/windows.h"
15 #include "chrome/common/extensions/extension_constants.h" 16 #include "chrome/common/extensions/extension_constants.h"
16 #include "content/public/browser/notification_service.h" 17 #include "content/public/browser/notification_service.h"
18 #include "extensions/browser/app_window/app_window.h"
17 #include "extensions/browser/event_router.h" 19 #include "extensions/browser/event_router.h"
18 #include "extensions/common/constants.h" 20 #include "extensions/common/constants.h"
19 21
20 using content::BrowserContext; 22 using content::BrowserContext;
21 23
22 namespace extensions { 24 namespace extensions {
23 25
24 namespace windows = extensions::api::windows; 26 namespace windows = extensions::api::windows;
25 27
26 WindowsEventRouter::WindowsEventRouter(Profile* profile) 28 WindowsEventRouter::WindowsEventRouter(Profile* profile)
27 : profile_(profile), 29 : profile_(profile),
28 focused_profile_(NULL), 30 focused_profile_(NULL),
29 focused_window_id_(extension_misc::kUnknownWindowId) { 31 focused_window_id_(extension_misc::kUnknownWindowId),
32 dispatch_events_(false) {
30 DCHECK(!profile->IsOffTheRecord()); 33 DCHECK(!profile->IsOffTheRecord());
31 34
32 WindowControllerList::GetInstance()->AddObserver(this); 35 WindowControllerList::GetInstance()->AddObserver(this);
36 AppWindowRegistry::Get(profile_)->AddObserver(this);
33 // Needed for when no suitable window can be passed to an extension as the 37 // Needed for when no suitable window can be passed to an extension as the
34 // currently focused window. On Mac (even in a toolkit-views build) always 38 // currently focused window. On Mac (even in a toolkit-views build) always
35 // rely on the notification sent by AppControllerMac after AppKit sends 39 // rely on the notification sent by AppControllerMac after AppKit sends
36 // NSWindowDidBecomeKeyNotification and there is no [NSApp keyWindow]. This 40 // NSWindowDidBecomeKeyNotification and there is no [NSApp keyWindow]. This
37 // allows windows not created by toolkit-views to be tracked. 41 // allows windows not created by toolkit-views to be tracked.
38 // TODO(tapted): Remove the ifdefs (and NOTIFICATION_NO_KEY_WINDOW) when 42 // TODO(tapted): Remove the ifdefs (and NOTIFICATION_NO_KEY_WINDOW) when
39 // Chrome on Mac only makes windows with toolkit-views. 43 // Chrome on Mac only makes windows with toolkit-views.
40 #if defined(OS_MACOSX) 44 #if defined(OS_MACOSX)
41 registrar_.Add(this, chrome::NOTIFICATION_NO_KEY_WINDOW, 45 registrar_.Add(this, chrome::NOTIFICATION_NO_KEY_WINDOW,
42 content::NotificationService::AllSources()); 46 content::NotificationService::AllSources());
43 #elif defined(TOOLKIT_VIEWS) 47 #elif defined(TOOLKIT_VIEWS)
44 views::WidgetFocusManager::GetInstance()->AddFocusChangeListener(this); 48 views::WidgetFocusManager::GetInstance()->AddFocusChangeListener(this);
45 #else 49 #else
46 #error Unsupported 50 #error Unsupported
47 #endif 51 #endif
52
53 AppWindowRegistry* registry = AppWindowRegistry::Get(profile_);
54 for (AppWindow* app_window : registry->app_windows()) {
55 scoped_ptr<AppWindowController> controller(new AppWindowController(
56 app_window, make_scoped_ptr(new AppBaseWindow(app_window)), profile_));
57 app_windows_.set(app_window->session_id().id(), controller.Pass());
58 }
48 } 59 }
49 60
50 WindowsEventRouter::~WindowsEventRouter() { 61 WindowsEventRouter::~WindowsEventRouter() {
62 AppWindowRegistry::Get(profile_)->RemoveObserver(this);
51 WindowControllerList::GetInstance()->RemoveObserver(this); 63 WindowControllerList::GetInstance()->RemoveObserver(this);
52 #if !defined(OS_MACOSX) 64 #if !defined(OS_MACOSX)
53 views::WidgetFocusManager::GetInstance()->RemoveFocusChangeListener(this); 65 views::WidgetFocusManager::GetInstance()->RemoveFocusChangeListener(this);
54 #endif 66 #endif
55 } 67 }
56 68
69 void WindowsEventRouter::DispatchEvents() {
70 dispatch_events_ = true;
71 }
72
73 void WindowsEventRouter::OnAppWindowAdded(extensions::AppWindow* app_window) {
74 scoped_ptr<AppWindowController> controller(new AppWindowController(
75 app_window, make_scoped_ptr(new AppBaseWindow(app_window)), profile_));
76 app_windows_.set(app_window->session_id().id(), controller.Pass());
77 }
78
79 void WindowsEventRouter::OnAppWindowRemoved(extensions::AppWindow* app_window) {
80 app_windows_.erase(app_window->session_id().id());
81 }
82
57 void WindowsEventRouter::OnWindowControllerAdded( 83 void WindowsEventRouter::OnWindowControllerAdded(
58 WindowController* window_controller) { 84 WindowController* window_controller) {
85 if (!dispatch_events_)
86 return;
59 if (!profile_->IsSameProfile(window_controller->profile())) 87 if (!profile_->IsSameProfile(window_controller->profile()))
60 return; 88 return;
61 89
62 scoped_ptr<base::ListValue> args(new base::ListValue()); 90 scoped_ptr<base::ListValue> args(new base::ListValue());
63 base::DictionaryValue* window_dictionary = 91 base::DictionaryValue* window_dictionary =
64 window_controller->CreateWindowValue(); 92 window_controller->CreateWindowValue();
65 args->Append(window_dictionary); 93 args->Append(window_dictionary);
66 DispatchEvent(windows::OnCreated::kEventName, window_controller->profile(), 94 DispatchEvent(windows::OnCreated::kEventName, window_controller->profile(),
67 args.Pass()); 95 args.Pass());
68 } 96 }
69 97
70 void WindowsEventRouter::OnWindowControllerRemoved( 98 void WindowsEventRouter::OnWindowControllerRemoved(
71 WindowController* window_controller) { 99 WindowController* window_controller) {
100 if (!dispatch_events_)
101 return;
72 if (!profile_->IsSameProfile(window_controller->profile())) 102 if (!profile_->IsSameProfile(window_controller->profile()))
73 return; 103 return;
74 104
75 int window_id = window_controller->GetWindowId(); 105 int window_id = window_controller->GetWindowId();
76 scoped_ptr<base::ListValue> args(new base::ListValue()); 106 scoped_ptr<base::ListValue> args(new base::ListValue());
77 args->Append(new base::FundamentalValue(window_id)); 107 args->Append(new base::FundamentalValue(window_id));
78 DispatchEvent(windows::OnRemoved::kEventName, 108 DispatchEvent(windows::OnRemoved::kEventName,
79 window_controller->profile(), 109 window_controller->profile(),
80 args.Pass()); 110 args.Pass());
81 } 111 }
82 112
83 #if !defined(OS_MACOSX) 113 #if !defined(OS_MACOSX)
84 void WindowsEventRouter::OnNativeFocusChanged(gfx::NativeView focused_now) { 114 void WindowsEventRouter::OnNativeFocusChanged(gfx::NativeView focused_now) {
115 if (!dispatch_events_)
116 return;
85 if (!focused_now) 117 if (!focused_now)
86 OnActiveWindowChanged(NULL); 118 OnActiveWindowChanged(NULL);
87 } 119 }
88 #endif 120 #endif
89 121
90 void WindowsEventRouter::Observe( 122 void WindowsEventRouter::Observe(
91 int type, 123 int type,
92 const content::NotificationSource& source, 124 const content::NotificationSource& source,
93 const content::NotificationDetails& details) { 125 const content::NotificationDetails& details) {
126 if (!dispatch_events_)
127 return;
94 #if defined(OS_MACOSX) 128 #if defined(OS_MACOSX)
95 if (chrome::NOTIFICATION_NO_KEY_WINDOW == type) { 129 if (chrome::NOTIFICATION_NO_KEY_WINDOW == type) {
96 OnActiveWindowChanged(NULL); 130 OnActiveWindowChanged(NULL);
97 return; 131 return;
98 } 132 }
99 #endif 133 #endif
100 } 134 }
101 135
102 static bool WillDispatchWindowFocusedEvent(BrowserContext* new_active_context, 136 static bool WillDispatchWindowFocusedEvent(BrowserContext* new_active_context,
103 int window_id, 137 int window_id,
(...skipping 27 matching lines...) Expand all
131 } 165 }
132 166
133 if (focused_window_id_ == window_id) 167 if (focused_window_id_ == window_id)
134 return; 168 return;
135 169
136 // window_profile is either the default profile for the active window, its 170 // window_profile is either the default profile for the active window, its
137 // incognito profile, or NULL iff the previous profile is losing focus. 171 // incognito profile, or NULL iff the previous profile is losing focus.
138 focused_profile_ = window_profile; 172 focused_profile_ = window_profile;
139 focused_window_id_ = window_id; 173 focused_window_id_ = window_id;
140 174
175 if (!dispatch_events_)
176 return;
177
141 scoped_ptr<Event> event(new Event(events::UNKNOWN, 178 scoped_ptr<Event> event(new Event(events::UNKNOWN,
142 windows::OnFocusChanged::kEventName, 179 windows::OnFocusChanged::kEventName,
143 make_scoped_ptr(new base::ListValue()))); 180 make_scoped_ptr(new base::ListValue())));
144 event->will_dispatch_callback = 181 event->will_dispatch_callback =
145 base::Bind(&WillDispatchWindowFocusedEvent, 182 base::Bind(&WillDispatchWindowFocusedEvent,
146 static_cast<BrowserContext*>(window_profile), 183 static_cast<BrowserContext*>(window_profile),
147 window_id); 184 window_id);
148 EventRouter::Get(profile_)->BroadcastEvent(event.Pass()); 185 EventRouter::Get(profile_)->BroadcastEvent(event.Pass());
149 } 186 }
150 187
151 void WindowsEventRouter::DispatchEvent(const std::string& event_name, 188 void WindowsEventRouter::DispatchEvent(const std::string& event_name,
152 Profile* profile, 189 Profile* profile,
153 scoped_ptr<base::ListValue> args) { 190 scoped_ptr<base::ListValue> args) {
154 scoped_ptr<Event> event(new Event(events::UNKNOWN, event_name, args.Pass())); 191 scoped_ptr<Event> event(new Event(events::UNKNOWN, event_name, args.Pass()));
155 event->restrict_to_browser_context = profile; 192 event->restrict_to_browser_context = profile;
156 EventRouter::Get(profile)->BroadcastEvent(event.Pass()); 193 EventRouter::Get(profile)->BroadcastEvent(event.Pass());
157 } 194 }
158 195
159 } // namespace extensions 196 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698