extensions: Enable ExtensionSettingsTestBase on desktop android

Remove direct access to browser() for cross platform testing, adding
GetProfile() to the PlatformBrowserTest.

The function in the anonymous namespace in
ChallengeResponseAuthKeysLoaderBrowserTest having the same name and
signature as GetProfile() is renamed to GetOriginalProfile() to avoid
accidental breakage.

Bug: 392777363
Change-Id: I460e99543711f23873aa9467992ccc6c6bfc347e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6573392
Auto-Submit: Keigo Oka <oka@chromium.org>
Reviewed-by: Yaron Friedman <yfriedman@chromium.org>
Commit-Queue: Yaron Friedman <yfriedman@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1464812}
diff --git a/chrome/browser/ash/login/challenge_response_auth_keys_loader_browsertest.cc b/chrome/browser/ash/login/challenge_response_auth_keys_loader_browsertest.cc
index 97e33f26..5b16e4d 100644
--- a/chrome/browser/ash/login/challenge_response_auth_keys_loader_browsertest.cc
+++ b/chrome/browser/ash/login/challenge_response_auth_keys_loader_browsertest.cc
@@ -35,12 +35,12 @@
 
 constexpr char kUserEmail[] = "testuser@example.com";
 
-Profile* GetProfile() {
+Profile* GetOriginalProfile() {
   return ProfileHelper::GetSigninProfile()->GetOriginalProfile();
 }
 
 extensions::ProcessManager* GetProcessManager() {
-  return extensions::ProcessManager::Get(GetProfile());
+  return extensions::ProcessManager::Get(GetOriginalProfile());
 }
 
 }  // namespace
@@ -65,7 +65,7 @@
         base::TimeDelta::Max());
 
     extension_force_install_mixin_.InitWithDeviceStateMixin(
-        GetProfile(), &device_state_mixin_);
+        GetOriginalProfile(), &device_state_mixin_);
 
     // Register the ChallengeResponseKey for the user.
     user_manager::KnownUser(g_browser_process->local_state())
@@ -112,7 +112,8 @@
 
   void InstallExtension(bool wait_on_extension_loaded) {
     test_certificate_provider_extension_mixin_.ForceInstall(
-        GetProfile(), /*wait_on_extension_loaded=*/wait_on_extension_loaded,
+        GetOriginalProfile(),
+        /*wait_on_extension_loaded=*/wait_on_extension_loaded,
         /*immediately_provide_certificates=*/wait_on_extension_loaded);
   }
 
diff --git a/chrome/browser/ui/webui/extensions/extension_settings_test_base.cc b/chrome/browser/ui/webui/extensions/extension_settings_test_base.cc
index 380bd5b..ac6c7c3 100644
--- a/chrome/browser/ui/webui/extensions/extension_settings_test_base.cc
+++ b/chrome/browser/ui/webui/extensions/extension_settings_test_base.cc
@@ -11,11 +11,14 @@
 #include "chrome/browser/extensions/chrome_test_extension_loader.h"
 #include "chrome/browser/extensions/unpacked_installer.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/browser.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/pref_names.h"
 #include "extensions/browser/extension_dialog_auto_confirm.h"
 
+#if !BUILDFLAG(IS_ANDROID)
+#include "chrome/browser/ui/browser.h"
+#endif  // !BUILDFLAG(IS_ANDROID)
+
 using extensions::Extension;
 
 ExtensionSettingsTestBase::ExtensionSettingsTestBase()
@@ -71,8 +74,8 @@
 }
 
 void ExtensionSettingsTestBase::SetDevModeEnabled(bool enabled) {
-  browser()->profile()->GetPrefs()->SetBoolean(
-      prefs::kExtensionsUIDeveloperMode, enabled);
+  GetProfile()->GetPrefs()->SetBoolean(prefs::kExtensionsUIDeveloperMode,
+                                       enabled);
 }
 
 void ExtensionSettingsTestBase::SetSilenceDeprecatedManifestVersionWarnings(
@@ -83,7 +86,7 @@
 
 const Extension* ExtensionSettingsTestBase::InstallExtension(
     const base::FilePath& path) {
-  extensions::ChromeTestExtensionLoader loader(browser()->profile());
+  extensions::ChromeTestExtensionLoader loader(GetProfile());
   loader.set_ignore_manifest_warnings(true);
   return loader.LoadExtension(path).get();
 }
diff --git a/chrome/browser/ui/webui/extensions/extension_settings_test_base.h b/chrome/browser/ui/webui/extensions/extension_settings_test_base.h
index 8b3e158..6465b4fc 100644
--- a/chrome/browser/ui/webui/extensions/extension_settings_test_base.h
+++ b/chrome/browser/ui/webui/extensions/extension_settings_test_base.h
@@ -9,10 +9,13 @@
 
 #include "base/files/file_path.h"
 #include "chrome/browser/extensions/install_verifier.h"
-#include "chrome/browser/extensions/scoped_test_mv2_enabler.h"
 #include "chrome/test/base/web_ui_mocha_browser_test.h"
 #include "extensions/browser/scoped_ignore_content_verifier_for_test.h"
 
+#if !BUILDFLAG(IS_ANDROID)
+#include "chrome/browser/extensions/scoped_test_mv2_enabler.h"
+#endif  // !BUILDFLAG(IS_ANDROID)
+
 #if BUILDFLAG(IS_WIN)
 #include "base/base_paths_win.h"
 #include "base/test/scoped_path_override.h"
@@ -84,8 +87,10 @@
   std::unique_ptr<extensions::ScopedTestDialogAutoConfirm>
       uninstall_auto_confirm_;
 
+#if !BUILDFLAG(IS_ANDROID)
   // TODO(https://crbug.com/40804030): Remove this when updated to use MV3.
   extensions::ScopedTestMV2Enabler mv2_enabler_;
+#endif  // BUILDFLAG(IS_ANDROID)
 };
 
 #endif  // CHROME_BROWSER_UI_WEBUI_EXTENSIONS_EXTENSION_SETTINGS_TEST_BASE_H_
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index d87771e..862069f 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -375,6 +375,8 @@
       "../browser/extensions/test_extension_environment.h",
       "../browser/extensions/test_extension_prefs.cc",
       "../browser/extensions/test_extension_prefs.h",
+      "../browser/ui/webui/extensions/extension_settings_test_base.cc",
+      "../browser/ui/webui/extensions/extension_settings_test_base.h",
       "../common/extensions/manifest_tests/chrome_manifest_test.cc",
       "../common/extensions/manifest_tests/chrome_manifest_test.h",
     ]
@@ -417,8 +419,6 @@
       "../browser/ui/web_applications/test/web_app_browsertest_util.h",
       "../browser/ui/web_applications/web_app_browsertest_base.cc",
       "../browser/ui/web_applications/web_app_browsertest_base.h",
-      "../browser/ui/webui/extensions/extension_settings_test_base.cc",
-      "../browser/ui/webui/extensions/extension_settings_test_base.h",
     ]
 
     deps += [
diff --git a/chrome/test/base/android/android_browser_test.cc b/chrome/test/base/android/android_browser_test.cc
index 230585d..45aff2a 100644
--- a/chrome/test/base/android/android_browser_test.cc
+++ b/chrome/test/base/android/android_browser_test.cc
@@ -93,3 +93,12 @@
 base::FilePath AndroidBrowserTest::GetChromeTestDataDir() const {
   return chrome_test_utils::GetChromeTestDataDir();
 }
+
+Profile* AndroidBrowserTest::GetProfile() const {
+  for (TabModel* model : TabModelList::models()) {
+    if (model->GetProfile()) {
+      return model->GetProfile();
+    }
+  }
+  return nullptr;
+}
diff --git a/chrome/test/base/android/android_browser_test.h b/chrome/test/base/android/android_browser_test.h
index d66f53a..592339e 100644
--- a/chrome/test/base/android/android_browser_test.h
+++ b/chrome/test/base/android/android_browser_test.h
@@ -7,6 +7,7 @@
 
 #include "base/files/scoped_temp_dir.h"
 #include "base/test/scoped_feature_list.h"
+#include "chrome/browser/profiles/profile.h"
 #include "content/public/test/browser_test_base.h"
 
 class PrefService;
@@ -67,6 +68,10 @@
   // Returns the test data path used by the embedded test server.
   base::FilePath GetChromeTestDataDir() const;
 
+  // Returns the profile. If there are multiple profiles, it's not determined
+  // what profile is returned.
+  Profile* GetProfile() const;
+
  private:
   // Temporary user data directory. Used only when a user data directory is not
   // specified in the command line.
diff --git a/chrome/test/base/in_process_browser_test.cc b/chrome/test/base/in_process_browser_test.cc
index 676e38a..14c0963 100644
--- a/chrome/test/base/in_process_browser_test.cc
+++ b/chrome/test/base/in_process_browser_test.cc
@@ -626,6 +626,10 @@
 #endif  // BUILDFLAG(IS_WIN);
 }
 
+Profile* InProcessBrowserTest::GetProfile() const {
+  return browser() ? browser()->profile() : nullptr;
+}
+
 void InProcessBrowserTest::CloseBrowserSynchronously(Browser* browser) {
   CloseBrowserAsynchronously(browser);
   ui_test_utils::WaitForBrowserToClose(browser);
diff --git a/chrome/test/base/in_process_browser_test.h b/chrome/test/base/in_process_browser_test.h
index 295e1c1..7d079bf 100644
--- a/chrome/test/base/in_process_browser_test.h
+++ b/chrome/test/base/in_process_browser_test.h
@@ -195,6 +195,10 @@
   // Tests can override this to customize the initial local_state.
   virtual void SetUpLocalStatePrefService(PrefService* local_state);
 
+  // Returns the profile. Prefer this method to browser()->profile() for
+  // cross-platform compatibility.
+  Profile* GetProfile() const;
+
  protected:
   // Closes the given browser and waits for it to release all its resources.
   void CloseBrowserSynchronously(Browser* browser);
diff --git a/chrome/test/data/webui/extensions/extensions_focus_test.cc b/chrome/test/data/webui/extensions/extensions_focus_test.cc
index 3ef00cab..1b9361cb 100644
--- a/chrome/test/data/webui/extensions/extensions_focus_test.cc
+++ b/chrome/test/data/webui/extensions/extensions_focus_test.cc
@@ -25,8 +25,6 @@
           "runMochaTest('ExtensionShortcutTest', 'UpdateShortcut')");
 }
 
-// TODO(crbug.com/392777363): Compile the test on android.
-#if BUILDFLAG(ENABLE_EXTENSIONS)
 class CrExtensionsOptionsPageTest : public ExtensionSettingsTestBase {
  protected:
   void OnWebContentsAvailable(content::WebContents* web_contents) override {
@@ -40,4 +38,3 @@
   InstallExtensionWithInPageOptions();
   RunTest("extensions/extension_options_dialog_test.js", "mocha.run()");
 }
-#endif  // BUILDFLAG(ENABLE_EXTENSIONS)