Index: chrome/browser/ui/ash/launcher/extension_app_window_launcher_controller.cc |
diff --git a/chrome/browser/ui/ash/launcher/extension_app_window_launcher_controller.cc b/chrome/browser/ui/ash/launcher/extension_app_window_launcher_controller.cc |
index 1e0671732cdbb1c0120906da54121007be8f9530..f8258c8982d65897962701e149d39d84329d2084 100644 |
--- a/chrome/browser/ui/ash/launcher/extension_app_window_launcher_controller.cc |
+++ b/chrome/browser/ui/ash/launcher/extension_app_window_launcher_controller.cc |
@@ -4,8 +4,9 @@ |
#include "chrome/browser/ui/ash/launcher/extension_app_window_launcher_controller.h" |
+#include "ash/public/cpp/shelf_types.h" |
+#include "ash/public/cpp/window_properties.h" |
#include "ash/shelf/shelf_model.h" |
-#include "ash/wm/window_properties.h" |
#include "ash/wm/window_util.h" |
#include "ash/wm_window.h" |
#include "base/stl_util.h" |
@@ -25,7 +26,8 @@ using extensions::AppWindowRegistry; |
namespace { |
-std::string GetLaunchId(AppWindow* app_window) { |
+// Get the ShelfID for a given |app_window|. |
+ash::ShelfID GetShelfId(AppWindow* app_window) { |
// Set launch_id default value to an empty string. If showInShelf parameter |
// is true or the window type is panel and the window key is not empty, its |
// value is appended to the launch_id. Otherwise, if the window key is |
@@ -37,14 +39,7 @@ std::string GetLaunchId(AppWindow* app_window) { |
else |
launch_id = base::StringPrintf("%d", app_window->session_id().id()); |
} |
- return launch_id; |
-} |
- |
-std::string GetAppShelfId(AppWindow* app_window) { |
- // Set app_shelf_id value to app_id and then append launch_id. |
- std::string app_id = app_window->extension_id(); |
- std::string launch_id = GetLaunchId(app_window); |
- return app_id + launch_id; |
+ return ash::ShelfID(app_window->extension_id(), launch_id); |
} |
} // namespace |
@@ -58,15 +53,11 @@ ExtensionAppWindowLauncherController::ExtensionAppWindowLauncherController( |
} |
ExtensionAppWindowLauncherController::~ExtensionAppWindowLauncherController() { |
- for (std::set<AppWindowRegistry*>::iterator it = registry_.begin(); |
- it != registry_.end(); ++it) |
- (*it)->RemoveObserver(this); |
- |
- for (WindowToAppShelfIdMap::iterator iter = |
- window_to_app_shelf_id_map_.begin(); |
- iter != window_to_app_shelf_id_map_.end(); ++iter) { |
- iter->first->RemoveObserver(this); |
- } |
+ for (extensions::AppWindowRegistry* iter : registry_) |
+ iter->RemoveObserver(this); |
+ |
+ for (const auto& iter : window_to_shelf_id_map_) |
+ iter.first->RemoveObserver(this); |
} |
void ExtensionAppWindowLauncherController::AdditionalUserAddedToSession( |
@@ -87,8 +78,8 @@ void ExtensionAppWindowLauncherController::AdditionalUserAddedToSession( |
void ExtensionAppWindowLauncherController::OnAppWindowIconChanged( |
AppWindow* app_window) { |
- const std::string app_shelf_id = GetAppShelfId(app_window); |
- AppControllerMap::iterator iter = app_controller_map_.find(app_shelf_id); |
+ const ash::ShelfID shelf_id = GetShelfId(app_window); |
+ AppControllerMap::iterator iter = app_controller_map_.find(shelf_id); |
if (iter == app_controller_map_.end()) |
return; |
@@ -127,79 +118,67 @@ void ExtensionAppWindowLauncherController::OnWindowDestroying( |
} |
void ExtensionAppWindowLauncherController::RegisterApp(AppWindow* app_window) { |
+ const ash::ShelfID shelf_id = GetShelfId(app_window); |
James Cook
2017/05/04 16:38:49
nit: DCHECK that it is valid
msw
2017/05/04 19:05:58
Done.
|
+ aura::Window* window = app_window->GetNativeWindow(); |
+ window->SetProperty(ash::kShelfIDKey, new ash::ShelfID(shelf_id)); |
+ |
// Windows created by IME extension should be treated the same way as the |
// virtual keyboard window, which does not register itself in launcher. |
// Ash's ShelfWindowWatcher handles app panel windows separately. |
if (app_window->is_ime_window() || app_window->window_type_is_panel()) |
return; |
- aura::Window* window = app_window->GetNativeWindow(); |
// Get the app's shelf identifier and add an entry to the map. |
- DCHECK(window_to_app_shelf_id_map_.find(window) == |
- window_to_app_shelf_id_map_.end()); |
- const std::string app_shelf_id = GetAppShelfId(app_window); |
- window_to_app_shelf_id_map_[window] = app_shelf_id; |
+ DCHECK_EQ(window_to_shelf_id_map_.count(window), 0u); |
+ window_to_shelf_id_map_[window] = shelf_id; |
window->AddObserver(this); |
// Find or create an item controller and launcher item. |
- std::string app_id = app_window->extension_id(); |
ash::ShelfItemStatus status = ash::wm::IsActiveWindow(window) |
? ash::STATUS_ACTIVE |
: ash::STATUS_RUNNING; |
AppControllerMap::iterator app_controller_iter = |
- app_controller_map_.find(app_shelf_id); |
- ash::ShelfID shelf_id = 0; |
+ app_controller_map_.find(shelf_id); |
if (app_controller_iter != app_controller_map_.end()) { |
ExtensionAppWindowLauncherItemController* controller = |
app_controller_iter->second; |
- DCHECK(controller->app_id() == app_id); |
- shelf_id = controller->shelf_id(); |
+ DCHECK_EQ(controller->app_id(), shelf_id.app_id()); |
controller->AddAppWindow(app_window); |
} else { |
- std::string launch_id = GetLaunchId(app_window); |
std::unique_ptr<ExtensionAppWindowLauncherItemController> controller = |
- base::MakeUnique<ExtensionAppWindowLauncherItemController>( |
- ash::AppLaunchId(app_id, launch_id)); |
- ExtensionAppWindowLauncherItemController* item_controller = |
- controller.get(); |
- |
+ base::MakeUnique<ExtensionAppWindowLauncherItemController>(shelf_id); |
+ app_controller_map_[shelf_id] = controller.get(); |
controller->AddAppWindow(app_window); |
- // If there is already a shelf id mapped to this AppLaunchId (e.g. pinned), |
- // use that shelf item. |
- shelf_id = owner()->GetShelfIDForAppIDAndLaunchID(app_id, launch_id); |
- if (shelf_id == 0) { |
- shelf_id = owner()->CreateAppLauncherItem(std::move(controller), status); |
+ // Check for any existing pinned shelf item with a matching |shelf_id|. |
+ const int item_index = owner()->shelf_model()->ItemIndexByID(shelf_id); |
+ if (item_index < 0) { |
+ owner()->CreateAppLauncherItem(std::move(controller), status); |
// Restore any existing app icon and flag as set. |
if (app_window->HasCustomIcon() && !app_window->app_icon().IsEmpty()) { |
owner()->SetLauncherItemImage(shelf_id, |
app_window->app_icon().AsImageSkia()); |
- item_controller->set_image_set_by_controller(true); |
+ app_controller_map_[shelf_id]->set_image_set_by_controller(true); |
} |
} else { |
owner()->shelf_model()->SetShelfItemDelegate(shelf_id, |
std::move(controller)); |
} |
- |
- // We need to change the controller associated with app_shelf_id. |
- app_controller_map_[app_shelf_id] = item_controller; |
} |
+ |
owner()->SetItemStatus(shelf_id, status); |
- ash::WmWindow::Get(window)->aura_window()->SetProperty(ash::kShelfIDKey, |
- shelf_id); |
} |
void ExtensionAppWindowLauncherController::UnregisterApp(aura::Window* window) { |
- WindowToAppShelfIdMap::iterator window_iter = |
- window_to_app_shelf_id_map_.find(window); |
- DCHECK(window_iter != window_to_app_shelf_id_map_.end()); |
- std::string app_shelf_id = window_iter->second; |
- window_to_app_shelf_id_map_.erase(window_iter); |
+ const auto window_iter = window_to_shelf_id_map_.find(window); |
+ DCHECK(window_iter != window_to_shelf_id_map_.end()); |
+ ash::ShelfID shelf_id = window_iter->second; |
+ window_to_shelf_id_map_.erase(window_iter); |
window->RemoveObserver(this); |
AppControllerMap::iterator app_controller_iter = |
- app_controller_map_.find(app_shelf_id); |
+ app_controller_map_.find(shelf_id); |
DCHECK(app_controller_iter != app_controller_map_.end()); |
ExtensionAppWindowLauncherItemController* controller; |
controller = app_controller_iter->second; |
@@ -208,7 +187,6 @@ void ExtensionAppWindowLauncherController::UnregisterApp(aura::Window* window) { |
if (controller->window_count() == 0) { |
// If this is the last window associated with the app window shelf id, |
// close the shelf item. |
- ash::ShelfID shelf_id = controller->shelf_id(); |
owner()->CloseLauncherItem(shelf_id); |
app_controller_map_.erase(app_controller_iter); |
} |
@@ -216,8 +194,7 @@ void ExtensionAppWindowLauncherController::UnregisterApp(aura::Window* window) { |
bool ExtensionAppWindowLauncherController::IsRegisteredApp( |
aura::Window* window) { |
- return window_to_app_shelf_id_map_.find(window) != |
- window_to_app_shelf_id_map_.end(); |
+ return window_to_shelf_id_map_.find(window) != window_to_shelf_id_map_.end(); |
} |
// Private Methods |
@@ -225,13 +202,11 @@ bool ExtensionAppWindowLauncherController::IsRegisteredApp( |
AppWindowLauncherItemController* |
ExtensionAppWindowLauncherController::ControllerForWindow( |
aura::Window* window) { |
- WindowToAppShelfIdMap::iterator window_iter = |
- window_to_app_shelf_id_map_.find(window); |
- if (window_iter == window_to_app_shelf_id_map_.end()) |
+ const auto window_iter = window_to_shelf_id_map_.find(window); |
+ if (window_iter == window_to_shelf_id_map_.end()) |
return nullptr; |
- AppControllerMap::iterator app_controller_iter = |
- app_controller_map_.find(window_iter->second); |
- if (app_controller_iter == app_controller_map_.end()) |
+ const auto controller_iter = app_controller_map_.find(window_iter->second); |
+ if (controller_iter == app_controller_map_.end()) |
return nullptr; |
- return app_controller_iter->second; |
+ return controller_iter->second; |
} |