blob: 492153cbd7ecb26ae03221497ae862bc00f6fc98 [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>
Mitsuru Oshima04b54d02017-10-09 14:22:458#include <memory>
[email protected]0039db92012-05-09 04:11:459#include <string>
dchengcbf0d9d2015-12-27 22:49:2310#include <utility>
[email protected]f7eb89c2011-12-13 09:48:5411
James Cookb0bf8e82017-04-09 17:01:4412#include "ash/accelerators/accelerator_controller.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"
Scott Violetf5db2502018-10-05 15:19:3915#include "ash/accelerators/pre_target_accelerator_handler.h"
jamescook01bf23e72017-01-09 19:58:1516#include "ash/accelerators/spoken_feedback_toggler.h"
James Cookec144952017-09-01 00:05:1617#include "ash/accessibility/accessibility_controller.h"
James Cook37b7d102017-10-06 04:35:1918#include "ash/accessibility/accessibility_delegate.h"
Qiang Xua9591002018-03-15 22:29:3119#include "ash/accessibility/accessibility_focus_ring_controller.h"
David Tseng6792dc82018-05-04 19:18:4120#include "ash/accessibility/key_accessibility_enabler.h"
Jiaquan He4b48f912018-03-01 03:59:3921#include "ash/app_list/app_list_controller_impl.h"
David Black00fdce32018-05-10 20:59:1422#include "ash/assistant/assistant_controller.h"
[email protected]55398d22013-10-10 19:49:2023#include "ash/autoclick/autoclick_controller.h"
James Cookb0bf8e82017-04-09 17:01:4424#include "ash/cast_config_controller.h"
James Cooka9384092018-05-23 02:54:2625#include "ash/components/tap_visualizer/public/mojom/constants.mojom.h"
Jeffrey Kardatzkef108f022018-04-17 17:52:3526#include "ash/dbus/ash_dbus_services.h"
Toni Barzicd6238312018-03-02 18:26:1327#include "ash/detachable_base/detachable_base_handler.h"
Toni Barzic550419f2018-03-08 03:56:2128#include "ash/detachable_base/detachable_base_notification_controller.h"
Scott Violetd64dac12017-06-02 21:50:0829#include "ash/display/ash_display_controller.h"
Steven Bennetts2a9b4382018-04-26 23:41:1930#include "ash/display/cros_display_config.h"
[email protected]87ec2202014-02-06 06:24:2731#include "ash/display/cursor_window_controller.h"
Mitsuru Oshimaf51c8b42018-03-17 01:41:3232#include "ash/display/display_color_manager.h"
stevenjb537c5c3f2016-01-20 23:38:1233#include "ash/display/display_configuration_controller.h"
Steven Bennetts9b21fa32018-04-13 23:45:5534#include "ash/display/display_configuration_observer.h"
Mitsuru Oshimaf51c8b42018-03-17 01:41:3235#include "ash/display/display_error_observer.h"
Scott Violetbed23cb2018-08-22 19:56:1236#include "ash/display/display_output_protection.h"
Steven Bennetts3688c6032018-04-13 01:14:2337#include "ash/display/display_prefs.h"
Steven Bennetts7683e342018-01-02 21:29:5238#include "ash/display/display_shutdown_observer.h"
[email protected]682990f2013-01-10 06:49:1139#include "ash/display/event_transformation_handler.h"
[email protected]91545872012-11-21 13:58:2740#include "ash/display/mouse_cursor_event_filter.h"
Qiang Xud77a90c2018-02-20 19:43:2941#include "ash/display/persistent_window_controller.h"
Mitsuru Oshimaf51c8b42018-03-17 01:41:3242#include "ash/display/projecting_observer.h"
jamescook01bf23e72017-01-09 19:58:1543#include "ash/display/resolution_notification_controller.h"
rjkroege2c9305402016-09-07 00:21:4544#include "ash/display/screen_ash.h"
Mitsuru Oshimaddfde3552018-03-22 09:12:1345#include "ash/display/screen_orientation_controller.h"
[email protected]8d625fb2012-07-18 16:40:0646#include "ash/display/screen_position_controller.h"
oshimae2818922015-07-28 01:18:5247#include "ash/display/window_tree_host_manager.h"
[email protected]f4c92b382012-08-28 00:59:5948#include "ash/drag_drop/drag_drop_controller.h"
Mike Wasserman5623bac22018-04-30 17:24:3249#include "ash/events/event_rewriter_controller.h"
James Cookf5398842018-04-16 20:15:2450#include "ash/first_run/first_run_helper.h"
James Cookb0bf8e82017-04-09 17:01:4451#include "ash/focus_cycler.h"
Evan Stade5f09e6572018-08-10 17:48:1552#include "ash/frame/non_client_frame_view_ash.h"
[email protected]f4c92b382012-08-28 00:59:5953#include "ash/high_contrast/high_contrast_controller.h"
Vladislav Kaznacheev6d6aaff2017-07-22 04:06:3254#include "ash/highlighter/highlighter_controller.h"
Scott Violet596bb46342017-06-21 14:43:1355#include "ash/host/ash_window_tree_host_init_params.h"
James Cookbb026732017-06-09 23:01:5556#include "ash/ime/ime_controller.h"
Xiyuan Xia5f1046e2018-06-01 16:04:4457#include "ash/ime/ime_focus_handler.h"
Steven Bennettsa0ea30942018-10-11 22:27:5158#include "ash/keyboard/ash_keyboard_controller.h"
James Cook8d912522018-06-19 02:18:4759#include "ash/keyboard/virtual_keyboard_controller.h"
sammiequon203ae022016-09-18 17:23:4260#include "ash/laser/laser_pointer_controller.h"
Jacob Dufaultffd9b0d2017-11-15 23:07:1661#include "ash/login/login_screen_controller.h"
James Cookb0bf8e82017-04-09 17:01:4462#include "ash/login_status.h"
Ahmed Fakhry4bf3f742018-02-06 17:33:3663#include "ash/magnifier/docked_magnifier_controller.h"
[email protected]f4c92b382012-08-28 00:59:5964#include "ash/magnifier/magnification_controller.h"
[email protected]77f7c132012-11-15 06:52:5465#include "ash/magnifier/partial_magnification_controller.h"
James Cookb0bf8e82017-04-09 17:01:4466#include "ash/media_controller.h"
Scott Violet3c554ae2017-12-13 02:25:4167#include "ash/metrics/time_to_first_present_recorder.h"
Kyle Horimoto9fc84fc22018-04-27 19:45:1568#include "ash/multi_device_setup/multi_device_notification_presenter.h"
James Cookb0bf8e82017-04-09 17:01:4469#include "ash/new_window_controller.h"
Vladislav Kaznacheev92edf62e2017-10-13 22:08:0170#include "ash/note_taking_controller.h"
Qiang Xud8e897e2018-05-24 20:07:5771#include "ash/policy/policy_recommendation_restorer.h"
Steven Bennetts93d3e5b12018-05-05 01:14:5072#include "ash/public/cpp/ash_constants.h"
Ahmed Fakhry4af48e42018-02-28 17:45:3873#include "ash/public/cpp/ash_features.h"
Evan Stade7d0e8232017-10-04 02:01:3674#include "ash/public/cpp/ash_switches.h"
msw109806d2017-06-02 20:11:5775#include "ash/public/cpp/shelf_model.h"
jamescook8800b8232016-10-19 12:46:2776#include "ash/public/cpp/shell_window_ids.h"
[email protected]d90b8392012-06-13 09:34:5677#include "ash/root_window_controller.h"
James Cook5e9d3402017-11-01 00:20:1278#include "ash/screenshot_delegate.h"
James Cookb0bf8e82017-04-09 17:01:4479#include "ash/session/session_controller.h"
James Cook840177e2017-05-25 02:20:0180#include "ash/shelf/shelf.h"
James Cookb0bf8e82017-04-09 17:01:4481#include "ash/shelf/shelf_controller.h"
James Cookb0bf8e82017-04-09 17:01:4482#include "ash/shelf/shelf_window_watcher.h"
James Cookb0bf8e82017-04-09 17:01:4483#include "ash/shell_delegate.h"
[email protected]1b4c7472014-05-15 18:32:2384#include "ash/shell_init_params.h"
James Cookb0bf8e82017-04-09 17:01:4485#include "ash/shell_observer.h"
James Cook40f7d752018-05-25 18:21:5886#include "ash/shell_state.h"
James Cookb0bf8e82017-04-09 17:01:4487#include "ash/shutdown_controller.h"
jamescook01bf23e72017-01-09 19:58:1588#include "ash/sticky_keys/sticky_keys_controller.h"
Tetsui Ohkubo01421b32018-05-30 16:54:5989#include "ash/system/audio/display_speaker_controller.h"
James Cooka35a1e22017-04-08 02:33:0890#include "ash/system/bluetooth/bluetooth_notification_controller.h"
Sonny Sasaka55f69fc2017-08-28 21:29:3791#include "ash/system/bluetooth/bluetooth_power_controller.h"
Giovanni Ortuño Urquidi55aa5d8f2018-10-10 05:33:3492#include "ash/system/bluetooth/tray_bluetooth_helper_experimental.h"
93#include "ash/system/bluetooth/tray_bluetooth_helper_legacy.h"
James Cooka35a1e22017-04-08 02:33:0894#include "ash/system/brightness/brightness_controller_chromeos.h"
James Cookb0bf8e82017-04-09 17:01:4495#include "ash/system/brightness_control_delegate.h"
Tetsui Ohkubo5e2499532018-04-04 02:01:3996#include "ash/system/caps_lock_notification_controller.h"
Lann Martinb9991402017-06-23 22:25:0897#include "ash/system/keyboard_brightness/keyboard_brightness_controller.h"
James Cookb0bf8e82017-04-09 17:01:4498#include "ash/system/keyboard_brightness_control_delegate.h"
James Cookb0bf8e82017-04-09 17:01:4499#include "ash/system/locale/locale_notification_controller.h"
Tetsui Ohkubo8d354c32018-10-11 01:23:28100#include "ash/system/message_center/message_center_controller.h"
Tetsui Ohkubo21722932018-03-02 02:56:56101#include "ash/system/model/system_tray_model.h"
James Cooka35a1e22017-04-08 02:33:08102#include "ash/system/network/sms_observer.h"
103#include "ash/system/network/vpn_list.h"
afakhrye4fae852017-05-09 18:49:06104#include "ash/system/night_light/night_light_controller.h"
Sammie Quon4d7dba62017-08-03 23:18:17105#include "ash/system/palette/palette_tray.h"
Sammie Quon6c4e2b1f2017-10-13 16:54:18106#include "ash/system/palette/palette_welcome_bubble.h"
Toni Barzic9d0c82f42017-12-06 00:53:52107#include "ash/system/power/backlights_forced_off_setter.h"
Sammie Quon95c6a1c2017-09-12 19:16:55108#include "ash/system/power/peripheral_battery_notifier.h"
Qiang Xu0a86020f2017-10-12 08:34:54109#include "ash/system/power/power_button_controller.h"
James Cooka35a1e22017-04-08 02:33:08110#include "ash/system/power/power_event_observer.h"
Qiang Xu36234e532018-04-11 04:54:02111#include "ash/system/power/power_prefs.h"
James Cooka35a1e22017-04-08 02:33:08112#include "ash/system/power/power_status.h"
113#include "ash/system/power/video_activity_notifier.h"
114#include "ash/system/screen_layout_observer.h"
Tetsui Ohkubo54d50222018-05-10 01:58:11115#include "ash/system/screen_security/screen_switch_check_controller.h"
James Cookdc041122017-08-01 14:03:22116#include "ash/system/session/logout_button_tray.h"
James Cooka35a1e22017-04-08 02:33:08117#include "ash/system/session/logout_confirmation_controller.h"
James Cookb0bf8e82017-04-09 17:01:44118#include "ash/system/status_area_widget.h"
Tetsui Ohkubo269b5792018-04-26 01:06:32119#include "ash/system/system_notification_controller.h"
James Cookb0bf8e82017-04-09 17:01:44120#include "ash/system/toast/toast_manager.h"
James Cookb0bf8e82017-04-09 17:01:44121#include "ash/system/tray/system_tray_notifier.h"
kylechar55f0eaf22017-01-11 22:57:37122#include "ash/touch/ash_touch_transform_controller.h"
Qiang Xuf1400a362017-09-14 02:28:30123#include "ash/touch/touch_devices_controller.h"
tbarzicc78da1ff92017-05-08 20:46:15124#include "ash/tray_action/tray_action.h"
oshima5a296e82016-04-29 01:32:27125#include "ash/utility/screenshot_controller.h"
Yue Lia33960a2017-11-01 22:06:07126#include "ash/voice_interaction/voice_interaction_controller.h"
James Cookb0bf8e82017-04-09 17:01:44127#include "ash/wallpaper/wallpaper_controller.h"
Scott Violet737fb752018-04-11 15:35:22128#include "ash/wayland/wayland_server_controller.h"
[email protected]39718b52012-12-03 17:24:56129#include "ash/wm/ash_focus_rules.h"
James Cookb0bf8e82017-04-09 17:01:44130#include "ash/wm/container_finder.h"
James Cook698fc3662018-07-27 16:05:01131#include "ash/wm/cursor_manager_chromeos.h"
[email protected]262f8bd2012-03-23 19:30:27132#include "ash/wm/event_client_impl.h"
James Cookb0bf8e82017-04-09 17:01:44133#include "ash/wm/immersive_context_ash.h"
skyb7b54092016-08-19 16:00:09134#include "ash/wm/immersive_handler_factory_ash.h"
[email protected]ab4f8c92013-05-30 19:07:47135#include "ash/wm/lock_state_controller.h"
James Cookb0bf8e82017-04-09 17:01:44136#include "ash/wm/mru_window_tracker.h"
James Cookbc2758b42018-09-07 16:20:37137#include "ash/wm/native_cursor_manager_ash.h"
Scott Violetac410622018-08-11 18:33:22138#include "ash/wm/non_client_frame_controller.h"
[email protected]9ae32df2012-07-26 03:25:18139#include "ash/wm/overlay_event_filter.h"
James Cookb0bf8e82017-04-09 17:01:44140#include "ash/wm/overview/window_selector_controller.h"
[email protected]e4a181cc2012-03-17 02:20:57141#include "ash/wm/resize_shadow_controller.h"
James Cookb0bf8e82017-04-09 17:01:44142#include "ash/wm/root_window_finder.h"
hidehiko6821ca42016-06-18 11:12:23143#include "ash/wm/screen_pinning_controller.h"
xdaid4913762017-07-06 00:17:22144#include "ash/wm/splitview/split_view_controller.h"
[email protected]435b212e2012-04-05 19:43:37145#include "ash/wm/system_gesture_event_filter.h"
[email protected]c0ce80e2012-10-05 23:28:27146#include "ash/wm/system_modal_container_event_filter.h"
James Cookb0bf8e82017-04-09 17:01:44147#include "ash/wm/system_modal_container_layout_manager.h"
Mitsuru Oshima0e9b7a62017-07-19 18:23:03148#include "ash/wm/tablet_mode/tablet_mode_controller.h"
149#include "ash/wm/tablet_mode/tablet_mode_window_manager.h"
[email protected]3537d472014-01-15 05:45:31150#include "ash/wm/toplevel_window_event_handler.h"
[email protected]9633a9d22012-01-21 16:40:58151#include "ash/wm/video_detector.h"
[email protected]b5756e22012-11-30 01:32:02152#include "ash/wm/window_animations.h"
James Cookb0bf8e82017-04-09 17:01:44153#include "ash/wm/window_cycle_controller.h"
154#include "ash/wm/window_positioner.h"
[email protected]f059c6942012-07-21 14:27:57155#include "ash/wm/window_properties.h"
[email protected]f4c92b382012-08-28 00:59:59156#include "ash/wm/window_util.h"
Sammie Quon557418662018-04-25 18:45:51157#include "ash/wm/wm_shadow_controller_delegate.h"
James Cookb0bf8e82017-04-09 17:01:44158#include "ash/wm/workspace_controller.h"
Scott Violetb7f4df22018-05-17 04:43:12159#include "ash/ws/window_service_owner.h"
[email protected]f296be72011-10-11 15:40:00160#include "base/bind.h"
jamescook01bf23e72017-01-09 19:58:15161#include "base/bind_helpers.h"
jamescookfda159002016-10-21 18:48:57162#include "base/command_line.h"
dchenga94547472016-04-08 08:41:11163#include "base/memory/ptr_util.h"
jamescook01bf23e72017-01-09 19:58:15164#include "base/sys_info.h"
primiano7182d7b2015-01-30 18:02:03165#include "base/trace_event/trace_event.h"
Kyle Horimoto9fc84fc22018-04-27 19:45:15166#include "chromeos/chromeos_features.h"
Toni Barzic85c9e0802018-03-30 02:46:01167#include "chromeos/dbus/dbus_thread_manager.h"
Qiang Xu36234e532018-04-11 04:54:02168#include "chromeos/dbus/power_policy_controller.h"
reveman24158982017-01-10 05:58:45169#include "chromeos/system/devicemode.h"
Scott Violet737fb752018-04-11 15:35:22170#include "components/exo/file_helper.h"
tibellb93c729b2017-03-30 00:45:09171#include "components/prefs/pref_registry_simple.h"
172#include "components/prefs/pref_service.h"
Saman Sami3fb310d2017-11-09 16:51:54173#include "components/viz/host/host_frame_sink_manager.h"
tibellb93c729b2017-03-30 00:45:09174#include "services/preferences/public/cpp/pref_service_factory.h"
Ken Rockotf7f533e2018-02-11 02:21:33175#include "services/preferences/public/mojom/preferences.mojom.h"
derat94887a22017-01-20 18:17:25176#include "services/service_manager/public/cpp/connector.h"
Xiyuan Xiaebf96b72018-09-07 21:04:34177#include "services/ws/public/cpp/host/gpu_interface_provider.h"
Scott Violet9f984252018-08-27 19:02:13178#include "services/ws/window_service.h"
[email protected]2c456102011-12-26 06:26:34179#include "ui/aura/client/aura_constants.h"
[email protected]8a45c972012-03-14 18:22:44180#include "ui/aura/env.h"
[email protected]4bb16502011-12-06 14:44:58181#include "ui/aura/layout_manager.h"
[email protected]87b0d82e2011-10-07 21:02:59182#include "ui/aura/window.h"
[email protected]fcc51c952014-02-21 21:31:26183#include "ui/aura/window_event_dispatcher.h"
Scott Violet6c0eb6962018-06-20 01:31:26184#include "ui/base/ui_base_features.h"
[email protected]2d4817742012-12-17 20:16:18185#include "ui/base/ui_base_switches.h"
derat2d4e62d2015-01-09 16:09:17186#include "ui/base/user_activity/user_activity_detector.h"
jamescook01bf23e72017-01-09 19:58:15187#include "ui/chromeos/user_activity_power_manager_notifier.h"
[email protected]116302fc2012-05-05 21:45:41188#include "ui/compositor/layer.h"
189#include "ui/compositor/layer_animator.h"
oshimaf84b0da722016-04-27 19:47:19190#include "ui/display/display.h"
Joone Hurd3ae8732018-04-17 18:05:09191#include "ui/display/manager/default_touch_transform_setter.h"
192#include "ui/display/manager/display_change_observer.h"
193#include "ui/display/manager/display_configurator.h"
rjkroege72f8154f2016-10-29 00:49:02194#include "ui/display/manager/display_manager.h"
Joone Hurd3ae8732018-04-17 18:05:09195#include "ui/display/manager/touch_transform_setter.h"
oshimaf84b0da722016-04-27 19:47:19196#include "ui/display/screen.h"
skycfaad892017-04-28 20:52:58197#include "ui/display/types/native_display_delegate.h"
[email protected]3e670aa2013-12-02 19:04:32198#include "ui/events/event_target_iterator.h"
sky4ec2be82017-01-06 17:38:32199#include "ui/gfx/geometry/insets.h"
[email protected]9ec0f452012-05-31 15:58:53200#include "ui/gfx/image/image_skia.h"
James Cook9db56d72018-08-01 03:21:31201#include "ui/ozone/public/ozone_platform.h"
[email protected]d7f30a72013-10-05 05:09:41202#include "ui/views/corewm/tooltip_aura.h"
[email protected]a1b7a822013-02-23 19:08:04203#include "ui/views/corewm/tooltip_controller.h"
sky07a24d42017-03-09 23:57:30204#include "ui/views/focus/focus_manager_factory.h"
Scott Violetac410622018-08-11 18:33:22205#include "ui/views/mus/window_manager_frame_values.h"
[email protected]c13be0d2011-11-22 02:09:58206#include "ui/views/widget/native_widget_aura.h"
207#include "ui/views/widget/widget.h"
[email protected]60d677d2014-05-30 13:07:02208#include "ui/wm/core/accelerator_filter.h"
[email protected]ee3ed10772014-03-11 22:02:01209#include "ui/wm/core/compound_event_filter.h"
210#include "ui/wm/core/focus_controller.h"
[email protected]ee3ed10772014-03-11 22:02:01211#include "ui/wm/core/shadow_controller.h"
212#include "ui/wm/core/visibility_controller.h"
213#include "ui/wm/core/window_modality_controller.h"
[email protected]87b0d82e2011-10-07 21:02:59214
[email protected]55f593352011-12-24 05:42:46215namespace ash {
[email protected]87b0d82e2011-10-07 21:02:59216
217namespace {
[email protected]671a2ae2011-10-13 21:53:23218
[email protected]615922f2012-02-07 02:41:15219using aura::Window;
[email protected]3f02dc52011-10-21 19:36:45220using views::Widget;
221
jamescook518dccbd2017-05-18 04:57:07222bool g_is_browser_process_with_mash = false;
223
[email protected]b5756e22012-11-30 01:32:02224// A Corewm VisibilityController subclass that calls the Ash animation routine
225// so we can pick up our extended animations. See ash/wm/window_animations.h.
[email protected]e319c7e2014-03-14 19:56:14226class AshVisibilityController : public ::wm::VisibilityController {
[email protected]b5756e22012-11-30 01:32:02227 public:
Chris Watkinsc24daf62017-11-28 03:43:09228 AshVisibilityController() = default;
229 ~AshVisibilityController() override = default;
[email protected]b5756e22012-11-30 01:32:02230
231 private:
[email protected]e319c7e2014-03-14 19:56:14232 // Overridden from ::wm::VisibilityController:
dcheng1f4538e2014-10-27 23:57:05233 bool CallAnimateOnChildWindowVisibilityChanged(aura::Window* window,
234 bool visible) override {
[email protected]b5756e22012-11-30 01:32:02235 return AnimateOnChildWindowVisibilityChanged(window, visible);
236 }
237
238 DISALLOW_COPY_AND_ASSIGN(AshVisibilityController);
239};
240
Qiang Xu36234e532018-04-11 04:54:02241// Registers prefs whose default values are same in user and signin prefs.
242void RegisterProfilePrefs(PrefRegistrySimple* registry, bool for_test) {
243 AccessibilityController::RegisterProfilePrefs(registry, for_test);
244 BluetoothPowerController::RegisterProfilePrefs(registry);
Qiang Xudcf11e32018-04-25 17:10:17245 DockedMagnifierController::RegisterProfilePrefs(registry, for_test);
Qiang Xu36234e532018-04-11 04:54:02246 LoginScreenController::RegisterProfilePrefs(registry, for_test);
247 LogoutButtonTray::RegisterProfilePrefs(registry);
yoshiki iguchi71623722018-08-10 19:44:45248 MessageCenterController::RegisterProfilePrefs(registry);
Qiang Xu36234e532018-04-11 04:54:02249 NightLightController::RegisterProfilePrefs(registry);
250 PaletteTray::RegisterProfilePrefs(registry);
251 PaletteWelcomeBubble::RegisterProfilePrefs(registry);
252 ShelfController::RegisterProfilePrefs(registry);
Michael Giuffridac997aa72018-08-31 23:38:59253 TouchDevicesController::RegisterProfilePrefs(registry);
Qiang Xu36234e532018-04-11 04:54:02254 CapsLockNotificationController::RegisterProfilePrefs(registry, for_test);
255}
256
[email protected]87b0d82e2011-10-07 21:02:59257} // namespace
258
[email protected]cac10fc62011-10-07 23:22:56259// static
achuith287b26e2015-09-03 17:49:18260Shell* Shell::instance_ = nullptr;
[email protected]2b4cd302012-02-24 20:21:13261
262////////////////////////////////////////////////////////////////////////////////
[email protected]cac10fc62011-10-07 23:22:56263// Shell, public:
264
[email protected]cac10fc62011-10-07 23:22:56265// static
Scott Violetc8a1c6c2017-11-29 23:17:36266Shell* Shell::CreateInstance(ShellInitParams init_params) {
[email protected]3266c2b92011-11-14 00:06:08267 CHECK(!instance_);
James Cookfa4838e2018-08-08 16:30:15268 instance_ = new Shell(std::move(init_params.delegate), init_params.connector);
Scott Violete5c79f52018-07-31 00:10:17269 instance_->Init(init_params.context_factory,
270 init_params.context_factory_private,
271 std::move(init_params.initial_display_prefs),
272 std::move(init_params.gpu_interface_provider));
[email protected]3266c2b92011-11-14 00:06:08273 return instance_;
274}
275
276// static
skyb073203a2017-03-13 16:59:16277Shell* Shell::Get() {
jamescook518dccbd2017-05-18 04:57:07278 CHECK(!g_is_browser_process_with_mash) // Implies null |instance_|.
279 << "Ash is running in its own process so Shell::Get() will return null. "
280 "The browser process must use the mojo interfaces in //ash/public to "
281 "access ash. See ash/README.md for details.";
oshima9eea82da2014-09-13 01:11:07282 CHECK(instance_);
[email protected]cac10fc62011-10-07 23:22:56283 return instance_;
284}
285
[email protected]6377a002011-11-10 20:26:47286// static
[email protected]b3b7bcd2012-03-06 19:35:45287bool Shell::HasInstance() {
288 return !!instance_;
289}
290
291// static
[email protected]ef589af2011-12-03 01:07:15292void Shell::DeleteInstance() {
[email protected]6377a002011-11-10 20:26:47293 delete instance_;
[email protected]6377a002011-11-10 20:26:47294}
295
[email protected]e73bd7802012-02-17 20:10:34296// static
[email protected]093b8d642014-04-03 20:59:28297RootWindowController* Shell::GetPrimaryRootWindowController() {
oshima9eea82da2014-09-13 01:11:07298 CHECK(HasInstance());
msw257a6a232017-06-01 01:46:30299 return RootWindowController::ForWindow(GetPrimaryRootWindow());
[email protected]be65be362012-06-15 07:38:23300}
301
302// static
303Shell::RootWindowControllerList Shell::GetAllRootWindowControllers() {
oshima9eea82da2014-09-13 01:11:07304 CHECK(HasInstance());
skyabcae812017-01-18 17:01:34305 RootWindowControllerList root_window_controllers;
msw257a6a232017-06-01 01:46:30306 for (aura::Window* root : GetAllRootWindows())
307 root_window_controllers.push_back(RootWindowController::ForWindow(root));
skyabcae812017-01-18 17:01:34308 return root_window_controllers;
[email protected]d90b8392012-06-13 09:34:56309}
310
311// static
thanhphc90f49ca2017-03-03 17:48:53312RootWindowController* Shell::GetRootWindowControllerWithDisplayId(
313 int64_t display_id) {
314 CHECK(HasInstance());
Scott Violet596bb46342017-06-21 14:43:13315 aura::Window* root = GetRootWindowForDisplayId(display_id);
msw257a6a232017-06-01 01:46:30316 return root ? RootWindowController::ForWindow(root) : nullptr;
thanhphc90f49ca2017-03-03 17:48:53317}
318
319// static
Scott Violet596bb46342017-06-21 14:43:13320aura::Window* Shell::GetRootWindowForDisplayId(int64_t display_id) {
321 CHECK(HasInstance());
322 return instance_->window_tree_host_manager_->GetRootWindowForDisplayId(
323 display_id);
324}
325
326// static
[email protected]bf9cdb362013-10-25 19:22:45327aura::Window* Shell::GetPrimaryRootWindow() {
oshima9eea82da2014-09-13 01:11:07328 CHECK(HasInstance());
Scott Violet596bb46342017-06-21 14:43:13329 return instance_->window_tree_host_manager_->GetPrimaryRootWindow();
[email protected]e73bd7802012-02-17 20:10:34330}
331
[email protected]7b0f7502012-06-11 00:12:39332// static
sky27344382017-03-08 21:30:32333aura::Window* Shell::GetRootWindowForNewWindows() {
James Cook40f7d752018-05-25 18:21:58334 return Shell::Get()->shell_state_->GetRootWindowForNewWindows();
mfomitcheva1a8aa62016-05-03 16:23:26335}
336
337// static
[email protected]c9390bd2013-11-08 20:33:13338aura::Window::Windows Shell::GetAllRootWindows() {
oshima9eea82da2014-09-13 01:11:07339 CHECK(HasInstance());
Scott Violet596bb46342017-06-21 14:43:13340 return instance_->window_tree_host_manager_->GetAllRootWindows();
[email protected]be65be362012-06-15 07:38:23341}
342
343// static
jamescookb8dcef522016-06-25 14:42:55344aura::Window* Shell::GetContainer(aura::Window* root_window, int container_id) {
[email protected]7b0f7502012-06-11 00:12:39345 return root_window->GetChildById(container_id);
346}
347
348// static
[email protected]bf9cdb362013-10-25 19:22:45349const aura::Window* Shell::GetContainer(const aura::Window* root_window,
[email protected]e67291f12012-10-10 05:52:38350 int container_id) {
351 return root_window->GetChildById(container_id);
352}
353
sky494c6cbd2017-03-27 20:57:48354// static
James Cook7b7c6a52018-01-04 23:40:03355int Shell::GetOpenSystemModalWindowContainerId() {
356 // The test boolean is not static to avoid leaking state between tests.
357 if (Get()->simulate_modal_window_open_for_test_)
358 return kShellWindowId_SystemModalContainer;
359
360 // Traverse all system modal containers, and find its direct child window
361 // with "SystemModal" setting, and visible.
James Cook7b7c6a52018-01-04 23:40:03362 for (aura::Window* root : Shell::GetAllRootWindows()) {
Xiyuan Xia40b3fb1f2018-08-22 22:18:20363 for (int modal_window_id : kSystemModalContainerIds) {
James Cook7b7c6a52018-01-04 23:40:03364 aura::Window* system_modal = root->GetChildById(modal_window_id);
365 if (!system_modal)
366 continue;
367 for (const aura::Window* child : system_modal->children()) {
368 if (child->GetProperty(aura::client::kModalKey) ==
369 ui::MODAL_TYPE_SYSTEM &&
370 child->layer()->GetTargetVisibility()) {
371 return modal_window_id;
372 }
373 }
374 }
375 }
376 return -1;
377}
378
379// static
380bool Shell::IsSystemModalWindowOpen() {
381 return GetOpenSystemModalWindowContainerId() >= 0;
382}
383
384// static
James Cooka6066972018-07-31 19:34:07385bool Shell::HasRemoteClient(aura::Window* window) {
Scott Violet7e33efc2018-08-29 22:30:15386 return ws::WindowService::HasRemoteClient(window);
James Cooka6066972018-07-31 19:34:07387}
388
389// static
Steven Bennettsca108512018-05-02 11:05:03390void Shell::RegisterLocalStatePrefs(PrefRegistrySimple* registry,
391 bool for_test) {
Sammie Quon4d7dba62017-08-03 23:18:17392 PaletteTray::RegisterLocalStatePrefs(registry);
Wenzhao Zang56c292932017-08-02 04:58:34393 WallpaperController::RegisterLocalStatePrefs(registry);
Sonny Sasaka55f69fc2017-08-28 21:29:37394 BluetoothPowerController::RegisterLocalStatePrefs(registry);
Toni Barzicd6238312018-03-02 18:26:13395 DetachableBaseHandler::RegisterPrefs(registry);
Steven Bennettsca108512018-05-02 11:05:03396 // Note: DisplayPrefs are registered in chrome in AshShellInit::RegisterPrefs
397 // (see comment there for details).
398 if (for_test)
399 DisplayPrefs::RegisterLocalStatePrefs(registry);
400 else
401 DisplayPrefs::RegisterForeignPrefs(registry);
Wenzhao Zang56c292932017-08-02 04:58:34402}
403
404// static
Qiang Xu36234e532018-04-11 04:54:02405void Shell::RegisterSigninProfilePrefs(PrefRegistrySimple* registry,
406 bool for_test) {
407 RegisterProfilePrefs(registry, for_test);
408 PowerPrefs::RegisterSigninProfilePrefs(registry, for_test);
409}
410
411// static
412void Shell::RegisterUserProfilePrefs(PrefRegistrySimple* registry,
413 bool for_test) {
414 RegisterProfilePrefs(registry, for_test);
415 PowerPrefs::RegisterUserProfilePrefs(registry, for_test);
afakhrye4fae852017-05-09 18:49:06416}
417
Xiyuan Xia36197372018-04-25 00:45:17418void Shell::InitWaylandServer(std::unique_ptr<exo::FileHelper> file_helper) {
Scott Violetac410622018-08-11 18:33:22419 wayland_server_controller_ = WaylandServerController::CreateIfNecessary(
420 std::move(file_helper), aura_env_);
Tetsui Ohkubo852abe642018-10-03 02:52:27421 if (wayland_server_controller_) {
422 system_tray_model()
423 ->virtual_keyboard()
424 ->SetInputMethodSurfaceManagerObserver(
425 wayland_server_controller_->arc_input_method_surface_manager());
426 }
Scott Violet737fb752018-04-11 15:35:22427}
428
429void Shell::DestroyWaylandServer() {
Tetsui Ohkubo852abe642018-10-03 02:52:27430 if (wayland_server_controller_) {
431 system_tray_model()
432 ->virtual_keyboard()
433 ->RemoveInputMethodSurfaceManagerObserver(
434 wayland_server_controller_->arc_input_method_surface_manager());
435 }
Scott Violet737fb752018-04-11 15:35:22436 wayland_server_controller_.reset();
437}
438
[email protected]57b8bb352012-01-11 05:11:46439views::NonClientFrameView* Shell::CreateDefaultNonClientFrameView(
440 views::Widget* widget) {
[email protected]c73d1332012-03-08 17:11:04441 // Use translucent-style window frames for dialogs.
Evan Stade5f09e6572018-08-10 17:48:15442 return new NonClientFrameViewAsh(widget);
[email protected]57b8bb352012-01-11 05:11:46443}
444
[email protected]2e236a52012-06-27 22:21:47445void Shell::SetDisplayWorkAreaInsets(Window* contains,
[email protected]8a45c972012-03-14 18:22:44446 const gfx::Insets& insets) {
Scott Violet596bb46342017-06-21 14:43:13447 window_tree_host_manager_->UpdateWorkAreaOfDisplayNearestWindow(contains,
448 insets);
[email protected]1a2145b2012-03-13 21:09:17449}
450
[email protected]58868abf2014-01-17 23:45:33451void Shell::OnCastingSessionStartedOrStopped(bool started) {
sky00c813f2017-03-08 22:48:55452 for (auto& observer : shell_observers_)
ericwilligers5eff47d2016-10-17 19:19:18453 observer.OnCastingSessionStartedOrStopped(started);
[email protected]58868abf2014-01-17 23:45:33454}
455
varkhac71444e52017-05-25 22:51:34456void Shell::OnRootWindowAdded(aura::Window* root_window) {
sky00c813f2017-03-08 22:48:55457 for (auto& observer : shell_observers_)
ericwilligers5eff47d2016-10-17 19:19:18458 observer.OnRootWindowAdded(root_window);
[email protected]0e3e7cb2014-04-12 05:18:25459}
460
Zach Helfinsteinbbb6bad2018-05-02 18:21:51461void Shell::OnDictationStarted() {
462 for (auto& observer : shell_observers_)
463 observer.OnDictationStarted();
464}
465
466void Shell::OnDictationEnded() {
467 for (auto& observer : shell_observers_)
468 observer.OnDictationEnded();
469}
470
Darren Shenf62db77a2018-06-07 06:22:44471void Shell::EnableKeyboard() {
Steven Bennettsa0ea30942018-10-11 22:27:51472 // The keyboard controller is persistent; this will create or recreate the
473 // keyboard window as necessary.
474 ash_keyboard_controller_->EnableKeyboard();
[email protected]51f438112013-11-18 19:32:50475}
476
Darren Shenf62db77a2018-06-07 06:22:44477void Shell::DisableKeyboard() {
Steven Bennettsa0ea30942018-10-11 22:27:51478 ash_keyboard_controller_->DisableKeyboard();
[email protected]e1b299b2014-01-29 23:53:41479}
480
[email protected]da285852014-05-27 19:53:43481bool Shell::ShouldSaveDisplaySettings() {
jamescookb8dcef522016-06-25 14:42:55482 return !(
483 screen_orientation_controller_->ignore_display_configuration_updates() ||
484 resolution_notification_controller_->DoesNotificationTimeout());
[email protected]da285852014-05-27 19:53:43485}
[email protected]da285852014-05-27 19:53:43486
Ahmed Fakhry4bf3f742018-02-06 17:33:36487DockedMagnifierController* Shell::docked_magnifier_controller() {
Ahmed Fakhry4af48e42018-02-28 17:45:38488 DCHECK(features::IsDockedMagnifierEnabled());
Ahmed Fakhry4bf3f742018-02-06 17:33:36489 return docked_magnifier_controller_.get();
490}
491
afakhry9e0a18b32017-06-05 19:23:14492NightLightController* Shell::night_light_controller() {
Ahmed Fakhryb9ace242018-06-06 18:49:31493 DCHECK(features::IsNightLightEnabled());
afakhry9e0a18b32017-06-05 19:23:14494 return night_light_controller_.get();
495}
496
sky5ad143a2017-03-22 04:31:23497ShelfModel* Shell::shelf_model() {
498 return shelf_controller_->model();
499}
500
Thiago Farina3b086a02017-05-30 22:32:50501::wm::ActivationClient* Shell::activation_client() {
sky27344382017-03-08 21:30:32502 return focus_controller_.get();
503}
504
[email protected]c758fbf2012-03-25 22:53:59505void Shell::UpdateShelfVisibility() {
msw257a6a232017-06-01 01:46:30506 for (aura::Window* root : GetAllRootWindows())
507 Shelf::ForWindow(root)->UpdateVisibilityState();
[email protected]c758fbf2012-03-25 22:53:59508}
509
Xiyuan Xia522710a2018-05-08 16:35:42510NotificationTray* Shell::GetNotificationTray() {
jamescook612205f2016-05-26 06:02:11511 return GetPrimaryRootWindowController()
jamescookb551aba2016-09-01 01:00:16512 ->GetStatusAreaWidget()
Xiyuan Xia522710a2018-05-08 16:35:42513 ->notification_tray();
[email protected]e74aaf0a2012-10-12 18:42:28514}
515
[email protected]a0afeb12012-12-10 22:57:09516bool Shell::HasPrimaryStatusArea() {
jamescookb551aba2016-09-01 01:00:16517 return !!GetPrimaryRootWindowController()->GetStatusAreaWidget();
[email protected]31f19e32012-10-30 22:31:23518}
519
[email protected]a0afeb12012-12-10 22:57:09520SystemTray* Shell::GetPrimarySystemTray() {
521 return GetPrimaryRootWindowController()->GetSystemTray();
[email protected]aa54218b2012-06-12 16:51:42522}
523
yawanodc5533b32017-02-23 11:04:38524void Shell::SetLargeCursorSizeInDip(int large_cursor_size_in_dip) {
525 window_tree_host_manager_->cursor_window_controller()
526 ->SetLargeCursorSizeInDip(large_cursor_size_in_dip);
527}
528
Weidong Guod07448f2017-10-18 03:35:18529void Shell::UpdateCursorCompositingEnabled() {
530 SetCursorCompositingEnabled(
531 window_tree_host_manager_->cursor_window_controller()
532 ->ShouldEnableCursorCompositing());
533}
534
[email protected]87ec2202014-02-06 06:24:27535void Shell::SetCursorCompositingEnabled(bool enabled) {
James Cookf2920df2018-09-04 19:55:01536 CursorWindowController* cursor_window_controller =
537 window_tree_host_manager_->cursor_window_controller();
Weidong Guo7dfd1482017-11-08 05:56:28538
James Cookf2920df2018-09-04 19:55:01539 if (cursor_window_controller->is_cursor_compositing_enabled() == enabled)
540 return;
541 cursor_window_controller->SetCursorCompositingEnabled(enabled);
542 native_cursor_manager_->SetNativeCursorEnabled(!enabled);
[email protected]87ec2202014-02-06 06:24:27543}
[email protected]59ccade2013-10-17 17:56:40544
[email protected]f9466702012-09-17 16:35:27545void Shell::DoInitialWorkspaceAnimation() {
jamescookb8dcef522016-06-25 14:42:55546 return GetPrimaryRootWindowController()
547 ->workspace_controller()
548 ->DoInitialAnimation();
[email protected]f9466702012-09-17 16:35:27549}
550
xdaid4913762017-07-06 00:17:22551bool Shell::IsSplitViewModeActive() const {
Xiaoqian Daibf3771f2018-03-13 18:21:46552 return split_view_controller_.get() &&
553 split_view_controller_->IsSplitViewModeActive();
xdaid4913762017-07-06 00:17:22554}
555
James Cookfa4838e2018-08-08 16:30:15556void Shell::ShowContextMenu(const gfx::Point& location_in_screen,
557 ui::MenuSourceType source_type) {
558 // Bail with no active user session, in the lock screen, or in app/kiosk mode.
559 if (session_controller_->NumberOfLoggedInUsers() < 1 ||
560 session_controller_->IsScreenLocked() ||
561 session_controller_->IsRunningInAppMode()) {
562 return;
563 }
564
565 aura::Window* root = wm::GetRootWindowAt(location_in_screen);
566 RootWindowController::ForWindow(root)->ShowContextMenu(location_in_screen,
567 source_type);
568}
569
sky00c813f2017-03-08 22:48:55570void Shell::AddShellObserver(ShellObserver* observer) {
571 shell_observers_.AddObserver(observer);
572}
573
574void Shell::RemoveShellObserver(ShellObserver* observer) {
575 shell_observers_.RemoveObserver(observer);
576}
577
sky5ad143a2017-03-22 04:31:23578void Shell::UpdateAfterLoginStatusChange(LoginStatus status) {
varkha59679632017-06-01 00:42:05579 for (auto* root_window_controller : GetAllRootWindowControllers())
580 root_window_controller->UpdateAfterLoginStatusChange(status);
sky5ad143a2017-03-22 04:31:23581}
582
sky00c813f2017-03-08 22:48:55583void Shell::NotifyOverviewModeStarting() {
584 for (auto& observer : shell_observers_)
585 observer.OnOverviewModeStarting();
586}
587
Xiaoqian Daifb4698ed2018-02-23 20:11:06588void Shell::NotifyOverviewModeEnding() {
589 for (auto& observer : shell_observers_)
590 observer.OnOverviewModeEnding();
591}
592
sky00c813f2017-03-08 22:48:55593void Shell::NotifyOverviewModeEnded() {
594 for (auto& observer : shell_observers_)
595 observer.OnOverviewModeEnded();
596}
597
Sammie Quon317deb52018-09-06 16:36:28598void Shell::NotifyOverviewModeEndingAnimationComplete() {
599 for (auto& observer : shell_observers_)
600 observer.OnOverviewModeEndingAnimationComplete();
601}
602
xdaid4913762017-07-06 00:17:22603void Shell::NotifySplitViewModeStarting() {
604 for (auto& observer : shell_observers_)
605 observer.OnSplitViewModeStarting();
606}
607
Xiaoqian Daibf3771f2018-03-13 18:21:46608void Shell::NotifySplitViewModeStarted() {
609 for (auto& observer : shell_observers_)
610 observer.OnSplitViewModeStarted();
611}
612
xdaid4913762017-07-06 00:17:22613void Shell::NotifySplitViewModeEnded() {
614 for (auto& observer : shell_observers_)
615 observer.OnSplitViewModeEnded();
616}
617
sky00c813f2017-03-08 22:48:55618void Shell::NotifyFullscreenStateChanged(bool is_fullscreen,
varkhac71444e52017-05-25 22:51:34619 aura::Window* root_window) {
sky00c813f2017-03-08 22:48:55620 for (auto& observer : shell_observers_)
621 observer.OnFullscreenStateChanged(is_fullscreen, root_window);
622}
623
varkha19d7e6c52017-05-25 21:15:30624void Shell::NotifyPinnedStateChanged(aura::Window* pinned_window) {
sky00c813f2017-03-08 22:48:55625 for (auto& observer : shell_observers_)
626 observer.OnPinnedStateChanged(pinned_window);
627}
628
varkha6b016b0f2017-05-26 16:14:18629void Shell::NotifyShelfAlignmentChanged(aura::Window* root_window) {
sky00c813f2017-03-08 22:48:55630 for (auto& observer : shell_observers_)
631 observer.OnShelfAlignmentChanged(root_window);
632}
633
varkha6b016b0f2017-05-26 16:14:18634void Shell::NotifyShelfAutoHideBehaviorChanged(aura::Window* root_window) {
sky00c813f2017-03-08 22:48:55635 for (auto& observer : shell_observers_)
636 observer.OnShelfAutoHideBehaviorChanged(root_window);
637}
638
jamescook518dccbd2017-05-18 04:57:07639// static
640void Shell::SetIsBrowserProcessWithMash() {
641 g_is_browser_process_with_mash = true;
642}
643
muyuanlid766f2e2017-06-26 20:17:19644void Shell::NotifyAppListVisibilityChanged(bool visible,
645 aura::Window* root_window) {
newcomer2febb9832017-06-12 17:00:23646 for (auto& observer : shell_observers_)
647 observer.OnAppListVisibilityChanged(visible, root_window);
648}
649
[email protected]b6ba05d902013-10-04 21:38:45650////////////////////////////////////////////////////////////////////////////////
651// Shell, private:
652
skyb073203a2017-03-13 16:59:16653Shell::Shell(std::unique_ptr<ShellDelegate> shell_delegate,
Scott Violete5c79f52018-07-31 00:10:17654 service_manager::Connector* connector)
Scott Violetac410622018-08-11 18:33:22655 : owned_aura_env_(::features::IsSingleProcessMash()
656 ? aura::Env::CreateLocalInstanceForInProcess()
657 : nullptr),
658 aura_env_(owned_aura_env_.get() ? owned_aura_env_.get()
659 : aura::Env::GetInstance()),
660 ash_display_controller_(std::make_unique<AshDisplayController>()),
sky79fa34712017-03-20 23:46:47661 brightness_control_delegate_(
Mitsuru Oshima04b54d02017-10-09 14:22:45662 std::make_unique<system::BrightnessControllerChromeos>()),
663 cast_config_(std::make_unique<CastConfigController>()),
Scott Violete5c79f52018-07-31 00:10:17664 connector_(connector),
James Cookf5398842018-04-16 20:15:24665 first_run_helper_(std::make_unique<FirstRunHelper>()),
Mitsuru Oshima04b54d02017-10-09 14:22:45666 focus_cycler_(std::make_unique<FocusCycler>()),
667 ime_controller_(std::make_unique<ImeController>()),
668 immersive_context_(std::make_unique<ImmersiveContextAsh>()),
sky79fa34712017-03-20 23:46:47669 keyboard_brightness_control_delegate_(
Mitsuru Oshima04b54d02017-10-09 14:22:45670 std::make_unique<KeyboardBrightnessController>()),
sky79fa34712017-03-20 23:46:47671 locale_notification_controller_(
Mitsuru Oshima04b54d02017-10-09 14:22:45672 std::make_unique<LocaleNotificationController>()),
Jacob Dufaultffd9b0d2017-11-15 23:07:16673 login_screen_controller_(std::make_unique<LoginScreenController>()),
Mitsuru Oshima04b54d02017-10-09 14:22:45674 media_controller_(std::make_unique<MediaController>()),
675 new_window_controller_(std::make_unique<NewWindowController>()),
Scott Violete5c79f52018-07-31 00:10:17676 session_controller_(std::make_unique<SessionController>(connector)),
Vladislav Kaznacheev92edf62e2017-10-13 22:08:01677 note_taking_controller_(std::make_unique<NoteTakingController>()),
skyb073203a2017-03-13 16:59:16678 shell_delegate_(std::move(shell_delegate)),
James Cook40f7d752018-05-25 18:21:58679 shell_state_(std::make_unique<ShellState>()),
Mitsuru Oshima04b54d02017-10-09 14:22:45680 shutdown_controller_(std::make_unique<ShutdownController>()),
Mitsuru Oshima04b54d02017-10-09 14:22:45681 system_tray_notifier_(std::make_unique<SystemTrayNotifier>()),
Mitsuru Oshima04b54d02017-10-09 14:22:45682 vpn_list_(std::make_unique<VpnList>()),
683 window_cycle_controller_(std::make_unique<WindowCycleController>()),
684 window_selector_controller_(std::make_unique<WindowSelectorController>()),
Scott Violetbed23cb2018-08-22 19:56:12685 display_configurator_(std::make_unique<display::DisplayConfigurator>()),
686 display_output_protection_(std::make_unique<DisplayOutputProtection>(
687 display_configurator_.get())),
sadrul7a8785e2016-02-12 21:54:35688 native_cursor_manager_(nullptr),
Sam McNallye36abbc2017-07-20 01:04:28689 weak_factory_(this) {
Scott Violet596bb46342017-06-21 14:43:13690 display_manager_.reset(ScreenAsh::CreateDisplayManager());
Mitsuru Oshima04b54d02017-10-09 14:22:45691 window_tree_host_manager_ = std::make_unique<WindowTreeHostManager>();
692 user_metrics_recorder_ = std::make_unique<UserMetricsRecorder>();
Steven Bennettsa0ea30942018-10-11 22:27:51693 ash_keyboard_controller_ =
694 std::make_unique<AshKeyboardController>(session_controller_.get());
[email protected]b6ba05d902013-10-04 21:38:45695
Giovanni Ortuño Urquidi55aa5d8f2018-10-10 05:33:34696 if (base::FeatureList::IsEnabled(features::kUseBluetoothSystemInAsh)) {
697 tray_bluetooth_helper_ =
Giovanni Ortuño Urquidic87b6f342018-10-16 04:44:41698 std::make_unique<TrayBluetoothHelperExperimental>(connector_);
Giovanni Ortuño Urquidi55aa5d8f2018-10-10 05:33:34699 } else {
700 tray_bluetooth_helper_ = std::make_unique<TrayBluetoothHelperLegacy>();
701 }
702
[email protected]093b8d642014-04-03 20:59:28703 PowerStatus::Initialize();
sky5ad143a2017-03-22 04:31:23704
Xiyuan Xia22b1a6c2017-04-18 22:46:01705 session_controller_->AddObserver(this);
[email protected]b6ba05d902013-10-04 21:38:45706}
707
708Shell::~Shell() {
709 TRACE_EVENT0("shutdown", "ash::Shell::Destructor");
710
Scott Violet737fb752018-04-11 15:35:22711 // Wayland depends upon some ash specific objects. Destroy it early on.
712 wayland_server_controller_.reset();
713
Scott Violet41562d1c2017-06-26 15:15:48714 user_metrics_recorder_->OnShellShuttingDown();
bruthigc24d11f2015-06-09 21:30:03715
Steven Bennetts2a9b4382018-04-26 23:41:19716 cros_display_config_.reset();
Steven Bennetts9b21fa32018-04-13 23:45:55717 display_configuration_observer_.reset();
Steven Bennetts3688c6032018-04-13 01:14:23718 display_prefs_.reset();
[email protected]050e77182014-03-25 15:29:16719
[email protected]b6ba05d902013-10-04 21:38:45720 // Remove the focus from any window. This will prevent overhead and side
721 // effects (e.g. crashes) from changing focus during shutdown.
722 // See bug crbug.com/134502.
achuith287b26e2015-09-03 17:49:18723 aura::client::GetFocusClient(GetPrimaryRootWindow())->FocusWindow(nullptr);
[email protected]b6ba05d902013-10-04 21:38:45724
xdaid4913762017-07-06 00:17:22725 // Please keep in reverse order as in Init() because it's easy to miss one.
[email protected]b6ba05d902013-10-04 21:38:45726 if (window_modality_controller_)
727 window_modality_controller_.reset();
jamescook01bf23e72017-01-09 19:58:15728
[email protected]e4ea52362014-02-15 03:21:06729 RemovePreTargetHandler(magnifier_key_scroll_handler_.get());
730 magnifier_key_scroll_handler_.reset();
731
732 RemovePreTargetHandler(speech_feedback_handler_.get());
733 speech_feedback_handler_.reset();
jamescook01bf23e72017-01-09 19:58:15734
[email protected]b6ba05d902013-10-04 21:38:45735 RemovePreTargetHandler(overlay_filter_.get());
Xiyuan Xia22b1a6c2017-04-18 22:46:01736 overlay_filter_.reset();
737
[email protected]3537d472014-01-15 05:45:31738 RemovePreTargetHandler(accelerator_filter_.get());
739 RemovePreTargetHandler(event_transformation_handler_.get());
740 RemovePreTargetHandler(toplevel_window_event_handler_.get());
741 RemovePostTargetHandler(toplevel_window_event_handler_.get());
Scott Violet596bb46342017-06-21 14:43:13742 RemovePreTargetHandler(system_gesture_filter_.get());
743 RemovePreTargetHandler(mouse_cursor_filter_.get());
hariank0dd03dd2016-07-14 23:47:33744 RemovePreTargetHandler(modality_filter_.get());
[email protected]b6ba05d902013-10-04 21:38:45745 RemovePreTargetHandler(tooltip_controller_.get());
746
Mike Wassermanefbf3402018-04-26 00:41:32747 event_rewriter_controller_.reset();
748
jonross0af45212015-01-13 18:55:46749 screen_orientation_controller_.reset();
yiyixa68ade512016-09-01 17:38:13750 screen_layout_observer_.reset();
jonross0af45212015-01-13 18:55:46751
Mitsuru Oshima0e9b7a62017-07-19 18:23:03752 // Destroy the virtual keyboard controller before the tablet mode controller
jamescook01bf23e72017-01-09 19:58:15753 // since the latters destructor triggers events that the former is listening
754 // to but no longer cares about.
rsadambbaf2c82015-01-07 17:54:13755 virtual_keyboard_controller_.reset();
jonross0af45212015-01-13 18:55:46756
James Cookd2495fe2018-03-19 19:53:10757 // Depends on |tablet_mode_controller_|.
758 shelf_controller_->Shutdown();
759
Weidong Guo268c7992018-04-13 21:06:07760 // Destroy |app_list_controller_| early than |tablet_mode_controller_| since
761 // the former may use the latter before destruction.
762 app_list_controller_.reset();
763
David Blackc153e3172018-08-21 18:17:58764 // Destroy |assistant_controller_| earlier than |tablet_mode_controller_| so
765 // that the former will destroy the Assistant view hierarchy which has a
766 // dependency on the latter.
Muyuan Li628f6a62018-08-15 20:39:58767 if (chromeos::switches::IsAssistantEnabled())
David Blackc153e3172018-08-21 18:17:58768 assistant_controller_.reset();
Muyuan Li628f6a62018-08-15 20:39:58769
Mitsuru Oshima0e9b7a62017-07-19 18:23:03770 // Destroy tablet mode controller early on since it has some observers which
[email protected]5ed2b642014-03-04 00:06:57771 // need to be removed.
Mitsuru Oshima0e9b7a62017-07-19 18:23:03772 tablet_mode_controller_.reset();
[email protected]5ed2b642014-03-04 00:06:57773
jdufault551152e2016-01-27 19:48:43774 // Destroy the keyboard before closing the shelf, since it will invoke a shelf
775 // layout.
Darren Shenf62db77a2018-06-07 06:22:44776 DisableKeyboard();
jdufault551152e2016-01-27 19:48:43777
sky07a24d42017-03-09 23:57:30778 toast_manager_.reset();
yoshiki32f51632016-03-24 01:24:43779
jamescookac6724332017-03-21 02:54:43780 tray_bluetooth_helper_.reset();
James Cookb50959e22017-08-10 20:24:38781
782 // Accesses root window containers.
783 logout_confirmation_controller_.reset();
[email protected]b6ba05d902013-10-04 21:38:45784
[email protected]b6ba05d902013-10-04 21:38:45785 // Drag-and-drop must be canceled prior to close all windows.
James Cook1e0f3ff2018-03-06 22:52:45786 for (aura::Window* root : GetAllRootWindows())
787 aura::client::SetDragDropClient(root, nullptr);
[email protected]b6ba05d902013-10-04 21:38:45788 drag_drop_controller_.reset();
789
Xiyuan Xia22b1a6c2017-04-18 22:46:01790 // Controllers who have WindowObserver added must be deleted
791 // before |window_tree_host_manager_| is deleted.
[email protected]8c9d12a2013-12-06 18:39:03792
Qiang Xud77a90c2018-02-20 19:43:29793 persistent_window_controller_.reset();
794
[email protected]8c9d12a2013-12-06 18:39:03795 // VideoActivityNotifier must be deleted before |video_detector_| is
796 // deleted because it's observing video activity through
derat83b761392016-07-11 16:44:44797 // VideoDetector::Observer interface.
[email protected]8c9d12a2013-12-06 18:39:03798 video_activity_notifier_.reset();
[email protected]8c9d12a2013-12-06 18:39:03799 video_detector_.reset();
[email protected]0e3e7cb2014-04-12 05:18:25800 high_contrast_controller_.reset();
[email protected]8c9d12a2013-12-06 18:39:03801
802 shadow_controller_.reset();
803 resize_shadow_controller_.reset();
804
sky37f0dd12016-07-19 18:00:59805 // Has to happen before ~MruWindowTracker.
sky5b45ed82017-03-27 02:54:23806 window_cycle_controller_.reset();
807 window_selector_controller_.reset();
[email protected]8c9d12a2013-12-06 18:39:03808
xdai7a8867cd2017-08-25 23:10:16809 // |split_view_controller_| needs to be deleted after
810 // |window_selector_controller_|.
811 split_view_controller_.reset();
812
James Cook43097132018-08-18 23:31:54813 // Stop dispatching events (e.g. synthesized mouse exits from window close).
814 // https://crbug.com/874156
815 for (RootWindowController* rwc : GetAllRootWindowControllers())
816 rwc->GetHost()->dispatcher()->Shutdown();
817
James Cookee2daef2018-03-10 01:48:10818 // Close all widgets (including the shelf) and destroy all window containers.
skyabcae812017-01-18 17:01:34819 CloseAllRootWindowChildWindows();
820
Tetsui Ohkubo269b5792018-04-26 01:06:32821 system_notification_controller_.reset();
822 // Should be destroyed after Shelf and |system_notification_controller_|.
823 system_tray_model_.reset();
824
afakhry58159392015-05-22 02:45:52825 // MruWindowTracker must be destroyed after all windows have been deleted to
826 // avoid a possible crash when Shell is destroyed from a non-normal shutdown
827 // path. (crbug.com/485438).
sky5ab16472017-03-21 19:35:08828 mru_window_tracker_.reset();
[email protected]b6ba05d902013-10-04 21:38:45829
[email protected]b6ba05d902013-10-04 21:38:45830 // These need a valid Shell instance to clean up properly, so explicitly
831 // delete them before invalidating the instance.
832 // Alphabetical. TODO(oshima): sort.
833 magnification_controller_.reset();
[email protected]b6ba05d902013-10-04 21:38:45834 tooltip_controller_.reset();
835 event_client_.reset();
[email protected]3537d472014-01-15 05:45:31836 toplevel_window_event_handler_.reset();
[email protected]b6ba05d902013-10-04 21:38:45837 visibility_controller_.reset();
Qiang Xu36234e532018-04-11 04:54:02838 power_prefs_.reset();
[email protected]b6ba05d902013-10-04 21:38:45839
Toni Barzic85ae39e2017-12-07 05:50:18840 tray_action_.reset();
841
[email protected]b6ba05d902013-10-04 21:38:45842 power_button_controller_.reset();
843 lock_state_controller_.reset();
Toni Barzic9d0c82f42017-12-06 00:53:52844 backlights_forced_off_setter_.reset();
[email protected]b6ba05d902013-10-04 21:38:45845
hidehiko6821ca42016-06-18 11:12:23846 screen_pinning_controller_.reset();
847
Kyle Horimoto9fc84fc22018-04-27 19:45:15848 multidevice_notification_presenter_.reset();
[email protected]b6ba05d902013-10-04 21:38:45849 resolution_notification_controller_.reset();
oshima5a296e82016-04-29 01:32:27850 screenshot_controller_.reset();
[email protected]8ab613cf2014-05-12 09:39:49851 mouse_cursor_filter_.reset();
hariank0dd03dd2016-07-14 23:47:33852 modality_filter_.reset();
[email protected]b6ba05d902013-10-04 21:38:45853
[email protected]03122891a2014-05-13 23:56:49854 touch_transformer_controller_.reset();
sammiequon203ae022016-09-18 17:23:42855 laser_pointer_controller_.reset();
856 partial_magnification_controller_.reset();
Vladislav Kaznacheev6d6aaff2017-07-22 04:06:32857 highlighter_controller_.reset();
Yue Lia33960a2017-11-01 22:06:07858 voice_interaction_controller_.reset();
David Tseng6792dc82018-05-04 19:18:41859 key_accessibility_enabler_.reset();
warx533c8f62016-04-12 01:19:43860
Tetsui Ohkubo01421b32018-05-30 16:54:59861 display_speaker_controller_.reset();
Tetsui Ohkubo54d50222018-05-10 01:58:11862 screen_switch_check_controller_.reset();
863
rjkroege2c9305402016-09-07 00:21:45864 ScreenAsh::CreateScreenForShutdown();
stevenjb537c5c3f2016-01-20 23:38:12865 display_configuration_controller_.reset();
dtseng4ae0a882016-04-15 21:39:27866
sky07a24d42017-03-09 23:57:30867 // These members access Shell in their destructors.
868 wallpaper_controller_.reset();
James Cookec144952017-09-01 00:05:16869 accessibility_controller_.reset();
sky07a24d42017-03-09 23:57:30870 accessibility_delegate_.reset();
Qiang Xua9591002018-03-15 22:29:31871 accessibility_focus_ring_controller_.reset();
Qiang Xud8e897e2018-05-24 20:07:57872 policy_recommendation_restorer_.reset();
sky07a24d42017-03-09 23:57:30873
874 // Balances the Install() in Initialize().
875 views::FocusManagerFactory::Install(nullptr);
876
sky5ad143a2017-03-22 04:31:23877 // ShelfWindowWatcher has window observers and a pointer to the shelf model.
878 shelf_window_watcher_.reset();
879
tibellb93c729b2017-03-30 00:45:09880 // Removes itself as an observer of |pref_service_|.
sky5ad143a2017-03-22 04:31:23881 shelf_controller_.reset();
882
Ahmed Fakhrye96051f2017-12-12 17:42:17883 // NightLightController depends on the PrefService as well as the window tree
884 // host manager, and must be destructed before them. crbug.com/724231.
885 night_light_controller_ = nullptr;
Ahmed Fakhry4bf3f742018-02-06 17:33:36886 // Similarly for DockedMagnifierController.
887 docked_magnifier_controller_ = nullptr;
Ahmed Fakhrye96051f2017-12-12 17:42:17888
Scott Violetb7f4df22018-05-17 04:43:12889 // May own windows and other objects that have indirect hooks into
890 // WindowTreeHostManager.
891 window_service_owner_.reset();
892
Xiyuan Xia5f1046e2018-06-01 16:04:44893 // Must be released before |focus_controller_|.
894 ime_focus_handler_.reset();
895
James Cook05b3a3f2018-08-07 00:38:55896 // Stop observing window activation changes before closing all windows.
897 focus_controller_->RemoveObserver(this);
898
899 // This also deletes all RootWindows. Note that we invoke Shutdown() on
900 // WindowTreeHostManager before resetting |window_tree_host_manager_|, since
901 // destruction of its owned RootWindowControllers relies on the value.
Scott Violet596bb46342017-06-21 14:43:13902 window_tree_host_manager_->Shutdown();
sky5ad143a2017-03-22 04:31:23903
sky27344382017-03-08 21:30:32904 // Depends on |focus_controller_|, so must be destroyed before.
oshimae2818922015-07-28 01:18:52905 window_tree_host_manager_.reset();
sky27344382017-03-08 21:30:32906 focus_controller_.reset();
[email protected]b6ba05d902013-10-04 21:38:45907 screen_position_controller_.reset();
[email protected]b6ba05d902013-10-04 21:38:45908
robert.bradfordab052492015-05-06 11:09:56909 display_color_manager_.reset();
Steven Bennetts7683e342018-01-02 21:29:52910 projecting_observer_.reset();
911
[email protected]7bc49bd2014-01-22 09:30:34912 if (display_change_observer_)
[email protected]1e31cbd2014-04-07 20:06:11913 display_configurator_->RemoveObserver(display_change_observer_.get());
[email protected]b6ba05d902013-10-04 21:38:45914 if (display_error_observer_)
[email protected]1e31cbd2014-04-07 20:06:11915 display_configurator_->RemoveObserver(display_error_observer_.get());
[email protected]b6ba05d902013-10-04 21:38:45916 display_change_observer_.reset();
Steven Bennetts7683e342018-01-02 21:29:52917 display_shutdown_observer_.reset();
[email protected]b6ba05d902013-10-04 21:38:45918
Steven Bennettsa0ea30942018-10-11 22:27:51919 ash_keyboard_controller_.reset();
920
[email protected]093b8d642014-04-03 20:59:28921 PowerStatus::Shutdown();
James Cook934ba812018-04-20 14:17:35922 // Depends on SessionController.
923 power_event_observer_.reset();
pneubeck8be1f5422014-10-09 16:46:18924
Xiyuan Xia22b1a6c2017-04-18 22:46:01925 session_controller_->RemoveObserver(this);
Sonny Sasaka55f69fc2017-08-28 21:29:37926 // BluetoothPowerController depends on the PrefService and must be destructed
927 // before it.
928 bluetooth_power_controller_ = nullptr;
Qiang Xuf1400a362017-09-14 02:28:30929 // TouchDevicesController depends on the PrefService and must be destructed
930 // before it.
931 touch_devices_controller_ = nullptr;
Toni Barzic550419f2018-03-08 03:56:21932 // DetachableBaseNotificationController depends on DetachableBaseHandler, and
933 // has to be destructed before it.
934 detachable_base_notification_controller_.reset();
Toni Barzicd6238312018-03-02 18:26:13935 // DetachableBaseHandler depends on the PrefService and must be destructed
936 // before it.
937 detachable_base_handler_.reset();
Ahmed Fakhrye96051f2017-12-12 17:42:17938
Evan Stade196ec042018-03-13 19:44:36939 // Destroys the MessageCenter singleton, so must happen late.
940 message_center_controller_.reset();
941
Sam McNallya853cd82017-08-30 01:55:10942 local_state_.reset();
skyb073203a2017-03-13 16:59:16943 shell_delegate_.reset();
sky88bd4be62016-06-09 17:34:41944
Scott Violet17a61722017-06-19 17:54:31945 for (auto& observer : shell_observers_)
946 observer.OnShellDestroyed();
947
[email protected]b6ba05d902013-10-04 21:38:45948 DCHECK(instance_ == this);
achuith287b26e2015-09-03 17:49:18949 instance_ = nullptr;
[email protected]b6ba05d902013-10-04 21:38:45950}
951
Scott Violetae4c25d2018-06-19 15:50:15952void Shell::Init(
953 ui::ContextFactory* context_factory,
954 ui::ContextFactoryPrivate* context_factory_private,
955 std::unique_ptr<base::Value> initial_display_prefs,
Scott Violet7e33efc2018-08-29 22:30:15956 std::unique_ptr<ws::GpuInterfaceProvider> gpu_interface_provider) {
Scott Violetac410622018-08-11 18:33:22957 if (::features::IsSingleProcessMash()) {
958 // In SingleProcessMash mode ScreenMus is not created, which means Ash needs
959 // to set the WindowManagerFrameValues.
960 views::WindowManagerFrameValues frame_values;
961 frame_values.normal_insets = frame_values.maximized_insets =
962 NonClientFrameController::GetPreferredClientAreaInsets();
963 frame_values.max_title_bar_button_width =
964 NonClientFrameController::GetMaxTitleBarButtonWidth();
965 views::WindowManagerFrameValues::SetInstance(frame_values);
966 }
967
Evan Stade196ec042018-03-13 19:44:36968 // This creates the MessageCenter object which is used by some other objects
969 // initialized here, so it needs to come early.
970 message_center_controller_ = std::make_unique<MessageCenterController>();
971
James Cookbd0b7792017-11-17 03:24:26972 // These controllers call Shell::Get() in their constructors, so they cannot
973 // be in the member initialization list.
Qiang Xuf1400a362017-09-14 02:28:30974 touch_devices_controller_ = std::make_unique<TouchDevicesController>();
Mitsuru Oshima04b54d02017-10-09 14:22:45975 bluetooth_power_controller_ = std::make_unique<BluetoothPowerController>();
Toni Barzicd6238312018-03-02 18:26:13976 detachable_base_handler_ = std::make_unique<DetachableBaseHandler>(this);
Toni Barzic550419f2018-03-08 03:56:21977 detachable_base_notification_controller_ =
978 std::make_unique<DetachableBaseNotificationController>(
979 detachable_base_handler_.get());
Tetsui Ohkubo01421b32018-05-30 16:54:59980 display_speaker_controller_ = std::make_unique<DisplaySpeakerController>();
Qiang Xud8e897e2018-05-24 20:07:57981 policy_recommendation_restorer_ =
982 std::make_unique<PolicyRecommendationRestorer>();
Tetsui Ohkubo54d50222018-05-10 01:58:11983 screen_switch_check_controller_ =
984 std::make_unique<ScreenSwitchCheckController>();
Kyle Horimoto9fc84fc22018-04-27 19:45:15985 // Connector can be null in tests.
Scott Violete5c79f52018-07-31 00:10:17986 if (connector_ && base::FeatureList::IsEnabled(
987 chromeos::features::kEnableUnifiedMultiDeviceSetup)) {
Kyle Horimoto9fc84fc22018-04-27 19:45:15988 multidevice_notification_presenter_ =
989 std::make_unique<MultiDeviceNotificationPresenter>(
Scott Violete5c79f52018-07-31 00:10:17990 message_center::MessageCenter::Get(), connector_);
Kyle Horimoto9fc84fc22018-04-27 19:45:15991 }
Sonny Sasaka55f69fc2017-08-28 21:29:37992
James Cook8532dbc2017-07-31 21:54:51993 // Connector can be null in tests.
Scott Violete5c79f52018-07-31 00:10:17994 if (connector_) {
James Cook8532dbc2017-07-31 21:54:51995 // Connect to local state prefs now, but wait for an active user before
996 // connecting to the profile pref service. The login screen has a temporary
997 // user profile that is not associated with a real user.
Taiju Tsuiki36c517d2017-05-18 06:45:43998 auto pref_registry = base::MakeRefCounted<PrefRegistrySimple>();
Steven Bennettsca108512018-05-02 11:05:03999 RegisterLocalStatePrefs(pref_registry.get(), false);
tibellb93c729b2017-03-30 00:45:091000 prefs::ConnectToPrefService(
Scott Violete5c79f52018-07-31 00:10:171001 connector_, std::move(pref_registry),
Sam McNallye36abbc2017-07-20 01:04:281002 base::Bind(&Shell::OnLocalStatePrefServiceInitialized,
1003 weak_factory_.GetWeakPtr()),
1004 prefs::mojom::kLocalStateServiceName);
jonrossc4ba10602017-04-07 20:51:051005 }
skyb073203a2017-03-13 16:59:161006
David Tseng562a9c12018-07-18 03:35:051007 tablet_mode_controller_ = std::make_unique<TabletModeController>();
1008
Qiang Xua9591002018-03-15 22:29:311009 accessibility_focus_ring_controller_ =
1010 std::make_unique<AccessibilityFocusRingController>();
skyb073203a2017-03-13 16:59:161011 accessibility_delegate_.reset(shell_delegate_->CreateAccessibilityDelegate());
James Cookaa6aaad2018-08-24 01:00:061012 accessibility_controller_ = std::make_unique<AccessibilityController>();
Mitsuru Oshima04b54d02017-10-09 14:22:451013 toast_manager_ = std::make_unique<ToastManager>();
sky07a24d42017-03-09 23:57:301014
sky07a24d42017-03-09 23:57:301015 // Install the custom factory early on so that views::FocusManagers for Tray,
1016 // Shelf, and WallPaper could be created by the factory.
1017 views::FocusManagerFactory::Install(new AshFocusManagerFactory);
1018
Mitsuru Oshima04b54d02017-10-09 14:22:451019 wallpaper_controller_ = std::make_unique<WallpaperController>();
sky07a24d42017-03-09 23:57:301020
Scott Violet97a7b9d2018-08-06 22:31:131021 immersive_handler_factory_ = std::make_unique<ImmersiveHandlerFactoryAsh>();
skyb7b54092016-08-19 16:00:091022
Mitsuru Oshima04b54d02017-10-09 14:22:451023 window_positioner_ = std::make_unique<WindowPositioner>();
sky984c1892016-04-20 00:00:341024
James Cook79e1ed62018-09-07 15:40:421025 native_cursor_manager_ = new NativeCursorManagerAsh;
James Cook698fc3662018-07-27 16:05:011026 cursor_manager_ =
1027 std::make_unique<CursorManager>(base::WrapUnique(native_cursor_manager_));
skyfee520c2016-02-11 19:57:461028
Steven Bennettsca108512018-05-02 11:05:031029 // In CLASSIC mode, |initial_display_prefs| contains the synchronously
1030 // loaded display pref values. Otherwise |initial_display_prefs| is null and
1031 // the pref values will be loaded once |local_state_| is available. (Any store
1032 // requests in the meanwhile will be queued).
1033 display_prefs_ =
1034 std::make_unique<DisplayPrefs>(std::move(initial_display_prefs));
1035
Steven Bennetts7683e342018-01-02 21:29:521036 InitializeDisplayManager();
[email protected]b6ba05d902013-10-04 21:38:451037
James Cook602164e2018-08-07 20:39:421038 // This will initialize aura::Env which requires |display_manager_| to
1039 // be initialized first.
1040 if (context_factory)
Scott Violetac410622018-08-11 18:33:221041 aura_env_->set_context_factory(context_factory);
1042 if (context_factory_private)
1043 aura_env_->set_context_factory_private(context_factory_private);
[email protected]ecca62b2013-10-09 16:18:531044
Ahmed Fakhry46357342018-04-27 00:46:111045 // Night Light depends on the display manager, the display color manager, and
1046 // aura::Env, so initialize it after all have been initialized.
Ahmed Fakhryb9ace242018-06-06 18:49:311047 if (features::IsNightLightEnabled())
Ahmed Fakhry46357342018-04-27 00:46:111048 night_light_controller_ = std::make_unique<NightLightController>();
1049
[email protected]b6ba05d902013-10-04 21:38:451050 // The WindowModalityController needs to be at the front of the input event
1051 // pretarget handler list to ensure that it processes input events when modal
1052 // windows are active.
Scott Violetac410622018-08-11 18:33:221053 window_modality_controller_ =
1054 std::make_unique<::wm::WindowModalityController>(this, aura_env_);
[email protected]b6ba05d902013-10-04 21:38:451055
Mike Wassermanefbf3402018-04-26 00:41:321056 event_rewriter_controller_ = std::make_unique<EventRewriterController>();
1057
Scott Violetac410622018-08-11 18:33:221058 env_filter_ = std::make_unique<::wm::CompoundEventFilter>();
[email protected]b6ba05d902013-10-04 21:38:451059 AddPreTargetHandler(env_filter_.get());
1060
sky27344382017-03-08 21:30:321061 // FocusController takes ownership of AshFocusRules.
1062 focus_controller_ =
Mitsuru Oshima04b54d02017-10-09 14:22:451063 std::make_unique<::wm::FocusController>(new wm::AshFocusRules());
sky27344382017-03-08 21:30:321064 focus_controller_->AddObserver(this);
[email protected]b6ba05d902013-10-04 21:38:451065
[email protected]093b8d642014-04-03 20:59:281066 screen_position_controller_.reset(new ScreenPositionController);
[email protected]b6ba05d902013-10-04 21:38:451067
Scott Violet596bb46342017-06-21 14:43:131068 window_tree_host_manager_->Start();
1069 AshWindowTreeHostInitParams ash_init_params;
1070 window_tree_host_manager_->CreatePrimaryHost(ash_init_params);
1071
Scott Violet3c554ae2017-12-13 02:25:411072 time_to_first_present_recorder_ =
1073 std::make_unique<TimeToFirstPresentRecorder>(GetPrimaryRootWindow());
1074
James Cook40f7d752018-05-25 18:21:581075 shell_state_->SetRootWindowForNewWindows(GetPrimaryRootWindow());
[email protected]b6ba05d902013-10-04 21:38:451076
Scott Violet596bb46342017-06-21 14:43:131077 resolution_notification_controller_ =
Mitsuru Oshima04b54d02017-10-09 14:22:451078 std::make_unique<ResolutionNotificationController>();
[email protected]b6ba05d902013-10-04 21:38:451079
James Cook698fc3662018-07-27 16:05:011080 cursor_manager_->SetDisplay(
1081 display::Screen::GetScreen()->GetPrimaryDisplay());
[email protected]b6ba05d902013-10-04 21:38:451082
James Cookdafb54f2018-09-14 16:36:151083 accelerator_controller_ = std::make_unique<AcceleratorController>();
Xiaohui Chend68ffc12018-08-16 01:56:411084 voice_interaction_controller_ =
1085 std::make_unique<VoiceInteractionController>();
Weidong Guo268c7992018-04-13 21:06:071086
Scott Violete5c3f5b2018-08-22 21:56:451087 window_service_owner_ =
1088 std::make_unique<WindowServiceOwner>(std::move(gpu_interface_provider));
1089
Weidong Guo268c7992018-04-13 21:06:071090 // |app_list_controller_| is put after |tablet_mode_controller_| as the former
1091 // uses the latter in constructor.
Scott Violete5c3f5b2018-08-22 21:56:451092 app_list_controller_ = std::make_unique<AppListControllerImpl>(
1093 window_service_owner_->window_service());
Mitsuru Oshima04b54d02017-10-09 14:22:451094 shelf_controller_ = std::make_unique<ShelfController>();
[email protected]b6ba05d902013-10-04 21:38:451095
spange9b51272014-12-11 01:20:101096 magnifier_key_scroll_handler_ = MagnifierKeyScroller::CreateHandler();
[email protected]e4ea52362014-02-15 03:21:061097 AddPreTargetHandler(magnifier_key_scroll_handler_.get());
spange9b51272014-12-11 01:20:101098 speech_feedback_handler_ = SpokenFeedbackToggler::CreateHandler();
[email protected]e4ea52362014-02-15 03:21:061099 AddPreTargetHandler(speech_feedback_handler_.get());
[email protected]3dff2ef2014-02-09 22:50:391100
[email protected]b6ba05d902013-10-04 21:38:451101 // The order in which event filters are added is significant.
[email protected]b6ba05d902013-10-04 21:38:451102
derat2d4e62d2015-01-09 16:09:171103 // ui::UserActivityDetector passes events to observers, so let them get
Michael Wasserman07466432018-04-11 03:56:481104 // rewritten first.
1105 user_activity_detector_.reset(new ui::UserActivityDetector);
[email protected]b6ba05d902013-10-04 21:38:451106
[email protected]093b8d642014-04-03 20:59:281107 overlay_filter_.reset(new OverlayEventFilter);
[email protected]b6ba05d902013-10-04 21:38:451108 AddPreTargetHandler(overlay_filter_.get());
[email protected]b6ba05d902013-10-04 21:38:451109
[email protected]60d677d2014-05-30 13:07:021110 accelerator_filter_.reset(new ::wm::AcceleratorFilter(
Scott Violetf5db2502018-10-05 15:19:391111 std::make_unique<PreTargetAcceleratorHandler>(),
sky81a2d792017-03-17 19:14:391112 accelerator_controller_->accelerator_history()));
[email protected]b6ba05d902013-10-04 21:38:451113 AddPreTargetHandler(accelerator_filter_.get());
1114
[email protected]093b8d642014-04-03 20:59:281115 event_transformation_handler_.reset(new EventTransformationHandler);
[email protected]b6ba05d902013-10-04 21:38:451116 AddPreTargetHandler(event_transformation_handler_.get());
1117
sky11cf8db92017-04-10 23:38:081118 toplevel_window_event_handler_ =
Mitsuru Oshima04b54d02017-10-09 14:22:451119 std::make_unique<ToplevelWindowEventHandler>();
[email protected]3537d472014-01-15 05:45:311120
Ryan Cuieb5b84e32018-07-19 01:36:021121 system_gesture_filter_ = std::make_unique<SystemGestureEventFilter>();
1122 AddPreTargetHandler(system_gesture_filter_.get());
[email protected]b6ba05d902013-10-04 21:38:451123
[email protected]354520b2014-06-21 04:31:011124 sticky_keys_controller_.reset(new StickyKeysController);
Mitsuru Oshima04b54d02017-10-09 14:22:451125 screen_pinning_controller_ = std::make_unique<ScreenPinningController>();
[email protected]354520b2014-06-21 04:31:011126
Qiang Xu36234e532018-04-11 04:54:021127 power_prefs_ = std::make_unique<PowerPrefs>(
1128 chromeos::PowerPolicyController::Get(),
1129 chromeos::DBusThreadManager::Get()->GetPowerManagerClient());
1130
Toni Barzic9d0c82f42017-12-06 00:53:521131 backlights_forced_off_setter_ = std::make_unique<BacklightsForcedOffSetter>();
1132
Toni Barzic85ae39e2017-12-07 05:50:181133 tray_action_ =
1134 std::make_unique<TrayAction>(backlights_forced_off_setter_.get());
1135
jamescookd9f152f2016-11-15 00:53:081136 lock_state_controller_ =
Mitsuru Oshima04b54d02017-10-09 14:22:451137 std::make_unique<LockStateController>(shutdown_controller_.get());
Toni Barzic9d0c82f42017-12-06 00:53:521138 power_button_controller_ = std::make_unique<PowerButtonController>(
1139 backlights_forced_off_setter_.get());
[email protected]685442f32014-02-28 10:40:061140 // Pass the initial display state to PowerButtonController.
1141 power_button_controller_->OnDisplayModeChanged(
[email protected]bcec7fb62014-04-08 20:59:091142 display_configurator_->cached_displays());
jamescook01bf23e72017-01-09 19:58:151143
James Cook93614f02018-07-11 21:37:351144 drag_drop_controller_ = std::make_unique<DragDropController>();
Scott Violet361833fb2017-06-21 22:25:201145
oshima5a296e82016-04-29 01:32:271146 // |screenshot_controller_| needs to be created (and prepended as a
mukai19274bdd2015-02-24 22:37:481147 // pre-target handler) at this point, because |mouse_cursor_filter_| needs to
oshima5a296e82016-04-29 01:32:271148 // process mouse events prior to screenshot session.
mukai19274bdd2015-02-24 22:37:481149 // See http://crbug.com/459214
James Cook5e9d3402017-11-01 00:20:121150 screenshot_controller_ = std::make_unique<ScreenshotController>(
1151 shell_delegate_->CreateScreenshotDelegate());
Mitsuru Oshima04b54d02017-10-09 14:22:451152 mouse_cursor_filter_ = std::make_unique<MouseCursorEventFilter>();
Katie Db68a5522018-03-30 18:47:361153 AddPreTargetHandler(mouse_cursor_filter_.get(),
1154 ui::EventTarget::Priority::kAccessibility);
[email protected]b6ba05d902013-10-04 21:38:451155
1156 // Create Controllers that may need root window.
1157 // TODO(oshima): Move as many controllers before creating
1158 // RootWindowController as possible.
1159 visibility_controller_.reset(new AshVisibilityController);
[email protected]b6ba05d902013-10-04 21:38:451160
sammiequon203ae022016-09-18 17:23:421161 laser_pointer_controller_.reset(new LaserPointerController());
1162 partial_magnification_controller_.reset(new PartialMagnificationController());
Vladislav Kaznacheev6d6aaff2017-07-22 04:06:321163 highlighter_controller_.reset(new HighlighterController());
sammiequon203ae022016-09-18 17:23:421164
Qiang Xu2657abf2018-03-21 18:01:451165 magnification_controller_ = std::make_unique<MagnificationController>();
Mitsuru Oshima04b54d02017-10-09 14:22:451166 mru_window_tracker_ = std::make_unique<MruWindowTracker>();
[email protected]b6ba05d902013-10-04 21:38:451167
Katie Dab4edf572018-10-12 16:53:551168 autoclick_controller_ = std::make_unique<AutoclickController>();
[email protected]55398d22013-10-10 19:49:201169
[email protected]b6ba05d902013-10-04 21:38:451170 high_contrast_controller_.reset(new HighContrastController);
Saman Sami3fb310d2017-11-09 16:51:541171
Ahmed Fakhry4af48e42018-02-28 17:45:381172 if (features::IsDockedMagnifierEnabled()) {
Ahmed Fakhry4bf3f742018-02-06 17:33:361173 docked_magnifier_controller_ =
1174 std::make_unique<DockedMagnifierController>();
1175 }
1176
Saman Sami3fb310d2017-11-09 16:51:541177 viz::mojom::VideoDetectorObserverPtr observer;
1178 video_detector_ =
1179 std::make_unique<VideoDetector>(mojo::MakeRequest(&observer));
Scott Violetac410622018-08-11 18:33:221180 aura_env_->context_factory_private()
James Cook602164e2018-08-07 20:39:421181 ->GetHostFrameSinkManager()
1182 ->AddVideoDetectorObserver(std::move(observer));
[email protected]b6ba05d902013-10-04 21:38:451183
oshimaebbe63772015-02-19 18:41:321184 tooltip_controller_.reset(new views::corewm::TooltipController(
dchenga94547472016-04-08 08:41:111185 std::unique_ptr<views::corewm::Tooltip>(new views::corewm::TooltipAura)));
[email protected]b6ba05d902013-10-04 21:38:451186 AddPreTargetHandler(tooltip_controller_.get());
1187
hariank0dd03dd2016-07-14 23:47:331188 modality_filter_.reset(new SystemModalContainerEventFilter(this));
1189 AddPreTargetHandler(modality_filter_.get());
1190
[email protected]093b8d642014-04-03 20:59:281191 event_client_.reset(new EventClientImpl);
[email protected]b6ba05d902013-10-04 21:38:451192
[email protected]093b8d642014-04-03 20:59:281193 resize_shadow_controller_.reset(new ResizeShadowController());
Scott Violetac410622018-08-11 18:33:221194 shadow_controller_ = std::make_unique<::wm::ShadowController>(
1195 focus_controller_.get(), std::make_unique<WmShadowControllerDelegate>(),
1196 aura_env_);
[email protected]b6ba05d902013-10-04 21:38:451197
James Cookb50959e22017-08-10 20:24:381198 logout_confirmation_controller_ =
Mitsuru Oshima04b54d02017-10-09 14:22:451199 std::make_unique<LogoutConfirmationController>();
[email protected]b6ba05d902013-10-04 21:38:451200
jamescookac6724332017-03-21 02:54:431201 // May trigger initialization of the Bluetooth adapter.
1202 tray_bluetooth_helper_->Initialize();
1203
kylechar55f0eaf22017-01-11 22:57:371204 // Create AshTouchTransformController before
oshimae2818922015-07-28 01:18:521205 // WindowTreeHostManager::InitDisplays()
kylechar55f0eaf22017-01-11 22:57:371206 // since AshTouchTransformController listens on
oshimae2818922015-07-28 01:18:521207 // WindowTreeHostManager::Observer::OnDisplaysInitialized().
Mitsuru Oshima04b54d02017-10-09 14:22:451208 touch_transformer_controller_ = std::make_unique<AshTouchTransformController>(
Scott Violet596bb46342017-06-21 14:43:131209 display_configurator_.get(), display_manager_.get(),
James Cook9db56d72018-08-01 03:21:311210 std::make_unique<display::DefaultTouchTransformSetter>());
[email protected]03122891a2014-05-13 23:56:491211
Tetsui Ohkubo269b5792018-04-26 01:06:321212 // |system_tray_model_| should be available before
1213 // |system_notification_controller_| is initialized and Shelf is created by
1214 // WindowTreeHostManager::InitHosts.
1215 system_tray_model_ = std::make_unique<SystemTrayModel>();
1216 system_notification_controller_ =
1217 std::make_unique<SystemNotificationController>();
1218
Scott Violet596bb46342017-06-21 14:43:131219 window_tree_host_manager_->InitHosts();
[email protected]b6ba05d902013-10-04 21:38:451220
Meilin Wang3a4ac8e2018-09-27 19:03:431221 // |assistant_controller_| needs to be created after InitHosts() since its
1222 // keyboard observer function result has dependency on workspace change.
1223 assistant_controller_ = chromeos::switches::IsAssistantEnabled()
1224 ? std::make_unique<AssistantController>()
1225 : nullptr;
1226
rsadam9172bc8a2014-10-29 23:37:381227 // Needs to be created after InitDisplays() since it may cause the virtual
1228 // keyboard to be deployed.
James Cook602164e2018-08-07 20:39:421229 virtual_keyboard_controller_ = std::make_unique<VirtualKeyboardController>();
rsadam9172bc8a2014-10-29 23:37:381230
James Cook698fc3662018-07-27 16:05:011231 cursor_manager_->HideCursor(); // Hide the mouse cursor on startup.
1232 cursor_manager_->SetCursor(ui::CursorType::kPointer);
[email protected]b6ba05d902013-10-04 21:38:451233
Mitsuru Oshima04b54d02017-10-09 14:22:451234 peripheral_battery_notifier_ = std::make_unique<PeripheralBatteryNotifier>();
[email protected]093b8d642014-04-03 20:59:281235 power_event_observer_.reset(new PowerEventObserver());
Sarah Hu8ce89c332018-09-24 18:23:141236 user_activity_notifier_ =
1237 std::make_unique<ui::UserActivityPowerManagerNotifier>(
1238 user_activity_detector_.get(), connector_);
[email protected]ded58fd2013-10-09 07:56:551239 video_activity_notifier_.reset(
[email protected]093b8d642014-04-03 20:59:281240 new VideoActivityNotifier(video_detector_.get()));
1241 bluetooth_notification_controller_.reset(new BluetoothNotificationController);
Scott Violet596bb46342017-06-21 14:43:131242 screen_orientation_controller_ =
Mitsuru Oshima04b54d02017-10-09 14:22:451243 std::make_unique<ScreenOrientationController>();
Scott Violet596bb46342017-06-21 14:43:131244 screen_layout_observer_.reset(new ScreenLayoutObserver());
yiyix90cfee22017-02-16 05:38:181245 sms_observer_.reset(new SmsObserver());
jamescook01bf23e72017-01-09 19:58:151246
xdaid4913762017-07-06 00:17:221247 split_view_controller_.reset(new SplitViewController());
1248
David Tseng6792dc82018-05-04 19:18:411249 key_accessibility_enabler_ = std::make_unique<KeyAccessibilityEnabler>();
1250
[email protected]b6ba05d902013-10-04 21:38:451251 // The compositor thread and main message loop have to be running in
1252 // order to create mirror window. Run it after the main message loop
1253 // is started.
Scott Violet596bb46342017-06-21 14:43:131254 display_manager_->CreateMirrorWindowAsyncIfAny();
bruthigc24d11f2015-06-09 21:30:031255
Scott Violete5c79f52018-07-31 00:10:171256 // |connector_| is null in unit tests.
Scott Violete5c79f52018-07-31 00:10:171257 if (connector_ &&
James Cook08ebee42018-08-07 04:06:421258 base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kShowTaps)) {
1259 // The show taps feature is a separate mojo app.
1260 // TODO(jamescook): Make this work in ash_shell_with_content.
Scott Violete5c79f52018-07-31 00:10:171261 connector_->StartService(tap_visualizer::mojom::kServiceName);
James Cook0ba192bf2017-12-01 20:53:111262 }
1263
James Cook7e6a7ae2018-08-24 23:00:471264 if (!::features::IsMultiProcessMash()) {
James Cookc9d6a542018-07-27 21:00:561265 ime_focus_handler_ = std::make_unique<ImeFocusHandler>(
1266 focus_controller(), window_tree_host_manager_->input_method());
Scott Violetb7f4df22018-05-17 04:43:121267 }
1268
sky00c813f2017-03-08 22:48:551269 for (auto& observer : shell_observers_)
ericwilligers5eff47d2016-10-17 19:19:181270 observer.OnShellInitialized();
phweiss0bf64c52015-11-17 12:56:181271
Scott Violet41562d1c2017-06-26 15:15:481272 user_metrics_recorder_->OnShellInitialized();
Toni Barzic85c9e0802018-03-30 02:46:011273
Jeffrey Kardatzkef108f022018-04-17 17:52:351274 // Initialize the D-Bus thread and services for ash.
1275 ash_dbus_services_ = std::make_unique<AshDBusServices>();
Toni Barzic85c9e0802018-03-30 02:46:011276 // By this point ash shell should have initialized its D-Bus signal
1277 // listeners, so emit ash-initialized upstart signal to start Chrome OS tasks
1278 // that expect that ash is listening to D-Bus signals they emit. For example,
1279 // hammerd, which handles detachable base state, communicates the base state
1280 // purely by emitting D-Bus signals, and thus has to be run whenever ash is
1281 // started so ash (DetachableBaseHandler in particular) gets the proper view
1282 // of the current detachable base state.
Jeffrey Kardatzkef108f022018-04-17 17:52:351283 // TODO(stevenjb): Move this and other D-Bus dependencies to AshDBusServices.
1284 ash_dbus_services_->EmitAshInitialized();
[email protected]b6ba05d902013-10-04 21:38:451285}
1286
Steven Bennetts7683e342018-01-02 21:29:521287void Shell::InitializeDisplayManager() {
Steven Bennetts7683e342018-01-02 21:29:521288 bool display_initialized = display_manager_->InitFromCommandLine();
1289
Steven Bennetts7683e342018-01-02 21:29:521290 display_configuration_controller_ =
1291 std::make_unique<DisplayConfigurationController>(
1292 display_manager_.get(), window_tree_host_manager_.get());
James Cook9db56d72018-08-01 03:21:311293 display_configurator_->Init(
1294 ui::OzonePlatform::GetInstance()->CreateNativeDisplayDelegate(), false);
Steven Bennetts9b21fa32018-04-13 23:45:551295 display_configuration_observer_ =
1296 std::make_unique<DisplayConfigurationObserver>();
1297
Steven Bennetts2a9b4382018-04-26 23:41:191298 cros_display_config_ = std::make_unique<CrosDisplayConfig>();
1299
Qiang Xud77a90c2018-02-20 19:43:291300 persistent_window_controller_ =
1301 std::make_unique<PersistentWindowController>();
Steven Bennetts7683e342018-01-02 21:29:521302
1303 projecting_observer_ =
1304 std::make_unique<ProjectingObserver>(display_configurator_.get());
1305
1306 if (!display_initialized) {
Scott Violet97a7b9d2018-08-06 22:31:131307 if (chromeos::IsRunningAsSystemCompositor()) {
Steven Bennetts7683e342018-01-02 21:29:521308 display_change_observer_ =
1309 std::make_unique<display::DisplayChangeObserver>(
1310 display_configurator_.get(), display_manager_.get());
1311
1312 display_shutdown_observer_ = std::make_unique<DisplayShutdownObserver>(
1313 display_configurator_.get());
1314
1315 // Register |display_change_observer_| first so that the rest of
1316 // observer gets invoked after the root windows are configured.
1317 display_configurator_->AddObserver(display_change_observer_.get());
1318 display_error_observer_.reset(new DisplayErrorObserver());
1319 display_configurator_->AddObserver(display_error_observer_.get());
1320 display_configurator_->set_state_controller(
1321 display_change_observer_.get());
1322 display_configurator_->set_mirroring_controller(display_manager_.get());
1323 display_configurator_->ForceInitialConfigure();
1324 display_initialized = true;
1325 }
1326 }
1327
Ahmed Fakhry1ad4bd42018-04-18 19:31:371328 display_color_manager_ = std::make_unique<DisplayColorManager>(
1329 display_configurator_.get(), display::Screen::GetScreen());
Steven Bennetts7683e342018-01-02 21:29:521330
1331 if (!display_initialized)
1332 display_manager_->InitDefaultDisplay();
1333
Scott Violet97a7b9d2018-08-06 22:31:131334 display_manager_->RefreshFontParams();
Steven Bennetts7683e342018-01-02 21:29:521335}
1336
[email protected]41baaed2013-11-09 04:18:261337void Shell::InitRootWindow(aura::Window* root_window) {
sky27344382017-03-08 21:30:321338 DCHECK(focus_controller_);
[email protected]d90b8392012-06-13 09:34:561339 DCHECK(visibility_controller_.get());
[email protected]d90b8392012-06-13 09:34:561340
sky27344382017-03-08 21:30:321341 aura::client::SetFocusClient(root_window, focus_controller_.get());
Thiago Farina3b086a02017-05-30 22:32:501342 ::wm::SetActivationClient(root_window, focus_controller_.get());
sky27344382017-03-08 21:30:321343 root_window->AddPreTargetHandler(focus_controller_.get());
[email protected]d90b8392012-06-13 09:34:561344 aura::client::SetVisibilityClient(root_window, visibility_controller_.get());
James Cook93614f02018-07-11 21:37:351345 aura::client::SetDragDropClient(root_window, drag_drop_controller_.get());
[email protected]8d625fb2012-07-18 16:40:061346 aura::client::SetScreenPositionClient(root_window,
1347 screen_position_controller_.get());
sadrul7a8785e2016-02-12 21:54:351348 aura::client::SetCursorClient(root_window, cursor_manager_.get());
Thiago Farina3b086a02017-05-30 22:32:501349 ::wm::SetTooltipClient(root_window, tooltip_controller_.get());
[email protected]e67291f12012-10-10 05:52:381350 aura::client::SetEventClient(root_window, event_client_.get());
[email protected]d90b8392012-06-13 09:34:561351
Thiago Farina3b086a02017-05-30 22:32:501352 ::wm::SetWindowMoveClient(root_window, toplevel_window_event_handler_.get());
[email protected]3537d472014-01-15 05:45:311353 root_window->AddPreTargetHandler(toplevel_window_event_handler_.get());
1354 root_window->AddPostTargetHandler(toplevel_window_event_handler_.get());
[email protected]d90b8392012-06-13 09:34:561355}
1356
skyabcae812017-01-18 17:01:341357void Shell::CloseAllRootWindowChildWindows() {
msw257a6a232017-06-01 01:46:301358 for (aura::Window* root : GetAllRootWindows()) {
1359 RootWindowController* controller = RootWindowController::ForWindow(root);
skyabcae812017-01-18 17:01:341360 if (controller) {
1361 controller->CloseChildWindows();
1362 } else {
msw257a6a232017-06-01 01:46:301363 while (!root->children().empty()) {
1364 aura::Window* child = root->children()[0];
skyabcae812017-01-18 17:01:341365 delete child;
1366 }
1367 }
1368 }
1369}
1370
[email protected]c0ce80e2012-10-05 23:28:271371bool Shell::CanWindowReceiveEvents(aura::Window* window) {
1372 RootWindowControllerList controllers = GetAllRootWindowControllers();
oshima9a61ecf2016-06-18 10:43:051373 for (RootWindowController* controller : controllers) {
1374 if (controller->CanWindowReceiveEvents(window))
[email protected]602022b2014-03-31 17:07:311375 return true;
[email protected]c0ce80e2012-10-05 23:28:271376 }
1377 return false;
1378}
1379
[email protected]049cf34b2012-12-07 17:15:481380////////////////////////////////////////////////////////////////////////////////
1381// Shell, ui::EventTarget overrides:
1382
[email protected]869f6352012-12-06 20:47:171383bool Shell::CanAcceptEvent(const ui::Event& event) {
[email protected]5097e692012-10-30 22:08:411384 return true;
1385}
1386
1387ui::EventTarget* Shell::GetParentTarget() {
Scott Violetac410622018-08-11 18:33:221388 return aura_env_;
[email protected]5097e692012-10-30 22:08:411389}
1390
dchenga94547472016-04-08 08:41:111391std::unique_ptr<ui::EventTargetIterator> Shell::GetChildIterator() const {
1392 return std::unique_ptr<ui::EventTargetIterator>();
[email protected]3e670aa2013-12-02 19:04:321393}
1394
1395ui::EventTargeter* Shell::GetEventTargeter() {
1396 NOTREACHED();
achuith287b26e2015-09-03 17:49:181397 return nullptr;
[email protected]3e670aa2013-12-02 19:04:321398}
1399
sky27344382017-03-08 21:30:321400void Shell::OnWindowActivated(
Thiago Farina3b086a02017-05-30 22:32:501401 ::wm::ActivationChangeObserver::ActivationReason reason,
sky27344382017-03-08 21:30:321402 aura::Window* gained_active,
1403 aura::Window* lost_active) {
James Cook40f7d752018-05-25 18:21:581404 if (!gained_active)
1405 return;
1406
1407 shell_state_->SetRootWindowForNewWindows(gained_active->GetRootWindow());
sky27344382017-03-08 21:30:321408}
1409
Steven Bennettsbadc3092018-05-24 21:26:011410void Shell::OnFirstSessionStarted() {
1411 // Enable magnifier scroll keys as there may be no mouse cursor in kiosk mode.
1412 MagnifierKeyScroller::SetEnabled(session_controller_->IsRunningInAppMode());
1413
1414 // Enable long press action to toggle spoken feedback with hotrod remote
1415 // which can't handle shortcuts.
1416 SpokenFeedbackToggler::SetEnabled(session_controller_->IsRunningInAppMode());
1417}
1418
Xiyuan Xiab64fd0a2017-04-13 17:53:141419void Shell::OnSessionStateChanged(session_manager::SessionState state) {
James Cookeb426b52018-09-17 16:45:121420 const bool is_session_active = state == session_manager::SessionState::ACTIVE;
Aga Wronskae195ad22017-12-20 01:38:111421 // Initialize the |shelf_window_watcher_| when a session becomes active.
1422 // Shelf itself is initialized in RootWindowController.
James Cookeb426b52018-09-17 16:45:121423 if (is_session_active && !shelf_window_watcher_)
1424 shelf_window_watcher_ = std::make_unique<ShelfWindowWatcher>(shelf_model());
1425
1426 // Disable drag-and-drop during OOBE and GAIA login screens by only enabling
1427 // the controller when the session is active. https://crbug.com/464118
1428 drag_drop_controller_->set_enabled(is_session_active);
xiyuan233f4e72017-04-06 06:59:561429}
sky5ad143a2017-03-22 04:31:231430
Xiyuan Xiab64fd0a2017-04-13 17:53:141431void Shell::OnLoginStatusChanged(LoginStatus login_status) {
xiyuan233f4e72017-04-06 06:59:561432 UpdateAfterLoginStatusChange(login_status);
sky5ad143a2017-03-22 04:31:231433}
1434
Xiyuan Xiab64fd0a2017-04-13 17:53:141435void Shell::OnLockStateChanged(bool locked) {
xiyuan7ebbf7f2017-04-10 16:49:101436#ifndef NDEBUG
1437 // Make sure that there is no system modal in Lock layer when unlocked.
1438 if (!locked) {
1439 aura::Window::Windows containers = wm::GetContainersFromAllRootWindows(
1440 kShellWindowId_LockSystemModalContainer, GetPrimaryRootWindow());
1441 for (aura::Window* container : containers)
1442 DCHECK(container->children().empty());
1443 }
1444#endif
1445}
1446
Sam McNallye36abbc2017-07-20 01:04:281447void Shell::OnLocalStatePrefServiceInitialized(
1448 std::unique_ptr<::PrefService> pref_service) {
Sam McNallya853cd82017-08-30 01:55:101449 DCHECK(!local_state_);
James Cook8532dbc2017-07-31 21:54:511450 // |pref_service| is null if can't connect to Chrome (as happens when
Scott Violet8ff9c302018-02-22 22:28:351451 // running mash outside of chrome --enable-features=Mash and chrome isn't
1452 // built).
Sam McNallya853cd82017-08-30 01:55:101453 if (!pref_service)
1454 return;
1455
1456 local_state_ = std::move(pref_service);
James Cookbbe5cb12017-08-08 18:32:211457
1458 for (auto& observer : shell_observers_)
Sam McNallya853cd82017-08-30 01:55:101459 observer.OnLocalStatePrefServiceInitialized(local_state_.get());
Sam McNallye36abbc2017-07-20 01:04:281460}
1461
[email protected]55f593352011-12-24 05:42:461462} // namespace ash