Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/ash/launcher/extension_app_window_launcher_controlle r.h" | 5 #include "chrome/browser/ui/ash/launcher/extension_app_window_launcher_controlle r.h" |
| 6 | 6 |
| 7 #include "ash/public/cpp/shelf_model.h" | 7 #include "ash/public/cpp/shelf_model.h" |
| 8 #include "ash/public/cpp/shelf_types.h" | 8 #include "ash/public/cpp/shelf_types.h" |
| 9 #include "ash/public/cpp/window_properties.h" | 9 #include "ash/public/cpp/window_properties.h" |
| 10 #include "ash/wm/window_util.h" | 10 #include "ash/wm/window_util.h" |
| 11 #include "base/stl_util.h" | 11 #include "base/stl_util.h" |
| 12 #include "base/strings/stringprintf.h" | 12 #include "base/strings/stringprintf.h" |
| 13 #include "chrome/browser/chromeos/ash_config.h" | |
| 13 #include "chrome/browser/profiles/profile.h" | 14 #include "chrome/browser/profiles/profile.h" |
| 14 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h" | 15 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h" |
| 15 #include "chrome/browser/ui/ash/launcher/extension_app_window_launcher_item_cont roller.h" | 16 #include "chrome/browser/ui/ash/launcher/extension_app_window_launcher_item_cont roller.h" |
| 16 #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager.h" | 17 #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager.h" |
| 17 #include "extensions/browser/app_window/app_window.h" | 18 #include "extensions/browser/app_window/app_window.h" |
| 18 #include "extensions/browser/app_window/native_app_window.h" | 19 #include "extensions/browser/app_window/native_app_window.h" |
| 19 #include "extensions/common/extension.h" | 20 #include "extensions/common/extension.h" |
| 20 #include "ui/aura/window.h" | 21 #include "ui/aura/window.h" |
| 21 #include "ui/aura/window_event_dispatcher.h" | 22 #include "ui/aura/window_event_dispatcher.h" |
| 22 | 23 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 68 return; | 69 return; |
| 69 | 70 |
| 70 AppWindowRegistry* registry = AppWindowRegistry::Get(profile); | 71 AppWindowRegistry* registry = AppWindowRegistry::Get(profile); |
| 71 if (registry_.find(registry) != registry_.end()) | 72 if (registry_.find(registry) != registry_.end()) |
| 72 return; | 73 return; |
| 73 | 74 |
| 74 registry->AddObserver(this); | 75 registry->AddObserver(this); |
| 75 registry_.insert(registry); | 76 registry_.insert(registry); |
| 76 } | 77 } |
| 77 | 78 |
| 79 void ExtensionAppWindowLauncherController::OnAppWindowAdded( | |
| 80 extensions::AppWindow* app_window) { | |
| 81 // TODO(msw): Determine why this only seems to be called in Mash. Setting the | |
|
James Cook
2017/06/08 17:14:00
File a bug for this.
| |
| 82 // ShelfItemType as early as possible is important on Mash, to prevent Ash's | |
| 83 // ShelfWindowWatcher from creating a conflicting ShelfItem. Set the item type | |
| 84 // here for the mash config, and later on in RegisterApp for classic ash. | |
| 85 if (chromeos::GetAshConfig() != ash::Config::MASH) | |
| 86 return; | |
| 87 | |
| 88 const ash::ShelfID shelf_id = GetShelfId(app_window); | |
| 89 DCHECK(!shelf_id.IsNull()); | |
| 90 aura::Window* window = app_window->GetNativeWindow(); | |
| 91 window->SetProperty<int>( | |
| 92 ash::kShelfItemTypeKey, | |
| 93 app_window->window_type_is_panel() ? ash::TYPE_APP_PANEL : ash::TYPE_APP); | |
| 94 window->SetProperty(ash::kShelfIDKey, new std::string(shelf_id.Serialize())); | |
| 95 } | |
| 96 | |
| 78 void ExtensionAppWindowLauncherController::OnAppWindowShown( | 97 void ExtensionAppWindowLauncherController::OnAppWindowShown( |
| 79 AppWindow* app_window, | 98 AppWindow* app_window, |
| 80 bool was_hidden) { | 99 bool was_hidden) { |
| 81 aura::Window* window = app_window->GetNativeWindow(); | 100 aura::Window* window = app_window->GetNativeWindow(); |
| 82 if (!IsRegisteredApp(window)) | 101 if (!IsRegisteredApp(window)) |
| 83 RegisterApp(app_window); | 102 RegisterApp(app_window); |
| 84 } | 103 } |
| 85 | 104 |
| 86 void ExtensionAppWindowLauncherController::OnAppWindowHidden( | 105 void ExtensionAppWindowLauncherController::OnAppWindowHidden( |
| 87 AppWindow* app_window) { | 106 AppWindow* app_window) { |
| 88 aura::Window* window = app_window->GetNativeWindow(); | 107 aura::Window* window = app_window->GetNativeWindow(); |
| 89 if (IsRegisteredApp(window)) | 108 if (IsRegisteredApp(window)) |
| 90 UnregisterApp(window); | 109 UnregisterApp(window); |
| 91 } | 110 } |
| 92 | 111 |
| 93 // Called from aura::Window::~Window(), before delegate_->OnWindowDestroyed() | 112 // Called from aura::Window::~Window(), before delegate_->OnWindowDestroyed() |
| 94 // which destroys AppWindow, so both |window| and the associated AppWindow | 113 // which destroys AppWindow, so both |window| and the associated AppWindow |
| 95 // are valid here. | 114 // are valid here. |
| 96 void ExtensionAppWindowLauncherController::OnWindowDestroying( | 115 void ExtensionAppWindowLauncherController::OnWindowDestroying( |
| 97 aura::Window* window) { | 116 aura::Window* window) { |
| 98 UnregisterApp(window); | 117 UnregisterApp(window); |
| 99 } | 118 } |
| 100 | 119 |
| 101 void ExtensionAppWindowLauncherController::RegisterApp(AppWindow* app_window) { | 120 void ExtensionAppWindowLauncherController::RegisterApp(AppWindow* app_window) { |
| 121 aura::Window* window = app_window->GetNativeWindow(); | |
| 102 const ash::ShelfID shelf_id = GetShelfId(app_window); | 122 const ash::ShelfID shelf_id = GetShelfId(app_window); |
| 103 DCHECK(!shelf_id.IsNull()); | 123 DCHECK(!shelf_id.IsNull()); |
| 104 aura::Window* window = app_window->GetNativeWindow(); | 124 |
| 105 window->SetProperty(ash::kShelfIDKey, new std::string(shelf_id.Serialize())); | 125 // TODO(msw): Determine why OnAppWindowAdded only seems to be called in Mash. |
| 126 if (chromeos::GetAshConfig() != ash::Config::MASH) { | |
| 127 window->SetProperty(ash::kShelfIDKey, | |
| 128 new std::string(shelf_id.Serialize())); | |
| 129 window->SetProperty<int>(ash::kShelfItemTypeKey, | |
| 130 app_window->window_type_is_panel() | |
| 131 ? ash::TYPE_APP_PANEL | |
| 132 : ash::TYPE_APP); | |
| 133 } | |
| 106 | 134 |
| 107 // Windows created by IME extension should be treated the same way as the | 135 // Windows created by IME extension should be treated the same way as the |
| 108 // virtual keyboard window, which does not register itself in launcher. | 136 // virtual keyboard window, which does not register itself in launcher. |
| 109 // Ash's ShelfWindowWatcher handles app panel windows separately. | 137 // Ash's ShelfWindowWatcher handles app panel windows separately. |
| 110 if (app_window->is_ime_window() || app_window->window_type_is_panel()) | 138 if (app_window->is_ime_window() || app_window->window_type_is_panel()) |
| 111 return; | 139 return; |
| 112 | 140 |
| 113 // Get the app's shelf identifier and add an entry to the map. | 141 // Get the app's shelf identifier and add an entry to the map. |
| 114 DCHECK_EQ(window_to_shelf_id_map_.count(window), 0u); | 142 DCHECK_EQ(window_to_shelf_id_map_.count(window), 0u); |
| 115 window_to_shelf_id_map_[window] = shelf_id; | 143 window_to_shelf_id_map_[window] = shelf_id; |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 181 ExtensionAppWindowLauncherController::ControllerForWindow( | 209 ExtensionAppWindowLauncherController::ControllerForWindow( |
| 182 aura::Window* window) { | 210 aura::Window* window) { |
| 183 const auto window_iter = window_to_shelf_id_map_.find(window); | 211 const auto window_iter = window_to_shelf_id_map_.find(window); |
| 184 if (window_iter == window_to_shelf_id_map_.end()) | 212 if (window_iter == window_to_shelf_id_map_.end()) |
| 185 return nullptr; | 213 return nullptr; |
| 186 const auto controller_iter = app_controller_map_.find(window_iter->second); | 214 const auto controller_iter = app_controller_map_.find(window_iter->second); |
| 187 if (controller_iter == app_controller_map_.end()) | 215 if (controller_iter == app_controller_map_.end()) |
| 188 return nullptr; | 216 return nullptr; |
| 189 return controller_iter->second; | 217 return controller_iter->second; |
| 190 } | 218 } |
| OLD | NEW |