|  | // Copyright 2025 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "chrome/browser/extensions/api/tabs/app_window_helper.h" | 
|  |  | 
|  | #include "chrome/browser/extensions/api/tabs/app_base_window.h" | 
|  | #include "chrome/browser/extensions/api/tabs/app_window_controller.h" | 
|  | #include "chrome/browser/profiles/profile.h" | 
|  | #include "extensions/browser/app_window/app_window.h" | 
|  |  | 
|  | namespace extensions { | 
|  |  | 
|  | AppWindowHelper::AppWindowHelper(Profile* profile, | 
|  | ActiveWindowChangedCallback callback) | 
|  | : profile_(profile), active_window_changed_callback_(std::move(callback)) { | 
|  | AppWindowRegistry* registry = AppWindowRegistry::Get(profile); | 
|  |  | 
|  | app_registry_observation_.Observe(registry); | 
|  |  | 
|  | for (AppWindow* app_window : registry->app_windows()) { | 
|  | AddAppWindow(app_window); | 
|  | } | 
|  | } | 
|  |  | 
|  | AppWindowHelper::~AppWindowHelper() = default; | 
|  |  | 
|  | void AppWindowHelper::OnAppWindowAdded(AppWindow* app_window) { | 
|  | // We only observe the AppWindowRegistry for our associated Profile, so this | 
|  | // should always match. | 
|  | CHECK(profile_->IsSameOrParent( | 
|  | Profile::FromBrowserContext(app_window->browser_context()))); | 
|  |  | 
|  | AddAppWindow(app_window); | 
|  | } | 
|  |  | 
|  | void AppWindowHelper::OnAppWindowRemoved(AppWindow* app_window) { | 
|  | // We only observe the AppWindowRegistry for our associated Profile, so this | 
|  | // should always match. | 
|  | CHECK(profile_->IsSameOrParent( | 
|  | Profile::FromBrowserContext(app_window->browser_context()))); | 
|  |  | 
|  | app_windows_.erase(app_window->session_id().id()); | 
|  | } | 
|  |  | 
|  | void AppWindowHelper::OnAppWindowActivated(AppWindow* app_window) { | 
|  | AppWindowMap::const_iterator iter = | 
|  | app_windows_.find(app_window->session_id().id()); | 
|  | // We create a new entry in `app_windows_` for every AppWindow when it's | 
|  | // created, so there should always be an entry. | 
|  | CHECK(iter != app_windows_.end()); | 
|  |  | 
|  | active_window_changed_callback_.Run(iter->second.get()); | 
|  | } | 
|  |  | 
|  | void AppWindowHelper::AddAppWindow(AppWindow* app_window) { | 
|  | auto controller = std::make_unique<AppWindowController>( | 
|  | app_window, std::make_unique<AppBaseWindow>(app_window), profile_); | 
|  | app_windows_[app_window->session_id().id()] = std::move(controller); | 
|  | } | 
|  |  | 
|  | }  // namespace extensions |