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

Side by Side Diff: extensions/shell/browser/shell_desktop_controller_aura.cc

Issue 696063008: Refactor ShellDesktopController and ShellNativeAppWindow to allow for non-aura implementations. (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: + Created 6 years, 1 month 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "extensions/shell/browser/shell_desktop_controller.h" 5 #include "extensions/shell/browser/shell_desktop_controller_aura.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/command_line.h" 11 #include "base/command_line.h"
12 #include "extensions/browser/app_window/app_window.h" 12 #include "extensions/browser/app_window/app_window.h"
13 #include "extensions/browser/app_window/native_app_window.h" 13 #include "extensions/browser/app_window/native_app_window.h"
14 #include "extensions/shell/browser/shell_app_delegate.h" 14 #include "extensions/shell/browser/shell_app_delegate.h"
15 #include "extensions/shell/browser/shell_app_window_client.h" 15 #include "extensions/shell/browser/shell_app_window_client.h"
16 #include "extensions/shell/common/switches.h" 16 #include "extensions/shell/common/switches.h"
17 #include "ui/aura/client/cursor_client.h" 17 #include "ui/aura/client/cursor_client.h"
18 #include "ui/aura/client/default_capture_client.h" 18 #include "ui/aura/client/default_capture_client.h"
19 #include "ui/aura/layout_manager.h" 19 #include "ui/aura/layout_manager.h"
20 #include "ui/aura/test/test_screen.h" 20 #include "ui/aura/test/test_screen.h"
21 #include "ui/aura/window.h" 21 #include "ui/aura/window.h"
22 #include "ui/aura/window_event_dispatcher.h" 22 #include "ui/aura/window_event_dispatcher.h"
23 #include "ui/aura/window_tree_host.h" 23 #include "ui/aura/window_tree_host.h"
24 #include "ui/base/cursor/cursor.h" 24 #include "ui/base/cursor/cursor.h"
25 #include "ui/base/cursor/image_cursors.h" 25 #include "ui/base/cursor/image_cursors.h"
26 #include "ui/base/ime/input_method_initializer.h" 26 #include "ui/base/ime/input_method_initializer.h"
27 #include "ui/gfx/geometry/size.h"
27 #include "ui/gfx/native_widget_types.h" 28 #include "ui/gfx/native_widget_types.h"
28 #include "ui/gfx/screen.h" 29 #include "ui/gfx/screen.h"
29 #include "ui/wm/core/base_focus_rules.h" 30 #include "ui/wm/core/base_focus_rules.h"
30 #include "ui/wm/core/compound_event_filter.h" 31 #include "ui/wm/core/compound_event_filter.h"
31 #include "ui/wm/core/cursor_manager.h" 32 #include "ui/wm/core/cursor_manager.h"
32 #include "ui/wm/core/focus_controller.h" 33 #include "ui/wm/core/focus_controller.h"
33 #include "ui/wm/core/input_method_event_filter.h" 34 #include "ui/wm/core/input_method_event_filter.h"
34 #include "ui/wm/core/native_cursor_manager.h" 35 #include "ui/wm/core/native_cursor_manager.h"
35 #include "ui/wm/core/native_cursor_manager_delegate.h" 36 #include "ui/wm/core/native_cursor_manager_delegate.h"
36 #include "ui/wm/core/user_activity_detector.h" 37 #include "ui/wm/core/user_activity_detector.h"
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 bool SupportsChildActivation(aura::Window* window) const override { 152 bool SupportsChildActivation(aura::Window* window) const override {
152 return true; 153 return true;
153 } 154 }
154 155
155 private: 156 private:
156 DISALLOW_COPY_AND_ASSIGN(AppsFocusRules); 157 DISALLOW_COPY_AND_ASSIGN(AppsFocusRules);
157 }; 158 };
158 159
159 } // namespace 160 } // namespace
160 161
161 ShellDesktopController::ShellDesktopController() 162 ShellDesktopControllerAura::ShellDesktopControllerAura()
162 : app_window_client_(new ShellAppWindowClient) { 163 : app_window_client_(new ShellAppWindowClient) {
163 extensions::AppWindowClient::Set(app_window_client_.get()); 164 extensions::AppWindowClient::Set(app_window_client_.get());
164 165
165 #if defined(OS_CHROMEOS) 166 #if defined(OS_CHROMEOS)
166 chromeos::DBusThreadManager::Get()->GetPowerManagerClient()-> 167 chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver(
167 AddObserver(this); 168 this);
168 display_configurator_.reset(new ui::DisplayConfigurator); 169 display_configurator_.reset(new ui::DisplayConfigurator);
169 display_configurator_->Init(false); 170 display_configurator_->Init(false);
170 display_configurator_->ForceInitialConfigure(0); 171 display_configurator_->ForceInitialConfigure(0);
171 display_configurator_->AddObserver(this); 172 display_configurator_->AddObserver(this);
172 #endif 173 #endif
173 CreateRootWindow(); 174 CreateRootWindow();
174 } 175 }
175 176
176 ShellDesktopController::~ShellDesktopController() { 177 ShellDesktopControllerAura::~ShellDesktopControllerAura() {
177 CloseAppWindows(); 178 CloseAppWindows();
178 DestroyRootWindow(); 179 DestroyRootWindow();
179 #if defined(OS_CHROMEOS) 180 #if defined(OS_CHROMEOS)
180 chromeos::DBusThreadManager::Get()->GetPowerManagerClient()-> 181 chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->RemoveObserver(
181 RemoveObserver(this); 182 this);
182 #endif 183 #endif
183 extensions::AppWindowClient::Set(NULL); 184 extensions::AppWindowClient::Set(NULL);
184 } 185 }
185 186
186 aura::WindowTreeHost* ShellDesktopController::GetHost() { 187 gfx::Size ShellDesktopControllerAura::GetWindowSize() {
187 return host_.get(); 188 return host_->window()->bounds().size();
188 } 189 }
189 190
190 AppWindow* ShellDesktopController::CreateAppWindow( 191 AppWindow* ShellDesktopControllerAura::CreateAppWindow(
191 content::BrowserContext* context, 192 content::BrowserContext* context,
192 const Extension* extension) { 193 const Extension* extension) {
193 app_windows_.push_back( 194 app_windows_.push_back(
194 new AppWindow(context, new ShellAppDelegate, extension)); 195 new AppWindow(context, new ShellAppDelegate, extension));
195 return app_windows_.back(); 196 return app_windows_.back();
196 } 197 }
197 198
198 void ShellDesktopController::AddAppWindow(aura::Window* window) { 199 void ShellDesktopControllerAura::AddAppWindow(gfx::NativeWindow window) {
199 aura::Window* root_window = GetHost()->window(); 200 aura::Window* root_window = host_->window();
200 root_window->AddChild(window); 201 root_window->AddChild(window);
201 } 202 }
202 203
203 void ShellDesktopController::RemoveAppWindow(AppWindow* window) { 204 void ShellDesktopControllerAura::RemoveAppWindow(AppWindow* window) {
204 auto iter = std::find(app_windows_.begin(), app_windows_.end(), window); 205 auto iter = std::find(app_windows_.begin(), app_windows_.end(), window);
205 DCHECK(iter != app_windows_.end()); 206 DCHECK(iter != app_windows_.end());
206 app_windows_.erase(iter); 207 app_windows_.erase(iter);
207 } 208 }
208 209
209 void ShellDesktopController::CloseAppWindows() { 210 void ShellDesktopControllerAura::CloseAppWindows() {
210 // Create a copy of the window vector, because closing the windows will 211 // Create a copy of the window vector, because closing the windows will
211 // trigger RemoveAppWindow, which will invalidate the iterator. 212 // trigger RemoveAppWindow, which will invalidate the iterator.
212 // This vector should be small enough that this should not be an issue. 213 // This vector should be small enough that this should not be an issue.
213 std::vector<AppWindow*> app_windows(app_windows_); 214 std::vector<AppWindow*> app_windows(app_windows_);
214 for (AppWindow* app_window : app_windows) 215 for (AppWindow* app_window : app_windows)
215 app_window->GetBaseWindow()->Close(); // Close() deletes |app_window|. 216 app_window->GetBaseWindow()->Close(); // Close() deletes |app_window|.
216 app_windows_.clear(); 217 app_windows_.clear();
217 } 218 }
218 219
219 aura::Window* ShellDesktopController::GetDefaultParent( 220 aura::Window* ShellDesktopControllerAura::GetDefaultParent(
220 aura::Window* context, 221 aura::Window* context,
221 aura::Window* window, 222 aura::Window* window,
222 const gfx::Rect& bounds) { 223 const gfx::Rect& bounds) {
223 return host_->window(); 224 return host_->window();
224 } 225 }
225 226
226 #if defined(OS_CHROMEOS) 227 #if defined(OS_CHROMEOS)
227 void ShellDesktopController::PowerButtonEventReceived( 228 void ShellDesktopControllerAura::PowerButtonEventReceived(
228 bool down, 229 bool down,
229 const base::TimeTicks& timestamp) { 230 const base::TimeTicks& timestamp) {
230 if (down) { 231 if (down) {
231 chromeos::DBusThreadManager::Get()->GetPowerManagerClient()-> 232 chromeos::DBusThreadManager::Get()
232 RequestShutdown(); 233 ->GetPowerManagerClient()
234 ->RequestShutdown();
233 } 235 }
234 } 236 }
235 237
236 void ShellDesktopController::OnDisplayModeChanged( 238 void ShellDesktopControllerAura::OnDisplayModeChanged(
237 const std::vector<ui::DisplayConfigurator::DisplayState>& displays) { 239 const std::vector<ui::DisplayConfigurator::DisplayState>& displays) {
238 gfx::Size size = GetPrimaryDisplaySize(); 240 gfx::Size size = GetPrimaryDisplaySize();
239 if (!size.IsEmpty()) 241 if (!size.IsEmpty())
240 host_->UpdateRootWindowSize(size); 242 host_->UpdateRootWindowSize(size);
241 } 243 }
242 #endif 244 #endif
243 245
244 void ShellDesktopController::OnHostCloseRequested( 246 void ShellDesktopControllerAura::OnHostCloseRequested(
245 const aura::WindowTreeHost* host) { 247 const aura::WindowTreeHost* host) {
246 DCHECK_EQ(host_.get(), host); 248 DCHECK_EQ(host_.get(), host);
247 CloseAppWindows(); 249 CloseAppWindows();
248 base::MessageLoop::current()->PostTask(FROM_HERE, 250 base::MessageLoop::current()->PostTask(FROM_HERE,
249 base::MessageLoop::QuitClosure()); 251 base::MessageLoop::QuitClosure());
250 } 252 }
251 253
252 void ShellDesktopController::InitWindowManager() { 254 void ShellDesktopControllerAura::InitWindowManager() {
253 wm::FocusController* focus_controller = 255 wm::FocusController* focus_controller =
254 new wm::FocusController(new AppsFocusRules()); 256 new wm::FocusController(new AppsFocusRules());
255 aura::client::SetFocusClient(host_->window(), focus_controller); 257 aura::client::SetFocusClient(host_->window(), focus_controller);
256 host_->window()->AddPreTargetHandler(focus_controller); 258 host_->window()->AddPreTargetHandler(focus_controller);
257 aura::client::SetActivationClient(host_->window(), focus_controller); 259 aura::client::SetActivationClient(host_->window(), focus_controller);
258 focus_client_.reset(focus_controller); 260 focus_client_.reset(focus_controller);
259 261
260 input_method_filter_.reset( 262 input_method_filter_.reset(
261 new wm::InputMethodEventFilter(host_->GetAcceleratedWidget())); 263 new wm::InputMethodEventFilter(host_->GetAcceleratedWidget()));
262 input_method_filter_->SetInputMethodPropertyInRootWindow(host_->window()); 264 input_method_filter_->SetInputMethodPropertyInRootWindow(host_->window());
(...skipping 15 matching lines...) Expand all
278 280
279 user_activity_detector_.reset(new wm::UserActivityDetector); 281 user_activity_detector_.reset(new wm::UserActivityDetector);
280 host_->event_processor()->GetRootTarget()->AddPreTargetHandler( 282 host_->event_processor()->GetRootTarget()->AddPreTargetHandler(
281 user_activity_detector_.get()); 283 user_activity_detector_.get());
282 #if defined(OS_CHROMEOS) 284 #if defined(OS_CHROMEOS)
283 user_activity_notifier_.reset( 285 user_activity_notifier_.reset(
284 new ui::UserActivityPowerManagerNotifier(user_activity_detector_.get())); 286 new ui::UserActivityPowerManagerNotifier(user_activity_detector_.get()));
285 #endif 287 #endif
286 } 288 }
287 289
288 void ShellDesktopController::CreateRootWindow() { 290 void ShellDesktopControllerAura::CreateRootWindow() {
289 // Set up basic pieces of ui::wm. 291 // Set up basic pieces of ui::wm.
290 gfx::Size size; 292 gfx::Size size;
291 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); 293 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
292 if (command_line->HasSwitch(switches::kAppShellHostWindowBounds)) { 294 if (command_line->HasSwitch(switches::kAppShellHostWindowBounds)) {
293 const std::string size_str = 295 const std::string size_str =
294 command_line->GetSwitchValueASCII(switches::kAppShellHostWindowBounds); 296 command_line->GetSwitchValueASCII(switches::kAppShellHostWindowBounds);
295 int width, height; 297 int width, height;
296 CHECK_EQ(2, sscanf(size_str.c_str(), "%dx%d", &width, &height)); 298 CHECK_EQ(2, sscanf(size_str.c_str(), "%dx%d", &width, &height));
297 size = gfx::Size(width, height); 299 size = gfx::Size(width, height);
298 } else { 300 } else {
(...skipping 13 matching lines...) Expand all
312 root_window_event_filter_.reset(new wm::CompoundEventFilter); 314 root_window_event_filter_.reset(new wm::CompoundEventFilter);
313 host_->window()->AddPreTargetHandler(root_window_event_filter_.get()); 315 host_->window()->AddPreTargetHandler(root_window_event_filter_.get());
314 InitWindowManager(); 316 InitWindowManager();
315 317
316 host_->AddObserver(this); 318 host_->AddObserver(this);
317 319
318 // Ensure the X window gets mapped. 320 // Ensure the X window gets mapped.
319 host_->Show(); 321 host_->Show();
320 } 322 }
321 323
322 void ShellDesktopController::DestroyRootWindow() { 324 void ShellDesktopControllerAura::DestroyRootWindow() {
323 host_->RemoveObserver(this); 325 host_->RemoveObserver(this);
324 if (input_method_filter_) 326 if (input_method_filter_)
325 root_window_event_filter_->RemoveHandler(input_method_filter_.get()); 327 root_window_event_filter_->RemoveHandler(input_method_filter_.get());
326 if (user_activity_detector_) { 328 if (user_activity_detector_) {
327 host_->event_processor()->GetRootTarget()->RemovePreTargetHandler( 329 host_->event_processor()->GetRootTarget()->RemovePreTargetHandler(
328 user_activity_detector_.get()); 330 user_activity_detector_.get());
329 } 331 }
330 wm::FocusController* focus_controller = 332 wm::FocusController* focus_controller =
331 static_cast<wm::FocusController*>(focus_client_.get()); 333 static_cast<wm::FocusController*>(focus_client_.get());
332 if (focus_controller) { 334 if (focus_controller) {
333 host_->window()->RemovePreTargetHandler(focus_controller); 335 host_->window()->RemovePreTargetHandler(focus_controller);
334 aura::client::SetActivationClient(host_->window(), NULL); 336 aura::client::SetActivationClient(host_->window(), NULL);
335 } 337 }
336 root_window_event_filter_.reset(); 338 root_window_event_filter_.reset();
337 capture_client_.reset(); 339 capture_client_.reset();
338 input_method_filter_.reset(); 340 input_method_filter_.reset();
339 focus_client_.reset(); 341 focus_client_.reset();
340 cursor_manager_.reset(); 342 cursor_manager_.reset();
341 #if defined(OS_CHROMEOS) 343 #if defined(OS_CHROMEOS)
342 user_activity_notifier_.reset(); 344 user_activity_notifier_.reset();
343 #endif 345 #endif
344 user_activity_detector_.reset(); 346 user_activity_detector_.reset();
345 host_.reset(); 347 host_.reset();
346 } 348 }
347 349
348 gfx::Size ShellDesktopController::GetPrimaryDisplaySize() { 350 gfx::Size ShellDesktopControllerAura::GetPrimaryDisplaySize() {
349 #if defined(OS_CHROMEOS) 351 #if defined(OS_CHROMEOS)
350 const std::vector<ui::DisplayConfigurator::DisplayState>& displays = 352 const std::vector<ui::DisplayConfigurator::DisplayState>& displays =
351 display_configurator_->cached_displays(); 353 display_configurator_->cached_displays();
352 if (displays.empty()) 354 if (displays.empty())
353 return gfx::Size(); 355 return gfx::Size();
354 const ui::DisplayMode* mode = displays[0].display->current_mode(); 356 const ui::DisplayMode* mode = displays[0].display->current_mode();
355 return mode ? mode->size() : gfx::Size(); 357 return mode ? mode->size() : gfx::Size();
356 #else 358 #else
357 return gfx::Size(); 359 return gfx::Size();
358 #endif 360 #endif
359 } 361 }
360 362
361 } // namespace extensions 363 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698