Add chrome://files-internals/ SMB logging UI

This also adds an smbfs.enable_verbose_logging pref, similar to the
existing drivefs.enable_verbose_logging pref.

Bug: chromium:1342817
Change-Id: I5877a9fa7f998dfa6da6ee3ad3ec5f245ea76c3d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3954823
Reviewed-by: Dominick Ng <[email protected]>
Reviewed-by: Giovanni Ortuno Urquidi <[email protected]>
Reviewed-by: Ben Reich <[email protected]>
Reviewed-by: Dominic Battré <[email protected]>
Commit-Queue: Nigel Tao <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1060217}
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 02d90ac..4bfc8e90 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -5187,6 +5187,7 @@
       "//ash/webui/file_manager:file_manager_ui",
       "//ash/webui/file_manager/mojom",
       "//ash/webui/files_internals",
+      "//ash/webui/files_internals/mojom",
       "//ash/webui/firmware_update_ui",
       "//ash/webui/firmware_update_ui/mojom",
       "//ash/webui/guest_os_installer",
diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn
index bb42c2bfc..03458b1 100644
--- a/chrome/browser/ash/BUILD.gn
+++ b/chrome/browser/ash/BUILD.gn
@@ -989,6 +989,8 @@
     "file_manager/file_manager_copy_or_move_hook_delegate.h",
     "file_manager/file_manager_copy_or_move_hook_file_check_delegate.cc",
     "file_manager/file_manager_copy_or_move_hook_file_check_delegate.h",
+    "file_manager/file_manager_pref_names.cc",
+    "file_manager/file_manager_pref_names.h",
     "file_manager/file_manager_string_util.cc",
     "file_manager/file_manager_string_util.h",
     "file_manager/file_tasks.cc",
diff --git a/chrome/browser/ash/file_manager/file_manager_pref_names.cc b/chrome/browser/ash/file_manager/file_manager_pref_names.cc
new file mode 100644
index 0000000..c64888f02
--- /dev/null
+++ b/chrome/browser/ash/file_manager/file_manager_pref_names.cc
@@ -0,0 +1,18 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ash/file_manager/file_manager_pref_names.h"
+
+#include "components/prefs/pref_registry_simple.h"
+
+namespace file_manager::prefs {
+
+// A boolean pref to enable or disable /usr/sbin/smbfs verbose logging.
+const char kSmbfsEnableVerboseLogging[] = "smbfs.enable_verbose_logging";
+
+void RegisterProfilePrefs(PrefRegistrySimple* registry) {
+  registry->RegisterBooleanPref(kSmbfsEnableVerboseLogging, false);
+}
+
+}  // namespace file_manager::prefs
diff --git a/chrome/browser/ash/file_manager/file_manager_pref_names.h b/chrome/browser/ash/file_manager/file_manager_pref_names.h
new file mode 100644
index 0000000..0c784d5
--- /dev/null
+++ b/chrome/browser/ash/file_manager/file_manager_pref_names.h
@@ -0,0 +1,18 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_ASH_FILE_MANAGER_FILE_MANAGER_PREF_NAMES_H_
+#define CHROME_BROWSER_ASH_FILE_MANAGER_FILE_MANAGER_PREF_NAMES_H_
+
+class PrefRegistrySimple;
+
+namespace file_manager::prefs {
+
+extern const char kSmbfsEnableVerboseLogging[];
+
+void RegisterProfilePrefs(PrefRegistrySimple* registry);
+
+}  // namespace file_manager::prefs
+
+#endif  // CHROME_BROWSER_ASH_FILE_MANAGER_FILE_MANAGER_PREF_NAMES_H_
diff --git a/chrome/browser/ash/smb_client/smb_service.cc b/chrome/browser/ash/smb_client/smb_service.cc
index ad38acd4..f60001f 100644
--- a/chrome/browser/ash/smb_client/smb_service.cc
+++ b/chrome/browser/ash/smb_client/smb_service.cc
@@ -16,6 +16,7 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/default_tick_clock.h"
 #include "base/unguessable_token.h"
+#include "chrome/browser/ash/file_manager/file_manager_pref_names.h"
 #include "chrome/browser/ash/file_system_provider/mount_path_util.h"
 #include "chrome/browser/ash/file_system_provider/provided_file_system_info.h"
 #include "chrome/browser/ash/kerberos/kerberos_credentials_manager.h"
@@ -370,6 +371,8 @@
   smbfs_options.password = password;
   smbfs_options.allow_ntlm = IsNTLMAuthenticationEnabled();
   smbfs_options.skip_connect = skip_connect;
+  smbfs_options.enable_verbose_logging = profile_->GetPrefs()->GetBoolean(
+      file_manager::prefs::kSmbfsEnableVerboseLogging);
   if (save_credentials && !info.password_salt().empty()) {
     smbfs_options.save_restore_password = true;
     smbfs_options.account_hash = user->username_hash();
diff --git a/chrome/browser/ash/web_applications/files_internals_ui_delegate.cc b/chrome/browser/ash/web_applications/files_internals_ui_delegate.cc
index be13b74..93db820d 100644
--- a/chrome/browser/ash/web_applications/files_internals_ui_delegate.cc
+++ b/chrome/browser/ash/web_applications/files_internals_ui_delegate.cc
@@ -5,9 +5,16 @@
 #include "chrome/browser/ash/web_applications/files_internals_ui_delegate.h"
 
 #include "base/values.h"
+#include "chrome/browser/ash/file_manager/file_manager_pref_names.h"
 #include "chrome/browser/ash/fusebox/fusebox_server.h"
+#include "chrome/browser/profiles/profile.h"
+#include "components/prefs/pref_service.h"
 
-ChromeFilesInternalsUIDelegate::ChromeFilesInternalsUIDelegate() = default;
+ChromeFilesInternalsUIDelegate::ChromeFilesInternalsUIDelegate(
+    content::WebUI* web_ui)
+    : web_ui_(web_ui) {}
+
+ChromeFilesInternalsUIDelegate::~ChromeFilesInternalsUIDelegate() = default;
 
 base::Value ChromeFilesInternalsUIDelegate::GetDebugJSON() const {
   base::Value::Dict dict;
@@ -20,3 +27,18 @@
 
   return base::Value(std::move(dict));
 }
+
+bool ChromeFilesInternalsUIDelegate::GetSmbfsEnableVerboseLogging() const {
+  Profile* profile = Profile::FromWebUI(web_ui_);
+  return profile && profile->GetPrefs()->GetBoolean(
+                        file_manager::prefs::kSmbfsEnableVerboseLogging);
+}
+
+void ChromeFilesInternalsUIDelegate::SetSmbfsEnableVerboseLogging(
+    bool enabled) {
+  Profile* profile = Profile::FromWebUI(web_ui_);
+  if (profile) {
+    profile->GetPrefs()->SetBoolean(
+        file_manager::prefs::kSmbfsEnableVerboseLogging, enabled);
+  }
+}
diff --git a/chrome/browser/ash/web_applications/files_internals_ui_delegate.h b/chrome/browser/ash/web_applications/files_internals_ui_delegate.h
index 85f38889..367edcc 100644
--- a/chrome/browser/ash/web_applications/files_internals_ui_delegate.h
+++ b/chrome/browser/ash/web_applications/files_internals_ui_delegate.h
@@ -6,18 +6,29 @@
 #define CHROME_BROWSER_ASH_WEB_APPLICATIONS_FILES_INTERNALS_UI_DELEGATE_H_
 
 #include "ash/webui/files_internals/files_internals_ui_delegate.h"
+#include "base/memory/raw_ptr.h"
+
+namespace content {
+class WebUI;
+}  // namespace content
 
 // Chrome browser FilesInternalsUIDelegate implementation.
 class ChromeFilesInternalsUIDelegate : public ash::FilesInternalsUIDelegate {
  public:
-  ChromeFilesInternalsUIDelegate();
-
+  explicit ChromeFilesInternalsUIDelegate(content::WebUI* web_ui);
   ChromeFilesInternalsUIDelegate(const ChromeFilesInternalsUIDelegate&) =
       delete;
   ChromeFilesInternalsUIDelegate& operator=(
       const ChromeFilesInternalsUIDelegate&) = delete;
+  ~ChromeFilesInternalsUIDelegate() override;
 
   base::Value GetDebugJSON() const override;
+
+  bool GetSmbfsEnableVerboseLogging() const override;
+  void SetSmbfsEnableVerboseLogging(bool enabled) override;
+
+ private:
+  raw_ptr<content::WebUI> web_ui_;  // Owns |this|.
 };
 
 #endif  // CHROME_BROWSER_ASH_WEB_APPLICATIONS_FILES_INTERNALS_UI_DELEGATE_H_
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc
index a17ee4a..a4f2359 100644
--- a/chrome/browser/chrome_browser_interface_binders.cc
+++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -227,6 +227,8 @@
 #include "ash/webui/face_ml_app_ui/mojom/face_ml_app_ui.mojom.h"
 #include "ash/webui/file_manager/file_manager_ui.h"
 #include "ash/webui/file_manager/mojom/file_manager.mojom.h"
+#include "ash/webui/files_internals/files_internals.h"
+#include "ash/webui/files_internals/mojom/files_internals.mojom.h"
 #include "ash/webui/firmware_update_ui/firmware_update_app_ui.h"
 #include "ash/webui/firmware_update_ui/mojom/firmware_update.mojom.h"
 #include "ash/webui/guest_os_installer/guest_os_installer_ui.h"
@@ -1348,6 +1350,8 @@
     registry.ForWebUI<ash::ColorInternalsUI>()
         .Add<color_change_listener::mojom::PageHandler>();
   }
+  registry.ForWebUI<ash::FilesInternalsUI>()
+      .Add<ash::mojom::files_internals::PageHandler>();
   registry.ForWebUI<ash::file_manager::FileManagerUI>()
       .Add<color_change_listener::mojom::PageHandler>();
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index f8ba53d..da6e359 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -137,6 +137,7 @@
     "//ash/webui/resources:face_ml_app_bundle_resources_grit",
     "//ash/webui/resources:face_ml_app_resources_grit",
     "//ash/webui/resources:face_ml_app_untrusted_resources_grit",
+    "//ash/webui/resources:files_internals_resources_grit",
     "//ash/webui/resources:firmware_update_app_resources_grit",
     "//ash/webui/resources:help_app_resources_grit",
     "//ash/webui/resources:media_app_bundle_resources_grit",
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index bef2f7b..baffeeb 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -330,6 +330,7 @@
 #include "chrome/browser/ash/cryptauth/client_app_metadata_provider_service.h"
 #include "chrome/browser/ash/cryptauth/cryptauth_device_id_provider_impl.h"
 #include "chrome/browser/ash/customization/customization_document.h"
+#include "chrome/browser/ash/file_manager/file_manager_pref_names.h"
 #include "chrome/browser/ash/file_manager/file_tasks.h"
 #include "chrome/browser/ash/file_system_provider/registry.h"
 #include "chrome/browser/ash/first_run/first_run.h"
@@ -1518,6 +1519,7 @@
   policy::RebootNotificationsScheduler::RegisterProfilePrefs(registry);
   ash::KioskAppManager::RegisterProfilePrefs(registry);
   file_manager::file_tasks::RegisterProfilePrefs(registry);
+  file_manager::prefs::RegisterProfilePrefs(registry);
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 6ab3226..be076b1 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -3136,6 +3136,7 @@
       "//ash/webui/diagnostics_ui",
       "//ash/webui/eche_app_ui",
       "//ash/webui/file_manager:file_manager_ui",
+      "//ash/webui/files_internals",
       "//ash/webui/firmware_update_ui",
       "//ash/webui/guest_os_installer",
       "//ash/webui/help_app_ui",
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
index 1f0c418..f3ca049 100644
--- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -578,7 +578,7 @@
 WebUIController* NewWebUI<ash::FilesInternalsUI>(WebUI* web_ui,
                                                  const GURL& url) {
   return new ash::FilesInternalsUI(
-      web_ui, std::make_unique<ChromeFilesInternalsUIDelegate>());
+      web_ui, std::make_unique<ChromeFilesInternalsUIDelegate>(web_ui));
 }
 
 template <>
diff --git a/chrome/chrome_paks.gni b/chrome/chrome_paks.gni
index c5eb50b..7be7aca 100644
--- a/chrome/chrome_paks.gni
+++ b/chrome/chrome_paks.gni
@@ -235,6 +235,7 @@
         "$root_gen_dir/ash/webui/ash_face_ml_app_bundle_resources.pak",
         "$root_gen_dir/ash/webui/ash_face_ml_app_resources.pak",
         "$root_gen_dir/ash/webui/ash_face_ml_app_untrusted_resources.pak",
+        "$root_gen_dir/ash/webui/ash_files_internals_resources.pak",
         "$root_gen_dir/ash/webui/ash_firmware_update_app_resources.pak",
         "$root_gen_dir/ash/webui/ash_guest_os_installer_resources.pak",
         "$root_gen_dir/ash/webui/ash_help_app_resources.pak",
@@ -307,6 +308,7 @@
         "//ash/webui/resources:face_ml_app_resources",
         "//ash/webui/resources:face_ml_app_resources",
         "//ash/webui/resources:face_ml_app_untrusted_resources",
+        "//ash/webui/resources:files_internals_resources",
         "//ash/webui/resources:firmware_update_app_resources",
         "//ash/webui/resources:help_app_bundle_resources",
         "//ash/webui/resources:help_app_kids_magazine_bundle_resources",