// 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 <memory>

#include "base/feature_list.h"
#include "base/functional/bind.h"
#include "chrome/browser/actor/ui/actor_overlay_ui.h"
#include "chrome/browser/chrome_browser_interface_binders_webui_parts.h"
#include "chrome/browser/contextual_cueing/internals/contextual_cueing_internals.mojom.h"
#include "chrome/browser/contextual_cueing/internals/contextual_cueing_internals_ui.h"
#include "chrome/browser/contextual_tasks/contextual_tasks.mojom.h"
#include "chrome/browser/contextual_tasks/contextual_tasks_internals.mojom.h"
#include "chrome/browser/contextual_tasks/contextual_tasks_ui.h"
#include "chrome/browser/glic/selection/selection_overlay_untrusted_ui.h"
#include "chrome/browser/history_clusters/history_clusters_service_factory.h"
#include "chrome/browser/history_embeddings/history_embeddings_utils.h"
#include "chrome/browser/new_tab_page/modules/file_suggestion/microsoft_files.mojom.h"
#include "chrome/browser/new_tab_page/modules/v2/authentication/microsoft_auth.mojom.h"
#include "chrome/browser/new_tab_page/modules/v2/calendar/outlook_calendar.mojom.h"
#include "chrome/browser/new_tab_page/modules/v2/tab_groups/tab_groups.mojom.h"
#include "chrome/browser/new_tab_page/new_tab_page_util.h"
#include "chrome/browser/ui/lens/lens_overlay_untrusted_ui.h"
#include "chrome/browser/ui/lens/lens_side_panel_untrusted_ui.h"
#include "chrome/browser/ui/ui_features.h"
#include "chrome/browser/ui/views/side_panel/history/history_side_panel_coordinator.h"
#include "chrome/browser/ui/views/side_panel/tabs_from_other_devices/tabs_from_other_devices_side_panel_coordinator.h"
#include "chrome/browser/ui/webui/access_code_cast/access_code_cast.mojom.h"
#include "chrome/browser/ui/webui/access_code_cast/access_code_cast_ui.h"
#include "chrome/browser/ui/webui/app_service_internals/app_service_internals.mojom.h"
#include "chrome/browser/ui/webui/app_service_internals/app_service_internals_ui.h"
#include "chrome/browser/ui/webui/autofill_ml_internals/autofill_ml_internals_ui.h"
#include "chrome/browser/ui/webui/color_pipeline_internals/color_pipeline_internals_ui.h"
#include "chrome/browser/ui/webui/commerce/shopping_insights_side_panel_ui.h"
#include "chrome/browser/ui/webui/customize_buttons/customize_buttons.mojom.h"
#include "chrome/browser/ui/webui/data_sharing/data_sharing.mojom.h"
#include "chrome/browser/ui/webui/data_sharing/data_sharing_ui.h"
#include "chrome/browser/ui/webui/downloads/downloads.mojom.h"
#include "chrome/browser/ui/webui/downloads/downloads_ui.h"
#include "chrome/browser/ui/webui/drive_picker_host/drive_picker_host.mojom.h"
#include "chrome/browser/ui/webui/drive_picker_host/drive_picker_host_ui.h"
#include "chrome/browser/ui/webui/drive_picker_host/untrusted/drive_picker_host_untrusted.mojom.h"
#include "chrome/browser/ui/webui/drive_picker_host/untrusted/drive_picker_host_untrusted_ui.h"
#include "chrome/browser/ui/webui/feedback/feedback_ui.h"
#include "chrome/browser/ui/webui/feedback/report_unsafe_site/report_unsafe_site.mojom.h"
#include "chrome/browser/ui/webui/history/history_ui.h"
#include "chrome/browser/ui/webui/infobar_internals/infobar_internals.mojom.h"
#include "chrome/browser/ui/webui/infobar_internals/infobar_internals_ui.h"
#include "chrome/browser/ui/webui/iwa_dev/iwa_dev.mojom.h"
#include "chrome/browser/ui/webui/iwa_dev/iwa_dev_ui.h"
#include "chrome/browser/ui/webui/metrics_reporter/metrics_reporter_service.h"
#include "chrome/browser/ui/webui/multistep_filter_internals/multistep_filter_internals.mojom.h"
#include "chrome/browser/ui/webui/multistep_filter_internals/multistep_filter_internals_ui.h"
#include "chrome/browser/ui/webui/new_tab_footer/new_tab_footer.mojom.h"
#include "chrome/browser/ui/webui/new_tab_footer/new_tab_footer_ui.h"
#include "chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom.h"
#include "chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.h"
#include "chrome/browser/ui/webui/new_tab_page/ntp_promo/ntp_promo.mojom.h"
#include "chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party_ui.h"
#include "chrome/browser/ui/webui/ntp_microsoft_auth/ntp_microsoft_auth_untrusted_ui.h"
#include "chrome/browser/ui/webui/omnibox/logging/logs.mojom.h"
#include "chrome/browser/ui/webui/omnibox/omnibox_ui.h"
#include "chrome/browser/ui/webui/omnibox_everywhere/debug/omnibox_everywhere_debug.mojom.h"
#include "chrome/browser/ui/webui/omnibox_everywhere/omnibox_everywhere_ui.h"
#include "chrome/browser/ui/webui/omnibox_popup/omnibox_popup_ui.h"
#include "chrome/browser/ui/webui/on_device_internals/on_device_internals_ui.h"
#include "chrome/browser/ui/webui/page_action_internals/page_action_internals.mojom.h"
#include "chrome/browser/ui/webui/page_action_internals/page_action_internals_ui.h"
#include "chrome/browser/ui/webui/password_manager/password_manager_ui.h"
#include "chrome/browser/ui/webui/search_engine_choice/search_engine_choice.mojom.h"  // nogncheck crbug.com/40147906
#include "chrome/browser/ui/webui/search_engine_choice/search_engine_choice_ui.h"
#include "chrome/browser/ui/webui/settings/settings_ui.h"
#include "chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_side_panel_ui.h"
#include "chrome/browser/ui/webui/side_panel/comments/comments.mojom.h"
#include "chrome/browser/ui/webui/side_panel/comments/comments_side_panel_ui.h"
#include "chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome.mojom.h"
#include "chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_ui.h"
#include "chrome/browser/ui/webui/side_panel/customize_chrome/wallpaper_search/wallpaper_search.mojom.h"
#include "chrome/browser/ui/webui/side_panel/history/history_side_panel_ui.h"
#include "chrome/browser/ui/webui/side_panel/history_clusters/history_clusters_side_panel_ui.h"
#include "chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_ui.h"
#include "chrome/browser/ui/webui/side_panel/reading_list/reading_list.mojom.h"
#include "chrome/browser/ui/webui/side_panel/reading_list/reading_list_ui.h"
#include "chrome/browser/ui/webui/side_panel/tabs_from_other_devices/tabs_from_other_devices_side_panel_ui.h"
#include "chrome/browser/ui/webui/tab_search/tab_search.mojom.h"
#include "chrome/browser/ui/webui/tab_search/tab_search_ui.h"
#include "chrome/browser/ui/webui/user_education_internals/user_education_internals_ui.h"
#include "chrome/browser/ui/webui/web_app_internals/web_app_internals.mojom.h"
#include "chrome/browser/ui/webui/web_app_internals/web_app_internals_ui.h"
#include "chrome/browser/ui/webui/webui_gallery/webui_gallery_ui.h"
#include "chrome/browser/ui/webui/webui_toolbar/webui_toolbar_ui.h"
#include "chrome/browser/ui/webui_browser/webui_browser.h"
#include "chrome/browser/ui/webui_browser/webui_browser_ui.h"
#include "chrome/common/chrome_features.h"
#include "components/autofill/core/browser/ml_model/logging/autofill_ml_internals.mojom.h"
#include "components/browser_apis/bookmarks/bookmarks_api.mojom.h"
#include "components/browser_apis/browser_controls/browser_controls_api.mojom.h"
#include "components/browser_apis/tab_drag/tab_drag_api.mojom.h"
#include "components/browser_apis/ui_controllers/toolbar/toolbar_ui_api.mojom.h"
#include "components/commerce/core/mojom/shopping_service.mojom.h"  // nogncheck crbug.com/40147906
#include "components/contextual_tasks/public/features.h"
#include "components/data_sharing/public/features.h"
#include "components/guest_contents/common/guest_contents.mojom.h"
#include "components/history_clusters/core/history_clusters_service.h"
#include "components/lens/lens_features.h"
#include "components/multistep_filter/core/features.h"
#include "components/notebooks/internals/webui/notebooks_internals.mojom.h"
#include "components/notebooks/internals/webui/notebooks_internals_ui.h"
#include "components/omnibox/browser/searchbox.mojom.h"
#include "components/omnibox/common/omnibox_features.h"
#include "components/optimization_guide/core/optimization_guide_features.h"
#include "components/page_image_service/mojom/page_image_service.mojom.h"
#include "components/privacy_sandbox/privacy_sandbox_features.h"
#include "components/search/ntp_features.h"
#include "components/signin/public/base/signin_buildflags.h"
#include "components/sync/base/features.h"
#include "components/user_education/common/user_education_features.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui_browser_interface_broker_registry.h"
#include "content/public/browser/web_ui_controller_interface_binder.h"
#include "mojo/public/cpp/bindings/binder_map.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
#include "ui/webui/color_change_listener/color_change_handler.h"
#include "ui/webui/resources/cr_components/app_management/app_management.mojom.h"
#include "ui/webui/resources/cr_components/color_change_listener/color_change_listener.mojom.h"
#include "ui/webui/resources/cr_components/composebox/composebox.mojom.h"
#include "ui/webui/resources/cr_components/customize_color_scheme_mode/customize_color_scheme_mode.mojom.h"
#include "ui/webui/resources/cr_components/help_bubble/custom_help_bubble.mojom.h"
#include "ui/webui/resources/cr_components/history/foreign_sessions.mojom.h"
#include "ui/webui/resources/cr_components/history/history.mojom.h"
#include "ui/webui/resources/cr_components/history_clusters/history_clusters.mojom.h"
#include "ui/webui/resources/cr_components/history_embeddings/history_embeddings.mojom.h"
#include "ui/webui/resources/cr_components/most_visited/most_visited.mojom.h"
#include "ui/webui/resources/cr_components/theme_color_picker/theme_color_picker.mojom.h"
#include "ui/webui/resources/js/browser_command/browser_command.mojom.h"

#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
#include "chrome/browser/ui/webui/app_home/app_home.mojom.h"
#include "chrome/browser/ui/webui/app_home/app_home_ui.h"
#include "chrome/browser/ui/webui/app_settings/web_app_settings_ui.h"
// The intro mojom targets exist on ChromeOS but these headers are only
// compiled on Win/Mac/Linux; gn check is static, so suppress it on ChromeOS.
#include "chrome/browser/ui/webui/intro/finish_or_continue.mojom.h" // nogncheck
#include "chrome/browser/ui/webui/intro/intro.mojom.h"  // nogncheck
#include "chrome/browser/ui/webui/intro/intro_ui.h"
#include "chrome/browser/ui/webui/intro/sign_in_celebration.mojom.h"  // nogncheck
#include "chrome/browser/ui/webui/intro/sign_in_promo.mojom.h"  // nogncheck
#include "chrome/browser/ui/webui/intro/welcome.mojom.h"  // nogncheck
#include "chrome/browser/ui/webui/on_device_translation_internals/on_device_translation_internals_ui.h"
#include "chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin.mojom.h"
#include "chrome/browser/ui/webui/signin/history_sync_optin/history_sync_optin_ui.h"
#include "chrome/browser/ui/webui/signin/profile_customization_ui.h"
#include "chrome/browser/ui/webui/signin/profile_picker_ui.h"
#include "chrome/browser/ui/webui/updater/updater_ui.h"
#include "chrome/browser/ui/webui/updater/updater_ui.mojom.h"
#include "chrome/browser/ui/webui/whats_new/whats_new_ui.h"
#endif

#if BUILDFLAG(IS_MAC)
#include "chrome/browser/ui/webui/unexportable_keys_internals/unexportable_keys_internals.mojom.h"
#include "chrome/browser/ui/webui/unexportable_keys_internals/unexportable_keys_internals_ui.h"
#endif  // BUILDFLAG(IS_MAC)

#if BUILDFLAG(IS_CHROMEOS)
#include "ash/webui/diagnostics_ui/diagnostics_ui.h"
#include "ash/webui/firmware_update_ui/firmware_update_app_ui.h"
#include "ash/webui/graduation/graduation_ui.h"
#include "ash/webui/os_feedback_ui/os_feedback_ui.h"
#include "ash/webui/personalization_app/personalization_app_ui.h"
#include "ash/webui/print_management/print_management_ui.h"
#include "ash/webui/sanitize_ui/sanitize_ui.h"
#include "ash/webui/scanning/scanning_ui.h"
#include "ash/webui/shortcut_customization_ui/shortcut_customization_app_ui.h"
#include "ash/webui/vc_background_ui/vc_background_ui.h"
#include "chrome/browser/ui/webui/ash/app_install/app_install_dialog.h"
#include "chrome/browser/ui/webui/ash/bluetooth/bluetooth_pairing_dialog.h"
#include "chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_ui.h"
#include "chrome/browser/ui/webui/ash/curtain_ui/remote_maintenance_curtain_ui.h"
#include "chrome/browser/ui/webui/ash/emoji/emoji_ui.h"
#include "chrome/browser/ui/webui/ash/extended_updates/extended_updates_ui.h"
#include "chrome/browser/ui/webui/ash/internet/internet_config_dialog.h"
#include "chrome/browser/ui/webui/ash/internet/internet_detail_dialog.h"
#include "chrome/browser/ui/webui/ash/login/oobe_ui.h"
#include "chrome/browser/ui/webui/ash/multidevice_setup/multidevice_setup_dialog.h"
#include "chrome/browser/ui/webui/ash/office_fallback/office_fallback_ui.h"
#include "chrome/browser/ui/webui/ash/parent_access/parent_access_ui.h"
#include "chrome/browser/ui/webui/ash/set_time/set_time_ui.h"
#include "chrome/browser/ui/webui/ash/settings/os_settings_ui.h"
#include "chrome/browser/ui/webui/ash/skyvault/local_files_migration_ui.h"
#include "chrome/browser/ui/webui/nearby_share/nearby_share_dialog_ui.h"
#endif  // BUILDFLAG(IS_CHROMEOS)

#if !defined(OFFICIAL_BUILD)
#include "chrome/browser/ui/webui/new_tab_page/foo/foo.mojom.h"  // nogncheck crbug.com/40147906
#endif  // defined(OFFICIAL_BUILD)

#if BUILDFLAG(ENABLE_DICE_SUPPORT)
#include "chrome/browser/ui/webui/feature_showcase/default_browser.mojom.h"
#include "chrome/browser/ui/webui/feature_showcase/feature_showcase.mojom.h"
#include "chrome/browser/ui/webui/feature_showcase/feature_showcase_ui.h"
#include "chrome/browser/ui/webui/feature_showcase/gemini.mojom.h"
#include "chrome/browser/ui/webui/feature_showcase/google_lens.mojom.h"
#include "chrome/browser/ui/webui/feature_showcase/password_manager.mojom.h"
#include "chrome/browser/ui/webui/signin/signout_confirmation/signout_confirmation_ui.h"
#endif  // BUILDFLAG(ENABLE_DICE_SUPPORT)

#include "ui/webui/resources/js/batch_upload_promo/batch_upload_promo.mojom.h"

#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS)
#include "chrome/browser/default_browser/default_browser_features.h"
#include "chrome/browser/ui/webui/default_browser/default_browser_modal.mojom.h"
#include "chrome/browser/ui/webui/default_browser/default_browser_modal_ui.h"
#endif

#if BUILDFLAG(IS_WIN)
#include "chrome/browser/ui/webui/default_browser/visual_guided_setter_ui.h"
#endif

namespace chrome::internal {

using content::RegisterWebUIControllerInterfaceBinder;

namespace {

void BindMetricsReporterService(
    content::RenderFrameHost* frame_host,
    mojo::PendingReceiver<metrics_reporter::mojom::PageMetricsHost> receiver) {
  auto* web_contents = content::WebContents::FromRenderFrameHost(frame_host);
  if (!web_contents) {
    return;
  }

  // MetricsReporterService is only intended for use by WebUI.
  if (!frame_host->GetWebUI()) {
    return;
  }

  MetricsReporterService* service =
      MetricsReporterService::GetFromWebContents(web_contents);
  service->BindReceiver(std::move(receiver));
}

}  // namespace

void PopulateChromeWebUIFrameBindersPartsDesktop(
    mojo::BinderMapWithContext<content::RenderFrameHost*>* map,
    content::RenderFrameHost* render_frame_host) {
  RegisterWebUIControllerInterfaceBinder<
      search_engine_choice::mojom::PageHandlerFactory, SearchEngineChoiceUI>(
      map);

  RegisterWebUIControllerInterfaceBinder<downloads::mojom::PageHandlerFactory,
                                         DownloadsUI>(map);

  if (lens::features::IsLensOverlayEnabled()) {
    RegisterWebUIControllerInterfaceBinder<
        lens::mojom::LensSidePanelPageHandlerFactory,
        lens::LensSidePanelUntrustedUI>(map);
    RegisterWebUIControllerInterfaceBinder<lens::mojom::LensPageHandlerFactory,
                                           lens::LensOverlayUntrustedUI>(map);
  }

  if (base::FeatureList::IsEnabled(features::kGlicActorUi) &&
      features::kGlicActorUiOverlay.Get()) {
    RegisterWebUIControllerInterfaceBinder<
        actor::ui::mojom::ActorOverlayPageHandlerFactory,
        actor::ui::ActorOverlayUI>(map);
  }

  if (user_education::features::GetNtpBrowserPromoType() !=
      user_education::features::NtpBrowserPromoType::kNone) {
    RegisterWebUIControllerInterfaceBinder<
        ntp_promo::mojom::NtpPromoHandlerFactory, NewTabPageUI>(map);
  }

  if (HistorySidePanelCoordinator::IsSupported()) {
    RegisterWebUIControllerInterfaceBinder<history::mojom::PageHandler,
                                           HistorySidePanelUI, HistoryUI>(map);
  } else {
    RegisterWebUIControllerInterfaceBinder<history::mojom::PageHandler,
                                           HistoryUI>(map);
  }
#if BUILDFLAG(ENABLE_DICE_SUPPORT)
  RegisterWebUIControllerInterfaceBinder<
      history_cross_device_signin_promo::mojom::
          HistoryCrossDeviceSigninPromoHandler,
      HistoryUI>(map);
#endif
  if (TabsFromOtherDevicesSidePanelCoordinator::IsSupported(
          Profile::FromBrowserContext(
              render_frame_host->GetBrowserContext()))) {
    RegisterWebUIControllerInterfaceBinder<
        history::mojom::ForeignSessionPageHandlerFactory, HistoryUI,
        TabsFromOtherDevicesSidePanelUI>(map);
  } else {
    RegisterWebUIControllerInterfaceBinder<
        history::mojom::ForeignSessionPageHandlerFactory, HistoryUI>(map);
  }

  RegisterWebUIControllerInterfaceBinder<
      infobar_internals::mojom::PageHandlerFactory, InfoBarInternalsUI>(map);

  RegisterWebUIControllerInterfaceBinder<
      page_action_internals::mojom::PageHandlerFactory, PageActionInternalsUI>(
      map);

  auto* history_clusters_service =
      HistoryClustersServiceFactory::GetForBrowserContext(
          render_frame_host->GetProcess()->GetBrowserContext());
  if (history_clusters_service &&
      history_clusters_service->is_journeys_feature_flag_enabled()) {
    if (HistorySidePanelCoordinator::IsSupported()) {
      RegisterWebUIControllerInterfaceBinder<
          history_clusters::mojom::PageHandlerFactory, HistoryUI,
          HistorySidePanelUI>(map);
    } else {
      RegisterWebUIControllerInterfaceBinder<
          history_clusters::mojom::PageHandlerFactory, HistoryUI,
          HistoryClustersSidePanelUI>(map);
    }
  }
  if (history_embeddings::IsHistoryEmbeddingsFeatureEnabled()) {
    if (history_clusters_service &&
        history_clusters_service->is_journeys_feature_flag_enabled()) {
      if (HistorySidePanelCoordinator::IsSupported()) {
        RegisterWebUIControllerInterfaceBinder<
            history_embeddings::mojom::PageHandlerFactory, HistoryUI,
            HistorySidePanelUI>(map);
      } else {
        RegisterWebUIControllerInterfaceBinder<
            history_embeddings::mojom::PageHandlerFactory, HistoryUI,
            HistoryClustersSidePanelUI>(map);
      }
    } else {
      if (HistorySidePanelCoordinator::IsSupported()) {
        RegisterWebUIControllerInterfaceBinder<
            history_embeddings::mojom::PageHandlerFactory, HistorySidePanelUI,
            HistoryUI>(map);
      } else {
        RegisterWebUIControllerInterfaceBinder<
            history_embeddings::mojom::PageHandlerFactory, HistoryUI>(map);
      }
    }
  }

  if (HistorySidePanelCoordinator::IsSupported()) {
    RegisterWebUIControllerInterfaceBinder<
        page_image_service::mojom::PageImageServiceHandler, HistoryUI,
        HistorySidePanelUI, NewTabPageUI, BookmarksSidePanelUI>(map);
  } else {
    RegisterWebUIControllerInterfaceBinder<
        page_image_service::mojom::PageImageServiceHandler, HistoryUI,
        HistoryClustersSidePanelUI, NewTabPageUI, BookmarksSidePanelUI>(map);
  }

#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
  RegisterWebUIControllerInterfaceBinder<whats_new::mojom::PageHandlerFactory,
                                         WhatsNewUI>(map);
#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)

#if BUILDFLAG(ENABLE_DICE_SUPPORT)
  RegisterWebUIControllerInterfaceBinder<
      feature_showcase::mojom::DefaultBrowserPageHandlerFactory,
      FeatureShowcaseUI>(map);
  RegisterWebUIControllerInterfaceBinder<
      feature_showcase::mojom::FeatureShowcasePageHandlerFactory,
      FeatureShowcaseUI>(map);
  RegisterWebUIControllerInterfaceBinder<
      feature_showcase::mojom::PasswordManagerPageHandlerFactory,
      FeatureShowcaseUI>(map);
  RegisterWebUIControllerInterfaceBinder<
      feature_showcase::mojom::ThemesAndCustomizationPageHandlerFactory,
      FeatureShowcaseUI>(map);
  RegisterWebUIControllerInterfaceBinder<
      feature_showcase::mojom::GeminiPageHandlerFactory, FeatureShowcaseUI>(
      map);
  RegisterWebUIControllerInterfaceBinder<
      feature_showcase::mojom::GoogleLensPageHandlerFactory, FeatureShowcaseUI>(
      map);
#endif  // BUILDFLAG(ENABLE_DICE_SUPPORT)
  RegisterWebUIControllerInterfaceBinder<
      batch_upload_promo::mojom::PageHandlerFactory, settings::SettingsUI>(map);

  RegisterWebUIControllerInterfaceBinder<
      browser_command::mojom::CommandHandlerFactory,
#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
      WhatsNewUI,
#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
      NewTabPageUI>(map);

  RegisterWebUIControllerInterfaceBinder<searchbox::mojom::PageHandlerFactory,
                                         NewTabPageUI, OmniboxPopupUI,
                                         OmniboxEverywhereUI>(map);

  RegisterWebUIControllerInterfaceBinder<
      omnibox_everywhere_debug::mojom::PageHandlerFactory, OmniboxEverywhereUI>(
      map);

  RegisterWebUIControllerInterfaceBinder<
      password_manager::mojom::PageHandlerFactory, PasswordManagerUI>(map);

  RegisterWebUIControllerInterfaceBinder<
      customize_color_scheme_mode::mojom::
          CustomizeColorSchemeModeHandlerFactory,
      CustomizeChromeUI
#if BUILDFLAG(ENABLE_DICE_SUPPORT)
      ,
      FeatureShowcaseUI
#endif  // BUILDFLAG(ENABLE_DICE_SUPPORT)
      >(map);

  RegisterWebUIControllerInterfaceBinder<
      theme_color_picker::mojom::ThemeColorPickerHandlerFactory,
      CustomizeChromeUI
#if !BUILDFLAG(IS_CHROMEOS)
      ,
      ProfileCustomizationUI
#endif  // !BUILDFLAG(IS_CHROMEOS)
#if BUILDFLAG(ENABLE_DICE_SUPPORT)
      ,
      FeatureShowcaseUI
#endif  // BUILDFLAG(ENABLE_DICE_SUPPORT)
      >(map);

  RegisterWebUIControllerInterfaceBinder<
      help_bubble::mojom::HelpBubbleHandlerFactory, UserEducationInternalsUI,
      ReadingListUI, NewTabPageUI, CustomizeChromeUI, PasswordManagerUI,
      HistoryUI, lens::LensOverlayUntrustedUI, lens::LensSidePanelUntrustedUI,
      ContextualTasksUI
#if !BUILDFLAG(IS_CHROMEOS)
      ,
      ProfilePickerUI
#endif  //! BUILDFLAG(IS_CHROMEOS)
      >(map);

  RegisterWebUIControllerInterfaceBinder<
      user_education::mojom::UserEducationMixedTrustHandlerFactory, HistoryUI,
      UserEducationInternalsUI>(map);

#if !defined(OFFICIAL_BUILD)
  RegisterWebUIControllerInterfaceBinder<foo::mojom::FooHandler, NewTabPageUI>(
      map);
#endif  // !defined(OFFICIAL_BUILD)

  if (base::FeatureList::IsEnabled(ntp_features::kNtpTabGroupsModule)) {
    RegisterWebUIControllerInterfaceBinder<ntp::tab_groups::mojom::PageHandler,
                                           NewTabPageUI>(map);
  }

  if (IsOutlookCalendarModuleEnabledForProfile(Profile::FromBrowserContext(
          render_frame_host->GetBrowserContext()))) {
    RegisterWebUIControllerInterfaceBinder<
        ntp::calendar::mojom::OutlookCalendarPageHandler, NewTabPageUI>(map);
  }

  if (IsMicrosoftModuleEnabledForProfile(Profile::FromBrowserContext(
          render_frame_host->GetBrowserContext()))) {
    RegisterWebUIControllerInterfaceBinder<
        ntp::authentication::mojom::MicrosoftAuthPageHandler, NewTabPageUI>(
        map);
  }

  if (IsMicrosoftFilesModuleEnabledForProfile(Profile::FromBrowserContext(
          render_frame_host->GetBrowserContext()))) {
    RegisterWebUIControllerInterfaceBinder<
        file_suggestion::mojom::MicrosoftFilesPageHandler, NewTabPageUI>(map);
  }

  RegisterWebUIControllerInterfaceBinder<
      reading_list::mojom::PageHandlerFactory, ReadingListUI>(map);
  RegisterWebUIControllerInterfaceBinder<
      side_panel::mojom::BookmarksPageHandlerFactory, BookmarksSidePanelUI>(
      map);
  RegisterWebUIControllerInterfaceBinder<comments::mojom::PageHandlerFactory,
                                         CommentsSidePanelUI>(map);

  RegisterWebUIControllerInterfaceBinder<
      shopping_service::mojom::ShoppingServiceHandlerFactory,
      BookmarksSidePanelUI, ShoppingInsightsSidePanelUI>(map);

  RegisterWebUIControllerInterfaceBinder<
      commerce::price_tracking::mojom::PriceTrackingHandlerFactory,
      ShoppingInsightsSidePanelUI, BookmarksSidePanelUI>(map);

  RegisterWebUIControllerInterfaceBinder<
      commerce::price_insights::mojom::PriceInsightsHandlerFactory,
      ShoppingInsightsSidePanelUI>(map);

  RegisterWebUIControllerInterfaceBinder<
      side_panel::mojom::CustomizeChromePageHandlerFactory, CustomizeChromeUI>(
      map);

  if (base::FeatureList::IsEnabled(
          ntp_features::kCustomizeChromeWallpaperSearch) &&
      base::FeatureList::IsEnabled(
          optimization_guide::features::kOptimizationGuideModelExecution)) {
    RegisterWebUIControllerInterfaceBinder<
        side_panel::customize_chrome::mojom::WallpaperSearchHandlerFactory,
        CustomizeChromeUI>(map);
  }

  RegisterWebUIControllerInterfaceBinder<
      side_panel::customize_chrome::mojom::CustomizeToolbarHandlerFactory,
      CustomizeChromeUI>(map);

  RegisterWebUIControllerInterfaceBinder<
      read_anything::mojom::UntrustedPageHandlerFactory,
      ReadAnythingUntrustedUI>(map);

  RegisterWebUIControllerInterfaceBinder<
      ::mojom::user_education_internals::UserEducationInternalsPageHandler,
      UserEducationInternalsUI>(map);

  RegisterWebUIControllerInterfaceBinder<
      ::mojom::app_service_internals::AppServiceInternalsPageHandler,
      AppServiceInternalsUI>(map);

  RegisterWebUIControllerInterfaceBinder<
      ::autofill_ml_internals::mojom::PageHandlerFactory,
      AutofillMlInternalsUI>(map);

  RegisterWebUIControllerInterfaceBinder<
      access_code_cast::mojom::PageHandlerFactory,
      media_router::AccessCodeCastUI>(map);

  // TODO(crbug.com/398926117): Create a generic mechanism for these interfaces.
  map->Add<metrics_reporter::mojom::PageMetricsHost>(
      &BindMetricsReporterService);

  RegisterWebUIControllerInterfaceBinder<::mojom::PageHandlerFactory,
                                         WebAppInternalsUI>(map);
  RegisterWebUIControllerInterfaceBinder<::iwa_dev::mojom::PageHandlerFactory,
                                         IwaDevUI>(map);
  if (base::FeatureList::IsEnabled(multistep_filter::kMultistepFilter)) {
    RegisterWebUIControllerInterfaceBinder<
        multistep_filter_internals::mojom::PageHandlerFactory,
        multistep_filter_internals::MultistepFilterInternalsUI>(map);
  }
  RegisterWebUIControllerInterfaceBinder<
      on_device_internals::mojom::PageHandlerFactory,
      on_device_internals::OnDeviceInternalsUI>(map);
  RegisterWebUIControllerInterfaceBinder<
      guest_contents::mojom::GuestContentsHost, WebUIBrowserUI>(map);

  const bool is_contextual_tasks_enabled =
      contextual_tasks::IsContextualTasksUIEnabled();

  if (is_contextual_tasks_enabled) {
    RegisterWebUIControllerInterfaceBinder<
        omnibox::logging::mojom::PageHandlerFactory, OmniboxUI>(map);
  }

  // Registering bindings for all WebUIControllers, even if only one of the
  // features is enabled, as it is too cumbersome and not scalable to account
  // for all combinations of feature flags here.
  // TODO(crbug.com/452983498): This should be fixed by following the
  // registry.ForWebUI() pattern used in
  // PopulateChromeWebUIFrameInterfaceBrokersUntrustedPartsDesktop below which
  // eliminates the need to account for feature flag combinations.
  RegisterWebUIControllerInterfaceBinder<
      composebox::mojom::PageHandlerFactory, NewTabPageUI, ContextualTasksUI,
      OmniboxPopupUI, OmniboxEverywhereUI>(map);

  if (base::FeatureList::IsEnabled(
          omnibox::kComposeboxDriveContextMenuOption)) {
    RegisterWebUIControllerInterfaceBinder<
        drive_picker_host::mojom::DrivePickerHostHandler, DrivePickerHostUI>(
        map);
    RegisterWebUIControllerInterfaceBinder<
        drive_picker_host_untrusted::mojom::PageHandlerFactory,
        DrivePickerUntrustedHostUI>(map);
  }

#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
  RegisterWebUIControllerInterfaceBinder<
      app_management::mojom::PageHandlerFactory, WebAppSettingsUI>(map);

  RegisterWebUIControllerInterfaceBinder<
      on_device_translation_internals::mojom::PageHandlerFactory,
      OnDeviceTranslationInternalsUI>(map);

  if (syncer::IsReplaceSyncPromosWithSignInPromosEnabled()) {
    RegisterWebUIControllerInterfaceBinder<
        history_sync_optin::mojom::PageHandlerFactory, HistorySyncOptinUI>(map);
  }
  RegisterWebUIControllerInterfaceBinder<
      intro::mojom::SignInCelebrationPageHandlerFactory, IntroUI>(map);
  RegisterWebUIControllerInterfaceBinder<intro::mojom::IntroPageHandlerFactory,
                                         IntroUI>(map);
  RegisterWebUIControllerInterfaceBinder<
      intro::mojom::SignInPromoPageHandlerFactory, IntroUI>(map);
  RegisterWebUIControllerInterfaceBinder<
      intro::mojom::FinishOrContinuePageHandlerFactory, IntroUI>(map);
  RegisterWebUIControllerInterfaceBinder<
      intro::mojom::WelcomePageHandlerFactory, IntroUI>(map);
  RegisterWebUIControllerInterfaceBinder<::app_home::mojom::PageHandlerFactory,
                                         webapps::AppHomeUI>(map);
#endif

#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
  RegisterWebUIControllerInterfaceBinder<updater_ui::mojom::PageHandlerFactory,
                                         UpdaterUI>(map);
#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)

#if BUILDFLAG(IS_MAC)
  RegisterWebUIControllerInterfaceBinder<
      unexportable_keys_internals::mojom::PageHandlerFactory,
      UnexportableKeysInternalsUI>(map);
#endif  // BUILDFLAG(IS_MAC)

#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS)
  auto prompt_surface = default_browser::GetDefaultBrowserPromptSurface();

  if (prompt_surface == default_browser::DefaultBrowserPromptSurface::
                            kModalDialogWithoutSettingsIllustration ||
      prompt_surface == default_browser::DefaultBrowserPromptSurface::
                            kModalDialogWithSettingsIllustration) {
    RegisterWebUIControllerInterfaceBinder<
        default_browser_modal::mojom::PageHandlerFactory,
        DefaultBrowserModalUI>(map);
  }
#endif

#if BUILDFLAG(IS_WIN)
  RegisterWebUIControllerInterfaceBinder<
      visual_guided_setter::mojom::PageHandlerFactory, VisualGuidedSetterUI>(
      map);
#endif

  RegisterWebUIControllerInterfaceBinder<
      feedback::report_unsafe_site::mojom::PageHandlerFactory, FeedbackUI>(map);

  RegisterWebUIControllerInterfaceBinder<
      contextual_cueing_internals::mojom::PageHandler,
      contextual_cueing_internals::ContextualCueingInternalsUI>(map);

  RegisterWebUIControllerInterfaceBinder<
      notebooks_internals::mojom::PageHandlerFactory,
      notebooks::NotebooksInternalsUI>(map);
}

void PopulateChromeWebUIFrameInterfaceBrokersTrustedPartsDesktop(
    content::WebUIBrowserInterfaceBrokerRegistry& registry) {
  // Note: The MetricsReporterService & ColorChangeListener are available to all
  // WebUIs in the registry
  registry.AddGlobal<metrics_reporter::mojom::PageMetricsHost>(
      base::BindRepeating(&BindMetricsReporterService));

  registry.ForWebUI<TabSearchUI>()
      .Add<tab_search::mojom::PageHandlerFactory>()
      .Add<tab_search::mojom::SearchHandler>();

  if (base::FeatureList::IsEnabled(ntp_features::kNtpFooter)) {
    registry.ForWebUI<NewTabFooterUI>()
        .Add<customize_buttons::mojom::CustomizeButtonsHandlerFactory>()
        .Add<new_tab_footer::mojom::NewTabFooterHandlerFactory>()
        .Add<help_bubble::mojom::HelpBubbleHandlerFactory>();
  }

  registry.ForWebUI<NewTabPageThirdPartyUI>()
      .Add<most_visited::mojom::MostVisitedPageHandlerFactory>()
      .Add<new_tab_page_third_party::mojom::PageHandlerFactory>();

  if (base::FeatureList::IsEnabled(
          omnibox::kComposeboxDriveContextMenuOption)) {
    registry.ForWebUI<DrivePickerHostUI>()
        .Add<drive_picker_host::mojom::DrivePickerHostHandler>();
  }

  registry
      .ForWebUI<settings::SettingsUI>()
#if !BUILDFLAG(IS_CHROMEOS)
      .Add<theme_color_picker::mojom::ThemeColorPickerHandlerFactory>()
      .Add<signin::mojom::SigninPageHandlerFactory>()
#endif  // !BUILDFLAG(IS_CHROMEOS)
      .Add<batch_upload_promo::mojom::PageHandlerFactory>()
      .Add<customize_color_scheme_mode::mojom::
               CustomizeColorSchemeModeHandlerFactory>()
      .Add<help_bubble::mojom::HelpBubbleHandlerFactory>();

  if (webui_browser::IsWebUIBrowserEnabled()) {
    registry.ForWebUI<WebUIBrowserUI>()
        .Add<webui_browser::mojom::PageHandlerFactory>()
        .Add<bookmark_bar::mojom::PageHandlerFactory>()
        .Add<bookmarks_api::mojom::BookmarksService>()
        .Add<extensions_bar::mojom::PageHandlerFactory>()
        .Add<searchbox::mojom::PageHandlerFactory>()
        .Add<tabs_api::mojom::TabDragService>()
        .Add<tabs_api::mojom::TabStripService>()
        .Add<tabs_api::mojom::TabStripExperimentService>()
        .Add<tabs_api::mojom::TabStripUIController>();
  }

  if (features::IsWebUIToolbarEnabled() ||
      base::FeatureList::IsEnabled(
          features::kWebUIToolbarProcessOverheadExperiment)) {
    registry.ForWebUI<WebUIToolbarUI>()
        .Add<browser_controls_api::mojom::BrowserControlsService>()
        .Add<toolbar_ui_api::mojom::ToolbarUIService>()
        .Add<help_bubble::mojom::HelpBubbleHandlerFactory>()
        .Add<searchbox::mojom::PageHandlerFactory>();
  }

  // TODO(crbug.com/452983498): Migrate all remaining
  // RegisterWebUIControllerInterfaceBinder calls to registry.ForWebUI().Add()
  // calls.
}

void PopulateChromeWebUIFrameInterfaceBrokersUntrustedPartsDesktop(
    content::WebUIBrowserInterfaceBrokerRegistry& registry) {
  if (lens::features::IsLensOverlayEnabled()) {
    registry.ForWebUI<lens::LensSidePanelUntrustedUI>()
        .Add<lens::mojom::LensSidePanelPageHandlerFactory>()
        .Add<lens::mojom::LensGhostLoaderPageHandlerFactory>()
        .Add<searchbox::mojom::PageHandlerFactory>()
        .Add<help_bubble::mojom::HelpBubbleHandlerFactory>()
        .Add<composebox::mojom::PageHandlerFactory>();
  }
  if (lens::features::IsLensOverlayEnabled()) {
    registry.ForWebUI<lens::LensOverlayUntrustedUI>()
        .Add<lens::mojom::LensPageHandlerFactory>()
        .Add<lens::mojom::LensGhostLoaderPageHandlerFactory>()
        .Add<help_bubble::mojom::HelpBubbleHandlerFactory>()
        .Add<searchbox::mojom::PageHandlerFactory>();
  }
  registry.ForWebUI<ReadAnythingUntrustedUI>()
      .Add<help_bubble::mojom::HelpBubbleHandlerFactory>()
      .Add<user_education::mojom::UserEducationMixedTrustHandlerFactory>();

  if (data_sharing::features::IsDataSharingFunctionalityEnabled()) {
    registry.ForWebUI<DataSharingUI>()
        .Add<data_sharing::mojom::PageHandlerFactory>();
  }

  registry.ForWebUI<NtpMicrosoftAuthUntrustedUI>()
      .Add<new_tab_page::mojom::
               MicrosoftAuthUntrustedDocumentInterfacesFactory>();
  registry.ForWebUI<glic::SelectionOverlayUntrustedUI>()
      .Add<glic::selection::SelectionOverlayPageHandlerFactory>();

  if (base::FeatureList::IsEnabled(
          omnibox::kComposeboxDriveContextMenuOption)) {
    registry.ForWebUI<DrivePickerUntrustedHostUI>()
        .Add<drive_picker_host_untrusted::mojom::PageHandlerFactory>();
  }
}

}  // namespace chrome::internal
