blob: 74a224b2e8d91aa2fe0161ffe42bbd56dc7c1521 [file] [log] [blame]
[email protected]e0d22e82012-01-04 00:46:571// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]87b0d82e2011-10-07 21:02:592// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]b65bdda2011-12-23 23:35:315#include "ash/shell.h"
[email protected]87b0d82e2011-10-07 21:02:596
[email protected]f7eb89c2011-12-13 09:48:547#include <algorithm>
[email protected]0039db92012-05-09 04:11:458#include <string>
dchengcbf0d9d2015-12-27 22:49:239#include <utility>
[email protected]f7eb89c2011-12-13 09:48:5410
James Cookb0bf8e82017-04-09 17:01:4411#include "ash/accelerators/accelerator_controller.h"
[email protected]60d677d2014-05-30 13:07:0212#include "ash/accelerators/accelerator_delegate.h"
James Cookb0bf8e82017-04-09 17:01:4413#include "ash/accelerators/ash_focus_manager_factory.h"
jamescook01bf23e72017-01-09 19:58:1514#include "ash/accelerators/magnifier_key_scroller.h"
15#include "ash/accelerators/spoken_feedback_toggler.h"
James Cookb0bf8e82017-04-09 17:01:4416#include "ash/accessibility_delegate.h"
sky15ef0aa2017-01-20 18:55:5917#include "ash/app_list/app_list_delegate_impl.h"
James Cookb0bf8e82017-04-09 17:01:4418#include "ash/ash_constants.h"
moshayedic229a522017-05-05 18:14:2619#include "ash/ash_switches.h"
[email protected]55398d22013-10-10 19:49:2020#include "ash/autoclick/autoclick_controller.h"
James Cookb0bf8e82017-04-09 17:01:4421#include "ash/cast_config_controller.h"
Scott Violetd64dac12017-06-02 21:50:0822#include "ash/display/ash_display_controller.h"
[email protected]87ec2202014-02-06 06:24:2723#include "ash/display/cursor_window_controller.h"
jamescook01bf23e72017-01-09 19:58:1524#include "ash/display/display_color_manager_chromeos.h"
stevenjb537c5c3f2016-01-20 23:38:1225#include "ash/display/display_configuration_controller.h"
jamescook01bf23e72017-01-09 19:58:1526#include "ash/display/display_error_observer_chromeos.h"
[email protected]682990f2013-01-10 06:49:1127#include "ash/display/event_transformation_handler.h"
[email protected]91545872012-11-21 13:58:2728#include "ash/display/mouse_cursor_event_filter.h"
jamescook01bf23e72017-01-09 19:58:1529#include "ash/display/projecting_observer_chromeos.h"
30#include "ash/display/resolution_notification_controller.h"
rjkroege2c9305402016-09-07 00:21:4531#include "ash/display/screen_ash.h"
jamescook01bf23e72017-01-09 19:58:1532#include "ash/display/screen_orientation_controller_chromeos.h"
[email protected]8d625fb2012-07-18 16:40:0633#include "ash/display/screen_position_controller.h"
jamescook01bf23e72017-01-09 19:58:1534#include "ash/display/shutdown_observer_chromeos.h"
oshimae2818922015-07-28 01:18:5235#include "ash/display/window_tree_host_manager.h"
[email protected]f4c92b382012-08-28 00:59:5936#include "ash/drag_drop/drag_drop_controller.h"
[email protected]59ccade2013-10-17 17:56:4037#include "ash/first_run/first_run_helper_impl.h"
James Cookb0bf8e82017-04-09 17:01:4438#include "ash/focus_cycler.h"
39#include "ash/frame/custom_frame_view_ash.h"
40#include "ash/gpu_support.h"
[email protected]f4c92b382012-08-28 00:59:5941#include "ash/high_contrast/high_contrast_controller.h"
Vladislav Kaznacheev6d6aaff2017-07-22 04:06:3242#include "ash/highlighter/highlighter_controller.h"
Scott Violet596bb46342017-06-21 14:43:1343#include "ash/host/ash_window_tree_host_init_params.h"
James Cookbb026732017-06-09 23:01:5544#include "ash/ime/ime_controller.h"
James Cookb0bf8e82017-04-09 17:01:4445#include "ash/keyboard/keyboard_ui.h"
sammiequon203ae022016-09-18 17:23:4246#include "ash/laser/laser_pointer_controller.h"
xiaoyinh2bbdd102017-05-18 23:29:4247#include "ash/login/lock_screen_controller.h"
James Cookb0bf8e82017-04-09 17:01:4448#include "ash/login_status.h"
[email protected]f4c92b382012-08-28 00:59:5949#include "ash/magnifier/magnification_controller.h"
[email protected]77f7c132012-11-15 06:52:5450#include "ash/magnifier/partial_magnification_controller.h"
James Cookb0bf8e82017-04-09 17:01:4451#include "ash/media_controller.h"
52#include "ash/new_window_controller.h"
53#include "ash/palette_delegate.h"
sky494c6cbd2017-03-27 20:57:4854#include "ash/public/cpp/config.h"
msw109806d2017-06-02 20:11:5755#include "ash/public/cpp/shelf_model.h"
jamescook8800b8232016-10-19 12:46:2756#include "ash/public/cpp/shell_window_ids.h"
[email protected]d90b8392012-06-13 09:34:5657#include "ash/root_window_controller.h"
James Cookb0bf8e82017-04-09 17:01:4458#include "ash/session/session_controller.h"
James Cook840177e2017-05-25 02:20:0159#include "ash/shelf/shelf.h"
James Cookb0bf8e82017-04-09 17:01:4460#include "ash/shelf/shelf_controller.h"
James Cookb0bf8e82017-04-09 17:01:4461#include "ash/shelf/shelf_window_watcher.h"
James Cookb0bf8e82017-04-09 17:01:4462#include "ash/shell_delegate.h"
[email protected]1b4c7472014-05-15 18:32:2363#include "ash/shell_init_params.h"
James Cookb0bf8e82017-04-09 17:01:4464#include "ash/shell_observer.h"
sky11cf8db92017-04-10 23:38:0865#include "ash/shell_port.h"
Scott Violet22a7b9212017-07-20 19:05:1966#include "ash/shell_port_classic.h"
James Cookb0bf8e82017-04-09 17:01:4467#include "ash/shutdown_controller.h"
jamescook01bf23e72017-01-09 19:58:1568#include "ash/sticky_keys/sticky_keys_controller.h"
James Cooka35a1e22017-04-08 02:33:0869#include "ash/system/bluetooth/bluetooth_notification_controller.h"
70#include "ash/system/bluetooth/tray_bluetooth_helper.h"
71#include "ash/system/brightness/brightness_controller_chromeos.h"
James Cookb0bf8e82017-04-09 17:01:4472#include "ash/system/brightness_control_delegate.h"
Lann Martinb9991402017-06-23 22:25:0873#include "ash/system/keyboard_brightness/keyboard_brightness_controller.h"
James Cookb0bf8e82017-04-09 17:01:4474#include "ash/system/keyboard_brightness_control_delegate.h"
James Cookb0bf8e82017-04-09 17:01:4475#include "ash/system/locale/locale_notification_controller.h"
James Cooka35a1e22017-04-08 02:33:0876#include "ash/system/network/sms_observer.h"
77#include "ash/system/network/vpn_list.h"
afakhrye4fae852017-05-09 18:49:0678#include "ash/system/night_light/night_light_controller.h"
Sammie Quon4d7dba62017-08-03 23:18:1779#include "ash/system/palette/palette_tray.h"
James Cooka35a1e22017-04-08 02:33:0880#include "ash/system/power/power_event_observer.h"
81#include "ash/system/power/power_status.h"
82#include "ash/system/power/video_activity_notifier.h"
83#include "ash/system/screen_layout_observer.h"
James Cookdc041122017-08-01 14:03:2284#include "ash/system/session/logout_button_tray.h"
James Cooka35a1e22017-04-08 02:33:0885#include "ash/system/session/logout_confirmation_controller.h"
James Cookb0bf8e82017-04-09 17:01:4486#include "ash/system/status_area_widget.h"
87#include "ash/system/toast/toast_manager.h"
88#include "ash/system/tray/system_tray_controller.h"
89#include "ash/system/tray/system_tray_delegate.h"
90#include "ash/system/tray/system_tray_notifier.h"
James Cook98072352017-08-07 18:00:0791#include "ash/system/tray_caps_lock.h"
kylechar55f0eaf22017-01-11 22:57:3792#include "ash/touch/ash_touch_transform_controller.h"
tbarzicc78da1ff92017-05-08 20:46:1593#include "ash/tray_action/tray_action.h"
oshima5a296e82016-04-29 01:32:2794#include "ash/utility/screenshot_controller.h"
jamescook01bf23e72017-01-09 19:58:1595#include "ash/virtual_keyboard_controller.h"
James Cookb0bf8e82017-04-09 17:01:4496#include "ash/wallpaper/wallpaper_controller.h"
97#include "ash/wallpaper/wallpaper_delegate.h"
[email protected]39718b52012-12-03 17:24:5698#include "ash/wm/ash_focus_rules.h"
James Cookb0bf8e82017-04-09 17:01:4499#include "ash/wm/container_finder.h"
[email protected]262f8bd2012-03-23 19:30:27100#include "ash/wm/event_client_impl.h"
James Cookb0bf8e82017-04-09 17:01:44101#include "ash/wm/immersive_context_ash.h"
skyb7b54092016-08-19 16:00:09102#include "ash/wm/immersive_handler_factory_ash.h"
[email protected]ab4f8c92013-05-30 19:07:47103#include "ash/wm/lock_state_controller.h"
James Cookb0bf8e82017-04-09 17:01:44104#include "ash/wm/mru_window_tracker.h"
erg36cfb952017-06-21 19:41:45105#include "ash/wm/native_cursor_manager_ash_classic.h"
106#include "ash/wm/native_cursor_manager_ash_mus.h"
[email protected]9ae32df2012-07-26 03:25:18107#include "ash/wm/overlay_event_filter.h"
James Cookb0bf8e82017-04-09 17:01:44108#include "ash/wm/overview/window_selector_controller.h"
[email protected]e0d22e82012-01-04 00:46:57109#include "ash/wm/power_button_controller.h"
[email protected]e4a181cc2012-03-17 02:20:57110#include "ash/wm/resize_shadow_controller.h"
James Cookb0bf8e82017-04-09 17:01:44111#include "ash/wm/root_window_finder.h"
hidehiko6821ca42016-06-18 11:12:23112#include "ash/wm/screen_pinning_controller.h"
xdaid4913762017-07-06 00:17:22113#include "ash/wm/splitview/split_view_controller.h"
[email protected]435b212e2012-04-05 19:43:37114#include "ash/wm/system_gesture_event_filter.h"
[email protected]c0ce80e2012-10-05 23:28:27115#include "ash/wm/system_modal_container_event_filter.h"
James Cookb0bf8e82017-04-09 17:01:44116#include "ash/wm/system_modal_container_layout_manager.h"
Mitsuru Oshima0e9b7a62017-07-19 18:23:03117#include "ash/wm/tablet_mode/tablet_mode_controller.h"
118#include "ash/wm/tablet_mode/tablet_mode_window_manager.h"
[email protected]3537d472014-01-15 05:45:31119#include "ash/wm/toplevel_window_event_handler.h"
[email protected]9633a9d22012-01-21 16:40:58120#include "ash/wm/video_detector.h"
[email protected]b5756e22012-11-30 01:32:02121#include "ash/wm/window_animations.h"
James Cookb0bf8e82017-04-09 17:01:44122#include "ash/wm/window_cycle_controller.h"
123#include "ash/wm/window_positioner.h"
[email protected]f059c6942012-07-21 14:27:57124#include "ash/wm/window_properties.h"
[email protected]f4c92b382012-08-28 00:59:59125#include "ash/wm/window_util.h"
James Cookb0bf8e82017-04-09 17:01:44126#include "ash/wm/workspace_controller.h"
[email protected]f296be72011-10-11 15:40:00127#include "base/bind.h"
jamescook01bf23e72017-01-09 19:58:15128#include "base/bind_helpers.h"
jamescookfda159002016-10-21 18:48:57129#include "base/command_line.h"
dchenga94547472016-04-08 08:41:11130#include "base/memory/ptr_util.h"
jamescook01bf23e72017-01-09 19:58:15131#include "base/sys_info.h"
tzik0dd58d42017-02-15 08:26:52132#include "base/threading/sequenced_worker_pool.h"
primiano7182d7b2015-01-30 18:02:03133#include "base/trace_event/trace_event.h"
jamescook01bf23e72017-01-09 19:58:15134#include "chromeos/audio/audio_a11y_controller.h"
135#include "chromeos/chromeos_switches.h"
136#include "chromeos/dbus/dbus_thread_manager.h"
reveman24158982017-01-10 05:58:45137#include "chromeos/system/devicemode.h"
tibellb93c729b2017-03-30 00:45:09138#include "components/prefs/pref_registry_simple.h"
139#include "components/prefs/pref_service.h"
tibellb93c729b2017-03-30 00:45:09140#include "services/preferences/public/cpp/pref_service_factory.h"
skyb073203a2017-03-13 16:59:16141#include "services/preferences/public/interfaces/preferences.mojom.h"
derat94887a22017-01-20 18:17:25142#include "services/service_manager/public/cpp/connector.h"
143#include "services/ui/public/interfaces/constants.mojom.h"
sky7db5ccf2017-03-14 21:52:29144#include "ui/app_list/presenter/app_list.h"
[email protected]2c456102011-12-26 06:26:34145#include "ui/aura/client/aura_constants.h"
[email protected]8a45c972012-03-14 18:22:44146#include "ui/aura/env.h"
[email protected]4bb16502011-12-06 14:44:58147#include "ui/aura/layout_manager.h"
sky68612712017-04-27 04:45:04148#include "ui/aura/mus/focus_synchronizer.h"
derat94887a22017-01-20 18:17:25149#include "ui/aura/mus/user_activity_forwarder.h"
sky68612712017-04-27 04:45:04150#include "ui/aura/mus/window_tree_client.h"
[email protected]87b0d82e2011-10-07 21:02:59151#include "ui/aura/window.h"
[email protected]fcc51c952014-02-21 21:31:26152#include "ui/aura/window_event_dispatcher.h"
[email protected]2d4817742012-12-17 20:16:18153#include "ui/base/ui_base_switches.h"
derat2d4e62d2015-01-09 16:09:17154#include "ui/base/user_activity/user_activity_detector.h"
jamescook01bf23e72017-01-09 19:58:15155#include "ui/chromeos/user_activity_power_manager_notifier.h"
[email protected]116302fc2012-05-05 21:45:41156#include "ui/compositor/layer.h"
157#include "ui/compositor/layer_animator.h"
oshimaf84b0da722016-04-27 19:47:19158#include "ui/display/display.h"
sky2f68b6f2017-05-21 16:08:39159#include "ui/display/manager/chromeos/default_touch_transform_setter.h"
jamescook01bf23e72017-01-09 19:58:15160#include "ui/display/manager/chromeos/display_change_observer.h"
161#include "ui/display/manager/chromeos/display_configurator.h"
sky7265b1cc2017-05-22 23:11:03162#include "ui/display/manager/chromeos/touch_transform_setter.h"
rjkroege72f8154f2016-10-29 00:49:02163#include "ui/display/manager/display_manager.h"
oshimaf84b0da722016-04-27 19:47:19164#include "ui/display/screen.h"
skycfaad892017-04-28 20:52:58165#include "ui/display/types/native_display_delegate.h"
[email protected]3e670aa2013-12-02 19:04:32166#include "ui/events/event_target_iterator.h"
sky4ec2be82017-01-06 17:38:32167#include "ui/gfx/geometry/insets.h"
[email protected]9ec0f452012-05-31 15:58:53168#include "ui/gfx/image/image_skia.h"
[email protected]b6ba05d902013-10-04 21:38:45169#include "ui/keyboard/keyboard_controller.h"
[email protected]608de6c2013-10-29 00:14:28170#include "ui/keyboard/keyboard_switches.h"
yhanada8909a542017-07-11 10:06:19171#include "ui/keyboard/keyboard_ui.h"
[email protected]f1d5c3a2013-04-23 17:42:56172#include "ui/keyboard/keyboard_util.h"
[email protected]d7f30a72013-10-05 05:09:41173#include "ui/views/corewm/tooltip_aura.h"
[email protected]a1b7a822013-02-23 19:08:04174#include "ui/views/corewm/tooltip_controller.h"
sky07a24d42017-03-09 23:57:30175#include "ui/views/focus/focus_manager_factory.h"
[email protected]c13be0d2011-11-22 02:09:58176#include "ui/views/widget/native_widget_aura.h"
177#include "ui/views/widget/widget.h"
[email protected]60d677d2014-05-30 13:07:02178#include "ui/wm/core/accelerator_filter.h"
[email protected]ee3ed10772014-03-11 22:02:01179#include "ui/wm/core/compound_event_filter.h"
180#include "ui/wm/core/focus_controller.h"
[email protected]ee3ed10772014-03-11 22:02:01181#include "ui/wm/core/shadow_controller.h"
182#include "ui/wm/core/visibility_controller.h"
183#include "ui/wm/core/window_modality_controller.h"
[email protected]87b0d82e2011-10-07 21:02:59184
[email protected]55f593352011-12-24 05:42:46185namespace ash {
[email protected]87b0d82e2011-10-07 21:02:59186
187namespace {
[email protected]671a2ae2011-10-13 21:53:23188
[email protected]615922f2012-02-07 02:41:15189using aura::Window;
[email protected]3f02dc52011-10-21 19:36:45190using views::Widget;
191
jamescook518dccbd2017-05-18 04:57:07192bool g_is_browser_process_with_mash = false;
193
[email protected]b5756e22012-11-30 01:32:02194// A Corewm VisibilityController subclass that calls the Ash animation routine
195// so we can pick up our extended animations. See ash/wm/window_animations.h.
[email protected]e319c7e2014-03-14 19:56:14196class AshVisibilityController : public ::wm::VisibilityController {
[email protected]b5756e22012-11-30 01:32:02197 public:
198 AshVisibilityController() {}
dcheng1f4538e2014-10-27 23:57:05199 ~AshVisibilityController() override {}
[email protected]b5756e22012-11-30 01:32:02200
201 private:
[email protected]e319c7e2014-03-14 19:56:14202 // Overridden from ::wm::VisibilityController:
dcheng1f4538e2014-10-27 23:57:05203 bool CallAnimateOnChildWindowVisibilityChanged(aura::Window* window,
204 bool visible) override {
[email protected]b5756e22012-11-30 01:32:02205 return AnimateOnChildWindowVisibilityChanged(window, visible);
206 }
207
208 DISALLOW_COPY_AND_ASSIGN(AshVisibilityController);
209};
210
[email protected]87b0d82e2011-10-07 21:02:59211} // namespace
212
[email protected]cac10fc62011-10-07 23:22:56213// static
achuith287b26e2015-09-03 17:49:18214Shell* Shell::instance_ = nullptr;
[email protected]2b4cd302012-02-24 20:21:13215// static
sky00f98a372017-01-11 06:03:49216aura::WindowTreeClient* Shell::window_tree_client_ = nullptr;
217// static
skya8b222f2017-01-12 15:47:13218aura::WindowManagerClient* Shell::window_manager_client_ = nullptr;
219// static
[email protected]9488d4d2012-02-29 18:32:37220bool Shell::initially_hide_cursor_ = false;
[email protected]2b4cd302012-02-24 20:21:13221
222////////////////////////////////////////////////////////////////////////////////
[email protected]cac10fc62011-10-07 23:22:56223// Shell, public:
224
[email protected]cac10fc62011-10-07 23:22:56225// static
[email protected]1b4c7472014-05-15 18:32:23226Shell* Shell::CreateInstance(const ShellInitParams& init_params) {
[email protected]3266c2b92011-11-14 00:06:08227 CHECK(!instance_);
sky11cf8db92017-04-10 23:38:08228 ShellPort* shell_port = init_params.shell_port;
229 if (!shell_port)
230 shell_port = new ShellPortClassic();
skyb073203a2017-03-13 16:59:16231 instance_ = new Shell(base::WrapUnique<ShellDelegate>(init_params.delegate),
sky11cf8db92017-04-10 23:38:08232 base::WrapUnique<ShellPort>(shell_port));
[email protected]1b4c7472014-05-15 18:32:23233 instance_->Init(init_params);
[email protected]3266c2b92011-11-14 00:06:08234 return instance_;
235}
236
237// static
skyb073203a2017-03-13 16:59:16238Shell* Shell::Get() {
jamescook518dccbd2017-05-18 04:57:07239 CHECK(!g_is_browser_process_with_mash) // Implies null |instance_|.
240 << "Ash is running in its own process so Shell::Get() will return null. "
241 "The browser process must use the mojo interfaces in //ash/public to "
242 "access ash. See ash/README.md for details.";
oshima9eea82da2014-09-13 01:11:07243 CHECK(instance_);
[email protected]cac10fc62011-10-07 23:22:56244 return instance_;
245}
246
[email protected]6377a002011-11-10 20:26:47247// static
[email protected]b3b7bcd2012-03-06 19:35:45248bool Shell::HasInstance() {
249 return !!instance_;
250}
251
252// static
[email protected]ef589af2011-12-03 01:07:15253void Shell::DeleteInstance() {
[email protected]6377a002011-11-10 20:26:47254 delete instance_;
[email protected]6377a002011-11-10 20:26:47255}
256
[email protected]e73bd7802012-02-17 20:10:34257// static
[email protected]093b8d642014-04-03 20:59:28258RootWindowController* Shell::GetPrimaryRootWindowController() {
oshima9eea82da2014-09-13 01:11:07259 CHECK(HasInstance());
msw257a6a232017-06-01 01:46:30260 return RootWindowController::ForWindow(GetPrimaryRootWindow());
[email protected]be65be362012-06-15 07:38:23261}
262
263// static
264Shell::RootWindowControllerList Shell::GetAllRootWindowControllers() {
oshima9eea82da2014-09-13 01:11:07265 CHECK(HasInstance());
skyabcae812017-01-18 17:01:34266 RootWindowControllerList root_window_controllers;
msw257a6a232017-06-01 01:46:30267 for (aura::Window* root : GetAllRootWindows())
268 root_window_controllers.push_back(RootWindowController::ForWindow(root));
skyabcae812017-01-18 17:01:34269 return root_window_controllers;
[email protected]d90b8392012-06-13 09:34:56270}
271
272// static
thanhphc90f49ca2017-03-03 17:48:53273RootWindowController* Shell::GetRootWindowControllerWithDisplayId(
274 int64_t display_id) {
275 CHECK(HasInstance());
Scott Violet596bb46342017-06-21 14:43:13276 aura::Window* root = GetRootWindowForDisplayId(display_id);
msw257a6a232017-06-01 01:46:30277 return root ? RootWindowController::ForWindow(root) : nullptr;
thanhphc90f49ca2017-03-03 17:48:53278}
279
280// static
Scott Violet596bb46342017-06-21 14:43:13281aura::Window* Shell::GetRootWindowForDisplayId(int64_t display_id) {
282 CHECK(HasInstance());
283 return instance_->window_tree_host_manager_->GetRootWindowForDisplayId(
284 display_id);
285}
286
287// static
[email protected]bf9cdb362013-10-25 19:22:45288aura::Window* Shell::GetPrimaryRootWindow() {
oshima9eea82da2014-09-13 01:11:07289 CHECK(HasInstance());
Scott Violet596bb46342017-06-21 14:43:13290 return instance_->window_tree_host_manager_->GetPrimaryRootWindow();
[email protected]e73bd7802012-02-17 20:10:34291}
292
[email protected]7b0f7502012-06-11 00:12:39293// static
sky27344382017-03-08 21:30:32294aura::Window* Shell::GetRootWindowForNewWindows() {
295 CHECK(Shell::HasInstance());
skycb4be5b2017-04-06 17:52:45296 Shell* shell = Shell::Get();
sky27344382017-03-08 21:30:32297 if (shell->scoped_root_window_for_new_windows_)
298 return shell->scoped_root_window_for_new_windows_;
299 return shell->root_window_for_new_windows_;
mfomitcheva1a8aa62016-05-03 16:23:26300}
301
302// static
[email protected]c9390bd2013-11-08 20:33:13303aura::Window::Windows Shell::GetAllRootWindows() {
oshima9eea82da2014-09-13 01:11:07304 CHECK(HasInstance());
Scott Violet596bb46342017-06-21 14:43:13305 return instance_->window_tree_host_manager_->GetAllRootWindows();
[email protected]be65be362012-06-15 07:38:23306}
307
308// static
jamescookb8dcef522016-06-25 14:42:55309aura::Window* Shell::GetContainer(aura::Window* root_window, int container_id) {
[email protected]7b0f7502012-06-11 00:12:39310 return root_window->GetChildById(container_id);
311}
312
313// static
[email protected]bf9cdb362013-10-25 19:22:45314const aura::Window* Shell::GetContainer(const aura::Window* root_window,
[email protected]e67291f12012-10-10 05:52:38315 int container_id) {
316 return root_window->GetChildById(container_id);
317}
318
sky494c6cbd2017-03-27 20:57:48319// static
jamescook0dfe5632017-04-05 18:49:02320Config Shell::GetAshConfig() {
sky11cf8db92017-04-10 23:38:08321 return Get()->shell_port_->GetAshConfig();
sky494c6cbd2017-03-27 20:57:48322}
323
moshayedic229a522017-05-05 18:14:26324// static
325bool Shell::ShouldUseIMEService() {
326 return Shell::GetAshConfig() == Config::MASH ||
327 (Shell::GetAshConfig() == Config::MUS &&
328 base::CommandLine::ForCurrentProcess()->HasSwitch(
329 switches::kUseIMEService));
330}
331
afakhrye4fae852017-05-09 18:49:06332// static
Wenzhao Zang56c292932017-08-02 04:58:34333void Shell::RegisterLocalStatePrefs(PrefRegistrySimple* registry) {
Sammie Quon4d7dba62017-08-03 23:18:17334 PaletteTray::RegisterLocalStatePrefs(registry);
Wenzhao Zang56c292932017-08-02 04:58:34335 WallpaperController::RegisterLocalStatePrefs(registry);
336}
337
338// static
James Cook8532dbc2017-07-31 21:54:51339void Shell::RegisterProfilePrefs(PrefRegistrySimple* registry) {
James Cookdc041122017-08-01 14:03:22340 LogoutButtonTray::RegisterProfilePrefs(registry);
James Cook8532dbc2017-07-31 21:54:51341 NightLightController::RegisterProfilePrefs(registry);
afakhrye4fae852017-05-09 18:49:06342}
343
[email protected]57b8bb352012-01-11 05:11:46344views::NonClientFrameView* Shell::CreateDefaultNonClientFrameView(
345 views::Widget* widget) {
[email protected]c73d1332012-03-08 17:11:04346 // Use translucent-style window frames for dialogs.
[email protected]85501fe2013-10-18 10:15:27347 return new CustomFrameViewAsh(widget);
[email protected]57b8bb352012-01-11 05:11:46348}
349
[email protected]2e236a52012-06-27 22:21:47350void Shell::SetDisplayWorkAreaInsets(Window* contains,
[email protected]8a45c972012-03-14 18:22:44351 const gfx::Insets& insets) {
Scott Violet596bb46342017-06-21 14:43:13352 window_tree_host_manager_->UpdateWorkAreaOfDisplayNearestWindow(contains,
353 insets);
[email protected]1a2145b2012-03-13 21:09:17354}
355
[email protected]58868abf2014-01-17 23:45:33356void Shell::OnCastingSessionStartedOrStopped(bool started) {
sky00c813f2017-03-08 22:48:55357 for (auto& observer : shell_observers_)
ericwilligers5eff47d2016-10-17 19:19:18358 observer.OnCastingSessionStartedOrStopped(started);
[email protected]58868abf2014-01-17 23:45:33359}
360
varkhac71444e52017-05-25 22:51:34361void Shell::OnRootWindowAdded(aura::Window* root_window) {
sky00c813f2017-03-08 22:48:55362 for (auto& observer : shell_observers_)
ericwilligers5eff47d2016-10-17 19:19:18363 observer.OnRootWindowAdded(root_window);
[email protected]0e3e7cb2014-04-12 05:18:25364}
365
[email protected]51f438112013-11-18 19:32:50366void Shell::CreateKeyboard() {
Keigo Okae82281a2017-06-14 13:59:14367 if (keyboard::IsKeyboardEnabled()) {
368 if (keyboard::KeyboardController::GetInstance()) {
369 RootWindowControllerList controllers = GetAllRootWindowControllers();
370 for (RootWindowControllerList::iterator iter = controllers.begin();
371 iter != controllers.end(); ++iter) {
372 (*iter)->DeactivateKeyboard(
373 keyboard::KeyboardController::GetInstance());
374 }
375 }
376 keyboard::KeyboardController::ResetInstance(
377 new keyboard::KeyboardController(shell_delegate_->CreateKeyboardUI(),
378 virtual_keyboard_controller_.get()));
379 for (auto& observer : shell_observers_)
380 observer.OnKeyboardControllerCreated();
381 }
382
jamescookb8dcef522016-06-25 14:42:55383 GetPrimaryRootWindowController()->ActivateKeyboard(
384 keyboard::KeyboardController::GetInstance());
[email protected]51f438112013-11-18 19:32:50385}
386
Keigo Okac7617a42017-06-14 11:33:24387void Shell::DestroyKeyboard() {
sky11cf8db92017-04-10 23:38:08388 // TODO(jamescook): Move keyboard create and hide into ShellPort.
sky79fa34712017-03-20 23:46:47389 keyboard_ui_->Hide();
[email protected]a0b3fb882014-04-07 19:26:03390 if (keyboard::KeyboardController::GetInstance()) {
[email protected]e1b299b2014-01-29 23:53:41391 RootWindowControllerList controllers = GetAllRootWindowControllers();
392 for (RootWindowControllerList::iterator iter = controllers.begin();
jamescookb8dcef522016-06-25 14:42:55393 iter != controllers.end(); ++iter) {
[email protected]a0b3fb882014-04-07 19:26:03394 (*iter)->DeactivateKeyboard(keyboard::KeyboardController::GetInstance());
[email protected]e1b299b2014-01-29 23:53:41395 }
396 }
achuith287b26e2015-09-03 17:49:18397 keyboard::KeyboardController::ResetInstance(nullptr);
[email protected]e1b299b2014-01-29 23:53:41398}
399
[email protected]da285852014-05-27 19:53:43400bool Shell::ShouldSaveDisplaySettings() {
sky2c5eae82017-06-06 01:46:58401 // This function is only called from Chrome, hence the DCHECK for not-MASH.
skye5fd1222017-04-12 18:43:23402 DCHECK(GetAshConfig() != Config::MASH);
jamescookb8dcef522016-06-25 14:42:55403 return !(
404 screen_orientation_controller_->ignore_display_configuration_updates() ||
405 resolution_notification_controller_->DoesNotificationTimeout());
[email protected]da285852014-05-27 19:53:43406}
[email protected]da285852014-05-27 19:53:43407
afakhry9e0a18b32017-06-05 19:23:14408NightLightController* Shell::night_light_controller() {
409 DCHECK(NightLightController::IsFeatureEnabled());
410 return night_light_controller_.get();
411}
412
sky5ad143a2017-03-22 04:31:23413ShelfModel* Shell::shelf_model() {
414 return shelf_controller_->model();
415}
416
Thiago Farina3b086a02017-05-30 22:32:50417::wm::ActivationClient* Shell::activation_client() {
sky27344382017-03-08 21:30:32418 return focus_controller_.get();
419}
420
[email protected]c758fbf2012-03-25 22:53:59421void Shell::UpdateShelfVisibility() {
msw257a6a232017-06-01 01:46:30422 for (aura::Window* root : GetAllRootWindows())
423 Shelf::ForWindow(root)->UpdateVisibilityState();
[email protected]c758fbf2012-03-25 22:53:59424}
425
James Cook6d51c9182017-08-04 01:31:00426PrefService* Shell::GetActiveUserPrefService() const {
427 if (shell_port_->GetAshConfig() == Config::MASH)
James Cookbbe5cb12017-08-08 18:32:21428 return profile_pref_service_mash_.get();
James Cook6d51c9182017-08-04 01:31:00429
430 return shell_delegate_->GetActiveUserPrefService();
431}
432
Wenzhao Zang44240fb2017-07-13 01:36:54433PrefService* Shell::GetLocalStatePrefService() const {
Sam McNallye36abbc2017-07-20 01:04:28434 if (shell_port_->GetAshConfig() == Config::MASH)
James Cookbbe5cb12017-08-08 18:32:21435 return local_state_mash_.get();
Sam McNallye36abbc2017-07-20 01:04:28436
James Cookbbe5cb12017-08-08 18:32:21437 return local_state_non_mash_;
Wenzhao Zang44240fb2017-07-13 01:36:54438}
439
[email protected]88d71122012-10-18 07:11:01440WebNotificationTray* Shell::GetWebNotificationTray() {
jamescook612205f2016-05-26 06:02:11441 return GetPrimaryRootWindowController()
jamescookb551aba2016-09-01 01:00:16442 ->GetStatusAreaWidget()
jamescook612205f2016-05-26 06:02:11443 ->web_notification_tray();
[email protected]e74aaf0a2012-10-12 18:42:28444}
445
[email protected]a0afeb12012-12-10 22:57:09446bool Shell::HasPrimaryStatusArea() {
jamescookb551aba2016-09-01 01:00:16447 return !!GetPrimaryRootWindowController()->GetStatusAreaWidget();
[email protected]31f19e32012-10-30 22:31:23448}
449
[email protected]a0afeb12012-12-10 22:57:09450SystemTray* Shell::GetPrimarySystemTray() {
451 return GetPrimaryRootWindowController()->GetSystemTray();
[email protected]aa54218b2012-06-12 16:51:42452}
453
[email protected]2b8a9bb2013-07-01 22:43:40454void Shell::SetTouchHudProjectionEnabled(bool enabled) {
455 if (is_touch_hud_projection_enabled_ == enabled)
456 return;
457
[email protected]2b8a9bb2013-07-01 22:43:40458 is_touch_hud_projection_enabled_ = enabled;
sky00c813f2017-03-08 22:48:55459 for (auto& observer : shell_observers_)
ericwilligers5eff47d2016-10-17 19:19:18460 observer.OnTouchHudProjectionToggled(enabled);
[email protected]2b8a9bb2013-07-01 22:43:40461}
462
mswa7e8a5f2016-03-01 04:15:06463FirstRunHelper* Shell::CreateFirstRunHelper() {
464 return new FirstRunHelperImpl;
[email protected]59ccade2013-10-17 17:56:40465}
[email protected]87ec2202014-02-06 06:24:27466
yawanodc5533b32017-02-23 11:04:38467void Shell::SetLargeCursorSizeInDip(int large_cursor_size_in_dip) {
468 window_tree_host_manager_->cursor_window_controller()
469 ->SetLargeCursorSizeInDip(large_cursor_size_in_dip);
470}
471
[email protected]87ec2202014-02-06 06:24:27472void Shell::SetCursorCompositingEnabled(bool enabled) {
erg36cfb952017-06-21 19:41:45473 if (GetAshConfig() != Config::MASH) {
474 // TODO: needs to work in mash. http://crbug.com/705592.
sky494c6cbd2017-03-27 20:57:48475 window_tree_host_manager_->cursor_window_controller()
476 ->SetCursorCompositingEnabled(enabled);
477 native_cursor_manager_->SetNativeCursorEnabled(!enabled);
478 }
[email protected]87ec2202014-02-06 06:24:27479}
[email protected]59ccade2013-10-17 17:56:40480
[email protected]f9466702012-09-17 16:35:27481void Shell::DoInitialWorkspaceAnimation() {
jamescookb8dcef522016-06-25 14:42:55482 return GetPrimaryRootWindowController()
483 ->workspace_controller()
484 ->DoInitialAnimation();
[email protected]f9466702012-09-17 16:35:27485}
486
xdaid4913762017-07-06 00:17:22487bool Shell::IsSplitViewModeActive() const {
488 return split_view_controller_->IsSplitViewModeActive();
489}
490
sky00c813f2017-03-08 22:48:55491void Shell::AddShellObserver(ShellObserver* observer) {
492 shell_observers_.AddObserver(observer);
493}
494
495void Shell::RemoveShellObserver(ShellObserver* observer) {
496 shell_observers_.RemoveObserver(observer);
497}
498
sky7db5ccf2017-03-14 21:52:29499void Shell::ShowAppList() {
500 // Show the app list on the default display for new windows.
mswad3d9552017-05-18 21:23:36501 app_list_->Show(display::Screen::GetScreen()
502 ->GetDisplayNearestWindow(GetRootWindowForNewWindows())
503 .id());
sky7db5ccf2017-03-14 21:52:29504}
505
MinCheneafaa52e2017-07-31 18:32:52506void Shell::UpdateAppListYPositionAndOpacity(int y_position_in_screen,
507 float app_list_background_opacity,
508 bool is_end_gesture) {
509 app_list_->UpdateYPositionAndOpacity(
510 y_position_in_screen, app_list_background_opacity, is_end_gesture);
MinChend646ae02017-07-21 23:07:17511}
512
sky7db5ccf2017-03-14 21:52:29513void Shell::DismissAppList() {
514 app_list_->Dismiss();
515}
516
517void Shell::ToggleAppList() {
518 // Toggle the app list on the default display for new windows.
519 app_list_->ToggleAppList(
mswad3d9552017-05-18 21:23:36520 display::Screen::GetScreen()
521 ->GetDisplayNearestWindow(GetRootWindowForNewWindows())
522 .id());
sky7db5ccf2017-03-14 21:52:29523}
524
525bool Shell::IsAppListVisible() const {
526 return app_list_->IsVisible();
527}
528
529bool Shell::GetAppListTargetVisibility() const {
530 return app_list_->GetTargetVisibility();
531}
532
sky5ad143a2017-03-22 04:31:23533void Shell::UpdateAfterLoginStatusChange(LoginStatus status) {
varkha59679632017-06-01 00:42:05534 for (auto* root_window_controller : GetAllRootWindowControllers())
535 root_window_controller->UpdateAfterLoginStatusChange(status);
sky5ad143a2017-03-22 04:31:23536}
537
sky00c813f2017-03-08 22:48:55538void Shell::NotifyOverviewModeStarting() {
539 for (auto& observer : shell_observers_)
540 observer.OnOverviewModeStarting();
541}
542
543void Shell::NotifyOverviewModeEnded() {
544 for (auto& observer : shell_observers_)
545 observer.OnOverviewModeEnded();
546}
547
xdaid4913762017-07-06 00:17:22548void Shell::NotifySplitViewModeStarting() {
549 for (auto& observer : shell_observers_)
550 observer.OnSplitViewModeStarting();
551}
552
553void Shell::NotifySplitViewModeEnded() {
554 for (auto& observer : shell_observers_)
555 observer.OnSplitViewModeEnded();
556}
557
sky00c813f2017-03-08 22:48:55558void Shell::NotifyFullscreenStateChanged(bool is_fullscreen,
varkhac71444e52017-05-25 22:51:34559 aura::Window* root_window) {
sky00c813f2017-03-08 22:48:55560 for (auto& observer : shell_observers_)
561 observer.OnFullscreenStateChanged(is_fullscreen, root_window);
562}
563
varkha19d7e6c52017-05-25 21:15:30564void Shell::NotifyPinnedStateChanged(aura::Window* pinned_window) {
sky00c813f2017-03-08 22:48:55565 for (auto& observer : shell_observers_)
566 observer.OnPinnedStateChanged(pinned_window);
567}
568
xiyuan38160182017-03-14 22:50:13569void Shell::NotifyVirtualKeyboardActivated(bool activated,
sky97f9a7432017-05-09 05:14:31570 aura::Window* root_window) {
sky00c813f2017-03-08 22:48:55571 for (auto& observer : shell_observers_)
xiyuan38160182017-03-14 22:50:13572 observer.OnVirtualKeyboardStateChanged(activated, root_window);
sky00c813f2017-03-08 22:48:55573}
574
varkha6b016b0f2017-05-26 16:14:18575void Shell::NotifyShelfCreatedForRootWindow(aura::Window* root_window) {
sky00c813f2017-03-08 22:48:55576 for (auto& observer : shell_observers_)
577 observer.OnShelfCreatedForRootWindow(root_window);
578}
579
varkha6b016b0f2017-05-26 16:14:18580void Shell::NotifyShelfAlignmentChanged(aura::Window* root_window) {
sky00c813f2017-03-08 22:48:55581 for (auto& observer : shell_observers_)
582 observer.OnShelfAlignmentChanged(root_window);
583}
584
varkha6b016b0f2017-05-26 16:14:18585void Shell::NotifyShelfAutoHideBehaviorChanged(aura::Window* root_window) {
sky00c813f2017-03-08 22:48:55586 for (auto& observer : shell_observers_)
587 observer.OnShelfAutoHideBehaviorChanged(root_window);
588}
589
jamescook518dccbd2017-05-18 04:57:07590// static
591void Shell::SetIsBrowserProcessWithMash() {
592 g_is_browser_process_with_mash = true;
593}
594
James Cookbbe5cb12017-08-08 18:32:21595void Shell::SetLocalStatePrefService(PrefService* local_state) {
596 DCHECK(GetAshConfig() != Config::MASH);
597 DCHECK(local_state);
598 local_state_non_mash_ = local_state;
599
600 for (auto& observer : shell_observers_)
601 observer.OnLocalStatePrefServiceInitialized(local_state_non_mash_);
602}
603
muyuanlid766f2e2017-06-26 20:17:19604void Shell::NotifyAppListVisibilityChanged(bool visible,
605 aura::Window* root_window) {
newcomer2febb9832017-06-12 17:00:23606 for (auto& observer : shell_observers_)
607 observer.OnAppListVisibilityChanged(visible, root_window);
608}
609
muyuanlid766f2e2017-06-26 20:17:19610void Shell::NotifyVoiceInteractionStatusChanged(bool running) {
611 for (auto& observer : shell_observers_)
612 observer.OnVoiceInteractionStatusChanged(running);
613}
614
[email protected]b6ba05d902013-10-04 21:38:45615////////////////////////////////////////////////////////////////////////////////
616// Shell, private:
617
skyb073203a2017-03-13 16:59:16618Shell::Shell(std::unique_ptr<ShellDelegate> shell_delegate,
sky11cf8db92017-04-10 23:38:08619 std::unique_ptr<ShellPort> shell_port)
620 : shell_port_(std::move(shell_port)),
Scott Violetd64dac12017-06-02 21:50:08621 ash_display_controller_(base::MakeUnique<AshDisplayController>()),
sky79fa34712017-03-20 23:46:47622 brightness_control_delegate_(
623 base::MakeUnique<system::BrightnessControllerChromeos>()),
624 cast_config_(base::MakeUnique<CastConfigController>()),
625 focus_cycler_(base::MakeUnique<FocusCycler>()),
James Cookf0c78fc2017-06-15 14:42:55626 ime_controller_(base::MakeUnique<ImeController>()),
sky5ab16472017-03-21 19:35:08627 immersive_context_(base::MakeUnique<ImmersiveContextAsh>()),
sky79fa34712017-03-20 23:46:47628 keyboard_brightness_control_delegate_(
629 base::MakeUnique<KeyboardBrightnessController>()),
630 locale_notification_controller_(
631 base::MakeUnique<LocaleNotificationController>()),
xiaoyinh2bbdd102017-05-18 23:29:42632 lock_screen_controller_(base::MakeUnique<LockScreenController>()),
sky5ab16472017-03-21 19:35:08633 media_controller_(base::MakeUnique<MediaController>()),
634 new_window_controller_(base::MakeUnique<NewWindowController>()),
sky5ad143a2017-03-22 04:31:23635 session_controller_(base::MakeUnique<SessionController>()),
636 shelf_controller_(base::MakeUnique<ShelfController>()),
skyb073203a2017-03-13 16:59:16637 shell_delegate_(std::move(shell_delegate)),
sky5b45ed82017-03-27 02:54:23638 shutdown_controller_(base::MakeUnique<ShutdownController>()),
sky79fa34712017-03-20 23:46:47639 system_tray_controller_(base::MakeUnique<SystemTrayController>()),
sky5b45ed82017-03-27 02:54:23640 system_tray_notifier_(base::MakeUnique<SystemTrayNotifier>()),
tbarzicc78da1ff92017-05-08 20:46:15641 tray_action_(base::MakeUnique<TrayAction>()),
sky5b45ed82017-03-27 02:54:23642 vpn_list_(base::MakeUnique<VpnList>()),
643 window_cycle_controller_(base::MakeUnique<WindowCycleController>()),
644 window_selector_controller_(base::MakeUnique<WindowSelectorController>()),
sky7db5ccf2017-03-14 21:52:29645 app_list_(base::MakeUnique<app_list::AppList>()),
yusukes1168eda2016-04-27 07:52:08646 link_handler_model_factory_(nullptr),
jamescookac6724332017-03-21 02:54:43647 tray_bluetooth_helper_(base::MakeUnique<TrayBluetoothHelper>()),
kylechar7a067ec2017-01-07 01:16:28648 display_configurator_(new display::DisplayConfigurator()),
sadrul7a8785e2016-02-12 21:54:35649 native_cursor_manager_(nullptr),
[email protected]b6ba05d902013-10-04 21:38:45650 simulate_modal_window_open_for_testing_(false),
Sam McNallye36abbc2017-07-20 01:04:28651 is_touch_hud_projection_enabled_(false),
652 weak_factory_(this) {
skyabcae812017-01-18 17:01:34653 // TODO(sky): better refactor cash/mash dependencies. Perhaps put all cash
sky11cf8db92017-04-10 23:38:08654 // state on ShellPortClassic. http://crbug.com/671246.
skyabcae812017-01-18 17:01:34655
skycfaad892017-04-28 20:52:58656 gpu_support_.reset(shell_delegate_->CreateGPUSupport());
657
Scott Violet596bb46342017-06-21 14:43:13658 display_manager_.reset(ScreenAsh::CreateDisplayManager());
659 window_tree_host_manager_ = base::MakeUnique<WindowTreeHostManager>();
660 user_metrics_recorder_ = base::MakeUnique<UserMetricsRecorder>();
[email protected]b6ba05d902013-10-04 21:38:45661
[email protected]093b8d642014-04-03 20:59:28662 PowerStatus::Initialize();
sky5ad143a2017-03-22 04:31:23663
Xiyuan Xia22b1a6c2017-04-18 22:46:01664 session_controller_->AddObserver(this);
[email protected]b6ba05d902013-10-04 21:38:45665}
666
667Shell::~Shell() {
668 TRACE_EVENT0("shutdown", "ash::Shell::Destructor");
669
sky11cf8db92017-04-10 23:38:08670 const Config config = shell_port_->GetAshConfig();
skyabcae812017-01-18 17:01:34671
Scott Violet41562d1c2017-06-26 15:15:48672 user_metrics_recorder_->OnShellShuttingDown();
bruthigc24d11f2015-06-09 21:30:03673
skyb073203a2017-03-13 16:59:16674 shell_delegate_->PreShutdown();
[email protected]050e77182014-03-25 15:29:16675
[email protected]b6ba05d902013-10-04 21:38:45676 // Remove the focus from any window. This will prevent overhead and side
677 // effects (e.g. crashes) from changing focus during shutdown.
678 // See bug crbug.com/134502.
achuith287b26e2015-09-03 17:49:18679 aura::client::GetFocusClient(GetPrimaryRootWindow())->FocusWindow(nullptr);
[email protected]b6ba05d902013-10-04 21:38:45680
xdaid4913762017-07-06 00:17:22681 // Please keep in reverse order as in Init() because it's easy to miss one.
682 split_view_controller_.reset();
683
[email protected]b6ba05d902013-10-04 21:38:45684 if (window_modality_controller_)
685 window_modality_controller_.reset();
jamescook01bf23e72017-01-09 19:58:15686
[email protected]e4ea52362014-02-15 03:21:06687 RemovePreTargetHandler(magnifier_key_scroll_handler_.get());
688 magnifier_key_scroll_handler_.reset();
689
690 RemovePreTargetHandler(speech_feedback_handler_.get());
691 speech_feedback_handler_.reset();
jamescook01bf23e72017-01-09 19:58:15692
[email protected]b6ba05d902013-10-04 21:38:45693 RemovePreTargetHandler(overlay_filter_.get());
Xiyuan Xia22b1a6c2017-04-18 22:46:01694 overlay_filter_.reset();
695
[email protected]3537d472014-01-15 05:45:31696 RemovePreTargetHandler(accelerator_filter_.get());
697 RemovePreTargetHandler(event_transformation_handler_.get());
698 RemovePreTargetHandler(toplevel_window_event_handler_.get());
699 RemovePostTargetHandler(toplevel_window_event_handler_.get());
Scott Violet596bb46342017-06-21 14:43:13700 RemovePreTargetHandler(system_gesture_filter_.get());
701 RemovePreTargetHandler(mouse_cursor_filter_.get());
hariank0dd03dd2016-07-14 23:47:33702 RemovePreTargetHandler(modality_filter_.get());
[email protected]b6ba05d902013-10-04 21:38:45703
704 // TooltipController is deleted with the Shell so removing its references.
705 RemovePreTargetHandler(tooltip_controller_.get());
706
jonross0af45212015-01-13 18:55:46707 screen_orientation_controller_.reset();
yiyixa68ade512016-09-01 17:38:13708 screen_layout_observer_.reset();
jonross0af45212015-01-13 18:55:46709
Mitsuru Oshima0e9b7a62017-07-19 18:23:03710 // Destroy the virtual keyboard controller before the tablet mode controller
jamescook01bf23e72017-01-09 19:58:15711 // since the latters destructor triggers events that the former is listening
712 // to but no longer cares about.
rsadambbaf2c82015-01-07 17:54:13713 virtual_keyboard_controller_.reset();
jonross0af45212015-01-13 18:55:46714
Mitsuru Oshima0e9b7a62017-07-19 18:23:03715 // Destroy tablet mode controller early on since it has some observers which
[email protected]5ed2b642014-03-04 00:06:57716 // need to be removed.
Mitsuru Oshima0e9b7a62017-07-19 18:23:03717 tablet_mode_controller_.reset();
[email protected]5ed2b642014-03-04 00:06:57718
jdufault551152e2016-01-27 19:48:43719 // Destroy the keyboard before closing the shelf, since it will invoke a shelf
720 // layout.
Keigo Okac7617a42017-06-14 11:33:24721 DestroyKeyboard();
jdufault551152e2016-01-27 19:48:43722
sky07a24d42017-03-09 23:57:30723 toast_manager_.reset();
yoshiki32f51632016-03-24 01:24:43724
jdufault551152e2016-01-27 19:48:43725 // Destroy SystemTrayDelegate before destroying the status area(s). Make sure
726 // to deinitialize the shelf first, as it is initialized after the delegate.
msw257a6a232017-06-01 01:46:30727 for (aura::Window* root : GetAllRootWindows())
728 Shelf::ForWindow(root)->ShutdownShelfWidget();
jamescookac6724332017-03-21 02:54:43729 tray_bluetooth_helper_.reset();
sky79fa34712017-03-20 23:46:47730 DeleteSystemTrayDelegate();
[email protected]b6ba05d902013-10-04 21:38:45731
[email protected]b6ba05d902013-10-04 21:38:45732 // Drag-and-drop must be canceled prior to close all windows.
733 drag_drop_controller_.reset();
734
Xiyuan Xia22b1a6c2017-04-18 22:46:01735 // Controllers who have WindowObserver added must be deleted
736 // before |window_tree_host_manager_| is deleted.
[email protected]8c9d12a2013-12-06 18:39:03737
[email protected]8c9d12a2013-12-06 18:39:03738 // VideoActivityNotifier must be deleted before |video_detector_| is
739 // deleted because it's observing video activity through
derat83b761392016-07-11 16:44:44740 // VideoDetector::Observer interface.
[email protected]8c9d12a2013-12-06 18:39:03741 video_activity_notifier_.reset();
[email protected]8c9d12a2013-12-06 18:39:03742 video_detector_.reset();
[email protected]0e3e7cb2014-04-12 05:18:25743 high_contrast_controller_.reset();
[email protected]8c9d12a2013-12-06 18:39:03744
745 shadow_controller_.reset();
746 resize_shadow_controller_.reset();
747
sky37f0dd12016-07-19 18:00:59748 // Has to happen before ~MruWindowTracker.
sky5b45ed82017-03-27 02:54:23749 window_cycle_controller_.reset();
750 window_selector_controller_.reset();
[email protected]8c9d12a2013-12-06 18:39:03751
skyabcae812017-01-18 17:01:34752 CloseAllRootWindowChildWindows();
753
afakhry58159392015-05-22 02:45:52754 // MruWindowTracker must be destroyed after all windows have been deleted to
755 // avoid a possible crash when Shell is destroyed from a non-normal shutdown
756 // path. (crbug.com/485438).
sky5ab16472017-03-21 19:35:08757 mru_window_tracker_.reset();
[email protected]b6ba05d902013-10-04 21:38:45758
[email protected]b6ba05d902013-10-04 21:38:45759 // These need a valid Shell instance to clean up properly, so explicitly
760 // delete them before invalidating the instance.
761 // Alphabetical. TODO(oshima): sort.
762 magnification_controller_.reset();
[email protected]b6ba05d902013-10-04 21:38:45763 tooltip_controller_.reset();
764 event_client_.reset();
[email protected]3537d472014-01-15 05:45:31765 toplevel_window_event_handler_.reset();
[email protected]b6ba05d902013-10-04 21:38:45766 visibility_controller_.reset();
[email protected]b6ba05d902013-10-04 21:38:45767
768 power_button_controller_.reset();
769 lock_state_controller_.reset();
[email protected]b6ba05d902013-10-04 21:38:45770
hidehiko6821ca42016-06-18 11:12:23771 screen_pinning_controller_.reset();
772
[email protected]b6ba05d902013-10-04 21:38:45773 resolution_notification_controller_.reset();
oshima5a296e82016-04-29 01:32:27774 screenshot_controller_.reset();
[email protected]8ab613cf2014-05-12 09:39:49775 mouse_cursor_filter_.reset();
hariank0dd03dd2016-07-14 23:47:33776 modality_filter_.reset();
[email protected]b6ba05d902013-10-04 21:38:45777
[email protected]03122891a2014-05-13 23:56:49778 touch_transformer_controller_.reset();
warx533c8f62016-04-12 01:19:43779 audio_a11y_controller_.reset();
sammiequon203ae022016-09-18 17:23:42780 laser_pointer_controller_.reset();
781 partial_magnification_controller_.reset();
Vladislav Kaznacheev6d6aaff2017-07-22 04:06:32782 highlighter_controller_.reset();
warx533c8f62016-04-12 01:19:43783
[email protected]b6ba05d902013-10-04 21:38:45784 // This also deletes all RootWindows. Note that we invoke Shutdown() on
oshimae2818922015-07-28 01:18:52785 // WindowTreeHostManager before resetting |window_tree_host_manager_|, since
msw257a6a232017-06-01 01:46:30786 // destruction of its owned RootWindowControllers relies on the value.
rjkroege2c9305402016-09-07 00:21:45787 ScreenAsh::CreateScreenForShutdown();
stevenjb537c5c3f2016-01-20 23:38:12788 display_configuration_controller_.reset();
dtseng4ae0a882016-04-15 21:39:27789
sky15ef0aa2017-01-20 18:55:59790 // AppListDelegateImpl depends upon AppList.
791 app_list_delegate_impl_.reset();
792
sky07a24d42017-03-09 23:57:30793 // These members access Shell in their destructors.
794 wallpaper_controller_.reset();
795 accessibility_delegate_.reset();
796
797 // Balances the Install() in Initialize().
798 views::FocusManagerFactory::Install(nullptr);
799
sky5ad143a2017-03-22 04:31:23800 // ShelfWindowWatcher has window observers and a pointer to the shelf model.
801 shelf_window_watcher_.reset();
802
803 // ShelfItemDelegate subclasses it owns have complex cleanup to run (e.g. ARC
804 // shelf items in Chrome) so explicitly shutdown early.
805 shelf_model()->DestroyItemDelegates();
806
msw5138f3d2017-04-20 00:22:07807 // Notify the ShellDelegate that the shelf is shutting down.
msw5c06364c2017-04-27 02:49:06808 // TODO(msw): Refine ChromeLauncherController lifetime management.
msw5138f3d2017-04-20 00:22:07809 shell_delegate_->ShelfShutdown();
sky5ad143a2017-03-22 04:31:23810
tibellb93c729b2017-03-30 00:45:09811 // Removes itself as an observer of |pref_service_|.
sky5ad143a2017-03-22 04:31:23812 shelf_controller_.reset();
813
sky11cf8db92017-04-10 23:38:08814 shell_port_->Shutdown();
Scott Violet596bb46342017-06-21 14:43:13815 window_tree_host_manager_->Shutdown();
sky5ad143a2017-03-22 04:31:23816
sky27344382017-03-08 21:30:32817 // Depends on |focus_controller_|, so must be destroyed before.
oshimae2818922015-07-28 01:18:52818 window_tree_host_manager_.reset();
sky27344382017-03-08 21:30:32819 focus_controller_->RemoveObserver(this);
sky68612712017-04-27 04:45:04820 if (config != Config::CLASSIC &&
821 window_tree_client_->focus_synchronizer()->active_focus_client() ==
822 focus_controller_.get()) {
823 window_tree_client_->focus_synchronizer()->SetSingletonFocusClient(nullptr);
824 }
sky27344382017-03-08 21:30:32825 focus_controller_.reset();
[email protected]b6ba05d902013-10-04 21:38:45826 screen_position_controller_.reset();
[email protected]b6ba05d902013-10-04 21:38:45827
robert.bradfordab052492015-05-06 11:09:56828 display_color_manager_.reset();
[email protected]7bc49bd2014-01-22 09:30:34829 if (display_change_observer_)
[email protected]1e31cbd2014-04-07 20:06:11830 display_configurator_->RemoveObserver(display_change_observer_.get());
[email protected]b6ba05d902013-10-04 21:38:45831 if (display_error_observer_)
[email protected]1e31cbd2014-04-07 20:06:11832 display_configurator_->RemoveObserver(display_error_observer_.get());
jdufault88fb76652015-04-30 22:36:43833 if (projecting_observer_) {
[email protected]1e31cbd2014-04-07 20:06:11834 display_configurator_->RemoveObserver(projecting_observer_.get());
sky00c813f2017-03-08 22:48:55835 RemoveShellObserver(projecting_observer_.get());
jdufault88fb76652015-04-30 22:36:43836 }
[email protected]b6ba05d902013-10-04 21:38:45837 display_change_observer_.reset();
kylechar98748a52016-12-03 01:33:22838 shutdown_observer_.reset();
[email protected]b6ba05d902013-10-04 21:38:45839
[email protected]093b8d642014-04-03 20:59:28840 PowerStatus::Shutdown();
pneubeck8be1f5422014-10-09 16:46:18841
842 // Ensure that DBusThreadManager outlives this Shell.
843 DCHECK(chromeos::DBusThreadManager::IsInitialized());
[email protected]b6ba05d902013-10-04 21:38:45844
sky88bd4be62016-06-09 17:34:41845 // Needs to happen right before |instance_| is reset.
sky11cf8db92017-04-10 23:38:08846 shell_port_.reset();
Xiyuan Xia22b1a6c2017-04-18 22:46:01847 session_controller_->RemoveObserver(this);
skyb073203a2017-03-13 16:59:16848 wallpaper_delegate_.reset();
afakhry21501562017-05-19 22:52:40849 // NightLightController depeneds on the PrefService and must be destructed
850 // before it. crbug.com/724231.
851 night_light_controller_ = nullptr;
James Cookbbe5cb12017-08-08 18:32:21852 profile_pref_service_mash_.reset();
853 local_state_mash_.reset();
854 local_state_non_mash_ = nullptr;
skyb073203a2017-03-13 16:59:16855 shell_delegate_.reset();
sky88bd4be62016-06-09 17:34:41856
Scott Violet17a61722017-06-19 17:54:31857 for (auto& observer : shell_observers_)
858 observer.OnShellDestroyed();
859
[email protected]b6ba05d902013-10-04 21:38:45860 DCHECK(instance_ == this);
achuith287b26e2015-09-03 17:49:18861 instance_ = nullptr;
[email protected]b6ba05d902013-10-04 21:38:45862}
863
[email protected]1b4c7472014-05-15 18:32:23864void Shell::Init(const ShellInitParams& init_params) {
sky11cf8db92017-04-10 23:38:08865 const Config config = shell_port_->GetAshConfig();
skyabcae812017-01-18 17:01:34866
James Cook8532dbc2017-07-31 21:54:51867 if (NightLightController::IsFeatureEnabled())
868 night_light_controller_ = base::MakeUnique<NightLightController>();
afakhry9e0a18b32017-06-05 19:23:14869
skyb073203a2017-03-13 16:59:16870 wallpaper_delegate_ = shell_delegate_->CreateWallpaperDelegate();
871
James Cook8532dbc2017-07-31 21:54:51872 // Connector can be null in tests.
skye5fd1222017-04-12 18:43:23873 if (config == Config::MASH && shell_delegate_->GetShellConnector()) {
James Cook8532dbc2017-07-31 21:54:51874 // Connect to local state prefs now, but wait for an active user before
875 // connecting to the profile pref service. The login screen has a temporary
876 // user profile that is not associated with a real user.
Taiju Tsuiki36c517d2017-05-18 06:45:43877 auto pref_registry = base::MakeRefCounted<PrefRegistrySimple>();
Wenzhao Zang56c292932017-08-02 04:58:34878 RegisterLocalStatePrefs(pref_registry.get());
tibellb93c729b2017-03-30 00:45:09879 prefs::ConnectToPrefService(
Sam McNally538fca1e2017-07-14 03:10:43880 shell_delegate_->GetShellConnector(), std::move(pref_registry),
Sam McNallye36abbc2017-07-20 01:04:28881 base::Bind(&Shell::OnLocalStatePrefServiceInitialized,
882 weak_factory_.GetWeakPtr()),
883 prefs::mojom::kLocalStateServiceName);
jonrossc4ba10602017-04-07 20:51:05884 }
skyb073203a2017-03-13 16:59:16885
sky11cf8db92017-04-10 23:38:08886 // Some delegates access ShellPort during their construction. Create them here
887 // instead of the ShellPort constructor.
skyb073203a2017-03-13 16:59:16888 accessibility_delegate_.reset(shell_delegate_->CreateAccessibilityDelegate());
889 palette_delegate_ = shell_delegate_->CreatePaletteDelegate();
sky07a24d42017-03-09 23:57:30890 toast_manager_ = base::MakeUnique<ToastManager>();
891
sky07a24d42017-03-09 23:57:30892 // Install the custom factory early on so that views::FocusManagers for Tray,
893 // Shelf, and WallPaper could be created by the factory.
894 views::FocusManagerFactory::Install(new AshFocusManagerFactory);
895
James Cook08fc8ce22017-06-15 18:28:41896 wallpaper_controller_ = base::MakeUnique<WallpaperController>();
sky07a24d42017-03-09 23:57:30897
skye5fd1222017-04-12 18:43:23898 if (config == Config::MASH)
sky15ef0aa2017-01-20 18:55:59899 app_list_delegate_impl_ = base::MakeUnique<AppListDelegateImpl>();
900
sky11cf8db92017-04-10 23:38:08901 // TODO(sky): move creation to ShellPort.
skye5fd1222017-04-12 18:43:23902 if (config != Config::MASH)
skyabcae812017-01-18 17:01:34903 immersive_handler_factory_ = base::MakeUnique<ImmersiveHandlerFactoryAsh>();
skyb7b54092016-08-19 16:00:09904
sky5ab16472017-03-21 19:35:08905 window_positioner_ = base::MakeUnique<WindowPositioner>();
sky984c1892016-04-20 00:00:34906
sky494c6cbd2017-03-27 20:57:48907 if (config == Config::CLASSIC) {
erg36cfb952017-06-21 19:41:45908 native_cursor_manager_ = new NativeCursorManagerAshClassic;
909 cursor_manager_ = base::MakeUnique<CursorManager>(
910 base::WrapUnique(native_cursor_manager_));
911 } else if (config == Config::MUS) {
912 native_cursor_manager_ = new NativeCursorManagerAshMus;
913 cursor_manager_ = base::MakeUnique<CursorManager>(
914 base::WrapUnique(native_cursor_manager_));
skyabcae812017-01-18 17:01:34915 }
skyfee520c2016-02-11 19:57:46916
skyb073203a2017-03-13 16:59:16917 shell_delegate_->PreInit();
Scott Violet596bb46342017-06-21 14:43:13918 bool display_initialized = display_manager_->InitFromCommandLine();
919 if (!display_initialized && config != Config::CLASSIC) {
skycfaad892017-04-28 20:52:58920 // Run display configuration off device in mus mode.
921 display_manager_->set_configure_displays(true);
922 display_configurator_->set_configure_display(true);
923 }
Scott Violet596bb46342017-06-21 14:43:13924 display_configuration_controller_ =
925 base::MakeUnique<DisplayConfigurationController>(
926 display_manager_.get(), window_tree_host_manager_.get());
927 display_configurator_->Init(shell_port_->CreateNativeDisplayDelegate(),
928 !gpu_support_->IsPanelFittingDisabled());
[email protected]0249a6532013-10-31 06:53:34929
pneubeck8be1f5422014-10-09 16:46:18930 // The DBusThreadManager must outlive this Shell. See the DCHECK in ~Shell.
931 chromeos::DBusThreadManager* dbus_thread_manager =
932 chromeos::DBusThreadManager::Get();
933 projecting_observer_.reset(
934 new ProjectingObserver(dbus_thread_manager->GetPowerManagerClient()));
[email protected]1e31cbd2014-04-07 20:06:11935 display_configurator_->AddObserver(projecting_observer_.get());
sky00c813f2017-03-08 22:48:55936 AddShellObserver(projecting_observer_.get());
[email protected]72bce522014-02-10 21:11:26937
Scott Violet596bb46342017-06-21 14:43:13938 if (!display_initialized &&
939 (config != Config::CLASSIC || chromeos::IsRunningAsSystemCompositor())) {
kylecharf2e4e412016-12-04 04:21:35940 display_change_observer_ = base::MakeUnique<display::DisplayChangeObserver>(
kylechar98748a52016-12-03 01:33:22941 display_configurator_.get(), display_manager_.get());
942
943 shutdown_observer_ =
944 base::MakeUnique<ShutdownObserver>(display_configurator_.get());
945
[email protected]b6ba05d902013-10-04 21:38:45946 // Register |display_change_observer_| first so that the rest of
947 // observer gets invoked after the root windows are configured.
[email protected]1e31cbd2014-04-07 20:06:11948 display_configurator_->AddObserver(display_change_observer_.get());
[email protected]093b8d642014-04-03 20:59:28949 display_error_observer_.reset(new DisplayErrorObserver());
[email protected]1e31cbd2014-04-07 20:06:11950 display_configurator_->AddObserver(display_error_observer_.get());
951 display_configurator_->set_state_controller(display_change_observer_.get());
952 display_configurator_->set_mirroring_controller(display_manager_.get());
953 display_configurator_->ForceInitialConfigure(
jamescookfda159002016-10-21 18:48:57954 base::CommandLine::ForCurrentProcess()->HasSwitch(
955 chromeos::switches::kFirstExecAfterBoot)
956 ? kChromeOsBootColor
957 : 0);
[email protected]b6ba05d902013-10-04 21:38:45958 display_initialized = true;
959 }
James Cook8ba362c2017-06-16 16:39:16960 display_color_manager_ =
961 base::MakeUnique<DisplayColorManager>(display_configurator_.get());
stevenjb537c5c3f2016-01-20 23:38:12962
[email protected]b6ba05d902013-10-04 21:38:45963 if (!display_initialized)
[email protected]0249a6532013-10-31 06:53:34964 display_manager_->InitDefaultDisplay();
[email protected]b6ba05d902013-10-04 21:38:45965
newcomer2febb9832017-06-12 17:00:23966 if (config == Config::CLASSIC) {
skyabcae812017-01-18 17:01:34967 display_manager_->RefreshFontParams();
[email protected]68d6080e2014-08-21 23:06:32968
skyabcae812017-01-18 17:01:34969 aura::Env::GetInstance()->set_context_factory(init_params.context_factory);
970 aura::Env::GetInstance()->set_context_factory_private(
971 init_params.context_factory_private);
972 }
[email protected]ecca62b2013-10-09 16:18:53973
[email protected]b6ba05d902013-10-04 21:38:45974 // The WindowModalityController needs to be at the front of the input event
975 // pretarget handler list to ensure that it processes input events when modal
976 // windows are active.
jamescookb8dcef522016-06-25 14:42:55977 window_modality_controller_.reset(new ::wm::WindowModalityController(this));
[email protected]b6ba05d902013-10-04 21:38:45978
[email protected]e319c7e2014-03-14 19:56:14979 env_filter_.reset(new ::wm::CompoundEventFilter);
[email protected]b6ba05d902013-10-04 21:38:45980 AddPreTargetHandler(env_filter_.get());
981
sky27344382017-03-08 21:30:32982 // FocusController takes ownership of AshFocusRules.
983 focus_controller_ =
984 base::MakeUnique<::wm::FocusController>(new wm::AshFocusRules());
985 focus_controller_->AddObserver(this);
sky68612712017-04-27 04:45:04986 if (config != Config::CLASSIC) {
987 window_tree_client_->focus_synchronizer()->SetSingletonFocusClient(
988 focus_controller_.get());
989 }
[email protected]b6ba05d902013-10-04 21:38:45990
[email protected]093b8d642014-04-03 20:59:28991 screen_position_controller_.reset(new ScreenPositionController);
[email protected]b6ba05d902013-10-04 21:38:45992
Scott Violet596bb46342017-06-21 14:43:13993 window_tree_host_manager_->Start();
994 AshWindowTreeHostInitParams ash_init_params;
995 window_tree_host_manager_->CreatePrimaryHost(ash_init_params);
996
mswad3d9552017-05-18 21:23:36997 root_window_for_new_windows_ = GetPrimaryRootWindow();
[email protected]b6ba05d902013-10-04 21:38:45998
Scott Violet596bb46342017-06-21 14:43:13999 resolution_notification_controller_ =
1000 base::MakeUnique<ResolutionNotificationController>();
[email protected]b6ba05d902013-10-04 21:38:451001
deratc6250a02017-01-25 05:51:531002 if (cursor_manager_) {
oshimaf84b0da722016-04-27 19:47:191003 cursor_manager_->SetDisplay(
1004 display::Screen::GetScreen()->GetPrimaryDisplay());
deratc6250a02017-01-25 05:51:531005 }
[email protected]b6ba05d902013-10-04 21:38:451006
sky11cf8db92017-04-10 23:38:081007 accelerator_controller_ = shell_port_->CreateAcceleratorController();
Mitsuru Oshima0e9b7a62017-07-19 18:23:031008 tablet_mode_controller_ = base::MakeUnique<TabletModeController>();
[email protected]b6ba05d902013-10-04 21:38:451009
spange9b51272014-12-11 01:20:101010 magnifier_key_scroll_handler_ = MagnifierKeyScroller::CreateHandler();
[email protected]e4ea52362014-02-15 03:21:061011 AddPreTargetHandler(magnifier_key_scroll_handler_.get());
spange9b51272014-12-11 01:20:101012 speech_feedback_handler_ = SpokenFeedbackToggler::CreateHandler();
[email protected]e4ea52362014-02-15 03:21:061013 AddPreTargetHandler(speech_feedback_handler_.get());
[email protected]3dff2ef2014-02-09 22:50:391014
[email protected]b6ba05d902013-10-04 21:38:451015 // The order in which event filters are added is significant.
[email protected]b6ba05d902013-10-04 21:38:451016
derat2d4e62d2015-01-09 16:09:171017 // ui::UserActivityDetector passes events to observers, so let them get
[email protected]b6ba05d902013-10-04 21:38:451018 // rewritten first.
derat2d4e62d2015-01-09 16:09:171019 user_activity_detector_.reset(new ui::UserActivityDetector);
[email protected]b6ba05d902013-10-04 21:38:451020
[email protected]093b8d642014-04-03 20:59:281021 overlay_filter_.reset(new OverlayEventFilter);
[email protected]b6ba05d902013-10-04 21:38:451022 AddPreTargetHandler(overlay_filter_.get());
[email protected]b6ba05d902013-10-04 21:38:451023
[email protected]60d677d2014-05-30 13:07:021024 accelerator_filter_.reset(new ::wm::AcceleratorFilter(
dchenga94547472016-04-08 08:41:111025 std::unique_ptr<::wm::AcceleratorDelegate>(new AcceleratorDelegate),
sky81a2d792017-03-17 19:14:391026 accelerator_controller_->accelerator_history()));
[email protected]b6ba05d902013-10-04 21:38:451027 AddPreTargetHandler(accelerator_filter_.get());
1028
[email protected]093b8d642014-04-03 20:59:281029 event_transformation_handler_.reset(new EventTransformationHandler);
[email protected]b6ba05d902013-10-04 21:38:451030 AddPreTargetHandler(event_transformation_handler_.get());
1031
sky11cf8db92017-04-10 23:38:081032 toplevel_window_event_handler_ =
1033 base::MakeUnique<ToplevelWindowEventHandler>();
[email protected]3537d472014-01-15 05:45:311034
sky83b1bb12017-04-24 20:29:281035 if (config != Config::MASH) {
skyabcae812017-01-18 17:01:341036 system_gesture_filter_.reset(new SystemGestureEventFilter);
1037 AddPreTargetHandler(system_gesture_filter_.get());
1038 }
[email protected]b6ba05d902013-10-04 21:38:451039
[email protected]354520b2014-06-21 04:31:011040 sticky_keys_controller_.reset(new StickyKeysController);
sky13857152017-03-29 15:46:041041 screen_pinning_controller_ = base::MakeUnique<ScreenPinningController>();
[email protected]354520b2014-06-21 04:31:011042
jamescookd9f152f2016-11-15 00:53:081043 lock_state_controller_ =
sky5b45ed82017-03-27 02:54:231044 base::MakeUnique<LockStateController>(shutdown_controller_.get());
jamescookb8dcef522016-06-25 14:42:551045 power_button_controller_.reset(
1046 new PowerButtonController(lock_state_controller_.get()));
[email protected]685442f32014-02-28 10:40:061047 // Pass the initial display state to PowerButtonController.
1048 power_button_controller_->OnDisplayModeChanged(
[email protected]bcec7fb62014-04-08 20:59:091049 display_configurator_->cached_displays());
jamescook01bf23e72017-01-09 19:58:151050
derat036f91b92017-05-05 00:33:181051 // Forward user activity from the window server to |user_activity_detector_|.
derat94887a22017-01-20 18:17:251052 // The connector is unavailable in some tests.
derat036f91b92017-05-05 00:33:181053 if (aura::Env::GetInstance()->mode() == aura::Env::Mode::MUS &&
1054 shell_delegate_->GetShellConnector()) {
derat94887a22017-01-20 18:17:251055 ui::mojom::UserActivityMonitorPtr user_activity_monitor;
skyb073203a2017-03-13 16:59:161056 shell_delegate_->GetShellConnector()->BindInterface(ui::mojom::kServiceName,
1057 &user_activity_monitor);
derat94887a22017-01-20 18:17:251058 user_activity_forwarder_ = base::MakeUnique<aura::UserActivityForwarder>(
1059 std::move(user_activity_monitor), user_activity_detector_.get());
1060 }
1061
Scott Violet361833fb2017-06-21 22:25:201062 // In mash drag and drop is handled by mus.
1063 if (config != Config::MASH)
1064 drag_drop_controller_ = base::MakeUnique<DragDropController>();
1065
oshima5a296e82016-04-29 01:32:271066 // |screenshot_controller_| needs to be created (and prepended as a
mukai19274bdd2015-02-24 22:37:481067 // pre-target handler) at this point, because |mouse_cursor_filter_| needs to
oshima5a296e82016-04-29 01:32:271068 // process mouse events prior to screenshot session.
mukai19274bdd2015-02-24 22:37:481069 // See http://crbug.com/459214
oshima5a296e82016-04-29 01:32:271070 screenshot_controller_.reset(new ScreenshotController());
Scott Violet596bb46342017-06-21 14:43:131071 mouse_cursor_filter_ = base::MakeUnique<MouseCursorEventFilter>();
1072 PrependPreTargetHandler(mouse_cursor_filter_.get());
[email protected]b6ba05d902013-10-04 21:38:451073
1074 // Create Controllers that may need root window.
1075 // TODO(oshima): Move as many controllers before creating
1076 // RootWindowController as possible.
1077 visibility_controller_.reset(new AshVisibilityController);
[email protected]b6ba05d902013-10-04 21:38:451078
sammiequon203ae022016-09-18 17:23:421079 laser_pointer_controller_.reset(new LaserPointerController());
1080 partial_magnification_controller_.reset(new PartialMagnificationController());
Vladislav Kaznacheev6d6aaff2017-07-22 04:06:321081 highlighter_controller_.reset(new HighlighterController());
sammiequon203ae022016-09-18 17:23:421082
jamescookb8dcef522016-06-25 14:42:551083 magnification_controller_.reset(MagnificationController::CreateInstance());
sky5ab16472017-03-21 19:35:081084 mru_window_tracker_ = base::MakeUnique<MruWindowTracker>();
[email protected]b6ba05d902013-10-04 21:38:451085
[email protected]55398d22013-10-10 19:49:201086 autoclick_controller_.reset(AutoclickController::CreateInstance());
1087
[email protected]b6ba05d902013-10-04 21:38:451088 high_contrast_controller_.reset(new HighContrastController);
1089 video_detector_.reset(new VideoDetector);
[email protected]b6ba05d902013-10-04 21:38:451090
oshimaebbe63772015-02-19 18:41:321091 tooltip_controller_.reset(new views::corewm::TooltipController(
dchenga94547472016-04-08 08:41:111092 std::unique_ptr<views::corewm::Tooltip>(new views::corewm::TooltipAura)));
[email protected]b6ba05d902013-10-04 21:38:451093 AddPreTargetHandler(tooltip_controller_.get());
1094
hariank0dd03dd2016-07-14 23:47:331095 modality_filter_.reset(new SystemModalContainerEventFilter(this));
1096 AddPreTargetHandler(modality_filter_.get());
1097
[email protected]093b8d642014-04-03 20:59:281098 event_client_.reset(new EventClientImpl);
[email protected]b6ba05d902013-10-04 21:38:451099
skyabcae812017-01-18 17:01:341100 // Must occur after Shell has installed its early pre-target handlers (for
1101 // example, WindowModalityController).
sky11cf8db92017-04-10 23:38:081102 shell_port_->CreatePointerWatcherAdapter();
[email protected]b6ba05d902013-10-04 21:38:451103
[email protected]093b8d642014-04-03 20:59:281104 resize_shadow_controller_.reset(new ResizeShadowController());
sky27344382017-03-08 21:30:321105 shadow_controller_.reset(new ::wm::ShadowController(focus_controller_.get()));
[email protected]b6ba05d902013-10-04 21:38:451106
sky79fa34712017-03-20 23:46:471107 SetSystemTrayDelegate(
skyb073203a2017-03-13 16:59:161108 base::WrapUnique(shell_delegate_->CreateSystemTrayDelegate()));
[email protected]b6ba05d902013-10-04 21:38:451109
jamescookac6724332017-03-21 02:54:431110 // May trigger initialization of the Bluetooth adapter.
1111 tray_bluetooth_helper_->Initialize();
1112
kylechar55f0eaf22017-01-11 22:57:371113 // Create AshTouchTransformController before
oshimae2818922015-07-28 01:18:521114 // WindowTreeHostManager::InitDisplays()
kylechar55f0eaf22017-01-11 22:57:371115 // since AshTouchTransformController listens on
oshimae2818922015-07-28 01:18:521116 // WindowTreeHostManager::Observer::OnDisplaysInitialized().
Scott Violet596bb46342017-06-21 14:43:131117 touch_transformer_controller_ = base::MakeUnique<AshTouchTransformController>(
1118 display_configurator_.get(), display_manager_.get(),
1119 shell_port_->CreateTouchTransformDelegate());
[email protected]03122891a2014-05-13 23:56:491120
sky11cf8db92017-04-10 23:38:081121 keyboard_ui_ = shell_port_->CreateKeyboardUI();
skyfee520c2016-02-11 19:57:461122
Scott Violet596bb46342017-06-21 14:43:131123 window_tree_host_manager_->InitHosts();
1124 shell_port_->OnHostsInitialized();
[email protected]b6ba05d902013-10-04 21:38:451125
rsadam9172bc8a2014-10-29 23:37:381126 // Needs to be created after InitDisplays() since it may cause the virtual
1127 // keyboard to be deployed.
sky83b1bb12017-04-24 20:29:281128 if (config != Config::MASH)
skyabcae812017-01-18 17:01:341129 virtual_keyboard_controller_.reset(new VirtualKeyboardController);
rsadam9172bc8a2014-10-29 23:37:381130
warx533c8f62016-04-12 01:19:431131 audio_a11y_controller_.reset(new chromeos::AudioA11yController);
warx533c8f62016-04-12 01:19:431132
msw0e91d932016-08-25 22:34:091133 // Initialize the wallpaper after the RootWindowController has been created,
1134 // otherwise the widget will not paint when restoring after a browser crash.
1135 // Also, initialize after display initialization to ensure correct sizing.
skyb073203a2017-03-13 16:59:161136 wallpaper_delegate_->InitializeWallpaper();
[email protected]b6ba05d902013-10-04 21:38:451137
sadrul7a8785e2016-02-12 21:54:351138 if (cursor_manager_) {
1139 if (initially_hide_cursor_)
1140 cursor_manager_->HideCursor();
ergeeba7c622017-04-25 18:06:161141 cursor_manager_->SetCursor(ui::CursorType::kPointer);
sadrul7a8785e2016-02-12 21:54:351142 }
[email protected]b6ba05d902013-10-04 21:38:451143
[email protected]093b8d642014-04-03 20:59:281144 power_event_observer_.reset(new PowerEventObserver());
[email protected]ded58fd2013-10-09 07:56:551145 user_activity_notifier_.reset(
[email protected]b0fa7012014-04-16 12:50:571146 new ui::UserActivityPowerManagerNotifier(user_activity_detector_.get()));
[email protected]ded58fd2013-10-09 07:56:551147 video_activity_notifier_.reset(
[email protected]093b8d642014-04-03 20:59:281148 new VideoActivityNotifier(video_detector_.get()));
1149 bluetooth_notification_controller_.reset(new BluetoothNotificationController);
Scott Violet596bb46342017-06-21 14:43:131150 screen_orientation_controller_ =
1151 base::MakeUnique<ScreenOrientationController>();
1152 screen_layout_observer_.reset(new ScreenLayoutObserver());
yiyix90cfee22017-02-16 05:38:181153 sms_observer_.reset(new SmsObserver());
jamescook01bf23e72017-01-09 19:58:151154
xdaid4913762017-07-06 00:17:221155 split_view_controller_.reset(new SplitViewController());
1156
[email protected]b6ba05d902013-10-04 21:38:451157 // The compositor thread and main message loop have to be running in
1158 // order to create mirror window. Run it after the main message loop
1159 // is started.
Scott Violet596bb46342017-06-21 14:43:131160 display_manager_->CreateMirrorWindowAsyncIfAny();
bruthigc24d11f2015-06-09 21:30:031161
sky00c813f2017-03-08 22:48:551162 for (auto& observer : shell_observers_)
ericwilligers5eff47d2016-10-17 19:19:181163 observer.OnShellInitialized();
phweiss0bf64c52015-11-17 12:56:181164
Scott Violet41562d1c2017-06-26 15:15:481165 user_metrics_recorder_->OnShellInitialized();
[email protected]b6ba05d902013-10-04 21:38:451166}
1167
[email protected]41baaed2013-11-09 04:18:261168void Shell::InitRootWindow(aura::Window* root_window) {
sky27344382017-03-08 21:30:321169 DCHECK(focus_controller_);
[email protected]d90b8392012-06-13 09:34:561170 DCHECK(visibility_controller_.get());
[email protected]d90b8392012-06-13 09:34:561171
sky27344382017-03-08 21:30:321172 aura::client::SetFocusClient(root_window, focus_controller_.get());
Thiago Farina3b086a02017-05-30 22:32:501173 ::wm::SetActivationClient(root_window, focus_controller_.get());
sky27344382017-03-08 21:30:321174 root_window->AddPreTargetHandler(focus_controller_.get());
[email protected]d90b8392012-06-13 09:34:561175 aura::client::SetVisibilityClient(root_window, visibility_controller_.get());
Scott Violet361833fb2017-06-21 22:25:201176 if (drag_drop_controller_) {
1177 DCHECK_NE(Config::MASH, GetAshConfig());
1178 aura::client::SetDragDropClient(root_window, drag_drop_controller_.get());
1179 } else {
1180 DCHECK_EQ(Config::MASH, GetAshConfig());
1181 }
[email protected]8d625fb2012-07-18 16:40:061182 aura::client::SetScreenPositionClient(root_window,
1183 screen_position_controller_.get());
sadrul7a8785e2016-02-12 21:54:351184 aura::client::SetCursorClient(root_window, cursor_manager_.get());
Thiago Farina3b086a02017-05-30 22:32:501185 ::wm::SetTooltipClient(root_window, tooltip_controller_.get());
[email protected]e67291f12012-10-10 05:52:381186 aura::client::SetEventClient(root_window, event_client_.get());
[email protected]d90b8392012-06-13 09:34:561187
Thiago Farina3b086a02017-05-30 22:32:501188 ::wm::SetWindowMoveClient(root_window, toplevel_window_event_handler_.get());
[email protected]3537d472014-01-15 05:45:311189 root_window->AddPreTargetHandler(toplevel_window_event_handler_.get());
1190 root_window->AddPostTargetHandler(toplevel_window_event_handler_.get());
[email protected]d90b8392012-06-13 09:34:561191}
1192
sky79fa34712017-03-20 23:46:471193void Shell::SetSystemTrayDelegate(
1194 std::unique_ptr<SystemTrayDelegate> delegate) {
1195 DCHECK(delegate);
1196 system_tray_delegate_ = std::move(delegate);
1197 system_tray_delegate_->Initialize();
sky11cf8db92017-04-10 23:38:081198 // Accesses ShellPort in its constructor.
sky79fa34712017-03-20 23:46:471199 logout_confirmation_controller_.reset(new LogoutConfirmationController(
1200 base::Bind(&SystemTrayController::SignOut,
1201 base::Unretained(system_tray_controller_.get()))));
1202}
1203
1204void Shell::DeleteSystemTrayDelegate() {
1205 DCHECK(system_tray_delegate_);
sky11cf8db92017-04-10 23:38:081206 // Accesses ShellPort in its destructor.
sky79fa34712017-03-20 23:46:471207 logout_confirmation_controller_.reset();
1208 system_tray_delegate_.reset();
1209}
1210
skyabcae812017-01-18 17:01:341211void Shell::CloseAllRootWindowChildWindows() {
msw257a6a232017-06-01 01:46:301212 for (aura::Window* root : GetAllRootWindows()) {
1213 RootWindowController* controller = RootWindowController::ForWindow(root);
skyabcae812017-01-18 17:01:341214 if (controller) {
1215 controller->CloseChildWindows();
1216 } else {
msw257a6a232017-06-01 01:46:301217 while (!root->children().empty()) {
1218 aura::Window* child = root->children()[0];
skyabcae812017-01-18 17:01:341219 delete child;
1220 }
1221 }
1222 }
1223}
1224
[email protected]c0ce80e2012-10-05 23:28:271225bool Shell::CanWindowReceiveEvents(aura::Window* window) {
1226 RootWindowControllerList controllers = GetAllRootWindowControllers();
oshima9a61ecf2016-06-18 10:43:051227 for (RootWindowController* controller : controllers) {
1228 if (controller->CanWindowReceiveEvents(window))
[email protected]602022b2014-03-31 17:07:311229 return true;
[email protected]c0ce80e2012-10-05 23:28:271230 }
1231 return false;
1232}
1233
[email protected]049cf34b2012-12-07 17:15:481234////////////////////////////////////////////////////////////////////////////////
1235// Shell, ui::EventTarget overrides:
1236
[email protected]869f6352012-12-06 20:47:171237bool Shell::CanAcceptEvent(const ui::Event& event) {
[email protected]5097e692012-10-30 22:08:411238 return true;
1239}
1240
1241ui::EventTarget* Shell::GetParentTarget() {
[email protected]ff0278852013-11-05 22:35:481242 return aura::Env::GetInstance();
[email protected]5097e692012-10-30 22:08:411243}
1244
dchenga94547472016-04-08 08:41:111245std::unique_ptr<ui::EventTargetIterator> Shell::GetChildIterator() const {
1246 return std::unique_ptr<ui::EventTargetIterator>();
[email protected]3e670aa2013-12-02 19:04:321247}
1248
1249ui::EventTargeter* Shell::GetEventTargeter() {
1250 NOTREACHED();
achuith287b26e2015-09-03 17:49:181251 return nullptr;
[email protected]3e670aa2013-12-02 19:04:321252}
1253
sky27344382017-03-08 21:30:321254void Shell::OnWindowActivated(
Thiago Farina3b086a02017-05-30 22:32:501255 ::wm::ActivationChangeObserver::ActivationReason reason,
sky27344382017-03-08 21:30:321256 aura::Window* gained_active,
1257 aura::Window* lost_active) {
mswad3d9552017-05-18 21:23:361258 if (gained_active)
1259 root_window_for_new_windows_ = gained_active->GetRootWindow();
sky27344382017-03-08 21:30:321260}
1261
James Cook8532dbc2017-07-31 21:54:511262void Shell::OnActiveUserSessionChanged(const AccountId& account_id) {
1263 if (GetAshConfig() == Config::MASH && shell_delegate_->GetShellConnector()) {
James Cook6d51c9182017-08-04 01:31:001264 // NOTE: |profile_pref_service_| will point to the previous user's profile
1265 // while the connection is being made.
James Cook8532dbc2017-07-31 21:54:511266 auto pref_registry = base::MakeRefCounted<PrefRegistrySimple>();
1267 RegisterProfilePrefs(pref_registry.get());
James Cook98072352017-08-07 18:00:071268 RegisterForeignPrefs(pref_registry.get());
James Cook8532dbc2017-07-31 21:54:511269 prefs::ConnectToPrefService(
1270 shell_delegate_->GetShellConnector(), pref_registry,
1271 base::Bind(&Shell::OnProfilePrefServiceInitialized,
1272 weak_factory_.GetWeakPtr()),
1273 prefs::mojom::kForwarderServiceName);
1274 return;
1275 }
1276
1277 // On classic ash user profile prefs are available immediately after login.
1278 // The login screen temporary profile is never available.
1279 PrefService* profile_prefs = shell_delegate_->GetActiveUserPrefService();
1280 for (auto& observer : shell_observers_)
1281 observer.OnActiveUserPrefServiceChanged(profile_prefs);
1282}
1283
Xiyuan Xiab64fd0a2017-04-13 17:53:141284void Shell::OnSessionStateChanged(session_manager::SessionState state) {
jamescook788b4fc2017-05-18 16:16:061285 // Initialize the shelf when a session becomes active. It's safe to do this
sky5ad143a2017-03-22 04:31:231286 // multiple times (e.g. initial login vs. multiprofile add session).
1287 if (state == session_manager::SessionState::ACTIVE) {
jamescook788b4fc2017-05-18 16:16:061288 InitializeShelf();
okac21941d2017-06-20 17:54:441289 }
1290 // Recreates keyboard on user profile change, to refresh keyboard
1291 // extensions with the new profile and the extensions call proper IME.
1292 // |LOGGED_IN_NOT_ACTIVE| is needed so that the virtual keyboard works on
1293 // supervised user creation. crbug.com/712873
1294 // |ACTIVE| is also needed for guest user workflow.
1295 if ((state == session_manager::SessionState::LOGGED_IN_NOT_ACTIVE ||
1296 state == session_manager::SessionState::ACTIVE) &&
1297 keyboard::IsKeyboardEnabled()) {
skye5fd1222017-04-12 18:43:231298 if (GetAshConfig() != Config::MASH) {
sky5ad143a2017-03-22 04:31:231299 // Recreate the keyboard after initial login and after multiprofile login.
1300 CreateKeyboard();
1301 }
1302 }
Scott Violet0c0dcde2017-08-04 21:48:181303
1304 shell_port_->UpdateSystemModalAndBlockingContainers();
xiyuan233f4e72017-04-06 06:59:561305}
sky5ad143a2017-03-22 04:31:231306
Xiyuan Xiab64fd0a2017-04-13 17:53:141307void Shell::OnLoginStatusChanged(LoginStatus login_status) {
xiyuan233f4e72017-04-06 06:59:561308 UpdateAfterLoginStatusChange(login_status);
sky5ad143a2017-03-22 04:31:231309}
1310
Xiyuan Xiab64fd0a2017-04-13 17:53:141311void Shell::OnLockStateChanged(bool locked) {
xiyuan7ebbf7f2017-04-10 16:49:101312#ifndef NDEBUG
1313 // Make sure that there is no system modal in Lock layer when unlocked.
1314 if (!locked) {
1315 aura::Window::Windows containers = wm::GetContainersFromAllRootWindows(
1316 kShellWindowId_LockSystemModalContainer, GetPrimaryRootWindow());
1317 for (aura::Window* container : containers)
1318 DCHECK(container->children().empty());
1319 }
1320#endif
1321}
1322
jamescook788b4fc2017-05-18 16:16:061323void Shell::InitializeShelf() {
1324 // Must occur after SessionController creation and user login.
1325 DCHECK(session_controller());
1326 DCHECK_GT(session_controller()->NumberOfLoggedInUsers(), 0);
1327
1328 // Notify the ShellDelegate that the shelf is being initialized.
1329 // TODO(msw): Refine ChromeLauncherController lifetime management.
1330 shell_delegate_->ShelfInit();
1331
1332 if (!shelf_window_watcher_)
1333 shelf_window_watcher_ = base::MakeUnique<ShelfWindowWatcher>(shelf_model());
1334
1335 for (RootWindowController* root : GetAllRootWindowControllers())
1336 root->InitializeShelf();
1337}
1338
James Cook98072352017-08-07 18:00:071339// static
1340void Shell::RegisterForeignPrefs(PrefRegistrySimple* registry) {
1341 DCHECK_EQ(GetAshConfig(), Config::MASH);
1342 // Request access to prefs used by ash but owned by chrome.
1343 // See //services/preferences/README.md
1344 TrayCapsLock::RegisterForeignPrefs(registry);
1345}
1346
James Cook8532dbc2017-07-31 21:54:511347void Shell::OnProfilePrefServiceInitialized(
James Cook0ff197f2017-08-07 17:26:381348 std::unique_ptr<PrefService> pref_service) {
James Cookbbe5cb12017-08-08 18:32:211349 DCHECK(GetAshConfig() == Config::MASH);
James Cook0ff197f2017-08-07 17:26:381350 // Keep the old PrefService object alive so OnActiveUserPrefServiceChanged()
1351 // clients can unregister pref observers on the old service.
James Cookbbe5cb12017-08-08 18:32:211352 std::unique_ptr<PrefService> old_service =
1353 std::move(profile_pref_service_mash_);
1354 profile_pref_service_mash_ = std::move(pref_service);
James Cook8532dbc2017-07-31 21:54:511355 // |pref_service| can be null if can't connect to Chrome (as happens when
sky7bd582ae2017-04-12 21:43:331356 // running mash outside of chrome --mash and chrome isn't built).
James Cook8532dbc2017-07-31 21:54:511357 for (auto& observer : shell_observers_)
James Cookbbe5cb12017-08-08 18:32:211358 observer.OnActiveUserPrefServiceChanged(profile_pref_service_mash_.get());
James Cook0ff197f2017-08-07 17:26:381359 // |old_service| is deleted.
tibellb93c729b2017-03-30 00:45:091360}
1361
Sam McNallye36abbc2017-07-20 01:04:281362void Shell::OnLocalStatePrefServiceInitialized(
1363 std::unique_ptr<::PrefService> pref_service) {
James Cookbbe5cb12017-08-08 18:32:211364 DCHECK(GetAshConfig() == Config::MASH);
James Cook8532dbc2017-07-31 21:54:511365 // |pref_service| is null if can't connect to Chrome (as happens when
Sam McNallye36abbc2017-07-20 01:04:281366 // running mash outside of chrome --mash and chrome isn't built).
James Cookbbe5cb12017-08-08 18:32:211367 local_state_mash_ = std::move(pref_service);
1368
1369 for (auto& observer : shell_observers_)
1370 observer.OnLocalStatePrefServiceInitialized(local_state_mash_.get());
Sam McNallye36abbc2017-07-20 01:04:281371}
1372
[email protected]55f593352011-12-24 05:42:461373} // namespace ash