diagnostics_ui.cc 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  1. // Copyright 2020 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 "ash/webui/diagnostics_ui/diagnostics_ui.h"
  5. #include <memory>
  6. #include <string>
  7. #include <utility>
  8. #include <vector>
  9. #include "ash/constants/ash_features.h"
  10. #include "ash/webui/common/backend/plural_string_handler.h"
  11. #include "ash/webui/common/keyboard_diagram_strings.h"
  12. #include "ash/webui/diagnostics_ui/backend/diagnostics_manager.h"
  13. #include "ash/webui/diagnostics_ui/backend/histogram_util.h"
  14. #include "ash/webui/diagnostics_ui/backend/input_data_provider.h"
  15. #include "ash/webui/diagnostics_ui/backend/network_health_provider.h"
  16. #include "ash/webui/diagnostics_ui/backend/session_log_handler.h"
  17. #include "ash/webui/diagnostics_ui/backend/system_data_provider.h"
  18. #include "ash/webui/diagnostics_ui/backend/system_routine_controller.h"
  19. #include "ash/webui/diagnostics_ui/diagnostics_metrics.h"
  20. #include "ash/webui/diagnostics_ui/diagnostics_metrics_message_handler.h"
  21. #include "ash/webui/diagnostics_ui/mojom/network_health_provider.mojom.h"
  22. #include "ash/webui/diagnostics_ui/mojom/system_data_provider.mojom.h"
  23. #include "ash/webui/diagnostics_ui/url_constants.h"
  24. #include "ash/webui/grit/ash_diagnostics_app_resources.h"
  25. #include "ash/webui/grit/ash_diagnostics_app_resources_map.h"
  26. #include "base/containers/span.h"
  27. #include "base/files/file_path.h"
  28. #include "base/logging.h"
  29. #include "base/metrics/histogram_functions.h"
  30. #include "base/strings/string_piece_forward.h"
  31. #include "base/strings/string_util.h"
  32. #include "base/strings/utf_string_conversions.h"
  33. #include "base/values.h"
  34. #include "chromeos/login/login_state/login_state.h"
  35. #include "chromeos/strings/grit/chromeos_strings.h"
  36. #include "content/public/browser/web_contents.h"
  37. #include "content/public/browser/web_ui.h"
  38. #include "content/public/browser/web_ui_data_source.h"
  39. #include "services/network/public/mojom/content_security_policy.mojom.h"
  40. #include "ui/base/l10n/l10n_util.h"
  41. #include "ui/base/webui/web_ui_util.h"
  42. #include "ui/chromeos/strings/network_element_localized_strings_provider.h"
  43. #include "ui/resources/grit/webui_generated_resources.h"
  44. namespace ash {
  45. namespace {
  46. void EmitInitialScreen(diagnostics::metrics::NavigationView initial_view) {
  47. base::UmaHistogramEnumeration("ChromeOS.DiagnosticsUi.InitialScreen",
  48. initial_view);
  49. }
  50. diagnostics::metrics::NavigationView GetInitialView(const GURL url) {
  51. if (!url.has_query()) {
  52. return diagnostics::metrics::NavigationView::kSystem;
  53. }
  54. // Note: Valid query strings map to strings in the GetUrlForPage located in
  55. // chrome/browser/ui/webui/chromeos/diagnostics_dialog.cc.
  56. const std::string& original_query = url.query(); // must outlive |query|.
  57. const base::StringPiece& query =
  58. base::TrimString(original_query, " \t", base::TRIM_ALL);
  59. if (base::EqualsCaseInsensitiveASCII(query, "system")) {
  60. return diagnostics::metrics::NavigationView::kSystem;
  61. }
  62. if (base::EqualsCaseInsensitiveASCII(query, "connectivity")) {
  63. return diagnostics::metrics::NavigationView::kConnectivity;
  64. }
  65. if (base::EqualsCaseInsensitiveASCII(query, "input")) {
  66. return diagnostics::metrics::NavigationView::kInput;
  67. }
  68. // In production builds this is not expected to occur however it was observed
  69. // when running unit tests.
  70. LOG(WARNING) << "Unexpected screen requested with query: '" << query
  71. << "'. Defaulting value to system." << std::endl;
  72. return diagnostics::metrics::NavigationView::kSystem;
  73. }
  74. std::u16string GetLinkLabel(int string_id, const char* url) {
  75. std::vector<std::u16string> replacements;
  76. replacements.push_back(base::UTF8ToUTF16(url));
  77. return l10n_util::GetStringFUTF16(string_id, replacements, nullptr);
  78. }
  79. base::Value::Dict GetDataSourceUpdate() {
  80. base::Value::Dict update;
  81. update.Set("settingsLinkText",
  82. base::Value(GetLinkLabel(IDS_DIAGNOSTICS_SETTINGS_LINK_TEXT,
  83. "chrome://os-settings/")));
  84. // TODO(crbug.com/1207678): update this link when the Help Center is ready.
  85. update.Set(
  86. "keyboardTesterHelpLink",
  87. base::Value(GetLinkLabel(IDS_INPUT_DIAGNOSTICS_KEYBOARD_TESTER_HELP_LINK,
  88. "https://support.google.com/chromebook/")));
  89. return update;
  90. }
  91. void AddDiagnosticsStrings(content::WebUIDataSource* html_source) {
  92. static constexpr webui::LocalizedString kLocalizedStrings[] = {
  93. {"arcDnsResolutionFailedText",
  94. IDS_DIAGNOSTICS_ARC_DNS_RESOLUTION_FAILED_TEXT},
  95. {"arcDnsResolutionRoutineText",
  96. IDS_NETWORK_DIAGNOSTICS_ARC_DNS_RESOLUTION},
  97. {"arcHttpFailedText", IDS_DIAGNOSTICS_ARC_HTTP_FAILED_TEXT},
  98. {"arcHttpRoutineText", IDS_NETWORK_DIAGNOSTICS_ARC_HTTP},
  99. {"arcPingFailedText", IDS_DIAGNOSTICS_ARC_PING_FAILED_TEXT},
  100. {"arcPingRoutineText", IDS_NETWORK_DIAGNOSTICS_ARC_PING},
  101. {"batteryCalculatingText", IDS_DIAGNOSTICS_BATTERY_CALCULATING_TEXT},
  102. {"batteryChargeRoutineText", IDS_DIAGNOSTICS_BATTERY_CHARGE_ROUTINE_TEXT},
  103. {"batteryDischargeRoutineText",
  104. IDS_DIAGNOSTICS_BATTERY_DISCHARGE_ROUTINE_TEXT},
  105. {"batteryChargeTestFullMessage", IDS_DIAGNOSTICS_BATTERY_FULL_MESSAGE},
  106. {"batteryChargingStatusText", IDS_DIAGNOSTICS_BATTERY_CHARGING},
  107. {"batteryChipText", IDS_DIAGNOSTICS_BATTERY_CHIP_TEXT},
  108. {"batteryDischargingStatusText", IDS_DIAGNOSTICS_BATTERY_DISCHARGING},
  109. {"batteryFullText", IDS_DIAGNOSTICS_BATTERY_FULL_TEXT},
  110. {"batteryHealthLabel", IDS_DIAGNOSTICS_BATTERY_HEALTH_LABEL},
  111. {"batteryHealthText", IDS_DIAGNOSTICS_BATTERY_HEALTH_TEXT},
  112. {"batteryHealthTooltipText", IDS_DIAGNOSTICS_BATTERY_HEALTH_TOOLTIP_TEXT},
  113. {"batteryTitle", IDS_DIAGNOSTICS_BATTERY_TITLE},
  114. {"boardAndVersionInfo", IDS_DIAGNOSTICS_DEVICE_INFO_TEXT},
  115. {"captivePortalFailedText", IDS_DIAGNOSTICS_CAPTIVE_PORTAL_FAILED_TEXT},
  116. {"captivePortalRoutineText", IDS_NETWORK_DIAGNOSTICS_CAPTIVE_PORTAL},
  117. {"cellularLabel", IDS_DIAGNOSTICS_NETWORK_TYPE_CELLULAR},
  118. {"chargeTestResultText", IDS_CHARGE_TEST_RESULT},
  119. {"connectivityText", IDS_DIAGNOSTICS_CONNECTIVITY},
  120. {"cpuBannerMessage", IDS_DIAGNOSTICS_CPU_BANNER_MESSAGE},
  121. {"cpuCacheRoutineText", IDS_DIAGNOSTICS_CPU_CACHE_ROUTINE_TEXT},
  122. {"cpuChipText", IDS_DIAGNOSTICS_CPU_CHIP_TEXT},
  123. {"cpuFloatingPointAccuracyRoutineText",
  124. IDS_DIAGNOSTICS_CPU_FLOATING_POINT_ACCURACY_ROUTINE_TEXT},
  125. {"cpuPrimeSearchRoutineText",
  126. IDS_DIAGNOSTICS_CPU_PRIME_SEARCH_ROUTINE_TEXT},
  127. {"cpuSpeedLabel", IDS_DIAGNOSTICS_CPU_SPEED_LABEL},
  128. {"cpuStressRoutineText", IDS_DIAGNOSTICS_CPU_STRESS_ROUTINE_TEXT},
  129. {"cpuTempLabel", IDS_DIAGNOSTICS_CPU_TEMPERATURE_LABEL},
  130. {"cpuTempText", IDS_DIAGNOSTICS_CPU_TEMPERATURE_TEXT},
  131. {"cpuTitle", IDS_DIAGNOSTICS_CPU_TITLE},
  132. {"cpuUsageLabel", IDS_DIAGNOSTICS_CPU_USAGE_LABEL},
  133. {"cpuUsageText", IDS_DIAGNOSTICS_CPU_USAGE_TEXT},
  134. {"cpuUsageTooltipText", IDS_DIAGNOSTICS_CPU_USAGE_TOOLTIP_TEXT},
  135. {"cpuUsageSystem", IDS_DIAGNOSTICS_CPU_USAGE_SYSTEM_LABEL},
  136. {"cpuUsageUser", IDS_DIAGNOSTICS_CPU_USAGE_USER_LABEL},
  137. {"currentCpuSpeedText", IDS_DIAGNOSTICS_CPU_SPEED_TEXT},
  138. {"currentNowLabel", IDS_DIAGNOSTICS_CURRENT_NOW_LABEL},
  139. {"currentNowText", IDS_DIAGNOSTICS_CURRENT_NOW_TEXT},
  140. {"currentNowTooltipText", IDS_DIAGNOSTICS_CURRENT_NOW_TOOLTIP_TEXT},
  141. {"cycleCount", IDS_DIAGNOSTICS_CYCLE_COUNT_LABEL},
  142. {"cycleCountTooltipText", IDS_DIAGNOSTICS_CYCLE_COUNT_TOOLTIP_TEXT},
  143. {"diagnosticsTitle", IDS_DIAGNOSTICS_TITLE},
  144. {"disabledText", IDS_DIAGNOSTICS_DISABLED_TEXT},
  145. {"dischargeTestResultText", IDS_DISCHARGE_TEST_RESULT},
  146. {"dnsGroupText", IDS_NETWORK_DIAGNOSTICS_DNS_GROUP},
  147. {"dnsLatencyFailedText", IDS_DIAGNOSTICS_DNS_LATENCY_FAILED_TEXT},
  148. {"dnsLatencyRoutineText", IDS_NETWORK_DIAGNOSTICS_DNS_LATENCY},
  149. {"dnsResolutionFailedText", IDS_DIAGNOSTICS_DNS_RESOLUTION_FAILED_TEXT},
  150. {"dnsResolutionRoutineText", IDS_NETWORK_DIAGNOSTICS_DNS_RESOLUTION},
  151. {"dnsResolverPresentFailedText",
  152. IDS_DIAGNOSTICS_DNS_RESOLVER_PRESENT_FAILED_TEXT},
  153. {"dnsResolverPresentRoutineText",
  154. IDS_NETWORK_DIAGNOSTICS_DNS_RESOLVER_PRESENT},
  155. {"ethernetLabel", IDS_NETWORK_TYPE_ETHERNET},
  156. {"firewallGroupText", IDS_NETWORK_DIAGNOSTICS_FIREWALL_GROUP},
  157. {"gatewayCanBePingedFailedText",
  158. IDS_DIAGNOSTICS_GATEWAY_CAN_BE_PINGED_FAILED_TEXT},
  159. {"gatewayCanBePingedRoutineText",
  160. IDS_NETWORK_DIAGNOSTICS_GATEWAY_CAN_BE_PINGED},
  161. {"gatewayRoutineText", IDS_NETWORK_DIAGNOSTICS_GATEWAY_GROUP},
  162. {"hasSecureWiFiConnectionFailedText",
  163. IDS_DIAGNOSTICS_HAS_SECURE_WIFI_CONNECTION_FAILED_TEXT},
  164. {"hasSecureWiFiConnectionRoutineText",
  165. IDS_NETWORK_DIAGNOSTICS_HAS_SECURE_WIFI_CONNECTION},
  166. {"hideReportText", IDS_DIAGNOSTICS_HIDE_REPORT_TEXT},
  167. {"httpFirewallFailedText", IDS_DIAGNOSTICS_HTTP_FIREWALL_FAILED_TEXT},
  168. {"httpFirewallRoutineText", IDS_NETWORK_DIAGNOSTICS_HTTP_FIREWALL},
  169. {"httpsFirewallFailedText", IDS_DIAGNOSTICS_HTTPS_FIREWALL_FAILED_TEXT},
  170. {"httpsFirewallRoutineText", IDS_NETWORK_DIAGNOSTICS_HTTPS_FIREWALL},
  171. {"httpsLatencyFailedText", IDS_DIAGNOSTICS_HTTPS_LATENCY_FAILED_TEXT},
  172. {"httpsLatencyRoutineText", IDS_NETWORK_DIAGNOSTICS_HTTPS_LATENCY},
  173. {"inputCategoryKeyboard", IDS_INPUT_DIAGNOSTICS_CATEGORY_KEYBOARD},
  174. {"inputCategoryTouchpad", IDS_INPUT_DIAGNOSTICS_CATEGORY_TOUCHPAD},
  175. {"inputCategoryTouchscreen", IDS_INPUT_DIAGNOSTICS_CATEGORY_TOUCHSCREEN},
  176. {"inputDescriptionBluetoothKeyboard",
  177. IDS_INPUT_DIAGNOSTICS_BLUETOOTH_KEYBOARD},
  178. {"inputDescriptionBluetoothTouchpad",
  179. IDS_INPUT_DIAGNOSTICS_BLUETOOTH_TOUCHPAD},
  180. {"inputDescriptionBluetoothTouchscreen",
  181. IDS_INPUT_DIAGNOSTICS_BLUETOOTH_TOUCHSCREEN},
  182. {"inputDescriptionInternalKeyboard",
  183. IDS_INPUT_DIAGNOSTICS_INTERNAL_KEYBOARD},
  184. {"inputDescriptionInternalTouchpad",
  185. IDS_INPUT_DIAGNOSTICS_INTERNAL_TOUCHPAD},
  186. {"inputDescriptionInternalTouchscreen",
  187. IDS_INPUT_DIAGNOSTICS_INTERNAL_TOUCHSCREEN},
  188. {"inputDescriptionUsbKeyboard", IDS_INPUT_DIAGNOSTICS_USB_KEYBOARD},
  189. {"inputDescriptionUsbTouchpad", IDS_INPUT_DIAGNOSTICS_USB_TOUCHPAD},
  190. {"inputDescriptionUsbTouchscreen", IDS_INPUT_DIAGNOSTICS_USB_TOUCHSCREEN},
  191. {"inputDeviceTest", IDS_INPUT_DIAGNOSTICS_RUN_TEST},
  192. {"inputTesterDone", IDS_INPUT_DIAGNOSTICS_TESTER_DONE},
  193. {"inputText", IDS_DIAGNOSTICS_INPUT},
  194. {"internetConnectivityGroupLabel",
  195. IDS_DIAGNOSTICS_INTERNET_CONNECTIVITY_GROUP_LABEL},
  196. {"ipConfigInfoDrawerGateway",
  197. IDS_NETWORK_DIAGNOSTICS_IP_CONFIG_INFO_DRAWER_GATEWAY},
  198. {"ipConfigInfoDrawerSubnetMask",
  199. IDS_NETWORK_DIAGNOSTICS_IP_CONFIG_INFO_DRAWER_SUBNET_MASK},
  200. {"ipConfigInfoDrawerTitle",
  201. IDS_NETWORK_DIAGNOSTICS_IP_CONFIG_INFO_DRAWER_TITLE},
  202. {"keyboardTesterFocusLossMessage",
  203. IDS_INPUT_DIAGNOSTICS_KEYBOARD_TESTER_FOCUS_LOSS_MESSAGE},
  204. {"keyboardTesterInstruction",
  205. IDS_INPUT_DIAGNOSTICS_KEYBOARD_TESTER_INSTRUCTION},
  206. {"keyboardTesterTitle", IDS_INPUT_DIAGNOSTICS_KEYBOARD_TESTER_TITLE},
  207. {"joinNetworkLinkText", IDS_DIAGNOSTICS_JOIN_NETWORK_LINK_TEXT},
  208. {"lanConnectivityFailedText",
  209. IDS_DIAGNOSTICS_LAN_CONNECTIVITY_FAILED_TEXT},
  210. {"lanConnectivityGroupText", IDS_NETWORK_DIAGNOSTICS_CONNECTION_GROUP},
  211. {"lanConnectivityRoutineText", IDS_NETWORK_DIAGNOSTICS_LAN_CONNECTIVITY},
  212. {"learnMore", IDS_DIANOSTICS_LEARN_MORE_LABEL},
  213. {"learnMoreShort", IDS_DIAGNOSTICS_LEARN_MORE_LABEL_SHORT},
  214. {"localNetworkGroupLabel", IDS_DIAGNOSTICS_LOCAL_NETWORK_GROUP_LABEL},
  215. {"macAddressLabel", IDS_NETWORK_DIAGNOSTICS_MAC_ADDRESS_LABEL},
  216. {"memoryAvailable", IDS_DIAGNOSTICS_MEMORY_AVAILABLE_TEXT},
  217. {"memoryBannerMessage", IDS_DIAGNOSTICS_MEMORY_BANNER_MESSAGE},
  218. {"memoryRoutineText", IDS_DIAGNOSTICS_MEMORY_ROUTINE_TEXT},
  219. {"memoryTitle", IDS_DIAGNOSTICS_MEMORY_TITLE},
  220. {"missingNameServersText",
  221. IDS_NETWORK_DIAGNOSTICS_MISSING_NAME_SERVERS_TEXT},
  222. {"nameResolutionGroupLabel", IDS_DIAGNOSTICS_NAME_RESOLUTION_GROUP_LABEL},
  223. {"networkAuthenticationLabel", IDS_NETWORK_DIAGNOSTICS_AUTHENTICATION},
  224. {"networkBssidLabel", IDS_ONC_WIFI_BSSID},
  225. {"networkChannelLabel", IDS_NETWORK_DIAGNOSTICS_CHANNEL},
  226. {"networkDnsNotConfigured", IDS_NETWORK_DIAGNOSTICS_DNS_NOT_CONFIGURED},
  227. {"networkEidLabel", IDS_DIAGNOSTICS_EID_LABEL},
  228. {"networkEthernetAuthentication8021xLabel", IDS_ONC_WIFI_SECURITY_EAP},
  229. {"networkEthernetAuthenticationNoneLabel", IDS_ONC_WIFI_SECURITY_NONE},
  230. {"networkIccidLabel", IDS_ONC_CELLULAR_ICCID},
  231. {"networkIpAddressLabel", IDS_NETWORK_DIAGNOSTICS_IP_ADDRESS},
  232. {"networkRoamingOff", IDS_DIAGNOSTICS_ROAMING_OFF},
  233. {"networkRoamingStateHome", IDS_ONC_CELLULAR_ROAMING_STATE_HOME},
  234. {"networkRoamingStateLabel", IDS_ONC_CELLULAR_ROAMING_STATE},
  235. {"networkRoamingStateRoaming", IDS_ONC_CELLULAR_ROAMING_STATE_ROAMING},
  236. {"networkSignalStrengthLabel", IDS_ONC_WIFI_SIGNAL_STRENGTH},
  237. {"networkSimLockStatusLabel",
  238. IDS_DIAGNOSTICS_NETWORK_SIM_LOCK_STATUS_LABEL},
  239. {"networkSimLockedText", IDS_DIAGNOSTICS_NETWORK_SIM_LOCKED},
  240. {"networkSimUnlockedText", IDS_DIAGNOSTICS_NETWORK_SIM_UNLOCKED},
  241. {"networkSsidLabel", IDS_ONC_WIFI_SSID},
  242. {"networkStateConnectedText", IDS_NETWORK_HEALTH_STATE_CONNECTED},
  243. {"networkStateConnectingText", IDS_NETWORK_HEALTH_STATE_CONNECTING},
  244. {"networkStateDisabledText", IDS_NETWORK_HEALTH_STATE_DISABLED},
  245. {"networkStateNotConnectedText", IDS_NETWORK_HEALTH_STATE_NOT_CONNECTED},
  246. {"networkStateOnlineText", IDS_NETWORK_HEALTH_STATE_ONLINE},
  247. {"networkStatePortalText", IDS_NETWORK_HEALTH_STATE_PORTAL},
  248. {"networkSecurityLabel", IDS_NETWORK_DIAGNOSTICS_SECURITY},
  249. {"networkSecurityNoneLabel", IDS_ONC_WIFI_SECURITY_NONE},
  250. // 8021x uses EAP label in network element localization function.
  251. {"networkSecurityWep8021xLabel", IDS_ONC_WIFI_SECURITY_EAP},
  252. {"networkSecurityWepPskLabel", IDS_ONC_WIFI_SECURITY_WEP},
  253. {"networkSecurityWpaEapLabel", IDS_ONC_WIFI_SECURITY_EAP},
  254. {"networkSecurityWpaPskLabel", IDS_ONC_WIFI_SECURITY_PSK},
  255. {"networkTechnologyCdma1xrttLabel",
  256. IDS_NETWORK_DIAGNOSTICS_CELLULAR_CDMA1XRTT},
  257. {"networkTechnologyEdgeLabel", IDS_NETWORK_DIAGNOSTICS_CELLULAR_EDGE},
  258. {"networkTechnologyEvdoLabel", IDS_NETWORK_DIAGNOSTICS_CELLULAR_EVDO},
  259. {"networkTechnologyGprsLabel", IDS_NETWORK_DIAGNOSTICS_CELLULAR_GPRS},
  260. {"networkTechnologyGsmLabel", IDS_NETWORK_DIAGNOSTICS_CELLULAR_GSM},
  261. {"networkTechnologyHspaLabel", IDS_NETWORK_DIAGNOSTICS_CELLULAR_HSPA},
  262. {"networkTechnologyHspaPlusLabel",
  263. IDS_NETWORK_DIAGNOSTICS_CELLULAR_HSPA_PLUS},
  264. {"networkTechnologyLabel", IDS_ONC_CELLULAR_NETWORK_TECHNOLOGY},
  265. {"networkTechnologyLteLabel", IDS_NETWORK_DIAGNOSTICS_CELLULAR_LTE},
  266. {"networkTechnologyLteAdvancedLabel",
  267. IDS_NETWORK_DIAGNOSTICS_CELLULAR_LTE_ADVANCED},
  268. {"networkTechnologyUmtsLabel", IDS_NETWORK_DIAGNOSTICS_CELLULAR_UMTS},
  269. {"noIpAddressText", IDS_NETWORK_DIAGNOSTICS_NO_IP_ADDRESS_TEXT},
  270. {"notEnoughAvailableMemoryMessage",
  271. IDS_DIAGNOSTICS_NOT_ENOUGH_AVAILABLE_MEMORY},
  272. {"percentageLabel", IDS_DIAGNOSTICS_PERCENTAGE_LABEL},
  273. {"reconnectLinkText", IDS_DIAGNOSTICS_RECONNECT_LINK_TEXT},
  274. {"remainingCharge", IDS_DIAGNOSTICS_REMAINING_CHARGE_LABEL},
  275. {"routineEntryText", IDS_DIANOSTICS_ROUTINE_ENTRY_TEXT},
  276. {"routineNameText", IDS_DIANOSTICS_ROUTINE_NAME_TEXT},
  277. {"runAgainButtonText", IDS_DIAGNOSTICS_RUN_AGAIN_BUTTON_TEXT},
  278. {"routineRemainingMin", IDS_DIAGNOSTICS_ROUTINE_REMAINING_MIN},
  279. {"routineRemainingMinFinal", IDS_DIAGNOSTICS_ROUTINE_REMAINING_MIN_FINAL},
  280. {"routineRemainingMinFinalLarge",
  281. IDS_DIAGNOSTICS_ROUTINE_REMAINING_MIN_FINAL_LARGE},
  282. {"runBatteryChargeTestText",
  283. IDS_DIAGNOSTICS_CHARGE_RUN_TESTS_BUTTON_TEXT},
  284. {"runBatteryDischargeTestText",
  285. IDS_DIAGNOSTICS_DISCHARGE_RUN_TESTS_BUTTON_TEXT},
  286. {"runCpuTestText", IDS_DIAGNOSTICS_CPU_RUN_TESTS_BUTTON_TEXT},
  287. {"runMemoryTestText", IDS_DIAGNOSTICS_MEMORY_RUN_TESTS_BUTTON_TEXT},
  288. {"seeReportText", IDS_DIAGNOSTICS_SEE_REPORT_TEXT},
  289. {"sessionLog", IDS_DIAGNOSTICS_SESSION_LOG_LABEL},
  290. {"sessionLogToastTextFailure",
  291. IDS_DIAGNOSTICS_SESSION_LOG_TOAST_TEXT_FAILURE},
  292. {"sessionLogToastTextSuccess",
  293. IDS_DIAGNOSTICS_SESSION_LOG_TOAST_TEXT_SUCCESS},
  294. {"signalStrengthFailedText", IDS_DIAGNOSTICS_SIGNAL_STRENGTH_FAILED_TEXT},
  295. {"signalStrengthRoutineText", IDS_NETWORK_DIAGNOSTICS_SIGNAL_STRENGTH},
  296. {"signalStrength_Average",
  297. IDS_DIAGNOSTICS_NETWORK_SIGNAL_STRENGTH_AVERAGE},
  298. {"signalStrength_Excellent",
  299. IDS_DIAGNOSTICS_NETWORK_SIGNAL_STRENGTH_EXCELLENT},
  300. {"signalStrength_Good", IDS_DIAGNOSTICS_NETWORK_SIGNAL_STRENGTH_GOOD},
  301. {"signalStrength_Weak", IDS_DIAGNOSTICS_NETWORK_SIGNAL_STRENGTH_WEAK},
  302. {"stopTestButtonText", IDS_DIAGNOSTICS_STOP_TEST_BUTTON_TEXT},
  303. {"systemText", IDS_DIAGNOSTICS_SYSTEM},
  304. {"testCancelledText", IDS_DIAGNOSTICS_CANCELLED_TEST_TEXT},
  305. {"testFailure", IDS_DIAGNOSTICS_TEST_FAILURE_TEXT},
  306. {"testFailedBadgeText", IDS_DIAGNOSTICS_TEST_FAILURE_BADGE_TEXT},
  307. {"testOnRoutinesCompletedText", IDS_DIAGNOSTICS_TEST_ON_COMPLETED_TEXT},
  308. {"testQueuedBadgeText", IDS_DIAGNOSTICS_TEST_QUEUED_BADGE_TEXT},
  309. {"testRunning", IDS_DIAGNOSTICS_TEST_RUNNING_TEXT},
  310. {"testRunningBadgeText", IDS_DIAGNOSTICS_TEST_RUNNING_BADGE_TEXT},
  311. {"testSkippedBadgeText", IDS_DIAGNOSTICS_TEST_SKIPPED_BADGE_TEXT},
  312. {"testStoppedBadgeText", IDS_DIAGNOSTICS_TEST_STOPPED_BADGE_TEXT},
  313. {"testWarningBadgeText", IDS_DIAGNOSTICS_TEST_WARNING_BADGE_TEXT},
  314. {"testSuccess", IDS_DIAGNOSTICS_TEST_SUCCESS_TEXT},
  315. {"testSucceededBadgeText", IDS_DIAGNOSTICS_TEST_SUCCESS_BADGE_TEXT},
  316. {"troubleConnecting", IDS_DIAGNOSTICS_TROUBLE_CONNECTING},
  317. {"troubleshootingText", IDS_DIAGNOSTICS_TROUBLESHOOTING_TEXT},
  318. {"versionInfo", IDS_DIAGNOSTICS_VERSION_INFO_TEXT},
  319. {"visitSettingsToConfigureLinkText",
  320. IDS_NETWORK_DIAGNOSTICS_VISIT_SETTINGS_TO_CONFIGURE_LINK_TEXT},
  321. {"wifiGroupLabel", IDS_NETWORK_DIAGNOSTICS_WIFI_GROUP},
  322. {"wifiLabel", IDS_NETWORK_TYPE_WIFI},
  323. };
  324. html_source->AddLocalizedStrings(kLocalizedStrings);
  325. html_source->AddLocalizedStrings(GetDataSourceUpdate());
  326. html_source->UseStringsJs();
  327. }
  328. void AddDiagnosticsAppPluralStrings(ash::PluralStringHandler* handler) {
  329. static constexpr webui::LocalizedString kLocalizedStrings[] = {
  330. {"nameServersText", IDS_DIAGNOSTICS_NAME_SERVERS}};
  331. for (const auto& str : kLocalizedStrings) {
  332. handler->AddStringToPluralMap(str.name, str.id);
  333. }
  334. }
  335. // TODO(jimmyxgong): Replace with webui::SetUpWebUIDataSource() once it no
  336. // longer requires a dependency on //chrome/browser.
  337. void SetUpWebUIDataSource(content::WebUIDataSource* source,
  338. base::span<const webui::ResourcePath> resources,
  339. int default_resource) {
  340. source->AddResourcePaths(resources);
  341. source->SetDefaultResource(default_resource);
  342. source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER_HTML);
  343. source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS);
  344. source->AddResourcePath("test_loader_util.js",
  345. IDR_WEBUI_JS_TEST_LOADER_UTIL_JS);
  346. source->AddBoolean("isLoggedIn", LoginState::Get()->IsUserLoggedIn());
  347. source->AddBoolean("isInputEnabled",
  348. features::IsInputInDiagnosticsAppEnabled());
  349. source->AddBoolean("isNetworkingEnabled",
  350. features::IsNetworkingInDiagnosticsAppEnabled());
  351. source->AddBoolean("isTouchpadEnabled",
  352. features::IsTouchpadInDiagnosticsAppEnabled());
  353. source->AddBoolean("isTouchscreenEnabled",
  354. features::IsTouchscreenInDiagnosticsAppEnabled());
  355. source->AddBoolean("enableArcNetworkDiagnostics",
  356. features::IsArcNetworkDiagnosticsButtonEnabled());
  357. }
  358. void SetUpPluralStringHandler(content::WebUI* web_ui) {
  359. auto plural_string_handler = std::make_unique<ash::PluralStringHandler>();
  360. AddDiagnosticsAppPluralStrings(plural_string_handler.get());
  361. web_ui->AddMessageHandler(std::move(plural_string_handler));
  362. }
  363. } // namespace
  364. DiagnosticsDialogUI::DiagnosticsDialogUI(
  365. content::WebUI* web_ui,
  366. const diagnostics::SessionLogHandler::SelectFilePolicyCreator&
  367. select_file_policy_creator,
  368. HoldingSpaceClient* holding_space_client,
  369. const base::FilePath& log_directory_path)
  370. : ui::MojoWebDialogUI(web_ui) {
  371. content::WebUIDataSource* html_source =
  372. content::WebUIDataSource::CreateAndAdd(
  373. web_ui->GetWebContents()->GetBrowserContext(),
  374. kChromeUIDiagnosticsAppHost);
  375. html_source->OverrideContentSecurityPolicy(
  376. network::mojom::CSPDirectiveName::ScriptSrc,
  377. "script-src chrome://resources chrome://test 'self';");
  378. html_source->DisableTrustedTypesCSP();
  379. const auto resources = base::make_span(kAshDiagnosticsAppResources,
  380. kAshDiagnosticsAppResourcesSize);
  381. SetUpWebUIDataSource(html_source, resources, IDR_DIAGNOSTICS_APP_INDEX_HTML);
  382. SetUpPluralStringHandler(web_ui);
  383. auto session_log_handler = std::make_unique<diagnostics::SessionLogHandler>(
  384. select_file_policy_creator, holding_space_client, log_directory_path);
  385. diagnostics_manager_ = std::make_unique<diagnostics::DiagnosticsManager>(
  386. session_log_handler.get(), web_ui);
  387. web_ui->AddMessageHandler(std::move(session_log_handler));
  388. AddDiagnosticsStrings(html_source);
  389. ash::common::AddKeyboardDiagramStrings(html_source);
  390. // Add localized strings required for network-icon.
  391. ui::network_element::AddLocalizedStrings(html_source);
  392. ui::network_element::AddOncLocalizedStrings(html_source);
  393. // Configure SFUL metrics.
  394. diagnostics_metrics_ =
  395. std::make_unique<diagnostics::metrics::DiagnosticsMetrics>();
  396. diagnostics_metrics_->RecordUsage(true);
  397. // Setup application navigation metrics.
  398. diagnostics::metrics::NavigationView initial_view =
  399. GetInitialView(web_ui->GetWebContents()->GetURL());
  400. EmitInitialScreen(initial_view);
  401. web_ui->AddMessageHandler(
  402. std::make_unique<diagnostics::metrics::DiagnosticsMetricsMessageHandler>(
  403. initial_view));
  404. // TODO(ashleydp): Clean up timestamp when EmitAppOpenDuration is deprecated
  405. open_timestamp_ = base::Time::Now();
  406. }
  407. DiagnosticsDialogUI::~DiagnosticsDialogUI() {
  408. const base::TimeDelta time_open = base::Time::Now() - open_timestamp_;
  409. diagnostics_metrics_->StopSuccessfulUsage();
  410. // TODO(ashleydp): Clean up when EmitAppOpenDuration is deprecated.
  411. diagnostics::metrics::EmitAppOpenDuration(time_open);
  412. }
  413. void DiagnosticsDialogUI::BindInterface(
  414. mojo::PendingReceiver<diagnostics::mojom::NetworkHealthProvider> receiver) {
  415. DCHECK(features::IsNetworkingInDiagnosticsAppEnabled());
  416. diagnostics::NetworkHealthProvider* network_health_provider =
  417. diagnostics_manager_->GetNetworkHealthProvider();
  418. if (network_health_provider) {
  419. network_health_provider->BindInterface(std::move(receiver));
  420. }
  421. }
  422. void DiagnosticsDialogUI::BindInterface(
  423. mojo::PendingReceiver<diagnostics::mojom::SystemDataProvider> receiver) {
  424. diagnostics::SystemDataProvider* system_data_provider =
  425. diagnostics_manager_->GetSystemDataProvider();
  426. if (system_data_provider) {
  427. system_data_provider->BindInterface(std::move(receiver));
  428. }
  429. }
  430. void DiagnosticsDialogUI::BindInterface(
  431. mojo::PendingReceiver<diagnostics::mojom::SystemRoutineController>
  432. receiver) {
  433. diagnostics::SystemRoutineController* system_routine_controller =
  434. diagnostics_manager_->GetSystemRoutineController();
  435. if (system_routine_controller) {
  436. system_routine_controller->BindInterface(std::move(receiver));
  437. }
  438. }
  439. void DiagnosticsDialogUI::BindInterface(
  440. mojo::PendingReceiver<diagnostics::mojom::InputDataProvider> receiver) {
  441. diagnostics::InputDataProvider* input_data_provider =
  442. diagnostics_manager_->GetInputDataProvider();
  443. if (input_data_provider) {
  444. input_data_provider->BindInterface(std::move(receiver));
  445. }
  446. }
  447. WEB_UI_CONTROLLER_TYPE_IMPL(DiagnosticsDialogUI)
  448. } // namespace ash