[WebAPKRestore] Move web_app_url_loader to components/webapps/browser

so it can be shared by Android for restoring webapps.

Bug: 41496289
Change-Id: Ia43ec81edebac08e89d44c60e6d4ea0b84ee75a6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5402330
Reviewed-by: Glenn Hartmann <hartmanng@chromium.org>
Reviewed-by: Hidehiko Abe <hidehiko@chromium.org>
Reviewed-by: Adam Rice <ricea@chromium.org>
Reviewed-by: Daniel Murphy <dmurph@chromium.org>
Commit-Queue: Ella Ge <eirage@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1282369}
diff --git a/chrome/browser/ash/app_mode/web_app/web_kiosk_app_service_launcher_unittest.cc b/chrome/browser/ash/app_mode/web_app/web_kiosk_app_service_launcher_unittest.cc
index 98e109c..a795abb 100644
--- a/chrome/browser/ash/app_mode/web_app/web_kiosk_app_service_launcher_unittest.cc
+++ b/chrome/browser/ash/app_mode/web_app/web_kiosk_app_service_launcher_unittest.cc
@@ -35,13 +35,13 @@
 #include "chrome/browser/web_applications/web_app_provider.h"
 #include "chrome/browser/web_applications/web_app_registry_update.h"
 #include "chrome/browser/web_applications/web_app_ui_manager.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chromeos/ash/components/login/login_state/login_state.h"
 #include "components/services/app_service/public/cpp/instance.h"
 #include "components/webapps/browser/install_result_code.h"
 #include "components/webapps/browser/installable/installable_metrics.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "components/webapps/common/web_app_id.h"
 #include "components/webapps/common/web_page_metadata.mojom.h"
 #include "content/public/browser/web_contents.h"
@@ -138,7 +138,7 @@
     auto& install_page_state =
         web_contents_manager().GetOrCreatePageState(install_url);
     install_page_state.url_load_result =
-        web_app::WebAppUrlLoaderResult::kUrlLoaded;
+        webapps::WebAppUrlLoaderResult::kUrlLoaded;
     install_page_state.redirection_url = std::nullopt;
 
     install_page_state.opt_metadata =
diff --git a/chrome/browser/ash/system_web_apps/system_web_app_background_task.cc b/chrome/browser/ash/system_web_apps/system_web_app_background_task.cc
index 70323f0..26c8c8a 100644
--- a/chrome/browser/ash/system_web_apps/system_web_app_background_task.cc
+++ b/chrome/browser/ash/system_web_apps/system_web_app_background_task.cc
@@ -22,7 +22,7 @@
     const SystemWebAppBackgroundTaskInfo& info)
     : profile_(profile),
       web_contents_(nullptr),
-      web_app_url_loader_(std::make_unique<web_app::WebAppUrlLoader>()),
+      web_app_url_loader_(std::make_unique<webapps::WebAppUrlLoader>()),
       timer_(std::make_unique<base::OneShotTimer>()),
       url_(info.url),
       period_(info.period),
@@ -119,15 +119,16 @@
   web_contents_->SetWebPreferences(prefs);
   web_app_url_loader_->LoadUrl(
       url_, web_contents_.get(),
-      web_app::WebAppUrlLoader::UrlComparison::kExact,
+      webapps::WebAppUrlLoader::UrlComparison::kExact,
       base::BindOnce(&SystemWebAppBackgroundTask::OnPageReady,
                      weak_ptr_factory_.GetWeakPtr()));
 }
 
 void SystemWebAppBackgroundTask::OnPageReady(
-    web_app::WebAppUrlLoader::Result result) {
-  if (result == web_app::WebAppUrlLoader::Result::kUrlLoaded)
+    webapps::WebAppUrlLoaderResult result) {
+  if (result == webapps::WebAppUrlLoaderResult::kUrlLoaded) {
     opened_count_++;
+  }
 }
 
 }  // namespace ash
diff --git a/chrome/browser/ash/system_web_apps/system_web_app_background_task.h b/chrome/browser/ash/system_web_apps/system_web_app_background_task.h
index d440c39..dce1075 100644
--- a/chrome/browser/ash/system_web_apps/system_web_app_background_task.h
+++ b/chrome/browser/ash/system_web_apps/system_web_app_background_task.h
@@ -18,8 +18,8 @@
 #include "base/timer/timer.h"
 #include "chrome/browser/ash/system_web_apps/types/system_web_app_background_task_info.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "components/prefs/pref_change_registrar.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_contents_delegate.h"
 
@@ -85,13 +85,13 @@
     return polling_since_time_;
   }
 
-  web_app::WebAppUrlLoader* UrlLoaderForTesting() {
+  webapps::WebAppUrlLoader* UrlLoaderForTesting() {
     return web_app_url_loader_.get();
   }
 
   // Set the url loader for testing. Takes ownership of the argument.
   void SetUrlLoaderForTesting(
-      std::unique_ptr<web_app::WebAppUrlLoader> loader) {
+      std::unique_ptr<webapps::WebAppUrlLoader> loader) {
     web_app_url_loader_ = std::move(loader);
   }
 
@@ -115,14 +115,14 @@
   void MaybeOpenPage();
 
   void NavigateBackgroundPage();
-  void OnPageReady(web_app::WebAppUrlLoader::Result);
+  void OnPageReady(webapps::WebAppUrlLoaderResult);
 
   void CloseWebContents(content::WebContents* contents);
 
   raw_ptr<Profile> profile_;
   SystemWebAppType app_type_;
   std::unique_ptr<content::WebContents> web_contents_;
-  std::unique_ptr<web_app::WebAppUrlLoader> web_app_url_loader_;
+  std::unique_ptr<webapps::WebAppUrlLoader> web_app_url_loader_;
   std::unique_ptr<base::OneShotTimer> timer_;
   TimerState state_;
   GURL url_;
diff --git a/chrome/browser/ash/system_web_apps/system_web_app_manager_unittest.cc b/chrome/browser/ash/system_web_apps/system_web_app_manager_unittest.cc
index dd55452..82fa77139 100644
--- a/chrome/browser/ash/system_web_apps/system_web_app_manager_unittest.cc
+++ b/chrome/browser/ash/system_web_apps/system_web_app_manager_unittest.cc
@@ -1235,7 +1235,7 @@
   web_app::TestWebAppUrlLoader* loader = url_loader.get();
   timers[0]->SetUrlLoaderForTesting(std::move(url_loader));
   loader->SetNextLoadUrlResult(AppUrl1(),
-                               web_app::WebAppUrlLoader::Result::kUrlLoaded);
+                               webapps::WebAppUrlLoaderResult::kUrlLoaded);
 
   EXPECT_EQ(base::Seconds(60), timers[0]->period_for_testing());
   base::RunLoop().RunUntilIdle();
@@ -1251,7 +1251,7 @@
   EXPECT_EQ(1u, timers[0]->opened_count_for_testing());
 
   loader->SetNextLoadUrlResult(AppUrl1(),
-                               web_app::WebAppUrlLoader::Result::kUrlLoaded);
+                               webapps::WebAppUrlLoaderResult::kUrlLoaded);
 
   EXPECT_EQ(SystemWebAppBackgroundTask::WAIT_PERIOD,
             timers[0]->get_state_for_testing());
@@ -1262,7 +1262,7 @@
   EXPECT_EQ(2u, timers[0]->opened_count_for_testing());
 
   loader->SetNextLoadUrlResult(
-      AppUrl1(), web_app::WebAppUrlLoader::Result::kFailedUnknownReason);
+      AppUrl1(), webapps::WebAppUrlLoaderResult::kFailedUnknownReason);
 
   task_environment()->FastForwardBy(base::Seconds(61));
 
@@ -1289,7 +1289,7 @@
         loader = url_loader.get();
         timers[0]->SetUrlLoaderForTesting(std::move(url_loader));
         loader->SetNextLoadUrlResult(
-            AppUrl1(), web_app::WebAppUrlLoader::Result::kUrlLoaded);
+            AppUrl1(), webapps::WebAppUrlLoaderResult::kUrlLoaded);
       }));
   system_web_app_manager().Start();
   waiter.Wait();
@@ -1307,7 +1307,7 @@
             timers[0]->get_state_for_testing());
 
   loader->SetNextLoadUrlResult(AppUrl1(),
-                               web_app::WebAppUrlLoader::Result::kUrlLoaded);
+                               webapps::WebAppUrlLoaderResult::kUrlLoaded);
 
   task_environment()->FastForwardBy(base::Seconds(300));
 
@@ -1332,7 +1332,7 @@
         loader = url_loader.get();
         timers[0]->SetUrlLoaderForTesting(std::move(url_loader));
         loader->SetNextLoadUrlResult(
-            AppUrl1(), web_app::WebAppUrlLoader::Result::kUrlLoaded);
+            AppUrl1(), webapps::WebAppUrlLoaderResult::kUrlLoaded);
       }));
   system_web_app_manager().Start();
   waiter.Wait();
@@ -1354,7 +1354,7 @@
             timers[0]->get_state_for_testing());
 
   loader->SetNextLoadUrlResult(AppUrl1(),
-                               web_app::WebAppUrlLoader::Result::kUrlLoaded);
+                               webapps::WebAppUrlLoaderResult::kUrlLoaded);
 
   task_environment()->FastForwardBy(base::Seconds(300));
 
@@ -1380,7 +1380,7 @@
         loader = url_loader.get();
         timers[0]->SetUrlLoaderForTesting(std::move(url_loader));
         loader->SetNextLoadUrlResult(
-            AppUrl1(), web_app::WebAppUrlLoader::Result::kUrlLoaded);
+            AppUrl1(), webapps::WebAppUrlLoaderResult::kUrlLoaded);
       }));
   system_web_app_manager().Start();
   waiter.Wait();
@@ -1410,7 +1410,7 @@
     EXPECT_EQ(1u, timers[0]->opened_count_for_testing());
     EXPECT_EQ(base::Time(), timers[0]->polling_since_time_for_testing());
     loader->SetNextLoadUrlResult(AppUrl1(),
-                                 web_app::WebAppUrlLoader::Result::kUrlLoaded);
+                                 webapps::WebAppUrlLoaderResult::kUrlLoaded);
     task_environment()->FastForwardBy(base::Seconds(300));
 
     EXPECT_EQ(2u, timers[0]->timer_activated_count_for_testing());
@@ -1419,7 +1419,7 @@
   {
     ui::ScopedSetIdleState scoped_locked(ui::IDLE_STATE_LOCKED);
     loader->SetNextLoadUrlResult(AppUrl1(),
-                                 web_app::WebAppUrlLoader::Result::kUrlLoaded);
+                                 webapps::WebAppUrlLoaderResult::kUrlLoaded);
     task_environment()->FastForwardBy(base::Seconds(300));
     EXPECT_EQ(SystemWebAppBackgroundTask::WAIT_PERIOD,
               timers[0]->get_state_for_testing());
@@ -1446,7 +1446,7 @@
         loader = url_loader.get();
         timers[0]->SetUrlLoaderForTesting(std::move(url_loader));
         loader->SetNextLoadUrlResult(
-            AppUrl1(), web_app::WebAppUrlLoader::Result::kUrlLoaded);
+            AppUrl1(), webapps::WebAppUrlLoaderResult::kUrlLoaded);
       }));
   system_web_app_manager().Start();
   waiter.Wait();
@@ -1483,7 +1483,7 @@
   EXPECT_EQ(1u, timers[0]->opened_count_for_testing());
 
   loader->SetNextLoadUrlResult(AppUrl1(),
-                               web_app::WebAppUrlLoader::Result::kUrlLoaded);
+                               webapps::WebAppUrlLoaderResult::kUrlLoaded);
 }
 
 TEST_F(SystemWebAppManagerTest,
diff --git a/chrome/browser/lacros/app_mode/web_kiosk_installer_lacros_unittest.cc b/chrome/browser/lacros/app_mode/web_kiosk_installer_lacros_unittest.cc
index 12263d4..6effcf9 100644
--- a/chrome/browser/lacros/app_mode/web_kiosk_installer_lacros_unittest.cc
+++ b/chrome/browser/lacros/app_mode/web_kiosk_installer_lacros_unittest.cc
@@ -15,12 +15,12 @@
 #include "chrome/browser/web_applications/test/fake_web_contents_manager.h"
 #include "chrome/browser/web_applications/test/web_app_install_test_utils.h"
 #include "chrome/browser/web_applications/web_app_helpers.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chrome/test/base/testing_profile_manager.h"
 #include "chromeos/crosapi/mojom/web_kiosk_service.mojom.h"
 #include "chromeos/lacros/lacros_service.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "components/webapps/common/web_app_id.h"
 #include "components/webapps/common/web_page_metadata.mojom.h"
 #include "content/public/test/browser_task_environment.h"
@@ -131,7 +131,7 @@
     auto& install_page_state =
         web_contents_manager().GetOrCreatePageState(install_url);
     install_page_state.url_load_result =
-        web_app::WebAppUrlLoaderResult::kUrlLoaded;
+        webapps::WebAppUrlLoaderResult::kUrlLoaded;
     install_page_state.redirection_url = std::nullopt;
 
     install_page_state.opt_metadata =
diff --git a/chrome/browser/ui/views/web_apps/isolated_web_apps/isolated_web_app_installer_view_controller_unittest.cc b/chrome/browser/ui/views/web_apps/isolated_web_apps/isolated_web_app_installer_view_controller_unittest.cc
index 36c4300..3eca657 100644
--- a/chrome/browser/ui/views/web_apps/isolated_web_apps/isolated_web_app_installer_view_controller_unittest.cc
+++ b/chrome/browser/ui/views/web_apps/isolated_web_apps/isolated_web_app_installer_view_controller_unittest.cc
@@ -258,7 +258,7 @@
                       "/.well-known/_generated_install_page.html"}));
     auto& page_state = fake_web_contents_manager.GetOrCreatePageState(url);
 
-    page_state.url_load_result = WebAppUrlLoaderResult::kUrlLoaded;
+    page_state.url_load_result = webapps::WebAppUrlLoaderResult::kUrlLoaded;
     page_state.error_code = webapps::InstallableStatusCode::NO_ERROR_DETECTED;
     page_state.manifest_url = iwa_url.Resolve("manifest.webmanifest");
     page_state.valid_manifest_for_web_app = true;
diff --git a/chrome/browser/ui/web_applications/web_app_profile_deletion_browsertest.cc b/chrome/browser/ui/web_applications/web_app_profile_deletion_browsertest.cc
index 42e2194..bb6e30f 100644
--- a/chrome/browser/ui/web_applications/web_app_profile_deletion_browsertest.cc
+++ b/chrome/browser/ui/web_applications/web_app_profile_deletion_browsertest.cc
@@ -26,10 +26,10 @@
 #include "chrome/browser/web_applications/web_app_registrar.h"
 #include "chrome/browser/web_applications/web_contents/web_app_data_retriever.h"
 #include "chrome/browser/web_applications/web_contents/web_app_icon_downloader.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/test/base/profile_destruction_waiter.h"
 #include "components/user_manager/user_manager.h"
 #include "components/webapps/browser/installable/installable_logging.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "components/webapps/common/web_app_id.h"
 #include "content/public/test/browser_test.h"
 #include "third_party/blink/public/mojom/manifest/manifest.mojom.h"
@@ -271,20 +271,20 @@
 IN_PROC_BROWSER_TEST_F(WebAppProfileDeletionTest_WebContentsGracefulShutdown,
                        UrlLoading) {
   ASSERT_TRUE(embedded_test_server()->Start());
-  WebAppUrlLoader loader;
+  webapps::WebAppUrlLoader loader;
 
   std::unique_ptr<content::WebContents> deleting_web_contents =
       CreateWebContentsScheduledForDeletion();
 
-  base::test::TestFuture<WebAppUrlLoaderResult> loader_result;
+  base::test::TestFuture<webapps::WebAppUrlLoaderResult> loader_result;
   loader.LoadUrl(embedded_test_server()->GetURL("/title1.html"),
                  deleting_web_contents.get(),
-                 WebAppUrlLoader::UrlComparison::kExact,
+                 webapps::WebAppUrlLoader::UrlComparison::kExact,
                  loader_result.GetCallback());
   EXPECT_TRUE(loader_result.Wait());
 
-  EXPECT_EQ(loader_result.Get<WebAppUrlLoaderResult>(),
-            WebAppUrlLoaderResult::kFailedWebContentsDestroyed);
+  EXPECT_EQ(loader_result.Get<webapps::WebAppUrlLoaderResult>(),
+            webapps::WebAppUrlLoaderResult::kFailedWebContentsDestroyed);
 }
 
 IN_PROC_BROWSER_TEST_F(WebAppProfileDeletionTest_WebContentsGracefulShutdown,
diff --git a/chrome/browser/web_applications/BUILD.gn b/chrome/browser/web_applications/BUILD.gn
index c817e7d..51cedac 100644
--- a/chrome/browser/web_applications/BUILD.gn
+++ b/chrome/browser/web_applications/BUILD.gn
@@ -335,8 +335,6 @@
     "web_contents/web_app_data_retriever.h",
     "web_contents/web_app_icon_downloader.cc",
     "web_contents/web_app_icon_downloader.h",
-    "web_contents/web_app_url_loader.cc",
-    "web_contents/web_app_url_loader.h",
     "web_contents/web_contents_manager.cc",
     "web_contents/web_contents_manager.h",
   ]
@@ -862,7 +860,6 @@
     "web_app_utils_unittest.cc",
     "web_contents/web_app_data_retriever_unittest.cc",
     "web_contents/web_app_icon_downloader_unittest.cc",
-    "web_contents/web_app_url_loader_unittest.cc",
   ]
 
   if (is_win) {
@@ -1031,7 +1028,6 @@
     "web_app_internals_browsertest.cc",
     "web_app_origin_association_manager_browsertest.cc",
     "web_app_scope_extensions_browsertest.cc",
-    "web_contents/web_app_url_loader_browsertest.cc",
   ]
 
   if (is_chromeos) {
diff --git a/chrome/browser/web_applications/commands/external_app_resolution_command.cc b/chrome/browser/web_applications/commands/external_app_resolution_command.cc
index f7129fe..11f6e7e 100644
--- a/chrome/browser/web_applications/commands/external_app_resolution_command.cc
+++ b/chrome/browser/web_applications/commands/external_app_resolution_command.cc
@@ -40,12 +40,12 @@
 #include "chrome/browser/web_applications/web_app_registrar.h"
 #include "chrome/browser/web_applications/web_app_ui_manager.h"
 #include "chrome/browser/web_applications/web_contents/web_app_data_retriever.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/browser/web_applications/web_contents/web_contents_manager.h"
 #include "chrome/common/chrome_features.h"
 #include "components/services/app_service/public/cpp/app_launch_util.h"
 #include "components/webapps/browser/install_result_code.h"
 #include "components/webapps/browser/uninstall_result_code.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "components/webapps/common/web_app_id.h"
 #include "content/public/browser/web_contents.h"
 
@@ -118,7 +118,7 @@
 
   url_loader_->LoadUrl(
       install_options_.install_url, web_contents_.get(),
-      WebAppUrlLoader::UrlComparison::kSameOrigin,
+      webapps::WebAppUrlLoader::UrlComparison::kSameOrigin,
       base::BindOnce(
           &ExternalAppResolutionCommand::OnUrlLoadedAndBranchInstallation,
           weak_ptr_factory_.GetWeakPtr()));
@@ -140,8 +140,8 @@
 }
 
 void ExternalAppResolutionCommand::OnUrlLoadedAndBranchInstallation(
-    WebAppUrlLoader::Result result) {
-  if (result == WebAppUrlLoader::Result::kUrlLoaded) {
+    webapps::WebAppUrlLoaderResult result) {
+  if (result == webapps::WebAppUrlLoaderResult::kUrlLoaded) {
     data_retriever_->GetWebAppInstallInfo(
         web_contents_.get(),
         base::BindOnce(
@@ -180,7 +180,7 @@
 
   // Avoid counting an error if we are shutting down. This matches later
   // stages of install where if the WebContents is destroyed we return early.
-  if (result == WebAppUrlLoader::Result::kFailedWebContentsDestroyed) {
+  if (result == webapps::WebAppUrlLoaderResult::kFailedWebContentsDestroyed) {
     Abort(webapps::InstallResultCode::kWebContentsDestroyed);
     return;
   }
@@ -189,21 +189,21 @@
       webapps::InstallResultCode::kInstallURLLoadFailed;
 
   switch (result) {
-    case WebAppUrlLoader::Result::kUrlLoaded:
-    case WebAppUrlLoader::Result::kFailedWebContentsDestroyed:
+    case webapps::WebAppUrlLoaderResult::kUrlLoaded:
+    case webapps::WebAppUrlLoaderResult::kFailedWebContentsDestroyed:
       // Handled above.
       NOTREACHED();
       break;
-    case WebAppUrlLoader::Result::kRedirectedUrlLoaded:
+    case webapps::WebAppUrlLoaderResult::kRedirectedUrlLoaded:
       code = webapps::InstallResultCode::kInstallURLRedirected;
       break;
-    case WebAppUrlLoader::Result::kFailedUnknownReason:
+    case webapps::WebAppUrlLoaderResult::kFailedUnknownReason:
       code = webapps::InstallResultCode::kInstallURLLoadFailed;
       break;
-    case WebAppUrlLoader::Result::kFailedPageTookTooLong:
+    case webapps::WebAppUrlLoaderResult::kFailedPageTookTooLong:
       code = webapps::InstallResultCode::kInstallURLLoadTimeOut;
       break;
-    case WebAppUrlLoader::Result::kFailedErrorPageLoaded:
+    case webapps::WebAppUrlLoaderResult::kFailedErrorPageLoaded:
       code = webapps::InstallResultCode::kInstallURLLoadFailed;
       break;
   }
@@ -297,7 +297,7 @@
     const GURL kAboutBlankURL = GURL(url::kAboutBlankURL);
     url_loader_->LoadUrl(
         kAboutBlankURL, web_contents_.get(),
-        WebAppUrlLoader::UrlComparison::kExact,
+        webapps::WebAppUrlLoader::UrlComparison::kExact,
         base::BindOnce(
             &ExternalAppResolutionCommand::OnPreparedForIconRetrieving,
             weak_ptr_factory_.GetWeakPtr(), std::move(icon_urls),
@@ -305,13 +305,13 @@
     return;
   }
   OnPreparedForIconRetrieving(std::move(icon_urls), skip_page_favicons,
-                              WebAppUrlLoaderResult::kUrlLoaded);
+                              webapps::WebAppUrlLoaderResult::kUrlLoaded);
 }
 
 void ExternalAppResolutionCommand::OnPreparedForIconRetrieving(
     IconUrlSizeSet icon_urls,
     bool skip_page_favicons,
-    WebAppUrlLoaderResult result) {
+    webapps::WebAppUrlLoaderResult result) {
   data_retriever_->GetIcons(
       web_contents_.get(), std::move(icon_urls), skip_page_favicons,
       /*fail_all_if_any_fail=*/false,
diff --git a/chrome/browser/web_applications/commands/external_app_resolution_command.h b/chrome/browser/web_applications/commands/external_app_resolution_command.h
index 18b6d4e..547d4ec 100644
--- a/chrome/browser/web_applications/commands/external_app_resolution_command.h
+++ b/chrome/browser/web_applications/commands/external_app_resolution_command.h
@@ -25,7 +25,6 @@
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "chrome/browser/web_applications/web_app_install_utils.h"
 #include "chrome/browser/web_applications/web_app_logging.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "components/services/app_service/public/cpp/app_launch_util.h"
 #include "components/webapps/browser/installable/installable_logging.h"
 #include "components/webapps/browser/installable/installable_metrics.h"
@@ -39,6 +38,11 @@
 class WebContents;
 }
 
+namespace webapps {
+class WebAppUrlLoader;
+enum class WebAppUrlLoaderResult;
+}  // namespace webapps
+
 namespace web_app {
 
 class InstallPlaceholderJob;
@@ -86,7 +90,7 @@
   // agent got redirected to a different origin and a placeholder installation
   // is configured as fallback).
   // * offline installation from install info (in all other cases).
-  void OnUrlLoadedAndBranchInstallation(WebAppUrlLoader::Result result);
+  void OnUrlLoadedAndBranchInstallation(webapps::WebAppUrlLoaderResult result);
 
   // Regular installation path:
   void OnGetWebAppInstallInfoInCommand(
@@ -97,7 +101,7 @@
                                     webapps::InstallableStatusCode error_code);
   void OnPreparedForIconRetrieving(IconUrlSizeSet icon_urls,
                                    bool skip_page_favicons,
-                                   WebAppUrlLoaderResult result);
+                                   webapps::WebAppUrlLoaderResult result);
   void OnIconsRetrievedUpgradeLockDescription(
       IconsDownloadedResult result,
       IconsMap icons_map,
@@ -162,7 +166,7 @@
   raw_ref<Profile> profile_;
 
   raw_ptr<content::WebContents> web_contents_ = nullptr;
-  std::unique_ptr<WebAppUrlLoader> url_loader_;
+  std::unique_ptr<webapps::WebAppUrlLoader> url_loader_;
   std::unique_ptr<WebAppDataRetriever> data_retriever_;
   std::unique_ptr<WebAppInstallInfo> web_app_info_;
 
diff --git a/chrome/browser/web_applications/commands/external_app_resolution_command_unittest.cc b/chrome/browser/web_applications/commands/external_app_resolution_command_unittest.cc
index d47d82d0..59e1d4e 100644
--- a/chrome/browser/web_applications/commands/external_app_resolution_command_unittest.cc
+++ b/chrome/browser/web_applications/commands/external_app_resolution_command_unittest.cc
@@ -37,11 +37,11 @@
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "chrome/browser/web_applications/web_app_install_utils.h"
 #include "chrome/browser/web_applications/web_contents/web_app_data_retriever.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/browser/web_applications/web_contents/web_contents_manager.h"
 #include "components/services/app_service/public/cpp/icon_info.h"
 #include "components/webapps/browser/install_result_code.h"
 #include "components/webapps/browser/installable/installable_logging.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "components/webapps/common/web_app_id.h"
 #include "net/http/http_status_code.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -56,7 +56,8 @@
 
 struct PageStateOptions {
   bool empty_web_app_info = false;
-  WebAppUrlLoaderResult url_load_result = WebAppUrlLoaderResult::kUrlLoaded;
+  webapps::WebAppUrlLoaderResult url_load_result =
+      webapps::WebAppUrlLoaderResult::kUrlLoaded;
   std::optional<GURL> manifest_id;
 };
 
@@ -339,9 +340,9 @@
       ExternalInstallSource::kExternalPolicy);
   install_options.install_placeholder = true;
 
-  SetPageState(
-      install_options,
-      {.url_load_result = WebAppUrlLoaderResult::kRedirectedUrlLoaded});
+  SetPageState(install_options,
+               {.url_load_result =
+                    webapps::WebAppUrlLoaderResult::kRedirectedUrlLoaded});
 
   auto result = InstallAndWait(install_options);
 
@@ -374,8 +375,9 @@
 
   // Install a placeholder app.
   {
-    SetPageState(options, {.url_load_result =
-                               WebAppUrlLoaderResult::kRedirectedUrlLoaded});
+    SetPageState(options,
+                 {.url_load_result =
+                      webapps::WebAppUrlLoaderResult::kRedirectedUrlLoaded});
 
     auto result = InstallAndWait(options);
 
@@ -390,8 +392,9 @@
   }
 
   // Try to install it again.
-  SetPageState(options, {.url_load_result =
-                             WebAppUrlLoaderResult::kRedirectedUrlLoaded});
+  SetPageState(options,
+               {.url_load_result =
+                    webapps::WebAppUrlLoaderResult::kRedirectedUrlLoaded});
   auto data_retriever = std::make_unique<FakeDataRetriever>();
   data_retriever->BuildDefaultDataToRetrieve(kWebAppUrl, kWebAppScope);
 
@@ -417,8 +420,9 @@
 
   // Install a placeholder app.
   {
-    SetPageState(options, {.url_load_result =
-                               WebAppUrlLoaderResult::kRedirectedUrlLoaded});
+    SetPageState(options,
+                 {.url_load_result =
+                      webapps::WebAppUrlLoaderResult::kRedirectedUrlLoaded});
 
     auto result = InstallAndWait(options);
 
@@ -468,8 +472,9 @@
 
   // Install a placeholder app.
   {
-    SetPageState(options, {.url_load_result =
-                               WebAppUrlLoaderResult::kRedirectedUrlLoaded});
+    SetPageState(options,
+                 {.url_load_result =
+                      webapps::WebAppUrlLoaderResult::kRedirectedUrlLoaded});
 
     auto result = InstallAndWait(options);
 
@@ -538,8 +543,9 @@
 
   // Install a placeholder app.
   {
-    SetPageState(options, {.url_load_result =
-                               WebAppUrlLoaderResult::kRedirectedUrlLoaded});
+    SetPageState(options,
+                 {.url_load_result =
+                      webapps::WebAppUrlLoaderResult::kRedirectedUrlLoaded});
 
     auto result = InstallAndWait(options);
 
@@ -600,8 +606,9 @@
     webapps::AppId expected_app_id =
         GenerateAppId(/*manifest_id_path=*/std::nullopt, kWebAppUrl);
 
-    SetPageState(options, {.url_load_result =
-                               WebAppUrlLoaderResult::kRedirectedUrlLoaded});
+    SetPageState(options,
+                 {.url_load_result =
+                      webapps::WebAppUrlLoaderResult::kRedirectedUrlLoaded});
 
     auto result = InstallAndWait(options);
 
@@ -648,8 +655,9 @@
                                  ExternalInstallSource::kExternalPolicy);
   options.install_placeholder = true;
   options.override_name = kCustomName;
-  SetPageState(options, {.url_load_result =
-                             WebAppUrlLoaderResult::kRedirectedUrlLoaded});
+  SetPageState(options,
+               {.url_load_result =
+                    webapps::WebAppUrlLoaderResult::kRedirectedUrlLoaded});
 
   auto result = InstallAndWait(options);
 
@@ -696,13 +704,13 @@
 TEST_F(ExternalAppResolutionCommandTest, InstallURLLoadFailed) {
   const GURL kWebAppUrl("https://foo.example");
   struct ResultPair {
-    WebAppUrlLoader::Result loader_result;
+    webapps::WebAppUrlLoaderResult loader_result;
     webapps::InstallResultCode install_result;
-  } result_pairs[] = {{WebAppUrlLoader::Result::kRedirectedUrlLoaded,
+  } result_pairs[] = {{webapps::WebAppUrlLoaderResult::kRedirectedUrlLoaded,
                        webapps::InstallResultCode::kInstallURLRedirected},
-                      {WebAppUrlLoader::Result::kFailedUnknownReason,
+                      {webapps::WebAppUrlLoaderResult::kFailedUnknownReason,
                        webapps::InstallResultCode::kInstallURLLoadFailed},
-                      {WebAppUrlLoader::Result::kFailedPageTookTooLong,
+                      {webapps::WebAppUrlLoaderResult::kFailedPageTookTooLong,
                        webapps::InstallResultCode::kInstallURLLoadTimeOut}};
 
   for (const auto& result_pair : result_pairs) {
diff --git a/chrome/browser/web_applications/commands/fetch_install_info_from_install_url_command.cc b/chrome/browser/web_applications/commands/fetch_install_info_from_install_url_command.cc
index 35475f9..a67a68e 100644
--- a/chrome/browser/web_applications/commands/fetch_install_info_from_install_url_command.cc
+++ b/chrome/browser/web_applications/commands/fetch_install_info_from_install_url_command.cc
@@ -16,9 +16,9 @@
 #include "chrome/browser/web_applications/web_app_icon_operations.h"
 #include "chrome/browser/web_applications/web_app_install_utils.h"
 #include "chrome/browser/web_applications/web_contents/web_app_data_retriever.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/browser/web_applications/web_contents/web_contents_manager.h"
 #include "chrome/common/chrome_features.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "content/public/browser/web_contents.h"
 #include "url/origin.h"
 
@@ -113,19 +113,21 @@
     return;
   }
 
-  url_loader_->LoadUrl(install_url_, &lock_->shared_web_contents(),
-                       WebAppUrlLoader::UrlComparison::kIgnoreQueryParamsAndRef,
-                       base::BindOnce(&FetchInstallInfoFromInstallUrlCommand::
-                                          OnWebAppUrlLoadedGetWebAppInstallInfo,
-                                      weak_ptr_factory_.GetWeakPtr()));
+  url_loader_->LoadUrl(
+      install_url_, &lock_->shared_web_contents(),
+      webapps::WebAppUrlLoader::UrlComparison::kIgnoreQueryParamsAndRef,
+      base::BindOnce(&FetchInstallInfoFromInstallUrlCommand::
+                         OnWebAppUrlLoadedGetWebAppInstallInfo,
+                     weak_ptr_factory_.GetWeakPtr()));
 }
 
 void FetchInstallInfoFromInstallUrlCommand::
-    OnWebAppUrlLoadedGetWebAppInstallInfo(WebAppUrlLoader::Result result) {
+    OnWebAppUrlLoadedGetWebAppInstallInfo(
+        webapps::WebAppUrlLoaderResult result) {
   GetMutableDebugValue().Set("url_loading_result",
                              ConvertUrlLoaderResultToString(result));
 
-  if (result != WebAppUrlLoader::Result::kUrlLoaded) {
+  if (result != webapps::WebAppUrlLoaderResult::kUrlLoaded) {
     install_error_log_entry_.LogUrlLoaderError(
         "OnWebAppUrlLoadedGetWebAppInstallInfo", install_url_.spec(), result);
     CompleteCommandAndSelfDestruct(FetchInstallInfoResult::kUrlLoadingFailure,
diff --git a/chrome/browser/web_applications/commands/fetch_install_info_from_install_url_command.h b/chrome/browser/web_applications/commands/fetch_install_info_from_install_url_command.h
index a188c88..42044f7 100644
--- a/chrome/browser/web_applications/commands/fetch_install_info_from_install_url_command.h
+++ b/chrome/browser/web_applications/commands/fetch_install_info_from_install_url_command.h
@@ -13,9 +13,12 @@
 #include "chrome/browser/web_applications/web_app_logging.h"
 #include "components/webapps/browser/installable/installable_logging.h"
 
+namespace webapps {
+class WebAppUrlLoader;
+}
+
 namespace web_app {
 
-class WebAppUrlLoader;
 class WebAppDataRetriever;
 
 enum class FetchInstallInfoResult {
@@ -53,7 +56,8 @@
 
  private:
   bool IsWebContentsDestroyed();
-  void OnWebAppUrlLoadedGetWebAppInstallInfo(WebAppUrlLoader::Result result);
+  void OnWebAppUrlLoadedGetWebAppInstallInfo(
+      webapps::WebAppUrlLoaderResult result);
   void OnGetWebAppInstallInfo(std::unique_ptr<WebAppInstallInfo> install_info);
   void OnManifestRetrieved(std::unique_ptr<WebAppInstallInfo> web_app_info,
                            blink::mojom::ManifestPtr opt_manifest,
@@ -74,7 +78,7 @@
   GURL install_url_;
   std::optional<webapps::ManifestId> parent_manifest_id_;
 
-  std::unique_ptr<WebAppUrlLoader> url_loader_;
+  std::unique_ptr<webapps::WebAppUrlLoader> url_loader_;
   std::unique_ptr<WebAppDataRetriever> data_retriever_;
 
   InstallErrorLogEntry install_error_log_entry_;
diff --git a/chrome/browser/web_applications/commands/fetch_install_info_from_install_url_command_unittest.cc b/chrome/browser/web_applications/commands/fetch_install_info_from_install_url_command_unittest.cc
index 0588092..66a5b24 100644
--- a/chrome/browser/web_applications/commands/fetch_install_info_from_install_url_command_unittest.cc
+++ b/chrome/browser/web_applications/commands/fetch_install_info_from_install_url_command_unittest.cc
@@ -45,8 +45,8 @@
       std::optional<webapps::ManifestId> parent_manifest_id,
       bool disable_web_app_info = false,
       bool valid_manifest = true,
-      WebAppUrlLoader::Result url_load_result =
-          WebAppUrlLoader::Result::kUrlLoaded) {
+      webapps::WebAppUrlLoaderResult url_load_result =
+          webapps::WebAppUrlLoaderResult::kUrlLoaded) {
     auto& install_page_state =
         web_contents_manager().GetOrCreatePageState(install_url);
     install_page_state.url_load_result = url_load_result;
@@ -139,7 +139,7 @@
   std::unique_ptr<WebAppInstallInfo> command_result = CreateAndRunCommand(
       app_url(), manifest_id(), parent_manifest_id(),
       /*disable_web_app_info=*/false, /*valid_manifest=*/true,
-      WebAppUrlLoader::Result::kRedirectedUrlLoaded);
+      webapps::WebAppUrlLoaderResult::kRedirectedUrlLoaded);
   EXPECT_FALSE(command_result);
   EXPECT_EQ(GetCommandErrorFromLog(), "kUrlLoadingFailure");
 }
diff --git a/chrome/browser/web_applications/commands/fetch_installability_for_chrome_management.cc b/chrome/browser/web_applications/commands/fetch_installability_for_chrome_management.cc
index 8cbd4a8..b0031dcb 100644
--- a/chrome/browser/web_applications/commands/fetch_installability_for_chrome_management.cc
+++ b/chrome/browser/web_applications/commands/fetch_installability_for_chrome_management.cc
@@ -18,8 +18,8 @@
 #include "chrome/browser/web_applications/web_app_command_manager.h"
 #include "chrome/browser/web_applications/web_app_helpers.h"
 #include "chrome/browser/web_applications/web_contents/web_app_data_retriever.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "components/webapps/browser/installable/installable_logging.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "components/webapps/common/web_app_id.h"
 #include "content/public/browser/web_contents.h"
 #include "url/gurl.h"
@@ -29,7 +29,7 @@
 FetchInstallabilityForChromeManagement::FetchInstallabilityForChromeManagement(
     const GURL& url,
     base::WeakPtr<content::WebContents> web_contents,
-    std::unique_ptr<WebAppUrlLoader> url_loader,
+    std::unique_ptr<webapps::WebAppUrlLoader> url_loader,
     std::unique_ptr<WebAppDataRetriever> data_retriever,
     FetchInstallabilityForChromeManagementCallback callback)
     : WebAppCommand<NoopLock,
@@ -67,15 +67,16 @@
     return;
   }
 
-  url_loader_->LoadUrl(url_, web_contents_.get(),
-                       WebAppUrlLoader::UrlComparison::kIgnoreQueryParamsAndRef,
-                       base::BindOnce(&FetchInstallabilityForChromeManagement::
-                                          OnUrlLoadedCheckInstallability,
-                                      weak_factory_.GetWeakPtr()));
+  url_loader_->LoadUrl(
+      url_, web_contents_.get(),
+      webapps::WebAppUrlLoader::UrlComparison::kIgnoreQueryParamsAndRef,
+      base::BindOnce(&FetchInstallabilityForChromeManagement::
+                         OnUrlLoadedCheckInstallability,
+                     weak_factory_.GetWeakPtr()));
 }
 
 void FetchInstallabilityForChromeManagement::OnUrlLoadedCheckInstallability(
-    WebAppUrlLoader::Result result) {
+    webapps::WebAppUrlLoaderResult result) {
   if (IsWebContentsDestroyed()) {
     GetMutableDebugValue().Set("web_contents_destroyed", true);
     CompleteAndSelfDestruct(CommandResult::kSuccess,
@@ -86,21 +87,21 @@
   GetMutableDebugValue().Set("WebAppUrlLoader::Result",
                              ConvertUrlLoaderResultToString(result));
 
-  if (result == WebAppUrlLoader::Result::kRedirectedUrlLoaded) {
+  if (result == webapps::WebAppUrlLoaderResult::kRedirectedUrlLoaded) {
     CompleteAndSelfDestruct(CommandResult::kSuccess,
                             InstallableCheckResult::kNotInstallable,
                             std::nullopt);
     return;
   }
 
-  if (result == WebAppUrlLoader::Result::kFailedPageTookTooLong) {
+  if (result == webapps::WebAppUrlLoaderResult::kFailedPageTookTooLong) {
     CompleteAndSelfDestruct(CommandResult::kSuccess,
                             InstallableCheckResult::kNotInstallable,
                             std::nullopt);
     return;
   }
 
-  if (result != WebAppUrlLoader::Result::kUrlLoaded) {
+  if (result != webapps::WebAppUrlLoaderResult::kUrlLoaded) {
     CompleteAndSelfDestruct(CommandResult::kFailure,
                             InstallableCheckResult::kNotInstallable,
                             std::nullopt);
diff --git a/chrome/browser/web_applications/commands/fetch_installability_for_chrome_management.h b/chrome/browser/web_applications/commands/fetch_installability_for_chrome_management.h
index 64e1a49..9c7f24404 100644
--- a/chrome/browser/web_applications/commands/fetch_installability_for_chrome_management.h
+++ b/chrome/browser/web_applications/commands/fetch_installability_for_chrome_management.h
@@ -22,13 +22,15 @@
 class WebContents;
 }
 
+namespace webapps {
+class WebAppUrlLoader;
+enum class WebAppUrlLoaderResult;
+}  // namespace webapps
+
 namespace web_app {
 
 class AppLock;
 class WebAppDataRetriever;
-class WebAppUrlLoader;
-enum class WebAppUrlLoaderResult;
-
 enum class InstallableCheckResult {
   kNotInstallable,
   kInstallable,
@@ -49,7 +51,7 @@
   FetchInstallabilityForChromeManagement(
       const GURL& url,
       base::WeakPtr<content::WebContents> web_contents,
-      std::unique_ptr<WebAppUrlLoader> url_loader,
+      std::unique_ptr<webapps::WebAppUrlLoader> url_loader,
       std::unique_ptr<WebAppDataRetriever> data_retriever,
       FetchInstallabilityForChromeManagementCallback callback);
   ~FetchInstallabilityForChromeManagement() override;
@@ -58,7 +60,7 @@
   void StartWithLock(std::unique_ptr<NoopLock>) override;
 
  private:
-  void OnUrlLoadedCheckInstallability(WebAppUrlLoaderResult result);
+  void OnUrlLoadedCheckInstallability(webapps::WebAppUrlLoaderResult result);
   void OnWebAppInstallabilityChecked(blink::mojom::ManifestPtr opt_manifest,
                                      const GURL& manifest_url,
                                      bool valid_manifest_for_web_app,
@@ -74,7 +76,7 @@
   webapps::AppId app_id_;
 
   base::WeakPtr<content::WebContents> web_contents_;
-  const std::unique_ptr<WebAppUrlLoader> url_loader_;
+  const std::unique_ptr<webapps::WebAppUrlLoader> url_loader_;
   const std::unique_ptr<WebAppDataRetriever> data_retriever_;
 
   base::WeakPtrFactory<FetchInstallabilityForChromeManagement> weak_factory_{
diff --git a/chrome/browser/web_applications/commands/fetch_installability_for_chrome_management_unittest.cc b/chrome/browser/web_applications/commands/fetch_installability_for_chrome_management_unittest.cc
index be67012..253045f 100644
--- a/chrome/browser/web_applications/commands/fetch_installability_for_chrome_management_unittest.cc
+++ b/chrome/browser/web_applications/commands/fetch_installability_for_chrome_management_unittest.cc
@@ -20,8 +20,8 @@
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
 #include "chrome/browser/web_applications/web_contents/web_app_data_retriever.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "components/webapps/browser/installable/installable_logging.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "components/webapps/common/web_app_id.h"
 #include "content/public/browser/web_contents.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -70,7 +70,7 @@
   FetchResult ScheduleCommandAndWait(
       const GURL& url,
       base::WeakPtr<content::WebContents> web_contents,
-      std::unique_ptr<WebAppUrlLoader> url_loader,
+      std::unique_ptr<webapps::WebAppUrlLoader> url_loader,
       std::unique_ptr<WebAppDataRetriever> data_retriever) {
     base::RunLoop run_loop;
     FetchResult output;
@@ -103,8 +103,8 @@
   auto data_retriever = std::make_unique<FakeDataRetriever>();
 
   // Url loading fails.
-  url_loader->SetNextLoadUrlResult(kWebAppUrl,
-                                   WebAppUrlLoaderResult::kFailedUnknownReason);
+  url_loader->SetNextLoadUrlResult(
+      kWebAppUrl, webapps::WebAppUrlLoaderResult::kFailedUnknownReason);
   FetchResult result =
       ScheduleCommandAndWait(kWebAppUrl, web_contents()->GetWeakPtr(),
                              std::move(url_loader), std::move(data_retriever));
@@ -119,7 +119,7 @@
 
   // Url loading succeeds, but manifest fetch says not installable.
   url_loader->SetNextLoadUrlResult(kWebAppUrl,
-                                   WebAppUrlLoaderResult::kUrlLoaded);
+                                   webapps::WebAppUrlLoaderResult::kUrlLoaded);
   data_retriever->SetManifest(blink::mojom::ManifestPtr(),
                               webapps::InstallableStatusCode::NO_MANIFEST);
 
@@ -136,7 +136,7 @@
   auto data_retriever = std::make_unique<FakeDataRetriever>();
   // Url loading succeeds and manifest loads. No apps installed yet, so succeed!
   url_loader->SetNextLoadUrlResult(kWebAppUrl,
-                                   WebAppUrlLoaderResult::kUrlLoaded);
+                                   webapps::WebAppUrlLoaderResult::kUrlLoaded);
   data_retriever->SetManifest(
       CreateManifest(), webapps::InstallableStatusCode::NO_ERROR_DETECTED);
 
@@ -153,7 +153,7 @@
   auto data_retriever = std::make_unique<FakeDataRetriever>();
   // Url loading succeeds and manifest loads. No apps installed yet, so succeed!
   url_loader->SetNextLoadUrlResult(kWebAppUrl,
-                                   WebAppUrlLoaderResult::kUrlLoaded);
+                                   webapps::WebAppUrlLoaderResult::kUrlLoaded);
   data_retriever->SetManifest(
       CreateManifest(), webapps::InstallableStatusCode::NO_ERROR_DETECTED);
 
diff --git a/chrome/browser/web_applications/commands/fetch_manifest_and_install_command_unittest.cc b/chrome/browser/web_applications/commands/fetch_manifest_and_install_command_unittest.cc
index 93a1600..449bf07c 100644
--- a/chrome/browser/web_applications/commands/fetch_manifest_and_install_command_unittest.cc
+++ b/chrome/browser/web_applications/commands/fetch_manifest_and_install_command_unittest.cc
@@ -34,11 +34,11 @@
 #include "chrome/browser/web_applications/web_app_install_params.h"
 #include "chrome/browser/web_applications/web_app_utils.h"
 #include "chrome/browser/web_applications/web_contents/web_app_data_retriever.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/common/chrome_features.h"
 #include "components/webapps/browser/install_result_code.h"
 #include "components/webapps/browser/installable/installable_logging.h"
 #include "components/webapps/browser/installable/installable_metrics.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "components/webapps/common/web_app_id.h"
 #include "components/webapps/common/web_page_metadata.mojom.h"
 #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/web_applications/commands/install_from_sync_command.cc b/chrome/browser/web_applications/commands/install_from_sync_command.cc
index c9273ea..79700c2 100644
--- a/chrome/browser/web_applications/commands/install_from_sync_command.cc
+++ b/chrome/browser/web_applications/commands/install_from_sync_command.cc
@@ -26,11 +26,11 @@
 #include "chrome/browser/web_applications/web_app_sync_bridge.h"
 #include "chrome/browser/web_applications/web_app_utils.h"
 #include "chrome/browser/web_applications/web_contents/web_app_data_retriever.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/browser/web_applications/web_contents/web_contents_manager.h"
 #include "components/webapps/browser/install_result_code.h"
 #include "components/webapps/browser/installable/installable_logging.h"
 #include "components/webapps/browser/installable/installable_metrics.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "content/public/browser/web_contents.h"
 
 namespace web_app {
@@ -135,7 +135,7 @@
 
   url_loader_->LoadUrl(
       params_.start_url, &lock_->shared_web_contents(),
-      WebAppUrlLoader::UrlComparison::kIgnoreQueryParamsAndRef,
+      webapps::WebAppUrlLoader::UrlComparison::kIgnoreQueryParamsAndRef,
       base::BindOnce(
           &InstallFromSyncCommand::OnWebAppUrlLoadedGetWebAppInstallInfo,
           weak_ptr_factory_.GetWeakPtr()));
@@ -147,25 +147,25 @@
 }
 
 void InstallFromSyncCommand::OnWebAppUrlLoadedGetWebAppInstallInfo(
-    WebAppUrlLoader::Result result) {
+    webapps::WebAppUrlLoaderResult result) {
   GetMutableDebugValue().Set("WebAppUrlLoader::Result",
                              ConvertUrlLoaderResultToString(result));
-  if (result != WebAppUrlLoader::Result::kUrlLoaded) {
+  if (result != webapps::WebAppUrlLoaderResult::kUrlLoaded) {
     install_error_log_entry_.LogUrlLoaderError(
         "OnWebAppUrlLoaded", params_.start_url.spec(), result);
   }
 
-  if (result == WebAppUrlLoader::Result::kRedirectedUrlLoaded) {
+  if (result == webapps::WebAppUrlLoaderResult::kRedirectedUrlLoaded) {
     InstallFallback(webapps::InstallResultCode::kInstallURLRedirected);
     return;
   }
 
-  if (result == WebAppUrlLoader::Result::kFailedPageTookTooLong) {
+  if (result == webapps::WebAppUrlLoaderResult::kFailedPageTookTooLong) {
     InstallFallback(webapps::InstallResultCode::kInstallURLLoadTimeOut);
     return;
   }
 
-  if (result != WebAppUrlLoader::Result::kUrlLoaded) {
+  if (result != webapps::WebAppUrlLoaderResult::kUrlLoaded) {
     InstallFallback(webapps::InstallResultCode::kInstallURLLoadFailed);
     return;
   }
diff --git a/chrome/browser/web_applications/commands/install_from_sync_command.h b/chrome/browser/web_applications/commands/install_from_sync_command.h
index b037655..6105ad75 100644
--- a/chrome/browser/web_applications/commands/install_from_sync_command.h
+++ b/chrome/browser/web_applications/commands/install_from_sync_command.h
@@ -19,17 +19,20 @@
 #include "chrome/browser/web_applications/web_app_constants.h"
 #include "chrome/browser/web_applications/web_app_install_params.h"
 #include "chrome/browser/web_applications/web_app_logging.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "components/webapps/browser/installable/installable_logging.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "url/gurl.h"
 
 class Profile;
 
+namespace webapps {
+class WebAppUrlLoader;
+enum class WebAppUrlLoaderResult;
+}  // namespace webapps
+
 namespace web_app {
 
 class WebAppDataRetriever;
-enum class WebAppUrlLoaderResult;
 
 class InstallFromSyncCommand
     : public WebAppCommand<SharedWebContentsWithAppLock,
@@ -74,7 +77,8 @@
       std::unique_ptr<SharedWebContentsWithAppLock> lock) override;
 
  private:
-  void OnWebAppUrlLoadedGetWebAppInstallInfo(WebAppUrlLoaderResult result);
+  void OnWebAppUrlLoadedGetWebAppInstallInfo(
+      webapps::WebAppUrlLoaderResult result);
 
   void OnGetWebAppInstallInfo(std::unique_ptr<WebAppInstallInfo> web_app_info);
 
@@ -105,7 +109,7 @@
   const raw_ptr<Profile> profile_;
   const Params params_;
 
-  std::unique_ptr<WebAppUrlLoader> url_loader_;
+  std::unique_ptr<webapps::WebAppUrlLoader> url_loader_;
   std::unique_ptr<WebAppDataRetriever> data_retriever_;
 
   std::unique_ptr<WebAppInstallInfo> install_info_;
diff --git a/chrome/browser/web_applications/commands/install_from_sync_command_unittest.cc b/chrome/browser/web_applications/commands/install_from_sync_command_unittest.cc
index f97e2d6..d8370ad 100644
--- a/chrome/browser/web_applications/commands/install_from_sync_command_unittest.cc
+++ b/chrome/browser/web_applications/commands/install_from_sync_command_unittest.cc
@@ -192,7 +192,7 @@
   // Page with manifest.
   auto& fake_page_state =
       web_contents_manager().GetOrCreatePageState(kWebAppStartUrl);
-  fake_page_state.url_load_result = WebAppUrlLoaderResult::kUrlLoaded;
+  fake_page_state.url_load_result = webapps::WebAppUrlLoaderResult::kUrlLoaded;
   fake_page_state.opt_metadata =
       FakeWebContentsManager::CreateMetadataWithIconAndTitle(
           kDocumentTitle, kDocumentIconUrl, kIconSize);
@@ -228,7 +228,7 @@
   // Page without manifest.
   auto& fake_page_state =
       web_contents_manager().GetOrCreatePageState(kWebAppStartUrl);
-  fake_page_state.url_load_result = WebAppUrlLoaderResult::kUrlLoaded;
+  fake_page_state.url_load_result = webapps::WebAppUrlLoaderResult::kUrlLoaded;
   fake_page_state.opt_metadata =
       FakeWebContentsManager::CreateMetadataWithIconAndTitle(
           kDocumentTitle, kDocumentIconUrl, kIconSize);
@@ -262,7 +262,7 @@
   // Page with manifest, no icons.
   auto& fake_page_state =
       web_contents_manager().GetOrCreatePageState(kWebAppStartUrl);
-  fake_page_state.url_load_result = WebAppUrlLoaderResult::kUrlLoaded;
+  fake_page_state.url_load_result = webapps::WebAppUrlLoaderResult::kUrlLoaded;
   fake_page_state.opt_metadata =
       FakeWebContentsManager::CreateMetadataWithIconAndTitle(
           kDocumentTitle, kDocumentIconUrl, kIconSize);
@@ -298,7 +298,8 @@
   // Page redirects.
   auto& fake_page_state =
       web_contents_manager().GetOrCreatePageState(kWebAppStartUrl);
-  fake_page_state.url_load_result = WebAppUrlLoaderResult::kRedirectedUrlLoaded;
+  fake_page_state.url_load_result =
+      webapps::WebAppUrlLoaderResult::kRedirectedUrlLoaded;
 
   // Fallback icon state.
   web_contents_manager().GetOrCreateIconState(kFallbackIconUrl).bitmaps = {
@@ -332,7 +333,7 @@
   // Page redirects.
   auto& fake_page_state =
       web_contents_manager().GetOrCreatePageState(kWebAppStartUrl);
-  fake_page_state.url_load_result = WebAppUrlLoaderResult::kUrlLoaded;
+  fake_page_state.url_load_result = webapps::WebAppUrlLoaderResult::kUrlLoaded;
   fake_page_state.return_null_info = true;
 
   // Fallback icon state.
@@ -367,7 +368,7 @@
   // Page with manifest.
   auto& fake_page_state =
       web_contents_manager().GetOrCreatePageState(kWebAppStartUrl);
-  fake_page_state.url_load_result = WebAppUrlLoaderResult::kUrlLoaded;
+  fake_page_state.url_load_result = webapps::WebAppUrlLoaderResult::kUrlLoaded;
   fake_page_state.opt_metadata =
       FakeWebContentsManager::CreateMetadataWithIconAndTitle(
           kDocumentTitle, kDocumentIconUrl, kIconSize);
@@ -506,7 +507,7 @@
   // down.
   auto& fake_page_state =
       web_contents_manager().GetOrCreatePageState(kWebAppStartUrl);
-  fake_page_state.url_load_result = WebAppUrlLoaderResult::kUrlLoaded;
+  fake_page_state.url_load_result = webapps::WebAppUrlLoaderResult::kUrlLoaded;
   fake_page_state.opt_metadata =
       FakeWebContentsManager::CreateMetadataWithIconAndTitle(
           kDocumentTitle, kDocumentIconUrl, kIconSize);
diff --git a/chrome/browser/web_applications/commands/install_preloaded_verified_app_command.cc b/chrome/browser/web_applications/commands/install_preloaded_verified_app_command.cc
index 836ec95..9c1b6a6d 100644
--- a/chrome/browser/web_applications/commands/install_preloaded_verified_app_command.cc
+++ b/chrome/browser/web_applications/commands/install_preloaded_verified_app_command.cc
@@ -25,10 +25,10 @@
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "chrome/browser/web_applications/web_app_install_params.h"
 #include "chrome/browser/web_applications/web_app_install_utils.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/browser/web_applications/web_contents/web_contents_manager.h"
 #include "components/webapps/browser/install_result_code.h"
 #include "components/webapps/browser/installable/installable_metrics.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "components/webapps/common/web_app_id.h"
 #include "content/public/browser/web_contents.h"
 #include "mojo/public/cpp/bindings/remote.h"
@@ -104,13 +104,13 @@
       web_contents_lock_->web_contents_manager().CreateDataRetriever();
   url_loader_->LoadUrl(
       GURL(url::kAboutBlankURL), &web_contents_lock_->shared_web_contents(),
-      WebAppUrlLoader::UrlComparison::kExact,
+      webapps::WebAppUrlLoader::UrlComparison::kExact,
       base::BindOnce(&InstallPreloadedVerifiedAppCommand::OnAboutBlankLoaded,
                      weak_ptr_factory_.GetWeakPtr()));
 }
 
 void InstallPreloadedVerifiedAppCommand::OnAboutBlankLoaded(
-    WebAppUrlLoaderResult result) {
+    webapps::WebAppUrlLoaderResult result) {
   // The shared web contents must have been reset to about:blank before command
   // execution.
   DCHECK_EQ(web_contents_lock_->shared_web_contents().GetURL(),
diff --git a/chrome/browser/web_applications/commands/install_preloaded_verified_app_command.h b/chrome/browser/web_applications/commands/install_preloaded_verified_app_command.h
index 4f32abc..59d868c 100644
--- a/chrome/browser/web_applications/commands/install_preloaded_verified_app_command.h
+++ b/chrome/browser/web_applications/commands/install_preloaded_verified_app_command.h
@@ -23,11 +23,14 @@
 #include "third_party/blink/public/mojom/manifest/manifest_manager.mojom.h"
 #include "url/gurl.h"
 
+namespace webapps {
+class WebAppUrlLoader;
+enum class WebAppUrlLoaderResult;
+}  // namespace webapps
+
 namespace web_app {
 
 class SharedWebContentsWithAppLock;
-class WebAppUrlLoader;
-enum class WebAppUrlLoaderResult;
 
 // Installs a web app using a raw manifest JSON string, which is interpreted as
 // if it was loaded from the renderer for a given URL. This does not attempt to
@@ -73,7 +76,7 @@
   void StartWithLock(std::unique_ptr<SharedWebContentsLock> lock) override;
 
  private:
-  void OnAboutBlankLoaded(WebAppUrlLoaderResult result);
+  void OnAboutBlankLoaded(webapps::WebAppUrlLoaderResult result);
   void OnManifestParsed(blink::mojom::ManifestPtr manifest);
   void OnIconsRetrieved(IconsDownloadedResult result,
                         IconsMap icons_map,
@@ -97,7 +100,7 @@
   // SharedWebContentsWithAppLock is held while installing the app.
   std::unique_ptr<SharedWebContentsWithAppLock> app_lock_;
 
-  std::unique_ptr<WebAppUrlLoader> url_loader_;
+  std::unique_ptr<webapps::WebAppUrlLoader> url_loader_;
   std::unique_ptr<WebAppDataRetriever> data_retriever_;
 
   std::unique_ptr<WebAppInstallInfo> web_app_info_;
diff --git a/chrome/browser/web_applications/commands/navigate_and_trigger_install_dialog_command.cc b/chrome/browser/web_applications/commands/navigate_and_trigger_install_dialog_command.cc
index 5ffb4ee6..74a3065 100644
--- a/chrome/browser/web_applications/commands/navigate_and_trigger_install_dialog_command.cc
+++ b/chrome/browser/web_applications/commands/navigate_and_trigger_install_dialog_command.cc
@@ -18,8 +18,8 @@
 #include "chrome/browser/web_applications/web_app_helpers.h"
 #include "chrome/browser/web_applications/web_app_ui_manager.h"
 #include "chrome/browser/web_applications/web_contents/web_app_data_retriever.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "components/webapps/browser/installable/installable_logging.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "content/public/browser/web_contents.h"
 #include "ui/base/page_transition_types.h"
 #include "url/gurl.h"
@@ -33,7 +33,7 @@
     bool is_renderer_initiated,
     NavigateAndTriggerInstallDialogCommandCallback callback,
     base::WeakPtr<WebAppUiManager> ui_manager,
-    std::unique_ptr<WebAppUrlLoader> url_loader,
+    std::unique_ptr<webapps::WebAppUrlLoader> url_loader,
     std::unique_ptr<WebAppDataRetriever> data_retriever,
     Profile* profile)
     : WebAppCommand<NoopLock, NavigateAndTriggerInstallDialogCommandResult>(
@@ -91,13 +91,13 @@
   web_contents_ = new_tab->GetWeakPtr();
   url_loader_->LoadUrl(
       std::move(load_url_params), web_contents_.get(),
-      WebAppUrlLoader::UrlComparison::kIgnoreQueryParamsAndRef,
+      webapps::WebAppUrlLoader::UrlComparison::kIgnoreQueryParamsAndRef,
       base::BindOnce(&NavigateAndTriggerInstallDialogCommand::OnUrlLoaded,
                      weak_factory_.GetWeakPtr()));
 }
 
 void NavigateAndTriggerInstallDialogCommand::OnUrlLoaded(
-    WebAppUrlLoader::Result result) {
+    webapps::WebAppUrlLoaderResult result) {
   GetMutableDebugValue().Set("WebAppUrlLoader::Result",
                              ConvertUrlLoaderResultToString(result));
   if (IsWebContentsDestroyed()) {
@@ -107,7 +107,7 @@
         NavigateAndTriggerInstallDialogCommandResult::kFailure);
     return;
   }
-  if (result != WebAppUrlLoader::Result::kUrlLoaded) {
+  if (result != webapps::WebAppUrlLoaderResult::kUrlLoaded) {
     CompleteAndSelfDestruct(
         CommandResult::kFailure,
         NavigateAndTriggerInstallDialogCommandResult::kFailure);
diff --git a/chrome/browser/web_applications/commands/navigate_and_trigger_install_dialog_command.h b/chrome/browser/web_applications/commands/navigate_and_trigger_install_dialog_command.h
index dfbdd68..ca5a1a3 100644
--- a/chrome/browser/web_applications/commands/navigate_and_trigger_install_dialog_command.h
+++ b/chrome/browser/web_applications/commands/navigate_and_trigger_install_dialog_command.h
@@ -23,13 +23,16 @@
 class WebContents;
 }
 
+namespace webapps {
+class WebAppUrlLoader;
+enum class WebAppUrlLoaderResult;
+}  // namespace webapps
+
 namespace web_app {
 
 class AppLock;
 class WebAppDataRetriever;
-class WebAppUrlLoader;
 class WebAppUiManager;
-enum class WebAppUrlLoaderResult;
 
 enum class NavigateAndTriggerInstallDialogCommandResult {
   kFailure,
@@ -37,6 +40,7 @@
   kDialogShown,
   kShutdown
 };
+
 // The navigation will always succeed. The `result` indicates whether the
 // command was able to trigger the install dialog.
 using NavigateAndTriggerInstallDialogCommandCallback = base::OnceCallback<void(
@@ -55,7 +59,7 @@
       bool is_renderer_initiated,
       NavigateAndTriggerInstallDialogCommandCallback callback,
       base::WeakPtr<WebAppUiManager> ui_manager,
-      std::unique_ptr<WebAppUrlLoader> url_loader,
+      std::unique_ptr<webapps::WebAppUrlLoader> url_loader,
       std::unique_ptr<WebAppDataRetriever> data_retriever,
       Profile* profile);
   ~NavigateAndTriggerInstallDialogCommand() override;
@@ -67,7 +71,7 @@
  private:
   bool IsWebContentsDestroyed();
 
-  void OnUrlLoaded(WebAppUrlLoaderResult result);
+  void OnUrlLoaded(webapps::WebAppUrlLoaderResult result);
   void OnInstallabilityChecked(blink::mojom::ManifestPtr opt_manifest,
                                const GURL& manifest_url,
                                bool valid_manifest_for_web_app,
@@ -82,7 +86,7 @@
   const bool is_renderer_initiated_;
 
   base::WeakPtr<WebAppUiManager> ui_manager_;
-  const std::unique_ptr<WebAppUrlLoader> url_loader_;
+  const std::unique_ptr<webapps::WebAppUrlLoader> url_loader_;
   const std::unique_ptr<WebAppDataRetriever> data_retriever_;
   raw_ptr<Profile> profile_ = nullptr;
 
diff --git a/chrome/browser/web_applications/externally_managed_app_manager.cc b/chrome/browser/web_applications/externally_managed_app_manager.cc
index 2b01202..c64ef64 100644
--- a/chrome/browser/web_applications/externally_managed_app_manager.cc
+++ b/chrome/browser/web_applications/externally_managed_app_manager.cc
@@ -31,11 +31,11 @@
 #include "chrome/browser/web_applications/web_app_registry_update.h"
 #include "chrome/browser/web_applications/web_app_sync_bridge.h"
 #include "chrome/browser/web_applications/web_contents/web_app_data_retriever.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/browser/web_applications/web_contents/web_contents_manager.h"
 #include "chrome/common/chrome_features.h"
 #include "components/webapps/browser/install_result_code.h"
 #include "components/webapps/browser/uninstall_result_code.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/url_constants.h"
 
@@ -206,7 +206,7 @@
 }
 
 void ExternallyManagedAppManager::SetUrlLoaderForTesting(
-    std::unique_ptr<WebAppUrlLoader> url_loader) {
+    std::unique_ptr<webapps::WebAppUrlLoader> url_loader) {
   CHECK_IS_TEST();
   url_loader_ = std::move(url_loader);
 }
diff --git a/chrome/browser/web_applications/externally_managed_app_manager.h b/chrome/browser/web_applications/externally_managed_app_manager.h
index 7899a5a..aae1f144 100644
--- a/chrome/browser/web_applications/externally_managed_app_manager.h
+++ b/chrome/browser/web_applications/externally_managed_app_manager.h
@@ -27,6 +27,7 @@
 
 namespace webapps {
 enum class InstallResultCode;
+class WebAppUrlLoader;
 }
 
 namespace content {
@@ -39,7 +40,6 @@
 class ExternallyManagedAppInstallTask;
 class ExternallyManagedAppRegistrationTaskBase;
 class WebAppDataRetriever;
-class WebAppUrlLoader;
 class WebAppProvider;
 
 enum class RegistrationResultCode { kSuccess, kAlreadyRegistered, kTimeout };
@@ -169,7 +169,8 @@
   void Shutdown();
 
   // TODO(http://b/283521737): Remove this and use WebContentsManager.
-  void SetUrlLoaderForTesting(std::unique_ptr<WebAppUrlLoader> url_loader);
+  void SetUrlLoaderForTesting(
+      std::unique_ptr<webapps::WebAppUrlLoader> url_loader);
   // TODO(http://b/283521737): Remove this and use WebContentsManager.
   void SetDataRetrieverFactoryForTesting(
       base::RepeatingCallback<std::unique_ptr<WebAppDataRetriever>()> factory);
@@ -261,7 +262,7 @@
       synchronize_requests_;
 
   // unique_ptr so that it can be replaced in tests.
-  std::unique_ptr<WebAppUrlLoader> url_loader_;
+  std::unique_ptr<webapps::WebAppUrlLoader> url_loader_;
   // Allows tests to set the data retriever for install tasks.
   base::RepeatingCallback<std::unique_ptr<WebAppDataRetriever>()>
       data_retriever_factory_;
diff --git a/chrome/browser/web_applications/externally_managed_app_manager_unittest.cc b/chrome/browser/web_applications/externally_managed_app_manager_unittest.cc
index f52700b6..29cf0e0 100644
--- a/chrome/browser/web_applications/externally_managed_app_manager_unittest.cc
+++ b/chrome/browser/web_applications/externally_managed_app_manager_unittest.cc
@@ -40,10 +40,10 @@
 #include "chrome/browser/web_applications/web_app_registrar.h"
 #include "chrome/browser/web_applications/web_app_registry_update.h"
 #include "chrome/browser/web_applications/web_app_sync_bridge.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/common/chrome_features.h"
 #include "components/services/app_service/public/cpp/app_types.h"
 #include "components/webapps/browser/install_result_code.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "components/webapps/common/web_page_metadata.mojom.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -332,7 +332,8 @@
                                                       GURL start_url) {
     auto& install_page_state =
         web_contents_manager().GetOrCreatePageState(install_url);
-    install_page_state.url_load_result = WebAppUrlLoaderResult::kUrlLoaded;
+    install_page_state.url_load_result =
+        webapps::WebAppUrlLoaderResult::kUrlLoaded;
     install_page_state.redirection_url = std::nullopt;
 
     install_page_state.opt_metadata =
diff --git a/chrome/browser/web_applications/externally_managed_app_registration_task.cc b/chrome/browser/web_applications/externally_managed_app_registration_task.cc
index 26eb5d0..f35622f 100644
--- a/chrome/browser/web_applications/externally_managed_app_registration_task.cc
+++ b/chrome/browser/web_applications/externally_managed_app_registration_task.cc
@@ -7,7 +7,7 @@
 #include "base/functional/callback_helpers.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/web_applications/externally_managed_app_manager.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/service_worker_context.h"
 #include "content/public/browser/storage_partition.h"
@@ -31,7 +31,7 @@
 ExternallyManagedAppRegistrationTask::ExternallyManagedAppRegistrationTask(
     GURL install_url,
     const base::TimeDelta registration_timeout,
-    WebAppUrlLoader* url_loader,
+    webapps::WebAppUrlLoader* url_loader,
     content::WebContents* web_contents,
     RegistrationCallback callback)
     : ExternallyManagedAppRegistrationTaskBase(std::move(install_url),
@@ -108,7 +108,7 @@
   }
 
   url_loader_->LoadUrl(install_url(), web_contents_,
-                       WebAppUrlLoader::UrlComparison::kExact,
+                       webapps::WebAppUrlLoader::UrlComparison::kExact,
                        base::DoNothing());
 }
 
diff --git a/chrome/browser/web_applications/externally_managed_app_registration_task.h b/chrome/browser/web_applications/externally_managed_app_registration_task.h
index 2715f9b7..817e167 100644
--- a/chrome/browser/web_applications/externally_managed_app_registration_task.h
+++ b/chrome/browser/web_applications/externally_managed_app_registration_task.h
@@ -10,7 +10,6 @@
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list_types.h"
 #include "base/timer/timer.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "content/public/browser/service_worker_context_observer.h"
 
 class GURL;
@@ -21,10 +20,13 @@
 class WebContents;
 }  // namespace content
 
+namespace webapps {
+class WebAppUrlLoader;
+}
+
 namespace web_app {
 
 enum class RegistrationResultCode;
-class WebAppUrlLoader;
 
 class ExternallyManagedAppRegistrationTaskBase
     : public content::ServiceWorkerContextObserver {
@@ -56,7 +58,7 @@
   ExternallyManagedAppRegistrationTask(
       GURL install_url,
       const base::TimeDelta registration_timeout,
-      WebAppUrlLoader* url_loader,
+      webapps::WebAppUrlLoader* url_loader,
       content::WebContents* web_contents,
       RegistrationCallback callback);
 
@@ -80,7 +82,7 @@
 
   void OnRegistrationTimeout();
 
-  const raw_ptr<WebAppUrlLoader> url_loader_;
+  const raw_ptr<webapps::WebAppUrlLoader> url_loader_;
   const raw_ptr<content::WebContents> web_contents_;
   RegistrationCallback callback_;
   raw_ptr<content::ServiceWorkerContext> service_worker_context_ = nullptr;
diff --git a/chrome/browser/web_applications/isolated_web_apps/install_isolated_web_app_command.cc b/chrome/browser/web_applications/isolated_web_apps/install_isolated_web_app_command.cc
index b085947..f7a331f 100644
--- a/chrome/browser/web_applications/isolated_web_apps/install_isolated_web_app_command.cc
+++ b/chrome/browser/web_applications/isolated_web_apps/install_isolated_web_app_command.cc
@@ -34,12 +34,12 @@
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "chrome/browser/web_applications/web_app_install_utils.h"
 #include "chrome/browser/web_applications/web_app_utils.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/browser/web_applications/web_contents/web_contents_manager.h"
 #include "components/web_package/signed_web_bundles/signed_web_bundle_id.h"
 #include "components/webapps/browser/install_result_code.h"
 #include "components/webapps/browser/installable/installable_logging.h"
 #include "components/webapps/browser/installable/installable_metrics.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "components/webapps/common/web_app_id.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/web_applications/isolated_web_apps/install_isolated_web_app_command.h b/chrome/browser/web_applications/isolated_web_apps/install_isolated_web_app_command.h
index 0ddabf0..65f5c84 100644
--- a/chrome/browser/web_applications/isolated_web_apps/install_isolated_web_app_command.h
+++ b/chrome/browser/web_applications/isolated_web_apps/install_isolated_web_app_command.h
@@ -39,11 +39,12 @@
 class WebContents;
 }  // namespace content
 
-namespace web_app {
-
+namespace webapps {
 class WebAppUrlLoader;
-
 enum class WebAppUrlLoaderResult;
+}  // namespace webapps
+
+namespace web_app {
 
 struct InstallIsolatedWebAppCommandSuccess {
   InstallIsolatedWebAppCommandSuccess(base::Version installed_version,
@@ -180,7 +181,7 @@
   SEQUENCE_CHECKER(sequence_checker_);
 
   std::unique_ptr<AppLock> lock_;
-  std::unique_ptr<WebAppUrlLoader> url_loader_;
+  std::unique_ptr<webapps::WebAppUrlLoader> url_loader_;
 
   const std::unique_ptr<IsolatedWebAppInstallCommandHelper> command_helper_;
 
diff --git a/chrome/browser/web_applications/isolated_web_apps/install_isolated_web_app_command_unittest.cc b/chrome/browser/web_applications/isolated_web_apps/install_isolated_web_app_command_unittest.cc
index 9cfd2cb..f08890e 100644
--- a/chrome/browser/web_applications/isolated_web_apps/install_isolated_web_app_command_unittest.cc
+++ b/chrome/browser/web_applications/isolated_web_apps/install_isolated_web_app_command_unittest.cc
@@ -58,13 +58,13 @@
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "chrome/browser/web_applications/web_app_install_utils.h"
 #include "chrome/browser/web_applications/web_app_registrar.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/common/chrome_features.h"
 #include "components/web_package/signed_web_bundles/ed25519_public_key.h"
 #include "components/web_package/signed_web_bundles/signed_web_bundle_id.h"
 #include "components/web_package/web_bundle_builder.h"
 #include "components/webapps/browser/installable/installable_logging.h"
 #include "components/webapps/browser/installable/installable_metrics.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/content_features.h"
 #include "net/http/http_status_code.h"
@@ -184,7 +184,7 @@
     GURL application_url = url_info.origin().GetURL();
     auto& page_state = web_contents_manager().GetOrCreatePageState(
         application_url.Resolve(kManifestPath));
-    page_state.url_load_result = WebAppUrlLoader::Result::kUrlLoaded;
+    page_state.url_load_result = webapps::WebAppUrlLoaderResult::kUrlLoaded;
     page_state.error_code = webapps::InstallableStatusCode::NO_ERROR_DETECTED;
 
     page_state.manifest_url = CreateDefaultManifestURL(application_url);
@@ -227,7 +227,8 @@
 TEST_F(InstallIsolatedWebAppCommandTest, PropagateErrorWhenURLLoaderFails) {
   IsolatedWebAppUrlInfo url_info = CreateRandomIsolatedWebAppUrlInfo();
   auto [page_state, icon_state] = SetUpPageAndIconStates(url_info);
-  page_state.url_load_result = WebAppUrlLoader::Result::kFailedErrorPageLoaded;
+  page_state.url_load_result =
+      webapps::WebAppUrlLoaderResult::kFailedErrorPageLoaded;
 
   EXPECT_THAT(ExecuteCommand(Parameters{.url_info = url_info}),
               ErrorIs(Field(&InstallIsolatedWebAppCommandError::message,
@@ -239,7 +240,7 @@
   IsolatedWebAppUrlInfo url_info = CreateRandomIsolatedWebAppUrlInfo();
   auto [page_state, icon_state] = SetUpPageAndIconStates(url_info);
   page_state.url_load_result =
-      WebAppUrlLoader::Result::kFailedWebContentsDestroyed;
+      webapps::WebAppUrlLoaderResult::kFailedWebContentsDestroyed;
 
   EXPECT_THAT(
       ExecuteCommand(Parameters{.url_info = url_info}),
@@ -437,7 +438,7 @@
   web_contents_manager().TrackLoadUrlCalls(base::BindLambdaForTesting(
       [&](content::NavigationController::LoadURLParams& load_url_params,
           content::WebContents* unused_web_contents,
-          WebAppUrlLoader::UrlComparison unused_url_comparison) {
+          webapps::WebAppUrlLoader::UrlComparison unused_url_comparison) {
         EXPECT_THAT(load_url_params.url,
                     Eq(url_info.origin().GetURL().Resolve(kManifestPath)));
         storage_partition_during_url_loading = profile()->GetStoragePartition(
@@ -603,7 +604,8 @@
 TEST_F(InstallIsolatedWebAppCommandMetricsTest, ReportErrorWhenUrlLoaderFails) {
   IsolatedWebAppUrlInfo url_info = CreateRandomIsolatedWebAppUrlInfo();
   auto [page_state, icon_state] = SetUpPageAndIconStates(url_info);
-  page_state.url_load_result = WebAppUrlLoader::Result::kFailedErrorPageLoaded;
+  page_state.url_load_result =
+      webapps::WebAppUrlLoaderResult::kFailedErrorPageLoaded;
 
   base::HistogramTester histogram_tester;
 
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_apply_update_command.cc b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_apply_update_command.cc
index 2966c31..0e8c17e 100644
--- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_apply_update_command.cc
+++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_apply_update_command.cc
@@ -37,9 +37,9 @@
 #include "chrome/browser/web_applications/web_app_registry_update.h"
 #include "chrome/browser/web_applications/web_app_sync_bridge.h"
 #include "chrome/browser/web_applications/web_app_utils.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/browser/web_applications/web_contents/web_contents_manager.h"
 #include "components/webapps/browser/install_result_code.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "components/webapps/common/web_app_id.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_apply_update_command.h b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_apply_update_command.h
index db7116ed..a66e49d 100644
--- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_apply_update_command.h
+++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_apply_update_command.h
@@ -34,15 +34,13 @@
 }
 
 namespace webapps {
+class WebAppUrlLoader;
+enum class WebAppUrlLoaderResult;
 enum class InstallResultCode;
 }
 
 namespace web_app {
 
-class WebAppUrlLoader;
-
-enum class WebAppUrlLoaderResult;
-
 struct IsolatedWebAppApplyUpdateCommandError {
   std::string message;
 };
@@ -149,7 +147,7 @@
   const IsolatedWebAppUrlInfo url_info_;
 
   std::unique_ptr<content::WebContents> web_contents_;
-  std::unique_ptr<WebAppUrlLoader> url_loader_;
+  std::unique_ptr<webapps::WebAppUrlLoader> url_loader_;
 
   const std::unique_ptr<ScopedKeepAlive> optional_keep_alive_;
   const std::unique_ptr<ScopedProfileKeepAlive> optional_profile_keep_alive_;
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_apply_update_command_unittest.cc b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_apply_update_command_unittest.cc
index b618a5c..dc5eb2d 100644
--- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_apply_update_command_unittest.cc
+++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_apply_update_command_unittest.cc
@@ -33,10 +33,10 @@
 #include "chrome/browser/web_applications/web_app_install_finalizer.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
 #include "chrome/browser/web_applications/web_app_registry_update.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/common/url_constants.h"
 #include "components/web_package/signed_web_bundles/signed_web_bundle_id.h"
 #include "components/webapps/browser/install_result_code.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "content/public/browser/web_contents.h"
 #include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -157,7 +157,7 @@
                       "/.well-known/_generated_install_page.html"}));
     auto& page_state = fake_web_contents_manager().GetOrCreatePageState(url);
 
-    page_state.url_load_result = WebAppUrlLoaderResult::kUrlLoaded;
+    page_state.url_load_result = webapps::WebAppUrlLoaderResult::kUrlLoaded;
     page_state.error_code = webapps::InstallableStatusCode::NO_ERROR_DETECTED;
     page_state.manifest_url =
         url_info_.origin().GetURL().Resolve("manifest.webmanifest");
@@ -331,7 +331,8 @@
   InstallIwa(update_info());
   ASSERT_NO_FATAL_FAILURE(WriteUpdateBundleToDisk());
   auto& page_state = CreateDefaultPageState();
-  page_state.url_load_result = WebAppUrlLoader::Result::kFailedErrorPageLoaded;
+  page_state.url_load_result =
+      webapps::WebAppUrlLoaderResult::kFailedErrorPageLoaded;
 
   auto result = ApplyPendingUpdate();
   ASSERT_THAT(result.has_value(), IsFalse());
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_install_command_helper.cc b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_install_command_helper.cc
index ca859dd..fda3525 100644
--- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_install_command_helper.cc
+++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_install_command_helper.cc
@@ -39,10 +39,10 @@
 #include "chrome/browser/web_applications/web_app_install_utils.h"
 #include "chrome/browser/web_applications/web_app_utils.h"
 #include "chrome/browser/web_applications/web_contents/web_app_data_retriever.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "components/base32/base32.h"
 #include "components/webapps/browser/installable/installable_logging.h"
 #include "components/webapps/browser/installable/installable_manager.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/reload_type.h"
 #include "content/public/browser/storage_partition_config.h"
@@ -132,8 +132,8 @@
   }
 }
 
-bool IsUrlLoadingResultSuccess(WebAppUrlLoader::Result result) {
-  return result == WebAppUrlLoader::Result::kUrlLoaded;
+bool IsUrlLoadingResultSuccess(webapps::WebAppUrlLoaderResult result) {
+  return result == webapps::WebAppUrlLoaderResult::kUrlLoaded;
 }
 
 }  // namespace
@@ -340,7 +340,7 @@
 void IsolatedWebAppInstallCommandHelper::LoadInstallUrl(
     const IwaSourceWithMode& source,
     content::WebContents& web_contents,
-    WebAppUrlLoader& url_loader,
+    webapps::WebAppUrlLoader& url_loader,
     base::OnceCallback<void(base::expected<void, std::string>)> callback) {
   // |web_app::IsolatedWebAppURLLoaderFactory| uses the isolation data in
   // order to determine the current state of content serving (installation
@@ -366,14 +366,14 @@
 
   url_loader.LoadUrl(
       std::move(load_params), &web_contents,
-      WebAppUrlLoader::UrlComparison::kIgnoreQueryParamsAndRef,
+      webapps::WebAppUrlLoader::UrlComparison::kIgnoreQueryParamsAndRef,
       base::BindOnce(&IsolatedWebAppInstallCommandHelper::OnLoadInstallUrl,
                      weak_factory_.GetWeakPtr(), std::move(callback)));
 }
 
 void IsolatedWebAppInstallCommandHelper::OnLoadInstallUrl(
     base::OnceCallback<void(base::expected<void, std::string>)> callback,
-    WebAppUrlLoaderResult result) {
+    webapps::WebAppUrlLoaderResult result) {
   if (!IsUrlLoadingResultSuccess(result)) {
     std::move(callback).Run(base::unexpected(
         base::StrCat({"Error during URL loading: ",
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_install_command_helper.h b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_install_command_helper.h
index a18f67d..e5a8c994 100644
--- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_install_command_helper.h
+++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_install_command_helper.h
@@ -28,6 +28,11 @@
 class WebContents;
 }  // namespace content
 
+namespace webapps {
+class WebAppUrlLoader;
+enum class WebAppUrlLoaderResult;
+}  // namespace webapps
+
 namespace web_app {
 
 enum class IconsDownloadedResult;
@@ -38,9 +43,6 @@
 class IwaSourceWithModeAndFileOp;
 class UnusableSwbnFileError;
 class WebAppDataRetriever;
-class WebAppUrlLoader;
-enum class WebAppUrlLoaderResult;
-
 // Copies the file being installed to the profile directory.
 // On success returns a new owned location in the callback.
 void UpdateBundlePathAndCreateStorageLocation(
@@ -87,7 +89,7 @@
   void LoadInstallUrl(
       const IwaSourceWithMode& source,
       content::WebContents& web_contents,
-      WebAppUrlLoader& url_loader,
+      webapps::WebAppUrlLoader& url_loader,
       base::OnceCallback<void(base::expected<void, std::string>)> callback);
 
   struct ManifestAndUrl {
@@ -133,7 +135,7 @@
 
   void OnLoadInstallUrl(
       base::OnceCallback<void(base::expected<void, std::string>)> callback,
-      WebAppUrlLoaderResult result);
+      webapps::WebAppUrlLoaderResult result);
 
   void OnCheckInstallabilityAndRetrieveManifest(
       base::OnceCallback<void(base::expected<ManifestAndUrl, std::string>)>
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_install_command_helper_unittest.cc b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_install_command_helper_unittest.cc
index 80564f9..56e3241 100644
--- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_install_command_helper_unittest.cc
+++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_install_command_helper_unittest.cc
@@ -43,11 +43,11 @@
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "chrome/browser/web_applications/web_app_install_utils.h"
 #include "chrome/browser/web_applications/web_contents/web_app_data_retriever.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/web_package/signed_web_bundles/ed25519_public_key.h"
 #include "components/web_package/signed_web_bundles/signed_web_bundle_id.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/content_features.h"
 #include "content/public/test/browser_task_environment.h"
@@ -341,13 +341,13 @@
   url_loader->SetNextLoadUrlResult(
       url_info.origin().GetURL().Resolve(
           ".well-known/_generated_install_page.html"),
-      WebAppUrlLoader::Result::kUrlLoaded);
+      webapps::WebAppUrlLoaderResult::kUrlLoaded);
 
-  std::optional<WebAppUrlLoader::UrlComparison> last_url_comparison =
+  std::optional<webapps::WebAppUrlLoader::UrlComparison> last_url_comparison =
       std::nullopt;
   url_loader->TrackLoadUrlCalls(base::BindLambdaForTesting(
       [&](const GURL& unused_url, content::WebContents* unused_web_contents,
-          WebAppUrlLoader::UrlComparison url_comparison) {
+          webapps::WebAppUrlLoader::UrlComparison url_comparison) {
         last_url_comparison = url_comparison;
       }));
 
@@ -355,8 +355,9 @@
   command_helper->LoadInstallUrl(CreateDevProxySource(), web_contents(),
                                  *url_loader, future.GetCallback());
   EXPECT_THAT(future.Get(), HasValue());
-  EXPECT_THAT(last_url_comparison,
-              Eq(WebAppUrlLoader::UrlComparison::kIgnoreQueryParamsAndRef));
+  EXPECT_THAT(
+      last_url_comparison,
+      Eq(webapps::WebAppUrlLoader::UrlComparison::kIgnoreQueryParamsAndRef));
 }
 
 TEST_F(IsolatedWebAppInstallCommandHelperLoadUrlTest,
@@ -370,12 +371,12 @@
   url_loader->SetNextLoadUrlResult(
       url_info.origin().GetURL().Resolve(
           ".well-known/_generated_install_page.html"),
-      WebAppUrlLoader::Result::kUrlLoaded);
+      webapps::WebAppUrlLoaderResult::kUrlLoaded);
 
   std::optional<IwaSourceWithMode> source = std::nullopt;
   url_loader->TrackLoadUrlCalls(base::BindLambdaForTesting(
       [&](const GURL& unused_url, content::WebContents* web_contents,
-          WebAppUrlLoader::UrlComparison unused_url_comparison) {
+          webapps::WebAppUrlLoader::UrlComparison unused_url_comparison) {
         source =
             IsolatedWebAppPendingInstallInfo::FromWebContents(*web_contents)
                 .source();
@@ -402,12 +403,12 @@
   url_loader->SetNextLoadUrlResult(
       url_info.origin().GetURL().Resolve(
           ".well-known/_generated_install_page.html"),
-      WebAppUrlLoader::Result::kUrlLoaded);
+      webapps::WebAppUrlLoaderResult::kUrlLoaded);
 
   std::optional<IwaSourceWithMode> source = std::nullopt;
   url_loader->TrackLoadUrlCalls(base::BindLambdaForTesting(
       [&](const GURL& unused_url, content::WebContents* web_contents,
-          WebAppUrlLoader::UrlComparison unused_url_comparison) {
+          webapps::WebAppUrlLoader::UrlComparison unused_url_comparison) {
         source =
             IsolatedWebAppPendingInstallInfo::FromWebContents(*web_contents)
                 .source();
@@ -433,7 +434,7 @@
   url_loader->SetNextLoadUrlResult(
       url_info.origin().GetURL().Resolve(
           ".well-known/_generated_install_page.html"),
-      WebAppUrlLoader::Result::kFailedErrorPageLoaded);
+      webapps::WebAppUrlLoaderResult::kFailedErrorPageLoaded);
 
   base::test::TestFuture<base::expected<void, std::string>> future;
   command_helper->LoadInstallUrl(CreateDevProxySource(), web_contents(),
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_prepare_and_store_update_command.cc b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_prepare_and_store_update_command.cc
index 45a0185..963be580 100644
--- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_prepare_and_store_update_command.cc
+++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_prepare_and_store_update_command.cc
@@ -37,8 +37,8 @@
 #include "chrome/browser/web_applications/web_app_registry_update.h"
 #include "chrome/browser/web_applications/web_app_sync_bridge.h"
 #include "chrome/browser/web_applications/web_app_utils.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/browser/web_applications/web_contents/web_contents_manager.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/web_contents.h"
 #include "third_party/abseil-cpp/absl/types/variant.h"
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_prepare_and_store_update_command.h b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_prepare_and_store_update_command.h
index 68c1ad9..a60ec3a 100644
--- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_prepare_and_store_update_command.h
+++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_prepare_and_store_update_command.h
@@ -37,11 +37,12 @@
 class WebContents;
 }  // namespace content
 
-namespace web_app {
-
+namespace webapps {
 class WebAppUrlLoader;
-
 enum class WebAppUrlLoaderResult;
+}  // namespace webapps
+
+namespace web_app {
 
 struct IsolatedWebAppUpdatePrepareAndStoreCommandSuccess {
   IsolatedWebAppUpdatePrepareAndStoreCommandSuccess(
@@ -192,7 +193,7 @@
   SEQUENCE_CHECKER(sequence_checker_);
 
   std::unique_ptr<AppLock> lock_;
-  std::unique_ptr<WebAppUrlLoader> url_loader_;
+  std::unique_ptr<webapps::WebAppUrlLoader> url_loader_;
 
   const std::unique_ptr<IsolatedWebAppInstallCommandHelper> command_helper_;
 
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_prepare_and_store_update_command_unittest.cc b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_prepare_and_store_update_command_unittest.cc
index 9403630..ca216a1 100644
--- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_prepare_and_store_update_command_unittest.cc
+++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_prepare_and_store_update_command_unittest.cc
@@ -31,10 +31,10 @@
 #include "chrome/browser/web_applications/web_app_command_manager.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
 #include "chrome/browser/web_applications/web_app_registry_update.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/common/url_constants.h"
 #include "components/web_package/signed_web_bundles/signed_web_bundle_id.h"
 #include "components/webapps/browser/install_result_code.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "content/public/browser/web_contents.h"
 #include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -152,7 +152,7 @@
                       "/.well-known/_generated_install_page.html"}));
     auto& page_state = fake_web_contents_manager().GetOrCreatePageState(url);
 
-    page_state.url_load_result = WebAppUrlLoaderResult::kUrlLoaded;
+    page_state.url_load_result = webapps::WebAppUrlLoaderResult::kUrlLoaded;
     page_state.error_code = webapps::InstallableStatusCode::NO_ERROR_DETECTED;
     page_state.manifest_url =
         url_info_.origin().GetURL().Resolve("manifest.webmanifest");
@@ -406,7 +406,8 @@
   const base::flat_set<base::FilePath> existing_dirs = GetIwaDirContent();
   WriteUpdateBundleToDisk();
   auto& page_state = CreateDefaultPageState();
-  page_state.url_load_result = WebAppUrlLoader::Result::kFailedErrorPageLoaded;
+  page_state.url_load_result =
+      webapps::WebAppUrlLoaderResult::kFailedErrorPageLoaded;
 
   auto result = PrepareAndStoreUpdateInfo(update_version_);
   EXPECT_THAT(result, IsErrorWithMessage(HasSubstr("FailedErrorPageLoaded")));
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_update_discovery_task_unittest.cc b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_update_discovery_task_unittest.cc
index 5d752c1..dc01f44 100644
--- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_update_discovery_task_unittest.cc
+++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_update_discovery_task_unittest.cc
@@ -28,12 +28,12 @@
 #include "chrome/browser/web_applications/test/web_app_test.h"
 #include "chrome/browser/web_applications/web_app_command_scheduler.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/browser/web_applications/web_contents/web_contents_manager.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/common/url_constants.h"
 #include "components/webapps/browser/installable/installable_logging.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "content/public/common/content_features.h"
 #include "net/http/http_status_code.h"
 #include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h"
@@ -313,7 +313,7 @@
 
     auto& page_state =
         fake_web_contents_manager().GetOrCreatePageState(install_url_);
-    page_state.url_load_result = WebAppUrlLoaderResult::kUrlLoaded;
+    page_state.url_load_result = webapps::WebAppUrlLoaderResult::kUrlLoaded;
     page_state.error_code = webapps::InstallableStatusCode::NO_ERROR_DETECTED;
     page_state.manifest_url =
         url_info_.origin().GetURL().Resolve("manifest.webmanifest");
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_update_manager_unittest.cc b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_update_manager_unittest.cc
index ecb0660..fca8b04 100644
--- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_update_manager_unittest.cc
+++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_update_manager_unittest.cc
@@ -244,7 +244,7 @@
         "/.well-known/_generated_install_page.html");
     auto& page_state =
         fake_web_contents_manager().GetOrCreatePageState(install_url);
-    page_state.url_load_result = WebAppUrlLoaderResult::kUrlLoaded;
+    page_state.url_load_result = webapps::WebAppUrlLoaderResult::kUrlLoaded;
     page_state.error_code = webapps::InstallableStatusCode::NO_ERROR_DETECTED;
     page_state.manifest_url =
         url_info.origin().GetURL().Resolve("manifest.webmanifest");
@@ -399,7 +399,7 @@
 
     auto& page_state =
         fake_web_contents_manager().GetOrCreatePageState(install_url);
-    page_state.url_load_result = WebAppUrlLoaderResult::kUrlLoaded;
+    page_state.url_load_result = webapps::WebAppUrlLoaderResult::kUrlLoaded;
     page_state.error_code = webapps::InstallableStatusCode::NO_ERROR_DETECTED;
     page_state.manifest_url =
         iwa_info.url_info.origin().GetURL().Resolve("manifest.webmanifest");
diff --git a/chrome/browser/web_applications/isolated_web_apps/signed_web_bundle_metadata.cc b/chrome/browser/web_applications/isolated_web_apps/signed_web_bundle_metadata.cc
index 67a7c75..adb7bf0 100644
--- a/chrome/browser/web_applications/isolated_web_apps/signed_web_bundle_metadata.cc
+++ b/chrome/browser/web_applications/isolated_web_apps/signed_web_bundle_metadata.cc
@@ -20,8 +20,8 @@
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
 #include "chrome/browser/web_applications/web_contents/web_app_data_retriever.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/browser/web_applications/web_contents/web_contents_manager.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "content/public/browser/web_contents.h"
 
 namespace web_app {
@@ -173,7 +173,7 @@
 
   std::unique_ptr<content::WebContents> web_contents_;
 
-  std::unique_ptr<WebAppUrlLoader> url_loader_;
+  std::unique_ptr<webapps::WebAppUrlLoader> url_loader_;
 
   base::WeakPtrFactory<WebAppInstallInfoFetcher> weak_factory_{this};
 };
diff --git a/chrome/browser/web_applications/isolated_web_apps/signed_web_bundle_metadata_unittest.cc b/chrome/browser/web_applications/isolated_web_apps/signed_web_bundle_metadata_unittest.cc
index 3af65e25..130517f 100644
--- a/chrome/browser/web_applications/isolated_web_apps/signed_web_bundle_metadata_unittest.cc
+++ b/chrome/browser/web_applications/isolated_web_apps/signed_web_bundle_metadata_unittest.cc
@@ -20,10 +20,10 @@
 #include "chrome/browser/web_applications/test/web_app_icon_test_utils.h"
 #include "chrome/browser/web_applications/test/web_app_install_test_utils.h"
 #include "chrome/browser/web_applications/test/web_app_test.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/common/url_constants.h"
 #include "components/web_package/test_support/signed_web_bundles/web_bundle_signer.h"
 #include "components/webapps/browser/installable/installable_logging.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -96,7 +96,7 @@
                       "/.well-known/_generated_install_page.html"}));
     auto& page_state = fake_web_contents_manager.GetOrCreatePageState(url);
 
-    page_state.url_load_result = WebAppUrlLoaderResult::kUrlLoaded;
+    page_state.url_load_result = webapps::WebAppUrlLoaderResult::kUrlLoaded;
     page_state.error_code = webapps::InstallableStatusCode::NO_ERROR_DETECTED;
     page_state.manifest_url =
         url_info.origin().GetURL().Resolve("manifest.webmanifest");
diff --git a/chrome/browser/web_applications/isolated_web_apps/test/isolated_web_app_builder.cc b/chrome/browser/web_applications/isolated_web_apps/test/isolated_web_app_builder.cc
index 2bfc2f0a..1bafbd5 100644
--- a/chrome/browser/web_applications/isolated_web_apps/test/isolated_web_app_builder.cc
+++ b/chrome/browser/web_applications/isolated_web_apps/test/isolated_web_app_builder.cc
@@ -95,7 +95,8 @@
   GURL install_url = base_url.Resolve(kInstallPagePath);
   FakeWebContentsManager::FakePageState& install_page_state =
       fake_web_contents_manager.GetOrCreatePageState(install_url);
-  install_page_state.url_load_result = WebAppUrlLoaderResult::kUrlLoaded;
+  install_page_state.url_load_result =
+      webapps::WebAppUrlLoaderResult::kUrlLoaded;
   install_page_state.error_code =
       webapps::InstallableStatusCode::NO_ERROR_DETECTED;
   install_page_state.manifest_url = base_url.Resolve(kManifestPath);
diff --git a/chrome/browser/web_applications/isolated_web_apps/test/iwa_test_server_configurator.cc b/chrome/browser/web_applications/isolated_web_apps/test/iwa_test_server_configurator.cc
index 6e81052..4fe7fe6 100644
--- a/chrome/browser/web_applications/isolated_web_apps/test/iwa_test_server_configurator.cc
+++ b/chrome/browser/web_applications/isolated_web_apps/test/iwa_test_server_configurator.cc
@@ -36,7 +36,7 @@
 
   auto& page_state =
       fake_web_contents_manager.GetOrCreatePageState(install_url);
-  page_state.url_load_result = web_app::WebAppUrlLoaderResult::kUrlLoaded;
+  page_state.url_load_result = webapps::WebAppUrlLoaderResult::kUrlLoaded;
   page_state.error_code = webapps::InstallableStatusCode::NO_ERROR_DETECTED;
   page_state.manifest_url = origin_url.Resolve("manifest.webmanifest");
   page_state.valid_manifest_for_web_app = true;
diff --git a/chrome/browser/web_applications/jobs/install_placeholder_job.cc b/chrome/browser/web_applications/jobs/install_placeholder_job.cc
index c2185af..fa35519 100644
--- a/chrome/browser/web_applications/jobs/install_placeholder_job.cc
+++ b/chrome/browser/web_applications/jobs/install_placeholder_job.cc
@@ -19,9 +19,9 @@
 #include "chrome/browser/web_applications/web_app_install_utils.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
 #include "chrome/browser/web_applications/web_contents/web_app_data_retriever.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/browser/web_applications/web_contents/web_contents_manager.h"
 #include "components/webapps/browser/install_result_code.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "content/public/browser/web_contents.h"
 #include "ui/gfx/geometry/size.h"
 
@@ -66,7 +66,7 @@
 void InstallPlaceholderJob::Start() {
   url_loader_ = lock_->web_contents_manager().CreateUrlLoader();
   url_loader_->LoadUrl(install_options_.install_url, web_contents_,
-                       WebAppUrlLoader::UrlComparison::kSameOrigin,
+                       webapps::WebAppUrlLoader::UrlComparison::kSameOrigin,
                        base::BindOnce(&InstallPlaceholderJob::OnUrlLoaded,
                                       weak_factory_.GetWeakPtr()));
 }
@@ -86,7 +86,7 @@
 }
 
 void InstallPlaceholderJob::OnUrlLoaded(
-    WebAppUrlLoader::Result load_url_result) {
+    webapps::WebAppUrlLoaderResult load_url_result) {
   CHECK(web_contents_ && !web_contents_->IsBeingDestroyed());
 
   if (install_options_.override_icon_url) {
diff --git a/chrome/browser/web_applications/jobs/install_placeholder_job.h b/chrome/browser/web_applications/jobs/install_placeholder_job.h
index c6ae77ad..f5b82b8 100644
--- a/chrome/browser/web_applications/jobs/install_placeholder_job.h
+++ b/chrome/browser/web_applications/jobs/install_placeholder_job.h
@@ -13,7 +13,6 @@
 #include "chrome/browser/web_applications/external_install_options.h"
 #include "chrome/browser/web_applications/externally_managed_app_manager.h"
 #include "chrome/browser/web_applications/web_app_install_utils.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 
 class Profile;
 
@@ -21,6 +20,11 @@
 class WebContents;
 }
 
+namespace webapps {
+class WebAppUrlLoader;
+enum class WebAppUrlLoaderResult;
+}  // namespace webapps
+
 namespace web_app {
 
 class SharedWebContentsWithAppLock;
@@ -50,7 +54,7 @@
   void Abort(webapps::InstallResultCode code);
   void FetchCustomIcon(const GURL& url, int retries_left);
 
-  void OnUrlLoaded(WebAppUrlLoader::Result load_url_result);
+  void OnUrlLoaded(webapps::WebAppUrlLoaderResult load_url_result);
   void OnCustomIconFetched(const GURL& image_url,
                            int retries_left,
                            IconsDownloadedResult result,
@@ -76,7 +80,7 @@
   InstallAndReplaceCallback callback_;
 
   raw_ptr<content::WebContents> web_contents_;
-  std::unique_ptr<WebAppUrlLoader> url_loader_;
+  std::unique_ptr<webapps::WebAppUrlLoader> url_loader_;
   std::unique_ptr<WebAppDataRetriever> data_retriever_;
 
   base::WeakPtrFactory<InstallPlaceholderJob> weak_factory_{this};
diff --git a/chrome/browser/web_applications/jobs/install_placeholder_job_unittest.cc b/chrome/browser/web_applications/jobs/install_placeholder_job_unittest.cc
index 725e811..d93f46f 100644
--- a/chrome/browser/web_applications/jobs/install_placeholder_job_unittest.cc
+++ b/chrome/browser/web_applications/jobs/install_placeholder_job_unittest.cc
@@ -29,8 +29,8 @@
 #include "chrome/browser/web_applications/web_app_helpers.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
 #include "chrome/browser/web_applications/web_app_registrar.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "components/webapps/browser/install_result_code.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "components/webapps/common/web_app_id.h"
 #include "net/http/http_status_code.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/web_applications/test/fake_web_contents_manager.cc b/chrome/browser/web_applications/test/fake_web_contents_manager.cc
index 21292f2..20a303a 100644
--- a/chrome/browser/web_applications/test/fake_web_contents_manager.cc
+++ b/chrome/browser/web_applications/test/fake_web_contents_manager.cc
@@ -18,7 +18,7 @@
 #include "chrome/browser/web_applications/web_app_install_utils.h"
 #include "chrome/browser/web_applications/web_contents/web_app_data_retriever.h"
 #include "chrome/browser/web_applications/web_contents/web_app_icon_downloader.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "components/webapps/common/web_page_metadata.mojom.h"
 #include "content/public/browser/web_contents.h"
 #include "third_party/blink/public/mojom/manifest/manifest.mojom.h"
@@ -27,9 +27,10 @@
 
 namespace web_app {
 namespace {
-bool EqualsWithComparison(const GURL& a,
-                          const GURL& b,
-                          WebAppUrlLoader::UrlComparison url_comparison) {
+bool EqualsWithComparison(
+    const GURL& a,
+    const GURL& b,
+    webapps::WebAppUrlLoader::UrlComparison url_comparison) {
   DCHECK(a.is_valid());
   DCHECK(b.is_valid());
   if (a == b) {
@@ -37,12 +38,12 @@
   }
   GURL::Replacements replace;
   switch (url_comparison) {
-    case WebAppUrlLoader::UrlComparison::kExact:
+    case webapps::WebAppUrlLoader::UrlComparison::kExact:
       return false;
-    case WebAppUrlLoader::UrlComparison::kSameOrigin:
+    case webapps::WebAppUrlLoader::UrlComparison::kSameOrigin:
       replace.ClearPath();
       [[fallthrough]];
-    case WebAppUrlLoader::UrlComparison::kIgnoreQueryParamsAndRef:
+    case webapps::WebAppUrlLoader::UrlComparison::kIgnoreQueryParamsAndRef:
       replace.ClearQuery();
       replace.ClearRef();
       break;
@@ -53,7 +54,7 @@
 
 // TODO(http://b/262606416): Replace FakeWebAppUrlLoader with this by redoing
 // how the web contents dependency is wrapped.
-class FakeWebContentsManager::FakeUrlLoader : public WebAppUrlLoader {
+class FakeWebContentsManager::FakeUrlLoader : public webapps::WebAppUrlLoader {
  public:
   explicit FakeUrlLoader(base::WeakPtr<FakeWebContentsManager> manager)
       : manager_(manager) {}
@@ -76,8 +77,9 @@
       DLOG(WARNING) << "No page state at url: " << url.spec();
       base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
           FROM_HERE,
-          base::BindOnce(std::move(callback),
-                         WebAppUrlLoaderResult::kFailedErrorPageLoaded));
+          base::BindOnce(
+              std::move(callback),
+              webapps::WebAppUrlLoaderResult::kFailedErrorPageLoaded));
       return;
     }
     FakeWebContentsManager::FakePageState& page = page_it->second;
@@ -88,8 +90,9 @@
                                 url_comparison)) {
         base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
             FROM_HERE,
-            base::BindOnce(std::move(callback),
-                           WebAppUrlLoaderResult::kRedirectedUrlLoaded));
+            base::BindOnce(
+                std::move(callback),
+                webapps::WebAppUrlLoaderResult::kRedirectedUrlLoaded));
         return;
       }
     }
@@ -368,7 +371,8 @@
   loaded_urls_[web_contents] = url;
 }
 
-std::unique_ptr<WebAppUrlLoader> FakeWebContentsManager::CreateUrlLoader() {
+std::unique_ptr<webapps::WebAppUrlLoader>
+FakeWebContentsManager::CreateUrlLoader() {
   return std::make_unique<FakeUrlLoader>(weak_factory_.GetWeakPtr());
 }
 
@@ -401,7 +405,8 @@
     const GURL& start_url,
     std::u16string_view name) {
   FakePageState& install_page_state = GetOrCreatePageState(install_url);
-  install_page_state.url_load_result = WebAppUrlLoaderResult::kUrlLoaded;
+  install_page_state.url_load_result =
+      webapps::WebAppUrlLoaderResult::kUrlLoaded;
   install_page_state.redirection_url = std::nullopt;
 
   install_page_state.title = u"Page title";
diff --git a/chrome/browser/web_applications/test/fake_web_contents_manager.h b/chrome/browser/web_applications/test/fake_web_contents_manager.h
index a2139ba..1bf0cf2 100644
--- a/chrome/browser/web_applications/test/fake_web_contents_manager.h
+++ b/chrome/browser/web_applications/test/fake_web_contents_manager.h
@@ -16,9 +16,9 @@
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "chrome/browser/web_applications/web_contents/web_app_data_retriever.h"
 #include "chrome/browser/web_applications/web_contents/web_app_icon_downloader.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/browser/web_applications/web_contents/web_contents_manager.h"
 #include "components/webapps/browser/installable/installable_logging.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "components/webapps/common/web_page_metadata.mojom-forward.h"
 #include "third_party/abseil-cpp/absl/types/variant.h"
 #include "third_party/blink/public/mojom/manifest/manifest.mojom.h"
@@ -66,8 +66,8 @@
     // will be given as the result. Otherwise,`kRedirectedUrlLoaded` is
     // returned.
     std::optional<GURL> redirection_url = std::nullopt;
-    WebAppUrlLoaderResult url_load_result =
-        WebAppUrlLoaderResult::kFailedErrorPageLoaded;
+    webapps::WebAppUrlLoaderResult url_load_result =
+        webapps::WebAppUrlLoaderResult::kFailedErrorPageLoaded;
 
     // `WebAppDataRetriever::GetWebAppInstallInfo`:
     bool return_null_info = false;
@@ -112,7 +112,7 @@
 
   void SetUrlLoaded(content::WebContents* web_contents, const GURL& url);
 
-  std::unique_ptr<WebAppUrlLoader> CreateUrlLoader() override;
+  std::unique_ptr<webapps::WebAppUrlLoader> CreateUrlLoader() override;
   std::unique_ptr<WebAppDataRetriever> CreateDataRetriever() override;
   std::unique_ptr<WebAppIconDownloader> CreateIconDownloader() override;
 
@@ -138,7 +138,7 @@
   using LoadUrlTracker = base::RepeatingCallback<void(
       content::NavigationController::LoadURLParams& load_url_params,
       content::WebContents* web_contents,
-      WebAppUrlLoader::UrlComparison url_comparison)>;
+      webapps::WebAppUrlLoader::UrlComparison url_comparison)>;
 
   // Specify a `base::RepeatingCallback` that is invoked with the arguments
   // passed to `WebAppUrlLoader::LoadUrl` whenever it is called on one of the
diff --git a/chrome/browser/web_applications/test/test_web_app_url_loader.h b/chrome/browser/web_applications/test/test_web_app_url_loader.h
index 4b1f3ec..b87a002 100644
--- a/chrome/browser/web_applications/test/test_web_app_url_loader.h
+++ b/chrome/browser/web_applications/test/test_web_app_url_loader.h
@@ -12,12 +12,12 @@
 #include "base/containers/queue.h"
 #include "base/functional/callback.h"
 #include "base/functional/callback_helpers.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "url/gurl.h"
 
 namespace web_app {
 
-class TestWebAppUrlLoader : public WebAppUrlLoader {
+class TestWebAppUrlLoader : public webapps::WebAppUrlLoader {
  public:
   TestWebAppUrlLoader();
   TestWebAppUrlLoader(const TestWebAppUrlLoader&) = delete;
diff --git a/chrome/browser/web_applications/web_app_command_manager.cc b/chrome/browser/web_applications/web_app_command_manager.cc
index 50c6cca..7393cb1 100644
--- a/chrome/browser/web_applications/web_app_command_manager.cc
+++ b/chrome/browser/web_applications/web_app_command_manager.cc
@@ -28,9 +28,9 @@
 #include "chrome/browser/web_applications/web_app_install_manager.h"
 #include "chrome/browser/web_applications/web_app_install_utils.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/browser/web_applications/web_contents/web_contents_manager.h"
 #include "chrome/common/chrome_features.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "content/public/browser/web_contents.h"
 
 namespace web_app {
diff --git a/chrome/browser/web_applications/web_app_command_manager.h b/chrome/browser/web_applications/web_app_command_manager.h
index 18555d31..fa02414 100644
--- a/chrome/browser/web_applications/web_app_command_manager.h
+++ b/chrome/browser/web_applications/web_app_command_manager.h
@@ -26,10 +26,13 @@
 class WebContents;
 }
 
+namespace webapps {
+class WebAppUrlLoader;
+}
+
 namespace web_app {
 
 class WebAppProvider;
-class WebAppUrlLoader;
 
 // The command manager is used to schedule commands or callbacks to write & read
 // from the WebAppProvider system. To use, simply call `ScheduleCommand` to
@@ -116,7 +119,7 @@
   raw_ptr<WebAppProvider> provider_ = nullptr;
 
   std::unique_ptr<content::WebContents> shared_web_contents_;
-  std::unique_ptr<WebAppUrlLoader> url_loader_;
+  std::unique_ptr<webapps::WebAppUrlLoader> url_loader_;
 
   bool started_ = false;
   bool is_in_shutdown_ = false;
diff --git a/chrome/browser/web_applications/web_app_command_scheduler.cc b/chrome/browser/web_applications/web_app_command_scheduler.cc
index c90e234..fc25a0f06 100644
--- a/chrome/browser/web_applications/web_app_command_scheduler.cc
+++ b/chrome/browser/web_applications/web_app_command_scheduler.cc
@@ -75,6 +75,7 @@
 #include "components/keep_alive_registry/keep_alive_types.h"
 #include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "components/webapps/browser/installable/installable_metrics.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "content/public/browser/storage_partition_config.h"
 #include "content/public/browser/web_contents.h"
 
@@ -250,7 +251,7 @@
       std::make_unique<NavigateAndTriggerInstallDialogCommand>(
           install_url, origin, is_renderer_initiated, std::move(callback),
           provider_->ui_manager().GetWeakPtr(),
-          std::make_unique<WebAppUrlLoader>(),
+          std::make_unique<webapps::WebAppUrlLoader>(),
           std::make_unique<WebAppDataRetriever>(), &*profile_),
       location);
 }
diff --git a/chrome/browser/web_applications/web_app_logging.cc b/chrome/browser/web_applications/web_app_logging.cc
index c6539eb..154a698 100644
--- a/chrome/browser/web_applications/web_app_logging.cc
+++ b/chrome/browser/web_applications/web_app_logging.cc
@@ -10,9 +10,9 @@
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "chrome/browser/web_applications/web_app_install_utils.h"
 #include "chrome/browser/web_applications/web_app_utils.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "chrome/common/chrome_features.h"
 #include "components/webapps/browser/installable/installable_metrics.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 #include "components/webapps/common/web_app_id.h"
 #include "net/http/http_status_code.h"
 
@@ -57,9 +57,10 @@
   return error_dict;
 }
 
-void InstallErrorLogEntry::LogUrlLoaderError(const char* stage,
-                                             const std::string& url,
-                                             WebAppUrlLoader::Result result) {
+void InstallErrorLogEntry::LogUrlLoaderError(
+    const char* stage,
+    const std::string& url,
+    webapps::WebAppUrlLoaderResult result) {
   if (!error_dict_)
     return;
 
diff --git a/chrome/browser/web_applications/web_app_logging.h b/chrome/browser/web_applications/web_app_logging.h
index c07473b4..fbfb245 100644
--- a/chrome/browser/web_applications/web_app_logging.h
+++ b/chrome/browser/web_applications/web_app_logging.h
@@ -12,10 +12,13 @@
 #include "chrome/browser/web_applications/web_app_constants.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "chrome/browser/web_applications/web_app_install_utils.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
 #include "components/webapps/browser/installable/installable_metrics.h"
 #include "components/webapps/common/web_app_id.h"
 
+namespace webapps {
+enum class WebAppUrlLoaderResult;
+}
+
 namespace web_app {
 
 // This class is used to accumulate a single log entry
@@ -39,7 +42,7 @@
 
   void LogUrlLoaderError(const char* stage,
                          const std::string& url,
-                         WebAppUrlLoader::Result result);
+                         webapps::WebAppUrlLoaderResult result);
   void LogExpectedAppIdError(const char* stage,
                              const std::string& url,
                              const webapps::AppId& app_id,
diff --git a/chrome/browser/web_applications/web_contents/web_contents_manager.cc b/chrome/browser/web_applications/web_contents/web_contents_manager.cc
index 0f373d49..b2f78b2 100644
--- a/chrome/browser/web_applications/web_contents/web_contents_manager.cc
+++ b/chrome/browser/web_applications/web_contents/web_contents_manager.cc
@@ -8,15 +8,16 @@
 
 #include "chrome/browser/web_applications/web_contents/web_app_data_retriever.h"
 #include "chrome/browser/web_applications/web_contents/web_app_icon_downloader.h"
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 
 namespace web_app {
 
 WebContentsManager::WebContentsManager() = default;
 WebContentsManager::~WebContentsManager() = default;
 
-std::unique_ptr<WebAppUrlLoader> WebContentsManager::CreateUrlLoader() {
-  return std::make_unique<WebAppUrlLoader>();
+std::unique_ptr<webapps::WebAppUrlLoader>
+WebContentsManager::CreateUrlLoader() {
+  return std::make_unique<webapps::WebAppUrlLoader>();
 }
 
 std::unique_ptr<WebAppDataRetriever> WebContentsManager::CreateDataRetriever() {
diff --git a/chrome/browser/web_applications/web_contents/web_contents_manager.h b/chrome/browser/web_applications/web_contents/web_contents_manager.h
index c3d1f201..c94e5a7 100644
--- a/chrome/browser/web_applications/web_contents/web_contents_manager.h
+++ b/chrome/browser/web_applications/web_contents/web_contents_manager.h
@@ -8,11 +8,14 @@
 #include <memory>
 #include "base/memory/weak_ptr.h"
 
+namespace webapps {
+class WebAppUrlLoader;
+}
+
 namespace web_app {
 
 class WebAppDataRetriever;
 class WebAppIconDownloader;
-class WebAppUrlLoader;
 
 // This manager is intended to wrap all of the functionality that the
 // `WebAppProvider` system needs from `WebContents`. This encompasses retrieving
@@ -28,7 +31,7 @@
   WebContentsManager();
   virtual ~WebContentsManager();
 
-  virtual std::unique_ptr<WebAppUrlLoader> CreateUrlLoader();
+  virtual std::unique_ptr<webapps::WebAppUrlLoader> CreateUrlLoader();
 
   virtual std::unique_ptr<WebAppDataRetriever> CreateDataRetriever();
 
diff --git a/chrome/browser/web_applications/web_contents/web_app_url_loader_browsertest.cc b/chrome/browser/webapps/web_contents/web_app_url_loader_browsertest.cc
similarity index 93%
rename from chrome/browser/web_applications/web_contents/web_app_url_loader_browsertest.cc
rename to chrome/browser/webapps/web_contents/web_app_url_loader_browsertest.cc
index 189f00c1..5df71d75 100644
--- a/chrome/browser/web_applications/web_contents/web_app_url_loader_browsertest.cc
+++ b/chrome/browser/webapps/web_contents/web_app_url_loader_browsertest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 
 #include <optional>
 
@@ -17,9 +17,8 @@
 #include "base/test/test_mock_time_task_runner.h"
 #include "base/time/time.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h"
-#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/chrome_test_utils.h"
+#include "content/public/browser/web_contents_observer.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_test.h"
 #include "net/dns/mock_host_resolver.h"
@@ -28,7 +27,14 @@
 #include "net/test/embedded_test_server/http_response.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace web_app {
+#if BUILDFLAG(IS_ANDROID)
+#include "chrome/test/base/android/android_browser_test.h"
+#else
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#endif
+
+namespace webapps {
 
 using UrlResult = WebAppUrlLoader::Result;
 using UrlComparison = WebAppUrlLoader::UrlComparison;
@@ -68,7 +74,7 @@
   return http_response;
 }
 
-class WebAppUrlLoaderTest : public WebAppControllerBrowserTest {
+class WebAppUrlLoaderTest : public PlatformBrowserTest {
  public:
   WebAppUrlLoaderTest() = default;
   WebAppUrlLoaderTest(const WebAppUrlLoaderTest&) = delete;
@@ -77,16 +83,16 @@
 
   void SetUpOnMainThread() override {
     web_contents_ = content::WebContents::Create(
-        content::WebContents::CreateParams(browser()->profile()));
+        content::WebContents::CreateParams(profile()));
 
     host_resolver()->AddRule("*", "127.0.0.1");
-    WebAppControllerBrowserTest::SetUpOnMainThread();
+    PlatformBrowserTest::SetUpOnMainThread();
   }
 
   void TearDownOnMainThread() override {
     // The WebContents needs to be destroyed before the profile.
     web_contents_.reset();
-    WebAppControllerBrowserTest::TearDownOnMainThread();
+    PlatformBrowserTest::TearDownOnMainThread();
   }
 
   UrlResult LoadUrlAndWait(UrlComparison url_comparison,
@@ -110,6 +116,10 @@
   }
 
  protected:
+Profile* profile() {
+  return chrome_test_utils::GetProfile(this);
+}
+
   content::WebContents* web_contents() { return web_contents_.get(); }
 
   void ResetWebContents() { web_contents_.reset(); }
@@ -245,7 +255,8 @@
   // Forward the clock so that |loader| times out first load of about:blank.
   // It is unclear why this load also needs to time out, and can't just load
   // correctly.
-  task_runner->FastForwardBy(WebAppUrlLoader::kSecondsToWaitForWebContentsLoad);
+  task_runner->FastForwardBy(
+    webapps::WebAppUrlLoader::kSecondsToWaitForWebContentsLoad);
   task_runner->RunUntilIdle();
 
   // Run all pending tasks. The URL should still be loading now.
@@ -257,7 +268,8 @@
   EXPECT_FALSE(result.has_value());
 
   // Forward the clock so that |loader| times out.
-  task_runner->FastForwardBy(WebAppUrlLoader::kSecondsToWaitForWebContentsLoad);
+  task_runner->FastForwardBy(
+    webapps::WebAppUrlLoader::kSecondsToWaitForWebContentsLoad);
   task_runner->RunUntilIdle();
   ASSERT_TRUE(result);
   EXPECT_EQ(UrlResult::kFailedPageTookTooLong, result.value());
@@ -298,10 +310,10 @@
 
   std::unique_ptr<content::WebContents> web_contents1 =
       content::WebContents::Create(
-          content::WebContents::CreateParams(browser()->profile()));
+          content::WebContents::CreateParams(profile()));
   std::unique_ptr<content::WebContents> web_contents2 =
       content::WebContents::Create(
-          content::WebContents::CreateParams(browser()->profile()));
+          content::WebContents::CreateParams(profile()));
 
   base::RunLoop run_loop;
   base::RepeatingClosure barrier_closure =
@@ -403,4 +415,4 @@
                                UrlResult::kUrlLoaded, 2);
 }
 
-}  // namespace web_app
+}  // namespace webapps
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 1ab5e76..8de5b9c 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1349,6 +1349,7 @@
       "../browser/ui/webui/policy/policy_test_ui_browsertest.cc",
       "../browser/ui/webui/policy/policy_ui_browsertest.cc",
       "../browser/user_agent/android_user_agent_browsertest.cc",
+      "../browser/webapps/web_contents/web_app_url_loader_browsertest.cc",
       "../renderer/autofill/fake_mojo_password_manager_driver.cc",
       "../renderer/autofill/fake_mojo_password_manager_driver.h",
       "../renderer/autofill/fake_password_generation_driver.cc",
@@ -2374,6 +2375,7 @@
       "../browser/tpcd/support/top_level_trial_service_browsertest.cc",
       "../browser/tpcd/support/tpcd_support_browsertest.cc",
       "../browser/tpcd/support/validity_service_browsertest.cc",
+      "../browser/webapps/web_contents/web_app_url_loader_browsertest.cc",
 
       # TODO(b/246519185) - Py3 incompatible, decide if to keep test.
       # "../browser/media/webrtc/webrtc_apprtc_browsertest.cc",
diff --git a/components/webapps/browser/BUILD.gn b/components/webapps/browser/BUILD.gn
index d9b13e9..647651f9 100644
--- a/components/webapps/browser/BUILD.gn
+++ b/components/webapps/browser/BUILD.gn
@@ -68,6 +68,8 @@
     "installable/ml_installability_promoter.h",
     "pwa_install_path_tracker.cc",
     "pwa_install_path_tracker.h",
+    "web_contents/web_app_url_loader.cc",
+    "web_contents/web_app_url_loader.h",
     "webapps_client.cc",
     "webapps_client.h",
   ]
@@ -192,6 +194,7 @@
     "installable/installable_evaluator_unittest.cc",
     "installable/installable_task_queue_unittest.cc",
     "pwa_install_path_tracker_unittest.cc",
+    "web_contents/web_app_url_loader_unittest.cc",
   ]
   deps = [
     ":browser",
diff --git a/components/webapps/browser/DEPS b/components/webapps/browser/DEPS
index 19cb90b..e810068 100644
--- a/components/webapps/browser/DEPS
+++ b/components/webapps/browser/DEPS
@@ -19,9 +19,11 @@
   "+content/public/test",
   "+mojo/public/cpp",
   "+net/base",
+  "+net/http",
   "+storage/browser/quota",
   "+services/metrics/public/cpp",
   "+services/network/public/cpp",
+  "+services/network/public/mojom",
   "+services/service_manager/public/cpp",
   "+skia/ext",
   "+third_party/blink/public/common",
diff --git a/chrome/browser/web_applications/web_contents/web_app_url_loader.cc b/components/webapps/browser/web_contents/web_app_url_loader.cc
similarity index 98%
rename from chrome/browser/web_applications/web_contents/web_app_url_loader.cc
rename to components/webapps/browser/web_contents/web_app_url_loader.cc
index 9ba4f12..cb92e01b 100644
--- a/chrome/browser/web_applications/web_contents/web_app_url_loader.cc
+++ b/components/webapps/browser/web_contents/web_app_url_loader.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 
 #include <memory>
 #include <utility>
@@ -27,7 +27,7 @@
 #include "url/gurl.h"
 #include "url/url_constants.h"
 
-namespace web_app {
+namespace webapps {
 namespace {
 using UrlComparison = WebAppUrlLoader::UrlComparison;
 
diff --git a/chrome/browser/web_applications/web_contents/web_app_url_loader.h b/components/webapps/browser/web_contents/web_app_url_loader.h
similarity index 92%
rename from chrome/browser/web_applications/web_contents/web_app_url_loader.h
rename to components/webapps/browser/web_contents/web_app_url_loader.h
index 33441b7..896c61e 100644
--- a/chrome/browser/web_applications/web_contents/web_app_url_loader.h
+++ b/components/webapps/browser/web_contents/web_app_url_loader.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_WEB_APPLICATIONS_WEB_CONTENTS_WEB_APP_URL_LOADER_H_
-#define CHROME_BROWSER_WEB_APPLICATIONS_WEB_CONTENTS_WEB_APP_URL_LOADER_H_
+#ifndef COMPONENTS_WEBAPPS_BROWSER_WEB_CONTENTS_WEB_APP_URL_LOADER_H_
+#define COMPONENTS_WEBAPPS_BROWSER_WEB_CONTENTS_WEB_APP_URL_LOADER_H_
 
 #include "base/functional/callback_forward.h"
 #include "base/memory/weak_ptr.h"
@@ -16,7 +16,7 @@
 class WebContents;
 }  // namespace content
 
-namespace web_app {
+namespace webapps {
 
 // Result enum values are persisted to logs. Entries should not be renumbered
 // and numeric values should never be reused. Update corresponding enums.xml
@@ -96,4 +96,4 @@
 
 }  // namespace web_app
 
-#endif  // CHROME_BROWSER_WEB_APPLICATIONS_WEB_CONTENTS_WEB_APP_URL_LOADER_H_
+#endif  // COMPONENTS_WEBAPPS_BROWSER_WEB_CONTENTS_WEB_APP_URL_LOADER_H_
diff --git a/chrome/browser/web_applications/web_contents/web_app_url_loader_unittest.cc b/components/webapps/browser/web_contents/web_app_url_loader_unittest.cc
similarity index 93%
rename from chrome/browser/web_applications/web_contents/web_app_url_loader_unittest.cc
rename to components/webapps/browser/web_contents/web_app_url_loader_unittest.cc
index 28e03cb..057317c 100644
--- a/chrome/browser/web_applications/web_contents/web_app_url_loader_unittest.cc
+++ b/components/webapps/browser/web_contents/web_app_url_loader_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/web_applications/web_contents/web_app_url_loader.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
 
 #include <memory>
 #include <optional>
@@ -12,23 +12,23 @@
 #include "base/task/sequenced_task_runner.h"
 #include "base/test/bind.h"
 #include "base/test/test_future.h"
-#include "chrome/browser/web_applications/test/web_app_test.h"
+#include "content/public/test/test_renderer_host.h"
 #include "content/public/common/url_constants.h"
 #include "content/public/test/web_contents_tester.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace web_app {
+namespace webapps {
 
-class WebAppUrlLoaderTest : public WebAppTest {
+class WebAppUrlLoaderTest  : public content::RenderViewHostTestHarness  {
  public:
   void SetUp() override {
-    WebAppTest::SetUp();
+    content::RenderViewHostTestHarness::SetUp();
     loader_ = std::make_unique<WebAppUrlLoader>();
   }
 
   void TearDown() override {
     loader_.reset();
-    WebAppTest::TearDown();
+    content::RenderViewHostTestHarness::TearDown();
   }
 
   content::WebContentsTester& web_contents_tester() {