aw_browser_process.cc 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. // Copyright (c) 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "android_webview/browser/aw_browser_process.h"
  5. #include "android_webview/browser/aw_browser_context.h"
  6. #include "android_webview/browser/aw_enterprise_authentication_app_link_manager.h"
  7. #include "android_webview/browser/component_updater/registration.h"
  8. #include "android_webview/browser/lifecycle/aw_contents_lifecycle_notifier.h"
  9. #include "android_webview/browser/metrics/visibility_metrics_logger.h"
  10. #include "android_webview/browser_jni_headers/AwBrowserProcess_jni.h"
  11. #include "android_webview/common/crash_reporter/crash_keys.h"
  12. #include "base/android/jni_array.h"
  13. #include "base/android/jni_string.h"
  14. #include "base/base_paths_posix.h"
  15. #include "base/path_service.h"
  16. #include "base/task/thread_pool.h"
  17. #include "components/component_updater/android/component_loader_policy.h"
  18. #include "components/crash/core/common/crash_key.h"
  19. #include "content/public/browser/browser_task_traits.h"
  20. #include "content/public/browser/browser_thread.h"
  21. #include "content/public/browser/process_visibility_util.h"
  22. using content::BrowserThread;
  23. namespace android_webview {
  24. namespace prefs {
  25. // String that specifies the Android account type to use for Negotiate
  26. // authentication.
  27. const char kAuthAndroidNegotiateAccountType[] =
  28. "auth.android_negotiate_account_type";
  29. // Allowlist containing servers for which Integrated Authentication is enabled.
  30. // This pref should match |prefs::kAuthServerAllowlist|.
  31. const char kAuthServerAllowlist[] = "auth.server_allowlist";
  32. // This pref contains a list of authentication urls, for which when webview is
  33. // navigated to any of these urls, browse intent will be sent.
  34. const char kEnterpriseAuthAppLinkPolicy[] = "enterprise_auth_app_link_policy";
  35. } // namespace prefs
  36. namespace {
  37. AwBrowserProcess* g_aw_browser_process = nullptr;
  38. } // namespace
  39. // static
  40. AwBrowserProcess* AwBrowserProcess::GetInstance() {
  41. return g_aw_browser_process;
  42. }
  43. AwBrowserProcess::AwBrowserProcess(
  44. AwFeatureListCreator* aw_feature_list_creator) {
  45. g_aw_browser_process = this;
  46. aw_feature_list_creator_ = aw_feature_list_creator;
  47. aw_contents_lifecycle_notifier_ =
  48. std::make_unique<AwContentsLifecycleNotifier>(base::BindRepeating(
  49. &AwBrowserProcess::OnLoseForeground, base::Unretained(this)));
  50. app_link_manager_ =
  51. absl::make_unique<EnterpriseAuthenticationAppLinkManager>(local_state());
  52. }
  53. AwBrowserProcess::~AwBrowserProcess() {
  54. g_aw_browser_process = nullptr;
  55. }
  56. void AwBrowserProcess::PreMainMessageLoopRun() {
  57. pref_change_registrar_.Init(local_state());
  58. auto auth_pref_callback = base::BindRepeating(
  59. &AwBrowserProcess::OnAuthPrefsChanged, base::Unretained(this));
  60. pref_change_registrar_.Add(prefs::kAuthServerAllowlist, auth_pref_callback);
  61. pref_change_registrar_.Add(prefs::kAuthAndroidNegotiateAccountType,
  62. auth_pref_callback);
  63. InitSafeBrowsing();
  64. }
  65. PrefService* AwBrowserProcess::local_state() {
  66. if (!local_state_)
  67. CreateLocalState();
  68. return local_state_.get();
  69. }
  70. void AwBrowserProcess::CreateLocalState() {
  71. DCHECK(!local_state_);
  72. local_state_ = aw_feature_list_creator_->TakePrefService();
  73. DCHECK(local_state_);
  74. }
  75. void AwBrowserProcess::OnLoseForeground() {
  76. if (local_state_)
  77. local_state_->CommitPendingWrite();
  78. }
  79. AwBrowserPolicyConnector* AwBrowserProcess::browser_policy_connector() {
  80. if (!browser_policy_connector_)
  81. CreateBrowserPolicyConnector();
  82. return browser_policy_connector_.get();
  83. }
  84. VisibilityMetricsLogger* AwBrowserProcess::visibility_metrics_logger() {
  85. if (!visibility_metrics_logger_) {
  86. visibility_metrics_logger_ = std::make_unique<VisibilityMetricsLogger>();
  87. visibility_metrics_logger_->SetOnVisibilityChangedCallback(
  88. base::BindRepeating([](bool visible) {
  89. content::OnBrowserVisibilityChanged(visible);
  90. }));
  91. }
  92. return visibility_metrics_logger_.get();
  93. }
  94. void AwBrowserProcess::CreateBrowserPolicyConnector() {
  95. DCHECK(!browser_policy_connector_);
  96. browser_policy_connector_ =
  97. aw_feature_list_creator_->TakeBrowserPolicyConnector();
  98. DCHECK(browser_policy_connector_);
  99. }
  100. void AwBrowserProcess::InitSafeBrowsing() {
  101. CreateSafeBrowsingUIManager();
  102. CreateSafeBrowsingAllowlistManager();
  103. }
  104. void AwBrowserProcess::CreateSafeBrowsingUIManager() {
  105. safe_browsing_ui_manager_ = new AwSafeBrowsingUIManager();
  106. }
  107. void AwBrowserProcess::CreateSafeBrowsingAllowlistManager() {
  108. scoped_refptr<base::SequencedTaskRunner> background_task_runner =
  109. base::ThreadPool::CreateSequencedTaskRunner(
  110. {base::MayBlock(), base::TaskPriority::BEST_EFFORT});
  111. scoped_refptr<base::SingleThreadTaskRunner> io_task_runner =
  112. content::GetIOThreadTaskRunner({});
  113. safe_browsing_allowlist_manager_ =
  114. std::make_unique<AwSafeBrowsingAllowlistManager>(background_task_runner,
  115. io_task_runner);
  116. }
  117. safe_browsing::RemoteSafeBrowsingDatabaseManager*
  118. AwBrowserProcess::GetSafeBrowsingDBManager() {
  119. DCHECK_CURRENTLY_ON(BrowserThread::IO);
  120. if (!safe_browsing_db_manager_) {
  121. safe_browsing_db_manager_ =
  122. new safe_browsing::RemoteSafeBrowsingDatabaseManager();
  123. }
  124. if (!safe_browsing_db_manager_started_) {
  125. // V4ProtocolConfig is not used. Just create one with empty values..
  126. safe_browsing::V4ProtocolConfig config("", false, "", "");
  127. safe_browsing_db_manager_->StartOnIOThread(
  128. GetSafeBrowsingUIManager()->GetURLLoaderFactoryOnIOThread(), config);
  129. safe_browsing_db_manager_started_ = true;
  130. }
  131. return safe_browsing_db_manager_.get();
  132. }
  133. safe_browsing::TriggerManager*
  134. AwBrowserProcess::GetSafeBrowsingTriggerManager() {
  135. DCHECK_CURRENTLY_ON(BrowserThread::UI);
  136. if (!safe_browsing_trigger_manager_) {
  137. safe_browsing_trigger_manager_ =
  138. std::make_unique<safe_browsing::TriggerManager>(
  139. GetSafeBrowsingUIManager(),
  140. /*local_state_prefs=*/nullptr);
  141. }
  142. return safe_browsing_trigger_manager_.get();
  143. }
  144. AwSafeBrowsingAllowlistManager*
  145. AwBrowserProcess::GetSafeBrowsingAllowlistManager() const {
  146. return safe_browsing_allowlist_manager_.get();
  147. }
  148. AwSafeBrowsingUIManager* AwBrowserProcess::GetSafeBrowsingUIManager() const {
  149. return safe_browsing_ui_manager_.get();
  150. }
  151. // static
  152. void AwBrowserProcess::RegisterNetworkContextLocalStatePrefs(
  153. PrefRegistrySimple* pref_registry) {
  154. pref_registry->RegisterStringPref(prefs::kAuthServerAllowlist, std::string());
  155. pref_registry->RegisterStringPref(prefs::kAuthAndroidNegotiateAccountType,
  156. std::string());
  157. }
  158. void AwBrowserProcess::RegisterEnterpriseAuthenticationAppLinkPolicyPref(
  159. PrefRegistrySimple* pref_registry) {
  160. pref_registry->RegisterListPref(prefs::kEnterpriseAuthAppLinkPolicy);
  161. }
  162. network::mojom::HttpAuthDynamicParamsPtr
  163. AwBrowserProcess::CreateHttpAuthDynamicParams() {
  164. network::mojom::HttpAuthDynamicParamsPtr auth_dynamic_params =
  165. network::mojom::HttpAuthDynamicParams::New();
  166. auth_dynamic_params->allowed_schemes = AwBrowserContext::GetAuthSchemes();
  167. auth_dynamic_params->server_allowlist =
  168. local_state()->GetString(prefs::kAuthServerAllowlist);
  169. auth_dynamic_params->android_negotiate_account_type =
  170. local_state()->GetString(prefs::kAuthAndroidNegotiateAccountType);
  171. auth_dynamic_params->ntlm_v2_enabled = true;
  172. return auth_dynamic_params;
  173. }
  174. void AwBrowserProcess::OnAuthPrefsChanged() {
  175. content::GetNetworkService()->ConfigureHttpAuthPrefs(
  176. CreateHttpAuthDynamicParams());
  177. }
  178. EnterpriseAuthenticationAppLinkManager*
  179. AwBrowserProcess::GetEnterpriseAuthenticationAppLinkManager() {
  180. return app_link_manager_.get();
  181. }
  182. // static
  183. void AwBrowserProcess::TriggerMinidumpUploading() {
  184. Java_AwBrowserProcess_triggerMinidumpUploading(
  185. base::android::AttachCurrentThread());
  186. }
  187. // static
  188. ApkType AwBrowserProcess::GetApkType() {
  189. return static_cast<ApkType>(
  190. Java_AwBrowserProcess_getApkType(base::android::AttachCurrentThread()));
  191. }
  192. static void JNI_AwBrowserProcess_SetProcessNameCrashKey(
  193. JNIEnv* env,
  194. const base::android::JavaParamRef<jstring>& processName) {
  195. static ::crash_reporter::CrashKeyString<64> crash_key(
  196. crash_keys::kAppProcessName);
  197. crash_key.Set(ConvertJavaStringToUTF8(env, processName));
  198. }
  199. static base::android::ScopedJavaLocalRef<jobjectArray>
  200. JNI_AwBrowserProcess_GetComponentLoaderPolicies(JNIEnv* env) {
  201. return component_updater::AndroidComponentLoaderPolicy::
  202. ToJavaArrayOfAndroidComponentLoaderPolicy(env,
  203. GetComponentLoaderPolicies());
  204. }
  205. } // namespace android_webview