summaryrefslogtreecommitdiffstats
path: root/chromium/chrome/browser
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-10-06 12:48:11 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-10-13 09:33:43 +0000
commit7b5b123ac58f58ffde0f4f6e488bcd09aa4decd3 (patch)
treefa14ba0ca8d2683ba2efdabd246dc9b18a1229c6 /chromium/chrome/browser
parent79b4f909db1049fca459c07cca55af56a9b54fe3 (diff)
BASELINE: Update Chromium to 84.0.4147.141
Change-Id: Ib85eb4cfa1cbe2b2b81e5022c8cad5c493969535 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/chrome/browser')
-rw-r--r--chromium/chrome/browser/BUILD.gn518
-rw-r--r--chromium/chrome/browser/accessibility/accessibility_extension_api.cc71
-rw-r--r--chromium/chrome/browser/accessibility/accessibility_extension_api.h9
-rw-r--r--chromium/chrome/browser/accessibility/accessibility_extension_api_browsertest.cc1
-rw-r--r--chromium/chrome/browser/accessibility/accessibility_labels_service.cc61
-rw-r--r--chromium/chrome/browser/accessibility/accessibility_labels_service_browsertest.cc1
-rw-r--r--chromium/chrome/browser/accessibility/accessibility_permission_context.cc1
-rw-r--r--chromium/chrome/browser/accessibility/browser_accessibility_state_browsertest.cc1
-rw-r--r--chromium/chrome/browser/accessibility/caption_controller.cc190
-rw-r--r--chromium/chrome/browser/accessibility/caption_controller.h108
-rw-r--r--chromium/chrome/browser/accessibility/caption_controller_factory.cc51
-rw-r--r--chromium/chrome/browser/accessibility/caption_controller_factory.h41
-rw-r--r--chromium/chrome/browser/accessibility/caption_host_impl.cc65
-rw-r--r--chromium/chrome/browser/accessibility/caption_host_impl.h52
-rw-r--r--chromium/chrome/browser/accessibility/caption_util.cc66
-rw-r--r--chromium/chrome/browser/accessibility/caption_util.h20
-rw-r--r--chromium/chrome/browser/accessibility/image_annotation_browsertest.cc3
-rw-r--r--chromium/chrome/browser/accessibility/interstitial_accessibility_browsertest.cc2
-rw-r--r--chromium/chrome/browser/android/examples/custom_tabs_client/BUILD.gn79
-rw-r--r--chromium/chrome/browser/android/examples/partner_browser_customizations_provider/BUILD.gn29
-rw-r--r--chromium/chrome/browser/android/lifecycle/BUILD.gn1
-rw-r--r--chromium/chrome/browser/android/metrics/BUILD.gn1
-rw-r--r--chromium/chrome/browser/android/vr/BUILD.gn1
-rw-r--r--chromium/chrome/browser/apps/platform_apps/BUILD.gn1
-rw-r--r--chromium/chrome/browser/browser_resources.grd13
-rw-r--r--chromium/chrome/browser/chromeos/BUILD.gn160
-rw-r--r--chromium/chrome/browser/chromeos/net/mojom/BUILD.gn12
-rw-r--r--chromium/chrome/browser/chromeos/net/mojom/network_health.mojom33
-rw-r--r--chromium/chrome/browser/chromeos/net/network_diagnostics/BUILD.gn11
-rw-r--r--chromium/chrome/browser/chromeos/net/network_diagnostics/network_diagnostics.mojom72
-rw-r--r--chromium/chrome/browser/custom_handlers/OWNERS1
-rw-r--r--chromium/chrome/browser/custom_handlers/protocol_handler_registry.cc3
-rw-r--r--chromium/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc4
-rw-r--r--chromium/chrome/browser/custom_handlers/test_protocol_handler_registry_delegate.cc2
-rw-r--r--chromium/chrome/browser/dev_ui_browser_resources.grd2
-rw-r--r--chromium/chrome/browser/devtools/BUILD.gn2
-rw-r--r--chromium/chrome/browser/devtools/device/adb/adb_client_socket.cc35
-rw-r--r--chromium/chrome/browser/devtools/device/adb/adb_client_socket_browsertest.cc25
-rw-r--r--chromium/chrome/browser/devtools/device/adb/mock_adb_server.cc43
-rw-r--r--chromium/chrome/browser/devtools/device/android_device_manager.cc9
-rw-r--r--chromium/chrome/browser/devtools/device/android_web_socket.cc8
-rw-r--r--chromium/chrome/browser/devtools/device/devtools_android_bridge_browsertest.cc1
-rw-r--r--chromium/chrome/browser/devtools/device/devtools_device_discovery.cc7
-rw-r--r--chromium/chrome/browser/devtools/device/port_forwarding_browsertest.cc1
-rw-r--r--chromium/chrome/browser/devtools/device/port_forwarding_controller.cc24
-rw-r--r--chromium/chrome/browser/devtools/device/usb/android_usb_browsertest.cc1
-rw-r--r--chromium/chrome/browser/devtools/device/usb/android_usb_device.cc21
-rw-r--r--chromium/chrome/browser/devtools/device/usb/android_usb_socket.cc3
-rw-r--r--chromium/chrome/browser/devtools/device/usb/usb_device_provider.cc16
-rw-r--r--chromium/chrome/browser/devtools/devtools_browser_context_manager.cc58
-rw-r--r--chromium/chrome/browser/devtools/devtools_browser_context_manager.h17
-rw-r--r--chromium/chrome/browser/devtools/devtools_eye_dropper.cc6
-rw-r--r--chromium/chrome/browser/devtools/devtools_file_system_indexer.cc2
-rw-r--r--chromium/chrome/browser/devtools/devtools_file_watcher_unittest.cc6
-rw-r--r--chromium/chrome/browser/devtools/devtools_sanity_browsertest.cc17
-rw-r--r--chromium/chrome/browser/devtools/devtools_sanity_interactive_browsertest.cc1
-rw-r--r--chromium/chrome/browser/devtools/devtools_ui_bindings.cc8
-rw-r--r--chromium/chrome/browser/devtools/devtools_window.cc11
-rw-r--r--chromium/chrome/browser/devtools/devtools_window.h1
-rw-r--r--chromium/chrome/browser/devtools/global_confirm_info_bar.cc86
-rw-r--r--chromium/chrome/browser/devtools/global_confirm_info_bar.h23
-rw-r--r--chromium/chrome/browser/devtools/global_confirm_info_bar_browsertest.cc40
-rw-r--r--chromium/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc74
-rw-r--r--chromium/chrome/browser/devtools/protocol/target_handler.h1
-rw-r--r--chromium/chrome/browser/download/android/BUILD.gn55
-rw-r--r--chromium/chrome/browser/download/internal/android/BUILD.gn18
-rw-r--r--chromium/chrome/browser/enterprise/connectors/BUILD.gn (renamed from chromium/chrome/browser/upboarding/query_tiles/proto/BUILD.gn)7
-rw-r--r--chromium/chrome/browser/enterprise/util/BUILD.gn19
-rw-r--r--chromium/chrome/browser/extensions/BUILD.gn21
-rw-r--r--chromium/chrome/browser/extensions/api/activity_log_private/activity_log_private_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/alarms/alarms_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/autofill_assistant_private/autofill_assistant_private_api.cc24
-rw-r--r--chromium/chrome/browser/extensions/api/autofill_assistant_private/autofill_assistant_private_api.h7
-rw-r--r--chromium/chrome/browser/extensions/api/autofill_private/autofill_private_apitest.cc5
-rw-r--r--chromium/chrome/browser/extensions/api/automation/automation_apitest.cc14
-rw-r--r--chromium/chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api.cc171
-rw-r--r--chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api.h48
-rw-r--r--chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api_unittest.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/bookmarks/bookmark_api_constants.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/bookmarks/bookmark_api_constants.h1
-rw-r--r--chromium/chrome/browser/extensions/api/bookmarks/bookmark_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc302
-rw-r--r--chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api.h66
-rw-r--r--chromium/chrome/browser/extensions/api/braille_display_private/braille_controller_brlapi.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/braille_display_private/braille_display_private_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc60
-rw-r--r--chromium/chrome/browser/extensions/api/browsing_data/browsing_data_api.h14
-rw-r--r--chromium/chrome/browser/extensions/api/browsing_data/browsing_data_test.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/browsing_data/browsing_data_unittest.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/cast_streaming/cast_streaming_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/cast_streaming/performance_test.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc5
-rw-r--r--chromium/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc134
-rw-r--r--chromium/chrome/browser/extensions/api/chrome_extensions_api_client.cc5
-rw-r--r--chromium/chrome/browser/extensions/api/cloud_print_private/cloud_print_private_apitest.cc9
-rw-r--r--chromium/chrome/browser/extensions/api/command_line_private/command_line_private_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/commands/command_service.cc275
-rw-r--r--chromium/chrome/browser/extensions/api/commands/command_service.h69
-rw-r--r--chromium/chrome/browser/extensions/api/commands/command_service_browsertest.cc132
-rw-r--r--chromium/chrome/browser/extensions/api/commands/commands.cc18
-rw-r--r--chromium/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc13
-rw-r--r--chromium/chrome/browser/extensions/api/content_settings/content_settings_custom_extension_provider.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/content_settings/content_settings_custom_extension_provider.h12
-rw-r--r--chromium/chrome/browser/extensions/api/content_settings/content_settings_helpers.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/content_settings/content_settings_store.cc5
-rw-r--r--chromium/chrome/browser/extensions/api/context_menus/context_menu_apitest.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/context_menus/context_menus_api.cc5
-rw-r--r--chromium/chrome/browser/extensions/api/cookies/cookies_api.cc18
-rw-r--r--chromium/chrome/browser/extensions/api/cookies/cookies_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/cookies/cookies_helpers.cc18
-rw-r--r--chromium/chrome/browser/extensions/api/debugger/debugger_api.cc39
-rw-r--r--chromium/chrome/browser/extensions/api/debugger/debugger_apitest.cc34
-rw-r--r--chromium/chrome/browser/extensions/api/debugger/debugger_extension_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar.cc147
-rw-r--r--chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar.h43
-rw-r--r--chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar_delegate.cc97
-rw-r--r--chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar_delegate.h60
-rw-r--r--chromium/chrome/browser/extensions/api/declarative/declarative_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_content/content_action.cc6
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_content/content_action_unittest.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_content/declarative_content_apitest.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_content/request_content_script_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_content/set_icon_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_net_request/action_tracker_unittest.cc11
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_apitest.cc8
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc1339
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_unittest.cc1380
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_net_request/dnr_test_base.cc5
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_net_request/dnr_test_base.h3
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_net_request/rule_indexing_unittest.cc860
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_net_request/ruleset_manager_unittest.cc171
-rw-r--r--chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/developer_private/developer_private_api.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc30
-rw-r--r--chromium/chrome/browser/extensions/api/developer_private/developer_private_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/developer_private/extension_info_generator.cc43
-rw-r--r--chromium/chrome/browser/extensions/api/developer_private/extension_info_generator.h8
-rw-r--r--chromium/chrome/browser/extensions/api/downloads/downloads_api.cc46
-rw-r--r--chromium/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_apitest_nss.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_reporting_private/device_info_fetcher.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_reporting_private/device_info_fetcher_mac.mm1
-rw-r--r--chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.cc6
-rw-r--r--chromium/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc132
-rw-r--r--chromium/chrome/browser/extensions/api/extension_action/browser_action_browsertest.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc9
-rw-r--r--chromium/chrome/browser/extensions/api/extension_action/extension_action_api.cc15
-rw-r--r--chromium/chrome/browser/extensions/api/extension_action/extension_action_api.h10
-rw-r--r--chromium/chrome/browser/extensions/api/extension_action/extension_action_api_unittest.cc39
-rw-r--r--chromium/chrome/browser/extensions/api/extension_action/extension_action_apitest.cc232
-rw-r--r--chromium/chrome/browser/extensions/api/extension_action/page_action_apitest.cc7
-rw-r--r--chromium/chrome/browser/extensions/api/extension_action/test_icon_image_observer.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/file_system/chrome_file_system_delegate.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/file_system/file_system_apitest.cc9
-rw-r--r--chromium/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/font_settings/font_settings_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/gcm/gcm_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/history/history_api.cc12
-rw-r--r--chromium/chrome/browser/extensions/api/history/history_apitest.cc7
-rw-r--r--chromium/chrome/browser/extensions/api/i18n/i18n_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/identity/OWNERS1
-rw-r--r--chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.cc89
-rw-r--r--chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.h20
-rw-r--r--chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow_unittest.cc6
-rw-r--r--chromium/chrome/browser/extensions/api/identity/gaia_web_auth_flow.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/identity/gaia_web_auth_flow_unittest.cc6
-rw-r--r--chromium/chrome/browser/extensions/api/identity/identity_api.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/identity/identity_api_unittest.cc11
-rw-r--r--chromium/chrome/browser/extensions/api/identity/identity_apitest.cc316
-rw-r--r--chromium/chrome/browser/extensions/api/identity/identity_constants.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/identity/identity_constants.h1
-rw-r--r--chromium/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc37
-rw-r--r--chromium/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.cc35
-rw-r--r--chromium/chrome/browser/extensions/api/identity/identity_launch_web_auth_flow_function.cc6
-rw-r--r--chromium/chrome/browser/extensions/api/identity/identity_mint_queue.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/identity/identity_private_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/identity/web_auth_flow.cc41
-rw-r--r--chromium/chrome/browser/extensions/api/identity/web_auth_flow.h13
-rw-r--r--chromium/chrome/browser/extensions/api/idle/idle_get_auto_lock_delay_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/idltest/idltest_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.cc5
-rw-r--r--chromium/chrome/browser/extensions/api/image_writer_private/image_writer_private_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.cc9
-rw-r--r--chromium/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client_browsertest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/input_ime/input_ime_api.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc15
-rw-r--r--chromium/chrome/browser/extensions/api/input_ime/input_ime_apitest_chromeos.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/instance_id/instance_id_api.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/instance_id/instance_id_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc37
-rw-r--r--chromium/chrome/browser/extensions/api/management/management_api_browsertest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/management/management_api_non_persistent_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/management/management_api_unittest.cc343
-rw-r--r--chromium/chrome/browser/extensions/api/management/management_apitest.cc19
-rw-r--r--chromium/chrome/browser/extensions/api/management/management_browsertest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/mdns/OWNERS1
-rw-r--r--chromium/chrome/browser/extensions/api/mdns/mdns_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/messaging/chrome_messaging_delegate.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/messaging/incognito_connectability.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/messaging/native_message_process_host_unittest.cc7
-rw-r--r--chromium/chrome/browser/extensions/api/messaging/native_messaging_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/messaging/native_messaging_host_manifest_unittest.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/metrics_private/metrics_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/module/module_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/networking_cast_private/networking_cast_private_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/networking_config_chromeos_apitest_chromeos.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/networking_private/networking_private_apitest.cc15
-rw-r--r--chromium/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/networking_private/networking_private_crypto_unittest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/networking_private/networking_private_service_client_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/notifications/extension_notification_handler.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/notifications/notifications_apitest.cc10
-rw-r--r--chromium/chrome/browser/extensions/api/omnibox/omnibox_api_interactive_test.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/page_capture/page_capture_api.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/page_capture/page_capture_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_factory.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc63
-rw-r--r--chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h34
-rw-r--r--chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc148
-rw-r--r--chromium/chrome/browser/extensions/api/permissions/permissions_api.cc7
-rw-r--r--chromium/chrome/browser/extensions/api/permissions/permissions_api_unittest.cc7
-rw-r--r--chromium/chrome/browser/extensions/api/permissions/permissions_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/platform_keys/platform_keys_apitest_nss.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/preference/preference_api.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/preference/preference_apitest.cc15
-rw-r--r--chromium/chrome/browser/extensions/api/processes/processes_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/proxy/proxy_apitest.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/resources_private/resources_private_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc13
-rw-r--r--chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate_unittest.cc10
-rw-r--r--chromium/chrome/browser/extensions/api/runtime/runtime_apitest.cc93
-rw-r--r--chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc97
-rw-r--r--chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h14
-rw-r--r--chromium/chrome/browser/extensions/api/sessions/sessions_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/settings_private/prefs_util.cc20
-rw-r--r--chromium/chrome/browser/extensions/api/settings_private/settings_private_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/socket/socket_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/storage/managed_value_store_cache.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/storage/settings_apitest.cc8
-rw-r--r--chromium/chrome/browser/extensions/api/storage/settings_sync_processor.cc11
-rw-r--r--chromium/chrome/browser/extensions/api/storage/settings_sync_processor.h6
-rw-r--r--chromium/chrome/browser/extensions/api/storage/settings_sync_unittest.cc21
-rw-r--r--chromium/chrome/browser/extensions/api/storage/sync_storage_backend.cc23
-rw-r--r--chromium/chrome/browser/extensions/api/storage/sync_storage_backend.h4
-rw-r--r--chromium/chrome/browser/extensions/api/storage/syncable_settings_storage.cc45
-rw-r--r--chromium/chrome/browser/extensions/api/storage/syncable_settings_storage.h21
-rw-r--r--chromium/chrome/browser/extensions/api/system_display/system_display_chromeos_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/system_indicator/system_indicator_api.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/system_indicator/system_indicator_apitest.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/system_private/system_private_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc39
-rw-r--r--chromium/chrome/browser/extensions/api/tab_capture/tab_capture_performance_test_base.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/tab_capture/tab_capture_performancetest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/tabs/tabs_api.cc109
-rw-r--r--chromium/chrome/browser/extensions/api/tabs/tabs_api_unittest.cc39
-rw-r--r--chromium/chrome/browser/extensions/api/tabs/tabs_interactive_test.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/tabs/tabs_test.cc12
-rw-r--r--chromium/chrome/browser/extensions/api/tabs/tabs_util_chromeos.cc2
-rw-r--r--chromium/chrome/browser/extensions/api/terminal/crostini_startup_status.cc43
-rw-r--r--chromium/chrome/browser/extensions/api/terminal/crostini_startup_status_unittest.cc8
-rw-r--r--chromium/chrome/browser/extensions/api/terminal/terminal_extension_helper.cc8
-rw-r--r--chromium/chrome/browser/extensions/api/terminal/terminal_extension_helper.h5
-rw-r--r--chromium/chrome/browser/extensions/api/terminal/terminal_private_api.cc22
-rw-r--r--chromium/chrome/browser/extensions/api/terminal/terminal_private_api.h22
-rw-r--r--chromium/chrome/browser/extensions/api/terminal/terminal_private_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/terminal/terminal_private_browsertest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/top_sites/top_sites_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc19
-rw-r--r--chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.h3
-rw-r--r--chromium/chrome/browser/extensions/api/vpn_provider/vpn_provider_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/web_navigation/frame_navigation_state.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc59
-rw-r--r--chromium/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc68
-rw-r--r--chromium/chrome/browser/extensions/api/web_request/web_request_apitest.cc58
-rw-r--r--chromium/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/webrtc_from_web_accessible_resource_browsertest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.cc29
-rw-r--r--chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc1
-rw-r--r--chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_browsertest.cc4
-rw-r--r--chromium/chrome/browser/extensions/api/webstore_private/extension_install_status.cc23
-rw-r--r--chromium/chrome/browser/extensions/api/webstore_private/extension_install_status.h4
-rw-r--r--chromium/chrome/browser/extensions/api/webstore_private/extension_install_status_unittest.cc14
-rw-r--r--chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc112
-rw-r--r--chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.h14
-rw-r--r--chromium/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc96
-rw-r--r--chromium/chrome/browser/extensions/api/webstore_private/webstore_private_unittest.cc6
-rw-r--r--chromium/chrome/browser/flags/BUILD.gn5
-rw-r--r--chromium/chrome/browser/image_fetcher/BUILD.gn1
-rw-r--r--chromium/chrome/browser/media/feeds/BUILD.gn1
-rw-r--r--chromium/chrome/browser/media/feeds/media_feeds_store.mojom166
-rw-r--r--chromium/chrome/browser/media/router/BUILD.gn11
-rw-r--r--chromium/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.cc79
-rw-r--r--chromium/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.h52
-rw-r--r--chromium/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context_unittest.cc111
-rw-r--r--chromium/chrome/browser/media/webrtc/desktop_capture_access_handler_unittest.cc13
-rw-r--r--chromium/chrome/browser/media/webrtc/display_media_access_handler_unittest.cc13
-rw-r--r--chromium/chrome/browser/media/webrtc/media_capture_devices_dispatcher.cc127
-rw-r--r--chromium/chrome/browser/media/webrtc/media_capture_devices_dispatcher.h46
-rw-r--r--chromium/chrome/browser/media/webrtc/media_stream_capture_indicator.cc3
-rw-r--r--chromium/chrome/browser/media/webrtc/media_stream_device_permission_context.cc1
-rw-r--r--chromium/chrome/browser/media/webrtc/media_stream_devices_controller.cc608
-rw-r--r--chromium/chrome/browser/media/webrtc/media_stream_devices_controller.h142
-rw-r--r--chromium/chrome/browser/media/webrtc/media_stream_devices_controller_browsertest.cc296
-rw-r--r--chromium/chrome/browser/media/webrtc/media_stream_infobar_browsertest.cc2
-rw-r--r--chromium/chrome/browser/media/webrtc/permission_bubble_media_access_handler.cc120
-rw-r--r--chromium/chrome/browser/media/webrtc/permission_bubble_media_access_handler.h17
-rw-r--r--chromium/chrome/browser/media/webrtc/system_media_capture_permissions_mac.mm31
-rw-r--r--chromium/chrome/browser/media/webrtc/test_stats_dictionary.cc2
-rw-r--r--chromium/chrome/browser/media/webrtc/test_stats_dictionary_unittest.cc2
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_apprtc_browsertest.cc1
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_browsertest.cc1
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_desktop_capture_browsertest.cc1
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_disable_encryption_flag_browsertest.cc1
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_common_unittest.cc2
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_keyed_service.cc2
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_keyed_service_factory.cc2
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_unittest_helpers.cc3
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc1
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_getmediadevices_browsertest.cc16
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_internals_integration_browsertest.cc1
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_internals_perf_browsertest.cc1
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_log_buffer.cc2
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_log_uploader_unittest.cc1
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_logging_controller.cc12
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_pan_tilt_zoom_browsertest.cc103
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_simulcast_browsertest.cc1
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_stats_perf_browsertest.cc1
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_text_log_handler.cc8
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc1
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_video_high_bitrate_browsertest.cc1
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_video_quality_browsertest.cc1
-rw-r--r--chromium/chrome/browser/media/webrtc/webrtc_webcam_browsertest.cc1
-rw-r--r--chromium/chrome/browser/metrics/BUILD.gn6
-rw-r--r--chromium/chrome/browser/net/cert_verify_proc_browsertest.cc1
-rw-r--r--chromium/chrome/browser/net/chrome_accept_header_browsertest.cc27
-rw-r--r--chromium/chrome/browser/net/chrome_mojo_proxy_resolver_factory.cc2
-rw-r--r--chromium/chrome/browser/net/chrome_mojo_proxy_resolver_factory_browsertest.cc2
-rw-r--r--chromium/chrome/browser/net/chrome_network_delegate_browsertest.cc1
-rw-r--r--chromium/chrome/browser/net/chrome_network_service_browsertest.cc4
-rw-r--r--chromium/chrome/browser/net/cookie_policy_browsertest.cc1
-rw-r--r--chromium/chrome/browser/net/dns_over_https_browsertest.cc80
-rw-r--r--chromium/chrome/browser/net/dns_probe_browsertest.cc13
-rw-r--r--chromium/chrome/browser/net/dns_probe_service_factory.cc24
-rw-r--r--chromium/chrome/browser/net/dns_probe_service_factory_unittest.cc14
-rw-r--r--chromium/chrome/browser/net/dns_probe_test_util.cc11
-rw-r--r--chromium/chrome/browser/net/dns_probe_test_util.h13
-rw-r--r--chromium/chrome/browser/net/errorpage_browsertest.cc5
-rw-r--r--chromium/chrome/browser/net/load_timing_browsertest.cc1
-rw-r--r--chromium/chrome/browser/net/log_net_log_browsertest.cc1
-rw-r--r--chromium/chrome/browser/net/net_error_diagnostics_dialog_posix.cc2
-rw-r--r--chromium/chrome/browser/net/net_error_diagnostics_dialog_win.cc2
-rw-r--r--chromium/chrome/browser/net/netinfo_network_quality_estimator_holdback_browsertest.cc4
-rw-r--r--chromium/chrome/browser/net/network_connection_tracker_browsertest.cc7
-rw-r--r--chromium/chrome/browser/net/network_context_configuration_browsertest.cc61
-rw-r--r--chromium/chrome/browser/net/network_quality_estimator_browsertest.cc1
-rw-r--r--chromium/chrome/browser/net/network_quality_estimator_prefs_browsertest.cc2
-rw-r--r--chromium/chrome/browser/net/network_quality_netinfo_browsertest.cc1
-rw-r--r--chromium/chrome/browser/net/network_quality_tracker_browsertest.cc2
-rw-r--r--chromium/chrome/browser/net/network_request_metrics_browsertest.cc17
-rw-r--r--chromium/chrome/browser/net/nss_context_chromeos.cc4
-rw-r--r--chromium/chrome/browser/net/nss_context_chromeos_browsertest.cc30
-rw-r--r--chromium/chrome/browser/net/prediction_options.cc2
-rw-r--r--chromium/chrome/browser/net/profile_network_context_service.cc147
-rw-r--r--chromium/chrome/browser/net/profile_network_context_service.h29
-rw-r--r--chromium/chrome/browser/net/profile_network_context_service_browsertest.cc230
-rw-r--r--chromium/chrome/browser/net/profile_network_context_service_test_utils.cc11
-rw-r--r--chromium/chrome/browser/net/proxy_browsertest.cc1
-rw-r--r--chromium/chrome/browser/net/referrer.cc2
-rw-r--r--chromium/chrome/browser/net/referrer_policy_policy_browsertest.cc1
-rw-r--r--chromium/chrome/browser/net/reporting_browsertest.cc1
-rw-r--r--chromium/chrome/browser/net/samesite_cookies_policy_browsertest.cc1
-rw-r--r--chromium/chrome/browser/net/secure_dns_config.cc46
-rw-r--r--chromium/chrome/browser/net/secure_dns_config.h65
-rw-r--r--chromium/chrome/browser/net/secure_dns_config_unittest.cc42
-rw-r--r--chromium/chrome/browser/net/secure_dns_policy_handler.cc21
-rw-r--r--chromium/chrome/browser/net/secure_dns_policy_handler_unittest.cc48
-rw-r--r--chromium/chrome/browser/net/secure_dns_util.cc (renamed from chromium/chrome/browser/net/dns_util.cc)27
-rw-r--r--chromium/chrome/browser/net/secure_dns_util.h (renamed from chromium/chrome/browser/net/dns_util.h)41
-rw-r--r--chromium/chrome/browser/net/secure_dns_util_unittest.cc (renamed from chromium/chrome/browser/net/dns_util_unittest.cc)77
-rw-r--r--chromium/chrome/browser/net/service_providers_win.cc2
-rw-r--r--chromium/chrome/browser/net/stub_resolver_config_reader.cc109
-rw-r--r--chromium/chrome/browser/net/stub_resolver_config_reader.h33
-rw-r--r--chromium/chrome/browser/net/stub_resolver_config_reader_unittest.cc195
-rw-r--r--chromium/chrome/browser/net/system_network_context_manager.cc45
-rw-r--r--chromium/chrome/browser/net/system_network_context_manager.h11
-rw-r--r--chromium/chrome/browser/net/system_network_context_manager_browsertest.cc218
-rw-r--r--chromium/chrome/browser/net/trial_comparison_cert_verifier_browsertest.cc1
-rw-r--r--chromium/chrome/browser/net/trust_token_usecounter_browsertest.cc140
-rw-r--r--chromium/chrome/browser/net/variations_http_headers_browsertest.cc3
-rw-r--r--chromium/chrome/browser/net/websocket_browsertest.cc196
-rw-r--r--chromium/chrome/browser/offline_pages/android/BUILD.gn20
-rw-r--r--chromium/chrome/browser/page_load_metrics/integration_tests/jsdeps.gni5
-rw-r--r--chromium/chrome/browser/page_load_metrics/integration_tests/sources.gni1
-rw-r--r--chromium/chrome/browser/payments/BUILD.gn8
-rw-r--r--chromium/chrome/browser/payments/android/BUILD.gn1
-rw-r--r--chromium/chrome/browser/performance_manager/BUILD.gn10
-rw-r--r--chromium/chrome/browser/policy/BUILD.gn6
-rw-r--r--chromium/chrome/browser/prefs/browser_prefs.cc280
-rw-r--r--chromium/chrome/browser/prefs/browser_prefs.h7
-rw-r--r--chromium/chrome/browser/prefs/pref_functional_browsertest.cc1
-rw-r--r--chromium/chrome/browser/prefs/pref_service_browsertest.cc1
-rw-r--r--chromium/chrome/browser/prefs/profile_pref_store_manager.cc3
-rw-r--r--chromium/chrome/browser/prefs/tracked/pref_hash_browsertest.cc13
-rw-r--r--chromium/chrome/browser/printing/cloud_print/privet_http_unittest.cc5
-rw-r--r--chromium/chrome/browser/printing/pdf_nup_converter_client_browsertest.cc1
-rw-r--r--chromium/chrome/browser/printing/pdf_to_emf_converter.cc10
-rw-r--r--chromium/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc21
-rw-r--r--chromium/chrome/browser/printing/print_browsertest.cc96
-rw-r--r--chromium/chrome/browser/printing/print_dialog_cloud_posix.cc17
-rw-r--r--chromium/chrome/browser/printing/print_dialog_cloud_win.cc6
-rw-r--r--chromium/chrome/browser/printing/print_dialog_cloud_win.h (renamed from chromium/chrome/browser/printing/print_dialog_cloud.h)17
-rw-r--r--chromium/chrome/browser/printing/print_job.cc56
-rw-r--r--chromium/chrome/browser/printing/print_job.h5
-rw-r--r--chromium/chrome/browser/printing/print_job_worker.cc32
-rw-r--r--chromium/chrome/browser/printing/print_job_worker.h7
-rw-r--r--chromium/chrome/browser/printing/print_preview_context_menu_observer.cc2
-rw-r--r--chromium/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc27
-rw-r--r--chromium/chrome/browser/printing/print_preview_dialog_controller_unittest.cc31
-rw-r--r--chromium/chrome/browser/printing/print_preview_message_handler.cc26
-rw-r--r--chromium/chrome/browser/printing/print_preview_message_handler.h6
-rw-r--r--chromium/chrome/browser/printing/print_preview_pdf_generated_browsertest.cc2
-rw-r--r--chromium/chrome/browser/printing/print_test_utils.cc10
-rw-r--r--chromium/chrome/browser/printing/print_view_manager_base.cc14
-rw-r--r--chromium/chrome/browser/printing/print_view_manager_basic_unittest.cc2
-rw-r--r--chromium/chrome/browser/printing/print_view_manager_unittest.cc2
-rw-r--r--chromium/chrome/browser/printing/printing_message_filter.cc12
-rw-r--r--chromium/chrome/browser/printing/pwg_raster_converter.cc8
-rw-r--r--chromium/chrome/browser/printing/pwg_raster_converter_browsertest.cc8
-rw-r--r--chromium/chrome/browser/profiles/android/BUILD.gn3
-rw-r--r--chromium/chrome/browser/profiling_host/BUILD.gn4
-rw-r--r--chromium/chrome/browser/renderer_host/chrome_extension_message_filter.cc3
-rw-r--r--chromium/chrome/browser/renderer_host/chrome_navigation_ui_data.cc10
-rw-r--r--chromium/chrome/browser/renderer_host/chrome_navigation_ui_data.h7
-rw-r--r--chromium/chrome/browser/renderer_host/chrome_render_widget_host_view_mac_history_swiper.mm4
-rw-r--r--chromium/chrome/browser/renderer_host/chrome_render_widget_host_view_mac_history_swiper_browsertest.mm9
-rw-r--r--chromium/chrome/browser/renderer_host/pepper/pepper_flash_drm_host.cc3
-rw-r--r--chromium/chrome/browser/renderer_host/render_process_host_chrome_browsertest.cc1
-rw-r--r--chromium/chrome/browser/resources/BUILD.gn74
-rw-r--r--chromium/chrome/browser/resources/about_sys/about_sys.css9
-rw-r--r--chromium/chrome/browser/resources/about_sys/about_sys.js8
-rw-r--r--chromium/chrome/browser/resources/accessibility/accessibility.js3
-rw-r--r--chromium/chrome/browser/resources/bluetooth_internals/adapter_page.js7
-rw-r--r--chromium/chrome/browser/resources/bluetooth_internals/object_fieldset.js2
-rw-r--r--chromium/chrome/browser/resources/bookmarks/BUILD.gn88
-rw-r--r--chromium/chrome/browser/resources/bookmarks/bookmarks_resources.grd35
-rw-r--r--chromium/chrome/browser/resources/browser_switch/BUILD.gn8
-rw-r--r--chromium/chrome/browser/resources/cast/cast.html12
-rw-r--r--chromium/chrome/browser/resources/cast/cast.js6
-rw-r--r--chromium/chrome/browser/resources/certificate_viewer.html1
-rw-r--r--chromium/chrome/browser/resources/certificate_viewer.js18
-rw-r--r--chromium/chrome/browser/resources/chrome_urls_disabled_page/app.html70
-rw-r--r--chromium/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn30
-rw-r--r--chromium/chrome/browser/resources/chromeos/accessibility/common/BUILD.gn8
-rw-r--r--chromium/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp83
-rw-r--r--chromium/chrome/browser/resources/chromeos/accessibility/switch_access/BUILD.gn12
-rw-r--r--chromium/chrome/browser/resources/chromeos/camera/BUILD.gn13
-rw-r--r--chromium/chrome/browser/resources/chromeos/camera/camera_resources.grd26
-rw-r--r--chromium/chrome/browser/resources/chromeos/camera/src/js/BUILD.gn12
-rw-r--r--chromium/chrome/browser/resources/chromeos/camera/src/js/externs/BUILD.gn8
-rw-r--r--chromium/chrome/browser/resources/chromeos/camera/src/js/lib/BUILD.gn4
-rw-r--r--chromium/chrome/browser/resources/chromeos/camera/src/js/models/BUILD.gn7
-rw-r--r--chromium/chrome/browser/resources/chromeos/camera/src/js/views/BUILD.gn2
-rw-r--r--chromium/chrome/browser/resources/chromeos/edu_login/BUILD.gn21
-rw-r--r--chromium/chrome/browser/resources/chromeos/login/BUILD.gn150
-rw-r--r--chromium/chrome/browser/resources/chromeos/login/components/BUILD.gn66
-rw-r--r--chromium/chrome/browser/resources/component_extension_resources.grd13
-rw-r--r--chromium/chrome/browser/resources/discards/.eslintrc.js11
-rw-r--r--chromium/chrome/browser/resources/discards/database_tab.js20
-rw-r--r--chromium/chrome/browser/resources/discards/discards.js4
-rw-r--r--chromium/chrome/browser/resources/discards/discards_main.html1
-rw-r--r--chromium/chrome/browser/resources/discards/discards_main.js45
-rw-r--r--chromium/chrome/browser/resources/discards/discards_tab.js34
-rw-r--r--chromium/chrome/browser/resources/discards/graph_doc.js394
-rw-r--r--chromium/chrome/browser/resources/discards/graph_doc_template.html25
-rw-r--r--chromium/chrome/browser/resources/discards/graph_tab_template.js33
-rw-r--r--chromium/chrome/browser/resources/discards/sorted_table_behavior.js2
-rw-r--r--chromium/chrome/browser/resources/downloads/BUILD.gn40
-rw-r--r--chromium/chrome/browser/resources/downloads/downloads_resources.grd15
-rw-r--r--chromium/chrome/browser/resources/engagement/site_engagement.js2
-rw-r--r--chromium/chrome/browser/resources/extensions/BUILD.gn213
-rw-r--r--chromium/chrome/browser/resources/extensions/activity_log/BUILD.gn46
-rw-r--r--chromium/chrome/browser/resources/extensions/checkup.html5
-rw-r--r--chromium/chrome/browser/resources/extensions/checkup.js1
-rw-r--r--chromium/chrome/browser/resources/extensions/detail_view.html52
-rw-r--r--chromium/chrome/browser/resources/extensions/error_page.html3
-rw-r--r--chromium/chrome/browser/resources/extensions/extensions_resources.grd74
-rw-r--r--chromium/chrome/browser/resources/extensions/item.html37
-rw-r--r--chromium/chrome/browser/resources/extensions/item.js1
-rw-r--r--chromium/chrome/browser/resources/extensions/manager.html2
-rw-r--r--chromium/chrome/browser/resources/extensions/sidebar.html2
-rw-r--r--chromium/chrome/browser/resources/extensions/sidebar.js5
-rw-r--r--chromium/chrome/browser/resources/feed_internals/feed_internals.html5
-rw-r--r--chromium/chrome/browser/resources/feed_internals/feed_internals.js38
-rw-r--r--chromium/chrome/browser/resources/feedback/js/feedback.js7
-rw-r--r--chromium/chrome/browser/resources/gaia_auth_host/authenticator.js29
-rw-r--r--chromium/chrome/browser/resources/gaia_auth_host/password_change_authenticator_test.unitjs5
-rw-r--r--chromium/chrome/browser/resources/gaia_auth_host/saml_handler.js67
-rw-r--r--chromium/chrome/browser/resources/gaia_auth_host/saml_password_attributes_test.unitjs1
-rw-r--r--chromium/chrome/browser/resources/gaia_auth_host/saml_timestamps_test.unitjs5
-rw-r--r--chromium/chrome/browser/resources/history/BUILD.gn88
-rw-r--r--chromium/chrome/browser/resources/history/history_list.html8
-rw-r--r--chromium/chrome/browser/resources/history/history_resources.grd30
-rw-r--r--chromium/chrome/browser/resources/history/shared_style.html8
-rw-r--r--chromium/chrome/browser/resources/history/shared_vars.html7
-rw-r--r--chromium/chrome/browser/resources/history/synced_device_card.html2
-rw-r--r--chromium/chrome/browser/resources/history/synced_device_manager.html10
-rw-r--r--chromium/chrome/browser/resources/identity_scope_approval_dialog/background.js6
-rw-r--r--chromium/chrome/browser/resources/identity_scope_approval_dialog/scope_approval_dialog.js8
-rw-r--r--chromium/chrome/browser/resources/inline_login/OWNERS2
-rw-r--r--chromium/chrome/browser/resources/inline_login/inline_login.css4
-rw-r--r--chromium/chrome/browser/resources/inspect/inspect.css4
-rw-r--r--chromium/chrome/browser/resources/inspect/inspect.html2
-rw-r--r--chromium/chrome/browser/resources/interventions_internals/index.js6
-rw-r--r--chromium/chrome/browser/resources/local_ntp/chevron.svg1
-rw-r--r--chromium/chrome/browser/resources/local_ntp/doodles.css85
-rw-r--r--chromium/chrome/browser/resources/local_ntp/doodles.js16
-rw-r--r--chromium/chrome/browser/resources/local_ntp/externs.js12
-rw-r--r--chromium/chrome/browser/resources/local_ntp/local_ntp.css59
-rw-r--r--chromium/chrome/browser/resources/local_ntp/local_ntp.html8
-rw-r--r--chromium/chrome/browser/resources/local_ntp/local_ntp.js254
-rw-r--r--chromium/chrome/browser/resources/local_ntp/utils.js20
-rw-r--r--chromium/chrome/browser/resources/management/BUILD.gn22
-rw-r--r--chromium/chrome/browser/resources/management/icons.html1
-rw-r--r--chromium/chrome/browser/resources/management/management_browser_proxy.js3
-rw-r--r--chromium/chrome/browser/resources/management/management_ui.html7
-rw-r--r--chromium/chrome/browser/resources/management/management_ui.js2
-rw-r--r--chromium/chrome/browser/resources/media/media_engagement.js4
-rw-r--r--chromium/chrome/browser/resources/media/media_feeds.html36
-rw-r--r--chromium/chrome/browser/resources/media/media_feeds.js292
-rw-r--r--chromium/chrome/browser/resources/memory_internals/BUILD.gn17
-rw-r--r--chromium/chrome/browser/resources/memory_internals/memory_internals.html72
-rw-r--r--chromium/chrome/browser/resources/memory_internals/memory_internals.js48
-rw-r--r--chromium/chrome/browser/resources/net_internals/browser_bridge.js10
-rw-r--r--chromium/chrome/browser/resources/net_internals/chromeos_view.css4
-rw-r--r--chromium/chrome/browser/resources/net_internals/chromeos_view.html40
-rw-r--r--chromium/chrome/browser/resources/net_internals/chromeos_view.js19
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/BUILD.gn207
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/app.html267
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/app.js516
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/background_manager.js141
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/browser_proxy.js34
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/customize_backgrounds.html180
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/customize_backgrounds.js159
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/customize_dialog.html130
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/customize_dialog.js133
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/customize_shortcuts.html28
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/customize_shortcuts.js16
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/customize_themes.html20
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/customize_themes.js38
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/doodle_share_dialog.html81
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/doodle_share_dialog.js92
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/fakebox.html9
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/fakebox.js9
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/icons/chevron.svg1
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/icons/colored_header.svg1
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/icons/copy.svg1
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/icons/facebook.svg1
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/icons/header.svg1
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/icons/mail.svg1
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/icons/twitter.svg1
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/icons/upload.svg1
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/logo.html119
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/logo.js225
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/mini_page.html45
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/most_visited.html102
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/most_visited.js127
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/new_tab_page.html29
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/new_tab_page.js19
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/new_tab_page_resources.grd111
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/new_tab_page_resources_common.grdp70
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/new_tab_page_resources_vulcanized.grd22
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/realbox.html137
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/realbox.js730
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/realbox_button.html54
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/realbox_button.js38
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/realbox_dropdown.html89
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/realbox_dropdown.js438
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/realbox_icon.html58
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/realbox_icon.js190
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/realbox_match.html87
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/realbox_match.js352
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/shared_vars.css5
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/theme_icon.html4
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/untrusted/background_image.html50
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/untrusted/background_image.js36
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/untrusted/image.html12
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/untrusted/one_google_bar.html3
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/untrusted/one_google_bar.js136
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/untrusted/promo.html13
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/untrusted/promo.js5
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/utils.js74
-rw-r--r--chromium/chrome/browser/resources/new_tab_page/voice_search_overlay.html2
-rw-r--r--chromium/chrome/browser/resources/pdf/BUILD.gn17
-rw-r--r--chromium/chrome/browser/resources/pdf/bookmark_type.js27
-rw-r--r--chromium/chrome/browser/resources/pdf/elements/BUILD.gn121
-rw-r--r--chromium/chrome/browser/resources/pdf/elements/viewer-bookmark.html4
-rw-r--r--chromium/chrome/browser/resources/pdf/elements/viewer-bookmark.js24
-rw-r--r--chromium/chrome/browser/resources/pdf/elements/viewer-page-selector.html40
-rw-r--r--chromium/chrome/browser/resources/pdf/elements/viewer-pdf-toolbar.js3
-rw-r--r--chromium/chrome/browser/resources/pdf/elements/viewer-zoom-toolbar.js1
-rw-r--r--chromium/chrome/browser/resources/pdf/index.html2
-rw-r--r--chromium/chrome/browser/resources/pdf/index_pp.html22
-rw-r--r--chromium/chrome/browser/resources/pdf/main.js81
-rw-r--r--chromium/chrome/browser/resources/pdf/main_pp.js12
-rw-r--r--chromium/chrome/browser/resources/pdf/main_util.js83
-rw-r--r--chromium/chrome/browser/resources/pdf/pdf_viewer.js33
-rw-r--r--chromium/chrome/browser/resources/plugin_metadata/plugins_linux.json6
-rw-r--r--chromium/chrome/browser/resources/plugin_metadata/plugins_mac.json6
-rw-r--r--chromium/chrome/browser/resources/plugin_metadata/plugins_win.json6
-rw-r--r--chromium/chrome/browser/resources/print_preview/BUILD.gn27
-rw-r--r--chromium/chrome/browser/resources/print_preview/cloud_print_interface.js16
-rw-r--r--chromium/chrome/browser/resources/print_preview/cloud_print_interface_impl.js (renamed from chromium/chrome/browser/resources/print_preview/cloud_print_interface_js.js)41
-rw-r--r--chromium/chrome/browser/resources/print_preview/cloud_print_interface_manager.js43
-rw-r--r--chromium/chrome/browser/resources/print_preview/cloud_print_interface_native.js37
-rw-r--r--chromium/chrome/browser/resources/print_preview/data/destination.js4
-rw-r--r--chromium/chrome/browser/resources/print_preview/data/destination_store.js14
-rw-r--r--chromium/chrome/browser/resources/print_preview/data/model.js79
-rw-r--r--chromium/chrome/browser/resources/print_preview/data/user_manager.js34
-rw-r--r--chromium/chrome/browser/resources/print_preview/native_layer.js14
-rw-r--r--chromium/chrome/browser/resources/print_preview/print_preview.js2
-rw-r--r--chromium/chrome/browser/resources/print_preview/print_preview_resources.grd167
-rw-r--r--chromium/chrome/browser/resources/print_preview/print_preview_resources_vulcanized.grd10
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/BUILD.gn371
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/app.html5
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/app.js16
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/button_strip.html41
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/button_strip.js82
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/destination_select.html85
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/destination_select.js60
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/destination_select_cros.html57
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/destination_select_cros.js176
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/destination_select_css.html41
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/destination_select_css.js14
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/destination_settings.html96
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/destination_settings.js70
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/dpi_settings.html2
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/media_size_settings.html2
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/settings_select.html2
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/settings_select.js2
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/sidebar.html5
-rw-r--r--chromium/chrome/browser/resources/print_preview/ui/sidebar.js6
-rw-r--r--chromium/chrome/browser/resources/quota_internals/event_handler.js19
-rw-r--r--chromium/chrome/browser/resources/quota_internals/main.html8
-rw-r--r--chromium/chrome/browser/resources/settings/BUILD.gn264
-rw-r--r--chromium/chrome/browser/resources/settings/a11y_page/BUILD.gn56
-rw-r--r--chromium/chrome/browser/resources/settings/about_page/BUILD.gn44
-rw-r--r--chromium/chrome/browser/resources/settings/appearance_page/BUILD.gn157
-rw-r--r--chromium/chrome/browser/resources/settings/autofill_page/BUILD.gn596
-rw-r--r--chromium/chrome/browser/resources/settings/basic_page/BUILD.gn51
-rw-r--r--chromium/chrome/browser/resources/settings/chrome_cleanup_page/BUILD.gn94
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/BUILD.gn228
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/ambient_mode_page/BUILD.gn47
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/bluetooth_page/BUILD.gn62
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/crostini_page/BUILD.gn244
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/date_time_page/BUILD.gn78
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn266
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/google_assistant_page/BUILD.gn46
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn192
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/localized_link/BUILD.gn28
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn172
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn94
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_about_page/BUILD.gn78
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_apps_page/BUILD.gn62
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/BUILD.gn6
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/BUILD.gn94
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_files_page/BUILD.gn46
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn78
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn272
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_printing_page/BUILD.gn343
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_privacy_page/BUILD.gn28
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_reset_page/BUILD.gn62
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_search_page/BUILD.gn28
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_settings_main/BUILD.gn31
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_settings_menu/BUILD.gn28
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_settings_page/BUILD.gn28
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_settings_resources_v3.grdp13
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_settings_search_box/BUILD.gn53
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_settings_ui/BUILD.gn31
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/os_toolbar/BUILD.gn28
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/parental_controls_page/BUILD.gn46
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/personalization_page/BUILD.gn74
-rw-r--r--chromium/chrome/browser/resources/settings/chromeos/plugin_vm_page/BUILD.gn49
-rw-r--r--chromium/chrome/browser/resources/settings/clear_browsing_data_dialog/BUILD.gn110
-rw-r--r--chromium/chrome/browser/resources/settings/controls/BUILD.gn38
-rw-r--r--chromium/chrome/browser/resources/settings/default_browser_page/BUILD.gn53
-rw-r--r--chromium/chrome/browser/resources/settings/downloads_page/BUILD.gn58
-rw-r--r--chromium/chrome/browser/resources/settings/incompatible_applications_page/BUILD.gn88
-rw-r--r--chromium/chrome/browser/resources/settings/languages_page/BUILD.gn128
-rw-r--r--chromium/chrome/browser/resources/settings/on_startup_page/BUILD.gn164
-rw-r--r--chromium/chrome/browser/resources/settings/os_settings_resources.grd928
-rw-r--r--chromium/chrome/browser/resources/settings/os_settings_resources_vulcanized.grd10
-rw-r--r--chromium/chrome/browser/resources/settings/people_page/BUILD.gn193
-rw-r--r--chromium/chrome/browser/resources/settings/printing_page/BUILD.gn83
-rw-r--r--chromium/chrome/browser/resources/settings/privacy_page/BUILD.gn557
-rw-r--r--chromium/chrome/browser/resources/settings/reset_page/BUILD.gn134
-rw-r--r--chromium/chrome/browser/resources/settings/safety_check_page/BUILD.gn136
-rw-r--r--chromium/chrome/browser/resources/settings/search_engines_page/BUILD.gn175
-rw-r--r--chromium/chrome/browser/resources/settings/search_page/BUILD.gn41
-rw-r--r--chromium/chrome/browser/resources/settings/settings.gni18
-rw-r--r--chromium/chrome/browser/resources/settings/settings_main/BUILD.gn50
-rw-r--r--chromium/chrome/browser/resources/settings/settings_menu/BUILD.gn37
-rw-r--r--chromium/chrome/browser/resources/settings/settings_page/BUILD.gn1
-rw-r--r--chromium/chrome/browser/resources/settings/settings_resources.grd1214
-rw-r--r--chromium/chrome/browser/resources/settings/settings_resources_v3.grdp990
-rw-r--r--chromium/chrome/browser/resources/settings/settings_resources_vulcanized.grd24
-rw-r--r--chromium/chrome/browser/resources/settings/settings_ui/BUILD.gn59
-rw-r--r--chromium/chrome/browser/resources/settings/site_settings/BUILD.gn801
-rw-r--r--chromium/chrome/browser/resources/settings/site_settings_page/BUILD.gn134
-rw-r--r--chromium/chrome/browser/resources/settings/system_page/BUILD.gn60
-rw-r--r--chromium/chrome/browser/resources/signin/BUILD.gn19
-rw-r--r--chromium/chrome/browser/resources/signin/profile_picker/OWNERS3
-rw-r--r--chromium/chrome/browser/resources/signin/profile_picker/profile_picker.html8
-rw-r--r--chromium/chrome/browser/resources/signin/profile_picker/profile_picker_resources.grd22
-rw-r--r--chromium/chrome/browser/resources/signin/signin_email_confirmation/BUILD.gn12
-rw-r--r--chromium/chrome/browser/resources/signin/signin_error/BUILD.gn13
-rw-r--r--chromium/chrome/browser/resources/signin/signin_error/signin_error.html7
-rw-r--r--chromium/chrome/browser/resources/signin/signin_error/signin_error.js6
-rw-r--r--chromium/chrome/browser/resources/signin/signin_error/signin_error_app.html15
-rw-r--r--chromium/chrome/browser/resources/signin/signin_error/signin_error_app.js13
-rw-r--r--chromium/chrome/browser/resources/signin/signin_shared_old_css.html45
-rw-r--r--chromium/chrome/browser/resources/signin/sync_confirmation/BUILD.gn22
-rw-r--r--chromium/chrome/browser/resources/tab_strip/BUILD.gn46
-rw-r--r--chromium/chrome/browser/resources/tab_strip/alert_indicator.html22
-rw-r--r--chromium/chrome/browser/resources/tab_strip/alert_indicators.js2
-rw-r--r--chromium/chrome/browser/resources/tab_strip/tab_swiper.js2
-rw-r--r--chromium/chrome/browser/resources/tab_strip/tabs_api_proxy.js24
-rw-r--r--chromium/chrome/browser/resources/tools/rollup_plugin.js9
-rw-r--r--chromium/chrome/browser/resources/usb_internals/devices_page.js2
-rw-r--r--chromium/chrome/browser/resources/usb_internals/usb_internals.js2
-rw-r--r--chromium/chrome/browser/resources/welcome/BUILD.gn40
-rw-r--r--chromium/chrome/browser/resources/welcome/google_apps/BUILD.gn8
-rw-r--r--chromium/chrome/browser/resources/welcome/ntp_background/BUILD.gn8
-rw-r--r--chromium/chrome/browser/resources/welcome/set_as_default/BUILD.gn8
-rw-r--r--chromium/chrome/browser/resources/welcome/shared/BUILD.gn62
-rw-r--r--chromium/chrome/browser/safe_browsing/BUILD.gn13
-rw-r--r--chromium/chrome/browser/safe_browsing/chrome_cleaner/BUILD.gn3
-rw-r--r--chromium/chrome/browser/settings/BUILD.gn19
-rw-r--r--chromium/chrome/browser/share/BUILD.gn10
-rw-r--r--chromium/chrome/browser/share/android/BUILD.gn13
-rw-r--r--chromium/chrome/browser/share/android/java_sources.gni1
-rw-r--r--chromium/chrome/browser/share/android/test_java_sources.gni5
-rw-r--r--chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_mac_browsertest.cc1
-rw-r--r--chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_win_browsertest.cc1
-rw-r--r--chromium/chrome/browser/spellchecker/spellcheck_custom_dictionary.cc34
-rw-r--r--chromium/chrome/browser/spellchecker/spellcheck_custom_dictionary.h9
-rw-r--r--chromium/chrome/browser/spellchecker/spellcheck_custom_dictionary_unittest.cc41
-rw-r--r--chromium/chrome/browser/spellchecker/spellcheck_hunspell_dictionary.cc3
-rw-r--r--chromium/chrome/browser/spellchecker/spellcheck_language_blacklist_policy_handler.cc9
-rw-r--r--chromium/chrome/browser/spellchecker/spellcheck_language_policy_handler.cc9
-rw-r--r--chromium/chrome/browser/spellchecker/spellcheck_language_policy_handlers_unittest.cc207
-rw-r--r--chromium/chrome/browser/spellchecker/spellcheck_mac_view_interactive_uitest.mm1
-rw-r--r--chromium/chrome/browser/spellchecker/spellcheck_service.cc109
-rw-r--r--chromium/chrome/browser/spellchecker/spellcheck_service.h12
-rw-r--r--chromium/chrome/browser/spellchecker/spellcheck_service_browsertest.cc1
-rw-r--r--chromium/chrome/browser/subresource_filter/BUILD.gn2
-rw-r--r--chromium/chrome/browser/supervised_user/BUILD.gn13
-rw-r--r--chromium/chrome/browser/supervised_user/supervised_user_unscaled_resources.grd2
-rw-r--r--chromium/chrome/browser/tab/BUILD.gn33
-rw-r--r--chromium/chrome/browser/tab_contents/navigation_metrics_recorder.cc24
-rw-r--r--chromium/chrome/browser/tab_contents/navigation_metrics_recorder.h3
-rw-r--r--chromium/chrome/browser/tab_contents/navigation_metrics_recorder_browsertest.cc133
-rw-r--r--chromium/chrome/browser/tab_contents/view_source_browsertest.cc1
-rw-r--r--chromium/chrome/browser/test_dummy/BUILD.gn11
-rw-r--r--chromium/chrome/browser/test_dummy/internal/BUILD.gn71
-rw-r--r--chromium/chrome/browser/test_dummy/internal/android/resources/resources.grd20
-rw-r--r--chromium/chrome/browser/thumbnail/generator/BUILD.gn15
-rw-r--r--chromium/chrome/browser/touch_to_fill/android/BUILD.gn2
-rw-r--r--chromium/chrome/browser/touch_to_fill/android/internal/java/strings/android_touch_to_fill_strings.grd1
-rw-r--r--chromium/chrome/browser/ui/BUILD.gn295
-rw-r--r--chromium/chrome/browser/ui/android/appmenu/BUILD.gn16
-rw-r--r--chromium/chrome/browser/ui/android/appmenu/internal/BUILD.gn9
-rw-r--r--chromium/chrome/browser/ui/android/appmenu/test/BUILD.gn19
-rw-r--r--chromium/chrome/browser/ui/android/favicon/BUILD.gn16
-rw-r--r--chromium/chrome/browser/ui/android/strings/android_chrome_strings.grd704
-rw-r--r--chromium/chrome/browser/ui/messages/android/BUILD.gn25
-rw-r--r--chromium/chrome/browser/ui/webui/about_ui.cc29
-rw-r--r--chromium/chrome/browser/ui/webui/about_ui_unittest.cc16
-rw-r--r--chromium/chrome/browser/ui/webui/app_launcher_page_ui.cc15
-rw-r--r--chromium/chrome/browser/ui/webui/app_management/app_management.mojom5
-rw-r--r--chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/OWNERS1
-rw-r--r--chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui_browsertest.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.cc8
-rw-r--r--chromium/chrome/browser/ui/webui/cast/OWNERS1
-rw-r--r--chromium/chrome/browser/ui/webui/cast/cast_ui.cc40
-rw-r--r--chromium/chrome/browser/ui/webui/cast/cast_ui.h21
-rw-r--r--chromium/chrome/browser/ui/webui/certificate_manager_localized_strings_provider.cc154
-rw-r--r--chromium/chrome/browser/ui/webui/certificate_provisioning_ui_handler.cc247
-rw-r--r--chromium/chrome/browser/ui/webui/certificate_provisioning_ui_handler.h69
-rw-r--r--chromium/chrome/browser/ui/webui/certificate_viewer_webui.cc28
-rw-r--r--chromium/chrome/browser/ui/webui/certificate_viewer_webui.h16
-rw-r--r--chromium/chrome/browser/ui/webui/certificates_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/certificates_handler_unittest.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/chrome_url_data_manager_browsertest.cc259
-rw-r--r--chromium/chrome/browser/ui/webui/chrome_url_disabled_ui.cc6
-rw-r--r--chromium/chrome/browser/ui/webui/chrome_url_disabled_ui.h3
-rw-r--r--chromium/chrome/browser/ui/webui/chrome_web_contents_handler.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/chrome_web_contents_handler.h1
-rw-r--r--chromium/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc104
-rw-r--r--chromium/chrome/browser/ui/webui/chrome_webui_navigation_browsertest.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/account_manager_welcome_dialog.cc11
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/account_migration_welcome_dialog.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/account_migration_welcome_test.js2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/account_migration_welcome_ui.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder.h1
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder_browsertest.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui_browsertest.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.cc17
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog_browsertest-inl.h1
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/camera/camera_ui.cc53
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/cellular_setup/mobile_setup_ui.cc12
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/certificate_manager_dialog_browsertest.js2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/certificate_manager_dialog_ui.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer.mojom6
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_page_handler.cc40
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc37
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_dialog.cc15
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_dialog.h5
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_dialog_browsertest.cc141
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_page_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc3
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc28
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.cc38
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.h1
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_unittest.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/emulator/device_emulator_message_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/first_run/first_run_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/confirm_password_change_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/urgent_password_expiry_notification_handler.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc32
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.h4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc67
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.h20
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/base_webui_handler.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/debug/DEPS5
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/debug/debug_overlay_handler.cc125
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/debug/debug_overlay_handler.h38
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/discover/discover_browser_test.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/discover/discover_manager.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/discover/discover_ui.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/discover/modules/discover_module_launch_help_app_test.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/discover/modules/discover_module_redeem_offers_test.cc10
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/discover/modules/discover_module_set_wallpaper_test.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/discover/modules/discover_module_sync_files_test.cc10
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/discover/wait_for_did_start_navigate.cc32
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/discover/wait_for_did_start_navigate.h38
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/enable_debugging_screen_handler.cc16
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc11
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.cc9
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.h5
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc59
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h11
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/l10n_util.cc3
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/network_state_informer.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser_browsertest.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser_unittest.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc60
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc36
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.h8
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/saml_challenge_key_handler.cc7
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc29
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h6
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc62
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.h8
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.h4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/machine_learning/machine_learning_internals_page_handler.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_localized_strings_provider.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/network_ui.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/smb_shares/smb_credentials_dialog_browsertest.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/sync/os_sync_handler.cc11
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/sync/os_sync_handler.h1
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/sync/os_sync_handler_unittest.cc10
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/system_web_dialog_browsertest.cc28
-rw-r--r--chromium/chrome/browser/ui/webui/components/components_handler.cc7
-rw-r--r--chromium/chrome/browser/ui/webui/constrained_web_dialog_delegate_base.cc135
-rw-r--r--chromium/chrome/browser/ui/webui/constrained_web_dialog_delegate_base.h81
-rw-r--r--chromium/chrome/browser/ui/webui/constrained_web_dialog_ui_browsertest.cc25
-rw-r--r--chromium/chrome/browser/ui/webui/cookies_tree_model_util.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/devtools_ui_data_source_unittest.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/discards/discards.mojom28
-rw-r--r--chromium/chrome/browser/ui/webui/discards/discards_ui.cc3
-rw-r--r--chromium/chrome/browser/ui/webui/discards/graph_dump_impl.cc141
-rw-r--r--chromium/chrome/browser/ui/webui/discards/graph_dump_impl.h22
-rw-r--r--chromium/chrome/browser/ui/webui/discards/graph_dump_impl_unittest.cc104
-rw-r--r--chromium/chrome/browser/ui/webui/downloads/downloads_list_tracker.cc7
-rw-r--r--chromium/chrome/browser/ui/webui/extensions/chromeos/kiosk_apps_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/extensions/extension_icon_source.cc21
-rw-r--r--chromium/chrome/browser/ui/webui/extensions/extension_icon_source.h4
-rw-r--r--chromium/chrome/browser/ui/webui/extensions/extension_settings_browsertest.cc10
-rw-r--r--chromium/chrome/browser/ui/webui/extensions/extensions_internals_browsertest.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/extensions/extensions_ui.cc3
-rw-r--r--chromium/chrome/browser/ui/webui/favicon_source.cc14
-rw-r--r--chromium/chrome/browser/ui/webui/favicon_source.h2
-rw-r--r--chromium/chrome/browser/ui/webui/favicon_source_unittest.cc39
-rw-r--r--chromium/chrome/browser/ui/webui/feed_internals/BUILD.gn5
-rw-r--r--chromium/chrome/browser/ui/webui/feed_internals/feed_internals.mojom30
-rw-r--r--chromium/chrome/browser/ui/webui/feed_internals/feed_internals_page_handler.cc19
-rw-r--r--chromium/chrome/browser/ui/webui/feed_internals/feed_internals_page_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/feed_internals/feed_internals_ui.cc19
-rw-r--r--chromium/chrome/browser/ui/webui/feed_internals/feed_internals_ui.h2
-rw-r--r--chromium/chrome/browser/ui/webui/feed_internals/feedv2_internals_page_handler.cc138
-rw-r--r--chromium/chrome/browser/ui/webui/feed_internals/feedv2_internals_page_handler.h61
-rw-r--r--chromium/chrome/browser/ui/webui/flags_ui.cc6
-rw-r--r--chromium/chrome/browser/ui/webui/gcm_internals_ui.cc5
-rw-r--r--chromium/chrome/browser/ui/webui/help/version_updater_chromeos.cc8
-rw-r--r--chromium/chrome/browser/ui/webui/history/browsing_history_handler.cc3
-rw-r--r--chromium/chrome/browser/ui/webui/history/foreign_session_handler.cc12
-rw-r--r--chromium/chrome/browser/ui/webui/history/foreign_session_handler.h4
-rw-r--r--chromium/chrome/browser/ui/webui/history/navigation_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/identity_internals_ui_browsertest.js1
-rw-r--r--chromium/chrome/browser/ui/webui/inspect_ui_browsertest.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/interstitials/interstitial_ui.cc7
-rw-r--r--chromium/chrome/browser/ui/webui/interstitials/interstitial_ui_browsertest.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler.cc23
-rw-r--r--chromium/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler_unittest.cc75
-rw-r--r--chromium/chrome/browser/ui/webui/local_discovery/local_discovery_ui_browsertest.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/local_discovery/local_discovery_ui_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/log_web_ui_url_browsertest.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/management_ui.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/management_ui_browsertest.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/management_ui_handler.cc211
-rw-r--r--chromium/chrome/browser/ui/webui/management_ui_handler.h10
-rw-r--r--chromium/chrome/browser/ui/webui/management_ui_handler_unittest.cc610
-rw-r--r--chromium/chrome/browser/ui/webui/media/media_feeds_ui.cc56
-rw-r--r--chromium/chrome/browser/ui/webui/media/media_feeds_ui.h12
-rw-r--r--chromium/chrome/browser/ui/webui/memory_internals_ui.cc47
-rw-r--r--chromium/chrome/browser/ui/webui/metrics_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/nacl_ui.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/net_export_ui.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/net_internals/net_internals_ui.cc118
-rw-r--r--chromium/chrome/browser/ui/webui/net_internals/net_internals_ui_browsertest.cc8
-rw-r--r--chromium/chrome/browser/ui/webui/new_tab_page/BUILD.gn1
-rw-r--r--chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom258
-rw-r--r--chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc959
-rw-r--r--chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.h124
-rw-r--r--chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc136
-rw-r--r--chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.h12
-rw-r--r--chromium/chrome/browser/ui/webui/new_tab_page/untrusted_source.cc185
-rw-r--r--chromium/chrome/browser/ui/webui/new_tab_page/untrusted_source.h35
-rw-r--r--chromium/chrome/browser/ui/webui/ntp/OWNERS2
-rw-r--r--chromium/chrome/browser/ui/webui/ntp/app_launcher_handler.cc622
-rw-r--r--chromium/chrome/browser/ui/webui/ntp/app_launcher_handler.h66
-rw-r--r--chromium/chrome/browser/ui/webui/ntp/cookie_controls_handler.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/ntp/cookie_controls_handler.h1
-rw-r--r--chromium/chrome/browser/ui/webui/ntp/new_tab_ui_browsertest.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc7
-rw-r--r--chromium/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.cc15
-rw-r--r--chromium/chrome/browser/ui/webui/omnibox/omnibox_ui.cc29
-rw-r--r--chromium/chrome/browser/ui/webui/policy_ui.cc95
-rw-r--r--chromium/chrome/browser/ui/webui/policy_ui_browsertest.cc3
-rw-r--r--chromium/chrome/browser/ui/webui/policy_ui_handler.cc81
-rw-r--r--chromium/chrome/browser/ui/webui/policy_ui_handler.h1
-rw-r--r--chromium/chrome/browser/ui/webui/prefs_internals_browsertest.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/cloud_print_signin.cc (renamed from chromium/chrome/browser/printing/print_dialog_cloud.cc)39
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/cloud_print_signin.h22
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/cloud_printer_handler.cc43
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/cloud_printer_handler.h40
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/fake_print_render_frame.cc3
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/fake_print_render_frame.h2
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc21
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.h7
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc61
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default.h6
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler_unittest.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/policy_settings.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.cc505
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.h38
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc289
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/print_preview_metrics.cc192
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/print_preview_metrics.h98
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.cc120
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.h22
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/print_preview_ui_browsertest.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/printer_handler.cc12
-rw-r--r--chromium/chrome/browser/ui/webui/print_preview/printer_handler.h12
-rw-r--r--chromium/chrome/browser/ui/webui/profile_helper_browsertest.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/quota_internals/quota_internals_proxy.cc35
-rw-r--r--chromium/chrome/browser/ui/webui/quota_internals/quota_internals_types.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/sandbox/sandbox_handler.cc12
-rw-r--r--chromium/chrome/browser/ui/webui/settings/OWNERS5
-rw-r--r--chromium/chrome/browser/ui/webui/settings/about_handler.cc106
-rw-r--r--chromium/chrome/browser/ui/webui/settings/about_handler.h11
-rw-r--r--chromium/chrome/browser/ui/webui/settings/accessibility_main_handler.cc38
-rw-r--r--chromium/chrome/browser/ui/webui/settings/accessibility_main_handler.h14
-rw-r--r--chromium/chrome/browser/ui/webui/settings/appearance_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/BUILD.gn11
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/about_section.cc274
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/about_section.h34
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_handler.cc45
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_handler.h23
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_handler_unittest.cc36
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc544
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_section.h44
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc18
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.h4
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler_browsertest.cc33
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.cc70
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.h32
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/app_management/app_management_uma.h9
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/apps_section.cc299
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/apps_section.h54
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/bluetooth_section.cc203
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/bluetooth_section.h52
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/calculator/size_calculator.cc48
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/constants/BUILD.gn14
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/constants/OWNERS2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/constants/constants_util.cc56
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/constants/constants_util.h25
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom231
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/constants/routes_util.cc150
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/constants/routes_util.h22
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/constants/setting.mojom188
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/crostini_handler.cc214
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/crostini_handler.h31
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/crostini_section.cc509
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/crostini_section.h47
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc55
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h5
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler_unittest.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/date_time_handler.cc17
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/date_time_handler.h10
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/date_time_section.cc137
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/date_time_section.h34
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/device_display_handler.cc51
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/device_display_handler.h42
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/device_dlc_handler.cc96
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/device_dlc_handler.h51
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/device_dlc_handler_unittest.cc172
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler_unittest.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/device_power_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/device_power_handler_browsertest.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/device_section.cc986
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/device_section.h90
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.cc13
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/files_section.cc106
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/files_section.h34
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.cc24
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.cc19
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.h12
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/internet_section.cc678
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/internet_section.h (renamed from chromium/chrome/browser/ui/webui/settings/chromeos/internet_strings_provider.h)31
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/internet_strings_provider.cc252
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/languages_section.cc165
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/languages_section.h36
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/main_section.cc186
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/main_section.h36
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/multidevice_section.cc247
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/multidevice_section.h60
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.cc57
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.h31
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.cc2136
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.h91
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider_factory.cc66
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider_factory.h47
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider_unittest.cc104
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager.cc72
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager.h121
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager_factory.cc79
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager_factory.h43
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager_unittest.cc53
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_per_page_strings_provider.h73
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_section.cc (renamed from chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_per_page_strings_provider.cc)17
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_section.h70
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_sections.cc141
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_sections.h73
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc426
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.h11
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.cc30
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.h3
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/people_section.cc859
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/people_section.h78
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/personalization_section.cc211
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/personalization_section.h47
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/plugin_vm_handler.cc33
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/plugin_vm_handler.h4
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/printing_section.cc250
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/printing_section.h41
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/privacy_section.cc100
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/privacy_section.h34
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/reset_section.cc98
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/reset_section.h36
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/search/BUILD.gn5
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/search/search.mojom52
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/search/search_concept.h27
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler.cc56
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler.h23
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler_factory.cc61
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler_factory.h45
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler_unittest.cc107
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/search/search_result_icon.mojom37
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.cc93
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h50
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry_unittest.cc96
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/search_section.cc311
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/search_section.h47
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.h10
-rw-r--r--chromium/chrome/browser/ui/webui/settings/custom_home_pages_table_model.cc8
-rw-r--r--chromium/chrome/browser/ui/webui/settings/downloads_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/settings/extension_control_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/font_handler.cc11
-rw-r--r--chromium/chrome/browser/ui/webui/settings/font_handler.h14
-rw-r--r--chromium/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/languages_handler.cc13
-rw-r--r--chromium/chrome/browser/ui/webui/settings/languages_handler.h20
-rw-r--r--chromium/chrome/browser/ui/webui/settings/on_startup_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/people_handler.cc19
-rw-r--r--chromium/chrome/browser/ui/webui/settings/people_handler_unittest.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/settings/recent_site_settings_helper.cc (renamed from chromium/chrome/browser/ui/webui/recent_site_settings_helper.cc)8
-rw-r--r--chromium/chrome/browser/ui/webui/settings/recent_site_settings_helper.h (renamed from chromium/chrome/browser/ui/webui/recent_site_settings_helper.h)8
-rw-r--r--chromium/chrome/browser/ui/webui/settings/recent_site_settings_helper_unittest.cc (renamed from chromium/chrome/browser/ui/webui/recent_site_settings_helper_unittest.cc)2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/reset_settings_handler.cc48
-rw-r--r--chromium/chrome/browser/ui/webui/settings/reset_settings_handler.h12
-rw-r--r--chromium/chrome/browser/ui/webui/settings/safe_browsing_handler.h2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/safety_check_handler.cc300
-rw-r--r--chromium/chrome/browser/ui/webui/settings/safety_check_handler.h100
-rw-r--r--chromium/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc190
-rw-r--r--chromium/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc156
-rw-r--r--chromium/chrome/browser/ui/webui/settings/settings_localized_strings_provider.h8
-rw-r--r--chromium/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc147
-rw-r--r--chromium/chrome/browser/ui/webui/settings/settings_secure_dns_handler.h28
-rw-r--r--chromium/chrome/browser/ui/webui/settings/settings_secure_dns_handler_browsertest.cc140
-rw-r--r--chromium/chrome/browser/ui/webui/settings/settings_security_key_handler.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/settings_ui.cc114
-rw-r--r--chromium/chrome/browser/ui/webui/settings/settings_ui_browsertest.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/settings/site_settings_handler.cc56
-rw-r--r--chromium/chrome/browser/ui/webui/settings/site_settings_handler.h3
-rw-r--r--chromium/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc179
-rw-r--r--chromium/chrome/browser/ui/webui/settings/site_settings_helper.cc (renamed from chromium/chrome/browser/ui/webui/site_settings_helper.cc)76
-rw-r--r--chromium/chrome/browser/ui/webui/settings/site_settings_helper.h (renamed from chromium/chrome/browser/ui/webui/site_settings_helper.h)15
-rw-r--r--chromium/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc (renamed from chromium/chrome/browser/ui/webui/site_settings_helper_unittest.cc)207
-rw-r--r--chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc66
-rw-r--r--chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h4
-rw-r--r--chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_delegate_impl.cc3
-rw-r--r--chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc46
-rw-r--r--chromium/chrome/browser/ui/webui/signin/inline_login_handler.cc10
-rw-r--r--chromium/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc6
-rw-r--r--chromium/chrome/browser/ui/webui/signin/inline_login_handler_dialog_chromeos.cc45
-rw-r--r--chromium/chrome/browser/ui/webui/signin/inline_login_handler_dialog_chromeos.h60
-rw-r--r--chromium/chrome/browser/ui/webui/signin/inline_login_handler_modal_delegate.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/signin/inline_login_ui.cc81
-rw-r--r--chromium/chrome/browser/ui/webui/signin/login_ui_service_unittest.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/signin/login_ui_test_utils.cc6
-rw-r--r--chromium/chrome/browser/ui/webui/signin/profile_picker_ui.cc30
-rw-r--r--chromium/chrome/browser/ui/webui/signin/profile_picker_ui.h20
-rw-r--r--chromium/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.cc17
-rw-r--r--chromium/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.h7
-rw-r--r--chromium/chrome/browser/ui/webui/signin/signin_error_ui.cc5
-rw-r--r--chromium/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/signin/user_manager_ui.cc40
-rw-r--r--chromium/chrome/browser/ui/webui/signin/user_manager_ui_browsertest.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/snippets_internals/snippets_internals_page_handler.cc7
-rw-r--r--chromium/chrome/browser/ui/webui/supervised_user_internals_message_handler.cc5
-rw-r--r--chromium/chrome/browser/ui/webui/sync_internals_browsertest.js1
-rw-r--r--chromium/chrome/browser/ui/webui/sync_internals_message_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/sync_internals_ui.cc51
-rw-r--r--chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.cc31
-rw-r--r--chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.cc109
-rw-r--r--chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.h19
-rw-r--r--chromium/chrome/browser/ui/webui/tab_strip/thumbnail_tracker_unittest.cc2
-rw-r--r--chromium/chrome/browser/ui/webui/test_data_source.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/test_data_source.h2
-rw-r--r--chromium/chrome/browser/ui/webui/theme_source.cc44
-rw-r--r--chromium/chrome/browser/ui/webui/theme_source.h8
-rw-r--r--chromium/chrome/browser/ui/webui/version_handler.cc4
-rw-r--r--chromium/chrome/browser/ui/webui/web_dialog_web_contents_delegate_unittest.cc16
-rw-r--r--chromium/chrome/browser/ui/webui/web_footer_experiment_ui.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/webui_allowlist_provider_unittest.cc226
-rw-r--r--chromium/chrome/browser/ui/webui/webui_load_timer_browsertest.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/webui_util.cc10
-rw-r--r--chromium/chrome/browser/ui/webui/webui_util.h10
-rw-r--r--chromium/chrome/browser/ui/webui/webui_webview_browsertest.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/welcome/helpers.cc1
-rw-r--r--chromium/chrome/browser/ui/webui/welcome/welcome_ui.cc1
-rw-r--r--chromium/chrome/browser/upboarding/BUILD.gn23
-rw-r--r--chromium/chrome/browser/upboarding/query_tiles/BUILD.gn129
-rw-r--r--chromium/chrome/browser/upboarding/query_tiles/internal/BUILD.gn78
-rw-r--r--chromium/chrome/browser/upboarding/query_tiles/test/BUILD.gn24
-rw-r--r--chromium/chrome/browser/util/BUILD.gn9
-rw-r--r--chromium/chrome/browser/vr/BUILD.gn13
-rw-r--r--chromium/chrome/browser/web_applications/BUILD.gn14
-rw-r--r--chromium/chrome/browser/web_applications/chrome_pwa_launcher/BUILD.gn5
-rw-r--r--chromium/chrome/browser/web_applications/components/BUILD.gn11
-rw-r--r--chromium/chrome/browser/win/conflicts/BUILD.gn1
-rw-r--r--chromium/chrome/browser/xsurface/BUILD.gn8
1203 files changed, 42045 insertions, 23408 deletions
diff --git a/chromium/chrome/browser/BUILD.gn b/chromium/chrome/browser/BUILD.gn
index b3f8ac15272..ab78eae16b4 100644
--- a/chromium/chrome/browser/BUILD.gn
+++ b/chromium/chrome/browser/BUILD.gn
@@ -6,9 +6,9 @@ import("//base/allocator/allocator.gni")
import("//build/buildflag_header.gni")
import("//build/config/buildflags_paint_preview.gni")
import("//build/config/chrome_build.gni")
+import("//build/config/compiler/pgo/pgo.gni")
import("//build/config/crypto.gni")
import("//build/config/features.gni")
-import("//build/config/jumbo.gni")
import("//build/config/linux/gtk/gtk.gni")
import("//build/config/ui.gni")
import("//chrome/browser/buildflags.gni")
@@ -69,7 +69,10 @@ if (is_win) {
buildflag_header("buildflags") {
header = "buildflags.h"
- flags = [ "ENABLE_KALEIDOSCOPE=$enable_kaleidoscope" ]
+ flags = [
+ "CLANG_PGO=$chrome_pgo_phase",
+ "ENABLE_KALEIDOSCOPE=$enable_kaleidoscope",
+ ]
}
# This proto library is used for non-android NTPs below.
@@ -80,7 +83,7 @@ proto_library("ntp_background_proto") {
# Use a static library here because many test binaries depend on this but don't
# require many files from it. This makes linking more efficient.
-jumbo_static_library("browser") {
+static_library("browser") {
sources = [
"about_flags.cc",
"about_flags.h",
@@ -94,6 +97,8 @@ jumbo_static_library("browser") {
"accessibility/accessibility_state_utils.h",
"accessibility/accessibility_ui.cc",
"accessibility/accessibility_ui.h",
+ "accessibility/caption_util.cc",
+ "accessibility/caption_util.h",
"after_startup_task_utils.cc",
"after_startup_task_utils.h",
"app_controller_mac.h",
@@ -204,36 +209,18 @@ jumbo_static_library("browser") {
"browser_process_platform_part_mac.mm",
"browser_process_platform_part_win.cc",
"browser_process_platform_part_win.h",
- "browsing_data/browsing_data_appcache_helper.cc",
- "browsing_data/browsing_data_appcache_helper.h",
- "browsing_data/browsing_data_cache_storage_helper.cc",
- "browsing_data/browsing_data_cache_storage_helper.h",
- "browsing_data/browsing_data_cookie_helper.cc",
- "browsing_data/browsing_data_cookie_helper.h",
- "browsing_data/browsing_data_database_helper.cc",
- "browsing_data/browsing_data_database_helper.h",
- "browsing_data/browsing_data_file_system_helper.cc",
- "browsing_data/browsing_data_file_system_helper.h",
- "browsing_data/browsing_data_helper.cc",
- "browsing_data/browsing_data_helper.h",
+ "browsing_data/browsing_data_file_system_util.cc",
+ "browsing_data/browsing_data_file_system_util.h",
"browsing_data/browsing_data_history_observer_service.cc",
"browsing_data/browsing_data_history_observer_service.h",
"browsing_data/browsing_data_important_sites_util.cc",
"browsing_data/browsing_data_important_sites_util.h",
- "browsing_data/browsing_data_indexed_db_helper.cc",
- "browsing_data/browsing_data_indexed_db_helper.h",
"browsing_data/browsing_data_media_license_helper.cc",
"browsing_data/browsing_data_media_license_helper.h",
"browsing_data/browsing_data_quota_helper.cc",
"browsing_data/browsing_data_quota_helper.h",
"browsing_data/browsing_data_quota_helper_impl.cc",
"browsing_data/browsing_data_quota_helper_impl.h",
- "browsing_data/browsing_data_service_worker_helper.cc",
- "browsing_data/browsing_data_service_worker_helper.h",
- "browsing_data/browsing_data_shared_worker_helper.cc",
- "browsing_data/browsing_data_shared_worker_helper.h",
- "browsing_data/canonical_cookie_hash.cc",
- "browsing_data/canonical_cookie_hash.h",
"browsing_data/chrome_browsing_data_remover_delegate.cc",
"browsing_data/chrome_browsing_data_remover_delegate.h",
"browsing_data/chrome_browsing_data_remover_delegate_factory.cc",
@@ -290,8 +277,6 @@ jumbo_static_library("browser") {
"chrome_notification_types.h",
"chrome_resource_bundle_helper.cc",
"chrome_resource_bundle_helper.h",
- "client_hints/client_hints.cc",
- "client_hints/client_hints.h",
"client_hints/client_hints_factory.cc",
"client_hints/client_hints_factory.h",
"clipboard/clipboard_read_write_permission_context.cc",
@@ -337,8 +322,6 @@ jumbo_static_library("browser") {
"component_updater/registration.h",
"component_updater/safety_tips_component_installer.cc",
"component_updater/safety_tips_component_installer.h",
- "component_updater/soda_component_installer.cc",
- "component_updater/soda_component_installer.h",
"component_updater/ssl_error_assistant_component_installer.cc",
"component_updater/ssl_error_assistant_component_installer.h",
"component_updater/sth_set_component_remover.cc",
@@ -349,6 +332,8 @@ jumbo_static_library("browser") {
"component_updater/sw_reporter_installer_win.h",
"component_updater/tls_deprecation_config_component_installer.cc",
"component_updater/tls_deprecation_config_component_installer.h",
+ "component_updater/trust_token_key_commitments_component_installer.cc",
+ "component_updater/trust_token_key_commitments_component_installer.h",
"consent_auditor/consent_auditor_factory.cc",
"consent_auditor/consent_auditor_factory.h",
"content_index/content_index_metrics.cc",
@@ -359,20 +344,18 @@ jumbo_static_library("browser") {
"content_index/content_index_provider_impl.h",
"content_settings/chrome_content_settings_utils.cc",
"content_settings/chrome_content_settings_utils.h",
- "content_settings/content_settings_manager_impl.cc",
- "content_settings/content_settings_manager_impl.h",
+ "content_settings/content_settings_manager_delegate.cc",
+ "content_settings/content_settings_manager_delegate.h",
"content_settings/cookie_settings_factory.cc",
"content_settings/cookie_settings_factory.h",
"content_settings/host_content_settings_map_factory.cc",
"content_settings/host_content_settings_map_factory.h",
- "content_settings/local_shared_objects_container.cc",
- "content_settings/local_shared_objects_container.h",
"content_settings/mixed_content_settings_tab_helper.cc",
"content_settings/mixed_content_settings_tab_helper.h",
"content_settings/sound_content_setting_observer.cc",
"content_settings/sound_content_setting_observer.h",
- "content_settings/tab_specific_content_settings.cc",
- "content_settings/tab_specific_content_settings.h",
+ "content_settings/tab_specific_content_settings_delegate.cc",
+ "content_settings/tab_specific_content_settings_delegate.h",
"crash_upload_list/crash_upload_list.cc",
"crash_upload_list/crash_upload_list.h",
"crash_upload_list/crash_upload_list_android.cc",
@@ -406,6 +389,8 @@ jumbo_static_library("browser") {
"download/chrome_download_manager_delegate.h",
"download/deferred_client_wrapper.cc",
"download/deferred_client_wrapper.h",
+ "download/download_auto_open_policy_handler.cc",
+ "download/download_auto_open_policy_handler.h",
"download/download_confirmation_reason.h",
"download/download_confirmation_result.h",
"download/download_core_service.cc",
@@ -493,6 +478,8 @@ jumbo_static_library("browser") {
"engagement/site_engagement_service.h",
"engagement/site_engagement_service_factory.cc",
"engagement/site_engagement_service_factory.h",
+ "enterprise/util/managed_browser_utils.cc",
+ "enterprise/util/managed_browser_utils.h",
"expired_flags_list.h",
"external_protocol/external_protocol_handler.cc",
"external_protocol/external_protocol_handler.h",
@@ -623,6 +610,8 @@ jumbo_static_library("browser") {
"installable/installable_params.h",
"installable/installable_task_queue.cc",
"installable/installable_task_queue.h",
+ "installable/installable_utils.cc",
+ "installable/installable_utils.h",
"internal_auth.cc",
"internal_auth.h",
"interstitials/enterprise_util.cc",
@@ -642,10 +631,6 @@ jumbo_static_library("browser") {
"lifetime/application_lifetime_mac.mm",
"lifetime/browser_shutdown.cc",
"lifetime/browser_shutdown.h",
- "local_search_service/local_search_service_proxy.cc",
- "local_search_service/local_search_service_proxy.h",
- "local_search_service/local_search_service_proxy_factory.cc",
- "local_search_service/local_search_service_proxy_factory.h",
"lookalikes/lookalike_url_blocking_page.cc",
"lookalikes/lookalike_url_blocking_page.h",
"lookalikes/lookalike_url_controller_client.cc",
@@ -680,18 +665,12 @@ jumbo_static_library("browser") {
"media/cast_mirroring_service_host.h",
"media/cast_remoting_connector.cc",
"media/cast_remoting_connector.h",
- "media/feeds/media_feeds_contents_observer.cc",
- "media/feeds/media_feeds_contents_observer.h",
- "media/feeds/media_feeds_fetcher.cc",
- "media/feeds/media_feeds_fetcher.h",
- "media/feeds/media_feeds_service.cc",
- "media/feeds/media_feeds_service.h",
- "media/feeds/media_feeds_service_factory.cc",
- "media/feeds/media_feeds_service_factory.h",
"media/feeds/media_feeds_utils.cc",
"media/feeds/media_feeds_utils.h",
"media/history/media_history_contents_observer.cc",
"media/history/media_history_contents_observer.h",
+ "media/history/media_history_feed_associated_origins_table.cc",
+ "media/history/media_history_feed_associated_origins_table.h",
"media/history/media_history_feed_items_table.cc",
"media/history/media_history_feed_items_table.h",
"media/history/media_history_feeds_table.cc",
@@ -744,6 +723,8 @@ jumbo_static_library("browser") {
"media/router/media_router_feature.h",
"media/webrtc/audio_debug_recordings_handler.cc",
"media/webrtc/audio_debug_recordings_handler.h",
+ "media/webrtc/camera_pan_tilt_zoom_permission_context.cc",
+ "media/webrtc/camera_pan_tilt_zoom_permission_context.h",
"media/webrtc/desktop_media_list.h",
"media/webrtc/desktop_media_list_base.cc",
"media/webrtc/desktop_media_list_base.h",
@@ -761,8 +742,6 @@ jumbo_static_library("browser") {
"media/webrtc/media_stream_device_permission_context.h",
"media/webrtc/media_stream_device_permissions.cc",
"media/webrtc/media_stream_device_permissions.h",
- "media/webrtc/media_stream_devices_controller.cc",
- "media/webrtc/media_stream_devices_controller.h",
"media/webrtc/native_desktop_media_list.cc",
"media/webrtc/native_desktop_media_list.h",
"media/webrtc/permission_bubble_media_access_handler.cc",
@@ -911,8 +890,6 @@ jumbo_static_library("browser") {
"net/dns_probe_service.h",
"net/dns_probe_service_factory.cc",
"net/dns_probe_service_factory.h",
- "net/dns_util.cc",
- "net/dns_util.h",
"net/file_downloader.cc",
"net/file_downloader.h",
"net/net_error_diagnostics_dialog.h",
@@ -937,8 +914,12 @@ jumbo_static_library("browser") {
"net/referrer.h",
"net/referrer_policy_policy_handler.cc",
"net/referrer_policy_policy_handler.h",
+ "net/secure_dns_config.cc",
+ "net/secure_dns_config.h",
"net/secure_dns_policy_handler.cc",
"net/secure_dns_policy_handler.h",
+ "net/secure_dns_util.cc",
+ "net/secure_dns_util.h",
"net/service_providers_win.cc",
"net/service_providers_win.h",
"net/stub_resolver_config_reader.cc",
@@ -1042,10 +1023,6 @@ jumbo_static_library("browser") {
"page_load_metrics/observers/ad_metrics/frame_data.h",
"page_load_metrics/observers/amp_page_load_metrics_observer.cc",
"page_load_metrics/observers/amp_page_load_metrics_observer.h",
- "page_load_metrics/observers/data_reduction_proxy_metrics_observer.cc",
- "page_load_metrics/observers/data_reduction_proxy_metrics_observer.h",
- "page_load_metrics/observers/data_reduction_proxy_metrics_observer_base.cc",
- "page_load_metrics/observers/data_reduction_proxy_metrics_observer_base.h",
"page_load_metrics/observers/data_saver_site_breakdown_metrics_observer.cc",
"page_load_metrics/observers/data_saver_site_breakdown_metrics_observer.h",
"page_load_metrics/observers/data_use_metrics_observer.cc",
@@ -1084,8 +1061,6 @@ jumbo_static_library("browser") {
"page_load_metrics/observers/omnibox_suggestion_used_page_load_metrics_observer.h",
"page_load_metrics/observers/optimization_guide_page_load_metrics_observer.cc",
"page_load_metrics/observers/optimization_guide_page_load_metrics_observer.h",
- "page_load_metrics/observers/previews_lite_page_redirect_metrics_observer.cc",
- "page_load_metrics/observers/previews_lite_page_redirect_metrics_observer.h",
"page_load_metrics/observers/previews_page_load_metrics_observer.cc",
"page_load_metrics/observers/previews_page_load_metrics_observer.h",
"page_load_metrics/observers/previews_ukm_observer.cc",
@@ -1160,16 +1135,6 @@ jumbo_static_library("browser") {
"performance_manager/decorators/process_metrics_decorator.h",
"performance_manager/decorators/process_priority_aggregator.cc",
"performance_manager/decorators/process_priority_aggregator.h",
- "performance_manager/graph/policies/high_pmf_memory_pressure_policy.cc",
- "performance_manager/graph/policies/high_pmf_memory_pressure_policy.h",
- "performance_manager/graph/policies/policy_features.cc",
- "performance_manager/graph/policies/policy_features.h",
- "performance_manager/graph/policies/working_set_trimmer_policy.cc",
- "performance_manager/graph/policies/working_set_trimmer_policy.h",
- "performance_manager/graph/policies/working_set_trimmer_policy_chromeos.cc",
- "performance_manager/graph/policies/working_set_trimmer_policy_chromeos.h",
- "performance_manager/graph/policies/working_set_trimmer_policy_win.cc",
- "performance_manager/graph/policies/working_set_trimmer_policy_win.h",
"performance_manager/mechanisms/high_pmf_memory_pressure_signals.cc",
"performance_manager/mechanisms/high_pmf_memory_pressure_signals.h",
"performance_manager/mechanisms/working_set_trimmer.cc",
@@ -1185,6 +1150,16 @@ jumbo_static_library("browser") {
"performance_manager/observers/isolation_context_metrics.h",
"performance_manager/observers/metrics_collector.cc",
"performance_manager/observers/metrics_collector.h",
+ "performance_manager/policies/high_pmf_memory_pressure_policy.cc",
+ "performance_manager/policies/high_pmf_memory_pressure_policy.h",
+ "performance_manager/policies/policy_features.cc",
+ "performance_manager/policies/policy_features.h",
+ "performance_manager/policies/working_set_trimmer_policy.cc",
+ "performance_manager/policies/working_set_trimmer_policy.h",
+ "performance_manager/policies/working_set_trimmer_policy_chromeos.cc",
+ "performance_manager/policies/working_set_trimmer_policy_chromeos.h",
+ "performance_manager/policies/working_set_trimmer_policy_win.cc",
+ "performance_manager/policies/working_set_trimmer_policy_win.h",
"performance_monitor/metric_evaluator_helper_win.cc",
"performance_monitor/metric_evaluator_helper_win.h",
"performance_monitor/process_metrics_history.cc",
@@ -1262,6 +1237,13 @@ jumbo_static_library("browser") {
"policy/homepage_location_policy_handler.h",
"policy/javascript_policy_handler.cc",
"policy/javascript_policy_handler.h",
+ "policy/messaging_layer/public/report_queue_configuration.cc",
+ "policy/messaging_layer/public/report_queue_configuration.h",
+ "policy/messaging_layer/util/status.cc",
+ "policy/messaging_layer/util/status.h",
+ "policy/messaging_layer/util/status_macros.h",
+ "policy/messaging_layer/util/statusor.cc",
+ "policy/messaging_layer/util/statusor.h",
"policy/network_prediction_policy_handler.cc",
"policy/network_prediction_policy_handler.h",
"policy/profile_policy_connector.cc",
@@ -1391,19 +1373,10 @@ jumbo_static_library("browser") {
"prerender/prerender_util.h",
"previews/previews_content_util.cc",
"previews/previews_content_util.h",
+ "previews/previews_https_notification_infobar_decider.cc",
"previews/previews_https_notification_infobar_decider.h",
"previews/previews_lite_page_infobar_delegate.cc",
"previews/previews_lite_page_infobar_delegate.h",
- "previews/previews_lite_page_redirect_decider.cc",
- "previews/previews_lite_page_redirect_decider.h",
- "previews/previews_lite_page_redirect_predictor.cc",
- "previews/previews_lite_page_redirect_predictor.h",
- "previews/previews_lite_page_redirect_serving_url_loader.cc",
- "previews/previews_lite_page_redirect_serving_url_loader.h",
- "previews/previews_lite_page_redirect_url_loader.cc",
- "previews/previews_lite_page_redirect_url_loader.h",
- "previews/previews_lite_page_redirect_url_loader_interceptor.cc",
- "previews/previews_lite_page_redirect_url_loader_interceptor.h",
"previews/previews_offline_helper.cc",
"previews/previews_offline_helper.h",
"previews/previews_service.cc",
@@ -1504,6 +1477,10 @@ jumbo_static_library("browser") {
"push_messaging/push_messaging_service_factory.h",
"push_messaging/push_messaging_service_impl.cc",
"push_messaging/push_messaging_service_impl.h",
+ "query_tiles/tile_background_task.cc",
+ "query_tiles/tile_background_task.h",
+ "query_tiles/tile_service_factory.cc",
+ "query_tiles/tile_service_factory.h",
"renderer_context_menu/context_menu_content_type_factory.cc",
"renderer_context_menu/context_menu_content_type_factory.h",
"renderer_host/chrome_navigation_ui_data.cc",
@@ -1541,8 +1518,6 @@ jumbo_static_library("browser") {
"resource_coordinator/utils.h",
"resources_util.cc",
"resources_util.h",
- "search/instant_io_context.cc",
- "search/instant_io_context.h",
"search/search.cc",
"search/search.h",
"search/suggestions/suggestions_service_factory.cc",
@@ -1578,6 +1553,7 @@ jumbo_static_library("browser") {
"send_tab_to_self/send_tab_to_self_client_service_factory.h",
"send_tab_to_self/send_tab_to_self_util.cc",
"send_tab_to_self/send_tab_to_self_util.h",
+ "service_sandbox_type.h",
"sessions/chrome_serialized_navigation_driver.cc",
"sessions/chrome_serialized_navigation_driver.h",
"sessions/chrome_tab_restore_service_client.cc",
@@ -1710,6 +1686,8 @@ jumbo_static_library("browser") {
"signin/reauth_tab_helper.h",
"signin/signin_error_controller_factory.cc",
"signin/signin_error_controller_factory.h",
+ "signin/signin_features.cc",
+ "signin/signin_features.h",
"signin/signin_profile_attributes_updater.cc",
"signin/signin_profile_attributes_updater.h",
"signin/signin_profile_attributes_updater_factory.cc",
@@ -1726,10 +1704,6 @@ jumbo_static_library("browser") {
"site_isolation/site_details.h",
"site_isolation/site_isolation_policy.cc",
"site_isolation/site_isolation_policy.h",
- "soda/soda_service.cc",
- "soda/soda_service.h",
- "soda/soda_service_factory.cc",
- "soda/soda_service_factory.h",
"speech/chrome_speech_recognition_manager_delegate.cc",
"speech/chrome_speech_recognition_manager_delegate.h",
"speech/speech_recognizer.cc",
@@ -1777,6 +1751,8 @@ jumbo_static_library("browser") {
"status_icons/status_icon_observer.h",
"status_icons/status_tray.cc",
"status_icons/status_tray.h",
+ "storage/appcache_feature_prefs.cc",
+ "storage/appcache_feature_prefs.h",
"storage/durable_storage_permission_context.cc",
"storage/durable_storage_permission_context.h",
"subresource_filter/chrome_subresource_filter_client.cc",
@@ -1825,6 +1801,8 @@ jumbo_static_library("browser") {
"sync/user_event_service_factory.h",
"tab/state/tab_state_db.cc",
"tab/state/tab_state_db.h",
+ "tab/state/tab_state_db_factory.cc",
+ "tab/state/tab_state_db_factory.h",
"tab_contents/navigation_metrics_recorder.cc",
"tab_contents/navigation_metrics_recorder.h",
"tab_contents/tab_util.cc",
@@ -1841,8 +1819,6 @@ jumbo_static_library("browser") {
"tracing/chrome_tracing_delegate.h",
"tracing/crash_service_uploader.cc",
"tracing/crash_service_uploader.h",
- "tracing/navigation_tracing.cc",
- "tracing/navigation_tracing.h",
"tracing/trace_event_system_stats_monitor.cc",
"tracing/trace_event_system_stats_monitor.h",
"transition_manager/full_browser_transition_manager.cc",
@@ -1865,10 +1841,10 @@ jumbo_static_library("browser") {
"unexpire_flags.h",
"unified_consent/unified_consent_service_factory.cc",
"unified_consent/unified_consent_service_factory.h",
- "upboarding/query_tiles/tile_service_factory.cc",
- "upboarding/query_tiles/tile_service_factory.h",
"update_client/chrome_update_query_params_delegate.cc",
"update_client/chrome_update_query_params_delegate.h",
+ "usb/frame_usb_services.cc",
+ "usb/frame_usb_services.h",
"usb/usb_blocklist.cc",
"usb/usb_blocklist.h",
"usb/usb_chooser_context.cc",
@@ -1980,8 +1956,11 @@ jumbo_static_library("browser") {
":expired_flags_list",
":ntp_background_proto",
":permissions_proto",
+ ":reporting_record_proto",
":resource_prefetch_predictor_proto",
+ ":status_proto",
":tab_state_db_content_proto",
+ ":unexpire_flags",
"//base:i18n",
"//base/allocator:buildflags",
"//base/util/memory_pressure:memory_pressure",
@@ -2005,7 +1984,6 @@ jumbo_static_library("browser") {
"//chrome/browser/metrics/variations:chrome_ui_string_overrider_factory",
"//chrome/browser/net:probe_message_proto",
"//chrome/browser/notifications",
- "//chrome/browser/performance_manager:site_data_proto",
"//chrome/browser/profiling_host",
"//chrome/browser/push_messaging:budget_proto",
"//chrome/browser/reputation:proto",
@@ -2019,12 +1997,10 @@ jumbo_static_library("browser") {
"//chrome/browser/touch_to_fill",
"//chrome/browser/ui",
"//chrome/browser/ui/webui/bluetooth_internals",
- "//chrome/browser/upboarding",
"//chrome/browser/updates/announcement_notification",
"//chrome/common:channel_info",
"//chrome/common/net",
"//chrome/installer/util:with_no_strings",
- "//chrome/services/local_search_service:local_search_service",
"//components/assist_ranker",
"//components/autofill/content/browser",
"//components/autofill/core/browser",
@@ -2041,19 +2017,20 @@ jumbo_static_library("browser") {
"//components/captive_portal/core:buildflags",
"//components/certificate_matching",
"//components/certificate_transparency",
+ "//components/client_hints/browser",
"//components/cloud_devices/common",
"//components/component_updater",
"//components/component_updater:crl_set_remover",
"//components/component_updater/installer_policies",
"//components/consent_auditor",
"//components/content_capture/browser",
+ "//components/content_settings/browser",
"//components/content_settings/core/browser",
"//components/content_settings/core/common",
"//components/contextual_search/content:browser",
"//components/contextual_search/core:browser",
"//components/cookie_config",
"//components/crx_file",
- "//components/data_reduction_proxy/content/common",
"//components/data_reduction_proxy/core/browser",
"//components/data_use_measurement/core:ascriber",
"//components/device_event_log",
@@ -2087,7 +2064,7 @@ jumbo_static_library("browser") {
"//components/language/core/browser",
"//components/language/core/common",
"//components/leveldb_proto",
- "//components/lookalikes",
+ "//components/lookalikes/core",
"//components/metrics:call_stack_profile_collector",
"//components/metrics:component_metrics",
"//components/metrics:demographic_metrics_provider",
@@ -2123,12 +2100,14 @@ jumbo_static_library("browser") {
"//components/policy/content/",
"//components/policy/core/browser",
"//components/policy/proto",
+ "//components/policy/proto:policy_record_constants",
"//components/prefs",
"//components/previews/content",
"//components/previews/core",
"//components/profile_metrics",
"//components/proxy_config",
"//components/query_parser",
+ "//components/query_tiles",
"//components/rappor",
"//components/renderer_context_menu",
"//components/resources",
@@ -2136,7 +2115,6 @@ jumbo_static_library("browser") {
"//components/safe_browsing/core/common:safe_browsing_policy_handler",
"//components/safe_search_api",
"//components/safe_search_api:safe_search_client",
- "//components/schema_org:extractor",
"//components/schema_org/common:improved_mojom",
"//components/search",
"//components/search_engines",
@@ -2148,6 +2126,8 @@ jumbo_static_library("browser") {
"//components/security_state/core",
"//components/send_tab_to_self",
"//components/services/heap_profiling",
+ "//components/services/language_detection/public/cpp",
+ "//components/services/language_detection/public/mojom",
"//components/services/patch/content",
"//components/services/quarantine",
"//components/services/quarantine/public/mojom",
@@ -2158,7 +2138,7 @@ jumbo_static_library("browser") {
"//components/signin/public/base:signin_buildflags",
"//components/signin/public/identity_manager",
"//components/signin/public/webdata",
- "//components/soda:constants",
+ "//components/site_isolation",
"//components/spellcheck:buildflags",
"//components/sqlite_proto",
"//components/ssl_errors",
@@ -2199,6 +2179,7 @@ jumbo_static_library("browser") {
"//components/web_resource",
"//components/webdata/common",
"//components/webdata_services",
+ "//components/webrtc",
"//components/webrtc_logging/browser",
"//components/webrtc_logging/common",
"//content/app/resources",
@@ -2298,7 +2279,12 @@ jumbo_static_library("browser") {
]
if (is_win) {
- libs += [ "secur32.lib" ]
+ libs += [
+ "secur32.lib",
+
+ # Needed for _variant_t used in browser_dm_token_storage_win.cc
+ "comsuppw.lib",
+ ]
sources +=
[ "component_updater/recovery_improved_component_installer_win.cc" ]
deps += [ "//chrome/elevation_service:elevation_service_idl" ]
@@ -2371,8 +2357,6 @@ jumbo_static_library("browser") {
"android/chrome_backup_agent.h",
"android/chrome_backup_watcher.cc",
"android/chrome_backup_watcher.h",
- "android/chrome_context_util.cc",
- "android/chrome_context_util.h",
"android/chrome_session_state.cc",
"android/chrome_session_state.h",
"android/chrome_startup_flags.cc",
@@ -2381,6 +2365,8 @@ jumbo_static_library("browser") {
"android/color_helpers.h",
"android/component_updater/background_task_update_scheduler.cc",
"android/component_updater/background_task_update_scheduler.h",
+ "android/compose_bitmaps_helper.cc",
+ "android/compose_bitmaps_helper.h",
"android/compositor/compositor_view.cc",
"android/compositor/compositor_view.h",
"android/compositor/decoration_title.cc",
@@ -2431,6 +2417,8 @@ jumbo_static_library("browser") {
"android/compositor/tab_content_manager.h",
"android/consent_auditor/consent_auditor_bridge.cc",
"android/content/content_utils.cc",
+ "android/context_menu/chrome_context_menu_populator.cc",
+ "android/context_menu/chrome_context_menu_populator.h",
"android/contextualsearch/contextual_search_context.cc",
"android/contextualsearch/contextual_search_context.h",
"android/contextualsearch/contextual_search_delegate.cc",
@@ -2469,8 +2457,6 @@ jumbo_static_library("browser") {
"android/devtools_manager_delegate_android.h",
"android/devtools_server.cc",
"android/devtools_server.h",
- "android/digital_asset_links/digital_asset_links_handler.cc",
- "android/digital_asset_links/digital_asset_links_handler.h",
"android/document/document_web_contents_delegate.cc",
"android/document/document_web_contents_delegate.h",
"android/dom_distiller/distiller_ui_handle_android.cc",
@@ -2574,7 +2560,6 @@ jumbo_static_library("browser") {
"android/instantapps/instant_apps_settings.h",
"android/intent_helper.cc",
"android/intent_helper.h",
- "android/intercept_navigation_delegate_impl.cc",
"android/large_icon_bridge.cc",
"android/large_icon_bridge.h",
"android/locale/locale_manager.cc",
@@ -2656,7 +2641,6 @@ jumbo_static_library("browser") {
"android/preferences/pref_service_bridge.h",
"android/preferences/prefs.h",
"android/preferences/privacy_preferences_manager.cc",
- "android/preferences/website_preference_bridge.cc",
"android/profile_key_startup_accessor.cc",
"android/profile_key_startup_accessor.h",
"android/profile_key_util.cc",
@@ -2776,6 +2760,8 @@ jumbo_static_library("browser") {
"autofill/address_accessory_controller.h",
"autofill/address_accessory_controller_impl.cc",
"autofill/address_accessory_controller_impl.h",
+ "autofill/android/internal_authenticator_android.cc",
+ "autofill/android/internal_authenticator_android.h",
"autofill/android/personal_data_manager_android.cc",
"autofill/android/personal_data_manager_android.h",
"autofill/android/phone_number_util_android.cc",
@@ -2828,10 +2814,13 @@ jumbo_static_library("browser") {
"download/android/intercept_oma_download_navigation_throttle.cc",
"download/android/intercept_oma_download_navigation_throttle.h",
"download/android/items/offline_content_aggregator_factory_android.cc",
+ "download/android/mixed_content_download_infobar_delegate.cc",
+ "download/android/mixed_content_download_infobar_delegate.h",
"download/android/rename_utils.cc",
"download/android/service/download_background_task.cc",
"download/android/service/download_task_scheduler.cc",
"download/android/service/download_task_scheduler.h",
+ "download/android/string_utils.cc",
"engagement/site_engagement_service_android.cc",
"engagement/site_engagement_service_android.h",
"first_run/android/first_run_utils.cc",
@@ -2862,7 +2851,6 @@ jumbo_static_library("browser") {
"media/android/cdm/per_device_provisioning_permission.h",
"media/android/remote/flinging_controller_bridge.cc",
"media/android/remote/flinging_controller_bridge.h",
- "media/android/remote/record_cast_action.cc",
"media/android/router/media_router_android.cc",
"media/android/router/media_router_android.h",
"media/android/router/media_router_android_bridge.cc",
@@ -2892,38 +2880,40 @@ jumbo_static_library("browser") {
"optimization_guide/android/optimization_guide_bridge.h",
"page_load_metrics/observers/android_page_load_metrics_observer.cc",
"page_load_metrics/observers/android_page_load_metrics_observer.h",
- "password_manager/account_chooser_dialog_android.cc",
- "password_manager/account_chooser_dialog_android.h",
- "password_manager/auto_signin_first_run_dialog_android.cc",
- "password_manager/auto_signin_first_run_dialog_android.h",
- "password_manager/auto_signin_prompt_controller.cc",
- "password_manager/auto_signin_prompt_controller.h",
- "password_manager/credential_android.cc",
- "password_manager/credential_android.h",
- "password_manager/credential_leak_controller_android.cc",
- "password_manager/credential_leak_controller_android.h",
- "password_manager/generated_password_saved_infobar_delegate_android.cc",
- "password_manager/generated_password_saved_infobar_delegate_android.h",
- "password_manager/password_accessory_controller.h",
- "password_manager/password_accessory_controller_impl.cc",
- "password_manager/password_accessory_controller_impl.h",
- "password_manager/password_accessory_metrics_util.h",
- "password_manager/password_generation_controller.h",
- "password_manager/password_generation_controller_impl.cc",
- "password_manager/password_generation_controller_impl.h",
- "password_manager/password_generation_dialog_view_interface.h",
- "password_manager/password_manager_infobar_delegate_android.cc",
- "password_manager/password_manager_infobar_delegate_android.h",
- "password_manager/password_manager_launcher_android.cc",
- "password_manager/password_manager_launcher_android.h",
- "password_manager/save_password_infobar_delegate_android.cc",
- "password_manager/save_password_infobar_delegate_android.h",
- "password_manager/touch_to_fill_view.h",
- "password_manager/update_password_infobar_delegate_android.cc",
- "password_manager/update_password_infobar_delegate_android.h",
+ "password_manager/android/account_chooser_dialog_android.cc",
+ "password_manager/android/account_chooser_dialog_android.h",
+ "password_manager/android/auto_signin_first_run_dialog_android.cc",
+ "password_manager/android/auto_signin_first_run_dialog_android.h",
+ "password_manager/android/auto_signin_prompt_controller.cc",
+ "password_manager/android/auto_signin_prompt_controller.h",
+ "password_manager/android/credential_android.cc",
+ "password_manager/android/credential_android.h",
+ "password_manager/android/credential_leak_controller_android.cc",
+ "password_manager/android/credential_leak_controller_android.h",
+ "password_manager/android/generated_password_saved_infobar_delegate_android.cc",
+ "password_manager/android/generated_password_saved_infobar_delegate_android.h",
+ "password_manager/android/password_accessory_controller.h",
+ "password_manager/android/password_accessory_controller_impl.cc",
+ "password_manager/android/password_accessory_controller_impl.h",
+ "password_manager/android/password_accessory_metrics_util.h",
+ "password_manager/android/password_generation_controller.h",
+ "password_manager/android/password_generation_controller_impl.cc",
+ "password_manager/android/password_generation_controller_impl.h",
+ "password_manager/android/password_generation_dialog_view_interface.h",
+ "password_manager/android/password_manager_infobar_delegate_android.cc",
+ "password_manager/android/password_manager_infobar_delegate_android.h",
+ "password_manager/android/password_manager_launcher_android.cc",
+ "password_manager/android/password_manager_launcher_android.h",
+ "password_manager/android/save_password_infobar_delegate_android.cc",
+ "password_manager/android/save_password_infobar_delegate_android.h",
+ "password_manager/android/touch_to_fill_view.h",
+ "password_manager/android/update_password_infobar_delegate_android.cc",
+ "password_manager/android/update_password_infobar_delegate_android.h",
"payments/android/can_make_payment_query_android.cc",
"payments/android/journey_logger_android.cc",
"payments/android/journey_logger_android.h",
+ "payments/android/payment_app_service_bridge.cc",
+ "payments/android/payment_app_service_bridge.h",
"payments/android/payment_manifest_web_data_service_android.cc",
"payments/android/payment_manifest_web_data_service_android.h",
"payments/android/service_worker_payment_app_bridge.cc",
@@ -2948,6 +2938,7 @@ jumbo_static_library("browser") {
"profiles/profile_key_android.h",
"profiles/profile_manager_android.cc",
"profiles/profile_manager_android.h",
+ "query_tiles/android/tile_provider_factory.cc",
"reputation/safety_tip_infobar.cc",
"reputation/safety_tip_infobar.h",
"reputation/safety_tip_infobar_delegate.cc",
@@ -2963,6 +2954,8 @@ jumbo_static_library("browser") {
"signin/identity_services_provider_android.cc",
"signin/signin_manager_android_factory.cc",
"signin/signin_manager_android_factory.h",
+ "ssl/chrome_security_state_client.cc",
+ "ssl/chrome_security_state_client.h",
"ssl/chrome_security_state_model_delegate.cc",
"ssl/chrome_security_state_model_delegate.h",
"ssl/known_interception_disclosure_infobar.cc",
@@ -2979,7 +2972,6 @@ jumbo_static_library("browser") {
"touch_to_fill/touch_to_fill_controller.h",
"translate/android/translate_bridge.cc",
"translate/android/translate_bridge.h",
- "upboarding/query_tiles/android/tile_provider_factory.cc",
"updates/update_notification_client.cc",
"updates/update_notification_client.h",
"updates/update_notification_service_bridge_android.cc",
@@ -2996,7 +2988,6 @@ jumbo_static_library("browser") {
":explore_sites_proto",
":usage_stats_proto",
"//chrome/android:jni_headers",
- "//chrome/android/features/cablev2_authenticator/internal:native",
"//chrome/android/modules/extra_icu/provider:native",
"//chrome/browser/android/thin_webview/internal",
"//chrome/browser/android/webapk:proto",
@@ -3007,7 +2998,6 @@ jumbo_static_library("browser") {
"//chrome/browser/optimization_guide/android:jni_headers",
"//chrome/browser/payments/android:jni_headers",
"//chrome/browser/share",
- "//chrome/browser/upboarding",
"//chrome/browser/updates",
"//chrome/common:non_code_constants",
"//chrome/services/media_gallery_util/public/cpp",
@@ -3019,6 +3009,7 @@ jumbo_static_library("browser") {
"//components/content_capture/android",
"//components/content_settings/android",
"//components/crash/android:crash_android",
+ "//components/embedder_support/android:browser_context",
"//components/embedder_support/android:util",
"//components/embedder_support/android:web_contents_delegate",
"//components/external_intents/android",
@@ -3030,18 +3021,21 @@ jumbo_static_library("browser") {
"//components/location/android:settings",
"//components/module_installer/android:native",
"//components/omnibox/browser",
+ "//components/page_info/android",
"//components/page_load_metrics/browser",
"//components/paint_preview/browser/android",
"//components/paint_preview/player/android",
"//components/password_manager/content/browser",
"//components/payments/content/android",
"//components/permissions/android:native",
+ "//components/query_tiles",
"//components/resources:components_resources",
"//components/security_state/content/android",
"//components/send_tab_to_self",
"//components/signin/internal/identity_manager", # cf android/signin/DEPS
"//components/subresource_filter/android",
"//components/viz/common",
+ "//ipc:param_traits",
"//media/mojo/clients",
"//rlz:rlz_utils",
"//sandbox",
@@ -3050,6 +3044,7 @@ jumbo_static_library("browser") {
"//services/proxy_resolver:lib",
"//third_party/android_ndk:cpu_features",
"//third_party/android_opengl/etc1",
+ "//third_party/blink/public/common",
"//third_party/crashpad/crashpad/client:client",
"//third_party/libaddressinput:util",
"//third_party/libphonenumber",
@@ -3090,6 +3085,12 @@ jumbo_static_library("browser") {
}
} else { # !is_android
sources += [
+ "accessibility/caption_controller.cc",
+ "accessibility/caption_controller.h",
+ "accessibility/caption_controller_factory.cc",
+ "accessibility/caption_controller_factory.h",
+ "accessibility/caption_host_impl.cc",
+ "accessibility/caption_host_impl.h",
"accessibility/invert_bubble_prefs.cc",
"accessibility/invert_bubble_prefs.h",
"apps/app_service/app_icon_factory.cc",
@@ -3098,6 +3099,8 @@ jumbo_static_library("browser") {
"apps/app_service/app_icon_source.h",
"apps/app_service/app_launch_params.cc",
"apps/app_service/app_launch_params.h",
+ "apps/app_service/app_notifications.cc",
+ "apps/app_service/app_notifications.h",
"apps/app_service/app_service_metrics.cc",
"apps/app_service/app_service_metrics.h",
"apps/app_service/app_service_proxy.cc",
@@ -3108,10 +3111,20 @@ jumbo_static_library("browser") {
"apps/app_service/browser_app_launcher.h",
"apps/app_service/dip_px_util.cc",
"apps/app_service/dip_px_util.h",
+ "apps/app_service/extension_apps.cc",
+ "apps/app_service/extension_apps.h",
+ "apps/app_service/extension_apps_base.cc",
+ "apps/app_service/extension_apps_base.h",
+ "apps/app_service/extension_uninstaller.cc",
+ "apps/app_service/extension_uninstaller.h",
+ "apps/app_service/icon_key_util.cc",
+ "apps/app_service/icon_key_util.h",
"apps/app_service/launch_utils.cc",
"apps/app_service/launch_utils.h",
- "apps/app_service/uninstall_dialog.cc",
- "apps/app_service/uninstall_dialog.h",
+ "apps/app_service/web_apps.cc",
+ "apps/app_service/web_apps.h",
+ "apps/app_service/web_apps_base.cc",
+ "apps/app_service/web_apps_base.h",
"apps/intent_helper/apps_navigation_throttle.cc",
"apps/intent_helper/apps_navigation_throttle.h",
"apps/intent_helper/apps_navigation_types.cc",
@@ -3124,14 +3137,6 @@ jumbo_static_library("browser") {
"apps/intent_helper/intent_picker_auto_display_service_factory.h",
"apps/intent_helper/page_transition_util.cc",
"apps/intent_helper/page_transition_util.h",
- "apps/launch_service/extension_app_launch_manager.cc",
- "apps/launch_service/extension_app_launch_manager.h",
- "apps/launch_service/launch_manager.cc",
- "apps/launch_service/launch_manager.h",
- "apps/launch_service/launch_service.cc",
- "apps/launch_service/launch_service.h",
- "apps/launch_service/launch_service_factory.cc",
- "apps/launch_service/launch_service_factory.h",
"background/background_contents.cc",
"background/background_contents.h",
"background/background_contents_service_observer.h",
@@ -3151,6 +3156,8 @@ jumbo_static_library("browser") {
"chrome_process_singleton.h",
"component_updater/intervention_policy_database_component_installer.cc",
"component_updater/intervention_policy_database_component_installer.h",
+ "component_updater/soda_component_installer.cc",
+ "component_updater/soda_component_installer.h",
"custom_handlers/register_protocol_handler_permission_request.cc",
"custom_handlers/register_protocol_handler_permission_request.h",
"device_identity/device_identity_provider.cc",
@@ -3194,10 +3201,18 @@ jumbo_static_library("browser") {
"download/download_shelf_context_menu.h",
"download/download_shelf_controller.cc",
"download/download_shelf_controller.h",
+ "enterprise/connectors/analysis_service_settings.cc",
+ "enterprise/connectors/analysis_service_settings.h",
+ "enterprise/connectors/common.cc",
+ "enterprise/connectors/common.h",
"enterprise/connectors/connectors_manager.cc",
"enterprise/connectors/connectors_manager.h",
+ "enterprise/connectors/connectors_prefs.cc",
+ "enterprise/connectors/connectors_prefs.h",
"enterprise/connectors/enterprise_connectors_policy_handler.cc",
"enterprise/connectors/enterprise_connectors_policy_handler.h",
+ "enterprise/connectors/service_providers.cc",
+ "enterprise/connectors/service_providers.h",
"enterprise/reporting/browser_report_generator.cc",
"enterprise/reporting/browser_report_generator.h",
"enterprise/reporting/extension_info.cc",
@@ -3280,6 +3295,16 @@ jumbo_static_library("browser") {
"lifetime/termination_notification.h",
"media/capture_access_handler_base.cc",
"media/capture_access_handler_base.h",
+ "media/feeds/media_feeds_contents_observer.cc",
+ "media/feeds/media_feeds_contents_observer.h",
+ "media/feeds/media_feeds_converter.cc",
+ "media/feeds/media_feeds_converter.h",
+ "media/feeds/media_feeds_fetcher.cc",
+ "media/feeds/media_feeds_fetcher.h",
+ "media/feeds/media_feeds_service.cc",
+ "media/feeds/media_feeds_service.h",
+ "media/feeds/media_feeds_service_factory.cc",
+ "media/feeds/media_feeds_service_factory.h",
"media/unified_autoplay_config.cc",
"media/unified_autoplay_config.h",
"media/webrtc/desktop_capture_devices_util.cc",
@@ -3364,6 +3389,13 @@ jumbo_static_library("browser") {
"metrics/tab_stats_tracker_delegate.h",
"metrics/tab_stats_tracker_delegate_win.cc",
"metrics/tab_stats_tracker_win.cc",
+ "nearby_sharing/nearby_sharing_prefs.cc",
+ "nearby_sharing/nearby_sharing_prefs.h",
+ "nearby_sharing/nearby_sharing_service.h",
+ "nearby_sharing/nearby_sharing_service_factory.cc",
+ "nearby_sharing/nearby_sharing_service_factory.h",
+ "nearby_sharing/nearby_sharing_service_impl.cc",
+ "nearby_sharing/nearby_sharing_service_impl.h",
"notifications/notification_system_observer.cc",
"notifications/notification_system_observer.h",
"notifications/profile_notification.cc",
@@ -3374,43 +3406,20 @@ jumbo_static_library("browser") {
"obsolete_system/obsolete_system_win.cc",
"page_load_metrics/observers/session_restore_page_load_metrics_observer.cc",
"page_load_metrics/observers/session_restore_page_load_metrics_observer.h",
- "performance_manager/graph/policies/background_tab_loading_policy.cc",
- "performance_manager/graph/policies/background_tab_loading_policy.h",
- "performance_manager/graph/policies/background_tab_loading_policy_helpers.cc",
- "performance_manager/graph/policies/background_tab_loading_policy_helpers.h",
- "performance_manager/graph/policies/urgent_page_discarding_policy.cc",
- "performance_manager/graph/policies/urgent_page_discarding_policy.h",
"performance_manager/mechanisms/page_discarder.cc",
"performance_manager/mechanisms/page_discarder.h",
"performance_manager/mechanisms/page_loader.cc",
"performance_manager/mechanisms/page_loader.h",
- "performance_manager/persistence/site_data/exponential_moving_average.cc",
- "performance_manager/persistence/site_data/exponential_moving_average.h",
- "performance_manager/persistence/site_data/feature_usage.h",
- "performance_manager/persistence/site_data/leveldb_site_data_store.cc",
- "performance_manager/persistence/site_data/leveldb_site_data_store.h",
- "performance_manager/persistence/site_data/non_recording_site_data_cache.cc",
- "performance_manager/persistence/site_data/non_recording_site_data_cache.h",
- "performance_manager/persistence/site_data/noop_site_data_writer.cc",
- "performance_manager/persistence/site_data/noop_site_data_writer.h",
- "performance_manager/persistence/site_data/site_data_cache.h",
"performance_manager/persistence/site_data/site_data_cache_facade.cc",
"performance_manager/persistence/site_data/site_data_cache_facade.h",
"performance_manager/persistence/site_data/site_data_cache_facade_factory.cc",
"performance_manager/persistence/site_data/site_data_cache_facade_factory.h",
- "performance_manager/persistence/site_data/site_data_cache_factory.cc",
- "performance_manager/persistence/site_data/site_data_cache_factory.h",
- "performance_manager/persistence/site_data/site_data_cache_impl.cc",
- "performance_manager/persistence/site_data/site_data_cache_impl.h",
- "performance_manager/persistence/site_data/site_data_cache_inspector.h",
- "performance_manager/persistence/site_data/site_data_impl.cc",
- "performance_manager/persistence/site_data/site_data_impl.h",
- "performance_manager/persistence/site_data/site_data_reader.cc",
- "performance_manager/persistence/site_data/site_data_reader.h",
- "performance_manager/persistence/site_data/site_data_store.h",
- "performance_manager/persistence/site_data/site_data_writer.cc",
- "performance_manager/persistence/site_data/site_data_writer.h",
- "performance_manager/persistence/site_data/tab_visibility.h",
+ "performance_manager/policies/background_tab_loading_policy.cc",
+ "performance_manager/policies/background_tab_loading_policy.h",
+ "performance_manager/policies/background_tab_loading_policy_helpers.cc",
+ "performance_manager/policies/background_tab_loading_policy_helpers.h",
+ "performance_manager/policies/urgent_page_discarding_policy.cc",
+ "performance_manager/policies/urgent_page_discarding_policy.h",
"permissions/attestation_permission_request.cc",
"permissions/attestation_permission_request.h",
"policy/device_account_initializer.cc",
@@ -3438,8 +3447,6 @@ jumbo_static_library("browser") {
"profile_resetter/triggered_profile_resetter_factory.cc",
"profile_resetter/triggered_profile_resetter_factory.h",
"profile_resetter/triggered_profile_resetter_win.cc",
- "profiles/independent_otr_profile_manager.cc",
- "profiles/independent_otr_profile_manager.h",
"profiles/profile_shortcut_manager.cc",
"profiles/profile_shortcut_manager.h",
"profiles/profile_window.cc",
@@ -3642,6 +3649,10 @@ jumbo_static_library("browser") {
# to extensions
# section?
"speech/extension_api/tts_extension_api_constants.h",
+ "speech/speech_recognition_service.cc",
+ "speech/speech_recognition_service.h",
+ "speech/speech_recognition_service_factory.cc",
+ "speech/speech_recognition_service_factory.h",
"ssl/ssl_client_auth_observer.cc",
"ssl/ssl_client_auth_observer.h",
"status_icons/desktop_notification_balloon.cc",
@@ -3781,7 +3792,9 @@ jumbo_static_library("browser") {
deps += [
":theme_properties",
"//base/util/memory_pressure",
+ "//base/util/timer",
"//chrome/app/vector_icons",
+ "//chrome/browser/enterprise/connectors:connectors_proto",
"//chrome/browser/policy:path_parser",
"//chrome/browser/profile_resetter:profile_reset_report_proto",
"//chrome/browser/resource_coordinator:intervention_policy_database_proto",
@@ -3797,13 +3810,17 @@ jumbo_static_library("browser") {
"//chrome/services/app_service/public/cpp:icon_loader",
"//chrome/services/app_service/public/cpp:intents",
"//chrome/services/app_service/public/cpp:preferred_apps",
+ "//chrome/services/app_service/public/cpp:publisher",
"//chrome/services/sharing/public/cpp",
"//chrome/services/sharing/public/mojom",
+ "//chrome/services/speech:buildflags",
"//components/feedback",
"//components/image_fetcher/core",
"//components/keep_alive_registry",
"//components/ntp_snippets",
+ "//components/schema_org:extractor",
"//components/services/app_service/public/cpp:app_file_handling",
+ "//components/soda:constants",
"//components/vector_icons",
"//components/web_modal",
"//components/zoom",
@@ -3834,18 +3851,23 @@ jumbo_static_library("browser") {
"apps/app_service/built_in_chromeos_apps.h",
"apps/app_service/crostini_apps.cc",
"apps/app_service/crostini_apps.h",
- "apps/app_service/extension_apps.cc",
- "apps/app_service/extension_apps.h",
- "apps/app_service/icon_key_util.cc",
- "apps/app_service/icon_key_util.h",
+ "apps/app_service/extension_apps_chromeos.cc",
+ "apps/app_service/extension_apps_chromeos.h",
+ "apps/app_service/lacros_apps.cc",
+ "apps/app_service/lacros_apps.h",
"apps/app_service/menu_util.cc",
"apps/app_service/menu_util.h",
"apps/app_service/paused_apps.cc",
"apps/app_service/paused_apps.h",
- "apps/app_service/web_apps.cc",
- "apps/app_service/web_apps.h",
+ "apps/app_service/plugin_vm_apps.cc",
+ "apps/app_service/plugin_vm_apps.h",
+ "apps/app_service/uninstall_dialog.cc",
+ "apps/app_service/uninstall_dialog.h",
+ "apps/app_service/web_apps_chromeos.cc",
+ "apps/app_service/web_apps_chromeos.h",
"component_updater/cros_component_installer_chromeos.cc",
"component_updater/cros_component_installer_chromeos.h",
+ "component_updater/cros_component_manager.cc",
"component_updater/cros_component_manager.h",
"component_updater/metadata_table_chromeos.cc",
"component_updater/metadata_table_chromeos.h",
@@ -3925,10 +3947,6 @@ jumbo_static_library("browser") {
"policy/default_geolocation_policy_handler.h",
"renderer_context_menu/quick_answers_menu_observer.cc",
"renderer_context_menu/quick_answers_menu_observer.h",
- "signin/signin_error_notifier_ash.cc",
- "signin/signin_error_notifier_ash.h",
- "signin/signin_error_notifier_factory_ash.cc",
- "signin/signin_error_notifier_factory_ash.h",
"speech/tts_chromeos.cc",
"speech/tts_chromeos.h",
"sync/sync_error_notifier_ash.cc",
@@ -3963,8 +3981,7 @@ jumbo_static_library("browser") {
"//chromeos/components/account_manager",
"//chromeos/components/quick_answers",
"//chromeos/components/sync_wifi",
- "//chromeos/services/assistant/public:feature_flags",
- "//chromeos/services/assistant/public/cpp:prefs",
+ "//chromeos/services/assistant/public/cpp",
"//chromeos/services/cellular_setup",
"//chromeos/services/device_sync/public/mojom",
"//chromeos/services/multidevice_setup",
@@ -4090,10 +4107,6 @@ jumbo_static_library("browser") {
]
}
- if (is_multi_dll_chrome) {
- defines += [ "CHROME_MULTIPLE_DLL_BROWSER" ]
- }
-
if (is_chrome_branded) {
deps += [
"//chrome/browser/win/conflicts:module_list_proto",
@@ -4109,6 +4122,8 @@ jumbo_static_library("browser") {
"google/google_update_policy_fetcher_win.h",
"google/google_update_win.cc",
"google/google_update_win.h",
+ "google/switches.cc",
+ "google/switches.h",
"win/conflicts/incompatible_applications_updater.cc",
"win/conflicts/incompatible_applications_updater.h",
"win/conflicts/installed_applications.cc",
@@ -4192,7 +4207,6 @@ jumbo_static_library("browser") {
}
}
if (use_x11) {
- configs += [ "//build/config/linux:x11" ]
deps += [ "//ui/gfx/x" ]
}
deps += [ "//services/service_manager/zygote" ]
@@ -4201,8 +4215,8 @@ jumbo_static_library("browser") {
deps += [ "//chrome/common/performance_manager/mojom" ]
sources += [
- "performance_manager/graph/policies/dynamic_tcmalloc_policy_linux.cc",
- "performance_manager/graph/policies/dynamic_tcmalloc_policy_linux.h",
+ "performance_manager/policies/dynamic_tcmalloc_policy_linux.cc",
+ "performance_manager/policies/dynamic_tcmalloc_policy_linux.h",
]
}
}
@@ -4401,8 +4415,10 @@ jumbo_static_library("browser") {
"upgrade_detector/upgrade_detector_impl.cc",
"upgrade_detector/upgrade_detector_impl.h",
]
- } else {
+ } else { # is_android || is_chromeos
sources += [
+ "installable/digital_asset_links/digital_asset_links_handler.cc",
+ "installable/digital_asset_links/digital_asset_links_handler.h",
"media/protected_media_identifier_permission_context.cc",
"media/protected_media_identifier_permission_context.h",
]
@@ -4565,9 +4581,6 @@ jumbo_static_library("browser") {
"printing/background_printing_manager.h",
"printing/pdf_nup_converter_client.cc",
"printing/pdf_nup_converter_client.h",
- "printing/print_dialog_cloud.cc",
- "printing/print_dialog_cloud.h",
- "printing/print_dialog_cloud_win.cc",
"printing/print_error_dialog.cc",
"printing/print_error_dialog.h",
"printing/print_preview_context_menu_observer.cc",
@@ -4590,8 +4603,11 @@ jumbo_static_library("browser") {
deps += [ "//components/printing/common:mojo_interfaces" ]
- if (is_posix || is_fuchsia) {
- sources += [ "printing/print_dialog_cloud_posix.cc" ]
+ if (is_win) {
+ sources += [
+ "printing/print_dialog_cloud_win.cc",
+ "printing/print_dialog_cloud_win.h",
+ ]
}
if (!is_chromeos) {
@@ -4663,6 +4679,12 @@ jumbo_static_library("browser") {
"signin/dice_response_handler.h",
"signin/dice_tab_helper.cc",
"signin/dice_tab_helper.h",
+ "signin/dice_web_signin_interceptor.cc",
+ "signin/dice_web_signin_interceptor.h",
+ "signin/dice_web_signin_interceptor_factory.cc",
+ "signin/dice_web_signin_interceptor_factory.h",
+ "signin/logout_tab_helper.cc",
+ "signin/logout_tab_helper.h",
"signin/process_dice_header_delegate_impl.cc",
"signin/process_dice_header_delegate_impl.h",
"signin/signin_util_win.cc",
@@ -4907,12 +4929,16 @@ jumbo_static_library("browser") {
"android/feed/feed_scheduler_bridge.h",
"android/feed/history/feed_history_helper.cc",
"android/feed/history/feed_history_helper.h",
+ "android/feed/v2/background_refresh_task.cc",
+ "android/feed/v2/background_refresh_task.h",
"android/feed/v2/feed_service_bridge.cc",
"android/feed/v2/feed_service_bridge.h",
"android/feed/v2/feed_service_factory.cc",
"android/feed/v2/feed_service_factory.h",
"android/feed/v2/feed_stream_surface.cc",
"android/feed/v2/feed_stream_surface.h",
+ "android/feed/v2/refresh_task_scheduler_impl.cc",
+ "android/feed/v2/refresh_task_scheduler_impl.h",
]
deps += [
"//components/feed/content:feed_content",
@@ -5072,6 +5098,8 @@ jumbo_static_library("browser") {
"offline_pages/android/request_coordinator_bridge.h",
"offline_pages/android/request_coordinator_factory.cc",
]
+
+ deps += [ "//chrome/browser/offline_pages/android:jni_headers" ]
}
public_deps += [
@@ -5421,12 +5449,6 @@ jumbo_static_library("browser") {
"supervised_user/supervised_user_service_management_api_delegate.h",
]
}
- if (is_chromeos) {
- sources += [
- "supervised_user/child_accounts/secondary_account_consent_logger.cc",
- "supervised_user/child_accounts/secondary_account_consent_logger.h",
- ]
- }
if (enable_vr) {
if (enable_gvr_services) {
@@ -5448,25 +5470,11 @@ jumbo_static_library("browser") {
deps += [ "//device/vr/public/mojom" ]
}
- if (!is_android) {
- sources += [
- "vr/service/isolated_device_provider.cc",
- "vr/service/isolated_device_provider.h",
- ]
- }
-
sources += [
"component_updater/vr_assets_component_installer.cc",
"component_updater/vr_assets_component_installer.h",
"vr/chrome_xr_integration_client.cc",
"vr/chrome_xr_integration_client.h",
- "vr/service/browser_xr_runtime_impl.cc",
- "vr/service/browser_xr_runtime_impl.h",
- "vr/service/vr_service_impl.cc",
- "vr/service/vr_service_impl.h",
- "vr/service/xr_runtime_manager_impl.cc",
- "vr/service/xr_runtime_manager_impl.h",
- "vr/xr_runtime_manager_statics.h",
]
deps += [
@@ -5584,6 +5592,10 @@ source_set("active_use_util") {
source_set("theme_properties") {
sources = [ "themes/theme_properties.h" ]
+ deps = [
+ "//skia",
+ "//ui/gfx",
+ ]
}
proto_library("availability_protos") {
@@ -5631,7 +5643,7 @@ grit("resources") {
deps = [
":chrome_internal_resources_gen",
- "//chrome/browser/resources/browser_switch:app_module",
+ "//chrome/browser/resources/browser_switch:web_components",
"//chrome/browser/ui/webui/usb_internals:mojo_bindings_js",
"//device/bluetooth/public/mojom:deprecated_experimental_interfaces_js",
"//device/bluetooth/public/mojom:mojom_js",
@@ -5660,8 +5672,8 @@ grit("resources") {
deps += [
"//chrome/browser/resources/discards:discards_resources_gen",
"//chrome/browser/resources/gaia_auth_host:modulize",
- "//chrome/browser/resources/management:polymer3_elements",
- "//chrome/browser/resources/signin:polymer3_elements",
+ "//chrome/browser/resources/management:web_components",
+ "//chrome/browser/resources/signin:web_components",
"//chrome/browser/ui/webui/discards:mojo_bindings_js",
"//services/resource_coordinator/public/mojom:mojom_js",
]
@@ -5685,7 +5697,7 @@ grit("resources") {
"//chrome/browser/ui/webui/chromeos/crostini_installer:mojo_bindings_js",
"//chrome/browser/ui/webui/chromeos/crostini_upgrader:mojo_bindings_js",
"//chrome/browser/ui/webui/chromeos/machine_learning:mojo_bindings_js",
- "//chrome/browser/ui/webui/settings/chromeos/search:mojo_bindings_js",
+ "//chrome/browser/ui/webui/settings/chromeos:mojom_js",
]
}
@@ -5760,6 +5772,32 @@ source_set("expired_flags_list") {
sources = [ "$root_gen_dir/chrome/browser/expired_flags_list.cc" ]
}
+action("unexpire_flags_gen") {
+ script = "//tools/flags/generate_unexpire_flags.py"
+ inputs = [
+ "//chrome/VERSION",
+ "//tools/flags/generate_unexpire_flags.py",
+ ]
+ outputs = [
+ "$root_gen_dir/chrome/browser/unexpire_flags_gen.cc",
+ "$root_gen_dir/chrome/browser/unexpire_flags_gen.h",
+ "$root_gen_dir/chrome/browser/unexpire_flags_gen.inc",
+ ]
+ args = rebase_path(outputs, root_build_dir)
+}
+
+source_set("unexpire_flags") {
+ deps = [
+ ":unexpire_flags_gen",
+ "//base",
+ ]
+ sources = [
+ "$root_gen_dir/chrome/browser/unexpire_flags_gen.cc",
+ "$root_gen_dir/chrome/browser/unexpire_flags_gen.h",
+ "$root_gen_dir/chrome/browser/unexpire_flags_gen.inc",
+ ]
+}
+
# Use a static library here because many test binaries depend on this but don't
# require many files from it. This makes linking more efficient.
static_library("test_support") {
@@ -5773,30 +5811,12 @@ static_library("test_support") {
"autofill/mock_autofill_popup_controller.h",
"autofill/mock_manual_filling_controller.cc",
"autofill/mock_manual_filling_controller.h",
- "browsing_data/mock_browsing_data_appcache_helper.cc",
- "browsing_data/mock_browsing_data_appcache_helper.h",
- "browsing_data/mock_browsing_data_cache_storage_helper.cc",
- "browsing_data/mock_browsing_data_cache_storage_helper.h",
- "browsing_data/mock_browsing_data_cookie_helper.cc",
- "browsing_data/mock_browsing_data_cookie_helper.h",
- "browsing_data/mock_browsing_data_database_helper.cc",
- "browsing_data/mock_browsing_data_database_helper.h",
- "browsing_data/mock_browsing_data_file_system_helper.cc",
- "browsing_data/mock_browsing_data_file_system_helper.h",
"browsing_data/mock_browsing_data_flash_lso_helper.cc",
"browsing_data/mock_browsing_data_flash_lso_helper.h",
- "browsing_data/mock_browsing_data_indexed_db_helper.cc",
- "browsing_data/mock_browsing_data_indexed_db_helper.h",
- "browsing_data/mock_browsing_data_local_storage_helper.cc",
- "browsing_data/mock_browsing_data_local_storage_helper.h",
"browsing_data/mock_browsing_data_media_license_helper.cc",
"browsing_data/mock_browsing_data_media_license_helper.h",
"browsing_data/mock_browsing_data_quota_helper.cc",
"browsing_data/mock_browsing_data_quota_helper.h",
- "browsing_data/mock_browsing_data_service_worker_helper.cc",
- "browsing_data/mock_browsing_data_service_worker_helper.h",
- "browsing_data/mock_browsing_data_shared_worker_helper.cc",
- "browsing_data/mock_browsing_data_shared_worker_helper.h",
"consent_auditor/consent_auditor_test_utils.cc",
"consent_auditor/consent_auditor_test_utils.h",
"download/download_test_file_activity_observer.cc",
@@ -5807,6 +5827,8 @@ static_library("test_support") {
"installable/fake_installable_manager.h",
"interstitials/security_interstitial_page_test_utils.cc",
"interstitials/security_interstitial_page_test_utils.h",
+ "media/history/media_history_test_utils.cc",
+ "media/history/media_history_test_utils.h",
"media/webrtc/fake_desktop_media_list.cc",
"media/webrtc/fake_desktop_media_list.h",
"media/webrtc/fake_desktop_media_picker_factory.cc",
@@ -5878,6 +5900,7 @@ static_library("test_support") {
"//components/subresource_filter/core/browser:test_support",
"//components/subresource_filter/core/common:test_support",
"//components/sync_preferences:test_support",
+ "//components/translate/content/browser:test_support",
"//components/ukm:test_support",
"//content/test:test_support",
"//google_apis:test_support",
@@ -5941,14 +5964,14 @@ static_library("test_support") {
"chromeos/arc/extensions/fake_arc_support.h",
"chromeos/file_manager/fake_disk_mount_manager.cc",
"chromeos/file_manager/fake_disk_mount_manager.h",
+ "chromeos/input_method/mock_assistive_window_controller.cc",
+ "chromeos/input_method/mock_assistive_window_controller.h",
"chromeos/input_method/mock_candidate_window_controller.cc",
"chromeos/input_method/mock_candidate_window_controller.h",
"chromeos/input_method/mock_input_method_engine.cc",
"chromeos/input_method/mock_input_method_engine.h",
"chromeos/input_method/mock_input_method_manager_impl.cc",
"chromeos/input_method/mock_input_method_manager_impl.h",
- "chromeos/input_method/mock_suggestion_window_controller.cc",
- "chromeos/input_method/mock_suggestion_window_controller.h",
"chromeos/login/screens/mock_device_disabled_screen_view.cc",
"chromeos/login/screens/mock_device_disabled_screen_view.h",
"chromeos/login/session/user_session_manager_test_api.cc",
@@ -6134,3 +6157,14 @@ if (is_android) {
sources = [ "sharing/sharing_metrics.h" ]
}
}
+
+proto_library("reporting_record_proto") {
+ proto_in_dir = "//"
+ sources = [ "policy/messaging_layer/proto/record.proto" ]
+ deps = [ "//components/policy/proto:policy_record_constants" ]
+}
+
+proto_library("status_proto") {
+ sources = [ "policy/messaging_layer/util/status.proto" ]
+ generate_python = false
+}
diff --git a/chromium/chrome/browser/accessibility/accessibility_extension_api.cc b/chromium/chrome/browser/accessibility/accessibility_extension_api.cc
index 5e21242f9c1..528d180500f 100644
--- a/chromium/chrome/browser/accessibility/accessibility_extension_api.cc
+++ b/chromium/chrome/browser/accessibility/accessibility_extension_api.cc
@@ -33,7 +33,6 @@
#include "extensions/common/error_utils.h"
#include "extensions/common/image_util.h"
#include "extensions/common/manifest_handlers/background_info.h"
-#include "services/service_manager/public/cpp/connector.h"
#include "ui/accessibility/accessibility_switches.h"
#include "ui/events/base_event_utils.h"
#include "ui/events/keycodes/keyboard_codes.h"
@@ -46,6 +45,7 @@
#include "ash/public/cpp/window_tree_host_lookup.h"
#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
#include "chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge.h"
+#include "chrome/browser/ui/webui/settings/chromeos/constants/routes_util.h"
#include "ui/aura/window_tree_host.h"
#include "ui/base/ui_base_features.h"
#include "ui/display/display.h"
@@ -87,7 +87,7 @@ AccessibilityPrivateOpenSettingsSubpageFunction::Run() {
#if defined(OS_CHROMEOS)
Profile* profile = chromeos::AccessibilityManager::Get()->profile();
- if (chrome::IsOSSettingsSubPage(params->subpage)) {
+ if (chromeos::settings::IsOSSettingsSubPage(params->subpage)) {
chrome::SettingsWindowManager::GetInstance()->ShowOSSettings(
profile, params->subpage);
}
@@ -127,12 +127,11 @@ AccessibilityPrivateSetFocusRingsFunction::Run() {
return RespondNow(Error("Could not parse hex color"));
}
- if (focus_ring_info.secondary_color) {
- if (!extensions::image_util::ParseHexColorString(
- *(focus_ring_info.secondary_color),
- &(focus_ring->secondary_color))) {
- return RespondNow(Error("Could not parse secondary hex color"));
- }
+ if (focus_ring_info.secondary_color &&
+ !extensions::image_util::ParseHexColorString(
+ *(focus_ring_info.secondary_color),
+ &(focus_ring->secondary_color))) {
+ return RespondNow(Error("Could not parse secondary hex color"));
}
switch (focus_ring_info.type) {
@@ -149,6 +148,13 @@ AccessibilityPrivateSetFocusRingsFunction::Run() {
NOTREACHED();
}
+ if (focus_ring_info.background_color &&
+ !extensions::image_util::ParseHexColorString(
+ *(focus_ring_info.background_color),
+ &(focus_ring->background_color))) {
+ return RespondNow(Error("Could not parse background hex color"));
+ }
+
// Update the touch exploration controller so that synthesized touch events
// are anchored within the focused object.
// NOTE: The final anchor point will be determined by the first rect of the
@@ -415,6 +421,7 @@ AccessibilityPrivateToggleDictationFunction::Run() {
ExtensionFunction::ResponseAction
AccessibilityPrivateSetSwitchAccessMenuStateFunction::Run() {
+ // TODO(anastasi): Remove this function once menu refactor is complete.
std::unique_ptr<accessibility_private::SetSwitchAccessMenuState::Params>
params = accessibility_private::SetSwitchAccessMenuState::Params::Create(
*args_);
@@ -477,6 +484,54 @@ AccessibilityPrivateForwardKeyEventsToSwitchAccessFunction::Run() {
return RespondNow(NoArguments());
}
+ExtensionFunction::ResponseAction
+AccessibilityPrivateUpdateSwitchAccessBubbleFunction::Run() {
+ std::unique_ptr<accessibility_private::UpdateSwitchAccessBubble::Params>
+ params = accessibility_private::UpdateSwitchAccessBubble::Params::Create(
+ *args_);
+ EXTENSION_FUNCTION_VALIDATE(params);
+
+ if (!params->show) {
+ if (params->bubble ==
+ accessibility_private::SWITCH_ACCESS_BUBBLE_BACKBUTTON)
+ ash::AccessibilityController::Get()->HideSwitchAccessBackButton();
+ else if (params->bubble == accessibility_private::SWITCH_ACCESS_BUBBLE_MENU)
+ ash::AccessibilityController::Get()->HideSwitchAccessMenu();
+ return RespondNow(NoArguments());
+ }
+
+ if (!params->anchor)
+ return RespondNow(Error("An anchor rect is required to show a bubble."));
+
+ gfx::Rect anchor(params->anchor->left, params->anchor->top,
+ params->anchor->width, params->anchor->height);
+
+ if (params->bubble ==
+ accessibility_private::SWITCH_ACCESS_BUBBLE_BACKBUTTON) {
+ ash::AccessibilityController::Get()->ShowSwitchAccessBackButton(anchor);
+ return RespondNow(NoArguments());
+ }
+
+ if (!params->actions)
+ return RespondNow(Error("The menu cannot be shown without actions."));
+
+ std::vector<std::string> actions_to_show;
+ for (accessibility_private::SwitchAccessMenuAction extension_action :
+ *(params->actions)) {
+ std::string action = accessibility_private::ToString(extension_action);
+ // Check that this action is not already in our actions list.
+ if (std::find(actions_to_show.begin(), actions_to_show.end(), action) !=
+ actions_to_show.end()) {
+ continue;
+ }
+ actions_to_show.push_back(action);
+ }
+
+ ash::AccessibilityController::Get()->ShowSwitchAccessMenu(anchor,
+ actions_to_show);
+ return RespondNow(NoArguments());
+}
+
AccessibilityPrivateGetBatteryDescriptionFunction::
AccessibilityPrivateGetBatteryDescriptionFunction() {}
diff --git a/chromium/chrome/browser/accessibility/accessibility_extension_api.h b/chromium/chrome/browser/accessibility/accessibility_extension_api.h
index dd8e9d611b2..3601324682a 100644
--- a/chromium/chrome/browser/accessibility/accessibility_extension_api.h
+++ b/chromium/chrome/browser/accessibility/accessibility_extension_api.h
@@ -149,6 +149,15 @@ class AccessibilityPrivateForwardKeyEventsToSwitchAccessFunction
ACCESSIBILITY_PRIVATE_FORWARDKEYEVENTSTOSWITCHACCESS)
};
+// API function that is called to show or hide one of the Switch Access bubbles.
+class AccessibilityPrivateUpdateSwitchAccessBubbleFunction
+ : public ExtensionFunction {
+ ~AccessibilityPrivateUpdateSwitchAccessBubbleFunction() override {}
+ ResponseAction Run() override;
+ DECLARE_EXTENSION_FUNCTION("accessibilityPrivate.updateSwitchAccessBubble",
+ ACCESSIBILITY_PRIVATE_UPDATESWITCHACCESSBUBBLE)
+};
+
// API function that is called to get the device's battery status as a string.
class AccessibilityPrivateGetBatteryDescriptionFunction
: public ExtensionFunction {
diff --git a/chromium/chrome/browser/accessibility/accessibility_extension_api_browsertest.cc b/chromium/chrome/browser/accessibility/accessibility_extension_api_browsertest.cc
index f198952673a..372b0316338 100644
--- a/chromium/chrome/browser/accessibility/accessibility_extension_api_browsertest.cc
+++ b/chromium/chrome/browser/accessibility/accessibility_extension_api_browsertest.cc
@@ -11,6 +11,7 @@
#include "chrome/browser/web_applications/system_web_app_manager.h"
#include "chrome/browser/web_applications/web_app_provider.h"
#include "chrome/common/webui_url_constants.h"
+#include "content/public/test/browser_test.h"
#include "ui/base/ui_base_features.h"
namespace extensions {
diff --git a/chromium/chrome/browser/accessibility/accessibility_labels_service.cc b/chromium/chrome/browser/accessibility/accessibility_labels_service.cc
index 9ed91fa233e..3042678814e 100644
--- a/chromium/chrome/browser/accessibility/accessibility_labels_service.cc
+++ b/chromium/chrome/browser/accessibility/accessibility_labels_service.cc
@@ -6,12 +6,17 @@
#include "base/metrics/histogram_functions.h"
#include "base/no_destructor.h"
+#include "base/strings/string_split.h"
#include "build/build_config.h"
#include "chrome/browser/accessibility/accessibility_state_utils.h"
+#include "chrome/browser/language/url_language_histogram_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/tab_contents/tab_contents_iterator.h"
#include "chrome/common/channel_info.h"
#include "chrome/common/pref_names.h"
+#include "components/language/core/browser/pref_names.h"
+#include "components/language/core/browser/url_language_histogram.h"
+#include "components/language_usage_metrics/language_usage_metrics.h"
#include "components/pref_registry/pref_registry_syncable.h"
#include "components/prefs/pref_service.h"
#include "components/sync_preferences/pref_service_syncable.h"
@@ -30,6 +35,8 @@
#include "chrome/browser/ui/browser_list.h"
#endif
+using LanguageInfo = language::UrlLanguageHistogram::LanguageInfo;
+
namespace {
// Returns the Chrome Google API key for the channel of this build.
@@ -48,7 +55,7 @@ GetImageAnnotatorBinderOverride() {
class ImageAnnotatorClient : public image_annotation::Annotator::Client {
public:
- ImageAnnotatorClient() = default;
+ explicit ImageAnnotatorClient(Profile* profile) : profile_(profile) {}
~ImageAnnotatorClient() override = default;
// image_annotation::Annotator::Client implementation:
@@ -57,7 +64,55 @@ class ImageAnnotatorClient : public image_annotation::Annotator::Client {
data_decoder_.GetService()->BindJsonParser(std::move(receiver));
}
+ std::vector<std::string> GetAcceptLanguages() override {
+ std::vector<std::string> accept_languages;
+ const PrefService* pref_service = profile_->GetPrefs();
+ std::string accept_languages_pref =
+ pref_service->GetString(language::prefs::kAcceptLanguages);
+ for (std::string lang :
+ base::SplitString(accept_languages_pref, ",", base::TRIM_WHITESPACE,
+ base::SPLIT_WANT_NONEMPTY)) {
+ accept_languages.push_back(lang);
+ }
+ return accept_languages;
+ }
+
+ std::vector<std::string> GetTopLanguages() override {
+ // The UrlLanguageHistogram includes the frequency of all languages
+ // of pages the user has visited, and some of these might be rare or
+ // even mistakes. Set a minimum threshold so that we're only returning
+ // languages that account for a nontrivial amount of browsing time.
+ // The purpose of this list is to handle the case where users might
+ // not be setting their accept languages correctly, we want a way to
+ // detect the primary languages a user actually reads.
+ const float kMinTopLanguageFrequency = 0.1;
+
+ std::vector<std::string> top_languages;
+ language::UrlLanguageHistogram* url_language_histogram =
+ UrlLanguageHistogramFactory::GetForBrowserContext(profile_);
+ std::vector<LanguageInfo> language_infos =
+ url_language_histogram->GetTopLanguages();
+ for (const LanguageInfo& info : language_infos) {
+ if (info.frequency >= kMinTopLanguageFrequency)
+ top_languages.push_back(info.language_code);
+ }
+ return top_languages;
+ }
+
+ void RecordLanguageMetrics(const std::string& page_language,
+ const std::string& requested_language) override {
+ base::UmaHistogramSparse(
+ "Accessibility.ImageLabels.PageLanguage",
+ language_usage_metrics::LanguageUsageMetrics::ToLanguageCode(
+ page_language));
+ base::UmaHistogramSparse(
+ "Accessibility.ImageLabels.RequestLanguage",
+ language_usage_metrics::LanguageUsageMetrics::ToLanguageCode(
+ requested_language));
+ }
+
private:
+ Profile* const profile_;
data_decoder::DataDecoder data_decoder_;
DISALLOW_COPY_AND_ASSIGN(ImageAnnotatorClient);
@@ -103,7 +158,7 @@ void AccessibilityLabelsService::Init() {
// Log whether the feature is enabled after startup. This must be run on the
// UI thread because it accesses prefs.
content::BrowserAccessibilityState::GetInstance()
- ->AddUIThreadHistogramCallback(base::BindRepeating(
+ ->AddUIThreadHistogramCallback(base::BindOnce(
&AccessibilityLabelsService::UpdateAccessibilityLabelsHistograms,
weak_factory_.GetWeakPtr()));
}
@@ -161,7 +216,7 @@ void AccessibilityLabelsService::BindImageAnnotator(
service_ = std::make_unique<image_annotation::ImageAnnotationService>(
std::move(service_receiver), APIKeyForChannel(),
profile_->GetURLLoaderFactory(),
- std::make_unique<ImageAnnotatorClient>());
+ std::make_unique<ImageAnnotatorClient>(profile_));
}
}
diff --git a/chromium/chrome/browser/accessibility/accessibility_labels_service_browsertest.cc b/chromium/chrome/browser/accessibility/accessibility_labels_service_browsertest.cc
index 032e71ce283..427af46de12 100644
--- a/chromium/chrome/browser/accessibility/accessibility_labels_service_browsertest.cc
+++ b/chromium/chrome/browser/accessibility/accessibility_labels_service_browsertest.cc
@@ -13,6 +13,7 @@
#include "components/prefs/pref_service.h"
#include "content/public/browser/browser_accessibility_state.h"
#include "content/public/common/content_features.h"
+#include "content/public/test/browser_test.h"
#if defined(OS_CHROMEOS)
#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
#else
diff --git a/chromium/chrome/browser/accessibility/accessibility_permission_context.cc b/chromium/chrome/browser/accessibility/accessibility_permission_context.cc
index 6c3a12172a3..ce2689e3c5b 100644
--- a/chromium/chrome/browser/accessibility/accessibility_permission_context.cc
+++ b/chromium/chrome/browser/accessibility/accessibility_permission_context.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "chrome/browser/accessibility/accessibility_permission_context.h"
+#include "third_party/blink/public/mojom/feature_policy/feature_policy.mojom.h"
AccessibilityPermissionContext::AccessibilityPermissionContext(
content::BrowserContext* browser_context)
diff --git a/chromium/chrome/browser/accessibility/browser_accessibility_state_browsertest.cc b/chromium/chrome/browser/accessibility/browser_accessibility_state_browsertest.cc
index 7409f422aff..88276dbb1c3 100644
--- a/chromium/chrome/browser/accessibility/browser_accessibility_state_browsertest.cc
+++ b/chromium/chrome/browser/accessibility/browser_accessibility_state_browsertest.cc
@@ -6,6 +6,7 @@
#include "build/build_config.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "content/public/browser/browser_accessibility_state.h"
+#include "content/public/test/browser_test.h"
namespace content {
diff --git a/chromium/chrome/browser/accessibility/caption_controller.cc b/chromium/chrome/browser/accessibility/caption_controller.cc
new file mode 100644
index 00000000000..b18fa01155d
--- /dev/null
+++ b/chromium/chrome/browser/accessibility/caption_controller.cc
@@ -0,0 +1,190 @@
+// Copyright (c) 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/accessibility/caption_controller.h"
+
+#include <string>
+
+#include "base/bind.h"
+#include "base/feature_list.h"
+#include "base/metrics/histogram_functions.h"
+#include "chrome/browser/accessibility/caption_util.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/component_updater/soda_component_installer.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_finder.h"
+#include "chrome/browser/ui/browser_list.h"
+#include "chrome/browser/ui/caption_bubble_controller.h"
+#include "chrome/common/pref_names.h"
+#include "components/pref_registry/pref_registry_syncable.h"
+#include "components/prefs/pref_change_registrar.h"
+#include "components/sync_preferences/pref_service_syncable.h"
+#include "content/public/browser/browser_accessibility_state.h"
+#include "content/public/browser/web_contents.h"
+#include "media/base/media_switches.h"
+
+namespace {
+
+const char* const kCaptionStylePrefsToObserve[] = {
+ prefs::kAccessibilityCaptionsTextSize,
+ prefs::kAccessibilityCaptionsTextFont,
+ prefs::kAccessibilityCaptionsTextColor,
+ prefs::kAccessibilityCaptionsTextOpacity,
+ prefs::kAccessibilityCaptionsBackgroundColor,
+ prefs::kAccessibilityCaptionsTextShadow,
+ prefs::kAccessibilityCaptionsBackgroundOpacity};
+
+} // namespace
+
+namespace captions {
+
+CaptionController::CaptionController(Profile* profile) : profile_(profile) {}
+
+CaptionController::~CaptionController() = default;
+
+// static
+void CaptionController::RegisterProfilePrefs(
+ user_prefs::PrefRegistrySyncable* registry) {
+ registry->RegisterBooleanPref(
+ prefs::kLiveCaptionEnabled, false,
+ user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
+ registry->RegisterFilePathPref(prefs::kSODAPath, base::FilePath());
+}
+
+// static
+void CaptionController::InitOffTheRecordPrefs(Profile* off_the_record_profile) {
+ DCHECK(off_the_record_profile->IsOffTheRecord());
+ off_the_record_profile->GetPrefs()->SetBoolean(prefs::kLiveCaptionEnabled,
+ false);
+ off_the_record_profile->GetPrefs()->SetFilePath(prefs::kSODAPath,
+ base::FilePath());
+}
+
+void CaptionController::Init() {
+ // Hidden behind a feature flag.
+ if (!base::FeatureList::IsEnabled(media::kLiveCaption))
+ return;
+
+ pref_change_registrar_ = std::make_unique<PrefChangeRegistrar>();
+ pref_change_registrar_->Init(profile_->GetPrefs());
+ pref_change_registrar_->Add(
+ prefs::kLiveCaptionEnabled,
+ base::BindRepeating(&CaptionController::OnLiveCaptionEnabledChanged,
+ base::Unretained(this)));
+
+ enabled_ = IsLiveCaptionEnabled();
+ if (enabled_)
+ UpdateUIEnabled();
+
+ content::BrowserAccessibilityState::GetInstance()
+ ->AddUIThreadHistogramCallback(base::BindOnce(
+ &CaptionController::UpdateAccessibilityCaptionHistograms,
+ base::Unretained(this)));
+}
+
+void CaptionController::OnLiveCaptionEnabledChanged() {
+ bool enabled = IsLiveCaptionEnabled();
+ if (enabled == enabled_)
+ return;
+ enabled_ = enabled;
+
+ UpdateSpeechRecognitionServiceEnabled();
+ UpdateUIEnabled();
+}
+
+bool CaptionController::IsLiveCaptionEnabled() {
+ PrefService* profile_prefs = profile_->GetPrefs();
+ return profile_prefs->GetBoolean(prefs::kLiveCaptionEnabled);
+}
+
+void CaptionController::UpdateSpeechRecognitionServiceEnabled() {
+ if (enabled_) {
+ // Register SODA component and download speech model.
+ component_updater::RegisterSODAComponent(
+ g_browser_process->component_updater(), profile_->GetPrefs(),
+ base::BindOnce(&component_updater::SODAComponentInstallerPolicy::
+ UpdateSODAComponentOnDemand));
+ } else {
+ // TODO(evliu): Unregister SODA component.
+ }
+}
+
+void CaptionController::UpdateUIEnabled() {
+ if (enabled_) {
+ // Create captions UI in each browser view.
+ for (Browser* browser : *BrowserList::GetInstance()) {
+ OnBrowserAdded(browser);
+ }
+
+ // Add observers to the BrowserList for new browser views being added.
+ BrowserList::GetInstance()->AddObserver(this);
+
+ // Observe caption style prefs.
+ for (const char* const pref_name : kCaptionStylePrefsToObserve) {
+ pref_change_registrar_->Add(
+ pref_name, base::BindRepeating(&CaptionController::UpdateCaptionStyle,
+ base::Unretained(this)));
+ }
+ UpdateCaptionStyle();
+ } else {
+ // Destroy caption bubble controllers.
+ caption_bubble_controllers_.clear();
+
+ // Remove observers.
+ BrowserList::GetInstance()->RemoveObserver(this);
+
+ // Remove prefs to observe.
+ for (const char* const pref_name : kCaptionStylePrefsToObserve) {
+ pref_change_registrar_->Remove(pref_name);
+ }
+ }
+}
+
+void CaptionController::UpdateAccessibilityCaptionHistograms() {
+ base::UmaHistogramBoolean("Accessibility.LiveCaptions", enabled_);
+}
+
+void CaptionController::OnBrowserAdded(Browser* browser) {
+ if (browser->profile() != profile_)
+ return;
+
+ caption_bubble_controllers_[browser] =
+ CaptionBubbleController::Create(browser);
+ caption_bubble_controllers_[browser]->UpdateCaptionStyle(caption_style_);
+}
+
+void CaptionController::OnBrowserRemoved(Browser* browser) {
+ if (browser->profile() != profile_)
+ return;
+
+ DCHECK(caption_bubble_controllers_.count(browser));
+ caption_bubble_controllers_.erase(browser);
+}
+
+void CaptionController::DispatchTranscription(
+ content::WebContents* web_contents,
+ const chrome::mojom::TranscriptionResultPtr& transcription_result) {
+ Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
+ if (!browser)
+ return;
+ if (!caption_bubble_controllers_.count(browser))
+ return;
+ caption_bubble_controllers_[browser]->OnTranscription(transcription_result,
+ web_contents);
+}
+
+void CaptionController::UpdateCaptionStyle() {
+ PrefService* profile_prefs = profile_->GetPrefs();
+ // Metrics are recorded when passing the caption prefs to the browser, so do
+ // not duplicate them here.
+ caption_style_ = GetCaptionStyleFromUserSettings(profile_prefs,
+ false /* record_metrics */);
+
+ for (const auto& item : caption_bubble_controllers_) {
+ caption_bubble_controllers_[item.first]->UpdateCaptionStyle(caption_style_);
+ }
+}
+
+} // namespace captions
diff --git a/chromium/chrome/browser/accessibility/caption_controller.h b/chromium/chrome/browser/accessibility/caption_controller.h
new file mode 100644
index 00000000000..78e3ee77cdf
--- /dev/null
+++ b/chromium/chrome/browser/accessibility/caption_controller.h
@@ -0,0 +1,108 @@
+// Copyright (c) 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_ACCESSIBILITY_CAPTION_CONTROLLER_H_
+#define CHROME_BROWSER_ACCESSIBILITY_CAPTION_CONTROLLER_H_
+
+#include <memory>
+#include <string>
+#include <unordered_map>
+
+#include "chrome/browser/ui/browser_list_observer.h"
+#include "chrome/common/caption.mojom.h"
+#include "components/keyed_service/core/keyed_service.h"
+#include "ui/native_theme/caption_style.h"
+
+class Browser;
+class Profile;
+class PrefChangeRegistrar;
+
+namespace content {
+class WebContents;
+}
+
+namespace user_prefs {
+class PrefRegistrySyncable;
+}
+
+namespace captions {
+
+class CaptionBubbleController;
+
+///////////////////////////////////////////////////////////////////////////////
+// Caption Controller
+//
+// The controller of the live caption feature. It enables the captioning
+// service when the preference is enabled. The caption controller is a
+// KeyedService and BrowserListObserver. There exists one caption controller
+// per profile and it lasts for the duration of the session. The caption
+// controller owns the live caption UI, which are caption bubble controllers.
+//
+class CaptionController : public BrowserListObserver, public KeyedService {
+ public:
+ // These values are persisted to logs. Entries should not be renumbered and
+ // numeric values should never be reused. These should be the same as
+ // LiveCaptionsSessionEvent in enums.xml.
+ enum class SessionEvent {
+ // We began receiving captions for an audio stream.
+ kStreamStarted = 0,
+ // The audio stream ended, meaning no more captions will be received on that
+ // stream.
+ kStreamEnded = 1,
+ // The close button was clicked, so we stopped listening to an audio stream.
+ kCloseButtonClicked = 2,
+ kMaxValue = kCloseButtonClicked,
+ };
+
+ explicit CaptionController(Profile* profile);
+ ~CaptionController() override;
+ CaptionController(const CaptionController&) = delete;
+ CaptionController& operator=(const CaptionController&) = delete;
+
+ static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
+
+ // Off the record profiles will default to having the feature disabled.
+ static void InitOffTheRecordPrefs(Profile* off_the_record_profile);
+
+ void Init();
+
+ // Routes a transcription to the CaptionBubbleController that belongs to the
+ // appropriate browser.
+ void DispatchTranscription(
+ content::WebContents* web_contents,
+ const chrome::mojom::TranscriptionResultPtr& transcription_result);
+
+ private:
+ friend class CaptionControllerFactory;
+
+ // BrowserListObserver:
+ void OnBrowserAdded(Browser* browser) override;
+ void OnBrowserRemoved(Browser* browser) override;
+
+ void OnLiveCaptionEnabledChanged();
+ bool IsLiveCaptionEnabled();
+ void UpdateSpeechRecognitionServiceEnabled();
+ void UpdateUIEnabled();
+ void UpdateCaptionStyle();
+
+ void UpdateAccessibilityCaptionHistograms();
+
+ // Owns us via the KeyedService mechanism.
+ Profile* profile_;
+
+ std::unique_ptr<PrefChangeRegistrar> pref_change_registrar_;
+
+ // A map of Browsers using this profile to CaptionBubbleControllers anchored
+ // to the browser.
+ std::unordered_map<Browser*, std::unique_ptr<CaptionBubbleController>>
+ caption_bubble_controllers_;
+
+ base::Optional<ui::CaptionStyle> caption_style_;
+
+ bool enabled_ = false;
+};
+
+} // namespace captions
+
+#endif // CHROME_BROWSER_ACCESSIBILITY_CAPTION_CONTROLLER_H_
diff --git a/chromium/chrome/browser/accessibility/caption_controller_factory.cc b/chromium/chrome/browser/accessibility/caption_controller_factory.cc
new file mode 100644
index 00000000000..7a623f659d7
--- /dev/null
+++ b/chromium/chrome/browser/accessibility/caption_controller_factory.cc
@@ -0,0 +1,51 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/accessibility/caption_controller_factory.h"
+
+#include "build/build_config.h"
+#include "chrome/browser/accessibility/caption_controller.h"
+#include "chrome/browser/profiles/incognito_helpers.h"
+#include "chrome/browser/profiles/profile.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+
+namespace captions {
+
+// static
+CaptionController* CaptionControllerFactory::GetForProfile(Profile* profile) {
+ return static_cast<CaptionController*>(
+ GetInstance()->GetServiceForBrowserContext(profile, true));
+}
+
+// static
+CaptionController* CaptionControllerFactory::GetForProfileIfExists(
+ Profile* profile) {
+ return static_cast<CaptionController*>(
+ GetInstance()->GetServiceForBrowserContext(profile, /*create=*/false));
+}
+
+// static
+CaptionControllerFactory* CaptionControllerFactory::GetInstance() {
+ static base::NoDestructor<CaptionControllerFactory> factory;
+ return factory.get();
+}
+
+CaptionControllerFactory::CaptionControllerFactory()
+ : BrowserContextKeyedServiceFactory(
+ "CaptionController",
+ BrowserContextDependencyManager::GetInstance()) {}
+
+CaptionControllerFactory::~CaptionControllerFactory() = default;
+
+content::BrowserContext* CaptionControllerFactory::GetBrowserContextToUse(
+ content::BrowserContext* context) const {
+ return chrome::GetBrowserContextRedirectedInIncognito(context);
+}
+
+KeyedService* CaptionControllerFactory::BuildServiceInstanceFor(
+ content::BrowserContext* context) const {
+ return new CaptionController(Profile::FromBrowserContext(context));
+}
+
+} // namespace captions
diff --git a/chromium/chrome/browser/accessibility/caption_controller_factory.h b/chromium/chrome/browser/accessibility/caption_controller_factory.h
new file mode 100644
index 00000000000..1caf078e763
--- /dev/null
+++ b/chromium/chrome/browser/accessibility/caption_controller_factory.h
@@ -0,0 +1,41 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_ACCESSIBILITY_CAPTION_CONTROLLER_FACTORY_H_
+#define CHROME_BROWSER_ACCESSIBILITY_CAPTION_CONTROLLER_FACTORY_H_
+
+#include "base/no_destructor.h"
+#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+
+class Profile;
+
+namespace captions {
+
+class CaptionController;
+
+// Factory to get or create an instance of CaptionController from a Profile.
+class CaptionControllerFactory : public BrowserContextKeyedServiceFactory {
+ public:
+ static CaptionController* GetForProfile(Profile* profile);
+
+ static CaptionController* GetForProfileIfExists(Profile* profile);
+
+ static CaptionControllerFactory* GetInstance();
+
+ private:
+ friend base::NoDestructor<CaptionControllerFactory>;
+
+ CaptionControllerFactory();
+ ~CaptionControllerFactory() override;
+
+ // BrowserContextKeyedServiceFactory:
+ content::BrowserContext* GetBrowserContextToUse(
+ content::BrowserContext* context) const override;
+ KeyedService* BuildServiceInstanceFor(
+ content::BrowserContext* profile) const override;
+};
+
+} // namespace captions
+
+#endif // CHROME_BROWSER_ACCESSIBILITY_CAPTION_CONTROLLER_FACTORY_H_
diff --git a/chromium/chrome/browser/accessibility/caption_host_impl.cc b/chromium/chrome/browser/accessibility/caption_host_impl.cc
new file mode 100644
index 00000000000..f16d93d566a
--- /dev/null
+++ b/chromium/chrome/browser/accessibility/caption_host_impl.cc
@@ -0,0 +1,65 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/accessibility/caption_host_impl.h"
+
+#include <memory>
+#include <utility>
+
+#include "chrome/browser/accessibility/caption_controller.h"
+#include "chrome/browser/accessibility/caption_controller_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/web_contents.h"
+#include "mojo/public/cpp/bindings/self_owned_receiver.h"
+
+namespace captions {
+
+// static
+void CaptionHostImpl::Create(
+ content::RenderFrameHost* frame_host,
+ mojo::PendingReceiver<chrome::mojom::CaptionHost> receiver) {
+ mojo::MakeSelfOwnedReceiver(std::make_unique<CaptionHostImpl>(frame_host),
+ std::move(receiver));
+}
+
+CaptionHostImpl::CaptionHostImpl(content::RenderFrameHost* frame_host)
+ : frame_host_(frame_host) {
+ if (!frame_host_)
+ return;
+ content::WebContents* web_contents =
+ content::WebContents::FromRenderFrameHost(frame_host_);
+ if (!web_contents) {
+ frame_host_ = nullptr;
+ return;
+ }
+ Observe(web_contents);
+}
+
+CaptionHostImpl::~CaptionHostImpl() = default;
+
+void CaptionHostImpl::OnTranscription(
+ chrome::mojom::TranscriptionResultPtr transcription_result) {
+ if (!frame_host_)
+ return;
+ content::WebContents* web_contents =
+ content::WebContents::FromRenderFrameHost(frame_host_);
+ if (!web_contents) {
+ frame_host_ = nullptr;
+ return;
+ }
+ Profile* profile =
+ Profile::FromBrowserContext(web_contents->GetBrowserContext());
+ if (!profile)
+ return;
+ CaptionControllerFactory::GetForProfile(profile)->DispatchTranscription(
+ web_contents, transcription_result);
+}
+
+void CaptionHostImpl::RenderFrameDeleted(content::RenderFrameHost* frame_host) {
+ if (frame_host == frame_host_)
+ frame_host_ = nullptr;
+}
+
+} // namespace captions
diff --git a/chromium/chrome/browser/accessibility/caption_host_impl.h b/chromium/chrome/browser/accessibility/caption_host_impl.h
new file mode 100644
index 00000000000..0445179620f
--- /dev/null
+++ b/chromium/chrome/browser/accessibility/caption_host_impl.h
@@ -0,0 +1,52 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_ACCESSIBILITY_CAPTION_HOST_IMPL_H_
+#define CHROME_BROWSER_ACCESSIBILITY_CAPTION_HOST_IMPL_H_
+
+#include <string>
+
+#include "chrome/common/caption.mojom.h"
+#include "content/public/browser/web_contents_observer.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+
+namespace content {
+class RenderFrameHost;
+}
+
+namespace captions {
+
+///////////////////////////////////////////////////////////////////////////////
+// Caption Host Impl
+//
+// A class that implements the Mojo interface CaptionHost. There exists one
+// CaptionHostImpl per render frame.
+//
+class CaptionHostImpl : public chrome::mojom::CaptionHost,
+ public content::WebContentsObserver {
+ public:
+ explicit CaptionHostImpl(content::RenderFrameHost* frame_host);
+ CaptionHostImpl(const CaptionHostImpl&) = delete;
+ CaptionHostImpl& operator=(const CaptionHostImpl&) = delete;
+ ~CaptionHostImpl() override;
+
+ // static
+ static void Create(
+ content::RenderFrameHost* frame_host,
+ mojo::PendingReceiver<chrome::mojom::CaptionHost> receiver);
+
+ // chrome::mojom::CaptionHost:
+ void OnTranscription(
+ chrome::mojom::TranscriptionResultPtr transcription_result) override;
+
+ // content::WebContentsObserver:
+ void RenderFrameDeleted(content::RenderFrameHost* frame_host) override;
+
+ private:
+ content::RenderFrameHost* frame_host_;
+};
+
+} // namespace captions
+
+#endif // CHROME_BROWSER_ACCESSIBILITY_CAPTION_HOST_IMPL_H_
diff --git a/chromium/chrome/browser/accessibility/caption_util.cc b/chromium/chrome/browser/accessibility/caption_util.cc
new file mode 100644
index 00000000000..64508bf00c6
--- /dev/null
+++ b/chromium/chrome/browser/accessibility/caption_util.cc
@@ -0,0 +1,66 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/accessibility/caption_util.h"
+
+#include "base/command_line.h"
+#include "base/metrics/histogram_functions.h"
+#include "chrome/common/pref_names_util.h"
+#include "components/prefs/pref_service.h"
+#include "ui/base/ui_base_switches.h"
+#include "ui/native_theme/native_theme.h"
+
+namespace {
+
+// Returns whether the style is default or not. If the user has changed any of
+// the captions settings from the default value, that is an interesting metric
+// to observe.
+bool IsDefaultStyle(base::Optional<ui::CaptionStyle> style) {
+ return (style.has_value() && style->text_size.empty() &&
+ style->font_family.empty() && style->text_color.empty() &&
+ style->background_color.empty() && style->text_shadow.empty());
+}
+
+} // namespace
+
+namespace captions {
+
+base::Optional<ui::CaptionStyle> GetCaptionStyleFromUserSettings(
+ PrefService* prefs,
+ bool record_metrics) {
+ // Apply native CaptionStyle parameters.
+ base::Optional<ui::CaptionStyle> style;
+
+ // Apply native CaptionStyle parameters.
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+ ::switches::kForceCaptionStyle)) {
+ style = ui::CaptionStyle::FromSpec(
+ base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+ switches::kForceCaptionStyle));
+ }
+
+ // Apply system caption style.
+ if (!style) {
+ ui::NativeTheme* native_theme = ui::NativeTheme::GetInstanceForWeb();
+ style = native_theme->GetSystemCaptionStyle();
+ if (record_metrics && style.has_value()) {
+ base::UmaHistogramBoolean(
+ "Accessibility.CaptionSettingsLoadedFromSystemSettings",
+ !IsDefaultStyle(style));
+ }
+ }
+
+ // Apply caption style from preferences if system caption style is undefined.
+ if (!style) {
+ style = pref_names_util::GetCaptionStyleFromPrefs(prefs);
+ if (record_metrics && style.has_value()) {
+ base::UmaHistogramBoolean("Accessibility.CaptionSettingsLoadedFromPrefs",
+ !IsDefaultStyle(style));
+ }
+ }
+
+ return style;
+}
+
+} // namespace captions
diff --git a/chromium/chrome/browser/accessibility/caption_util.h b/chromium/chrome/browser/accessibility/caption_util.h
new file mode 100644
index 00000000000..dfce8d600e5
--- /dev/null
+++ b/chromium/chrome/browser/accessibility/caption_util.h
@@ -0,0 +1,20 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_ACCESSIBILITY_CAPTION_UTIL_H_
+#define CHROME_BROWSER_ACCESSIBILITY_CAPTION_UTIL_H_
+
+#include "ui/native_theme/caption_style.h"
+
+class PrefService;
+
+namespace captions {
+
+base::Optional<ui::CaptionStyle> GetCaptionStyleFromUserSettings(
+ PrefService* prefs,
+ bool record_metrics);
+
+} // namespace captions
+
+#endif // CHROME_BROWSER_ACCESSIBILITY_CAPTION_UTIL_H_
diff --git a/chromium/chrome/browser/accessibility/image_annotation_browsertest.cc b/chromium/chrome/browser/accessibility/image_annotation_browsertest.cc
index b4dd6e1dcca..e979f31f2e4 100644
--- a/chromium/chrome/browser/accessibility/image_annotation_browsertest.cc
+++ b/chromium/chrome/browser/accessibility/image_annotation_browsertest.cc
@@ -3,8 +3,8 @@
// found in the LICENSE file.
#include "base/bind_helpers.h"
+#include "base/check.h"
#include "base/feature_list.h"
-#include "base/logging.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "base/test/scoped_feature_list.h"
@@ -21,6 +21,7 @@
#include "components/user_prefs/user_prefs.h"
#include "content/public/browser/browser_context.h"
#include "content/public/common/content_features.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/content_browser_test_utils.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
diff --git a/chromium/chrome/browser/accessibility/interstitial_accessibility_browsertest.cc b/chromium/chrome/browser/accessibility/interstitial_accessibility_browsertest.cc
index 9a4d4fd4260..770fb04793e 100644
--- a/chromium/chrome/browser/accessibility/interstitial_accessibility_browsertest.cc
+++ b/chromium/chrome/browser/accessibility/interstitial_accessibility_browsertest.cc
@@ -9,8 +9,8 @@
#include "components/security_interstitials/content/security_interstitial_tab_helper.h"
#include "components/security_interstitials/content/ssl_blocking_page.h"
#include "components/security_interstitials/core/controller_client.h"
-#include "content/public/browser/interstitial_page.h"
#include "content/public/browser/navigation_entry.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
diff --git a/chromium/chrome/browser/android/examples/custom_tabs_client/BUILD.gn b/chromium/chrome/browser/android/examples/custom_tabs_client/BUILD.gn
new file mode 100644
index 00000000000..7b21ce518fd
--- /dev/null
+++ b/chromium/chrome/browser/android/examples/custom_tabs_client/BUILD.gn
@@ -0,0 +1,79 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/android/rules.gni")
+
+android_resources("chrome_tabs_client_example_apk_resources") {
+ sources = [
+ "src/res/anim/slide_in_left.xml",
+ "src/res/anim/slide_in_right.xml",
+ "src/res/anim/slide_out_left.xml",
+ "src/res/anim/slide_out_right.xml",
+ "src/res/drawable-hdpi/cover.jpg",
+ "src/res/drawable-hdpi/ic_arrow_back.png",
+ "src/res/drawable-hdpi/ic_launcher.png",
+ "src/res/drawable-hdpi/ic_notification_icon.png",
+ "src/res/drawable-hdpi/ic_play.png",
+ "src/res/drawable-hdpi/ic_share.png",
+ "src/res/drawable-hdpi/ic_stop.png",
+ "src/res/drawable-mdpi/cover.jpg",
+ "src/res/drawable-mdpi/ic_arrow_back.png",
+ "src/res/drawable-mdpi/ic_launcher.png",
+ "src/res/drawable-mdpi/ic_notification_icon.png",
+ "src/res/drawable-mdpi/ic_play.png",
+ "src/res/drawable-mdpi/ic_share.png",
+ "src/res/drawable-mdpi/ic_stop.png",
+ "src/res/drawable-xhdpi/cover.jpg",
+ "src/res/drawable-xhdpi/ic_arrow_back.png",
+ "src/res/drawable-xhdpi/ic_launcher.png",
+ "src/res/drawable-xhdpi/ic_notification_icon.png",
+ "src/res/drawable-xhdpi/ic_play.png",
+ "src/res/drawable-xhdpi/ic_share.png",
+ "src/res/drawable-xhdpi/ic_stop.png",
+ "src/res/drawable-xxhdpi/cover.jpg",
+ "src/res/drawable-xxhdpi/ic_arrow_back.png",
+ "src/res/drawable-xxhdpi/ic_launcher.png",
+ "src/res/drawable-xxhdpi/ic_notification_icon.png",
+ "src/res/drawable-xxhdpi/ic_play.png",
+ "src/res/drawable-xxhdpi/ic_share.png",
+ "src/res/drawable-xxhdpi/ic_stop.png",
+ "src/res/drawable-xxxhdpi/ic_arrow_back.png",
+ "src/res/drawable-xxxhdpi/ic_launcher.png",
+ "src/res/drawable-xxxhdpi/ic_share.png",
+ "src/res/layout/main.xml",
+ "src/res/layout/remote_view.xml",
+ "src/res/raw/amazing_grace.mp3",
+ "src/res/values/strings.xml",
+ ]
+ android_manifest = "src/AndroidManifest.xml"
+ custom_package = "org.chromium.customtabsclient"
+ deps = [ "//third_party/android_deps:android_support_v7_appcompat_java" ]
+}
+
+android_apk("custom_tabs_client_example_apk") {
+ sources = [
+ "src/java/org/chromium/customtabsclient/BottomBarManager.java",
+ "src/java/org/chromium/customtabsclient/BrowserActionsReceiver.java",
+ "src/java/org/chromium/customtabsclient/MainActivity.java",
+ "src/java/org/chromium/customtabsclient/SessionHelper.java",
+ "src/java/org/chromium/customtabsclient/shared/CustomTabsHelper.java",
+ "src/java/org/chromium/customtabsclient/shared/KeepAliveService.java",
+ "src/java/org/chromium/customtabsclient/shared/ServiceConnection.java",
+ "src/java/org/chromium/customtabsclient/shared/ServiceConnectionCallback.java",
+ ]
+
+ android_manifest = "src/AndroidManifest.xml"
+ min_sdk_version = 19
+ target_sdk_version = 21
+ apk_name = "CustomTabsClientExample"
+
+ deps = [
+ ":chrome_tabs_client_example_apk_resources",
+ "//third_party/android_deps:android_support_v7_appcompat_java",
+ "//third_party/android_deps:androidx_annotation_annotation_java",
+ "//third_party/android_deps:androidx_appcompat_appcompat_java",
+ "//third_party/android_deps:androidx_lifecycle_lifecycle_common_java",
+ "//third_party/android_sdk/androidx_browser:androidx_browser_java",
+ ]
+}
diff --git a/chromium/chrome/browser/android/examples/partner_browser_customizations_provider/BUILD.gn b/chromium/chrome/browser/android/examples/partner_browser_customizations_provider/BUILD.gn
new file mode 100644
index 00000000000..632b822acc1
--- /dev/null
+++ b/chromium/chrome/browser/android/examples/partner_browser_customizations_provider/BUILD.gn
@@ -0,0 +1,29 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/android/rules.gni")
+
+android_resources("partner_browser_customizations_example_apk_resources") {
+ sources = [
+ "res/values/bookmarks_icons.xml",
+ "res/values/strings.xml",
+ ]
+ android_manifest = "AndroidManifest.xml"
+ custom_package = "org.chromium.example.partnercustomizations"
+}
+
+android_apk("partner_browser_customizations_example_apk") {
+ skip_jetify = true
+ sources = [
+ "src/org/chromium/example/partnercustomizations/PartnerBookmarksProviderExample.java",
+ "src/org/chromium/example/partnercustomizations/PartnerBrowserCustomizationsProviderExample.java",
+ ]
+ android_manifest = "AndroidManifest.xml"
+ min_sdk_version = 21
+ target_sdk_version = 21
+ apk_name = "PartnerCustomizationProviderExample"
+ deps = [ ":partner_browser_customizations_example_apk_resources" ]
+ chromium_code = false
+ never_incremental = true
+}
diff --git a/chromium/chrome/browser/android/lifecycle/BUILD.gn b/chromium/chrome/browser/android/lifecycle/BUILD.gn
index 77d91994cbd..2a8417d6595 100644
--- a/chromium/chrome/browser/android/lifecycle/BUILD.gn
+++ b/chromium/chrome/browser/android/lifecycle/BUILD.gn
@@ -15,6 +15,7 @@ android_library("java") {
"java/src/org/chromium/chrome/browser/lifecycle/LifecycleObserver.java",
"java/src/org/chromium/chrome/browser/lifecycle/NativeInitObserver.java",
"java/src/org/chromium/chrome/browser/lifecycle/PauseResumeWithNativeObserver.java",
+ "java/src/org/chromium/chrome/browser/lifecycle/RecreateObserver.java",
"java/src/org/chromium/chrome/browser/lifecycle/SaveInstanceStateObserver.java",
"java/src/org/chromium/chrome/browser/lifecycle/StartStopWithNativeObserver.java",
"java/src/org/chromium/chrome/browser/lifecycle/WindowFocusChangedObserver.java",
diff --git a/chromium/chrome/browser/android/metrics/BUILD.gn b/chromium/chrome/browser/android/metrics/BUILD.gn
index d79c9ffb7ea..2a7b9c608d0 100644
--- a/chromium/chrome/browser/android/metrics/BUILD.gn
+++ b/chromium/chrome/browser/android/metrics/BUILD.gn
@@ -38,6 +38,7 @@ if (is_android) {
":ukm_java_test_support",
"//base:base_java_test_support",
"//chrome/android:chrome_java",
+ "//chrome/browser/tab:java",
"//chrome/test/android:chrome_java_test_support",
"//components/metrics:metrics_java",
"//content/public/test/android:content_java_test_support",
diff --git a/chromium/chrome/browser/android/vr/BUILD.gn b/chromium/chrome/browser/android/vr/BUILD.gn
index 34d55fd50dc..a37a2b7ea44 100644
--- a/chromium/chrome/browser/android/vr/BUILD.gn
+++ b/chromium/chrome/browser/android/vr/BUILD.gn
@@ -126,6 +126,7 @@ static_library("vr_android") {
"//content/public/browser",
"//content/public/common",
"//device/vr",
+ "//device/vr:vr_base",
"//device/vr/buildflags:buildflags",
"//services/device/public/mojom",
"//services/metrics/public/cpp:ukm_builders",
diff --git a/chromium/chrome/browser/apps/platform_apps/BUILD.gn b/chromium/chrome/browser/apps/platform_apps/BUILD.gn
index 1ec39f4efe9..00bf7253317 100644
--- a/chromium/chrome/browser/apps/platform_apps/BUILD.gn
+++ b/chromium/chrome/browser/apps/platform_apps/BUILD.gn
@@ -48,6 +48,7 @@ source_set("platform_apps") {
"//chrome/app:command_ids",
"//chrome/browser/extensions",
"//chrome/browser/media/router/discovery",
+ "//chrome/browser/sharing/proto:proto",
"//chrome/browser/web_applications/components:components",
"//chrome/browser/web_applications/extensions",
"//chrome/common",
diff --git a/chromium/chrome/browser/browser_resources.grd b/chromium/chrome/browser/browser_resources.grd
index 5544091d5eb..4c1cb2b3d4d 100644
--- a/chromium/chrome/browser/browser_resources.grd
+++ b/chromium/chrome/browser/browser_resources.grd
@@ -10,7 +10,6 @@
<structures>
<if expr="is_win or is_macosx or desktop_linux or chromeos">
<structure name="IDR_SIGNIN_SHARED_CSS_JS" file="${root_gen_dir}\chrome\browser\resources\signin\signin_shared_css.js" use_base_dir="false" preprocess="true" type="chrome_html" />
- <structure name="IDR_SIGNIN_SHARED_OLD_CSS_HTML" file="resources\signin\signin_shared_old_css.html" preprocess="true" allowexternalscript="true" type="chrome_html" />
</if>
<if expr="not is_android">
<!-- New Tab Page WebUI. -->
@@ -38,6 +37,8 @@
<structure name="IDR_CUSTOM_ELEMENTS_LOGIN_JS" file="resources\chromeos\login\custom_elements_login.js" compress="gzip" flattenhtml="true" type="chrome_html" />
<structure name="IDR_ASSISTANT_OPTIN_HTML" file="resources\chromeos\assistant_optin\assistant_optin.html" compress="gzip" flattenhtml="true" allowexternalscript="true" type="chrome_html" />
<structure name="IDR_ASSISTANT_OPTIN_JS" file="resources\chromeos\assistant_optin\assistant_optin.js" compress="gzip" flattenhtml="true" allowexternalscript="true" type="chrome_html" />
+ <structure name="IDR_OOBE_DEBUGGER_JS" file="resources\chromeos\login\debug\debug.js" compress="gzip" flattenhtml="true" type="chrome_html" />
+ <structure name="IDR_OOBE_DEBUGGER_STUB_JS" file="resources\chromeos\login\debug\no_debug.js" compress="gzip" flattenhtml="true" type="chrome_html" />
<!-- Gesture Navigation animations. -->
<structure type="chrome_html" name="IDR_GESTURE_NAVIGATION_GO_HOME_ANIMATION" file="resources\chromeos\login\images\gesture_go_home.json" compress="gzip" />
@@ -193,8 +194,7 @@
<include name="IDR_SIGNIN_EMAIL_CONFIRMATION_APP_JS" file="${root_gen_dir}\chrome\browser\resources\signin\signin_email_confirmation\signin_email_confirmation_app.js" use_base_dir="false" preprocess="true" type="BINDATA" />
<include name="IDR_SIGNIN_ERROR_HTML" file="resources\signin\signin_error\signin_error.html" type="BINDATA" />
<include name="IDR_SIGNIN_ERROR_JS" file="resources\signin\signin_error\signin_error.js" type="BINDATA" />
- <include name="IDR_SIGNIN_ERROR_APP_HTML" file="resources\signin\signin_error\signin_error_app.html" preprocess="true" type="BINDATA" />
- <include name="IDR_SIGNIN_ERROR_APP_JS" file="resources\signin\signin_error\signin_error_app.js" type="BINDATA" />
+ <include name="IDR_SIGNIN_ERROR_APP_JS" file="${root_gen_dir}\chrome\browser\resources\signin\signin_error\signin_error_app.js" use_base_dir="false" preprocess="true" type="BINDATA" />
</if>
<include name="IDR_USB_ENUMERATION_OPTIONS_MOJOM_LITE_JS" file="${root_gen_dir}\services\device\public\mojom\usb_enumeration_options.mojom-lite.js" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
<include name="IDR_USB_DEVICE_MANAGER_CLIENT_MOJOM_LITE_JS" file="${root_gen_dir}\services\device\public\mojom\usb_manager_client.mojom-lite.js" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
@@ -224,7 +224,7 @@
<include name="IDR_EDU_LOGIN_EDU_LOGIN_BUTTON_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\edu_login\edu_login_button.js" use_base_dir="false" type="BINDATA" compress="gzip" />
<include name="IDR_EDU_LOGIN_EDU_LOGIN_TEMPLATE_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\edu_login\edu_login_template.js" use_base_dir="false" type="BINDATA" compress="gzip" />
<include name="IDR_EDU_LOGIN_EDU_LOGIN_CSS_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\edu_login\edu_login_css.js" use_base_dir="false" type ="BINDATA" />
- <include name="IDR_EDU_LOGIN_EDU_LOGIN_WELCOME_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\edu_login\edu_login_welcome.js" use_base_dir="false" type ="BINDATA" compress="gzip" preprocess="true" />
+ <include name="IDR_EDU_LOGIN_EDU_LOGIN_COEXISTENCE_INFO_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\edu_login\edu_login_coexistence_info.js" use_base_dir="false" type ="BINDATA" compress="gzip" preprocess="true" />
<include name="IDR_EDU_LOGIN_EDU_LOGIN_PARENTS_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\edu_login\edu_login_parents.js" use_base_dir="false" type ="BINDATA" compress="gzip" preprocess="true" />
<include name="IDR_EDU_LOGIN_EDU_LOGIN_PARENT_SIGNIN_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\edu_login\edu_login_parent_signin.js" use_base_dir="false" type ="BINDATA" compress="gzip" preprocess="true" />
<include name="IDR_EDU_LOGIN_EDU_LOGIN_PARENT_INFO_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\edu_login\edu_login_parent_info.js" use_base_dir="false" type ="BINDATA" compress="gzip" preprocess="true" />
@@ -255,7 +255,6 @@
<include name="IDR_URGENT_PASSWORD_EXPIRY_NOTIFICATION_HTML" file="resources\chromeos\password_change\urgent_password_expiry_notification.html" flattenhtml="true" allowexternalscript="true" type="chrome_html" compress="gzip" />
<include name="IDR_URGENT_PASSWORD_EXPIRY_NOTIFICATION_JS" file="resources\chromeos\password_change\urgent_password_expiry_notification.js" type="chrome_html" compress="gzip" />
- <include name="IDR_CROSH_BUILTIN_MANIFEST" file="resources\chromeos\crosh_builtin\manifest.json" type="BINDATA" />
<include name="IDR_CROSTINI_INSTALLER_INDEX_HTML" file="resources\chromeos\crostini_installer\index.html" compress="gzip" type="BINDATA" />
<include name="IDR_CROSTINI_INSTALLER_APP_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\crostini_installer\app.js" compress="gzip" type="BINDATA" use_base_dir="false" />
<include name="IDR_CROSTINI_INSTALLER_BROWSER_PROXY_JS" file="resources\chromeos\crostini_installer\browser_proxy.js" compress="gzip" type="BINDATA" />
@@ -414,10 +413,6 @@
<include name="IDR_MEDIA_ROUTER_INTERNALS_CSS" file="resources\media_router\media_router_internals.css" compress="gzip" type="BINDATA" />
<include name="IDR_MEDIA_ROUTER_INTERNALS_JS" file="resources\media_router\media_router_internals.js" compress="gzip" type="BINDATA" />
</if>
- <if expr="chromeos or is_win or is_macosx">
- <include name="IDR_CAST_HTML" file="resources\cast\cast.html" type="BINDATA" />
- <include name="IDR_CAST_JS" file="resources\cast\cast.js" type="BINDATA" />
- </if>
<if expr="not is_android">
<include name="IDR_IME_WINDOW_CLOSE" file="resources\input_ime\ime_window_close.png" type="BINDATA" />
<include name="IDR_IME_WINDOW_CLOSE_C" file="resources\input_ime\ime_window_close_click.png" type="BINDATA" />
diff --git a/chromium/chrome/browser/chromeos/BUILD.gn b/chromium/chrome/browser/chromeos/BUILD.gn
index 94294ae0a10..b748814c49f 100644
--- a/chromium/chrome/browser/chromeos/BUILD.gn
+++ b/chromium/chrome/browser/chromeos/BUILD.gn
@@ -41,6 +41,7 @@ source_set("chromeos") {
"//chromeos/strings",
"//components/policy/proto",
"//components/signin/core/browser",
+ "//components/startup_metric_utils/browser:browser",
"//content/app/resources",
"//mojo/public/cpp/bindings",
"//ui/accessibility/mojom",
@@ -60,6 +61,7 @@ source_set("chromeos") {
":user_activity_event_proto",
":user_charging_event_proto",
"crostini:crostini_installer_types_mojom",
+ "net/network_diagnostics:network_diagnostics_mojom",
"//apps",
"//ash",
"//ash/public/cpp",
@@ -72,6 +74,7 @@ source_set("chromeos") {
"//chrome/browser/apps/platform_apps",
"//chrome/browser/apps/platform_apps/api",
"//chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_error_page",
+ "//chrome/browser/chromeos/net/mojom",
"//chrome/browser/chromeos/power/ml/smart_dim",
"//chrome/browser/devtools",
"//chrome/browser/extensions",
@@ -79,6 +82,7 @@ source_set("chromeos") {
"//chrome/browser/resource_coordinator:tab_metrics_event_proto",
"//chrome/browser/ui/webui/bluetooth_internals:mojo_bindings",
"//chrome/browser/ui/webui/chromeos/crostini_upgrader:mojo_bindings",
+ "//chrome/browser/ui/webui/settings/chromeos/constants:mojom",
"//chrome/browser/web_applications",
"//chrome/browser/web_applications:common",
"//chrome/browser/web_applications:web_applications_on_extensions",
@@ -135,6 +139,7 @@ source_set("chromeos") {
"//chromeos/dbus/cups_proxy",
"//chromeos/dbus/dlcservice",
"//chromeos/dbus/dlcservice:dlcservice_proto",
+ "//chromeos/dbus/ip_peripheral",
"//chromeos/dbus/kerberos",
"//chromeos/dbus/kerberos:kerberos_proto",
"//chromeos/dbus/machine_learning",
@@ -155,7 +160,7 @@ source_set("chromeos") {
"//chromeos/login/login_state",
"//chromeos/login/session",
"//chromeos/network",
- "//chromeos/services/assistant/public/cpp:prefs",
+ "//chromeos/services/assistant/public/cpp",
"//chromeos/services/cros_healthd/public/cpp",
"//chromeos/services/cros_healthd/public/mojom",
"//chromeos/services/device_sync",
@@ -173,6 +178,7 @@ source_set("chromeos") {
"//chromeos/services/multidevice_setup/public/cpp:oobe_completion_tracker",
"//chromeos/services/multidevice_setup/public/cpp:prefs",
"//chromeos/services/network_config:in_process_instance",
+ "//chromeos/services/network_config/public/cpp:cpp",
"//chromeos/services/secure_channel",
"//chromeos/services/secure_channel/public/cpp/client",
"//chromeos/settings",
@@ -279,6 +285,7 @@ source_set("chromeos") {
# TODO: care about enable_basic_printing and enable_print_preview.
"//ash/keyboard/ui",
"//printing",
+ "//printing/mojom",
"//remoting/host/it2me:chrome_os_host",
"//services/audio/public/cpp",
"//services/data_decoder/public/cpp",
@@ -329,6 +336,7 @@ source_set("chromeos") {
"//ui/views",
"//ui/views/controls/webview",
"//ui/web_dialogs",
+ "//ui/webui",
"//ui/wm",
"//ui/wm/public",
"//url",
@@ -456,6 +464,8 @@ source_set("chromeos") {
"app_mode/kiosk_session_plugin_handler.cc",
"app_mode/kiosk_session_plugin_handler.h",
"app_mode/kiosk_session_plugin_handler_delegate.h",
+ "app_mode/kiosk_settings_navigation_throttle.cc",
+ "app_mode/kiosk_settings_navigation_throttle.h",
"app_mode/pref_names.cc",
"app_mode/pref_names.h",
"app_mode/startup_app_launcher.cc",
@@ -668,8 +678,6 @@ source_set("chromeos") {
"arc/policy/arc_policy_bridge.h",
"arc/policy/arc_policy_util.cc",
"arc/policy/arc_policy_util.h",
- "arc/print/arc_print_service.cc",
- "arc/print/arc_print_service.h",
"arc/print_spooler/arc_print_spooler_bridge.cc",
"arc/print_spooler/arc_print_spooler_bridge.h",
"arc/print_spooler/arc_print_spooler_util.cc",
@@ -784,6 +792,18 @@ source_set("chromeos") {
"camera_presence_notifier.h",
"cert_provisioning/cert_provisioning_common.cc",
"cert_provisioning/cert_provisioning_common.h",
+ "cert_provisioning/cert_provisioning_invalidator.cc",
+ "cert_provisioning/cert_provisioning_invalidator.h",
+ "cert_provisioning/cert_provisioning_metrics.cc",
+ "cert_provisioning/cert_provisioning_metrics.h",
+ "cert_provisioning/cert_provisioning_platform_keys_helpers.cc",
+ "cert_provisioning/cert_provisioning_platform_keys_helpers.h",
+ "cert_provisioning/cert_provisioning_scheduler.cc",
+ "cert_provisioning/cert_provisioning_scheduler.h",
+ "cert_provisioning/cert_provisioning_scheduler_user_service.cc",
+ "cert_provisioning/cert_provisioning_scheduler_user_service.h",
+ "cert_provisioning/cert_provisioning_serializer.cc",
+ "cert_provisioning/cert_provisioning_serializer.h",
"cert_provisioning/cert_provisioning_worker.cc",
"cert_provisioning/cert_provisioning_worker.h",
"certificate_provider/certificate_info.cc",
@@ -828,6 +848,8 @@ source_set("chromeos") {
"child_accounts/screen_time_controller.h",
"child_accounts/screen_time_controller_factory.cc",
"child_accounts/screen_time_controller_factory.h",
+ "child_accounts/secondary_account_consent_logger.cc",
+ "child_accounts/secondary_account_consent_logger.h",
"child_accounts/time_limit_notifier.cc",
"child_accounts/time_limit_notifier.h",
"child_accounts/time_limit_override.cc",
@@ -1003,7 +1025,6 @@ source_set("chromeos") {
"extensions/active_tab_permission_granter_delegate_chromeos.h",
"extensions/default_app_order.cc",
"extensions/default_app_order.h",
- "extensions/default_web_app_ids.h",
"extensions/device_local_account_external_policy_loader.cc",
"extensions/device_local_account_external_policy_loader.h",
"extensions/device_local_account_management_policy_provider.cc",
@@ -1050,8 +1071,6 @@ source_set("chromeos") {
"file_manager/app_id.h",
"file_manager/arc_file_tasks.cc",
"file_manager/arc_file_tasks.h",
- "file_manager/crostini_file_tasks.cc",
- "file_manager/crostini_file_tasks.h",
"file_manager/documents_provider_root_manager.cc",
"file_manager/documents_provider_root_manager.h",
"file_manager/file_browser_handlers.cc",
@@ -1071,6 +1090,8 @@ source_set("chromeos") {
"file_manager/fileapi_util.h",
"file_manager/filesystem_api_util.cc",
"file_manager/filesystem_api_util.h",
+ "file_manager/guest_os_file_tasks.cc",
+ "file_manager/guest_os_file_tasks.h",
"file_manager/open_util.cc",
"file_manager/open_util.h",
"file_manager/open_with_browser.cc",
@@ -1221,8 +1242,6 @@ source_set("chromeos") {
"first_run/first_run_controller.h",
"first_run/first_run_view.cc",
"first_run/first_run_view.h",
- "first_run/goodies_displayer.cc",
- "first_run/goodies_displayer.h",
"first_run/step.cc",
"first_run/step.h",
"first_run/step_names.cc",
@@ -1253,6 +1272,9 @@ source_set("chromeos") {
"input_method/accessibility.h",
"input_method/assistive_suggester.cc",
"input_method/assistive_suggester.h",
+ "input_method/assistive_window_controller.cc",
+ "input_method/assistive_window_controller.h",
+ "input_method/assistive_window_properties.h",
"input_method/browser_state_monitor.cc",
"input_method/browser_state_monitor.h",
"input_method/candidate_window_controller.cc",
@@ -1283,16 +1305,17 @@ source_set("chromeos") {
"input_method/personal_info_suggester.h",
"input_method/suggester.h",
"input_method/suggestion_enums.h",
- "input_method/suggestion_window_controller.cc",
- "input_method/suggestion_window_controller.h",
- "input_method/suggestion_window_controller_impl.cc",
- "input_method/suggestion_window_controller_impl.h",
+ "input_method/suggestion_handler_interface.h",
"kerberos/kerberos_credentials_manager.cc",
"kerberos/kerberos_credentials_manager.h",
"kerberos/kerberos_credentials_manager_factory.cc",
"kerberos/kerberos_credentials_manager_factory.h",
"kerberos/kerberos_ticket_expiry_notification.cc",
"kerberos/kerberos_ticket_expiry_notification.h",
+ "lacros/lacros_loader.cc",
+ "lacros/lacros_loader.h",
+ "lacros/lacros_util.cc",
+ "lacros/lacros_util.h",
"language_preferences.cc",
"language_preferences.h",
"launcher_search_provider/error_reporter.cc",
@@ -1301,6 +1324,14 @@ source_set("chromeos") {
"launcher_search_provider/launcher_search_provider_service.h",
"launcher_search_provider/launcher_search_provider_service_factory.cc",
"launcher_search_provider/launcher_search_provider_service_factory.h",
+ "local_search_service/index.cc",
+ "local_search_service/index.h",
+ "local_search_service/inverted_index.cc",
+ "local_search_service/inverted_index.h",
+ "local_search_service/local_search_service.cc",
+ "local_search_service/local_search_service.h",
+ "local_search_service/local_search_service_factory.cc",
+ "local_search_service/local_search_service_factory.h",
"locale_change_guard.cc",
"locale_change_guard.h",
"lock_screen_apps/app_manager.h",
@@ -1469,6 +1500,8 @@ source_set("chromeos") {
"login/saml/password_expiry_notification.h",
"login/saml/public_saml_url_fetcher.cc",
"login/saml/public_saml_url_fetcher.h",
+ "login/saml/saml_metric_utils.cc",
+ "login/saml/saml_metric_utils.h",
"login/saml/saml_offline_signin_limiter.cc",
"login/saml/saml_offline_signin_limiter.h",
"login/saml/saml_offline_signin_limiter_factory.cc",
@@ -1578,6 +1611,10 @@ source_set("chromeos") {
"login/signin/oauth2_token_fetcher.h",
"login/signin/oauth2_token_initializer.cc",
"login/signin/oauth2_token_initializer.h",
+ "login/signin/signin_error_notifier_ash.cc",
+ "login/signin/signin_error_notifier_ash.h",
+ "login/signin/signin_error_notifier_factory_ash.cc",
+ "login/signin/signin_error_notifier_factory_ash.h",
"login/signin/token_handle_fetcher.cc",
"login/signin/token_handle_fetcher.h",
"login/signin/token_handle_util.cc",
@@ -1705,6 +1742,18 @@ source_set("chromeos") {
"net/delay_network_call.h",
"net/dhcp_wpad_url_client.cc",
"net/dhcp_wpad_url_client.h",
+ "net/network_diagnostics/gateway_can_be_pinged_routine.cc",
+ "net/network_diagnostics/gateway_can_be_pinged_routine.h",
+ "net/network_diagnostics/has_secure_wifi_connection_routine.cc",
+ "net/network_diagnostics/has_secure_wifi_connection_routine.h",
+ "net/network_diagnostics/lan_connectivity_routine.cc",
+ "net/network_diagnostics/lan_connectivity_routine.h",
+ "net/network_diagnostics/network_diagnostics_impl.cc",
+ "net/network_diagnostics/network_diagnostics_impl.h",
+ "net/network_diagnostics/network_diagnostics_routine.cc",
+ "net/network_diagnostics/network_diagnostics_routine.h",
+ "net/network_diagnostics/signal_strength_routine.cc",
+ "net/network_diagnostics/signal_strength_routine.h",
"net/network_health.cc",
"net/network_health.h",
"net/network_portal_detector_impl.cc",
@@ -1719,10 +1768,6 @@ source_set("chromeos") {
"net/network_throttling_observer.h",
"net/shill_error.cc",
"net/shill_error.h",
- "net/wake_on_wifi_connection_observer.cc",
- "net/wake_on_wifi_connection_observer.h",
- "net/wake_on_wifi_manager.cc",
- "net/wake_on_wifi_manager.h",
"network_change_manager_client.cc",
"network_change_manager_client.h",
"night_light/night_light_client.cc",
@@ -1762,8 +1807,14 @@ source_set("chromeos") {
"plugin_vm/plugin_vm_installer.h",
"plugin_vm/plugin_vm_installer_factory.cc",
"plugin_vm/plugin_vm_installer_factory.h",
+ "plugin_vm/plugin_vm_license_checker.cc",
+ "plugin_vm/plugin_vm_license_checker.h",
"plugin_vm/plugin_vm_manager.cc",
"plugin_vm/plugin_vm_manager.h",
+ "plugin_vm/plugin_vm_manager_factory.cc",
+ "plugin_vm/plugin_vm_manager_factory.h",
+ "plugin_vm/plugin_vm_manager_impl.cc",
+ "plugin_vm/plugin_vm_manager_impl.h",
"plugin_vm/plugin_vm_metrics_util.cc",
"plugin_vm/plugin_vm_metrics_util.h",
"plugin_vm/plugin_vm_pref_names.cc",
@@ -1869,6 +1920,10 @@ source_set("chromeos") {
"policy/enrollment_config.h",
"policy/enrollment_handler_chromeos.cc",
"policy/enrollment_handler_chromeos.h",
+ "policy/extension_install_event_log_collector.cc",
+ "policy/extension_install_event_log_collector.h",
+ "policy/extension_install_event_logger.cc",
+ "policy/extension_install_event_logger.h",
"policy/external_data_handlers/cloud_external_data_policy_handler.cc",
"policy/external_data_handlers/cloud_external_data_policy_handler.h",
"policy/external_data_handlers/crostini_ansible_playbook_external_data_handler.cc",
@@ -1977,6 +2032,8 @@ source_set("chromeos") {
"policy/single_app_install_event_log.h",
"policy/status_collector/activity_storage.cc",
"policy/status_collector/activity_storage.h",
+ "policy/status_collector/affiliated_session_service.cc",
+ "policy/status_collector/affiliated_session_service.h",
"policy/status_collector/app_info_generator.cc",
"policy/status_collector/app_info_generator.h",
"policy/status_collector/child_activity_storage.cc",
@@ -1998,8 +2055,8 @@ source_set("chromeos") {
"policy/system_features_disable_list_policy_handler.h",
"policy/system_log_uploader.cc",
"policy/system_log_uploader.h",
- "policy/system_proxy_settings_policy_handler.cc",
- "policy/system_proxy_settings_policy_handler.h",
+ "policy/system_proxy_manager.cc",
+ "policy/system_proxy_manager.h",
"policy/tpm_auto_update_mode_policy_handler.cc",
"policy/tpm_auto_update_mode_policy_handler.h",
"policy/upload_job.h",
@@ -2123,6 +2180,8 @@ source_set("chromeos") {
"printing/cups_print_job_notification.h",
"printing/cups_print_job_notification_manager.cc",
"printing/cups_print_job_notification_manager.h",
+ "printing/cups_printer_status_creator.cc",
+ "printing/cups_printer_status_creator.h",
"printing/cups_printers_manager.cc",
"printing/cups_printers_manager.h",
"printing/cups_printers_manager_factory.cc",
@@ -2154,6 +2213,8 @@ source_set("chromeos") {
"printing/print_management/print_job_info_mojom_conversions.h",
"printing/print_management/printing_manager.cc",
"printing/print_management/printing_manager.h",
+ "printing/print_management/printing_manager_factory.cc",
+ "printing/print_management/printing_manager_factory.h",
"printing/print_server.cc",
"printing/print_server.h",
"printing/print_servers_provider.cc",
@@ -2179,6 +2240,8 @@ source_set("chromeos") {
"printing/server_printers_fetcher.h",
"printing/server_printers_provider.cc",
"printing/server_printers_provider.h",
+ "printing/server_printers_provider_factory.cc",
+ "printing/server_printers_provider_factory.h",
"printing/specifics_translation.cc",
"printing/specifics_translation.h",
"printing/synced_printers_manager.cc",
@@ -2202,8 +2265,6 @@ source_set("chromeos") {
"release_notes/release_notes_storage.cc",
"release_notes/release_notes_storage.h",
"reset/metrics.h",
- "resource_reporter/resource_reporter.cc",
- "resource_reporter/resource_reporter.h",
"scheduler_configuration_manager.cc",
"scheduler_configuration_manager.h",
"secure_channel/secure_channel_client_provider.cc",
@@ -2301,6 +2362,8 @@ source_set("chromeos") {
"system/automatic_reboot_manager.cc",
"system/automatic_reboot_manager.h",
"system/automatic_reboot_manager_observer.h",
+ "system/breakpad_consent_watcher.cc",
+ "system/breakpad_consent_watcher.h",
"system/device_disabling_manager.cc",
"system/device_disabling_manager.h",
"system/device_disabling_manager_default_delegate.cc",
@@ -2340,8 +2403,12 @@ source_set("chromeos") {
"system_logs/single_debug_daemon_log_source.h",
"system_logs/single_log_file_log_source.cc",
"system_logs/single_log_file_log_source.h",
+ "system_logs/system_logs_writer.cc",
+ "system_logs/system_logs_writer.h",
"system_logs/touch_log_source.cc",
"system_logs/touch_log_source.h",
+ "system_logs/ui_hierarchy_log_source.cc",
+ "system_logs/ui_hierarchy_log_source.h",
"system_token_cert_db_initializer.cc",
"system_token_cert_db_initializer.h",
"tether/fake_tether_service.cc",
@@ -2387,6 +2454,11 @@ source_set("chromeos") {
"web_applications/chrome_help_app_ui_delegate.h",
"web_applications/chrome_media_app_ui_delegate.cc",
"web_applications/chrome_media_app_ui_delegate.h",
+ "web_applications/crosh_loader.cc",
+ "web_applications/crosh_loader.h",
+ "web_applications/crosh_loader_factory.cc",
+ "web_applications/crosh_loader_factory.h",
+ "web_applications/default_web_app_ids.h",
"web_applications/terminal_source.cc",
"web_applications/terminal_source.h",
"wilco_dtc_supportd/fake_wilco_dtc_supportd_client.cc",
@@ -2701,6 +2773,7 @@ source_set("unit_tests") {
"android_sms/connection_manager_unittest.cc",
"android_sms/fcm_connection_establisher_unittest.cc",
"android_sms/pairing_lost_notifier_unittest.cc",
+ "app_mode/app_launch_utils_unittest.cc",
"app_mode/app_session_unittest.cc",
"app_mode/startup_app_launcher_unittest.cc",
"app_mode/web_app/web_kiosk_app_launcher_unittest.cc",
@@ -2787,13 +2860,23 @@ source_set("unit_tests") {
"authpolicy/authpolicy_helper.unittest.cc",
"base/file_flusher_unittest.cc",
"bluetooth/debug_logs_manager_unittest.cc",
+ "cert_provisioning/cert_provisioning_invalidator_unittest.cc",
+ "cert_provisioning/cert_provisioning_platform_keys_helpers_unittest.cc",
+ "cert_provisioning/cert_provisioning_scheduler_unittest.cc",
+ "cert_provisioning/cert_provisioning_test_helpers.cc",
+ "cert_provisioning/cert_provisioning_test_helpers.h",
"cert_provisioning/cert_provisioning_worker_unittest.cc",
+ "cert_provisioning/mock_cert_provisioning_invalidator.cc",
+ "cert_provisioning/mock_cert_provisioning_invalidator.h",
+ "cert_provisioning/mock_cert_provisioning_worker.cc",
+ "cert_provisioning/mock_cert_provisioning_worker.h",
"certificate_provider/certificate_provider_service_unittest.cc",
"child_accounts/child_user_service_unittest.cc",
"child_accounts/event_based_status_reporting_service_unittest.cc",
"child_accounts/parent_access_code/authenticator_unittest.cc",
"child_accounts/parent_access_code/parent_access_test_utils.cc",
"child_accounts/parent_access_code/parent_access_test_utils.h",
+ "child_accounts/secondary_account_consent_logger_unittest.cc",
"child_accounts/time_limit_notifier_unittest.cc",
"child_accounts/time_limit_test_utils.cc",
"child_accounts/time_limits/app_activity_registry_unittest.cc",
@@ -2864,12 +2947,12 @@ source_set("unit_tests") {
"extensions/signin_screen_policy_provider_unittest.cc",
"extensions/wallpaper_private_api_unittest.cc",
"external_metrics_unittest.cc",
- "file_manager/crostini_file_tasks_unittest.cc",
"file_manager/documents_provider_root_manager_unittest.cc",
"file_manager/file_tasks_notifier_unittest.cc",
"file_manager/file_tasks_unittest.cc",
"file_manager/file_watcher_unittest.cc",
"file_manager/fileapi_util_unittest.cc",
+ "file_manager/guest_os_file_tasks_unittest.cc",
"file_manager/path_util_unittest.cc",
"file_manager/url_util_unittest.cc",
"file_manager/volume_manager_unittest.cc",
@@ -2928,12 +3011,21 @@ source_set("unit_tests") {
"guest_os/guest_os_share_path_unittest.cc",
"hats/hats_finch_helper_unittest.cc",
"hats/hats_notification_controller_unittest.cc",
+ "input_method/assistive_window_controller_unittest.cc",
+ "input_method/emoji_suggester_unittest.cc",
"input_method/input_method_configuration_unittest.cc",
"input_method/input_method_engine_unittest.cc",
"input_method/input_method_manager_impl_unittest.cc",
"input_method/input_method_persistence_unittest.cc",
+ "input_method/personal_info_suggester_unittest.cc",
"kerberos/kerberos_credentials_manager_test.cc",
"kerberos/kerberos_ticket_expiry_notification_test.cc",
+ "lacros/lacros_util_unittest.cc",
+ "local_search_service/index_unittest.cc",
+ "local_search_service/inverted_index_unittest.cc",
+ "local_search_service/local_search_service_unittest.cc",
+ "local_search_service/test_utils.cc",
+ "local_search_service/test_utils.h",
"locale_change_guard_unittest.cc",
"lock_screen_apps/app_manager_impl_unittest.cc",
"lock_screen_apps/lock_screen_profile_creator_impl_unittest.cc",
@@ -2969,6 +3061,7 @@ source_set("unit_tests") {
"login/screens/update_required_screen_unittest.cc",
"login/screens/update_screen_unittest.cc",
"login/session/user_session_manager_test.cc",
+ "login/signin/signin_error_notifier_ash_unittest.cc",
"login/signin_partition_manager_unittest.cc",
"login/supervised/supervised_user_authentication_unittest.cc",
"login/ui/login_screen_extension_ui/dialog_delegate_unittest.cc",
@@ -2980,18 +3073,24 @@ source_set("unit_tests") {
"login/version_updater/version_updater_unittest.cc",
"mobile/mobile_activator_unittest.cc",
"net/client_cert_store_chromeos_unittest.cc",
+ "net/network_diagnostics/gateway_can_be_pinged_routine_unittest.cc",
+ "net/network_diagnostics/has_secure_wifi_connection_routine_unittest.cc",
+ "net/network_diagnostics/lan_connectivity_routine_unittest.cc",
+ "net/network_diagnostics/network_diagnostics_routine_unittest.cc",
+ "net/network_diagnostics/signal_strength_routine_unittest.cc",
"net/network_health_unittest.cc",
"net/network_portal_detector_impl_unittest.cc",
"net/network_pref_state_observer_unittest.cc",
"net/network_throttling_observer_unittest.cc",
- "net/wake_on_wifi_manager_unittest.cc",
"network_change_manager_client_unittest.cc",
"night_light/night_light_client_unittest.cc",
"note_taking_helper_unittest.cc",
"ownership/owner_settings_service_chromeos_unittest.cc",
+ "plugin_vm/mock_plugin_vm_manager.cc",
+ "plugin_vm/mock_plugin_vm_manager.h",
"plugin_vm/plugin_vm_files_unittest.cc",
"plugin_vm/plugin_vm_installer_unittest.cc",
- "plugin_vm/plugin_vm_manager_unittest.cc",
+ "plugin_vm/plugin_vm_manager_impl_unittest.cc",
"plugin_vm/plugin_vm_test_helper.cc",
"plugin_vm/plugin_vm_test_helper.h",
"plugin_vm/plugin_vm_util_unittest.cc",
@@ -3024,6 +3123,8 @@ source_set("unit_tests") {
"policy/device_policy_decoder_chromeos_unittest.cc",
"policy/dm_token_storage_unittest.cc",
"policy/extension_cache_unittest.cc",
+ "policy/extension_install_event_log_collector_unittest.cc",
+ "policy/extension_install_event_logger_unittest.cc",
"policy/external_data_handlers/device_native_printers_external_data_handler_unittest.cc",
"policy/fake_affiliated_invalidation_service_provider.cc",
"policy/fake_affiliated_invalidation_service_provider.h",
@@ -3051,11 +3152,13 @@ source_set("unit_tests") {
"policy/secondary_google_account_signin_policy_handler_unittest.cc",
"policy/server_backed_state_keys_broker_unittest.cc",
"policy/single_app_install_event_log_unittest.cc",
+ "policy/status_collector/affiliated_session_service_unittest.cc",
"policy/status_collector/app_info_generator_unittest.cc",
"policy/status_collector/interval_map_unittest.cc",
"policy/status_uploader_unittest.cc",
+ "policy/system_features_disable_list_policy_handler_unittest.cc",
"policy/system_log_uploader_unittest.cc",
- "policy/system_proxy_settings_policy_handler_unittest.cc",
+ "policy/system_proxy_manager_unittest.cc",
"policy/tpm_auto_update_mode_policy_handler_unittest.cc",
"policy/upload_job_unittest.cc",
"policy/user_cloud_policy_manager_chromeos_unittest.cc",
@@ -3093,6 +3196,7 @@ source_set("unit_tests") {
"printing/automatic_usb_printer_configurer_unittest.cc",
"printing/bulk_printers_calculator_unittest.cc",
"printing/calculators_policies_binder_unittest.cc",
+ "printing/cups_printer_status_creator_unittest.cc",
"printing/cups_printers_manager_unittest.cc",
"printing/enterprise_printers_provider_unittest.cc",
"printing/history/mock_print_job_history_service.cc",
@@ -3126,7 +3230,6 @@ source_set("unit_tests") {
"proxy_config_service_impl_unittest.cc",
"release_notes/release_notes_notification_unittest.cc",
"release_notes/release_notes_storage_unittest.cc",
- "resource_reporter/resource_reporter_unittest.cc",
"scheduler_configuration_manager_unittest.cc",
"session_length_limiter_unittest.cc",
"settings/cros_settings_unittest.cc",
@@ -3162,6 +3265,7 @@ source_set("unit_tests") {
"system/device_disabling_manager_unittest.cc",
"system/procfs_util_unittest.cc",
"system/user_removal_manager_unittest.cc",
+ "system_logs/debug_daemon_log_source_unittest.cc",
"system_logs/single_debug_daemon_log_source_unittest.cc",
"system_logs/single_log_file_log_source_unittest.cc",
"tether/tether_service_unittest.cc",
@@ -3198,12 +3302,14 @@ source_set("unit_tests") {
"../ui/webui/chromeos/login/signin_userlist_unittest.cc",
"../ui/webui/settings/chromeos/accessibility_handler_unittest.cc",
"../ui/webui/settings/chromeos/calculator/size_calculator_test_api.h",
+ "../ui/webui/settings/chromeos/device_dlc_handler_unittest.cc",
"../ui/webui/settings/chromeos/device_keyboard_handler_unittest.cc",
"../ui/webui/settings/chromeos/device_storage_handler_unittest.cc",
"../ui/webui/settings/chromeos/internet_handler_unittest.cc",
"../ui/webui/settings/chromeos/multidevice_handler_unittest.cc",
- "../ui/webui/settings/chromeos/os_settings_localized_strings_provider_unittest.cc",
+ "../ui/webui/settings/chromeos/os_settings_manager_unittest.cc",
"../ui/webui/settings/chromeos/search/search_handler_unittest.cc",
+ "../ui/webui/settings/chromeos/search/search_tag_registry_unittest.cc",
"../ui/webui/settings/chromeos/search/settings_user_action_tracker_unittest.cc",
]
if (use_cups) {
@@ -3233,8 +3339,6 @@ source_set("unit_tests") {
"//chrome/browser/web_applications/components",
"//chrome/common",
"//chrome/services/keymaster/public/mojom",
- "//chrome/services/local_search_service",
- "//chrome/services/local_search_service:test_utils",
"//chrome/services/wilco_dtc_supportd/public/mojom",
"//chrome/test:test_support",
"//chrome/test:test_support_ui",
diff --git a/chromium/chrome/browser/chromeos/net/mojom/BUILD.gn b/chromium/chrome/browser/chromeos/net/mojom/BUILD.gn
new file mode 100644
index 00000000000..713ef8afafa
--- /dev/null
+++ b/chromium/chrome/browser/chromeos/net/mojom/BUILD.gn
@@ -0,0 +1,12 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//mojo/public/tools/bindings/mojom.gni")
+
+mojom("mojom") {
+ sources = [ "network_health.mojom" ]
+
+ public_deps =
+ [ "//chromeos/services/network_config/public/mojom:network_types" ]
+}
diff --git a/chromium/chrome/browser/chromeos/net/mojom/network_health.mojom b/chromium/chrome/browser/chromeos/net/mojom/network_health.mojom
new file mode 100644
index 00000000000..f3d27f503cf
--- /dev/null
+++ b/chromium/chrome/browser/chromeos/net/mojom/network_health.mojom
@@ -0,0 +1,33 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module chromeos.network_health.mojom;
+
+import "chromeos/services/network_config/public/mojom/network_types.mojom";
+
+// Contains information for a single network.
+struct Network {
+ chromeos.network_config.mojom.ConnectionStateType connection_state;
+ string name;
+ chromeos.network_config.mojom.NetworkType type;
+};
+
+// Contains information for a single network device.
+struct Device {
+ chromeos.network_config.mojom.DeviceStateType connection_state;
+ // Optional string for the device’s mac_address. Will only be populated if
+ // applicable to the device.
+ string? mac_address;
+ chromeos.network_config.mojom.NetworkType type;
+};
+
+// Interface for retrieving aggregated information about the current network
+// state and health.
+interface NetworkHealthService {
+ // Returns a list of the network devices.
+ GetDeviceList() => (array<Device> devices);
+
+ // Returns a list of the active (connected or connecting) networks.
+ GetActiveNetworkList() => (array<Network> active_networks);
+};
diff --git a/chromium/chrome/browser/chromeos/net/network_diagnostics/BUILD.gn b/chromium/chrome/browser/chromeos/net/network_diagnostics/BUILD.gn
new file mode 100644
index 00000000000..c0f2d7b573f
--- /dev/null
+++ b/chromium/chrome/browser/chromeos/net/network_diagnostics/BUILD.gn
@@ -0,0 +1,11 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//mojo/public/tools/bindings/mojom.gni")
+
+mojom("network_diagnostics_mojom") {
+ sources = [ "network_diagnostics.mojom" ]
+
+ deps = [ "//mojo/public/mojom/base" ]
+}
diff --git a/chromium/chrome/browser/chromeos/net/network_diagnostics/network_diagnostics.mojom b/chromium/chrome/browser/chromeos/net/network_diagnostics/network_diagnostics.mojom
new file mode 100644
index 00000000000..a001427d1be
--- /dev/null
+++ b/chromium/chrome/browser/chromeos/net/network_diagnostics/network_diagnostics.mojom
@@ -0,0 +1,72 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module chromeos.network_diagnostics.mojom;
+
+// Each routine can result in one of the possible verdicts.
+[Extensible]
+enum RoutineVerdict {
+ // Routine ran successfully and no connectivity problem found.
+ kNoProblem,
+ // Routine ran successfully and connectivity problem found.
+ kProblem,
+ // Routine has not been run.
+ kNotRun,
+};
+
+// Problems related to the SignalStrength routine.
+[Extensible]
+enum SignalStrengthProblem {
+ kSignalNotFound,
+ kWeakSignal,
+};
+
+// Problems related to the GatewayCanBePinged routine.
+[Extensible]
+enum GatewayCanBePingedProblem {
+ // All gateways are unreachable, hence cannot be pinged.
+ kUnreachableGateway,
+ // The default network cannot be pinged.
+ kFailedToPingDefaultNetwork,
+ // The default network has a latency above the threshold.
+ kDefaultNetworkAboveLatencyThreshold,
+ // One or more of the non-default networks has failed pings.
+ kUnsuccessfulNonDefaultNetworksPings,
+ // One of more of the non-default networks has a latency above the threshold.
+ kNonDefaultNetworksAboveLatencyThreshold,
+};
+
+// Messages related to the HasSecureWiFiConnection routine.
+[Extensible]
+enum HasSecureWiFiConnectionProblem {
+ kSecurityTypeNone,
+ kSecurityTypeWep8021x,
+ kSecurityTypeWepPsk,
+ kUnknownSecurityType,
+};
+
+// This interface is to be used by any clients that need to run specific
+// network-related diagnostics. Expected clients of this interface are
+// NetworkHealth, cros_healthd, and a connectivity diagnostics Web UI (to name
+// a few). The bound implementation is intended to live in the browser process.
+interface NetworkDiagnosticsRoutines {
+ // Tests whether the device is connected to a LAN. It is possible that the
+ // device may be trapped in a captive portal yet pass this test successfully.
+ // Captive portal checks are done separately and are outside of the scope of
+ // this routine.
+ LanConnectivity() => (RoutineVerdict verdict);
+
+ // Tests whether there is an acceptable signal strength on wireless networks.
+ SignalStrength() => (RoutineVerdict verdict,
+ array<SignalStrengthProblem> problems);
+
+ // Tests whether the gateway of connected networks is pingable.
+ GatewayCanBePinged() => (RoutineVerdict verdict,
+ array<GatewayCanBePingedProblem> problems);
+
+ // Tests whether the WiFi connection is secure. Note that if WiFi is not
+ // connected, the routine will result in a |kNotRun| verdict.
+ HasSecureWiFiConnection() => (RoutineVerdict verdict,
+ array<HasSecureWiFiConnectionProblem> problems);
+};
diff --git a/chromium/chrome/browser/custom_handlers/OWNERS b/chromium/chrome/browser/custom_handlers/OWNERS
index a3b4a06d367..62cc778e0cc 100644
--- a/chromium/chrome/browser/custom_handlers/OWNERS
+++ b/chromium/chrome/browser/custom_handlers/OWNERS
@@ -3,3 +3,4 @@ dominickn@chromium.org
mgiuca@chromium.org
raymes@chromium.org
# COMPONENT: UI>Browser>WebAppInstalls
+# TEAM: web-apps-platform-team@chromium.org
diff --git a/chromium/chrome/browser/custom_handlers/protocol_handler_registry.cc b/chromium/chrome/browser/custom_handlers/protocol_handler_registry.cc
index efd0efabdf4..49bb6c905ca 100644
--- a/chromium/chrome/browser/custom_handlers/protocol_handler_registry.cc
+++ b/chromium/chrome/browser/custom_handlers/protocol_handler_registry.cc
@@ -9,10 +9,11 @@
#include <utility>
#include "base/bind.h"
+#include "base/check_op.h"
#include "base/command_line.h"
-#include "base/logging.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
+#include "base/notreached.h"
#include "base/stl_util.h"
#include "build/build_config.h"
#include "chrome/browser/profiles/profile_io_data.h"
diff --git a/chromium/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc b/chromium/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc
index 27bd712bbc5..b972313d06d 100644
--- a/chromium/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc
+++ b/chromium/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc
@@ -21,6 +21,7 @@
#include "content/public/browser/navigation_controller.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "third_party/blink/public/common/context_menu_data/media_type.h"
@@ -150,6 +151,9 @@ using RegisterProtocolHandlerExtensionBrowserTest =
extensions::ExtensionBrowserTest;
IN_PROC_BROWSER_TEST_F(RegisterProtocolHandlerExtensionBrowserTest, Basic) {
+#if defined(OS_MACOSX)
+ ASSERT_TRUE(test::RegisterAppWithLaunchServices());
+#endif
permissions::PermissionRequestManager* manager =
permissions::PermissionRequestManager::FromWebContents(
browser()->tab_strip_model()->GetActiveWebContents());
diff --git a/chromium/chrome/browser/custom_handlers/test_protocol_handler_registry_delegate.cc b/chromium/chrome/browser/custom_handlers/test_protocol_handler_registry_delegate.cc
index 13aa1f3c03e..2a9d3a9ed7e 100644
--- a/chromium/chrome/browser/custom_handlers/test_protocol_handler_registry_delegate.cc
+++ b/chromium/chrome/browser/custom_handlers/test_protocol_handler_registry_delegate.cc
@@ -7,7 +7,7 @@
#include <utility>
#include "base/bind.h"
-#include "base/logging.h"
+#include "base/check_op.h"
#include "base/threading/thread_task_runner_handle.h"
TestProtocolHandlerRegistryDelegate::TestProtocolHandlerRegistryDelegate() =
diff --git a/chromium/chrome/browser/dev_ui_browser_resources.grd b/chromium/chrome/browser/dev_ui_browser_resources.grd
index 1ea72168d2e..cad2c93b7b8 100644
--- a/chromium/chrome/browser/dev_ui_browser_resources.grd
+++ b/chromium/chrome/browser/dev_ui_browser_resources.grd
@@ -50,7 +50,7 @@ This file specifies browser resources for developer-facing chrome:// pages
<include name="IDR_MEDIA_HISTORY_HTML" file="resources\media\media_history.html" flattenhtml="true" type="BINDATA" compress="gzip" allowexternalscript="true" />
<include name="IDR_MEDIA_HISTORY_JS" file="resources\media\media_history.js" flattenhtml="true" type="BINDATA" compress="gzip" />
<include name="IDR_MEDIA_HISTORY_STORE_MOJOM_LITE_JS" file="${root_gen_dir}\chrome\browser\media\history\media_history_store.mojom-lite.js" use_base_dir="false" type="BINDATA" compress="gzip" />
- <include name="IDR_MEMORY_INTERNALS_HTML" file="resources\memory_internals\memory_internals.html" flattenhtml="true" type="BINDATA" compress="gzip" />
+ <include name="IDR_MEMORY_INTERNALS_HTML" file="resources\memory_internals\memory_internals.html" type="BINDATA" compress="gzip" />
<include name="IDR_MEMORY_INTERNALS_JS" file="resources\memory_internals\memory_internals.js" type="BINDATA" compress="gzip" />
<include name="IDR_NOTIFICATIONS_INTERNALS_HTML" file="resources\notifications_internals\notifications_internals.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
<include name="IDR_NOTIFICATIONS_INTERNALS_CSS" file="resources\notifications_internals\notifications_internals.css" type="BINDATA" compress="gzip" />
diff --git a/chromium/chrome/browser/devtools/BUILD.gn b/chromium/chrome/browser/devtools/BUILD.gn
index 26ff8701508..e094572221e 100644
--- a/chromium/chrome/browser/devtools/BUILD.gn
+++ b/chromium/chrome/browser/devtools/BUILD.gn
@@ -111,7 +111,7 @@ static_library("devtools") {
"//skia",
"//third_party/icu",
"//third_party/leveldatabase",
- "//ui/base/mojom:cursor_type",
+ "//ui/base/cursor/mojom:cursor_type",
]
sources += [
"chrome_devtools_manager_delegate.cc",
diff --git a/chromium/chrome/browser/devtools/device/adb/adb_client_socket.cc b/chromium/chrome/browser/devtools/device/adb/adb_client_socket.cc
index 6fe69bbb7e4..006fcb5c5ca 100644
--- a/chromium/chrome/browser/devtools/device/adb/adb_client_socket.cc
+++ b/chromium/chrome/browser/devtools/device/adb/adb_client_socket.cc
@@ -52,8 +52,8 @@ class AdbTransportSocket : public AdbClientSocket {
serial_(serial),
socket_name_(socket_name),
callback_(callback) {
- Connect(base::Bind(&AdbTransportSocket::OnConnected,
- base::Unretained(this)));
+ Connect(base::BindOnce(&AdbTransportSocket::OnConnected,
+ base::Unretained(this)));
}
private:
@@ -109,8 +109,8 @@ class AdbQuerySocket : AdbClientSocket {
CheckNetResultOrDie(net::ERR_INVALID_ARGUMENT);
return;
}
- Connect(base::Bind(&AdbQuerySocket::SendNextQuery,
- base::Unretained(this)));
+ Connect(
+ base::BindOnce(&AdbQuerySocket::SendNextQuery, base::Unretained(this)));
}
private:
@@ -228,8 +228,8 @@ void AdbClientSocket::SendCommand(const std::string& command,
})");
int result =
socket_->Write(request_buffer.get(), request_buffer->size(),
- base::Bind(&AdbClientSocket::ReadResponse,
- base::Unretained(this), callback, is_void),
+ base::BindOnce(&AdbClientSocket::ReadResponse,
+ base::Unretained(this), callback, is_void),
traffic_annotation);
if (result != net::ERR_IO_PENDING)
ReadResponse(callback, is_void, result);
@@ -244,13 +244,10 @@ void AdbClientSocket::ReadResponse(const CommandCallback& callback,
}
scoped_refptr<net::IOBuffer> response_buffer =
base::MakeRefCounted<net::IOBuffer>(kBufferSize);
- result = socket_->Read(response_buffer.get(),
- kBufferSize,
- base::Bind(&AdbClientSocket::OnResponseHeader,
- base::Unretained(this),
- callback,
- is_void,
- response_buffer));
+ result = socket_->Read(
+ response_buffer.get(), kBufferSize,
+ base::BindOnce(&AdbClientSocket::OnResponseHeader, base::Unretained(this),
+ callback, is_void, response_buffer));
if (result != net::ERR_IO_PENDING)
OnResponseHeader(callback, is_void, response_buffer, result);
}
@@ -318,14 +315,10 @@ void AdbClientSocket::OnResponseData(
}
// Read tail
- result = socket_->Read(response_buffer.get(),
- kBufferSize,
- base::Bind(&AdbClientSocket::OnResponseData,
- base::Unretained(this),
- callback,
- new_response,
- response_buffer,
- bytes_left));
+ result = socket_->Read(
+ response_buffer.get(), kBufferSize,
+ base::BindOnce(&AdbClientSocket::OnResponseData, base::Unretained(this),
+ callback, new_response, response_buffer, bytes_left));
if (result > 0)
OnResponseData(callback, new_response, response_buffer, bytes_left, result);
else if (result != net::ERR_IO_PENDING)
diff --git a/chromium/chrome/browser/devtools/device/adb/adb_client_socket_browsertest.cc b/chromium/chrome/browser/devtools/device/adb/adb_client_socket_browsertest.cc
index 8359e2a55f0..c0bcc02d0c2 100644
--- a/chromium/chrome/browser/devtools/device/adb/adb_client_socket_browsertest.cc
+++ b/chromium/chrome/browser/devtools/device/adb/adb_client_socket_browsertest.cc
@@ -3,12 +3,14 @@
// found in the LICENSE file.
#include "base/run_loop.h"
+#include "base/logging.h"
#include "chrome/browser/devtools/device/adb/adb_device_provider.h"
#include "chrome/browser/devtools/device/adb/mock_adb_server.h"
#include "chrome/browser/devtools/device/devtools_android_bridge.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "content/public/browser/browser_thread.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_utils.h"
using content::BrowserThread;
@@ -66,7 +68,7 @@ class AdbClientSocketTest : public InProcessBrowserTest,
const DevToolsAndroidBridge::RemoteBrowsers& browsers =
connected->browsers();
- ASSERT_EQ(4U, browsers.size());
+ ASSERT_EQ(5U, browsers.size());
scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> chrome =
FindBrowserByDisplayName(browsers, "Chrome");
@@ -88,9 +90,14 @@ class AdbClientSocketTest : public InProcessBrowserTest,
FindBrowserByDisplayName(browsers, "Noprocess");
ASSERT_TRUE(noprocess.get());
+ scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> node =
+ FindBrowserByDisplayName(browsers, "Node");
+ ASSERT_TRUE(node.get());
+
ASSERT_EQ("32.0.1679.0", chrome->version());
ASSERT_EQ("31.0.1599.0", chrome_beta->version());
ASSERT_EQ("4.0", webview->version());
+ ASSERT_EQ("v10.15.3", node->version());
ASSERT_EQ("Test User", chrome->user());
ASSERT_EQ("Test User : 2", chrome_beta->user());
@@ -102,10 +109,12 @@ class AdbClientSocketTest : public InProcessBrowserTest,
chrome_beta->pages();
DevToolsAndroidBridge::RemotePages webview_pages =
webview->pages();
+ DevToolsAndroidBridge::RemotePages node_pages = node->pages();
ASSERT_EQ(1U, chrome_pages.size());
ASSERT_EQ(1U, chrome_beta_pages.size());
ASSERT_EQ(2U, webview_pages.size());
+ ASSERT_EQ(1U, node_pages.size());
scoped_refptr<content::DevToolsAgentHost> chrome_target(
chrome_pages[0]->CreateTarget());
@@ -115,6 +124,8 @@ class AdbClientSocketTest : public InProcessBrowserTest,
webview_pages[0]->CreateTarget());
scoped_refptr<content::DevToolsAgentHost> webview_target_1(
webview_pages[1]->CreateTarget());
+ scoped_refptr<content::DevToolsAgentHost> node_target(
+ node_pages[0]->CreateTarget());
// Check that we have non-empty description for webview pages.
ASSERT_EQ(0U, chrome_target->GetDescription().size());
@@ -126,6 +137,7 @@ class AdbClientSocketTest : public InProcessBrowserTest,
chrome_target->GetURL());
ASSERT_EQ("The Chromium Projects",
chrome_target->GetTitle());
+ ASSERT_EQ("node", node_target->GetType());
}
private:
@@ -133,24 +145,19 @@ class AdbClientSocketTest : public InProcessBrowserTest,
DevToolsAndroidBridge::RemoteDevices devices_;
};
-// Flaky due to failure to bind a hardcoded port. crbug.com/566057
-IN_PROC_BROWSER_TEST_F(AdbClientSocketTest, DISABLED_TestFlushWithoutSize) {
+// Combine all tests into one. Splitting up into multiple tests can be flaky
+// due to failure to bind a hardcoded port. crbug.com/566057
+IN_PROC_BROWSER_TEST_F(AdbClientSocketTest, TestCombined) {
StartMockAdbServer(FlushWithoutSize);
StartTest();
CheckDevices();
StopMockAdbServer();
-}
-// Flaky due to failure to bind a hardcoded port. crbug.com/566057
-IN_PROC_BROWSER_TEST_F(AdbClientSocketTest, DISABLED_TestFlushWithSize) {
StartMockAdbServer(FlushWithSize);
StartTest();
CheckDevices();
StopMockAdbServer();
-}
-// Flaky due to failure to bind a hardcoded port. crbug.com/566057
-IN_PROC_BROWSER_TEST_F(AdbClientSocketTest, DISABLED_TestFlushWithData) {
StartMockAdbServer(FlushWithData);
StartTest();
CheckDevices();
diff --git a/chromium/chrome/browser/devtools/device/adb/mock_adb_server.cc b/chromium/chrome/browser/devtools/device/adb/mock_adb_server.cc
index a7c675f28c6..816aebdd877 100644
--- a/chromium/chrome/browser/devtools/device/adb/mock_adb_server.cc
+++ b/chromium/chrome/browser/devtools/device/adb/mock_adb_server.cc
@@ -76,7 +76,9 @@ const char kSampleOpenedUnixSockets[] =
"00000000: 00000002 00000000"
" 00010000 0001 01 20894 @chrome_devtools_remote_1002\n"
"00000000: 00000002 00000000"
- " 00010000 0001 01 20895 @noprocess_devtools_remote\n";
+ " 00010000 0001 01 20895 @noprocess_devtools_remote\n"
+ "00000000: 00000002 00000000"
+ " 00010000 0001 01 20895 @node_devtools_remote\n";
const char kSampleListProcesses[] =
"USER PID PPID VSIZE RSS WCHAN PC NAME\n"
@@ -126,6 +128,11 @@ char kSampleWebViewVersion[] = "{\n"
" \"WebKit-Version\": \"537.36 (@157588)\"\n"
"}";
+char kSampleNodeVersion[] = "{\n"
+ " \"Browser\": \"node.js/v10.15.3\","
+ " \"Protocol-Version\": \"1.1\""
+ "}";
+
char kSampleChromePages[] = "[ {\n"
" \"description\": \"\",\n"
" \"devtoolsFrontendUrl\": \"/devtools/devtools.html?"
@@ -179,6 +186,20 @@ char kSampleWebViewPages[] = "[ {\n"
"44681551-ADFD-2411-076B-3AB14C1C60E2\"\n"
"}]";
+char kSampleNodePage[] = "[ {\n"
+ " \"description\": \"\","
+ " \"devtoolsFrontendUrl\": \"chrome-devtools://devtools/bundled/"
+ "js_app.html?experiments=true&v8only=true&ws=192.168.86.1:33279/"
+ "148b8b92-8ca0-43fd-b8c8-a351864644f8\","
+ " \"faviconUrl\": \"https://nodejs.org/static/favicon.ico\","
+ " \"id\": \"148b8b92-8ca0-43fd-b8c8-a351864644f8\","
+ " \"title\": \"a-node-process\","
+ " \"type\": \"node\","
+ " \"url\": \"about:blank\",\n"
+ " \"webSocketDebuggerUrl\": \"ws://192.168.86.1:33279/"
+ "148b8b92-8ca0-43fd-b8c8-a351864644f8\""
+ "} ]";
+
static const int kBufferSize = 16*1024;
static const uint16_t kAdbPort = 5037;
@@ -302,9 +323,8 @@ void SimpleHttpServer::Connection::ReadData() {
input_buffer_->SetCapacity(input_buffer_->capacity() * 2);
int read_result = socket_->Read(
- input_buffer_.get(),
- input_buffer_->RemainingCapacity(),
- base::Bind(&Connection::OnDataRead, base::Unretained(this)));
+ input_buffer_.get(), input_buffer_->RemainingCapacity(),
+ base::BindOnce(&Connection::OnDataRead, base::Unretained(this)));
if (read_result != net::ERR_IO_PENDING)
OnDataRead(read_result);
@@ -345,7 +365,7 @@ void SimpleHttpServer::Connection::WriteData() {
int write_result = socket_->Write(
output_buffer_.get(), bytes_to_write_,
- base::Bind(&Connection::OnDataWritten, base::Unretained(this)),
+ base::BindOnce(&Connection::OnDataWritten, base::Unretained(this)),
TRAFFIC_ANNOTATION_FOR_TESTS);
if (write_result != net::ERR_IO_PENDING)
@@ -377,8 +397,9 @@ void SimpleHttpServer::Connection::OnDataWritten(int count) {
void SimpleHttpServer::OnConnect() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- int accept_result = socket_->Accept(&client_socket_,
- base::Bind(&SimpleHttpServer::OnAccepted, base::Unretained(this)));
+ int accept_result = socket_->Accept(
+ &client_socket_,
+ base::BindOnce(&SimpleHttpServer::OnAccepted, base::Unretained(this)));
if (accept_result != net::ERR_IO_PENDING)
base::ThreadTaskRunnerHandle::Get()->PostTask(
@@ -536,7 +557,6 @@ void MockAndroidConnection::Receive(const std::string& data) {
CHECK_EQ(3U, tokens.size());
CHECK_EQ("GET", tokens[0]);
CHECK_EQ("HTTP/1.1", tokens[2]);
- CHECK_EQ("Host: 0.0.0.0:0", lines[1]);
std::string path(tokens[1]);
if (path == kJsonPath)
@@ -571,6 +591,13 @@ void MockAndroidConnection::Receive(const std::string& data) {
SendHTTPResponse(kSampleWebViewPages);
else
NOTREACHED() << "Unknown command " << request;
+ } else if (socket_name_ == "node_devtools_remote") {
+ if (path == kJsonVersionPath)
+ SendHTTPResponse(kSampleNodeVersion);
+ else if (path == kJsonListPath)
+ SendHTTPResponse(kSampleNodePage);
+ else
+ NOTREACHED() << "Unknown command " << request;
} else {
NOTREACHED() << "Unknown socket " << socket_name_;
}
diff --git a/chromium/chrome/browser/devtools/device/android_device_manager.cc b/chromium/chrome/browser/devtools/device/android_device_manager.cc
index bbf6bc5750e..02a50e12c56 100644
--- a/chromium/chrome/browser/devtools/device/android_device_manager.cc
+++ b/chromium/chrome/browser/devtools/device/android_device_manager.cc
@@ -172,7 +172,7 @@ class HttpRequest {
result = socket_->Write(
request_.get(), request_->BytesRemaining(),
- base::Bind(&HttpRequest::DoSendRequest, base::Unretained(this)),
+ base::BindOnce(&HttpRequest::DoSendRequest, base::Unretained(this)),
kAndroidDeviceManagerTrafficAnnotation);
}
}
@@ -212,9 +212,8 @@ class HttpRequest {
response_buffer_ = base::MakeRefCounted<net::IOBuffer>(kBufferSize);
result = socket_->Read(
- response_buffer_.get(),
- kBufferSize,
- base::Bind(&HttpRequest::OnResponseData, base::Unretained(this)));
+ response_buffer_.get(), kBufferSize,
+ base::BindOnce(&HttpRequest::OnResponseData, base::Unretained(this)));
if (result != net::ERR_IO_PENDING)
OnResponseData(result);
}
@@ -275,7 +274,7 @@ class HttpRequest {
result = socket_->Read(
response_buffer_.get(), kBufferSize,
- base::Bind(&HttpRequest::OnResponseData, base::Unretained(this)));
+ base::BindOnce(&HttpRequest::OnResponseData, base::Unretained(this)));
} while (result != net::ERR_IO_PENDING);
}
diff --git a/chromium/chrome/browser/devtools/device/android_web_socket.cc b/chromium/chrome/browser/devtools/device/android_web_socket.cc
index 65ef44f4c87..a3ba3c2ce17 100644
--- a/chromium/chrome/browser/devtools/device/android_web_socket.cc
+++ b/chromium/chrome/browser/devtools/device/android_web_socket.cc
@@ -99,8 +99,8 @@ class AndroidDeviceManager::AndroidWebSocket::WebSocketImpl {
void Read(scoped_refptr<net::IOBuffer> io_buffer) {
int result =
socket_->Read(io_buffer.get(), kBufferSize,
- base::Bind(&WebSocketImpl::OnBytesRead,
- weak_factory_.GetWeakPtr(), io_buffer));
+ base::BindOnce(&WebSocketImpl::OnBytesRead,
+ weak_factory_.GetWeakPtr(), io_buffer));
if (result != net::ERR_IO_PENDING)
OnBytesRead(io_buffer, result);
}
@@ -159,8 +159,8 @@ class AndroidDeviceManager::AndroidWebSocket::WebSocketImpl {
scoped_refptr<net::StringIOBuffer> buffer =
base::MakeRefCounted<net::StringIOBuffer>(request_buffer_);
result = socket_->Write(buffer.get(), buffer->size(),
- base::Bind(&WebSocketImpl::SendPendingRequests,
- weak_factory_.GetWeakPtr()),
+ base::BindOnce(&WebSocketImpl::SendPendingRequests,
+ weak_factory_.GetWeakPtr()),
kAndroidWebSocketTrafficAnnotation);
if (result != net::ERR_IO_PENDING)
SendPendingRequests(result);
diff --git a/chromium/chrome/browser/devtools/device/devtools_android_bridge_browsertest.cc b/chromium/chrome/browser/devtools/device/devtools_android_bridge_browsertest.cc
index 6679a716f0a..69c1cab4b80 100644
--- a/chromium/chrome/browser/devtools/device/devtools_android_bridge_browsertest.cc
+++ b/chromium/chrome/browser/devtools/device/devtools_android_bridge_browsertest.cc
@@ -15,6 +15,7 @@
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/prefs/pref_service.h"
+#include "content/public/test/browser_test.h"
class DevToolsAndroidBridgeTest : public InProcessBrowserTest {
};
diff --git a/chromium/chrome/browser/devtools/device/devtools_device_discovery.cc b/chromium/chrome/browser/devtools/device/devtools_device_discovery.cc
index 42cedd7c4a6..952af2c6614 100644
--- a/chromium/chrome/browser/devtools/device/devtools_device_discovery.cc
+++ b/chromium/chrome/browser/devtools/device/devtools_device_discovery.cc
@@ -519,8 +519,13 @@ DevToolsDeviceDiscovery::RemotePage::CreateTarget() {
BuildUniqueTargetId(device_->serial(), browser_id_, dict_);
std::string target_path = GetTargetPath(dict_);
std::string type = GetStringProperty(dict_, "type");
+
+ std::string port_num = browser_id_;
+ if (type == "node")
+ port_num = GURL(GetStringProperty(dict_, "webSocketDebuggerUrl")).port();
+
agent_host_ = AgentHostDelegate::GetOrCreateAgentHost(
- device_, browser_id_, browser_version_, local_id, target_path, type,
+ device_, port_num, browser_version_, local_id, target_path, type,
&dict_);
return agent_host_;
}
diff --git a/chromium/chrome/browser/devtools/device/port_forwarding_browsertest.cc b/chromium/chrome/browser/devtools/device/port_forwarding_browsertest.cc
index 8410df0e3b0..64957e4cce9 100644
--- a/chromium/chrome/browser/devtools/device/port_forwarding_browsertest.cc
+++ b/chromium/chrome/browser/devtools/device/port_forwarding_browsertest.cc
@@ -22,6 +22,7 @@
#include "components/prefs/pref_service.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_utils.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
diff --git a/chromium/chrome/browser/devtools/device/port_forwarding_controller.cc b/chromium/chrome/browser/devtools/device/port_forwarding_controller.cc
index b9aa891584b..65421861737 100644
--- a/chromium/chrome/browser/devtools/device/port_forwarding_controller.cc
+++ b/chromium/chrome/browser/devtools/device/port_forwarding_controller.cc
@@ -260,7 +260,7 @@ class SocketTunnel {
host_socket_.reset(new net::TCPClientSocket(resolved_addresses, nullptr,
nullptr, net::NetLogSource()));
int result = host_socket_->Connect(
- base::Bind(&SocketTunnel::OnConnected, base::Unretained(this)));
+ base::BindOnce(&SocketTunnel::OnConnected, base::Unretained(this)));
if (result != net::ERR_IO_PENDING)
OnConnected(result);
}
@@ -288,11 +288,10 @@ class SocketTunnel {
scoped_refptr<net::IOBuffer> buffer =
base::MakeRefCounted<net::IOBuffer>(kBufferSize);
- int result = from->Read(
- buffer.get(),
- kBufferSize,
- base::Bind(
- &SocketTunnel::OnRead, base::Unretained(this), from, to, buffer));
+ int result =
+ from->Read(buffer.get(), kBufferSize,
+ base::BindOnce(&SocketTunnel::OnRead, base::Unretained(this),
+ from, to, buffer));
if (result != net::ERR_IO_PENDING)
OnRead(from, to, std::move(buffer), result);
}
@@ -313,10 +312,11 @@ class SocketTunnel {
base::MakeRefCounted<net::DrainableIOBuffer>(std::move(buffer), total);
++pending_writes_;
- result = to->Write(drainable.get(), total,
- base::Bind(&SocketTunnel::OnWritten,
- base::Unretained(this), drainable, from, to),
- kPortForwardingControllerTrafficAnnotation);
+ result =
+ to->Write(drainable.get(), total,
+ base::BindOnce(&SocketTunnel::OnWritten,
+ base::Unretained(this), drainable, from, to),
+ kPortForwardingControllerTrafficAnnotation);
if (result != net::ERR_IO_PENDING)
OnWritten(drainable, from, to, result);
}
@@ -338,8 +338,8 @@ class SocketTunnel {
++pending_writes_;
result =
to->Write(drainable.get(), drainable->BytesRemaining(),
- base::Bind(&SocketTunnel::OnWritten, base::Unretained(this),
- drainable, from, to),
+ base::BindOnce(&SocketTunnel::OnWritten,
+ base::Unretained(this), drainable, from, to),
kPortForwardingControllerTrafficAnnotation);
if (result != net::ERR_IO_PENDING)
OnWritten(drainable, from, to, result);
diff --git a/chromium/chrome/browser/devtools/device/usb/android_usb_browsertest.cc b/chromium/chrome/browser/devtools/device/usb/android_usb_browsertest.cc
index e61c5eb8b6a..6d38d17048b 100644
--- a/chromium/chrome/browser/devtools/device/usb/android_usb_browsertest.cc
+++ b/chromium/chrome/browser/devtools/device/usb/android_usb_browsertest.cc
@@ -27,6 +27,7 @@
#include "chrome/test/base/in_process_browser_test.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_utils.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
diff --git a/chromium/chrome/browser/devtools/device/usb/android_usb_device.cc b/chromium/chrome/browser/devtools/device/usb/android_usb_device.cc
index 1229c477a88..bd10f486a83 100644
--- a/chromium/chrome/browser/devtools/device/usb/android_usb_device.cc
+++ b/chromium/chrome/browser/devtools/device/usb/android_usb_device.cc
@@ -57,7 +57,7 @@ uint32_t Checksum(const std::string& data) {
void DumpMessage(bool outgoing, const uint8_t* data, size_t length) {
#if 0
- std::string result = "";
+ std::string result;
if (length == kHeaderSize) {
for (size_t i = 0; i < 24; ++i) {
result += base::StringPrintf("%02x", data[i]);
@@ -307,10 +307,10 @@ void AndroidUsbDevice::ProcessOutgoing() {
outgoing_queue_.pop();
DumpMessage(true, message->front(), message->size());
- device_->GenericTransferOut(android_device_info_.outbound_address,
- message->data(), kUsbTimeout,
- base::Bind(&AndroidUsbDevice::OutgoingMessageSent,
- weak_factory_.GetWeakPtr()));
+ device_->GenericTransferOut(
+ android_device_info_.outbound_address, message->data(), kUsbTimeout,
+ base::BindOnce(&AndroidUsbDevice::OutgoingMessageSent,
+ weak_factory_.GetWeakPtr()));
}
void AndroidUsbDevice::OutgoingMessageSent(UsbTransferStatus status) {
@@ -326,9 +326,10 @@ void AndroidUsbDevice::ReadHeader() {
if (!device_)
return;
- device_->GenericTransferIn(
- android_device_info_.inbound_address, kHeaderSize, kUsbTimeout,
- base::Bind(&AndroidUsbDevice::ParseHeader, weak_factory_.GetWeakPtr()));
+ device_->GenericTransferIn(android_device_info_.inbound_address, kHeaderSize,
+ kUsbTimeout,
+ base::BindOnce(&AndroidUsbDevice::ParseHeader,
+ weak_factory_.GetWeakPtr()));
}
void AndroidUsbDevice::ParseHeader(UsbTransferStatus status,
@@ -380,8 +381,8 @@ void AndroidUsbDevice::ReadBody(std::unique_ptr<AdbMessage> message,
device_->GenericTransferIn(
android_device_info_.inbound_address, data_length, kUsbTimeout,
- base::Bind(&AndroidUsbDevice::ParseBody, weak_factory_.GetWeakPtr(),
- base::Passed(&message), data_length, data_check));
+ base::BindOnce(&AndroidUsbDevice::ParseBody, weak_factory_.GetWeakPtr(),
+ base::Passed(&message), data_length, data_check));
}
void AndroidUsbDevice::ParseBody(std::unique_ptr<AdbMessage> message,
diff --git a/chromium/chrome/browser/devtools/device/usb/android_usb_socket.cc b/chromium/chrome/browser/devtools/device/usb/android_usb_socket.cc
index 7f00d5ce311..9e59d0fe9a8 100644
--- a/chromium/chrome/browser/devtools/device/usb/android_usb_socket.cc
+++ b/chromium/chrome/browser/devtools/device/usb/android_usb_socket.cc
@@ -7,7 +7,8 @@
#include <stddef.h>
#include "base/callback_helpers.h"
-#include "base/logging.h"
+#include "base/check_op.h"
+#include "base/notreached.h"
#include "net/base/io_buffer.h"
#include "net/base/ip_address.h"
#include "net/base/net_errors.h"
diff --git a/chromium/chrome/browser/devtools/device/usb/usb_device_provider.cc b/chromium/chrome/browser/devtools/device/usb/usb_device_provider.cc
index d003cfe702d..87eb0c38711 100644
--- a/chromium/chrome/browser/devtools/device/usb/usb_device_provider.cc
+++ b/chromium/chrome/browser/devtools/device/usb/usb_device_provider.cc
@@ -44,9 +44,8 @@ void OnRead(net::StreamSocket* socket,
std::string new_data = data + std::string(buffer->data(), result);
result =
- socket->Read(buffer.get(),
- kBufferSize,
- base::Bind(&OnRead, socket, buffer, new_data, callback));
+ socket->Read(buffer.get(), kBufferSize,
+ base::BindOnce(&OnRead, socket, buffer, new_data, callback));
if (result != net::ERR_IO_PENDING)
OnRead(socket, buffer, new_data, callback, result);
}
@@ -61,9 +60,8 @@ void OpenedForCommand(const UsbDeviceProvider::CommandCallback& callback,
scoped_refptr<net::IOBuffer> buffer =
base::MakeRefCounted<net::IOBuffer>(kBufferSize);
result = socket->Read(
- buffer.get(),
- kBufferSize,
- base::Bind(&OnRead, socket, buffer, std::string(), callback));
+ buffer.get(), kBufferSize,
+ base::BindOnce(&OnRead, socket, buffer, std::string(), callback));
if (result != net::ERR_IO_PENDING)
OnRead(socket, buffer, std::string(), callback, result);
}
@@ -76,8 +74,8 @@ void RunCommand(scoped_refptr<AndroidUsbDevice> device,
callback.Run(net::ERR_CONNECTION_FAILED, std::string());
return;
}
- int result = socket->Connect(
- base::Bind(&OpenedForCommand, callback, socket));
+ int result =
+ socket->Connect(base::BindOnce(&OpenedForCommand, callback, socket));
if (result != net::ERR_IO_PENDING)
callback.Run(result, std::string());
}
@@ -123,7 +121,7 @@ void UsbDeviceProvider::OpenSocket(const std::string& serial,
base::WrapUnique<net::StreamSocket>(NULL));
return;
}
- int result = socket->Connect(base::Bind(&OnOpenSocket, callback, socket));
+ int result = socket->Connect(base::BindOnce(&OnOpenSocket, callback, socket));
if (result != net::ERR_IO_PENDING)
callback.Run(result, base::WrapUnique<net::StreamSocket>(NULL));
}
diff --git a/chromium/chrome/browser/devtools/devtools_browser_context_manager.cc b/chromium/chrome/browser/devtools/devtools_browser_context_manager.cc
index acccd7533a6..cc6da5ee753 100644
--- a/chromium/chrome/browser/devtools/devtools_browser_context_manager.cc
+++ b/chromium/chrome/browser/devtools/devtools_browser_context_manager.cc
@@ -6,6 +6,7 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
+#include "chrome/browser/profiles/profile_destroyer.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_list.h"
@@ -23,33 +24,29 @@ DevToolsBrowserContextManager& DevToolsBrowserContextManager::GetInstance() {
Profile* DevToolsBrowserContextManager::GetProfileById(
const std::string& context_id) {
- auto it = registrations_.find(context_id);
- if (it == registrations_.end())
+ auto it = otr_profiles_.find(context_id);
+ if (it == otr_profiles_.end())
return nullptr;
- return it->second->profile();
+ return it->second;
}
content::BrowserContext* DevToolsBrowserContextManager::CreateBrowserContext() {
Profile* original_profile =
ProfileManager::GetActiveUserProfile()->GetOriginalProfile();
- auto registration =
- IndependentOTRProfileManager::GetInstance()->CreateFromOriginalProfile(
- original_profile,
- base::BindOnce(
- &DevToolsBrowserContextManager::OnOriginalProfileDestroyed,
- weak_factory_.GetWeakPtr()));
- content::BrowserContext* context = registration->profile();
- const std::string& context_id = context->UniqueId();
- registrations_[context_id] = std::move(registration);
- return context;
+ Profile* otr_profile = original_profile->GetOffTheRecordProfile(
+ Profile::OTRProfileID::CreateUnique("Devtools::BrowserContext"));
+ const std::string& context_id = otr_profile->UniqueId();
+ otr_profiles_[context_id] = otr_profile;
+ otr_profile->AddObserver(this);
+ return otr_profile;
}
std::vector<content::BrowserContext*>
DevToolsBrowserContextManager::GetBrowserContexts() {
std::vector<content::BrowserContext*> result;
- for (const auto& registration_pair : registrations_)
- result.push_back(registration_pair.second->profile());
+ for (const auto& profile_pair : otr_profiles_)
+ result.push_back(profile_pair.second);
return result;
}
@@ -68,14 +65,14 @@ void DevToolsBrowserContextManager::DisposeBrowserContext(
" is already pending");
return;
}
- auto it = registrations_.find(context_id);
- if (it == registrations_.end()) {
+ auto it = otr_profiles_.find(context_id);
+ if (it == otr_profiles_.end()) {
std::move(callback).Run(
false, "Failed to find browser context with id " + context_id);
return;
}
- Profile* profile = it->second->profile();
+ Profile* profile = it->second;
bool has_opened_browser = false;
for (auto* opened_browser : *BrowserList::GetInstance()) {
if (opened_browser->profile() == profile) {
@@ -86,7 +83,9 @@ void DevToolsBrowserContextManager::DisposeBrowserContext(
// If no browsers are opened - dispose right away.
if (!has_opened_browser) {
- registrations_.erase(it);
+ otr_profiles_.erase(it);
+ profile->RemoveObserver(this);
+ ProfileDestroyer::DestroyProfileWhenAppropriate(profile);
std::move(callback).Run(true, "");
return;
}
@@ -100,8 +99,7 @@ void DevToolsBrowserContextManager::DisposeBrowserContext(
true /* skip_beforeunload */);
}
-void DevToolsBrowserContextManager::OnOriginalProfileDestroyed(
- Profile* profile) {
+void DevToolsBrowserContextManager::OnProfileWillBeDestroyed(Profile* profile) {
// This is likely happening during shutdown. We'll immediately
// close all browser windows for our profile without unload handling.
BrowserList::BrowserVector browsers_to_close;
@@ -112,7 +110,7 @@ void DevToolsBrowserContextManager::OnOriginalProfileDestroyed(
for (auto* browser : browsers_to_close)
browser->window()->Close();
std::string context_id = profile->UniqueId();
- registrations_.erase(context_id);
+ otr_profiles_.erase(context_id);
}
void DevToolsBrowserContextManager::OnBrowserRemoved(Browser* browser) {
@@ -124,12 +122,18 @@ void DevToolsBrowserContextManager::OnBrowserRemoved(Browser* browser) {
if (opened_browser->profile() == browser->profile())
return;
}
- auto it = registrations_.find(context_id);
+
+ auto it = otr_profiles_.find(context_id);
+ Profile* otr_profile = it->second;
+ otr_profiles_.erase(it);
+ otr_profile->RemoveObserver(this);
// We cannot delete immediately here: the profile might still be referenced
- // during the browser tier-down process.
- base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE,
- it->second.release());
- registrations_.erase(it);
+ // during the browser tear-down process.
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE,
+ base::BindOnce(&ProfileDestroyer::DestroyProfileWhenAppropriate,
+ base::Unretained(otr_profile)));
+
std::move(pending_disposal->second).Run(true, "");
pending_context_disposals_.erase(pending_disposal);
if (pending_context_disposals_.empty())
diff --git a/chromium/chrome/browser/devtools/devtools_browser_context_manager.h b/chromium/chrome/browser/devtools/devtools_browser_context_manager.h
index 5f413aa5091..e962a19521d 100644
--- a/chromium/chrome/browser/devtools/devtools_browser_context_manager.h
+++ b/chromium/chrome/browser/devtools/devtools_browser_context_manager.h
@@ -5,12 +5,15 @@
#ifndef CHROME_BROWSER_DEVTOOLS_DEVTOOLS_BROWSER_CONTEXT_MANAGER_H_
#define CHROME_BROWSER_DEVTOOLS_DEVTOOLS_BROWSER_CONTEXT_MANAGER_H_
+#include "base/containers/flat_map.h"
#include "base/memory/weak_ptr.h"
#include "base/no_destructor.h"
-#include "chrome/browser/profiles/independent_otr_profile_manager.h"
+#include "chrome/browser/profiles/profile_observer.h"
+#include "chrome/browser/ui/browser_list_observer.h"
#include "content/public/browser/devtools_manager_delegate.h"
-class DevToolsBrowserContextManager : public BrowserListObserver {
+class DevToolsBrowserContextManager : public BrowserListObserver,
+ public ProfileObserver {
public:
static DevToolsBrowserContextManager& GetInstance();
@@ -26,14 +29,14 @@ class DevToolsBrowserContextManager : public BrowserListObserver {
friend class base::NoDestructor<DevToolsBrowserContextManager>;
DevToolsBrowserContextManager();
~DevToolsBrowserContextManager() override;
- void OnOriginalProfileDestroyed(Profile* profile);
+ // BrowserListObserver:
void OnBrowserRemoved(Browser* browser) override;
- base::flat_map<
- std::string,
- std::unique_ptr<IndependentOTRProfileManager::OTRProfileRegistration>>
- registrations_;
+ // ProfileObserver:
+ void OnProfileWillBeDestroyed(Profile* profile) override;
+
+ base::flat_map<std::string, Profile*> otr_profiles_;
base::flat_map<std::string, content::DevToolsManagerDelegate::DisposeCallback>
pending_context_disposals_;
diff --git a/chromium/chrome/browser/devtools/devtools_eye_dropper.cc b/chromium/chrome/browser/devtools/devtools_eye_dropper.cc
index a3b4d68b1b2..9d63b980c7a 100644
--- a/chromium/chrome/browser/devtools/devtools_eye_dropper.cc
+++ b/chromium/chrome/browser/devtools/devtools_eye_dropper.cc
@@ -28,7 +28,7 @@
#include "third_party/skia/include/core/SkPath.h"
#include "third_party/skia/include/core/SkPixmap.h"
#include "ui/base/cursor/cursor.h"
-#include "ui/base/mojom/cursor_type.mojom-shared.h"
+#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
#include "ui/gfx/geometry/size_conversions.h"
DevToolsEyeDropper::DevToolsEyeDropper(content::WebContents* web_contents,
@@ -121,8 +121,8 @@ bool DevToolsEyeDropper::HandleMouseEvent(const blink::WebMouseEvent& event) {
return true;
if (event.button == blink::WebMouseEvent::Button::kLeft &&
- (event.GetType() == blink::WebInputEvent::kMouseDown ||
- event.GetType() == blink::WebInputEvent::kMouseMove)) {
+ (event.GetType() == blink::WebInputEvent::Type::kMouseDown ||
+ event.GetType() == blink::WebInputEvent::Type::kMouseMove)) {
if (last_cursor_x_ < 0 || last_cursor_x_ >= frame_.width() ||
last_cursor_y_ < 0 || last_cursor_y_ >= frame_.height()) {
return true;
diff --git a/chromium/chrome/browser/devtools/devtools_file_system_indexer.cc b/chromium/chrome/browser/devtools/devtools_file_system_indexer.cc
index edfb536146d..0f7479de0c5 100644
--- a/chromium/chrome/browser/devtools/devtools_file_system_indexer.cc
+++ b/chromium/chrome/browser/devtools/devtools_file_system_indexer.cc
@@ -10,10 +10,10 @@
#include "base/bind.h"
#include "base/callback.h"
+#include "base/check_op.h"
#include "base/files/file_enumerator.h"
#include "base/files/file_util.h"
#include "base/lazy_instance.h"
-#include "base/logging.h"
#include "base/macros.h"
#include "base/sequence_checker.h"
#include "base/stl_util.h"
diff --git a/chromium/chrome/browser/devtools/devtools_file_watcher_unittest.cc b/chromium/chrome/browser/devtools/devtools_file_watcher_unittest.cc
index e49a2e533c8..b40aa6978a9 100644
--- a/chromium/chrome/browser/devtools/devtools_file_watcher_unittest.cc
+++ b/chromium/chrome/browser/devtools/devtools_file_watcher_unittest.cc
@@ -49,7 +49,7 @@ TEST_F(DevToolsFileWatcherTest, BasicUsage) {
base::SequencedTaskRunnerHandle::Get()));
base::FilePath changed_path = base_path_.Append(FILE_PATH_LITERAL("file1"));
- base::WriteFile(changed_path, "test", 4);
+ base::WriteFile(changed_path, "test");
watcher->AddWatch(base_path_);
expected_changed_paths_.insert(changed_path.AsUTF8Unsafe());
@@ -59,12 +59,12 @@ TEST_F(DevToolsFileWatcherTest, BasicUsage) {
base::PlatformThread::Sleep(TestTimeouts::tiny_timeout());
// Just for the first operation, repeat it until we get the callback, as
// watcher may take some time to start on another thread.
- base::WriteFile(changed_path, "test", 4);
+ base::WriteFile(changed_path, "test");
}
base::FilePath added_path = base_path_.Append(FILE_PATH_LITERAL("file2"));
expected_added_paths_.insert(added_path.AsUTF8Unsafe());
- base::WriteFile(added_path, "test", 4);
+ base::WriteFile(added_path, "test");
while (!expected_added_paths_.empty()) {
task_environment_.RunUntilIdle();
base::PlatformThread::Sleep(TestTimeouts::tiny_timeout());
diff --git a/chromium/chrome/browser/devtools/devtools_sanity_browsertest.cc b/chromium/chrome/browser/devtools/devtools_sanity_browsertest.cc
index 77b07b55303..86d3a035d4e 100644
--- a/chromium/chrome/browser/devtools/devtools_sanity_browsertest.cc
+++ b/chromium/chrome/browser/devtools/devtools_sanity_browsertest.cc
@@ -85,6 +85,7 @@
#include "content/public/browser/web_ui_controller.h"
#include "content/public/common/content_switches.h"
#include "content/public/common/url_constants.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/hit_test_region_observer.h"
#include "content/public/test/test_navigation_observer.h"
@@ -955,6 +956,8 @@ IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
ASSERT_TRUE(content::ExecuteScript(web_frame_rfh, about_blank_javascript));
web_about_blank_manager.WaitForNavigationFinished();
+ // After navigation, the frame may change.
+ web_frame_rfh = ChildFrameAt(panel_frame_rfh, 2);
EXPECT_EQ(about_blank_url, web_frame_rfh->GetLastCommittedURL());
EXPECT_EQ(web_url.host(),
@@ -1706,7 +1709,8 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestSettings) {
}
// Tests that external navigation from inspector page is always handled by
-// DevToolsWindow and results in inspected page navigation.
+// DevToolsWindow and results in inspected page navigation. See also
+// https://crbug.com/180555.
IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestDevToolsExternalNavigation) {
OpenDevToolsWindow(kDebuggerTestPage, true);
GURL url = spawned_test_server()->GetURL(kNavigateBackTestPage);
@@ -2096,7 +2100,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsPixelOutputTests,
DispatchAndWait("startTimeline");
for (int i = 0; i < 3; ++i) {
- SimulateMouseEvent(web_contents, blink::WebInputEvent::kMouseMove,
+ SimulateMouseEvent(web_contents, blink::WebInputEvent::Type::kMouseMove,
gfx::Point(30, 60));
DispatchInPageAndWait("waitForEvent", "mousemove");
}
@@ -2330,6 +2334,15 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, DisposeEmptyBrowserContext) {
DevToolsWindowTesting::CloseDevToolsWindowSync(window_);
}
+// TODO(1078348): Find a better strategy for testing protocol methods against
+// non-headless Chrome.
+IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, NewWindowFromBrowserContext) {
+ window_ = DevToolsWindowTesting::OpenDiscoveryDevToolsWindowSync(
+ browser()->profile());
+ RunTestMethod("testNewWindowFromBrowserContext");
+ DevToolsWindowTesting::CloseDevToolsWindowSync(window_);
+}
+
IN_PROC_BROWSER_TEST_F(SitePerProcessDevToolsSanityTest, InspectElement) {
GURL url(embedded_test_server()->GetURL("a.com", "/devtools/oopif.html"));
GURL iframe_url(
diff --git a/chromium/chrome/browser/devtools/devtools_sanity_interactive_browsertest.cc b/chromium/chrome/browser/devtools/devtools_sanity_interactive_browsertest.cc
index edd506a4872..db93742db1b 100644
--- a/chromium/chrome/browser/devtools/devtools_sanity_interactive_browsertest.cc
+++ b/chromium/chrome/browser/devtools/devtools_sanity_interactive_browsertest.cc
@@ -14,6 +14,7 @@
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/exclusive_access/exclusive_access_context.h"
#include "chrome/test/base/in_process_browser_test.h"
+#include "content/public/test/browser_test.h"
#include "ui/display/types/display_constants.h"
#if defined(OS_MACOSX)
diff --git a/chromium/chrome/browser/devtools/devtools_ui_bindings.cc b/chromium/chrome/browser/devtools/devtools_ui_bindings.cc
index a90e1cca42f..3af6ba32420 100644
--- a/chromium/chrome/browser/devtools/devtools_ui_bindings.cc
+++ b/chromium/chrome/browser/devtools/devtools_ui_bindings.cc
@@ -101,6 +101,8 @@ static const char kDevToolsActionTakenHistogram[] = "DevTools.ActionTaken";
static const char kDevToolsPanelShownHistogram[] = "DevTools.PanelShown";
static const char kDevToolsKeyboardShortcutFiredHistogram[] =
"DevTools.KeyboardShortcutFired";
+static const char kDevToolsIssuesPanelOpenedFromHistogram[] =
+ "DevTools.IssuesPanelOpenedFrom";
static const char kRemotePageActionInspect[] = "inspect";
static const char kRemotePageActionReload[] = "reload";
@@ -447,8 +449,8 @@ class DevToolsUIBindings::NetworkResourceLoader
loader_->SetOnResponseStartedCallback(base::BindOnce(
&NetworkResourceLoader::OnResponseStarted, base::Unretained(this)));
timer_.Start(FROM_HERE, delay,
- base::BindRepeating(&NetworkResourceLoader::DownloadAsStream,
- base::Unretained(this)));
+ base::BindOnce(&NetworkResourceLoader::DownloadAsStream,
+ base::Unretained(this)));
}
private:
@@ -1240,6 +1242,8 @@ void DevToolsUIBindings::RecordEnumeratedHistogram(const std::string& name,
UMA_HISTOGRAM_EXACT_LINEAR(name, sample, boundary_value);
else if (name == kDevToolsKeyboardShortcutFiredHistogram)
UMA_HISTOGRAM_EXACT_LINEAR(name, sample, boundary_value);
+ else if (name == kDevToolsIssuesPanelOpenedFromHistogram)
+ UMA_HISTOGRAM_EXACT_LINEAR(name, sample, boundary_value);
else
frontend_host_->BadMessageRecieved();
}
diff --git a/chromium/chrome/browser/devtools/devtools_window.cc b/chromium/chrome/browser/devtools/devtools_window.cc
index 3063ba32c4b..817fd22ff31 100644
--- a/chromium/chrome/browser/devtools/devtools_window.cc
+++ b/chromium/chrome/browser/devtools/devtools_window.cc
@@ -286,11 +286,11 @@ bool DevToolsEventForwarder::ForwardEvent(
const content::NativeWebKeyboardEvent& event) {
std::string event_type;
switch (event.GetType()) {
- case WebInputEvent::kKeyDown:
- case WebInputEvent::kRawKeyDown:
+ case WebInputEvent::Type::kKeyDown:
+ case WebInputEvent::Type::kRawKeyDown:
event_type = kKeyDownEventName;
break;
- case WebInputEvent::kKeyUp:
+ case WebInputEvent::Type::kKeyUp:
event_type = kKeyUpEventName;
break;
default:
@@ -685,7 +685,7 @@ void DevToolsWindow::ToggleDevToolsWindow(
Profile* profile = Profile::FromBrowserContext(
inspected_web_contents->GetBrowserContext());
base::RecordAction(base::UserMetricsAction("DevTools_InspectRenderer"));
- std::string panel = "";
+ std::string panel;
switch (action.type()) {
case DevToolsToggleAction::kInspect:
case DevToolsToggleAction::kShowElementsPanel:
@@ -1152,6 +1152,7 @@ void DevToolsWindow::ActivateContents(WebContents* contents) {
void DevToolsWindow::AddNewContents(WebContents* source,
std::unique_ptr<WebContents> new_contents,
+ const GURL& target_url,
WindowOpenDisposition disposition,
const gfx::Rect& initial_rect,
bool user_gesture,
@@ -1175,7 +1176,7 @@ void DevToolsWindow::AddNewContents(WebContents* source,
WebContents* inspected_web_contents = GetInspectedWebContents();
if (inspected_web_contents) {
inspected_web_contents->GetDelegate()->AddNewContents(
- source, std::move(new_contents), disposition, initial_rect,
+ source, std::move(new_contents), target_url, disposition, initial_rect,
user_gesture, was_blocked);
}
}
diff --git a/chromium/chrome/browser/devtools/devtools_window.h b/chromium/chrome/browser/devtools/devtools_window.h
index 0d607938f2e..e89f2698aeb 100644
--- a/chromium/chrome/browser/devtools/devtools_window.h
+++ b/chromium/chrome/browser/devtools/devtools_window.h
@@ -309,6 +309,7 @@ class DevToolsWindow : public DevToolsUIBindings::Delegate,
void ActivateContents(content::WebContents* contents) override;
void AddNewContents(content::WebContents* source,
std::unique_ptr<content::WebContents> new_contents,
+ const GURL& target_url,
WindowOpenDisposition disposition,
const gfx::Rect& initial_rect,
bool user_gesture,
diff --git a/chromium/chrome/browser/devtools/global_confirm_info_bar.cc b/chromium/chrome/browser/devtools/global_confirm_info_bar.cc
index f26872e3867..a1fe209f611 100644
--- a/chromium/chrome/browser/devtools/global_confirm_info_bar.cc
+++ b/chromium/chrome/browser/devtools/global_confirm_info_bar.cc
@@ -15,8 +15,6 @@
#include "components/infobars/core/infobar.h"
#include "ui/gfx/image/image.h"
-// InfoBarDelegateProxy -------------------------------------------------------
-
class GlobalConfirmInfoBar::DelegateProxy : public ConfirmInfoBarDelegate {
public:
explicit DelegateProxy(base::WeakPtr<GlobalConfirmInfoBar> global_info_bar);
@@ -26,7 +24,7 @@ class GlobalConfirmInfoBar::DelegateProxy : public ConfirmInfoBarDelegate {
private:
friend class GlobalConfirmInfoBar;
- // ConfirmInfoBarDelegate overrides
+ // ConfirmInfoBarDelegate:
infobars::InfoBarDelegate::InfoBarIdentifier GetIdentifier() const override;
base::string16 GetLinkText() const override;
GURL GetLinkURL() const override;
@@ -59,29 +57,41 @@ GlobalConfirmInfoBar::DelegateProxy::GetIdentifier() const {
base::string16 GlobalConfirmInfoBar::DelegateProxy::GetLinkText() const {
return global_info_bar_ ? global_info_bar_->delegate_->GetLinkText()
- : base::string16();
+ : ConfirmInfoBarDelegate::GetLinkText();
}
GURL GlobalConfirmInfoBar::DelegateProxy::GetLinkURL() const {
- return global_info_bar_ ? global_info_bar_->delegate_->GetLinkURL() : GURL();
+ return global_info_bar_ ? global_info_bar_->delegate_->GetLinkURL()
+ : ConfirmInfoBarDelegate::GetLinkURL();
}
bool GlobalConfirmInfoBar::DelegateProxy::LinkClicked(
WindowOpenDisposition disposition) {
- return global_info_bar_ &&
- global_info_bar_->delegate_->LinkClicked(disposition);
+ return global_info_bar_
+ ? global_info_bar_->delegate_->LinkClicked(disposition)
+ : ConfirmInfoBarDelegate::LinkClicked(disposition);
}
void GlobalConfirmInfoBar::DelegateProxy::InfoBarDismissed() {
base::WeakPtr<GlobalConfirmInfoBar> info_bar = global_info_bar_;
- // See comments in GlobalConfirmInfoBar::DelegateProxy::Accept().
+ // Remove the current InfoBar (the one whose close button is being clicked)
+ // from the control of GlobalConfirmInfoBar. This InfoBar will be closed by
+ // caller of this method, and we don't need GlobalConfirmInfoBar to close it.
+ // Furthermore, letting GlobalConfirmInfoBar close the current InfoBar can
+ // cause memory corruption when InfoBar animation is disabled.
if (info_bar) {
info_bar->OnInfoBarRemoved(info_bar_, false);
info_bar->delegate_->InfoBarDismissed();
+ // Check the pointer again in case it's now destroyed.
+ // TODO(pkasting): We should audit callees for these sorts of methods
+ // (InfoBarDismissed(), Accept(), Cancel()) to determine if they can close
+ // the global infobar, then establish better contracts/APIs around the
+ // lifetimes here, ideally removing WeakPtrs entirely.
+ if (info_bar)
+ info_bar->Close();
+ } else {
+ ConfirmInfoBarDelegate::InfoBarDismissed();
}
- // Could be destroyed after this point.
- if (info_bar)
- info_bar->Close();
}
base::string16 GlobalConfirmInfoBar::DelegateProxy::GetMessageText() const {
@@ -97,6 +107,8 @@ GlobalConfirmInfoBar::DelegateProxy::GetMessageElideBehavior() const {
}
int GlobalConfirmInfoBar::DelegateProxy::GetButtons() const {
+ // ConfirmInfoBarDelegate default behavior here is not very good for a no-op
+ // case, so return BUTTON_NONE when there is no underlying delegate.
return global_info_bar_ ? global_info_bar_->delegate_->GetButtons()
: BUTTON_NONE;
}
@@ -104,51 +116,50 @@ int GlobalConfirmInfoBar::DelegateProxy::GetButtons() const {
base::string16 GlobalConfirmInfoBar::DelegateProxy::GetButtonLabel(
InfoBarButton button) const {
return global_info_bar_ ? global_info_bar_->delegate_->GetButtonLabel(button)
- : base::string16();
+ : ConfirmInfoBarDelegate::GetButtonLabel(button);
}
bool GlobalConfirmInfoBar::DelegateProxy::Accept() {
base::WeakPtr<GlobalConfirmInfoBar> info_bar = global_info_bar_;
- // Remove the current InfoBar (the one whose Accept button is being clicked)
- // from the control of GlobalConfirmInfoBar. This InfoBar will be closed by
- // caller of this method, and we don't need GlobalConfirmInfoBar to close it.
- // Furthermore, letting GlobalConfirmInfoBar close the current InfoBar can
- // cause memory corruption when InfoBar animation is disabled.
+ // See comments in InfoBarDismissed().
if (info_bar) {
+ // TODO(pkasting): This implementation assumes the global delegate's
+ // Accept() always returns true. Ideally, we'd check the return value and
+ // handle it appropriately. We also need to worry about side effects like
+ // navigating the current tab and whether that can corrupt state or result
+ // in double-frees.
info_bar->OnInfoBarRemoved(info_bar_, false);
info_bar->delegate_->Accept();
- }
- // Could be destroyed after this point.
- if (info_bar)
+ if (info_bar)
info_bar->Close();
- return true;
+ return true;
+ }
+ return ConfirmInfoBarDelegate::Accept();
}
bool GlobalConfirmInfoBar::DelegateProxy::Cancel() {
base::WeakPtr<GlobalConfirmInfoBar> info_bar = global_info_bar_;
- // See comments in GlobalConfirmInfoBar::DelegateProxy::Accept().
+ // See comments in InfoBarDismissed().
if (info_bar) {
+ // See comments in Accept().
info_bar->OnInfoBarRemoved(info_bar_, false);
info_bar->delegate_->Cancel();
- }
- // Could be destroyed after this point.
- if (info_bar)
+ if (info_bar)
info_bar->Close();
- return true;
+ return true;
+ }
+ return ConfirmInfoBarDelegate::Cancel();
}
void GlobalConfirmInfoBar::DelegateProxy::Detach() {
global_info_bar_.reset();
}
-// GlobalConfirmInfoBar -------------------------------------------------------
-
// static
-base::WeakPtr<GlobalConfirmInfoBar> GlobalConfirmInfoBar::Show(
+void GlobalConfirmInfoBar::Show(
std::unique_ptr<ConfirmInfoBarDelegate> delegate) {
// Owns itself, deleted by Close().
- auto* infobar = new GlobalConfirmInfoBar(std::move(delegate));
- return infobar->weak_factory_.GetWeakPtr();
+ new GlobalConfirmInfoBar(std::move(delegate));
}
void GlobalConfirmInfoBar::Close() {
@@ -205,6 +216,9 @@ void GlobalConfirmInfoBar::OnManagerShuttingDown(
}
void GlobalConfirmInfoBar::MaybeAddInfoBar(content::WebContents* web_contents) {
+ if (is_closing_)
+ return;
+
InfoBarService* infobar_service =
InfoBarService::FromWebContents(web_contents);
// WebContents from the tab strip must have the infobar service.
@@ -227,13 +241,11 @@ void GlobalConfirmInfoBar::MaybeAddInfoBar(content::WebContents* web_contents) {
// Asynchronously delete the global object because the BrowserTabStripTracker
// doesn't support being deleted while iterating over the existing tabs.
if (!added_bar) {
- if (!is_closing_) {
- is_closing_ = true;
+ is_closing_ = true;
- base::SequencedTaskRunnerHandle::Get()->PostTask(
- FROM_HERE, base::BindOnce(&GlobalConfirmInfoBar::Close,
- weak_factory_.GetWeakPtr()));
- }
+ base::SequencedTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE, base::BindOnce(&GlobalConfirmInfoBar::Close,
+ weak_factory_.GetWeakPtr()));
return;
}
diff --git a/chromium/chrome/browser/devtools/global_confirm_info_bar.h b/chromium/chrome/browser/devtools/global_confirm_info_bar.h
index ca10c39a340..c1bfa57d488 100644
--- a/chromium/chrome/browser/devtools/global_confirm_info_bar.h
+++ b/chromium/chrome/browser/devtools/global_confirm_info_bar.h
@@ -23,24 +23,32 @@ class WebContents;
// is dismissed or the close method is called.
// It listens to all tabs in all browsers and adds/removes confirm infobar
// to each of the tabs.
+// TODO(pkasting): This is a hack, driven by the original design of infobars
+// being tab-scoped. Either this should be replaced by a different UI for
+// whole-browser notifications, or the core infobar APIs should better
+// accommodate these sorts of infobars (e.g. with a separate "global infobar
+// manager" object or the like).
class GlobalConfirmInfoBar : public TabStripModelObserver,
public infobars::InfoBarManager::Observer {
public:
- static base::WeakPtr<GlobalConfirmInfoBar> Show(
- std::unique_ptr<ConfirmInfoBarDelegate> delegate);
-
- // Closes all the infobars.
- void Close();
+ // Attempts to show a global infobar for |delegate|. If infobar addition
+ // fails (e.g. because infobars are disabled), the global infobar will not
+ // appear, and it (and |delegate|) will be deleted asynchronously. Otherwise,
+ // the delegate will be deleted synchronously when any of the tabs' infobars
+ // is closed via user action. Note that both of these aspects of lifetime
+ // management differ from how typical infobars work.
+ static void Show(std::unique_ptr<ConfirmInfoBarDelegate> delegate);
// infobars::InfoBarManager::Observer:
void OnInfoBarRemoved(infobars::InfoBar* info_bar, bool animate) override;
void OnManagerShuttingDown(infobars::InfoBarManager* manager) override;
private:
+ class DelegateProxy;
+
explicit GlobalConfirmInfoBar(
std::unique_ptr<ConfirmInfoBarDelegate> delegate);
~GlobalConfirmInfoBar() override;
- class DelegateProxy;
// TabStripModelObserver:
void OnTabStripModelChanged(
@@ -54,6 +62,9 @@ class GlobalConfirmInfoBar : public TabStripModelObserver,
// Adds the info bar to the tab if it is missing.
void MaybeAddInfoBar(content::WebContents* web_contents);
+ // Closes all the infobars.
+ void Close();
+
std::unique_ptr<ConfirmInfoBarDelegate> delegate_;
std::map<infobars::InfoBarManager*, DelegateProxy*> proxies_;
BrowserTabStripTracker browser_tab_strip_tracker_{this, nullptr};
diff --git a/chromium/chrome/browser/devtools/global_confirm_info_bar_browsertest.cc b/chromium/chrome/browser/devtools/global_confirm_info_bar_browsertest.cc
index ea4fbed493f..7da8509544a 100644
--- a/chromium/chrome/browser/devtools/global_confirm_info_bar_browsertest.cc
+++ b/chromium/chrome/browser/devtools/global_confirm_info_bar_browsertest.cc
@@ -14,6 +14,7 @@
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "components/infobars/core/infobar.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_utils.h"
namespace {
@@ -55,39 +56,6 @@ class GlobalConfirmInfoBarTest : public InProcessBrowserTest {
} // namespace
-// Creates a global confirm info bar on a browser with 2 tabs and closes it.
-IN_PROC_BROWSER_TEST_F(GlobalConfirmInfoBarTest, MultipleTabs) {
- TabStripModel* tab_strip_model = browser()->tab_strip_model();
-
- AddTab();
- ASSERT_EQ(2, tab_strip_model->count());
-
- // Make sure each tab has no info bars.
- for (int i = 0; i < tab_strip_model->count(); i++)
- EXPECT_EQ(0u, GetInfoBarServiceFromTabIndex(i)->infobar_count());
-
- auto delegate = std::make_unique<TestConfirmInfoBarDelegate>();
- TestConfirmInfoBarDelegate* delegate_ptr = delegate.get();
-
- base::WeakPtr<GlobalConfirmInfoBar> global_confirm_info_bar =
- GlobalConfirmInfoBar::Show(std::move(delegate));
-
- // Verify that the info bar is shown on each tab.
- for (int i = 0; i < tab_strip_model->count(); i++) {
- InfoBarService* infobar_service = GetInfoBarServiceFromTabIndex(i);
- ASSERT_EQ(1u, infobar_service->infobar_count());
- EXPECT_TRUE(infobar_service->infobar_at(0)->delegate()->EqualsDelegate(
- delegate_ptr));
- }
-
- EXPECT_TRUE(global_confirm_info_bar);
- global_confirm_info_bar->Close();
-
- EXPECT_FALSE(global_confirm_info_bar);
- for (int i = 0; i < tab_strip_model->count(); i++)
- EXPECT_EQ(0u, GetInfoBarServiceFromTabIndex(i)->infobar_count());
-}
-
IN_PROC_BROWSER_TEST_F(GlobalConfirmInfoBarTest, UserInteraction) {
TabStripModel* tab_strip_model = browser()->tab_strip_model();
@@ -101,8 +69,7 @@ IN_PROC_BROWSER_TEST_F(GlobalConfirmInfoBarTest, UserInteraction) {
auto delegate = std::make_unique<TestConfirmInfoBarDelegate>();
TestConfirmInfoBarDelegate* delegate_ptr = delegate.get();
- base::WeakPtr<GlobalConfirmInfoBar> global_confirm_info_bar =
- GlobalConfirmInfoBar::Show(std::move(delegate));
+ GlobalConfirmInfoBar::Show(std::move(delegate));
// Verify that the info bar is shown on each tab.
for (int i = 0; i < tab_strip_model->count(); i++) {
@@ -121,10 +88,9 @@ IN_PROC_BROWSER_TEST_F(GlobalConfirmInfoBarTest, UserInteraction) {
// Usually, clicking the button makes the info bar close itself if Accept()
// returns true. In our case, since we interacted with the info bar delegate
- // directly, the info bar must be removed manually
+ // directly, the info bar must be removed manually.
first_tab_infobar->RemoveSelf();
- EXPECT_FALSE(global_confirm_info_bar);
for (int i = 0; i < tab_strip_model->count(); i++)
EXPECT_EQ(0u, GetInfoBarServiceFromTabIndex(i)->infobar_count());
}
diff --git a/chromium/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc b/chromium/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc
index 854e317df26..a8c6d20d510 100644
--- a/chromium/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc
+++ b/chromium/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc
@@ -18,6 +18,7 @@
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/ssl_status.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "net/dns/mock_host_resolver.h"
#include "net/ssl/ssl_cipher_suite_names.h"
@@ -28,13 +29,14 @@ namespace {
const char kIdParam[] = "id";
const char kMethodParam[] = "method";
+const char kParamsParam[] = "params";
} // namespace
class DevToolsProtocolTest : public InProcessBrowserTest,
public content::DevToolsAgentHostClient {
public:
- DevToolsProtocolTest() : last_sent_id_(0) {}
+ DevToolsProtocolTest() = default;
protected:
typedef base::RepeatingCallback<bool(const base::Value&)> NotificationMatcher;
@@ -48,9 +50,15 @@ class DevToolsProtocolTest : public InProcessBrowserTest,
base::StringPiece message_str(reinterpret_cast<const char*>(message.data()),
message.size());
auto parsed_message = base::JSONReader::Read(message_str);
- auto id = parsed_message->FindIntPath("id");
- if (id) {
- // TODO: implement handling of results from method calls (when needed).
+ if (auto id = parsed_message->FindIntPath("id")) {
+ base::Value* result;
+ ASSERT_TRUE(result = parsed_message->FindDictPath("result"));
+ result_ = result->Clone();
+ in_dispatch_ = false;
+ if (*id && *id == waiting_for_command_result_id_) {
+ waiting_for_command_result_id_ = 0;
+ std::move(run_loop_quit_closure_).Run();
+ }
} else {
std::string* notification = parsed_message->FindStringPath("method");
EXPECT_TRUE(notification);
@@ -70,13 +78,40 @@ class DevToolsProtocolTest : public InProcessBrowserTest,
}
void SendCommand(const std::string& method) {
+ SendCommand(method, base::Value(), false);
+ }
+
+ void SendCommandSync(const std::string& method) {
+ SendCommandSync(method, base::Value());
+ }
+
+ void SendCommandSync(const std::string& method, base::Value&& params) {
+ SendCommand(method, std::move(params), true);
+ }
+
+ void SendCommand(const std::string& method,
+ base::Value&& params,
+ bool synchronous) {
+ in_dispatch_ = true;
base::Value command(base::Value::Type::DICTIONARY);
command.SetKey(kIdParam, base::Value(++last_sent_id_));
command.SetKey(kMethodParam, base::Value(method));
+ if (!params.is_none())
+ command.SetPath(kParamsParam, std::move(params));
std::string json_command;
base::JSONWriter::Write(command, &json_command);
agent_host_->DispatchProtocolMessage(
this, base::as_bytes(base::make_span(json_command)));
+ // Some messages are dispatched synchronously.
+ // Only run loop if we are not finished yet.
+ if (in_dispatch_ && synchronous)
+ WaitForResponse();
+ in_dispatch_ = false;
+ }
+
+ void WaitForResponse() {
+ waiting_for_command_result_id_ = last_sent_id_;
+ RunLoopUpdatingQuitClosure();
}
void RunLoopUpdatingQuitClosure() {
@@ -86,6 +121,12 @@ class DevToolsProtocolTest : public InProcessBrowserTest,
run_loop.Run();
}
+ void AttachToBrowser() {
+ agent_host_ = content::DevToolsAgentHost::CreateForBrowser(
+ nullptr, content::DevToolsAgentHost::CreateServerSocketCallback());
+ agent_host_->AttachClient(this);
+ }
+
void Attach() {
agent_host_ = content::DevToolsAgentHost::GetOrCreateFor(web_contents());
agent_host_->AttachClient(this);
@@ -124,13 +165,15 @@ class DevToolsProtocolTest : public InProcessBrowserTest,
return std::move(waiting_for_notification_params_);
}
- private:
// DevToolsAgentHostClient interface
void AgentHostClosed(content::DevToolsAgentHost* agent_host) override {}
scoped_refptr<content::DevToolsAgentHost> agent_host_;
- int last_sent_id_;
+ int last_sent_id_ = 0;
base::OnceClosure run_loop_quit_closure_;
+ bool in_dispatch_ = false;
+ int waiting_for_command_result_id_ = 0;
+ base::Value result_;
std::vector<std::string> notifications_;
std::vector<base::Value> notification_params_;
std::string waiting_for_notification_;
@@ -163,6 +206,25 @@ IN_PROC_BROWSER_TEST_F(DevToolsProtocolTest,
security_state_issue_ids->GetList().end());
}
+IN_PROC_BROWSER_TEST_F(DevToolsProtocolTest, CreateDeleteContext) {
+ AttachToBrowser();
+ for (int i = 0; i < 2; i++) {
+ SendCommandSync("Target.createBrowserContext");
+ std::string* context_id_value = result_.FindStringPath("browserContextId");
+ ASSERT_TRUE(context_id_value);
+ std::string context_id = *context_id_value;
+
+ base::DictionaryValue params;
+ params.SetStringPath("url", "about:blank");
+ params.SetStringPath("browserContextId", context_id);
+ SendCommandSync("Target.createTarget", std::move(params));
+
+ params = base::DictionaryValue();
+ params.SetStringPath("browserContextId", context_id);
+ SendCommandSync("Target.disposeBrowserContext", std::move(params));
+ }
+}
+
IN_PROC_BROWSER_TEST_F(DevToolsProtocolTest, VisibleSecurityStateSecureState) {
net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
https_server.ServeFilesFromSourceDirectory(GetChromeTestDataDir());
diff --git a/chromium/chrome/browser/devtools/protocol/target_handler.h b/chromium/chrome/browser/devtools/protocol/target_handler.h
index 3960e0ce69e..ce9c6272f7d 100644
--- a/chromium/chrome/browser/devtools/protocol/target_handler.h
+++ b/chromium/chrome/browser/devtools/protocol/target_handler.h
@@ -10,7 +10,6 @@
#include "base/memory/weak_ptr.h"
#include "chrome/browser/devtools/protocol/forward.h"
#include "chrome/browser/devtools/protocol/target.h"
-#include "chrome/browser/profiles/independent_otr_profile_manager.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_list_observer.h"
#include "net/base/host_port_pair.h"
diff --git a/chromium/chrome/browser/download/android/BUILD.gn b/chromium/chrome/browser/download/android/BUILD.gn
index ee05a9b017e..38b102bb5f2 100644
--- a/chromium/chrome/browser/download/android/BUILD.gn
+++ b/chromium/chrome/browser/download/android/BUILD.gn
@@ -3,6 +3,7 @@
# found in the LICENSE file.
import("//build/config/android/rules.gni")
+import("//chrome/android/features/android_library_factory_tmpl.gni")
android_library("java") {
sources = [
@@ -13,36 +14,69 @@ android_library("java") {
"java/src/org/chromium/chrome/browser/download/DownloadFileProvider.java",
"java/src/org/chromium/chrome/browser/download/DownloadFilter.java",
"java/src/org/chromium/chrome/browser/download/DownloadInfo.java",
+ "java/src/org/chromium/chrome/browser/download/DownloadLocationCustomView.java",
+ "java/src/org/chromium/chrome/browser/download/DownloadLocationDialogBridge.java",
"java/src/org/chromium/chrome/browser/download/DownloadManagerBridge.java",
"java/src/org/chromium/chrome/browser/download/DownloadStartupUtils.java",
"java/src/org/chromium/chrome/browser/download/DownloadStatus.java",
"java/src/org/chromium/chrome/browser/download/MediaStoreHelper.java",
"java/src/org/chromium/chrome/browser/download/MimeUtils.java",
- "java/src/org/chromium/chrome/browser/download/UriUtils.java",
+ "java/src/org/chromium/chrome/browser/download/StringUtils.java",
+ "java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinator.java",
+ "java/src/org/chromium/chrome/browser/download/home/DownloadManagerUiConfig.java",
+ "java/src/org/chromium/chrome/browser/download/home/FaviconProvider.java",
+ "java/src/org/chromium/chrome/browser/download/home/JustNowProvider.java",
+ "java/src/org/chromium/chrome/browser/download/home/LegacyDownloadProvider.java",
+ "java/src/org/chromium/chrome/browser/download/settings/DownloadDirectoryAdapter.java",
+ "java/src/org/chromium/chrome/browser/download/settings/DownloadLocationPreference.java",
+ "java/src/org/chromium/chrome/browser/download/settings/DownloadLocationPreferenceAdapter.java",
+ "java/src/org/chromium/chrome/browser/download/settings/DownloadLocationPreferenceDialog.java",
+ "java/src/org/chromium/chrome/browser/download/settings/DownloadSettings.java",
]
deps = [
+ ":java_resources",
"//base:base_java",
"//base:jni_java",
+ "//chrome/browser/flags:java",
+ "//chrome/browser/offline_pages/android:java",
+ "//chrome/browser/preferences:java",
+ "//chrome/browser/ui/messages/android:java",
"//chrome/browser/util:java",
+ "//components/browser_ui/modaldialog/android:java",
+ "//components/browser_ui/settings/android:java",
+ "//components/browser_ui/util/android:java",
+ "//components/browser_ui/widget/android:java",
"//components/download/internal/common:internal_java",
"//components/download/public/common:public_java",
"//components/embedder_support/android:util_java",
+ "//components/feature_engagement:feature_engagement_java",
"//components/feed/core/shared_prefs:feed_shared_prefs",
"//components/offline_items_collection/core:core_java",
"//content/public/android:content_java",
"//third_party/android_deps:androidx_core_core_java",
+ "//third_party/android_deps:com_google_android_material_material_java",
+ "//ui/android:ui_java",
]
+ srcjar_deps = [ "//chrome:download_enum_javagen" ]
+
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
}
+android_library_factory("factory_java") {
+ deps = [ ":java" ]
+ sources = [ "java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinatorFactory.java" ]
+}
+
generate_jni("jni_headers") {
sources = [
"java/src/org/chromium/chrome/browser/download/DownloadInfo.java",
+ "java/src/org/chromium/chrome/browser/download/DownloadLocationDialogBridge.java",
"java/src/org/chromium/chrome/browser/download/DownloadManagerBridge.java",
"java/src/org/chromium/chrome/browser/download/DownloadStartupUtils.java",
"java/src/org/chromium/chrome/browser/download/MimeUtils.java",
+ "java/src/org/chromium/chrome/browser/download/StringUtils.java",
]
}
@@ -52,6 +86,7 @@ android_library("download_java_tests") {
sources = [
"javatests/src/org/chromium/chrome/browser/download/DownloadFileProviderTest.java",
"javatests/src/org/chromium/chrome/browser/download/MimeUtilsTest.java",
+ "javatests/src/org/chromium/chrome/browser/download/StringUtilsTest.java",
]
deps = [
@@ -59,6 +94,8 @@ android_library("download_java_tests") {
"//base:base_java",
"//base:base_java_test_support",
"//chrome/test/android:chrome_java_test_support",
+ "//components/offline_items_collection/core:core_java",
+ "//third_party/android_support_test_runner:runner_java",
"//third_party/junit",
"//third_party/mockito:mockito_java",
]
@@ -66,6 +103,17 @@ android_library("download_java_tests") {
android_resources("java_resources") {
sources = [
+ "java/res/color/tint_on_blue_bg.xml",
+ "java/res/drawable-hdpi/ic_refresh_white_24dp.png",
+ "java/res/drawable-hdpi/ic_refresh_white_36dp.png",
+ "java/res/drawable-mdpi/ic_refresh_white_24dp.png",
+ "java/res/drawable-mdpi/ic_refresh_white_36dp.png",
+ "java/res/drawable-xhdpi/ic_refresh_white_24dp.png",
+ "java/res/drawable-xhdpi/ic_refresh_white_36dp.png",
+ "java/res/drawable-xxhdpi/ic_refresh_white_24dp.png",
+ "java/res/drawable-xxhdpi/ic_refresh_white_36dp.png",
+ "java/res/drawable-xxxhdpi/ic_refresh_white_24dp.png",
+ "java/res/drawable-xxxhdpi/ic_refresh_white_36dp.png",
"java/res/drawable/async_image_view_unavailable.xml",
"java/res/drawable/async_image_view_waiting.xml",
"java/res/drawable/circular_progress_bar_background_large.xml",
@@ -109,9 +157,12 @@ android_resources("java_resources") {
"java/res/layout/download_storage_summary.xml",
"java/res/layout/downloads_empty_view.xml",
"java/res/menu/download_manager_menu.xml",
+ "java/res/values-night-v17/colors.xml",
"java/res/values-v17/attrs.xml",
+ "java/res/values-v17/colors.xml",
"java/res/values-v17/ids.xml",
"java/res/values-v17/styles.xml",
+ "java/res/xml/download_preferences.xml",
]
deps = [
"//chrome/browser/ui/android/strings:ui_strings_grd",
@@ -121,5 +172,5 @@ android_resources("java_resources") {
"//components/browser_ui/widget/android:java_resources",
"//ui/android:ui_java_resources",
]
- custom_package = "org.chromium.chrome.download"
+ custom_package = "org.chromium.chrome.browser.download"
}
diff --git a/chromium/chrome/browser/download/internal/android/BUILD.gn b/chromium/chrome/browser/download/internal/android/BUILD.gn
new file mode 100644
index 00000000000..397046b032c
--- /dev/null
+++ b/chromium/chrome/browser/download/internal/android/BUILD.gn
@@ -0,0 +1,18 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/android/rules.gni")
+
+android_library("java") {
+ sources = [ "java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinatorFactory.java" ]
+
+ deps = [
+ "//base:base_java",
+ "//chrome/browser/download/android:java",
+ "//chrome/browser/ui/messages/android:java",
+ "//components/feature_engagement:feature_engagement_java",
+ "//components/offline_items_collection/core:core_java",
+ "//ui/android:ui_java",
+ ]
+}
diff --git a/chromium/chrome/browser/upboarding/query_tiles/proto/BUILD.gn b/chromium/chrome/browser/enterprise/connectors/BUILD.gn
index 822c8fb8915..eaa74100bec 100644
--- a/chromium/chrome/browser/upboarding/query_tiles/proto/BUILD.gn
+++ b/chromium/chrome/browser/enterprise/connectors/BUILD.gn
@@ -4,9 +4,6 @@
import("//third_party/protobuf/proto_library.gni")
-proto_library("proto") {
- sources = [
- "image.proto",
- "query_tile_entry.proto",
- ]
+proto_library("connectors_proto") {
+ sources = [ "connectors.proto" ]
}
diff --git a/chromium/chrome/browser/enterprise/util/BUILD.gn b/chromium/chrome/browser/enterprise/util/BUILD.gn
new file mode 100644
index 00000000000..3b343b4cdf2
--- /dev/null
+++ b/chromium/chrome/browser/enterprise/util/BUILD.gn
@@ -0,0 +1,19 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/android/rules.gni")
+
+android_library("java") {
+ sources = [ "android/java/src/org/chromium/chrome/browser/enterprise/util/ManagedBrowserUtils.java" ]
+ deps = [
+ "//base:base_java",
+ "//base:jni_java",
+ "//chrome/browser/profiles/android:java",
+ ]
+ annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
+}
+
+generate_jni("jni_headers") {
+ sources = [ "android/java/src/org/chromium/chrome/browser/enterprise/util/ManagedBrowserUtils.java" ]
+}
diff --git a/chromium/chrome/browser/extensions/BUILD.gn b/chromium/chrome/browser/extensions/BUILD.gn
index 60cc5af9997..358b0a3b16f 100644
--- a/chromium/chrome/browser/extensions/BUILD.gn
+++ b/chromium/chrome/browser/extensions/BUILD.gn
@@ -3,7 +3,6 @@
# found in the LICENSE file.
import("//build/config/features.gni")
-import("//build/config/jumbo.gni")
import("//build/config/ui.gni")
import("//chrome/common/features.gni")
import("//components/nacl/features.gni")
@@ -14,7 +13,7 @@ import("//rlz/buildflags/buildflags.gni")
assert(enable_extensions)
-jumbo_static_library("extensions") {
+static_library("extensions") {
sources = [
# TODO These references to files in //chrome/browser/ should either be
# moved to the browser target or the files moved to this directory.
@@ -117,8 +116,8 @@ jumbo_static_library("extensions") {
"api/debugger/debugger_api.h",
"api/debugger/debugger_api_constants.cc",
"api/debugger/debugger_api_constants.h",
- "api/debugger/extension_dev_tools_infobar.cc",
- "api/debugger/extension_dev_tools_infobar.h",
+ "api/debugger/extension_dev_tools_infobar_delegate.cc",
+ "api/debugger/extension_dev_tools_infobar_delegate.h",
"api/declarative_content/chrome_content_rules_registry.cc",
"api/declarative_content/chrome_content_rules_registry.h",
"api/declarative_content/content_action.cc",
@@ -458,8 +457,6 @@ jumbo_static_library("extensions") {
"chrome_extension_cookies.h",
"chrome_extension_cookies_factory.cc",
"chrome_extension_cookies_factory.h",
- "chrome_extension_function.cc",
- "chrome_extension_function.h",
"chrome_extension_function_details.cc",
"chrome_extension_function_details.h",
"chrome_extension_host_delegate.cc",
@@ -507,8 +504,6 @@ jumbo_static_library("extensions") {
"error_console/error_console_factory.h",
"event_router_forwarder.cc",
"event_router_forwarder.h",
- "extension_action.cc",
- "extension_action.h",
"extension_action_icon_factory.cc",
"extension_action_icon_factory.h",
"extension_action_manager.cc",
@@ -791,23 +786,27 @@ jumbo_static_library("extensions") {
"//chrome/app/theme:chrome_unscaled_resources",
"//chrome/app/theme:theme_resources",
"//chrome/app/vector_icons",
+ "//chrome/browser:ntp_background_proto",
"//chrome/browser:theme_properties",
"//chrome/browser/devtools",
"//chrome/browser/engagement:mojo_bindings",
"//chrome/browser/image_decoder",
"//chrome/browser/media/router",
"//chrome/browser/media/router/discovery",
+ "//chrome/browser/resource_coordinator:intervention_policy_database_proto",
"//chrome/browser/resource_coordinator:mojo_bindings",
"//chrome/browser/safe_browsing",
"//chrome/browser/web_applications/components",
"//chrome/browser/web_applications/extensions",
"//chrome/common/extensions/api:extensions_features",
"//chrome/common/safe_browsing:proto",
+ "//chrome/services/app_service/public/mojom",
"//chrome/services/removable_storage_writer/public/mojom",
"//components/autofill/content/browser",
"//components/bookmarks/browser",
"//components/bookmarks/managed",
"//components/browser_sync",
+ "//components/browsing_data/content",
"//components/browsing_data/core",
"//components/content_settings/core/browser",
"//components/cookie_config:cookie_config",
@@ -866,6 +865,8 @@ jumbo_static_library("extensions") {
"//components/sync_preferences",
"//components/sync_sessions",
"//components/translate/content/browser",
+ "//components/translate/core/browser",
+ "//components/translate/core/common",
"//components/undo",
"//components/unified_consent",
"//components/update_client",
@@ -1004,6 +1005,7 @@ jumbo_static_library("extensions") {
"//ash/public/cpp",
"//chrome/browser/chromeos/crostini:crostini_installer_types_mojom",
"//chrome/browser/resources/chromeos/camera:chrome_camera_app",
+ "//chrome/browser/ui/webui/settings/chromeos/constants:mojom",
"//chromeos",
"//chromeos/attestation",
"//chromeos/components/proximity_auth",
@@ -1016,7 +1018,7 @@ jumbo_static_library("extensions") {
"//chromeos/login/auth",
"//chromeos/login/login_state",
"//chromeos/network",
- "//chromeos/services/assistant/public/cpp:prefs",
+ "//chromeos/services/assistant/public/cpp",
"//chromeos/services/ime/public/mojom",
"//chromeos/services/machine_learning/public/cpp",
"//chromeos/services/machine_learning/public/mojom",
@@ -1107,7 +1109,6 @@ jumbo_static_library("extensions") {
}
if (use_x11) {
- configs += [ "//build/config/linux:x11" ]
deps += [
"//ui/events:events_base",
"//ui/events/platform",
diff --git a/chromium/chrome/browser/extensions/api/activity_log_private/activity_log_private_apitest.cc b/chromium/chrome/browser/extensions/api/activity_log_private/activity_log_private_apitest.cc
index 69f3e85c660..5d7be8f6b8c 100644
--- a/chromium/chrome/browser/extensions/api/activity_log_private/activity_log_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/activity_log_private/activity_log_private_apitest.cc
@@ -10,6 +10,7 @@
#include "chrome/browser/extensions/activity_log/activity_log.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "chrome/common/chrome_switches.h"
+#include "content/public/test/browser_test.h"
#include "extensions/common/extension_builder.h"
#include "net/dns/mock_host_resolver.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
diff --git a/chromium/chrome/browser/extensions/api/alarms/alarms_apitest.cc b/chromium/chrome/browser/extensions/api/alarms/alarms_apitest.cc
index 3601f29123e..eacee156995 100644
--- a/chromium/chrome/browser/extensions/api/alarms/alarms_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/alarms/alarms_apitest.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "chrome/browser/extensions/extension_apitest.h"
+#include "content/public/test/browser_test.h"
#include "extensions/browser/event_router.h"
#include "extensions/common/api/test.h"
#include "extensions/test/extension_test_message_listener.h"
diff --git a/chromium/chrome/browser/extensions/api/autofill_assistant_private/autofill_assistant_private_api.cc b/chromium/chrome/browser/extensions/api/autofill_assistant_private/autofill_assistant_private_api.cc
index 83041ce1abf..a96f3c9d9d7 100644
--- a/chromium/chrome/browser/extensions/api/autofill_assistant_private/autofill_assistant_private_api.cc
+++ b/chromium/chrome/browser/extensions/api/autofill_assistant_private/autofill_assistant_private_api.cc
@@ -16,6 +16,7 @@
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/signin/identity_manager_factory.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/common/channel_info.h"
#include "components/autofill/core/browser/field_types.h"
#include "extensions/browser/event_router_factory.h"
@@ -314,13 +315,15 @@ void AutofillAssistantPrivateAPI::AttachUI() {}
void AutofillAssistantPrivateAPI::DestroyUI() {}
-std::string AutofillAssistantPrivateAPI::GetApiKey() const {
- // TODO(crbug.com/1015753): Use chromium's keys and also consider the
- // autofill-assistant-key here to override that particular key.
- return "invalid";
+version_info::Channel AutofillAssistantPrivateAPI::GetChannel() const {
+ // TODO(crbug.com/1015753): Make a minimal client impl available in a common
+ // chrome/browser/autofill_assistant and share it with the android client
+ // impl.
+ return chrome::GetChannel();
}
-std::string AutofillAssistantPrivateAPI::GetAccountEmailAddress() const {
+std::string AutofillAssistantPrivateAPI::GetEmailAddressForAccessTokenAccount()
+ const {
return "joe@example.com";
}
@@ -341,18 +344,11 @@ AutofillAssistantPrivateAPI::GetPasswordManagerClient() const {
return nullptr;
}
-autofill_assistant::WebsiteLoginFetcher*
-AutofillAssistantPrivateAPI::GetWebsiteLoginFetcher() const {
+autofill_assistant::WebsiteLoginManager*
+AutofillAssistantPrivateAPI::GetWebsiteLoginManager() const {
return nullptr;
}
-std::string AutofillAssistantPrivateAPI::GetServerUrl() const {
- // TODO(crbug.com/1015753): Consider the autofill-assistant-url for endpoint
- // overrides and share the kDefaultAutofillAssistantServerUrl to expose it
- // here.
- return "https://automate-pa.googleapis.com";
-}
-
std::string AutofillAssistantPrivateAPI::GetLocale() const {
return "en-us";
}
diff --git a/chromium/chrome/browser/extensions/api/autofill_assistant_private/autofill_assistant_private_api.h b/chromium/chrome/browser/extensions/api/autofill_assistant_private/autofill_assistant_private_api.h
index d047699de6c..d9b1b8fdea7 100644
--- a/chromium/chrome/browser/extensions/api/autofill_assistant_private/autofill_assistant_private_api.h
+++ b/chromium/chrome/browser/extensions/api/autofill_assistant_private/autofill_assistant_private_api.h
@@ -196,15 +196,14 @@ class AutofillAssistantPrivateAPI : public BrowserContextKeyedAPI,
// autofill_assistant::Client:
void AttachUI() override;
void DestroyUI() override;
- std::string GetApiKey() const override;
- std::string GetAccountEmailAddress() const override;
+ version_info::Channel GetChannel() const override;
+ std::string GetEmailAddressForAccessTokenAccount() const override;
autofill_assistant::AccessTokenFetcher* GetAccessTokenFetcher() override;
autofill::PersonalDataManager* GetPersonalDataManager() const override;
password_manager::PasswordManagerClient* GetPasswordManagerClient()
const override;
- autofill_assistant::WebsiteLoginFetcher* GetWebsiteLoginFetcher()
+ autofill_assistant::WebsiteLoginManager* GetWebsiteLoginManager()
const override;
- std::string GetServerUrl() const override;
std::string GetLocale() const override;
std::string GetCountryCode() const override;
autofill_assistant::DeviceContext GetDeviceContext() const override;
diff --git a/chromium/chrome/browser/extensions/api/autofill_private/autofill_private_apitest.cc b/chromium/chrome/browser/extensions/api/autofill_private/autofill_private_apitest.cc
index e38e8d02d4b..00a1b8607db 100644
--- a/chromium/chrome/browser/extensions/api/autofill_private/autofill_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/autofill_private/autofill_private_apitest.cc
@@ -8,6 +8,7 @@
#include "chrome/browser/extensions/extension_apitest.h"
#include "chrome/common/extensions/api/autofill_private.h"
#include "components/keyed_service/core/keyed_service.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_utils.h"
#include "extensions/common/switches.h"
@@ -65,9 +66,7 @@ IN_PROC_BROWSER_TEST_F(AutofillPrivateApiTest, AddAndUpdateAddress) {
EXPECT_TRUE(RunAutofillSubtest("addAndUpdateAddress")) << message_;
}
-// TODO(crbug.com/934631) Disabled for flakiness.
-IN_PROC_BROWSER_TEST_F(AutofillPrivateApiTest,
- DISABLED_AddAndUpdateCreditCard) {
+IN_PROC_BROWSER_TEST_F(AutofillPrivateApiTest, AddAndUpdateCreditCard) {
EXPECT_TRUE(RunAutofillSubtest("addAndUpdateCreditCard")) << message_;
}
diff --git a/chromium/chrome/browser/extensions/api/automation/automation_apitest.cc b/chromium/chrome/browser/extensions/api/automation/automation_apitest.cc
index 75ccc7c7c83..4e52aa9d69b 100644
--- a/chromium/chrome/browser/extensions/api/automation/automation_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/automation/automation_apitest.cc
@@ -23,6 +23,7 @@
#include "content/public/browser/render_widget_host_view.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_features.h"
+#include "content/public/test/browser_test.h"
#include "extensions/browser/api/automation_internal/automation_event_router.h"
#include "extensions/common/api/automation_internal.h"
#include "extensions/test/extension_test_message_listener.h"
@@ -425,6 +426,12 @@ IN_PROC_BROWSER_TEST_F(AutomationApiTest, ForceLayout) {
<< message_;
}
+IN_PROC_BROWSER_TEST_F(AutomationApiTest, Intents) {
+ StartEmbeddedTestServer();
+ ASSERT_TRUE(RunExtensionSubtest("automation/tests/tabs", "intents.html"))
+ << message_;
+}
+
#if defined(OS_CHROMEOS)
class AutomationApiTestWithDeviceScaleFactor : public AutomationApiTest {
@@ -453,6 +460,13 @@ IN_PROC_BROWSER_TEST_F(AutomationApiTest, Position) {
<< message_;
}
+IN_PROC_BROWSER_TEST_F(AutomationApiTest, AccessibilityFocus) {
+ StartEmbeddedTestServer();
+ ASSERT_TRUE(
+ RunExtensionSubtest("automation/tests/tabs", "accessibility_focus.html"))
+ << message_;
+}
+
#endif // defined(OS_CHROMEOS)
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_apitest.cc b/chromium/chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_apitest.cc
index 5647c37ee5b..660aa4ed198 100644
--- a/chromium/chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_apitest.cc
@@ -10,6 +10,7 @@
#include "base/test/gmock_move_support.h"
#include "chrome/browser/extensions/extension_apitest.h"
+#include "content/public/test/browser_test.h"
#include "device/bluetooth/test/mock_bluetooth_adapter.h"
#include "device/bluetooth/test/mock_bluetooth_device.h"
#include "device/bluetooth/test/mock_bluetooth_gatt_characteristic.h"
diff --git a/chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api.cc b/chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api.cc
index ee42b5b5de6..7b0cdb28d3d 100644
--- a/chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api.cc
+++ b/chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api.cc
@@ -311,56 +311,61 @@ void BookmarkManagerPrivateDragEventRouter::ClearBookmarkNodeData() {
bookmark_drag_data_.Clear();
}
-bool ClipboardBookmarkManagerFunction::CopyOrCut(bool cut,
+ExtensionFunction::ResponseValue ClipboardBookmarkManagerFunction::CopyOrCut(
+ bool cut,
const std::vector<std::string>& id_list) {
BookmarkModel* model = GetBookmarkModel();
std::vector<const BookmarkNode*> nodes;
if (!GetNodesFromVector(model, id_list, &nodes)) {
- error_ = "Could not find bookmark nodes with given ids.";
- return false;
+ return Error(bookmark_keys::kBookmarkNodesNotFoundFromIdListError,
+ base::JoinString(id_list, ", "));
}
+
bookmarks::ManagedBookmarkService* managed = GetManagedBookmarkService();
- if (cut && bookmarks::HasDescendantsOf(nodes, managed->managed_node())) {
- error_ = bookmark_keys::kModifyManagedError;
- return false;
- }
- if (cut && HasPermanentNodes(nodes)) {
- error_ = bookmark_keys::kModifySpecialError;
- return false;
- }
+ if (cut && bookmarks::HasDescendantsOf(nodes, managed->managed_node()))
+ return Error(bookmark_keys::kModifyManagedError);
+ if (cut && HasPermanentNodes(nodes))
+ return Error(bookmark_keys::kModifySpecialError);
bookmarks::CopyToClipboard(model, nodes, cut);
- return true;
+ return NoArguments();
}
-bool BookmarkManagerPrivateCopyFunction::RunOnReady() {
+ExtensionFunction::ResponseValue
+BookmarkManagerPrivateCopyFunction::RunOnReady() {
std::unique_ptr<Copy::Params> params(Copy::Params::Create(*args_));
- EXTENSION_FUNCTION_VALIDATE(params);
+ if (!params)
+ return BadMessage();
return CopyOrCut(false, params->id_list);
}
-bool BookmarkManagerPrivateCutFunction::RunOnReady() {
+ExtensionFunction::ResponseValue
+BookmarkManagerPrivateCutFunction::RunOnReady() {
if (!EditBookmarksEnabled())
- return false;
+ return Error(bookmark_keys::kEditBookmarksDisabled);
std::unique_ptr<Cut::Params> params(Cut::Params::Create(*args_));
- EXTENSION_FUNCTION_VALIDATE(params);
+ if (!params)
+ return BadMessage();
return CopyOrCut(true, params->id_list);
}
-bool BookmarkManagerPrivatePasteFunction::RunOnReady() {
+ExtensionFunction::ResponseValue
+BookmarkManagerPrivatePasteFunction::RunOnReady() {
if (!EditBookmarksEnabled())
- return false;
+ return Error(bookmark_keys::kEditBookmarksDisabled);
std::unique_ptr<Paste::Params> params(Paste::Params::Create(*args_));
- EXTENSION_FUNCTION_VALIDATE(params);
+ if (!params)
+ return BadMessage();
BookmarkModel* model =
BookmarkModelFactory::GetForBrowserContext(GetProfile());
const BookmarkNode* parent_node = GetNodeFromString(model, params->parent_id);
- if (!CanBeModified(parent_node))
- return false;
+ std::string error;
+ if (!CanBeModified(parent_node, &error))
+ return Error(error);
bool can_paste = bookmarks::CanPasteFromClipboard(model, parent_node);
if (!can_paste)
- return false;
+ return Error("Could not paste from clipboard");
// We want to use the highest index of the selected nodes as a destination.
std::vector<const BookmarkNode*> nodes;
@@ -379,66 +384,70 @@ bool BookmarkManagerPrivatePasteFunction::RunOnReady() {
: size_t{highest_index};
bookmarks::PasteFromClipboard(model, parent_node, insertion_index);
- return true;
+ return NoArguments();
}
-bool BookmarkManagerPrivateCanPasteFunction::RunOnReady() {
+ExtensionFunction::ResponseValue
+BookmarkManagerPrivateCanPasteFunction::RunOnReady() {
std::unique_ptr<CanPaste::Params> params(CanPaste::Params::Create(*args_));
- EXTENSION_FUNCTION_VALIDATE(params);
+ if (!params)
+ return BadMessage();
PrefService* prefs = user_prefs::UserPrefs::Get(GetProfile());
- if (!prefs->GetBoolean(bookmarks::prefs::kEditBookmarksEnabled)) {
- SetResult(std::make_unique<base::Value>(false));
- return true;
- }
+ if (!prefs->GetBoolean(bookmarks::prefs::kEditBookmarksEnabled))
+ return OneArgument(std::make_unique<base::Value>(false));
BookmarkModel* model =
BookmarkModelFactory::GetForBrowserContext(GetProfile());
const BookmarkNode* parent_node = GetNodeFromString(model, params->parent_id);
- if (!parent_node) {
- error_ = bookmark_keys::kNoParentError;
- return false;
- }
+ if (!parent_node)
+ return Error(bookmark_keys::kNoParentError);
bool can_paste = bookmarks::CanPasteFromClipboard(model, parent_node);
- SetResult(std::make_unique<base::Value>(can_paste));
- return true;
+ return OneArgument(std::make_unique<base::Value>(can_paste));
}
-bool BookmarkManagerPrivateSortChildrenFunction::RunOnReady() {
+ExtensionFunction::ResponseValue
+BookmarkManagerPrivateSortChildrenFunction::RunOnReady() {
if (!EditBookmarksEnabled())
- return false;
+ return Error(bookmark_keys::kEditBookmarksDisabled);
std::unique_ptr<SortChildren::Params> params(
SortChildren::Params::Create(*args_));
- EXTENSION_FUNCTION_VALIDATE(params);
+ if (!params)
+ return BadMessage();
BookmarkModel* model =
BookmarkModelFactory::GetForBrowserContext(GetProfile());
const BookmarkNode* parent_node = GetNodeFromString(model, params->parent_id);
- if (!CanBeModified(parent_node))
- return false;
+ std::string error;
+ if (!CanBeModified(parent_node, &error))
+ return Error(error);
model->SortChildren(parent_node);
- return true;
+ return NoArguments();
}
-bool BookmarkManagerPrivateStartDragFunction::RunOnReady() {
+ExtensionFunction::ResponseValue
+BookmarkManagerPrivateStartDragFunction::RunOnReady() {
if (!EditBookmarksEnabled())
- return false;
+ return Error(bookmark_keys::kEditBookmarksDisabled);
content::WebContents* web_contents = GetSenderWebContents();
if (GetViewType(web_contents) != VIEW_TYPE_TAB_CONTENTS) {
NOTREACHED();
- return false;
+ return Error(kUnknownErrorDoNotUse);
}
std::unique_ptr<StartDrag::Params> params(StartDrag::Params::Create(*args_));
- EXTENSION_FUNCTION_VALIDATE(params);
+ if (!params)
+ return BadMessage();
BookmarkModel* model =
BookmarkModelFactory::GetForBrowserContext(GetProfile());
std::vector<const BookmarkNode*> nodes;
- if (!GetNodesFromVector(model, params->id_list, &nodes))
- return false;
+ if (!GetNodesFromVector(model, params->id_list, &nodes)) {
+ return Error(bookmark_keys::kBookmarkNodesNotFoundFromIdListError,
+ base::JoinString(params->id_list, ", "));
+ }
ui::DragDropTypes::DragEventSource source =
ui::DragDropTypes::DRAG_EVENT_SOURCE_MOUSE;
@@ -450,22 +459,25 @@ bool BookmarkManagerPrivateStartDragFunction::RunOnReady() {
web_contents->GetContentNativeView(), source,
gfx::Point(params->x, params->y)});
- return true;
+ return NoArguments();
}
-bool BookmarkManagerPrivateDropFunction::RunOnReady() {
+ExtensionFunction::ResponseValue
+BookmarkManagerPrivateDropFunction::RunOnReady() {
if (!EditBookmarksEnabled())
- return false;
+ return Error(bookmark_keys::kEditBookmarksDisabled);
std::unique_ptr<Drop::Params> params(Drop::Params::Create(*args_));
- EXTENSION_FUNCTION_VALIDATE(params);
+ if (!params)
+ return BadMessage();
BookmarkModel* model =
BookmarkModelFactory::GetForBrowserContext(GetProfile());
const BookmarkNode* drop_parent = GetNodeFromString(model, params->parent_id);
- if (!CanBeModified(drop_parent))
- return false;
+ std::string error;
+ if (!CanBeModified(drop_parent, &error))
+ return Error(error);
content::WebContents* web_contents = GetSenderWebContents();
DCHECK_EQ(VIEW_TYPE_TAB_CONTENTS, GetViewType(web_contents));
@@ -487,13 +499,15 @@ bool BookmarkManagerPrivateDropFunction::RunOnReady() {
GetProfile(), *drag_data, drop_parent, drop_index, copy);
router->ClearBookmarkNodeData();
- return true;
+ return NoArguments();
}
-bool BookmarkManagerPrivateGetSubtreeFunction::RunOnReady() {
+ExtensionFunction::ResponseValue
+BookmarkManagerPrivateGetSubtreeFunction::RunOnReady() {
std::unique_ptr<GetSubtree::Params> params(
GetSubtree::Params::Create(*args_));
- EXTENSION_FUNCTION_VALIDATE(params);
+ if (!params)
+ return BadMessage();
const BookmarkNode* node = NULL;
@@ -502,9 +516,10 @@ bool BookmarkManagerPrivateGetSubtreeFunction::RunOnReady() {
BookmarkModelFactory::GetForBrowserContext(GetProfile());
node = model->root_node();
} else {
- node = GetBookmarkNodeFromId(params->id);
+ std::string error;
+ node = GetBookmarkNodeFromId(params->id, &error);
if (!node)
- return false;
+ return Error(error);
}
std::vector<api::bookmarks::BookmarkTreeNode> nodes;
@@ -513,48 +528,52 @@ bool BookmarkManagerPrivateGetSubtreeFunction::RunOnReady() {
bookmark_api_helpers::AddNodeFoldersOnly(managed, node, &nodes, true);
else
bookmark_api_helpers::AddNode(managed, node, &nodes, true);
- SetResultList(GetSubtree::Results::Create(nodes));
- return true;
+ return ArgumentList(GetSubtree::Results::Create(nodes));
}
-bool BookmarkManagerPrivateRemoveTreesFunction::RunOnReady() {
+ExtensionFunction::ResponseValue
+BookmarkManagerPrivateRemoveTreesFunction::RunOnReady() {
if (!EditBookmarksEnabled())
- return false;
+ return Error(bookmark_keys::kEditBookmarksDisabled);
std::unique_ptr<RemoveTrees::Params> params(
RemoveTrees::Params::Create(*args_));
- EXTENSION_FUNCTION_VALIDATE(params);
+ if (!params)
+ return BadMessage();
BookmarkModel* model = GetBookmarkModel();
bookmarks::ManagedBookmarkService* managed = GetManagedBookmarkService();
bookmarks::ScopedGroupBookmarkActions group_deletes(model);
int64_t id;
- for (size_t i = 0; i < params->id_list.size(); ++i) {
- if (!GetBookmarkIdAsInt64(params->id_list[i], &id))
- return false;
- if (!bookmark_api_helpers::RemoveNode(model, managed, id, true, &error_))
- return false;
+ std::string error;
+ for (const std::string& id_string : params->id_list) {
+ if (!base::StringToInt64(id_string, &id))
+ return Error(bookmark_keys::kInvalidIdError);
+ if (!bookmark_api_helpers::RemoveNode(model, managed, id, true, &error))
+ return Error(error);
}
- return true;
+ return NoArguments();
}
-bool BookmarkManagerPrivateUndoFunction::RunOnReady() {
+ExtensionFunction::ResponseValue
+BookmarkManagerPrivateUndoFunction::RunOnReady() {
if (!EditBookmarksEnabled())
- return false;
+ return Error(bookmark_keys::kEditBookmarksDisabled);
BookmarkUndoServiceFactory::GetForProfile(GetProfile())->undo_manager()->
Undo();
- return true;
+ return NoArguments();
}
-bool BookmarkManagerPrivateRedoFunction::RunOnReady() {
+ExtensionFunction::ResponseValue
+BookmarkManagerPrivateRedoFunction::RunOnReady() {
if (!EditBookmarksEnabled())
- return false;
+ return Error(bookmark_keys::kEditBookmarksDisabled);
BookmarkUndoServiceFactory::GetForProfile(GetProfile())->undo_manager()->
Redo();
- return true;
+ return NoArguments();
}
WEB_CONTENTS_USER_DATA_KEY_IMPL(BookmarkManagerPrivateDragEventRouter)
diff --git a/chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api.h b/chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api.h
index c85dd537d4c..b2617d86624 100644
--- a/chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api.h
+++ b/chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api.h
@@ -10,7 +10,6 @@
#include "base/macros.h"
#include "base/values.h"
#include "chrome/browser/extensions/api/bookmarks/bookmarks_api.h"
-#include "chrome/browser/extensions/chrome_extension_function.h"
#include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h"
#include "chrome/browser/undo/bookmark_undo_service_factory.h"
#include "components/bookmarks/browser/base_bookmark_model_observer.h"
@@ -19,6 +18,7 @@
#include "content/public/browser/web_contents_user_data.h"
#include "extensions/browser/browser_context_keyed_api_factory.h"
#include "extensions/browser/event_router.h"
+#include "extensions/browser/extension_function.h"
class Profile;
@@ -131,7 +131,7 @@ class ClipboardBookmarkManagerFunction : public extensions::BookmarksFunction {
protected:
~ClipboardBookmarkManagerFunction() override {}
- bool CopyOrCut(bool cut, const std::vector<std::string>& id_list);
+ ResponseValue CopyOrCut(bool cut, const std::vector<std::string>& id_list);
};
class BookmarkManagerPrivateCopyFunction
@@ -143,8 +143,8 @@ class BookmarkManagerPrivateCopyFunction
protected:
~BookmarkManagerPrivateCopyFunction() override {}
- // ExtensionFunction:
- bool RunOnReady() override;
+ // BookmarksFunction:
+ ResponseValue RunOnReady() override;
};
class BookmarkManagerPrivateCutFunction
@@ -156,8 +156,8 @@ class BookmarkManagerPrivateCutFunction
protected:
~BookmarkManagerPrivateCutFunction() override {}
- // ExtensionFunction:
- bool RunOnReady() override;
+ // BookmarksFunction:
+ ResponseValue RunOnReady() override;
};
class BookmarkManagerPrivatePasteFunction
@@ -169,8 +169,8 @@ class BookmarkManagerPrivatePasteFunction
protected:
~BookmarkManagerPrivatePasteFunction() override {}
- // ExtensionFunction:
- bool RunOnReady() override;
+ // BookmarksFunction:
+ ResponseValue RunOnReady() override;
};
class BookmarkManagerPrivateCanPasteFunction
@@ -182,8 +182,8 @@ class BookmarkManagerPrivateCanPasteFunction
protected:
~BookmarkManagerPrivateCanPasteFunction() override {}
- // ExtensionFunction:
- bool RunOnReady() override;
+ // BookmarksFunction:
+ ResponseValue RunOnReady() override;
};
class BookmarkManagerPrivateSortChildrenFunction
@@ -195,8 +195,8 @@ class BookmarkManagerPrivateSortChildrenFunction
protected:
~BookmarkManagerPrivateSortChildrenFunction() override {}
- // ExtensionFunction:
- bool RunOnReady() override;
+ // BookmarksFunction:
+ ResponseValue RunOnReady() override;
};
class BookmarkManagerPrivateStartDragFunction
@@ -208,8 +208,8 @@ class BookmarkManagerPrivateStartDragFunction
protected:
~BookmarkManagerPrivateStartDragFunction() override {}
- // ExtensionFunction:
- bool RunOnReady() override;
+ // BookmarksFunction:
+ ResponseValue RunOnReady() override;
};
class BookmarkManagerPrivateDropFunction
@@ -221,8 +221,8 @@ class BookmarkManagerPrivateDropFunction
protected:
~BookmarkManagerPrivateDropFunction() override {}
- // ExtensionFunction:
- bool RunOnReady() override;
+ // BookmarksFunction:
+ ResponseValue RunOnReady() override;
};
class BookmarkManagerPrivateGetSubtreeFunction
@@ -234,8 +234,8 @@ class BookmarkManagerPrivateGetSubtreeFunction
protected:
~BookmarkManagerPrivateGetSubtreeFunction() override {}
- // ExtensionFunction:
- bool RunOnReady() override;
+ // BookmarksFunction:
+ ResponseValue RunOnReady() override;
};
class BookmarkManagerPrivateRemoveTreesFunction
@@ -247,8 +247,8 @@ class BookmarkManagerPrivateRemoveTreesFunction
protected:
~BookmarkManagerPrivateRemoveTreesFunction() override {}
- // ExtensionFunction:
- bool RunOnReady() override;
+ // BookmarksFunction:
+ ResponseValue RunOnReady() override;
};
class BookmarkManagerPrivateUndoFunction
@@ -260,8 +260,8 @@ class BookmarkManagerPrivateUndoFunction
protected:
~BookmarkManagerPrivateUndoFunction() override {}
- // ExtensionFunction:
- bool RunOnReady() override;
+ // BookmarksFunction:
+ ResponseValue RunOnReady() override;
};
class BookmarkManagerPrivateRedoFunction
@@ -273,8 +273,8 @@ class BookmarkManagerPrivateRedoFunction
protected:
~BookmarkManagerPrivateRedoFunction() override {}
- // ExtensionFunction:
- bool RunOnReady() override;
+ // BookmarksFunction:
+ ResponseValue RunOnReady() override;
};
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api_unittest.cc b/chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api_unittest.cc
index 199416715d5..e8cf3f76346 100644
--- a/chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api_unittest.cc
@@ -58,7 +58,8 @@ TEST_F(BookmarkManagerPrivateApiUnitTest, RunOnDeletedNode) {
auto copy_function =
base::MakeRefCounted<BookmarkManagerPrivateCopyFunction>();
EXPECT_EQ(
- "Could not find bookmark nodes with given ids.",
+ base::StringPrintf("Could not find bookmark nodes with given ids: [%s]",
+ node_id().c_str()),
api_test_utils::RunFunctionAndReturnError(
copy_function.get(),
base::StringPrintf("[[\"%s\"]]", node_id().c_str()), profile()));
diff --git a/chromium/chrome/browser/extensions/api/bookmarks/bookmark_api_constants.cc b/chromium/chrome/browser/extensions/api/bookmarks/bookmark_api_constants.cc
index dc32b2acc20..39958dcfe5e 100644
--- a/chromium/chrome/browser/extensions/api/bookmarks/bookmark_api_constants.cc
+++ b/chromium/chrome/browser/extensions/api/bookmarks/bookmark_api_constants.cc
@@ -23,6 +23,8 @@ const char kEditBookmarksDisabled[] = "Bookmark editing is disabled.";
const char kModifyManagedError[] = "Can't modify managed bookmarks.";
const char kInvalidParamError[] = "Parameter 'key' is invalid.";
const char kCannotSetUrlOfFolderError[] = "Can't set URL of a bookmark folder.";
+const char kBookmarkNodesNotFoundFromIdListError[] =
+ "Could not find bookmark nodes with given ids: [*]";
} // namespace bookmark_api_constants
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/bookmarks/bookmark_api_constants.h b/chromium/chrome/browser/extensions/api/bookmarks/bookmark_api_constants.h
index e4f0402fe9a..3b6ef427404 100644
--- a/chromium/chrome/browser/extensions/api/bookmarks/bookmark_api_constants.h
+++ b/chromium/chrome/browser/extensions/api/bookmarks/bookmark_api_constants.h
@@ -27,6 +27,7 @@ extern const char kEditBookmarksDisabled[];
extern const char kModifyManagedError[];
extern const char kInvalidParamError[];
extern const char kCannotSetUrlOfFolderError[];
+extern const char kBookmarkNodesNotFoundFromIdListError[];
} // namespace bookmark_api_constants
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/bookmarks/bookmark_apitest.cc b/chromium/chrome/browser/extensions/api/bookmarks/bookmark_apitest.cc
index 5d4a47cb64b..0664a2e51ba 100644
--- a/chromium/chrome/browser/extensions/api/bookmarks/bookmark_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/bookmarks/bookmark_apitest.cc
@@ -18,6 +18,7 @@
#include "components/bookmarks/managed/managed_bookmark_service.h"
#include "components/bookmarks/test/bookmark_test_helpers.h"
#include "components/prefs/pref_service.h"
+#include "content/public/test/browser_test.h"
using bookmarks::BookmarkModel;
diff --git a/chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc b/chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc
index 9f93b617fb2..f7fa8079e88 100644
--- a/chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc
+++ b/chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc
@@ -93,18 +93,18 @@ base::FilePath GetDefaultFilepathForBookmarkExport() {
} // namespace
-bool BookmarksFunction::RunAsync() {
+ExtensionFunction::ResponseAction BookmarksFunction::Run() {
BookmarkModel* model =
BookmarkModelFactory::GetForBrowserContext(GetProfile());
if (!model->loaded()) {
// Bookmarks are not ready yet. We'll wait.
model->AddObserver(this);
- AddRef(); // Balanced in Loaded().
- return true;
+ AddRef(); // Balanced in BookmarkModelLoaded().
+ return RespondLater();
}
- RunAndSendResponse();
- return true;
+ ResponseValue response = RunOnReady();
+ return response ? RespondNow(std::move(response)) : RespondLater();
}
BookmarkModel* BookmarksFunction::GetBookmarkModel() {
@@ -115,25 +115,19 @@ ManagedBookmarkService* BookmarksFunction::GetManagedBookmarkService() {
return ManagedBookmarkServiceFactory::GetForProfile(GetProfile());
}
-bool BookmarksFunction::GetBookmarkIdAsInt64(const std::string& id_string,
- int64_t* id) {
- if (base::StringToInt64(id_string, id))
- return true;
-
- error_ = bookmark_api_constants::kInvalidIdError;
- return false;
-}
-
const BookmarkNode* BookmarksFunction::GetBookmarkNodeFromId(
- const std::string& id_string) {
+ const std::string& id_string,
+ std::string* error) {
int64_t id;
- if (!GetBookmarkIdAsInt64(id_string, &id))
- return NULL;
+ if (!base::StringToInt64(id_string, &id)) {
+ *error = bookmark_api_constants::kInvalidIdError;
+ return nullptr;
+ }
const BookmarkNode* node = bookmarks::GetBookmarkNodeByID(
BookmarkModelFactory::GetForBrowserContext(GetProfile()), id);
if (!node)
- error_ = bookmark_api_constants::kNoNodeError;
+ *error = bookmark_api_constants::kNoNodeError;
return node;
}
@@ -141,18 +135,19 @@ const BookmarkNode* BookmarksFunction::GetBookmarkNodeFromId(
const BookmarkNode* BookmarksFunction::CreateBookmarkNode(
BookmarkModel* model,
const CreateDetails& details,
- const BookmarkNode::MetaInfoMap* meta_info) {
- int64_t parentId;
+ const BookmarkNode::MetaInfoMap* meta_info,
+ std::string* error) {
+ int64_t parent_id;
if (!details.parent_id.get()) {
// Optional, default to "other bookmarks".
- parentId = model->other_node()->id();
- } else {
- if (!GetBookmarkIdAsInt64(*details.parent_id, &parentId))
- return nullptr;
+ parent_id = model->other_node()->id();
+ } else if (!base::StringToInt64(*details.parent_id, &parent_id)) {
+ *error = bookmark_api_constants::kInvalidIdError;
+ return nullptr;
}
- const BookmarkNode* parent = bookmarks::GetBookmarkNodeByID(model, parentId);
- if (!CanBeModified(parent))
+ const BookmarkNode* parent = bookmarks::GetBookmarkNodeByID(model, parent_id);
+ if (!CanBeModified(parent, error))
return nullptr;
size_t index;
@@ -161,7 +156,7 @@ const BookmarkNode* BookmarksFunction::CreateBookmarkNode(
} else {
if (*details.index < 0 ||
size_t{*details.index} > parent->children().size()) {
- error_ = bookmark_api_constants::kInvalidIndexError;
+ *error = bookmark_api_constants::kInvalidIndexError;
return nullptr;
}
index = size_t{*details.index};
@@ -177,7 +172,7 @@ const BookmarkNode* BookmarksFunction::CreateBookmarkNode(
GURL url(url_string);
if (!url_string.empty() && !url.is_valid()) {
- error_ = bookmark_api_constants::kInvalidUrlError;
+ *error = bookmark_api_constants::kInvalidUrlError;
return nullptr;
}
@@ -196,48 +191,54 @@ const BookmarkNode* BookmarksFunction::CreateBookmarkNode(
bool BookmarksFunction::EditBookmarksEnabled() {
PrefService* prefs = user_prefs::UserPrefs::Get(GetProfile());
- if (prefs->GetBoolean(bookmarks::prefs::kEditBookmarksEnabled))
- return true;
- error_ = bookmark_api_constants::kEditBookmarksDisabled;
- return false;
+ return prefs->GetBoolean(bookmarks::prefs::kEditBookmarksEnabled);
}
-bool BookmarksFunction::CanBeModified(const BookmarkNode* node) {
+bool BookmarksFunction::CanBeModified(const BookmarkNode* node,
+ std::string* error) {
if (!node) {
- error_ = bookmark_api_constants::kNoParentError;
+ *error = bookmark_api_constants::kNoParentError;
return false;
}
if (node->is_root()) {
- error_ = bookmark_api_constants::kModifySpecialError;
+ *error = bookmark_api_constants::kModifySpecialError;
return false;
}
ManagedBookmarkService* managed = GetManagedBookmarkService();
if (bookmarks::IsDescendantOf(node, managed->managed_node())) {
- error_ = bookmark_api_constants::kModifyManagedError;
+ *error = bookmark_api_constants::kModifyManagedError;
return false;
}
return true;
}
+Profile* BookmarksFunction::GetProfile() {
+ return Profile::FromBrowserContext(browser_context());
+}
+
+void BookmarksFunction::OnResponded() {
+ DCHECK(response_type());
+ if (*response_type() == ExtensionFunction::SUCCEEDED) {
+ content::NotificationService::current()->Notify(
+ extensions::NOTIFICATION_EXTENSION_BOOKMARKS_API_INVOKED,
+ content::Source<const Extension>(extension()),
+ content::Details<const BookmarksFunction>(this));
+ }
+}
+
void BookmarksFunction::BookmarkModelChanged() {
}
void BookmarksFunction::BookmarkModelLoaded(BookmarkModel* model,
bool ids_reassigned) {
model->RemoveObserver(this);
- RunAndSendResponse();
- Release(); // Balanced in RunOnReady().
-}
-void BookmarksFunction::RunAndSendResponse() {
- bool success = RunOnReady();
- if (success) {
- content::NotificationService::current()->Notify(
- extensions::NOTIFICATION_EXTENSION_BOOKMARKS_API_INVOKED,
- content::Source<const Extension>(extension()),
- content::Details<const BookmarksFunction>(this));
- }
- SendResponse(success);
+ ResponseValue response = RunOnReady();
+ if (response)
+ Respond(std::move(response));
+ // else, the function will Respond() on its own later.
+
+ Release(); // Balanced in Run().
}
BookmarkEventRouter::BookmarkEventRouter(Profile* profile)
@@ -416,43 +417,48 @@ void BookmarksAPI::OnListenerAdded(const EventListenerInfo& details) {
EventRouter::Get(browser_context_)->UnregisterObserver(this);
}
-bool BookmarksGetFunction::RunOnReady() {
+ExtensionFunction::ResponseValue BookmarksGetFunction::RunOnReady() {
std::unique_ptr<api::bookmarks::Get::Params> params(
api::bookmarks::Get::Params::Create(*args_));
- EXTENSION_FUNCTION_VALIDATE(params.get());
+ if (!params)
+ return BadMessage();
std::vector<BookmarkTreeNode> nodes;
ManagedBookmarkService* managed = GetManagedBookmarkService();
if (params->id_or_id_list.as_strings) {
std::vector<std::string>& ids = *params->id_or_id_list.as_strings;
size_t count = ids.size();
- EXTENSION_FUNCTION_VALIDATE(count > 0);
+ if (count <= 0)
+ return BadMessage();
for (size_t i = 0; i < count; ++i) {
- const BookmarkNode* node = GetBookmarkNodeFromId(ids[i]);
+ std::string error;
+ const BookmarkNode* node = GetBookmarkNodeFromId(ids[i], &error);
if (!node)
- return false;
+ return Error(error);
bookmark_api_helpers::AddNode(managed, node, &nodes, false);
}
} else {
+ std::string error;
const BookmarkNode* node =
- GetBookmarkNodeFromId(*params->id_or_id_list.as_string);
+ GetBookmarkNodeFromId(*params->id_or_id_list.as_string, &error);
if (!node)
- return false;
+ return Error(error);
bookmark_api_helpers::AddNode(managed, node, &nodes, false);
}
- SetResultList(api::bookmarks::Get::Results::Create(nodes));
- return true;
+ return ArgumentList(api::bookmarks::Get::Results::Create(nodes));
}
-bool BookmarksGetChildrenFunction::RunOnReady() {
+ExtensionFunction::ResponseValue BookmarksGetChildrenFunction::RunOnReady() {
std::unique_ptr<api::bookmarks::GetChildren::Params> params(
api::bookmarks::GetChildren::Params::Create(*args_));
- EXTENSION_FUNCTION_VALIDATE(params.get());
+ if (!params)
+ return BadMessage();
- const BookmarkNode* node = GetBookmarkNodeFromId(params->id);
+ std::string error;
+ const BookmarkNode* node = GetBookmarkNodeFromId(params->id, &error);
if (!node)
- return false;
+ return Error(error);
std::vector<BookmarkTreeNode> nodes;
for (const auto& child : node->children()) {
@@ -460,16 +466,19 @@ bool BookmarksGetChildrenFunction::RunOnReady() {
&nodes, false);
}
- SetResultList(api::bookmarks::GetChildren::Results::Create(nodes));
- return true;
+ return ArgumentList(api::bookmarks::GetChildren::Results::Create(nodes));
}
-bool BookmarksGetRecentFunction::RunOnReady() {
+ExtensionFunction::ResponseValue BookmarksGetRecentFunction::RunOnReady() {
std::unique_ptr<api::bookmarks::GetRecent::Params> params(
api::bookmarks::GetRecent::Params::Create(*args_));
- EXTENSION_FUNCTION_VALIDATE(params.get());
- if (params->number_of_items < 1)
- return false;
+ if (!params)
+ return BadMessage();
+ if (params->number_of_items < 1) {
+ // TODO(lazyboy): This shouldn't be necessary as schema specifies
+ // "minimum: 1".
+ return Error("numberOfItems cannot be less than 1.");
+ }
std::vector<const BookmarkNode*> nodes;
bookmarks::GetMostRecentlyAddedEntries(
@@ -482,40 +491,40 @@ bool BookmarksGetRecentFunction::RunOnReady() {
&tree_nodes, false);
}
- SetResultList(api::bookmarks::GetRecent::Results::Create(tree_nodes));
- return true;
+ return ArgumentList(api::bookmarks::GetRecent::Results::Create(tree_nodes));
}
-bool BookmarksGetTreeFunction::RunOnReady() {
+ExtensionFunction::ResponseValue BookmarksGetTreeFunction::RunOnReady() {
std::vector<BookmarkTreeNode> nodes;
const BookmarkNode* node =
BookmarkModelFactory::GetForBrowserContext(GetProfile())->root_node();
bookmark_api_helpers::AddNode(GetManagedBookmarkService(), node, &nodes,
true);
- SetResultList(api::bookmarks::GetTree::Results::Create(nodes));
- return true;
+ return ArgumentList(api::bookmarks::GetTree::Results::Create(nodes));
}
-bool BookmarksGetSubTreeFunction::RunOnReady() {
+ExtensionFunction::ResponseValue BookmarksGetSubTreeFunction::RunOnReady() {
std::unique_ptr<api::bookmarks::GetSubTree::Params> params(
api::bookmarks::GetSubTree::Params::Create(*args_));
- EXTENSION_FUNCTION_VALIDATE(params.get());
+ if (!params)
+ return BadMessage();
- const BookmarkNode* node = GetBookmarkNodeFromId(params->id);
+ std::string error;
+ const BookmarkNode* node = GetBookmarkNodeFromId(params->id, &error);
if (!node)
- return false;
+ return Error(error);
std::vector<BookmarkTreeNode> nodes;
bookmark_api_helpers::AddNode(GetManagedBookmarkService(), node, &nodes,
true);
- SetResultList(api::bookmarks::GetSubTree::Results::Create(nodes));
- return true;
+ return ArgumentList(api::bookmarks::GetSubTree::Results::Create(nodes));
}
-bool BookmarksSearchFunction::RunOnReady() {
+ExtensionFunction::ResponseValue BookmarksSearchFunction::RunOnReady() {
std::unique_ptr<api::bookmarks::Search::Params> params(
api::bookmarks::Search::Params::Create(*args_));
- EXTENSION_FUNCTION_VALIDATE(params.get());
+ if (!params)
+ return BadMessage();
std::vector<const BookmarkNode*> nodes;
if (params->query.as_string) {
@@ -548,30 +557,31 @@ bool BookmarksSearchFunction::RunOnReady() {
for (const BookmarkNode* node : nodes)
bookmark_api_helpers::AddNode(managed, node, &tree_nodes, false);
- SetResultList(api::bookmarks::Search::Results::Create(tree_nodes));
- return true;
+ return ArgumentList(api::bookmarks::Search::Results::Create(tree_nodes));
}
-bool BookmarksRemoveFunctionBase::RunOnReady() {
+ExtensionFunction::ResponseValue BookmarksRemoveFunctionBase::RunOnReady() {
if (!EditBookmarksEnabled())
- return false;
+ return Error(bookmark_api_constants::kEditBookmarksDisabled);
std::unique_ptr<api::bookmarks::Remove::Params> params(
api::bookmarks::Remove::Params::Create(*args_));
- EXTENSION_FUNCTION_VALIDATE(params.get());
+ if (!params)
+ return BadMessage();
int64_t id;
- if (!GetBookmarkIdAsInt64(params->id, &id))
- return false;
+ if (!base::StringToInt64(params->id, &id))
+ return Error(bookmark_api_constants::kInvalidIdError);
+ std::string error;
BookmarkModel* model = GetBookmarkModel();
ManagedBookmarkService* managed = GetManagedBookmarkService();
if (!bookmark_api_helpers::RemoveNode(model, managed, id, is_recursive(),
- &error_)) {
- return false;
+ &error)) {
+ return Error(error);
}
- return true;
+ return NoArguments();
}
bool BookmarksRemoveFunction::is_recursive() const {
@@ -582,66 +592,66 @@ bool BookmarksRemoveTreeFunction::is_recursive() const {
return true;
}
-bool BookmarksCreateFunction::RunOnReady() {
+ExtensionFunction::ResponseValue BookmarksCreateFunction::RunOnReady() {
if (!EditBookmarksEnabled())
- return false;
+ return Error(bookmark_api_constants::kEditBookmarksDisabled);
std::unique_ptr<api::bookmarks::Create::Params> params(
api::bookmarks::Create::Params::Create(*args_));
- EXTENSION_FUNCTION_VALIDATE(params.get());
+ if (!params)
+ return BadMessage();
+ std::string error;
BookmarkModel* model =
BookmarkModelFactory::GetForBrowserContext(GetProfile());
- const BookmarkNode* node = CreateBookmarkNode(model, params->bookmark, NULL);
+ const BookmarkNode* node =
+ CreateBookmarkNode(model, params->bookmark, nullptr, &error);
if (!node)
- return false;
+ return Error(error);
BookmarkTreeNode ret = bookmark_api_helpers::GetBookmarkTreeNode(
GetManagedBookmarkService(), node, false, false);
- SetResultList(api::bookmarks::Create::Results::Create(ret));
-
- return true;
+ return ArgumentList(api::bookmarks::Create::Results::Create(ret));
}
-bool BookmarksMoveFunction::RunOnReady() {
+ExtensionFunction::ResponseValue BookmarksMoveFunction::RunOnReady() {
if (!EditBookmarksEnabled())
- return false;
+ return Error(bookmark_api_constants::kEditBookmarksDisabled);
std::unique_ptr<api::bookmarks::Move::Params> params(
api::bookmarks::Move::Params::Create(*args_));
- EXTENSION_FUNCTION_VALIDATE(params.get());
+ if (!params)
+ return BadMessage();
- const BookmarkNode* node = GetBookmarkNodeFromId(params->id);
+ std::string error;
+ const BookmarkNode* node = GetBookmarkNodeFromId(params->id, &error);
if (!node)
- return false;
+ return Error(error);
BookmarkModel* model =
BookmarkModelFactory::GetForBrowserContext(GetProfile());
- if (model->is_permanent_node(node)) {
- error_ = bookmark_api_constants::kModifySpecialError;
- return false;
- }
+ if (model->is_permanent_node(node))
+ return Error(bookmark_api_constants::kModifySpecialError);
- const BookmarkNode* parent = NULL;
+ const BookmarkNode* parent = nullptr;
if (!params->destination.parent_id.get()) {
// Optional, defaults to current parent.
parent = node->parent();
} else {
- int64_t parentId;
- if (!GetBookmarkIdAsInt64(*params->destination.parent_id, &parentId))
- return false;
+ int64_t parent_id;
+ if (!base::StringToInt64(*params->destination.parent_id, &parent_id))
+ return Error(bookmark_api_constants::kInvalidIdError);
- parent = bookmarks::GetBookmarkNodeByID(model, parentId);
+ parent = bookmarks::GetBookmarkNodeByID(model, parent_id);
}
- if (!CanBeModified(parent) || !CanBeModified(node))
- return false;
+ if (!CanBeModified(parent, &error) || !CanBeModified(node, &error))
+ return Error(error);
size_t index;
if (params->destination.index.get()) { // Optional (defaults to end).
if (*params->destination.index < 0 ||
size_t{*params->destination.index} > parent->children().size()) {
- error_ = bookmark_api_constants::kInvalidIndexError;
- return false;
+ return Error(bookmark_api_constants::kInvalidIndexError);
}
index = size_t{*params->destination.index};
} else {
@@ -652,18 +662,17 @@ bool BookmarksMoveFunction::RunOnReady() {
BookmarkTreeNode tree_node = bookmark_api_helpers::GetBookmarkTreeNode(
GetManagedBookmarkService(), node, false, false);
- SetResultList(api::bookmarks::Move::Results::Create(tree_node));
-
- return true;
+ return ArgumentList(api::bookmarks::Move::Results::Create(tree_node));
}
-bool BookmarksUpdateFunction::RunOnReady() {
+ExtensionFunction::ResponseValue BookmarksUpdateFunction::RunOnReady() {
if (!EditBookmarksEnabled())
- return false;
+ return Error(bookmark_api_constants::kEditBookmarksDisabled);
std::unique_ptr<api::bookmarks::Update::Params> params(
api::bookmarks::Update::Params::Create(*args_));
- EXTENSION_FUNCTION_VALIDATE(params.get());
+ if (!params)
+ return BadMessage();
// Optional but we need to distinguish non present from an empty title.
base::string16 title;
@@ -678,25 +687,21 @@ bool BookmarksUpdateFunction::RunOnReady() {
if (params->changes.url.get())
url_string = *params->changes.url;
GURL url(url_string);
- if (!url_string.empty() && !url.is_valid()) {
- error_ = bookmark_api_constants::kInvalidUrlError;
- return false;
- }
+ if (!url_string.empty() && !url.is_valid())
+ return Error(bookmark_api_constants::kInvalidUrlError);
- const BookmarkNode* node = GetBookmarkNodeFromId(params->id);
- if (!CanBeModified(node))
- return false;
+ std::string error;
+ const BookmarkNode* node = GetBookmarkNodeFromId(params->id, &error);
+ if (!CanBeModified(node, &error))
+ return Error(error);
BookmarkModel* model =
BookmarkModelFactory::GetForBrowserContext(GetProfile());
- if (model->is_permanent_node(node)) {
- error_ = bookmark_api_constants::kModifySpecialError;
- return false;
- }
- if (!url.is_empty() && node->is_folder()) {
- error_ = bookmark_api_constants::kCannotSetUrlOfFolderError;
- return false;
- }
+ if (model->is_permanent_node(node))
+ return Error(bookmark_api_constants::kModifySpecialError);
+
+ if (!url.is_empty() && node->is_folder())
+ return Error(bookmark_api_constants::kCannotSetUrlOfFolderError);
if (has_title)
model->SetTitle(node, title);
@@ -705,8 +710,7 @@ bool BookmarksUpdateFunction::RunOnReady() {
BookmarkTreeNode tree_node = bookmark_api_helpers::GetBookmarkTreeNode(
GetManagedBookmarkService(), node, false, false);
- SetResultList(api::bookmarks::Update::Results::Create(tree_node));
- return true;
+ return ArgumentList(api::bookmarks::Update::Results::Create(tree_node));
}
BookmarksIOFunction::BookmarksIOFunction() {}
@@ -763,12 +767,16 @@ void BookmarksIOFunction::MultiFilesSelected(
NOTREACHED() << "Should not be able to select multiple files";
}
-bool BookmarksImportFunction::RunOnReady() {
+ExtensionFunction::ResponseValue BookmarksImportFunction::RunOnReady() {
if (!EditBookmarksEnabled())
- return false;
+ return Error(bookmark_api_constants::kEditBookmarksDisabled);
ShowSelectFileDialog(ui::SelectFileDialog::SELECT_OPEN_FILE,
base::FilePath());
- return true;
+ // TODO(crbug.com/1073255): This will respond before a file is selected, which
+ // seems incorrect. Waiting and responding until after
+ // ui::SelectFileDialog::Listener is fired should be right thing to do, but
+ // that requires auditing bookmark page callsites.
+ return NoArguments();
}
void BookmarksImportFunction::FileSelected(const base::FilePath& path,
@@ -789,7 +797,7 @@ void BookmarksImportFunction::FileSelected(const base::FilePath& path,
Release(); // Balanced in BookmarksIOFunction::SelectFile()
}
-bool BookmarksExportFunction::RunOnReady() {
+ExtensionFunction::ResponseValue BookmarksExportFunction::RunOnReady() {
// "bookmarks.export" is exposed to a small number of extensions. These
// extensions use user gesture for export, so use USER_VISIBLE priority.
// GetDefaultFilepathForBookmarkExport() might have to touch filesystem
@@ -801,13 +809,17 @@ bool BookmarksExportFunction::RunOnReady() {
base::BindOnce(&GetDefaultFilepathForBookmarkExport),
base::BindOnce(&BookmarksIOFunction::ShowSelectFileDialog, this,
ui::SelectFileDialog::SELECT_SAVEAS_FILE));
- return true;
+ // TODO(crbug.com/1073255): This will respond before a file is selected, which
+ // seems incorrect. Waiting and responding until after
+ // ui::SelectFileDialog::Listener is fired should be right thing to do, but
+ // that requires auditing bookmark page callsites.
+ return NoArguments();
}
void BookmarksExportFunction::FileSelected(const base::FilePath& path,
int index,
void* params) {
- bookmark_html_writer::WriteBookmarks(GetProfile(), path, NULL);
+ bookmark_html_writer::WriteBookmarks(GetProfile(), path, nullptr);
Release(); // Balanced in BookmarksIOFunction::SelectFile()
}
diff --git a/chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api.h b/chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api.h
index f832d8fc254..e604b22d732 100644
--- a/chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api.h
+++ b/chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api.h
@@ -14,13 +14,15 @@
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
-#include "chrome/browser/extensions/chrome_extension_function.h"
#include "components/bookmarks/browser/base_bookmark_model_observer.h"
#include "components/bookmarks/browser/bookmark_node.h"
#include "extensions/browser/browser_context_keyed_api_factory.h"
#include "extensions/browser/event_router.h"
+#include "extensions/browser/extension_function.h"
#include "ui/shell_dialogs/select_file_dialog.h"
+class Profile;
+
namespace base {
class FilePath;
class ListValue;
@@ -123,17 +125,19 @@ class BookmarksAPI : public BrowserContextKeyedAPI,
std::unique_ptr<BookmarkEventRouter> bookmark_event_router_;
};
-class BookmarksFunction : public ChromeAsyncExtensionFunction,
+class BookmarksFunction : public ExtensionFunction,
public bookmarks::BaseBookmarkModelObserver {
public:
- // ChromeAsyncExtensionFunction:
- bool RunAsync() override;
+ // ExtensionFunction:
+ ResponseAction Run() override;
protected:
~BookmarksFunction() override {}
- // RunAsync semantic equivalent called when the bookmarks are ready.
- virtual bool RunOnReady() = 0;
+ // Run semantic equivalent called when the bookmarks are ready.
+ // Overrides can return nullptr to further delay responding (a.k.a.
+ // RespondLater()).
+ virtual ResponseValue RunOnReady() = 0;
// Helper to get the BookmarkModel.
bookmarks::BookmarkModel* GetBookmarkModel();
@@ -141,33 +145,32 @@ class BookmarksFunction : public ChromeAsyncExtensionFunction,
// Helper to get the ManagedBookmarkService.
bookmarks::ManagedBookmarkService* GetManagedBookmarkService();
- // Helper to get the bookmark id as int64_t from the given string id.
- // Sets error_ to an error string if the given id string can't be parsed
- // as an int64_t. In case of error, doesn't change id and returns false.
- bool GetBookmarkIdAsInt64(const std::string& id_string, int64_t* id);
-
// Helper to get the bookmark node from a given string id.
// If the given id can't be parsed or doesn't refer to a valid node, sets
- // error_ and returns NULL.
+ // |error| and returns nullptr.
const bookmarks::BookmarkNode* GetBookmarkNodeFromId(
- const std::string& id_string);
+ const std::string& id_string,
+ std::string* error);
// Helper to create a bookmark node from a CreateDetails object. If a node
- // can't be created based on the given details, sets error_ and returns NULL.
+ // can't be created based on the given details, sets |error| and returns
+ // nullptr.
const bookmarks::BookmarkNode* CreateBookmarkNode(
bookmarks::BookmarkModel* model,
const api::bookmarks::CreateDetails& details,
- const bookmarks::BookmarkNode::MetaInfoMap* meta_info);
+ const bookmarks::BookmarkNode::MetaInfoMap* meta_info,
+ std::string* error);
- // Helper that checks if bookmark editing is enabled. If it's not, this sets
- // error_ to the appropriate error string.
+ // Helper that checks if bookmark editing is enabled.
bool EditBookmarksEnabled();
// Helper that checks if |node| can be modified. Returns false if |node|
// is NULL, or a managed node, or the root node. In these cases the node
// can't be edited, can't have new child nodes appended, and its direct
// children can't be moved or reordered.
- bool CanBeModified(const bookmarks::BookmarkNode* node);
+ bool CanBeModified(const bookmarks::BookmarkNode* node, std::string* error);
+
+ Profile* GetProfile();
private:
// bookmarks::BaseBookmarkModelObserver:
@@ -175,7 +178,8 @@ class BookmarksFunction : public ChromeAsyncExtensionFunction,
void BookmarkModelLoaded(bookmarks::BookmarkModel* model,
bool ids_reassigned) override;
- void RunAndSendResponse();
+ // ExtensionFunction:
+ void OnResponded() override;
};
class BookmarksGetFunction : public BookmarksFunction {
@@ -186,7 +190,7 @@ class BookmarksGetFunction : public BookmarksFunction {
~BookmarksGetFunction() override {}
// BookmarksFunction:
- bool RunOnReady() override;
+ ResponseValue RunOnReady() override;
};
class BookmarksGetChildrenFunction : public BookmarksFunction {
@@ -197,7 +201,7 @@ class BookmarksGetChildrenFunction : public BookmarksFunction {
~BookmarksGetChildrenFunction() override {}
// BookmarksFunction:
- bool RunOnReady() override;
+ ResponseValue RunOnReady() override;
};
class BookmarksGetRecentFunction : public BookmarksFunction {
@@ -208,7 +212,7 @@ class BookmarksGetRecentFunction : public BookmarksFunction {
~BookmarksGetRecentFunction() override {}
// BookmarksFunction:
- bool RunOnReady() override;
+ ResponseValue RunOnReady() override;
};
class BookmarksGetTreeFunction : public BookmarksFunction {
@@ -219,7 +223,7 @@ class BookmarksGetTreeFunction : public BookmarksFunction {
~BookmarksGetTreeFunction() override {}
// BookmarksFunction:
- bool RunOnReady() override;
+ ResponseValue RunOnReady() override;
};
class BookmarksGetSubTreeFunction : public BookmarksFunction {
@@ -230,7 +234,7 @@ class BookmarksGetSubTreeFunction : public BookmarksFunction {
~BookmarksGetSubTreeFunction() override {}
// BookmarksFunction:
- bool RunOnReady() override;
+ ResponseValue RunOnReady() override;
};
class BookmarksSearchFunction : public BookmarksFunction {
@@ -241,7 +245,7 @@ class BookmarksSearchFunction : public BookmarksFunction {
~BookmarksSearchFunction() override {}
// BookmarksFunction:
- bool RunOnReady() override;
+ ResponseValue RunOnReady() override;
};
class BookmarksRemoveFunctionBase : public BookmarksFunction {
@@ -251,7 +255,7 @@ class BookmarksRemoveFunctionBase : public BookmarksFunction {
virtual bool is_recursive() const = 0;
// BookmarksFunction:
- bool RunOnReady() override;
+ ResponseValue RunOnReady() override;
};
class BookmarksRemoveFunction : public BookmarksRemoveFunctionBase {
@@ -284,7 +288,7 @@ class BookmarksCreateFunction : public BookmarksFunction {
~BookmarksCreateFunction() override {}
// BookmarksFunction:
- bool RunOnReady() override;
+ ResponseValue RunOnReady() override;
};
class BookmarksMoveFunction : public BookmarksFunction {
@@ -295,7 +299,7 @@ class BookmarksMoveFunction : public BookmarksFunction {
~BookmarksMoveFunction() override {}
// BookmarksFunction:
- bool RunOnReady() override;
+ ResponseValue RunOnReady() override;
};
class BookmarksUpdateFunction : public BookmarksFunction {
@@ -306,7 +310,7 @@ class BookmarksUpdateFunction : public BookmarksFunction {
~BookmarksUpdateFunction() override {}
// BookmarksFunction:
- bool RunOnReady() override;
+ ResponseValue RunOnReady() override;
};
class BookmarksIOFunction : public BookmarksFunction,
@@ -346,7 +350,7 @@ class BookmarksImportFunction : public BookmarksIOFunction {
~BookmarksImportFunction() override {}
// BookmarksFunction:
- bool RunOnReady() override;
+ ResponseValue RunOnReady() override;
};
class BookmarksExportFunction : public BookmarksIOFunction {
@@ -362,7 +366,7 @@ class BookmarksExportFunction : public BookmarksIOFunction {
~BookmarksExportFunction() override {}
// BookmarksFunction:
- bool RunOnReady() override;
+ ResponseValue RunOnReady() override;
};
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/braille_display_private/braille_controller_brlapi.cc b/chromium/chrome/browser/extensions/api/braille_display_private/braille_controller_brlapi.cc
index 755ee8a39c6..ab44ae9d90a 100644
--- a/chromium/chrome/browser/extensions/api/braille_display_private/braille_controller_brlapi.cc
+++ b/chromium/chrome/browser/extensions/api/braille_display_private/braille_controller_brlapi.cc
@@ -79,7 +79,8 @@ void BrailleControllerImpl::TryLoadLibBrlApi() {
// These versions of libbrlapi work the same for the functions we
// are using. (0.6.0 adds brlapi_writeWText).
static const char* const kSupportedVersions[] = {
- "libbrlapi.so.0.5", "libbrlapi.so.0.6", "libbrlapi.so.0.7"};
+ "libbrlapi.so.0.5", "libbrlapi.so.0.6", "libbrlapi.so.0.7",
+ "libbrlapi.so.0.8"};
for (size_t i = 0; i < base::size(kSupportedVersions); ++i) {
if (libbrlapi_loader_.Load(kSupportedVersions[i]))
return;
diff --git a/chromium/chrome/browser/extensions/api/braille_display_private/braille_display_private_apitest.cc b/chromium/chrome/browser/extensions/api/braille_display_private/braille_display_private_apitest.cc
index 037d634141f..12ff95b9219 100644
--- a/chromium/chrome/browser/extensions/api/braille_display_private/braille_display_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/braille_display_private/braille_display_private_apitest.cc
@@ -25,6 +25,7 @@
#include "components/user_manager/user_names.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/compositor/scoped_animation_duration_scale_mode.h"
diff --git a/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc b/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc
index 0e1126ecea4..3ec6c150da5 100644
--- a/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc
+++ b/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc
@@ -15,7 +15,6 @@
#include "base/task/post_task.h"
#include "base/task/thread_pool.h"
#include "base/values.h"
-#include "chrome/browser/browsing_data/browsing_data_helper.h"
#include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/signin/account_reconcilor_factory.h"
@@ -25,6 +24,7 @@
#include "chrome/browser/ui/browser.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/pref_names.h"
+#include "components/browsing_data/content/browsing_data_helper.h"
#include "components/browsing_data/core/pref_names.h"
#include "components/prefs/pref_service.h"
#include "components/signin/public/identity_manager/identity_manager.h"
@@ -288,13 +288,14 @@ void BrowsingDataRemoverFunction::OnTaskFinished() {
return;
synced_data_deletion_.reset();
observer_.RemoveAll();
- this->SendResponse(true);
+ Respond(NoArguments());
Release(); // Balanced in StartRemoving.
}
-bool BrowsingDataRemoverFunction::RunAsync() {
+ExtensionFunction::ResponseAction BrowsingDataRemoverFunction::Run() {
+ Profile* profile = Profile::FromBrowserContext(browser_context());
// If we don't have a profile, something's pretty wrong.
- DCHECK(GetProfile());
+ DCHECK(profile);
// Grab the initial |options| parameter, and parse out the arguments.
base::DictionaryValue* options;
@@ -326,30 +327,34 @@ bool BrowsingDataRemoverFunction::RunAsync() {
// Check that only |origins| or |excludeOrigins| can be set.
if (origins && exclude_origins) {
- error_ = extension_browsing_data_api_constants::kIncompatibleFilterError;
- return false;
+ return RespondNow(
+ Error(extension_browsing_data_api_constants::kIncompatibleFilterError));
}
if (origins) {
- if (!ParseOrigins(*origins, &origins_))
- return false;
+ ResponseValue error_response;
+ if (!ParseOrigins(*origins, &origins_, &error_response))
+ return RespondNow(std::move(error_response));
mode_ = content::BrowsingDataFilterBuilder::WHITELIST;
} else {
- if (exclude_origins && !ParseOrigins(*exclude_origins, &origins_))
- return false;
+ if (exclude_origins) {
+ ResponseValue error_response;
+ if (!ParseOrigins(*exclude_origins, &origins_, &error_response))
+ return RespondNow(std::move(error_response));
+ }
mode_ = content::BrowsingDataFilterBuilder::BLACKLIST;
}
// Check if a filter is set but non-filterable types are selected.
if ((!origins_.empty() && (removal_mask_ & ~kFilterableDataTypes) != 0)) {
- error_ = extension_browsing_data_api_constants::kNonFilterableError;
- return false;
+ return RespondNow(
+ Error(extension_browsing_data_api_constants::kNonFilterableError));
}
// Check for prohibited data types.
- if (!IsRemovalPermitted(removal_mask_, GetProfile()->GetPrefs())) {
- error_ = extension_browsing_data_api_constants::kDeleteProhibitedError;
- return false;
+ if (!IsRemovalPermitted(removal_mask_, profile->GetPrefs())) {
+ return RespondNow(
+ Error(extension_browsing_data_api_constants::kDeleteProhibitedError));
}
#if BUILDFLAG(ENABLE_PLUGINS)
@@ -363,7 +368,7 @@ bool BrowsingDataRemoverFunction::RunAsync() {
base::TaskPriority::USER_VISIBLE},
base::BindOnce(
&BrowsingDataRemoverFunction::CheckRemovingPluginDataSupported,
- this, PluginPrefs::GetForProfile(GetProfile())));
+ this, PluginPrefs::GetForProfile(profile)));
} else {
StartRemoving();
}
@@ -371,8 +376,7 @@ bool BrowsingDataRemoverFunction::RunAsync() {
StartRemoving();
#endif
- // Will finish asynchronously.
- return true;
+ return did_respond() ? AlreadyResponded() : RespondLater();
}
BrowsingDataRemoverFunction::~BrowsingDataRemoverFunction() {}
@@ -394,7 +398,7 @@ void BrowsingDataRemoverFunction::CheckRemovingPluginDataSupported(
#endif
void BrowsingDataRemoverFunction::StartRemoving() {
- Profile* profile = GetProfile();
+ Profile* profile = Profile::FromBrowserContext(browser_context());
content::BrowsingDataRemover* remover =
content::BrowserContext::GetBrowsingDataRemover(profile);
@@ -427,8 +431,7 @@ void BrowsingDataRemoverFunction::StartRemoving() {
auto filter_builder = content::BrowsingDataFilterBuilder::Create(mode_);
for (const auto& origin : origins_) {
std::string domain = GetDomainAndRegistry(
- origin.host(),
- net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES);
+ origin, net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES);
if (domain.empty())
domain = origin.host(); // IP address or internal hostname.
filter_builder->AddRegisterableDomain(domain);
@@ -505,18 +508,21 @@ bool BrowsingDataRemoverFunction::ParseOriginTypeMask(
return true;
}
-bool BrowsingDataRemoverFunction::ParseOrigins(
- const base::Value& list_value,
- std::vector<url::Origin>* result) {
+bool BrowsingDataRemoverFunction::ParseOrigins(const base::Value& list_value,
+ std::vector<url::Origin>* result,
+ ResponseValue* error_response) {
DCHECK(list_value.is_list());
result->reserve(list_value.GetList().size());
for (const auto& value : list_value.GetList()) {
- EXTENSION_FUNCTION_VALIDATE(value.is_string());
+ if (!value.is_string()) {
+ *error_response = BadMessage();
+ return false;
+ }
url::Origin origin = url::Origin::Create(GURL(value.GetString()));
if (origin.opaque()) {
- error_ = base::StringPrintf(
+ *error_response = Error(base::StringPrintf(
extension_browsing_data_api_constants::kInvalidOriginError,
- value.GetString().c_str());
+ value.GetString().c_str()));
return false;
}
result->push_back(std::move(origin));
diff --git a/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_api.h b/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_api.h
index 2ea463c3eab..6d39a5dfc38 100644
--- a/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_api.h
+++ b/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_api.h
@@ -13,11 +13,11 @@
#include <vector>
#include "base/scoped_observer.h"
-#include "chrome/browser/extensions/chrome_extension_function.h"
#include "components/browsing_data/core/browsing_data_utils.h"
#include "components/signin/core/browser/account_reconcilor.h"
#include "content/public/browser/browsing_data_filter_builder.h"
#include "content/public/browser/browsing_data_remover.h"
+#include "extensions/browser/extension_function.h"
#include "ppapi/buildflags/buildflags.h"
class PluginPrefs;
@@ -97,7 +97,7 @@ class BrowsingDataSettingsFunction : public ExtensionFunction {
// Each child class must implement GetRemovalMask(), which returns the bitmask
// of data types to remove.
class BrowsingDataRemoverFunction
- : public ChromeAsyncExtensionFunction,
+ : public ExtensionFunction,
public content::BrowsingDataRemover::Observer {
public:
BrowsingDataRemoverFunction();
@@ -106,7 +106,7 @@ class BrowsingDataRemoverFunction
void OnBrowsingDataRemoverDone() override;
// ExtensionFunction:
- bool RunAsync() override;
+ ResponseAction Run() override;
protected:
~BrowsingDataRemoverFunction() override;
@@ -137,10 +137,12 @@ class BrowsingDataRemoverFunction
bool ParseOriginTypeMask(const base::DictionaryValue& options,
int* origin_type_mask);
- // Parse the developer-provided list of origins into |result|.
- // Returns true if parsing was successful.
+ // Parses the developer-provided list of origins into |result|.
+ // Returns whether or not parsing was successful. In case of parse failure,
+ // |error_response| will contain the error response.
bool ParseOrigins(const base::Value& list_value,
- std::vector<url::Origin>* result);
+ std::vector<url::Origin>* result,
+ ResponseValue* error_response);
// Called when we're ready to start removing data.
void StartRemoving();
diff --git a/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_test.cc b/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_test.cc
index 797f32a0b7e..9713ed1a3d0 100644
--- a/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_test.cc
+++ b/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_test.cc
@@ -24,6 +24,7 @@
#include "components/sync/driver/sync_service.h"
#include "components/sync/driver/sync_user_settings.h"
#include "content/public/browser/storage_partition.h"
+#include "content/public/test/browser_test.h"
#include "google_apis/gaia/gaia_urls.h"
#include "google_apis/gaia/google_service_auth_error.h"
#include "mojo/public/cpp/bindings/callback_helpers.h"
@@ -71,7 +72,7 @@ bool SetGaiaCookieForProfile(Profile* profile) {
content::BrowserContext::GetDefaultStoragePartition(profile)
->GetCookieManagerForBrowserProcess();
cookie_manager->SetCanonicalCookie(
- cookie, google_url.scheme(), net::CookieOptions::MakeAllInclusive(),
+ cookie, google_url, net::CookieOptions::MakeAllInclusive(),
mojo::WrapCallbackWithDefaultInvokeIfNotRun(
std::move(callback), net::CanonicalCookie::CookieInclusionStatus(
net::CanonicalCookie::CookieInclusionStatus::
diff --git a/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_unittest.cc b/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_unittest.cc
index c25e5885e8e..eb659cae14f 100644
--- a/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_unittest.cc
@@ -6,7 +6,6 @@
#include "base/json/json_string_value_serializer.h"
#include "base/memory/ref_counted.h"
#include "base/values.h"
-#include "chrome/browser/browsing_data/browsing_data_helper.h"
#include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h"
#include "chrome/browser/extensions/api/browsing_data/browsing_data_api.h"
#include "chrome/browser/extensions/extension_function_test_utils.h"
@@ -15,6 +14,7 @@
#include "chrome/browser/ui/browser.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/test_browser_window.h"
+#include "components/browsing_data/content/browsing_data_helper.h"
#include "components/browsing_data/core/browsing_data_utils.h"
#include "components/browsing_data/core/pref_names.h"
#include "components/prefs/pref_service.h"
diff --git a/chromium/chrome/browser/extensions/api/cast_streaming/cast_streaming_apitest.cc b/chromium/chrome/browser/extensions/api/cast_streaming/cast_streaming_apitest.cc
index a7d906040eb..6ebf8e5713e 100644
--- a/chromium/chrome/browser/extensions/api/cast_streaming/cast_streaming_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/cast_streaming/cast_streaming_apitest.cc
@@ -23,6 +23,7 @@
#include "chrome/common/chrome_switches.h"
#include "content/public/common/content_features.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "extensions/common/switches.h"
#include "media/base/bind_to_current_loop.h"
#include "media/base/video_frame.h"
diff --git a/chromium/chrome/browser/extensions/api/cast_streaming/performance_test.cc b/chromium/chrome/browser/extensions/api/cast_streaming/performance_test.cc
index 9452b062b15..69a5d995237 100644
--- a/chromium/chrome/browser/extensions/api/cast_streaming/performance_test.cc
+++ b/chromium/chrome/browser/extensions/api/cast_streaming/performance_test.cc
@@ -30,6 +30,7 @@
#include "chrome/common/chrome_switches.h"
#include "chrome/test/base/tracing.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "media/base/audio_bus.h"
#include "media/base/video_frame.h"
diff --git a/chromium/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc b/chromium/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc
index 0d9b2566c56..80918c5ca00 100644
--- a/chromium/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc
+++ b/chromium/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc
@@ -8,6 +8,7 @@
#include <stdint.h>
#include <memory>
+#include <utility>
#include <vector>
#include "base/bind.h"
@@ -301,7 +302,7 @@ CertificateProviderStopPinRequestFunction::Run() {
}
// TODO(crbug.com/1046860): Remove logging after stabilizing the feature.
VLOG(1) << "PIN stop request failed: " << error_result;
- return RespondNow(Error(error_result));
+ return RespondNow(Error(std::move(error_result)));
}
void CertificateProviderStopPinRequestFunction::OnPinRequestStopped() {
@@ -406,7 +407,7 @@ ExtensionFunction::ResponseAction CertificateProviderRequestPinFunction::Run() {
}
// TODO(crbug.com/1046860): Remove logging after stabilizing the feature.
VLOG(1) << "PIN request failed: " << error_result;
- return RespondNow(Error(error_result));
+ return RespondNow(Error(std::move(error_result)));
}
void CertificateProviderRequestPinFunction::OnInputReceived(
diff --git a/chromium/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc b/chromium/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc
index cd8eddd1672..45975b6fbe0 100644
--- a/chromium/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc
@@ -14,6 +14,9 @@
#include "base/callback.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
+#include "base/hash/sha1.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/path_service.h"
#include "base/run_loop.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h"
@@ -21,11 +24,13 @@
#include "base/values.h"
#include "chrome/browser/chromeos/certificate_provider/certificate_provider_service.h"
#include "chrome/browser/chromeos/certificate_provider/certificate_provider_service_factory.h"
+#include "chrome/browser/chromeos/certificate_provider/test_certificate_provider_extension.h"
#include "chrome/browser/chromeos/ui/request_pin_view.h"
#include "chrome/browser/extensions/api/certificate_provider/certificate_provider_api.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/common/chrome_paths.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/policy/core/browser/browser_policy_connector.h"
#include "components/policy/core/common/mock_configuration_policy_provider.h"
@@ -34,20 +39,26 @@
#include "components/policy/policy_constants.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_navigation_observer.h"
#include "content/public/test/test_utils.h"
#include "crypto/rsa_private_key.h"
#include "extensions/browser/disable_reason.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_system.h"
+#include "extensions/browser/process_manager.h"
#include "extensions/browser/test_extension_registry_observer.h"
#include "extensions/common/extension.h"
#include "extensions/test/extension_test_message_listener.h"
#include "extensions/test/result_catcher.h"
+#include "extensions/test/test_background_page_first_load_observer.h"
+#include "net/cert/x509_certificate.h"
#include "net/test/spawned_test_server/spawned_test_server.h"
#include "testing/gmock/include/gmock/gmock.h"
+#include "third_party/boringssl/src/include/openssl/base.h"
#include "third_party/boringssl/src/include/openssl/evp.h"
#include "third_party/boringssl/src/include/openssl/mem.h"
+#include "third_party/boringssl/src/include/openssl/pool.h"
#include "third_party/boringssl/src/include/openssl/rsa.h"
#include "ui/gfx/color_palette.h"
#include "ui/views/controls/label.h"
@@ -69,13 +80,6 @@ void StoreBool(bool* result, const base::Closure& callback, base::Value value) {
callback.Run();
}
-void StoreString(std::string* result,
- const base::Closure& callback,
- base::Value value) {
- value.GetAsString(result);
- callback.Run();
-}
-
void StoreDigest(std::vector<uint8_t>* digest,
const base::Closure& callback,
base::Value value) {
@@ -114,6 +118,30 @@ std::string JsUint8Array(const std::vector<uint8_t>& bytes) {
return res;
}
+std::string GetPageTextContent(content::WebContents* web_contents) {
+ base::RunLoop run_loop;
+ std::string text_content;
+ web_contents->GetMainFrame()->ExecuteJavaScriptForTests(
+ base::ASCIIToUTF16("document.body.textContent;"),
+ base::BindOnce(
+ [](std::string* result, base::OnceClosure callback,
+ base::Value value) {
+ if (value.is_string())
+ *result = value.GetString();
+ std::move(callback).Run();
+ },
+ &text_content, run_loop.QuitClosure()));
+ run_loop.Run();
+ return text_content;
+}
+
+std::string GetCertFingerprint1(const net::X509Certificate& cert) {
+ unsigned char hash[base::kSHA1Length];
+ base::SHA1HashBytes(CRYPTO_BUFFER_data(cert.cert_buffer()),
+ CRYPTO_BUFFER_len(cert.cert_buffer()), hash);
+ return base::ToLowerASCII(base::HexEncode(hash, base::kSHA1Length));
+}
+
class CertificateProviderApiTest : public extensions::ExtensionApiTest {
public:
CertificateProviderApiTest() {}
@@ -130,8 +158,7 @@ class CertificateProviderApiTest : public extensions::ExtensionApiTest {
extensions::ExtensionApiTest::SetUpOnMainThread();
// Set up the AutoSelectCertificateForUrls policy to avoid the client
// certificate selection dialog.
- const std::string autoselect_pattern =
- "{\"pattern\": \"*\", \"filter\": {\"ISSUER\": {\"CN\": \"root\"}}}";
+ const std::string autoselect_pattern = R"({"pattern": "*", "filter": {}})";
std::unique_ptr<base::ListValue> autoselect_policy(new base::ListValue);
autoselect_policy->AppendString(autoselect_pattern);
@@ -346,23 +373,12 @@ IN_PROC_BROWSER_TEST_F(CertificateProviderApiTest, Basic) {
VLOG(1) << "Check whether the server acknowledged that a client certificate "
"was presented.";
- {
- base::RunLoop run_loop;
- std::string https_reply;
- https_contents->GetMainFrame()->ExecuteJavaScriptForTests(
- base::ASCIIToUTF16("document.body.textContent;"),
- base::BindOnce(&StoreString, &https_reply, run_loop.QuitClosure()));
- run_loop.Run();
- // Expect the server to return the fingerprint of the client cert that we
- // presented, which should be the fingerprint of 'l1_leaf.der'.
- // The fingerprint can be calculated independently using:
- // openssl x509 -inform DER -noout -fingerprint -in
- // chrome/test/data/extensions/api_test/certificate_provider/l1_leaf.der
- ASSERT_EQ(
- "got client cert with fingerprint: "
- "edeb84ab3b5a36dd09a3203c74794b25efa8f126",
- https_reply);
- }
+ // The fingerprint can be calculated independently using:
+ // openssl x509 -inform DER -noout -fingerprint -in
+ // chrome/test/data/extensions/api_test/certificate_provider/l1_leaf.der
+ EXPECT_EQ(GetPageTextContent(https_contents),
+ "got client cert with fingerprint: "
+ "edeb84ab3b5a36dd09a3203c74794b25efa8f126");
// Replying to the same signature request a second time must fail.
{
@@ -377,6 +393,72 @@ IN_PROC_BROWSER_TEST_F(CertificateProviderApiTest, Basic) {
}
}
+// Test that the certificateProvider events are delivered correctly in the
+// scenario when the event listener is in a lazy background page that gets idle.
+IN_PROC_BROWSER_TEST_F(CertificateProviderApiTest, LazyBackgroundPage) {
+ // Make extension background pages idle immediately.
+ extensions::ProcessManager::SetEventPageIdleTimeForTesting(1);
+ extensions::ProcessManager::SetEventPageSuspendingTimeForTesting(1);
+
+ // Start an HTTPS test server that requests a client certificate.
+ net::SpawnedTestServer::SSLOptions ssl_options;
+ ssl_options.request_client_certificate = true;
+ net::SpawnedTestServer https_server(net::SpawnedTestServer::TYPE_HTTPS,
+ ssl_options, base::FilePath());
+ ASSERT_TRUE(https_server.Start());
+
+ // Load the test extension.
+ base::FilePath test_data_dir;
+ base::PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir);
+ const extensions::Extension* const extension =
+ LoadExtension(test_data_dir.AppendASCII("extensions")
+ .AppendASCII("test_certificate_provider")
+ .AppendASCII("extension"));
+ ASSERT_TRUE(extension);
+ std::unique_ptr<TestCertificateProviderExtension>
+ test_certificate_provider_extension;
+ {
+ base::ScopedAllowBlockingForTesting allow_io;
+ test_certificate_provider_extension =
+ std::make_unique<TestCertificateProviderExtension>(profile(),
+ extension->id());
+ }
+ extensions::TestBackgroundPageFirstLoadObserver(profile(), extension->id())
+ .Wait();
+
+ // Navigate to the page that requests the client authentication. Use the
+ // incognito profile in order to force re-authentication in the later request
+ // made by the test.
+ const GURL client_cert_url = https_server.GetURL("client-cert");
+ const std::string client_cert_fingerprint =
+ GetCertFingerprint1(*TestCertificateProviderExtension::GetCertificate());
+ Browser* const incognito_browser = CreateIncognitoBrowser(profile());
+ ASSERT_TRUE(incognito_browser);
+ ui_test_utils::NavigateToURLWithDisposition(
+ incognito_browser, client_cert_url,
+ WindowOpenDisposition::NEW_FOREGROUND_TAB,
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP);
+ EXPECT_EQ(test_certificate_provider_extension->certificate_request_count(),
+ 1);
+ EXPECT_EQ(GetPageTextContent(
+ incognito_browser->tab_strip_model()->GetActiveWebContents()),
+ "got client cert with fingerprint: " + client_cert_fingerprint);
+
+ // Let the extension's background page become idle.
+ WaitForExtensionIdle(extension->id());
+
+ // Navigate again to the page with the client authentication. The extension
+ // gets awakened and handles the request.
+ ui_test_utils::NavigateToURLWithDisposition(
+ browser(), client_cert_url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP);
+ EXPECT_EQ(test_certificate_provider_extension->certificate_request_count(),
+ 2);
+ EXPECT_EQ(
+ GetPageTextContent(browser()->tab_strip_model()->GetActiveWebContents()),
+ "got client cert with fingerprint: " + client_cert_fingerprint);
+}
+
// User enters the correct PIN.
IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest, ShowPinDialogAccept) {
AddFakeSignRequest(kFakeSignRequestId);
diff --git a/chromium/chrome/browser/extensions/api/chrome_extensions_api_client.cc b/chromium/chrome/browser/extensions/api/chrome_extensions_api_client.cc
index 0e8e1376aab..57049879e4c 100644
--- a/chromium/chrome/browser/extensions/api/chrome_extensions_api_client.cc
+++ b/chromium/chrome/browser/extensions/api/chrome_extensions_api_client.cc
@@ -27,7 +27,6 @@
#include "chrome/browser/extensions/api/storage/managed_value_store_cache.h"
#include "chrome/browser/extensions/api/storage/sync_value_store_cache.h"
#include "chrome/browser/extensions/chrome_extension_web_contents_observer.h"
-#include "chrome/browser/extensions/extension_action.h"
#include "chrome/browser/extensions/extension_action_manager.h"
#include "chrome/browser/extensions/extension_action_runner.h"
#include "chrome/browser/extensions/extension_tab_util.h"
@@ -59,6 +58,7 @@
#include "extensions/browser/api/system_display/display_info_provider.h"
#include "extensions/browser/api/virtual_keyboard_private/virtual_keyboard_delegate.h"
#include "extensions/browser/api/web_request/web_request_info.h"
+#include "extensions/browser/extension_action.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/guest_view/web_view/web_view_guest.h"
#include "extensions/browser/guest_view/web_view/web_view_permission_helper.h"
@@ -127,9 +127,6 @@ bool ChromeExtensionsAPIClient::ShouldHideResponseHeader(
const std::string& header_name) const {
// Gaia may send a OAUth2 authorization code in the Dice response header,
// which could allow an extension to generate a refresh token for the account.
- // TODO(crbug.com/890006): Determine if the code here can be cleaned up
- // since browser initiated non-navigation requests are now hidden from
- // extensions.
return (
(url.host_piece() == GaiaUrls::GetInstance()->gaia_url().host_piece()) &&
(base::CompareCaseInsensitiveASCII(header_name,
diff --git a/chromium/chrome/browser/extensions/api/cloud_print_private/cloud_print_private_apitest.cc b/chromium/chrome/browser/extensions/api/cloud_print_private/cloud_print_private_apitest.cc
index 9b31666f327..cdf1f5d9175 100644
--- a/chromium/chrome/browser/extensions/api/cloud_print_private/cloud_print_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/cloud_print_private/cloud_print_private_apitest.cc
@@ -11,6 +11,7 @@
#include "chrome/browser/ui/browser.h"
#include "chrome/common/extensions/api/cloud_print_private.h"
#include "components/cloud_devices/common/cloud_devices_switches.h"
+#include "content/public/test/browser_test.h"
#include "net/dns/mock_host_resolver.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "testing/gmock/include/gmock/gmock.h"
@@ -85,14 +86,8 @@ MATCHER(IsExpectedUserSettings, "") {
settings.printers[1].connect;
}
-// http://crbug.com/177163
-#if defined(OS_WIN) && !defined(NDEBUG)
-#define MAYBE_CloudPrintHostedWithMock DISABLED_CloudPrintHostedWithMock
-#else
-#define MAYBE_CloudPrintHostedWithMock CloudPrintHostedWithMock
-#endif
IN_PROC_BROWSER_TEST_F(ExtensionCloudPrintPrivateApiTest,
- MAYBE_CloudPrintHostedWithMock) {
+ CloudPrintHostedWithMock) {
CloudPrintTestsDelegateMock cloud_print_mock;
EXPECT_CALL(cloud_print_mock,
diff --git a/chromium/chrome/browser/extensions/api/command_line_private/command_line_private_apitest.cc b/chromium/chrome/browser/extensions/api/command_line_private/command_line_private_apitest.cc
index cdbd1f1bf16..4b5bb96b6dc 100644
--- a/chromium/chrome/browser/extensions/api/command_line_private/command_line_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/command_line_private/command_line_private_apitest.cc
@@ -4,6 +4,7 @@
#include "base/command_line.h"
#include "chrome/browser/extensions/extension_apitest.h"
+#include "content/public/test/browser_test.h"
namespace {
// This should be consistent with
diff --git a/chromium/chrome/browser/extensions/api/commands/command_service.cc b/chromium/chrome/browser/extensions/api/commands/command_service.cc
index fbb6db74270..ba641c9e10a 100644
--- a/chromium/chrome/browser/extensions/api/commands/command_service.cc
+++ b/chromium/chrome/browser/extensions/api/commands/command_service.cc
@@ -69,14 +69,6 @@ bool IsForCurrentPlatform(const std::string& key) {
base::CompareCase::SENSITIVE);
}
-std::string StripCurrentPlatform(const std::string& key) {
- DCHECK(IsForCurrentPlatform(key));
- std::string result = key;
- base::ReplaceFirstSubstringAfterOffset(
- &result, 0, Command::CommandPlatform() + ":", base::StringPiece());
- return result;
-}
-
// Merge |suggested_key_prefs| into the saved preferences for the extension. We
// merge rather than overwrite to preserve existing was_assigned preferences.
void MergeSuggestedKeyPrefs(
@@ -115,6 +107,8 @@ CommandService::CommandService(content::BrowserContext* context)
}
CommandService::~CommandService() {
+ for (auto& observer : observers_)
+ observer.OnCommandServiceDestroying();
}
static base::LazyInstance<BrowserContextKeyedAPIFactory<CommandService>>::
@@ -131,22 +125,6 @@ CommandService* CommandService::Get(content::BrowserContext* context) {
return BrowserContextKeyedAPIFactory<CommandService>::Get(context);
}
-bool CommandService::GetBrowserActionCommand(const std::string& extension_id,
- QueryType type,
- Command* command,
- bool* active) const {
- return GetExtensionActionCommand(extension_id, type, command, active,
- Command::Type::kBrowserAction);
-}
-
-bool CommandService::GetPageActionCommand(const std::string& extension_id,
- QueryType type,
- Command* command,
- bool* active) const {
- return GetExtensionActionCommand(extension_id, type, command, active,
- Command::Type::kPageAction);
-}
-
bool CommandService::GetNamedCommands(const std::string& extension_id,
QueryType type,
CommandScope scope,
@@ -174,7 +152,7 @@ bool CommandService::GetNamedCommands(const std::string& extension_id,
if (scope != ANY_SCOPE && ((scope == GLOBAL) != saved_command.global()))
continue;
- if (type != SUGGESTED && shortcut_assigned.key_code() != ui::VKEY_UNKNOWN)
+ if (shortcut_assigned.key_code() != ui::VKEY_UNKNOWN)
command.set_accelerator(shortcut_assigned);
command.set_global(saved_command.global());
@@ -203,7 +181,8 @@ bool CommandService::AddKeybindingPref(
// Media Keys are allowed to be used by named command only.
DCHECK(!Command::IsMediaKey(accelerator) ||
(command_name != manifest_values::kPageActionCommandEvent &&
- command_name != manifest_values::kBrowserActionCommandEvent));
+ command_name != manifest_values::kBrowserActionCommandEvent &&
+ command_name != manifest_values::kActionCommandEvent));
DictionaryPrefUpdate updater(profile_->GetPrefs(),
prefs::kExtensionCommands);
@@ -252,19 +231,9 @@ bool CommandService::AddKeybindingPref(
std::move(suggested_key_prefs));
// Fetch the newly-updated command, and notify the observers.
- for (auto& observer : observers_) {
- observer.OnExtensionCommandAdded(
- extension_id, FindCommandByName(extension_id, command_name));
- }
-
- // TODO(devlin): Deprecate this notification in favor of the observers.
- std::pair<const std::string, const std::string> details =
- std::make_pair(extension_id, command_name);
- content::NotificationService::current()->Notify(
- extensions::NOTIFICATION_EXTENSION_COMMAND_ADDED,
- content::Source<Profile>(profile_),
- content::Details<std::pair<const std::string, const std::string> >(
- &details));
+ Command command = FindCommandByName(extension_id, command_name);
+ for (auto& observer : observers_)
+ observer.OnExtensionCommandAdded(extension_id, command);
return true;
}
@@ -357,50 +326,6 @@ Command CommandService::FindCommandByName(const std::string& extension_id,
return Command();
}
-bool CommandService::GetSuggestedExtensionCommand(
- const std::string& extension_id,
- const ui::Accelerator& accelerator,
- Command* command) const {
- const Extension* extension =
- ExtensionRegistry::Get(profile_)
- ->GetExtensionById(extension_id, ExtensionRegistry::ENABLED);
- CHECK(extension);
-
- Command prospective_command;
- CommandMap command_map;
- if (GetBrowserActionCommand(extension_id,
- CommandService::SUGGESTED,
- &prospective_command,
- nullptr) &&
- accelerator == prospective_command.accelerator()) {
- if (command)
- *command = prospective_command;
- return true;
- } else if (GetPageActionCommand(extension_id,
- CommandService::SUGGESTED,
- &prospective_command,
- nullptr) &&
- accelerator == prospective_command.accelerator()) {
- if (command)
- *command = prospective_command;
- return true;
- } else if (GetNamedCommands(extension_id,
- CommandService::SUGGESTED,
- CommandService::REGULAR,
- &command_map)) {
- for (CommandMap::const_iterator it = command_map.begin();
- it != command_map.end();
- ++it) {
- if (accelerator == it->second.accelerator()) {
- if (command)
- *command = it->second;
- return true;
- }
- }
- }
- return false;
-}
-
void CommandService::AddObserver(Observer* observer) {
observers_.AddObserver(observer);
}
@@ -441,38 +366,58 @@ void CommandService::RemoveRelinquishedKeybindings(const Extension* extension) {
}
}
- Command existing_browser_action_command;
- const Command* new_browser_action_command =
- CommandsInfo::GetBrowserActionCommand(extension);
- if (GetBrowserActionCommand(extension->id(),
- CommandService::ACTIVE,
- &existing_browser_action_command,
- NULL) &&
- // The browser action command may be defaulted to an unassigned
- // accelerator if a browser action is specified by the extension but a
- // keybinding is not declared. See
- // CommandsHandler::MaybeSetBrowserActionDefault.
- (!new_browser_action_command ||
- new_browser_action_command->accelerator().key_code() ==
- ui::VKEY_UNKNOWN) &&
- !IsCommandShortcutUserModified(
- extension,
- existing_browser_action_command.command_name())) {
- RemoveKeybindingPrefs(extension->id(),
- existing_browser_action_command.command_name());
- }
+ auto remove_overrides_if_unused = [this, extension](ActionInfo::Type type) {
+ Command existing_command;
+ if (!GetExtensionActionCommand(extension->id(), type,
+ CommandService::ACTIVE, &existing_command,
+ nullptr)) {
+ // No keybindings to remove.
+ return;
+ }
- Command existing_page_action_command;
- if (GetPageActionCommand(extension->id(),
- CommandService::ACTIVE,
- &existing_page_action_command,
- NULL) &&
- !CommandsInfo::GetPageActionCommand(extension) &&
- !IsCommandShortcutUserModified(
- extension,
- existing_page_action_command.command_name())) {
- RemoveKeybindingPrefs(extension->id(),
- existing_page_action_command.command_name());
+ if (IsCommandShortcutUserModified(extension,
+ existing_command.command_name())) {
+ // Don't relinquish user-modified shortcuts.
+ return;
+ }
+
+ const Command* new_command = nullptr;
+ switch (type) {
+ case ActionInfo::TYPE_ACTION:
+ new_command = CommandsInfo::GetActionCommand(extension);
+ break;
+ case ActionInfo::TYPE_BROWSER:
+ new_command = CommandsInfo::GetBrowserActionCommand(extension);
+ break;
+ case ActionInfo::TYPE_PAGE:
+ new_command = CommandsInfo::GetPageActionCommand(extension);
+ break;
+ }
+
+ // The shortcuts should be removed if there is no command specified in the
+ // new extension, or the only command specified is synthesized (i.e.,
+ // assigned to ui::VKEY_UNKNOWN), which happens for browser action commands.
+ // See CommandsHandler::MaybeSetBrowserActionDefault().
+ // TODO(devlin): Should this logic apply to ActionInfo::TYPE_ACTION?
+ // See https://crbug.com/893373.
+ const bool should_relinquish =
+ !new_command ||
+ (type == ActionInfo::TYPE_BROWSER &&
+ new_command->accelerator().key_code() == ui::VKEY_UNKNOWN);
+
+ if (!should_relinquish)
+ return;
+
+ RemoveKeybindingPrefs(extension->id(), existing_command.command_name());
+ };
+
+ // TODO(https://crbug.com/1067130): Extensions shouldn't be able to specify
+ // commands for actions they don't have, so we should just be able to query
+ // for a single action type.
+ for (ActionInfo::Type type :
+ {ActionInfo::TYPE_ACTION, ActionInfo::TYPE_BROWSER,
+ ActionInfo::TYPE_PAGE}) {
+ remove_overrides_if_unused(type);
}
}
@@ -512,6 +457,14 @@ void CommandService::AssignKeybindings(const Extension* extension) {
false, // Overwriting not allowed.
false); // Not global.
}
+
+ const Command* action_command = CommandsInfo::GetActionCommand(extension);
+ if (action_command && CanAutoAssign(*action_command, extension)) {
+ AddKeybindingPref(action_command->accelerator(), extension->id(),
+ action_command->command_name(),
+ false, // Overwriting not allowed.
+ false); // Not global.
+ }
}
bool CommandService::CanAutoAssign(const Command &command,
@@ -527,7 +480,8 @@ bool CommandService::CanAutoAssign(const Command &command,
if (command.global()) {
if (command.command_name() == manifest_values::kBrowserActionCommandEvent ||
- command.command_name() == manifest_values::kPageActionCommandEvent)
+ command.command_name() == manifest_values::kPageActionCommandEvent ||
+ command.command_name() == manifest_values::kActionCommandEvent)
return false; // Browser and page actions are not global in nature.
if (extension->permissions_data()->HasAPIPermission(
@@ -616,6 +570,7 @@ void CommandService::RemoveDefunctExtensionSuggestedCommandPrefs(
current_prefs->DeepCopy());
const CommandMap* named_commands =
CommandsInfo::GetNamedCommands(extension);
+
const Command* browser_action_command =
CommandsInfo::GetBrowserActionCommand(extension);
for (base::DictionaryValue::Iterator it(*current_prefs);
@@ -633,6 +588,9 @@ void CommandService::RemoveDefunctExtensionSuggestedCommandPrefs(
} else if (it.key() == manifest_values::kPageActionCommandEvent) {
if (!CommandsInfo::GetPageActionCommand(extension))
suggested_key_prefs->Remove(it.key(), NULL);
+ } else if (it.key() == manifest_values::kActionCommandEvent) {
+ if (!CommandsInfo::GetActionCommand(extension))
+ suggested_key_prefs->Remove(it.key(), nullptr);
} else if (named_commands) {
if (named_commands->find(it.key()) == named_commands->end())
suggested_key_prefs->Remove(it.key(), NULL);
@@ -675,50 +633,6 @@ bool CommandService::IsCommandShortcutUserModified(
active_command.accelerator().key_code() != ui::VKEY_UNKNOWN;
}
-bool CommandService::IsKeybindingChanging(const Extension* extension,
- const std::string& command_name) {
- // Get the new assigned command, if any.
- Command new_command;
- if (command_name == manifest_values::kBrowserActionCommandEvent) {
- new_command = *CommandsInfo::GetBrowserActionCommand(extension);
- } else if (command_name == manifest_values::kPageActionCommandEvent) {
- new_command = *CommandsInfo::GetPageActionCommand(extension);
- } else { // This is a named command.
- const CommandMap* named_commands =
- CommandsInfo::GetNamedCommands(extension);
- if (named_commands) {
- auto loc = named_commands->find(command_name);
- if (loc != named_commands->end())
- new_command = loc->second;
- }
- }
-
- return Command::StringToAccelerator(
- GetSuggestedKeyPref(extension, command_name), command_name) !=
- new_command.accelerator();
-}
-
-std::string CommandService::GetSuggestedKeyPref(
- const Extension* extension,
- const std::string& command_name) {
- // Get the previous suggested key, if any.
- ui::Accelerator suggested_key;
- ExtensionPrefs* extension_prefs = ExtensionPrefs::Get(profile_);
- const base::DictionaryValue* commands_prefs = NULL;
- if (extension_prefs->ReadPrefAsDictionary(extension->id(),
- kCommands,
- &commands_prefs)) {
- const base::DictionaryValue* suggested_key_prefs = NULL;
- std::string suggested_key;
- if (commands_prefs->GetDictionary(command_name, &suggested_key_prefs) &&
- suggested_key_prefs->GetString(kSuggestedKey, &suggested_key)) {
- return suggested_key;
- }
- }
-
- return std::string();
-}
-
void CommandService::RemoveKeybindingPrefs(const std::string& extension_id,
const std::string& command_name) {
DictionaryPrefUpdate updater(profile_->GetPrefs(),
@@ -757,14 +671,6 @@ void CommandService::RemoveKeybindingPrefs(const std::string& extension_id,
it != keys_to_remove.end(); ++it) {
std::string key = *it;
bindings->Remove(key, NULL);
-
- // TODO(devlin): Deprecate this notification in favor of the observers.
- ExtensionCommandRemovedDetails details(extension_id, command_name,
- StripCurrentPlatform(key));
- content::NotificationService::current()->Notify(
- extensions::NOTIFICATION_EXTENSION_COMMAND_REMOVED,
- content::Source<Profile>(profile_),
- content::Details<ExtensionCommandRemovedDetails>(&details));
}
for (const Command& removed_command : removed_commands) {
@@ -773,12 +679,11 @@ void CommandService::RemoveKeybindingPrefs(const std::string& extension_id,
}
}
-bool CommandService::GetExtensionActionCommand(
- const std::string& extension_id,
- QueryType query_type,
- Command* command,
- bool* active,
- Command::Type action_type) const {
+bool CommandService::GetExtensionActionCommand(const std::string& extension_id,
+ ActionInfo::Type action_type,
+ QueryType query_type,
+ Command* command,
+ bool* active) const {
const ExtensionSet& extensions =
ExtensionRegistry::Get(profile_)->enabled_extensions();
const Extension* extension = extensions.GetByID(extension_id);
@@ -789,15 +694,15 @@ bool CommandService::GetExtensionActionCommand(
const Command* requested_command = NULL;
switch (action_type) {
- case Command::Type::kBrowserAction:
+ case ActionInfo::TYPE_BROWSER:
requested_command = CommandsInfo::GetBrowserActionCommand(extension);
break;
- case Command::Type::kPageAction:
+ case ActionInfo::TYPE_PAGE:
requested_command = CommandsInfo::GetPageActionCommand(extension);
break;
- case Command::Type::kNamed:
- NOTREACHED();
- return false;
+ case ActionInfo::TYPE_ACTION:
+ requested_command = CommandsInfo::GetActionCommand(extension);
+ break;
}
if (!requested_command)
return false;
@@ -807,22 +712,14 @@ bool CommandService::GetExtensionActionCommand(
FindCommandByName(extension_id, requested_command->command_name());
ui::Accelerator shortcut_assigned = saved_command.accelerator();
- if (active) {
- if (query_type == SUGGESTED) {
- *active =
- (requested_command->accelerator().key_code() != ui::VKEY_UNKNOWN &&
- requested_command->accelerator() == shortcut_assigned);
- } else {
- *active = (shortcut_assigned.key_code() != ui::VKEY_UNKNOWN);
- }
- }
+ if (active)
+ *active = (shortcut_assigned.key_code() != ui::VKEY_UNKNOWN);
if (query_type == ACTIVE && shortcut_assigned.key_code() == ui::VKEY_UNKNOWN)
return false;
*command = *requested_command;
- if (query_type != SUGGESTED &&
- shortcut_assigned.key_code() != ui::VKEY_UNKNOWN)
+ if (shortcut_assigned.key_code() != ui::VKEY_UNKNOWN)
command->set_accelerator(shortcut_assigned);
return true;
diff --git a/chromium/chrome/browser/extensions/api/commands/command_service.h b/chromium/chrome/browser/extensions/api/commands/command_service.h
index 0c7f057d493..f09db03b905 100644
--- a/chromium/chrome/browser/extensions/api/commands/command_service.h
+++ b/chromium/chrome/browser/extensions/api/commands/command_service.h
@@ -14,6 +14,7 @@
#include "extensions/browser/browser_context_keyed_api_factory.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_registry_observer.h"
+#include "extensions/common/api/extension_action/action_info.h"
#include "extensions/common/extension.h"
class Profile;
@@ -39,13 +40,14 @@ class CommandService : public BrowserContextKeyedAPI,
public ExtensionRegistryObserver {
public:
// An enum specifying which extension commands to fetch. There are effectively
- // four options: all, active, suggested, and inactive. Only the first three
- // appear in the enum since there hasn't been a need for 'inactive' yet.
+ // four options: all, active, suggested, and inactive. Only the first two
+ // appear in the enum since there isn't currently a need for 'inactive' yet or
+ // 'suggested'.
//
- // 'Inactive' means no key is bound. It might be because 1) a key wasn't
+ // 'inactive' means no key is bound. It might be because 1) a key wasn't
// specified (suggested) or 2) it was not granted (key already taken).
//
- // SUGGESTED covers developer-assigned keys that may or may not have been
+ // 'suggested' covers developer-assigned keys that may or may not have been
// granted. Reasons for not granting include permission denied/key already
// taken.
//
@@ -56,7 +58,6 @@ class CommandService : public BrowserContextKeyedAPI,
enum QueryType {
ALL,
ACTIVE,
- SUGGESTED,
};
// An enum specifying whether the command is global in scope or not. Global
@@ -77,6 +78,10 @@ class CommandService : public BrowserContextKeyedAPI,
// Called when an extension command is removed.
virtual void OnExtensionCommandRemoved(const std::string& extension_id,
const Command& command) {}
+
+ // Called when the CommandService is being destroyed.
+ virtual void OnCommandServiceDestroying() {}
+
protected:
virtual ~Observer() {}
};
@@ -94,27 +99,16 @@ class CommandService : public BrowserContextKeyedAPI,
// Convenience method to get the CommandService for a profile.
static CommandService* Get(content::BrowserContext* context);
- // Gets the command (if any) for the browser action of an extension given
- // its |extension_id|. The function consults the master list to see if
- // the command is active. Returns false if the extension has no browser
- // action. Returns false if the command is not active and |type| requested
- // is ACTIVE. |command| contains the command found and |active| (if not
- // NULL) contains whether |command| is active.
- bool GetBrowserActionCommand(const std::string& extension_id,
- QueryType type,
- Command* command,
- bool* active) const;
-
- // Gets the command (if any) for the page action of an extension given
- // its |extension_id|. The function consults the master list to see if
- // the command is active. Returns false if the extension has no page
- // action. Returns false if the command is not active and |type| requested
- // is ACTIVE. |command| contains the command found and |active| (if not
- // NULL) contains whether |command| is active.
- bool GetPageActionCommand(const std::string& extension_id,
- QueryType type,
- Command* command,
- bool* active) const;
+ // Gets the command (if any) for the specified |action_type| of an extension
+ // given its |extension_id|. The function consults the master list to see if
+ // the command is active. Returns false if the command is not active and
+ // |type| requested is ACTIVE. |command| contains the command found and
+ // |active| (if not null) contains whether |command| is active.
+ bool GetExtensionActionCommand(const std::string& extension_id,
+ ActionInfo::Type action_type,
+ QueryType type,
+ Command* command,
+ bool* active) const;
// Gets the active named commands (if any) for the extension with
// |extension_id|. The function consults the master list to see if the
@@ -166,13 +160,6 @@ class CommandService : public BrowserContextKeyedAPI,
Command FindCommandByName(const std::string& extension_id,
const std::string& command) const;
- // If the extension with |extension_id| suggests the assignment of a command
- // to |accelerator|, returns true and assigns the command to *|command|. Also
- // assigns the type to *|command_type| if non-null.
- bool GetSuggestedExtensionCommand(const std::string& extension_id,
- const ui::Accelerator& accelerator,
- Command* command) const;
-
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
@@ -231,22 +218,6 @@ class CommandService : public BrowserContextKeyedAPI,
bool IsCommandShortcutUserModified(const Extension* extension,
const std::string& command_name);
- // Returns true if the extension is changing the binding of |command_name| on
- // install.
- bool IsKeybindingChanging(const Extension* extension,
- const std::string& command_name);
-
- // Returns |extension|'s previous suggested key for |command_name| in the
- // preferences, or the empty string if none.
- std::string GetSuggestedKeyPref(const Extension* extension,
- const std::string& command_name);
-
- bool GetExtensionActionCommand(const std::string& extension_id,
- QueryType query_type,
- Command* command,
- bool* active,
- Command::Type type) const;
-
// A weak pointer to the profile we are associated with. Not owned by us.
Profile* profile_;
diff --git a/chromium/chrome/browser/extensions/api/commands/command_service_browsertest.cc b/chromium/chrome/browser/extensions/api/commands/command_service_browsertest.cc
index a6a2e01b0ac..9590e062c38 100644
--- a/chromium/chrome/browser/extensions/api/commands/command_service_browsertest.cc
+++ b/chromium/chrome/browser/extensions/api/commands/command_service_browsertest.cc
@@ -15,6 +15,7 @@
#include "content/public/test/browser_test.h"
#include "content/public/test/test_utils.h"
#include "extensions/browser/extension_registry.h"
+#include "extensions/common/api/extension_action/action_info.h"
#include "extensions/common/manifest_constants.h"
namespace {
@@ -141,8 +142,9 @@ IN_PROC_BROWSER_TEST_F(CommandServiceTest,
{
Command command;
bool active = false;
- EXPECT_TRUE(command_service->GetBrowserActionCommand(
- extension->id(), CommandService::ALL, &command, &active));
+ EXPECT_TRUE(command_service->GetExtensionActionCommand(
+ extension->id(), ActionInfo::TYPE_BROWSER, CommandService::ALL,
+ &command, &active));
EXPECT_EQ(kBasicBrowserActionKeybinding,
Command::AcceleratorToString(command.accelerator()));
@@ -156,8 +158,9 @@ IN_PROC_BROWSER_TEST_F(CommandServiceTest,
{
Command command;
bool active = false;
- EXPECT_TRUE(command_service->GetBrowserActionCommand(
- extension->id(), CommandService::ALL, &command, &active));
+ EXPECT_TRUE(command_service->GetExtensionActionCommand(
+ extension->id(), ActionInfo::TYPE_BROWSER, CommandService::ALL,
+ &command, &active));
EXPECT_EQ(kBasicAlternateKeybinding,
Command::AcceleratorToString(command.accelerator()));
@@ -170,8 +173,9 @@ IN_PROC_BROWSER_TEST_F(CommandServiceTest,
{
Command command;
bool active = true;
- EXPECT_TRUE(command_service->GetBrowserActionCommand(
- extension->id(), CommandService::ALL, &command, &active));
+ EXPECT_TRUE(command_service->GetExtensionActionCommand(
+ extension->id(), ActionInfo::TYPE_BROWSER, CommandService::ALL,
+ &command, &active));
EXPECT_EQ(kBasicBrowserActionKeybinding,
Command::AcceleratorToString(command.accelerator()));
@@ -191,8 +195,9 @@ IN_PROC_BROWSER_TEST_F(CommandServiceTest,
{
Command command;
bool active = false;
- EXPECT_TRUE(command_service->GetBrowserActionCommand(
- extension->id(), CommandService::ACTIVE, &command, &active));
+ EXPECT_TRUE(command_service->GetExtensionActionCommand(
+ extension->id(), ActionInfo::TYPE_BROWSER, CommandService::ACTIVE,
+ &command, &active));
EXPECT_EQ(kBasicBrowserActionKeybinding,
Command::AcceleratorToString(command.accelerator()));
@@ -206,8 +211,9 @@ IN_PROC_BROWSER_TEST_F(CommandServiceTest,
{
Command command;
bool active = false;
- EXPECT_TRUE(command_service->GetBrowserActionCommand(
- extension->id(), CommandService::ACTIVE, &command, &active));
+ EXPECT_TRUE(command_service->GetExtensionActionCommand(
+ extension->id(), ActionInfo::TYPE_BROWSER, CommandService::ACTIVE,
+ &command, &active));
EXPECT_EQ(kBasicAlternateKeybinding,
Command::AcceleratorToString(command.accelerator()));
@@ -220,58 +226,9 @@ IN_PROC_BROWSER_TEST_F(CommandServiceTest,
{
Command command;
bool active = false;
- EXPECT_FALSE(command_service->GetBrowserActionCommand(
- extension->id(), CommandService::ACTIVE, &command, &active));
- }
-}
-
-IN_PROC_BROWSER_TEST_F(CommandServiceTest,
- GetExtensionActionCommandQuerySuggested) {
- base::FilePath extension_dir =
- test_data_dir_.AppendASCII("keybinding").AppendASCII("basics");
- const Extension* extension = InstallExtension(extension_dir, 1);
- ASSERT_TRUE(extension);
-
- CommandService* command_service = CommandService::Get(browser()->profile());
-
- {
- Command command;
- bool active = false;
- EXPECT_TRUE(command_service->GetBrowserActionCommand(
- extension->id(), CommandService::SUGGESTED, &command, &active));
-
- EXPECT_EQ(kBasicBrowserActionKeybinding,
- Command::AcceleratorToString(command.accelerator()));
- EXPECT_TRUE(active);
- }
-
- command_service->UpdateKeybindingPrefs(
- extension->id(), manifest_values::kBrowserActionCommandEvent,
- kBasicAlternateKeybinding);
-
- {
- Command command;
- bool active = true;
- EXPECT_TRUE(command_service->GetBrowserActionCommand(
- extension->id(), CommandService::SUGGESTED, &command, &active));
-
- EXPECT_EQ(kBasicBrowserActionKeybinding,
- Command::AcceleratorToString(command.accelerator()));
- EXPECT_FALSE(active);
- }
-
- command_service->RemoveKeybindingPrefs(
- extension->id(), manifest_values::kBrowserActionCommandEvent);
-
- {
- Command command;
- bool active = true;
- EXPECT_TRUE(command_service->GetBrowserActionCommand(
- extension->id(), CommandService::SUGGESTED, &command, &active));
-
- EXPECT_EQ(kBasicBrowserActionKeybinding,
- Command::AcceleratorToString(command.accelerator()));
- EXPECT_FALSE(active);
+ EXPECT_FALSE(command_service->GetExtensionActionCommand(
+ extension->id(), ActionInfo::TYPE_BROWSER, CommandService::ACTIVE,
+ &command, &active));
}
}
@@ -372,55 +329,4 @@ IN_PROC_BROWSER_TEST_F(CommandServiceTest, GetNamedCommandsQueryActive) {
}
}
-IN_PROC_BROWSER_TEST_F(CommandServiceTest,
- GetNamedCommandsQuerySuggested) {
- base::FilePath extension_dir =
- test_data_dir_.AppendASCII("keybinding").AppendASCII("basics");
- const Extension* extension = InstallExtension(extension_dir, 1);
- ASSERT_TRUE(extension);
-
- CommandService* command_service = CommandService::Get(browser()->profile());
-
- {
- CommandMap command_map;
- EXPECT_TRUE(command_service->GetNamedCommands(
- extension->id(), CommandService::SUGGESTED, CommandService::ANY_SCOPE,
- &command_map));
-
- ASSERT_EQ(1u, command_map.count(kBasicNamedCommand));
- Command command = command_map[kBasicNamedCommand];
- EXPECT_EQ(kBasicNamedKeybinding,
- Command::AcceleratorToString(command.accelerator()));
- }
-
- command_service->UpdateKeybindingPrefs(
- extension->id(), kBasicNamedCommand, kBasicAlternateKeybinding);
-
- {
- CommandMap command_map;
- EXPECT_TRUE(command_service->GetNamedCommands(
- extension->id(), CommandService::SUGGESTED, CommandService::ANY_SCOPE,
- &command_map));
-
- ASSERT_EQ(1u, command_map.count(kBasicNamedCommand));
- Command command = command_map[kBasicNamedCommand];
- EXPECT_EQ(kBasicNamedKeybinding,
- Command::AcceleratorToString(command.accelerator()));
- }
-
- command_service->RemoveKeybindingPrefs(extension->id(), kBasicNamedCommand);
-
- {
- CommandMap command_map;
- EXPECT_TRUE(command_service->GetNamedCommands(
- extension->id(), CommandService::SUGGESTED, CommandService::ANY_SCOPE,
- &command_map));
-
- ASSERT_EQ(1u, command_map.count(kBasicNamedCommand));
- Command command = command_map[kBasicNamedCommand];
- EXPECT_EQ(kBasicNamedKeybinding,
- Command::AcceleratorToString(command.accelerator()));
- }
-}
-
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/commands/commands.cc b/chromium/chrome/browser/extensions/api/commands/commands.cc
index 608d5db2dcb..3f132370af3 100644
--- a/chromium/chrome/browser/extensions/api/commands/commands.cc
+++ b/chromium/chrome/browser/extensions/api/commands/commands.cc
@@ -9,6 +9,7 @@
#include "chrome/browser/extensions/api/commands/command_service.h"
#include "chrome/browser/profiles/profile.h"
+#include "extensions/common/api/extension_action/action_info.h"
namespace {
@@ -32,20 +33,21 @@ ExtensionFunction::ResponseAction GetAllCommandsFunction::Run() {
extensions::CommandService* command_service =
extensions::CommandService::Get(browser_context());
+ // TODO(https://crbug.com/1067130): We should be able to check what
+ // type of action (if any) the extension has, and just check for
+ // that one.
extensions::Command browser_action;
bool active = false;
- if (command_service->GetBrowserActionCommand(extension_->id(),
- extensions::CommandService::ALL,
- &browser_action,
- &active)) {
+ if (command_service->GetExtensionActionCommand(
+ extension_->id(), extensions::ActionInfo::TYPE_BROWSER,
+ extensions::CommandService::ALL, &browser_action, &active)) {
command_list->Append(CreateCommandValue(browser_action, active));
}
extensions::Command page_action;
- if (command_service->GetPageActionCommand(extension_->id(),
- extensions::CommandService::ALL,
- &page_action,
- &active)) {
+ if (command_service->GetExtensionActionCommand(
+ extension_->id(), extensions::ActionInfo::TYPE_PAGE,
+ extensions::CommandService::ALL, &page_action, &active)) {
command_list->Append(CreateCommandValue(page_action, active));
}
diff --git a/chromium/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc b/chromium/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc
index 9c180fc96bf..b34033a96b1 100644
--- a/chromium/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc
@@ -32,6 +32,7 @@
#include "content/public/browser/plugin_service.h"
#include "content/public/common/content_switches.h"
#include "content/public/common/webplugininfo.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_utils.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/test_extension_registry_observer.h"
@@ -255,13 +256,7 @@ class ExtensionContentSettingsApiTest : public ExtensionApiTest {
std::unique_ptr<ScopedKeepAlive> keep_alive_;
};
-// http://crbug.com/177163
-#if defined(OS_WIN) && !defined(NDEBUG)
-#define MAYBE_Standard DISABLED_Standard
-#else
-#define MAYBE_Standard Standard
-#endif
-IN_PROC_BROWSER_TEST_F(ExtensionContentSettingsApiTest, MAYBE_Standard) {
+IN_PROC_BROWSER_TEST_F(ExtensionContentSettingsApiTest, Standard) {
CheckContentSettingsDefault();
const char kExtensionPath[] = "content_settings/standard";
@@ -285,6 +280,10 @@ IN_PROC_BROWSER_TEST_F(ExtensionContentSettingsApiTest, MAYBE_Standard) {
CheckContentSettingsDefault();
}
+// TODO(crbug.com/1073588): Make this test work in branded builds.
+// Pass the plugins to look for into the JS to make this test less
+// brittle or just have the JS side look for the additional plugins.
+//
// Flaky on the trybots. See http://crbug.com/96725.
IN_PROC_BROWSER_TEST_F(ExtensionContentSettingsApiTest,
DISABLED_GetResourceIdentifiers) {
diff --git a/chromium/chrome/browser/extensions/api/content_settings/content_settings_custom_extension_provider.cc b/chromium/chrome/browser/extensions/api/content_settings/content_settings_custom_extension_provider.cc
index cccb660bd3c..a8042a43b0e 100644
--- a/chromium/chrome/browser/extensions/api/content_settings/content_settings_custom_extension_provider.cc
+++ b/chromium/chrome/browser/extensions/api/content_settings/content_settings_custom_extension_provider.cc
@@ -37,7 +37,8 @@ bool CustomExtensionProvider::SetWebsiteSetting(
const ContentSettingsPattern& secondary_pattern,
ContentSettingsType content_type,
const ResourceIdentifier& resource_identifier,
- std::unique_ptr<base::Value>&& value) {
+ std::unique_ptr<base::Value>&& value,
+ const ContentSettingConstraints& constraints) {
return false;
}
diff --git a/chromium/chrome/browser/extensions/api/content_settings/content_settings_custom_extension_provider.h b/chromium/chrome/browser/extensions/api/content_settings/content_settings_custom_extension_provider.h
index fb461b9e978..3532f1f10c9 100644
--- a/chromium/chrome/browser/extensions/api/content_settings/content_settings_custom_extension_provider.h
+++ b/chromium/chrome/browser/extensions/api/content_settings/content_settings_custom_extension_provider.h
@@ -30,11 +30,13 @@ class CustomExtensionProvider : public ObservableProvider,
const ResourceIdentifier& resource_identifier,
bool incognito) const override;
- bool SetWebsiteSetting(const ContentSettingsPattern& primary_pattern,
- const ContentSettingsPattern& secondary_pattern,
- ContentSettingsType content_type,
- const ResourceIdentifier& resource_identifier,
- std::unique_ptr<base::Value>&& value) override;
+ bool SetWebsiteSetting(
+ const ContentSettingsPattern& primary_pattern,
+ const ContentSettingsPattern& secondary_pattern,
+ ContentSettingsType content_type,
+ const ResourceIdentifier& resource_identifier,
+ std::unique_ptr<base::Value>&& value,
+ const ContentSettingConstraints& constraint = {}) override;
void ClearAllContentSettingsRules(ContentSettingsType content_type) override {
}
diff --git a/chromium/chrome/browser/extensions/api/content_settings/content_settings_helpers.cc b/chromium/chrome/browser/extensions/api/content_settings/content_settings_helpers.cc
index bd1abc27088..9ac988d77f0 100644
--- a/chromium/chrome/browser/extensions/api/content_settings/content_settings_helpers.cc
+++ b/chromium/chrome/browser/extensions/api/content_settings/content_settings_helpers.cc
@@ -6,7 +6,7 @@
#include <memory>
-#include "base/logging.h"
+#include "base/notreached.h"
#include "components/content_settings/core/browser/website_settings_info.h"
#include "components/content_settings/core/browser/website_settings_registry.h"
#include "content/public/common/url_constants.h"
diff --git a/chromium/chrome/browser/extensions/api/content_settings/content_settings_store.cc b/chromium/chrome/browser/extensions/api/content_settings/content_settings_store.cc
index 3b60b83250b..ca3eab1fb10 100644
--- a/chromium/chrome/browser/extensions/api/content_settings/content_settings_store.cc
+++ b/chromium/chrome/browser/extensions/api/content_settings/content_settings_store.cc
@@ -9,10 +9,11 @@
#include <set>
#include <utility>
+#include "base/check_op.h"
#include "base/debug/alias.h"
#include "base/feature_list.h"
-#include "base/logging.h"
#include "base/memory/ptr_util.h"
+#include "base/notreached.h"
#include "base/strings/string_util.h"
#include "base/values.h"
#include "chrome/browser/extensions/api/content_settings/content_settings_api_constants.h"
@@ -113,7 +114,7 @@ void ContentSettingsStore::SetExtensionContentSetting(
} else {
// Do not set a timestamp for extension settings.
map->SetValue(primary_pattern, secondary_pattern, type, identifier,
- base::Time(), base::Value(setting));
+ base::Time(), base::Value(setting), {});
}
}
diff --git a/chromium/chrome/browser/extensions/api/context_menus/context_menu_apitest.cc b/chromium/chrome/browser/extensions/api/context_menus/context_menu_apitest.cc
index 52acc9c128d..882270477bf 100644
--- a/chromium/chrome/browser/extensions/api/context_menus/context_menu_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/context_menus/context_menu_apitest.cc
@@ -4,7 +4,6 @@
#include "base/strings/utf_string_conversions.h"
#include "chrome/app/chrome_command_ids.h"
-#include "chrome/browser/extensions/extension_action.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/menu_manager.h"
@@ -18,7 +17,9 @@
#include "components/version_info/channel.h"
#include "content/public/browser/context_menu_params.h"
#include "content/public/browser/render_frame_host.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
+#include "extensions/browser/extension_action.h"
#include "extensions/common/scoped_worker_based_extensions_channel.h"
#include "extensions/test/result_catcher.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
diff --git a/chromium/chrome/browser/extensions/api/context_menus/context_menus_api.cc b/chromium/chrome/browser/extensions/api/context_menus/context_menus_api.cc
index 4f86af25919..44c82334e65 100644
--- a/chromium/chrome/browser/extensions/api/context_menus/context_menus_api.cc
+++ b/chromium/chrome/browser/extensions/api/context_menus/context_menus_api.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/extensions/api/context_menus/context_menus_api.h"
#include <string>
+#include <utility>
#include "base/strings/string_util.h"
#include "base/values.h"
@@ -52,7 +53,7 @@ ExtensionFunction::ResponseAction ContextMenusCreateFunction::Run() {
if (!extensions::context_menus_api_helpers::CreateMenuItem(
params->create_properties, browser_context(), extension(), id,
&error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
return RespondNow(NoArguments());
}
@@ -75,7 +76,7 @@ ExtensionFunction::ResponseAction ContextMenusUpdateFunction::Run() {
if (!extensions::context_menus_api_helpers::UpdateMenuItem(
params->update_properties, browser_context(), extension(), item_id,
&error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
return RespondNow(NoArguments());
}
diff --git a/chromium/chrome/browser/extensions/api/cookies/cookies_api.cc b/chromium/chrome/browser/extensions/api/cookies/cookies_api.cc
index 8e0a716fe26..8fa3cd840d0 100644
--- a/chromium/chrome/browser/extensions/api/cookies/cookies_api.cc
+++ b/chromium/chrome/browser/extensions/api/cookies/cookies_api.cc
@@ -233,7 +233,7 @@ ExtensionFunction::ResponseAction CookiesGetFunction::Run() {
// Read/validate input parameters.
std::string error;
if (!ParseUrl(extension(), parsed_args_->details.url, &url_, true, &error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
std::string store_id =
parsed_args_->details.store_id.get() ? *parsed_args_->details.store_id
@@ -241,7 +241,7 @@ ExtensionFunction::ResponseAction CookiesGetFunction::Run() {
network::mojom::CookieManager* cookie_manager = ParseStoreCookieManager(
browser_context(), include_incognito_information(), &store_id, &error);
if (!cookie_manager)
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
if (!parsed_args_->details.store_id.get())
parsed_args_->details.store_id.reset(new std::string(store_id));
@@ -289,7 +289,7 @@ ExtensionFunction::ResponseAction CookiesGetAllFunction::Run() {
if (parsed_args_->details.url.get() &&
!ParseUrl(extension(), *parsed_args_->details.url, &url_, false,
&error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
std::string store_id =
@@ -298,7 +298,7 @@ ExtensionFunction::ResponseAction CookiesGetAllFunction::Run() {
network::mojom::CookieManager* cookie_manager = ParseStoreCookieManager(
browser_context(), include_incognito_information(), &store_id, &error);
if (!cookie_manager)
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
if (!parsed_args_->details.store_id.get())
parsed_args_->details.store_id.reset(new std::string(store_id));
@@ -367,7 +367,7 @@ ExtensionFunction::ResponseAction CookiesSetFunction::Run() {
// Read/validate input parameters.
std::string error;
if (!ParseUrl(extension(), parsed_args_->details.url, &url_, true, &error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
std::string store_id =
parsed_args_->details.store_id.get() ? *parsed_args_->details.store_id
@@ -375,7 +375,7 @@ ExtensionFunction::ResponseAction CookiesSetFunction::Run() {
network::mojom::CookieManager* cookie_manager = ParseStoreCookieManager(
browser_context(), include_incognito_information(), &store_id, &error);
if (!cookie_manager)
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
if (!parsed_args_->details.store_id.get())
parsed_args_->details.store_id.reset(new std::string(store_id));
@@ -450,7 +450,7 @@ ExtensionFunction::ResponseAction CookiesSetFunction::Run() {
net::CookieOptions::SameSiteCookieContext::MakeInclusive());
DCHECK(!url_.is_empty() && url_.is_valid());
cookie_manager->SetCanonicalCookie(
- *cc, url_.scheme(), options,
+ *cc, url_, options,
base::BindOnce(&CookiesSetFunction::SetCanonicalCookieCallback, this));
cookies_helpers::GetCookieListFromManager(
cookie_manager, url_,
@@ -516,7 +516,7 @@ ExtensionFunction::ResponseAction CookiesRemoveFunction::Run() {
// Read/validate input parameters.
std::string error;
if (!ParseUrl(extension(), parsed_args_->details.url, &url_, true, &error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
std::string store_id =
parsed_args_->details.store_id.get() ? *parsed_args_->details.store_id
@@ -524,7 +524,7 @@ ExtensionFunction::ResponseAction CookiesRemoveFunction::Run() {
network::mojom::CookieManager* cookie_manager = ParseStoreCookieManager(
browser_context(), include_incognito_information(), &store_id, &error);
if (!cookie_manager)
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
if (!parsed_args_->details.store_id.get())
parsed_args_->details.store_id.reset(new std::string(store_id));
diff --git a/chromium/chrome/browser/extensions/api/cookies/cookies_apitest.cc b/chromium/chrome/browser/extensions/api/cookies/cookies_apitest.cc
index a61b9073c8d..bf114b6f2be 100644
--- a/chromium/chrome/browser/extensions/api/cookies/cookies_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/cookies/cookies_apitest.cc
@@ -5,6 +5,7 @@
#include "base/command_line.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/test/browser_test.h"
#include "net/cookies/cookie_util.h"
namespace extensions {
diff --git a/chromium/chrome/browser/extensions/api/cookies/cookies_helpers.cc b/chromium/chrome/browser/extensions/api/cookies/cookies_helpers.cc
index 8670ee61110..43bb1619bfb 100644
--- a/chromium/chrome/browser/extensions/api/cookies/cookies_helpers.cc
+++ b/chromium/chrome/browser/extensions/api/cookies/cookies_helpers.cc
@@ -12,7 +12,7 @@
#include <utility>
#include <vector>
-#include "base/logging.h"
+#include "base/check.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
@@ -161,14 +161,14 @@ void GetAllCookiesFromManager(
}
GURL GetURLFromCanonicalCookie(const net::CanonicalCookie& cookie) {
- const std::string& domain_key = cookie.Domain();
- const std::string scheme =
- cookie.IsSecure() ? url::kHttpsScheme : url::kHttpScheme;
- const std::string host =
- base::StartsWith(domain_key, ".", base::CompareCase::SENSITIVE)
- ? domain_key.substr(1)
- : domain_key;
- return GURL(scheme + url::kStandardSchemeSeparator + host + "/");
+ // This is only ever called for CanonicalCookies that have come from a
+ // CookieStore, which means they should not have an empty domain. Only file
+ // cookies are allowed to have empty domains, and those are only permitted on
+ // Android, and hopefully not for much longer (see crbug.com/582985).
+ DCHECK(!cookie.Domain().empty());
+
+ return net::cookie_util::CookieOriginToURL(cookie.Domain(),
+ cookie.IsSecure());
}
void AppendMatchingCookiesFromCookieListToVector(
diff --git a/chromium/chrome/browser/extensions/api/debugger/debugger_api.cc b/chromium/chrome/browser/extensions/api/debugger/debugger_api.cc
index 496d13e881f..253ce751bd9 100644
--- a/chromium/chrome/browser/extensions/api/debugger/debugger_api.cc
+++ b/chromium/chrome/browser/extensions/api/debugger/debugger_api.cc
@@ -28,16 +28,14 @@
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/devtools/chrome_devtools_manager_delegate.h"
#include "chrome/browser/extensions/api/debugger/debugger_api_constants.h"
-#include "chrome/browser/extensions/api/debugger/extension_dev_tools_infobar.h"
+#include "chrome/browser/extensions/api/debugger/extension_dev_tools_infobar_delegate.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/browser/extensions/extension_util.h"
-#include "chrome/browser/infobars/infobar_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h"
#include "chrome/common/chrome_switches.h"
-#include "components/infobars/core/infobar.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/devtools_agent_host.h"
@@ -148,7 +146,7 @@ class ExtensionDevToolsClientHost : public content::DevToolsAgentHostClient,
SendCommand::Params::CommandParams* command_params);
// Closes connection as terminated by the user.
- void InfoBarDismissed();
+ void InfoBarDestroyed();
// DevToolsAgentHostClient interface.
void AgentHostClosed(DevToolsAgentHost* agent_host) override;
@@ -180,10 +178,12 @@ class ExtensionDevToolsClientHost : public content::DevToolsAgentHostClient,
scoped_refptr<const Extension> extension_;
Debuggee debuggee_;
content::NotificationRegistrar registrar_;
- int last_request_id_;
+ int last_request_id_ = 0;
PendingRequests pending_requests_;
- ExtensionDevToolsInfoBar* infobar_;
- api::debugger::DetachReason detach_reason_;
+ std::unique_ptr<ExtensionDevToolsInfoBarDelegate::CallbackList::Subscription>
+ subscription_;
+ api::debugger::DetachReason detach_reason_ =
+ api::debugger::DETACH_REASON_TARGET_CLOSED;
// Listen to extension unloaded notification.
ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
@@ -199,10 +199,7 @@ ExtensionDevToolsClientHost::ExtensionDevToolsClientHost(
const Debuggee& debuggee)
: profile_(profile),
agent_host_(agent_host),
- extension_(std::move(extension)),
- last_request_id_(0),
- infobar_(nullptr),
- detach_reason_(api::debugger::DETACH_REASON_TARGET_CLOSED) {
+ extension_(std::move(extension)) {
CopyDebuggee(&debuggee_, debuggee);
g_attached_client_hosts.Get().insert(this);
@@ -233,16 +230,14 @@ bool ExtensionDevToolsClientHost::Attach() {
if (Manifest::IsPolicyLocation(extension_->location()))
return true;
- infobar_ = ExtensionDevToolsInfoBar::Create(
- extension_id(), extension_->name(), this,
- base::Bind(&ExtensionDevToolsClientHost::InfoBarDismissed,
- base::Unretained(this)));
+ subscription_ = ExtensionDevToolsInfoBarDelegate::Create(
+ extension_id(), extension_->name(),
+ base::BindOnce(&ExtensionDevToolsClientHost::InfoBarDestroyed,
+ base::Unretained(this)));
return true;
}
ExtensionDevToolsClientHost::~ExtensionDevToolsClientHost() {
- if (infobar_)
- infobar_->Remove(this);
g_attached_client_hosts.Get().erase(this);
}
@@ -281,7 +276,7 @@ void ExtensionDevToolsClientHost::SendMessageToBackend(
base::as_bytes(base::make_span(json)));
}
-void ExtensionDevToolsClientHost::InfoBarDismissed() {
+void ExtensionDevToolsClientHost::InfoBarDestroyed() {
detach_reason_ = api::debugger::DETACH_REASON_CANCELED_BY_USER;
RespondDetachedToPendingRequests();
SendDetachedEvent();
@@ -530,7 +525,7 @@ ExtensionFunction::ResponseAction DebuggerAttachFunction::Run() {
CopyDebuggee(&debuggee_, params->target);
std::string error;
if (!InitAgentHost(&error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
if (!DevToolsAgentHost::IsSupportedProtocolVersion(
params->required_version)) {
@@ -569,7 +564,7 @@ ExtensionFunction::ResponseAction DebuggerDetachFunction::Run() {
CopyDebuggee(&debuggee_, params->target);
std::string error;
if (!InitClientHost(&error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
client_host_->RespondDetachedToPendingRequests();
client_host_->Close();
@@ -590,7 +585,7 @@ ExtensionFunction::ResponseAction DebuggerSendCommandFunction::Run() {
CopyDebuggee(&debuggee_, params->target);
std::string error;
if (!InitClientHost(&error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
client_host_->SendMessageToBackend(this, params->method,
params->command_params.get());
@@ -605,7 +600,7 @@ void DebuggerSendCommandFunction::SendResponseBody(
if (response->Get("error", &error_body)) {
std::string error;
base::JSONWriter::Write(*error_body, &error);
- Respond(Error(error));
+ Respond(Error(std::move(error)));
return;
}
diff --git a/chromium/chrome/browser/extensions/api/debugger/debugger_apitest.cc b/chromium/chrome/browser/extensions/api/debugger/debugger_apitest.cc
index ea248c27dce..704f95eed0c 100644
--- a/chromium/chrome/browser/extensions/api/debugger/debugger_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/debugger/debugger_apitest.cc
@@ -22,6 +22,7 @@
#include "components/infobars/core/infobar.h"
#include "components/infobars/core/infobar_delegate.h"
#include "components/sessions/content/session_tab_helper.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "extensions/browser/extension_function.h"
#include "extensions/common/extension.h"
@@ -222,7 +223,7 @@ IN_PROC_BROWSER_TEST_F(DebuggerApiTest, InfoBar) {
InfoBarService* service3 = InfoBarService::FromWebContents(
another_browser->tab_strip_model()->GetWebContentsAt(1));
- // Attach should create infobars in both browsers.
+ // Attaching to one tab should create infobars in both browsers.
attach_function = new DebuggerAttachFunction();
attach_function->set_extension(extension());
ASSERT_TRUE(extension_function_test_utils::RunFunction(
@@ -233,7 +234,7 @@ IN_PROC_BROWSER_TEST_F(DebuggerApiTest, InfoBar) {
EXPECT_EQ(1u, service2->infobar_count());
EXPECT_EQ(1u, service3->infobar_count());
- // Second attach should not create infobars.
+ // Attaching to another tab should not create more infobars.
attach_function = new DebuggerAttachFunction();
attach_function->set_extension(extension());
ASSERT_TRUE(extension_function_test_utils::RunFunction(
@@ -244,7 +245,7 @@ IN_PROC_BROWSER_TEST_F(DebuggerApiTest, InfoBar) {
EXPECT_EQ(1u, service2->infobar_count());
EXPECT_EQ(1u, service3->infobar_count());
- // Detach from one of the tabs should not remove infobars.
+ // Detaching from one of the tabs should not remove infobars.
detach_function = new DebuggerDetachFunction();
detach_function->set_extension(extension());
ASSERT_TRUE(extension_function_test_utils::RunFunction(
@@ -254,17 +255,19 @@ IN_PROC_BROWSER_TEST_F(DebuggerApiTest, InfoBar) {
EXPECT_EQ(1u, service2->infobar_count());
EXPECT_EQ(1u, service3->infobar_count());
- // Detach should remove all infobars.
+ // Detaching from the other tab also should not remove infobars, since even
+ // though there is no longer an extension attached, the infobar can only be
+ // dismissed by explicit user action.
detach_function = new DebuggerDetachFunction();
detach_function->set_extension(extension());
ASSERT_TRUE(extension_function_test_utils::RunFunction(
detach_function.get(), base::StringPrintf("[{\"tabId\": %d}]", tab_id),
browser(), api_test_utils::NONE));
- EXPECT_EQ(0u, service1->infobar_count());
- EXPECT_EQ(0u, service2->infobar_count());
- EXPECT_EQ(0u, service3->infobar_count());
+ EXPECT_EQ(1u, service1->infobar_count());
+ EXPECT_EQ(1u, service2->infobar_count());
+ EXPECT_EQ(1u, service3->infobar_count());
- // Attach again.
+ // Attach again; should not create infobars.
attach_function = new DebuggerAttachFunction();
attach_function->set_extension(extension());
ASSERT_TRUE(extension_function_test_utils::RunFunction(
@@ -275,11 +278,10 @@ IN_PROC_BROWSER_TEST_F(DebuggerApiTest, InfoBar) {
EXPECT_EQ(1u, service2->infobar_count());
EXPECT_EQ(1u, service3->infobar_count());
- // Calling delegate()->InfoBarDismissed() on a global infobar should
- // cause detach and removal of all infobars, except the one used to
- // fetch the delegate (i.e., service2->infobar_at(0) itself).
- // Afterwards, service2->infobar_at(0) must be explicitly removed.
- // See InfoBarView::ButtonPressed for an example.
+ // Remove the global infobar by simulating what happens when the user clicks
+ // the close button (see InfoBarView::ButtonPressed()). The
+ // InfoBarDismissed() call will remove the infobars everywhere except on
+ // |service2| itself; the RemoveSelf() call removes that one.
service2->infobar_at(0)->delegate()->InfoBarDismissed();
service2->infobar_at(0)->RemoveSelf();
EXPECT_EQ(0u, service1->infobar_count());
@@ -292,7 +294,7 @@ IN_PROC_BROWSER_TEST_F(DebuggerApiTest, InfoBar) {
detach_function.get(), base::StringPrintf("[{\"tabId\": %d}]", tab_id),
browser(), api_test_utils::NONE));
- // And again...
+ // Attaching once again should create a new infobar.
attach_function = new DebuggerAttachFunction();
attach_function->set_extension(extension());
ASSERT_TRUE(extension_function_test_utils::RunFunction(
@@ -315,13 +317,13 @@ IN_PROC_BROWSER_TEST_F(DebuggerApiTest, InfoBar) {
another_browser = nullptr;
EXPECT_EQ(1u, service1->infobar_count());
- // Detach should remove the remaining infobar.
+ // Detach should not affect anything.
detach_function = new DebuggerDetachFunction();
detach_function->set_extension(extension());
ASSERT_TRUE(extension_function_test_utils::RunFunction(
detach_function.get(), base::StringPrintf("[{\"tabId\": %d}]", tab_id),
browser(), api_test_utils::NONE));
- EXPECT_EQ(0u, service1->infobar_count());
+ EXPECT_EQ(1u, service1->infobar_count());
}
class DebuggerExtensionApiTest : public ExtensionApiTest {
diff --git a/chromium/chrome/browser/extensions/api/debugger/debugger_extension_apitest.cc b/chromium/chrome/browser/extensions/api/debugger/debugger_extension_apitest.cc
index efdbfbebade..552525556f4 100644
--- a/chromium/chrome/browser/extensions/api/debugger/debugger_extension_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/debugger/debugger_extension_apitest.cc
@@ -5,6 +5,7 @@
#include "base/command_line.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "chrome/common/chrome_switches.h"
+#include "content/public/test/browser_test.h"
#include "extensions/common/switches.h"
class ExtensionApiTestWithSwitch : public extensions::ExtensionApiTest {
diff --git a/chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar.cc b/chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar.cc
deleted file mode 100644
index b976be9f10a..00000000000
--- a/chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar.cc
+++ /dev/null
@@ -1,147 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/extensions/api/debugger/extension_dev_tools_infobar.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/lazy_instance.h"
-#include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/devtools/global_confirm_info_bar.h"
-#include "chrome/grit/generated_resources.h"
-#include "components/infobars/core/confirm_infobar_delegate.h"
-#include "ui/base/l10n/l10n_util.h"
-
-namespace extensions {
-
-namespace {
-
-// The InfoBarDelegate that ExtensionDevToolsInfoBar shows.
-class ExtensionDevToolsInfoBarDelegate : public ConfirmInfoBarDelegate {
- public:
- ExtensionDevToolsInfoBarDelegate(const base::Closure& dismissed_callback,
- const std::string& client_name);
- ~ExtensionDevToolsInfoBarDelegate() override;
-
- // ConfirmInfoBarDelegate:
- infobars::InfoBarDelegate::InfoBarIdentifier GetIdentifier() const override;
- bool ShouldExpire(const NavigationDetails& details) const override;
- void InfoBarDismissed() override;
- base::string16 GetMessageText() const override;
- gfx::ElideBehavior GetMessageElideBehavior() const override;
-
- int GetButtons() const override;
- bool Cancel() override;
-
- private:
- const base::string16 client_name_;
- base::Closure dismissed_callback_;
-
- DISALLOW_COPY_AND_ASSIGN(ExtensionDevToolsInfoBarDelegate);
-};
-
-ExtensionDevToolsInfoBarDelegate::ExtensionDevToolsInfoBarDelegate(
- const base::Closure& dismissed_callback,
- const std::string& client_name)
- : ConfirmInfoBarDelegate(),
- client_name_(base::UTF8ToUTF16(client_name)),
- dismissed_callback_(dismissed_callback) {}
-
-ExtensionDevToolsInfoBarDelegate::~ExtensionDevToolsInfoBarDelegate() {}
-
-infobars::InfoBarDelegate::InfoBarIdentifier
-ExtensionDevToolsInfoBarDelegate::GetIdentifier() const {
- return EXTENSION_DEV_TOOLS_INFOBAR_DELEGATE;
-}
-
-bool ExtensionDevToolsInfoBarDelegate::ShouldExpire(
- const NavigationDetails& details) const {
- return false;
-}
-
-void ExtensionDevToolsInfoBarDelegate::InfoBarDismissed() {
- DCHECK(!dismissed_callback_.is_null());
- std::move(dismissed_callback_).Run();
-}
-
-base::string16 ExtensionDevToolsInfoBarDelegate::GetMessageText() const {
- return l10n_util::GetStringFUTF16(IDS_DEV_TOOLS_INFOBAR_LABEL, client_name_);
-}
-
-gfx::ElideBehavior ExtensionDevToolsInfoBarDelegate::GetMessageElideBehavior()
- const {
- // The important part of the message text above is at the end:
- // "... is debugging the browser". If the extension name is very long,
- // we'd rather truncate it instead. See https://crbug.com/823194.
- return gfx::ELIDE_HEAD;
-}
-
-int ExtensionDevToolsInfoBarDelegate::GetButtons() const {
- return BUTTON_CANCEL;
-}
-
-bool ExtensionDevToolsInfoBarDelegate::Cancel() {
- InfoBarDismissed();
- // InfoBarDismissed() will have closed us already.
- return false;
-}
-
-using ExtensionInfoBars = std::map<std::string, ExtensionDevToolsInfoBar*>;
-base::LazyInstance<ExtensionInfoBars>::Leaky g_extension_info_bars =
- LAZY_INSTANCE_INITIALIZER;
-
-} // namespace
-
-// static
-ExtensionDevToolsInfoBar* ExtensionDevToolsInfoBar::Create(
- const std::string& extension_id,
- const std::string& extension_name,
- ExtensionDevToolsClientHost* client_host,
- const base::Closure& dismissed_callback) {
- auto it = g_extension_info_bars.Get().find(extension_id);
- ExtensionDevToolsInfoBar* infobar = nullptr;
- if (it != g_extension_info_bars.Get().end())
- infobar = it->second;
- else
- infobar = new ExtensionDevToolsInfoBar(extension_id, extension_name);
- infobar->callbacks_[client_host] = dismissed_callback;
- return infobar;
-}
-
-ExtensionDevToolsInfoBar::ExtensionDevToolsInfoBar(
- const std::string& extension_id,
- const std::string& extension_name)
- : extension_id_(extension_id) {
- g_extension_info_bars.Get()[extension_id] = this;
-
- // This class closes the |infobar_|, so it's safe to pass Unretained(this).
- auto delegate = std::make_unique<ExtensionDevToolsInfoBarDelegate>(
- base::Bind(&ExtensionDevToolsInfoBar::InfoBarDismissed,
- base::Unretained(this)),
- extension_name);
- infobar_ = GlobalConfirmInfoBar::Show(std::move(delegate));
-}
-
-ExtensionDevToolsInfoBar::~ExtensionDevToolsInfoBar() {
- g_extension_info_bars.Get().erase(extension_id_);
- if (infobar_)
- infobar_->Close();
-}
-
-void ExtensionDevToolsInfoBar::Remove(
- ExtensionDevToolsClientHost* client_host) {
- callbacks_.erase(client_host);
- if (callbacks_.empty())
- delete this;
-}
-
-void ExtensionDevToolsInfoBar::InfoBarDismissed() {
- std::map<ExtensionDevToolsClientHost*, base::Closure> copy = callbacks_;
- for (const auto& pair : copy)
- pair.second.Run();
-}
-
-} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar.h b/chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar.h
deleted file mode 100644
index 63ec9a39a82..00000000000
--- a/chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_EXTENSIONS_API_DEBUGGER_EXTENSION_DEV_TOOLS_INFOBAR_H_
-#define CHROME_BROWSER_EXTENSIONS_API_DEBUGGER_EXTENSION_DEV_TOOLS_INFOBAR_H_
-
-#include <map>
-#include <string>
-
-#include "base/callback_forward.h"
-#include "base/memory/weak_ptr.h"
-
-class GlobalConfirmInfoBar;
-
-namespace extensions {
-class ExtensionDevToolsClientHost;
-
-// An infobar used to globally warn users that an extension is debugging the
-// browser (which has security consequences).
-class ExtensionDevToolsInfoBar {
- public:
- static ExtensionDevToolsInfoBar* Create(
- const std::string& extension_id,
- const std::string& extension_name,
- ExtensionDevToolsClientHost* client_host,
- const base::Closure& dismissed_callback);
- void Remove(ExtensionDevToolsClientHost* client_host);
-
- private:
- ExtensionDevToolsInfoBar(const std::string& extension_id,
- const std::string& extension_name);
- ~ExtensionDevToolsInfoBar();
- void InfoBarDismissed();
-
- std::string extension_id_;
- std::map<ExtensionDevToolsClientHost*, base::Closure> callbacks_;
- base::WeakPtr<GlobalConfirmInfoBar> infobar_;
-};
-
-} // namespace extensions
-
-#endif // CHROME_BROWSER_EXTENSIONS_API_DEBUGGER_EXTENSION_DEV_TOOLS_INFOBAR_H_
diff --git a/chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar_delegate.cc b/chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar_delegate.cc
new file mode 100644
index 00000000000..830ddfa20e3
--- /dev/null
+++ b/chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar_delegate.cc
@@ -0,0 +1,97 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/api/debugger/extension_dev_tools_infobar_delegate.h"
+
+#include <memory>
+#include <string>
+#include <utility>
+
+#include "base/callback.h"
+#include "base/callback_list.h"
+#include "base/lazy_instance.h"
+#include "base/memory/ptr_util.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/devtools/global_confirm_info_bar.h"
+#include "chrome/grit/generated_resources.h"
+#include "components/infobars/core/confirm_infobar_delegate.h"
+#include "components/infobars/core/infobar_delegate.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/gfx/text_constants.h"
+
+namespace extensions {
+
+namespace {
+
+using Delegates = std::map<std::string, ExtensionDevToolsInfoBarDelegate*>;
+base::LazyInstance<Delegates>::Leaky g_delegates = LAZY_INSTANCE_INITIALIZER;
+
+} // namespace
+
+// static
+std::unique_ptr<ExtensionDevToolsInfoBarDelegate::CallbackList::Subscription>
+ExtensionDevToolsInfoBarDelegate::Create(const std::string& extension_id,
+ const std::string& extension_name,
+ base::OnceClosure destroyed_callback) {
+ Delegates& delegates = g_delegates.Get();
+ const auto it = delegates.find(extension_id);
+ if (it != delegates.end())
+ return it->second->RegisterDestroyedCallback(std::move(destroyed_callback));
+
+ // Can't use std::make_unique<>(), constructor is private.
+ auto delegate = base::WrapUnique(
+ new ExtensionDevToolsInfoBarDelegate(extension_id, extension_name));
+ delegates[extension_id] = delegate.get();
+ std::unique_ptr<CallbackList::Subscription> subscription =
+ delegate->RegisterDestroyedCallback(std::move(destroyed_callback));
+ GlobalConfirmInfoBar::Show(std::move(delegate));
+ return subscription;
+}
+
+ExtensionDevToolsInfoBarDelegate::~ExtensionDevToolsInfoBarDelegate() {
+ callback_list_.Notify();
+ const size_t erased = g_delegates.Get().erase(extension_id_);
+ DCHECK(erased);
+}
+
+infobars::InfoBarDelegate::InfoBarIdentifier
+ExtensionDevToolsInfoBarDelegate::GetIdentifier() const {
+ return EXTENSION_DEV_TOOLS_INFOBAR_DELEGATE;
+}
+
+bool ExtensionDevToolsInfoBarDelegate::ShouldExpire(
+ const NavigationDetails& details) const {
+ return false;
+}
+
+base::string16 ExtensionDevToolsInfoBarDelegate::GetMessageText() const {
+ return l10n_util::GetStringFUTF16(IDS_DEV_TOOLS_INFOBAR_LABEL,
+ extension_name_);
+}
+
+gfx::ElideBehavior ExtensionDevToolsInfoBarDelegate::GetMessageElideBehavior()
+ const {
+ // The important part of the message text above is at the end:
+ // "... is debugging the browser". If the extension name is very long,
+ // we'd rather truncate it instead. See https://crbug.com/823194.
+ return gfx::ELIDE_HEAD;
+}
+
+int ExtensionDevToolsInfoBarDelegate::GetButtons() const {
+ return BUTTON_CANCEL;
+}
+
+ExtensionDevToolsInfoBarDelegate::ExtensionDevToolsInfoBarDelegate(
+ std::string extension_id,
+ const std::string& extension_name)
+ : extension_id_(std::move(extension_id)),
+ extension_name_(base::UTF8ToUTF16(extension_name)) {}
+
+std::unique_ptr<ExtensionDevToolsInfoBarDelegate::CallbackList::Subscription>
+ExtensionDevToolsInfoBarDelegate::RegisterDestroyedCallback(
+ base::OnceClosure destroyed_callback) {
+ return callback_list_.Add(std::move(destroyed_callback));
+}
+
+} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar_delegate.h b/chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar_delegate.h
new file mode 100644
index 00000000000..34f5000ca4a
--- /dev/null
+++ b/chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar_delegate.h
@@ -0,0 +1,60 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_EXTENSIONS_API_DEBUGGER_EXTENSION_DEV_TOOLS_INFOBAR_DELEGATE_H_
+#define CHROME_BROWSER_EXTENSIONS_API_DEBUGGER_EXTENSION_DEV_TOOLS_INFOBAR_DELEGATE_H_
+
+#include <memory>
+#include <string>
+
+#include "base/callback_forward.h"
+#include "base/callback_list.h"
+#include "base/strings/string16.h"
+#include "components/infobars/core/confirm_infobar_delegate.h"
+
+namespace extensions {
+
+// An infobar used to globally warn users that an extension is debugging the
+// browser (which has security consequences).
+class ExtensionDevToolsInfoBarDelegate : public ConfirmInfoBarDelegate {
+ public:
+ using CallbackList = base::OnceClosureList;
+
+ // Ensures a global infobar corresponding to the supplied extension is
+ // showing and registers |destroyed_callback| with it to be called back on
+ // destruction.
+ static std::unique_ptr<CallbackList::Subscription> Create(
+ const std::string& extension_id,
+ const std::string& extension_name,
+ base::OnceClosure destroyed_callback);
+
+ ExtensionDevToolsInfoBarDelegate(const ExtensionDevToolsInfoBarDelegate&) =
+ delete;
+ ExtensionDevToolsInfoBarDelegate& operator=(
+ const ExtensionDevToolsInfoBarDelegate&) = delete;
+ ~ExtensionDevToolsInfoBarDelegate() override;
+
+ // ConfirmInfoBarDelegate:
+ infobars::InfoBarDelegate::InfoBarIdentifier GetIdentifier() const override;
+ bool ShouldExpire(const NavigationDetails& details) const override;
+ base::string16 GetMessageText() const override;
+ gfx::ElideBehavior GetMessageElideBehavior() const override;
+ int GetButtons() const override;
+
+ private:
+ ExtensionDevToolsInfoBarDelegate(std::string extension_id,
+ const std::string& extension_name);
+
+ // Adds |destroyed_callback| to the list of callbacks to run on destruction.
+ std::unique_ptr<CallbackList::Subscription> RegisterDestroyedCallback(
+ base::OnceClosure destroyed_callback);
+
+ const std::string extension_id_;
+ const base::string16 extension_name_;
+ CallbackList callback_list_;
+};
+
+} // namespace extensions
+
+#endif // CHROME_BROWSER_EXTENSIONS_API_DEBUGGER_EXTENSION_DEV_TOOLS_INFOBAR_DELEGATE_H_
diff --git a/chromium/chrome/browser/extensions/api/declarative/declarative_apitest.cc b/chromium/chrome/browser/extensions/api/declarative/declarative_apitest.cc
index 05022dd0ba4..13265b25237 100644
--- a/chromium/chrome/browser/extensions/api/declarative/declarative_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/declarative/declarative_apitest.cc
@@ -17,6 +17,7 @@
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/browser/storage_partition.h"
#include "content/public/common/content_features.h"
+#include "content/public/test/browser_test.h"
#include "extensions/browser/api/declarative/rules_registry_service.h"
#include "extensions/browser/api/declarative_webrequest/webrequest_constants.h"
#include "extensions/browser/api/declarative_webrequest/webrequest_rules_registry.h"
diff --git a/chromium/chrome/browser/extensions/api/declarative_content/content_action.cc b/chromium/chrome/browser/extensions/api/declarative_content/content_action.cc
index 7365c7eba44..9951f0a2666 100644
--- a/chromium/chrome/browser/extensions/api/declarative_content/content_action.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_content/content_action.cc
@@ -13,7 +13,6 @@
#include "base/strings/stringprintf.h"
#include "base/values.h"
#include "chrome/browser/extensions/api/extension_action/extension_action_api.h"
-#include "chrome/browser/extensions/extension_action.h"
#include "chrome/browser/extensions/extension_action_manager.h"
#include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/browser/extensions/extension_ui_util.h"
@@ -23,6 +22,7 @@
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
#include "extensions/browser/declarative_user_script_manager.h"
+#include "extensions/browser/extension_action.h"
#include "extensions/browser/extension_system.h"
#include "extensions/common/api/declarative/declarative_constants.h"
#include "extensions/common/extension.h"
@@ -69,7 +69,7 @@ class ShowExtensionAction : public ContentAction {
// TODO(devlin): We should probably throw an error if the extension has no
// action specified in the manifest. Currently, this is allowed since
// extensions will have a synthesized page action.
- if (!ActionInfo::GetAnyActionInfo(extension)) {
+ if (!ActionInfo::GetExtensionActionInfo(extension)) {
*error = kNoAction;
return nullptr;
}
@@ -386,7 +386,7 @@ std::unique_ptr<ContentAction> SetIcon::Create(
const base::DictionaryValue* dict,
std::string* error) {
// We can't set a page or action's icon if the extension doesn't have one.
- if (!ActionInfo::GetAnyActionInfo(extension)) {
+ if (!ActionInfo::GetExtensionActionInfo(extension)) {
*error = kNoPageOrBrowserAction;
return nullptr;
}
diff --git a/chromium/chrome/browser/extensions/api/declarative_content/content_action_unittest.cc b/chromium/chrome/browser/extensions/api/declarative_content/content_action_unittest.cc
index 00eb884a1e7..de91e506749 100644
--- a/chromium/chrome/browser/extensions/api/declarative_content/content_action_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_content/content_action_unittest.cc
@@ -10,7 +10,6 @@
#include "base/run_loop.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/values_test_util.h"
-#include "chrome/browser/extensions/extension_action.h"
#include "chrome/browser/extensions/extension_action_manager.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_service_test_base.h"
@@ -19,6 +18,7 @@
#include "chrome/browser/extensions/test_extension_system.h"
#include "chrome/test/base/testing_profile.h"
#include "content/public/browser/web_contents.h"
+#include "extensions/browser/extension_action.h"
#include "extensions/browser/extension_system.h"
#include "extensions/common/extension.h"
#include "extensions/common/extension_builder.h"
diff --git a/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_apitest.cc b/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_apitest.cc
index 044dc6eaa3e..73650f930ac 100644
--- a/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_apitest.cc
@@ -10,7 +10,6 @@
#include "build/build_config.h"
#include "chrome/browser/bookmarks/bookmark_model_factory.h"
#include "chrome/browser/extensions/chrome_test_extension_loader.h"
-#include "chrome/browser/extensions/extension_action.h"
#include "chrome/browser/extensions/extension_action_manager.h"
#include "chrome/browser/extensions/extension_action_test_util.h"
#include "chrome/browser/extensions/extension_apitest.h"
@@ -22,7 +21,9 @@
#include "components/bookmarks/browser/bookmark_model.h"
#include "components/sessions/content/session_tab_helper.h"
#include "content/public/browser/storage_partition.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
+#include "extensions/browser/extension_action.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_system.h"
#include "extensions/browser/test_extension_registry_observer.h"
diff --git a/chromium/chrome/browser/extensions/api/declarative_content/request_content_script_apitest.cc b/chromium/chrome/browser/extensions/api/declarative_content/request_content_script_apitest.cc
index b483fdc4411..65865c4235a 100644
--- a/chromium/chrome/browser/extensions/api/declarative_content/request_content_script_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_content/request_content_script_apitest.cc
@@ -9,6 +9,7 @@
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "extensions/test/extension_test_message_listener.h"
#include "extensions/test/test_extension_dir.h"
diff --git a/chromium/chrome/browser/extensions/api/declarative_content/set_icon_apitest.cc b/chromium/chrome/browser/extensions/api/declarative_content/set_icon_apitest.cc
index d017f72f716..44957fc9745 100644
--- a/chromium/chrome/browser/extensions/api/declarative_content/set_icon_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_content/set_icon_apitest.cc
@@ -8,6 +8,7 @@
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "components/version_info/version_info.h"
#include "content/public/browser/storage_partition.h"
+#include "content/public/test/browser_test.h"
#include "extensions/common/features/feature_channel.h"
#include "extensions/test/extension_test_message_listener.h"
#include "extensions/test/test_extension_dir.h"
diff --git a/chromium/chrome/browser/extensions/api/declarative_net_request/action_tracker_unittest.cc b/chromium/chrome/browser/extensions/api/declarative_net_request/action_tracker_unittest.cc
index c054ff4fef0..0393eb3cb47 100644
--- a/chromium/chrome/browser/extensions/api/declarative_net_request/action_tracker_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_net_request/action_tracker_unittest.cc
@@ -14,7 +14,6 @@
#include "extensions/browser/api/web_request/web_request_info.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_util.h"
-#include "extensions/common/api/declarative_net_request.h"
#include "extensions/common/api/declarative_net_request/constants.h"
#include "extensions/common/api/declarative_net_request/test_utils.h"
#include "extensions/common/constants.h"
@@ -25,12 +24,8 @@
namespace extensions {
namespace declarative_net_request {
-namespace dnr_api = api::declarative_net_request;
-
namespace {
-constexpr char kJSONRulesFilename[] = "rules_file.json";
-
constexpr int64_t kNavigationId = 1;
class ActionTrackerTest : public DNRTestBase {
@@ -55,7 +50,9 @@ class ActionTrackerTest : public DNRTestBase {
// Create extension directory.
ASSERT_TRUE(base::CreateDirectory(extension_dir));
- TestRulesetInfo info = {kJSONRulesFilename, base::ListValue()};
+ constexpr char kRulesetID[] = "id";
+ constexpr char kJSONRulesFilename[] = "rules_file.json";
+ TestRulesetInfo info(kRulesetID, kJSONRulesFilename, base::ListValue());
WriteManifestAndRuleset(
extension_dir, info,
std::vector<std::string>({URLPattern::kAllUrlsPattern}), flags);
@@ -71,7 +68,7 @@ class ActionTrackerTest : public DNRTestBase {
// Helper to create a RequestAction for the given |extension_id|.
RequestAction CreateRequestAction(const ExtensionId& extension_id) {
return RequestAction(RequestActionType::BLOCK, kMinValidID,
- kDefaultPriority, dnr_api::SOURCE_TYPE_MANIFEST,
+ kDefaultPriority, kMinValidStaticRulesetID,
extension_id);
}
diff --git a/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_apitest.cc b/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_apitest.cc
index 4ac0fec5fe2..827ac893936 100644
--- a/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_apitest.cc
@@ -9,6 +9,7 @@
#include "base/files/scoped_temp_dir.h"
#include "base/macros.h"
#include "base/threading/thread_restrictions.h"
+#include "content/public/test/browser_test.h"
#include "net/dns/mock_host_resolver.h"
namespace {
@@ -51,10 +52,6 @@ IN_PROC_BROWSER_TEST_F(DeclarativeNetRequestAPItest, DynamicRules) {
ASSERT_TRUE(RunExtensionTest("dynamic_rules")) << message_;
}
-IN_PROC_BROWSER_TEST_F(DeclarativeNetRequestAPItest, HeaderRemoval) {
- ASSERT_TRUE(RunExtensionTest("header_removal")) << message_;
-}
-
// TODO(crbug.com/1029233) Restore this test. This is disabled due to
// flakiness.
IN_PROC_BROWSER_TEST_F(DeclarativeNetRequestAPItest,
@@ -62,7 +59,8 @@ IN_PROC_BROWSER_TEST_F(DeclarativeNetRequestAPItest,
ASSERT_TRUE(RunExtensionTest("on_rules_matched_debug")) << message_;
}
-IN_PROC_BROWSER_TEST_F(DeclarativeNetRequestAPItest, GetMatchedRules) {
+// TODO(crbug.com/1070344): Disabled due to flakiness.
+IN_PROC_BROWSER_TEST_F(DeclarativeNetRequestAPItest, DISABLED_GetMatchedRules) {
ASSERT_TRUE(RunExtensionTest("get_matched_rules")) << message_;
}
diff --git a/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc b/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
index 214ce9ff122..a5d9df75278 100644
--- a/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
@@ -35,10 +35,10 @@
#include "build/build_config.h"
#include "chrome/browser/extensions/active_tab_permission_granter.h"
#include "chrome/browser/extensions/api/extension_action/test_extension_action_api_observer.h"
-#include "chrome/browser/extensions/extension_action.h"
#include "chrome/browser/extensions/extension_action_manager.h"
#include "chrome/browser/extensions/extension_action_runner.h"
#include "chrome/browser/extensions/extension_browsertest.h"
+#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/browser/extensions/extension_util.h"
#include "chrome/browser/extensions/load_error_reporter.h"
@@ -50,7 +50,6 @@
#include "chrome/browser/ui/browser_tabstrip.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/chrome_paths.h"
-#include "chrome/common/extensions/api/extension_action/action_info.h"
#include "chrome/common/webui_url_constants.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/prefs/pref_service.h"
@@ -64,11 +63,13 @@
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/storage_partition.h"
#include "content/public/common/url_constants.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/simple_url_loader_test_helper.h"
#include "content/public/test/test_navigation_observer.h"
#include "content/public/test/test_utils.h"
#include "extensions/browser/api/declarative_net_request/action_tracker.h"
+#include "extensions/browser/api/declarative_net_request/composite_matcher.h"
#include "extensions/browser/api/declarative_net_request/constants.h"
#include "extensions/browser/api/declarative_net_request/declarative_net_request_api.h"
#include "extensions/browser/api/declarative_net_request/rules_monitor_service.h"
@@ -80,6 +81,7 @@
#include "extensions/browser/api/web_request/web_request_api.h"
#include "extensions/browser/api/web_request/web_request_info.h"
#include "extensions/browser/blocked_action_type.h"
+#include "extensions/browser/extension_action.h"
#include "extensions/browser/extension_prefs.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_system.h"
@@ -89,6 +91,7 @@
#include "extensions/browser/warning_set.h"
#include "extensions/common/api/declarative_net_request/constants.h"
#include "extensions/common/api/declarative_net_request/test_utils.h"
+#include "extensions/common/api/extension_action/action_info.h"
#include "extensions/common/constants.h"
#include "extensions/common/extension_features.h"
#include "extensions/common/extension_id.h"
@@ -117,7 +120,9 @@ namespace {
namespace dnr_api = api::declarative_net_request;
-constexpr char kJSONRulesFilename[] = "rules_file.json";
+using ::testing::UnorderedElementsAre;
+
+constexpr char kDefaultRulesetID[] = "id";
// Returns true if |window.scriptExecuted| is true for the given frame.
bool WasFrameWithScriptLoaded(content::RenderFrameHost* rfh) {
@@ -130,84 +135,8 @@ bool WasFrameWithScriptLoaded(content::RenderFrameHost* rfh) {
return script_resource_was_loaded;
}
-// Used to monitor requests that reach the RulesetManager.
-class URLRequestMonitor : public RulesetManager::TestObserver {
- public:
- explicit URLRequestMonitor(RulesetManager* manager, GURL url)
- : manager_(manager), url_(std::move(url)) {
- manager_->SetObserverForTest(this);
- }
- ~URLRequestMonitor() override { manager_->SetObserverForTest(nullptr); }
-
- bool GetAndResetRequestSeen(bool new_val) {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- bool return_val = request_seen_;
- request_seen_ = new_val;
- return return_val;
- }
-
- private:
- // RulesetManager::TestObserver implementation.
- void OnEvaluateRequest(const WebRequestInfo& request,
- bool is_incognito_context) override {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- if (request.url == url_)
- GetAndResetRequestSeen(true);
- }
-
- RulesetManager* const manager_;
- GURL url_;
- bool request_seen_ = false;
- SEQUENCE_CHECKER(sequence_checker_);
-
- DISALLOW_COPY_AND_ASSIGN(URLRequestMonitor);
-};
-
-// Used to wait till the number of rulesets managed by the RulesetManager reach
-// a certain count.
-class RulesetCountWaiter : public RulesetManager::TestObserver {
- public:
- explicit RulesetCountWaiter(RulesetManager* manager)
- : manager_(manager), current_count_(manager_->GetMatcherCountForTest()) {
- manager_->SetObserverForTest(this);
- }
- ~RulesetCountWaiter() override { manager_->SetObserverForTest(nullptr); }
-
- void WaitForRulesetCount(size_t count) {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- ASSERT_FALSE(expected_count_);
- if (current_count_ == count)
- return;
-
- expected_count_ = count;
- run_loop_ = std::make_unique<base::RunLoop>();
- run_loop_->Run();
- }
-
- private:
- // RulesetManager::TestObserver implementation.
- void OnRulesetCountChanged(size_t count) override {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- current_count_ = count;
- if (expected_count_ != count)
- return;
-
- ASSERT_TRUE(run_loop_.get());
-
- run_loop_->Quit();
- expected_count_.reset();
- }
-
- RulesetManager* const manager_;
- size_t current_count_ = 0;
- base::Optional<size_t> expected_count_;
- std::unique_ptr<base::RunLoop> run_loop_;
- SEQUENCE_CHECKER(sequence_checker_);
-
- DISALLOW_COPY_AND_ASSIGN(RulesetCountWaiter);
-};
-
-// Helper to wait for warnings thrown for a given extension.
+// Helper to wait for warnings thrown for a given extension. This must be
+// constructed before warnings are added.
class WarningServiceObserver : public WarningService::Observer {
public:
WarningServiceObserver(WarningService* warning_service,
@@ -215,12 +144,14 @@ class WarningServiceObserver : public WarningService::Observer {
: observer_(this), extension_id_(extension_id) {
observer_.Add(warning_service);
}
+ WarningServiceObserver(const WarningServiceObserver&) = delete;
+ WarningServiceObserver& operator=(const WarningServiceObserver&) = delete;
// Should only be called once per WarningServiceObserver lifetime.
void WaitForWarning() { run_loop_.Run(); }
private:
- // WarningService::TestObserver override:
+ // WarningService::Observer override:
void ExtensionWarningsChanged(
const ExtensionIdSet& affected_extensions) override {
if (!base::Contains(affected_extensions, extension_id_))
@@ -232,8 +163,31 @@ class WarningServiceObserver : public WarningService::Observer {
ScopedObserver<WarningService, WarningService::Observer> observer_;
const ExtensionId extension_id_;
base::RunLoop run_loop_;
+};
+
+// Helper to wait for ruleset load in response to extension load.
+class RulesetLoadObserver : public RulesMonitorService::TestObserver {
+ public:
+ RulesetLoadObserver(RulesMonitorService* service,
+ const ExtensionId& extension_id)
+ : service_(service), extension_id_(extension_id) {
+ service_->SetObserverForTest(this);
+ }
+
+ ~RulesetLoadObserver() override { service_->SetObserverForTest(nullptr); }
+
+ void Wait() { run_loop_.Run(); }
+
+ private:
+ // RulesMonitorService::TestObserver override:
+ void OnRulesetLoadComplete(const ExtensionId& extension_id) override {
+ if (extension_id_ == extension_id)
+ run_loop_.Quit();
+ }
- DISALLOW_COPY_AND_ASSIGN(WarningServiceObserver);
+ RulesMonitorService* const service_;
+ const ExtensionId extension_id_;
+ base::RunLoop run_loop_;
};
class DeclarativeNetRequestBrowserTest
@@ -266,22 +220,33 @@ class DeclarativeNetRequestBrowserTest
host_resolver()->AddRule("*", "127.0.0.1");
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
+
+ ruleset_manager_observer_ =
+ std::make_unique<RulesetManagerObserver>(ruleset_manager());
}
- void CreatedBrowserMainParts(
- content::BrowserMainParts* browser_main_parts) override {
- // At this point, the notification service is initialized but the profile
- // and extensions have not. Initialize |background_page_ready_listener_| to
- // listen for messages from extensions.
- CHECK(content::NotificationService::current());
-
- background_page_ready_listener_ =
- std::make_unique<ExtensionTestMessageListener>("ready",
- false /*will_reply*/);
-
- ExtensionBrowserTest::CreatedBrowserMainParts(browser_main_parts);
+
+ void TearDownOnMainThread() override {
+ // Ensure |ruleset_manager_observer_| gets destructed on the UI thread.
+ ruleset_manager_observer_.reset();
+
+ ExtensionBrowserTest::TearDownOnMainThread();
}
protected:
+ // Returns the number of extensions with active rulesets.
+ size_t extensions_with_rulesets_count() {
+ return ruleset_manager()->GetMatcherCountForTest();
+ }
+
+ RulesetManagerObserver* ruleset_manager_observer() {
+ return ruleset_manager_observer_.get();
+ }
+
+ // Waits till the number of extensions with active rulesets is |count|.
+ void WaitForExtensionsWithRulesetsCount(size_t count) {
+ ruleset_manager_observer()->WaitForExtensionsWithRulesetsCount(count);
+ }
+
content::WebContents* web_contents(Browser* browser) const {
return browser->tab_strip_model()->GetActiveWebContents();
}
@@ -308,8 +273,17 @@ class DeclarativeNetRequestBrowserTest
->GetPageType();
}
+ RulesMonitorService* rules_monitor_service() {
+ return RulesMonitorService::Get(profile());
+ }
+
RulesetManager* ruleset_manager() {
- return RulesMonitorService::Get(profile())->ruleset_manager();
+ return rules_monitor_service()->ruleset_manager();
+ }
+
+ const Extension* last_loaded_extension() {
+ return extension_registry()->GetExtensionById(last_loaded_extension_id(),
+ ExtensionRegistry::ENABLED);
}
content::PageType GetPageType() const { return GetPageType(browser()); }
@@ -325,79 +299,79 @@ class DeclarativeNetRequestBrowserTest
void set_config_flags(unsigned flags) { flags_ = flags; }
- // Loads an extension with the given declarative |rules| in the given
- // |directory|. Generates a fatal failure if the extension failed to load.
- // |hosts| specifies the host permissions, the extensions should
- // have.
+ // Loads an extension with the given |rulesets| in the given |directory|.
+ // Generates a fatal failure if the extension failed to load. |hosts|
+ // specifies the host permissions the extensions should have. Waits till the
+ // ruleset is loaded.
+ void LoadExtensionWithRulesets(const std::vector<TestRulesetInfo>& rulesets,
+ const std::string& directory,
+ const std::vector<std::string>& hosts) {
+ size_t expected_extension_ruleset_count_change = rulesets.empty() ? 0 : 1;
+ LoadExtensionInternal(
+ rulesets, directory, hosts, expected_extension_ruleset_count_change,
+ false /* has_dynamic_ruleset */, false /* is_extension_update */);
+ }
+
+ // Similar to LoadExtensionWithRulesets above but updates the last loaded
+ // extension instead. |expected_extension_ruleset_count_change| corresponds to
+ // the expected change in the number of extensions with rulesets after
+ // extension update. |has_dynamic_ruleset| should be true if the installed
+ // extension has a dynamic ruleset.
+ void UpdateLastLoadedExtension(
+ const std::vector<TestRulesetInfo>& new_rulesets,
+ const std::string& new_directory,
+ const std::vector<std::string>& new_hosts,
+ int expected_extension_ruleset_count_change,
+ bool has_dynamic_ruleset) {
+ LoadExtensionInternal(new_rulesets, new_directory, new_hosts,
+ expected_extension_ruleset_count_change,
+ has_dynamic_ruleset, true /* is_extension_update */);
+ }
+
+ // Specialization of LoadExtensionWithRulesets above for an extension with a
+ // single static ruleset.
void LoadExtensionWithRules(const std::vector<TestRule>& rules,
const std::string& directory,
const std::vector<std::string>& hosts) {
- base::ScopedAllowBlockingForTesting scoped_allow_blocking;
- base::HistogramTester tester;
-
- base::FilePath extension_dir = temp_dir_.GetPath().AppendASCII(directory);
- EXPECT_TRUE(base::CreateDirectory(extension_dir));
-
- TestRulesetInfo info = {kJSONRulesFilename, std::move(*ToListValue(rules))};
- WriteManifestAndRuleset(extension_dir, info, hosts, flags_);
-
- background_page_ready_listener_->Reset();
- const Extension* extension = nullptr;
- switch (GetParam()) {
- case ExtensionLoadType::PACKED:
- extension = InstallExtensionWithPermissionsGranted(
- extension_dir, 1 /* expected_change */);
- break;
- case ExtensionLoadType::UNPACKED:
- extension = LoadExtension(extension_dir);
- break;
- }
-
- ASSERT_TRUE(extension);
-
- // Ensure the ruleset is also loaded on the IO thread.
- content::RunAllTasksUntilIdle();
-
- // The histograms below are not logged for unpacked extensions.
- if (GetParam() == ExtensionLoadType::PACKED) {
- tester.ExpectTotalCount(kIndexAndPersistRulesTimeHistogram,
- 1 /* count */);
- tester.ExpectBucketCount(kManifestRulesCountHistogram,
- rules.size() /*sample*/, 1 /* count */);
- }
- tester.ExpectTotalCount(
- "Extensions.DeclarativeNetRequest.CreateVerifiedMatcherTime", 1);
- tester.ExpectUniqueSample(
- "Extensions.DeclarativeNetRequest.LoadRulesetResult",
- RulesetMatcher::kLoadSuccess /*sample*/, 1 /*count*/);
-
- EXPECT_TRUE(AreAllIndexedStaticRulesetsValid(*extension, profile()));
-
- // Wait for the background page to load if needed.
- if (flags_ & kConfig_HasBackgroundScript)
- WaitForBackgroundScriptToLoad(extension->id());
+ constexpr char kJSONRulesFilename[] = "rules_file.json";
+ LoadExtensionWithRulesets(
+ {TestRulesetInfo(kDefaultRulesetID, kJSONRulesFilename,
+ *ToListValue(rules))},
+ directory, hosts);
+ }
- // Ensure no load errors were reported.
- EXPECT_TRUE(LoadErrorReporter::GetInstance()->GetErrors()->empty());
+ // Returns a url with |filter| as a substring.
+ GURL GetURLForFilter(const std::string& filter) const {
+ return embedded_test_server()->GetURL(
+ "abc.com", "/pages_with_script/index.html?" + filter);
}
void LoadExtensionWithRules(const std::vector<TestRule>& rules) {
LoadExtensionWithRules(rules, "test_extension", {} /* hosts */);
}
- void WaitForBackgroundScriptToLoad(const ExtensionId& extension_id) {
- ASSERT_TRUE(background_page_ready_listener_->WaitUntilSatisfied());
- ASSERT_EQ(extension_id,
- background_page_ready_listener_->extension_id_for_message());
- background_page_ready_listener_->Reset();
- }
-
// Returns true if the navigation to given |url| is blocked.
bool IsNavigationBlocked(const GURL& url) {
ui_test_utils::NavigateToURL(browser(), url);
return !WasFrameWithScriptLoaded(GetMainFrame());
}
+ void VerifyNavigations(const std::vector<GURL>& expected_blocked_urls,
+ const std::vector<GURL>& expected_allowed_urls) {
+ for (const GURL& url : expected_blocked_urls)
+ EXPECT_TRUE(IsNavigationBlocked(url)) << url;
+
+ for (const GURL& url : expected_allowed_urls)
+ EXPECT_FALSE(IsNavigationBlocked(url)) << url;
+ }
+
+ TestRule CreateMainFrameBlockRule(const std::string& filter) {
+ TestRule rule = CreateGenericRule();
+ rule.condition->url_filter = filter;
+ rule.condition->resource_types = std::vector<std::string>({"main_frame"});
+ return rule;
+ }
+
void AddDynamicRules(const ExtensionId& extension_id,
const std::vector<TestRule>& rules) {
static constexpr char kScript[] = R"(
@@ -428,13 +402,39 @@ class DeclarativeNetRequestBrowserTest
)";
// Serialize |rule_ids|.
- ListBuilder builder;
- for (int rule_id : rule_ids)
- builder.Append(rule_id);
+ std::unique_ptr<base::Value> rule_ids_value =
+ ListBuilder().Append(rule_ids.begin(), rule_ids.end()).Build();
// A cast is necessary from ListValue to Value, else this fails to compile.
const std::string script = content::JsReplace(
- kScript, static_cast<const base::Value&>(*builder.Build()));
+ kScript, static_cast<const base::Value&>(*rule_ids_value));
+ ASSERT_EQ("success", ExecuteScriptInBackgroundPage(extension_id, script));
+ }
+
+ void UpdateEnabledRulesets(
+ const ExtensionId& extension_id,
+ const std::vector<std::string>& ruleset_ids_to_remove,
+ const std::vector<std::string>& ruleset_ids_to_add) {
+ static constexpr char kScript[] = R"(
+ chrome.declarativeNetRequest.updateEnabledRulesets($1, $2, () => {
+ window.domAutomationController.send(chrome.runtime.lastError ?
+ chrome.runtime.lastError.message : 'success');
+ });
+ )";
+
+ std::unique_ptr<base::Value> ids_to_remove =
+ ListBuilder()
+ .Append(ruleset_ids_to_remove.begin(), ruleset_ids_to_remove.end())
+ .Build();
+ std::unique_ptr<base::Value> ids_to_add =
+ ListBuilder()
+ .Append(ruleset_ids_to_add.begin(), ruleset_ids_to_add.end())
+ .Build();
+
+ // A cast is necessary from ListValue to Value, else this fails to compile.
+ const std::string script = content::JsReplace(
+ kScript, static_cast<const base::Value&>(*ids_to_remove),
+ static_cast<const base::Value&>(*ids_to_add));
ASSERT_EQ("success", ExecuteScriptInBackgroundPage(extension_id, script));
}
@@ -554,9 +554,123 @@ class DeclarativeNetRequestBrowserTest
requests_to_server_.insert(request.GetURL());
}
+ // Helper to load an extension. |has_dynamic_ruleset| should be true if the
+ // extension has a dynamic ruleset on load. If |is_extension_update|, the last
+ // loaded extension is updated.
+ void LoadExtensionInternal(const std::vector<TestRulesetInfo>& rulesets,
+ const std::string& directory,
+ const std::vector<std::string>& hosts,
+ int expected_extension_ruleset_count_change,
+ bool has_dynamic_ruleset,
+ bool is_extension_update) {
+ CHECK(!is_extension_update || GetParam() == ExtensionLoadType::PACKED);
+
+ // The "crx" directory is reserved for use by this test fixture.
+ CHECK_NE("crx", directory);
+
+ base::ScopedAllowBlockingForTesting scoped_allow_blocking;
+ base::HistogramTester tester;
+
+ base::FilePath extension_dir = temp_dir_.GetPath().AppendASCII(directory);
+ ASSERT_FALSE(base::PathExists(extension_dir));
+ EXPECT_TRUE(base::CreateDirectory(extension_dir));
+
+ WriteManifestAndRulesets(extension_dir, rulesets, hosts, flags_);
+
+ ExtensionTestMessageListener background_page_ready_listener(
+ "ready", false /*will_reply*/);
+ size_t current_ruleset_count = extensions_with_rulesets_count();
+
+ const Extension* extension = nullptr;
+ switch (GetParam()) {
+ case ExtensionLoadType::PACKED: {
+ base::FilePath crx_dir =
+ temp_dir_.GetPath().AppendASCII("crx").AppendASCII(directory);
+ base::FilePath crx_path = crx_dir.AppendASCII("temp.crx");
+
+ base::FilePath pem_path;
+ if (is_extension_update)
+ pem_path = last_pem_path_;
+ else
+ last_pem_path_ = crx_dir.AppendASCII("temp.pem");
+
+ ASSERT_FALSE(base::PathExists(crx_dir));
+ ASSERT_TRUE(base::CreateDirectory(crx_dir));
+ ASSERT_EQ(crx_path,
+ PackExtensionWithOptions(extension_dir, crx_path, pem_path,
+ last_pem_path_ /* pem_out_path */
+ ));
+
+ if (is_extension_update) {
+ std::string extension_id = last_loaded_extension_id();
+ extension =
+ UpdateExtension(extension_id, crx_path, 0 /* expected_change */);
+ } else {
+ extension = InstallExtensionWithPermissionsGranted(
+ crx_path, 1 /* expected_change */);
+ }
+ break;
+ }
+ case ExtensionLoadType::UNPACKED:
+ extension = LoadExtension(extension_dir);
+ break;
+ }
+
+ ASSERT_TRUE(extension);
+
+ WaitForExtensionsWithRulesetsCount(current_ruleset_count +
+ expected_extension_ruleset_count_change);
+
+ size_t expected_enabled_rulesets_count = has_dynamic_ruleset ? 1 : 0;
+ size_t expected_manifest_rules_count = 0;
+ size_t expected_manifest_enabled_rules_count = 0;
+ for (const TestRulesetInfo& info : rulesets) {
+ size_t rules_count = info.rules_value.GetList().size();
+ expected_manifest_rules_count += rules_count;
+
+ if (info.enabled) {
+ expected_enabled_rulesets_count++;
+ expected_manifest_enabled_rules_count += rules_count;
+ }
+ }
+
+ // The histograms below are not logged for unpacked extensions.
+ if (GetParam() == ExtensionLoadType::PACKED) {
+ size_t expected_histogram_counts = rulesets.empty() ? 0 : 1;
+
+ tester.ExpectTotalCount(kIndexAndPersistRulesTimeHistogram,
+ expected_histogram_counts);
+ tester.ExpectBucketCount(kManifestRulesCountHistogram,
+ expected_manifest_rules_count /*sample*/,
+ expected_histogram_counts);
+ tester.ExpectBucketCount(kManifestEnabledRulesCountHistogram,
+ expected_manifest_enabled_rules_count /*sample*/,
+ expected_histogram_counts);
+ }
+ tester.ExpectTotalCount(
+ "Extensions.DeclarativeNetRequest.CreateVerifiedMatcherTime",
+ expected_enabled_rulesets_count);
+ tester.ExpectUniqueSample(
+ "Extensions.DeclarativeNetRequest.LoadRulesetResult",
+ RulesetMatcher::kLoadSuccess /*sample*/,
+ expected_enabled_rulesets_count);
+
+ EXPECT_TRUE(AreAllIndexedStaticRulesetsValid(*extension, profile()));
+
+ // Wait for the background page to load if needed.
+ if (flags_ & kConfig_HasBackgroundScript) {
+ ASSERT_TRUE(background_page_ready_listener.WaitUntilSatisfied());
+ ASSERT_EQ(extension->id(),
+ background_page_ready_listener.extension_id_for_message());
+ }
+
+ // Ensure no load errors were reported.
+ EXPECT_TRUE(LoadErrorReporter::GetInstance()->GetErrors()->empty());
+ }
+
base::ScopedTempDir temp_dir_;
+
unsigned flags_ = ConfigFlag::kConfig_None;
- std::unique_ptr<ExtensionTestMessageListener> background_page_ready_listener_;
// Requests observed by the EmbeddedTestServer. This is accessed on both the
// UI and the EmbeddedTestServer's IO thread. Access is protected by
@@ -565,6 +679,11 @@ class DeclarativeNetRequestBrowserTest
base::Lock requests_to_server_lock_;
+ std::unique_ptr<RulesetManagerObserver> ruleset_manager_observer_;
+
+ // Path to the PEM file for the last installed packed extension.
+ base::FilePath last_pem_path_;
+
DISALLOW_COPY_AND_ASSIGN(DeclarativeNetRequestBrowserTest);
};
@@ -1081,8 +1200,6 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
"example.com", "/pages_with_script/page.html");
auto test_extension_enabled = [&](bool expected_enabled) {
- // Wait for any pending actions caused by extension state change.
- content::RunAllTasksUntilIdle();
EXPECT_EQ(expected_enabled,
ExtensionRegistry::Get(profile())->enabled_extensions().Contains(
extension_id));
@@ -1095,30 +1212,39 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
{
SCOPED_TRACE("Testing extension after load");
+ EXPECT_EQ(1u, extensions_with_rulesets_count());
test_extension_enabled(true);
}
{
SCOPED_TRACE("Testing DisableExtension");
DisableExtension(extension_id);
+ WaitForExtensionsWithRulesetsCount(0);
test_extension_enabled(false);
}
{
SCOPED_TRACE("Testing EnableExtension");
EnableExtension(extension_id);
+ WaitForExtensionsWithRulesetsCount(1);
test_extension_enabled(true);
}
{
SCOPED_TRACE("Testing ReloadExtension");
- ReloadExtension(extension_id);
+ // Don't use ExtensionBrowserTest::ReloadExtension since it waits for the
+ // extension to be loaded again. But we need to use our custom waiting logic
+ // below.
+ extension_service()->ReloadExtension(extension_id);
+ WaitForExtensionsWithRulesetsCount(0);
+ WaitForExtensionsWithRulesetsCount(1);
test_extension_enabled(true);
}
{
SCOPED_TRACE("Testing UninstallExtension");
UninstallExtension(extension_id);
+ WaitForExtensionsWithRulesetsCount(0);
test_extension_enabled(false);
}
}
@@ -1490,9 +1616,6 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
Browser* incognito_browser = CreateIncognitoBrowser();
auto test_enabled_in_incognito = [&](bool expected_enabled_in_incognito) {
- // Wait for any pending actions caused by extension state change.
- content::RunAllTasksUntilIdle();
-
EXPECT_EQ(expected_enabled_in_incognito,
util::IsIncognitoEnabled(extension_id, profile()));
@@ -1522,13 +1645,19 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
// Enable the extension in incognito mode.
SCOPED_TRACE("Testing extension after enabling it in incognito");
util::SetIsIncognitoEnabled(extension_id, profile(), true /*enabled*/);
+ // Toggling the incognito mode reloads the extension. Wait for it to reload.
+ WaitForExtensionsWithRulesetsCount(0);
+ WaitForExtensionsWithRulesetsCount(1);
test_enabled_in_incognito(true);
}
- // Disable the extension in incognito mode.
{
+ // Disable the extension in incognito mode.
SCOPED_TRACE("Testing extension after disabling it in incognito");
util::SetIsIncognitoEnabled(extension_id, profile(), false /*enabled*/);
+ // Toggling the incognito mode reloads the extension. Wait for it to reload.
+ WaitForExtensionsWithRulesetsCount(0);
+ WaitForExtensionsWithRulesetsCount(1);
test_enabled_in_incognito(false);
}
}
@@ -1597,13 +1726,83 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest_Packed,
"example.com", "/pages_with_script/page2.html")));
}
+// Tests than an extension can omit the "declarative_net_request" manifest key
+// but can still use dynamic rules.
+IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, ZeroRulesets) {
+ set_config_flags(ConfigFlag::kConfig_HasBackgroundScript |
+ ConfigFlag::kConfig_OmitDeclarativeNetRequestKey);
+
+ ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRulesets(
+ {} /* rulesets */, "extension_directory", {} /* hosts */));
+ const ExtensionId extension_id = last_loaded_extension_id();
+
+ const GURL url = embedded_test_server()->GetURL(
+ "example.com", "/pages_with_script/page.html");
+ EXPECT_FALSE(IsNavigationBlocked(url));
+
+ // Add dynamic rule to block main-frame requests to "page.html".
+ TestRule rule = CreateGenericRule();
+ rule.condition->url_filter = std::string("page.html");
+ rule.condition->resource_types = std::vector<std::string>({"main_frame"});
+ EXPECT_EQ(0u, extensions_with_rulesets_count());
+ ASSERT_NO_FATAL_FAILURE(AddDynamicRules(extension_id, {rule}));
+ WaitForExtensionsWithRulesetsCount(1);
+
+ EXPECT_TRUE(IsNavigationBlocked(url));
+
+ DisableExtension(extension_id);
+ WaitForExtensionsWithRulesetsCount(0);
+ EXPECT_FALSE(IsNavigationBlocked(url));
+
+ EnableExtension(extension_id);
+ WaitForExtensionsWithRulesetsCount(1);
+ EXPECT_TRUE(IsNavigationBlocked(url));
+}
+
+// Test an extension with multiple static rulesets.
+IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, MultipleRulesets) {
+ set_config_flags(ConfigFlag::kConfig_HasBackgroundScript);
+
+ const int kNumStaticRulesets = 4;
+ const char* kStaticFilterPrefix = "static";
+ std::vector<GURL> expected_blocked_urls;
+ std::vector<TestRulesetInfo> rulesets;
+ std::vector<GURL> expected_allowed_urls;
+ for (int i = 0; i < kNumStaticRulesets; ++i) {
+ std::vector<TestRule> rules;
+ std::string id = kStaticFilterPrefix + base::NumberToString(i);
+ rules.push_back(CreateMainFrameBlockRule(id));
+
+ // Enable even indexed rulesets by default.
+ bool enabled = i % 2 == 0;
+ if (enabled)
+ expected_blocked_urls.push_back(GetURLForFilter(id));
+ else
+ expected_allowed_urls.push_back(GetURLForFilter(id));
+
+ rulesets.emplace_back(id, *ToListValue(rules), enabled);
+ }
+
+ ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRulesets(
+ rulesets, "extension_directory", {} /* hosts */));
+ const ExtensionId extension_id = last_loaded_extension_id();
+
+ // Also add a dynamic rule blocking pages with string "dynamic".
+ const char* kDynamicFilter = "dynamic";
+ ASSERT_NO_FATAL_FAILURE(AddDynamicRules(
+ extension_id, {CreateMainFrameBlockRule(kDynamicFilter)}));
+ expected_blocked_urls.push_back(GetURLForFilter(kDynamicFilter));
+
+ expected_allowed_urls.push_back(GetURLForFilter("no_such_rule"));
+
+ VerifyNavigations(expected_blocked_urls, expected_allowed_urls);
+}
+
// Ensure that Blink's in-memory cache is cleared on adding/removing rulesets.
IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, RendererCacheCleared) {
- // Set-up an observer for RulesetMatcher to monitor requests to
- // script.js.
- URLRequestMonitor script_monitor(
- ruleset_manager(),
- embedded_test_server()->GetURL("example.com", "/cached/script.js"));
+ // Observe requests to RulesetManager to monitor requests to script.js.
+ GURL observed_url =
+ embedded_test_server()->GetURL("example.com", "/cached/script.js");
GURL url = embedded_test_server()->GetURL(
"example.com", "/cached/page_with_cacheable_script.html");
@@ -1618,7 +1817,9 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, RendererCacheCleared) {
bool expect_request_seen =
base::FeatureList::IsEnabled(
extensions_features::kForceWebRequestProxyForTest);
- EXPECT_EQ(expect_request_seen, script_monitor.GetAndResetRequestSeen(false));
+ EXPECT_EQ(expect_request_seen,
+ base::Contains(ruleset_manager_observer()->GetAndResetRequestSeen(),
+ observed_url));
// Another request to |url| should not cause a network request for
// script.js since it will be served by the renderer's in-memory
@@ -1626,7 +1827,8 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, RendererCacheCleared) {
ui_test_utils::NavigateToURL(browser(), url);
EXPECT_EQ(content::PAGE_TYPE_NORMAL, GetPageType());
EXPECT_TRUE(WasFrameWithScriptLoaded(GetMainFrame()));
- EXPECT_FALSE(script_monitor.GetAndResetRequestSeen(false));
+ EXPECT_FALSE(base::Contains(
+ ruleset_manager_observer()->GetAndResetRequestSeen(), observed_url));
// Now block requests to script.js.
TestRule rule = CreateGenericRule();
@@ -1639,12 +1841,12 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, RendererCacheCleared) {
ui_test_utils::NavigateToURL(browser(), url);
EXPECT_EQ(content::PAGE_TYPE_NORMAL, GetPageType());
EXPECT_FALSE(WasFrameWithScriptLoaded(GetMainFrame()));
- EXPECT_TRUE(script_monitor.GetAndResetRequestSeen(false));
+ EXPECT_TRUE(base::Contains(
+ ruleset_manager_observer()->GetAndResetRequestSeen(), observed_url));
- // Disable the extension and wait for the ruleset to be unloaded on the IO
- // thread.
+ // Disable the extension.
DisableExtension(last_loaded_extension_id());
- content::RunAllTasksUntilIdle();
+ WaitForExtensionsWithRulesetsCount(0);
// Disabling the extension should cause the request to succeed again. The
// request for the script will again be observed by the browser since it's not
@@ -1652,7 +1854,9 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, RendererCacheCleared) {
ui_test_utils::NavigateToURL(browser(), url);
EXPECT_EQ(content::PAGE_TYPE_NORMAL, GetPageType());
EXPECT_TRUE(WasFrameWithScriptLoaded(GetMainFrame()));
- EXPECT_EQ(expect_request_seen, script_monitor.GetAndResetRequestSeen(false));
+ EXPECT_EQ(expect_request_seen,
+ base::Contains(ruleset_manager_observer()->GetAndResetRequestSeen(),
+ observed_url));
}
// Tests that proxy requests aren't intercepted. See https://crbug.com/794674.
@@ -1828,10 +2032,6 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, IFrameCollapsed) {
// load for unpacked extensions, so corruption is not an issue.
IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest_Packed,
CorruptedIndexedRuleset) {
- // Set-up an observer for RulesetMatcher to monitor the number of extension
- // rulesets.
- RulesetCountWaiter ruleset_count_waiter(ruleset_manager());
-
set_config_flags(ConfigFlag::kConfig_HasBackgroundScript);
// Load an extension which blocks all main-frame requests to "google.com".
@@ -1839,7 +2039,6 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest_Packed,
rule.condition->url_filter = std::string("||google.com");
rule.condition->resource_types = std::vector<std::string>({"main_frame"});
ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules({rule}));
- ruleset_count_waiter.WaitForRulesetCount(1);
const ExtensionId extension_id = last_loaded_extension_id();
@@ -1854,13 +2053,12 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest_Packed,
const GURL unblocked_url = embedded_test_server()->GetURL(
"yahoo.com", "/pages_with_script/index.html");
- const Extension* extension = extension_registry()->GetExtensionById(
- extension_id, ExtensionRegistry::ENABLED);
+ const Extension* extension = last_loaded_extension();
std::vector<RulesetSource> static_sources =
RulesetSource::CreateStatic(*extension);
ASSERT_EQ(1u, static_sources.size());
RulesetSource dynamic_source =
- RulesetSource::CreateDynamic(profile(), *extension);
+ RulesetSource::CreateDynamic(profile(), extension->id());
// Loading the extension should cause some main frame requests to be blocked.
{
@@ -1876,18 +2074,17 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest_Packed,
[](const base::FilePath& indexed_path) {
base::ScopedAllowBlockingForTesting scoped_allow_blocking;
std::string corrupted_data = GetVersionHeaderForTesting() + "data";
- ASSERT_EQ(static_cast<int>(corrupted_data.size()),
- base::WriteFile(indexed_path, corrupted_data.c_str(),
- corrupted_data.size()));
+ ASSERT_TRUE(base::WriteFile(indexed_path, corrupted_data));
};
// Helper to reload the extension and ensure it is working.
auto test_extension_works_after_reload = [&]() {
+ EXPECT_EQ(1u, extensions_with_rulesets_count());
DisableExtension(extension_id);
- ruleset_count_waiter.WaitForRulesetCount(0);
+ WaitForExtensionsWithRulesetsCount(0);
EnableExtension(extension_id);
- ruleset_count_waiter.WaitForRulesetCount(1);
+ WaitForExtensionsWithRulesetsCount(1);
EXPECT_TRUE(IsNavigationBlocked(static_rule_url));
EXPECT_TRUE(IsNavigationBlocked(dynamic_rule_url));
@@ -1970,117 +2167,236 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest_Packed,
}
}
-// Tests that we surface a warning to the user if it's ruleset fails to load.
+// Tests that we surface a warning to the user if any of its ruleset fail to
+// load.
IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
WarningOnFailedRulesetLoad) {
- TestRule rule = CreateGenericRule();
- rule.condition->url_filter = std::string("*");
- ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules({rule}));
+ const size_t kNumStaticRulesets = 4;
+ const char* kStaticFilterPrefix = "static";
+ std::vector<TestRulesetInfo> rulesets;
+ std::vector<GURL> urls_for_indices;
+ for (size_t i = 0; i < kNumStaticRulesets; ++i) {
+ std::vector<TestRule> rules;
+ std::string id = kStaticFilterPrefix + base::NumberToString(i);
+ rules.push_back(CreateMainFrameBlockRule(id));
+
+ urls_for_indices.push_back(GetURLForFilter(id));
+
+ rulesets.emplace_back(id, *ToListValue(rules));
+ }
+
+ ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRulesets(
+ rulesets, "extension_directory", {} /* hosts */));
const ExtensionId extension_id = last_loaded_extension_id();
- const auto* rules_monitor_service =
- declarative_net_request::RulesMonitorService::Get(profile());
- EXPECT_TRUE(rules_monitor_service->HasRegisteredRuleset(extension_id));
+ EXPECT_TRUE(ruleset_manager()->GetMatcherForExtension(extension_id));
- const Extension* extension = extension_registry()->GetExtensionById(
- last_loaded_extension_id(), ExtensionRegistry::ENABLED);
+ const Extension* extension = last_loaded_extension();
ASSERT_TRUE(extension);
std::vector<RulesetSource> sources = RulesetSource::CreateStatic(*extension);
- ASSERT_EQ(1u, sources.size());
+ ASSERT_EQ(kNumStaticRulesets, sources.size());
// Mimic extension prefs corruption by overwriting the indexed ruleset
- // checksum.
+ // checksum for the first, third and fourth rulesets.
const int kInvalidRulesetChecksum = -1;
- ExtensionPrefs::Get(profile())->SetDNRStaticRulesetChecksum(
- extension_id, sources[0].id(), kInvalidRulesetChecksum);
+ std::vector<int> corrupted_ruleset_indices = {0, 2, 3};
+ std::vector<int> non_corrupted_ruleset_indices = {1};
+
+ for (int index : corrupted_ruleset_indices) {
+ ExtensionPrefs::Get(profile())->SetDNRStaticRulesetChecksum(
+ extension_id, sources[index].id(), kInvalidRulesetChecksum);
+ }
- TestExtensionRegistryObserver registry_observer(
- ExtensionRegistry::Get(profile()), extension_id);
DisableExtension(extension_id);
- ASSERT_TRUE(registry_observer.WaitForExtensionUnloaded());
- EXPECT_FALSE(rules_monitor_service->HasRegisteredRuleset(extension_id));
+ WaitForExtensionsWithRulesetsCount(0);
+ EXPECT_FALSE(ruleset_manager()->GetMatcherForExtension(extension_id));
- // Both loading the indexed ruleset and reindexing the ruleset should fail
- // now.
+ // Reindexing and loading corrupted rulesets should fail now. This should
+ // cause a warning.
base::HistogramTester tester;
WarningService* warning_service = WarningService::Get(profile());
WarningServiceObserver warning_observer(warning_service, extension_id);
EnableExtension(extension_id);
+ WaitForExtensionsWithRulesetsCount(1);
+ EXPECT_TRUE(ruleset_manager()->GetMatcherForExtension(extension_id));
// Wait till we surface a warning.
warning_observer.WaitForWarning();
EXPECT_THAT(warning_service->GetWarningTypesAffectingExtension(extension_id),
::testing::ElementsAre(Warning::kRulesetFailedToLoad));
- EXPECT_FALSE(rules_monitor_service->HasRegisteredRuleset(extension_id));
-
- // Verify that loading the ruleset failed due to checksum mismatch.
- EXPECT_EQ(1, tester.GetBucketCount(
- "Extensions.DeclarativeNetRequest.LoadRulesetResult",
- RulesetMatcher::LoadRulesetResult::
- kLoadErrorChecksumMismatch /*sample*/));
-
- // Verify that re-indexing the ruleset failed.
+ // Verify that loading the corrupted rulesets failed due to checksum mismatch.
+ // The non-corrupted rulesets should load fine.
+ tester.ExpectTotalCount("Extensions.DeclarativeNetRequest.LoadRulesetResult",
+ rulesets.size());
+ EXPECT_EQ(corrupted_ruleset_indices.size(),
+ static_cast<size_t>(tester.GetBucketCount(
+ "Extensions.DeclarativeNetRequest.LoadRulesetResult",
+ RulesetMatcher::LoadRulesetResult::
+ kLoadErrorChecksumMismatch /*sample*/)));
+ EXPECT_EQ(non_corrupted_ruleset_indices.size(),
+ static_cast<size_t>(tester.GetBucketCount(
+ "Extensions.DeclarativeNetRequest.LoadRulesetResult",
+ RulesetMatcher::LoadRulesetResult::kLoadSuccess /*sample*/)));
+
+ // Verify that re-indexing the corrupted rulesets failed.
tester.ExpectUniqueSample(
"Extensions.DeclarativeNetRequest.RulesetReindexSuccessful",
- false /*sample*/, 1 /*count*/);
+ false /*sample*/, corrupted_ruleset_indices.size() /*count*/);
+
+ // Finally verify that the non-corrupted rulesets still work fine, but others
+ // don't.
+ std::vector<GURL> expected_blocked_urls;
+ for (int index : non_corrupted_ruleset_indices)
+ expected_blocked_urls.push_back(urls_for_indices[index]);
+
+ std::vector<GURL> expected_allowed_urls;
+ for (int index : corrupted_ruleset_indices)
+ expected_allowed_urls.push_back(urls_for_indices[index]);
+
+ VerifyNavigations(expected_blocked_urls, expected_allowed_urls);
}
-// Tests that we reindex the extension ruleset in case its ruleset format
+// Tests that we reindex the extension rulesets in case its ruleset format
// version is not the same as one used by Chrome.
IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest_Packed,
ReindexOnRulesetVersionMismatch) {
set_config_flags(ConfigFlag::kConfig_HasBackgroundScript);
- // Set up an observer for RulesetMatcher to monitor the number of extension
- // rulesets.
- RulesetCountWaiter ruleset_count_waiter(ruleset_manager());
-
TestRule rule = CreateGenericRule();
rule.condition->url_filter = std::string("*");
- ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules({rule}));
- ruleset_count_waiter.WaitForRulesetCount(1);
+
+ const int kNumStaticRulesets = 4;
+ std::vector<TestRulesetInfo> rulesets;
+ for (int i = 0; i < kNumStaticRulesets; ++i)
+ rulesets.emplace_back(base::NumberToString(i), *ToListValue({rule}));
+
+ ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRulesets(
+ rulesets, "extension_directory", {} /* hosts */));
const ExtensionId extension_id = last_loaded_extension_id();
- const auto* rules_monitor_service =
- declarative_net_request::RulesMonitorService::Get(profile());
- EXPECT_TRUE(rules_monitor_service->HasRegisteredRuleset(extension_id));
+ EXPECT_TRUE(ruleset_manager()->GetMatcherForExtension(extension_id));
// Add a dynamic rule.
AddDynamicRules(extension_id, {rule});
DisableExtension(extension_id);
- ruleset_count_waiter.WaitForRulesetCount(0);
- EXPECT_FALSE(rules_monitor_service->HasRegisteredRuleset(extension_id));
+ WaitForExtensionsWithRulesetsCount(0);
+ EXPECT_FALSE(ruleset_manager()->GetMatcherForExtension(extension_id));
// Now change the current indexed ruleset format version. This should cause a
- // version mismatch when the extension is loaded again, but reindexing should
+ // version mismatch when the extension is loaded again, but re-indexing should
// still succeed.
- const int kIndexedRulesetFormatVersion = 100;
- std::string old_version_header = GetVersionHeaderForTesting();
- SetIndexedRulesetFormatVersionForTesting(kIndexedRulesetFormatVersion);
- ASSERT_NE(old_version_header, GetVersionHeaderForTesting());
+ ScopedIncrementRulesetVersion scoped_version_change =
+ CreateScopedIncrementRulesetVersionForTesting();
+
+ // Also override the checksum value for the indexed ruleset to simulate a
+ // flatbuffer schema change. This will ensure that the checksum of the
+ // re-indexed file differs from the current checksum.
+ const int kTestChecksum = 100;
+ OverrideGetChecksumForTest(kTestChecksum);
base::HistogramTester tester;
EnableExtension(extension_id);
- ruleset_count_waiter.WaitForRulesetCount(1);
- EXPECT_TRUE(rules_monitor_service->HasRegisteredRuleset(extension_id));
+ WaitForExtensionsWithRulesetsCount(1);
+ EXPECT_TRUE(ruleset_manager()->GetMatcherForExtension(extension_id));
+
+ // We add 1 to include the dynamic ruleset.
+ const int kNumRulesets = kNumStaticRulesets + 1;
// Verify that loading the static and dynamic rulesets would have failed
// initially due to version header mismatch and later succeeded.
- EXPECT_EQ(2, tester.GetBucketCount(
- "Extensions.DeclarativeNetRequest.LoadRulesetResult",
- RulesetMatcher::LoadRulesetResult::
- kLoadErrorVersionMismatch /*sample*/));
- EXPECT_EQ(2, tester.GetBucketCount(
- "Extensions.DeclarativeNetRequest.LoadRulesetResult",
- RulesetMatcher::LoadRulesetResult::kLoadSuccess /*sample*/));
+ EXPECT_EQ(kNumRulesets,
+ tester.GetBucketCount(
+ "Extensions.DeclarativeNetRequest.LoadRulesetResult",
+ RulesetMatcher::LoadRulesetResult::
+ kLoadErrorVersionMismatch /*sample*/));
+ EXPECT_EQ(kNumRulesets,
+ tester.GetBucketCount(
+ "Extensions.DeclarativeNetRequest.LoadRulesetResult",
+ RulesetMatcher::LoadRulesetResult::kLoadSuccess /*sample*/));
+
+ // Verify that reindexing succeeded.
+ tester.ExpectUniqueSample(
+ "Extensions.DeclarativeNetRequest.RulesetReindexSuccessful",
+ true /*sample*/, kNumRulesets /*count*/);
+
+ // Ensure that the new checksum was correctly persisted in prefs.
+ const ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
+ const Extension* extension = last_loaded_extension();
+ std::vector<RulesetSource> static_sources =
+ RulesetSource::CreateStatic(*extension);
+ ASSERT_EQ(static_cast<size_t>(kNumStaticRulesets), static_sources.size());
+
+ int checksum = kTestChecksum + 1;
+ for (const RulesetSource& source : static_sources) {
+ EXPECT_TRUE(prefs->GetDNRStaticRulesetChecksum(extension_id, source.id(),
+ &checksum));
+ EXPECT_EQ(kTestChecksum, checksum);
+
+ // Reset checksum for the next test.
+ checksum = kTestChecksum + 1;
+ }
+
+ EXPECT_TRUE(prefs->GetDNRDynamicRulesetChecksum(extension_id, &checksum));
+ EXPECT_EQ(kTestChecksum, checksum);
+}
+
+// Tests that static ruleset preferences are deleted on uninstall for an edge
+// case where ruleset loading is completed after extension uninstallation.
+// Regression test for crbug.com/1067441.
+IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
+ RulesetPrefsDeletedOnUninstall) {
+ ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules({} /* rules */));
+
+ const ExtensionId extension_id = last_loaded_extension_id();
+ const Extension* extension = last_loaded_extension();
+
+ std::vector<RulesetSource> static_sources =
+ RulesetSource::CreateStatic(*extension);
+ ASSERT_EQ(1u, static_sources.size());
+
+ DisableExtension(extension_id);
+ WaitForExtensionsWithRulesetsCount(0);
+
+ const ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
+ int checksum = -1;
+ EXPECT_TRUE(prefs->GetDNRStaticRulesetChecksum(
+ extension_id, static_sources[0].id(), &checksum));
+
+ // Now change the current indexed ruleset format version. This should cause a
+ // version mismatch when the extension is loaded again, but re-indexing should
+ // still succeed.
+ ScopedIncrementRulesetVersion scoped_version_change =
+ CreateScopedIncrementRulesetVersionForTesting();
+
+ // Also override the checksum value for the indexed ruleset to simulate a
+ // flatbuffer schema change. This will ensure that the checksum of the
+ // re-indexed file differs from the current checksum.
+ const int kTestChecksum = checksum + 1;
+ OverrideGetChecksumForTest(kTestChecksum);
+
+ base::HistogramTester tester;
+ RulesetLoadObserver load_observer(rules_monitor_service(), extension_id);
+
+ // Now enable the extension, causing the asynchronous extension ruleset load
+ // which further results in an asynchronous re-indexing task. Immediately
+ // uninstall the extension to ensure that the uninstallation precedes
+ // completion of ruleset load.
+ EnableExtension(extension_id);
+ UninstallExtension(extension_id);
+
+ load_observer.Wait();
// Verify that reindexing succeeded.
tester.ExpectUniqueSample(
"Extensions.DeclarativeNetRequest.RulesetReindexSuccessful",
- true /*sample*/, 2 /*count*/);
+ true /*sample*/, 1 /*count*/);
+
+ // Verify that the prefs for the static ruleset were deleted successfully.
+ EXPECT_FALSE(prefs->GetDNRStaticRulesetChecksum(
+ extension_id, static_sources[0].id(), &checksum));
}
// Tests that redirecting requests using the declarativeNetRequest API works
@@ -2104,8 +2420,7 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules(
{rule}, "extension" /* directory */, host_permissions));
- const Extension* extension = extension_registry()->GetExtensionById(
- last_loaded_extension_id(), ExtensionRegistry::ENABLED);
+ const Extension* extension = last_loaded_extension();
ASSERT_TRUE(extension);
auto verify_script_redirected = [this, extension](
@@ -2230,8 +2545,7 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules(
{rule}, "test_extension", {URLPattern::kAllUrlsPattern}));
- const Extension* extension = extension_registry()->GetExtensionById(
- last_loaded_extension_id(), ExtensionRegistry::ENABLED);
+ const Extension* extension = last_loaded_extension();
ASSERT_TRUE(extension);
EXPECT_TRUE(extension->permissions_data()->HasEffectiveAccessToAllHosts());
@@ -2331,61 +2645,6 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, DynamicRules) {
EXPECT_TRUE(IsNavigationBlocked(yahoo_url));
}
-// Tests removal of the 'Referer' request header.
-IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
- BlockRefererRequestHeader) {
- auto test_referrer_blocked = [this](bool expected_referrer_blocked) {
- const GURL initial_url =
- embedded_test_server()->GetURL("example.com", "/simulate_click.html");
- const GURL url_with_referrer =
- embedded_test_server()->GetURL("example.com", "/echoheader?referer");
- content::TestNavigationObserver observer(web_contents(),
- 2 /* number_of_navigations */);
- observer.set_wait_event(
- content::TestNavigationObserver::WaitEvent::kNavigationFinished);
- ui_test_utils::NavigateToURL(browser(), initial_url);
- observer.WaitForNavigationFinished();
- ASSERT_EQ(url_with_referrer, observer.last_navigation_url());
-
- std::string expected_referrer =
- expected_referrer_blocked ? "None" : initial_url.spec();
- EXPECT_EQ(expected_referrer, GetPageBody());
- };
-
- test_referrer_blocked(false);
-
- // Load an extension which blocks the Referer header for requests to
- // "example.com".
- TestRule rule = CreateGenericRule();
- rule.condition->url_filter = std::string("||example.com");
- rule.condition->resource_types = std::vector<std::string>({"main_frame"});
- rule.action->type = std::string("removeHeaders");
- rule.action->remove_headers_list = std::vector<std::string>({"referer"});
-
- // Set up an observer for RulesetMatcher to monitor the number of extension
- // rulesets.
- RulesetCountWaiter ruleset_count_waiter(ruleset_manager());
-
- EXPECT_FALSE(
- ExtensionWebRequestEventRouter::GetInstance()->HasAnyExtraHeadersListener(
- profile()));
- ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules({rule}));
- ruleset_count_waiter.WaitForRulesetCount(1);
- content::RunAllTasksUntilIdle();
- EXPECT_TRUE(
- ExtensionWebRequestEventRouter::GetInstance()->HasAnyExtraHeadersListener(
- profile()));
- test_referrer_blocked(true);
-
- DisableExtension(last_loaded_extension_id());
- ruleset_count_waiter.WaitForRulesetCount(0);
- content::RunAllTasksUntilIdle();
- EXPECT_FALSE(
- ExtensionWebRequestEventRouter::GetInstance()->HasAnyExtraHeadersListener(
- profile()));
- test_referrer_blocked(false);
-}
-
// Tests rules using the Redirect dictionary.
IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, Redirect) {
TestRule rule1 = CreateGenericRule();
@@ -2503,14 +2762,11 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
int priority;
std::string action_type;
base::Optional<std::string> redirect_url;
- base::Optional<std::vector<std::string>> remove_headers_list;
} rules_data[] = {
- {"abc.com", 1, 1, "block", base::nullopt, base::nullopt},
- {"def.com", 2, 1, "redirect", "http://zzz.com", base::nullopt},
- {"jkl.com", 3, 1, "removeHeaders", base::nullopt,
- std::vector<std::string>({"referer"})},
- {"abcd.com", 4, 1, "block", base::nullopt, base::nullopt},
- {"abcd", 5, 1, "allow", base::nullopt, base::nullopt},
+ {"abc.com", 1, 1, "block", base::nullopt},
+ {"def.com", 2, 1, "redirect", "http://zzz.com"},
+ {"abcd.com", 4, 1, "block", base::nullopt},
+ {"abcd", 5, 1, "allow", base::nullopt},
};
// Load the extension.
@@ -2525,7 +2781,6 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
rule.action->type = rule_data.action_type;
rule.action->redirect.emplace();
rule.action->redirect->url = rule_data.redirect_url;
- rule.action->remove_headers_list = rule_data.remove_headers_list;
rules.push_back(rule);
}
@@ -2533,8 +2788,7 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
rules, "test_extension", {URLPattern::kAllUrlsPattern}));
const ExtensionId& extension_id = last_loaded_extension_id();
- const Extension* dnr_extension = extension_registry()->GetExtensionById(
- extension_id, extensions::ExtensionRegistry::ENABLED);
+ const Extension* dnr_extension = last_loaded_extension();
ExtensionPrefs::Get(profile())->SetDNRUseActionCountAsBadgeText(extension_id,
true);
@@ -2556,16 +2810,10 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
// def.com is redirected by a matching rule and should increment the badge
// text.
{"def.com", "2", false},
- // jkl.com matches with a removeHeaders rule, but has no headers.
- // Therefore no action is taken and the badge text stays the same.
- {"jkl.com", "2", false},
- // jkl.com matches with a removeHeaders rule and has a referrer header.
- // Therefore the badge text should be incremented.
- {"jkl.com", "3", true},
// abcd.com matches both a block rule and an allow rule. Since the allow
// rule overrides the block rule, no action is taken and the badge text
// stays the same,
- {"abcd.com", "3", false},
+ {"abcd.com", "2", false},
};
ui_test_utils::NavigateToURL(browser(), page_url);
@@ -2603,13 +2851,19 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
// Verify that the badge text for the first tab is unaffected.
EXPECT_EQ(first_tab_badge_text, action->GetDisplayBadgeText(first_tab_id));
- // Verify that the correct rules are returned via getMatchedRules.
- auto get_matched_rule_ids = [this](int tab_id) {
+ // Verify that the correct rules are returned via getMatchedRules. Returns "|"
+ // separated pairs of <rule_id>,<ruleset_id>, sorted by rule ids, e.g.
+ // "ruleId1,rulesetId1|ruleId2,rulesetId2".
+ auto get_matched_rules = [this](int tab_id) {
const char kGetMatchedRulesScript[] = R"(
- chrome.declarativeNetRequest.getMatchedRules({tabId: %d}, (rules) => {
- var ruleIds =
- rules.rulesMatchedInfo.map(rule => rule.rule.ruleId).sort();
- window.domAutomationController.send(ruleIds.join());
+ chrome.declarativeNetRequest.getMatchedRules({tabId: %d}, (matches) => {
+ // Sort by |ruleId|.
+ matches.rulesMatchedInfo.sort((a, b) => a.rule.ruleId - b.rule.ruleId);
+
+ var ruleAndRulesetIDs = matches.rulesMatchedInfo.map(
+ match => [match.rule.ruleId, match.rule.rulesetId].join());
+
+ window.domAutomationController.send(ruleAndRulesetIDs.join('|'));
});
)";
@@ -2625,12 +2879,13 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
// Four rules should be matched on the tab with |first_tab_id|:
// - the block rule for abc.com (ruleId = 1)
// - the redirect rule for def.com (ruleId = 2)
- // - the removeHeaders rule for jkl.com (ruleId = 3)
// - the allow rule for abcd.com (ruleId = 5)
- EXPECT_EQ("1,2,3,5", get_matched_rule_ids(first_tab_id));
+ EXPECT_EQ(base::StringPrintf("1,%s|2,%s|5,%s", kDefaultRulesetID,
+ kDefaultRulesetID, kDefaultRulesetID),
+ get_matched_rules(first_tab_id));
// No rule should be matched on the tab with |second_tab_id|.
- EXPECT_EQ("", get_matched_rule_ids(second_tab_id));
+ EXPECT_EQ("", get_matched_rules(second_tab_id));
}
// Ensure web request events are still dispatched even if DNR blocks/redirects
@@ -2768,8 +3023,7 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
{rules}, "test_extension", {URLPattern::kAllUrlsPattern}));
const ExtensionId& extension_id = last_loaded_extension_id();
- const Extension* dnr_extension = extension_registry()->GetExtensionById(
- extension_id, extensions::ExtensionRegistry::ENABLED);
+ const Extension* dnr_extension = last_loaded_extension();
ExtensionAction* action =
ExtensionActionManager::Get(web_contents()->GetBrowserContext())
@@ -2838,8 +3092,7 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
{rules}, "test_extension", {URLPattern::kAllUrlsPattern}));
const ExtensionId& extension_id = last_loaded_extension_id();
- const Extension* dnr_extension = extension_registry()->GetExtensionById(
- extension_id, extensions::ExtensionRegistry::ENABLED);
+ const Extension* dnr_extension = last_loaded_extension();
ExtensionAction* extension_action =
ExtensionActionManager::Get(web_contents()->GetBrowserContext())
@@ -2909,8 +3162,7 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
content::WebContents* incognito_contents =
incognito_browser->tab_strip_model()->GetActiveWebContents();
- const Extension* dnr_extension = extension_registry()->GetExtensionById(
- extension_id, extensions::ExtensionRegistry::ENABLED);
+ const Extension* dnr_extension = last_loaded_extension();
ExtensionAction* incognito_action =
ExtensionActionManager::Get(incognito_contents->GetBrowserContext())
->GetExtensionAction(*dnr_extension);
@@ -2928,10 +3180,6 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
"/pages_with_script/index.html");
};
- auto get_set_cookie_url = [this](std::string hostname) {
- return embedded_test_server()->GetURL(hostname, "/set-cookie?a=b");
- };
-
struct {
std::string url_filter;
int id;
@@ -2939,23 +3187,16 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
std::string action_type;
std::vector<std::string> resource_types;
base::Optional<std::string> redirect_url;
- base::Optional<std::vector<std::string>> remove_headers_list;
} rules_data[] = {
{"abc.com", 1, 1, "block", std::vector<std::string>({"script"}),
- base::nullopt, base::nullopt},
+ base::nullopt},
{"||def.com", 2, 1, "redirect", std::vector<std::string>({"main_frame"}),
- get_url_for_host("abc.com").spec(), base::nullopt},
+ get_url_for_host("abc.com").spec()},
{"gotodef.com", 3, 1, "redirect",
std::vector<std::string>({"main_frame"}),
- get_url_for_host("def.com").spec(), base::nullopt},
+ get_url_for_host("def.com").spec()},
{"ghi.com", 4, 1, "block", std::vector<std::string>({"main_frame"}),
- base::nullopt, base::nullopt},
- {"gotosetcookie.com", 5, 1, "redirect",
- std::vector<std::string>({"main_frame"}),
- get_set_cookie_url("setcookie.com").spec(), base::nullopt},
- {"setcookie.com", 6, 1, "removeHeaders",
- std::vector<std::string>({"main_frame"}), base::nullopt,
- std::vector<std::string>({"setCookie"})},
+ base::nullopt},
};
// Load the extension.
@@ -2969,15 +3210,13 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
rule.action->type = rule_data.action_type;
rule.action->redirect.emplace();
rule.action->redirect->url = rule_data.redirect_url;
- rule.action->remove_headers_list = rule_data.remove_headers_list;
rules.push_back(rule);
}
ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules(
rules, "test_extension", {URLPattern::kAllUrlsPattern}));
- const Extension* dnr_extension = extension_registry()->GetExtensionById(
- last_loaded_extension_id(), extensions::ExtensionRegistry::ENABLED);
+ const Extension* dnr_extension = last_loaded_extension();
ExtensionPrefs::Get(profile())->SetDNRUseActionCountAsBadgeText(
last_loaded_extension_id(), true);
@@ -3006,10 +3245,6 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
// gotodef.com to def.com caused by a rule match. Therefore the badge text
// should be 3.
{"gotodef.com", "3"},
- // The request to gotosetcookie.com will match with a rule and redirect to
- // setcookie.com. The Set-Cookie header on setcookie.com will also match
- // with a rule and get removed. Therefore the badge text should be 2.
- {"gotosetcookie.com", "2"},
};
int first_tab_id = ExtensionTabUtil::GetTabId(web_contents());
@@ -3023,125 +3258,6 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
}
}
-// Test that the badge text for extensions will update correctly for
-// removeHeader rules.
-IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
- RemoveHeadersBadgeText) {
- auto get_referer_url = [this](std::string host) {
- return embedded_test_server()->GetURL(host, "/set-header?referer: none");
- };
- auto get_set_cookie_url = [this](std::string host) {
- return embedded_test_server()->GetURL(host, "/set-cookie?a=b");
- };
-
- auto create_remove_headers_rule =
- [](int id, const std::string& url_filter,
- const std::vector<std::string>& remove_headers_list) {
- TestRule rule = CreateGenericRule();
- rule.id = id;
- rule.condition->url_filter = url_filter;
- rule.condition->resource_types =
- std::vector<std::string>({"sub_frame"});
- rule.action->type = "removeHeaders";
- rule.action->remove_headers_list = remove_headers_list;
-
- return rule;
- };
-
- const std::string kFrameName1 = "frame1";
- const GURL page_url = embedded_test_server()->GetURL(
- "nomatch.com", "/page_with_two_frames.html");
-
- // Create an extension with rules and get the ExtensionAction for it.
- TestRule example_set_cookie_rule =
- create_remove_headers_rule(kMinValidID, "example.com", {"setCookie"});
-
- TestRule both_headers_rule = create_remove_headers_rule(
- kMinValidID + 1, "google.com", {"referer", "setCookie"});
-
- TestRule abc_set_cookie_rule =
- create_remove_headers_rule(kMinValidID + 2, "abc.com", {"setCookie"});
-
- TestRule abc_referer_rule =
- create_remove_headers_rule(kMinValidID + 3, "abc.com", {"referer"});
-
- ASSERT_NO_FATAL_FAILURE(
- LoadExtensionWithRules({example_set_cookie_rule, both_headers_rule,
- abc_set_cookie_rule, abc_referer_rule},
- "extension_1", {}));
-
- const ExtensionId extension_1_id = last_loaded_extension_id();
- ExtensionPrefs::Get(profile())->SetDNRUseActionCountAsBadgeText(
- extension_1_id, true);
-
- ExtensionAction* extension_1_action =
- ExtensionActionManager::Get(web_contents()->GetBrowserContext())
- ->GetExtensionAction(*extension_registry()->GetExtensionById(
- extension_1_id, extensions::ExtensionRegistry::ENABLED));
-
- // Create another extension which removes the referer header from example.com
- // and get the ExtensionAction for it.
- TestRule example_referer_rule =
- create_remove_headers_rule(kMinValidID, "example.com", {"referer"});
-
- ASSERT_NO_FATAL_FAILURE(
- LoadExtensionWithRules({example_referer_rule}, "extension_2", {}));
-
- const ExtensionId extension_2_id = last_loaded_extension_id();
- ExtensionPrefs::Get(profile())->SetDNRUseActionCountAsBadgeText(
- extension_2_id, true);
-
- ExtensionAction* extension_2_action =
- ExtensionActionManager::Get(web_contents()->GetBrowserContext())
- ->GetExtensionAction(*extension_registry()->GetExtensionById(
- extension_2_id, extensions::ExtensionRegistry::ENABLED));
-
- struct {
- GURL url;
- bool use_referrer;
- std::string expected_ext_1_badge_text;
- std::string expected_ext_2_badge_text;
- } test_cases[] = {
- // This request only has a Set-Cookie header. Only the badge text for the
- // extension with a remove Set-Cookie header rule should be incremented.
- {get_set_cookie_url("example.com"), false, "1", ""},
- // This request only has a Referer header. Only the badge text for the
- // extension with a remove Referer header rule should be incremented.
- {get_referer_url("example.com"), true, "1", "1"},
- // This request has both a Referer and a Set-Cookie header. The badge text
- // for both extensions should be incremented.
- {get_set_cookie_url("example.com"), true, "2", "2"},
- // This request with a Referer and Set-Cookie header matches with one rule
- // from |extension_1| and so the action count for |extension_1| should
- // only increment by one,
- {get_set_cookie_url("google.com"), true, "3", "2"},
- // This request with a Referer and Set-Cookie header matches with two
- // separate rules from |extension_1| and so the action count for
- // |extension_1| should increment by two.
- {get_set_cookie_url("abc.com"), true, "5", "2"},
- };
-
- ui_test_utils::NavigateToURL(browser(), page_url);
- ASSERT_TRUE(WasFrameWithScriptLoaded(GetMainFrame()));
-
- int first_tab_id = ExtensionTabUtil::GetTabId(web_contents());
- EXPECT_EQ("", extension_1_action->GetDisplayBadgeText(first_tab_id));
- EXPECT_EQ("", extension_2_action->GetDisplayBadgeText(first_tab_id));
-
- for (const auto& test_case : test_cases) {
- SCOPED_TRACE(base::StringPrintf("Testing URL: %s, using referrer: %s",
- test_case.url.spec().c_str(),
- test_case.use_referrer ? "true" : "false"));
-
- NavigateFrame(kFrameName1, test_case.url, test_case.use_referrer);
- EXPECT_EQ(test_case.expected_ext_1_badge_text,
- extension_1_action->GetDisplayBadgeText(first_tab_id));
-
- EXPECT_EQ(test_case.expected_ext_2_badge_text,
- extension_2_action->GetDisplayBadgeText(first_tab_id));
- }
-}
-
// Test that the onRuleMatchedDebug event is only available for unpacked
// extensions.
IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
@@ -3170,89 +3286,6 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
ASSERT_EQ(expected_event_availability, actual_event_availability);
}
-// Test that the onRuleMatchedDebug event returns the correct number of matched
-// rules for a request which is matched with multiple rules.
-IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest_Unpacked,
- OnRuleMatchedDebugMultipleRules) {
- // This is only tested for unpacked extensions since the onRuleMatchedDebug
- // event is only available for unpacked extensions.
- ASSERT_EQ(ExtensionLoadType::UNPACKED, GetParam());
-
- // Load the extension with a background script so scripts can be run from its
- // generated background page. Also grant the feedback permission for the
- // extension so it has access to the onRuleMatchedDebug event.
- set_config_flags(ConfigFlag::kConfig_HasBackgroundScript |
- ConfigFlag::kConfig_HasFeedbackPermission);
-
- auto create_remove_headers_rule =
- [](int id, const std::string& url_filter,
- const std::vector<std::string>& remove_headers_list) {
- TestRule rule = CreateGenericRule();
- rule.id = id;
- rule.condition->url_filter = url_filter;
- rule.condition->resource_types =
- std::vector<std::string>({"sub_frame"});
- rule.action->type = "removeHeaders";
- rule.action->remove_headers_list = remove_headers_list;
-
- return rule;
- };
-
- const std::string kFrameName1 = "frame1";
- const std::string sub_frame_host = "abc.com";
- const GURL page_url = embedded_test_server()->GetURL(
- "nomatch.com", "/page_with_two_frames.html");
-
- TestRule abc_referer_rule =
- create_remove_headers_rule(kMinValidID, sub_frame_host, {"referer"});
-
- TestRule abc_set_cookie_rule = create_remove_headers_rule(
- kMinValidID + 1, sub_frame_host, {"setCookie"});
-
- // Load an extension with removeHeaders rules for the Referer and Set-Cookie
- // headers.
- ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules(
- {abc_set_cookie_rule, abc_referer_rule}, "extension_1", {}));
-
- ui_test_utils::NavigateToURL(browser(), page_url);
- ASSERT_TRUE(WasFrameWithScriptLoaded(GetMainFrame()));
-
- // Start the onRuleMatchedDebug observer.
- const char kOnRuleMatchedDebugScript[] = R"(
- var matchedRules = [];
- var onRuleMatchedDebugCallback = (rule) => {
- matchedRules.push(rule);
- };
-
- chrome.declarativeNetRequest.onRuleMatchedDebug.addListener(
- onRuleMatchedDebugCallback);
- window.domAutomationController.send('ready');
- )";
-
- ASSERT_EQ("ready", ExecuteScriptInBackgroundPage(last_loaded_extension_id(),
- kOnRuleMatchedDebugScript));
-
- auto set_cookie_and_referer_url =
- embedded_test_server()->GetURL(sub_frame_host, "/set-cookie?a=b");
-
- NavigateFrame(kFrameName1, set_cookie_and_referer_url);
-
- // Now query the onRuleMatchedDebug results.
- const char kQueryMatchedRulesScript[] = R"(
- chrome.declarativeNetRequest.onRuleMatchedDebug.removeListener(
- onRuleMatchedDebugCallback);
- var ruleIds = matchedRules.map(matchedRule => matchedRule.rule.ruleId);
- window.domAutomationController.send(ruleIds.sort().join());
- )";
-
- std::string matched_rule_ids = ExecuteScriptInBackgroundPage(
- last_loaded_extension_id(), kQueryMatchedRulesScript);
-
- // The request to |set_cookie_and_referer_url| should be matched with the
- // Referer rule (ruleId 1) and the Set-Cookie rule (ruleId 2).
- EXPECT_EQ("1,2", matched_rule_ids);
-}
-
// Test that getMatchedRules returns the correct rules when called by different
// extensions with rules matched by requests initiated from different tabs.
IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
@@ -3471,9 +3504,7 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
base::SimpleTestClock clock_;
clock_.SetNow(start_time);
- auto* rules_monitor_service =
- declarative_net_request::RulesMonitorService::Get(profile());
- rules_monitor_service->action_tracker().SetClockForTests(&clock_);
+ rules_monitor_service()->action_tracker().SetClockForTests(&clock_);
// Load the extension with a background script so scripts can be run from its
// generated background page. Also grant the feedback permission for the
@@ -3556,7 +3587,7 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
rule_count = GetMatchedRuleCount(extension_id, first_tab_id, timestamp_2);
EXPECT_EQ("0", rule_count);
- rules_monitor_service->action_tracker().SetClockForTests(nullptr);
+ rules_monitor_service()->action_tracker().SetClockForTests(nullptr);
}
// Test that getMatchedRules will only return matched rules for individual tabs
@@ -3606,8 +3637,7 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
tab_helper->active_tab_permission_granter();
ASSERT_TRUE(active_tab_granter);
- const Extension* dnr_extension = extension_registry()->GetExtensionById(
- extension_id, extensions::ExtensionRegistry::ENABLED);
+ const Extension* dnr_extension = last_loaded_extension();
// Grant the activeTab permission for the second tab.
active_tab_granter->GrantIfRequested(dnr_extension);
@@ -3679,6 +3709,166 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
EXPECT_EQ("0", get_matched_rules_count(true));
}
+// Tests extension update for an extension using declarativeNetRequest.
+IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest_Packed,
+ ExtensionRemovesOneRulesetOnUpdate) {
+ auto create_single_rule_ruleset = [this](
+ const std::string& ruleset_id_and_path,
+ bool enabled,
+ const std::string& filter) {
+ std::vector<TestRule> rules = {CreateMainFrameBlockRule(filter)};
+ return TestRulesetInfo(ruleset_id_and_path, *ToListValue(rules), enabled);
+ };
+
+ set_config_flags(ConfigFlag::kConfig_HasBackgroundScript);
+
+ std::vector<TestRulesetInfo> rulesets = {
+ create_single_rule_ruleset("id1", true, "google"),
+ create_single_rule_ruleset("id2", false, "yahoo"),
+ create_single_rule_ruleset("id3", true, "example"),
+ };
+
+ constexpr char kDirectory1[] = "dir1";
+ ASSERT_NO_FATAL_FAILURE(
+ LoadExtensionWithRulesets(rulesets, kDirectory1, {} /* hosts */));
+ const ExtensionId extension_id = last_loaded_extension_id();
+ const Extension* extension = last_loaded_extension();
+
+ // Also add a dynamic rule.
+ ASSERT_NO_FATAL_FAILURE(
+ AddDynamicRules(extension_id, {CreateMainFrameBlockRule("dynamic")}));
+
+ // Also update the set of enabled static rulesets.
+ ASSERT_NO_FATAL_FAILURE(
+ UpdateEnabledRulesets(extension_id, {"id1"}, {"id2", "id3"}));
+
+ CompositeMatcher* composite_matcher =
+ ruleset_manager()->GetMatcherForExtension(extension_id);
+ ASSERT_TRUE(composite_matcher);
+ EXPECT_THAT(GetPublicRulesetIDs(*extension, *composite_matcher),
+ UnorderedElementsAre("id2", "id3", dnr_api::DYNAMIC_RULESET_ID));
+
+ // Also sanity check the extension prefs entry for the rulesets.
+ ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
+ ASSERT_TRUE(prefs);
+ int checksum = -1;
+ int dynamic_checksum_1 = -1;
+ EXPECT_TRUE(prefs->GetDNRStaticRulesetChecksum(
+ extension_id, kMinValidStaticRulesetID, &checksum));
+ EXPECT_TRUE(prefs->GetDNRStaticRulesetChecksum(
+ extension_id, RulesetID(kMinValidStaticRulesetID.value() + 1),
+ &checksum));
+ EXPECT_TRUE(prefs->GetDNRStaticRulesetChecksum(
+ extension_id, RulesetID(kMinValidStaticRulesetID.value() + 2),
+ &checksum));
+ EXPECT_FALSE(prefs->GetDNRStaticRulesetChecksum(
+ extension_id, RulesetID(kMinValidStaticRulesetID.value() + 3),
+ &checksum));
+ EXPECT_TRUE(
+ prefs->GetDNRDynamicRulesetChecksum(extension_id, &dynamic_checksum_1));
+ base::Optional<std::set<RulesetID>> enabled_static_rulesets =
+ prefs->GetDNREnabledStaticRulesets(extension_id);
+ ASSERT_TRUE(enabled_static_rulesets);
+ EXPECT_THAT(
+ *enabled_static_rulesets,
+ UnorderedElementsAre(RulesetID(kMinValidStaticRulesetID.value() + 1),
+ RulesetID(kMinValidStaticRulesetID.value() + 2)));
+
+ std::vector<TestRulesetInfo> new_rulesets = {
+ create_single_rule_ruleset("id1", true, "yahoo"),
+ create_single_rule_ruleset("new_id2", false, "msn")};
+
+ const char* kDirectory2 = "dir2";
+ ASSERT_NO_FATAL_FAILURE(
+ UpdateLastLoadedExtension(new_rulesets, kDirectory2, {} /* hosts */,
+ 0 /* expected_extension_ruleset_count_change */,
+ true /* has_dynamic_ruleset */));
+ extension = extension_registry()->GetExtensionById(
+ extension_id, extensions::ExtensionRegistry::ENABLED);
+
+ composite_matcher = ruleset_manager()->GetMatcherForExtension(extension_id);
+ ASSERT_TRUE(composite_matcher);
+
+ EXPECT_THAT(GetPublicRulesetIDs(*extension, *composite_matcher),
+ UnorderedElementsAre("id1", dnr_api::DYNAMIC_RULESET_ID));
+
+ int dynamic_checksum_2;
+ EXPECT_TRUE(prefs->GetDNRStaticRulesetChecksum(
+ extension_id, kMinValidStaticRulesetID, &checksum));
+ EXPECT_TRUE(prefs->GetDNRStaticRulesetChecksum(
+ extension_id, RulesetID(kMinValidStaticRulesetID.value() + 1),
+ &checksum));
+ EXPECT_FALSE(prefs->GetDNRStaticRulesetChecksum(
+ extension_id, RulesetID(kMinValidStaticRulesetID.value() + 2),
+ &checksum));
+ EXPECT_TRUE(
+ prefs->GetDNRDynamicRulesetChecksum(extension_id, &dynamic_checksum_2));
+ EXPECT_EQ(dynamic_checksum_2, dynamic_checksum_1);
+
+ // Ensure the preference for enabled static rulesets is cleared on extension
+ // update.
+ EXPECT_FALSE(prefs->GetDNREnabledStaticRulesets(extension_id));
+}
+
+// Tests extension update for an extension using declarativeNetRequest.
+IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest_Packed,
+ ExtensionRemovesAllRulesetsOnUpdate) {
+ auto create_single_rule_ruleset = [this](
+ const std::string& ruleset_id_and_path,
+ bool enabled,
+ const std::string& filter) {
+ std::vector<TestRule> rules = {CreateMainFrameBlockRule(filter)};
+ return TestRulesetInfo(ruleset_id_and_path, *ToListValue(rules), enabled);
+ };
+
+ std::vector<TestRulesetInfo> rulesets = {
+ create_single_rule_ruleset("id1", true, "google"),
+ create_single_rule_ruleset("id2", true, "example")};
+
+ const char* kDirectory1 = "dir1";
+ ASSERT_NO_FATAL_FAILURE(
+ LoadExtensionWithRulesets(rulesets, kDirectory1, {} /* hosts */));
+ const ExtensionId extension_id = last_loaded_extension_id();
+ const Extension* extension = last_loaded_extension();
+
+ CompositeMatcher* composite_matcher =
+ ruleset_manager()->GetMatcherForExtension(extension_id);
+ ASSERT_TRUE(composite_matcher);
+
+ EXPECT_THAT(GetPublicRulesetIDs(*extension, *composite_matcher),
+ UnorderedElementsAre("id1", "id2"));
+
+ // Also sanity check the extension prefs entry for the rulesets.
+ ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
+ ASSERT_TRUE(prefs);
+ int checksum = -1;
+ EXPECT_TRUE(prefs->GetDNRStaticRulesetChecksum(
+ extension_id, kMinValidStaticRulesetID, &checksum));
+ EXPECT_TRUE(prefs->GetDNRStaticRulesetChecksum(
+ extension_id, RulesetID(kMinValidStaticRulesetID.value() + 1),
+ &checksum));
+ EXPECT_FALSE(prefs->GetDNRDynamicRulesetChecksum(extension_id, &checksum));
+
+ const char* kDirectory2 = "dir2";
+ ASSERT_NO_FATAL_FAILURE(UpdateLastLoadedExtension(
+ {} /* new_rulesets */, kDirectory2, {} /* hosts */,
+ -1 /* expected_extension_ruleset_count_change */,
+ false /* has_dynamic_ruleset */));
+ extension = extension_registry()->GetExtensionById(
+ extension_id, extensions::ExtensionRegistry::ENABLED);
+
+ composite_matcher = ruleset_manager()->GetMatcherForExtension(extension_id);
+ EXPECT_FALSE(composite_matcher);
+
+ // Ensure the prefs entry are cleared appropriately.
+ EXPECT_FALSE(prefs->GetDNRStaticRulesetChecksum(
+ extension_id, kMinValidStaticRulesetID, &checksum));
+ EXPECT_FALSE(prefs->GetDNRStaticRulesetChecksum(
+ extension_id, RulesetID(kMinValidStaticRulesetID.value() + 1),
+ &checksum));
+ EXPECT_FALSE(prefs->GetDNRDynamicRulesetChecksum(extension_id, &checksum));
+}
+
// Tests the allowAllRequests action.
IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, AllowAllRequests) {
struct RuleData {
@@ -3690,7 +3880,8 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, AllowAllRequests) {
base::Optional<std::vector<std::string>> resource_types;
};
- auto run_test = [this](const GURL& page_url,
+ auto run_test = [this](const std::string& extension_directory,
+ const GURL& page_url,
const std::vector<RuleData>& rule_data,
const std::vector<std::string>& paths_seen,
const std::vector<std::string>& paths_not_seen) {
@@ -3709,7 +3900,8 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, AllowAllRequests) {
test_rules.push_back(test_rule);
}
- ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules(test_rules));
+ ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules(
+ test_rules, extension_directory, {} /* hosts */));
ui_test_utils::NavigateToURL(browser(), page_url);
@@ -3759,7 +3951,7 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, AllowAllRequests) {
// -/child_frame.html?frame=2 (Matching Rule=1)
// -/subresources/script.js?frameId=2 (Matching Rule=1,4 Winner=1)
// Hence only requests[3] is blocked.
- run_test(page_url, rule_data,
+ run_test("case_1", page_url, rule_data,
{requests[0], requests[1], requests[2], requests[4], requests[5]},
{requests[3]});
}
@@ -3781,7 +3973,8 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, AllowAllRequests) {
// -/subresources/script.js?frameId=1 (Source Frame was blocked)
// -/child_frame.html?frame=2 (Matching Rule=[1,3] Winner=3)
// -/subresources/script.js?frameId=2 (Matching Rule=[1,2,3] Winner=3)
- run_test(page_url, rule_data, {requests[0], requests[4], requests[5]},
+ run_test("case_2", page_url, rule_data,
+ {requests[0], requests[4], requests[5]},
{requests[1], requests[2], requests[3]});
}
@@ -3801,7 +3994,7 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, AllowAllRequests) {
// -/child_frame.html?frame=2 (Matching Rule=[1,2] Winner=2)
// -/subresources/script.js?frameId=2 (Source frame was blocked)
// Hence only the main-frame request goes through.
- run_test(page_url, rule_data, {requests[0]},
+ run_test("case_3", page_url, rule_data, {requests[0]},
{requests[1], requests[2], requests[3], requests[4], requests[5]});
}
{
@@ -3820,7 +4013,7 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, AllowAllRequests) {
// -/child_frame.html?frame=2 (Matching Rule=[1,2] Winner=1)
// -/subresources/script.js?frameId=2 (Matching Rule=[1,2] Winner=1)
// Hence all requests go through.
- run_test(page_url, rule_data,
+ run_test("case_4", page_url, rule_data,
{requests[0], requests[1], requests[2], requests[3], requests[4],
requests[5]},
{});
diff --git a/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_unittest.cc b/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_unittest.cc
new file mode 100644
index 00000000000..e4b0f34e4ee
--- /dev/null
+++ b/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_unittest.cc
@@ -0,0 +1,1380 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <stddef.h>
+#include <algorithm>
+#include <functional>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/json/json_reader.h"
+#include "base/json/json_writer.h"
+#include "base/location.h"
+#include "base/memory/ref_counted.h"
+#include "base/optional.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_util.h"
+#include "base/strings/stringprintf.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/test/metrics/histogram_tester.h"
+#include "base/test/scoped_run_loop_timeout.h"
+#include "base/test/test_timeouts.h"
+#include "base/values.h"
+#include "build/build_config.h"
+#include "chrome/browser/extensions/api/declarative_net_request/dnr_test_base.h"
+#include "chrome/browser/extensions/chrome_test_extension_loader.h"
+#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/load_error_reporter.h"
+#include "content/public/test/test_utils.h"
+#include "extensions/browser/api/declarative_net_request/composite_matcher.h"
+#include "extensions/browser/api/declarative_net_request/constants.h"
+#include "extensions/browser/api/declarative_net_request/declarative_net_request_api.h"
+#include "extensions/browser/api/declarative_net_request/parse_info.h"
+#include "extensions/browser/api/declarative_net_request/rules_monitor_service.h"
+#include "extensions/browser/api/declarative_net_request/ruleset_manager.h"
+#include "extensions/browser/api/declarative_net_request/ruleset_matcher.h"
+#include "extensions/browser/api/declarative_net_request/test_utils.h"
+#include "extensions/browser/api_test_utils.h"
+#include "extensions/browser/disable_reason.h"
+#include "extensions/browser/test_extension_registry_observer.h"
+#include "extensions/common/api/declarative_net_request.h"
+#include "extensions/common/api/declarative_net_request/constants.h"
+#include "extensions/common/api/declarative_net_request/test_utils.h"
+#include "extensions/common/error_utils.h"
+#include "extensions/common/file_util.h"
+#include "extensions/common/install_warning.h"
+#include "extensions/common/manifest_constants.h"
+#include "extensions/common/url_pattern.h"
+#include "extensions/common/value_builder.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace extensions {
+namespace declarative_net_request {
+namespace {
+
+constexpr char kJSONRulesFilename[] = "rules_file.json";
+
+constexpr char kLargeRegexFilter[] = ".{512}x";
+
+constexpr char kId1[] = "1.json";
+constexpr char kId2[] = "2.json";
+constexpr char kId3[] = "3.json";
+constexpr char kId4[] = "4.json";
+constexpr char kDefaultRulesetID[] = "id";
+
+namespace dnr_api = extensions::api::declarative_net_request;
+
+using ::testing::Field;
+using ::testing::Pointee;
+using ::testing::Property;
+using ::testing::UnorderedElementsAre;
+using ::testing::UnorderedElementsAreArray;
+
+std::string GetParseError(ParseResult result, int rule_id) {
+ return ParseInfo(result, &rule_id).error();
+}
+
+std::string GetErrorWithFilename(
+ const std::string& error,
+ const std::string& filename = kJSONRulesFilename) {
+ return base::StringPrintf("%s: %s", filename.c_str(), error.c_str());
+}
+
+InstallWarning GetLargeRegexWarning(
+ int rule_id,
+ const std::string& filename = kJSONRulesFilename) {
+ return InstallWarning(ErrorUtils::FormatErrorMessage(
+ GetErrorWithFilename(kErrorRegexTooLarge, filename),
+ base::NumberToString(rule_id), kRegexFilterKey),
+ manifest_keys::kDeclarativeNetRequestKey,
+ manifest_keys::kDeclarativeRuleResourcesKey);
+}
+
+// Base test fixture to test indexing of rulesets.
+class DeclarativeNetRequestUnittest : public DNRTestBase {
+ public:
+ DeclarativeNetRequestUnittest() = default;
+
+ // DNRTestBase override.
+ void SetUp() override {
+ DNRTestBase::SetUp();
+
+ RulesMonitorService::GetFactoryInstance()->SetTestingFactory(
+ browser_context(),
+ base::BindRepeating([](content::BrowserContext* context) {
+ return static_cast<std::unique_ptr<KeyedService>>(
+ RulesMonitorService::CreateInstanceForTesting(context));
+ }));
+ ASSERT_TRUE(RulesMonitorService::Get(browser_context()));
+
+ loader_ = CreateExtensionLoader();
+ extension_dir_ =
+ temp_dir().GetPath().Append(FILE_PATH_LITERAL("test_extension"));
+
+ // Create extension directory.
+ ASSERT_TRUE(base::CreateDirectory(extension_dir_));
+ }
+
+ protected:
+ RulesetManager* manager() {
+ return RulesMonitorService::Get(browser_context())->ruleset_manager();
+ }
+
+ // Loads the extension and verifies the indexed ruleset location and histogram
+ // counts.
+ void LoadAndExpectSuccess(size_t expected_rules_count,
+ size_t expected_enabled_rules_count,
+ bool expect_rulesets_indexed) {
+ base::HistogramTester tester;
+ WriteExtensionData();
+
+ loader_->set_should_fail(false);
+
+ // Clear all load errors before loading the extension.
+ error_reporter()->ClearErrors();
+
+ extension_ = loader_->LoadExtension(extension_dir_);
+ ASSERT_TRUE(extension_.get());
+
+ EXPECT_TRUE(
+ AreAllIndexedStaticRulesetsValid(*extension_, browser_context()));
+
+ // Ensure no load errors were reported.
+ EXPECT_TRUE(error_reporter()->GetErrors()->empty());
+
+ // The histograms below are not logged for unpacked extensions.
+ if (GetParam() == ExtensionLoadType::PACKED && expect_rulesets_indexed) {
+ tester.ExpectTotalCount(kIndexAndPersistRulesTimeHistogram,
+ 1 /* count */);
+ tester.ExpectUniqueSample(kManifestRulesCountHistogram,
+ expected_rules_count, 1 /* count */);
+ tester.ExpectUniqueSample(kManifestEnabledRulesCountHistogram,
+ expected_enabled_rules_count, 1 /* count */);
+ }
+ }
+
+ void LoadAndExpectError(const std::string& expected_error,
+ const std::string& filename) {
+ // The error should be prepended with the JSON filename.
+ std::string error_with_filename =
+ GetErrorWithFilename(expected_error, filename);
+
+ base::HistogramTester tester;
+ WriteExtensionData();
+
+ loader_->set_should_fail(true);
+
+ // Clear all load errors before loading the extension.
+ error_reporter()->ClearErrors();
+
+ extension_ = loader_->LoadExtension(extension_dir_);
+ EXPECT_FALSE(extension_.get());
+
+ // Verify the error. Only verify if the |expected_error| is a substring of
+ // the actual error, since some string may be prepended/appended while
+ // creating the actual error.
+ const std::vector<base::string16>* errors = error_reporter()->GetErrors();
+ ASSERT_EQ(1u, errors->size());
+ EXPECT_NE(base::string16::npos,
+ errors->at(0).find(base::UTF8ToUTF16(error_with_filename)))
+ << "expected: " << error_with_filename << " actual: " << errors->at(0);
+
+ tester.ExpectTotalCount(kIndexAndPersistRulesTimeHistogram, 0u);
+ tester.ExpectTotalCount(kManifestRulesCountHistogram, 0u);
+ }
+
+ bool RunDynamicRuleUpdateFunction(const Extension& extension,
+ const std::vector<int>& rule_ids_to_remove,
+ const std::vector<TestRule>& rules_to_add) {
+ std::unique_ptr<base::Value> ids_to_remove_value =
+ ListBuilder()
+ .Append(rule_ids_to_remove.begin(), rule_ids_to_remove.end())
+ .Build();
+
+ std::unique_ptr<base::Value> args =
+ ListBuilder()
+ .Append(std::move(ids_to_remove_value))
+ .Append(ToListValue(rules_to_add))
+ .Build();
+ std::string json_args;
+ base::JSONWriter::WriteWithOptions(
+ *args, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json_args);
+
+ auto update_function =
+ base::MakeRefCounted<DeclarativeNetRequestUpdateDynamicRulesFunction>();
+ update_function->set_extension(&extension);
+ update_function->set_has_callback(true);
+ return api_test_utils::RunFunction(update_function.get(), json_args,
+ browser_context());
+ }
+
+ void RunUpdateEnabledRulesetsFunction(
+ const Extension& extension,
+ const std::vector<std::string>& ruleset_ids_to_remove,
+ const std::vector<std::string>& ruleset_ids_to_add,
+ base::Optional<std::string> expected_error) {
+ std::unique_ptr<base::Value> args =
+ ListBuilder()
+ .Append(ToListValue(ruleset_ids_to_remove))
+ .Append(ToListValue(ruleset_ids_to_add))
+ .Build();
+ std::string json_args;
+ base::JSONWriter::WriteWithOptions(
+ *args, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json_args);
+
+ auto function = base::MakeRefCounted<
+ DeclarativeNetRequestUpdateEnabledRulesetsFunction>();
+ function->set_extension(&extension);
+ function->set_has_callback(true);
+
+ if (!expected_error) {
+ EXPECT_TRUE(api_test_utils::RunFunction(function.get(), json_args,
+ browser_context()));
+ return;
+ }
+
+ EXPECT_EQ(expected_error,
+ api_test_utils::RunFunctionAndReturnError(
+ function.get(), json_args, browser_context()));
+ }
+
+ void VerifyGetEnabledRulesetsFunction(
+ const Extension& extension,
+ const std::vector<std::string>& expected_ids) {
+ auto function =
+ base::MakeRefCounted<DeclarativeNetRequestGetEnabledRulesetsFunction>();
+ function->set_extension(&extension);
+ function->set_has_callback(true);
+
+ std::unique_ptr<base::Value> result =
+ api_test_utils::RunFunctionAndReturnSingleResult(
+ function.get(), "[]" /* args */, browser_context());
+ ASSERT_TRUE(result);
+ ASSERT_TRUE(result->is_list());
+ const base::ListValue& ids_value = base::Value::AsListValue(*result);
+
+ base::string16 error;
+ std::vector<std::string> actual_ids;
+ for (const auto& val : ids_value)
+ actual_ids.push_back(val.GetString());
+
+ EXPECT_THAT(expected_ids, UnorderedElementsAreArray(actual_ids));
+ }
+
+ void VerifyPublicRulesetIDs(
+ const Extension& extension,
+ const std::vector<std::string>& expected_public_ruleset_ids) {
+ CompositeMatcher* matcher =
+ manager()->GetMatcherForExtension(extension.id());
+ ASSERT_TRUE(matcher);
+
+ EXPECT_THAT(
+ expected_public_ruleset_ids,
+ UnorderedElementsAreArray(GetPublicRulesetIDs(extension, *matcher)));
+ }
+
+ ChromeTestExtensionLoader* extension_loader() { return loader_.get(); }
+
+ const Extension* extension() const { return extension_.get(); }
+
+ const base::FilePath& extension_dir() const { return extension_dir_; }
+
+ LoadErrorReporter* error_reporter() {
+ return LoadErrorReporter::GetInstance();
+ }
+
+ private:
+ // Derived classes must override this to persist the extension to disk.
+ virtual void WriteExtensionData() = 0;
+
+ base::FilePath extension_dir_;
+ std::unique_ptr<ChromeTestExtensionLoader> loader_;
+ scoped_refptr<const Extension> extension_;
+};
+
+// Fixture testing that declarative rules corresponding to the Declarative Net
+// Request API are correctly indexed, for both packed and unpacked extensions.
+// This only tests a single ruleset.
+class SingleRulesetTest : public DeclarativeNetRequestUnittest {
+ public:
+ SingleRulesetTest() = default;
+
+ protected:
+ void AddRule(const TestRule& rule) { rules_list_.push_back(rule); }
+
+ // This takes precedence over the AddRule method.
+ void SetRules(std::unique_ptr<base::Value> rules) {
+ rules_value_ = std::move(rules);
+ }
+
+ void set_persist_invalid_json_file() { persist_invalid_json_file_ = true; }
+
+ void set_persist_initial_indexed_ruleset() {
+ persist_initial_indexed_ruleset_ = true;
+ }
+
+ void LoadAndExpectError(const std::string& expected_error) {
+ DeclarativeNetRequestUnittest::LoadAndExpectError(expected_error,
+ kJSONRulesFilename);
+ }
+
+ // |expected_rules_count| refers to the count of indexed rules. When
+ // |expected_rules_count| is not set, it is inferred from the added rules.
+ void LoadAndExpectSuccess(
+ const base::Optional<size_t>& expected_rules_count = base::nullopt) {
+ size_t rules_count = 0;
+ if (expected_rules_count)
+ rules_count = *expected_rules_count;
+ else if (rules_value_ && rules_value_->is_list())
+ rules_count = rules_value_->GetList().size();
+ else
+ rules_count = rules_list_.size();
+
+ // We only index up to dnr_api::MAX_NUMBER_OF_RULES rules per ruleset.
+ rules_count = std::min(rules_count,
+ static_cast<size_t>(dnr_api::MAX_NUMBER_OF_RULES));
+
+ DeclarativeNetRequestUnittest::LoadAndExpectSuccess(rules_count,
+ rules_count, true);
+ }
+
+ private:
+ // DeclarativeNetRequestUnittest override:
+ void WriteExtensionData() override {
+ if (!rules_value_)
+ rules_value_ = ToListValue(rules_list_);
+
+ WriteManifestAndRuleset(
+ extension_dir(),
+ TestRulesetInfo(kDefaultRulesetID, kJSONRulesFilename, *rules_value_),
+ {} /* hosts */);
+
+ // Overwrite the JSON rules file with some invalid json.
+ if (persist_invalid_json_file_) {
+ std::string data = "invalid json";
+ ASSERT_TRUE(base::WriteFile(
+ extension_dir().AppendASCII(kJSONRulesFilename), data));
+ }
+
+ if (persist_initial_indexed_ruleset_) {
+ std::string data = "user ruleset";
+ base::FilePath ruleset_path =
+ extension_dir().Append(file_util::GetIndexedRulesetRelativePath(
+ kMinValidStaticRulesetID.value()));
+ ASSERT_TRUE(base::CreateDirectory(ruleset_path.DirName()));
+ ASSERT_TRUE(base::WriteFile(ruleset_path, data));
+ }
+ }
+
+ std::vector<TestRule> rules_list_;
+ std::unique_ptr<base::Value> rules_value_;
+ bool persist_invalid_json_file_ = false;
+ bool persist_initial_indexed_ruleset_ = false;
+};
+
+TEST_P(SingleRulesetTest, DuplicateResourceTypes) {
+ TestRule rule = CreateGenericRule();
+ rule.condition->resource_types =
+ std::vector<std::string>({"image", "stylesheet"});
+ rule.condition->excluded_resource_types = std::vector<std::string>({"image"});
+ AddRule(rule);
+ LoadAndExpectError(
+ GetParseError(ParseResult::ERROR_RESOURCE_TYPE_DUPLICATED, *rule.id));
+}
+
+TEST_P(SingleRulesetTest, EmptyRedirectRulePriority) {
+ TestRule rule = CreateGenericRule();
+ rule.action->type = std::string("redirect");
+ rule.action->redirect.emplace();
+ rule.action->redirect->url = std::string("https://google.com");
+ rule.priority.reset();
+ AddRule(rule);
+ LoadAndExpectError(
+ GetParseError(ParseResult::ERROR_EMPTY_RULE_PRIORITY, *rule.id));
+}
+
+TEST_P(SingleRulesetTest, EmptyRedirectRuleUrl) {
+ TestRule rule = CreateGenericRule();
+ rule.id = kMinValidID;
+ AddRule(rule);
+
+ rule.id = kMinValidID + 1;
+ rule.action->type = std::string("redirect");
+ rule.priority = kMinValidPriority;
+ AddRule(rule);
+
+ LoadAndExpectError(
+ GetParseError(ParseResult::ERROR_INVALID_REDIRECT, *rule.id));
+}
+
+TEST_P(SingleRulesetTest, InvalidRuleID) {
+ TestRule rule = CreateGenericRule();
+ rule.id = kMinValidID - 1;
+ AddRule(rule);
+ LoadAndExpectError(
+ GetParseError(ParseResult::ERROR_INVALID_RULE_ID, *rule.id));
+}
+
+TEST_P(SingleRulesetTest, InvalidRedirectRulePriority) {
+ TestRule rule = CreateGenericRule();
+ rule.action->type = std::string("redirect");
+ rule.action->redirect.emplace();
+ rule.action->redirect->url = std::string("https://google.com");
+ rule.priority = kMinValidPriority - 1;
+ AddRule(rule);
+ LoadAndExpectError(
+ GetParseError(ParseResult::ERROR_INVALID_RULE_PRIORITY, *rule.id));
+}
+
+TEST_P(SingleRulesetTest, NoApplicableResourceTypes) {
+ TestRule rule = CreateGenericRule();
+ rule.condition->excluded_resource_types = std::vector<std::string>(
+ {"main_frame", "sub_frame", "stylesheet", "script", "image", "font",
+ "object", "xmlhttprequest", "ping", "csp_report", "media", "websocket",
+ "other"});
+ AddRule(rule);
+ LoadAndExpectError(
+ GetParseError(ParseResult::ERROR_NO_APPLICABLE_RESOURCE_TYPES, *rule.id));
+}
+
+TEST_P(SingleRulesetTest, EmptyDomainsList) {
+ TestRule rule = CreateGenericRule();
+ rule.condition->domains = std::vector<std::string>();
+ AddRule(rule);
+ LoadAndExpectError(
+ GetParseError(ParseResult::ERROR_EMPTY_DOMAINS_LIST, *rule.id));
+}
+
+TEST_P(SingleRulesetTest, EmptyResourceTypeList) {
+ TestRule rule = CreateGenericRule();
+ rule.condition->resource_types = std::vector<std::string>();
+ AddRule(rule);
+ LoadAndExpectError(
+ GetParseError(ParseResult::ERROR_EMPTY_RESOURCE_TYPES_LIST, *rule.id));
+}
+
+TEST_P(SingleRulesetTest, EmptyURLFilter) {
+ TestRule rule = CreateGenericRule();
+ rule.condition->url_filter = std::string();
+ AddRule(rule);
+ LoadAndExpectError(
+ GetParseError(ParseResult::ERROR_EMPTY_URL_FILTER, *rule.id));
+}
+
+TEST_P(SingleRulesetTest, InvalidRedirectURL) {
+ TestRule rule = CreateGenericRule();
+ rule.action->type = std::string("redirect");
+ rule.action->redirect.emplace();
+ rule.action->redirect->url = std::string("google");
+ rule.priority = kMinValidPriority;
+ AddRule(rule);
+ LoadAndExpectError(
+ GetParseError(ParseResult::ERROR_INVALID_REDIRECT_URL, *rule.id));
+}
+
+TEST_P(SingleRulesetTest, ListNotPassed) {
+ SetRules(std::make_unique<base::DictionaryValue>());
+ LoadAndExpectError(kErrorListNotPassed);
+}
+
+TEST_P(SingleRulesetTest, DuplicateIDS) {
+ TestRule rule = CreateGenericRule();
+ AddRule(rule);
+ AddRule(rule);
+ LoadAndExpectError(GetParseError(ParseResult::ERROR_DUPLICATE_IDS, *rule.id));
+}
+
+// Ensure that we limit the number of parse failure warnings shown.
+TEST_P(SingleRulesetTest, TooManyParseFailures) {
+ const size_t kNumInvalidRules = 10;
+ const size_t kNumValidRules = 6;
+ const size_t kMaxUnparsedRulesWarnings = 5;
+
+ size_t rule_id = kMinValidID;
+ for (size_t i = 0; i < kNumInvalidRules; i++) {
+ TestRule rule = CreateGenericRule();
+ rule.id = rule_id++;
+ rule.action->type = std::string("invalid_action_type");
+ AddRule(rule);
+ }
+
+ for (size_t i = 0; i < kNumValidRules; i++) {
+ TestRule rule = CreateGenericRule();
+ rule.id = rule_id++;
+ AddRule(rule);
+ }
+
+ extension_loader()->set_ignore_manifest_warnings(true);
+ LoadAndExpectSuccess(kNumValidRules);
+
+ // TODO(crbug.com/879355): CrxInstaller reloads the extension after moving it,
+ // which causes it to lose the install warning. This should be fixed.
+ if (GetParam() != ExtensionLoadType::PACKED) {
+ const std::vector<InstallWarning>& expected_warnings =
+ extension()->install_warnings();
+ ASSERT_EQ(1u + kMaxUnparsedRulesWarnings, expected_warnings.size());
+
+ InstallWarning warning("");
+ warning.key = manifest_keys::kDeclarativeNetRequestKey;
+ warning.specific = manifest_keys::kDeclarativeRuleResourcesKey;
+
+ // The initial warnings should correspond to the first
+ // |kMaxUnparsedRulesWarnings| rules, which couldn't be parsed.
+ for (size_t i = 0; i < kMaxUnparsedRulesWarnings; i++) {
+ EXPECT_EQ(expected_warnings[i].key, warning.key);
+ EXPECT_EQ(expected_warnings[i].specific, warning.specific);
+ EXPECT_THAT(expected_warnings[i].message,
+ ::testing::HasSubstr("Parse error"));
+ }
+
+ warning.message = ErrorUtils::FormatErrorMessage(
+ GetErrorWithFilename(kTooManyParseFailuresWarning),
+ std::to_string(kMaxUnparsedRulesWarnings));
+ EXPECT_EQ(warning, expected_warnings[kMaxUnparsedRulesWarnings]);
+ }
+}
+
+// Ensures that rules which can't be parsed are ignored and cause an install
+// warning.
+TEST_P(SingleRulesetTest, InvalidJSONRules_StrongTypes) {
+ {
+ TestRule rule = CreateGenericRule();
+ rule.id = 1;
+ AddRule(rule);
+ }
+
+ {
+ TestRule rule = CreateGenericRule();
+ rule.id = 2;
+ rule.action->type = std::string("invalid action");
+ AddRule(rule);
+ }
+
+ {
+ TestRule rule = CreateGenericRule();
+ rule.id = 3;
+ AddRule(rule);
+ }
+
+ {
+ TestRule rule = CreateGenericRule();
+ rule.id = 4;
+ rule.condition->domain_type = std::string("invalid_domain_type");
+ AddRule(rule);
+ }
+
+ extension_loader()->set_ignore_manifest_warnings(true);
+ LoadAndExpectSuccess(2u);
+
+ // TODO(crbug.com/879355): CrxInstaller reloads the extension after moving it,
+ // which causes it to lose the install warning. This should be fixed.
+ if (GetParam() != ExtensionLoadType::PACKED) {
+ ASSERT_EQ(2u, extension()->install_warnings().size());
+ std::vector<InstallWarning> expected_warnings;
+
+ for (const auto& warning : extension()->install_warnings()) {
+ EXPECT_EQ(extensions::manifest_keys::kDeclarativeNetRequestKey,
+ warning.key);
+ EXPECT_EQ(extensions::manifest_keys::kDeclarativeRuleResourcesKey,
+ warning.specific);
+ EXPECT_THAT(warning.message, ::testing::HasSubstr("Parse error"));
+ }
+ }
+}
+
+// Ensures that rules which can't be parsed are ignored and cause an install
+// warning.
+TEST_P(SingleRulesetTest, InvalidJSONRules_Parsed) {
+ const char* kRules = R"(
+ [
+ {
+ "id" : 1,
+ "priority": 1,
+ "condition" : [],
+ "action" : {"type" : "block" }
+ },
+ {
+ "id" : 2,
+ "priority": 1,
+ "condition" : {"urlFilter" : "abc"},
+ "action" : {"type" : "block" }
+ },
+ {
+ "id" : 3,
+ "priority": 1,
+ "invalidKey" : "invalidKeyValue",
+ "condition" : {"urlFilter" : "example"},
+ "action" : {"type" : "block" }
+ },
+ {
+ "id" : "6",
+ "priority": 1,
+ "condition" : {"urlFilter" : "google"},
+ "action" : {"type" : "block" }
+ }
+ ]
+ )";
+ SetRules(base::JSONReader::ReadDeprecated(kRules));
+
+ extension_loader()->set_ignore_manifest_warnings(true);
+ LoadAndExpectSuccess(1u);
+
+ // TODO(crbug.com/879355): CrxInstaller reloads the extension after moving it,
+ // which causes it to lose the install warning. This should be fixed.
+ if (GetParam() != ExtensionLoadType::PACKED) {
+ ASSERT_EQ(3u, extension()->install_warnings().size());
+ std::vector<InstallWarning> expected_warnings;
+
+ expected_warnings.emplace_back(
+ ErrorUtils::FormatErrorMessage(
+ GetErrorWithFilename(kRuleNotParsedWarning), "id 1",
+ "'condition': expected dictionary, got list"),
+ manifest_keys::kDeclarativeNetRequestKey,
+ manifest_keys::kDeclarativeRuleResourcesKey);
+ expected_warnings.emplace_back(
+ ErrorUtils::FormatErrorMessage(
+ GetErrorWithFilename(kRuleNotParsedWarning), "id 3",
+ "found unexpected key 'invalidKey'"),
+ manifest_keys::kDeclarativeNetRequestKey,
+ manifest_keys::kDeclarativeRuleResourcesKey);
+ expected_warnings.emplace_back(
+ ErrorUtils::FormatErrorMessage(
+ GetErrorWithFilename(kRuleNotParsedWarning), "index 4",
+ "'id': expected id, got string"),
+ manifest_keys::kDeclarativeNetRequestKey,
+ manifest_keys::kDeclarativeRuleResourcesKey);
+ EXPECT_EQ(expected_warnings, extension()->install_warnings());
+ }
+}
+
+// Ensure that we can add up to MAX_NUMBER_OF_RULES.
+TEST_P(SingleRulesetTest, RuleCountLimitMatched) {
+ TestRule rule = CreateGenericRule();
+ for (int i = 0; i < dnr_api::MAX_NUMBER_OF_RULES; ++i) {
+ rule.id = kMinValidID + i;
+ rule.condition->url_filter = std::to_string(i);
+ AddRule(rule);
+ }
+ LoadAndExpectSuccess();
+}
+
+// Ensure that we get an install warning on exceeding the rule count limit.
+TEST_P(SingleRulesetTest, RuleCountLimitExceeded) {
+ TestRule rule = CreateGenericRule();
+ for (int i = 1; i <= dnr_api::MAX_NUMBER_OF_RULES + 1; ++i) {
+ rule.id = kMinValidID + i;
+ rule.condition->url_filter = std::to_string(i);
+ AddRule(rule);
+ }
+
+ extension_loader()->set_ignore_manifest_warnings(true);
+ LoadAndExpectSuccess();
+
+ // TODO(crbug.com/879355): CrxInstaller reloads the extension after moving it,
+ // which causes it to lose the install warning. This should be fixed.
+ if (GetParam() != ExtensionLoadType::PACKED) {
+ ASSERT_EQ(1u, extension()->install_warnings().size());
+ EXPECT_EQ(InstallWarning(GetErrorWithFilename(kRuleCountExceeded),
+ manifest_keys::kDeclarativeNetRequestKey,
+ manifest_keys::kDeclarativeRuleResourcesKey),
+ extension()->install_warnings()[0]);
+ }
+}
+
+// Ensure that regex rules which exceed the per rule memory limit are ignored
+// and raise an install warning.
+TEST_P(SingleRulesetTest, LargeRegexIgnored) {
+ TestRule rule = CreateGenericRule();
+ rule.condition->url_filter.reset();
+ int id = kMinValidID;
+
+ const int kNumSmallRegex = 5;
+ std::string small_regex = "http://(yahoo|google)\\.com";
+ for (int i = 0; i < kNumSmallRegex; i++, id++) {
+ rule.id = id;
+ rule.condition->regex_filter = small_regex;
+ AddRule(rule);
+ }
+
+ const int kNumLargeRegex = 2;
+ for (int i = 0; i < kNumLargeRegex; i++, id++) {
+ rule.id = id;
+ rule.condition->regex_filter = kLargeRegexFilter;
+ AddRule(rule);
+ }
+
+ base::HistogramTester tester;
+ extension_loader()->set_ignore_manifest_warnings(true);
+
+ LoadAndExpectSuccess(kNumSmallRegex);
+
+ tester.ExpectBucketCount(kIsLargeRegexHistogram, true, kNumLargeRegex);
+ tester.ExpectBucketCount(kIsLargeRegexHistogram, false, kNumSmallRegex);
+
+ // TODO(crbug.com/879355): CrxInstaller reloads the extension after moving it,
+ // which causes it to lose the install warning. This should be fixed.
+ if (GetParam() != ExtensionLoadType::PACKED) {
+ InstallWarning warning_1 = GetLargeRegexWarning(kMinValidID + 5);
+ InstallWarning warning_2 = GetLargeRegexWarning(kMinValidID + 6);
+ EXPECT_THAT(extension()->install_warnings(),
+ UnorderedElementsAre(::testing::Eq(std::cref(warning_1)),
+ ::testing::Eq(std::cref(warning_2))));
+ }
+}
+
+// Test an extension with both an error and an install warning.
+TEST_P(SingleRulesetTest, WarningAndError) {
+ // Add a large regex rule which will exceed the per rule memory limit and
+ // cause an install warning.
+ TestRule rule = CreateGenericRule();
+ rule.condition->url_filter.reset();
+ rule.id = kMinValidID;
+ rule.condition->regex_filter = kLargeRegexFilter;
+ AddRule(rule);
+
+ // Add a regex rule with a syntax error.
+ rule.condition->regex_filter = "abc(";
+ rule.id = kMinValidID + 1;
+ AddRule(rule);
+
+ LoadAndExpectError(
+ GetParseError(ParseResult::ERROR_INVALID_REGEX_FILTER, kMinValidID + 1));
+}
+
+// Ensure that we get an install warning on exceeding the regex rule count
+// limit.
+TEST_P(SingleRulesetTest, RegexRuleCountExceeded) {
+ TestRule regex_rule = CreateGenericRule();
+ regex_rule.condition->url_filter.reset();
+ int rule_id = kMinValidID;
+ for (int i = 1; i <= dnr_api::MAX_NUMBER_OF_REGEX_RULES + 5; ++i, ++rule_id) {
+ regex_rule.id = rule_id;
+ regex_rule.condition->regex_filter = std::to_string(i);
+ AddRule(regex_rule);
+ }
+
+ const int kCountNonRegexRules = 5;
+ TestRule rule = CreateGenericRule();
+ for (int i = 1; i <= kCountNonRegexRules; i++, ++rule_id) {
+ rule.id = rule_id;
+ rule.condition->url_filter = std::to_string(i);
+ AddRule(rule);
+ }
+
+ extension_loader()->set_ignore_manifest_warnings(true);
+ LoadAndExpectSuccess(dnr_api::MAX_NUMBER_OF_REGEX_RULES +
+ kCountNonRegexRules);
+ // TODO(crbug.com/879355): CrxInstaller reloads the extension after moving it,
+ // which causes it to lose the install warning. This should be fixed.
+ if (GetParam() != ExtensionLoadType::PACKED) {
+ ASSERT_EQ(1u, extension()->install_warnings().size());
+ EXPECT_EQ(InstallWarning(GetErrorWithFilename(kRegexRuleCountExceeded),
+ manifest_keys::kDeclarativeNetRequestKey,
+ manifest_keys::kDeclarativeRuleResourcesKey),
+ extension()->install_warnings()[0]);
+ }
+}
+
+TEST_P(SingleRulesetTest, InvalidJSONFile) {
+ set_persist_invalid_json_file();
+ // The error is returned by the JSON parser we use. Hence just test an error
+ // is raised.
+ LoadAndExpectError("");
+}
+
+TEST_P(SingleRulesetTest, EmptyRuleset) {
+ LoadAndExpectSuccess();
+}
+
+TEST_P(SingleRulesetTest, AddSingleRule) {
+ AddRule(CreateGenericRule());
+ LoadAndExpectSuccess();
+}
+
+TEST_P(SingleRulesetTest, AddTwoRules) {
+ TestRule rule = CreateGenericRule();
+ AddRule(rule);
+
+ rule.id = kMinValidID + 1;
+ AddRule(rule);
+ LoadAndExpectSuccess();
+}
+
+// Test that we do not use an extension provided indexed ruleset.
+TEST_P(SingleRulesetTest, ExtensionWithIndexedRuleset) {
+ set_persist_initial_indexed_ruleset();
+ AddRule(CreateGenericRule());
+ LoadAndExpectSuccess();
+}
+
+// Test for crbug.com/931967. Ensures that adding dynamic rules in the midst of
+// an initial ruleset load (in response to OnExtensionLoaded) behaves
+// predictably and doesn't DCHECK.
+TEST_P(SingleRulesetTest, DynamicRulesetRace) {
+ RulesetManagerObserver ruleset_waiter(manager());
+
+ AddRule(CreateGenericRule());
+ LoadAndExpectSuccess();
+ ruleset_waiter.WaitForExtensionsWithRulesetsCount(1);
+
+ const ExtensionId extension_id = extension()->id();
+ service()->DisableExtension(extension_id,
+ disable_reason::DISABLE_USER_ACTION);
+ ruleset_waiter.WaitForExtensionsWithRulesetsCount(0);
+
+ // Simulate indexed ruleset format version change. This will cause a re-index
+ // on subsequent extension load. Since this will further delay the initial
+ // ruleset load, it helps test that the ruleset loading doesn't race with
+ // updating dynamic rules.
+ ScopedIncrementRulesetVersion scoped_version_change =
+ CreateScopedIncrementRulesetVersionForTesting();
+
+ TestExtensionRegistryObserver registry_observer(registry());
+
+ service()->EnableExtension(extension_id);
+ scoped_refptr<const Extension> extension =
+ registry_observer.WaitForExtensionLoaded();
+ ASSERT_TRUE(extension);
+ ASSERT_EQ(extension_id, extension->id());
+
+ // At this point, the ruleset will still be loading.
+ ASSERT_FALSE(manager()->GetMatcherForExtension(extension_id));
+
+ // Add some dynamic rules.
+ std::vector<TestRule> dynamic_rules({CreateGenericRule()});
+ ASSERT_TRUE(RunDynamicRuleUpdateFunction(
+ *extension, {} /* rule_ids_to_remove */, dynamic_rules));
+
+ // The API function to update the dynamic ruleset should only complete once
+ // the initial ruleset loading (in response to OnExtensionLoaded) is complete.
+ // Hence by now, both the static and dynamic matchers must be loaded.
+ VerifyPublicRulesetIDs(*extension,
+ {kDefaultRulesetID, dnr_api::DYNAMIC_RULESET_ID});
+}
+
+// Ensures that an updateEnabledRulesets call in the midst of an initial ruleset
+// load (in response to OnExtensionLoaded) behaves predictably and doesn't
+// DCHECK.
+TEST_P(SingleRulesetTest, UpdateEnabledRulesetsRace) {
+ RulesetManagerObserver ruleset_waiter(manager());
+
+ AddRule(CreateGenericRule());
+ LoadAndExpectSuccess();
+ ruleset_waiter.WaitForExtensionsWithRulesetsCount(1);
+
+ const ExtensionId extension_id = extension()->id();
+ service()->DisableExtension(extension_id,
+ disable_reason::DISABLE_USER_ACTION);
+ ruleset_waiter.WaitForExtensionsWithRulesetsCount(0);
+
+ // Simulate indexed ruleset format version change. This will cause a re-index
+ // on subsequent extension load. Since this will further delay the initial
+ // ruleset load, it helps test that the ruleset loading doesn't race with the
+ // updateEnabledRulesets call.
+ ScopedIncrementRulesetVersion scoped_version_change =
+ CreateScopedIncrementRulesetVersionForTesting();
+
+ TestExtensionRegistryObserver registry_observer(registry());
+ service()->EnableExtension(extension_id);
+ scoped_refptr<const Extension> extension =
+ registry_observer.WaitForExtensionLoaded();
+ ASSERT_TRUE(extension);
+ ASSERT_EQ(extension_id, extension->id());
+
+ // At this point, the ruleset will still be loading.
+ ASSERT_FALSE(manager()->GetMatcherForExtension(extension_id));
+
+ // Disable the sole extension ruleset.
+ RunUpdateEnabledRulesetsFunction(*extension, {kDefaultRulesetID}, {},
+ base::nullopt);
+
+ // Wait for any pending tasks. This isn't actually necessary for this test
+ // (there shouldn't be any pending tasks at this point). However still do this
+ // to not rely on any task ordering assumption.
+ content::RunAllTasksUntilIdle();
+
+ // The API function to update the enabled rulesets should only complete after
+ // the initial ruleset loading (in response to OnExtensionLoaded) is complete.
+ // Hence by now, the extension shouldn't have any active rulesets.
+ VerifyPublicRulesetIDs(*extension, {});
+}
+
+// Tests that multiple static rulesets are correctly indexed.
+class MultipleRulesetsTest : public DeclarativeNetRequestUnittest {
+ public:
+ MultipleRulesetsTest() = default;
+
+ protected:
+ // DeclarativeNetRequestUnittest override:
+ void WriteExtensionData() override {
+ WriteManifestAndRulesets(extension_dir(), rulesets_, {} /* hosts */);
+ }
+
+ void AddRuleset(const TestRulesetInfo& info) { rulesets_.push_back(info); }
+
+ TestRulesetInfo CreateRuleset(const std::string& manifest_id_and_path,
+ size_t num_non_regex_rules,
+ size_t num_regex_rules,
+ bool enabled) {
+ std::vector<TestRule> rules;
+ TestRule rule = CreateGenericRule();
+ int id = kMinValidID;
+ for (size_t i = 0; i < num_non_regex_rules; ++i, ++id) {
+ rule.id = id;
+ rules.push_back(rule);
+ }
+
+ TestRule regex_rule = CreateGenericRule();
+ regex_rule.condition->url_filter.reset();
+ regex_rule.condition->regex_filter = "block";
+ for (size_t i = 0; i < num_regex_rules; ++i, ++id) {
+ regex_rule.id = id;
+ rules.push_back(regex_rule);
+ }
+
+ return TestRulesetInfo(manifest_id_and_path, *ToListValue(rules), enabled);
+ }
+
+ // |expected_rules_count| and |expected_enabled_rules_count| refer to the
+ // counts of indexed rules. When not set, these are inferred from the added
+ // rulesets.
+ void LoadAndExpectSuccess(
+ const base::Optional<size_t>& expected_rules_count = base::nullopt,
+ const base::Optional<size_t>& expected_enabled_rules_count =
+ base::nullopt) {
+ size_t rules_count = 0u;
+ size_t rules_enabled_count = 0u;
+ for (const TestRulesetInfo& info : rulesets_) {
+ size_t count = info.rules_value.GetList().size();
+
+ // We only index up to dnr_api::MAX_NUMBER_OF_RULES per ruleset, but may
+ // index more rules than this limit across rulesets.
+ count =
+ std::min(count, static_cast<size_t>(dnr_api::MAX_NUMBER_OF_RULES));
+
+ rules_count += count;
+ if (info.enabled)
+ rules_enabled_count += count;
+ }
+
+ DeclarativeNetRequestUnittest::LoadAndExpectSuccess(
+ expected_rules_count.value_or(rules_count),
+ expected_enabled_rules_count.value_or(rules_enabled_count),
+ !rulesets_.empty());
+ }
+
+ private:
+ std::vector<TestRulesetInfo> rulesets_;
+};
+
+// Tests an extension with multiple static rulesets.
+TEST_P(MultipleRulesetsTest, Success) {
+ size_t kNumRulesets = 7;
+ size_t kRulesPerRuleset = 10;
+
+ for (size_t i = 0; i < kNumRulesets; ++i) {
+ AddRuleset(CreateRuleset(std::to_string(i), kRulesPerRuleset, 0, true));
+ }
+
+ LoadAndExpectSuccess();
+}
+
+// Tests an extension with no static rulesets.
+TEST_P(MultipleRulesetsTest, ZeroRulesets) {
+ LoadAndExpectSuccess();
+ VerifyGetEnabledRulesetsFunction(*extension(), {});
+}
+
+// Tests an extension with multiple empty rulesets.
+TEST_P(MultipleRulesetsTest, EmptyRulesets) {
+ size_t kNumRulesets = 7;
+
+ for (size_t i = 0; i < kNumRulesets; ++i)
+ AddRuleset(CreateRuleset(std::to_string(i), 0, 0, true));
+
+ LoadAndExpectSuccess();
+}
+
+// Tests an extension with multiple static rulesets, with one of rulesets
+// specifying an invalid rules file.
+TEST_P(MultipleRulesetsTest, ListNotPassed) {
+ std::vector<TestRule> rules({CreateGenericRule()});
+ AddRuleset(TestRulesetInfo(kId1, "path1", *ToListValue(rules)));
+
+ // Persist a ruleset with an invalid rules file.
+ AddRuleset(TestRulesetInfo(kId2, "path2", base::DictionaryValue()));
+
+ AddRuleset(TestRulesetInfo(kId3, "path3", base::ListValue()));
+
+ LoadAndExpectError(kErrorListNotPassed, "path2" /* filename */);
+}
+
+// Tests an extension with multiple static rulesets with each ruleset generating
+// some install warnings.
+TEST_P(MultipleRulesetsTest, InstallWarnings) {
+ size_t expected_rule_count = 0;
+ size_t enabled_rule_count = 0;
+ std::vector<std::string> expected_warnings;
+ {
+ // Persist a ruleset with an install warning for a large regex.
+ std::vector<TestRule> rules;
+ TestRule rule = CreateGenericRule();
+ rule.id = kMinValidID;
+ rules.push_back(rule);
+
+ rule.id = kMinValidID + 1;
+ rule.condition->url_filter.reset();
+ rule.condition->regex_filter = kLargeRegexFilter;
+ rules.push_back(rule);
+
+ TestRulesetInfo info(kId1, "path1", *ToListValue(rules), true);
+ AddRuleset(info);
+
+ expected_warnings.push_back(
+ GetLargeRegexWarning(*rule.id, info.relative_file_path).message);
+
+ expected_rule_count += rules.size();
+ enabled_rule_count += 1;
+ }
+
+ {
+ // Persist a ruleset with an install warning for exceeding the rule count.
+ TestRulesetInfo info =
+ CreateRuleset(kId2, dnr_api::MAX_NUMBER_OF_RULES + 1, 0, false);
+ AddRuleset(info);
+
+ expected_warnings.push_back(
+ GetErrorWithFilename(kRuleCountExceeded, info.relative_file_path));
+
+ expected_rule_count += dnr_api::MAX_NUMBER_OF_RULES;
+ }
+
+ {
+ // Persist a ruleset with an install warning for exceeding the regex rule
+ // count.
+ size_t kCountNonRegexRules = 5;
+ TestRulesetInfo info =
+ CreateRuleset(kId3, kCountNonRegexRules,
+ dnr_api::MAX_NUMBER_OF_REGEX_RULES + 1, false);
+ AddRuleset(info);
+
+ expected_warnings.push_back(
+ GetErrorWithFilename(kRegexRuleCountExceeded, info.relative_file_path));
+
+ expected_rule_count +=
+ kCountNonRegexRules + dnr_api::MAX_NUMBER_OF_REGEX_RULES;
+ }
+
+ extension_loader()->set_ignore_manifest_warnings(true);
+ LoadAndExpectSuccess(expected_rule_count, enabled_rule_count);
+
+ // TODO(crbug.com/879355): CrxInstaller reloads the extension after moving it,
+ // which causes it to lose the install warning. This should be fixed.
+ if (GetParam() != ExtensionLoadType::PACKED) {
+ const std::vector<InstallWarning>& warnings =
+ extension()->install_warnings();
+ std::vector<std::string> warning_strings;
+ for (const InstallWarning& warning : warnings)
+ warning_strings.push_back(warning.message);
+
+ EXPECT_THAT(warning_strings, UnorderedElementsAreArray(expected_warnings));
+ }
+}
+
+TEST_P(MultipleRulesetsTest, EnabledRulesCount) {
+ AddRuleset(CreateRuleset(kId1, 100, 10, true));
+ AddRuleset(CreateRuleset(kId2, 200, 20, false));
+ AddRuleset(CreateRuleset(kId3, 300, 30, true));
+
+ RulesetManagerObserver ruleset_waiter(manager());
+ LoadAndExpectSuccess();
+ ruleset_waiter.WaitForExtensionsWithRulesetsCount(1);
+
+ // Only the first and third rulesets should be enabled.
+ CompositeMatcher* composite_matcher =
+ manager()->GetMatcherForExtension(extension()->id());
+ ASSERT_TRUE(composite_matcher);
+
+ VerifyPublicRulesetIDs(*extension(), {kId1, kId3});
+
+ EXPECT_THAT(composite_matcher->matchers(),
+ UnorderedElementsAre(
+ Pointee(Property(&RulesetMatcher::GetRulesCount, 100 + 10)),
+ Pointee(Property(&RulesetMatcher::GetRulesCount, 300 + 30))));
+}
+
+// Ensure that exceeding the rules count limit across rulesets raises an install
+// warning.
+TEST_P(MultipleRulesetsTest, StaticRuleCountExceeded) {
+ // Enabled on load.
+ AddRuleset(CreateRuleset(kId1, 10, 0, true));
+ // Disabled by default.
+ AddRuleset(CreateRuleset(kId2, 20, 0, false));
+ // Not enabled on load since including it exceeds the static rules count.
+ AddRuleset(CreateRuleset(kId3, dnr_api::MAX_NUMBER_OF_RULES + 10, 0, true));
+ // Enabled on load.
+ AddRuleset(CreateRuleset(kId4, 30, 0, true));
+
+ RulesetManagerObserver ruleset_waiter(manager());
+ extension_loader()->set_ignore_manifest_warnings(true);
+
+ {
+ // To prevent timeouts in debug builds, increase the wait timeout to the
+ // test launcher's timeout. See crbug.com/1071403.
+ // TODO(karandeepb): Provide a way to fake dnr_api::MAX_NUMBER_OF_RULES in
+ // tests to decrease test runtime.
+ base::test::ScopedRunLoopTimeout specific_timeout(
+ FROM_HERE, TestTimeouts::test_launcher_timeout());
+ LoadAndExpectSuccess();
+ }
+
+ std::string extension_id = extension()->id();
+
+ // Installing the extension causes install warning for rulesets 2 and 3 since
+ // they exceed the rules limit. Also, since the set of enabled rulesets exceed
+ // the rules limit, another warning should be raised.
+ if (GetParam() != ExtensionLoadType::PACKED) {
+ EXPECT_THAT(
+ extension()->install_warnings(),
+ UnorderedElementsAre(
+ Field(&InstallWarning::message,
+ GetErrorWithFilename(kRuleCountExceeded, kId3)),
+ Field(&InstallWarning::message, kEnabledRuleCountExceeded)));
+ }
+
+ ruleset_waiter.WaitForExtensionsWithRulesetsCount(1);
+
+ CompositeMatcher* composite_matcher =
+ manager()->GetMatcherForExtension(extension_id);
+ ASSERT_TRUE(composite_matcher);
+
+ VerifyPublicRulesetIDs(*extension(), {kId1, kId4});
+
+ EXPECT_THAT(composite_matcher->matchers(),
+ UnorderedElementsAre(
+ Pointee(Property(&RulesetMatcher::GetRulesCount, 10)),
+ Pointee(Property(&RulesetMatcher::GetRulesCount, 30))));
+}
+
+// Ensure that exceeding the regex rules limit across rulesets raises a warning.
+TEST_P(MultipleRulesetsTest, RegexRuleCountExceeded) {
+ // Enabled on load.
+ AddRuleset(CreateRuleset(kId1, 10000, 100, true));
+ // Won't be enabled on load since including it will exceed the regex rule
+ // count.
+ AddRuleset(CreateRuleset(kId2, 1, dnr_api::MAX_NUMBER_OF_REGEX_RULES, true));
+ // Won't be enabled on load since it is disabled by default.
+ AddRuleset(CreateRuleset(kId3, 10, 10, false));
+ // Enabled on load.
+ AddRuleset(CreateRuleset(kId4, 20, 20, true));
+
+ RulesetManagerObserver ruleset_waiter(manager());
+ extension_loader()->set_ignore_manifest_warnings(true);
+
+ LoadAndExpectSuccess();
+
+ // Installing the extension causes an install warning since the set of enabled
+ // rulesets exceed the regex rules limit.
+ if (GetParam() != ExtensionLoadType::PACKED) {
+ EXPECT_THAT(extension()->install_warnings(),
+ UnorderedElementsAre(Field(&InstallWarning::message,
+ kEnabledRegexRuleCountExceeded)));
+ }
+
+ ruleset_waiter.WaitForExtensionsWithRulesetsCount(1);
+
+ CompositeMatcher* composite_matcher =
+ manager()->GetMatcherForExtension(extension()->id());
+ ASSERT_TRUE(composite_matcher);
+
+ VerifyPublicRulesetIDs(*extension(), {kId1, kId4});
+
+ EXPECT_THAT(
+ composite_matcher->matchers(),
+ UnorderedElementsAre(
+ Pointee(Property(&RulesetMatcher::GetRulesCount, 10000 + 100)),
+ Pointee(Property(&RulesetMatcher::GetRulesCount, 20 + 20))));
+}
+
+TEST_P(MultipleRulesetsTest, UpdateEnabledRulesets_InvalidRulesetID) {
+ AddRuleset(CreateRuleset(kId1, 10, 10, true));
+ AddRuleset(CreateRuleset(kId2, 10, 10, false));
+ AddRuleset(CreateRuleset(kId3, 10, 10, true));
+
+ RulesetManagerObserver ruleset_waiter(manager());
+ LoadAndExpectSuccess();
+ ruleset_waiter.WaitForExtensionsWithRulesetsCount(1);
+
+ constexpr char kInvalidRulesetId[] = "invalid_id";
+ RunUpdateEnabledRulesetsFunction(
+ *extension(), {kId1, kInvalidRulesetId}, {},
+ ErrorUtils::FormatErrorMessage(kInvalidRulesetIDError,
+ kInvalidRulesetId));
+ VerifyPublicRulesetIDs(*extension(), {kId1, kId3});
+
+ RunUpdateEnabledRulesetsFunction(
+ *extension(), {kId1}, {kId2, kInvalidRulesetId},
+ ErrorUtils::FormatErrorMessage(kInvalidRulesetIDError,
+ kInvalidRulesetId));
+ VerifyPublicRulesetIDs(*extension(), {kId1, kId3});
+}
+
+TEST_P(MultipleRulesetsTest, UpdateEnabledRulesets_RuleCountExceeded) {
+ AddRuleset(CreateRuleset(kId1, 10, 10, true));
+ AddRuleset(CreateRuleset(kId2, dnr_api::MAX_NUMBER_OF_RULES, 0, false));
+
+ RulesetManagerObserver ruleset_waiter(manager());
+ LoadAndExpectSuccess();
+ ruleset_waiter.WaitForExtensionsWithRulesetsCount(1);
+
+ RunUpdateEnabledRulesetsFunction(*extension(), {}, {kId2},
+ kEnabledRulesetsRuleCountExceeded);
+ VerifyPublicRulesetIDs(*extension(), {kId1});
+
+ // updateEnabledRulesets looks at the rule counts at the end of the update, so
+ // disabling |kId1| and enabling |kId2| works (because the total rule count is
+ // under the limit).
+ RunUpdateEnabledRulesetsFunction(*extension(), {kId1}, {kId2}, base::nullopt);
+ VerifyPublicRulesetIDs(*extension(), {kId2});
+}
+
+TEST_P(MultipleRulesetsTest, UpdateEnabledRulesets_RegexRuleCountExceeded) {
+ AddRuleset(CreateRuleset(kId1, 0, 10, false));
+ AddRuleset(CreateRuleset(kId2, 0, dnr_api::MAX_NUMBER_OF_REGEX_RULES, true));
+
+ RulesetManagerObserver ruleset_waiter(manager());
+ LoadAndExpectSuccess();
+ ruleset_waiter.WaitForExtensionsWithRulesetsCount(1);
+
+ RunUpdateEnabledRulesetsFunction(*extension(), {}, {kId1},
+ kEnabledRulesetsRegexRuleCountExceeded);
+ VerifyPublicRulesetIDs(*extension(), {kId2});
+}
+
+TEST_P(MultipleRulesetsTest, UpdateEnabledRulesets_InternalError) {
+ AddRuleset(CreateRuleset(kId1, 10, 10, true));
+ AddRuleset(CreateRuleset(kId2, 10, 10, false));
+
+ RulesetManagerObserver ruleset_waiter(manager());
+ LoadAndExpectSuccess();
+ ruleset_waiter.WaitForExtensionsWithRulesetsCount(1);
+
+ std::vector<RulesetSource> static_sources =
+ RulesetSource::CreateStatic(*extension());
+ ASSERT_EQ(2u, static_sources.size());
+
+ constexpr char kReindexHistogram[] =
+ "Extensions.DeclarativeNetRequest.RulesetReindexSuccessful";
+ {
+ // First delete the indexed ruleset file for the second ruleset. Enabling it
+ // should cause re-indexing and succeed in enabling the ruleset.
+ base::HistogramTester tester;
+ ASSERT_TRUE(base::DeleteFile(static_sources[1].indexed_path(),
+ false /* recursive */));
+
+ RunUpdateEnabledRulesetsFunction(*extension(), {kId1}, {kId2},
+ base::nullopt);
+ VerifyPublicRulesetIDs(*extension(), {kId2});
+
+ tester.ExpectBucketCount(kReindexHistogram, true /*sample*/, 1 /*count*/);
+
+ EXPECT_TRUE(base::PathExists(static_sources[1].indexed_path()));
+ }
+
+ {
+ // Now delete both the indexed and json ruleset file for the first ruleset.
+ // This will prevent enabling the first ruleset since re-indexing will fail.
+ base::HistogramTester tester;
+ ASSERT_TRUE(base::DeleteFile(static_sources[0].indexed_path(),
+ false /* recursive */));
+ ASSERT_TRUE(
+ base::DeleteFile(static_sources[0].json_path(), false /* recursive */));
+
+ RunUpdateEnabledRulesetsFunction(*extension(), {}, {kId1},
+ kInternalErrorUpdatingEnabledRulesets);
+ VerifyPublicRulesetIDs(*extension(), {kId2});
+
+ tester.ExpectBucketCount(kReindexHistogram, false /*sample*/, 1 /*count*/);
+ }
+}
+
+TEST_P(MultipleRulesetsTest, UpdateAndGetEnabledRulesets_Success) {
+ AddRuleset(CreateRuleset(kId1, 10, 10, true));
+ AddRuleset(CreateRuleset(kId2, 10, 10, false));
+ AddRuleset(CreateRuleset(kId3, 10, 10, true));
+
+ RulesetManagerObserver ruleset_waiter(manager());
+ LoadAndExpectSuccess();
+ ruleset_waiter.WaitForExtensionsWithRulesetsCount(1);
+
+ std::vector<std::string> ruleset_ids;
+ RunUpdateEnabledRulesetsFunction(*extension(), {kId1, kId3}, {kId2},
+ base::nullopt /* expected_error */);
+ VerifyPublicRulesetIDs(*extension(), {kId2});
+ VerifyGetEnabledRulesetsFunction(*extension(), {kId2});
+
+ RunUpdateEnabledRulesetsFunction(*extension(), {}, {kId3, kId3},
+ base::nullopt /* expected_error */);
+ VerifyPublicRulesetIDs(*extension(), {kId2, kId3});
+ VerifyGetEnabledRulesetsFunction(*extension(), {kId2, kId3});
+
+ // Ensure no-op calls succeed.
+ RunUpdateEnabledRulesetsFunction(*extension(), {}, {kId2, kId3},
+ base::nullopt /* expected_error */);
+ VerifyPublicRulesetIDs(*extension(), {kId2, kId3});
+ VerifyGetEnabledRulesetsFunction(*extension(), {kId2, kId3});
+
+ RunUpdateEnabledRulesetsFunction(*extension(), {kId1}, {},
+ base::nullopt /* expected_error */);
+ VerifyPublicRulesetIDs(*extension(), {kId2, kId3});
+ VerifyGetEnabledRulesetsFunction(*extension(), {kId2, kId3});
+
+ // Add dynamic rules and ensure that the setEnabledRulesets call doesn't have
+ // any effect on the dynamic ruleset. Also ensure that the getEnabledRulesets
+ // call excludes the dynamic ruleset ID.
+ ASSERT_TRUE(
+ RunDynamicRuleUpdateFunction(*extension(), {}, {CreateGenericRule()}));
+ VerifyPublicRulesetIDs(*extension(),
+ {kId2, kId3, dnr_api::DYNAMIC_RULESET_ID});
+ VerifyGetEnabledRulesetsFunction(*extension(), {kId2, kId3});
+
+ // Ensure enabling a ruleset takes priority over disabling.
+ RunUpdateEnabledRulesetsFunction(*extension(), {kId1}, {kId1},
+ base::nullopt /* expected_error */);
+ VerifyPublicRulesetIDs(*extension(),
+ {kId1, kId2, kId3, dnr_api::DYNAMIC_RULESET_ID});
+ VerifyGetEnabledRulesetsFunction(*extension(), {kId1, kId2, kId3});
+
+ // Ensure the set of enabled rulesets persists across extension reloads.
+ const ExtensionId extension_id = extension()->id();
+ service()->DisableExtension(extension_id,
+ disable_reason::DISABLE_USER_ACTION);
+ ruleset_waiter.WaitForExtensionsWithRulesetsCount(0);
+
+ service()->EnableExtension(extension_id);
+ ruleset_waiter.WaitForExtensionsWithRulesetsCount(1);
+ const Extension* extension =
+ registry()->GetExtensionById(extension_id, ExtensionRegistry::ENABLED);
+ ASSERT_TRUE(extension);
+ VerifyPublicRulesetIDs(*extension,
+ {kId1, kId2, kId3, dnr_api::DYNAMIC_RULESET_ID});
+ VerifyGetEnabledRulesetsFunction(*extension, {kId1, kId2, kId3});
+}
+
+INSTANTIATE_TEST_SUITE_P(All,
+ SingleRulesetTest,
+ ::testing::Values(ExtensionLoadType::PACKED,
+ ExtensionLoadType::UNPACKED));
+INSTANTIATE_TEST_SUITE_P(All,
+ MultipleRulesetsTest,
+ ::testing::Values(ExtensionLoadType::PACKED,
+ ExtensionLoadType::UNPACKED));
+
+} // namespace
+} // namespace declarative_net_request
+} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/declarative_net_request/dnr_test_base.cc b/chromium/chrome/browser/extensions/api/declarative_net_request/dnr_test_base.cc
index 82676ea2fd7..be2323e3edc 100644
--- a/chromium/chrome/browser/extensions/api/declarative_net_request/dnr_test_base.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_net_request/dnr_test_base.cc
@@ -5,14 +5,11 @@
#include "chrome/browser/extensions/api/declarative_net_request/dnr_test_base.h"
#include "chrome/browser/extensions/chrome_test_extension_loader.h"
-#include "components/version_info/version_info.h"
namespace extensions {
namespace declarative_net_request {
-// Use channel UNKNOWN to ensure that the declarativeNetRequest API is
-// available, irrespective of its actual availability.
-DNRTestBase::DNRTestBase() : channel_(::version_info::Channel::UNKNOWN) {}
+DNRTestBase::DNRTestBase() = default;
void DNRTestBase::SetUp() {
ExtensionServiceTestBase::SetUp();
diff --git a/chromium/chrome/browser/extensions/api/declarative_net_request/dnr_test_base.h b/chromium/chrome/browser/extensions/api/declarative_net_request/dnr_test_base.h
index 69b8b556dee..78e4a891a96 100644
--- a/chromium/chrome/browser/extensions/api/declarative_net_request/dnr_test_base.h
+++ b/chromium/chrome/browser/extensions/api/declarative_net_request/dnr_test_base.h
@@ -10,7 +10,6 @@
#include "base/macros.h"
#include "chrome/browser/extensions/extension_service_test_base.h"
#include "extensions/browser/api/declarative_net_request/test_utils.h"
-#include "extensions/common/features/feature_channel.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace extensions {
@@ -32,8 +31,6 @@ class DNRTestBase : public ExtensionServiceTestBase,
std::unique_ptr<ChromeTestExtensionLoader> CreateExtensionLoader();
private:
- ScopedCurrentChannel channel_;
-
DISALLOW_COPY_AND_ASSIGN(DNRTestBase);
};
diff --git a/chromium/chrome/browser/extensions/api/declarative_net_request/rule_indexing_unittest.cc b/chromium/chrome/browser/extensions/api/declarative_net_request/rule_indexing_unittest.cc
deleted file mode 100644
index 6284bd6c2a0..00000000000
--- a/chromium/chrome/browser/extensions/api/declarative_net_request/rule_indexing_unittest.cc
+++ /dev/null
@@ -1,860 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-#include <functional>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/json/json_reader.h"
-#include "base/memory/ref_counted.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/test/metrics/histogram_tester.h"
-#include "chrome/browser/extensions/api/declarative_net_request/dnr_test_base.h"
-#include "chrome/browser/extensions/chrome_test_extension_loader.h"
-#include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/load_error_reporter.h"
-#include "extensions/browser/api/declarative_net_request/constants.h"
-#include "extensions/browser/api/declarative_net_request/parse_info.h"
-#include "extensions/browser/api/declarative_net_request/test_utils.h"
-#include "extensions/browser/test_extension_registry_observer.h"
-#include "extensions/common/api/declarative_net_request.h"
-#include "extensions/common/api/declarative_net_request/test_utils.h"
-#include "extensions/common/error_utils.h"
-#include "extensions/common/file_util.h"
-#include "extensions/common/install_warning.h"
-#include "extensions/common/manifest_constants.h"
-#include "extensions/common/url_pattern.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace extensions {
-namespace declarative_net_request {
-namespace {
-
-constexpr char kJSONRulesFilename[] = "rules_file.json";
-
-constexpr char kLargeRegexFilter[] = ".{512}x";
-
-namespace dnr_api = extensions::api::declarative_net_request;
-
-std::string GetParseError(ParseResult result, int rule_id) {
- ParseInfo info;
- info.SetError(result, &rule_id);
- return info.error();
-}
-
-std::string GetErrorWithFilename(
- const std::string& error,
- const std::string& filename = kJSONRulesFilename) {
- return base::StringPrintf("%s: %s", filename.c_str(), error.c_str());
-}
-
-InstallWarning GetLargeRegexWarning(
- int rule_id,
- const std::string& filename = kJSONRulesFilename) {
- return InstallWarning(ErrorUtils::FormatErrorMessage(
- GetErrorWithFilename(kErrorRegexTooLarge, filename),
- base::NumberToString(rule_id), kRegexFilterKey),
- manifest_keys::kDeclarativeNetRequestKey,
- manifest_keys::kDeclarativeRuleResourcesKey);
-}
-
-// Base test fixture to test indexing of rulesets.
-class RuleIndexingTestBase : public DNRTestBase {
- public:
- RuleIndexingTestBase() = default;
-
- // DNRTestBase override.
- void SetUp() override {
- DNRTestBase::SetUp();
- loader_ = CreateExtensionLoader();
- extension_dir_ =
- temp_dir().GetPath().Append(FILE_PATH_LITERAL("test_extension"));
-
- // Create extension directory.
- ASSERT_TRUE(base::CreateDirectory(extension_dir_));
- }
-
- protected:
- // Loads the extension and verifies the indexed ruleset location and histogram
- // counts.
- void LoadAndExpectSuccess(size_t expected_indexed_rules_count) {
- base::HistogramTester tester;
- WriteExtensionData();
-
- loader_->set_should_fail(false);
-
- // Clear all load errors before loading the extension.
- error_reporter()->ClearErrors();
-
- extension_ = loader_->LoadExtension(extension_dir_);
- ASSERT_TRUE(extension_.get());
-
- EXPECT_TRUE(
- AreAllIndexedStaticRulesetsValid(*extension_, browser_context()));
-
- // Ensure no load errors were reported.
- EXPECT_TRUE(error_reporter()->GetErrors()->empty());
-
- // The histograms below are not logged for unpacked extensions.
- if (GetParam() == ExtensionLoadType::PACKED) {
- tester.ExpectTotalCount(kIndexAndPersistRulesTimeHistogram,
- 1 /* count */);
- tester.ExpectBucketCount(kManifestRulesCountHistogram,
- expected_indexed_rules_count, 1 /* count */);
- }
- }
-
- void LoadAndExpectError(const std::string& expected_error,
- const std::string& filename) {
- // The error should be prepended with the JSON filename.
- std::string error_with_filename =
- GetErrorWithFilename(expected_error, filename);
-
- base::HistogramTester tester;
- WriteExtensionData();
-
- loader_->set_should_fail(true);
-
- // Clear all load errors before loading the extension.
- error_reporter()->ClearErrors();
-
- extension_ = loader_->LoadExtension(extension_dir_);
- EXPECT_FALSE(extension_.get());
-
- // Verify the error. Only verify if the |expected_error| is a substring of
- // the actual error, since some string may be prepended/appended while
- // creating the actual error.
- const std::vector<base::string16>* errors = error_reporter()->GetErrors();
- ASSERT_EQ(1u, errors->size());
- EXPECT_NE(base::string16::npos,
- errors->at(0).find(base::UTF8ToUTF16(error_with_filename)))
- << "expected: " << error_with_filename << " actual: " << errors->at(0);
-
- tester.ExpectTotalCount(kIndexAndPersistRulesTimeHistogram, 0u);
- tester.ExpectTotalCount(kManifestRulesCountHistogram, 0u);
- }
-
- ChromeTestExtensionLoader* extension_loader() { return loader_.get(); }
-
- const Extension* extension() const { return extension_.get(); }
-
- const base::FilePath& extension_dir() const { return extension_dir_; }
-
- LoadErrorReporter* error_reporter() {
- return LoadErrorReporter::GetInstance();
- }
-
- private:
- // Derived classes must override this to persist the extension to disk.
- virtual void WriteExtensionData() = 0;
-
- base::FilePath extension_dir_;
- std::unique_ptr<ChromeTestExtensionLoader> loader_;
- scoped_refptr<const Extension> extension_;
-};
-
-// Fixture testing that declarative rules corresponding to the Declarative Net
-// Request API are correctly indexed, for both packed and unpacked extensions.
-// This only tests a single ruleset.
-class SingleRulesetIndexingTest : public RuleIndexingTestBase {
- public:
- SingleRulesetIndexingTest() = default;
-
- protected:
- void AddRule(const TestRule& rule) { rules_list_.push_back(rule); }
-
- // This takes precedence over the AddRule method.
- void SetRules(std::unique_ptr<base::Value> rules) {
- rules_value_ = std::move(rules);
- }
-
- void set_persist_invalid_json_file() { persist_invalid_json_file_ = true; }
-
- void set_persist_initial_indexed_ruleset() {
- persist_initial_indexed_ruleset_ = true;
- }
-
- void LoadAndExpectError(const std::string& expected_error) {
- RuleIndexingTestBase::LoadAndExpectError(expected_error,
- kJSONRulesFilename);
- }
-
- private:
- // RuleIndexingTestBase override:
- void WriteExtensionData() override {
- if (!rules_value_)
- rules_value_ = ToListValue(rules_list_);
-
- TestRulesetInfo info = {kJSONRulesFilename, std::move(*rules_value_)};
- WriteManifestAndRuleset(extension_dir(), info, {} /* hosts */);
-
- // Overwrite the JSON rules file with some invalid json.
- if (persist_invalid_json_file_) {
- std::string data = "invalid json";
- ASSERT_EQ(static_cast<int>(data.size()),
- base::WriteFile(extension_dir().AppendASCII(kJSONRulesFilename),
- data.c_str(), data.size()));
- }
-
- if (persist_initial_indexed_ruleset_) {
- std::string data = "user ruleset";
- base::FilePath ruleset_path = extension_dir().Append(
- file_util::GetIndexedRulesetRelativePath(kMinValidStaticRulesetID));
- ASSERT_TRUE(base::CreateDirectory(ruleset_path.DirName()));
- ASSERT_EQ(static_cast<int>(data.size()),
- base::WriteFile(ruleset_path, data.c_str(), data.size()));
- }
- }
-
- std::vector<TestRule> rules_list_;
- std::unique_ptr<base::Value> rules_value_;
- bool persist_invalid_json_file_ = false;
- bool persist_initial_indexed_ruleset_ = false;
-};
-
-TEST_P(SingleRulesetIndexingTest, DuplicateResourceTypes) {
- TestRule rule = CreateGenericRule();
- rule.condition->resource_types =
- std::vector<std::string>({"image", "stylesheet"});
- rule.condition->excluded_resource_types = std::vector<std::string>({"image"});
- AddRule(rule);
- LoadAndExpectError(
- GetParseError(ParseResult::ERROR_RESOURCE_TYPE_DUPLICATED, *rule.id));
-}
-
-TEST_P(SingleRulesetIndexingTest, EmptyRedirectRulePriority) {
- TestRule rule = CreateGenericRule();
- rule.action->type = std::string("redirect");
- rule.action->redirect.emplace();
- rule.action->redirect->url = std::string("https://google.com");
- rule.priority.reset();
- AddRule(rule);
- LoadAndExpectError(
- GetParseError(ParseResult::ERROR_EMPTY_RULE_PRIORITY, *rule.id));
-}
-
-TEST_P(SingleRulesetIndexingTest, EmptyRedirectRuleUrl) {
- TestRule rule = CreateGenericRule();
- rule.id = kMinValidID;
- AddRule(rule);
-
- rule.id = kMinValidID + 1;
- rule.action->type = std::string("redirect");
- rule.priority = kMinValidPriority;
- AddRule(rule);
-
- LoadAndExpectError(
- GetParseError(ParseResult::ERROR_INVALID_REDIRECT, *rule.id));
-}
-
-TEST_P(SingleRulesetIndexingTest, InvalidRuleID) {
- TestRule rule = CreateGenericRule();
- rule.id = kMinValidID - 1;
- AddRule(rule);
- LoadAndExpectError(
- GetParseError(ParseResult::ERROR_INVALID_RULE_ID, *rule.id));
-}
-
-TEST_P(SingleRulesetIndexingTest, InvalidRedirectRulePriority) {
- TestRule rule = CreateGenericRule();
- rule.action->type = std::string("redirect");
- rule.action->redirect.emplace();
- rule.action->redirect->url = std::string("https://google.com");
- rule.priority = kMinValidPriority - 1;
- AddRule(rule);
- LoadAndExpectError(
- GetParseError(ParseResult::ERROR_INVALID_RULE_PRIORITY, *rule.id));
-}
-
-TEST_P(SingleRulesetIndexingTest, NoApplicableResourceTypes) {
- TestRule rule = CreateGenericRule();
- rule.condition->excluded_resource_types = std::vector<std::string>(
- {"main_frame", "sub_frame", "stylesheet", "script", "image", "font",
- "object", "xmlhttprequest", "ping", "csp_report", "media", "websocket",
- "other"});
- AddRule(rule);
- LoadAndExpectError(
- GetParseError(ParseResult::ERROR_NO_APPLICABLE_RESOURCE_TYPES, *rule.id));
-}
-
-TEST_P(SingleRulesetIndexingTest, EmptyDomainsList) {
- TestRule rule = CreateGenericRule();
- rule.condition->domains = std::vector<std::string>();
- AddRule(rule);
- LoadAndExpectError(
- GetParseError(ParseResult::ERROR_EMPTY_DOMAINS_LIST, *rule.id));
-}
-
-TEST_P(SingleRulesetIndexingTest, EmptyResourceTypeList) {
- TestRule rule = CreateGenericRule();
- rule.condition->resource_types = std::vector<std::string>();
- AddRule(rule);
- LoadAndExpectError(
- GetParseError(ParseResult::ERROR_EMPTY_RESOURCE_TYPES_LIST, *rule.id));
-}
-
-TEST_P(SingleRulesetIndexingTest, EmptyURLFilter) {
- TestRule rule = CreateGenericRule();
- rule.condition->url_filter = std::string();
- AddRule(rule);
- LoadAndExpectError(
- GetParseError(ParseResult::ERROR_EMPTY_URL_FILTER, *rule.id));
-}
-
-TEST_P(SingleRulesetIndexingTest, InvalidRedirectURL) {
- TestRule rule = CreateGenericRule();
- rule.action->type = std::string("redirect");
- rule.action->redirect.emplace();
- rule.action->redirect->url = std::string("google");
- rule.priority = kMinValidPriority;
- AddRule(rule);
- LoadAndExpectError(
- GetParseError(ParseResult::ERROR_INVALID_REDIRECT_URL, *rule.id));
-}
-
-TEST_P(SingleRulesetIndexingTest, ListNotPassed) {
- SetRules(std::make_unique<base::DictionaryValue>());
- LoadAndExpectError(kErrorListNotPassed);
-}
-
-TEST_P(SingleRulesetIndexingTest, DuplicateIDS) {
- TestRule rule = CreateGenericRule();
- AddRule(rule);
- AddRule(rule);
- LoadAndExpectError(GetParseError(ParseResult::ERROR_DUPLICATE_IDS, *rule.id));
-}
-
-// Ensure that we limit the number of parse failure warnings shown.
-TEST_P(SingleRulesetIndexingTest, TooManyParseFailures) {
- const size_t kNumInvalidRules = 10;
- const size_t kNumValidRules = 6;
- const size_t kMaxUnparsedRulesWarnings = 5;
-
- size_t rule_id = kMinValidID;
- for (size_t i = 0; i < kNumInvalidRules; i++) {
- TestRule rule = CreateGenericRule();
- rule.id = rule_id++;
- rule.action->type = std::string("invalid_action_type");
- AddRule(rule);
- }
-
- for (size_t i = 0; i < kNumValidRules; i++) {
- TestRule rule = CreateGenericRule();
- rule.id = rule_id++;
- AddRule(rule);
- }
-
- extension_loader()->set_ignore_manifest_warnings(true);
- LoadAndExpectSuccess(kNumValidRules);
-
- // TODO(crbug.com/879355): CrxInstaller reloads the extension after moving it,
- // which causes it to lose the install warning. This should be fixed.
- if (GetParam() != ExtensionLoadType::PACKED) {
- const std::vector<InstallWarning>& expected_warnings =
- extension()->install_warnings();
- ASSERT_EQ(1u + kMaxUnparsedRulesWarnings, expected_warnings.size());
-
- InstallWarning warning("");
- warning.key = manifest_keys::kDeclarativeNetRequestKey;
- warning.specific = manifest_keys::kDeclarativeRuleResourcesKey;
-
- // The initial warnings should correspond to the first
- // |kMaxUnparsedRulesWarnings| rules, which couldn't be parsed.
- for (size_t i = 0; i < kMaxUnparsedRulesWarnings; i++) {
- EXPECT_EQ(expected_warnings[i].key, warning.key);
- EXPECT_EQ(expected_warnings[i].specific, warning.specific);
- EXPECT_THAT(expected_warnings[i].message,
- ::testing::HasSubstr("Parse error"));
- }
-
- warning.message = ErrorUtils::FormatErrorMessage(
- GetErrorWithFilename(kTooManyParseFailuresWarning),
- std::to_string(kMaxUnparsedRulesWarnings));
- EXPECT_EQ(warning, expected_warnings[kMaxUnparsedRulesWarnings]);
- }
-}
-
-// Ensures that rules which can't be parsed are ignored and cause an install
-// warning.
-TEST_P(SingleRulesetIndexingTest, InvalidJSONRules_StrongTypes) {
- {
- TestRule rule = CreateGenericRule();
- rule.id = 1;
- AddRule(rule);
- }
-
- {
- TestRule rule = CreateGenericRule();
- rule.id = 2;
- rule.action->type = std::string("invalid action");
- AddRule(rule);
- }
-
- {
- TestRule rule = CreateGenericRule();
- rule.id = 3;
- AddRule(rule);
- }
-
- {
- TestRule rule = CreateGenericRule();
- rule.id = 4;
- rule.condition->domain_type = std::string("invalid_domain_type");
- AddRule(rule);
- }
-
- extension_loader()->set_ignore_manifest_warnings(true);
- LoadAndExpectSuccess(2 /* rules count */);
-
- // TODO(crbug.com/879355): CrxInstaller reloads the extension after moving it,
- // which causes it to lose the install warning. This should be fixed.
- if (GetParam() != ExtensionLoadType::PACKED) {
- ASSERT_EQ(2u, extension()->install_warnings().size());
- std::vector<InstallWarning> expected_warnings;
-
- for (const auto& warning : extension()->install_warnings()) {
- EXPECT_EQ(extensions::manifest_keys::kDeclarativeNetRequestKey,
- warning.key);
- EXPECT_EQ(extensions::manifest_keys::kDeclarativeRuleResourcesKey,
- warning.specific);
- EXPECT_THAT(warning.message, ::testing::HasSubstr("Parse error"));
- }
- }
-}
-
-// Ensures that rules which can't be parsed are ignored and cause an install
-// warning.
-TEST_P(SingleRulesetIndexingTest, InvalidJSONRules_Parsed) {
- const char* kRules = R"(
- [
- {
- "id" : 1,
- "priority": 1,
- "condition" : [],
- "action" : {"type" : "block" }
- },
- {
- "id" : 2,
- "priority": 1,
- "condition" : {"urlFilter" : "abc"},
- "action" : {"type" : "block" }
- },
- {
- "id" : 3,
- "priority": 1,
- "invalidKey" : "invalidKeyValue",
- "condition" : {"urlFilter" : "example"},
- "action" : {"type" : "block" }
- },
- {
- "id" : "6",
- "priority": 1,
- "condition" : {"urlFilter" : "google"},
- "action" : {"type" : "block" }
- }
- ]
- )";
- SetRules(base::JSONReader::ReadDeprecated(kRules));
-
- extension_loader()->set_ignore_manifest_warnings(true);
- LoadAndExpectSuccess(1 /* rules count */);
-
- // TODO(crbug.com/879355): CrxInstaller reloads the extension after moving it,
- // which causes it to lose the install warning. This should be fixed.
- if (GetParam() != ExtensionLoadType::PACKED) {
- ASSERT_EQ(3u, extension()->install_warnings().size());
- std::vector<InstallWarning> expected_warnings;
-
- expected_warnings.emplace_back(
- ErrorUtils::FormatErrorMessage(
- GetErrorWithFilename(kRuleNotParsedWarning), "id 1",
- "'condition': expected dictionary, got list"),
- manifest_keys::kDeclarativeNetRequestKey,
- manifest_keys::kDeclarativeRuleResourcesKey);
- expected_warnings.emplace_back(
- ErrorUtils::FormatErrorMessage(
- GetErrorWithFilename(kRuleNotParsedWarning), "id 3",
- "found unexpected key 'invalidKey'"),
- manifest_keys::kDeclarativeNetRequestKey,
- manifest_keys::kDeclarativeRuleResourcesKey);
- expected_warnings.emplace_back(
- ErrorUtils::FormatErrorMessage(
- GetErrorWithFilename(kRuleNotParsedWarning), "index 4",
- "'id': expected id, got string"),
- manifest_keys::kDeclarativeNetRequestKey,
- manifest_keys::kDeclarativeRuleResourcesKey);
- EXPECT_EQ(expected_warnings, extension()->install_warnings());
- }
-}
-
-// Ensure that we can add up to MAX_NUMBER_OF_RULES.
-TEST_P(SingleRulesetIndexingTest, RuleCountLimitMatched) {
- TestRule rule = CreateGenericRule();
- for (int i = 0; i < dnr_api::MAX_NUMBER_OF_RULES; ++i) {
- rule.id = kMinValidID + i;
- rule.condition->url_filter = std::to_string(i);
- AddRule(rule);
- }
- LoadAndExpectSuccess(dnr_api::MAX_NUMBER_OF_RULES);
-}
-
-// Ensure that we get an install warning on exceeding the rule count limit.
-TEST_P(SingleRulesetIndexingTest, RuleCountLimitExceeded) {
- TestRule rule = CreateGenericRule();
- for (int i = 1; i <= dnr_api::MAX_NUMBER_OF_RULES + 1; ++i) {
- rule.id = kMinValidID + i;
- rule.condition->url_filter = std::to_string(i);
- AddRule(rule);
- }
-
- extension_loader()->set_ignore_manifest_warnings(true);
- LoadAndExpectSuccess(dnr_api::MAX_NUMBER_OF_RULES);
-
- // TODO(crbug.com/879355): CrxInstaller reloads the extension after moving it,
- // which causes it to lose the install warning. This should be fixed.
- if (GetParam() != ExtensionLoadType::PACKED) {
- ASSERT_EQ(1u, extension()->install_warnings().size());
- EXPECT_EQ(InstallWarning(GetErrorWithFilename(kRuleCountExceeded),
- manifest_keys::kDeclarativeNetRequestKey,
- manifest_keys::kDeclarativeRuleResourcesKey),
- extension()->install_warnings()[0]);
- }
-}
-
-// Ensure that regex rules which exceed the per rule memory limit are ignored
-// and raise an install warning.
-TEST_P(SingleRulesetIndexingTest, LargeRegexIgnored) {
- TestRule rule = CreateGenericRule();
- rule.condition->url_filter.reset();
- int id = kMinValidID;
-
- const int kNumSmallRegex = 5;
- std::string small_regex = "http://(yahoo|google)\\.com";
- for (int i = 0; i < kNumSmallRegex; i++, id++) {
- rule.id = id;
- rule.condition->regex_filter = small_regex;
- AddRule(rule);
- }
-
- const int kNumLargeRegex = 2;
- for (int i = 0; i < kNumLargeRegex; i++, id++) {
- rule.id = id;
- rule.condition->regex_filter = kLargeRegexFilter;
- AddRule(rule);
- }
-
- base::HistogramTester tester;
- extension_loader()->set_ignore_manifest_warnings(true);
-
- LoadAndExpectSuccess(kNumSmallRegex);
-
- tester.ExpectBucketCount(kIsLargeRegexHistogram, true, kNumLargeRegex);
- tester.ExpectBucketCount(kIsLargeRegexHistogram, false, kNumSmallRegex);
-
- // TODO(crbug.com/879355): CrxInstaller reloads the extension after moving it,
- // which causes it to lose the install warning. This should be fixed.
- if (GetParam() != ExtensionLoadType::PACKED) {
- InstallWarning warning_1 = GetLargeRegexWarning(kMinValidID + 5);
- InstallWarning warning_2 = GetLargeRegexWarning(kMinValidID + 6);
- EXPECT_THAT(
- extension()->install_warnings(),
- ::testing::UnorderedElementsAre(::testing::Eq(std::cref(warning_1)),
- ::testing::Eq(std::cref(warning_2))));
- }
-}
-
-// Test an extension with both an error and an install warning.
-TEST_P(SingleRulesetIndexingTest, WarningAndError) {
- // Add a large regex rule which will exceed the per rule memory limit and
- // cause an install warning.
- TestRule rule = CreateGenericRule();
- rule.condition->url_filter.reset();
- rule.id = kMinValidID;
- rule.condition->regex_filter = kLargeRegexFilter;
- AddRule(rule);
-
- // Add a regex rule with a syntax error.
- rule.condition->regex_filter = "abc(";
- rule.id = kMinValidID + 1;
- AddRule(rule);
-
- extension_loader()->set_ignore_manifest_warnings(true);
- LoadAndExpectError(
- GetParseError(ParseResult::ERROR_INVALID_REGEX_FILTER, kMinValidID + 1));
-}
-
-// Ensure that we get an install warning on exceeding the regex rule count
-// limit.
-TEST_P(SingleRulesetIndexingTest, RegexRuleCountExceeded) {
- TestRule regex_rule = CreateGenericRule();
- regex_rule.condition->url_filter.reset();
- int rule_id = kMinValidID;
- for (int i = 1; i <= dnr_api::MAX_NUMBER_OF_REGEX_RULES + 5; ++i, ++rule_id) {
- regex_rule.id = rule_id;
- regex_rule.condition->regex_filter = std::to_string(i);
- AddRule(regex_rule);
- }
-
- const int kCountNonRegexRules = 5;
- TestRule rule = CreateGenericRule();
- for (int i = 1; i <= kCountNonRegexRules; i++, ++rule_id) {
- rule.id = rule_id;
- rule.condition->url_filter = std::to_string(i);
- AddRule(rule);
- }
-
- extension_loader()->set_ignore_manifest_warnings(true);
- LoadAndExpectSuccess(dnr_api::MAX_NUMBER_OF_REGEX_RULES +
- kCountNonRegexRules);
- // TODO(crbug.com/879355): CrxInstaller reloads the extension after moving it,
- // which causes it to lose the install warning. This should be fixed.
- if (GetParam() != ExtensionLoadType::PACKED) {
- ASSERT_EQ(1u, extension()->install_warnings().size());
- EXPECT_EQ(InstallWarning(GetErrorWithFilename(kRegexRuleCountExceeded),
- manifest_keys::kDeclarativeNetRequestKey,
- manifest_keys::kDeclarativeRuleResourcesKey),
- extension()->install_warnings()[0]);
- }
-}
-
-TEST_P(SingleRulesetIndexingTest, InvalidJSONFile) {
- set_persist_invalid_json_file();
- // The error is returned by the JSON parser we use. Hence just test an error
- // is raised.
- LoadAndExpectError("");
-}
-
-TEST_P(SingleRulesetIndexingTest, EmptyRuleset) {
- LoadAndExpectSuccess(0 /* rules count */);
-}
-
-TEST_P(SingleRulesetIndexingTest, AddSingleRule) {
- AddRule(CreateGenericRule());
- LoadAndExpectSuccess(1 /* rules count */);
-}
-
-TEST_P(SingleRulesetIndexingTest, AddTwoRules) {
- TestRule rule = CreateGenericRule();
- AddRule(rule);
-
- rule.id = kMinValidID + 1;
- AddRule(rule);
- LoadAndExpectSuccess(2 /* rules count */);
-}
-
-// Test that we do not use an extension provided indexed ruleset.
-TEST_P(SingleRulesetIndexingTest, ExtensionWithIndexedRuleset) {
- set_persist_initial_indexed_ruleset();
- AddRule(CreateGenericRule());
- LoadAndExpectSuccess(1 /* rules count */);
-}
-
-// Tests that multiple static rulesets are correctly indexed.
-class MultipleRulesetsIndexingTest : public RuleIndexingTestBase {
- public:
- MultipleRulesetsIndexingTest() = default;
-
- protected:
- // RuleIndexingTestBase override:
- void WriteExtensionData() override {
- WriteManifestAndRulesets(extension_dir(), rulesets_, {} /* hosts */);
- }
-
- void AddRuleset(TestRulesetInfo info) {
- rulesets_.push_back(std::move(info));
- }
-
- private:
- std::vector<TestRulesetInfo> rulesets_;
-};
-
-// Tests an extension with multiple static rulesets.
-TEST_P(MultipleRulesetsIndexingTest, Success) {
- size_t kNumRulesets = 7;
- size_t kRulesPerRuleset = 10;
-
- std::vector<TestRule> rules;
- for (size_t i = 0; i < kRulesPerRuleset; ++i) {
- TestRule rule = CreateGenericRule();
- rule.id = kMinValidID + i;
- rules.push_back(rule);
- }
- base::Value rules_value = std::move(*ToListValue(rules));
-
- for (size_t i = 0; i < kNumRulesets; ++i) {
- TestRulesetInfo info;
- info.relative_file_path = std::to_string(i);
- info.rules_value = rules_value.Clone();
- AddRuleset(std::move(info));
- }
-
- LoadAndExpectSuccess(kNumRulesets *
- kRulesPerRuleset /* expected_indexed_rules_count */);
-}
-
-// Tests an extension with multiple empty rulesets.
-TEST_P(MultipleRulesetsIndexingTest, EmptyRulesets) {
- size_t kNumRulesets = 7;
-
- for (size_t i = 0; i < kNumRulesets; ++i) {
- TestRulesetInfo info;
- info.relative_file_path = std::to_string(i);
- info.rules_value = base::ListValue();
- AddRuleset(std::move(info));
- }
-
- LoadAndExpectSuccess(0u /* expected_indexed_rules_count */);
-}
-
-// Tests an extension with multiple static rulesets, with one of rulesets
-// specifying an invalid rules file.
-TEST_P(MultipleRulesetsIndexingTest, ListNotPassed) {
- {
- std::vector<TestRule> rules({CreateGenericRule()});
- TestRulesetInfo info1;
- info1.relative_file_path = "1";
- info1.rules_value = std::move(*ToListValue(rules));
- AddRuleset(std::move(info1));
- }
-
- {
- // Persist a ruleset with an invalid rules file.
- TestRulesetInfo info2;
- info2.relative_file_path = "2";
- info2.rules_value = base::DictionaryValue();
- AddRuleset(std::move(info2));
- }
-
- {
- TestRulesetInfo info3;
- info3.relative_file_path = "3";
- info3.rules_value = base::ListValue();
- AddRuleset(std::move(info3));
- }
-
- LoadAndExpectError(kErrorListNotPassed, "2" /* filename */);
-}
-
-// Tests an extension with multiple static rulesets with each ruleset generating
-// some install warnings.
-TEST_P(MultipleRulesetsIndexingTest, InstallWarnings) {
- size_t expected_rule_count = 0;
- std::vector<std::string> expected_warnings;
- {
- // Persist a ruleset with an install warning for a large regex.
- std::vector<TestRule> rules;
- TestRule rule = CreateGenericRule();
- rule.id = kMinValidID;
- rules.push_back(rule);
-
- rule.id = kMinValidID + 1;
- rule.condition->url_filter.reset();
- rule.condition->regex_filter = kLargeRegexFilter;
- rules.push_back(rule);
-
- TestRulesetInfo info;
- info.relative_file_path = "1.json";
- info.rules_value = std::move(*ToListValue(rules));
-
- expected_warnings.push_back(
- GetLargeRegexWarning(*rule.id, info.relative_file_path).message);
-
- AddRuleset(std::move(info));
-
- expected_rule_count += rules.size();
- }
-
- {
- // Persist a ruleset with an install warning for exceeding the rule count.
- std::vector<TestRule> rules;
- for (int i = 1; i <= dnr_api::MAX_NUMBER_OF_RULES + 1; ++i) {
- TestRule rule = CreateGenericRule();
- rule.id = kMinValidID + i;
- rules.push_back(rule);
- }
-
- TestRulesetInfo info;
- info.relative_file_path = "2.json";
- info.rules_value = std::move(*ToListValue(rules));
-
- expected_warnings.push_back(
- GetErrorWithFilename(kRuleCountExceeded, info.relative_file_path));
-
- AddRuleset(std::move(info));
-
- expected_rule_count += dnr_api::MAX_NUMBER_OF_RULES;
- }
-
- {
- // Persist a ruleset with an install warning for exceeding the regex rule
- // count.
- std::vector<TestRule> rules;
- TestRule regex_rule = CreateGenericRule();
- regex_rule.condition->url_filter.reset();
- int rule_id = kMinValidID;
- for (int i = 1; i <= dnr_api::MAX_NUMBER_OF_REGEX_RULES + 1;
- ++i, ++rule_id) {
- regex_rule.id = rule_id;
- regex_rule.condition->regex_filter = std::to_string(i);
- rules.push_back(regex_rule);
- }
-
- const int kCountNonRegexRules = 5;
- TestRule rule = CreateGenericRule();
- for (int i = 1; i <= kCountNonRegexRules; i++, ++rule_id) {
- rule.id = rule_id;
- rule.condition->url_filter = std::to_string(i);
- rules.push_back(rule);
- }
-
- TestRulesetInfo info;
- info.relative_file_path = "3.json";
- info.rules_value = std::move(*ToListValue(rules));
-
- expected_warnings.push_back(
- GetErrorWithFilename(kRegexRuleCountExceeded, info.relative_file_path));
-
- AddRuleset(std::move(info));
-
- expected_rule_count +=
- kCountNonRegexRules + dnr_api::MAX_NUMBER_OF_REGEX_RULES;
- }
-
- extension_loader()->set_ignore_manifest_warnings(true);
- LoadAndExpectSuccess(expected_rule_count);
-
- // TODO(crbug.com/879355): CrxInstaller reloads the extension after moving it,
- // which causes it to lose the install warning. This should be fixed.
- if (GetParam() != ExtensionLoadType::PACKED) {
- const std::vector<InstallWarning>& warnings =
- extension()->install_warnings();
- std::vector<std::string> warning_strings;
- for (const InstallWarning& warning : warnings)
- warning_strings.push_back(warning.message);
-
- EXPECT_THAT(warning_strings,
- ::testing::UnorderedElementsAreArray(expected_warnings));
- }
-}
-
-INSTANTIATE_TEST_SUITE_P(All,
- SingleRulesetIndexingTest,
- ::testing::Values(ExtensionLoadType::PACKED,
- ExtensionLoadType::UNPACKED));
-INSTANTIATE_TEST_SUITE_P(All,
- MultipleRulesetsIndexingTest,
- ::testing::Values(ExtensionLoadType::PACKED,
- ExtensionLoadType::UNPACKED));
-
-} // namespace
-} // namespace declarative_net_request
-} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/declarative_net_request/ruleset_manager_unittest.cc b/chromium/chrome/browser/extensions/api/declarative_net_request/ruleset_manager_unittest.cc
index 1a3e1fba0bf..2c18c239b23 100644
--- a/chromium/chrome/browser/extensions/api/declarative_net_request/ruleset_manager_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_net_request/ruleset_manager_unittest.cc
@@ -14,6 +14,7 @@
#include "chrome/browser/extensions/api/declarative_net_request/dnr_test_base.h"
#include "chrome/browser/extensions/chrome_test_extension_loader.h"
#include "chrome/browser/extensions/extension_util.h"
+#include "components/version_info/channel.h"
#include "extensions/browser/api/declarative_net_request/composite_matcher.h"
#include "extensions/browser/api/declarative_net_request/request_action.h"
#include "extensions/browser/api/declarative_net_request/ruleset_matcher.h"
@@ -27,10 +28,12 @@
#include "extensions/common/api/declarative_net_request.h"
#include "extensions/common/api/declarative_net_request/constants.h"
#include "extensions/common/api/declarative_net_request/test_utils.h"
+#include "extensions/common/features/feature_channel.h"
#include "extensions/common/file_util.h"
#include "extensions/common/manifest_handlers/background_info.h"
#include "extensions/common/url_pattern.h"
#include "net/http/http_util.h"
+#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
#include "url/origin.h"
@@ -42,8 +45,6 @@ namespace dnr_api = api::declarative_net_request;
namespace {
-constexpr char kJSONRulesFilename[] = "rules_file.json";
-
class RulesetManagerTest : public DNRTestBase {
public:
RulesetManagerTest() {}
@@ -72,7 +73,9 @@ class RulesetManagerTest : public DNRTestBase {
? ConfigFlag::kConfig_HasBackgroundScript
: ConfigFlag::kConfig_None;
- TestRulesetInfo info = {kJSONRulesFilename, std::move(*ToListValue(rules))};
+ constexpr char kRulesetID[] = "id";
+ constexpr char kJSONRulesFilename[] = "rules_file.json";
+ TestRulesetInfo info(kRulesetID, kJSONRulesFilename, *ToListValue(rules));
WriteManifestAndRuleset(extension_dir, info, host_permissions, flags);
last_loaded_extension_ =
@@ -169,7 +172,7 @@ TEST_P(RulesetManagerTest, MultipleRulesets) {
((*request.dnr_actions)[0] ==
CreateRequestActionForTesting(
RequestActionType::BLOCK, rule_id, kDefaultPriority,
- dnr_api::SOURCE_TYPE_MANIFEST, extension_id));
+ kMinValidStaticRulesetID, extension_id));
};
for (int mask = 0; mask < 4; mask++) {
@@ -248,7 +251,7 @@ TEST_P(RulesetManagerTest, IncognitoRequests) {
ASSERT_EQ(1u, request_info.dnr_actions->size());
EXPECT_EQ(CreateRequestActionForTesting(
RequestActionType::BLOCK, *rule_one.id, kDefaultPriority,
- dnr_api::SOURCE_TYPE_MANIFEST, last_loaded_extension()->id()),
+ kMinValidStaticRulesetID, last_loaded_extension()->id()),
(*request_info.dnr_actions)[0]);
request_info.dnr_actions.reset();
@@ -262,7 +265,7 @@ TEST_P(RulesetManagerTest, IncognitoRequests) {
ASSERT_EQ(1u, request_info.dnr_actions->size());
EXPECT_EQ(CreateRequestActionForTesting(
RequestActionType::BLOCK, *rule_one.id, kDefaultPriority,
- dnr_api::SOURCE_TYPE_MANIFEST, last_loaded_extension()->id()),
+ kMinValidStaticRulesetID, last_loaded_extension()->id()),
(*request_info.dnr_actions)[0]);
request_info.dnr_actions.reset();
@@ -270,7 +273,7 @@ TEST_P(RulesetManagerTest, IncognitoRequests) {
ASSERT_EQ(1u, request_info.dnr_actions->size());
EXPECT_EQ(CreateRequestActionForTesting(
RequestActionType::BLOCK, *rule_one.id, kDefaultPriority,
- dnr_api::SOURCE_TYPE_MANIFEST, last_loaded_extension()->id()),
+ kMinValidStaticRulesetID, last_loaded_extension()->id()),
(*request_info.dnr_actions)[0]);
request_info.dnr_actions.reset();
}
@@ -315,7 +318,7 @@ TEST_P(RulesetManagerTest, TotalEvaluationTimeHistogram) {
ASSERT_EQ(1u, example_com_request.dnr_actions->size());
EXPECT_EQ(CreateRequestActionForTesting(
RequestActionType::BLOCK, *rule.id, kDefaultPriority,
- dnr_api::SOURCE_TYPE_MANIFEST, last_loaded_extension()->id()),
+ kMinValidStaticRulesetID, last_loaded_extension()->id()),
(*example_com_request.dnr_actions)[0]);
tester.ExpectTotalCount(kHistogramName, 1);
@@ -350,7 +353,7 @@ TEST_P(RulesetManagerTest, Redirect) {
const char* kExampleURL = "http://example.com";
RequestAction expected_redirect_action = CreateRequestActionForTesting(
RequestActionType::REDIRECT, *rule.id, *rule.priority,
- dnr_api::SOURCE_TYPE_MANIFEST, last_loaded_extension()->id());
+ kMinValidStaticRulesetID, last_loaded_extension()->id());
expected_redirect_action.redirect_url = GURL("http://google.com");
WebRequestInfo request_1(GetRequestParamsForURL(kExampleURL, base::nullopt));
manager()->EvaluateRequest(request_1, is_incognito_context);
@@ -424,7 +427,7 @@ TEST_P(RulesetManagerTest, ExtensionScheme) {
ASSERT_EQ(1u, request_1.dnr_actions->size());
EXPECT_EQ(CreateRequestActionForTesting(
RequestActionType::BLOCK, kMinValidID, kDefaultPriority,
- dnr_api::SOURCE_TYPE_MANIFEST, extension_1->id()),
+ kMinValidStaticRulesetID, extension_1->id()),
(*request_1.dnr_actions)[0]);
// Ensure that the background page for |extension_1| won't be blocked or
@@ -453,77 +456,135 @@ TEST_P(RulesetManagerTest, ExtensionScheme) {
EXPECT_TRUE(request_4.dnr_actions->empty());
}
-// Test that headers to be removed in removeHeaders rules are attributed to the
-// correct extension.
-TEST_P(RulesetManagerTest, RemoveHeaders) {
+// Test that the correct modifyHeaders actions are returned for each extension.
+TEST_P(RulesetManagerTest, ModifyHeaders) {
+ // TODO(crbug.com/947591): Remove the channel override once implementation of
+ // modifyHeaders action is complete.
+ ScopedCurrentChannel channel(::version_info::Channel::UNKNOWN);
+
const Extension* extension_1 = nullptr;
const Extension* extension_2 = nullptr;
- // Add an extension with a background page which removes the "cookie" and
- // "setCookie" headers.
+
+ // Add an extension which removes the "header1" and "header2" headers.
{
std::unique_ptr<CompositeMatcher> matcher;
TestRule rule = CreateGenericRule();
rule.condition->url_filter = std::string("*");
- rule.action->type = std::string("removeHeaders");
- rule.action->remove_headers_list =
- std::vector<std::string>({"cookie", "setCookie"});
+ rule.action->type = std::string("modifyHeaders");
+ rule.action->request_headers =
+ std::vector<TestHeaderInfo>({TestHeaderInfo("header1", "remove"),
+ TestHeaderInfo("header2", "remove")});
- ASSERT_NO_FATAL_FAILURE(
- CreateMatcherForRules({rule}, "test extension", &matcher));
+ ASSERT_NO_FATAL_FAILURE(CreateMatcherForRules(
+ {rule}, "test extension", &matcher, {URLPattern::kAllUrlsPattern}));
extension_1 = last_loaded_extension();
manager()->AddRuleset(extension_1->id(), std::move(matcher));
}
- // Add another extension with a background page which removes the "cookie" and
- // "referer" headers.
+ // Add another extension which removes the "header1" and "header3" headers.
{
std::unique_ptr<CompositeMatcher> matcher;
TestRule rule = CreateGenericRule();
rule.condition->url_filter = std::string("*");
- rule.action->type = std::string("removeHeaders");
- rule.action->remove_headers_list =
- std::vector<std::string>({"cookie", "referer"});
+ rule.action->type = std::string("modifyHeaders");
+ rule.action->request_headers =
+ std::vector<TestHeaderInfo>({TestHeaderInfo("header1", "remove")});
+ rule.action->response_headers =
+ std::vector<TestHeaderInfo>({TestHeaderInfo("header3", "remove")});
- ASSERT_NO_FATAL_FAILURE(
- CreateMatcherForRules({rule}, "test extension 2", &matcher));
+ ASSERT_NO_FATAL_FAILURE(CreateMatcherForRules(
+ {rule}, "test extension 2", &matcher, {URLPattern::kAllUrlsPattern}));
extension_2 = last_loaded_extension();
manager()->AddRuleset(extension_2->id(), std::move(matcher));
}
- EXPECT_EQ(2u, manager()->GetMatcherCountForTest());
+ ASSERT_EQ(2u, manager()->GetMatcherCountForTest());
- // Create a request with the "cookie" and "referer" request headers, and the
- // "set-cookie" response header.
- WebRequestInfo request_1(GetRequestParamsForURLWithHeaders(
- "http://example.com", std::vector<std::string>({"cookie", "referer"})));
- request_1.response_headers = base::MakeRefCounted<net::HttpResponseHeaders>(
- net::HttpUtil::AssembleRawHeaders("HTTP/1.1 200 OK\r\n"
- "Content-Type: text/plain; UTF-8\r\n"
- "Set-Cookie: custom/value\r\n"));
+ WebRequestInfo request(GetRequestParamsForURL("http://example.com"));
const std::vector<RequestAction>& actual_actions =
- manager()->EvaluateRequest(request_1, false /*is_incognito_context*/);
- ASSERT_EQ(2u, actual_actions.size());
+ manager()->EvaluateRequest(request, false /*is_incognito_context*/);
- // Removal of the cookie header should be attributed to |extension_2| because
- // it was installed later than |extension_1| and thus has more priority.
+ // Create the expected RequestAction for |extension_2|.
RequestAction expected_action_1 = CreateRequestActionForTesting(
- RequestActionType::REMOVE_HEADERS, kMinValidID, kDefaultPriority,
- dnr_api::SOURCE_TYPE_MANIFEST, extension_2->id());
- expected_action_1.request_headers_to_remove.push_back(
- net::HttpRequestHeaders::kCookie);
+ RequestActionType::MODIFY_HEADERS, kMinValidID, kDefaultPriority,
+ kMinValidStaticRulesetID, extension_2->id());
+ expected_action_1.request_headers_to_modify = {
+ RequestAction::HeaderInfo("header1", dnr_api::HEADER_OPERATION_REMOVE)};
+ expected_action_1.response_headers_to_modify = {
+ RequestAction::HeaderInfo("header3", dnr_api::HEADER_OPERATION_REMOVE)};
+
+ // Create the expected RequestAction for |extension_1|.
+ RequestAction expected_action_2 = CreateRequestActionForTesting(
+ RequestActionType::MODIFY_HEADERS, kMinValidID, kDefaultPriority,
+ kMinValidStaticRulesetID, extension_1->id());
+ expected_action_2.request_headers_to_modify = {
+ RequestAction::HeaderInfo("header1", dnr_api::HEADER_OPERATION_REMOVE),
+ RequestAction::HeaderInfo("header2", dnr_api::HEADER_OPERATION_REMOVE)};
+
+ // Verify that the list of actions is sorted in descending order of extension
+ // priority.
+ EXPECT_THAT(actual_actions,
+ ::testing::ElementsAre(
+ ::testing::Eq(::testing::ByRef(expected_action_1)),
+ ::testing::Eq(::testing::ByRef(expected_action_2))));
+}
- // Removal of the referer header should be attributed to |extension_2|.
- expected_action_1.request_headers_to_remove.push_back(
- net::HttpRequestHeaders::kReferer);
+// Test that an extension's modify header rules are applied on a request only if
+// it has host permissions for the request.
+TEST_P(RulesetManagerTest, ModifyHeaders_HostPermissions) {
+ // TODO(crbug.com/947591): Remove the channel override once implementation of
+ // modifyHeaders action is complete.
+ ScopedCurrentChannel channel(::version_info::Channel::UNKNOWN);
- RequestAction expected_action_2 = CreateRequestActionForTesting(
- RequestActionType::REMOVE_HEADERS, kMinValidID, kDefaultPriority,
- dnr_api::SOURCE_TYPE_MANIFEST, extension_1->id());
- expected_action_2.response_headers_to_remove.push_back("set-cookie");
+ // Add an extension which removes the "header1" header with host permissions
+ // for example.com.
+ std::unique_ptr<CompositeMatcher> matcher;
+ TestRule rule = CreateGenericRule();
+ rule.condition->url_filter = std::string("*");
+ rule.action->type = std::string("modifyHeaders");
+ rule.action->request_headers =
+ std::vector<TestHeaderInfo>({TestHeaderInfo("header1", "remove")});
- EXPECT_EQ(expected_action_1, actual_actions[0]);
- EXPECT_EQ(expected_action_2, actual_actions[1]);
+ ASSERT_NO_FATAL_FAILURE(CreateMatcherForRules(
+ {rule}, "test extension", &matcher, {"*://example.com/*"}));
+ const Extension* extension = last_loaded_extension();
+ manager()->AddRuleset(extension->id(), std::move(matcher));
+
+ ASSERT_EQ(1u, manager()->GetMatcherCountForTest());
+
+ {
+ WebRequestInfo request(GetRequestParamsForURL("http://example.com"));
+ const std::vector<RequestAction>& actual_actions =
+ manager()->EvaluateRequest(request, false /*is_incognito_context*/);
+
+ RequestAction expected_action = CreateRequestActionForTesting(
+ RequestActionType::MODIFY_HEADERS, kMinValidID, kDefaultPriority,
+ kMinValidStaticRulesetID, extension->id());
+ expected_action.request_headers_to_modify = {
+ RequestAction::HeaderInfo("header1", dnr_api::HEADER_OPERATION_REMOVE)};
+
+ EXPECT_THAT(actual_actions, ::testing::ElementsAre(::testing::Eq(
+ ::testing::ByRef(expected_action))));
+ }
+
+ {
+ WebRequestInfo request(GetRequestParamsForURL("http://nopermissions.com"));
+ const std::vector<RequestAction>& actual_actions =
+ manager()->EvaluateRequest(request, false /*is_incognito_context*/);
+ EXPECT_TRUE(actual_actions.empty());
+ }
+
+ {
+ // Has access to url but no access to initiator, so no actions should be
+ // returned.
+ WebRequestInfo request(GetRequestParamsForURL(
+ "http://example.com",
+ url::Origin::Create(GURL("http://nopermissions.com"))));
+ const std::vector<RequestAction>& actual_actions =
+ manager()->EvaluateRequest(request, false /*is_incognito_context*/);
+ EXPECT_TRUE(actual_actions.empty());
+ }
}
TEST_P(RulesetManagerTest, HostPermissionForInitiator) {
@@ -610,7 +671,7 @@ TEST_P(RulesetManagerTest, HostPermissionForInitiator) {
for (const auto& test : cases) {
RequestAction redirect_action = CreateRequestActionForTesting(
RequestActionType::REDIRECT, kMinValidID, kMinValidPriority,
- dnr_api::SOURCE_TYPE_MANIFEST, redirect_extension_id);
+ kMinValidStaticRulesetID, redirect_extension_id);
redirect_action.redirect_url = GURL("https://foo.com/");
verify_test_case(
@@ -627,7 +688,7 @@ TEST_P(RulesetManagerTest, HostPermissionForInitiator) {
for (const auto& test : cases) {
RequestAction block_action = CreateRequestActionForTesting(
RequestActionType::BLOCK, kMinValidID, kDefaultPriority,
- dnr_api::SOURCE_TYPE_MANIFEST, blocking_extension_id);
+ kMinValidStaticRulesetID, blocking_extension_id);
verify_test_case(
test.url, test.initiator,
diff --git a/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_apitest.cc b/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_apitest.cc
index 8d08473ddd7..b411b26d4a2 100644
--- a/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_apitest.cc
@@ -16,6 +16,7 @@
#include "chrome/common/chrome_paths.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "extensions/common/switches.h"
#include "net/dns/mock_host_resolver.h"
diff --git a/chromium/chrome/browser/extensions/api/developer_private/developer_private_api.cc b/chromium/chrome/browser/extensions/api/developer_private/developer_private_api.cc
index 331cb00c50d..c496bd428c4 100644
--- a/chromium/chrome/browser/extensions/api/developer_private/developer_private_api.cc
+++ b/chromium/chrome/browser/extensions/api/developer_private/developer_private_api.cc
@@ -907,7 +907,7 @@ DeveloperPrivateUpdateExtensionConfigurationFunction::Run() {
if (!UserCanModifyExtensionConfiguration(extension,
browser_context(),
&error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
util::SetAllowFileAccess(
extension->id(), browser_context(), *update.file_access);
diff --git a/chromium/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc b/chromium/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc
index d6f2776bc42..42ae22ba000 100644
--- a/chromium/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc
@@ -58,7 +58,6 @@
#include "extensions/common/value_builder.h"
#include "extensions/test/test_extension_dir.h"
#include "services/data_decoder/data_decoder_service.h"
-#include "services/service_manager/public/cpp/connector.h"
#include "services/service_manager/public/cpp/test/test_connector_factory.h"
namespace extensions {
@@ -416,7 +415,7 @@ TEST_F(DeveloperPrivateApiUnitTest, DeveloperPrivateReload) {
scoped_refptr<const Extension> unloaded_extension =
registry_observer.WaitForExtensionUnloaded();
EXPECT_EQ(extension, unloaded_extension);
- const Extension* reloaded_extension =
+ scoped_refptr<const Extension> reloaded_extension =
registry_observer.WaitForExtensionLoaded();
EXPECT_EQ(extension_id, reloaded_extension->id());
}
@@ -760,7 +759,8 @@ TEST_F(DeveloperPrivateApiUnitTest, LoadUnpackedRetryId) {
"\"retryGuid\": \"%s\"}]",
retry_guid.c_str()),
profile());
- const Extension* extension = observer.WaitForExtensionLoaded();
+ scoped_refptr<const Extension> extension =
+ observer.WaitForExtensionLoaded();
ASSERT_TRUE(extension);
EXPECT_EQ(extension->path(), path);
}
@@ -895,7 +895,8 @@ TEST_F(DeveloperPrivateApiUnitTest, ReloadBadExtensionToLoadUnpackedRetry) {
"retryGuid": "%s"}])",
retry_guid.c_str());
api_test_utils::RunFunction(function.get(), args, profile());
- const Extension* extension = observer.WaitForExtensionLoaded();
+ scoped_refptr<const Extension> extension =
+ observer.WaitForExtensionLoaded();
ASSERT_TRUE(extension);
EXPECT_EQ(extension->path(), path);
EXPECT_TRUE(registry()->enabled_extensions().Contains(id));
@@ -943,7 +944,8 @@ TEST_F(DeveloperPrivateApiUnitTest,
function->SetRenderFrameHost(web_contents->GetMainFrame());
TestExtensionRegistryObserver observer(registry());
api_test_utils::RunFunction(function.get(), kLoadUnpackedArgs, profile());
- const Extension* extension = observer.WaitForExtensionLoaded();
+ scoped_refptr<const Extension> extension =
+ observer.WaitForExtensionLoaded();
ASSERT_TRUE(extension);
EXPECT_EQ(extension->path(), path);
}
@@ -1327,7 +1329,8 @@ TEST_F(DeveloperPrivateApiUnitTest, InstallDroppedFileCrx) {
TestExtensionRegistryObserver observer(registry());
ASSERT_TRUE(api_test_utils::RunFunction(function.get(), "[]", profile()))
<< function->GetError();
- const Extension* extension = observer.WaitForExtensionInstalled();
+ scoped_refptr<const Extension> extension =
+ observer.WaitForExtensionInstalled();
ASSERT_TRUE(extension);
EXPECT_EQ("foo", extension->name());
}
@@ -1350,7 +1353,8 @@ TEST_F(DeveloperPrivateApiUnitTest, InstallDroppedFileUserScript) {
TestExtensionRegistryObserver observer(registry());
ASSERT_TRUE(api_test_utils::RunFunction(function.get(), "[]", profile()))
<< function->GetError();
- const Extension* extension = observer.WaitForExtensionInstalled();
+ scoped_refptr<const Extension> extension =
+ observer.WaitForExtensionInstalled();
ASSERT_TRUE(extension);
EXPECT_EQ("My user script", extension->name());
}
@@ -1475,14 +1479,7 @@ TEST_F(DeveloperPrivateApiUnitTest, RemoveHostPermission) {
EXPECT_FALSE(modifier.HasGrantedHostPermission(kMapsGoogleCom));
}
-// This test is flaky on chromeos.
-// https://crbug.com/937355
-#if defined(OS_CHROMEOS)
-#define MAYBE_UpdateHostAccess DISABLED_UpdateHostAccess
-#else
-#define MAYBE_UpdateHostAccess UpdateHostAccess
-#endif
-TEST_F(DeveloperPrivateApiUnitTest, MAYBE_UpdateHostAccess) {
+TEST_F(DeveloperPrivateApiUnitTest, UpdateHostAccess) {
scoped_refptr<const Extension> extension =
ExtensionBuilder("test").AddPermission("<all_urls>").Build();
service()->AddExtension(extension.get());
@@ -1775,7 +1772,8 @@ TEST_F(DeveloperPrivateApiUnitTest, InstallDroppedFileZip) {
TestExtensionRegistryObserver observer(registry());
ASSERT_TRUE(api_test_utils::RunFunction(function.get(), "[]", profile()))
<< function->GetError();
- const Extension* extension = observer.WaitForExtensionInstalled();
+ scoped_refptr<const Extension> extension =
+ observer.WaitForExtensionInstalled();
ASSERT_TRUE(extension);
EXPECT_EQ("Simple Empty Extension", extension->name());
}
diff --git a/chromium/chrome/browser/extensions/api/developer_private/developer_private_apitest.cc b/chromium/chrome/browser/extensions/api/developer_private/developer_private_apitest.cc
index 0c2d6d323aa..b7409f0572e 100644
--- a/chromium/chrome/browser/extensions/api/developer_private/developer_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/developer_private/developer_private_apitest.cc
@@ -11,6 +11,7 @@
#include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/common/chrome_paths.h"
#include "content/public/browser/render_frame_host.h"
+#include "content/public/test/browser_test.h"
#include "extensions/browser/app_window/app_window.h"
#include "extensions/browser/app_window/app_window_registry.h"
diff --git a/chromium/chrome/browser/extensions/api/developer_private/extension_info_generator.cc b/chromium/chrome/browser/extensions/api/developer_private/extension_info_generator.cc
index 59866f90ad8..6c4f2b9c43f 100644
--- a/chromium/chrome/browser/extensions/api/developer_private/extension_info_generator.cc
+++ b/chromium/chrome/browser/extensions/api/developer_private/extension_info_generator.cc
@@ -42,6 +42,7 @@
#include "extensions/browser/path_util.h"
#include "extensions/browser/ui_util.h"
#include "extensions/browser/warning_service.h"
+#include "extensions/common/api/extension_action/action_info.h"
#include "extensions/common/extension_set.h"
#include "extensions/common/install_warning.h"
#include "extensions/common/manifest.h"
@@ -62,6 +63,11 @@
#include "ui/gfx/image/image.h"
#include "ui/gfx/skbitmap_operations.h"
+#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
+#include "chrome/browser/supervised_user/supervised_user_service.h"
+#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
+#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
+
namespace extensions {
namespace developer = api::developer_private;
@@ -184,20 +190,22 @@ void ConstructCommands(CommandService* command_service,
command_value.is_extension_action = is_extension_action;
return command_value;
};
+ // TODO(https://crbug.com/1067130): Extensions shouldn't be able to specify
+ // commands for actions they don't have, so we should just be able to query
+ // for a single action type.
bool active = false;
Command browser_action;
- if (command_service->GetBrowserActionCommand(extension_id,
- CommandService::ALL,
- &browser_action,
- &active)) {
+ if (command_service->GetExtensionActionCommand(
+ extension_id, ActionInfo::TYPE_BROWSER, CommandService::ALL,
+ &browser_action, &active)) {
commands->push_back(construct_command(browser_action, active, true));
}
Command page_action;
- if (command_service->GetPageActionCommand(extension_id,
- CommandService::ALL,
- &page_action,
- &active)) {
+ active = false;
+ if (command_service->GetExtensionActionCommand(
+ extension_id, ActionInfo::TYPE_PAGE, CommandService::ALL,
+ &page_action, &active)) {
commands->push_back(construct_command(page_action, active, true));
}
@@ -404,7 +412,12 @@ ExtensionInfoGenerator::ExtensionInfoGenerator(
warning_service_(WarningService::Get(browser_context)),
error_console_(ErrorConsole::Get(browser_context)),
image_loader_(ImageLoader::Get(browser_context)),
- pending_image_loads_(0u) {}
+#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
+ supervised_user_service_(
+ SupervisedUserServiceFactory::GetForBrowserContext(browser_context)),
+#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
+ pending_image_loads_(0u) {
+}
ExtensionInfoGenerator::~ExtensionInfoGenerator() {
}
@@ -556,9 +569,19 @@ void ExtensionInfoGenerator::CreateExtensionInfoHelper(
0;
info->disable_reasons.blocked_by_policy =
(disable_reasons & disable_reason::DISABLE_BLOCKED_BY_POLICY) != 0;
- info->disable_reasons.custodian_approval_required =
+ bool custodian_approval_required =
(disable_reasons & disable_reason::DISABLE_CUSTODIAN_APPROVAL_REQUIRED) !=
0;
+ info->disable_reasons.custodian_approval_required =
+ custodian_approval_required;
+#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
+ bool permissions_increase =
+ (disable_reasons & disable_reason::DISABLE_PERMISSIONS_INCREASE) != 0;
+ info->disable_reasons.parent_disabled_permissions =
+ !supervised_user_service_
+ ->GetSupervisedUserExtensionsMayRequestPermissionsPref() &&
+ (custodian_approval_required || permissions_increase);
+#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
// Error collection.
bool error_console_enabled =
diff --git a/chromium/chrome/browser/extensions/api/developer_private/extension_info_generator.h b/chromium/chrome/browser/extensions/api/developer_private/extension_info_generator.h
index 83e71070fbf..dfc139c4b0a 100644
--- a/chromium/chrome/browser/extensions/api/developer_private/extension_info_generator.h
+++ b/chromium/chrome/browser/extensions/api/developer_private/extension_info_generator.h
@@ -12,8 +12,13 @@
#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
+#include "chrome/common/buildflags.h"
#include "chrome/common/extensions/api/developer_private.h"
+#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
+class SupervisedUserService;
+#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
+
namespace content {
class BrowserContext;
}
@@ -81,6 +86,9 @@ class ExtensionInfoGenerator {
WarningService* warning_service_;
ErrorConsole* error_console_;
ImageLoader* image_loader_;
+#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
+ SupervisedUserService* supervised_user_service_;
+#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
// The number of pending image loads.
size_t pending_image_loads_;
diff --git a/chromium/chrome/browser/extensions/api/downloads/downloads_api.cc b/chromium/chrome/browser/extensions/api/downloads/downloads_api.cc
index 49f2bad96fa..2ae57ab4ddd 100644
--- a/chromium/chrome/browser/extensions/api/downloads/downloads_api.cc
+++ b/chromium/chrome/browser/extensions/api/downloads/downloads_api.cc
@@ -443,8 +443,10 @@ void InitSortTypeMap(SortTypeMap* sorter_types_ptr) {
*sorter_types_ptr = SortTypeMap(std::move(v));
}
-bool IsNotTemporaryDownloadFilter(const DownloadItem& download_item) {
- return !download_item.IsTemporary();
+bool ShouldExport(const DownloadItem& download_item) {
+ return !download_item.IsTemporary() &&
+ download_item.GetDownloadSource() !=
+ download::DownloadSource::INTERNAL_API;
}
// Set |manager| to the on-record DownloadManager, and |incognito_manager| to
@@ -617,7 +619,7 @@ void RunDownloadQuery(
if (incognito_manager)
incognito_manager->GetAllDownloads(&all_items);
}
- query_out.AddFilter(base::Bind(&IsNotTemporaryDownloadFilter));
+ query_out.AddFilter(base::Bind(&ShouldExport));
query_out.Search(all_items.begin(), all_items.end(), results);
}
@@ -1020,7 +1022,7 @@ ExtensionFunction::ResponseAction DownloadsDownloadFunction::Run() {
std::string error;
if (Fault(!download_url.is_valid(), download_extension_errors::kInvalidURL,
&error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
net::NetworkTrafficAnnotationTag traffic_annotation =
net::DefineNetworkTrafficAnnotation("downloads_api_run_async", R"(
@@ -1181,7 +1183,7 @@ ExtensionFunction::ResponseAction DownloadsSearchFunction::Run() {
std::string error;
RunDownloadQuery(params->query, manager, incognito_manager, &error, &results);
if (!error.empty())
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
std::unique_ptr<base::ListValue> json_results(new base::ListValue());
for (DownloadManager::DownloadVector::const_iterator it = results.begin();
@@ -1214,7 +1216,7 @@ ExtensionFunction::ResponseAction DownloadsPauseFunction::Run() {
if (InvalidId(download_item, &error) ||
Fault(download_item->GetState() != DownloadItem::IN_PROGRESS,
download_extension_errors::kNotInProgress, &error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
// If the item is already paused, this is a no-op and the operation will
// silently succeed.
@@ -1237,7 +1239,7 @@ ExtensionFunction::ResponseAction DownloadsResumeFunction::Run() {
if (InvalidId(download_item, &error) ||
Fault(download_item->IsPaused() && !download_item->CanResume(),
download_extension_errors::kNotResumable, &error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
// Note that if the item isn't paused, this will be a no-op, and the extension
// call will seem successful.
@@ -1281,7 +1283,7 @@ ExtensionFunction::ResponseAction DownloadsEraseFunction::Run() {
std::string error;
RunDownloadQuery(params->query, manager, incognito_manager, &error, &results);
if (!error.empty())
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
std::unique_ptr<base::ListValue> json_results(new base::ListValue());
for (DownloadManager::DownloadVector::const_iterator it = results.begin();
it != results.end(); ++it) {
@@ -1310,7 +1312,7 @@ ExtensionFunction::ResponseAction DownloadsRemoveFileFunction::Run() {
download_extension_errors::kNotComplete, &error) ||
Fault(download_item->GetFileExternallyRemoved(),
download_extension_errors::kFileAlreadyDeleted, &error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
RecordApiFunctions(DOWNLOADS_FUNCTION_REMOVE_FILE);
download_item->DeleteFile(
base::BindOnce(&DownloadsRemoveFileFunction::Done, this));
@@ -1353,7 +1355,7 @@ void DownloadsAcceptDangerFunction::PromptOrWait(int download_id, int retries) {
download_extension_errors::kNotDangerous, &error) ||
Fault(!web_contents, download_extension_errors::kInvisibleContext,
&error)) {
- Respond(Error(error));
+ Respond(Error(std::move(error)));
return;
}
bool visible = platform_util::IsVisible(web_contents->GetNativeView());
@@ -1393,7 +1395,7 @@ void DownloadsAcceptDangerFunction::DangerPromptCallback(
if (InvalidId(download_item, &error) ||
Fault(download_item->GetState() != DownloadItem::IN_PROGRESS,
download_extension_errors::kNotInProgress, &error)) {
- Respond(Error(error));
+ Respond(Error(std::move(error)));
return;
}
switch (action) {
@@ -1421,7 +1423,7 @@ ExtensionFunction::ResponseAction DownloadsShowFunction::Run() {
browser_context(), include_incognito_information(), params->download_id);
std::string error;
if (InvalidId(download_item, &error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
download_item->ShowDownloadInShell();
RecordApiFunctions(DOWNLOADS_FUNCTION_SHOW);
return RespondNow(NoArguments());
@@ -1465,16 +1467,16 @@ ExtensionFunction::ResponseAction DownloadsOpenFunction::Run() {
Fault(!extension()->permissions_data()->HasAPIPermission(
APIPermission::kDownloadsOpen),
download_extension_errors::kOpenPermission, &error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
Browser* browser = ChromeExtensionFunctionDetails(this).GetCurrentBrowser();
if (Fault(!browser, download_extension_errors::kInvisibleContext, &error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
content::WebContents* web_contents =
browser->tab_strip_model()->GetActiveWebContents();
if (Fault(!web_contents, download_extension_errors::kInvisibleContext,
&error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
// Extensions with debugger permission could fake user gestures and should
// not be trusted.
if (GetSenderWebContents() &&
@@ -1503,14 +1505,14 @@ void DownloadsOpenFunction::OpenPromptDone(int download_id, bool accept) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
std::string error;
if (Fault(!accept, download_extension_errors::kOpenPermission, &error)) {
- Respond(Error(error));
+ Respond(Error(std::move(error)));
return;
}
DownloadItem* download_item = GetDownload(
browser_context(), include_incognito_information(), download_id);
if (Fault(!download_item, download_extension_errors::kFileAlreadyDeleted,
&error)) {
- Respond(Error(error));
+ Respond(Error(std::move(error)));
return;
}
download_item->OpenDownload();
@@ -1601,7 +1603,7 @@ ExtensionFunction::ResponseAction DownloadsGetFileIconFunction::Run() {
if (InvalidId(download_item, &error) ||
Fault(download_item->GetTargetFilePath().empty(),
download_extension_errors::kEmptyFile, &error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
// In-progress downloads return the intermediate filename for GetFullPath()
// which doesn't have the final extension. Therefore a good file icon can't be
// found, so use GetTargetFilePath() instead.
@@ -1624,7 +1626,7 @@ void DownloadsGetFileIconFunction::OnIconURLExtracted(const std::string& url) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
std::string error;
if (Fault(url.empty(), download_extension_errors::kIconNotFound, &error)) {
- Respond(Error(error));
+ Respond(Error(std::move(error)));
return;
}
RecordApiFunctions(DOWNLOADS_FUNCTION_GET_FILE_ICON);
@@ -1863,7 +1865,7 @@ void ExtensionDownloadsEventRouter::OnListenerRemoved(
void ExtensionDownloadsEventRouter::OnDownloadCreated(
DownloadManager* manager, DownloadItem* download_item) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- if (download_item->IsTemporary())
+ if (!ShouldExport(*download_item))
return;
EventRouter* router = EventRouter::Get(profile_);
@@ -1901,7 +1903,7 @@ void ExtensionDownloadsEventRouter::OnDownloadUpdated(
EventRouter* router = EventRouter::Get(profile_);
ExtensionDownloadsEventRouterData* data =
ExtensionDownloadsEventRouterData::Get(download_item);
- if (download_item->IsTemporary() ||
+ if (!ShouldExport(*download_item) ||
!router->HasEventListener(downloads::OnChanged::kEventName)) {
return;
}
@@ -1986,7 +1988,7 @@ void ExtensionDownloadsEventRouter::OnDownloadUpdated(
void ExtensionDownloadsEventRouter::OnDownloadRemoved(
DownloadManager* manager, DownloadItem* download_item) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- if (download_item->IsTemporary())
+ if (!ShouldExport(*download_item))
return;
DispatchEvent(
events::DOWNLOADS_ON_ERASED, downloads::OnErased::kEventName, true,
diff --git a/chromium/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc b/chromium/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
index 4ec5445dd38..fc10f9ec110 100644
--- a/chromium/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
+++ b/chromium/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
@@ -55,6 +55,7 @@
#include "content/public/browser/storage_partition.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_features.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/download_test_observer.h"
#include "content/public/test/test_download_http_response.h"
diff --git a/chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_apitest.cc b/chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_apitest.cc
index 26d849096a4..0309f441857 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_apitest.cc
@@ -29,6 +29,7 @@
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/notification_service.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_utils.h"
#include "extensions/browser/api_test_utils.h"
#include "extensions/browser/extension_registry.h"
diff --git a/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_apitest_nss.cc b/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_apitest_nss.cc
index f270a692328..3f946e23d57 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_apitest_nss.cc
+++ b/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_apitest_nss.cc
@@ -23,6 +23,7 @@
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "crypto/nss_util_internal.h"
#include "crypto/scoped_test_system_nss_key_slot.h"
#include "extensions/browser/extension_registry.h"
@@ -264,7 +265,7 @@ IN_PROC_BROWSER_TEST_P(EnterprisePlatformKeysTest, Basic) {
mock_policy_provider());
// By default, the system token is disabled.
- std::string system_token_availability = "";
+ std::string system_token_availability;
// Only if the system token exists, and the current user is of the same domain
// as the device is enrolled to, the system token is available to the
diff --git a/chromium/chrome/browser/extensions/api/enterprise_reporting_private/device_info_fetcher.cc b/chromium/chrome/browser/extensions/api/enterprise_reporting_private/device_info_fetcher.cc
index 97c7c3689df..b63fe9971aa 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_reporting_private/device_info_fetcher.cc
+++ b/chromium/chrome/browser/extensions/api/enterprise_reporting_private/device_info_fetcher.cc
@@ -4,7 +4,6 @@
#include "chrome/browser/extensions/api/enterprise_reporting_private/device_info_fetcher.h"
-#include "base/logging.h"
#include "build/build_config.h"
#if defined(OS_MACOSX)
diff --git a/chromium/chrome/browser/extensions/api/enterprise_reporting_private/device_info_fetcher_mac.mm b/chromium/chrome/browser/extensions/api/enterprise_reporting_private/device_info_fetcher_mac.mm
index bd5ed9364f5..f17107064ec 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_reporting_private/device_info_fetcher_mac.mm
+++ b/chromium/chrome/browser/extensions/api/enterprise_reporting_private/device_info_fetcher_mac.mm
@@ -10,7 +10,6 @@
#include <sys/sysctl.h>
#include "base/files/file_util.h"
-#include "base/logging.h"
#include "base/mac/foundation_util.h"
#include "base/mac/mac_util.h"
#include "base/mac/scoped_cftyperef.h"
diff --git a/chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.cc b/chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.cc
index af9cb307756..5ec66328e92 100644
--- a/chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.cc
+++ b/chromium/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.cc
@@ -72,11 +72,7 @@ EnterpriseReportingPrivateUploadChromeDesktopReportFunction::
device_management_service->ScheduleInitialization(0);
cloud_policy_client_ = std::make_unique<policy::CloudPolicyClient>(
- std::string() /* machine_id */, std::string() /* machine_model */,
- std::string() /* brand_code */, std::string() /* ethernet_mac_address */,
- std::string() /* dock_mac_address */,
- std::string() /* manufacture_date */, device_management_service,
- std::move(url_loader_factory), nullptr,
+ device_management_service, std::move(url_loader_factory),
policy::CloudPolicyClient::DeviceDMTokenCallback());
dm_token_ = policy::BrowserDMTokenStorage::Get()->RetrieveDMToken();
client_id_ = policy::BrowserDMTokenStorage::Get()->RetrieveClientId();
diff --git a/chromium/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc b/chromium/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc
index ea817b1bb3f..5b236b80e49 100644
--- a/chromium/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc
@@ -10,6 +10,7 @@
#include "base/macros.h"
#include "base/run_loop.h"
#include "base/scoped_observer.h"
+#include "base/strings/string_piece.h"
#include "base/strings/stringprintf.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/threading/thread_restrictions.h"
@@ -18,7 +19,6 @@
#include "chrome/browser/extensions/api/extension_action/extension_action_api.h"
#include "chrome/browser/extensions/api/extension_action/test_extension_action_api_observer.h"
#include "chrome/browser/extensions/api/extension_action/test_icon_image_observer.h"
-#include "chrome/browser/extensions/extension_action.h"
#include "chrome/browser/extensions/extension_action_icon_factory.h"
#include "chrome/browser/extensions/extension_action_manager.h"
#include "chrome/browser/extensions/extension_action_runner.h"
@@ -44,11 +44,13 @@
#include "content/public/browser/picture_in_picture_window_controller.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/content_browser_test_utils.h"
#include "content/public/test/download_test_observer.h"
#include "content/public/test/test_navigation_observer.h"
#include "content/public/test/test_utils.h"
+#include "extensions/browser/extension_action.h"
#include "extensions/browser/extension_host.h"
#include "extensions/browser/extension_host_observer.h"
#include "extensions/browser/extension_registry.h"
@@ -179,6 +181,44 @@ class BrowserActionApiLazyTest : public BrowserActionApiTest,
return LoadExtensionWithFlags(path, flags);
}
+ void RunUpdateTest(base::StringPiece path, bool expect_failure) {
+ ExtensionTestMessageListener ready_listener("ready", true);
+ ASSERT_TRUE(embedded_test_server()->Start());
+ const Extension* extension =
+ LoadExtensionWithParamFlags(test_data_dir_.AppendASCII(path));
+ ASSERT_TRUE(extension) << message_;
+ // Test that there is a browser action in the toolbar.
+ ASSERT_EQ(1, GetBrowserActionsBar()->NumberOfBrowserActions());
+
+ ASSERT_TRUE(ready_listener.WaitUntilSatisfied());
+ ExtensionAction* action = GetBrowserAction(browser(), *extension);
+ EXPECT_EQ("This is the default title.",
+ action->GetTitle(ExtensionAction::kDefaultTabId));
+ EXPECT_EQ(
+ "", action->GetExplicitlySetBadgeText(ExtensionAction::kDefaultTabId));
+ EXPECT_EQ(SkColorSetARGB(0, 0, 0, 0),
+ action->GetBadgeBackgroundColor(ExtensionAction::kDefaultTabId));
+
+ // Tell the extension to update the browser action state and then
+ // catch the result.
+ ResultCatcher catcher;
+ ready_listener.Reply("update");
+
+ if (expect_failure) {
+ EXPECT_FALSE(catcher.GetNextResult());
+ EXPECT_EQ("The source image could not be decoded.", catcher.message());
+ return;
+ }
+
+ EXPECT_TRUE(catcher.GetNextResult());
+ // Test that we received the changes.
+ EXPECT_EQ("Modified", action->GetTitle(ExtensionAction::kDefaultTabId));
+ EXPECT_EQ("badge", action->GetExplicitlySetBadgeText(
+ ExtensionAction::kDefaultTabId));
+ EXPECT_EQ(SkColorSetARGB(255, 255, 255, 255),
+ action->GetBadgeBackgroundColor(ExtensionAction::kDefaultTabId));
+ }
+
private:
base::test::ScopedFeatureList feature_list_;
std::unique_ptr<extensions::ScopedWorkerBasedExtensionsChannel>
@@ -209,37 +249,18 @@ IN_PROC_BROWSER_TEST_P(BrowserActionApiLazyTest, Basic) {
EXPECT_TRUE(catcher.GetNextResult());
}
-using BrowserActionApiUpdateLazyTest = BrowserActionApiLazyTest;
-IN_PROC_BROWSER_TEST_P(BrowserActionApiUpdateLazyTest, Update) {
- ExtensionTestMessageListener ready_listener("ready", true);
- ASSERT_TRUE(embedded_test_server()->Start());
- const Extension* extension = LoadExtensionWithParamFlags(
- test_data_dir_.AppendASCII("browser_action/update"));
- ASSERT_TRUE(extension) << message_;
- // Test that there is a browser action in the toolbar.
- ASSERT_EQ(1, GetBrowserActionsBar()->NumberOfBrowserActions());
-
- ASSERT_TRUE(ready_listener.WaitUntilSatisfied());
- ExtensionAction* action = GetBrowserAction(browser(), *extension);
- EXPECT_EQ("This is the default title.",
- action->GetTitle(ExtensionAction::kDefaultTabId));
- EXPECT_EQ("",
- action->GetExplicitlySetBadgeText(ExtensionAction::kDefaultTabId));
- EXPECT_EQ(SkColorSetARGB(0, 0, 0, 0),
- action->GetBadgeBackgroundColor(ExtensionAction::kDefaultTabId));
-
- // Tell the extension to update the browser action state and then
- // catch the result.
- ResultCatcher catcher;
- ready_listener.Reply("update");
- ASSERT_TRUE(catcher.GetNextResult());
+IN_PROC_BROWSER_TEST_P(BrowserActionApiLazyTest, Update) {
+ ASSERT_NO_FATAL_FAILURE(RunUpdateTest("browser_action/update", false))
+ << GetParam();
+}
- // Test that we received the changes.
- EXPECT_EQ("Modified", action->GetTitle(ExtensionAction::kDefaultTabId));
- EXPECT_EQ("badge",
- action->GetExplicitlySetBadgeText(ExtensionAction::kDefaultTabId));
- EXPECT_EQ(SkColorSetARGB(255, 255, 255, 255),
- action->GetBadgeBackgroundColor(ExtensionAction::kDefaultTabId));
+IN_PROC_BROWSER_TEST_P(BrowserActionApiLazyTest, UpdateSvg) {
+ // TODO(crbug.com/1064671): Service Workers currently don't support loading
+ // SVG images.
+ const bool expect_failure = GetParam() & kUseServiceWorker;
+ ASSERT_NO_FATAL_FAILURE(
+ RunUpdateTest("browser_action/update_svg", expect_failure))
+ << GetParam();
}
INSTANTIATE_TEST_SUITE_P(EventPageAndLegacyToolbar,
@@ -256,22 +277,6 @@ INSTANTIATE_TEST_SUITE_P(ServiceWorkerAndExtensionsMenu,
::testing::Values(kUseServiceWorker |
kUseExtensionsMenuUi));
-INSTANTIATE_TEST_SUITE_P(EventPageAndLegacyToolbar,
- BrowserActionApiUpdateLazyTest,
- ::testing::Values(kNone));
-INSTANTIATE_TEST_SUITE_P(EventPageAndExtensionsMenu,
- BrowserActionApiUpdateLazyTest,
- ::testing::Values(kUseExtensionsMenuUi));
-// TODO(crbug.com/1015136): Enable these once setIcon works in Service worker
-// extensions. Also, combine this suite with BrowserActionApiLazyTest.
-// INSTANTIATE_TEST_SUITE_P(ServiceWorkerAndLegacyToolbar,
-// BrowserActionApiUpdateLazyTest,
-// ::testing::Values(kUseServiceWorker));
-// INSTANTIATE_TEST_SUITE_P(ServiceWorkerAndExtensionsMenu,
-// BrowserActionApiUpdateLazyTest,
-// ::testing::Values(kUseServiceWorker |
-// kUseExtensionsMenuUi));
-
IN_PROC_BROWSER_TEST_F(BrowserActionApiCanvasTest, DynamicBrowserAction) {
ASSERT_TRUE(RunExtensionTest("browser_action/no_icon")) << message_;
const Extension* extension = GetSingleLoadedExtension();
@@ -638,7 +643,7 @@ IN_PROC_BROWSER_TEST_F(BrowserActionApiTest, BrowserActionRemovePopup) {
IN_PROC_BROWSER_TEST_P(BrowserActionApiLazyTest, IncognitoBasic) {
ExtensionTestMessageListener ready_listener("ready", false);
ASSERT_TRUE(embedded_test_server()->Start());
- const Extension* extension = LoadExtensionWithParamFlags(
+ scoped_refptr<const Extension> extension = LoadExtensionWithParamFlags(
test_data_dir_.AppendASCII("browser_action/basics"));
ASSERT_TRUE(extension) << message_;
@@ -678,20 +683,19 @@ IN_PROC_BROWSER_TEST_P(BrowserActionApiLazyTest, IncognitoBasic) {
ResultCatcher catcher;
// Simulate the browser action being clicked.
- ExecuteExtensionAction(incognito_browser, extension);
+ ExecuteExtensionAction(incognito_browser, extension.get());
EXPECT_TRUE(catcher.GetNextResult());
}
IN_PROC_BROWSER_TEST_P(BrowserActionApiLazyTest, IncognitoUpdate) {
- // TODO(crbug.com/1015136): Investigate flakiness WRT Service Workers and
- // incognito mode.
- if ((GetParam() & kUseServiceWorker) != 0)
- return;
ASSERT_TRUE(embedded_test_server()->Start());
- const Extension* extension = LoadExtensionWithParamFlags(
+ ExtensionTestMessageListener incognito_not_allowed_listener(
+ "incognito not allowed", false);
+ scoped_refptr<const Extension> extension = LoadExtensionWithParamFlags(
test_data_dir_.AppendASCII("browser_action/update"));
ASSERT_TRUE(extension) << message_;
+ ASSERT_TRUE(incognito_not_allowed_listener.WaitUntilSatisfied());
// Test that there is a browser action in the toolbar.
ASSERT_EQ(1, GetBrowserActionsBar()->NumberOfBrowserActions());
@@ -703,21 +707,27 @@ IN_PROC_BROWSER_TEST_P(BrowserActionApiLazyTest, IncognitoUpdate) {
->NumberOfBrowserActions());
// Set up a listener so we can reply for the extension to do the update.
- ExtensionTestMessageListener incognito_ready_listener("incognito ready",
- true);
+ // This listener also adds a sequence point between the browser and the
+ // renderer for the transition between incognito mode not being allowed
+ // and it's being allowed. This ensures the browser ignores the renderer's
+ // execution until the transition is completed, since the script will
+ // start and stop multiple times during the initial load of the extension
+ // and the enabling of incognito mode.
+ ExtensionTestMessageListener incognito_allowed_listener("incognito allowed",
+ true);
// Now enable the extension in incognito mode, and test that the browser
- // action shows up.
- // SetIsIncognitoEnabled() requires a reload of the extension, so we have to
- // wait for it.
+ // action shows up. SetIsIncognitoEnabled() requires a reload of the
+ // extension, so we have to wait for it to finish.
TestExtensionRegistryObserver registry_observer(
ExtensionRegistry::Get(profile()), extension->id());
extensions::util::SetIsIncognitoEnabled(extension->id(), browser()->profile(),
true);
extension = registry_observer.WaitForExtensionLoaded();
+ ASSERT_TRUE(extension);
ASSERT_EQ(1, ExtensionActionTestHelper::Create(incognito_browser)
->NumberOfBrowserActions());
- ASSERT_TRUE(incognito_ready_listener.WaitUntilSatisfied());
+ ASSERT_TRUE(incognito_allowed_listener.WaitUntilSatisfied());
ExtensionAction* action = GetBrowserAction(incognito_browser, *extension);
EXPECT_EQ("This is the default title.",
action->GetTitle(ExtensionAction::kDefaultTabId));
@@ -728,7 +738,7 @@ IN_PROC_BROWSER_TEST_P(BrowserActionApiLazyTest, IncognitoUpdate) {
// Tell the extension to update the browser action state and then
// catch the result.
ResultCatcher incognito_catcher;
- incognito_ready_listener.Reply("incognito update");
+ incognito_allowed_listener.Reply("incognito update");
ASSERT_TRUE(incognito_catcher.GetNextResult());
// Test that we received the changes.
diff --git a/chromium/chrome/browser/extensions/api/extension_action/browser_action_browsertest.cc b/chromium/chrome/browser/extensions/api/extension_action/browser_action_browsertest.cc
index 1bce61079f1..b09c758f62c 100644
--- a/chromium/chrome/browser/extensions/api/extension_action/browser_action_browsertest.cc
+++ b/chromium/chrome/browser/extensions/api/extension_action/browser_action_browsertest.cc
@@ -4,10 +4,11 @@
#include "base/bind.h"
#include "base/files/file_path.h"
-#include "chrome/browser/extensions/extension_action.h"
#include "chrome/browser/extensions/extension_action_manager.h"
#include "chrome/browser/extensions/extension_browsertest.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_utils.h"
+#include "extensions/browser/extension_action.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_system.h"
#include "extensions/browser/state_store.h"
diff --git a/chromium/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc b/chromium/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc
index 219390ecbe9..0250208c25f 100644
--- a/chromium/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc
+++ b/chromium/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc
@@ -8,7 +8,6 @@
#include "base/test/test_timeouts.h"
#include "build/build_config.h"
#include "chrome/browser/download/download_prefs.h"
-#include "chrome/browser/extensions/extension_action.h"
#include "chrome/browser/extensions/extension_action_manager.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "chrome/browser/ui/browser.h"
@@ -29,7 +28,9 @@
#include "content/public/browser/notification_types.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/download_test_observer.h"
+#include "extensions/browser/extension_action.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/notification_types.h"
#include "extensions/common/extension.h"
@@ -129,12 +130,7 @@ class BrowserActionInteractiveTest : public ExtensionApiTest {
// window to able to be made active automatically. Returns false for platforms
// where these conditions are not met.
bool ShouldRunPopupTest() {
- // TODO(justinlin): http://crbug.com/177163
-#if defined(OS_WIN) && !defined(NDEBUG)
- return false;
-#else
return true;
-#endif
}
void EnsurePopupActive() {
@@ -914,6 +910,7 @@ IN_PROC_BROWSER_TEST_F(NavigatingExtensionPopupInteractiveTest,
GURL other_extension_url = other_extension().GetResourceURL("other.html");
TestPopupNavigationViaGet(other_extension_url, EXPECTING_NAVIGATION_FAILURE);
}
+
IN_PROC_BROWSER_TEST_F(NavigatingExtensionPopupInteractiveTest,
PageInOtherExtension_Post) {
GURL other_extension_url = other_extension().GetResourceURL("other.html");
diff --git a/chromium/chrome/browser/extensions/api/extension_action/extension_action_api.cc b/chromium/chrome/browser/extensions/api/extension_action/extension_action_api.cc
index 10385b38529..b2fa34c8b44 100644
--- a/chromium/chrome/browser/extensions/api/extension_action/extension_action_api.cc
+++ b/chromium/chrome/browser/extensions/api/extension_action/extension_action_api.cc
@@ -28,7 +28,6 @@
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/extensions/extensions_container.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/common/extensions/api/extension_action/action_info.h"
#include "components/sessions/content/session_tab_helper.h"
#include "content/public/browser/notification_service.h"
#include "extensions/browser/api/declarative_net_request/constants.h"
@@ -38,6 +37,7 @@
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_util.h"
#include "extensions/browser/notification_types.h"
+#include "extensions/common/api/extension_action/action_info.h"
#include "extensions/common/error_utils.h"
#include "extensions/common/feature_switch.h"
#include "extensions/common/image_util.h"
@@ -112,10 +112,9 @@ void ExtensionActionAPI::RemoveObserver(Observer* observer) {
observers_.RemoveObserver(observer);
}
-bool ExtensionActionAPI::ShowExtensionActionPopup(
+bool ExtensionActionAPI::ShowExtensionActionPopupForAPICall(
const Extension* extension,
- Browser* browser,
- bool grant_active_tab_permissions) {
+ Browser* browser) {
ExtensionAction* extension_action =
ExtensionActionManager::Get(browser_context_)->GetExtensionAction(
*extension);
@@ -131,8 +130,8 @@ bool ExtensionActionAPI::ShowExtensionActionPopup(
// The ExtensionsContainer could be null if, e.g., this is a popup window with
// no toolbar.
return extensions_container &&
- extensions_container->ShowToolbarActionPopup(
- extension->id(), grant_active_tab_permissions);
+ extensions_container->ShowToolbarActionPopupForAPICall(
+ extension->id());
}
void ExtensionActionAPI::NotifyChange(ExtensionAction* extension_action,
@@ -530,8 +529,8 @@ ExtensionFunction::ResponseAction BrowserActionOpenPopupFunction::Run() {
// fixed.
if (!browser || !browser->window()->IsActive() ||
!browser->window()->IsToolbarVisible() ||
- !ExtensionActionAPI::Get(profile)->ShowExtensionActionPopup(
- extension_.get(), browser, false)) {
+ !ExtensionActionAPI::Get(profile)->ShowExtensionActionPopupForAPICall(
+ extension_.get(), browser)) {
return RespondNow(Error(kOpenPopupError));
}
diff --git a/chromium/chrome/browser/extensions/api/extension_action/extension_action_api.h b/chromium/chrome/browser/extensions/api/extension_action/extension_action_api.h
index 6ae7ffbe33a..dd68632f82b 100644
--- a/chromium/chrome/browser/extensions/api/extension_action/extension_action_api.h
+++ b/chromium/chrome/browser/extensions/api/extension_action/extension_action_api.h
@@ -9,10 +9,10 @@
#include "base/macros.h"
#include "base/observer_list.h"
-#include "chrome/browser/extensions/extension_action.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "extensions/browser/browser_context_keyed_api_factory.h"
+#include "extensions/browser/extension_action.h"
#include "extensions/browser/extension_event_histogram_value.h"
#include "extensions/browser/extension_function.h"
#include "third_party/skia/include/core/SkColor.h"
@@ -68,12 +68,8 @@ class ExtensionActionAPI : public BrowserContextKeyedAPI {
void RemoveObserver(Observer* observer);
// Opens the popup for the given |extension| in the given |browser|'s window.
- // If |grant_active_tab_permissions| is true, this grants the extension
- // activeTab (so this should only be done if this is through a direct user
- // action).
- bool ShowExtensionActionPopup(const Extension* extension,
- Browser* browser,
- bool grant_active_tab_permissions);
+ bool ShowExtensionActionPopupForAPICall(const Extension* extension,
+ Browser* browser);
// Notifies that there has been a change in the given |extension_action|.
void NotifyChange(ExtensionAction* extension_action,
diff --git a/chromium/chrome/browser/extensions/api/extension_action/extension_action_api_unittest.cc b/chromium/chrome/browser/extensions/api/extension_action/extension_action_api_unittest.cc
index cbd0be151ab..63bf20eca56 100644
--- a/chromium/chrome/browser/extensions/api/extension_action/extension_action_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/extension_action/extension_action_api_unittest.cc
@@ -8,10 +8,10 @@
#include "base/strings/stringprintf.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_service_test_with_install.h"
-#include "chrome/common/extensions/api/extension_action/action_info.h"
+#include "chrome/common/extensions/api/extension_action/action_info_test_util.h"
#include "chrome/common/extensions/extension_test_util.h"
+#include "extensions/common/api/extension_action/action_info.h"
#include "extensions/common/features/feature_channel.h"
-#include "extensions/common/manifest_constants.h"
#include "extensions/test/test_extension_dir.h"
namespace extensions {
@@ -22,36 +22,9 @@ class ExtensionActionAPIUnitTest
public ::testing::WithParamInterface<ActionInfo::Type> {
public:
ExtensionActionAPIUnitTest()
- : current_channel_(
- extension_test_util::GetOverrideChannelForActionType(GetParam())) {}
+ : current_channel_(GetOverrideChannelForActionType(GetParam())) {}
~ExtensionActionAPIUnitTest() override {}
- const char* GetManifestKey() {
- switch (GetParam()) {
- case ActionInfo::TYPE_BROWSER:
- return manifest_keys::kBrowserAction;
- case ActionInfo::TYPE_PAGE:
- return manifest_keys::kPageAction;
- case ActionInfo::TYPE_ACTION:
- return manifest_keys::kAction;
- }
- NOTREACHED();
- return nullptr;
- }
-
- const ActionInfo* GetActionInfo(const Extension& extension) {
- switch (GetParam()) {
- case ActionInfo::TYPE_BROWSER:
- return ActionInfo::GetBrowserActionInfo(&extension);
- case ActionInfo::TYPE_PAGE:
- return ActionInfo::GetPageActionInfo(&extension);
- case ActionInfo::TYPE_ACTION:
- return ActionInfo::GetExtensionActionInfo(&extension);
- }
- NOTREACHED();
- return nullptr;
- }
-
private:
std::unique_ptr<ScopedCurrentChannel> current_channel_;
@@ -78,8 +51,8 @@ TEST_P(ExtensionActionAPIUnitTest, MultiIcons) {
})";
TestExtensionDir test_extension_dir;
- test_extension_dir.WriteManifest(
- base::StringPrintf(kManifestTemplate, GetManifestKey()));
+ test_extension_dir.WriteManifest(base::StringPrintf(
+ kManifestTemplate, GetManifestKeyForActionType(GetParam())));
{
std::string icon_file_content;
@@ -96,7 +69,7 @@ TEST_P(ExtensionActionAPIUnitTest, MultiIcons) {
const Extension* extension =
PackAndInstallCRX(test_extension_dir.UnpackedPath(), INSTALL_NEW);
EXPECT_TRUE(extension->install_warnings().empty());
- const ActionInfo* action_info = GetActionInfo(*extension);
+ const ActionInfo* action_info = GetActionInfoOfType(*extension, GetParam());
ASSERT_TRUE(action_info);
const ExtensionIconSet& icons = action_info->default_icon;
diff --git a/chromium/chrome/browser/extensions/api/extension_action/extension_action_apitest.cc b/chromium/chrome/browser/extensions/api/extension_action/extension_action_apitest.cc
index 70f89b7e154..1bddc30de58 100644
--- a/chromium/chrome/browser/extensions/api/extension_action/extension_action_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/extension_action/extension_action_apitest.cc
@@ -14,27 +14,27 @@
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/extensions/api/extension_action/test_extension_action_api_observer.h"
#include "chrome/browser/extensions/api/extension_action/test_icon_image_observer.h"
-#include "chrome/browser/extensions/extension_action.h"
#include "chrome/browser/extensions/extension_action_manager.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/extensions/extension_action_test_helper.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/common/extensions/extension_test_util.h"
+#include "chrome/common/extensions/api/extension_action/action_info_test_util.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/sessions/content/session_tab_helper.h"
#include "components/version_info/channel.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_utils.h"
#include "extensions/browser/browsertest_util.h"
+#include "extensions/browser/extension_action.h"
#include "extensions/browser/extension_icon_image.h"
#include "extensions/browser/process_manager.h"
#include "extensions/browser/state_store.h"
#include "extensions/common/extension.h"
#include "extensions/common/features/feature_channel.h"
-#include "extensions/common/manifest_constants.h"
#include "extensions/test/extension_test_message_listener.h"
#include "extensions/test/result_catcher.h"
#include "extensions/test/test_extension_dir.h"
@@ -44,6 +44,15 @@
namespace extensions {
namespace {
+// A background script that allows for setting the icon dynamically.
+constexpr char kSetIconBackgroundJsTemplate[] =
+ R"(function setIcon(details) {
+ chrome.%s.setIcon(details, () => {
+ chrome.test.assertNoLastError();
+ chrome.test.notifyPass();
+ });
+ })";
+
// Runs |script| in the background page of the extension with the given
// |extension_id|, and waits for it to send a test-passed result. This will
// fail if the test in |script| fails.
@@ -177,40 +186,7 @@ class ActionTestHelper {
} // namespace
-class ExtensionActionAPITest : public ExtensionApiTest {
- public:
- ExtensionActionAPITest() {}
- ~ExtensionActionAPITest() override {}
-
- const char* GetManifestKey(ActionInfo::Type action_type) {
- switch (action_type) {
- case ActionInfo::TYPE_ACTION:
- return manifest_keys::kAction;
- case ActionInfo::TYPE_BROWSER:
- return manifest_keys::kBrowserAction;
- case ActionInfo::TYPE_PAGE:
- return manifest_keys::kPageAction;
- }
- NOTREACHED();
- return nullptr;
- }
-
- const char* GetAPIName(ActionInfo::Type action_type) {
- switch (action_type) {
- case ActionInfo::TYPE_ACTION:
- return "action";
- case ActionInfo::TYPE_BROWSER:
- return "browserAction";
- case ActionInfo::TYPE_PAGE:
- return "pageAction";
- }
- NOTREACHED();
- return nullptr;
- }
-
- private:
- DISALLOW_COPY_AND_ASSIGN(ExtensionActionAPITest);
-};
+using ExtensionActionAPITest = ExtensionApiTest;
// Alias these for readability, when a test only exercises one type of action.
using BrowserActionAPITest = ExtensionActionAPITest;
@@ -222,8 +198,7 @@ class MultiActionAPITest
public testing::WithParamInterface<ActionInfo::Type> {
public:
MultiActionAPITest()
- : current_channel_(
- extension_test_util::GetOverrideChannelForActionType(GetParam())) {}
+ : current_channel_(GetOverrideChannelForActionType(GetParam())) {}
// Returns true if the |action| has whatever state its default is on the
// tab with the given |tab_id|.
@@ -369,8 +344,8 @@ IN_PROC_BROWSER_TEST_P(MultiActionAPITest,
"%s": {}
})";
- test_dir.WriteManifest(
- base::StringPrintf(kManifestTemplate, GetManifestKey(GetParam())));
+ test_dir.WriteManifest(base::StringPrintf(
+ kManifestTemplate, GetManifestKeyForActionType(GetParam())));
const Extension* extension = LoadExtension(test_dir.UnpackedPath());
ASSERT_TRUE(extension);
@@ -426,8 +401,8 @@ IN_PROC_BROWSER_TEST_P(MultiActionAPITest, TitleLocalization) {
}
})";
- test_dir.WriteManifest(
- base::StringPrintf(kManifestTemplate, GetManifestKey(GetParam())));
+ test_dir.WriteManifest(base::StringPrintf(
+ kManifestTemplate, GetManifestKeyForActionType(GetParam())));
const Extension* extension = LoadExtension(test_dir.UnpackedPath());
ASSERT_TRUE(extension);
@@ -467,11 +442,11 @@ IN_PROC_BROWSER_TEST_P(MultiActionAPITest, OnClickedDispatching) {
});)";
TestExtensionDir test_dir;
- test_dir.WriteManifest(
- base::StringPrintf(kManifestTemplate, GetManifestKey(GetParam())));
- test_dir.WriteFile(
- FILE_PATH_LITERAL("background.js"),
- base::StringPrintf(kBackgroundJsTemplate, GetAPIName(GetParam())));
+ test_dir.WriteManifest(base::StringPrintf(
+ kManifestTemplate, GetManifestKeyForActionType(GetParam())));
+ test_dir.WriteFile(FILE_PATH_LITERAL("background.js"),
+ base::StringPrintf(kBackgroundJsTemplate,
+ GetAPINameForActionType(GetParam())));
// Though this says "ExtensionActionTestHelper", it's actually used for all
// toolbar actions.
@@ -518,8 +493,8 @@ IN_PROC_BROWSER_TEST_P(MultiActionAPITest, PopupCreation) {
"window.onload = function() { chrome.test.notifyPass(); };";
TestExtensionDir test_dir;
- test_dir.WriteManifest(
- base::StringPrintf(kManifestTemplate, GetManifestKey(GetParam())));
+ test_dir.WriteManifest(base::StringPrintf(
+ kManifestTemplate, GetManifestKeyForActionType(GetParam())));
test_dir.WriteFile(FILE_PATH_LITERAL("popup.html"), kPopupHtml);
test_dir.WriteFile(FILE_PATH_LITERAL("popup.js"), kPopupJs);
@@ -573,13 +548,6 @@ IN_PROC_BROWSER_TEST_P(MultiActionAPICanvasTest, DynamicSetIcon) {
},
"background": { "scripts": ["background.js"] }
})";
- constexpr char kBackgroundJsTemplate[] =
- R"(function setIcon(details) {
- chrome.%s.setIcon(details, () => {
- chrome.test.assertNoLastError();
- chrome.test.notifyPass();
- });
- })";
std::string blue_icon;
std::string red_icon;
@@ -592,11 +560,11 @@ IN_PROC_BROWSER_TEST_P(MultiActionAPICanvasTest, DynamicSetIcon) {
}
TestExtensionDir test_dir;
- test_dir.WriteManifest(
- base::StringPrintf(kManifestTemplate, GetManifestKey(GetParam())));
- test_dir.WriteFile(
- FILE_PATH_LITERAL("background.js"),
- base::StringPrintf(kBackgroundJsTemplate, GetAPIName(GetParam())));
+ test_dir.WriteManifest(base::StringPrintf(
+ kManifestTemplate, GetManifestKeyForActionType(GetParam())));
+ test_dir.WriteFile(FILE_PATH_LITERAL("background.js"),
+ base::StringPrintf(kSetIconBackgroundJsTemplate,
+ GetAPINameForActionType(GetParam())));
test_dir.WriteFile(FILE_PATH_LITERAL("blue_icon.png"), blue_icon);
test_dir.WriteFile(FILE_PATH_LITERAL("red_icon.png"), red_icon);
@@ -691,6 +659,128 @@ IN_PROC_BROWSER_TEST_P(MultiActionAPICanvasTest, DynamicSetIcon) {
// { size -> image_data }.
}
+// Tests calling setIcon() from JS with hooks that might cause issues with our
+// custom bindings.
+// Regression test for https://crbug.com/1087948.
+IN_PROC_BROWSER_TEST_P(MultiActionAPITest, SetIconWithJavascriptHooks) {
+ constexpr char kManifestTemplate[] =
+ R"({
+ "name": "JS Fun",
+ "manifest_version": 2,
+ "version": "0.1",
+ "%s": {},
+ "background": { "scripts": ["background.js"] }
+ })";
+
+ std::string blue_icon;
+ {
+ base::ScopedAllowBlockingForTesting allow_blocking;
+ ASSERT_TRUE(base::ReadFileToString(
+ test_data_dir_.AppendASCII("icon_rgb_0_0_255.png"), &blue_icon));
+ }
+
+ TestExtensionDir test_dir;
+ test_dir.WriteManifest(base::StringPrintf(
+ kManifestTemplate, GetManifestKeyForActionType(GetParam())));
+ test_dir.WriteFile(FILE_PATH_LITERAL("background.js"),
+ base::StringPrintf(kSetIconBackgroundJsTemplate,
+ GetAPINameForActionType(GetParam())));
+ test_dir.WriteFile(FILE_PATH_LITERAL("blue_icon.png"), blue_icon);
+
+ const Extension* extension = LoadExtension(test_dir.UnpackedPath());
+ ASSERT_TRUE(extension);
+
+ ExtensionAction* action = GetExtensionAction(*extension);
+ ASSERT_TRUE(action);
+
+ int tab_id = GetActiveTabId();
+ EXPECT_TRUE(ActionHasDefaultState(*action, tab_id));
+ EnsureActionIsEnabledOnActiveTab(action);
+
+ // Define a setter for objects on the imageData key. This could previously
+ // result in an invalid arguments object being sent to the browser.
+ constexpr char kScript[] =
+ R"(Object.defineProperty(
+ Object.prototype, 'imageData',
+ { set() { console.warn('intercepted set'); } });
+ domAutomationController.send('done');)";
+ std::string result = browsertest_util::ExecuteScriptInBackgroundPage(
+ profile(), extension->id(), kScript);
+ ASSERT_EQ("done", result);
+
+ constexpr char kOnePathScript[] =
+ "setIcon({tabId: %d, path: 'blue_icon.png'});";
+ RunTestAndWaitForSuccess(profile(), extension->id(),
+ base::StringPrintf(kOnePathScript, tab_id));
+ constexpr char kMultiPathScript[] =
+ R"(setIcon({tabId: %d,
+ path: {16: 'blue_icon.png', 24: 'blue_icon.png'}});)";
+ RunTestAndWaitForSuccess(profile(), extension->id(),
+ base::StringPrintf(kMultiPathScript, tab_id));
+ constexpr char kRawImageDataScript[] =
+ R"(setIcon({tabId: %d,
+ imageData: {width:4,height:4,data:'a'.repeat(64)}});)";
+ RunTestAndWaitForSuccess(profile(), extension->id(),
+ base::StringPrintf(kRawImageDataScript, tab_id));
+}
+
+// Tests calling setIcon() from JS with `self` defined at the top-level.
+// Regression test for https://crbug.com/1087948.
+IN_PROC_BROWSER_TEST_P(MultiActionAPITest, SetIconWithSelfDefined) {
+ // TODO(devlin): Pull code to load an extension like this into a helper
+ // function.
+ constexpr char kManifestTemplate[] =
+ R"({
+ "name": "JS Fun",
+ "manifest_version": 2,
+ "version": "0.1",
+ "%s": {},
+ "background": { "scripts": ["background.js"] }
+ })";
+
+ std::string blue_icon;
+ {
+ base::ScopedAllowBlockingForTesting allow_blocking;
+ ASSERT_TRUE(base::ReadFileToString(
+ test_data_dir_.AppendASCII("icon_rgb_0_0_255.png"), &blue_icon));
+ }
+
+ TestExtensionDir test_dir;
+ test_dir.WriteManifest(base::StringPrintf(
+ kManifestTemplate, GetManifestKeyForActionType(GetParam())));
+
+ test_dir.WriteFile(FILE_PATH_LITERAL("background.js"),
+ base::StringPrintf(kSetIconBackgroundJsTemplate,
+ GetAPINameForActionType(GetParam())));
+ test_dir.WriteFile(FILE_PATH_LITERAL("blue_icon.png"), blue_icon);
+
+ const Extension* extension = LoadExtension(test_dir.UnpackedPath());
+ ASSERT_TRUE(extension);
+
+ ExtensionAction* action = GetExtensionAction(*extension);
+ ASSERT_TRUE(action);
+
+ int tab_id = GetActiveTabId();
+ EXPECT_TRUE(ActionHasDefaultState(*action, tab_id));
+ EnsureActionIsEnabledOnActiveTab(action);
+
+ // Override 'self' in a local variable.
+ constexpr char kOverrideSelfScript[] =
+ "var self = ''; domAutomationController.send('done');";
+ std::string result = browsertest_util::ExecuteScriptInBackgroundPage(
+ profile(), extension->id(), kOverrideSelfScript);
+ ASSERT_EQ("done", result);
+
+ // Try setting the icon. This should succeed. Previously, the custom bindings
+ // for the setIcon code looked at the 'self' variable, but this could be
+ // overridden by the extension.
+ // See also https://crbug.com/1087948.
+ constexpr char kSetIconScript[] =
+ "setIcon({tabId: %d, path: 'blue_icon.png'});";
+ RunTestAndWaitForSuccess(profile(), extension->id(),
+ base::StringPrintf(kSetIconScript, tab_id));
+}
+
// Tests various getter and setter methods.
IN_PROC_BROWSER_TEST_P(MultiActionAPITest, GettersAndSetters) {
// Load up an extension with default values.
@@ -710,8 +800,8 @@ IN_PROC_BROWSER_TEST_P(MultiActionAPITest, GettersAndSetters) {
"<!doctype html><html><body>Blank</body></html>";
TestExtensionDir test_dir;
- test_dir.WriteManifest(
- base::StringPrintf(kManifestTemplate, GetManifestKey(GetParam())));
+ test_dir.WriteManifest(base::StringPrintf(
+ kManifestTemplate, GetManifestKeyForActionType(GetParam())));
test_dir.WriteFile(FILE_PATH_LITERAL("background.js"), kBackgroundJs);
test_dir.WriteFile(FILE_PATH_LITERAL("default_popup.html"), kPopupHtml);
test_dir.WriteFile(FILE_PATH_LITERAL("custom_popup1.html"), kPopupHtml);
@@ -807,7 +897,7 @@ IN_PROC_BROWSER_TEST_P(MultiActionAPITest, GettersAndSetters) {
}
};
- const char* kApiName = GetAPIName(GetParam());
+ const char* kApiName = GetAPINameForActionType(GetParam());
{
// setPopup/getPopup.
@@ -896,8 +986,8 @@ IN_PROC_BROWSER_TEST_P(MultiActionAPITest, EnableAndDisable) {
})";
TestExtensionDir test_dir;
- test_dir.WriteManifest(
- base::StringPrintf(kManifestTemplate, GetManifestKey(GetParam())));
+ test_dir.WriteManifest(base::StringPrintf(
+ kManifestTemplate, GetManifestKeyForActionType(GetParam())));
test_dir.WriteFile(FILE_PATH_LITERAL("background.js"),
"// This space left blank.");
const Extension* extension = LoadExtension(test_dir.UnpackedPath());
@@ -941,7 +1031,7 @@ IN_PROC_BROWSER_TEST_P(MultiActionAPITest, EnableAndDisable) {
});)";
RunTestAndWaitForSuccess(
profile(), extension->id(),
- base::StringPrintf(kScriptTemplate, GetAPIName(GetParam()),
+ base::StringPrintf(kScriptTemplate, GetAPINameForActionType(GetParam()),
disable_function, tab_id2));
EXPECT_FALSE(action->GetIsVisible(tab_id2));
EXPECT_TRUE(action->GetIsVisible(tab_id1));
@@ -955,7 +1045,7 @@ IN_PROC_BROWSER_TEST_P(MultiActionAPITest, EnableAndDisable) {
});)";
RunTestAndWaitForSuccess(
profile(), extension->id(),
- base::StringPrintf(kScriptTemplate, GetAPIName(GetParam()),
+ base::StringPrintf(kScriptTemplate, GetAPINameForActionType(GetParam()),
enable_function, tab_id2));
EXPECT_TRUE(action->GetIsVisible(tab_id2));
EXPECT_TRUE(action->GetIsVisible(tab_id1));
@@ -978,7 +1068,7 @@ IN_PROC_BROWSER_TEST_P(MultiActionAPITest, EnableAndDisable) {
});)";
RunTestAndWaitForSuccess(
profile(), extension->id(),
- base::StringPrintf(kScriptTemplate, GetAPIName(GetParam()),
+ base::StringPrintf(kScriptTemplate, GetAPINameForActionType(GetParam()),
disable_function));
EXPECT_EQ(false, action->GetIsVisible(tab_id2));
EXPECT_EQ(false, action->GetIsVisible(tab_id1));
@@ -992,7 +1082,7 @@ IN_PROC_BROWSER_TEST_P(MultiActionAPITest, EnableAndDisable) {
});)";
RunTestAndWaitForSuccess(
profile(), extension->id(),
- base::StringPrintf(kScriptTemplate, GetAPIName(GetParam()),
+ base::StringPrintf(kScriptTemplate, GetAPINameForActionType(GetParam()),
enable_function));
EXPECT_EQ(true, action->GetIsVisible(tab_id2));
EXPECT_EQ(true, action->GetIsVisible(tab_id1));
diff --git a/chromium/chrome/browser/extensions/api/extension_action/page_action_apitest.cc b/chromium/chrome/browser/extensions/api/extension_action/page_action_apitest.cc
index d30c5a9abdd..7c2a722b840 100644
--- a/chromium/chrome/browser/extensions/api/extension_action/page_action_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/extension_action/page_action_apitest.cc
@@ -3,7 +3,6 @@
// found in the LICENSE file.
#include "chrome/browser/extensions/api/extension_action/extension_action_api.h"
-#include "chrome/browser/extensions/extension_action.h"
#include "chrome/browser/extensions/extension_action_icon_factory.h"
#include "chrome/browser/extensions/extension_action_manager.h"
#include "chrome/browser/extensions/extension_action_runner.h"
@@ -19,7 +18,9 @@
#include "chrome/test/base/ui_test_utils.h"
#include "components/sessions/content/session_tab_helper.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
+#include "extensions/browser/extension_action.h"
#include "extensions/browser/extension_system.h"
#include "extensions/common/extension.h"
#include "extensions/test/result_catcher.h"
@@ -181,8 +182,8 @@ IN_PROC_BROWSER_TEST_F(PageActionApiTest, DISABLED_ShowPageActionPopup) {
{
ResultCatcher catcher;
- ExtensionActionAPI::Get(browser()->profile())->ShowExtensionActionPopup(
- extension, browser(), true);
+ ExtensionActionAPI::Get(browser()->profile())
+ ->ShowExtensionActionPopupForAPICall(extension, browser());
ASSERT_TRUE(catcher.GetNextResult());
}
}
diff --git a/chromium/chrome/browser/extensions/api/extension_action/test_icon_image_observer.cc b/chromium/chrome/browser/extensions/api/extension_action/test_icon_image_observer.cc
index e8e1d6f98c1..0d8fcef52e4 100644
--- a/chromium/chrome/browser/extensions/api/extension_action/test_icon_image_observer.cc
+++ b/chromium/chrome/browser/extensions/api/extension_action/test_icon_image_observer.cc
@@ -4,8 +4,8 @@
#include "chrome/browser/extensions/api/extension_action/test_icon_image_observer.h"
-#include "chrome/browser/extensions/extension_action.h"
#include "chrome/browser/extensions/extension_action_manager.h"
+#include "extensions/browser/extension_action.h"
#include "ui/gfx/image/image_skia.h"
namespace extensions {
diff --git a/chromium/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc b/chromium/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc
index d5d37cb5c27..844c9a7a220 100644
--- a/chromium/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc
+++ b/chromium/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc
@@ -19,6 +19,7 @@
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_utils.h"
#include "extensions/browser/api/feedback_private/feedback_private_api.h"
@@ -283,7 +284,8 @@ IN_PROC_BROWSER_TEST_F(FeedbackTest, ProvideBluetoothLogs) {
}
#endif // if defined(CHROME_OS)
-IN_PROC_BROWSER_TEST_F(FeedbackTest, GetTargetTabUrl) {
+// Disabled due to flake: https://crbug.com/1069870
+IN_PROC_BROWSER_TEST_F(FeedbackTest, DISABLED_GetTargetTabUrl) {
const std::pair<std::string, std::string> test_cases[] = {
{"https://www.google.com/", "https://www.google.com/"},
{"about://version/", chrome::kChromeUIVersionURL},
diff --git a/chromium/chrome/browser/extensions/api/file_system/chrome_file_system_delegate.cc b/chromium/chrome/browser/extensions/api/file_system/chrome_file_system_delegate.cc
index 8c0d5dbdbd1..4fc441cbe87 100644
--- a/chromium/chrome/browser/extensions/api/file_system/chrome_file_system_delegate.cc
+++ b/chromium/chrome/browser/extensions/api/file_system/chrome_file_system_delegate.cc
@@ -10,8 +10,8 @@
#include "apps/saved_files_service.h"
#include "base/bind.h"
#include "base/callback.h"
+#include "base/check.h"
#include "base/files/file_path.h"
-#include "base/logging.h"
#include "base/path_service.h"
#include "base/strings/string16.h"
#include "chrome/browser/extensions/api/file_system/file_entry_picker.h"
diff --git a/chromium/chrome/browser/extensions/api/file_system/file_system_apitest.cc b/chromium/chrome/browser/extensions/api/file_system/file_system_apitest.cc
index aed785c3276..19797a2b4db 100644
--- a/chromium/chrome/browser/extensions/api/file_system/file_system_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/file_system/file_system_apitest.cc
@@ -13,6 +13,7 @@
#include "chrome/browser/apps/platform_apps/app_browsertest_util.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/chrome_paths.h"
+#include "content/public/test/browser_test.h"
#include "extensions/browser/api/file_system/file_system_api.h"
#include "extensions/browser/api/file_system/saved_file_entry.h"
#include "extensions/browser/extension_prefs.h"
@@ -432,14 +433,8 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
CheckStoredDirectoryMatches(base::FilePath());
}
-// http://crbug.com/177163
-#if defined(OS_WIN) && !defined(NDEBUG)
-#define MAYBE_FileSystemApiOpenExistingFileWithWriteTest DISABLED_FileSystemApiOpenExistingFileWithWriteTest
-#else
-#define MAYBE_FileSystemApiOpenExistingFileWithWriteTest FileSystemApiOpenExistingFileWithWriteTest
-#endif
IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
- MAYBE_FileSystemApiOpenExistingFileWithWriteTest) {
+ FileSystemApiOpenExistingFileWithWriteTest) {
base::FilePath test_file = TempFilePath("open_existing.txt", true);
ASSERT_FALSE(test_file.empty());
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
diff --git a/chromium/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc b/chromium/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc
index 40d49f8499e..408f09d5342 100644
--- a/chromium/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc
+++ b/chromium/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc
@@ -22,6 +22,7 @@
#include "chrome/common/chrome_paths.h"
#include "chromeos/constants/chromeos_features.h"
#include "components/user_manager/scoped_user_manager.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_utils.h"
#include "extensions/browser/api/file_system/file_system_api.h"
#include "extensions/browser/event_router.h"
diff --git a/chromium/chrome/browser/extensions/api/font_settings/font_settings_apitest.cc b/chromium/chrome/browser/extensions/api/font_settings/font_settings_apitest.cc
index e6b4071b6a9..6d3f53d7b14 100644
--- a/chromium/chrome/browser/extensions/api/font_settings/font_settings_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/font_settings/font_settings_apitest.cc
@@ -10,6 +10,7 @@
#include "chrome/common/chrome_switches.h"
#include "chrome/common/pref_names.h"
#include "components/prefs/pref_service.h"
+#include "content/public/test/browser_test.h"
namespace extensions {
diff --git a/chromium/chrome/browser/extensions/api/gcm/gcm_apitest.cc b/chromium/chrome/browser/extensions/api/gcm/gcm_apitest.cc
index 58b8d24dda3..d9b189cf106 100644
--- a/chromium/chrome/browser/extensions/api/gcm/gcm_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/gcm/gcm_apitest.cc
@@ -14,6 +14,7 @@
#include "chrome/test/base/ui_test_utils.h"
#include "components/gcm_driver/fake_gcm_profile_service.h"
#include "components/sync/driver/sync_driver_switches.h"
+#include "content/public/test/browser_test.h"
#include "extensions/test/result_catcher.h"
using extensions::ResultCatcher;
diff --git a/chromium/chrome/browser/extensions/api/history/history_api.cc b/chromium/chrome/browser/extensions/api/history/history_api.cc
index 1692d8d951e..9c71893c995 100644
--- a/chromium/chrome/browser/extensions/api/history/history_api.cc
+++ b/chromium/chrome/browser/extensions/api/history/history_api.cc
@@ -264,7 +264,7 @@ ExtensionFunction::ResponseAction HistoryGetVisitsFunction::Run() {
GURL url;
std::string error;
if (!ValidateUrl(params->details.url, &url, &error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
history::HistoryService* hs = HistoryServiceFactory::GetForProfile(
GetProfile(), ServiceAccessType::EXPLICIT_ACCESS);
@@ -333,7 +333,7 @@ ExtensionFunction::ResponseAction HistoryAddUrlFunction::Run() {
GURL url;
std::string error;
if (!ValidateUrl(params->details.url, &url, &error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
history::HistoryService* hs = HistoryServiceFactory::GetForProfile(
GetProfile(), ServiceAccessType::EXPLICIT_ACCESS);
@@ -348,11 +348,11 @@ ExtensionFunction::ResponseAction HistoryDeleteUrlFunction::Run() {
std::string error;
if (!VerifyDeleteAllowed(&error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
GURL url;
if (!ValidateUrl(params->details.url, &url, &error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
history::HistoryService* hs = HistoryServiceFactory::GetForProfile(
GetProfile(), ServiceAccessType::EXPLICIT_ACCESS);
@@ -380,7 +380,7 @@ ExtensionFunction::ResponseAction HistoryDeleteRangeFunction::Run() {
std::string error;
if (!VerifyDeleteAllowed(&error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
base::Time start_time = GetTime(params->range.start_time);
base::Time end_time = GetTime(params->range.end_time);
@@ -415,7 +415,7 @@ void HistoryDeleteRangeFunction::DeleteComplete() {
ExtensionFunction::ResponseAction HistoryDeleteAllFunction::Run() {
std::string error;
if (!VerifyDeleteAllowed(&error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
std::set<GURL> restrict_urls;
history::HistoryService* hs = HistoryServiceFactory::GetForProfile(
diff --git a/chromium/chrome/browser/extensions/api/history/history_apitest.cc b/chromium/chrome/browser/extensions/api/history/history_apitest.cc
index 27e12e5a7b2..acba025d1dd 100644
--- a/chromium/chrome/browser/extensions/api/history/history_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/history/history_apitest.cc
@@ -10,6 +10,7 @@
#include "chrome/common/pref_names.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/prefs/pref_service.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
#include "extensions/browser/process_manager.h"
@@ -41,15 +42,13 @@ class HistoryApiTest : public ExtensionApiTest {
}
};
-// Full text search indexing sometimes exceeds a timeout. (http://crbug/119505)
-IN_PROC_BROWSER_TEST_F(HistoryApiTest, DISABLED_MiscSearch) {
+IN_PROC_BROWSER_TEST_F(HistoryApiTest, MiscSearch) {
ASSERT_TRUE(StartEmbeddedTestServer());
ASSERT_TRUE(RunExtensionSubtest("history/regular", "misc_search.html"))
<< message_;
}
-// Same could happen here without the FTS (http://crbug/119505)
-IN_PROC_BROWSER_TEST_F(HistoryApiTest, DISABLED_TimedSearch) {
+IN_PROC_BROWSER_TEST_F(HistoryApiTest, TimedSearch) {
ASSERT_TRUE(StartEmbeddedTestServer());
ASSERT_TRUE(RunExtensionSubtest("history/regular", "timed_search.html"))
<< message_;
diff --git a/chromium/chrome/browser/extensions/api/i18n/i18n_apitest.cc b/chromium/chrome/browser/extensions/api/i18n/i18n_apitest.cc
index b8d0b5b9e15..64f71ab24f3 100644
--- a/chromium/chrome/browser/extensions/api/i18n/i18n_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/i18n/i18n_apitest.cc
@@ -10,6 +10,7 @@
#include "chrome/browser/extensions/extension_apitest.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/test/browser_test.h"
#include "extensions/common/extension.h"
#include "extensions/test/result_catcher.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
diff --git a/chromium/chrome/browser/extensions/api/identity/OWNERS b/chromium/chrome/browser/extensions/api/identity/OWNERS
index cebe67713dc..969297fa228 100644
--- a/chromium/chrome/browser/extensions/api/identity/OWNERS
+++ b/chromium/chrome/browser/extensions/api/identity/OWNERS
@@ -1,5 +1,6 @@
droger@chromium.org
msarda@chromium.org
+alexilin@chromium.org
# Original author, very slow on reviews as no longer working on Chromium.
courage@chromium.org
diff --git a/chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.cc b/chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.cc
index 1d786a2d056..e650e3f1ebb 100644
--- a/chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.cc
+++ b/chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.cc
@@ -17,6 +17,7 @@
#include "google_apis/gaia/gaia_auth_util.h"
#include "google_apis/gaia/gaia_urls.h"
#include "net/base/escape.h"
+#include "net/cookies/cookie_util.h"
#include "services/network/public/mojom/cookie_manager.mojom.h"
#include "url/gurl.h"
#include "url/url_constants.h"
@@ -33,7 +34,9 @@ GaiaRemoteConsentFlow::GaiaRemoteConsentFlow(
: delegate_(delegate),
profile_(profile),
account_id_(token_key.account_id),
- resolution_data_(resolution_data) {}
+ resolution_data_(resolution_data),
+ web_flow_started_(false),
+ scoped_observer_(this) {}
GaiaRemoteConsentFlow::~GaiaRemoteConsentFlow() {
if (web_flow_)
@@ -43,36 +46,20 @@ GaiaRemoteConsentFlow::~GaiaRemoteConsentFlow() {
void GaiaRemoteConsentFlow::Start() {
if (!web_flow_) {
web_flow_ = std::make_unique<WebAuthFlow>(
- this, profile_, resolution_data_.url, WebAuthFlow::INTERACTIVE);
+ this, profile_, resolution_data_.url, WebAuthFlow::INTERACTIVE,
+ WebAuthFlow::GET_AUTH_TOKEN);
}
- auto* identity_manager = IdentityManagerFactory::GetForProfile(profile_);
- std::vector<CoreAccountId> accounts;
- auto chrome_accounts_with_refresh_tokens =
- identity_manager->GetAccountsWithRefreshTokens();
- for (const auto& chrome_account : chrome_accounts_with_refresh_tokens) {
- // An account in persistent error state would make multilogin fail. Showing
- // only a subset of accounts seems to be a better alternative than failing
- // with an error.
- if (identity_manager->HasAccountWithRefreshTokenInPersistentErrorState(
- chrome_account.account_id)) {
- continue;
- }
- accounts.push_back(chrome_account.account_id);
- }
-
- set_accounts_in_cookie_task_ =
- identity_manager->GetAccountsCookieMutator()
- ->SetAccountsInCookieForPartition(
- this,
- {gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
- accounts},
- base::BindOnce(&GaiaRemoteConsentFlow::OnSetAccountsComplete,
- base::Unretained(this)));
+ SetAccountsInCookie();
}
void GaiaRemoteConsentFlow::OnSetAccountsComplete(
signin::SetAccountsInCookieResult result) {
+ set_accounts_in_cookie_task_.reset();
+ if (web_flow_started_) {
+ return;
+ }
+
if (result != signin::SetAccountsInCookieResult::kSuccess) {
delegate_->OnGaiaRemoteConsentFlowFailed(
GaiaRemoteConsentFlow::Failure::SET_ACCOUNTS_IN_COOKIE_FAILED);
@@ -84,8 +71,9 @@ void GaiaRemoteConsentFlow::OnSetAccountsComplete(
net::CookieOptions options;
for (const auto& cookie : resolution_data_.cookies) {
cookie_manager->SetCanonicalCookie(
- cookie, url::kHttpsScheme, options,
- network::mojom::CookieManager::SetCanonicalCookieCallback());
+ cookie,
+ net::cookie_util::SimulatedCookieSource(cookie, url::kHttpsScheme),
+ options, network::mojom::CookieManager::SetCanonicalCookieCallback());
}
identity_api_set_consent_result_subscription_ =
@@ -95,8 +83,9 @@ void GaiaRemoteConsentFlow::OnSetAccountsComplete(
base::Bind(&GaiaRemoteConsentFlow::OnConsentResultSet,
base::Unretained(this)));
- set_accounts_in_cookie_task_.reset();
+ scoped_observer_.Add(IdentityManagerFactory::GetForProfile(profile_));
web_flow_->Start();
+ web_flow_started_ = true;
}
void GaiaRemoteConsentFlow::OnConsentResultSet(
@@ -156,6 +145,10 @@ GaiaRemoteConsentFlow::GetCookieManagerForPartition() {
return web_flow_->GetGuestPartition()->GetCookieManagerForBrowserProcess();
}
+void GaiaRemoteConsentFlow::OnEndBatchOfRefreshTokenStateChanges() {
+ SetAccountsInCookie();
+}
+
void GaiaRemoteConsentFlow::SetWebAuthFlowForTesting(
std::unique_ptr<WebAuthFlow> web_auth_flow) {
if (web_flow_)
@@ -163,4 +156,44 @@ void GaiaRemoteConsentFlow::SetWebAuthFlowForTesting(
web_flow_ = std::move(web_auth_flow);
}
+void GaiaRemoteConsentFlow::SetAccountsInCookie() {
+ // Reset a task that is already in flight because it contains stale
+ // information.
+ if (set_accounts_in_cookie_task_)
+ set_accounts_in_cookie_task_.reset();
+
+ auto* identity_manager = IdentityManagerFactory::GetForProfile(profile_);
+ std::vector<CoreAccountId> accounts;
+ if (IdentityAPI::GetFactoryInstance()
+ ->Get(profile_)
+ ->AreExtensionsRestrictedToPrimaryAccount()) {
+ CoreAccountId primary_account_id = identity_manager->GetPrimaryAccountId();
+ accounts.push_back(primary_account_id);
+ } else {
+ auto chrome_accounts_with_refresh_tokens =
+ identity_manager->GetAccountsWithRefreshTokens();
+ for (const auto& chrome_account : chrome_accounts_with_refresh_tokens) {
+ // An account in persistent error state would make multilogin fail.
+ // Showing only a subset of accounts seems to be a better alternative than
+ // failing with an error.
+ if (identity_manager->HasAccountWithRefreshTokenInPersistentErrorState(
+ chrome_account.account_id)) {
+ continue;
+ }
+ accounts.push_back(chrome_account.account_id);
+ }
+ }
+
+ // base::Unretained() is safe here because this class owns
+ // |set_accounts_in_cookie_task_| that will eventually invoke this callback.
+ set_accounts_in_cookie_task_ =
+ identity_manager->GetAccountsCookieMutator()
+ ->SetAccountsInCookieForPartition(
+ this,
+ {gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
+ accounts},
+ base::BindOnce(&GaiaRemoteConsentFlow::OnSetAccountsComplete,
+ base::Unretained(this)));
+}
+
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.h b/chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.h
index 9c5d4867dc3..433777bc7c0 100644
--- a/chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.h
+++ b/chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.h
@@ -8,9 +8,12 @@
#include "base/callback_list.h"
#include "base/macros.h"
+#include "base/scoped_observer.h"
#include "chrome/browser/extensions/api/identity/extension_token_key.h"
#include "chrome/browser/extensions/api/identity/web_auth_flow.h"
#include "components/signin/public/identity_manager/accounts_cookie_mutator.h"
+#include "components/signin/public/identity_manager/identity_manager.h"
+#include "components/signin/public/identity_manager/set_accounts_in_cookie_result.h"
#include "google_apis/gaia/core_account_id.h"
#include "google_apis/gaia/google_service_auth_error.h"
#include "google_apis/gaia/oauth2_mint_token_flow.h"
@@ -19,7 +22,8 @@ namespace extensions {
class GaiaRemoteConsentFlow
: public WebAuthFlow::Delegate,
- public signin::AccountsCookieMutator::PartitionDelegate {
+ public signin::AccountsCookieMutator::PartitionDelegate,
+ public signin::IdentityManager::Observer {
public:
enum Failure {
WINDOW_CLOSED,
@@ -60,27 +64,37 @@ class GaiaRemoteConsentFlow
void OnConsentResultSet(const std::string& consent_result,
const std::string& window_id);
- // WebAuthFlow::Delegate implementation.
+ // WebAuthFlow::Delegate:
void OnAuthFlowFailure(WebAuthFlow::Failure failure) override;
- // AccountsCookieMutator::PartitionDelegate:
+ // signin::AccountsCookieMutator::PartitionDelegate:
std::unique_ptr<GaiaAuthFetcher> CreateGaiaAuthFetcherForPartition(
GaiaAuthConsumer* consumer) override;
network::mojom::CookieManager* GetCookieManagerForPartition() override;
+ // signin::IdentityManager::Observer:
+ void OnEndBatchOfRefreshTokenStateChanges() override;
+
void SetWebAuthFlowForTesting(std::unique_ptr<WebAuthFlow> web_auth_flow);
private:
+ void SetAccountsInCookie();
+
Delegate* delegate_;
Profile* profile_;
CoreAccountId account_id_;
RemoteConsentResolutionData resolution_data_;
+
std::unique_ptr<WebAuthFlow> web_flow_;
+ bool web_flow_started_;
+
std::unique_ptr<signin::AccountsCookieMutator::SetAccountsInCookieTask>
set_accounts_in_cookie_task_;
std::unique_ptr<base::CallbackList<void(const std::string&,
const std::string&)>::Subscription>
identity_api_set_consent_result_subscription_;
+ ScopedObserver<signin::IdentityManager, signin::IdentityManager::Observer>
+ scoped_observer_;
};
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow_unittest.cc b/chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow_unittest.cc
index 95441a4941f..fa1a7c19ed7 100644
--- a/chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/identity/gaia_remote_consent_flow_unittest.cc
@@ -25,7 +25,11 @@ class FakeWebAuthFlowWithWindowKey : public WebAuthFlow {
public:
explicit FakeWebAuthFlowWithWindowKey(WebAuthFlow::Delegate* delegate,
std::string window_key)
- : WebAuthFlow(delegate, nullptr, GURL(), WebAuthFlow::INTERACTIVE),
+ : WebAuthFlow(delegate,
+ nullptr,
+ GURL(),
+ WebAuthFlow::INTERACTIVE,
+ WebAuthFlow::GET_AUTH_TOKEN),
fake_window_key_(window_key) {}
~FakeWebAuthFlowWithWindowKey() override = default;
diff --git a/chromium/chrome/browser/extensions/api/identity/gaia_web_auth_flow.cc b/chromium/chrome/browser/extensions/api/identity/gaia_web_auth_flow.cc
index 4eafced9daa..52a6a568143 100644
--- a/chromium/chrome/browser/extensions/api/identity/gaia_web_auth_flow.cc
+++ b/chromium/chrome/browser/extensions/api/identity/gaia_web_auth_flow.cc
@@ -223,7 +223,8 @@ void GaiaWebAuthFlow::OnAuthFlowTitleChange(const std::string& title) {
std::unique_ptr<WebAuthFlow> GaiaWebAuthFlow::CreateWebAuthFlow(GURL url) {
return std::unique_ptr<WebAuthFlow>(
- new WebAuthFlow(this, profile_, url, WebAuthFlow::INTERACTIVE));
+ new WebAuthFlow(this, profile_, url, WebAuthFlow::INTERACTIVE,
+ WebAuthFlow::GET_AUTH_TOKEN));
}
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/identity/gaia_web_auth_flow_unittest.cc b/chromium/chrome/browser/extensions/api/identity/gaia_web_auth_flow_unittest.cc
index 9738fe8944f..5c961a9be63 100644
--- a/chromium/chrome/browser/extensions/api/identity/gaia_web_auth_flow_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/identity/gaia_web_auth_flow_unittest.cc
@@ -32,7 +32,11 @@ class DeleteCookiesTestCookieManager : public network::TestCookieManager {
class FakeWebAuthFlow : public WebAuthFlow {
public:
explicit FakeWebAuthFlow(WebAuthFlow::Delegate* delegate)
- : WebAuthFlow(delegate, nullptr, GURL(), WebAuthFlow::INTERACTIVE) {
+ : WebAuthFlow(delegate,
+ nullptr,
+ GURL(),
+ WebAuthFlow::INTERACTIVE,
+ WebAuthFlow::GET_AUTH_TOKEN) {
storage_partition.set_cookie_manager_for_browser_process(&cookie_manager);
}
diff --git a/chromium/chrome/browser/extensions/api/identity/identity_api.cc b/chromium/chrome/browser/extensions/api/identity/identity_api.cc
index 7c83df99493..b445f29c1ed 100644
--- a/chromium/chrome/browser/extensions/api/identity/identity_api.cc
+++ b/chromium/chrome/browser/extensions/api/identity/identity_api.cc
@@ -260,7 +260,8 @@ IdentityAPI::RegisterOnShutdownCallback(const base::Closure& cb) {
}
bool IdentityAPI::AreExtensionsRestrictedToPrimaryAccount() {
- return !AccountConsistencyModeManager::IsDiceEnabledForProfile(profile_);
+ return !AccountConsistencyModeManager::IsDiceEnabledForProfile(profile_) &&
+ !AccountConsistencyModeManager::IsMirrorEnabledForProfile(profile_);
}
IdentityAPI::IdentityAPI(Profile* profile,
diff --git a/chromium/chrome/browser/extensions/api/identity/identity_api_unittest.cc b/chromium/chrome/browser/extensions/api/identity/identity_api_unittest.cc
index 61fd982c158..fb8e51b5772 100644
--- a/chromium/chrome/browser/extensions/api/identity/identity_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/identity/identity_api_unittest.cc
@@ -9,7 +9,6 @@
#include "base/optional.h"
#include "base/test/scoped_feature_list.h"
#include "base/threading/thread_task_runner_handle.h"
-#include "build/build_config.h"
#include "chrome/browser/extensions/test_extension_prefs.h"
#include "chrome/test/base/testing_profile.h"
#include "components/signin/public/base/signin_buildflags.h"
@@ -59,16 +58,10 @@ class IdentityAPITest : public testing::Test {
std::unique_ptr<IdentityAPI> api_;
};
-#if BUILDFLAG(ENABLE_DICE_SUPPORT)
-// Tests that all accounts in extensions is enabled when Dice is enabled.
-TEST_F(IdentityAPITest, DiceAllAccountsExtensions) {
+// Tests that all accounts in extensions is enabled for regular profiles.
+TEST_F(IdentityAPITest, AllAccountsExtensionEnabled) {
EXPECT_FALSE(api()->AreExtensionsRestrictedToPrimaryAccount());
}
-#else
-TEST_F(IdentityAPITest, AllAccountsExtensionDisabled) {
- EXPECT_TRUE(api()->AreExtensionsRestrictedToPrimaryAccount());
-}
-#endif
TEST_F(IdentityAPITest, GetGaiaIdForExtension) {
std::string extension_id = prefs()->AddExtensionAndReturnId("extension");
diff --git a/chromium/chrome/browser/extensions/api/identity/identity_apitest.cc b/chromium/chrome/browser/extensions/api/identity/identity_apitest.cc
index 41eef37347e..68327bb525c 100644
--- a/chromium/chrome/browser/extensions/api/identity/identity_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/identity/identity_apitest.cc
@@ -13,7 +13,7 @@
#include "base/memory/ptr_util.h"
#include "base/run_loop.h"
#include "base/strings/string_util.h"
-#include "base/test/scoped_feature_list.h"
+#include "base/strings/stringprintf.h"
#include "base/values.h"
#include "build/build_config.h"
#include "build/buildflag.h"
@@ -57,6 +57,7 @@
#include "components/signin/public/identity_manager/identity_test_utils.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_source.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_utils.h"
#include "extensions/browser/api_test_utils.h"
#include "extensions/common/extension_builder.h"
@@ -70,7 +71,11 @@
#if defined(OS_CHROMEOS)
#include "chrome/browser/chromeos/login/users/mock_user_manager.h"
+#include "chrome/browser/chromeos/net/network_portal_detector_test_impl.h"
#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
+#include "chromeos/network/network_handler.h"
+#include "chromeos/network/network_state.h"
+#include "chromeos/network/network_state_handler.h"
#include "chromeos/tpm/stub_install_attributes.h"
#include "components/user_manager/scoped_user_manager.h"
#endif
@@ -89,6 +94,27 @@ namespace utils = extension_function_test_utils;
static const char kAccessToken[] = "auth_token";
static const char kExtensionId[] = "ext_id";
+#if defined(OS_CHROMEOS)
+void InitNetwork() {
+ const chromeos::NetworkState* default_network =
+ chromeos::NetworkHandler::Get()
+ ->network_state_handler()
+ ->DefaultNetwork();
+
+ auto* portal_detector = new chromeos::NetworkPortalDetectorTestImpl();
+ portal_detector->SetDefaultNetworkForTesting(default_network->guid());
+
+ chromeos::NetworkPortalDetector::CaptivePortalState online_state;
+ online_state.status =
+ chromeos::NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE;
+ online_state.response_code = 204;
+ portal_detector->SetDetectionResultsForTesting(default_network->guid(),
+ online_state);
+
+ chromeos::network_portal_detector::InitializeForTesting(portal_detector);
+}
+#endif
+
// Asynchronous function runner allows tests to manipulate the browser window
// after the call happens.
class AsyncFunctionRunner {
@@ -287,6 +313,7 @@ class FakeGetAuthTokenFunction : public IdentityGetAuthTokenFunction {
auto_login_access_token_(true),
login_ui_result_(true),
scope_ui_result_(true),
+ scope_ui_async_(false),
scope_ui_failure_(GaiaWebAuthFlow::WINDOW_CLOSED),
login_ui_shown_(false),
scope_ui_shown_(false) {}
@@ -310,6 +337,14 @@ class FakeGetAuthTokenFunction : public IdentityGetAuthTokenFunction {
std::make_unique<TestOAuth2MintTokenFlow>(result_type, this));
}
+ // Sets scope UI to not complete immediately. Call
+ // CompleteOAuthApprovalDialog() or CompleteRemoteConsentDialog() after
+ // |on_scope_ui_shown| is invoked to unblock execution.
+ void set_scope_ui_async(base::OnceClosure on_scope_ui_shown) {
+ scope_ui_async_ = true;
+ on_scope_ui_shown_ = std::move(on_scope_ui_shown);
+ }
+
void set_scope_ui_failure(GaiaWebAuthFlow::Failure failure) {
scope_ui_result_ = false;
scope_ui_failure_ = failure;
@@ -416,7 +451,13 @@ class FakeGetAuthTokenFunction : public IdentityGetAuthTokenFunction {
void ShowOAuthApprovalDialog(const IssueAdviceInfo& issue_advice) override {
scope_ui_shown_ = true;
+ if (!scope_ui_async_)
+ CompleteOAuthApprovalDialog();
+ else
+ std::move(on_scope_ui_shown_).Run();
+ }
+ void CompleteOAuthApprovalDialog() {
if (scope_ui_result_) {
OnGaiaFlowCompleted(kAccessToken, "3600");
} else if (scope_ui_failure_ == GaiaWebAuthFlow::SERVICE_AUTH_ERROR) {
@@ -430,6 +471,13 @@ class FakeGetAuthTokenFunction : public IdentityGetAuthTokenFunction {
void ShowRemoteConsentDialog(
const RemoteConsentResolutionData& resolution_data) override {
scope_ui_shown_ = true;
+ if (!scope_ui_async_)
+ CompleteRemoteConsentDialog();
+ else
+ std::move(on_scope_ui_shown_).Run();
+ }
+
+ void CompleteRemoteConsentDialog() {
if (scope_ui_result_) {
OnGaiaRemoteConsentFlowApproved("fake_consent_result",
remote_consent_gaia_id_);
@@ -457,6 +505,8 @@ class FakeGetAuthTokenFunction : public IdentityGetAuthTokenFunction {
bool auto_login_access_token_;
bool login_ui_result_;
bool scope_ui_result_;
+ bool scope_ui_async_;
+ base::OnceClosure on_scope_ui_shown_;
GaiaWebAuthFlow::Failure scope_ui_failure_;
GoogleServiceAuthError scope_ui_service_error_;
std::string scope_ui_oauth_error_;
@@ -500,12 +550,19 @@ class IdentityTestWithSignin : public AsyncExtensionBrowserTest {
void SetUpOnMainThread() override {
AsyncExtensionBrowserTest::SetUpOnMainThread();
+#if defined(OS_CHROMEOS)
+ // Fake the network online state so that Gaia requests can come through.
+ InitNetwork();
+#endif
+
identity_test_env_profile_adaptor_ =
std::make_unique<IdentityTestEnvironmentProfileAdaptor>(profile());
// This test requires these callbacks to be fired on account
// update/removal.
identity_test_env()->EnableRemovalOfExtendedAccountInfo();
+
+ identity_test_env()->SetTestURLLoaderFactory(&test_url_loader_factory_);
}
void TearDownOnMainThread() override {
@@ -611,11 +668,7 @@ class IdentityGetAccountsFunctionTest : public IdentityTestWithSignin {
};
IN_PROC_BROWSER_TEST_F(IdentityGetAccountsFunctionTest, AllAccountsOn) {
-#if BUILDFLAG(ENABLE_DICE_SUPPORT)
EXPECT_FALSE(id_api()->AreExtensionsRestrictedToPrimaryAccount());
-#else
- EXPECT_TRUE(id_api()->AreExtensionsRestrictedToPrimaryAccount());
-#endif
}
IN_PROC_BROWSER_TEST_F(IdentityGetAccountsFunctionTest, NoneSignedIn) {
@@ -673,7 +726,6 @@ class IdentityGetProfileUserInfoFunctionTest : public IdentityTestWithSignin {
return api::identity::ProfileUserInfo::FromValue(*value);
}
- private:
scoped_refptr<const Extension> CreateExtensionWithEmailPermission() {
return ExtensionBuilder("Test").AddPermission("identity.email").Build();
}
@@ -695,6 +747,16 @@ IN_PROC_BROWSER_TEST_F(IdentityGetProfileUserInfoFunctionTest, SignedIn) {
}
IN_PROC_BROWSER_TEST_F(IdentityGetProfileUserInfoFunctionTest,
+ SignedInUnconsented) {
+ identity_test_env()->MakeUnconsentedPrimaryAccountAvailable(
+ "test@example.com");
+ std::unique_ptr<api::identity::ProfileUserInfo> info =
+ RunGetProfileUserInfoWithEmail();
+ EXPECT_TRUE(info->email.empty());
+ EXPECT_TRUE(info->id.empty());
+}
+
+IN_PROC_BROWSER_TEST_F(IdentityGetProfileUserInfoFunctionTest,
NotSignedInNoEmail) {
std::unique_ptr<api::identity::ProfileUserInfo> info =
RunGetProfileUserInfo();
@@ -711,14 +773,72 @@ IN_PROC_BROWSER_TEST_F(IdentityGetProfileUserInfoFunctionTest,
EXPECT_TRUE(info->id.empty());
}
+class IdentityGetProfileUserInfoFunctionTestWithAccountStatusParam
+ : public IdentityGetProfileUserInfoFunctionTest,
+ public ::testing::WithParamInterface<std::string> {
+ protected:
+ std::unique_ptr<api::identity::ProfileUserInfo>
+ RunGetProfileUserInfoWithAccountStatus() {
+ scoped_refptr<IdentityGetProfileUserInfoFunction> func(
+ new IdentityGetProfileUserInfoFunction);
+ func->set_extension(CreateExtensionWithEmailPermission());
+ std::string args = base::StringPrintf(R"([{"accountStatus": "%s"}])",
+ account_status().c_str());
+ std::unique_ptr<base::Value> value(
+ utils::RunFunctionAndReturnSingleResult(func.get(), args, browser()));
+ return api::identity::ProfileUserInfo::FromValue(*value);
+ }
+
+ std::string account_status() { return GetParam(); }
+};
+
+INSTANTIATE_TEST_SUITE_P(
+ All,
+ IdentityGetProfileUserInfoFunctionTestWithAccountStatusParam,
+ ::testing::Values("SYNC", "ANY"));
+
+IN_PROC_BROWSER_TEST_P(
+ IdentityGetProfileUserInfoFunctionTestWithAccountStatusParam,
+ NotSignedIn) {
+ std::unique_ptr<api::identity::ProfileUserInfo> info =
+ RunGetProfileUserInfoWithAccountStatus();
+ EXPECT_TRUE(info->email.empty());
+ EXPECT_TRUE(info->id.empty());
+}
+
+IN_PROC_BROWSER_TEST_P(
+ IdentityGetProfileUserInfoFunctionTestWithAccountStatusParam,
+ SignedIn) {
+ SignIn("test@example.com");
+ std::unique_ptr<api::identity::ProfileUserInfo> info =
+ RunGetProfileUserInfoWithAccountStatus();
+ EXPECT_EQ("test@example.com", info->email);
+ EXPECT_EQ("gaia_id_for_test_example.com", info->id);
+}
+
+IN_PROC_BROWSER_TEST_P(
+ IdentityGetProfileUserInfoFunctionTestWithAccountStatusParam,
+ SignedInUnconsented) {
+ identity_test_env()->MakeUnconsentedPrimaryAccountAvailable(
+ "test@example.com");
+ std::unique_ptr<api::identity::ProfileUserInfo> info =
+ RunGetProfileUserInfoWithAccountStatus();
+ // The unconsented (Sync off) primary account is returned conditionally,
+ // depending on the accountStatus parameter.
+ if (account_status() == "ANY") {
+ EXPECT_EQ("test@example.com", info->email);
+ EXPECT_EQ("gaia_id_for_test_example.com", info->id);
+ } else {
+ // accountStatus is SYNC or unspecified.
+ EXPECT_TRUE(info->email.empty());
+ EXPECT_TRUE(info->id.empty());
+ }
+}
+
class GetAuthTokenFunctionTest
: public IdentityTestWithSignin,
public signin::IdentityManager::DiagnosticsObserver {
public:
- GetAuthTokenFunctionTest() {
- scoped_feature_list_.InitAndEnableFeature(switches::kOAuthRemoteConsent);
- }
-
std::string IssueLoginAccessTokenForAccount(const CoreAccountId& account_id) {
std::string access_token = "access_token-" + account_id.ToString();
identity_test_env()
@@ -771,6 +891,10 @@ class GetAuthTokenFunctionTest
return ext;
}
+ CoreAccountInfo GetPrimaryAccountInfo() {
+ return identity_test_env()->identity_manager()->GetPrimaryAccountInfo();
+ }
+
CoreAccountId GetPrimaryAccountId() {
return identity_test_env()->identity_manager()->GetPrimaryAccountId();
}
@@ -828,8 +952,6 @@ class GetAuthTokenFunctionTest
std::string extension_id_;
std::set<std::string> oauth_scopes_;
-
- base::test::ScopedFeatureList scoped_feature_list_;
};
IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, NoClientId) {
@@ -1642,9 +1764,8 @@ IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, LoginInvalidatesTokenCache) {
EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_NOTFOUND,
GetCachedToken(CoreAccountId()).status());
}
+#endif
-// ChromeOS supports primary accounts only. So the test isn't applicable on that
-// platform.
IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
IssueAdviceInvalidatesGaiaIdCache) {
SignIn("primary@example.com");
@@ -1670,8 +1791,6 @@ IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
EXPECT_FALSE(GetCachedGaiaId().has_value());
}
-// ChromeOS supports primary accounts only. So the test isn't applicable on that
-// platform.
IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
IssueAdviceFailureInvalidatesGaiaIdCache) {
SignIn("primary@example.com");
@@ -1696,7 +1815,6 @@ IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
EXPECT_TRUE(func->scope_ui_shown());
EXPECT_FALSE(GetCachedGaiaId().has_value());
}
-#endif
IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, ComponentWithChromeClientId) {
scoped_refptr<FakeGetAuthTokenFunction> func(new FakeGetAuthTokenFunction());
@@ -1893,10 +2011,6 @@ IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
MultiSecondaryUserManuallyIssueToken) {
- // This test is only relevant if extensions see all accounts.
- if (id_api()->AreExtensionsRestrictedToPrimaryAccount())
- return;
-
SignIn("primary@example.com");
CoreAccountId secondary_account_id =
identity_test_env()
@@ -1909,11 +2023,22 @@ IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
func->set_auto_login_access_token(false);
func->push_mint_token_result(TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS);
+ const char kFunctionParams[] =
+ "[{\"account\": { \"id\": \"gaia_id_for_secondary_example.com\" } }]";
+
+ if (id_api()->AreExtensionsRestrictedToPrimaryAccount()) {
+ // Fail if extensions are restricted to the primary account.
+ std::string error = utils::RunFunctionAndReturnError(
+ func.get(), kFunctionParams, browser());
+ EXPECT_EQ(std::string(errors::kUserNonPrimary), error);
+ EXPECT_FALSE(func->login_ui_shown());
+ EXPECT_FALSE(func->scope_ui_shown());
+ return;
+ }
+
base::RunLoop run_loop;
on_access_token_requested_ = run_loop.QuitClosure();
- RunFunctionAsync(
- func.get(),
- "[{\"account\": { \"id\": \"gaia_id_for_secondary_example.com\" } }]");
+ RunFunctionAsync(func.get(), kFunctionParams);
run_loop.Run();
std::string secondary_account_access_token =
@@ -1942,7 +2067,11 @@ IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
std::string error = utils::RunFunctionAndReturnError(
func.get(), "[{\"account\": { \"id\": \"unknown@example.com\" } }]",
browser());
- EXPECT_EQ(std::string(errors::kUserNotSignedIn), error);
+ std::string expected_error;
+ if (id_api()->AreExtensionsRestrictedToPrimaryAccount())
+ EXPECT_EQ(errors::kUserNonPrimary, error);
+ else
+ EXPECT_EQ(errors::kUserNotSignedIn, error);
}
IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
@@ -2015,10 +2144,6 @@ IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
// getAuthToken() call for the same extension.
IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
MultiSecondaryInteractiveRemoteConsent) {
- // This test is only relevant if extensions see all accounts.
- if (id_api()->AreExtensionsRestrictedToPrimaryAccount())
- return;
-
CoreAccountId primary_account_id = SignIn("primary@example.com");
AccountInfo secondary_account =
identity_test_env()->MakeAccountAvailable("secondary@example.com");
@@ -2044,6 +2169,12 @@ IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
// the account that has been returned in result of the remote consent.
std::string primary_account_access_token =
IssueLoginAccessTokenForAccount(primary_account_id);
+
+ if (id_api()->AreExtensionsRestrictedToPrimaryAccount()) {
+ EXPECT_EQ(std::string(errors::kUserNonPrimary), WaitForError(func.get()));
+ return;
+ }
+
std::string secondary_account_access_token =
IssueLoginAccessTokenForAccount(secondary_account.account_id);
@@ -2076,6 +2207,128 @@ IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
}
}
+// Tests two concurrent remote consent flows. Both of them should succeed.
+// The second flow starts while the first one is blocked on an interactive mint
+// token flow. This is a regression test for https://crbug.com/1091423.
+IN_PROC_BROWSER_TEST_F(
+ GetAuthTokenFunctionTest,
+ RemoteConsentMultipleActiveRequests_BlockedOnInteractive) {
+ SignIn("primary@example.com");
+ CoreAccountInfo account = GetPrimaryAccountInfo();
+ const extensions::Extension* extension = CreateExtension(CLIENT_ID | SCOPES);
+
+ scoped_refptr<FakeGetAuthTokenFunction> func1(new FakeGetAuthTokenFunction());
+ func1->set_extension(extension);
+ func1->push_mint_token_result(
+ TestOAuth2MintTokenFlow::REMOTE_CONSENT_SUCCESS);
+ func1->push_mint_token_result(TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS);
+ func1->set_remote_consent_gaia_id(account.gaia);
+ base::RunLoop scope_ui_shown_loop;
+ func1->set_scope_ui_async(scope_ui_shown_loop.QuitClosure());
+
+ scoped_refptr<FakeGetAuthTokenFunction> func2(new FakeGetAuthTokenFunction());
+ func2->set_extension(extension);
+ func2->push_mint_token_result(TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS);
+ func2->set_remote_consent_gaia_id(account.gaia);
+
+ AsyncFunctionRunner func1_runner;
+ func1_runner.RunFunctionAsync(func1.get(), "[{\"interactive\": true}]",
+ browser()->profile());
+
+ AsyncFunctionRunner func2_runner;
+ func2_runner.RunFunctionAsync(func2.get(), "[{\"interactive\": true}]",
+ browser()->profile());
+
+ // Allows func2 to put a task in the queue.
+ base::RunLoop().RunUntilIdle();
+
+ scope_ui_shown_loop.Run();
+ func1->CompleteRemoteConsentDialog();
+
+ std::unique_ptr<base::Value> value1(
+ func1_runner.WaitForSingleResult(func1.get()));
+ ASSERT_NE(value1, nullptr);
+ EXPECT_EQ(base::Value(kAccessToken), *value1);
+
+ std::unique_ptr<base::Value> value2(
+ func2_runner.WaitForSingleResult(func2.get()));
+ ASSERT_NE(value2, nullptr);
+ EXPECT_EQ(base::Value(kAccessToken), *value2);
+
+ // Only one consent ui should be shown.
+ int total_scope_ui_shown = func1->scope_ui_shown() + func2->scope_ui_shown();
+ EXPECT_EQ(1, total_scope_ui_shown);
+
+ EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN,
+ GetCachedToken(account.account_id).status());
+}
+
+// Tests two concurrent remote consent flows. Both of them should succeed.
+// The second flow starts while the first one is blocked on a non-interactive
+// mint token flow. This is a regression test for https://crbug.com/1091423.
+IN_PROC_BROWSER_TEST_F(
+ GetAuthTokenFunctionTest,
+ RemoteConsentMultipleActiveRequests_BlockedOnNoninteractive) {
+ SignIn("primary@example.com");
+ CoreAccountInfo account = GetPrimaryAccountInfo();
+ const extensions::Extension* extension = CreateExtension(CLIENT_ID | SCOPES);
+
+ scoped_refptr<FakeGetAuthTokenFunction> func1(new FakeGetAuthTokenFunction());
+ func1->set_extension(extension);
+ func1->push_mint_token_result(
+ TestOAuth2MintTokenFlow::REMOTE_CONSENT_SUCCESS);
+ func1->push_mint_token_result(TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS);
+ func1->set_remote_consent_gaia_id(account.gaia);
+ func1->set_auto_login_access_token(false);
+
+ scoped_refptr<FakeGetAuthTokenFunction> func2(new FakeGetAuthTokenFunction());
+ func2->set_extension(extension);
+ func2->push_mint_token_result(TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS);
+ func2->set_remote_consent_gaia_id(account.gaia);
+ base::RunLoop scope_ui_shown_loop;
+ func2->set_scope_ui_async(scope_ui_shown_loop.QuitClosure());
+
+ base::RunLoop access_token_run_loop;
+ on_access_token_requested_ = access_token_run_loop.QuitClosure();
+ AsyncFunctionRunner func1_runner;
+ func1_runner.RunFunctionAsync(func1.get(), "[{\"interactive\": true}]",
+ browser()->profile());
+
+ AsyncFunctionRunner func2_runner;
+ func2_runner.RunFunctionAsync(func2.get(), "[{\"interactive\": true}]",
+ browser()->profile());
+
+ // Allows func2 to put a task in the queue.
+ base::RunLoop().RunUntilIdle();
+
+ access_token_run_loop.Run();
+ // Let subsequent requests pass automatically.
+ func1->set_auto_login_access_token(true);
+ IssueLoginAccessTokenForAccount(account.account_id);
+
+ scope_ui_shown_loop.Run();
+ func2->CompleteRemoteConsentDialog();
+
+ std::unique_ptr<base::Value> value1(
+ func1_runner.WaitForSingleResult(func1.get()));
+ ASSERT_NE(value1, nullptr);
+ EXPECT_EQ(base::Value(kAccessToken), *value1);
+
+ std::unique_ptr<base::Value> value2(
+ func2_runner.WaitForSingleResult(func2.get()));
+ ASSERT_NE(value2, nullptr);
+ EXPECT_EQ(base::Value(kAccessToken), *value2);
+
+ // Only one consent ui should be shown.
+ int total_scope_ui_shown = func1->scope_ui_shown() + func2->scope_ui_shown();
+ EXPECT_EQ(1, total_scope_ui_shown);
+
+ EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN,
+ GetCachedToken(account.account_id).status());
+}
+
+// The signin flow is simply not used on ChromeOS.
+#if !defined(OS_CHROMEOS)
IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
MultiSecondaryInteractiveInvalidToken) {
// Setup a secondary account with no valid refresh token, and try to get a
@@ -2100,7 +2353,7 @@ IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
// Fail if extensions are restricted to the primary account.
std::string error = utils::RunFunctionAndReturnError(
func.get(), kFunctionParams, browser());
- EXPECT_EQ(std::string(errors::kUserNotSignedIn), error);
+ EXPECT_EQ(std::string(errors::kUserNonPrimary), error);
EXPECT_FALSE(func->login_ui_shown());
EXPECT_FALSE(func->scope_ui_shown());
} else {
@@ -2115,6 +2368,7 @@ IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
EXPECT_TRUE(func->scope_ui_shown());
}
}
+#endif
IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, ScopesDefault) {
SignIn("primary@example.com");
@@ -2445,7 +2699,7 @@ IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest,
}
IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest,
- DISABLED_InteractiveSecondNavigationSuccess) {
+ InteractiveSecondNavigationSuccess) {
net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
https_server.ServeFilesFromSourceDirectory(
"chrome/test/data/extensions/api_test/identity");
diff --git a/chromium/chrome/browser/extensions/api/identity/identity_constants.cc b/chromium/chrome/browser/extensions/api/identity/identity_constants.cc
index 657911b1d57..97983c65114 100644
--- a/chromium/chrome/browser/extensions/api/identity/identity_constants.cc
+++ b/chromium/chrome/browser/extensions/api/identity/identity_constants.cc
@@ -13,6 +13,7 @@ const char kAuthFailure[] = "OAuth2 request failed: ";
const char kNoGrant[] = "OAuth2 not granted or revoked.";
const char kUserRejected[] = "The user did not approve access.";
const char kUserNotSignedIn[] = "The user is not signed in.";
+const char kUserNonPrimary[] = "Only the primary user account is allowed";
const char kBrowserSigninNotAllowed[] = "The user turned off browser signin";
const char kInteractionRequired[] = "User interaction required.";
const char kInvalidRedirect[] = "Did not redirect to the right URL.";
diff --git a/chromium/chrome/browser/extensions/api/identity/identity_constants.h b/chromium/chrome/browser/extensions/api/identity/identity_constants.h
index 67079d6de49..3c05a8aa9f4 100644
--- a/chromium/chrome/browser/extensions/api/identity/identity_constants.h
+++ b/chromium/chrome/browser/extensions/api/identity/identity_constants.h
@@ -14,6 +14,7 @@ extern const char kAuthFailure[];
extern const char kNoGrant[];
extern const char kUserRejected[];
extern const char kUserNotSignedIn[];
+extern const char kUserNonPrimary[];
extern const char kBrowserSigninNotAllowed[];
extern const char kInteractionRequired[];
extern const char kInvalidRedirect[];
diff --git a/chromium/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc b/chromium/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc
index 0079eee80eb..39a89fd15be 100644
--- a/chromium/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc
+++ b/chromium/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc
@@ -146,7 +146,7 @@ ExtensionFunction::ResponseAction IdentityGetAuthTokenFunction::Run() {
token_key_.scopes = scopes;
token_key_.extension_id = extension()->id();
- if (gaia_id.empty()) {
+ if (gaia_id.empty() && !IsPrimaryAccountOnly()) {
gaia_id = IdentityAPI::GetFactoryInstance()
->Get(GetProfile())
->GetGaiaIdForExtension(token_key_.extension_id)
@@ -186,8 +186,7 @@ void IdentityGetAuthTokenFunction::GetAuthTokenForPrimaryAccount(
// than the primary account.
if (primary_account_only && !extension_gaia_id.empty() &&
extension_gaia_id != primary_account_info.gaia) {
- // TODO(courage): should this be a different error?
- CompleteFunctionWithError(identity_constants::kUserNotSignedIn);
+ CompleteFunctionWithError(identity_constants::kUserNonPrimary);
return;
}
@@ -398,8 +397,7 @@ void IdentityGetAuthTokenFunction::StartMintTokenFlow(
CompleteFunctionWithError(identity_constants::kNoGrant);
return;
}
- // TODO(https://crbug.com/1026237): figure out whether this can be ignored
- // when running the remote consent approval.
+
if (!id_api->mint_queue()->empty(
IdentityMintRequestQueue::MINT_TYPE_INTERACTIVE, token_key_)) {
// Another call is going through a consent UI.
@@ -489,7 +487,6 @@ void IdentityGetAuthTokenFunction::StartMintToken(
case IdentityTokenCacheValue::CACHE_STATUS_REMOTE_CONSENT_APPROVED:
consent_result_ = cache_entry.consent_result();
- should_prompt_for_scopes_ = false;
should_prompt_for_signin_ = false;
gaia_mint_token_mode_ = OAuth2MintTokenFlow::MODE_MINT_TOKEN_NO_FORCE;
StartTokenKeyAccountAccessTokenRequest();
@@ -512,7 +509,6 @@ void IdentityGetAuthTokenFunction::StartMintToken(
break;
case IdentityTokenCacheValue::CACHE_STATUS_REMOTE_CONSENT_APPROVED:
consent_result_ = cache_entry.consent_result();
- should_prompt_for_scopes_ = false;
should_prompt_for_signin_ = false;
gaia_mint_token_mode_ = OAuth2MintTokenFlow::MODE_MINT_TOKEN_NO_FORCE;
StartTokenKeyAccountAccessTokenRequest();
@@ -744,25 +740,40 @@ void IdentityGetAuthTokenFunction::OnGaiaRemoteConsentFlowApproved(
"identity", "OnGaiaRemoteConsentFlowApproved", this, "gaia_id", gaia_id);
DCHECK(!consent_result.empty());
- CompleteMintTokenFlow();
base::Optional<AccountInfo> account =
IdentityManagerFactory::GetForProfile(GetProfile())
->FindExtendedAccountInfoForAccountWithRefreshTokenByGaiaId(gaia_id);
if (!account) {
+ CompleteMintTokenFlow();
CompleteFunctionWithError(identity_constants::kUserNotSignedIn);
return;
}
+ if (IsPrimaryAccountOnly()) {
+ CoreAccountId primary_account_id =
+ IdentityManagerFactory::GetForProfile(GetProfile())
+ ->GetPrimaryAccountId();
+ if (primary_account_id != account->account_id) {
+ CompleteMintTokenFlow();
+ CompleteFunctionWithError(identity_constants::kUserNonPrimary);
+ return;
+ }
+ }
+
IdentityAPI* id_api = IdentityAPI::GetFactoryInstance()->Get(GetProfile());
id_api->SetGaiaIdForExtension(token_key_.extension_id, gaia_id);
- token_key_.account_id = account->account_id;
- consent_result_ = consent_result;
- should_prompt_for_scopes_ = false;
- should_prompt_for_signin_ = false;
+ // It's important to update the cache before calling CompleteMintTokenFlow()
+ // as this call may start a new request synchronously and query the cache.
+ ExtensionTokenKey new_token_key(token_key_);
+ new_token_key.account_id = account->account_id;
id_api->SetCachedToken(
- token_key_,
+ new_token_key,
IdentityTokenCacheValue::CreateRemoteConsentApproved(consent_result));
+ CompleteMintTokenFlow();
+ token_key_ = new_token_key;
+ consent_result_ = consent_result;
+ should_prompt_for_signin_ = false;
StartMintTokenFlow(IdentityMintRequestQueue::MINT_TYPE_NONINTERACTIVE);
}
diff --git a/chromium/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.cc b/chromium/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.cc
index 638ad8b7ef3..2c0bd85f306 100644
--- a/chromium/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.cc
+++ b/chromium/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.cc
@@ -4,11 +4,13 @@
#include "chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.h"
+#include "base/notreached.h"
#include "chrome/browser/extensions/api/identity/identity_constants.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/signin/identity_manager_factory.h"
#include "chrome/common/extensions/api/identity.h"
#include "components/signin/public/identity_manager/account_info.h"
+#include "components/signin/public/identity_manager/consent_level.h"
#include "components/signin/public/identity_manager/identity_manager.h"
#include "content/public/browser/browser_context.h"
#include "extensions/common/extension.h"
@@ -16,24 +18,49 @@
namespace extensions {
-IdentityGetProfileUserInfoFunction::IdentityGetProfileUserInfoFunction() {
-}
+namespace {
+signin::ConsentLevel GetConsentLevelFromProfileDetails(
+ const api::identity::ProfileDetails* details) {
+ api::identity::AccountStatus account_status =
+ details ? details->account_status : api::identity::ACCOUNT_STATUS_NONE;
+
+ switch (account_status) {
+ case api::identity::ACCOUNT_STATUS_ANY:
+ return signin::ConsentLevel::kNotRequired;
+ case api::identity::ACCOUNT_STATUS_NONE:
+ case api::identity::ACCOUNT_STATUS_SYNC:
+ return signin::ConsentLevel::kSync;
+ }
-IdentityGetProfileUserInfoFunction::~IdentityGetProfileUserInfoFunction() {
+ NOTREACHED() << "Unexpected value for account_status: " << account_status;
+ return signin::ConsentLevel::kSync;
}
+} // namespace
+
+IdentityGetProfileUserInfoFunction::IdentityGetProfileUserInfoFunction() =
+ default;
+
+IdentityGetProfileUserInfoFunction::~IdentityGetProfileUserInfoFunction() =
+ default;
ExtensionFunction::ResponseAction IdentityGetProfileUserInfoFunction::Run() {
if (browser_context()->IsOffTheRecord()) {
return RespondNow(Error(identity_constants::kOffTheRecord));
}
+ std::unique_ptr<api::identity::GetProfileUserInfo::Params> params(
+ api::identity::GetProfileUserInfo::Params::Create(*args_));
+ EXTENSION_FUNCTION_VALIDATE(params.get());
+
api::identity::ProfileUserInfo profile_user_info;
if (extension()->permissions_data()->HasAPIPermission(
APIPermission::kIdentityEmail)) {
+ signin::ConsentLevel consent_level =
+ GetConsentLevelFromProfileDetails(params->details.get());
auto account_info = IdentityManagerFactory::GetForProfile(
Profile::FromBrowserContext(browser_context()))
- ->GetPrimaryAccountInfo();
+ ->GetPrimaryAccountInfo(consent_level);
profile_user_info.email = account_info.email;
profile_user_info.id = account_info.gaia;
}
diff --git a/chromium/chrome/browser/extensions/api/identity/identity_launch_web_auth_flow_function.cc b/chromium/chrome/browser/extensions/api/identity/identity_launch_web_auth_flow_function.cc
index a2898874ad4..67e92b5ae79 100644
--- a/chromium/chrome/browser/extensions/api/identity/identity_launch_web_auth_flow_function.cc
+++ b/chromium/chrome/browser/extensions/api/identity/identity_launch_web_auth_flow_function.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/extensions/api/identity/identity_launch_web_auth_flow_function.h"
#include <memory>
+#include <utility>
#include "base/strings/stringprintf.h"
#include "chrome/browser/extensions/api/identity/identity_constants.h"
@@ -48,7 +49,8 @@ ExtensionFunction::ResponseAction IdentityLaunchWebAuthFlowFunction::Run() {
AddRef(); // Balanced in OnAuthFlowSuccess/Failure.
- auth_flow_.reset(new WebAuthFlow(this, profile, auth_url, mode));
+ auth_flow_.reset(new WebAuthFlow(this, profile, auth_url, mode,
+ WebAuthFlow::LAUNCH_WEB_AUTH_FLOW));
auth_flow_->Start();
return RespondLater();
}
@@ -84,7 +86,7 @@ void IdentityLaunchWebAuthFlowFunction::OnAuthFlowFailure(
error = identity_constants::kInvalidRedirect;
break;
}
- Respond(Error(error));
+ Respond(Error(std::move(error)));
if (auth_flow_)
auth_flow_.release()->DetachDelegateAndDelete();
Release(); // Balanced in Run.
diff --git a/chromium/chrome/browser/extensions/api/identity/identity_mint_queue.cc b/chromium/chrome/browser/extensions/api/identity/identity_mint_queue.cc
index 6ac11af851d..57bd87b8231 100644
--- a/chromium/chrome/browser/extensions/api/identity/identity_mint_queue.cc
+++ b/chromium/chrome/browser/extensions/api/identity/identity_mint_queue.cc
@@ -4,7 +4,7 @@
#include "chrome/browser/extensions/api/identity/identity_mint_queue.h"
-#include "base/logging.h"
+#include "base/check_op.h"
#include "base/stl_util.h"
#include "base/trace_event/trace_event.h"
diff --git a/chromium/chrome/browser/extensions/api/identity/identity_private_apitest.cc b/chromium/chrome/browser/extensions/api/identity/identity_private_apitest.cc
index ea6d0d36919..350fff00d06 100644
--- a/chromium/chrome/browser/extensions/api/identity/identity_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/identity/identity_private_apitest.cc
@@ -8,6 +8,7 @@
#include "base/run_loop.h"
#include "chrome/browser/extensions/api/identity/identity_api.h"
#include "chrome/browser/extensions/extension_apitest.h"
+#include "content/public/test/browser_test.h"
#include "extensions/browser/api_test_utils.h"
namespace extensions {
diff --git a/chromium/chrome/browser/extensions/api/identity/web_auth_flow.cc b/chromium/chrome/browser/extensions/api/identity/web_auth_flow.cc
index 6e12abb52f2..de1e3443c03 100644
--- a/chromium/chrome/browser/extensions/api/identity/web_auth_flow.cc
+++ b/chromium/chrome/browser/extensions/api/identity/web_auth_flow.cc
@@ -9,6 +9,7 @@
#include "base/base64.h"
#include "base/location.h"
+#include "base/notreached.h"
#include "base/single_thread_task_runner.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
@@ -37,6 +38,7 @@
#include "extensions/browser/extension_system.h"
#include "extensions/browser/guest_view/web_view/web_view_guest.h"
#include "net/http/http_response_headers.h"
+#include "net/http/http_status_code.h"
#include "url/gurl.h"
#include "url/url_constants.h"
@@ -47,17 +49,32 @@ using guest_view::GuestViewBase;
namespace extensions {
+namespace {
+std::string GetPartitionName(WebAuthFlow::Partition partition) {
+ switch (partition) {
+ case WebAuthFlow::LAUNCH_WEB_AUTH_FLOW:
+ return "launchWebAuthFlow";
+ case WebAuthFlow::GET_AUTH_TOKEN:
+ return "getAuthFlow";
+ }
+
+ NOTREACHED() << "Unexpected partition value " << partition;
+ return std::string();
+}
+} // namespace
+
namespace identity_private = api::identity_private;
-WebAuthFlow::WebAuthFlow(
- Delegate* delegate,
- Profile* profile,
- const GURL& provider_url,
- Mode mode)
+WebAuthFlow::WebAuthFlow(Delegate* delegate,
+ Profile* profile,
+ const GURL& provider_url,
+ Mode mode,
+ Partition partition)
: delegate_(delegate),
profile_(profile),
provider_url_(provider_url),
mode_(mode),
+ partition_(partition),
embedded_window_created_(false) {
TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("identity", "WebAuthFlow", this);
}
@@ -96,6 +113,7 @@ void WebAuthFlow::Start() {
args->AppendString("interactive");
else
args->AppendString("silent");
+ args->AppendString(GetPartitionName(partition_));
auto event =
std::make_unique<Event>(events::IDENTITY_PRIVATE_ON_WEB_FLOW_REQUEST,
@@ -122,7 +140,7 @@ void WebAuthFlow::DetachDelegateAndDelete() {
content::StoragePartition* WebAuthFlow::GetGuestPartition() {
return content::BrowserContext::GetStoragePartitionForSite(
- profile_, GetWebViewSiteURL());
+ profile_, GetWebViewSiteURL(partition_));
}
const std::string& WebAuthFlow::GetAppWindowKey() const {
@@ -130,9 +148,9 @@ const std::string& WebAuthFlow::GetAppWindowKey() const {
}
// static
-GURL WebAuthFlow::GetWebViewSiteURL() {
+GURL WebAuthFlow::GetWebViewSiteURL(Partition partition) {
return extensions::WebViewGuest::GetSiteForGuestPartitionConfig(
- extension_misc::kIdentityApiUiAppId, /*partition_name=*/std::string(),
+ extension_misc::kIdentityApiUiAppId, GetPartitionName(partition),
/*in_memory=*/true);
}
@@ -247,6 +265,13 @@ void WebAuthFlow::DidFinishNavigation(
// the web auth flow.
DCHECK_EQ(net::ERR_UNKNOWN_URL_SCHEME,
navigation_handle->GetNetErrorCode());
+ } else if (navigation_handle->GetResponseHeaders() &&
+ navigation_handle->GetResponseHeaders()->response_code() ==
+ net::HTTP_NO_CONTENT) {
+ // Navigation to no content URLs is aborted but shouldn't be treated as a
+ // failure.
+ // In particular, Gaia navigates to a no content page to pass Mirror
+ // response headers.
} else {
failed = true;
TRACE_EVENT_NESTABLE_ASYNC_INSTANT1(
diff --git a/chromium/chrome/browser/extensions/api/identity/web_auth_flow.h b/chromium/chrome/browser/extensions/api/identity/web_auth_flow.h
index b86e3dc908d..bd8cb1d5c02 100644
--- a/chromium/chrome/browser/extensions/api/identity/web_auth_flow.h
+++ b/chromium/chrome/browser/extensions/api/identity/web_auth_flow.h
@@ -52,6 +52,11 @@ class WebAuthFlow : public content::NotificationObserver,
SILENT // No UI should be shown.
};
+ enum Partition {
+ GET_AUTH_TOKEN, // Use the getAuthToken() partition.
+ LAUNCH_WEB_AUTH_FLOW // Use the launchWebAuthFlow() partition.
+ };
+
enum Failure {
WINDOW_CLOSED, // Window closed by user.
INTERACTION_REQUIRED, // Non-redirect page load in silent mode.
@@ -78,7 +83,8 @@ class WebAuthFlow : public content::NotificationObserver,
WebAuthFlow(Delegate* delegate,
Profile* profile,
const GURL& provider_url,
- Mode mode);
+ Mode mode,
+ Partition partition);
~WebAuthFlow() override;
@@ -96,8 +102,8 @@ class WebAuthFlow : public content::NotificationObserver,
virtual const std::string& GetAppWindowKey() const;
// Returns the URL used by the SiteInstance associated with the WebViewGuest
- // used in the WebAuthFlow.
- static GURL GetWebViewSiteURL();
+ // with given |partition| used in the WebAuthFlow.
+ static GURL GetWebViewSiteURL(Partition partition);
private:
friend class ::WebAuthFlowTest;
@@ -129,6 +135,7 @@ class WebAuthFlow : public content::NotificationObserver,
Profile* profile_;
GURL provider_url_;
Mode mode_;
+ Partition partition_;
AppWindow* app_window_;
std::string app_window_key_;
diff --git a/chromium/chrome/browser/extensions/api/idle/idle_get_auto_lock_delay_apitest.cc b/chromium/chrome/browser/extensions/api/idle/idle_get_auto_lock_delay_apitest.cc
index 19aaa00784e..ed3bfd3f7ed 100644
--- a/chromium/chrome/browser/extensions/api/idle/idle_get_auto_lock_delay_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/idle/idle_get_auto_lock_delay_apitest.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "chrome/browser/extensions/extension_apitest.h"
+#include "content/public/test/browser_test.h"
namespace extensions {
diff --git a/chromium/chrome/browser/extensions/api/idltest/idltest_apitest.cc b/chromium/chrome/browser/extensions/api/idltest/idltest_apitest.cc
index 9607c0c10ed..3308f8c05d2 100644
--- a/chromium/chrome/browser/extensions/api/idltest/idltest_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/idltest/idltest_apitest.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/extensions/extension_apitest.h"
#include "components/version_info/version_info.h"
+#include "content/public/test/browser_test.h"
#include "extensions/common/features/feature_channel.h"
#include "extensions/common/switches.h"
diff --git a/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.cc b/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.cc
index 8e48068c9e2..8237a8467e0 100644
--- a/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.cc
+++ b/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.cc
@@ -4,8 +4,9 @@
#include "chrome/browser/extensions/api/image_writer_private/image_writer_private_api.h"
+#include <utility>
+
#include "base/bind.h"
-#include "base/logging.h"
#include "base/task/post_task.h"
#include "chrome/browser/extensions/api/image_writer_private/error_messages.h"
#include "chrome/browser/extensions/api/image_writer_private/operation_manager.h"
@@ -99,7 +100,7 @@ ImageWriterPrivateWriteFromFileFunction::Run() {
if (!extensions::app_file_handler_util::ValidateFileEntryAndGetPath(
filesystem_name, filesystem_path, source_process_id(), &path,
&error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
image_writer::OperationManager::Get(browser_context())
diff --git a/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_private_apitest.cc b/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_private_apitest.cc
index cbf553dec56..33606429495 100644
--- a/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_private_apitest.cc
@@ -14,6 +14,7 @@
#include "chrome/common/pref_names.h"
#include "components/prefs/pref_service.h"
#include "content/public/browser/browser_thread.h"
+#include "content/public/test/browser_test.h"
#include "extensions/browser/api/file_system/file_system_api.h"
#include "extensions/browser/api_unittest.h"
namespace extensions {
diff --git a/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.cc b/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.cc
index 10c31bf444f..ec419944b2b 100644
--- a/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.cc
+++ b/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.cc
@@ -9,9 +9,9 @@
#include "base/location.h"
#include "base/optional.h"
#include "build/build_config.h"
+#include "chrome/browser/service_sandbox_type.h"
#include "chrome/grit/generated_resources.h"
#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/sandbox_type.h"
#include "content/public/browser/service_process_host.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "ui/base/l10n/l10n_util.h"
@@ -158,17 +158,10 @@ void ImageWriterUtilityClient::BindServiceIfNeeded() {
if (removable_storage_writer_)
return;
-#if defined(OS_WIN)
- constexpr auto kSandboxType =
- service_manager::SandboxType::kNoSandboxAndElevatedPrivileges;
-#else
- constexpr auto kSandboxType = service_manager::SandboxType::kNoSandbox;
-#endif
content::ServiceProcessHost::Launch(
removable_storage_writer_.BindNewPipeAndPassReceiver(),
content::ServiceProcessHost::Options()
.WithDisplayName(IDS_UTILITY_PROCESS_IMAGE_WRITER_NAME)
- .WithSandboxType(kSandboxType)
.Pass());
removable_storage_writer_.set_disconnect_handler(
base::BindOnce(&ImageWriterUtilityClient::OnConnectionError, this));
diff --git a/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client_browsertest.cc b/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client_browsertest.cc
index 49704aebbb7..1d58c0f6f7e 100644
--- a/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client_browsertest.cc
+++ b/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client_browsertest.cc
@@ -20,6 +20,7 @@
#include "chrome/test/base/in_process_browser_test.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
+#include "content/public/test/browser_test.h"
namespace extensions {
namespace image_writer {
diff --git a/chromium/chrome/browser/extensions/api/input_ime/input_ime_api.cc b/chromium/chrome/browser/extensions/api/input_ime/input_ime_api.cc
index c7ed15c5204..62d7d390b82 100644
--- a/chromium/chrome/browser/extensions/api/input_ime/input_ime_api.cc
+++ b/chromium/chrome/browser/extensions/api/input_ime/input_ime_api.cc
@@ -238,6 +238,9 @@ std::string ImeObserver::ConvertInputContextType(
case ui::TEXT_INPUT_TYPE_PASSWORD:
input_context_type = "password";
break;
+ case ui::TEXT_INPUT_TYPE_NULL:
+ input_context_type = "null";
+ break;
default:
input_context_type = "text";
break;
diff --git a/chromium/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc b/chromium/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc
index 73dd19caa87..b9dfada4e67 100644
--- a/chromium/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc
+++ b/chromium/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc
@@ -614,7 +614,7 @@ InputImeSetCandidateWindowPropertiesFunction::Run() {
}
InputMethodEngine::CandidateWindowProperty properties_out =
- engine->GetCandidateWindowProperty();
+ engine->GetCandidateWindowProperty(params.engine_id);
bool modified = false;
if (properties.cursor_visible) {
@@ -651,8 +651,19 @@ InputImeSetCandidateWindowPropertiesFunction::Run() {
modified = true;
}
+ if (properties.current_candidate_index) {
+ properties_out.current_candidate_index =
+ *properties.current_candidate_index;
+ modified = true;
+ }
+
+ if (properties.total_candidates) {
+ properties_out.total_candidates = *properties.total_candidates;
+ modified = true;
+ }
+
if (modified) {
- engine->SetCandidateWindowProperty(properties_out);
+ engine->SetCandidateWindowProperty(params.engine_id, properties_out);
}
return RespondNow(OneArgument(std::make_unique<base::Value>(true)));
diff --git a/chromium/chrome/browser/extensions/api/input_ime/input_ime_apitest_chromeos.cc b/chromium/chrome/browser/extensions/api/input_ime/input_ime_apitest_chromeos.cc
index 01b8c20f9d3..7220e991d6a 100644
--- a/chromium/chrome/browser/extensions/api/input_ime/input_ime_apitest_chromeos.cc
+++ b/chromium/chrome/browser/extensions/api/input_ime/input_ime_apitest_chromeos.cc
@@ -5,6 +5,7 @@
#include "build/build_config.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "chrome/common/chrome_switches.h"
+#include "content/public/test/browser_test.h"
#include "extensions/browser/api/test/test_api.h"
#include "testing/gtest/include/gtest/gtest.h"
diff --git a/chromium/chrome/browser/extensions/api/instance_id/instance_id_api.cc b/chromium/chrome/browser/extensions/api/instance_id/instance_id_api.cc
index 77891527863..62b0033b71e 100644
--- a/chromium/chrome/browser/extensions/api/instance_id/instance_id_api.cc
+++ b/chromium/chrome/browser/extensions/api/instance_id/instance_id_api.cc
@@ -7,8 +7,8 @@
#include <memory>
#include "base/bind.h"
-#include "base/logging.h"
#include "base/metrics/histogram_macros.h"
+#include "base/notreached.h"
#include "base/time/time.h"
#include "chrome/browser/gcm/instance_id/instance_id_profile_service_factory.h"
#include "chrome/browser/profiles/profile.h"
diff --git a/chromium/chrome/browser/extensions/api/instance_id/instance_id_apitest.cc b/chromium/chrome/browser/extensions/api/instance_id/instance_id_apitest.cc
index ac02bf851c5..796e1cde36b 100644
--- a/chromium/chrome/browser/extensions/api/instance_id/instance_id_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/instance_id/instance_id_apitest.cc
@@ -18,6 +18,7 @@
#include "components/gcm_driver/fake_gcm_profile_service.h"
#include "components/gcm_driver/instance_id/fake_gcm_driver_for_instance_id.h"
#include "components/version_info/version_info.h"
+#include "content/public/test/browser_test.h"
#include "extensions/test/result_catcher.h"
using extensions::ResultCatcher;
diff --git a/chromium/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc b/chromium/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
index cc862ba6cb7..b5b0ab58441 100644
--- a/chromium/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
+++ b/chromium/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
@@ -13,7 +13,9 @@
#include "base/strings/utf_string_conversions.h"
#include "base/task/post_task.h"
#include "chrome/browser/apps/app_service/app_launch_params.h"
-#include "chrome/browser/apps/launch_service/launch_service.h"
+#include "chrome/browser/apps/app_service/app_service_proxy.h"
+#include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
+#include "chrome/browser/apps/app_service/browser_app_launcher.h"
#include "chrome/browser/extensions/chrome_extension_function_details.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/launch_util.h"
@@ -327,9 +329,11 @@ void LaunchWebApp(const web_app::AppId& app_id, Profile* profile) {
if (display_mode == blink::mojom::DisplayMode::kBrowser)
launch_container = apps::mojom::LaunchContainer::kLaunchContainerTab;
- apps::LaunchService::Get(profile)->OpenApplication(apps::AppLaunchParams(
- app_id, launch_container, WindowOpenDisposition::NEW_FOREGROUND_TAB,
- apps::mojom::AppLaunchSource::kSourceManagementApi));
+ apps::AppServiceProxyFactory::GetForProfile(profile)
+ ->BrowserAppLauncher()
+ .LaunchAppWithParams(apps::AppLaunchParams(
+ app_id, launch_container, WindowOpenDisposition::NEW_FOREGROUND_TAB,
+ apps::mojom::AppLaunchSource::kSourceManagementApi));
}
void OnWebAppInstallCompleted(InstallOrLaunchWebAppCallback callback,
@@ -359,8 +363,9 @@ void OnWebAppInstallabilityChecked(
case InstallableCheckResult::kInstallable:
content::WebContents* containing_contents = web_contents.get();
chrome::ScopedTabbedBrowserDisplayer displayer(profile);
+ const GURL& url = web_contents->GetURL();
chrome::AddWebContents(
- displayer.browser(), nullptr, std::move(web_contents),
+ displayer.browser(), nullptr, std::move(web_contents), url,
WindowOpenDisposition::NEW_FOREGROUND_TAB, gfx::Rect());
web_app::CreateWebAppFromManifest(
containing_contents, WebappInstallSource::MANAGEMENT_API,
@@ -389,10 +394,12 @@ void ChromeManagementAPIDelegate::LaunchAppFunctionDelegate(
extensions::LaunchContainer launch_container =
GetLaunchContainer(extensions::ExtensionPrefs::Get(context), extension);
Profile* profile = Profile::FromBrowserContext(context);
- apps::LaunchService::Get(profile)->OpenApplication(apps::AppLaunchParams(
- extension->id(), launch_container,
- WindowOpenDisposition::NEW_FOREGROUND_TAB,
- apps::mojom::AppLaunchSource::kSourceManagementApi));
+ apps::AppServiceProxyFactory::GetForProfile(profile)
+ ->BrowserAppLauncher()
+ .LaunchAppWithParams(apps::AppLaunchParams(
+ extension->id(), launch_container,
+ WindowOpenDisposition::NEW_FOREGROUND_TAB,
+ apps::mojom::AppLaunchSource::kSourceManagementApi));
#if defined(OS_CHROMEOS)
chromeos::DemoSession::RecordAppLaunchSourceIfInDemoMode(
@@ -592,8 +599,10 @@ void ChromeManagementAPIDelegate::EnableExtension(
// for, and received parent permission to install the extension.
SupervisedUserService* supervised_user_service =
SupervisedUserServiceFactory::GetForBrowserContext(context);
- supervised_user_service->AddOrUpdateExtensionApproval(*extension);
-#endif
+ supervised_user_service->AddExtensionApproval(*extension);
+ supervised_user_service->RecordExtensionEnablementUmaMetrics(
+ /*enabled=*/true);
+#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
// If the extension was disabled for a permissions increase, the Management
// API will have displayed a re-enable prompt to the user, so we know it's
@@ -608,6 +617,12 @@ void ChromeManagementAPIDelegate::DisableExtension(
const extensions::Extension* source_extension,
const std::string& extension_id,
extensions::disable_reason::DisableReason disable_reason) const {
+#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
+ SupervisedUserService* supervised_user_service =
+ SupervisedUserServiceFactory::GetForBrowserContext(context);
+ supervised_user_service->RecordExtensionEnablementUmaMetrics(
+ /*enabled=*/false);
+#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
extensions::ExtensionSystem::Get(context)
->extension_service()
->DisableExtensionWithSource(source_extension, extension_id,
diff --git a/chromium/chrome/browser/extensions/api/management/management_api_browsertest.cc b/chromium/chrome/browser/extensions/api/management/management_api_browsertest.cc
index 64291f90770..a4e7d3607d4 100644
--- a/chromium/chrome/browser/extensions/api/management/management_api_browsertest.cc
+++ b/chromium/chrome/browser/extensions/api/management/management_api_browsertest.cc
@@ -19,6 +19,7 @@
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "content/public/browser/notification_service.h"
#include "content/public/common/url_constants.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_utils.h"
#include "extensions/browser/api/management/management_api.h"
diff --git a/chromium/chrome/browser/extensions/api/management/management_api_non_persistent_apitest.cc b/chromium/chrome/browser/extensions/api/management/management_api_non_persistent_apitest.cc
index f0bea4f5dab..2d5ecfac7eb 100644
--- a/chromium/chrome/browser/extensions/api/management/management_api_non_persistent_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/management/management_api_non_persistent_apitest.cc
@@ -6,6 +6,7 @@
#include "chrome/browser/extensions/extension_action_runner.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/test/browser_test.h"
#include "extensions/browser/extension_dialog_auto_confirm.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/test_extension_registry_observer.h"
diff --git a/chromium/chrome/browser/extensions/api/management/management_api_unittest.cc b/chromium/chrome/browser/extensions/api/management/management_api_unittest.cc
index 9fd1957f6b0..c3f1fe7ff40 100644
--- a/chromium/chrome/browser/extensions/api/management/management_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/management/management_api_unittest.cc
@@ -38,9 +38,14 @@
#include "extensions/common/permissions/permission_set.h"
#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
+#include "base/test/metrics/histogram_tester.h"
+#include "base/test/metrics/user_action_tester.h"
+#include "chrome/browser/background/background_contents.h"
+#include "chrome/browser/supervised_user/supervised_user_extensions_metrics_recorder.h"
#include "chrome/browser/supervised_user/supervised_user_service.h"
#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
-#include "chrome/common/pref_names.h"
+#include "chrome/browser/supervised_user/supervised_user_test_util.h"
+#include "components/web_modal/web_contents_modal_dialog_manager.h"
#include "content/public/browser/gpu_data_manager.h"
#endif
@@ -78,7 +83,8 @@ class ManagementApiUnitTest : public ExtensionServiceTestWithInstall {
const std::string& extension_id,
bool use_user_gesture,
bool accept_dialog,
- std::string* error);
+ std::string* error,
+ bool enabled = true);
Browser* browser() { return browser_.get(); }
@@ -112,7 +118,8 @@ bool ManagementApiUnitTest::RunSetEnabledFunction(
const std::string& extension_id,
bool use_user_gesture,
bool accept_dialog,
- std::string* error) {
+ std::string* error,
+ bool enabled) {
ScopedTestDialogAutoConfirm auto_confirm(
accept_dialog ? ScopedTestDialogAutoConfirm::ACCEPT
: ScopedTestDialogAutoConfirm::CANCEL);
@@ -126,9 +133,10 @@ bool ManagementApiUnitTest::RunSetEnabledFunction(
function->SetRenderFrameHost(web_contents->GetMainFrame());
base::ListValue args;
args.AppendString(extension_id);
- args.AppendBoolean(/*enabled=*/true);
+ args.AppendBoolean(enabled);
bool result = RunFunction(function, args);
- *error = function->GetError();
+ if (error)
+ *error = function->GetError();
return result;
}
@@ -841,9 +849,11 @@ class TestSupervisedUserServiceDelegate : public SupervisedUserServiceDelegate {
~TestSupervisedUserServiceDelegate() override = default;
// SupervisedUserServiceDelegate:
+ bool IsChild(content::BrowserContext* context) const override { return true; }
+
bool IsSupervisedChildWhoMayInstallExtensions(
content::BrowserContext* context) const override {
- return true;
+ return is_supervised_child_who_may_install_extensions_;
}
bool IsExtensionAllowedByParent(
const extensions::Extension& extension,
@@ -859,9 +869,38 @@ class TestSupervisedUserServiceDelegate : public SupervisedUserServiceDelegate {
std::move(done_callback).Run(dialog_result_);
}
- int show_dialog_count_ = 0;
+ void ShowExtensionEnableBlockedByParentDialogForExtension(
+ const extensions::Extension* extension,
+ content::WebContents* contents,
+ base::OnceClosure done_callback) override {
+ show_block_dialog_count_++;
+ std::move(done_callback).Run();
+ }
+
+ void RecordExtensionEnableBlockedByParentDialogUmaMetric() override {
+ SupervisedUserExtensionsMetricsRecorder::RecordEnablementUmaMetrics(
+ SupervisedUserExtensionsMetricsRecorder::EnablementState::
+ kFailedToEnable);
+ }
+
+ void set_next_parent_permission_dialog_result(
+ ParentPermissionDialogResult result) {
+ dialog_result_ = result;
+ }
+
+ void set_is_supervised_child_who_may_install_extensions(bool value) {
+ is_supervised_child_who_may_install_extensions_ = value;
+ }
+
+ int show_dialog_count() const { return show_dialog_count_; }
+ int show_block_dialog_count() const { return show_block_dialog_count_; }
+
+ private:
ParentPermissionDialogResult dialog_result_ =
ParentPermissionDialogResult::kParentPermissionFailed;
+ int show_dialog_count_ = 0;
+ int show_block_dialog_count_ = 0;
+ bool is_supervised_child_who_may_install_extensions_ = true;
};
// Tests for supervised users (child accounts). Supervised users are not allowed
@@ -887,12 +926,8 @@ class ManagementApiSupervisedUserTest : public ManagementApiUnitTest {
void SetUp() override {
ManagementApiUnitTest::SetUp();
- // Ensure the child has a custodian.
- PrefService* prefs = browser()->profile()->GetPrefs();
- prefs->SetString(prefs::kSupervisedUserCustodianEmail,
- "test_parent_0@google.com");
- prefs->SetString(prefs::kSupervisedUserCustodianObfuscatedGaiaId,
- "239029320");
+ // Set up custodians (parents) for the child.
+ supervised_user_test_util::AddCustodians(browser()->profile());
GetSupervisedUserService()->Init();
// Set the pref to allow the child to request extension install.
@@ -916,6 +951,117 @@ class ManagementApiSupervisedUserTest : public ManagementApiUnitTest {
TestSupervisedUserServiceDelegate* supervised_user_delegate_ = nullptr;
};
+TEST_F(ManagementApiSupervisedUserTest, SetEnabled_BlockedByParent) {
+ // Preconditions.
+ ASSERT_TRUE(profile()->IsChild());
+
+ base::HistogramTester histogram_tester;
+ base::UserActionTester user_action_tester;
+
+ base::FilePath base_path = data_dir().AppendASCII("permissions_increase");
+ base::FilePath pem_path = base_path.AppendASCII("permissions.pem");
+
+ base::FilePath path = base_path.AppendASCII("v1");
+ const Extension* extension =
+ PackAndInstallCRX(path, pem_path, INSTALL_WITHOUT_LOAD);
+ ASSERT_TRUE(extension);
+ // The extension should be installed but disabled.
+ EXPECT_TRUE(registry()->disabled_extensions().Contains(extension->id()));
+ const std::string extension_id = extension->id();
+ ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
+ EXPECT_TRUE(prefs->HasDisableReason(
+ extension_id, disable_reason::DISABLE_CUSTODIAN_APPROVAL_REQUIRED));
+
+ // Simulate disabling Permissions for sites, apps and extensions
+ // in the testing supervised user service delegate used by the Management API.
+ supervised_user_delegate_->set_is_supervised_child_who_may_install_extensions(
+ false);
+ // Ensure that the web contents can be used to create a modal dialog.
+ web_modal::WebContentsModalDialogManager::CreateForWebContents(
+ web_contents_.get());
+
+ // The supervised user trying to enable while Permissions for sites, apps and
+ // extensions is disabled should fail.
+ {
+ std::string error;
+ bool success = RunSetEnabledFunction(web_contents_.get(), extension_id,
+ /*use_user_gesture=*/true,
+ /*accept_dialog=*/true, &error);
+ EXPECT_FALSE(success);
+ EXPECT_FALSE(error.empty());
+ EXPECT_TRUE(registry()->disabled_extensions().Contains(extension_id));
+
+ // The block dialog should have been shown.
+ EXPECT_EQ(supervised_user_delegate_->show_block_dialog_count(), 1);
+ }
+
+ histogram_tester.ExpectUniqueSample(
+ SupervisedUserExtensionsMetricsRecorder::kEnablementHistogramName,
+ SupervisedUserExtensionsMetricsRecorder::EnablementState::kFailedToEnable,
+ 1);
+ histogram_tester.ExpectTotalCount(
+ SupervisedUserExtensionsMetricsRecorder::kEnablementHistogramName, 1);
+ EXPECT_EQ(
+ 1,
+ user_action_tester.GetActionCount(
+ SupervisedUserExtensionsMetricsRecorder::kFailedToEnableActionName));
+}
+
+TEST_F(ManagementApiSupervisedUserTest,
+ SetEnabled_BlockedByParentNoDialogWhenNoDialogManagerAvailable) {
+ // Preconditions.
+ ASSERT_TRUE(profile()->IsChild());
+
+ base::HistogramTester histogram_tester;
+ base::UserActionTester user_action_tester;
+
+ base::FilePath base_path = data_dir().AppendASCII("permissions_increase");
+ base::FilePath pem_path = base_path.AppendASCII("permissions.pem");
+
+ base::FilePath path = base_path.AppendASCII("v1");
+ const Extension* extension =
+ PackAndInstallCRX(path, pem_path, INSTALL_WITHOUT_LOAD);
+ ASSERT_TRUE(extension);
+ // The extension should be installed but disabled.
+ EXPECT_TRUE(registry()->disabled_extensions().Contains(extension->id()));
+ const std::string extension_id = extension->id();
+ ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
+ EXPECT_TRUE(prefs->HasDisableReason(
+ extension_id, disable_reason::DISABLE_CUSTODIAN_APPROVAL_REQUIRED));
+
+ // Simulate disabling Permissions for sites, apps and extensions
+ // in the testing supervised user service delegate used by the Management API.
+ supervised_user_delegate_->set_is_supervised_child_who_may_install_extensions(
+ false);
+
+ // The supervised user trying to enable while Permissions for sites, apps and
+ // extensions is disabled should fail.
+ {
+ std::string error;
+
+ bool success = RunSetEnabledFunction(web_contents_.get(), extension_id,
+ /*use_user_gesture=*/true,
+ /*accept_dialog=*/true, &error);
+ EXPECT_FALSE(success);
+ EXPECT_FALSE(error.empty());
+ EXPECT_TRUE(registry()->disabled_extensions().Contains(extension_id));
+
+ // The block dialog should not have been shown.
+ EXPECT_EQ(supervised_user_delegate_->show_block_dialog_count(), 0);
+ }
+
+ histogram_tester.ExpectUniqueSample(
+ SupervisedUserExtensionsMetricsRecorder::kEnablementHistogramName,
+ SupervisedUserExtensionsMetricsRecorder::EnablementState::kFailedToEnable,
+ 1);
+ histogram_tester.ExpectTotalCount(
+ SupervisedUserExtensionsMetricsRecorder::kEnablementHistogramName, 1);
+ EXPECT_EQ(
+ 1,
+ user_action_tester.GetActionCount(
+ SupervisedUserExtensionsMetricsRecorder::kFailedToEnableActionName));
+}
+
// Tests enabling an extension via management API after it was disabled due to
// permission increase for supervised users.
// Prevents a regression to crbug/1068660.
@@ -923,6 +1069,8 @@ TEST_F(ManagementApiSupervisedUserTest, SetEnabled_AfterIncreasedPermissions) {
// Preconditions.
ASSERT_TRUE(profile()->IsChild());
+ base::HistogramTester histogram_tester;
+
base::FilePath base_path = data_dir().AppendASCII("permissions_increase");
base::FilePath pem_path = base_path.AppendASCII("permissions.pem");
@@ -936,10 +1084,19 @@ TEST_F(ManagementApiSupervisedUserTest, SetEnabled_AfterIncreasedPermissions) {
const std::string extension_id = extension->id();
// Simulate parent approval for the extension installation.
- GetSupervisedUserService()->AddOrUpdateExtensionApproval(*extension);
+ GetSupervisedUserService()->AddExtensionApproval(*extension);
// The extension should be enabled now.
EXPECT_TRUE(registry()->enabled_extensions().Contains(extension_id));
+ // Should see 1 kApprovalGranted UMA metric.
+ histogram_tester.ExpectUniqueSample(
+ SupervisedUserExtensionsMetricsRecorder::kExtensionsHistogramName,
+ SupervisedUserExtensionsMetricsRecorder::UmaExtensionState::
+ kApprovalGranted,
+ 1);
+ histogram_tester.ExpectTotalCount(
+ SupervisedUserExtensionsMetricsRecorder::kExtensionsHistogramName, 1);
+
ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
std::unique_ptr<const PermissionSet> known_perms =
prefs->GetGrantedPermissions(extension_id);
@@ -978,7 +1135,16 @@ TEST_F(ManagementApiSupervisedUserTest, SetEnabled_AfterIncreasedPermissions) {
EXPECT_FALSE(known_perms->IsEmpty());
// The parent approval dialog should have not appeared.
- EXPECT_EQ(0, supervised_user_delegate_->show_dialog_count_);
+ EXPECT_EQ(0, supervised_user_delegate_->show_dialog_count());
+
+ // Should see 1 kPermissionsIncreaseGranted UMA metric.
+ histogram_tester.ExpectBucketCount(
+ SupervisedUserExtensionsMetricsRecorder::kExtensionsHistogramName,
+ SupervisedUserExtensionsMetricsRecorder::UmaExtensionState::
+ kPermissionsIncreaseGranted,
+ 1);
+ histogram_tester.ExpectTotalCount(
+ SupervisedUserExtensionsMetricsRecorder::kExtensionsHistogramName, 2);
}
// Tests that supervised users can't approve permission updates by themselves
@@ -988,6 +1154,8 @@ TEST_F(ManagementApiSupervisedUserTest,
// Preconditions.
ASSERT_TRUE(profile()->IsChild());
+ base::HistogramTester histogram_tester;
+
base::FilePath base_path = data_dir().AppendASCII("permissions_increase");
base::FilePath pem_path = base_path.AppendASCII("permissions.pem");
@@ -1001,10 +1169,19 @@ TEST_F(ManagementApiSupervisedUserTest,
const std::string extension_id = extension->id();
// Simulate parent approval for the extension installation.
- GetSupervisedUserService()->AddOrUpdateExtensionApproval(*extension);
+ GetSupervisedUserService()->AddExtensionApproval(*extension);
// The extension should be enabled now.
EXPECT_TRUE(registry()->enabled_extensions().Contains(extension_id));
+ // There should be 1 kApprovalGranted UMA metric.
+ histogram_tester.ExpectUniqueSample(
+ SupervisedUserExtensionsMetricsRecorder::kExtensionsHistogramName,
+ SupervisedUserExtensionsMetricsRecorder::UmaExtensionState::
+ kApprovalGranted,
+ 1);
+ histogram_tester.ExpectTotalCount(
+ SupervisedUserExtensionsMetricsRecorder::kExtensionsHistogramName, 1);
+
ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
std::unique_ptr<const PermissionSet> known_perms =
prefs->GetGrantedPermissions(extension_id);
@@ -1045,7 +1222,11 @@ TEST_F(ManagementApiSupervisedUserTest,
// The parent approval dialog should have not appeared. The parent approval
// dialog should never appear when the "Permissions for sites, apps and
// extensions" toggle is off.
- EXPECT_EQ(0, supervised_user_delegate_->show_dialog_count_);
+ EXPECT_EQ(0, supervised_user_delegate_->show_dialog_count());
+
+ // There should be no new UMA metrics.
+ histogram_tester.ExpectTotalCount(
+ SupervisedUserExtensionsMetricsRecorder::kExtensionsHistogramName, 1);
}
// Tests that if an extension still requires parental consent, the supervised
@@ -1109,12 +1290,13 @@ TEST_F(ManagementApiSupervisedUserTest,
EXPECT_TRUE(known_perms->IsEmpty());
// The parent approval dialog should have appeared.
- EXPECT_EQ(1, supervised_user_delegate_->show_dialog_count_);
+ EXPECT_EQ(1, supervised_user_delegate_->show_dialog_count());
// Now try again with parent approval, and this should succeed.
{
- supervised_user_delegate_->dialog_result_ = SupervisedUserServiceDelegate::
- ParentPermissionDialogResult::kParentPermissionReceived;
+ supervised_user_delegate_->set_next_parent_permission_dialog_result(
+ SupervisedUserServiceDelegate::ParentPermissionDialogResult::
+ kParentPermissionReceived);
std::string error;
bool success = RunSetEnabledFunction(web_contents_.get(), extension_id,
/*use_user_gesture=*/true,
@@ -1134,7 +1316,7 @@ TEST_F(ManagementApiSupervisedUserTest,
EXPECT_FALSE(known_perms->IsEmpty());
// The parent approval dialog should have appeared again.
- EXPECT_EQ(2, supervised_user_delegate_->show_dialog_count_);
+ EXPECT_EQ(2, supervised_user_delegate_->show_dialog_count());
}
// Tests that trying to enable an extension with parent approval for supervised
@@ -1142,7 +1324,7 @@ TEST_F(ManagementApiSupervisedUserTest,
TEST_F(ManagementApiSupervisedUserTest, SetEnabled_UnsupportedRequirement) {
// Preconditions.
ASSERT_TRUE(profile()->IsChild());
- ASSERT_EQ(0, supervised_user_delegate_->show_dialog_count_);
+ ASSERT_EQ(0, supervised_user_delegate_->show_dialog_count());
// No WebGL will be the unsupported requirement.
content::GpuDataManager::GetInstance()->BlacklistWebGLForTesting();
@@ -1164,8 +1346,9 @@ TEST_F(ManagementApiSupervisedUserTest, SetEnabled_UnsupportedRequirement) {
// Parent approval should fail because of the unsupported requirements.
{
- supervised_user_delegate_->dialog_result_ = SupervisedUserServiceDelegate::
- ParentPermissionDialogResult::kParentPermissionReceived;
+ supervised_user_delegate_->set_next_parent_permission_dialog_result(
+ SupervisedUserServiceDelegate::ParentPermissionDialogResult::
+ kParentPermissionReceived);
std::string error;
bool success = RunSetEnabledFunction(web_contents_.get(), extension->id(),
/*user_user_gesture=*/true,
@@ -1173,7 +1356,7 @@ TEST_F(ManagementApiSupervisedUserTest, SetEnabled_UnsupportedRequirement) {
EXPECT_FALSE(success);
EXPECT_FALSE(error.empty());
// The parent permission dialog was never opened.
- EXPECT_EQ(0, supervised_user_delegate_->show_dialog_count_);
+ EXPECT_EQ(0, supervised_user_delegate_->show_dialog_count());
EXPECT_TRUE(registry()->disabled_extensions().Contains(extension->id()));
// The extension should still require parent approval.
EXPECT_TRUE(prefs->HasDisableReason(
@@ -1183,6 +1366,73 @@ TEST_F(ManagementApiSupervisedUserTest, SetEnabled_UnsupportedRequirement) {
}
}
+// Tests UMA metrics related to supervised users enabling and disabling
+// extensions.
+TEST_F(ManagementApiSupervisedUserTest, SetEnabledDisabled_UmaMetrics) {
+ base::HistogramTester histogram_tester;
+ base::UserActionTester user_action_tester;
+
+ base::FilePath base_path = data_dir().AppendASCII("permissions_increase");
+ base::FilePath pem_path = base_path.AppendASCII("permissions.pem");
+
+ base::FilePath path = base_path.AppendASCII("v1");
+ const Extension* extension =
+ PackAndInstallCRX(path, pem_path, INSTALL_WITHOUT_LOAD);
+ ASSERT_TRUE(extension);
+
+ // The parent will approve.
+ supervised_user_delegate_->set_next_parent_permission_dialog_result(
+ SupervisedUserServiceDelegate::ParentPermissionDialogResult::
+ kParentPermissionReceived);
+
+ RunSetEnabledFunction(web_contents_.get(), extension->id(),
+ /*use_user_gesture=*/true, /*accept_dialog=*/true,
+ nullptr, /*enabled=*/true);
+ histogram_tester.ExpectUniqueSample(
+ SupervisedUserExtensionsMetricsRecorder::kEnablementHistogramName,
+ SupervisedUserExtensionsMetricsRecorder::EnablementState::kEnabled, 1);
+ histogram_tester.ExpectTotalCount(
+ SupervisedUserExtensionsMetricsRecorder::kEnablementHistogramName, 1);
+ EXPECT_EQ(1,
+ user_action_tester.GetActionCount(
+ SupervisedUserExtensionsMetricsRecorder::kEnabledActionName));
+ EXPECT_EQ(0,
+ user_action_tester.GetActionCount(
+ SupervisedUserExtensionsMetricsRecorder::kDisabledActionName));
+
+ // Simulate supervised user disabling extension.
+ RunSetEnabledFunction(web_contents_.get(), extension->id(),
+ /*use_user_gesture=*/true, /*accept_dialog=*/true,
+ nullptr, /*enabled=*/false);
+ histogram_tester.ExpectBucketCount(
+ SupervisedUserExtensionsMetricsRecorder::kEnablementHistogramName,
+ SupervisedUserExtensionsMetricsRecorder::EnablementState::kDisabled, 1);
+ histogram_tester.ExpectTotalCount(
+ SupervisedUserExtensionsMetricsRecorder::kEnablementHistogramName, 2);
+ EXPECT_EQ(1,
+ user_action_tester.GetActionCount(
+ SupervisedUserExtensionsMetricsRecorder::kEnabledActionName));
+ EXPECT_EQ(1,
+ user_action_tester.GetActionCount(
+ SupervisedUserExtensionsMetricsRecorder::kDisabledActionName));
+
+ // Simulate supervised user re-enabling extension.
+ RunSetEnabledFunction(web_contents_.get(), extension->id(),
+ /*use_user_gesture=*/true, /*accept_dialog=*/true,
+ nullptr, /*enabled=*/true);
+ histogram_tester.ExpectBucketCount(
+ SupervisedUserExtensionsMetricsRecorder::kEnablementHistogramName,
+ SupervisedUserExtensionsMetricsRecorder::EnablementState::kEnabled, 2);
+ histogram_tester.ExpectTotalCount(
+ SupervisedUserExtensionsMetricsRecorder::kEnablementHistogramName, 3);
+ EXPECT_EQ(2,
+ user_action_tester.GetActionCount(
+ SupervisedUserExtensionsMetricsRecorder::kEnabledActionName));
+ EXPECT_EQ(1,
+ user_action_tester.GetActionCount(
+ SupervisedUserExtensionsMetricsRecorder::kDisabledActionName));
+}
+
// Tests for supervised users (child accounts) with additional setup code.
class ManagementApiSupervisedUserTestWithSetup
: public ManagementApiSupervisedUserTest {
@@ -1197,45 +1447,30 @@ class ManagementApiSupervisedUserTestWithSetup
delegate_ = new TestManagementAPIDelegate;
management_api_->set_delegate_for_test(base::WrapUnique(delegate_));
- // Install a policy provider that requires parent approval for extensions.
- provider_ = std::make_unique<TestManagementPolicyProvider>();
- provider_->SetProhibitedActions(
- TestManagementPolicyProvider::MUST_REMAIN_DISABLED);
- provider_->SetDisableReason(
- disable_reason::DISABLE_CUSTODIAN_APPROVAL_REQUIRED);
- ExtensionSystem::Get(profile())->management_policy()->RegisterProvider(
- provider_.get());
-
// Add a generic extension.
extension_ = ExtensionBuilder("Test").Build();
service()->AddExtension(extension_.get());
EXPECT_TRUE(registry()->enabled_extensions().Contains(extension_->id()));
}
- void TearDown() override {
- ExtensionSystem::Get(profile())->management_policy()->UnregisterProvider(
- provider_.get());
- ManagementApiSupervisedUserTest::TearDown();
- }
-
TestManagementAPIDelegate* delegate_ = nullptr;
scoped_refptr<const Extension> extension_;
- std::unique_ptr<TestManagementPolicyProvider> provider_;
};
TEST_F(ManagementApiSupervisedUserTestWithSetup, SetEnabled_ParentApproves) {
// Preconditions.
ASSERT_TRUE(profile()->IsChild());
ASSERT_EQ(0, delegate_->enable_count_);
- ASSERT_EQ(0, supervised_user_delegate_->show_dialog_count_);
+ ASSERT_EQ(0, supervised_user_delegate_->show_dialog_count());
// Start with a disabled extension that needs parent permission.
service()->DisableExtension(
extension_->id(), disable_reason::DISABLE_CUSTODIAN_APPROVAL_REQUIRED);
// The parent will approve.
- supervised_user_delegate_->dialog_result_ = SupervisedUserServiceDelegate::
- ParentPermissionDialogResult::kParentPermissionReceived;
+ supervised_user_delegate_->set_next_parent_permission_dialog_result(
+ SupervisedUserServiceDelegate::ParentPermissionDialogResult::
+ kParentPermissionReceived);
// Simulate a call to chrome.management.setEnabled(). It should succeed.
std::string error;
@@ -1246,7 +1481,7 @@ TEST_F(ManagementApiSupervisedUserTestWithSetup, SetEnabled_ParentApproves) {
EXPECT_TRUE(error.empty());
// Parent permission dialog was opened.
- EXPECT_EQ(1, supervised_user_delegate_->show_dialog_count_);
+ EXPECT_EQ(1, supervised_user_delegate_->show_dialog_count());
// Extension was enabled.
EXPECT_EQ(1, delegate_->enable_count_);
@@ -1258,8 +1493,9 @@ TEST_F(ManagementApiSupervisedUserTestWithSetup, SetEnabled_ParentDenies) {
extension_->id(), disable_reason::DISABLE_CUSTODIAN_APPROVAL_REQUIRED);
// The parent will deny the next dialog.
- supervised_user_delegate_->dialog_result_ = SupervisedUserServiceDelegate::
- ParentPermissionDialogResult::kParentPermissionCanceled;
+ supervised_user_delegate_->set_next_parent_permission_dialog_result(
+ SupervisedUserServiceDelegate::ParentPermissionDialogResult::
+ kParentPermissionCanceled);
// Simulate a call to chrome.management.setEnabled(). It should not succeed.
std::string error;
@@ -1270,7 +1506,7 @@ TEST_F(ManagementApiSupervisedUserTestWithSetup, SetEnabled_ParentDenies) {
EXPECT_FALSE(error.empty());
// Parent permission dialog was opened.
- EXPECT_EQ(1, supervised_user_delegate_->show_dialog_count_);
+ EXPECT_EQ(1, supervised_user_delegate_->show_dialog_count());
// Extension was not enabled.
EXPECT_EQ(0, delegate_->enable_count_);
@@ -1283,8 +1519,9 @@ TEST_F(ManagementApiSupervisedUserTestWithSetup, SetEnabled_DialogFails) {
// The next dialog will close due to a failure (e.g. network failure while
// looking up parent information).
- supervised_user_delegate_->dialog_result_ = SupervisedUserServiceDelegate::
- ParentPermissionDialogResult::kParentPermissionFailed;
+ supervised_user_delegate_->set_next_parent_permission_dialog_result(
+ SupervisedUserServiceDelegate::ParentPermissionDialogResult::
+ kParentPermissionFailed);
// Simulate a call to chrome.management.setEnabled(). It should not succeed.
std::string error;
@@ -1303,10 +1540,8 @@ TEST_F(ManagementApiSupervisedUserTestWithSetup, SetEnabled_PreviouslyAllowed) {
service()->DisableExtension(extension_->id(),
disable_reason::DISABLE_USER_ACTION);
- // Allow the extension to be enabled.
- provider_->SetProhibitedActions(TestManagementPolicyProvider::ALLOW_ALL);
// Simulate previous parent approval.
- GetSupervisedUserService()->AddOrUpdateExtensionApproval(*extension_);
+ GetSupervisedUserService()->AddExtensionApproval(*extension_);
// Simulate a call to chrome.management.setEnabled().
std::string error;
@@ -1317,7 +1552,7 @@ TEST_F(ManagementApiSupervisedUserTestWithSetup, SetEnabled_PreviouslyAllowed) {
EXPECT_TRUE(error.empty());
// Parent permission dialog was not opened.
- EXPECT_EQ(0, supervised_user_delegate_->show_dialog_count_);
+ EXPECT_EQ(0, supervised_user_delegate_->show_dialog_count());
}
#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
diff --git a/chromium/chrome/browser/extensions/api/management/management_apitest.cc b/chromium/chrome/browser/extensions/api/management/management_apitest.cc
index 122cd889da7..aded1d518db 100644
--- a/chromium/chrome/browser/extensions/api/management/management_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/management/management_apitest.cc
@@ -25,6 +25,7 @@
#include "chrome/common/chrome_features.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/extensions/extension_constants.h"
+#include "content/public/test/browser_test.h"
#include "extensions/browser/api/management/management_api.h"
#include "extensions/browser/extension_dialog_auto_confirm.h"
#include "extensions/browser/extension_registry.h"
@@ -356,15 +357,8 @@ IN_PROC_BROWSER_TEST_F(InstallReplacementWebAppApiTest,
RunInstallableWebAppTest(kAppManifest, kGoodWebAppURL, kGoodWebAppURL);
}
-// Fails often on Windows dbg bots. http://crbug.com/177163
-#if defined(OS_WIN)
-#define MAYBE_ManagementPolicyAllowed DISABLED_ManagementPolicyAllowed
-#else
-#define MAYBE_ManagementPolicyAllowed ManagementPolicyAllowed
-#endif // defined(OS_WIN)
// Tests actions on extensions when no management policy is in place.
-IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest,
- MAYBE_ManagementPolicyAllowed) {
+IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest, ManagementPolicyAllowed) {
LoadExtensions();
extensions::ScopedTestDialogAutoConfirm auto_confirm(
extensions::ScopedTestDialogAutoConfirm::ACCEPT);
@@ -385,15 +379,8 @@ IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest,
extensions::ExtensionRegistry::EVERYTHING));
}
-// Fails often on Windows dbg bots. http://crbug.com/177163
-#if defined(OS_WIN)
-#define MAYBE_ManagementPolicyProhibited DISABLED_ManagementPolicyProhibited
-#else
-#define MAYBE_ManagementPolicyProhibited ManagementPolicyProhibited
-#endif // defined(OS_WIN)
// Tests actions on extensions when management policy prohibits those actions.
-IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest,
- MAYBE_ManagementPolicyProhibited) {
+IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest, ManagementPolicyProhibited) {
LoadExtensions();
extensions::ExtensionRegistry* registry =
extensions::ExtensionRegistry::Get(browser()->profile());
diff --git a/chromium/chrome/browser/extensions/api/management/management_browsertest.cc b/chromium/chrome/browser/extensions/api/management/management_browsertest.cc
index 9654ebb2bc7..68ecb30c5ed 100644
--- a/chromium/chrome/browser/extensions/api/management/management_browsertest.cc
+++ b/chromium/chrome/browser/extensions/api/management/management_browsertest.cc
@@ -30,6 +30,7 @@
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/render_view_host.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_utils.h"
#include "content/public/test/url_loader_interceptor.h"
diff --git a/chromium/chrome/browser/extensions/api/mdns/OWNERS b/chromium/chrome/browser/extensions/api/mdns/OWNERS
index 776800e66e7..57649bcb2e4 100644
--- a/chromium/chrome/browser/extensions/api/mdns/OWNERS
+++ b/chromium/chrome/browser/extensions/api/mdns/OWNERS
@@ -1,5 +1,4 @@
mfoltz@chromium.org
-gene@chromium.org
vitalybuka@chromium.org
# COMPONENT: Internals>Cast>API
diff --git a/chromium/chrome/browser/extensions/api/mdns/mdns_apitest.cc b/chromium/chrome/browser/extensions/api/mdns/mdns_apitest.cc
index 495366644a2..914c9eb0467 100644
--- a/chromium/chrome/browser/extensions/api/mdns/mdns_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/mdns/mdns_apitest.cc
@@ -11,6 +11,7 @@
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/media/router/test/mock_dns_sd_registry.h"
#include "chrome/common/extensions/api/mdns.h"
+#include "content/public/test/browser_test.h"
#include "extensions/common/switches.h"
#include "extensions/test/result_catcher.h"
#include "testing/gmock/include/gmock/gmock.h"
diff --git a/chromium/chrome/browser/extensions/api/messaging/chrome_messaging_delegate.cc b/chromium/chrome/browser/extensions/api/messaging/chrome_messaging_delegate.cc
index a236b6b0709..fe9f656b81b 100644
--- a/chromium/chrome/browser/extensions/api/messaging/chrome_messaging_delegate.cc
+++ b/chromium/chrome/browser/extensions/api/messaging/chrome_messaging_delegate.cc
@@ -7,7 +7,7 @@
#include <memory>
#include "base/callback.h"
-#include "base/logging.h"
+#include "base/check_op.h"
#include "build/build_config.h"
#include "chrome/browser/extensions/api/messaging/incognito_connectability.h"
#include "chrome/browser/extensions/api/messaging/native_message_port.h"
diff --git a/chromium/chrome/browser/extensions/api/messaging/incognito_connectability.cc b/chromium/chrome/browser/extensions/api/messaging/incognito_connectability.cc
index b0058cb5ef3..2851891a952 100644
--- a/chromium/chrome/browser/extensions/api/messaging/incognito_connectability.cc
+++ b/chromium/chrome/browser/extensions/api/messaging/incognito_connectability.cc
@@ -5,8 +5,8 @@
#include "chrome/browser/extensions/api/messaging/incognito_connectability.h"
#include "base/bind.h"
+#include "base/check_op.h"
#include "base/lazy_instance.h"
-#include "base/logging.h"
#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/extensions/api/messaging/incognito_connectability_infobar_delegate.h"
diff --git a/chromium/chrome/browser/extensions/api/messaging/native_message_process_host_unittest.cc b/chromium/chrome/browser/extensions/api/messaging/native_message_process_host_unittest.cc
index e3e890fd61b..428ba272fc3 100644
--- a/chromium/chrome/browser/extensions/api/messaging/native_message_process_host_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/messaging/native_message_process_host_unittest.cc
@@ -166,12 +166,9 @@ class NativeMessagingTest : public ::testing::Test,
return base::FilePath();
std::string message_with_header = FormatMessage(message);
- int bytes_written = base::WriteFile(
- filename, message_with_header.data(), message_with_header.size());
- if (bytes_written < 0 ||
- (message_with_header.size() != static_cast<size_t>(bytes_written))) {
+ if (!base::WriteFile(filename, message_with_header))
return base::FilePath();
- }
+
return filename;
}
diff --git a/chromium/chrome/browser/extensions/api/messaging/native_messaging_apitest.cc b/chromium/chrome/browser/extensions/api/messaging/native_messaging_apitest.cc
index 460d356c586..f25164371e1 100644
--- a/chromium/chrome/browser/extensions/api/messaging/native_messaging_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/messaging/native_messaging_apitest.cc
@@ -21,6 +21,7 @@
#include "components/keep_alive_registry/keep_alive_registry.h"
#include "components/keep_alive_registry/keep_alive_state_observer.h"
#include "components/keep_alive_registry/keep_alive_types.h"
+#include "content/public/test/browser_test.h"
#include "extensions/browser/process_manager.h"
#include "extensions/test/result_catcher.h"
diff --git a/chromium/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.cc b/chromium/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.cc
index 5750d0ff045..dd13b16555f 100644
--- a/chromium/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.cc
+++ b/chromium/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.cc
@@ -6,8 +6,8 @@
#include <stddef.h>
+#include "base/check.h"
#include "base/json/json_file_value_serializer.h"
-#include "base/logging.h"
#include "base/strings/string_util.h"
#include "base/values.h"
#include "chrome/common/chrome_features.h"
diff --git a/chromium/chrome/browser/extensions/api/messaging/native_messaging_host_manifest_unittest.cc b/chromium/chrome/browser/extensions/api/messaging/native_messaging_host_manifest_unittest.cc
index 4f4b61bb09b..94120d1b0e0 100644
--- a/chromium/chrome/browser/extensions/api/messaging/native_messaging_host_manifest_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/messaging/native_messaging_host_manifest_unittest.cc
@@ -65,9 +65,7 @@ class NativeMessagingHostManifestTest : public ::testing::Test {
}
bool WriteManifest(const std::string& manifest_content) {
- return base::WriteFile(manifest_path_, manifest_content.data(),
- manifest_content.size()) ==
- static_cast<int>(manifest_content.size());
+ return base::WriteFile(manifest_path_, manifest_content);
}
base::ScopedTempDir temp_dir_;
diff --git a/chromium/chrome/browser/extensions/api/metrics_private/metrics_apitest.cc b/chromium/chrome/browser/extensions/api/metrics_private/metrics_apitest.cc
index 8847f05db62..272f865602d 100644
--- a/chromium/chrome/browser/extensions/api/metrics_private/metrics_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/metrics_private/metrics_apitest.cc
@@ -13,6 +13,7 @@
#include "base/test/metrics/user_action_tester.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "components/variations/variations_associated_data.h"
+#include "content/public/test/browser_test.h"
namespace extensions {
diff --git a/chromium/chrome/browser/extensions/api/module/module_apitest.cc b/chromium/chrome/browser/extensions/api/module/module_apitest.cc
index ca037e4085b..006fd1bda89 100644
--- a/chromium/chrome/browser/extensions/api/module/module_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/module/module_apitest.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "chrome/browser/extensions/extension_apitest.h"
+#include "content/public/test/browser_test.h"
using ExtensionModuleApiTest = extensions::ExtensionApiTest;
diff --git a/chromium/chrome/browser/extensions/api/networking_cast_private/networking_cast_private_apitest.cc b/chromium/chrome/browser/extensions/api/networking_cast_private/networking_cast_private_apitest.cc
index c39fd6e8256..18382ad6d72 100644
--- a/chromium/chrome/browser/extensions/api/networking_cast_private/networking_cast_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/networking_cast_private/networking_cast_private_apitest.cc
@@ -15,6 +15,7 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/extensions/api/networking_cast_private/chrome_networking_cast_private_delegate.h"
#include "chrome/browser/extensions/extension_apitest.h"
+#include "content/public/test/browser_test.h"
#include "extensions/browser/api/networking_private/networking_cast_private_delegate.h"
#include "extensions/common/switches.h"
diff --git a/chromium/chrome/browser/extensions/api/networking_config_chromeos_apitest_chromeos.cc b/chromium/chrome/browser/extensions/api/networking_config_chromeos_apitest_chromeos.cc
index 329849630be..18f851dec46 100644
--- a/chromium/chrome/browser/extensions/api/networking_config_chromeos_apitest_chromeos.cc
+++ b/chromium/chrome/browser/extensions/api/networking_config_chromeos_apitest_chromeos.cc
@@ -21,6 +21,7 @@
#include "chromeos/dbus/shill/shill_profile_client.h"
#include "chromeos/dbus/shill/shill_service_client.h"
#include "components/captive_portal/core/captive_portal_testing_utils.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_utils.h"
#include "extensions/test/result_catcher.h"
#include "net/base/net_errors.h"
diff --git a/chromium/chrome/browser/extensions/api/networking_private/networking_private_apitest.cc b/chromium/chrome/browser/extensions/api/networking_private/networking_private_apitest.cc
index 630af69f36d..7eb874b46fd 100644
--- a/chromium/chrome/browser/extensions/api/networking_private/networking_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/networking_private/networking_private_apitest.cc
@@ -12,13 +12,13 @@
#include "base/bind.h"
#include "base/callback.h"
#include "base/command_line.h"
-#include "base/logging.h"
#include "base/macros.h"
#include "build/build_config.h"
#include "chrome/browser/extensions/api/networking_cast_private/chrome_networking_cast_private_delegate.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "components/keyed_service/core/keyed_service.h"
#include "components/onc/onc_constants.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_utils.h"
#include "extensions/browser/api/networking_private/networking_private_delegate.h"
#include "extensions/browser/api/networking_private/networking_private_delegate_factory.h"
@@ -401,12 +401,6 @@ class NetworkingPrivateApiTest : public ExtensionApiTest {
// other. TODO(stevenjb): Use extensions::ApiUnitTest once moved to
// src/extensions.
-// These fail on Windows due to crbug.com/177163. Note: we still have partial
-// coverage in NetworkingPrivateServiceClientApiTest. TODO(stevenjb): Enable
-// these on Windows once we switch to extensions::ApiUnitTest.
-
-#if !defined(OS_WIN)
-
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, GetProperties) {
EXPECT_TRUE(RunNetworkingSubtest("getProperties")) << message_;
}
@@ -513,8 +507,9 @@ IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, GetGlobalPolicy) {
EXPECT_TRUE(RunNetworkingSubtest("getGlobalPolicy")) << message_;
}
-// Test failure case
+namespace {
+// Test failure case
class NetworkingPrivateApiTestFail : public NetworkingPrivateApiTest {
public:
NetworkingPrivateApiTestFail() { test_failure_ = true; }
@@ -525,6 +520,8 @@ class NetworkingPrivateApiTestFail : public NetworkingPrivateApiTest {
DISALLOW_COPY_AND_ASSIGN(NetworkingPrivateApiTestFail);
};
+} // namespace
+
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTestFail, GetProperties) {
EXPECT_FALSE(RunNetworkingSubtest("getProperties")) << message_;
}
@@ -616,6 +613,4 @@ IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTestFail,
EXPECT_FALSE(RunNetworkingSubtest("selectCellularMobileNetwork")) << message_;
}
-#endif // defined(OS_WIN)
-
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc b/chromium/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc
index 4fe9d8d7ef9..95d24315656 100644
--- a/chromium/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc
@@ -59,6 +59,7 @@
#include "content/public/browser/notification_registrar.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_source.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_utils.h"
#include "dbus/object_path.h"
#include "extensions/browser/api/networking_private/networking_private_chromeos.h"
@@ -611,8 +612,6 @@ IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
->network_state_handler()
->FirstNetworkByType(chromeos::NetworkTypePattern::Cellular());
ASSERT_TRUE(cellular);
- std::string cellular_guid = std::string(kCellular1ServicePath) + "_guid";
- EXPECT_EQ(cellular_guid, cellular->guid());
// Remove the Cellular service. This should create a default Cellular network.
service_test_->RemoveService(kCellular1ServicePath);
content::RunAllPendingInMessageLoop();
@@ -620,7 +619,6 @@ IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
->network_state_handler()
->FirstNetworkByType(chromeos::NetworkTypePattern::Cellular());
ASSERT_TRUE(cellular);
- EXPECT_EQ(cellular_guid, cellular->guid());
EXPECT_TRUE(RunNetworkingSubtest("getPropertiesCellularDefault")) << message_;
}
diff --git a/chromium/chrome/browser/extensions/api/networking_private/networking_private_crypto_unittest.cc b/chromium/chrome/browser/extensions/api/networking_private/networking_private_crypto_unittest.cc
index 1afe9ce7448..e5bb286ecaa 100644
--- a/chromium/chrome/browser/extensions/api/networking_private/networking_private_crypto_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/networking_private/networking_private_crypto_unittest.cc
@@ -6,7 +6,6 @@
#include <stdint.h>
#include "base/base64.h"
-#include "base/logging.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
diff --git a/chromium/chrome/browser/extensions/api/networking_private/networking_private_service_client_apitest.cc b/chromium/chrome/browser/extensions/api/networking_private/networking_private_service_client_apitest.cc
index ab1b1578905..836fdc3f25a 100644
--- a/chromium/chrome/browser/extensions/api/networking_private/networking_private_service_client_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/networking_private/networking_private_service_client_apitest.cc
@@ -15,6 +15,7 @@
#include "components/user_manager/user.h"
#include "components/user_manager/user_manager.h"
#include "components/wifi/fake_wifi_service.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_utils.h"
#include "extensions/browser/api/networking_private/networking_private_delegate_factory.h"
#include "extensions/browser/api/networking_private/networking_private_event_router.h"
diff --git a/chromium/chrome/browser/extensions/api/notifications/extension_notification_handler.cc b/chromium/chrome/browser/extensions/api/notifications/extension_notification_handler.cc
index 104923d9b60..7ee32b021aa 100644
--- a/chromium/chrome/browser/extensions/api/notifications/extension_notification_handler.cc
+++ b/chromium/chrome/browser/extensions/api/notifications/extension_notification_handler.cc
@@ -5,7 +5,7 @@
#include "chrome/browser/extensions/api/notifications/extension_notification_handler.h"
#include "base/callback.h"
-#include "base/logging.h"
+#include "base/check_op.h"
#include "base/metrics/histogram_macros.h"
#include "base/strings/nullable_string16.h"
#include "base/strings/string_piece.h"
diff --git a/chromium/chrome/browser/extensions/api/notifications/notifications_apitest.cc b/chromium/chrome/browser/extensions/api/notifications/notifications_apitest.cc
index 3c64e1f58d2..50543955170 100644
--- a/chromium/chrome/browser/extensions/api/notifications/notifications_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/notifications/notifications_apitest.cc
@@ -11,7 +11,9 @@
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
#include "chrome/browser/apps/app_service/app_launch_params.h"
-#include "chrome/browser/apps/launch_service/launch_service.h"
+#include "chrome/browser/apps/app_service/app_service_proxy.h"
+#include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
+#include "chrome/browser/apps/app_service/browser_app_launcher.h"
#include "chrome/browser/apps/platform_apps/app_browsertest_util.h"
#include "chrome/browser/extensions/api/notifications/extension_notification_display_helper.h"
#include "chrome/browser/extensions/api/notifications/extension_notification_display_helper_factory.h"
@@ -27,6 +29,7 @@
#include "chrome/common/chrome_features.h"
#include "chrome/test/base/interactive_test_utils.h"
#include "content/public/browser/notification_service.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_utils.h"
#include "extensions/browser/api/test/test_api.h"
#include "extensions/browser/app_window/app_window.h"
@@ -205,8 +208,9 @@ class NotificationsApiTest : public extensions::ExtensionApiTest {
}
void LaunchPlatformApp(const Extension* extension) {
- apps::LaunchService::Get(browser()->profile())
- ->OpenApplication(apps::AppLaunchParams(
+ apps::AppServiceProxyFactory::GetForProfile(browser()->profile())
+ ->BrowserAppLauncher()
+ .LaunchAppWithParams(apps::AppLaunchParams(
extension->id(), apps::mojom::LaunchContainer::kLaunchContainerNone,
WindowOpenDisposition::NEW_WINDOW,
apps::mojom::AppLaunchSource::kSourceTest));
diff --git a/chromium/chrome/browser/extensions/api/omnibox/omnibox_api_interactive_test.cc b/chromium/chrome/browser/extensions/api/omnibox/omnibox_api_interactive_test.cc
index a62034dc7d3..f0ce87d4866 100644
--- a/chromium/chrome/browser/extensions/api/omnibox/omnibox_api_interactive_test.cc
+++ b/chromium/chrome/browser/extensions/api/omnibox/omnibox_api_interactive_test.cc
@@ -27,6 +27,7 @@
#include "components/omnibox/browser/omnibox_controller_emitter.h"
#include "components/omnibox/browser/omnibox_popup_model.h"
#include "components/omnibox/browser/omnibox_view.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_utils.h"
#include "extensions/test/extension_test_message_listener.h"
#include "extensions/test/result_catcher.h"
diff --git a/chromium/chrome/browser/extensions/api/page_capture/page_capture_api.cc b/chromium/chrome/browser/extensions/api/page_capture/page_capture_api.cc
index 617931c6788..ba017b4199d 100644
--- a/chromium/chrome/browser/extensions/api/page_capture/page_capture_api.cc
+++ b/chromium/chrome/browser/extensions/api/page_capture/page_capture_api.cc
@@ -6,6 +6,7 @@
#include <limits>
#include <memory>
+#include <utility>
#include "base/bind.h"
#include "base/bind_helpers.h"
@@ -124,7 +125,7 @@ ExtensionFunction::ResponseAction PageCaptureSaveAsMHTMLFunction::Run() {
std::string error;
if (!CanCaptureCurrentPage(&error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
base::ThreadPool::PostTask(
FROM_HERE, kCreateTemporaryFileTaskTraits,
diff --git a/chromium/chrome/browser/extensions/api/page_capture/page_capture_apitest.cc b/chromium/chrome/browser/extensions/api/page_capture/page_capture_apitest.cc
index db06b1b95ee..fb85c861afd 100644
--- a/chromium/chrome/browser/extensions/api/page_capture/page_capture_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/page_capture/page_capture_apitest.cc
@@ -17,6 +17,7 @@
#include "chromeos/login/login_state/scoped_test_public_session_login_state.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_utils.h"
#include "extensions/browser/extension_dialog_auto_confirm.h"
#include "extensions/common/permissions/permission_set.h"
diff --git a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc
index 947070eb2f8..eba6dbddfd3 100644
--- a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc
@@ -30,6 +30,7 @@
#include "chrome/common/extensions/api/passwords_private.h"
#include "chrome/test/base/testing_profile.h"
#include "components/keyed_service/core/keyed_service.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_utils.h"
#include "extensions/common/switches.h"
#include "ui/base/l10n/time_format.h"
diff --git a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_factory.cc b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_factory.cc
index 7308ce4a473..b39d3782038 100644
--- a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_factory.cc
+++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_factory.cc
@@ -9,6 +9,7 @@
#include "chrome/browser/password_manager/bulk_leak_check_service_factory.h"
#include "chrome/browser/password_manager/password_store_factory.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/sync/profile_sync_service_factory.h"
#include "components/keyed_service/content/browser_context_dependency_manager.h"
#include "extensions/browser/extension_system_provider.h"
@@ -37,6 +38,7 @@ PasswordsPrivateDelegateFactory::PasswordsPrivateDelegateFactory()
BrowserContextDependencyManager::GetInstance()) {
DependsOn(BulkLeakCheckServiceFactory::GetInstance());
DependsOn(PasswordStoreFactory::GetInstance());
+ DependsOn(ProfileSyncServiceFactory::GetInstance());
}
PasswordsPrivateDelegateFactory::~PasswordsPrivateDelegateFactory() = default;
diff --git a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
index a00fc1ed6b6..2aaf4ec2863 100644
--- a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
+++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
@@ -7,7 +7,8 @@
#include <utility>
#include "base/bind.h"
-#include "base/logging.h"
+#include "base/check.h"
+#include "base/notreached.h"
#include "base/numerics/safe_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
@@ -16,7 +17,6 @@
#include "chrome/browser/extensions/api/passwords_private/passwords_private_event_router_factory.h"
#include "chrome/browser/password_manager/chrome_password_manager_client.h"
#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/signin/identity_manager_factory.h"
#include "chrome/browser/sync/profile_sync_service_factory.h"
#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h"
#include "chrome/common/extensions/api/passwords_private.h"
@@ -24,12 +24,11 @@
#include "chrome/grit/generated_resources.h"
#include "components/password_manager/core/browser/android_affiliation/affiliation_utils.h"
#include "components/password_manager/core/browser/password_list_sorter.h"
-#include "components/password_manager/core/browser/password_manager_util.h"
+#include "components/password_manager/core/browser/password_manager_features_util.h"
#include "components/password_manager/core/browser/password_ui_utils.h"
#include "components/password_manager/core/browser/ui/plaintext_reason.h"
#include "components/password_manager/core/common/password_manager_features.h"
#include "components/prefs/pref_service.h"
-#include "components/signin/public/identity_manager/identity_manager.h"
#include "content/public/browser/web_contents.h"
#include "ui/base/clipboard/scoped_clipboard_writer.h"
#include "ui/base/l10n/l10n_util.h"
@@ -139,14 +138,11 @@ PasswordsPrivateDelegateImpl::PasswordsPrivateDelegateImpl(Profile* profile)
password_access_authenticator_(
base::BindRepeating(&PasswordsPrivateDelegateImpl::OsReauthCall,
base::Unretained(this))),
- account_storage_opt_in_reauthenticator_(
- base::BindRepeating(&PasswordsPrivateDelegateImpl::InvokeGoogleReauth,
- base::Unretained(this))),
- password_account_storage_opt_in_watcher_(
+ password_account_storage_settings_watcher_(
std::make_unique<
- password_manager::PasswordAccountStorageOptInWatcher>(
- IdentityManagerFactory::GetForProfile(profile_),
+ password_manager::PasswordAccountStorageSettingsWatcher>(
profile_->GetPrefs(),
+ ProfileSyncServiceFactory::GetForProfile(profile_),
base::BindRepeating(&PasswordsPrivateDelegateImpl::
OnAccountStorageOptInStateChanged,
base::Unretained(this)))),
@@ -314,21 +310,6 @@ bool PasswordsPrivateDelegateImpl::OsReauthCall(
#endif
}
-void PasswordsPrivateDelegateImpl::InvokeGoogleReauth(
- content::WebContents* web_contents,
- PasswordsPrivateDelegateImpl::GoogleReauthCallback callback) {
- if (auto* client =
- ChromePasswordManagerClient::FromWebContents(web_contents)) {
- client->TriggerReauthForAccount(
- IdentityManagerFactory::GetForProfile(profile_)->GetPrimaryAccountId(
- signin::ConsentLevel::kNotRequired),
- std::move(callback));
- return;
- }
- std::move(callback).Run(
- password_manager::PasswordManagerClient::ReauthSucceeded(false));
-}
-
Profile* PasswordsPrivateDelegateImpl::GetProfile() {
return profile_;
}
@@ -433,35 +414,27 @@ PasswordsPrivateDelegateImpl::GetExportProgressStatus() {
}
bool PasswordsPrivateDelegateImpl::IsOptedInForAccountStorage() {
- return password_manager_util::IsOptedInForAccountStorage(
+ return password_manager::features_util::IsOptedInForAccountStorage(
profile_->GetPrefs(), ProfileSyncServiceFactory::GetForProfile(profile_));
}
void PasswordsPrivateDelegateImpl::SetAccountStorageOptIn(
bool opt_in,
content::WebContents* web_contents) {
- if (opt_in == IsOptedInForAccountStorage())
+ auto* client = ChromePasswordManagerClient::FromWebContents(web_contents);
+ if (!client)
return;
- if (!opt_in) {
- password_manager_util::SetAccountStorageOptIn(
- profile_->GetPrefs(),
- ProfileSyncServiceFactory::GetForProfile(profile_), false);
+ if (opt_in ==
+ client->GetPasswordFeatureManager()->IsOptedInForAccountStorage()) {
return;
}
- account_storage_opt_in_reauthenticator_.Run(
- web_contents,
- base::BindOnce(
- &PasswordsPrivateDelegateImpl::SetAccountStorageOptInCallback,
- weak_ptr_factory_.GetWeakPtr()));
-}
-
-void PasswordsPrivateDelegateImpl::SetAccountStorageOptInCallback(
- password_manager::PasswordManagerClient::ReauthSucceeded reauth_succeeded) {
- if (reauth_succeeded) {
- password_manager_util::SetAccountStorageOptIn(
- profile_->GetPrefs(),
- ProfileSyncServiceFactory::GetForProfile(profile_), true);
+ if (!opt_in) {
+ client->GetPasswordFeatureManager()
+ ->OptOutOfAccountStorageAndClearSettings();
+ return;
}
+ // The opt in pref is automatically set upon successful reauth.
+ client->TriggerReauthForPrimaryAccount(base::DoNothing());
}
std::vector<api::passwords_private::CompromisedCredential>
@@ -533,7 +506,7 @@ void PasswordsPrivateDelegateImpl::OnAccountStorageOptInStateChanged() {
}
void PasswordsPrivateDelegateImpl::Shutdown() {
- password_account_storage_opt_in_watcher_.reset();
+ password_account_storage_settings_watcher_.reset();
password_manager_porter_.reset();
password_manager_presenter_.reset();
}
diff --git a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
index 6bab4451e81..5e37007baf2 100644
--- a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
+++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
@@ -26,8 +26,7 @@
#include "chrome/common/extensions/api/passwords_private.h"
#include "components/keyed_service/core/keyed_service.h"
#include "components/password_manager/core/browser/password_access_authenticator.h"
-#include "components/password_manager/core/browser/password_account_storage_opt_in_watcher.h"
-#include "components/password_manager/core/browser/password_manager_client.h"
+#include "components/password_manager/core/browser/password_account_storage_settings_watcher.h"
#include "components/password_manager/core/browser/reauth_purpose.h"
#include "components/password_manager/core/browser/ui/export_progress_status.h"
#include "extensions/browser/extension_function.h"
@@ -68,6 +67,7 @@ class PasswordsPrivateDelegateImpl : public PasswordsPrivateDelegate,
api::passwords_private::ExportProgressStatus GetExportProgressStatus()
override;
bool IsOptedInForAccountStorage() override;
+ // TODO(crbug.com/1049141): Mimic the signature in PasswordFeatureManager.
void SetAccountStorageOptIn(bool opt_in,
content::WebContents* web_contents) override;
std::vector<api::passwords_private::CompromisedCredential>
@@ -100,14 +100,6 @@ class PasswordsPrivateDelegateImpl : public PasswordsPrivateDelegate,
IdGenerator<std::string>& GetPasswordIdGeneratorForTesting();
- // TODO(crbug.com/1049141): Move the strong alias out of PasswordManagerClient
- // to avoid leaking implementation details here.
- using GoogleReauthCallback = base::OnceCallback<void(
- password_manager::PasswordManagerClient::ReauthSucceeded)>;
- using GoogleAccountAuthenticator =
- base::RepeatingCallback<void(content::WebContents*,
- GoogleReauthCallback)>;
-
#if defined(UNIT_TEST)
// Use this in tests to mock the OS-level reauthentication.
void set_os_reauth_call(
@@ -116,12 +108,6 @@ class PasswordsPrivateDelegateImpl : public PasswordsPrivateDelegate,
password_access_authenticator_.set_os_reauth_call(
std::move(os_reauth_call));
}
- // Use this in tests to mock the Google account reauthentication.
- void set_account_storage_opt_in_reauthenticator(
- GoogleAccountAuthenticator account_storage_opt_in_reauthenticator) {
- account_storage_opt_in_reauthenticator_ =
- std::move(account_storage_opt_in_reauthenticator);
- }
#endif // defined(UNIT_TEST)
private:
@@ -147,20 +133,10 @@ class PasswordsPrivateDelegateImpl : public PasswordsPrivateDelegate,
void OnAccountStorageOptInStateChanged();
- // Callback for the reauth flow that is triggered upon the user opting in to
- // account password storage. Will opt in the user if the reauth succeeded.
- void SetAccountStorageOptInCallback(
- password_manager::PasswordManagerClient::ReauthSucceeded
- reauth_succeeded);
-
// Triggers an OS-dependent UI to present OS account login challenge and
// returns true if the user passed that challenge.
bool OsReauthCall(password_manager::ReauthPurpose purpose);
- // Triggers a Google account reauthentication UI.
- void InvokeGoogleReauth(content::WebContents* web_contents,
- GoogleReauthCallback callback);
-
// Not owned by this class.
Profile* profile_;
@@ -172,10 +148,8 @@ class PasswordsPrivateDelegateImpl : public PasswordsPrivateDelegate,
password_manager::PasswordAccessAuthenticator password_access_authenticator_;
- GoogleAccountAuthenticator account_storage_opt_in_reauthenticator_;
-
- std::unique_ptr<password_manager::PasswordAccountStorageOptInWatcher>
- password_account_storage_opt_in_watcher_;
+ std::unique_ptr<password_manager::PasswordAccountStorageSettingsWatcher>
+ password_account_storage_settings_watcher_;
PasswordCheckDelegate password_check_delegate_;
diff --git a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
index 4fe560946a2..015feb23ab7 100644
--- a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
@@ -18,28 +18,28 @@
#include "base/test/gmock_move_support.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/mock_callback.h"
-#include "base/test/scoped_feature_list.h"
#include "base/values.h"
#include "chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h"
#include "chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h"
#include "chrome/browser/extensions/api/passwords_private/passwords_private_event_router.h"
#include "chrome/browser/extensions/api/passwords_private/passwords_private_event_router_factory.h"
+#include "chrome/browser/password_manager/chrome_password_manager_client.h"
#include "chrome/browser/password_manager/password_store_factory.h"
-#include "chrome/browser/sync/profile_sync_service_factory.h"
#include "chrome/common/extensions/api/passwords_private.h"
#include "chrome/test/base/testing_profile.h"
#include "components/autofill/core/common/password_form.h"
+#include "components/password_manager/content/browser/password_manager_log_router_factory.h"
#include "components/password_manager/core/browser/compromised_credentials_table.h"
+#include "components/password_manager/core/browser/mock_password_feature_manager.h"
#include "components/password_manager/core/browser/password_list_sorter.h"
#include "components/password_manager/core/browser/password_manager_metrics_util.h"
#include "components/password_manager/core/browser/password_manager_test_utils.h"
-#include "components/password_manager/core/browser/password_manager_util.h"
#include "components/password_manager/core/browser/reauth_purpose.h"
#include "components/password_manager/core/browser/test_password_store.h"
-#include "components/password_manager/core/common/password_manager_features.h"
-#include "components/sync/driver/test_sync_service.h"
#include "content/public/browser/browser_context.h"
#include "content/public/test/browser_task_environment.h"
+#include "content/public/test/test_renderer_host.h"
+#include "content/public/test/web_contents_tester.h"
#include "extensions/browser/test_event_router.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/clipboard/test/test_clipboard.h"
@@ -73,6 +73,52 @@ scoped_refptr<TestPasswordStore> CreateAndUseTestPasswordStore(
.get()));
}
+class MockPasswordManagerClient : public ChromePasswordManagerClient {
+ public:
+ // Creates the mock and attaches it to |web_contents|.
+ static MockPasswordManagerClient* CreateForWebContentsAndGet(
+ content::WebContents* web_contents);
+
+ ~MockPasswordManagerClient() override = default;
+
+ // ChromePasswordManagerClient overrides.
+ MOCK_METHOD(void,
+ TriggerReauthForPrimaryAccount,
+ (base::OnceCallback<void(ReauthSucceeded)>),
+ (override));
+ const password_manager::MockPasswordFeatureManager*
+ GetPasswordFeatureManager() const override {
+ return &mock_password_feature_manager_;
+ }
+
+ password_manager::MockPasswordFeatureManager* GetPasswordFeatureManager() {
+ return &mock_password_feature_manager_;
+ }
+
+ private:
+ explicit MockPasswordManagerClient(content::WebContents* web_contents)
+ : ChromePasswordManagerClient(web_contents, nullptr) {}
+
+ password_manager::MockPasswordFeatureManager mock_password_feature_manager_;
+};
+
+// static
+MockPasswordManagerClient*
+MockPasswordManagerClient::CreateForWebContentsAndGet(
+ content::WebContents* web_contents) {
+ // Avoid creation of log router.
+ password_manager::PasswordManagerLogRouterFactory::GetInstance()
+ ->SetTestingFactory(
+ web_contents->GetBrowserContext(),
+ base::BindRepeating(
+ [](content::BrowserContext*) -> std::unique_ptr<KeyedService> {
+ return nullptr;
+ }));
+ auto* mock_client = new MockPasswordManagerClient(web_contents);
+ web_contents->SetUserData(UserDataKey(), base::WrapUnique(mock_client));
+ return mock_client;
+}
+
class PasswordEventObserver
: public extensions::TestEventRouter::EventObserver {
public:
@@ -128,16 +174,6 @@ autofill::PasswordForm CreateSampleForm() {
return form;
}
-std::unique_ptr<KeyedService> BuildTestSyncService(content::BrowserContext*) {
- auto sync_service = std::make_unique<syncer::TestSyncService>();
- CoreAccountInfo fake_info;
- fake_info.account_id = CoreAccountId("id");
- fake_info.gaia = "gaia";
- fake_info.email = "foo@bar.com";
- sync_service->SetAuthenticatedAccountInfo(fake_info);
- return sync_service;
-}
-
} // namespace
class PasswordsPrivateDelegateImplTest : public testing::Test {
@@ -152,9 +188,6 @@ class PasswordsPrivateDelegateImplTest : public testing::Test {
// PasswordsPrivateEventRouter.
void SetUpRouters();
- void SetGoogleReauthResponse(PasswordsPrivateDelegateImpl* delegate,
- bool should_succeed);
-
base::HistogramTester& histogram_tester() { return histogram_tester_; }
protected:
@@ -165,8 +198,6 @@ class PasswordsPrivateDelegateImplTest : public testing::Test {
CreateAndUseTestPasswordStore(&profile_);
ui::TestClipboard* test_clipboard_ =
ui::TestClipboard::CreateForCurrentThread();
- base::MockCallback<PasswordsPrivateDelegateImpl::GoogleAccountAuthenticator>
- mock_google_authenticator_;
private:
base::HistogramTester histogram_tester_;
@@ -199,22 +230,6 @@ void PasswordsPrivateDelegateImplTest::SetUpRouters() {
&profile_, base::BindRepeating(&BuildPasswordsPrivateEventRouter));
}
-void PasswordsPrivateDelegateImplTest::SetGoogleReauthResponse(
- PasswordsPrivateDelegateImpl* delegate,
- bool should_succeed) {
- ON_CALL(mock_google_authenticator_, Run)
- .WillByDefault(
- [should_succeed](
- content::WebContents*,
- PasswordsPrivateDelegateImpl::GoogleReauthCallback callback) {
- std::move(callback).Run(
- password_manager::PasswordManagerClient::ReauthSucceeded(
- should_succeed));
- });
- delegate->set_account_storage_opt_in_reauthenticator(
- mock_google_authenticator_.Get());
-}
-
TEST_F(PasswordsPrivateDelegateImplTest, GetSavedPasswordsList) {
PasswordsPrivateDelegateImpl delegate(&profile_);
@@ -322,45 +337,42 @@ TEST_F(PasswordsPrivateDelegateImplTest, TestCopyPasswordCallbackResult) {
1);
}
-TEST_F(PasswordsPrivateDelegateImplTest, TestShouldOptInIfReauthSucceeds) {
- base::test::ScopedFeatureList scoped_feature_list;
- scoped_feature_list.InitAndEnableFeature(
- password_manager::features::kEnablePasswordsAccountStorage);
-
- PasswordsPrivateDelegateImpl delegate(&profile_);
-
- SetGoogleReauthResponse(&delegate, true);
+TEST_F(PasswordsPrivateDelegateImplTest, TestShouldReauthForOptIn) {
+ // This enables uses of TestWebContents.
+ content::RenderViewHostTestEnabler test_render_host_factories;
- auto* test_sync_service = static_cast<syncer::SyncService*>(
- ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse(
- &profile_, base::BindRepeating(&BuildTestSyncService)));
+ std::unique_ptr<content::WebContents> web_contents =
+ content::WebContentsTester::CreateTestWebContents(&profile_, nullptr);
+ auto* client =
+ MockPasswordManagerClient::CreateForWebContentsAndGet(web_contents.get());
+ ON_CALL(*(client->GetPasswordFeatureManager()), IsOptedInForAccountStorage)
+ .WillByDefault(Return(false));
- password_manager_util::SetAccountStorageOptIn(profile_.GetPrefs(),
- test_sync_service, false);
- delegate.SetAccountStorageOptIn(true, nullptr);
+ EXPECT_CALL(*client, TriggerReauthForPrimaryAccount);
- EXPECT_TRUE(password_manager_util::IsOptedInForAccountStorage(
- profile_.GetPrefs(), test_sync_service));
+ PasswordsPrivateDelegateImpl delegate(&profile_);
+ delegate.SetAccountStorageOptIn(true, web_contents.get());
}
-TEST_F(PasswordsPrivateDelegateImplTest, TestShouldOptOut) {
- base::test::ScopedFeatureList scoped_feature_list;
- scoped_feature_list.InitAndEnableFeature(
- password_manager::features::kEnablePasswordsAccountStorage);
+TEST_F(PasswordsPrivateDelegateImplTest,
+ TestShouldNotReauthForOptOutAndShouldSetPref) {
+ // This enables uses of TestWebContents.
+ content::RenderViewHostTestEnabler test_render_host_factories;
+
+ std::unique_ptr<content::WebContents> web_contents =
+ content::WebContentsTester::CreateTestWebContents(&profile_, nullptr);
+ auto* client =
+ MockPasswordManagerClient::CreateForWebContentsAndGet(web_contents.get());
+ password_manager::MockPasswordFeatureManager* feature_manager =
+ client->GetPasswordFeatureManager();
+ ON_CALL(*feature_manager, IsOptedInForAccountStorage)
+ .WillByDefault(Return(true));
+
+ EXPECT_CALL(*client, TriggerReauthForPrimaryAccount).Times(0);
+ EXPECT_CALL(*feature_manager, OptOutOfAccountStorageAndClearSettings);
PasswordsPrivateDelegateImpl delegate(&profile_);
-
- auto* test_sync_service = static_cast<syncer::SyncService*>(
- ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse(
- &profile_, base::BindRepeating(&BuildTestSyncService)));
-
- password_manager_util::SetAccountStorageOptIn(profile_.GetPrefs(),
- test_sync_service, true);
- delegate.SetAccountStorageOptIn(false, nullptr);
-
- EXPECT_CALL(mock_google_authenticator_, Run).Times(0);
- EXPECT_FALSE(password_manager_util::IsOptedInForAccountStorage(
- profile_.GetPrefs(), test_sync_service));
+ delegate.SetAccountStorageOptIn(false, web_contents.get());
}
TEST_F(PasswordsPrivateDelegateImplTest, TestCopyPasswordCallbackResultFail) {
diff --git a/chromium/chrome/browser/extensions/api/permissions/permissions_api.cc b/chromium/chrome/browser/extensions/api/permissions/permissions_api.cc
index 26e2ef7a60c..63b1a652908 100644
--- a/chromium/chrome/browser/extensions/api/permissions/permissions_api.cc
+++ b/chromium/chrome/browser/extensions/api/permissions/permissions_api.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/extensions/api/permissions/permissions_api.h"
#include <memory>
+#include <utility>
#include "base/bind.h"
#include "chrome/browser/chrome_notification_types.h"
@@ -64,7 +65,7 @@ ExtensionFunction::ResponseAction PermissionsContainsFunction::Run() {
&error);
if (!unpack_result)
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
const PermissionSet& active_permissions =
extension()->permissions_data()->active_permissions();
@@ -123,7 +124,7 @@ ExtensionFunction::ResponseAction PermissionsRemoveFunction::Run() {
&error);
if (!unpack_result)
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
// We can't remove any permissions that weren't specified in the manifest.
if (!unpack_result->unlisted_apis.empty() ||
@@ -216,7 +217,7 @@ ExtensionFunction::ResponseAction PermissionsRequestFunction::Run() {
&error);
if (!unpack_result)
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
// Don't allow the extension to request any permissions that weren't specified
// in the manifest.
diff --git a/chromium/chrome/browser/extensions/api/permissions/permissions_api_unittest.cc b/chromium/chrome/browser/extensions/api/permissions/permissions_api_unittest.cc
index 02fb0b0860b..17d7dc83d5e 100644
--- a/chromium/chrome/browser/extensions/api/permissions/permissions_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/permissions/permissions_api_unittest.cc
@@ -59,10 +59,7 @@ scoped_refptr<const Extension> CreateExtensionWithPermissions(
// Helper function to create a base::Value from a list of strings.
std::unique_ptr<base::Value> StringVectorToValue(
const std::vector<std::string>& strings) {
- ListBuilder builder;
- for (const auto& str : strings)
- builder.Append(str);
- return builder.Build();
+ return ListBuilder().Append(strings.begin(), strings.end()).Build();
}
// Runs permissions.request() with the provided |args|, and returns the result
@@ -689,7 +686,7 @@ TEST_F(PermissionsAPIUnitTest, RequestingFilePermissions) {
// This will reload the extension, so we need to reset the extension
// pointer.
util::SetAllowFileAccess(extension->id(), profile(), true);
- extension = base::WrapRefCounted(observer.WaitForExtensionLoaded());
+ extension = observer.WaitForExtensionLoaded();
ASSERT_TRUE(extension);
}
diff --git a/chromium/chrome/browser/extensions/api/permissions/permissions_apitest.cc b/chromium/chrome/browser/extensions/api/permissions/permissions_apitest.cc
index ab8175a2b7e..ffd0cb00f00 100644
--- a/chromium/chrome/browser/extensions/api/permissions/permissions_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/permissions/permissions_apitest.cc
@@ -12,6 +12,7 @@
#include "chrome/test/base/ui_test_utils.h"
#include "components/policy/core/browser/browser_policy_connector.h"
#include "components/policy/core/common/mock_configuration_policy_provider.h"
+#include "content/public/test/browser_test.h"
#include "extensions/browser/extension_prefs.h"
#include "extensions/common/permissions/permission_set.h"
#include "extensions/common/switches.h"
diff --git a/chromium/chrome/browser/extensions/api/platform_keys/platform_keys_apitest_nss.cc b/chromium/chrome/browser/extensions/api/platform_keys/platform_keys_apitest_nss.cc
index c90bee00d95..1b2bcb7417a 100644
--- a/chromium/chrome/browser/extensions/api/platform_keys/platform_keys_apitest_nss.cc
+++ b/chromium/chrome/browser/extensions/api/platform_keys/platform_keys_apitest_nss.cc
@@ -21,6 +21,7 @@
#include "chrome/browser/profiles/profile.h"
#include "components/policy/policy_constants.h"
#include "content/public/browser/browser_task_traits.h"
+#include "content/public/test/browser_test.h"
#include "crypto/nss_util_internal.h"
#include "crypto/scoped_nss_types.h"
#include "crypto/scoped_test_nss_db.h"
diff --git a/chromium/chrome/browser/extensions/api/preference/preference_api.cc b/chromium/chrome/browser/extensions/api/preference/preference_api.cc
index 1d45aa27f99..eed1b286bd9 100644
--- a/chromium/chrome/browser/extensions/api/preference/preference_api.cc
+++ b/chromium/chrome/browser/extensions/api/preference/preference_api.cc
@@ -781,7 +781,7 @@ ExtensionFunction::ResponseAction SetPreferenceFunction::Run() {
transformer->ExtensionToBrowserPref(value, &error, &bad_message));
if (!browser_pref_value) {
EXTENSION_FUNCTION_VALIDATE(!bad_message);
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
EXTENSION_FUNCTION_VALIDATE(browser_pref_value->type() == pref->GetType());
@@ -831,7 +831,7 @@ ExtensionFunction::ResponseAction SetPreferenceFunction::Run() {
extension_id(), prefs::kCookieControlsMode, scope,
base::Value(static_cast<int>(
browser_pref_value->GetBool()
- ? content_settings::CookieControlsMode::kOn
+ ? content_settings::CookieControlsMode::kBlockThirdParty
: content_settings::CookieControlsMode::kOff)));
}
diff --git a/chromium/chrome/browser/extensions/api/preference/preference_apitest.cc b/chromium/chrome/browser/extensions/api/preference/preference_apitest.cc
index 69144a56811..3dfd9b014ce 100644
--- a/chromium/chrome/browser/extensions/api/preference/preference_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/preference/preference_apitest.cc
@@ -32,6 +32,7 @@
#include "components/safe_browsing/core/common/safe_browsing_prefs.h"
#include "components/translate/core/browser/translate_pref_names.h"
#include "content/public/browser/notification_service.h"
+#include "content/public/test/browser_test.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/test_extension_registry_observer.h"
#include "extensions/test/extension_test_message_listener.h"
@@ -145,13 +146,7 @@ class ExtensionPreferenceApiTest : public extensions::ExtensionApiTest {
std::unique_ptr<ScopedKeepAlive> keep_alive_;
};
-// http://crbug.com/177163
-#if defined(OS_WIN) && !defined(NDEBUG)
-#define MAYBE_Standard DISABLED_Standard
-#else
-#define MAYBE_Standard Standard
-#endif
-IN_PROC_BROWSER_TEST_F(ExtensionPreferenceApiTest, MAYBE_Standard) {
+IN_PROC_BROWSER_TEST_F(ExtensionPreferenceApiTest, Standard) {
PrefService* prefs = profile_->GetPrefs();
prefs->SetBoolean(embedder_support::kAlternateErrorPagesEnabled, false);
prefs->SetBoolean(autofill::prefs::kAutofillEnabledDeprecated, false);
@@ -216,8 +211,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionPreferenceApiTest, PersistentIncognito) {
EXPECT_FALSE(prefs->GetBoolean(prefs::kBlockThirdPartyCookies));
}
-// Flakily times out: http://crbug.com/106144
-IN_PROC_BROWSER_TEST_F(ExtensionPreferenceApiTest, DISABLED_IncognitoDisabled) {
+IN_PROC_BROWSER_TEST_F(ExtensionPreferenceApiTest, IncognitoDisabled) {
EXPECT_FALSE(RunExtensionTest("preference/persistent_incognito"));
}
@@ -557,7 +551,8 @@ IN_PROC_BROWSER_TEST_F(ExtensionPreferenceApiTest, ThirdPartyCookiesAllowed) {
/* expected_controlled */ true);
VerifyPrefValueAndControlledState(
prefs::kCookieControlsMode,
- base::Value(static_cast<int>(content_settings::CookieControlsMode::kOn)),
+ base::Value(static_cast<int>(
+ content_settings::CookieControlsMode::kBlockThirdParty)),
/* expected_controlled */ true);
listener_false.Reply("ok");
diff --git a/chromium/chrome/browser/extensions/api/processes/processes_apitest.cc b/chromium/chrome/browser/extensions/api/processes/processes_apitest.cc
index aa3cdd9b7b1..e0a72c59a25 100644
--- a/chromium/chrome/browser/extensions/api/processes/processes_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/processes/processes_apitest.cc
@@ -11,6 +11,7 @@
#include "chrome/browser/ui/browser_dialogs.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/common/extensions/api/processes.h"
+#include "content/public/test/browser_test.h"
#include "extensions/common/switches.h"
#include "extensions/test/extension_test_message_listener.h"
diff --git a/chromium/chrome/browser/extensions/api/proxy/proxy_apitest.cc b/chromium/chrome/browser/extensions/api/proxy/proxy_apitest.cc
index 2d954803cb0..3d9052ef9d0 100644
--- a/chromium/chrome/browser/extensions/api/proxy/proxy_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/proxy/proxy_apitest.cc
@@ -12,6 +12,7 @@
#include "components/prefs/pref_service.h"
#include "components/proxy_config/proxy_config_dictionary.h"
#include "components/proxy_config/proxy_config_pref_names.h"
+#include "content/public/test/browser_test.h"
#include "extensions/browser/extension_system.h"
#include "extensions/browser/test_management_policy.h"
#include "extensions/common/extension.h"
@@ -334,9 +335,8 @@ IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest,
}
// Tests setting values also for incognito mode
-// Test disabled due to http://crbug.com/88972.
IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest,
- DISABLED_ProxyFixedIndividualIncognitoAlso) {
+ ProxyFixedIndividualIncognitoAlso) {
ASSERT_TRUE(RunExtensionTestIncognito("proxy/individual_incognito_also")) <<
message_;
const Extension* extension = GetSingleLoadedExtension();
diff --git a/chromium/chrome/browser/extensions/api/resources_private/resources_private_apitest.cc b/chromium/chrome/browser/extensions/api/resources_private/resources_private_apitest.cc
index bddf8cd1419..fa1229617db 100644
--- a/chromium/chrome/browser/extensions/api/resources_private/resources_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/resources_private/resources_private_apitest.cc
@@ -4,6 +4,7 @@
#include "base/macros.h"
#include "chrome/browser/extensions/extension_apitest.h"
+#include "content/public/test/browser_test.h"
using ResourcesPrivateApiTest = extensions::ExtensionApiTest;
diff --git a/chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc b/chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc
index dbafaf34b2c..0c7bcbf1188 100644
--- a/chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc
+++ b/chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc
@@ -56,7 +56,7 @@ const char kUpdateThrottled[] = "throttled";
const char kUpdateNotFound[] = "no_update";
const char kUpdateFound[] = "update_available";
-// If an extension reloads itself within this many miliseconds of reloading
+// If an extension reloads itself within this many milliseconds of reloading
// itself, the reload is considered suspiciously fast.
const int kFastReloadTime = 10000;
@@ -64,13 +64,6 @@ const int kFastReloadTime = 10000;
// extensions for ease of testing.
const int kUnpackedFastReloadTime = 1000;
-// After this many suspiciously fast consecutive reloads, an extension will get
-// disabled.
-const int kFastReloadCount = 5;
-
-// Same as above, but we increase the fast reload count for unpacked extensions.
-const int kUnpackedFastReloadCount = 30;
-
// A holder class for the policy we use for exponential backoff of update check
// requests.
class BackoffPolicy {
@@ -184,14 +177,14 @@ void ChromeRuntimeAPIDelegate::ReloadExtension(
extensions::ExtensionRegistry::Get(browser_context_)
->GetInstalledExtension(extension_id);
int fast_reload_time = kFastReloadTime;
- int fast_reload_count = kFastReloadCount;
+ int fast_reload_count = extensions::RuntimeAPI::kFastReloadCount;
// If an extension is unpacked, we allow for a faster reload interval
// and more fast reload attempts before terminating the extension.
// This is intended to facilitate extension testing for developers.
if (extensions::Manifest::IsUnpackedLocation(extension->location())) {
fast_reload_time = kUnpackedFastReloadTime;
- fast_reload_count = kUnpackedFastReloadCount;
+ fast_reload_count = extensions::RuntimeAPI::kUnpackedFastReloadCount;
}
std::pair<base::TimeTicks, int>& reload_info =
diff --git a/chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate_unittest.cc b/chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate_unittest.cc
index b63180157fd..a8d41b78f10 100644
--- a/chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate_unittest.cc
@@ -124,16 +124,16 @@ class DownloaderTestDelegate : public ExtensionDownloaderTestDelegate {
}
auto update = updates_.find(id);
if (update != updates_.end()) {
- CRXFileInfo info(id, update->second.path, "" /* no hash */,
- GetTestVerifierFormat());
- std::string version = update->second.version;
+ CRXFileInfo crx_info(update->second.path, GetTestVerifierFormat());
+ crx_info.expected_version = update->second.version;
+ crx_info.extension_id = id;
updates_.erase(update);
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
base::BindOnce(
&ExtensionDownloaderDelegate::OnExtensionDownloadFinished,
- base::Unretained(delegate), info,
- false /* file_ownership_passed */, GURL(), version,
+ base::Unretained(delegate), crx_info,
+ false /* file_ownership_passed */, GURL(),
ExtensionDownloaderDelegate::PingResult(),
fetch_data->request_ids(),
ExtensionDownloaderDelegate::InstallCallback()));
diff --git a/chromium/chrome/browser/extensions/api/runtime/runtime_apitest.cc b/chromium/chrome/browser/extensions/api/runtime/runtime_apitest.cc
index 435d626abce..cc685c5521e 100644
--- a/chromium/chrome/browser/extensions/api/runtime/runtime_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/runtime/runtime_apitest.cc
@@ -8,6 +8,7 @@
#include "chrome/browser/extensions/extension_function_test_utils.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "extensions/browser/api/runtime/runtime_api.h"
#include "extensions/browser/blacklist_state.h"
@@ -15,6 +16,7 @@
#include "extensions/browser/extension_prefs.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/test_extension_registry_observer.h"
+#include "extensions/test/extension_test_message_listener.h"
#include "extensions/test/result_catcher.h"
#include "extensions/test/test_extension_dir.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
@@ -145,34 +147,39 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest,
<< message_;
}
-// Tests chrome.runtime.reload
-// This test is flaky: crbug.com/366181
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DISABLED_ChromeRuntimeReload) {
+// Tests that an extension calling chrome.runtime.reload() repeatedly
+// will eventually be terminated.
+IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ExtensionTerminatedForRapidReloads) {
ExtensionRegistry* registry = ExtensionRegistry::Get(profile());
- const char kManifest[] =
- "{"
- " \"name\": \"reload\","
- " \"version\": \"1.0\","
- " \"background\": {"
- " \"scripts\": [\"background.js\"]"
- " },"
- " \"manifest_version\": 2"
- "}";
+ static constexpr char kManifest[] = R"(
+ {
+ "name": "reload",
+ "version": "1.0",
+ "background": {
+ "scripts": ["background.js"]
+ },
+ "manifest_version": 2
+ })";
TestExtensionDir dir;
dir.WriteManifest(kManifest);
- dir.WriteFile(FILE_PATH_LITERAL("background.js"), "console.log('loaded');");
+ dir.WriteFile(FILE_PATH_LITERAL("background.js"),
+ "chrome.test.sendMessage('ready');");
- const Extension* extension = LoadExtension(dir.UnpackedPath());
+ // Use a packed extension, since this is the scenario we are interested in
+ // testing. Unpacked extensions are allowed more reloads within the allotted
+ // time, to avoid interfering with the developer work flow.
+ const Extension* extension = LoadExtension(dir.Pack());
ASSERT_TRUE(extension);
const std::string extension_id = extension->id();
- // Somewhat arbitrary upper limit of 30 iterations. If the extension manages
- // to reload itself that often without being terminated, the test fails
+ // The current limit for fast reload is 5, so the loop limit of 10
+ // be enough to trigger termination. If the extension manages to
+ // reload itself that often without being terminated, the test fails
// anyway.
- for (int i = 0; i < 30; i++) {
+ for (int i = 0; i < RuntimeAPI::kFastReloadCount + 1; i++) {
+ ExtensionTestMessageListener ready_listener_reload("ready", false);
TestExtensionRegistryObserver unload_observer(registry, extension_id);
- TestExtensionRegistryObserver load_observer(registry, extension_id);
ASSERT_TRUE(ExecuteScriptInBackgroundPageNoWait(
extension_id, "chrome.runtime.reload();"));
unload_observer.WaitForExtensionUnloaded();
@@ -182,17 +189,57 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DISABLED_ChromeRuntimeReload) {
ExtensionRegistry::TERMINATED)) {
break;
} else {
- load_observer.WaitForExtensionLoaded();
- // We need to let other registry observers handle the notification to
- // finish initialization
- base::RunLoop().RunUntilIdle();
- WaitForExtensionViewsToLoad();
+ EXPECT_TRUE(ready_listener_reload.WaitUntilSatisfied());
}
}
ASSERT_TRUE(
registry->GetExtensionById(extension_id, ExtensionRegistry::TERMINATED));
}
+// Tests chrome.runtime.reload
+IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ChromeRuntimeReload) {
+ static constexpr char kManifest[] = R"(
+ {
+ "name": "reload",
+ "version": "1.0",
+ "background": {
+ "scripts": ["background.js"]
+ },
+ "manifest_version": 2
+ })";
+
+ static constexpr char kScript[] = R"(
+ chrome.test.sendMessage('ready', function(response) {
+ if (response == 'reload') {
+ chrome.runtime.reload();
+ } else if (response == 'done') {
+ chrome.test.notifyPass();
+ }
+ });
+ )";
+
+ TestExtensionDir dir;
+ dir.WriteManifest(kManifest);
+ dir.WriteFile(FILE_PATH_LITERAL("background.js"), kScript);
+
+ // This listener will respond to the initial load of the extension
+ // and tell the script to do the reload.
+ ExtensionTestMessageListener ready_listener_reload("ready", true);
+ const Extension* extension = LoadExtension(dir.UnpackedPath());
+ ASSERT_TRUE(extension);
+ const std::string extension_id = extension->id();
+ EXPECT_TRUE(ready_listener_reload.WaitUntilSatisfied());
+
+ // This listener will respond to the ready message from the
+ // reloaded extension and tell the script to finish the test.
+ ExtensionTestMessageListener ready_listener_done("ready", true);
+ ResultCatcher reload_catcher;
+ ready_listener_reload.Reply("reload");
+ EXPECT_TRUE(ready_listener_done.WaitUntilSatisfied());
+ ready_listener_done.Reply("done");
+ EXPECT_TRUE(reload_catcher.GetNextResult());
+}
+
// Tests that updating a terminated extension sends runtime.onInstalled event
// with correct previousVersion.
// Regression test for https://crbug.com/724563.
diff --git a/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc b/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
index 06b5e42aee5..e0dbf81759b 100644
--- a/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
+++ b/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
@@ -68,6 +68,54 @@ const char kChromeBrowserCloudManagementClientDescription[] =
"a machine-level user";
#endif
+void AddDlpVerdictToEvent(const safe_browsing::DlpDeepScanningVerdict& verdict,
+ base::Value* event) {
+ DCHECK(event);
+ base::ListValue triggered_rule_info;
+ for (const auto& rule : verdict.triggered_rules()) {
+ base::Value triggered_rule(base::Value::Type::DICTIONARY);
+ triggered_rule.SetIntKey(
+ extensions::SafeBrowsingPrivateEventRouter::kKeyTriggeredRuleId,
+ rule.rule_id());
+ triggered_rule.SetStringKey(
+ extensions::SafeBrowsingPrivateEventRouter::kKeyTriggeredRuleName,
+ rule.rule_name());
+ triggered_rule.SetStringKey(extensions::SafeBrowsingPrivateEventRouter::
+ kKeyTriggeredRuleResourceName,
+ rule.rule_resource_name());
+ triggered_rule.SetStringKey(
+ extensions::SafeBrowsingPrivateEventRouter::kKeyTriggeredRuleSeverity,
+ rule.rule_severity());
+ triggered_rule.SetIntKey(
+ extensions::SafeBrowsingPrivateEventRouter::kKeyTriggeredRuleAction,
+ rule.action());
+
+ base::ListValue matched_detectors;
+ for (const auto& detector : rule.matched_detectors()) {
+ base::Value matched_detector(base::Value::Type::DICTIONARY);
+ matched_detector.SetStringKey(
+ extensions::SafeBrowsingPrivateEventRouter::kKeyMatchedDetectorId,
+ detector.detector_id());
+ matched_detector.SetStringKey(
+ extensions::SafeBrowsingPrivateEventRouter::kKeyMatchedDetectorName,
+ detector.display_name());
+ matched_detector.SetStringKey(
+ extensions::SafeBrowsingPrivateEventRouter::kKeyMatchedDetectorType,
+ detector.detector_type());
+
+ matched_detectors.Append(std::move(matched_detector));
+ }
+ triggered_rule.SetKey(
+ extensions::SafeBrowsingPrivateEventRouter::kKeyMatchedDetectors,
+ std::move(matched_detectors));
+
+ triggered_rule_info.Append(std::move(triggered_rule));
+ }
+ event->SetKey(
+ extensions::SafeBrowsingPrivateEventRouter::kKeyTriggeredRuleInfo,
+ std::move(triggered_rule_info));
+}
+
} // namespace
namespace extensions {
@@ -445,36 +493,7 @@ void SafeBrowsingPrivateEventRouter::OnSensitiveDataEvent(
event.SetStringKey(kKeyTrigger, trigger);
event.SetBoolKey(kKeyClickedThrough, false);
- base::ListValue triggered_rule_info;
- for (const auto& rule : verdict.triggered_rules()) {
- base::Value triggered_rule(base::Value::Type::DICTIONARY);
- triggered_rule.SetIntKey(kKeyTriggeredRuleId, rule.rule_id());
- triggered_rule.SetStringKey(kKeyTriggeredRuleName,
- rule.rule_name());
- triggered_rule.SetStringKey(kKeyTriggeredRuleResourceName,
- rule.rule_resource_name());
- triggered_rule.SetStringKey(kKeyTriggeredRuleSeverity,
- rule.rule_severity());
- triggered_rule.SetIntKey(kKeyTriggeredRuleAction, rule.action());
-
- base::ListValue matched_detectors;
- for (const auto& detector : rule.matched_detectors()) {
- base::Value matched_detector(base::Value::Type::DICTIONARY);
- matched_detector.SetStringKey(kKeyMatchedDetectorId,
- detector.detector_id());
- matched_detector.SetStringKey(kKeyMatchedDetectorName,
- detector.display_name());
- matched_detector.SetStringKey(kKeyMatchedDetectorType,
- detector.detector_type());
-
- matched_detectors.Append(std::move(matched_detector));
- }
- triggered_rule.SetKey(kKeyMatchedDetectors,
- std::move(matched_detectors));
-
- triggered_rule_info.Append(std::move(triggered_rule));
- }
- event.SetKey(kKeyTriggeredRuleInfo, std::move(triggered_rule_info));
+ AddDlpVerdictToEvent(verdict, &event);
return event;
},
@@ -483,6 +502,7 @@ void SafeBrowsingPrivateEventRouter::OnSensitiveDataEvent(
}
void SafeBrowsingPrivateEventRouter::OnSensitiveDataWarningBypassed(
+ const safe_browsing::DlpDeepScanningVerdict& verdict,
const GURL& url,
const std::string& file_name,
const std::string& download_digest_sha256,
@@ -495,7 +515,8 @@ void SafeBrowsingPrivateEventRouter::OnSensitiveDataWarningBypassed(
ReportRealtimeEvent(
kKeySensitiveDataEvent,
base::BindOnce(
- [](const std::string& url, const std::string& file_name,
+ [](const safe_browsing::DlpDeepScanningVerdict& verdict,
+ const std::string& url, const std::string& file_name,
const std::string& download_digest_sha256,
const std::string& profile_user_name, const std::string& mime_type,
const std::string& trigger, const int64_t content_size) {
@@ -514,10 +535,13 @@ void SafeBrowsingPrivateEventRouter::OnSensitiveDataWarningBypassed(
event.SetIntKey(kKeyContentSize, content_size);
event.SetStringKey(kKeyTrigger, trigger);
event.SetBoolKey(kKeyClickedThrough, true);
+
+ AddDlpVerdictToEvent(verdict, &event);
+
return event;
},
- url.spec(), file_name, download_digest_sha256, GetProfileUserName(),
- mime_type, trigger, content_size));
+ verdict, url.spec(), file_name, download_digest_sha256,
+ GetProfileUserName(), mime_type, trigger, content_size));
}
void SafeBrowsingPrivateEventRouter::OnUnscannedFileEvent(
@@ -655,13 +679,11 @@ bool SafeBrowsingPrivateEventRouter::ShouldInitRealtimeReportingClient() {
void SafeBrowsingPrivateEventRouter::SetCloudPolicyClientForTesting(
policy::CloudPolicyClient* client) {
- DCHECK_EQ(nullptr, client_);
client_ = client;
}
void SafeBrowsingPrivateEventRouter::SetBinaryUploadServiceForTesting(
safe_browsing::BinaryUploadService* binary_upload_service) {
- DCHECK_EQ(nullptr, binary_upload_service_);
binary_upload_service_ = binary_upload_service;
}
@@ -765,11 +787,8 @@ void SafeBrowsingPrivateEventRouter::InitRealtimeReportingClientCallback(
device_management_service->ScheduleInitialization(0);
private_client_ = std::make_unique<policy::CloudPolicyClient>(
- /*machine_id=*/std::string(), /*machine_model=*/std::string(),
- /*brand_code=*/std::string(), /*ethernet_mac_address=*/std::string(),
- /*dock_mac_address=*/std::string(), /*manufacture_date=*/std::string(),
device_management_service, g_browser_process->shared_url_loader_factory(),
- nullptr, policy::CloudPolicyClient::DeviceDMTokenCallback());
+ policy::CloudPolicyClient::DeviceDMTokenCallback());
client = private_client_.get();
if (!client->is_registered()) {
diff --git a/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h b/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h
index 63b94a104e2..dc0ceea0b29 100644
--- a/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h
+++ b/chromium/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h
@@ -146,12 +146,14 @@ class SafeBrowsingPrivateEventRouter : public KeyedService {
const int64_t content_size);
// Notifies listeners that scanning for sensitive data detected a violation.
- void OnSensitiveDataWarningBypassed(const GURL& url,
- const std::string& file_name,
- const std::string& download_digest_sha256,
- const std::string& mime_type,
- const std::string& trigger,
- const int64_t content_size);
+ void OnSensitiveDataWarningBypassed(
+ const safe_browsing::DlpDeepScanningVerdict& verdict,
+ const GURL& url,
+ const std::string& file_name,
+ const std::string& download_digest_sha256,
+ const std::string& mime_type,
+ const std::string& trigger,
+ const int64_t content_size);
// Notifies listeners that deep scanning failed, for the given |reason|.
void OnUnscannedFileEvent(const GURL& url,
diff --git a/chromium/chrome/browser/extensions/api/sessions/sessions_apitest.cc b/chromium/chrome/browser/extensions/api/sessions/sessions_apitest.cc
index a32ab213704..36e74916715 100644
--- a/chromium/chrome/browser/extensions/api/sessions/sessions_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/sessions/sessions_apitest.cc
@@ -35,6 +35,7 @@
#include "components/sync/test/engine/mock_model_type_worker.h"
#include "components/sync_sessions/session_store.h"
#include "components/sync_sessions/session_sync_service.h"
+#include "content/public/test/browser_test.h"
#include "extensions/browser/api_test_utils.h"
#include "extensions/common/extension_builder.h"
diff --git a/chromium/chrome/browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc b/chromium/chrome/browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc
index 3fc49945ee2..61a4b946672 100644
--- a/chromium/chrome/browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc
+++ b/chromium/chrome/browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc
@@ -25,6 +25,7 @@
#include "components/search_engines/template_url_prepopulate_data.h"
#include "components/search_engines/template_url_service.h"
#include "components/version_info/version_info.h"
+#include "content/public/test/browser_test.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/mock_external_provider.h"
#include "extensions/browser/test_extension_registry_observer.h"
@@ -283,7 +284,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionsDisabledWithSettingsOverrideAPI,
test_data_dir_.AppendASCII("api_test/settings_overrides/homepage.crx"));
extension_service()->AddProviderForTesting(std::move(provider));
extension_service()->CheckForExternalUpdates();
- const Extension* extension = observer.WaitForExtensionLoaded();
+ scoped_refptr<const Extension> extension = observer.WaitForExtensionLoaded();
EXPECT_EQ(kExternalId, extension->id());
}
IN_PROC_BROWSER_TEST_F(ExtensionsDisabledWithSettingsOverrideAPI,
diff --git a/chromium/chrome/browser/extensions/api/settings_private/prefs_util.cc b/chromium/chrome/browser/extensions/api/settings_private/prefs_util.cc
index 99993cc1055..ea48a66ba88 100644
--- a/chromium/chrome/browser/extensions/api/settings_private/prefs_util.cc
+++ b/chromium/chrome/browser/extensions/api/settings_private/prefs_util.cc
@@ -24,7 +24,7 @@
#include "components/drive/drive_pref_names.h"
#include "components/embedder_support/pref_names.h"
#include "components/language/core/browser/pref_names.h"
-#include "components/omnibox/browser/omnibox_pref_names.h"
+#include "components/omnibox/browser/omnibox_prefs.h"
#include "components/password_manager/core/common/password_manager_pref_names.h"
#include "components/payments/core/payment_prefs.h"
#include "components/prefs/pref_service.h"
@@ -351,8 +351,10 @@ const PrefsUtil::TypedPrefMap& PrefsUtil::GetWhitelistedKeys() {
settings_api::PrefType::PREF_TYPE_STRING;
(*s_whitelist)[::prefs::kAccessibilityCaptionsBackgroundOpacity] =
settings_api::PrefType::PREF_TYPE_NUMBER;
+#if !defined(OS_ANDROID)
(*s_whitelist)[::prefs::kLiveCaptionEnabled] =
settings_api::PrefType::PREF_TYPE_BOOLEAN;
+#endif
#if defined(OS_CHROMEOS)
// Accounts / Users / People.
@@ -455,10 +457,6 @@ const PrefsUtil::TypedPrefMap& PrefsUtil::GetWhitelistedKeys() {
// Guest OS
(*s_whitelist)[crostini::prefs::kCrostiniEnabled] =
settings_api::PrefType::PREF_TYPE_BOOLEAN;
- (*s_whitelist)[crostini::prefs::kCrostiniMicSharing] =
- settings_api::PrefType::PREF_TYPE_BOOLEAN;
- (*s_whitelist)[crostini::prefs::kCrostiniMicSharingAtLastLaunch] =
- settings_api::PrefType::PREF_TYPE_BOOLEAN;
(*s_whitelist)[crostini::prefs::kCrostiniSharedUsbDevices] =
settings_api::PrefType::PREF_TYPE_LIST;
(*s_whitelist)[crostini::prefs::kCrostiniContainers] =
@@ -473,6 +471,8 @@ const PrefsUtil::TypedPrefMap& PrefsUtil::GetWhitelistedKeys() {
settings_api::PrefType::PREF_TYPE_BOOLEAN;
(*s_whitelist)[plugin_vm::prefs::kPluginVmPrintersAllowed] =
settings_api::PrefType::PREF_TYPE_BOOLEAN;
+ (*s_whitelist)[plugin_vm::prefs::kPluginVmCameraSharing] =
+ settings_api::PrefType::PREF_TYPE_BOOLEAN;
// Android Apps.
(*s_whitelist)[arc::prefs::kArcEnabled] =
@@ -481,8 +481,6 @@ const PrefsUtil::TypedPrefMap& PrefsUtil::GetWhitelistedKeys() {
// Ambient Mode.
(*s_whitelist)[ash::ambient::prefs::kAmbientModeEnabled] =
settings_api::PrefType::PREF_TYPE_BOOLEAN;
- (*s_whitelist)[ash::ambient::prefs::kAmbientModeTopicSource] =
- settings_api::PrefType::PREF_TYPE_NUMBER;
// Google Assistant.
(*s_whitelist)[chromeos::assistant::prefs::kAssistantConsentStatus] =
@@ -501,6 +499,8 @@ const PrefsUtil::TypedPrefMap& PrefsUtil::GetWhitelistedKeys() {
settings_api::PrefType::PREF_TYPE_BOOLEAN;
(*s_whitelist)[chromeos::assistant::prefs::kAssistantNotificationEnabled] =
settings_api::PrefType::PREF_TYPE_BOOLEAN;
+ (*s_whitelist)[chromeos::assistant::prefs::kAssistantQuickAnswersEnabled] =
+ settings_api::PrefType::PREF_TYPE_BOOLEAN;
// Misc.
(*s_whitelist)[::prefs::kUse24HourClock] =
@@ -629,11 +629,11 @@ const PrefsUtil::TypedPrefMap& PrefsUtil::GetWhitelistedKeys() {
settings_api::PrefType::PREF_TYPE_NUMBER;
(*s_whitelist)[::prefs::kLanguageSendFunctionKeys] =
settings_api::PrefType::PREF_TYPE_BOOLEAN;
- (*s_whitelist)[::prefs::kLanguageXkbAutoRepeatEnabled] =
+ (*s_whitelist)[::ash::prefs::kXkbAutoRepeatEnabled] =
settings_api::PrefType::PREF_TYPE_BOOLEAN;
- (*s_whitelist)[::prefs::kLanguageXkbAutoRepeatDelay] =
+ (*s_whitelist)[::ash::prefs::kXkbAutoRepeatDelay] =
settings_api::PrefType::PREF_TYPE_NUMBER;
- (*s_whitelist)[::prefs::kLanguageXkbAutoRepeatInterval] =
+ (*s_whitelist)[::ash::prefs::kXkbAutoRepeatInterval] =
settings_api::PrefType::PREF_TYPE_NUMBER;
(*s_whitelist)[chromeos::kDeviceDisplayResolution] =
settings_api::PrefType::PREF_TYPE_DICTIONARY;
diff --git a/chromium/chrome/browser/extensions/api/settings_private/settings_private_apitest.cc b/chromium/chrome/browser/extensions/api/settings_private/settings_private_apitest.cc
index 5eda7d995da..bca4048309d 100644
--- a/chromium/chrome/browser/extensions/api/settings_private/settings_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/settings_private/settings_private_apitest.cc
@@ -22,6 +22,7 @@
#include "components/policy/core/common/policy_map.h"
#include "components/policy/policy_constants.h"
#include "components/prefs/pref_service.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_utils.h"
#include "extensions/common/switches.h"
#include "testing/gmock/include/gmock/gmock.h"
diff --git a/chromium/chrome/browser/extensions/api/socket/socket_apitest.cc b/chromium/chrome/browser/extensions/api/socket/socket_apitest.cc
index ee35b81809e..e487ddd2f7e 100644
--- a/chromium/chrome/browser/extensions/api/socket/socket_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/socket/socket_apitest.cc
@@ -9,6 +9,7 @@
#include "chrome/browser/ui/browser.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/test/base/in_process_browser_test.h"
+#include "content/public/test/browser_test.h"
#include "extensions/browser/api/socket/socket_api.h"
#include "extensions/test/extension_test_message_listener.h"
#include "extensions/test/result_catcher.h"
diff --git a/chromium/chrome/browser/extensions/api/storage/managed_value_store_cache.cc b/chromium/chrome/browser/extensions/api/storage/managed_value_store_cache.cc
index c6b4d057806..beb1efb4780 100644
--- a/chromium/chrome/browser/extensions/api/storage/managed_value_store_cache.cc
+++ b/chromium/chrome/browser/extensions/api/storage/managed_value_store_cache.cc
@@ -9,8 +9,8 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/callback.h"
+#include "base/check_op.h"
#include "base/files/file_util.h"
-#include "base/logging.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/one_shot_event.h"
diff --git a/chromium/chrome/browser/extensions/api/storage/settings_apitest.cc b/chromium/chrome/browser/extensions/api/storage/settings_apitest.cc
index a855a24aea5..7ab45ab303f 100644
--- a/chromium/chrome/browser/extensions/api/storage/settings_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/storage/settings_apitest.cc
@@ -32,6 +32,7 @@
#include "components/sync/model/sync_error_factory.h"
#include "components/sync/model/sync_error_factory_mock.h"
#include "components/sync/model/syncable_service.h"
+#include "content/public/test/browser_test.h"
#include "extensions/browser/api/storage/backend_task_runner.h"
#include "extensions/browser/api/storage/settings_namespace.h"
#include "extensions/browser/api/storage/storage_frontend.h"
@@ -129,8 +130,7 @@ class ExtensionSettingsApiTest : public ExtensionApiTest {
std::make_unique<syncer::SyncChangeProcessorWrapperForTest>(
sync_processor),
std::make_unique<syncer::SyncErrorFactoryMock>())
- .error()
- .IsSet());
+ .has_value());
}
void InitSync(syncer::SyncChangeProcessor* sync_processor) {
@@ -156,8 +156,8 @@ class ExtensionSettingsApiTest : public ExtensionApiTest {
base::WeakPtr<syncer::SyncableService> syncable_service =
std::move(syncable_service_provider).Run();
DCHECK(syncable_service.get());
- EXPECT_FALSE(
- syncable_service->ProcessSyncChanges(FROM_HERE, change_list).IsSet());
+ EXPECT_FALSE(syncable_service->ProcessSyncChanges(FROM_HERE, change_list)
+ .has_value());
}
void SendChanges(const syncer::SyncChangeList& change_list) {
diff --git a/chromium/chrome/browser/extensions/api/storage/settings_sync_processor.cc b/chromium/chrome/browser/extensions/api/storage/settings_sync_processor.cc
index e9566c95fd5..0041ce38676 100644
--- a/chromium/chrome/browser/extensions/api/storage/settings_sync_processor.cc
+++ b/chromium/chrome/browser/extensions/api/storage/settings_sync_processor.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/extensions/api/storage/settings_sync_processor.h"
#include "chrome/browser/extensions/api/storage/settings_sync_util.h"
+#include "components/sync/model/model_error.h"
#include "components/sync/model/sync_change_processor.h"
#include "components/sync/model/sync_data.h"
#include "components/sync/protocol/extension_setting_specifics.pb.h"
@@ -40,7 +41,7 @@ void SettingsSyncProcessor::Init(const base::DictionaryValue& initial_state) {
initialized_ = true;
}
-syncer::SyncError SettingsSyncProcessor::SendChanges(
+base::Optional<syncer::ModelError> SettingsSyncProcessor::SendChanges(
const ValueStoreChangeList& changes) {
DCHECK(IsOnBackendSequence());
CHECK(initialized_) << "Init not called";
@@ -76,11 +77,11 @@ syncer::SyncError SettingsSyncProcessor::SendChanges(
}
if (sync_changes.empty())
- return syncer::SyncError();
+ return base::nullopt;
- syncer::SyncError error =
+ base::Optional<syncer::ModelError> error =
sync_processor_->ProcessSyncChanges(FROM_HERE, sync_changes);
- if (error.IsSet())
+ if (error.has_value())
return error;
synced_keys_.insert(added_keys.begin(), added_keys.end());
@@ -88,7 +89,7 @@ syncer::SyncError SettingsSyncProcessor::SendChanges(
synced_keys_.erase(*i);
}
- return syncer::SyncError();
+ return base::nullopt;
}
void SettingsSyncProcessor::NotifyChanges(const ValueStoreChangeList& changes) {
diff --git a/chromium/chrome/browser/extensions/api/storage/settings_sync_processor.h b/chromium/chrome/browser/extensions/api/storage/settings_sync_processor.h
index bec11ef1267..24555539171 100644
--- a/chromium/chrome/browser/extensions/api/storage/settings_sync_processor.h
+++ b/chromium/chrome/browser/extensions/api/storage/settings_sync_processor.h
@@ -9,10 +9,11 @@
#include <string>
#include "base/macros.h"
-#include "components/sync/model/sync_error.h"
+#include "components/sync/base/model_type.h"
#include "extensions/browser/value_store/value_store_change.h"
namespace syncer {
+class ModelError;
class SyncChangeProcessor;
} // namespace syncer
@@ -35,7 +36,8 @@ class SettingsSyncProcessor {
void Init(const base::DictionaryValue& initial_state);
// Sends |changes| to sync.
- syncer::SyncError SendChanges(const ValueStoreChangeList& changes);
+ base::Optional<syncer::ModelError> SendChanges(
+ const ValueStoreChangeList& changes);
// Informs this that |changes| have been receieved from sync. No action will
// be taken, but this must be notified for internal bookkeeping.
diff --git a/chromium/chrome/browser/extensions/api/storage/settings_sync_unittest.cc b/chromium/chrome/browser/extensions/api/storage/settings_sync_unittest.cc
index 1a1c21ede6e..3e86de2f4e4 100644
--- a/chromium/chrome/browser/extensions/api/storage/settings_sync_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/storage/settings_sync_unittest.cc
@@ -104,20 +104,17 @@ class MockSyncChangeProcessor : public syncer::SyncChangeProcessor {
MockSyncChangeProcessor() : fail_all_requests_(false) {}
// syncer::SyncChangeProcessor implementation.
- syncer::SyncError ProcessSyncChanges(
+ base::Optional<syncer::ModelError> ProcessSyncChanges(
const base::Location& from_here,
const syncer::SyncChangeList& change_list) override {
if (fail_all_requests_) {
- return syncer::SyncError(
- FROM_HERE,
- syncer::SyncError::DATATYPE_ERROR,
- "MockSyncChangeProcessor: configured to fail",
- change_list[0].sync_data().GetDataType());
+ return syncer::ModelError(FROM_HERE,
+ "MockSyncChangeProcessor: configured to fail");
}
for (auto it = change_list.cbegin(); it != change_list.cend(); ++it) {
changes_.push_back(std::make_unique<SettingSyncData>(*it));
}
- return syncer::SyncError();
+ return base::nullopt;
}
syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override {
@@ -1458,15 +1455,7 @@ static void UnlimitedLocalStorageTestCallback(ValueStore* local_storage) {
} // namespace
-#if defined(OS_WIN)
-// See: http://crbug.com/227296
-#define MAYBE_UnlimitedStorageForLocalButNotSync \
- DISABLED_UnlimitedStorageForLocalButNotSync
-#else
-#define MAYBE_UnlimitedStorageForLocalButNotSync \
- UnlimitedStorageForLocalButNotSync
-#endif
-TEST_F(ExtensionSettingsSyncTest, MAYBE_UnlimitedStorageForLocalButNotSync) {
+TEST_F(ExtensionSettingsSyncTest, UnlimitedStorageForLocalButNotSync) {
const std::string id = "ext";
std::set<std::string> permissions;
permissions.insert("unlimitedStorage");
diff --git a/chromium/chrome/browser/extensions/api/storage/sync_storage_backend.cc b/chromium/chrome/browser/extensions/api/storage/sync_storage_backend.cc
index d25a5140f04..b5c1d066754 100644
--- a/chromium/chrome/browser/extensions/api/storage/sync_storage_backend.cc
+++ b/chromium/chrome/browser/extensions/api/storage/sync_storage_backend.cc
@@ -96,9 +96,10 @@ SyncableSettingsStorage* SyncStorageBackend::GetOrCreateStorageWithSyncData(
storage_objs_[extension_id] = std::move(syncable_storage);
if (sync_processor_.get()) {
- syncer::SyncError error = raw_syncable_storage->StartSyncing(
- std::move(sync_data), CreateSettingsSyncProcessor(extension_id));
- if (error.IsSet())
+ base::Optional<syncer::ModelError> error =
+ raw_syncable_storage->StartSyncing(
+ std::move(sync_data), CreateSettingsSyncProcessor(extension_id));
+ if (error.has_value())
raw_syncable_storage->StopSyncing();
}
return raw_syncable_storage;
@@ -170,7 +171,7 @@ syncer::SyncDataList SyncStorageBackend::GetAllSyncDataForTesting(
return all_sync_data;
}
-syncer::SyncMergeResult SyncStorageBackend::MergeDataAndStartSyncing(
+base::Optional<syncer::ModelError> SyncStorageBackend::MergeDataAndStartSyncing(
syncer::ModelType type,
const syncer::SyncDataList& initial_sync_data,
std::unique_ptr<syncer::SyncChangeProcessor> sync_processor,
@@ -208,7 +209,7 @@ syncer::SyncMergeResult SyncStorageBackend::MergeDataAndStartSyncing(
SyncableSettingsStorage* storage = storage_obj.second.get();
auto group = grouped_sync_data.find(extension_id);
- syncer::SyncError error;
+ base::Optional<syncer::ModelError> error;
if (group != grouped_sync_data.end()) {
error = storage->StartSyncing(base::WrapUnique(group->second),
CreateSettingsSyncProcessor(extension_id));
@@ -218,7 +219,7 @@ syncer::SyncMergeResult SyncStorageBackend::MergeDataAndStartSyncing(
CreateSettingsSyncProcessor(extension_id));
}
- if (error.IsSet())
+ if (error.has_value())
storage->StopSyncing();
}
@@ -229,10 +230,10 @@ syncer::SyncMergeResult SyncStorageBackend::MergeDataAndStartSyncing(
GetOrCreateStorageWithSyncData(group.first, base::WrapUnique(group.second));
}
- return syncer::SyncMergeResult(type);
+ return base::nullopt;
}
-syncer::SyncError SyncStorageBackend::ProcessSyncChanges(
+base::Optional<syncer::ModelError> SyncStorageBackend::ProcessSyncChanges(
const base::Location& from_here,
const syncer::SyncChangeList& sync_changes) {
DCHECK(IsOnBackendSequence());
@@ -255,13 +256,13 @@ syncer::SyncError SyncStorageBackend::ProcessSyncChanges(
for (const auto& group : grouped_sync_data) {
SyncableSettingsStorage* storage =
GetOrCreateStorageWithSyncData(group.first, EmptyDictionaryValue());
- syncer::SyncError error =
+ base::Optional<syncer::ModelError> error =
storage->ProcessSyncChanges(base::WrapUnique(group.second));
- if (error.IsSet())
+ if (error.has_value())
storage->StopSyncing();
}
- return syncer::SyncError();
+ return base::nullopt;
}
void SyncStorageBackend::StopSyncing(syncer::ModelType type) {
diff --git a/chromium/chrome/browser/extensions/api/storage/sync_storage_backend.h b/chromium/chrome/browser/extensions/api/storage/sync_storage_backend.h
index db9c01d4f48..165f545d36e 100644
--- a/chromium/chrome/browser/extensions/api/storage/sync_storage_backend.h
+++ b/chromium/chrome/browser/extensions/api/storage/sync_storage_backend.h
@@ -50,12 +50,12 @@ class SyncStorageBackend : public syncer::SyncableService {
// syncer::SyncableService implementation.
void WaitUntilReadyToSync(base::OnceClosure done) override;
syncer::SyncDataList GetAllSyncDataForTesting(syncer::ModelType type) const;
- syncer::SyncMergeResult MergeDataAndStartSyncing(
+ base::Optional<syncer::ModelError> MergeDataAndStartSyncing(
syncer::ModelType type,
const syncer::SyncDataList& initial_sync_data,
std::unique_ptr<syncer::SyncChangeProcessor> sync_processor,
std::unique_ptr<syncer::SyncErrorFactory> sync_error_factory) override;
- syncer::SyncError ProcessSyncChanges(
+ base::Optional<syncer::ModelError> ProcessSyncChanges(
const base::Location& from_here,
const syncer::SyncChangeList& change_list) override;
void StopSyncing(syncer::ModelType type) override;
diff --git a/chromium/chrome/browser/extensions/api/storage/syncable_settings_storage.cc b/chromium/chrome/browser/extensions/api/storage/syncable_settings_storage.cc
index 28d68f7dced..f1bf5bd4ee3 100644
--- a/chromium/chrome/browser/extensions/api/storage/syncable_settings_storage.cc
+++ b/chromium/chrome/browser/extensions/api/storage/syncable_settings_storage.cc
@@ -9,7 +9,9 @@
#include "base/strings/stringprintf.h"
#include "chrome/browser/extensions/api/storage/settings_sync_processor.h"
#include "chrome/browser/extensions/api/storage/settings_sync_util.h"
+#include "components/sync/model/model_error.h"
#include "components/sync/model/sync_data.h"
+#include "components/sync/model/sync_error.h"
#include "components/sync/protocol/extension_setting_specifics.pb.h"
#include "extensions/browser/api/storage/backend_task_runner.h"
#include "extensions/browser/api/storage/settings_namespace.h"
@@ -136,8 +138,9 @@ void SyncableSettingsStorage::SyncResultIfEnabled(
return;
if (sync_processor_.get()) {
- syncer::SyncError error = sync_processor_->SendChanges(result.changes());
- if (error.IsSet())
+ base::Optional<syncer::ModelError> error =
+ sync_processor_->SendChanges(result.changes());
+ if (error.has_value())
StopSyncing();
} else {
// Tell sync to try and start soon, because syncable changes to sync_type_
@@ -149,7 +152,7 @@ void SyncableSettingsStorage::SyncResultIfEnabled(
// Sync-related methods.
-syncer::SyncError SyncableSettingsStorage::StartSyncing(
+base::Optional<syncer::ModelError> SyncableSettingsStorage::StartSyncing(
std::unique_ptr<base::DictionaryValue> sync_state,
std::unique_ptr<SettingsSyncProcessor> sync_processor) {
DCHECK(IsOnBackendSequence());
@@ -161,11 +164,9 @@ syncer::SyncError SyncableSettingsStorage::StartSyncing(
ReadResult maybe_settings = delegate_->Get();
if (!maybe_settings.status().ok()) {
- return syncer::SyncError(
- FROM_HERE, syncer::SyncError::DATATYPE_ERROR,
- base::StringPrintf("Failed to get settings: %s",
- maybe_settings.status().message.c_str()),
- sync_processor_->type());
+ return syncer::ModelError(
+ FROM_HERE, base::StringPrintf("Failed to get settings: %s",
+ maybe_settings.status().message.c_str()));
}
std::unique_ptr<base::DictionaryValue> current_settings =
@@ -176,12 +177,13 @@ syncer::SyncError SyncableSettingsStorage::StartSyncing(
std::move(current_settings));
}
-syncer::SyncError SyncableSettingsStorage::SendLocalSettingsToSync(
+base::Optional<syncer::ModelError>
+SyncableSettingsStorage::SendLocalSettingsToSync(
std::unique_ptr<base::DictionaryValue> local_state) {
DCHECK(IsOnBackendSequence());
if (local_state->empty())
- return syncer::SyncError();
+ return base::nullopt;
// Transform the current settings into a list of sync changes.
ValueStoreChangeList changes;
@@ -194,13 +196,15 @@ syncer::SyncError SyncableSettingsStorage::SendLocalSettingsToSync(
changes.push_back(ValueStoreChange(key, base::nullopt, std::move(*value)));
}
- syncer::SyncError error = sync_processor_->SendChanges(changes);
- if (error.IsSet())
+ base::Optional<syncer::ModelError> error =
+ sync_processor_->SendChanges(changes);
+ if (error.has_value())
StopSyncing();
return error;
}
-syncer::SyncError SyncableSettingsStorage::OverwriteLocalSettingsWithSync(
+base::Optional<syncer::ModelError>
+SyncableSettingsStorage::OverwriteLocalSettingsWithSync(
std::unique_ptr<base::DictionaryValue> sync_state,
std::unique_ptr<base::DictionaryValue> local_state) {
DCHECK(IsOnBackendSequence());
@@ -240,7 +244,7 @@ syncer::SyncError SyncableSettingsStorage::OverwriteLocalSettingsWithSync(
}
if (changes->empty())
- return syncer::SyncError();
+ return base::nullopt;
return ProcessSyncChanges(std::move(changes));
}
@@ -249,17 +253,14 @@ void SyncableSettingsStorage::StopSyncing() {
sync_processor_.reset();
}
-syncer::SyncError SyncableSettingsStorage::ProcessSyncChanges(
+base::Optional<syncer::ModelError> SyncableSettingsStorage::ProcessSyncChanges(
std::unique_ptr<SettingSyncDataList> sync_changes) {
DCHECK(IsOnBackendSequence());
DCHECK(!sync_changes->empty()) << "No sync changes for " << extension_id_;
if (!sync_processor_.get()) {
- return syncer::SyncError(
- FROM_HERE,
- syncer::SyncError::DATATYPE_ERROR,
- std::string("Sync is inactive for ") + extension_id_,
- syncer::UNSPECIFIED);
+ return syncer::ModelError(
+ FROM_HERE, std::string("Sync is inactive for ") + extension_id_);
}
std::vector<syncer::SyncError> errors;
@@ -339,7 +340,9 @@ syncer::SyncError SyncableSettingsStorage::ProcessSyncChanges(
ValueStoreChange::ToJson(changes));
// TODO(kalman): Something sensible with multiple errors.
- return errors.empty() ? syncer::SyncError() : errors[0];
+ if (errors.empty())
+ return base::nullopt;
+ return syncer::ConvertToModelError(errors[0]);
}
syncer::SyncError SyncableSettingsStorage::OnSyncAdd(
diff --git a/chromium/chrome/browser/extensions/api/storage/syncable_settings_storage.h b/chromium/chrome/browser/extensions/api/storage/syncable_settings_storage.h
index eaf02b696b4..2efda906dc3 100644
--- a/chromium/chrome/browser/extensions/api/storage/syncable_settings_storage.h
+++ b/chromium/chrome/browser/extensions/api/storage/syncable_settings_storage.h
@@ -21,6 +21,11 @@
#include "extensions/browser/api/storage/settings_observer.h"
#include "extensions/browser/value_store/value_store.h"
+namespace syncer {
+class SyncError;
+class ModelError;
+} // namespace syncer
+
namespace extensions {
class SettingsSyncProcessor;
@@ -61,8 +66,8 @@ class SyncableSettingsStorage : public ValueStore {
// already active.
// |sync_state| is the current state of the extension settings in sync.
// |sync_processor| is used to write out any changes.
- // Returns any error when trying to sync, or an empty error on success.
- syncer::SyncError StartSyncing(
+ // Returns any error when trying to sync, or base::nullopt on success.
+ base::Optional<syncer::ModelError> StartSyncing(
std::unique_ptr<base::DictionaryValue> sync_state,
std::unique_ptr<SettingsSyncProcessor> sync_processor);
@@ -71,8 +76,8 @@ class SyncableSettingsStorage : public ValueStore {
// Pushes a list of sync changes into this storage area. May be called at any
// time, changes will be ignored if sync isn't active.
- // Returns any error when trying to sync, or an empty error on success.
- syncer::SyncError ProcessSyncChanges(
+ // Returns any error when trying to sync, or base::nullopt on success.
+ base::Optional<syncer::ModelError> ProcessSyncChanges(
std::unique_ptr<SettingSyncDataList> sync_changes);
private:
@@ -86,13 +91,13 @@ class SyncableSettingsStorage : public ValueStore {
// Sends all local settings to sync. This assumes that there are no settings
// in sync yet.
- // Returns any error when trying to sync, or an empty error on success.
- syncer::SyncError SendLocalSettingsToSync(
+ // Returns any error when trying to sync, or base::nullopt on success.
+ base::Optional<syncer::ModelError> SendLocalSettingsToSync(
std::unique_ptr<base::DictionaryValue> local_state);
// Overwrites local state with sync state.
- // Returns any error when trying to sync, or an empty error on success.
- syncer::SyncError OverwriteLocalSettingsWithSync(
+ // Returns any error when trying to sync, or base::nullopt on success.
+ base::Optional<syncer::ModelError> OverwriteLocalSettingsWithSync(
std::unique_ptr<base::DictionaryValue> sync_state,
std::unique_ptr<base::DictionaryValue> local_state);
diff --git a/chromium/chrome/browser/extensions/api/system_display/system_display_chromeos_apitest.cc b/chromium/chrome/browser/extensions/api/system_display/system_display_chromeos_apitest.cc
index caf5602fcb6..2e547419611 100644
--- a/chromium/chrome/browser/extensions/api/system_display/system_display_chromeos_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/system_display/system_display_chromeos_apitest.cc
@@ -6,6 +6,7 @@
#include "ash/public/cpp/tablet_mode.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "chrome/browser/extensions/system_display/display_info_provider_chromeos.h"
+#include "content/public/test/browser_test.h"
#include "extensions/browser/api/system_display/display_info_provider.h"
#include "extensions/test/extension_test_message_listener.h"
diff --git a/chromium/chrome/browser/extensions/api/system_indicator/system_indicator_api.cc b/chromium/chrome/browser/extensions/api/system_indicator/system_indicator_api.cc
index 14407bcd85c..576c14641c4 100644
--- a/chromium/chrome/browser/extensions/api/system_indicator/system_indicator_api.cc
+++ b/chromium/chrome/browser/extensions/api/system_indicator/system_indicator_api.cc
@@ -7,8 +7,8 @@
#include "base/no_destructor.h"
#include "chrome/browser/extensions/api/system_indicator/system_indicator_manager.h"
#include "chrome/browser/extensions/api/system_indicator/system_indicator_manager_factory.h"
-#include "chrome/browser/extensions/extension_action.h"
#include "chrome/common/extensions/api/system_indicator/system_indicator_handler.h"
+#include "extensions/browser/extension_action.h"
#include "ui/gfx/image/image.h"
#include "ui/gfx/image/image_skia.h"
diff --git a/chromium/chrome/browser/extensions/api/system_indicator/system_indicator_apitest.cc b/chromium/chrome/browser/extensions/api/system_indicator/system_indicator_apitest.cc
index ff92a14e3d8..f1c0e441425 100644
--- a/chromium/chrome/browser/extensions/api/system_indicator/system_indicator_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/system_indicator/system_indicator_apitest.cc
@@ -5,12 +5,13 @@
#include "build/build_config.h"
#include "chrome/browser/extensions/api/system_indicator/system_indicator_manager.h"
#include "chrome/browser/extensions/api/system_indicator/system_indicator_manager_factory.h"
-#include "chrome/browser/extensions/extension_action.h"
#include "chrome/browser/extensions/extension_action_manager.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "chrome/browser/extensions/lazy_background_page_test_util.h"
#include "chrome/browser/ui/browser.h"
#include "components/version_info/channel.h"
+#include "content/public/test/browser_test.h"
+#include "extensions/browser/extension_action.h"
#include "extensions/browser/process_manager.h"
#include "extensions/common/extension.h"
#include "extensions/common/features/feature_channel.h"
diff --git a/chromium/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc b/chromium/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc
index 37f7cf90fc3..694b2a1cb56 100644
--- a/chromium/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc
+++ b/chromium/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc
@@ -9,7 +9,6 @@
#include "base/memory/ptr_util.h"
#include "base/stl_util.h"
#include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/extensions/extension_action.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/status_icons/status_icon.h"
#include "chrome/browser/status_icons/status_icon_observer.h"
@@ -18,6 +17,7 @@
#include "chrome/common/extensions/api/system_indicator/system_indicator_handler.h"
#include "content/public/browser/web_contents.h"
#include "extensions/browser/event_router.h"
+#include "extensions/browser/extension_action.h"
#include "extensions/browser/extension_icon_image.h"
#include "extensions/common/extension.h"
#include "extensions/common/extension_icon_set.h"
diff --git a/chromium/chrome/browser/extensions/api/system_private/system_private_apitest.cc b/chromium/chrome/browser/extensions/api/system_private/system_private_apitest.cc
index c2f658bc796..cfbadf4b462 100644
--- a/chromium/chrome/browser/extensions/api/system_private/system_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/system_private/system_private_apitest.cc
@@ -9,6 +9,7 @@
#include "chrome/browser/ui/browser.h"
#include "chrome/common/pref_names.h"
#include "components/prefs/pref_service.h"
+#include "content/public/test/browser_test.h"
#if defined(OS_CHROMEOS)
#include "chromeos/dbus/dbus_thread_manager.h"
diff --git a/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc b/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc
index b43a43f1405..88cf04db3b2 100644
--- a/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc
@@ -23,6 +23,7 @@
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/common/content_features.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_utils.h"
#include "extensions/browser/extension_registry.h"
@@ -250,14 +251,8 @@ IN_PROC_BROWSER_TEST_F(TabCaptureApiPixelTest, MAYBE_OffscreenTabEvilTests) {
ASSERT_FALSE(profile()->HasOffTheRecordProfile());
}
-// http://crbug.com/177163
-#if defined(OS_WIN) && !defined(NDEBUG)
-#define MAYBE_GetUserMediaTest DISABLED_GetUserMediaTest
-#else
-#define MAYBE_GetUserMediaTest GetUserMediaTest
-#endif
// Tests that getUserMedia() is NOT a way to start tab capture.
-IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, MAYBE_GetUserMediaTest) {
+IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, GetUserMediaTest) {
ExtensionTestMessageListener listener("ready", true);
ASSERT_TRUE(RunExtensionSubtest("tab_capture", "get_user_media_test.html"))
@@ -281,7 +276,7 @@ IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, MAYBE_GetUserMediaTest) {
EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
}
-// http://crbug.com/177163, http://crbug.com/427730
+// http://crbug.com/427730
// Make sure tabCapture.capture only works if the tab has been granted
// permission via an extension icon click or the extension is whitelisted.
IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, DISABLED_ActiveTabPermission) {
@@ -326,12 +321,11 @@ IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, DISABLED_ActiveTabPermission) {
EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
}
-// Flaky: http://crbug.com/675851
// Tests that fullscreen transitions during a tab capture session dispatch
// events to the onStatusChange listener. The test loads a page that toggles
// fullscreen mode, using the Fullscreen Javascript API, in response to mouse
// clicks.
-IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, DISABLED_FullscreenEvents) {
+IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, FullscreenEvents) {
AddExtensionToCommandLineWhitelist();
ExtensionTestMessageListener capture_started("tab_capture_started", false);
@@ -355,7 +349,6 @@ IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, DISABLED_FullscreenEvents) {
EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
}
-// Times out on Win dbg bots: https://crbug.com/177163
// Flaky on MSan bots: https://crbug.com/294431
// But really, just flaky everywhere. http://crbug.com/294431#c33
// Make sure tabCapture API can be granted for Chrome:// pages.
@@ -383,42 +376,24 @@ IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, DISABLED_GrantForChromePages) {
EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
}
-// http://crbug.com/177163
-#if defined(OS_WIN) && !defined(NDEBUG)
-#define MAYBE_CaptureInSplitIncognitoMode DISABLED_CaptureInSplitIncognitoMode
-#else
-#define MAYBE_CaptureInSplitIncognitoMode CaptureInSplitIncognitoMode
-#endif
// Tests that a tab in incognito mode can be captured.
-IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, MAYBE_CaptureInSplitIncognitoMode) {
+IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, CaptureInSplitIncognitoMode) {
AddExtensionToCommandLineWhitelist();
ASSERT_TRUE(RunExtensionSubtest("tab_capture", "start_tab_capture.html",
kFlagEnableIncognito, kFlagUseIncognito))
<< message_;
}
-// http://crbug.com/177163
-#if defined(OS_WIN) && !defined(NDEBUG)
-#define MAYBE_Constraints DISABLED_Constraints
-#else
-#define MAYBE_Constraints Constraints
-#endif
// Tests that valid constraints allow tab capture to start, while invalid ones
// do not.
-IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, MAYBE_Constraints) {
+IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, Constraints) {
AddExtensionToCommandLineWhitelist();
ASSERT_TRUE(RunExtensionSubtest("tab_capture", "constraints.html"))
<< message_;
}
-// http://crbug.com/177163
-#if defined(OS_WIN) && !defined(NDEBUG)
-#define MAYBE_TabIndicator DISABLED_TabIndicator
-#else
-#define MAYBE_TabIndicator TabIndicator
-#endif
// Tests that the tab indicator (in the tab strip) is shown during tab capture.
-IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, MAYBE_TabIndicator) {
+IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, TabIndicator) {
content::WebContents* const contents =
browser()->tab_strip_model()->GetActiveWebContents();
ASSERT_THAT(chrome::GetTabAlertStatesForContents(contents),
diff --git a/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_performance_test_base.cc b/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_performance_test_base.cc
index 9e53b879ecc..ddaa067809d 100644
--- a/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_performance_test_base.cc
+++ b/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_performance_test_base.cc
@@ -101,7 +101,7 @@ void TabCapturePerformanceTestBase::LoadExtension(
extensions::ExtensionSystem::Get(browser()->profile())
->extension_service();
extensions::UnpackedInstaller::Create(extension_service)->Load(unpacked_dir);
- extension_ = registry_observer.WaitForExtensionReady();
+ extension_ = registry_observer.WaitForExtensionReady().get();
CHECK(extension_);
CHECK_EQ(kExtensionId, extension_->id());
}
diff --git a/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_performancetest.cc b/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_performancetest.cc
index ffde54ce493..04bbe284ad9 100644
--- a/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_performancetest.cc
+++ b/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_performancetest.cc
@@ -19,6 +19,7 @@
#include "chrome/test/base/test_switches.h"
#include "chrome/test/base/tracing.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "extensions/common/switches.h"
#include "extensions/test/extension_test_message_listener.h"
#include "testing/gtest/include/gtest/gtest.h"
diff --git a/chromium/chrome/browser/extensions/api/tabs/tabs_api.cc b/chromium/chrome/browser/extensions/api/tabs/tabs_api.cc
index 44268dd99c3..f4d183ab977 100644
--- a/chromium/chrome/browser/extensions/api/tabs/tabs_api.cc
+++ b/chromium/chrome/browser/extensions/api/tabs/tabs_api.cc
@@ -12,12 +12,13 @@
#include <vector>
#include "base/bind.h"
+#include "base/check_op.h"
#include "base/command_line.h"
#include "base/location.h"
-#include "base/logging.h"
#include "base/memory/ref_counted_memory.h"
#include "base/memory/scoped_refptr.h"
#include "base/metrics/histogram_macros.h"
+#include "base/notreached.h"
#include "base/single_thread_task_runner.h"
#include "base/stl_util.h"
#include "base/strings/pattern.h"
@@ -318,7 +319,7 @@ ExtensionFunction::ResponseAction WindowsGetFunction::Run() {
if (!windows_util::GetBrowserFromWindowID(this, params->window_id,
extractor.type_filters(), &browser,
&error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
ExtensionTabUtil::PopulateTabBehavior populate_tab_behavior =
@@ -341,7 +342,7 @@ ExtensionFunction::ResponseAction WindowsGetCurrentFunction::Run() {
if (!windows_util::GetBrowserFromWindowID(
this, extension_misc::kCurrentWindowId, extractor.type_filters(),
&browser, &error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
ExtensionTabUtil::PopulateTabBehavior populate_tab_behavior =
@@ -478,16 +479,13 @@ ExtensionFunction::ResponseAction WindowsCreateFunction::Run() {
// Second, resolve, validate and convert them to GURLs.
for (auto i = url_strings.begin(); i != url_strings.end(); ++i) {
- GURL url = ExtensionTabUtil::ResolvePossiblyRelativeURL(*i, extension());
- if (!url.is_valid())
- return RespondNow(Error(tabs_constants::kInvalidUrlError, *i));
- // Don't let the extension crash the browser or renderers.
- if (ExtensionTabUtil::IsKillURL(url))
- return RespondNow(Error(tabs_constants::kNoCrashBrowserError));
+ GURL url;
+ std::string error;
+ if (!ExtensionTabUtil::PrepareURLForNavigation(*i, extension(), &url,
+ &error)) {
+ return RespondNow(Error(std::move(error)));
+ }
urls.push_back(url);
-
- // Log if this navigation looks like it is to a devtools URL.
- ExtensionTabUtil::LogPossibleDevtoolsSchemeNavigation(url);
}
}
@@ -496,7 +494,7 @@ ExtensionFunction::ResponseAction WindowsCreateFunction::Run() {
bool open_incognito_window =
ShouldOpenIncognitoWindow(create_data, &urls, &error);
if (!error.empty())
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
Profile* calling_profile = Profile::FromBrowserContext(browser_context());
Profile* window_profile = open_incognito_window
@@ -511,7 +509,7 @@ ExtensionFunction::ResponseAction WindowsCreateFunction::Run() {
if (!GetTabById(*create_data->tab_id, calling_profile,
include_incognito_information(), &source_browser,
&source_tab_strip, nullptr, &tab_index, &error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
if (!source_browser->window()->IsTabStripEditable())
@@ -576,7 +574,8 @@ ExtensionFunction::ResponseAction WindowsCreateFunction::Run() {
if (extension_id.empty()) {
create_params.initial_bounds = window_bounds;
} else {
- create_params = Browser::CreateParams::CreateForApp(
+ // extension_id is only set for CREATE_TYPE_POPUP.
+ create_params = Browser::CreateParams::CreateForAppPopup(
web_app::GenerateApplicationNameFromAppId(extension_id),
false /* trusted_source */, window_bounds, window_profile,
user_gesture());
@@ -681,7 +680,7 @@ ExtensionFunction::ResponseAction WindowsUpdateFunction::Run() {
if (!windows_util::GetBrowserFromWindowID(
this, params->window_id, WindowController::GetAllWindowFilter(),
&browser, &error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
// Don't allow locked fullscreen operations on a window without the proper
@@ -809,7 +808,7 @@ ExtensionFunction::ResponseAction WindowsRemoveFunction::Run() {
if (!windows_util::GetBrowserFromWindowID(this, params->window_id,
WindowController::kNoWindowFilter,
&browser, &error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
if (platform_util::IsBrowserLockedFullscreen(browser) &&
@@ -844,7 +843,7 @@ ExtensionFunction::ResponseAction TabsGetSelectedFunction::Run() {
Browser* browser = NULL;
std::string error;
if (!GetBrowserFromWindowID(this, window_id, &browser, &error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
TabStripModel* tab_strip = browser->tab_strip_model();
WebContents* contents = tab_strip->GetActiveWebContents();
@@ -867,7 +866,7 @@ ExtensionFunction::ResponseAction TabsGetAllInWindowFunction::Run() {
Browser* browser = NULL;
std::string error;
if (!GetBrowserFromWindowID(this, window_id, &browser, &error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
return RespondNow(OneArgument(ExtensionTabUtil::CreateTabList(
browser, extension(), source_context_type())));
@@ -893,7 +892,7 @@ ExtensionFunction::ResponseAction TabsQueryFunction::Run() {
std::string error;
if (!url_patterns.Populate(url_pattern_strings, URLPattern::SCHEME_ALL,
true, &error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
}
@@ -1070,7 +1069,7 @@ ExtensionFunction::ResponseAction TabsCreateFunction::Run() {
std::unique_ptr<base::DictionaryValue> result(
ExtensionTabUtil::OpenTab(this, options, user_gesture(), &error));
if (!result)
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
// Return data about the newly created tab.
return RespondNow(has_callback() ? OneArgument(std::move(result))
@@ -1089,7 +1088,7 @@ ExtensionFunction::ResponseAction TabsDuplicateFunction::Run() {
std::string error;
if (!GetTabById(tab_id, browser_context(), include_incognito_information(),
&browser, &tab_strip, NULL, &tab_index, &error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
WebContents* new_contents = chrome::DuplicateTabAt(browser, tab_index);
@@ -1123,7 +1122,7 @@ ExtensionFunction::ResponseAction TabsGetFunction::Run() {
std::string error;
if (!GetTabById(tab_id, browser_context(), include_incognito_information(),
NULL, &tab_strip, &contents, &tab_index, &error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
return RespondNow(ArgumentList(tabs::Get::Results::Create(
@@ -1158,7 +1157,7 @@ ExtensionFunction::ResponseAction TabsHighlightFunction::Run() {
Browser* browser = NULL;
std::string error;
if (!GetBrowserFromWindowID(this, window_id, &browser, &error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
TabStripModel* tabstrip = browser->tab_strip_model();
ui::ListSelectionModel selection;
@@ -1170,14 +1169,14 @@ ExtensionFunction::ResponseAction TabsHighlightFunction::Run() {
for (size_t i = 0; i < tab_indices.size(); ++i) {
if (!HighlightTab(tabstrip, &selection, &active_index, tab_indices[i],
&error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
}
} else {
EXTENSION_FUNCTION_VALIDATE(params->highlight_info.tabs.as_integer);
if (!HighlightTab(tabstrip, &selection, &active_index,
*params->highlight_info.tabs.as_integer, &error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
}
@@ -1240,7 +1239,7 @@ ExtensionFunction::ResponseAction TabsUpdateFunction::Run() {
std::string error;
if (!GetTabById(tab_id, browser_context(), include_incognito_information(),
&browser, &tab_strip, &contents, &tab_index, &error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
if (!ExtensionTabUtil::BrowserSupportsTabs(browser))
@@ -1261,7 +1260,7 @@ ExtensionFunction::ResponseAction TabsUpdateFunction::Run() {
tabs_constants::kURLsNotAllowedInIncognitoError, updated_url)));
}
if (!UpdateURL(updated_url, tab_id, &error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
bool active = false;
@@ -1336,24 +1335,12 @@ ExtensionFunction::ResponseAction TabsUpdateFunction::Run() {
bool TabsUpdateFunction::UpdateURL(const std::string& url_string,
int tab_id,
std::string* error) {
- GURL url =
- ExtensionTabUtil::ResolvePossiblyRelativeURL(url_string, extension());
-
- if (!url.is_valid()) {
- *error = ErrorUtils::FormatErrorMessage(tabs_constants::kInvalidUrlError,
- url_string);
- return false;
- }
-
- // Don't let the extension crash the browser or renderers.
- if (ExtensionTabUtil::IsKillURL(url)) {
- *error = tabs_constants::kNoCrashBrowserError;
+ GURL url;
+ if (!ExtensionTabUtil::PrepareURLForNavigation(url_string, extension(), &url,
+ error)) {
return false;
}
- // Log if this navigation looks like it is to a devtools URL.
- ExtensionTabUtil::LogPossibleDevtoolsSchemeNavigation(url);
-
const bool is_javascript_scheme = url.SchemeIs(url::kJavaScriptScheme);
UMA_HISTOGRAM_BOOLEAN("Extensions.ApiTabUpdateJavascript",
is_javascript_scheme);
@@ -1378,6 +1365,10 @@ bool TabsUpdateFunction::UpdateURL(const std::string& url_string,
web_contents_->GetBrowserContext(),
load_params.initiator_origin->GetURL());
+ // Marking the navigation as initiated via an API means that the focus
+ // will stay in the omnibox - see https://crbug.com/1085779.
+ load_params.transition_type = ui::PAGE_TRANSITION_FROM_API;
+
web_contents_->GetController().LoadURLWithParams(load_params);
DCHECK_EQ(url,
@@ -1423,7 +1414,7 @@ ExtensionFunction::ResponseAction TabsMoveFunction::Run() {
for (size_t i = 0; i < tab_ids.size(); ++i) {
if (!MoveTab(tab_ids[i], &new_index, i, tab_values.get(), window_id,
&error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
}
} else {
@@ -1431,7 +1422,7 @@ ExtensionFunction::ResponseAction TabsMoveFunction::Run() {
num_tabs = 1;
if (!MoveTab(*params->tab_ids.as_integer, &new_index, 0, tab_values.get(),
window_id, &error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
}
@@ -1585,7 +1576,7 @@ ExtensionFunction::ResponseAction TabsReloadFunction::Run() {
std::string error;
if (!GetTabById(tab_id, browser_context(), include_incognito_information(),
&browser, NULL, &web_contents, NULL, &error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
}
@@ -1617,12 +1608,12 @@ ExtensionFunction::ResponseAction TabsRemoveFunction::Run() {
std::vector<int>& tab_ids = *params->tab_ids.as_integers;
for (size_t i = 0; i < tab_ids.size(); ++i) {
if (!RemoveTab(tab_ids[i], &error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
} else {
EXTENSION_FUNCTION_VALIDATE(params->tab_ids.as_integer);
if (!RemoveTab(*params->tab_ids.as_integer, &error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
return RespondNow(NoArguments());
}
@@ -1704,7 +1695,7 @@ ExtensionFunction::ResponseAction TabsCaptureVisibleTabFunction::Run() {
std::string error;
WebContents* contents = GetWebContentsForID(context_id, &error);
if (!contents)
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
const CaptureResult capture_result = CaptureAsync(
contents, image_details.get(),
@@ -1778,7 +1769,7 @@ ExtensionFunction::ResponseAction TabsDetectLanguageFunction::Run() {
tab_id = *params->tab_id;
if (!GetTabById(tab_id, browser_context(), include_incognito_information(),
&browser, nullptr, &contents, nullptr, &error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
// TODO(devlin): Can this happen? GetTabById() should return false if
// |browser| or |contents| is null.
@@ -2003,11 +1994,11 @@ ExtensionFunction::ResponseAction TabsSetZoomFunction::Run() {
WebContents* web_contents =
GetTabsAPIDefaultWebContents(this, tab_id, &error);
if (!web_contents)
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
GURL url(web_contents->GetVisibleURL());
if (extension()->permissions_data()->IsRestrictedUrl(url, &error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
ZoomController* zoom_controller =
ZoomController::FromWebContents(web_contents);
@@ -2035,7 +2026,7 @@ ExtensionFunction::ResponseAction TabsGetZoomFunction::Run() {
WebContents* web_contents =
GetTabsAPIDefaultWebContents(this, tab_id, &error);
if (!web_contents)
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
double zoom_level =
ZoomController::FromWebContents(web_contents)->GetZoomLevel();
@@ -2056,11 +2047,11 @@ ExtensionFunction::ResponseAction TabsSetZoomSettingsFunction::Run() {
WebContents* web_contents =
GetTabsAPIDefaultWebContents(this, tab_id, &error);
if (!web_contents)
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
GURL url(web_contents->GetVisibleURL());
if (extension()->permissions_data()->IsRestrictedUrl(url, &error))
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
// "per-origin" scope is only available in "automatic" mode.
if (params->zoom_settings.scope == tabs::ZOOM_SETTINGS_SCOPE_PER_ORIGIN &&
@@ -2106,7 +2097,7 @@ ExtensionFunction::ResponseAction TabsGetZoomSettingsFunction::Run() {
WebContents* web_contents =
GetTabsAPIDefaultWebContents(this, tab_id, &error);
if (!web_contents)
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
ZoomController* zoom_controller =
ZoomController::FromWebContents(web_contents);
@@ -2135,7 +2126,7 @@ ExtensionFunction::ResponseAction TabsDiscardFunction::Run() {
std::string error;
if (!GetTabById(tab_id, browser_context(), include_incognito_information(),
nullptr, nullptr, &contents, nullptr, &error)) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
}
// Discard the tab.
@@ -2170,7 +2161,7 @@ ExtensionFunction::ResponseAction TabsGoForwardFunction::Run() {
WebContents* web_contents =
GetTabsAPIDefaultWebContents(this, tab_id, &error);
if (!web_contents)
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
NavigationController& controller = web_contents->GetController();
if (!controller.CanGoForward())
@@ -2190,7 +2181,7 @@ ExtensionFunction::ResponseAction TabsGoBackFunction::Run() {
WebContents* web_contents =
GetTabsAPIDefaultWebContents(this, tab_id, &error);
if (!web_contents)
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
NavigationController& controller = web_contents->GetController();
if (!controller.CanGoBack())
diff --git a/chromium/chrome/browser/extensions/api/tabs/tabs_api_unittest.cc b/chromium/chrome/browser/extensions/api/tabs/tabs_api_unittest.cc
index ca2c1186813..f77cac7fe21 100644
--- a/chromium/chrome/browser/extensions/api/tabs/tabs_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/tabs/tabs_api_unittest.cc
@@ -338,6 +338,45 @@ TEST_F(TabsApiUnitTest, ExecuteScriptNoTabIsNonFatalError) {
EXPECT_EQ(tabs_constants::kNoTabInBrowserWindowError, error);
}
+// Tests that calling chrome.tabs.update updates the URL as expected.
+TEST_F(TabsApiUnitTest, TabsUpdate) {
+ scoped_refptr<const Extension> extension =
+ ExtensionBuilder("UpdateTest").Build();
+ const GURL kExampleCom("http://example.com");
+ const GURL kChromiumOrg("https://chromium.org");
+
+ // Add a web contents to the browser.
+ std::unique_ptr<content::WebContents> contents(
+ content::WebContentsTester::CreateTestWebContents(profile(), nullptr));
+ content::WebContents* raw_contents = contents.get();
+ browser()->tab_strip_model()->AppendWebContents(std::move(contents), true);
+ EXPECT_EQ(browser()->tab_strip_model()->GetActiveWebContents(), raw_contents);
+ CreateSessionServiceTabHelper(raw_contents);
+ int tab_id = sessions::SessionTabHelper::IdForTab(raw_contents).id();
+
+ // Navigate the browser to example.com
+ content::WebContentsTester* web_contents_tester =
+ content::WebContentsTester::For(raw_contents);
+ web_contents_tester->NavigateAndCommit(kExampleCom);
+ EXPECT_EQ(kExampleCom, raw_contents->GetLastCommittedURL());
+
+ // Use the TabsUpdateFunction to navigate to chromium.org
+ auto function = base::MakeRefCounted<TabsUpdateFunction>();
+ function->set_extension(extension);
+ static constexpr char kFormatArgs[] = R"([%d, {"url": "%s"}])";
+ const std::string args =
+ base::StringPrintf(kFormatArgs, tab_id, kChromiumOrg.spec().c_str());
+ ASSERT_TRUE(extension_function_test_utils::RunFunction(
+ function.get(), args, browser(), api_test_utils::NONE));
+ content::NavigationController& controller =
+ browser()->tab_strip_model()->GetActiveWebContents()->GetController();
+ content::RenderFrameHostTester::CommitPendingLoad(&controller);
+ EXPECT_EQ(kChromiumOrg, raw_contents->GetLastCommittedURL());
+
+ // Clean up.
+ browser()->tab_strip_model()->CloseAllTabs();
+}
+
// Tests that calling chrome.tabs.update with a JavaScript URL results
// in an error.
TEST_F(TabsApiUnitTest, TabsUpdateJavaScriptUrlNotAllowed) {
diff --git a/chromium/chrome/browser/extensions/api/tabs/tabs_interactive_test.cc b/chromium/chrome/browser/extensions/api/tabs/tabs_interactive_test.cc
index a4451241d59..3ee3dc3e966 100644
--- a/chromium/chrome/browser/extensions/api/tabs/tabs_interactive_test.cc
+++ b/chromium/chrome/browser/extensions/api/tabs/tabs_interactive_test.cc
@@ -13,6 +13,7 @@
#include "chrome/browser/ui/browser.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/interactive_test_utils.h"
+#include "content/public/test/browser_test.h"
#include "extensions/browser/api_test_utils.h"
#include "extensions/common/extension_builder.h"
diff --git a/chromium/chrome/browser/extensions/api/tabs/tabs_test.cc b/chromium/chrome/browser/extensions/api/tabs/tabs_test.cc
index 0e27b87db5c..7b1462b8080 100644
--- a/chromium/chrome/browser/extensions/api/tabs/tabs_test.cc
+++ b/chromium/chrome/browser/extensions/api/tabs/tabs_test.cc
@@ -48,6 +48,7 @@
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/storage_partition.h"
#include "content/public/common/url_constants.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
#include "extensions/browser/api_test_utils.h"
@@ -343,8 +344,13 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, GetAllWindows) {
CloseAppWindow(app_window);
}
-// Flaky. https://crbug.com/1035620
-IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DISABLED_GetAllWindowsAllTypes) {
+// Flaky on Windows. https://crbug.com/1035620
+#if defined(OS_WIN)
+#define MAYBE_GetAllWindowsAllTypes DISABLED_GetAllWindowsAllTypes
+#else
+#define MAYBE_GetAllWindowsAllTypes GetAllWindowsAllTypes
+#endif
+IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, MAYBE_GetAllWindowsAllTypes) {
const size_t NUM_WINDOWS = 5;
std::set<int> window_ids;
std::set<int> result_ids;
@@ -2282,7 +2288,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, WindowsCreate_OpenerAndOrigin) {
};
auto run_test_case = [&web_contents](const TestCase& test_case) {
- std::string maybe_specify_set_self_as_opener = "";
+ std::string maybe_specify_set_self_as_opener;
if (test_case.set_self_as_opener) {
maybe_specify_set_self_as_opener =
base::StringPrintf(", setSelfAsOpener: %s",
diff --git a/chromium/chrome/browser/extensions/api/tabs/tabs_util_chromeos.cc b/chromium/chrome/browser/extensions/api/tabs/tabs_util_chromeos.cc
index 9a4b1776deb..b02aff162a6 100644
--- a/chromium/chrome/browser/extensions/api/tabs/tabs_util_chromeos.cc
+++ b/chromium/chrome/browser/extensions/api/tabs/tabs_util_chromeos.cc
@@ -61,7 +61,7 @@ void SetLockedFullscreenState(Browser* browser, bool locked) {
}
if (assistant::IsAssistantAllowedForProfile(profile) ==
- ash::mojom::AssistantAllowedState::ALLOWED) {
+ chromeos::assistant::AssistantAllowedState::ALLOWED) {
ash::AssistantState::Get()->NotifyLockedFullScreenStateChanged(locked);
}
}
diff --git a/chromium/chrome/browser/extensions/api/terminal/crostini_startup_status.cc b/chromium/chrome/browser/extensions/api/terminal/crostini_startup_status.cc
index 56168cbd8ea..e7d31651cd9 100644
--- a/chromium/chrome/browser/extensions/api/terminal/crostini_startup_status.cc
+++ b/chromium/chrome/browser/extensions/api/terminal/crostini_startup_status.cc
@@ -9,14 +9,17 @@
#include "base/containers/flat_map.h"
#include "base/no_destructor.h"
+#include "base/strings/strcat.h"
#include "base/strings/stringprintf.h"
#include "base/system/sys_info.h"
#include "base/task/post_task.h"
#include "base/time/time.h"
+#include "chrome/grit/generated_resources.h"
#include "chromeos/dbus/util/version_loader.h"
#include "components/version_info/version_info.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
+#include "ui/base/l10n/l10n_util.h"
using crostini::mojom::InstallerState;
@@ -58,7 +61,10 @@ void CrostiniStartupStatus::OnCrostiniRestarted(
} else {
if (verbose_) {
stage_index_ = kMaxStage + 1; // done.
- PrintStage(kColor2GreenBright, "done\r\n");
+ PrintStage(kColor2GreenBright,
+ base::StrCat({l10n_util::GetStringUTF8(
+ IDS_CROSTINI_TERMINAL_STATUS_READY),
+ "\r\n"}));
}
}
Print(
@@ -90,20 +96,35 @@ void CrostiniStartupStatus::OnStageStarted(InstallerState stage) {
}
static base::NoDestructor<base::flat_map<InstallerState, std::string>>
kStartStrings({
- {InstallerState::kStart, "Initializing"},
+ {InstallerState::kStart,
+ l10n_util::GetStringUTF8(IDS_CROSTINI_TERMINAL_STATUS_START)},
{InstallerState::kInstallImageLoader,
- "Checking cros-termina component installed"},
- {InstallerState::kStartConcierge, "Starting VM controller"},
+ l10n_util::GetStringUTF8(
+ IDS_CROSTINI_TERMINAL_STATUS_INSTALL_IMAGE_LOADER)},
+ {InstallerState::kStartConcierge,
+ l10n_util::GetStringUTF8(
+ IDS_CROSTINI_TERMINAL_STATUS_START_CONCIERGE)},
{InstallerState::kCreateDiskImage,
- "Checking termina VM image installed"},
- {InstallerState::kStartTerminaVm, "Starting termina VM"},
+ l10n_util::GetStringUTF8(
+ IDS_CROSTINI_TERMINAL_STATUS_CREATE_DISK_IMAGE)},
+ {InstallerState::kStartTerminaVm,
+ l10n_util::GetStringUTF8(
+ IDS_CROSTINI_TERMINAL_STATUS_START_TERMINA_VM)},
{InstallerState::kCreateContainer,
- "Checking penguin container installed"},
- {InstallerState::kSetupContainer, "Checking penguin container setup"},
- {InstallerState::kStartContainer, "Starting penguin container"},
+ l10n_util::GetStringUTF8(
+ IDS_CROSTINI_TERMINAL_STATUS_CREATE_CONTAINER)},
+ {InstallerState::kSetupContainer,
+ l10n_util::GetStringUTF8(
+ IDS_CROSTINI_TERMINAL_STATUS_SETUP_CONTAINER)},
+ {InstallerState::kStartContainer,
+ l10n_util::GetStringUTF8(
+ IDS_CROSTINI_TERMINAL_STATUS_START_CONTAINER)},
{InstallerState::kFetchSshKeys,
- "Fetching penguin container ssh keys"},
- {InstallerState::kMountContainer, "Mounting penguin container sshfs"},
+ l10n_util::GetStringUTF8(
+ IDS_CROSTINI_TERMINAL_STATUS_FETCH_SSH_KEYS)},
+ {InstallerState::kMountContainer,
+ l10n_util::GetStringUTF8(
+ IDS_CROSTINI_TERMINAL_STATUS_MOUNT_CONTAINER)},
});
const std::string& stage_string = (*kStartStrings)[stage];
PrintStage(kColor3Yellow, stage_string);
diff --git a/chromium/chrome/browser/extensions/api/terminal/crostini_startup_status_unittest.cc b/chromium/chrome/browser/extensions/api/terminal/crostini_startup_status_unittest.cc
index c4307e82a6f..cefdff8fa24 100644
--- a/chromium/chrome/browser/extensions/api/terminal/crostini_startup_status_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/terminal/crostini_startup_status_unittest.cc
@@ -53,7 +53,7 @@ TEST_F(CrostiniStartupStatusTest, TestVerbose) {
startup_status->OnStageStarted(InstallerState::kInstallImageLoader);
startup_status->OnCrostiniRestarted(crostini::CrostiniResult::SUCCESS);
- EXPECT_EQ(output_.size(), 5u);
+ ASSERT_EQ(output_.size(), 5u);
// Hide cursor, init progress.
EXPECT_EQ(output_[0], "\x1b[?25l\x1b[35m[ ] ");
@@ -62,11 +62,11 @@ TEST_F(CrostiniStartupStatusTest, TestVerbose) {
// CR, purple, progress, forward 10, erase, yellow, stage.
EXPECT_EQ(output_[2],
- "\r\x1b[35m[=\x1b[10C\x1b[K\x1b[33mChecking cros-termina component "
- "installed ");
+ "\r\x1b[35m[=\x1b[10C\x1b[K\x1b[33mChecking the virtual machine ");
// CR, purple, progress, forward 2, erase, green, done, symbol, CRLF.
- EXPECT_EQ(output_[3], "\r\x1b[35m[=========\x1b[2C\x1b[K\x1b[1;32mdone\r\n ");
+ EXPECT_EQ(output_[3],
+ "\r\x1b[35m[=========\x1b[2C\x1b[K\x1b[1;32mReady\r\n ");
// CR, delete line, default color, show cursor;
EXPECT_EQ(output_[4], "\r\x1b[K\x1b[0m\x1b[?25h");
diff --git a/chromium/chrome/browser/extensions/api/terminal/terminal_extension_helper.cc b/chromium/chrome/browser/extensions/api/terminal/terminal_extension_helper.cc
index f0e324097d4..9d6965bbaa7 100644
--- a/chromium/chrome/browser/extensions/api/terminal/terminal_extension_helper.cc
+++ b/chromium/chrome/browser/extensions/api/terminal/terminal_extension_helper.cc
@@ -23,12 +23,10 @@ const char kCroshExtensionEntryPoint[] = "/html/crosh.html";
const Extension* TerminalExtensionHelper::GetTerminalExtension(
Profile* profile) {
- // Search order for terminal extensions.
- // We prefer nassh-dev, then nassh, then the builtin crosh extension.
+ // Search order for terminal extensions: nassh-dev, then nassh.
static const char* const kPossibleAppIds[] = {
extension_misc::kHTermDevAppId,
extension_misc::kHTermAppId,
- extension_misc::kCroshBuiltinAppId,
};
// The nassh-dev should be first in the list.
@@ -47,8 +45,10 @@ const Extension* TerminalExtensionHelper::GetTerminalExtension(
}
GURL TerminalExtensionHelper::GetCroshURL(Profile* profile) {
- GURL url;
+ // chrome-untrusted://crosh by default.
+ GURL url(chrome::kChromeUIUntrustedCroshURL);
const extensions::Extension* extension = GetTerminalExtension(profile);
+ // Allow nassh-dev or nassh to override.
if (extension) {
url = extension->GetResourceURL(kCroshExtensionEntryPoint);
}
diff --git a/chromium/chrome/browser/extensions/api/terminal/terminal_extension_helper.h b/chromium/chrome/browser/extensions/api/terminal/terminal_extension_helper.h
index 06c6d202f44..0824898a7fb 100644
--- a/chromium/chrome/browser/extensions/api/terminal/terminal_extension_helper.h
+++ b/chromium/chrome/browser/extensions/api/terminal/terminal_extension_helper.h
@@ -20,11 +20,10 @@ class TerminalExtensionHelper {
// Returns the crosh extension. It is the first found out of:
// 1. nassh-dev : okddffdblfhhnmhodogpojmfkjmhinfp
// 2. nassh : pnhechapfaindjhompbnflcldabbghjo
- // 3. crosh builtin: nkoccljplnhpfnfiajclkommnmllphnl
static const Extension* GetTerminalExtension(Profile* profile);
- // Returns crosh URL. TODO(crbug.com/1022250) Use chrome://terminal
- // when terminalPrivate is supported for webui to allow gzipped resources.
+ // Returns crosh URL. chrome-untrusted://crosh is used by default, but it can
+ // be overridden by nassh-dev or nassh.
static GURL GetCroshURL(Profile* profile);
};
diff --git a/chromium/chrome/browser/extensions/api/terminal/terminal_private_api.cc b/chromium/chrome/browser/extensions/api/terminal/terminal_private_api.cc
index 46d738f35ee..f17fccee02c 100644
--- a/chromium/chrome/browser/extensions/api/terminal/terminal_private_api.cc
+++ b/chromium/chrome/browser/extensions/api/terminal/terminal_private_api.cc
@@ -493,6 +493,24 @@ void TerminalPrivateAckOutputFunction::AckOutputOnRegistryTaskRunner(
chromeos::ProcessProxyRegistry::Get()->AckOutput(terminal_id);
}
+TerminalPrivateOpenWindowFunction::~TerminalPrivateOpenWindowFunction() =
+ default;
+
+ExtensionFunction::ResponseAction TerminalPrivateOpenWindowFunction::Run() {
+ crostini::LaunchTerminal(Profile::FromBrowserContext(browser_context()));
+ return RespondNow(NoArguments());
+}
+
+TerminalPrivateOpenOptionsPageFunction::
+ ~TerminalPrivateOpenOptionsPageFunction() = default;
+
+ExtensionFunction::ResponseAction
+TerminalPrivateOpenOptionsPageFunction::Run() {
+ crostini::LaunchTerminalSettings(
+ Profile::FromBrowserContext(browser_context()));
+ return RespondNow(NoArguments());
+}
+
TerminalPrivateGetCroshSettingsFunction::
~TerminalPrivateGetCroshSettingsFunction() = default;
@@ -501,6 +519,10 @@ TerminalPrivateGetCroshSettingsFunction::Run() {
const Extension* crosh_extension =
TerminalExtensionHelper::GetTerminalExtension(
Profile::FromBrowserContext(browser_context()));
+ if (!crosh_extension) {
+ return RespondNow(OneArgument(std::make_unique<base::DictionaryValue>()));
+ }
+
StorageFrontend* frontend = StorageFrontend::Get(browser_context());
frontend->RunWithStorage(
crosh_extension, settings_namespace::SYNC,
diff --git a/chromium/chrome/browser/extensions/api/terminal/terminal_private_api.h b/chromium/chrome/browser/extensions/api/terminal/terminal_private_api.h
index 2f1961d86a5..200111e85f3 100644
--- a/chromium/chrome/browser/extensions/api/terminal/terminal_private_api.h
+++ b/chromium/chrome/browser/extensions/api/terminal/terminal_private_api.h
@@ -163,6 +163,28 @@ class TerminalPrivateAckOutputFunction : public ExtensionFunction {
void AckOutputOnRegistryTaskRunner(const std::string& terminal_id);
};
+class TerminalPrivateOpenWindowFunction : public ExtensionFunction {
+ public:
+ DECLARE_EXTENSION_FUNCTION("terminalPrivate.openWindow",
+ TERMINALPRIVATE_OPENWINDOW)
+
+ protected:
+ ~TerminalPrivateOpenWindowFunction() override;
+
+ ExtensionFunction::ResponseAction Run() override;
+};
+
+class TerminalPrivateOpenOptionsPageFunction : public ExtensionFunction {
+ public:
+ DECLARE_EXTENSION_FUNCTION("terminalPrivate.openOptionsPage",
+ TERMINALPRIVATE_OPENOPTIONSPAGE)
+
+ protected:
+ ~TerminalPrivateOpenOptionsPageFunction() override;
+
+ ExtensionFunction::ResponseAction Run() override;
+};
+
// TODO(crbug.com/1019021): Remove this function after M-83.
// Be sure to first remove the callsite in the terminal system app.
class TerminalPrivateGetCroshSettingsFunction : public ExtensionFunction {
diff --git a/chromium/chrome/browser/extensions/api/terminal/terminal_private_apitest.cc b/chromium/chrome/browser/extensions/api/terminal/terminal_private_apitest.cc
index 5a5e25b86c2..5e7241a2ba4 100644
--- a/chromium/chrome/browser/extensions/api/terminal/terminal_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/terminal/terminal_private_apitest.cc
@@ -4,6 +4,7 @@
#include "base/command_line.h"
#include "chrome/browser/extensions/extension_apitest.h"
+#include "content/public/test/browser_test.h"
#include "extensions/common/switches.h"
class ExtensionTerminalPrivateApiTest : public extensions::ExtensionApiTest {
diff --git a/chromium/chrome/browser/extensions/api/terminal/terminal_private_browsertest.cc b/chromium/chrome/browser/extensions/api/terminal/terminal_private_browsertest.cc
index 81de7f37d48..02eccc70baf 100644
--- a/chromium/chrome/browser/extensions/api/terminal/terminal_private_browsertest.cc
+++ b/chromium/chrome/browser/extensions/api/terminal/terminal_private_browsertest.cc
@@ -11,6 +11,7 @@
#include "chrome/common/chrome_features.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
diff --git a/chromium/chrome/browser/extensions/api/top_sites/top_sites_apitest.cc b/chromium/chrome/browser/extensions/api/top_sites/top_sites_apitest.cc
index ff0e2d0879a..b885e0bfe6e 100644
--- a/chromium/chrome/browser/extensions/api/top_sites/top_sites_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/top_sites/top_sites_apitest.cc
@@ -15,6 +15,7 @@
#include "chrome/browser/ui/browser.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "components/history/core/browser/top_sites.h"
+#include "content/public/test/browser_test.h"
namespace utils = extension_function_test_utils;
diff --git a/chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc b/chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc
index 86e7906c504..906e695f21f 100644
--- a/chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc
+++ b/chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc
@@ -21,7 +21,8 @@
#include "chrome/browser/chromeos/login/ui/user_adding_screen.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h"
-#include "chrome/browser/ui/chrome_pages.h"
+#include "chrome/browser/ui/settings_window_manager_chromeos.h"
+#include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h"
#include "chrome/common/url_constants.h"
#include "chromeos/constants/chromeos_features.h"
#include "components/user_manager/user_manager.h"
@@ -252,14 +253,15 @@ bool ChromeVirtualKeyboardDelegate::ShowLanguageSettings() {
keyboard_client->HideKeyboard(ash::HideReason::kUser);
base::RecordAction(base::UserMetricsAction("OpenLanguageOptionsDialog"));
- chrome::ShowSettingsSubPageForProfile(ProfileManager::GetActiveUserProfile(),
- chrome::kLanguageSubPage);
+ chrome::SettingsWindowManager::GetInstance()->ShowOSSettings(
+ ProfileManager::GetActiveUserProfile(),
+ chromeos::settings::mojom::kLanguagesAndInputDetailsSubpagePath);
return true;
}
bool ChromeVirtualKeyboardDelegate::SetVirtualKeyboardMode(
int mode_enum,
- base::Optional<gfx::Rect> target_bounds,
+ gfx::Rect target_bounds,
OnSetModeCallback on_set_mode_callback) {
auto* keyboard_client = ChromeKeyboardControllerClient::Get();
if (!keyboard_client->is_keyboard_enabled())
@@ -300,6 +302,15 @@ bool ChromeVirtualKeyboardDelegate::SetAreaToRemainOnScreen(
return keyboard_client->SetAreaToRemainOnScreen(bounds);
}
+bool ChromeVirtualKeyboardDelegate::SetWindowBoundsInScreen(
+ const gfx::Rect& bounds_in_screen) {
+ auto* keyboard_client = ChromeKeyboardControllerClient::Get();
+ if (!keyboard_client->is_keyboard_enabled())
+ return false;
+
+ return keyboard_client->SetWindowBoundsInScreen(bounds_in_screen);
+}
+
bool ChromeVirtualKeyboardDelegate::SetDraggableArea(
const api::virtual_keyboard_private::Bounds& rect) {
auto* keyboard_client = ChromeKeyboardControllerClient::Get();
diff --git a/chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.h b/chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.h
index e77399ccc9d..0a237a3a26c 100644
--- a/chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.h
+++ b/chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.h
@@ -45,7 +45,7 @@ class ChromeVirtualKeyboardDelegate : public VirtualKeyboardDelegate {
bool ShowLanguageSettings() override;
bool IsLanguageSettingsEnabled() override;
bool SetVirtualKeyboardMode(int mode_enum,
- base::Optional<gfx::Rect> target_bounds,
+ gfx::Rect target_bounds,
OnSetModeCallback on_set_mode_callback) override;
bool SetDraggableArea(
const api::virtual_keyboard_private::Bounds& rect) override;
@@ -53,6 +53,7 @@ class ChromeVirtualKeyboardDelegate : public VirtualKeyboardDelegate {
bool SetOccludedBounds(const std::vector<gfx::Rect>& bounds) override;
bool SetHitTestBounds(const std::vector<gfx::Rect>& bounds) override;
bool SetAreaToRemainOnScreen(const gfx::Rect& bounds) override;
+ bool SetWindowBoundsInScreen(const gfx::Rect& bounds_in_screen) override;
api::virtual_keyboard::FeatureRestrictions RestrictFeatures(
const api::virtual_keyboard::RestrictFeatures::Params& params) override;
diff --git a/chromium/chrome/browser/extensions/api/vpn_provider/vpn_provider_apitest.cc b/chromium/chrome/browser/extensions/api/vpn_provider/vpn_provider_apitest.cc
index 47135527250..72e85a31ba3 100644
--- a/chromium/chrome/browser/extensions/api/vpn_provider/vpn_provider_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/vpn_provider/vpn_provider_apitest.cc
@@ -20,6 +20,7 @@
#include "chromeos/network/network_configuration_handler.h"
#include "chromeos/network/network_profile_handler.h"
#include "content/public/browser/browser_context.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_utils.h"
#include "extensions/browser/api/vpn_provider/vpn_provider_api.h"
#include "extensions/browser/api/vpn_provider/vpn_service.h"
diff --git a/chromium/chrome/browser/extensions/api/web_navigation/frame_navigation_state.cc b/chromium/chrome/browser/extensions/api/web_navigation/frame_navigation_state.cc
index 117d716bb22..6c60478a0e2 100644
--- a/chromium/chrome/browser/extensions/api/web_navigation/frame_navigation_state.cc
+++ b/chromium/chrome/browser/extensions/api/web_navigation/frame_navigation_state.cc
@@ -4,7 +4,8 @@
#include "chrome/browser/extensions/api/web_navigation/frame_navigation_state.h"
-#include "base/logging.h"
+#include "base/check.h"
+#include "base/notreached.h"
#include "base/stl_util.h"
#include "chrome/common/url_constants.h"
#include "content/public/browser/render_frame_host.h"
diff --git a/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc b/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc
index 93cc46fb3e7..5162dc5a033 100644
--- a/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc
@@ -38,6 +38,7 @@
#include "content/public/browser/render_widget_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/url_constants.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/download_test_observer.h"
#include "content/public/test/no_renderer_crashes_assertion.h"
@@ -246,20 +247,6 @@ IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, Download) {
}
IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, ServerRedirectSingleProcess) {
- // TODO(lukasza): https://crbug.com/671734: In the long-term, //chrome-layer
- // tests should only be run with site-per-process - remove the early return
- // below when fixing https://crbug.com/870761 and removing the
- // not_site_per_process_browser_tests step.
- //
- // This test has its expectations in
- // serverRedirectSingleProcess/test_serverRedirectSingleProcess.js. The
- // expectations include exact |processId| ("exact" meaning that one cannot use
- // a wildcard - the verification is done via chrome.test.checkDeepEq).
- // Inclusion of |processId| means that the expectation change in
- // site-per-process mode.
- if (!content::AreAllSitesIsolatedForTesting())
- return;
-
ASSERT_TRUE(StartEmbeddedTestServer());
// Set max renderers to 1 to force running out of processes.
@@ -323,13 +310,7 @@ IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, FilteredTest) {
ASSERT_TRUE(RunExtensionTest("webnavigation/filtered")) << message_;
}
-// Flaky on Windows. See http://crbug.com/662160.
-#if defined(OS_WIN)
-#define MAYBE_UserAction DISABLED_UserAction
-#else
-#define MAYBE_UserAction UserAction
-#endif
-IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, MAYBE_UserAction) {
+IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, UserAction) {
content::IsolateAllSitesForTesting(base::CommandLine::ForCurrentProcess());
ASSERT_TRUE(StartEmbeddedTestServer());
@@ -389,13 +370,14 @@ IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, RequestOpenTab) {
// There's a link on a.html. Middle-click on it to open it in a new tab.
blink::WebMouseEvent mouse_event(
- blink::WebInputEvent::kMouseDown, blink::WebInputEvent::kNoModifiers,
+ blink::WebInputEvent::Type::kMouseDown,
+ blink::WebInputEvent::kNoModifiers,
blink::WebInputEvent::GetStaticTimeStampForTests());
mouse_event.button = blink::WebMouseEvent::Button::kMiddle;
mouse_event.SetPositionInWidget(7, 7);
mouse_event.click_count = 1;
tab->GetRenderViewHost()->GetWidget()->ForwardMouseEvent(mouse_event);
- mouse_event.SetType(blink::WebInputEvent::kMouseUp);
+ mouse_event.SetType(blink::WebInputEvent::Type::kMouseUp);
tab->GetRenderViewHost()->GetWidget()->ForwardMouseEvent(mouse_event);
ASSERT_TRUE(catcher.GetNextResult()) << catcher.message();
@@ -421,13 +403,14 @@ IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, TargetBlank) {
// There's a link with target=_blank on a.html. Click on it to open it in a
// new tab.
blink::WebMouseEvent mouse_event(
- blink::WebInputEvent::kMouseDown, blink::WebInputEvent::kNoModifiers,
+ blink::WebInputEvent::Type::kMouseDown,
+ blink::WebInputEvent::kNoModifiers,
blink::WebInputEvent::GetStaticTimeStampForTests());
mouse_event.button = blink::WebMouseEvent::Button::kLeft;
mouse_event.SetPositionInWidget(7, 7);
mouse_event.click_count = 1;
tab->GetRenderViewHost()->GetWidget()->ForwardMouseEvent(mouse_event);
- mouse_event.SetType(blink::WebInputEvent::kMouseUp);
+ mouse_event.SetType(blink::WebInputEvent::Type::kMouseUp);
tab->GetRenderViewHost()->GetWidget()->ForwardMouseEvent(mouse_event);
ASSERT_TRUE(catcher.GetNextResult()) << catcher.message();
@@ -451,13 +434,14 @@ IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, TargetBlankIncognito) {
// There's a link with target=_blank on a.html. Click on it to open it in a
// new tab.
blink::WebMouseEvent mouse_event(
- blink::WebInputEvent::kMouseDown, blink::WebInputEvent::kNoModifiers,
+ blink::WebInputEvent::Type::kMouseDown,
+ blink::WebInputEvent::kNoModifiers,
blink::WebInputEvent::GetStaticTimeStampForTests());
mouse_event.button = blink::WebMouseEvent::Button::kLeft;
mouse_event.SetPositionInWidget(7, 7);
mouse_event.click_count = 1;
tab->GetRenderViewHost()->GetWidget()->ForwardMouseEvent(mouse_event);
- mouse_event.SetType(blink::WebInputEvent::kMouseUp);
+ mouse_event.SetType(blink::WebInputEvent::Type::kMouseUp);
tab->GetRenderViewHost()->GetWidget()->ForwardMouseEvent(mouse_event);
ASSERT_TRUE(catcher.GetNextResult()) << catcher.message();
@@ -537,10 +521,8 @@ IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, PendingDeletion) {
ASSERT_TRUE(RunExtensionTest("webnavigation/pendingDeletion")) << message_;
}
-// TODO(jam): http://crbug.com/350550
-// TODO(crbug/974787): Flaky on Win7 debug builds.
-#if (defined(OS_CHROMEOS) && defined(ADDRESS_SANITIZER)) || \
- (defined(OS_WIN) && !(defined(NDEBUG)))
+// Flaky fails on Win7 Tests (dbg)(1); https://crbug.com/974787.
+#if defined(OS_WIN) && !defined(NDEBUG)
#define MAYBE_Crash DISABLED_Crash
#else
#define MAYBE_Crash Crash
@@ -557,18 +539,17 @@ IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, MAYBE_Crash) {
ResultCatcher catcher;
- GURL url(base::StringPrintf(
- "http://www.a.com:%u/"
- "extensions/api_test/webnavigation/crash/a.html",
- embedded_test_server()->port()));
+ GURL url(embedded_test_server()->GetURL(
+ "www.a.com", "/extensions/api_test/webnavigation/crash/a.html"));
ui_test_utils::NavigateToURL(browser(), url);
+ content::RenderProcessHostWatcher process_watcher(
+ tab, content::RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT);
ui_test_utils::NavigateToURL(browser(), GURL(content::kChromeUICrashURL));
+ process_watcher.Wait();
- url = GURL(base::StringPrintf(
- "http://www.a.com:%u/"
- "extensions/api_test/webnavigation/crash/b.html",
- embedded_test_server()->port()));
+ url = GURL(embedded_test_server()->GetURL(
+ "www.a.com", "/extensions/api_test/webnavigation/crash/b.html"));
ui_test_utils::NavigateToURL(browser(), url);
ASSERT_TRUE(catcher.GetNextResult()) << catcher.message();
diff --git a/chromium/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc b/chromium/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc
index d013a4010a5..c0ad861dd45 100644
--- a/chromium/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc
@@ -864,42 +864,6 @@ TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeSendHeadersResponses) {
HasIgnoredAction(ignored_actions, "extid2",
web_request::IGNORED_ACTION_TYPE_REQUEST_HEADERS));
EXPECT_TRUE(request_headers_modified3);
-
- // Check that headers removed by Declarative Net Request API can't be modified
- // and result in a conflict.
- ignored_actions.clear();
- ignore1.clear();
- ignore2.clear();
- bool request_headers_modified4 = false;
- net::HttpRequestHeaders headers4;
- headers4.MergeFrom(base_headers);
-
- DNRRequestAction remove_headers_action =
- CreateRequestActionForTesting(DNRRequestAction::Type::REMOVE_HEADERS);
- remove_headers_action.request_headers_to_remove = {"key5"};
- info.dnr_actions = std::vector<DNRRequestAction>();
- info.dnr_actions->push_back(std::move(remove_headers_action));
- MergeOnBeforeSendHeadersResponses(info, deltas, &headers4, &ignored_actions,
- &ignore1, &ignore2,
- &request_headers_modified4);
- // deleted by |d1|.
- EXPECT_FALSE(headers4.HasHeader("key1"));
- // Added by |d1|.
- ASSERT_TRUE(headers4.GetHeader("key2", &header_value));
- EXPECT_EQ("value 3", header_value);
- // Removed by Declarative Net Request API.
- EXPECT_FALSE(headers4.HasHeader("key5"));
- EXPECT_EQ(2u, ignored_actions.size());
- EXPECT_TRUE(
- HasIgnoredAction(ignored_actions, "extid2",
- web_request::IGNORED_ACTION_TYPE_REQUEST_HEADERS));
- EXPECT_TRUE(
- HasIgnoredAction(ignored_actions, "extid2",
- web_request::IGNORED_ACTION_TYPE_REQUEST_HEADERS));
- EXPECT_TRUE(
- HasIgnoredAction(ignored_actions, "extid3",
- web_request::IGNORED_ACTION_TYPE_REQUEST_HEADERS));
- EXPECT_TRUE(request_headers_modified4);
}
// Ensure conflicts between different extensions are handled correctly with
@@ -1345,38 +1309,6 @@ TEST(ExtensionWebRequestHelpersTest, TestMergeOnHeadersReceivedResponses) {
HasIgnoredAction(ignored_actions, "extid2",
web_request::IGNORED_ACTION_TYPE_RESPONSE_HEADERS));
EXPECT_TRUE(response_headers_modified2);
-
- // Ensure headers removed by Declarative Net Request API can't be added by web
- // request extensions and result in a conflict.
- DNRRequestAction remove_headers_action =
- CreateRequestActionForTesting(DNRRequestAction::Type::REMOVE_HEADERS);
- remove_headers_action.response_headers_to_remove = {"key3"};
- info.dnr_actions = std::vector<DNRRequestAction>();
- info.dnr_actions->push_back(std::move(remove_headers_action));
-
- ignored_actions.clear();
- bool response_headers_modified3 = false;
- scoped_refptr<net::HttpResponseHeaders> new_headers3;
- GURL preserve_fragment_on_redirect_url3;
- MergeOnHeadersReceivedResponses(
- info, deltas, base_headers.get(), &new_headers3,
- &preserve_fragment_on_redirect_url3, &ignored_actions,
- &response_headers_modified3);
- ASSERT_TRUE(new_headers3.get());
- EXPECT_TRUE(preserve_fragment_on_redirect_url3.is_empty());
- iter = 0;
- std::multimap<std::string, std::string> actual3;
- while (new_headers3->EnumerateHeaderLines(&iter, &name, &value))
- actual3.emplace(name, value);
- std::multimap<std::string, std::string> expected3;
- expected3.emplace("Key2", "Value4");
- expected3.emplace("Key1", "Value1");
- EXPECT_EQ(expected3, actual3);
- EXPECT_EQ(1u, ignored_actions.size());
- EXPECT_TRUE(
- HasIgnoredAction(ignored_actions, "extid1",
- web_request::IGNORED_ACTION_TYPE_RESPONSE_HEADERS));
- EXPECT_TRUE(response_headers_modified3);
}
// Check that we do not delete too much
diff --git a/chromium/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chromium/chrome/browser/extensions/api/web_request/web_request_apitest.cc
index 5783a667590..1a8cccf02eb 100644
--- a/chromium/chrome/browser/extensions/api/web_request/web_request_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/web_request/web_request_apitest.cc
@@ -79,6 +79,7 @@
#include "content/public/browser/storage_partition.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/page_type.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/simple_url_loader_test_helper.h"
#include "content/public/test/url_loader_interceptor.h"
@@ -312,6 +313,7 @@ class ExtensionWebRequestApiTest : public ExtensionApiTest {
network::mojom::URLLoaderFactoryParamsPtr params =
network::mojom::URLLoaderFactoryParams::New();
params->process_id = network::mojom::kBrowserProcessId;
+ params->automatically_assign_isolation_info = true;
params->is_corb_enabled = false;
mojo::PendingRemote<network::mojom::URLLoaderFactory> loader_factory;
content::BrowserContext::GetDefaultStoragePartition(profile())
@@ -427,13 +429,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebRequestApi) {
ASSERT_TRUE(RunExtensionSubtest("webrequest", "test_api.html")) << message_;
}
-// Fails often on Windows dbg bots. http://crbug.com/177163
-#if defined(OS_WIN)
-#define MAYBE_WebRequestSimple DISABLED_WebRequestSimple
-#else
-#define MAYBE_WebRequestSimple WebRequestSimple
-#endif // defined(OS_WIN)
-IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, MAYBE_WebRequestSimple) {
+IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebRequestSimple) {
ASSERT_TRUE(StartEmbeddedTestServer());
ASSERT_TRUE(RunExtensionSubtest("webrequest", "test_simple.html")) <<
message_;
@@ -807,13 +803,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest,
<< message_;
}
-// Fails often on Windows dbg bots. http://crbug.com/177163
-#if defined(OS_WIN)
-#define MAYBE_WebRequestNewTab DISABLED_WebRequestNewTab
-#else
-#define MAYBE_WebRequestNewTab WebRequestNewTab
-#endif // defined(OS_WIN)
-IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, MAYBE_WebRequestNewTab) {
+IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebRequestNewTab) {
ASSERT_TRUE(StartEmbeddedTestServer());
// Wait for the extension to set itself up and return control to us.
ASSERT_TRUE(RunExtensionSubtest("webrequest", "test_newTab.html"))
@@ -834,13 +824,14 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, MAYBE_WebRequestNewTab) {
// There's a link on a.html with target=_blank. Click on it to open it in a
// new tab.
blink::WebMouseEvent mouse_event(
- blink::WebInputEvent::kMouseDown, blink::WebInputEvent::kNoModifiers,
+ blink::WebInputEvent::Type::kMouseDown,
+ blink::WebInputEvent::kNoModifiers,
blink::WebInputEvent::GetStaticTimeStampForTests());
mouse_event.button = blink::WebMouseEvent::Button::kLeft;
mouse_event.SetPositionInWidget(7, 7);
mouse_event.click_count = 1;
tab->GetRenderViewHost()->GetWidget()->ForwardMouseEvent(mouse_event);
- mouse_event.SetType(blink::WebInputEvent::kMouseUp);
+ mouse_event.SetType(blink::WebInputEvent::Type::kMouseUp);
tab->GetRenderViewHost()->GetWidget()->ForwardMouseEvent(mouse_event);
ASSERT_TRUE(catcher.GetNextResult()) << catcher.message();
@@ -2807,6 +2798,10 @@ IN_PROC_BROWSER_TEST_P(ServiceWorkerWebRequestApiTest,
IN_PROC_BROWSER_TEST_P(ServiceWorkerWebRequestApiTest, ServiceWorkerScript) {
// The extension to be used in this test adds foo=bar request header.
const char kScriptPath[] = "/echoheader_service_worker.js";
+ // The request handler below will run on the EmbeddedTestServer's IO thread.
+ // Hence guard access to |served_service_worker_count| and |foo_header_value|
+ // using a lock.
+ base::Lock lock;
int served_service_worker_count = 0;
std::string foo_header_value;
@@ -2818,6 +2813,7 @@ IN_PROC_BROWSER_TEST_P(ServiceWorkerWebRequestApiTest, ServiceWorkerScript) {
if (request.relative_url != kScriptPath)
return nullptr;
+ base::AutoLock auto_lock(lock);
++served_service_worker_count;
foo_header_value.clear();
if (request.headers.find("foo") != request.headers.end())
@@ -2845,15 +2841,21 @@ IN_PROC_BROWSER_TEST_P(ServiceWorkerWebRequestApiTest, ServiceWorkerScript) {
std::string script =
content::JsReplace("register($1, './in-scope');", kScriptPath);
EXPECT_EQ("DONE", EvalJs(web_contents, script));
- EXPECT_EQ(1, served_service_worker_count);
- EXPECT_EQ("bar", foo_header_value);
+ {
+ base::AutoLock auto_lock(lock);
+ EXPECT_EQ(1, served_service_worker_count);
+ EXPECT_EQ("bar", foo_header_value);
+ }
// Update the worker. The worker should have "foo: bar" request header in the
// request for update checking.
EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
EXPECT_EQ("DONE", EvalJs(web_contents, "update('./in-scope');"));
- EXPECT_EQ(2, served_service_worker_count);
- EXPECT_EQ("bar", foo_header_value);
+ {
+ base::AutoLock auto_lock(lock);
+ EXPECT_EQ(2, served_service_worker_count);
+ EXPECT_EQ("bar", foo_header_value);
+ }
}
// Ensure that extensions can intercept service worker navigation preload
@@ -3318,8 +3320,12 @@ IN_PROC_BROWSER_TEST_P(RedirectInfoWebRequestApiTest,
EXPECT_TRUE(resource_request->site_for_cookies.IsFirstParty(redirected_url));
ASSERT_TRUE(resource_request->trusted_params);
url::Origin redirected_origin = url::Origin::Create(redirected_url);
- EXPECT_EQ(resource_request->trusted_params->network_isolation_key,
- net::NetworkIsolationKey(redirected_origin, redirected_origin));
+ EXPECT_TRUE(
+ resource_request->trusted_params->isolation_info.IsEqualForTesting(
+ net::IsolationInfo::Create(
+ net::IsolationInfo::RedirectMode::kUpdateTopFrame,
+ redirected_origin, redirected_origin,
+ net::SiteForCookies::FromOrigin(redirected_origin))));
}
// Test that a sub frame request redirected by an extension has the correct
@@ -3365,8 +3371,12 @@ IN_PROC_BROWSER_TEST_P(RedirectInfoWebRequestApiTest,
ASSERT_TRUE(resource_request->trusted_params);
url::Origin top_level_origin = url::Origin::Create(page_with_iframe_url);
url::Origin redirected_origin = url::Origin::Create(redirected_url);
- EXPECT_EQ(resource_request->trusted_params->network_isolation_key,
- net::NetworkIsolationKey(top_level_origin, redirected_origin));
+ EXPECT_TRUE(
+ resource_request->trusted_params->isolation_info.IsEqualForTesting(
+ net::IsolationInfo::Create(
+ net::IsolationInfo::RedirectMode::kUpdateFrameOnly,
+ top_level_origin, redirected_origin,
+ net::SiteForCookies::FromOrigin(top_level_origin))));
}
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc b/chromium/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc
index 2a399b87e64..303d7b9675f 100644
--- a/chromium/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc
+++ b/chromium/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc
@@ -35,6 +35,7 @@
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/media_device_id.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "extensions/common/permissions/permission_set.h"
#include "extensions/common/permissions/permissions_data.h"
diff --git a/chromium/chrome/browser/extensions/api/webrtc_from_web_accessible_resource_browsertest.cc b/chromium/chrome/browser/extensions/api/webrtc_from_web_accessible_resource_browsertest.cc
index 34702924774..ee09eff01ca 100644
--- a/chromium/chrome/browser/extensions/api/webrtc_from_web_accessible_resource_browsertest.cc
+++ b/chromium/chrome/browser/extensions/api/webrtc_from_web_accessible_resource_browsertest.cc
@@ -9,6 +9,7 @@
#include "chrome/test/base/ui_test_utils.h"
#include "components/permissions/permission_request_manager.h"
#include "components/permissions/test/permission_request_observer.h"
+#include "content/public/test/browser_test.h"
#include "extensions/test/result_catcher.h"
#include "net/dns/mock_host_resolver.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
diff --git a/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.cc b/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.cc
index 9ad9aefa707..32845ee2e0e 100644
--- a/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.cc
+++ b/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.cc
@@ -5,11 +5,12 @@
#include "chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.h"
#include <memory>
+#include <utility>
#include "base/bind.h"
+#include "base/check_op.h"
#include "base/command_line.h"
#include "base/hash/hash.h"
-#include "base/logging.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h"
#include "base/supports_user_data.h"
@@ -254,7 +255,7 @@ WebrtcLoggingPrivateSetMetaDataFunction::Run() {
WebRtcLoggingController* webrtc_logging_controller =
PrepareTask(params->request, params->security_origin, &callback, &error);
if (!webrtc_logging_controller)
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
std::unique_ptr<WebRtcLogMetaDataMap> meta_data(new WebRtcLogMetaDataMap());
for (const MetaDataEntry& entry : params->meta_data)
@@ -273,7 +274,7 @@ ExtensionFunction::ResponseAction WebrtcLoggingPrivateStartFunction::Run() {
WebRtcLoggingController* webrtc_logging_controller =
PrepareTask(params->request, params->security_origin, &callback, &error);
if (!webrtc_logging_controller)
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
webrtc_logging_controller->StartLogging(callback);
return RespondLater();
@@ -290,7 +291,7 @@ WebrtcLoggingPrivateSetUploadOnRenderCloseFunction::Run() {
LoggingControllerFromRequest(params->request, params->security_origin,
&error));
if (!webrtc_logging_controller)
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
webrtc_logging_controller->set_upload_log_on_render_close(
params->should_upload);
@@ -307,7 +308,7 @@ ExtensionFunction::ResponseAction WebrtcLoggingPrivateStopFunction::Run() {
WebRtcLoggingController* webrtc_logging_controller =
PrepareTask(params->request, params->security_origin, &callback, &error);
if (!webrtc_logging_controller)
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
webrtc_logging_controller->StopLogging(callback);
return RespondLater();
@@ -322,7 +323,7 @@ ExtensionFunction::ResponseAction WebrtcLoggingPrivateStoreFunction::Run() {
WebRtcLoggingController* webrtc_logging_controller =
PrepareTask(params->request, params->security_origin, &callback, &error);
if (!webrtc_logging_controller)
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
const std::string local_log_id(HashIdWithOrigin(params->security_origin,
params->log_id));
@@ -341,7 +342,7 @@ WebrtcLoggingPrivateUploadStoredFunction::Run() {
WebRtcLoggingController* logging_controller = LoggingControllerFromRequest(
params->request, params->security_origin, &error);
if (!logging_controller)
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
WebRtcLoggingController::UploadDoneCallback callback =
base::Bind(&WebrtcLoggingPrivateUploadStoredFunction::FireCallback, this);
@@ -361,7 +362,7 @@ ExtensionFunction::ResponseAction WebrtcLoggingPrivateUploadFunction::Run() {
WebRtcLoggingController* logging_controller = LoggingControllerFromRequest(
params->request, params->security_origin, &error);
if (!logging_controller)
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
WebRtcLoggingController::UploadDoneCallback callback =
base::Bind(&WebrtcLoggingPrivateUploadFunction::FireCallback, this);
@@ -379,7 +380,7 @@ ExtensionFunction::ResponseAction WebrtcLoggingPrivateDiscardFunction::Run() {
WebRtcLoggingController* webrtc_logging_controller =
PrepareTask(params->request, params->security_origin, &callback, &error);
if (!webrtc_logging_controller)
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
webrtc_logging_controller->DiscardLog(callback);
return RespondLater();
@@ -405,7 +406,7 @@ WebrtcLoggingPrivateStartRtpDumpFunction::Run() {
content::RenderProcessHost* host =
RphFromRequest(params->request, params->security_origin, &error);
if (!host) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
WebRtcLoggingController* webrtc_logging_controller =
@@ -438,7 +439,7 @@ WebrtcLoggingPrivateStopRtpDumpFunction::Run() {
content::RenderProcessHost* host =
RphFromRequest(params->request, params->security_origin, &error);
if (!host) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
WebRtcLoggingController* webrtc_logging_controller =
@@ -470,7 +471,7 @@ WebrtcLoggingPrivateStartAudioDebugRecordingsFunction::Run() {
content::RenderProcessHost* host =
RphFromRequest(params->request, params->security_origin, &error);
if (!host) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
scoped_refptr<AudioDebugRecordingsHandler> audio_debug_recordings_handler(
@@ -502,7 +503,7 @@ WebrtcLoggingPrivateStopAudioDebugRecordingsFunction::Run() {
content::RenderProcessHost* host =
RphFromRequest(params->request, params->security_origin, &error);
if (!host) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
scoped_refptr<AudioDebugRecordingsHandler> audio_debug_recordings_handler(
@@ -530,7 +531,7 @@ WebrtcLoggingPrivateStartEventLoggingFunction::Run() {
content::RenderProcessHost* host =
RphFromRequest(params->request, params->security_origin, &error);
if (!host) {
- return RespondNow(Error(error));
+ return RespondNow(Error(std::move(error)));
}
WebRtcLoggingController* webrtc_logging_controller =
diff --git a/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc b/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc
index b8491df14db..00dd7438771 100644
--- a/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc
@@ -32,6 +32,7 @@
#include "components/policy/policy_constants.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/render_view_host.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_utils.h"
#include "extensions/common/extension_builder.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
diff --git a/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_browsertest.cc b/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_browsertest.cc
index aa5ee121352..2cdf1e053f9 100644
--- a/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_browsertest.cc
+++ b/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_browsertest.cc
@@ -9,6 +9,7 @@
#include "chrome/browser/apps/platform_apps/app_browsertest_util.h"
#include "chrome/common/chrome_switches.h"
#include "components/webrtc_logging/browser/text_log_list.h"
+#include "content/public/test/browser_test.h"
class WebrtcLoggingPrivateApiBrowserTest
: public extensions::PlatformAppBrowserTest {
@@ -44,8 +45,7 @@ IN_PROC_BROWSER_TEST_F(WebrtcLoggingPrivateApiBrowserTest,
ASSERT_TRUE(base::CreateDirectory(webrtc_logs_path()));
base::FilePath test_file_path = webrtc_logs_path().AppendASCII("test.file");
std::string contents = "test file contents";
- ASSERT_EQ(base::checked_cast<int>(contents.size()),
- base::WriteFile(test_file_path, contents.c_str(), contents.size()));
+ ASSERT_TRUE(base::WriteFile(test_file_path, contents));
ASSERT_TRUE(RunPlatformAppTestWithArg(
"api_test/webrtc_logging_private/get_logs_directory",
"test_with_file_in_directory"))
diff --git a/chromium/chrome/browser/extensions/api/webstore_private/extension_install_status.cc b/chromium/chrome/browser/extensions/api/webstore_private/extension_install_status.cc
index 60108f37b6b..8e3faa800be 100644
--- a/chromium/chrome/browser/extensions/api/webstore_private/extension_install_status.cc
+++ b/chromium/chrome/browser/extensions/api/webstore_private/extension_install_status.cc
@@ -28,6 +28,19 @@ ExtensionInstallStatus GetWebstoreExtensionInstallStatus(
extension_id, disable_reason::DISABLE_CUSTODIAN_APPROVAL_REQUIRED)) {
return kCustodianApprovalRequired;
}
+ ExtensionManagement* extension_management =
+ ExtensionManagementFactory::GetForBrowserContext(profile);
+ // Always use webstore update url to check the installation mode because this
+ // function is used by webstore private API only and there may not be any
+ // |Extension| instance. Note that we don't handle the case where an offstore
+ // extension with an identical ID is installed.
+ ExtensionManagement::InstallationMode mode =
+ extension_management->GetInstallationMode(
+ extension_id, extension_urls::GetWebstoreUpdateUrl().spec());
+
+ if (mode == ExtensionManagement::INSTALLATION_FORCED ||
+ mode == ExtensionManagement::INSTALLATION_RECOMMENDED)
+ return kForceInstalled;
ExtensionRegistry* registry = ExtensionRegistry::Get(profile);
if (registry->enabled_extensions().Contains(extension_id))
@@ -39,19 +52,11 @@ ExtensionInstallStatus GetWebstoreExtensionInstallStatus(
if (registry->blacklisted_extensions().Contains(extension_id))
return kBlacklisted;
- ExtensionManagement* extension_management =
- ExtensionManagementFactory::GetForBrowserContext(profile);
- ExtensionManagement::InstallationMode mode =
- extension_management->GetInstallationMode(
- extension_id, extension_urls::GetDefaultWebstoreUpdateUrl().spec());
-
// If an installed extension is disabled due to policy, returns
// kBlockedByPolicy, kCanRequest or kRequestPending instead of kDisabled.
// By doing so, user can still request an installed and policy blocked
// extension.
- if (mode == ExtensionManagement::INSTALLATION_FORCED ||
- mode == ExtensionManagement::INSTALLATION_RECOMMENDED ||
- mode == ExtensionManagement::INSTALLATION_ALLOWED) {
+ if (mode == ExtensionManagement::INSTALLATION_ALLOWED) {
if (registry->disabled_extensions().Contains(extension_id))
return kDisabled;
return kInstallable;
diff --git a/chromium/chrome/browser/extensions/api/webstore_private/extension_install_status.h b/chromium/chrome/browser/extensions/api/webstore_private/extension_install_status.h
index 4e3101f9fc4..bdb89f3e109 100644
--- a/chromium/chrome/browser/extensions/api/webstore_private/extension_install_status.h
+++ b/chromium/chrome/browser/extensions/api/webstore_private/extension_install_status.h
@@ -29,7 +29,9 @@ enum ExtensionInstallStatus {
// Extension is blacklisted.
kBlacklisted,
// Extension requires custodian approval to enable.
- kCustodianApprovalRequired
+ kCustodianApprovalRequired,
+ // Extension is force installed or recommended by policy.
+ kForceInstalled
};
// Returns the Extension install status for an Chrome web store extension with
diff --git a/chromium/chrome/browser/extensions/api/webstore_private/extension_install_status_unittest.cc b/chromium/chrome/browser/extensions/api/webstore_private/extension_install_status_unittest.cc
index ebac07208c4..d4cfc262b0a 100644
--- a/chromium/chrome/browser/extensions/api/webstore_private/extension_install_status_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/webstore_private/extension_install_status_unittest.cc
@@ -48,6 +48,13 @@ constexpr char kExtensionSettingsWithIdAllowed[] = R"({
}
})";
+constexpr char kExtensionSettingsWithIdForced[] = R"({
+ "abcdefghijklmnopabcdefghijklmnop": {
+ "installation_mode": "force_installed",
+ "update_url":"https://clients2.google.com/service/update2/crx"
+ }
+})";
+
} // namespace
class ExtensionInstallStatusTest : public BrowserWithTestWindowTest {
@@ -131,6 +138,13 @@ TEST_F(ExtensionInstallStatusTest, ExtensionAllowed) {
GetWebstoreExtensionInstallStatus(kExtensionId, profile()));
}
+TEST_F(ExtensionInstallStatusTest, ExtensionForceInstalledByPolicy) {
+ SetExtensionSettings(kExtensionSettingsWithIdForced);
+ ExtensionRegistry::Get(profile())->AddEnabled(CreateExtension(kExtensionId));
+ EXPECT_EQ(ExtensionInstallStatus::kForceInstalled,
+ GetWebstoreExtensionInstallStatus(kExtensionId, profile()));
+}
+
TEST_F(ExtensionInstallStatusTest, ExtensionBlockedByUpdateUrl) {
EXPECT_EQ(ExtensionInstallStatus::kInstallable,
GetWebstoreExtensionInstallStatus(kExtensionId, profile()));
diff --git a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
index 99b1e505dc6..862650ef793 100644
--- a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
+++ b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
@@ -156,6 +156,8 @@ const char kWebstoreInvalidManifestError[] = "Invalid manifest";
const char kNoPreviousBeginInstallWithManifestError[] =
"* does not match a previous call to beginInstallWithManifest3";
const char kWebstoreUserCancelledError[] = "User cancelled install";
+const char kWebstoreBlockByPolicy[] =
+ "Extension installation is blocked by policy";
const char kIncognitoError[] =
"Apps cannot be installed in guest/incognito mode";
const char kEphemeralAppLaunchingNotSupported[] =
@@ -169,6 +171,34 @@ const char kEphemeralAppLaunchingNotSupported[] =
// that prevented the request from completing.
const char kWebstoreParentPermissionFailedError[] =
"Parent permission request failed";
+
+const char kParentBlockedExtensionInstallError[] =
+ "Parent has blocked extension/app installation";
+
+void ShowBlockedByParentDialog(const Extension* extension,
+ content::WebContents* contents,
+ base::OnceClosure done_callback) {
+ DCHECK(extension);
+ DCHECK(contents);
+
+ // Need to record UMA metrics before the ScopedTestDialogAutoConfirm early
+ // return so tests pass.
+ SupervisedUserExtensionsMetricsRecorder::RecordEnablementUmaMetrics(
+ SupervisedUserExtensionsMetricsRecorder::EnablementState::
+ kFailedToEnable);
+
+ if (ScopedTestDialogAutoConfirm::GetAutoConfirmValue() !=
+ ScopedTestDialogAutoConfirm::NONE) {
+ base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+ std::move(done_callback));
+ return;
+ }
+
+ chrome::ShowExtensionInstallBlockedByParentDialog(
+ chrome::ExtensionInstalledBlockedByParentDialogAction::kAdd, extension,
+ contents, std::move(done_callback));
+}
+
#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
// The number of user gestures to trace back for the referrer chain.
@@ -225,6 +255,9 @@ ConvertExtensionInstallStatusForAPI(ExtensionInstallStatus status) {
case kCustodianApprovalRequired:
return api::webstore_private::ExtensionInstallStatus::
EXTENSION_INSTALL_STATUS_CUSTODIAN_APPROVAL_REQUIRED;
+ case kForceInstalled:
+ return api::webstore_private::ExtensionInstallStatus::
+ EXTENSION_INSTALL_STATUS_FORCE_INSTALLED;
}
return api::webstore_private::EXTENSION_INSTALL_STATUS_NONE;
}
@@ -249,7 +282,7 @@ ExtensionInstallStatus AddExtensionToPendingList(const ExtensionId& id,
// |id| will be removed from the pending list once the notification is
// confirmed or closed by the user.
if (status != kCanRequest && status != kInstallable &&
- status != kBlockedByPolicy) {
+ status != kBlockedByPolicy && status != kForceInstalled) {
return status;
}
@@ -385,41 +418,6 @@ void WebstorePrivateBeginInstallWithManifest3Function::OnWebstoreParseSuccess(
return;
}
- // Check the management policy before the installation process begins.
- Profile* profile = chrome_details_.GetProfile();
- base::string16 policy_error;
- bool allow =
- ExtensionSystem::Get(profile)->management_policy()->UserMayInstall(
- dummy_extension_.get(), &policy_error);
- ExtensionInstallStatus install_status =
- GetWebstoreExtensionInstallStatus(id, profile);
- if (!allow && install_status != kCanRequest &&
- install_status != kRequestPending) {
- bool blocked_for_child = false;
-#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
- // If the installation was blocked because the user is a child, we send a
- // different error code so that the Web Store can adjust the UI accordingly.
- // In that case, the CWS will not show the |policy_error|.
- if (profile->IsChild()) {
- SupervisedUserService* service =
- SupervisedUserServiceFactory::GetForProfile(profile);
- // Hack: Check that the message matches to make sure installation was
- // actually blocked due to the user being a child, as opposed to, say,
- // device policy.
- if (policy_error == service->GetExtensionsLockedMessage())
- blocked_for_child = true;
- }
-#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
- if (blocked_for_child) {
- Respond(
- BuildResponse(api::webstore_private::RESULT_BLOCKED_FOR_CHILD_ACCOUNT,
- base::UTF16ToUTF8(policy_error)));
- // Matches the AddRef in Run().
- Release();
- return;
- }
- }
-
content::WebContents* web_contents = GetSenderWebContents();
if (!web_contents) {
// The browser window has gone away.
@@ -429,6 +427,28 @@ void WebstorePrivateBeginInstallWithManifest3Function::OnWebstoreParseSuccess(
Release();
return;
}
+
+ Profile* profile = chrome_details_.GetProfile();
+#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
+ // Check if the supervised user is allowed to install extensions.
+ // NOTE: we do not block themes.
+ if (!dummy_extension_->is_theme()) {
+ SupervisedUserService* service =
+ SupervisedUserServiceFactory::GetForProfile(profile);
+ if (profile->IsChild() && !service->CanInstallExtensions()) {
+ ShowBlockedByParentDialog(
+ dummy_extension_.get(), web_contents,
+ base::BindOnce(&WebstorePrivateBeginInstallWithManifest3Function::
+ OnBlockedByParentDialogDone,
+ this));
+ return;
+ }
+ }
+#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
+
+ // Check the management policy before the installation process begins.
+ ExtensionInstallStatus install_status =
+ GetWebstoreExtensionInstallStatus(id, profile);
if (install_status == kBlockedByPolicy) {
ShowBlockedByPolicyDialog(
dummy_extension_.get(), icon_, web_contents,
@@ -461,6 +481,9 @@ void WebstorePrivateBeginInstallWithManifest3Function::OnWebstoreParseSuccess(
// to configure the install prompt to indicate that this is a child
// asking a parent for installation permission.
prompt->set_requires_parent_permission(profile->IsChild());
+ if (profile->IsChild()) {
+ prompt->AddObserver(&supervised_user_extensions_metrics_recorder_);
+ }
}
#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
@@ -509,7 +532,7 @@ void WebstorePrivateBeginInstallWithManifest3Function::
OnParentPermissionReceived() {
SupervisedUserService* service =
SupervisedUserServiceFactory::GetForProfile(chrome_details_.GetProfile());
- service->AddOrUpdateExtensionApproval(*dummy_extension_);
+ service->AddExtensionApproval(*dummy_extension_);
HandleInstallProceed();
Release(); // Matches the AddRef in Run().
@@ -566,6 +589,15 @@ bool WebstorePrivateBeginInstallWithManifest3Function::
return true;
}
+
+void WebstorePrivateBeginInstallWithManifest3Function::
+ OnBlockedByParentDialogDone() {
+ Respond(BuildResponse(api::webstore_private::RESULT_BLOCKED_FOR_CHILD_ACCOUNT,
+ kParentBlockedExtensionInstallError));
+ // Matches the AddRef in Run().
+ Release();
+}
+
#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
void WebstorePrivateBeginInstallWithManifest3Function::OnInstallPromptDone(
@@ -625,10 +657,8 @@ void WebstorePrivateBeginInstallWithManifest3Function::OnRequestPromptDone(
}
void WebstorePrivateBeginInstallWithManifest3Function::
OnBlockByPolicyPromptDone() {
- // TODO(crbug.com/1061205): Returns |blocked_by_policy| when CWS is ready for
- // the new dialog change.
- Respond(BuildResponse(api::webstore_private::RESULT_USER_CANCELLED,
- kWebstoreUserCancelledError));
+ Respond(BuildResponse(api::webstore_private::RESULT_BLOCKED_BY_POLICY,
+ kWebstoreBlockByPolicy));
// Matches the AddRef in Run().
Release();
}
diff --git a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.h b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.h
index f1651c720d8..d1bbb96b944 100644
--- a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.h
+++ b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.h
@@ -24,6 +24,7 @@
#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
// TODO(https://crbug.com/1060801): Here and elsewhere, possibly switch build
// flag to #if defined(OS_CHROMEOS)
+#include "chrome/browser/supervised_user/supervised_user_extensions_metrics_recorder.h"
#include "chrome/browser/ui/supervised_user/parent_permission_dialog.h"
#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
@@ -80,13 +81,20 @@ class WebstorePrivateBeginInstallWithManifest3Function
#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
void OnParentPermissionDone(ParentPermissionDialog::Result result);
+
void OnParentPermissionReceived();
+
void OnParentPermissionCanceled();
+
void OnParentPermissionFailed();
+
// Returns true if the parental approval prompt was shown, false if there was
// an error showing it.
bool PromptForParentApproval();
+
+ void OnBlockedByParentDialogDone();
#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
+
void OnInstallPromptDone(ExtensionInstallPrompt::Result result);
void OnRequestPromptDone(ExtensionInstallPrompt::Result result);
void OnBlockByPolicyPromptDone();
@@ -100,7 +108,7 @@ class WebstorePrivateBeginInstallWithManifest3Function
std::unique_ptr<base::ListValue> CreateResults(
api::webstore_private::Result result) const;
- // Shows block dialog when |extension| is blcoked by policy on the Window that
+ // Shows block dialog when |extension| is blocked by policy on the Window that
// |contents| belongs to. |done_callback| will be invoked once the dialog is
// closed by user.
// Custom error message will be appended if it's set by the policy.
@@ -128,7 +136,9 @@ class WebstorePrivateBeginInstallWithManifest3Function
#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
std::unique_ptr<ParentPermissionDialog> parent_permission_dialog_;
-#endif
+ SupervisedUserExtensionsMetricsRecorder
+ supervised_user_extensions_metrics_recorder_;
+#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
std::unique_ptr<ExtensionInstallPrompt> install_prompt_;
};
diff --git a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
index d7e32fe1d58..09b988d79e9 100644
--- a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
@@ -30,6 +30,7 @@
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "content/public/browser/render_frame_host.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
#include "extensions/browser/api/management/management_api.h"
@@ -45,15 +46,16 @@
// TODO(https://crbug.com/1060801): Here and elsewhere, possibly switch build
// flag to #if defined(OS_CHROMEOS)
#include "base/test/metrics/histogram_tester.h"
+#include "base/test/metrics/user_action_tester.h"
#include "base/test/scoped_feature_list.h"
#include "chrome/browser/supervised_user/logged_in_user_mixin.h"
#include "chrome/browser/supervised_user/supervised_user_constants.h"
#include "chrome/browser/supervised_user/supervised_user_features.h"
#include "chrome/browser/supervised_user/supervised_user_service.h"
#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
+#include "chrome/browser/supervised_user/supervised_user_test_util.h"
#include "chrome/browser/ui/supervised_user/parent_permission_dialog.h"
#include "chrome/browser/ui/views/parent_permission_dialog_view.h"
-#include "chrome/common/pref_names.h"
#include "components/account_id/account_id.h"
#include "components/signin/public/identity_manager/identity_test_environment.h"
#include "extensions/common/extension_builder.h"
@@ -178,16 +180,11 @@ class ExtensionWebstorePrivateApiTest : public ExtensionApiTest {
// Navigates to |page| and runs the Extension API test there. Any downloads
// of extensions will return the contents of |crx_file|.
bool RunInstallTest(const std::string& page, const std::string& crx_file) {
-#if defined(OS_WIN) && !defined(NDEBUG)
- // See http://crbug.com/177163 for details.
- return true;
-#else
const GURL crx_url = GetTestServerURL(crx_file);
extension_test_util::SetGalleryUpdateURL(crx_url);
GURL page_url = GetTestServerURL(page);
return RunPageTest(page_url.spec());
-#endif
}
content::WebContents* GetWebContents() {
@@ -300,17 +297,9 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, IncorrectManifest2) {
ASSERT_TRUE(RunInstallTest("incorrect_manifest2.html", "extension.crx"));
}
-// Disabled: http://crbug.com/174399 and http://crbug.com/177163
-#if defined(OS_WIN) && (defined(USE_AURA) || !defined(NDEBUG))
-#define MAYBE_AppInstallBubble DISABLED_AppInstallBubble
-#else
-#define MAYBE_AppInstallBubble AppInstallBubble
-#endif
-
// Tests that we can request an app installed bubble (instead of the default
// UI when an app is installed).
-IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest,
- MAYBE_AppInstallBubble) {
+IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, AppInstallBubble) {
WebstoreInstallListener listener;
WebstorePrivateApi::SetWebstoreInstallerDelegateForTesting(&listener);
ASSERT_TRUE(RunInstallTest("app_install_bubble.html", "app.crx"));
@@ -329,25 +318,13 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, IsNotInIncognitoMode) {
ASSERT_TRUE(RunPageTest(page_url.spec()));
}
-// Fails often on Windows dbg bots. http://crbug.com/177163.
-#if defined(OS_WIN)
-#define MAYBE_IconUrl DISABLED_IconUrl
-#else
-#define MAYBE_IconUrl IconUrl
-#endif // defined(OS_WIN)
// Tests using the iconUrl parameter to the install function.
-IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, MAYBE_IconUrl) {
+IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, IconUrl) {
ASSERT_TRUE(RunInstallTest("icon_url.html", "extension.crx"));
}
-// http://crbug.com/177163
-#if defined(OS_WIN) && !defined(NDEBUG)
-#define MAYBE_BeginInstall DISABLED_BeginInstall
-#else
-#define MAYBE_BeginInstall BeginInstall
-#endif
// Tests that the Approvals are properly created in beginInstall.
-IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, MAYBE_BeginInstall) {
+IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, BeginInstall) {
std::string appId = "iladmdjkfniedhfhcfoefgojhgaiaccc";
std::string extensionId = "enfkhcelefdadlmkffamgdlgplcionje";
ASSERT_TRUE(RunInstallTest("begin_install.html", "extension.crx"));
@@ -369,14 +346,8 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, MAYBE_BeginInstall) {
EXPECT_EQ(browser()->profile(), approval->profile);
}
-// http://crbug.com/177163
-#if defined(OS_WIN) && !defined(NDEBUG)
-#define MAYBE_InstallTheme DISABLED_InstallTheme
-#else
-#define MAYBE_InstallTheme InstallTheme
-#endif
// Tests that themes are installed without an install prompt.
-IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, MAYBE_InstallTheme) {
+IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, InstallTheme) {
WebstoreInstallListener listener;
WebstorePrivateApi::SetWebstoreInstallerDelegateForTesting(&listener);
ASSERT_TRUE(RunInstallTest("theme.html", "../../theme.crx"));
@@ -450,16 +421,7 @@ class ExtensionWebstorePrivateApiTestChild
void InitializeFamilyData() {
// Set up the child user's custodians (i.e. parents).
ASSERT_TRUE(browser());
- PrefService* prefs = browser()->profile()->GetPrefs();
- prefs->SetString(prefs::kSupervisedUserCustodianEmail,
- "test_parent_0@google.com");
- prefs->SetString(prefs::kSupervisedUserCustodianObfuscatedGaiaId,
- "239029320");
-
- prefs->SetString(prefs::kSupervisedUserSecondCustodianEmail,
- "test_parent_1@google.com");
- prefs->SetString(prefs::kSupervisedUserSecondCustodianObfuscatedGaiaId,
- "85948533");
+ supervised_user_test_util::AddCustodians(browser()->profile());
// Set up the identity test environment, which provides fake
// OAuth refresh tokens.
@@ -537,7 +499,19 @@ class ExtensionWebstorePrivateApiTestChildInstallDisabled
// the feature flag is disabled.
IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTestChildInstallDisabled,
InstallBlocked) {
+ base::HistogramTester histogram_tester;
+ base::UserActionTester user_action_tester;
ASSERT_TRUE(RunInstallTest("install_blocked_child.html", "app.crx"));
+ histogram_tester.ExpectUniqueSample(
+ SupervisedUserExtensionsMetricsRecorder::kEnablementHistogramName,
+ SupervisedUserExtensionsMetricsRecorder::EnablementState::kFailedToEnable,
+ 1);
+ histogram_tester.ExpectTotalCount(
+ SupervisedUserExtensionsMetricsRecorder::kEnablementHistogramName, 1);
+ EXPECT_EQ(
+ 1,
+ user_action_tester.GetActionCount(
+ SupervisedUserExtensionsMetricsRecorder::kFailedToEnableActionName));
}
static constexpr char kTestAppId[] = "iladmdjkfniedhfhcfoefgojhgaiaccc";
@@ -647,6 +621,36 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTestChildInstallEnabled,
ASSERT_EQ("idlfhncioikpdnlhnmcjogambnefbbfp", listener.id());
}
+// Tests that even if the kSupervisedUserInitiatedExtensionInstall feature flag
+// is enabled, supervised user extension installs are blocked if the
+// "Permissions for sites, apps and extensions" toggle is off.
+IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTestChildInstallEnabled,
+ InstallBlockedWhenPermissionsToggleOff) {
+ base::HistogramTester histogram_tester;
+ base::UserActionTester user_action_tester;
+
+ SupervisedUserService* service =
+ SupervisedUserServiceFactory::GetForProfile(profile());
+ service->SetSupervisedUserExtensionsMayRequestPermissionsPrefForTesting(
+ false);
+
+ set_next_dialog_action(NextDialogAction::kAccept);
+ // Tell the Reauth API client to return a success for the next reauth
+ // request.
+ SetNextReAuthStatus(GaiaAuthConsumer::ReAuthProofTokenStatus::kSuccess);
+ ASSERT_TRUE(RunInstallTest("install_blocked_child.html", "app.crx"));
+ histogram_tester.ExpectUniqueSample(
+ SupervisedUserExtensionsMetricsRecorder::kEnablementHistogramName,
+ SupervisedUserExtensionsMetricsRecorder::EnablementState::kFailedToEnable,
+ 1);
+ histogram_tester.ExpectTotalCount(
+ SupervisedUserExtensionsMetricsRecorder::kEnablementHistogramName, 1);
+ EXPECT_EQ(
+ 1,
+ user_action_tester.GetActionCount(
+ SupervisedUserExtensionsMetricsRecorder::kFailedToEnableActionName));
+}
+
#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
class ExtensionWebstoreGetWebGLStatusTest : public InProcessBrowserTest {
diff --git a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_unittest.cc b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_unittest.cc
index 2a8ec2b13aa..49e6ebbb3dc 100644
--- a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_unittest.cc
@@ -58,6 +58,8 @@ constexpr char kBlockedExtensionSettings[] = R"({
})";
constexpr char kWebstoreUserCancelledError[] = "User cancelled install";
+constexpr char kWebstoreBlockByPolicy[] =
+ "Extension installation is blocked by policy";
base::Time GetFaketime() {
return base::Time::FromJavaTime(kFakeTime);
@@ -283,8 +285,8 @@ class WebstorePrivateBeginInstallWithManifest3Test
const base::Value* result;
ASSERT_TRUE(function->GetResultList() &&
function->GetResultList()->Get(0, &result));
- EXPECT_EQ("user_cancelled", result->GetString());
- EXPECT_EQ(kWebstoreUserCancelledError, function->GetError());
+ EXPECT_EQ("blocked_by_policy", result->GetString());
+ EXPECT_EQ(kWebstoreBlockByPolicy, function->GetError());
EXPECT_EQ(expected_blocked_message,
function->GetBlockedByPolicyErrorMessageForTesting());
}
diff --git a/chromium/chrome/browser/flags/BUILD.gn b/chromium/chrome/browser/flags/BUILD.gn
index 05c4d848f50..a8481265fb3 100644
--- a/chromium/chrome/browser/flags/BUILD.gn
+++ b/chromium/chrome/browser/flags/BUILD.gn
@@ -69,7 +69,10 @@ java_library("flags_junit_tests") {
android_library("javatests") {
testonly = true
- sources = [ "android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureListInstrumentationTest.java" ]
+ sources = [
+ "android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureListInstrumentationTest.java",
+ "android/java/src/org/chromium/chrome/browser/flags/FieldTrialsInstrumentationTest.java",
+ ]
deps = [
":java",
"//base:base_java",
diff --git a/chromium/chrome/browser/image_fetcher/BUILD.gn b/chromium/chrome/browser/image_fetcher/BUILD.gn
index d7dc0ae5526..58766c164a4 100644
--- a/chromium/chrome/browser/image_fetcher/BUILD.gn
+++ b/chromium/chrome/browser/image_fetcher/BUILD.gn
@@ -10,6 +10,7 @@ android_library("java") {
"//base:jni_java",
"//chrome/browser/profiles/android:java",
"//chrome/browser/util:java",
+ "//components/browser_ui/util/android:java",
"//content/public/android:content_java",
"//third_party/gif_player:gif_player_java",
]
diff --git a/chromium/chrome/browser/media/feeds/BUILD.gn b/chromium/chrome/browser/media/feeds/BUILD.gn
index 92d3ceee185..7180747ead2 100644
--- a/chromium/chrome/browser/media/feeds/BUILD.gn
+++ b/chromium/chrome/browser/media/feeds/BUILD.gn
@@ -10,6 +10,7 @@ mojom("mojo_bindings") {
public_deps = [
"//services/media_session/public/mojom",
+ "//ui/gfx/geometry/mojom",
"//url/mojom:url_mojom_origin",
]
}
diff --git a/chromium/chrome/browser/media/feeds/media_feeds_store.mojom b/chromium/chrome/browser/media/feeds/media_feeds_store.mojom
index 9d24cfd2a11..ec77b81c049 100644
--- a/chromium/chrome/browser/media/feeds/media_feeds_store.mojom
+++ b/chromium/chrome/browser/media/feeds/media_feeds_store.mojom
@@ -7,6 +7,8 @@ module media_feeds.mojom;
import "services/media_session/public/mojom/media_session.mojom";
import "mojo/public/mojom/base/string16.mojom";
import "mojo/public/mojom/base/time.mojom";
+import "url/mojom/origin.mojom";
+import "ui/gfx/geometry/mojom/geometry.mojom";
import "url/mojom/url.mojom";
struct MediaFeed {
@@ -31,8 +33,8 @@ struct MediaFeed {
// The number of times in a row the feed has failed to be fetched.
int64 fetch_failed_count;
- // The time the previously fetched feed should expire in the cache.
- mojo_base.mojom.Time? cache_expiry_time;
+ // The time we previously fetched the feed that did not hit the cache.
+ mojo_base.mojom.Time? last_fetch_time_not_cache_hit;
// The number of items in the last feed fetch.
int64 last_fetch_item_count;
@@ -44,10 +46,47 @@ struct MediaFeed {
int64 last_fetch_content_types;
// The logos for the feed.
- array<media_session.mojom.MediaImage> logos;
+ array<MediaImage> logos;
// A display name for the feed.
string display_name;
+
+ // The audio+video watchtime percentile for this feed's origin. Calculated as
+ // the number of other origins with less watchtime divided by the total
+ // number of other origins. The value is between 0.0 and 100.0.
+ double origin_audio_video_watchtime_percentile;
+
+ // The last time this feed was displayed in the UI.
+ mojo_base.mojom.Time? last_display_time;
+
+ // The number of items in the last feed fetch that has been confirmed as
+ // safe by the Safe Search API.
+ int64 last_fetch_safe_item_count;
+
+ // The reason why the feed has been reset. If not kNone, this means the items
+ // have been deleted and the feed status has been reset to default.
+ ResetReason reset_reason;
+
+ // An associated origin is an origin associated with the feed. If the cookies
+ // are deleted or expire on the origin then we will delete the feed items.
+ // https://wicg.github.io/media-feeds/#dfn-associated-origin
+ array<url.mojom.Origin> associated_origins;
+
+ // Contains details about the user signed into the website.
+ UserIdentifier? user_identifier;
+};
+
+// Contains details about the user signed into the website.
+// https://wicg.github.io/media-feeds/#dfn-currently-logged-in-user
+struct UserIdentifier {
+ // The name of the user’s account.
+ string name;
+
+ // The email address of the users’ account.
+ string? email;
+
+ // The image of the user’s account.
+ MediaImage? image;
};
// The result of fetching the feed. This enum is committed to storage so do not
@@ -64,6 +103,29 @@ enum FetchResult {
// The feed failed to fetch because of a network error.
kFailedNetworkError = 3,
+
+ // The feed failed to fetch because the feed data was invalid.
+ kInvalidFeed = 4,
+
+ // The feed was reset while the feed was being fetched.
+ kFailedDueToResetWhileInflight = 5,
+};
+
+// The reason why a feed has been reset. This enum is committed to storage so
+// do not change the numbering.
+enum ResetReason {
+ // The feed has not been reset.
+ kNone = 0,
+
+ // The feed has been reset because the cookies have expired or been deleted
+ // on the feed origin.
+ kCookies = 1,
+
+ // The feed has been reset because the user has visited the feed origin.
+ kVisit = 2,
+
+ // The feed has been reset because the user cleared the cache.
+ kCache = 3,
};
// Whether the user has forcibly opted out of the feed. This enum is committed
@@ -177,6 +239,9 @@ struct PlayNextCandidate {
// The identifiers for the content. We will store up to one of each type.
array<Identifier> identifiers;
+
+ // The images for the episode.
+ array<MediaImage> images;
};
// https://schema.org/TVEpisode
@@ -188,14 +253,23 @@ struct TVEpisode {
int64 episode_number;
int64 season_number;
+ // The duration of the content.
+ mojo_base.mojom.TimeDelta duration;
+
// The identifiers for the episode. We will store up to one of each type.
array<Identifier> identifiers;
+
+ // Information about a live stream event.
+ LiveDetails? live;
+
+ // The images for the episode.
+ array<MediaImage> images;
};
// Details specific to live content.
struct LiveDetails {
// The date/time the feed item became live.
- mojo_base.mojom.Time? start_time;
+ mojo_base.mojom.Time start_time;
// The date/time the feed item finished becoming live.
mojo_base.mojom.Time? end_time;
@@ -213,6 +287,64 @@ enum SafeSearchResult {
kUnsafe,
};
+// Content attributes describe the image's type and defines its suggested
+// usages.
+enum ContentAttribute {
+ // An unknown or unexpected content attribute.
+ kUnknown,
+
+ // The image is an artistic render of the show. Usually a poster or banner.
+ kIconic,
+
+ // The image is a still/framegrab from the media item.
+ kSceneStill,
+
+ // The image is a poster image for the show.
+ kPoster,
+
+ // Suitable for being used as a background and does not contain text.
+ kBackground,
+
+ // The image is suitable for use on a dark background.
+ kForDarkBackground,
+
+ // The image is suitable for use on a light background.
+ kForLightBackground,
+
+ // The predominant figure is positioned at the center of the image.
+ kCentered,
+
+ // The predominant figure is positioned to the right of the image and the left
+ // side is empty and can be used for text overlays.
+ kRightCentered,
+
+ // The predominant figure is positioned to the left of the image and the right
+ // side is empty and can be used for text overlays.
+ kLeftCentered,
+
+ // The image has a transparent background.
+ kHasTransparentBackground,
+
+ // The content's title appears in the image.
+ kHasTitle,
+
+ // The content's title does not appear in the image.
+ kNoTitle
+};
+
+// A media image for use with media feeds. This can be a thumbnail representing
+// content in a media feed item, or it can be a logo for the feed.
+struct MediaImage {
+ // URL of the image
+ url.mojom.Url src;
+
+ // Size of the image. Width and height in pixels.
+ gfx.mojom.Size size;
+
+ // Describes the image's type and defines its suggested usages.
+ array<ContentAttribute> content_attributes;
+};
+
// The Media Feed Item is an individual item stored in a Media Feed. It
// represents a single recommendation such as a video or TV show.
// https://wicg.github.io/media-feeds/index.html#media-feed-item
@@ -224,7 +356,7 @@ struct MediaFeedItem {
mojo_base.mojom.String16 name;
// The author that created the content.
- Author author;
+ Author? author;
// The date/time this feed item was published.
mojo_base.mojom.Time date_published;
@@ -250,7 +382,7 @@ struct MediaFeedItem {
// The duration of this feed item.
mojo_base.mojom.TimeDelta? duration;
- // Whether the feed item is live.
+ // Information about a live stream event.
LiveDetails? live;
// The TV episode data associated with the content.
@@ -269,18 +401,38 @@ struct MediaFeedItem {
bool clicked;
// The images for the feed item.
- array<media_session.mojom.MediaImage> images;
+ array<MediaImage> images;
// The result of safe search checking this media item.
SafeSearchResult safe_search_result;
};
+// Information for debugging Media Feeds for the internal WebUI.
+struct DebugInformation {
+ // Whether the MediaFeedsSafeSearch feature is enabled.
+ bool safe_search_feature_enabled;
+
+ // The value of the Media Feeds Safe Search checking consent pref.
+ bool safe_search_pref_value;
+};
+
// MediaFeedStore allows the Media Feeds WebUI to access data from the Media
// Feeds backend in the browser process for diagnostic purposes.
interface MediaFeedsStore {
+ // Gets debugging information for media feeds.
+ GetDebugInformation() => (DebugInformation info);
+
+ // Updates the Safe Search checking enabled pref to |value|.
+ SetSafeSearchEnabledPref(bool value) => ();
+
// Gets all the discovered media feeds.
GetMediaFeeds() => (array<MediaFeed> feeds);
// Gets the items for the media feed.
GetItemsForMediaFeed(int64 feed_id) => (array<MediaFeedItem> items);
+
+ // Fetch the details of a previously-discovered media feed and store them in
+ // media history. The feed ID is the unique ID for the feed from the Media
+ // History store.
+ FetchMediaFeed(int64 feed_id) => ();
};
diff --git a/chromium/chrome/browser/media/router/BUILD.gn b/chromium/chrome/browser/media/router/BUILD.gn
index efa5f1245e8..0a680d40f51 100644
--- a/chromium/chrome/browser/media/router/BUILD.gn
+++ b/chromium/chrome/browser/media/router/BUILD.gn
@@ -13,9 +13,9 @@ static_library("router") {
"//chrome:strings",
"//chrome/common:constants",
"//components/cast_channel",
- "//components/cast_channel",
"//components/keyed_service/content",
"//components/keyed_service/core",
+ "//components/openscreen_platform:openscreen_platform_network_service",
"//content/public/browser",
"//content/public/common",
"//crypto",
@@ -165,7 +165,6 @@ static_library("router") {
]
deps += [
- "//components/openscreen_platform:openscreen_platform_network_service",
"//third_party/openscreen/src/osp/public",
"//third_party/openscreen/src/platform",
"//third_party/openscreen/src/util",
@@ -180,9 +179,7 @@ static_library("test_support") {
"//chrome/test:test_support",
"//testing/gmock",
]
- public_deps = [
- ":router",
- ]
+ public_deps = [ ":router" ]
sources = [
"test/mock_media_router.cc",
"test/mock_media_router.h",
@@ -316,9 +313,7 @@ if (enable_openscreen) {
}
fuzzer_test("dial_internal_message_fuzzer") {
- sources = [
- "providers/dial/dial_internal_message_fuzzer.cc",
- ]
+ sources = [ "providers/dial/dial_internal_message_fuzzer.cc" ]
deps = [
":router",
"//base",
diff --git a/chromium/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.cc b/chromium/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.cc
new file mode 100644
index 00000000000..428a1eb5304
--- /dev/null
+++ b/chromium/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.cc
@@ -0,0 +1,79 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.h"
+
+#include "components/permissions/permission_request_id.h"
+#include "components/permissions/permissions_client.h"
+#include "third_party/blink/public/mojom/feature_policy/feature_policy_feature.mojom-shared.h"
+
+CameraPanTiltZoomPermissionContext::CameraPanTiltZoomPermissionContext(
+ content::BrowserContext* browser_context)
+ : PermissionContextBase(browser_context,
+ ContentSettingsType::CAMERA_PAN_TILT_ZOOM,
+ blink::mojom::FeaturePolicyFeature::kNotFound) {
+ host_content_settings_map_ =
+ permissions::PermissionsClient::Get()->GetSettingsMap(browser_context);
+ host_content_settings_map_->AddObserver(this);
+}
+
+CameraPanTiltZoomPermissionContext::~CameraPanTiltZoomPermissionContext() {
+ host_content_settings_map_->RemoveObserver(this);
+}
+
+#if defined(OS_ANDROID)
+void CameraPanTiltZoomPermissionContext::DecidePermission(
+ content::WebContents* web_contents,
+ const permissions::PermissionRequestID& id,
+ const GURL& requesting_origin,
+ const GURL& embedding_origin,
+ bool user_gesture,
+ permissions::BrowserPermissionCallback callback) {
+ // User should not be prompted on Android.
+ NOTREACHED();
+}
+#endif
+
+void CameraPanTiltZoomPermissionContext::OnContentSettingChanged(
+ const ContentSettingsPattern& primary_pattern,
+ const ContentSettingsPattern& secondary_pattern,
+ ContentSettingsType content_type,
+ const std::string& resource_identifier) {
+ if (content_type != ContentSettingsType::MEDIASTREAM_CAMERA)
+ return;
+
+ // TODO(crbug.com/1078272): We should not need to deduce the url from the
+ // primary pattern here. Modify the infrastructure to facilitate this
+ // particular use case better.
+ const GURL url(primary_pattern.ToString());
+ if (url::Origin::Create(url).opaque())
+ return;
+
+ ContentSetting camera_ptz_setting =
+ host_content_settings_map_->GetContentSetting(
+ url, url, content_settings_type(), resource_identifier);
+ // Don't reset camera PTZ permission if it is already blocked or in a
+ // "default" state.
+ if (camera_ptz_setting == CONTENT_SETTING_BLOCK ||
+ camera_ptz_setting == CONTENT_SETTING_ASK) {
+ return;
+ }
+
+ ContentSetting mediastream_camera_setting =
+ host_content_settings_map_->GetContentSetting(url, url, content_type,
+ resource_identifier);
+ if (mediastream_camera_setting == CONTENT_SETTING_BLOCK ||
+ mediastream_camera_setting == CONTENT_SETTING_ASK) {
+ // Automatically reset camera PTZ permission if camera permission
+ // gets blocked or reset.
+ host_content_settings_map_->SetContentSettingCustomScope(
+ primary_pattern, secondary_pattern,
+ ContentSettingsType::CAMERA_PAN_TILT_ZOOM, resource_identifier,
+ CONTENT_SETTING_DEFAULT);
+ }
+}
+
+bool CameraPanTiltZoomPermissionContext::IsRestrictedToSecureOrigins() const {
+ return true;
+}
diff --git a/chromium/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.h b/chromium/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.h
new file mode 100644
index 00000000000..71265b64b7a
--- /dev/null
+++ b/chromium/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.h
@@ -0,0 +1,52 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_MEDIA_WEBRTC_CAMERA_PAN_TILT_ZOOM_PERMISSION_CONTEXT_H_
+#define CHROME_BROWSER_MEDIA_WEBRTC_CAMERA_PAN_TILT_ZOOM_PERMISSION_CONTEXT_H_
+
+#include "base/macros.h"
+#include "build/build_config.h"
+#include "components/content_settings/core/browser/content_settings_observer.h"
+#include "components/content_settings/core/browser/host_content_settings_map.h"
+#include "components/permissions/permission_context_base.h"
+
+// Manage user permissions that only control camera movement (pan, tilt, and
+// zoom). Those permissions are automatically reset when the "regular" camera
+// permission is blocked or reset.
+class CameraPanTiltZoomPermissionContext
+ : public permissions::PermissionContextBase,
+ public content_settings::Observer {
+ public:
+ explicit CameraPanTiltZoomPermissionContext(
+ content::BrowserContext* browser_context);
+ ~CameraPanTiltZoomPermissionContext() override;
+
+ CameraPanTiltZoomPermissionContext(
+ const CameraPanTiltZoomPermissionContext&) = delete;
+ CameraPanTiltZoomPermissionContext& operator=(
+ const CameraPanTiltZoomPermissionContext&) = delete;
+
+ private:
+ // PermissionContextBase
+#if defined(OS_ANDROID)
+ void DecidePermission(
+ content::WebContents* web_contents,
+ const permissions::PermissionRequestID& id,
+ const GURL& requesting_origin,
+ const GURL& embedding_origin,
+ bool user_gesture,
+ permissions::BrowserPermissionCallback callback) override;
+#endif
+ bool IsRestrictedToSecureOrigins() const override;
+
+ // content_settings::Observer
+ void OnContentSettingChanged(const ContentSettingsPattern& primary_pattern,
+ const ContentSettingsPattern& secondary_pattern,
+ ContentSettingsType content_type,
+ const std::string& resource_identifier) override;
+
+ HostContentSettingsMap* host_content_settings_map_;
+};
+
+#endif // CHROME_BROWSER_MEDIA_WEBRTC_CAMERA_PAN_TILT_ZOOM_PERMISSION_CONTEXT_H_
diff --git a/chromium/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context_unittest.cc b/chromium/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context_unittest.cc
new file mode 100644
index 00000000000..08a1421d1df
--- /dev/null
+++ b/chromium/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context_unittest.cc
@@ -0,0 +1,111 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.h"
+
+#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "chrome/test/base/chrome_render_view_host_test_harness.h"
+#include "components/content_settings/core/browser/host_content_settings_map.h"
+#include "components/content_settings/core/common/content_settings.h"
+#include "components/content_settings/core/common/content_settings_types.h"
+
+namespace {
+
+struct ContentSettingTestParams {
+ const ContentSetting initial_camera_pan_tilt_zoom;
+ const ContentSetting mediastream_camera;
+ const ContentSetting expected_camera_pan_tilt_zoom;
+} kTestParams[] = {
+ {CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK,
+ CONTENT_SETTING_ASK}, // Granted permission is reset if camera is
+ // blocked.
+ {CONTENT_SETTING_ALLOW, CONTENT_SETTING_ASK,
+ CONTENT_SETTING_ASK}, // Granted permission is reset if camera is
+ // reset.
+ {CONTENT_SETTING_BLOCK, CONTENT_SETTING_ALLOW,
+ CONTENT_SETTING_BLOCK}, // Blocked permission is not reset if camera
+ // is granted.
+ {CONTENT_SETTING_BLOCK, CONTENT_SETTING_BLOCK,
+ CONTENT_SETTING_BLOCK}, // Blocked permission is not reset if camera
+ // is blocked.
+};
+
+} // namespace
+
+// Waits until a camera change is observed in content settings.
+class CameraContentSettingsChangeWaiter : public content_settings::Observer {
+ public:
+ explicit CameraContentSettingsChangeWaiter(Profile* profile)
+ : profile_(profile) {
+ HostContentSettingsMapFactory::GetForProfile(profile)->AddObserver(this);
+ }
+ ~CameraContentSettingsChangeWaiter() override {
+ HostContentSettingsMapFactory::GetForProfile(profile_)->RemoveObserver(
+ this);
+ }
+
+ void OnContentSettingChanged(
+ const ContentSettingsPattern& primary_pattern,
+ const ContentSettingsPattern& secondary_pattern,
+ ContentSettingsType content_type,
+ const std::string& resource_identifier) override {
+ if (content_type == ContentSettingsType::MEDIASTREAM_CAMERA)
+ Proceed();
+ }
+
+ void Wait() { run_loop_.Run(); }
+
+ private:
+ void Proceed() { run_loop_.Quit(); }
+
+ Profile* profile_;
+ base::RunLoop run_loop_;
+
+ DISALLOW_COPY_AND_ASSIGN(CameraContentSettingsChangeWaiter);
+};
+
+class CameraPanTiltZoomPermissionContextTests
+ : public ChromeRenderViewHostTestHarness,
+ public testing::WithParamInterface<ContentSettingTestParams> {
+ public:
+ CameraPanTiltZoomPermissionContextTests() = default;
+
+ void SetContentSetting(ContentSettingsType content_settings_type,
+ ContentSetting content_setting) {
+ GURL url("https://www.example.com");
+ HostContentSettingsMap* content_settings =
+ HostContentSettingsMapFactory::GetForProfile(profile());
+ content_settings->SetContentSettingDefaultScope(
+ url, GURL(), content_settings_type, std::string(), content_setting);
+ }
+
+ ContentSetting GetContentSetting(ContentSettingsType content_settings_type) {
+ GURL url("https://www.example.com");
+ HostContentSettingsMap* content_settings =
+ HostContentSettingsMapFactory::GetForProfile(profile());
+ return content_settings->GetContentSetting(
+ url.GetOrigin(), url.GetOrigin(), content_settings_type, std::string());
+ }
+
+ DISALLOW_COPY_AND_ASSIGN(CameraPanTiltZoomPermissionContextTests);
+};
+
+TEST_P(CameraPanTiltZoomPermissionContextTests,
+ TestResetPermissionOnCameraChange) {
+ CameraPanTiltZoomPermissionContext permission_context(profile());
+ CameraContentSettingsChangeWaiter waiter(profile());
+
+ SetContentSetting(ContentSettingsType::CAMERA_PAN_TILT_ZOOM,
+ GetParam().initial_camera_pan_tilt_zoom);
+ SetContentSetting(ContentSettingsType::MEDIASTREAM_CAMERA,
+ GetParam().mediastream_camera);
+
+ waiter.Wait();
+ EXPECT_EQ(GetParam().expected_camera_pan_tilt_zoom,
+ GetContentSetting(ContentSettingsType::CAMERA_PAN_TILT_ZOOM));
+}
+
+INSTANTIATE_TEST_SUITE_P(ResetPermissionOnCameraChange,
+ CameraPanTiltZoomPermissionContextTests,
+ testing::ValuesIn(kTestParams));
diff --git a/chromium/chrome/browser/media/webrtc/desktop_capture_access_handler_unittest.cc b/chromium/chrome/browser/media/webrtc/desktop_capture_access_handler_unittest.cc
index 70ed3a0c4c8..7352ac86095 100644
--- a/chromium/chrome/browser/media/webrtc/desktop_capture_access_handler_unittest.cc
+++ b/chromium/chrome/browser/media/webrtc/desktop_capture_access_handler_unittest.cc
@@ -52,7 +52,9 @@ class DesktopCaptureAccessHandlerTest : public ChromeRenderViewHostTestHarness {
content::MediaStreamRequest request(
0, 0, 0, GURL("http://origin/"), false, request_type, std::string(),
std::string(), audio_type,
- blink::mojom::MediaStreamType::GUM_DESKTOP_VIDEO_CAPTURE, false);
+ blink::mojom::MediaStreamType::GUM_DESKTOP_VIDEO_CAPTURE,
+ /*disable_local_echo=*/false,
+ /*request_pan_tilt_zoom_permission=*/false);
base::RunLoop wait_loop;
content::MediaResponseCallback callback = base::BindOnce(
@@ -148,7 +150,7 @@ TEST_F(DesktopCaptureAccessHandlerTest,
render_process_id, render_frame_id, page_request_id,
GURL("http://origin/"), false, blink::MEDIA_DEVICE_UPDATE, std::string(),
std::string(), blink::mojom::MediaStreamType::NO_SERVICE, stream_type,
- false);
+ /*disable_local_echo=*/false, /*request_pan_tilt_zoom_permission=*/false);
content::MediaResponseCallback callback;
access_handler_->HandleRequest(web_contents(), request, std::move(callback),
nullptr /* extension */);
@@ -178,7 +180,8 @@ TEST_F(DesktopCaptureAccessHandlerTest, ChangeSourceWebContentsDestroyed) {
content::MediaStreamRequest request(
0, 0, 0, GURL("http://origin/"), false, blink::MEDIA_DEVICE_UPDATE,
std::string(), std::string(), blink::mojom::MediaStreamType::NO_SERVICE,
- blink::mojom::MediaStreamType::GUM_DESKTOP_VIDEO_CAPTURE, false);
+ blink::mojom::MediaStreamType::GUM_DESKTOP_VIDEO_CAPTURE,
+ /*disable_local_echo=*/false, /*request_pan_tilt_zoom_permission=*/false);
content::MediaResponseCallback callback;
access_handler_->HandleRequest(web_contents(), request, std::move(callback),
nullptr /* extension */);
@@ -215,7 +218,9 @@ TEST_F(DesktopCaptureAccessHandlerTest, ChangeSourceMultipleRequests) {
content::MediaStreamRequest request(
0, 0, 0, GURL("http://origin/"), false, blink::MEDIA_DEVICE_UPDATE,
std::string(), std::string(), blink::mojom::MediaStreamType::NO_SERVICE,
- blink::mojom::MediaStreamType::GUM_DESKTOP_VIDEO_CAPTURE, false);
+ blink::mojom::MediaStreamType::GUM_DESKTOP_VIDEO_CAPTURE,
+ /*disable_local_echo=*/false,
+ /*request_pan_tilt_zoom_permission=*/false);
content::MediaResponseCallback callback = base::BindOnce(
[](base::RunLoop* wait_loop,
blink::mojom::MediaStreamRequestResult* request_result,
diff --git a/chromium/chrome/browser/media/webrtc/display_media_access_handler_unittest.cc b/chromium/chrome/browser/media/webrtc/display_media_access_handler_unittest.cc
index 46d43b205a2..9afac8972de 100644
--- a/chromium/chrome/browser/media/webrtc/display_media_access_handler_unittest.cc
+++ b/chromium/chrome/browser/media/webrtc/display_media_access_handler_unittest.cc
@@ -55,7 +55,9 @@ class DisplayMediaAccessHandlerTest : public ChromeRenderViewHostTestHarness {
std::string(), std::string(),
request_audio ? blink::mojom::MediaStreamType::DISPLAY_AUDIO_CAPTURE
: blink::mojom::MediaStreamType::NO_SERVICE,
- blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE, false);
+ blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE,
+ /*disable_local_echo=*/false,
+ /*request_pan_tilt_zoom_permission=*/false);
base::RunLoop wait_loop;
content::MediaResponseCallback callback = base::BindOnce(
@@ -170,7 +172,7 @@ TEST_F(DisplayMediaAccessHandlerTest, UpdateMediaRequestStateWithClosing) {
render_process_id, render_frame_id, page_request_id,
GURL("http://origin/"), false, blink::MEDIA_GENERATE_STREAM,
std::string(), std::string(), audio_stream_type, video_stream_type,
- false);
+ /*disable_local_echo=*/false, /*request_pan_tilt_zoom_permission=*/false);
content::MediaResponseCallback callback;
access_handler_->HandleRequest(web_contents(), request, std::move(callback),
nullptr /* extension */);
@@ -200,7 +202,8 @@ TEST_F(DisplayMediaAccessHandlerTest, WebContentsDestroyed) {
content::MediaStreamRequest request(
0, 0, 0, GURL("http://origin/"), false, blink::MEDIA_GENERATE_STREAM,
std::string(), std::string(), blink::mojom::MediaStreamType::NO_SERVICE,
- blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE, false);
+ blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE,
+ /*disable_local_echo=*/false, /*request_pan_tilt_zoom_permission=*/false);
content::MediaResponseCallback callback;
access_handler_->HandleRequest(web_contents(), request, std::move(callback),
nullptr /* extension */);
@@ -237,7 +240,9 @@ TEST_F(DisplayMediaAccessHandlerTest, MultipleRequests) {
content::MediaStreamRequest request(
0, 0, 0, GURL("http://origin/"), false, blink::MEDIA_GENERATE_STREAM,
std::string(), std::string(), blink::mojom::MediaStreamType::NO_SERVICE,
- blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE, false);
+ blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE,
+ /*disable_local_echo=*/false,
+ /*request_pan_tilt_zoom_permission=*/false);
content::MediaResponseCallback callback = base::BindOnce(
[](base::RunLoop* wait_loop,
blink::mojom::MediaStreamRequestResult* request_result,
diff --git a/chromium/chrome/browser/media/webrtc/media_capture_devices_dispatcher.cc b/chromium/chrome/browser/media/webrtc/media_capture_devices_dispatcher.cc
index 4e633de14c0..00e2c25d5ea 100644
--- a/chromium/chrome/browser/media/webrtc/media_capture_devices_dispatcher.cc
+++ b/chromium/chrome/browser/media/webrtc/media_capture_devices_dispatcher.cc
@@ -8,8 +8,8 @@
#include <utility>
#include "base/bind.h"
+#include "base/check_op.h"
#include "base/command_line.h"
-#include "base/logging.h"
#include "base/metrics/field_trial.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
@@ -64,19 +64,6 @@ using content::MediaCaptureDevices;
namespace {
-// Finds a device in |devices| that has |device_id|, or NULL if not found.
-const blink::MediaStreamDevice* FindDeviceWithId(
- const blink::MediaStreamDevices& devices,
- const std::string& device_id) {
- auto iter = devices.begin();
- for (; iter != devices.end(); ++iter) {
- if (iter->id == device_id) {
- return &(*iter);
- }
- }
- return NULL;
-}
-
content::WebContents* WebContentsFromIds(int render_process_id,
int render_frame_id) {
content::WebContents* web_contents =
@@ -156,24 +143,6 @@ void MediaCaptureDevicesDispatcher::RemoveObserver(Observer* observer) {
observers_.RemoveObserver(observer);
}
-const MediaStreamDevices&
-MediaCaptureDevicesDispatcher::GetAudioCaptureDevices() {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- if (is_device_enumeration_disabled_ || !test_audio_devices_.empty())
- return test_audio_devices_;
-
- return MediaCaptureDevices::GetInstance()->GetAudioCaptureDevices();
-}
-
-const MediaStreamDevices&
-MediaCaptureDevicesDispatcher::GetVideoCaptureDevices() {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- if (is_device_enumeration_disabled_ || !test_video_devices_.empty())
- return test_video_devices_;
-
- return MediaCaptureDevices::GetInstance()->GetVideoCaptureDevices();
-}
-
void MediaCaptureDevicesDispatcher::ProcessMediaAccessRequest(
content::WebContents* web_contents,
const content::MediaStreamRequest& request,
@@ -233,50 +202,79 @@ bool MediaCaptureDevicesDispatcher::CheckMediaAccessPermission(
return false;
}
-void MediaCaptureDevicesDispatcher::GetDefaultDevicesForProfile(
+void MediaCaptureDevicesDispatcher::DisableDeviceEnumerationForTesting() {
+ is_device_enumeration_disabled_ = true;
+}
+
+std::string MediaCaptureDevicesDispatcher::GetDefaultDeviceIDForProfile(
Profile* profile,
+ blink::mojom::MediaStreamType type) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ PrefService* prefs = profile->GetPrefs();
+ if (type == blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE)
+ return prefs->GetString(prefs::kDefaultAudioCaptureDevice);
+ else if (type == blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE)
+ return prefs->GetString(prefs::kDefaultVideoCaptureDevice);
+ else
+ return std::string();
+}
+
+const MediaStreamDevices&
+MediaCaptureDevicesDispatcher::GetAudioCaptureDevices() const {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ if (is_device_enumeration_disabled_ || !test_audio_devices_.empty())
+ return test_audio_devices_;
+
+ return MediaCaptureDevices::GetInstance()->GetAudioCaptureDevices();
+}
+
+const MediaStreamDevices&
+MediaCaptureDevicesDispatcher::GetVideoCaptureDevices() const {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ if (is_device_enumeration_disabled_ || !test_video_devices_.empty())
+ return test_video_devices_;
+
+ return MediaCaptureDevices::GetInstance()->GetVideoCaptureDevices();
+}
+
+void MediaCaptureDevicesDispatcher::GetDefaultDevicesForBrowserContext(
+ content::BrowserContext* context,
bool audio,
bool video,
blink::MediaStreamDevices* devices) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
DCHECK(audio || video);
- PrefService* prefs = profile->GetPrefs();
+ PrefService* prefs = Profile::FromBrowserContext(context)->GetPrefs();
std::string default_device;
if (audio) {
default_device = prefs->GetString(prefs::kDefaultAudioCaptureDevice);
const blink::MediaStreamDevice* device =
GetRequestedAudioDevice(default_device);
- if (!device)
- device = GetFirstAvailableAudioDevice();
- if (device)
+ if (device) {
devices->push_back(*device);
+ } else {
+ const blink::MediaStreamDevices& audio_devices = GetAudioCaptureDevices();
+ if (!audio_devices.empty())
+ devices->push_back(audio_devices.front());
+ }
}
if (video) {
default_device = prefs->GetString(prefs::kDefaultVideoCaptureDevice);
const blink::MediaStreamDevice* device =
GetRequestedVideoDevice(default_device);
- if (!device)
- device = GetFirstAvailableVideoDevice();
- if (device)
+ if (device) {
devices->push_back(*device);
+ } else {
+ const blink::MediaStreamDevices& video_devices = GetVideoCaptureDevices();
+ if (!video_devices.empty())
+ devices->push_back(video_devices.front());
+ }
}
}
-std::string MediaCaptureDevicesDispatcher::GetDefaultDeviceIDForProfile(
- Profile* profile,
- blink::mojom::MediaStreamType type) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- PrefService* prefs = profile->GetPrefs();
- if (type == blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE)
- return prefs->GetString(prefs::kDefaultAudioCaptureDevice);
- else if (type == blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE)
- return prefs->GetString(prefs::kDefaultVideoCaptureDevice);
- else
- return std::string();
-}
-
+#if 0
const blink::MediaStreamDevice*
MediaCaptureDevicesDispatcher::GetRequestedAudioDevice(
const std::string& requested_audio_device_id) {
@@ -288,15 +286,6 @@ MediaCaptureDevicesDispatcher::GetRequestedAudioDevice(
}
const blink::MediaStreamDevice*
-MediaCaptureDevicesDispatcher::GetFirstAvailableAudioDevice() {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- const blink::MediaStreamDevices& audio_devices = GetAudioCaptureDevices();
- if (audio_devices.empty())
- return NULL;
- return &(*audio_devices.begin());
-}
-
-const blink::MediaStreamDevice*
MediaCaptureDevicesDispatcher::GetRequestedVideoDevice(
const std::string& requested_video_device_id) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -305,19 +294,7 @@ MediaCaptureDevicesDispatcher::GetRequestedVideoDevice(
FindDeviceWithId(video_devices, requested_video_device_id);
return device;
}
-
-const blink::MediaStreamDevice*
-MediaCaptureDevicesDispatcher::GetFirstAvailableVideoDevice() {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- const blink::MediaStreamDevices& video_devices = GetVideoCaptureDevices();
- if (video_devices.empty())
- return NULL;
- return &(*video_devices.begin());
-}
-
-void MediaCaptureDevicesDispatcher::DisableDeviceEnumerationForTesting() {
- is_device_enumeration_disabled_ = true;
-}
+#endif
scoped_refptr<MediaStreamCaptureIndicator>
MediaCaptureDevicesDispatcher::GetMediaStreamCaptureIndicator() {
diff --git a/chromium/chrome/browser/media/webrtc/media_capture_devices_dispatcher.h b/chromium/chrome/browser/media/webrtc/media_capture_devices_dispatcher.h
index 074c5d30fde..c5dd2b03843 100644
--- a/chromium/chrome/browser/media/webrtc/media_capture_devices_dispatcher.h
+++ b/chromium/chrome/browser/media/webrtc/media_capture_devices_dispatcher.h
@@ -15,6 +15,7 @@
#include "base/macros.h"
#include "base/memory/singleton.h"
#include "base/observer_list.h"
+#include "components/webrtc/media_stream_device_enumerator_impl.h"
#include "content/public/browser/media_observer.h"
#include "content/public/browser/media_stream_request.h"
#include "content/public/browser/web_contents_delegate.h"
@@ -34,7 +35,9 @@ class PrefRegistrySyncable;
// This singleton is used to receive updates about media events from the content
// layer.
-class MediaCaptureDevicesDispatcher : public content::MediaObserver {
+class MediaCaptureDevicesDispatcher
+ : public content::MediaObserver,
+ public webrtc::MediaStreamDeviceEnumeratorImpl {
public:
class Observer {
public:
@@ -74,8 +77,6 @@ class MediaCaptureDevicesDispatcher : public content::MediaObserver {
// on destruction.
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
- const blink::MediaStreamDevices& GetAudioCaptureDevices();
- const blink::MediaStreamDevices& GetVideoCaptureDevices();
// Method called from WebCapturerDelegate implementations to process access
// requests. |extension| is set to NULL if request was made from a drive-by
@@ -97,15 +98,10 @@ class MediaCaptureDevicesDispatcher : public content::MediaObserver {
blink::mojom::MediaStreamType type,
const extensions::Extension* extension);
- // Helper to get the default devices which can be used by the media request.
- // Uses the first available devices if the default devices are not available.
- // If the return list is empty, it means there is no available device on the
- // OS.
- // Called on the UI thread.
- void GetDefaultDevicesForProfile(Profile* profile,
- bool audio,
- bool video,
- blink::MediaStreamDevices* devices);
+ // Unittests that do not require actual device enumeration should call this
+ // API on the singleton. It is safe to call this multiple times on the
+ // signleton.
+ void DisableDeviceEnumerationForTesting();
// Helper to get default device IDs. If the returned value is an empty string,
// it means that there is no default device for the given device |type|. The
@@ -116,24 +112,16 @@ class MediaCaptureDevicesDispatcher : public content::MediaObserver {
std::string GetDefaultDeviceIDForProfile(Profile* profile,
blink::mojom::MediaStreamType type);
- // Helpers for picking particular requested devices, identified by raw id.
- // If the device requested is not available it will return NULL.
- const blink::MediaStreamDevice* GetRequestedAudioDevice(
- const std::string& requested_audio_device_id);
- const blink::MediaStreamDevice* GetRequestedVideoDevice(
- const std::string& requested_video_device_id);
-
- // Returns the first available audio or video device, or NULL if no devices
- // are available.
- const blink::MediaStreamDevice* GetFirstAvailableAudioDevice();
- const blink::MediaStreamDevice* GetFirstAvailableVideoDevice();
-
- // Unittests that do not require actual device enumeration should call this
- // API on the singleton. It is safe to call this multiple times on the
- // signleton.
- void DisableDeviceEnumerationForTesting();
+ // webrtc::MediaStreamDeviceEnumeratorImpl:
+ const blink::MediaStreamDevices& GetAudioCaptureDevices() const override;
+ const blink::MediaStreamDevices& GetVideoCaptureDevices() const override;
+ void GetDefaultDevicesForBrowserContext(
+ content::BrowserContext* context,
+ bool audio,
+ bool video,
+ blink::MediaStreamDevices* devices) override;
- // Overridden from content::MediaObserver:
+ // content::MediaObserver:
void OnAudioCaptureDevicesChanged() override;
void OnVideoCaptureDevicesChanged() override;
void OnMediaRequestStateChanged(int render_process_id,
diff --git a/chromium/chrome/browser/media/webrtc/media_stream_capture_indicator.cc b/chromium/chrome/browser/media/webrtc/media_stream_capture_indicator.cc
index 8e353fba8ff..aefe2a0905e 100644
--- a/chromium/chrome/browser/media/webrtc/media_stream_capture_indicator.cc
+++ b/chromium/chrome/browser/media/webrtc/media_stream_capture_indicator.cc
@@ -10,8 +10,9 @@
#include <string>
#include <utility>
-#include "base/logging.h"
+#include "base/check_op.h"
#include "base/macros.h"
+#include "base/notreached.h"
#include "build/build_config.h"
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/browser_process.h"
diff --git a/chromium/chrome/browser/media/webrtc/media_stream_device_permission_context.cc b/chromium/chrome/browser/media/webrtc/media_stream_device_permission_context.cc
index b0cb4719b82..97bcc9ed2a7 100644
--- a/chromium/chrome/browser/media/webrtc/media_stream_device_permission_context.cc
+++ b/chromium/chrome/browser/media/webrtc/media_stream_device_permission_context.cc
@@ -11,6 +11,7 @@
#include "content/public/common/content_features.h"
#include "content/public/common/url_constants.h"
#include "extensions/common/constants.h"
+#include "third_party/blink/public/mojom/feature_policy/feature_policy.mojom.h"
namespace {
diff --git a/chromium/chrome/browser/media/webrtc/media_stream_devices_controller.cc b/chromium/chrome/browser/media/webrtc/media_stream_devices_controller.cc
deleted file mode 100644
index 76908e07656..00000000000
--- a/chromium/chrome/browser/media/webrtc/media_stream_devices_controller.cc
+++ /dev/null
@@ -1,608 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/media/webrtc/media_stream_devices_controller.h"
-
-#include <algorithm>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/values.h"
-#include "chrome/browser/content_settings/tab_specific_content_settings.h"
-#include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
-#include "chrome/browser/media/webrtc/media_stream_capture_indicator.h"
-#include "chrome/browser/media/webrtc/media_stream_device_permissions.h"
-#include "chrome/browser/permissions/permission_manager_factory.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/common/pref_names.h"
-#include "components/content_settings/core/common/content_settings_pattern.h"
-#include "components/permissions/permission_manager.h"
-#include "components/permissions/permission_result.h"
-#include "components/permissions/permission_uma_util.h"
-#include "components/permissions/permission_util.h"
-#include "components/pref_registry/pref_registry_syncable.h"
-#include "components/prefs/scoped_user_pref_update.h"
-#include "components/url_formatter/elide_url.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/render_frame_host.h"
-#include "content/public/browser/render_process_host.h"
-#include "content/public/browser/render_widget_host_view.h"
-#include "content/public/common/origin_util.h"
-#include "extensions/common/constants.h"
-#include "third_party/blink/public/mojom/feature_policy/feature_policy.mojom.h"
-
-#if defined(OS_ANDROID)
-#include "chrome/browser/android/android_theme_resources.h"
-#include "chrome/browser/permissions/permission_update_infobar_delegate_android.h"
-#include "ui/android/window_android.h"
-#else // !defined(OS_ANDROID)
-#include "components/vector_icons/vector_icons.h"
-#endif
-
-using content::BrowserThread;
-
-namespace {
-
-// Returns true if the given ContentSettingsType is being requested in
-// |request|.
-bool ContentTypeIsRequested(ContentSettingsType type,
- const content::MediaStreamRequest& request) {
- if (type == ContentSettingsType::MEDIASTREAM_MIC)
- return request.audio_type ==
- blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE;
-
- if (type == ContentSettingsType::MEDIASTREAM_CAMERA)
- return request.video_type ==
- blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE;
-
- return false;
-}
-
-bool HasAvailableDevices(ContentSettingsType content_type,
- const std::string& device_id) {
- const blink::MediaStreamDevices* devices = nullptr;
- if (content_type == ContentSettingsType::MEDIASTREAM_MIC) {
- devices =
- &MediaCaptureDevicesDispatcher::GetInstance()->GetAudioCaptureDevices();
- } else if (content_type == ContentSettingsType::MEDIASTREAM_CAMERA) {
- devices =
- &MediaCaptureDevicesDispatcher::GetInstance()->GetVideoCaptureDevices();
- } else {
- NOTREACHED();
- }
-
- // TODO(tommi): It's kind of strange to have this here since if we fail this
- // test, there'll be a UI shown that indicates to the user that access to
- // non-existing audio/video devices has been denied. The user won't have
- // any way to change that but there will be a UI shown which indicates that
- // access is blocked.
- if (devices->empty())
- return false;
-
- // Note: we check device_id before dereferencing devices. If the requested
- // device id is non-empty, then the corresponding device list must not be
- // NULL.
- if (!device_id.empty()) {
- auto it = std::find_if(devices->begin(), devices->end(),
- [device_id](const blink::MediaStreamDevice& device) {
- return device.id == device_id;
- });
- if (it == devices->end())
- return false;
- }
-
- return true;
-}
-
-} // namespace
-
-// static
-void MediaStreamDevicesController::RequestPermissions(
- const content::MediaStreamRequest& request,
- content::MediaResponseCallback callback) {
- content::RenderFrameHost* rfh = content::RenderFrameHost::FromID(
- request.render_process_id, request.render_frame_id);
- // The RFH may have been destroyed by the time the request is processed.
- if (!rfh) {
- std::move(callback).Run(
- blink::MediaStreamDevices(),
- blink::mojom::MediaStreamRequestResult::FAILED_DUE_TO_SHUTDOWN,
- std::unique_ptr<content::MediaStreamUI>());
- return;
- }
- content::WebContents* web_contents =
- content::WebContents::FromRenderFrameHost(rfh);
- std::unique_ptr<MediaStreamDevicesController> controller(
- new MediaStreamDevicesController(web_contents, request,
- std::move(callback)));
-
- Profile* profile =
- Profile::FromBrowserContext(web_contents->GetBrowserContext());
- std::vector<ContentSettingsType> content_settings_types;
-
- permissions::PermissionManager* permission_manager =
- PermissionManagerFactory::GetForProfile(profile);
- bool will_prompt_for_audio = false;
- bool will_prompt_for_video = false;
-
- if (controller->ShouldRequestAudio()) {
- permissions::PermissionResult permission_status =
- permission_manager->GetPermissionStatusForFrame(
- ContentSettingsType::MEDIASTREAM_MIC, rfh, request.security_origin);
- if (permission_status.content_setting == CONTENT_SETTING_BLOCK) {
- controller->denial_reason_ =
- blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED;
- controller->RunCallback(
- permission_status.source ==
- permissions::PermissionStatusSource::FEATURE_POLICY);
- return;
- }
-
- content_settings_types.push_back(ContentSettingsType::MEDIASTREAM_MIC);
- will_prompt_for_audio =
- permission_status.content_setting == CONTENT_SETTING_ASK;
- }
- if (controller->ShouldRequestVideo()) {
- permissions::PermissionResult permission_status =
- permission_manager->GetPermissionStatusForFrame(
- ContentSettingsType::MEDIASTREAM_CAMERA, rfh,
- request.security_origin);
- if (permission_status.content_setting == CONTENT_SETTING_BLOCK) {
- controller->denial_reason_ =
- blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED;
- controller->RunCallback(
- permission_status.source ==
- permissions::PermissionStatusSource::FEATURE_POLICY);
- return;
- }
-
- content_settings_types.push_back(ContentSettingsType::MEDIASTREAM_CAMERA);
- will_prompt_for_video =
- permission_status.content_setting == CONTENT_SETTING_ASK;
- }
-
- permission_manager->RequestPermissions(
- content_settings_types, rfh, request.security_origin,
- request.user_gesture,
- base::BindOnce(
- &MediaStreamDevicesController::RequestAndroidPermissionsIfNeeded,
- web_contents, base::Passed(&controller), will_prompt_for_audio,
- will_prompt_for_video));
-}
-
-void MediaStreamDevicesController::RequestAndroidPermissionsIfNeeded(
- content::WebContents* web_contents,
- std::unique_ptr<MediaStreamDevicesController> controller,
- bool did_prompt_for_audio,
- bool did_prompt_for_video,
- const std::vector<ContentSetting>& responses) {
-#if defined(OS_ANDROID)
- // If either audio or video was previously allowed and Chrome no longer has
- // the necessary permissions, show a infobar to attempt to address this
- // mismatch.
- std::vector<ContentSettingsType> content_settings_types;
- // The audio setting will always be the first one in the vector, if it was
- // requested.
- // If the user was already prompted for mic (|did_prompt_for_audio| flag), we
- // would have requested Android permission at that point.
- if (!did_prompt_for_audio &&
- controller->ShouldRequestAudio() &&
- responses.front() == CONTENT_SETTING_ALLOW) {
- content_settings_types.push_back(ContentSettingsType::MEDIASTREAM_MIC);
- }
-
- // If the user was already prompted for camera (|did_prompt_for_video| flag),
- // we would have requested Android permission at that point.
- if (!did_prompt_for_video &&
- controller->ShouldRequestVideo() &&
- responses.back() == CONTENT_SETTING_ALLOW) {
- content_settings_types.push_back(ContentSettingsType::MEDIASTREAM_CAMERA);
- }
- if (content_settings_types.empty()) {
- controller->PromptAnsweredGroupedRequest(responses);
- return;
- }
-
- ShowPermissionInfoBarState show_permission_infobar_state =
- PermissionUpdateInfoBarDelegate::ShouldShowPermissionInfoBar(
- web_contents, content_settings_types);
- switch (show_permission_infobar_state) {
- case ShowPermissionInfoBarState::NO_NEED_TO_SHOW_PERMISSION_INFOBAR:
- controller->PromptAnsweredGroupedRequest(responses);
- return;
- case ShowPermissionInfoBarState::SHOW_PERMISSION_INFOBAR:
- PermissionUpdateInfoBarDelegate::Create(
- web_contents, content_settings_types,
- base::BindOnce(&MediaStreamDevicesController::AndroidOSPromptAnswered,
- std::move(controller), responses));
- return;
- case ShowPermissionInfoBarState::CANNOT_SHOW_PERMISSION_INFOBAR: {
- std::vector<ContentSetting> blocked_responses(responses.size(),
- CONTENT_SETTING_BLOCK);
- controller->PromptAnsweredGroupedRequest(blocked_responses);
- return;
- }
- }
-
- NOTREACHED() << "Unknown show permission infobar state.";
-#else
- controller->PromptAnsweredGroupedRequest(responses);
-#endif
-}
-
-#if defined(OS_ANDROID)
-// static
-void MediaStreamDevicesController::AndroidOSPromptAnswered(
- std::unique_ptr<MediaStreamDevicesController> controller,
- std::vector<ContentSetting> responses,
- bool android_prompt_granted) {
- if (!android_prompt_granted) {
- // Only permissions that were previously ALLOW for a site will have had
- // their android permissions requested. It's only in that case that we need
- // to change the setting to BLOCK to reflect that it wasn't allowed.
- for (size_t i = 0; i < responses.size(); ++i) {
- if (responses[i] == CONTENT_SETTING_ALLOW)
- responses[i] = CONTENT_SETTING_BLOCK;
- }
- }
-
- controller->PromptAnsweredGroupedRequest(responses);
-}
-#endif // defined(OS_ANDROID)
-
-// static
-void MediaStreamDevicesController::RegisterProfilePrefs(
- user_prefs::PrefRegistrySyncable* prefs) {
- prefs->RegisterBooleanPref(prefs::kVideoCaptureAllowed, true);
- prefs->RegisterBooleanPref(prefs::kAudioCaptureAllowed, true);
- prefs->RegisterListPref(prefs::kVideoCaptureAllowedUrls);
- prefs->RegisterListPref(prefs::kAudioCaptureAllowedUrls);
-}
-
-MediaStreamDevicesController::~MediaStreamDevicesController() {
- if (!callback_.is_null()) {
- std::move(callback_).Run(
- blink::MediaStreamDevices(),
- blink::mojom::MediaStreamRequestResult::FAILED_DUE_TO_SHUTDOWN,
- std::unique_ptr<content::MediaStreamUI>());
- }
-}
-
-void MediaStreamDevicesController::PromptAnsweredGroupedRequest(
- const std::vector<ContentSetting>& responses) {
- // The audio setting will always be the first one in the vector, if it was
- // requested.
- bool blocked_by_feature_policy = ShouldRequestAudio() || ShouldRequestVideo();
- if (ShouldRequestAudio()) {
- audio_setting_ = responses.front();
- blocked_by_feature_policy &=
- audio_setting_ == CONTENT_SETTING_BLOCK &&
- PermissionIsBlockedForReason(
- ContentSettingsType::MEDIASTREAM_MIC,
- permissions::PermissionStatusSource::FEATURE_POLICY);
- }
-
- if (ShouldRequestVideo()) {
- video_setting_ = responses.back();
- blocked_by_feature_policy &=
- video_setting_ == CONTENT_SETTING_BLOCK &&
- PermissionIsBlockedForReason(
- ContentSettingsType::MEDIASTREAM_CAMERA,
- permissions::PermissionStatusSource::FEATURE_POLICY);
- }
-
- for (ContentSetting response : responses) {
- if (response == CONTENT_SETTING_BLOCK)
- denial_reason_ =
- blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED;
- else if (response == CONTENT_SETTING_ASK)
- denial_reason_ =
- blink::mojom::MediaStreamRequestResult::PERMISSION_DISMISSED;
- }
-
- RunCallback(blocked_by_feature_policy);
-}
-
-MediaStreamDevicesController::MediaStreamDevicesController(
- content::WebContents* web_contents,
- const content::MediaStreamRequest& request,
- content::MediaResponseCallback callback)
- : web_contents_(web_contents),
- request_(request),
- callback_(std::move(callback)) {
- DCHECK(content::IsOriginSecure(request_.security_origin) ||
- request_.request_type == blink::MEDIA_OPEN_DEVICE_PEPPER_ONLY);
-
- profile_ = Profile::FromBrowserContext(web_contents->GetBrowserContext());
- content_settings_ = TabSpecificContentSettings::FromWebContents(web_contents);
-
- denial_reason_ = blink::mojom::MediaStreamRequestResult::OK;
- audio_setting_ = GetContentSetting(ContentSettingsType::MEDIASTREAM_MIC,
- request, &denial_reason_);
- video_setting_ = GetContentSetting(ContentSettingsType::MEDIASTREAM_CAMERA,
- request, &denial_reason_);
-}
-
-bool MediaStreamDevicesController::ShouldRequestAudio() const {
- return audio_setting_ == CONTENT_SETTING_ASK;
-}
-
-bool MediaStreamDevicesController::ShouldRequestVideo() const {
- return video_setting_ == CONTENT_SETTING_ASK;
-}
-
-blink::MediaStreamDevices MediaStreamDevicesController::GetDevices(
- ContentSetting audio_setting,
- ContentSetting video_setting) {
- bool audio_allowed = audio_setting == CONTENT_SETTING_ALLOW;
- bool video_allowed = video_setting == CONTENT_SETTING_ALLOW;
-
- if (!audio_allowed && !video_allowed)
- return blink::MediaStreamDevices();
-
- blink::MediaStreamDevices devices;
- switch (request_.request_type) {
- case blink::MEDIA_OPEN_DEVICE_PEPPER_ONLY: {
- const blink::MediaStreamDevice* device = NULL;
- // For open device request, when requested device_id is empty, pick
- // the first available of the given type. If requested device_id is
- // not empty, return the desired device if it's available. Otherwise,
- // return no device.
- if (audio_allowed &&
- request_.audio_type ==
- blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE) {
- DCHECK_EQ(blink::mojom::MediaStreamType::NO_SERVICE,
- request_.video_type);
- if (!request_.requested_audio_device_id.empty()) {
- device =
- MediaCaptureDevicesDispatcher::GetInstance()
- ->GetRequestedAudioDevice(request_.requested_audio_device_id);
- } else {
- device = MediaCaptureDevicesDispatcher::GetInstance()
- ->GetFirstAvailableAudioDevice();
- }
- } else if (video_allowed &&
- request_.video_type ==
- blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE) {
- DCHECK_EQ(blink::mojom::MediaStreamType::NO_SERVICE,
- request_.audio_type);
- // Pepper API opens only one device at a time.
- if (!request_.requested_video_device_id.empty()) {
- device =
- MediaCaptureDevicesDispatcher::GetInstance()
- ->GetRequestedVideoDevice(request_.requested_video_device_id);
- } else {
- device = MediaCaptureDevicesDispatcher::GetInstance()
- ->GetFirstAvailableVideoDevice();
- }
- }
- if (device)
- devices.push_back(*device);
- break;
- }
- case blink::MEDIA_GENERATE_STREAM: {
- bool get_default_audio_device = audio_allowed;
- bool get_default_video_device = video_allowed;
-
- // Get the exact audio or video device if an id is specified.
- if (audio_allowed && !request_.requested_audio_device_id.empty()) {
- const blink::MediaStreamDevice* audio_device =
- MediaCaptureDevicesDispatcher::GetInstance()
- ->GetRequestedAudioDevice(request_.requested_audio_device_id);
- if (audio_device) {
- devices.push_back(*audio_device);
- get_default_audio_device = false;
- }
- }
- if (video_allowed && !request_.requested_video_device_id.empty()) {
- const blink::MediaStreamDevice* video_device =
- MediaCaptureDevicesDispatcher::GetInstance()
- ->GetRequestedVideoDevice(request_.requested_video_device_id);
- if (video_device) {
- devices.push_back(*video_device);
- get_default_video_device = false;
- }
- }
-
- // If either or both audio and video devices were requested but not
- // specified by id, get the default devices.
- if (get_default_audio_device || get_default_video_device) {
- MediaCaptureDevicesDispatcher::GetInstance()
- ->GetDefaultDevicesForProfile(profile_, get_default_audio_device,
- get_default_video_device, &devices);
- }
- break;
- }
- case blink::MEDIA_DEVICE_ACCESS: {
- // Get the default devices for the request.
- MediaCaptureDevicesDispatcher::GetInstance()->GetDefaultDevicesForProfile(
- profile_, audio_allowed, video_allowed, &devices);
- break;
- }
- case blink::MEDIA_DEVICE_UPDATE: {
- NOTREACHED();
- break;
- }
- } // switch
-
- return devices;
-}
-
-void MediaStreamDevicesController::RunCallback(bool blocked_by_feature_policy) {
- CHECK(!callback_.is_null());
-
- // If the kill switch is, or the request was blocked because of feature
- // policy we don't update the tab context.
- if (denial_reason_ !=
- blink::mojom::MediaStreamRequestResult::KILL_SWITCH_ON &&
- !blocked_by_feature_policy) {
- UpdateTabSpecificContentSettings(audio_setting_, video_setting_);
- }
-
- blink::MediaStreamDevices devices;
-
- // If all requested permissions are allowed then the callback should report
- // success, otherwise we report |denial_reason_|.
- blink::mojom::MediaStreamRequestResult request_result =
- blink::mojom::MediaStreamRequestResult::OK;
- if ((audio_setting_ == CONTENT_SETTING_ALLOW ||
- audio_setting_ == CONTENT_SETTING_DEFAULT) &&
- (video_setting_ == CONTENT_SETTING_ALLOW ||
- video_setting_ == CONTENT_SETTING_DEFAULT)) {
- devices = GetDevices(audio_setting_, video_setting_);
- if (devices.empty()) {
- // Even if all requested permissions are allowed, if there are no devices
- // at this point we still report a failure.
- request_result = blink::mojom::MediaStreamRequestResult::NO_HARDWARE;
- }
- } else {
- DCHECK_NE(blink::mojom::MediaStreamRequestResult::OK, denial_reason_);
- request_result = denial_reason_;
- }
-
- std::unique_ptr<content::MediaStreamUI> ui;
- if (!devices.empty()) {
- ui = MediaCaptureDevicesDispatcher::GetInstance()
- ->GetMediaStreamCaptureIndicator()
- ->RegisterMediaStream(web_contents_, devices);
- }
- std::move(callback_).Run(devices, request_result, std::move(ui));
-}
-
-void MediaStreamDevicesController::UpdateTabSpecificContentSettings(
- ContentSetting audio_setting,
- ContentSetting video_setting) const {
- if (!content_settings_)
- return;
-
- TabSpecificContentSettings::MicrophoneCameraState microphone_camera_state =
- TabSpecificContentSettings::MICROPHONE_CAMERA_NOT_ACCESSED;
- std::string selected_audio_device;
- std::string selected_video_device;
- std::string requested_audio_device = request_.requested_audio_device_id;
- std::string requested_video_device = request_.requested_video_device_id;
-
- // TODO(raymes): Why do we use the defaults here for the selected devices?
- // Shouldn't we just use the devices that were actually selected?
- PrefService* prefs = Profile::FromBrowserContext(
- web_contents_->GetBrowserContext())->GetPrefs();
- if (audio_setting != CONTENT_SETTING_DEFAULT) {
- selected_audio_device =
- requested_audio_device.empty()
- ? prefs->GetString(prefs::kDefaultAudioCaptureDevice)
- : requested_audio_device;
- microphone_camera_state |=
- TabSpecificContentSettings::MICROPHONE_ACCESSED |
- (audio_setting == CONTENT_SETTING_ALLOW
- ? 0
- : TabSpecificContentSettings::MICROPHONE_BLOCKED);
- }
-
- if (video_setting != CONTENT_SETTING_DEFAULT) {
- selected_video_device =
- requested_video_device.empty()
- ? prefs->GetString(prefs::kDefaultVideoCaptureDevice)
- : requested_video_device;
- microphone_camera_state |=
- TabSpecificContentSettings::CAMERA_ACCESSED |
- (video_setting == CONTENT_SETTING_ALLOW
- ? 0
- : TabSpecificContentSettings::CAMERA_BLOCKED);
- }
-
- content_settings_->OnMediaStreamPermissionSet(
- PermissionManagerFactory::GetForProfile(profile_)->GetCanonicalOrigin(
- ContentSettingsType::MEDIASTREAM_CAMERA, request_.security_origin,
- web_contents_->GetLastCommittedURL()),
- microphone_camera_state, selected_audio_device, selected_video_device,
- requested_audio_device, requested_video_device);
-}
-
-ContentSetting MediaStreamDevicesController::GetContentSetting(
- ContentSettingsType content_type,
- const content::MediaStreamRequest& request,
- blink::mojom::MediaStreamRequestResult* denial_reason) const {
- DCHECK(content_type == ContentSettingsType::MEDIASTREAM_MIC ||
- content_type == ContentSettingsType::MEDIASTREAM_CAMERA);
- DCHECK(!request_.security_origin.is_empty());
- DCHECK(content::IsOriginSecure(request_.security_origin) ||
- request_.request_type == blink::MEDIA_OPEN_DEVICE_PEPPER_ONLY);
- if (!ContentTypeIsRequested(content_type, request)) {
- // No denial reason set as it will have been previously set.
- return CONTENT_SETTING_DEFAULT;
- }
-
- std::string device_id;
- if (content_type == ContentSettingsType::MEDIASTREAM_MIC)
- device_id = request.requested_audio_device_id;
- else
- device_id = request.requested_video_device_id;
- if (!HasAvailableDevices(content_type, device_id)) {
- *denial_reason = blink::mojom::MediaStreamRequestResult::NO_HARDWARE;
- return CONTENT_SETTING_BLOCK;
- }
-
- if (!IsUserAcceptAllowed(content_type)) {
- *denial_reason = blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED;
- return CONTENT_SETTING_BLOCK;
- }
-
- // Don't request if the kill switch is on.
- if (PermissionIsBlockedForReason(
- content_type, permissions::PermissionStatusSource::KILL_SWITCH)) {
- *denial_reason = blink::mojom::MediaStreamRequestResult::KILL_SWITCH_ON;
- return CONTENT_SETTING_BLOCK;
- }
-
- return CONTENT_SETTING_ASK;
-}
-
-bool MediaStreamDevicesController::IsUserAcceptAllowed(
- ContentSettingsType content_type) const {
-#if defined(OS_ANDROID)
- ui::WindowAndroid* window_android =
- web_contents_->GetNativeView()->GetWindowAndroid();
- if (!window_android)
- return false;
-
- std::vector<std::string> android_permissions;
- permissions::PermissionUtil::GetAndroidPermissionsForContentSetting(
- content_type, &android_permissions);
- for (const auto& android_permission : android_permissions) {
- if (!window_android->HasPermission(android_permission) &&
- !window_android->CanRequestPermission(android_permission)) {
- return false;
- }
- }
-
- // Don't approve device requests if the tab was hidden.
- // TODO(qinmin): Add a test for this. http://crbug.com/396869.
- // TODO(raymes): Shouldn't this apply to all permissions not just audio/video?
- return web_contents_->GetRenderWidgetHostView()->IsShowing();
-#endif
- return true;
-}
-
-bool MediaStreamDevicesController::PermissionIsBlockedForReason(
- ContentSettingsType content_type,
- permissions::PermissionStatusSource reason) const {
- // TODO(raymes): This function wouldn't be needed if
- // PermissionManager::RequestPermissions returned a denial reason.
- content::RenderFrameHost* rfh = content::RenderFrameHost::FromID(
- request_.render_process_id, request_.render_frame_id);
- permissions::PermissionResult result =
- PermissionManagerFactory::GetForProfile(profile_)
- ->GetPermissionStatusForFrame(content_type, rfh,
- request_.security_origin);
- if (result.source == reason) {
- DCHECK_EQ(CONTENT_SETTING_BLOCK, result.content_setting);
- return true;
- }
- return false;
-}
diff --git a/chromium/chrome/browser/media/webrtc/media_stream_devices_controller.h b/chromium/chrome/browser/media/webrtc/media_stream_devices_controller.h
deleted file mode 100644
index 07ef0cbccef..00000000000
--- a/chromium/chrome/browser/media/webrtc/media_stream_devices_controller.h
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_MEDIA_WEBRTC_MEDIA_STREAM_DEVICES_CONTROLLER_H_
-#define CHROME_BROWSER_MEDIA_WEBRTC_MEDIA_STREAM_DEVICES_CONTROLLER_H_
-
-#include <map>
-#include <string>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "build/build_config.h"
-#include "components/content_settings/core/common/content_settings.h"
-#include "content/public/browser/media_stream_request.h"
-#include "third_party/blink/public/common/mediastream/media_stream_request.h"
-#include "third_party/blink/public/mojom/mediastream/media_stream.mojom-shared.h"
-
-class MediaStreamDevicesController;
-class Profile;
-class TabSpecificContentSettings;
-
-namespace permissions {
-enum class PermissionStatusSource;
-}
-
-namespace content {
-class WebContents;
-}
-
-namespace user_prefs {
-class PrefRegistrySyncable;
-}
-
-namespace policy {
-class MediaStreamDevicesControllerBrowserTest;
-}
-
-namespace test {
-class MediaStreamDevicesControllerTestApi;
-}
-
-class MediaStreamDevicesController {
- public:
- static void RequestPermissions(const content::MediaStreamRequest& request,
- content::MediaResponseCallback callback);
-
- static void RequestAndroidPermissionsIfNeeded(
- content::WebContents* web_contents,
- std::unique_ptr<MediaStreamDevicesController> controller,
- bool did_prompt_for_audio,
- bool did_prompt_for_video,
- const std::vector<ContentSetting>& responses);
-
-#if defined(OS_ANDROID)
- // Called when the Android OS-level prompt is answered.
- static void AndroidOSPromptAnswered(
- std::unique_ptr<MediaStreamDevicesController> controller,
- std::vector<ContentSetting> responses,
- bool android_prompt_granted);
-#endif // defined(OS_ANDROID)
-
- // Registers the prefs backing the audio and video policies.
- static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
-
- ~MediaStreamDevicesController();
-
- // Called when a permission prompt is answered through the PermissionManager.
- void PromptAnsweredGroupedRequest(
- const std::vector<ContentSetting>& responses);
-
- private:
- friend class MediaStreamDevicesControllerTest;
- friend class test::MediaStreamDevicesControllerTestApi;
- friend class policy::MediaStreamDevicesControllerBrowserTest;
-
- MediaStreamDevicesController(content::WebContents* web_contents,
- const content::MediaStreamRequest& request,
- content::MediaResponseCallback callback);
-
- // Returns true if audio/video should be requested through the
- // PermissionManager. We won't try to request permission if the request is
- // already blocked for some other reason, e.g. there are no devices available.
- bool ShouldRequestAudio() const;
- bool ShouldRequestVideo() const;
-
- // Returns a list of devices available for the request for the given
- // audio/video permission settings.
- blink::MediaStreamDevices GetDevices(ContentSetting audio_setting,
- ContentSetting video_setting);
-
- // Runs |callback_| with the current audio/video permission settings.
- void RunCallback(bool blocked_by_feature_policy);
-
- // Called when the permission has been set to update the
- // TabSpecificContentSettings.
- void UpdateTabSpecificContentSettings(ContentSetting audio_setting,
- ContentSetting video_setting) const;
-
- // Returns the content settings for the given content type and request.
- ContentSetting GetContentSetting(
- ContentSettingsType content_type,
- const content::MediaStreamRequest& request,
- blink::mojom::MediaStreamRequestResult* denial_reason) const;
-
- // Returns true if clicking allow on the dialog should give access to the
- // requested devices.
- bool IsUserAcceptAllowed(ContentSettingsType content_type) const;
-
- bool PermissionIsBlockedForReason(
- ContentSettingsType content_type,
- permissions::PermissionStatusSource reason) const;
-
- // The current state of the audio/video content settings which may be updated
- // through the lifetime of the request.
- ContentSetting audio_setting_;
- ContentSetting video_setting_;
- blink::mojom::MediaStreamRequestResult denial_reason_;
-
- content::WebContents* web_contents_;
-
- // The owner of this class needs to make sure it does not outlive the profile.
- Profile* profile_;
-
- // Weak pointer to the tab specific content settings of the tab for which the
- // MediaStreamDevicesController was created. The tab specific content
- // settings are associated with a the web contents of the tab. The
- // MediaStreamDeviceController must not outlive the web contents for which it
- // was created.
- TabSpecificContentSettings* content_settings_;
-
- // The original request for access to devices.
- const content::MediaStreamRequest request_;
-
- // The callback that needs to be Run to notify WebRTC of whether access to
- // audio/video devices was granted or not.
- content::MediaResponseCallback callback_;
-
- DISALLOW_COPY_AND_ASSIGN(MediaStreamDevicesController);
-};
-
-#endif // CHROME_BROWSER_MEDIA_WEBRTC_MEDIA_STREAM_DEVICES_CONTROLLER_H_
diff --git a/chromium/chrome/browser/media/webrtc/media_stream_devices_controller_browsertest.cc b/chromium/chrome/browser/media/webrtc/media_stream_devices_controller_browsertest.cc
index ad88c0d1866..2f46debbeb0 100644
--- a/chromium/chrome/browser/media/webrtc/media_stream_devices_controller_browsertest.cc
+++ b/chromium/chrome/browser/media/webrtc/media_stream_devices_controller_browsertest.cc
@@ -10,11 +10,10 @@
#include "base/run_loop.h"
#include "base/stl_util.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
-#include "chrome/browser/content_settings/tab_specific_content_settings.h"
#include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
#include "chrome/browser/media/webrtc/media_stream_capture_indicator.h"
#include "chrome/browser/media/webrtc/media_stream_device_permissions.h"
-#include "chrome/browser/media/webrtc/media_stream_devices_controller.h"
+#include "chrome/browser/media/webrtc/permission_bubble_media_access_handler.h"
#include "chrome/browser/media/webrtc/webrtc_browsertest_base.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
@@ -22,6 +21,7 @@
#include "chrome/common/pref_names.h"
#include "chrome/common/webui_url_constants.h"
#include "chrome/test/base/ui_test_utils.h"
+#include "components/content_settings/browser/tab_specific_content_settings.h"
#include "components/content_settings/core/browser/host_content_settings_map.h"
#include "components/permissions/permission_context_base.h"
#include "components/permissions/permission_request.h"
@@ -31,12 +31,15 @@
#include "components/prefs/pref_service.h"
#include "components/variations/variations_associated_data.h"
#include "content/public/browser/render_frame_host.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/mock_render_process_host.h"
#include "extensions/common/constants.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/mediastream/media_stream_request.h"
+using content_settings::TabSpecificContentSettings;
+
class MediaStreamDevicesControllerTest : public WebRtcTestBase {
public:
MediaStreamDevicesControllerTest()
@@ -46,10 +49,10 @@ class MediaStreamDevicesControllerTest : public WebRtcTestBase {
blink::mojom::MediaStreamRequestResult::NUM_MEDIA_REQUEST_RESULTS) {
}
- // Dummy callback for when we deny the current request directly.
void OnMediaStreamResponse(const blink::MediaStreamDevices& devices,
blink::mojom::MediaStreamRequestResult result,
std::unique_ptr<content::MediaStreamUI> ui) {
+ EXPECT_EQ(devices.empty(), !ui);
media_stream_devices_ = devices;
media_stream_result_ = result;
quit_closure_.Run();
@@ -74,13 +77,15 @@ class MediaStreamDevicesControllerTest : public WebRtcTestBase {
}
void RequestPermissions(content::WebContents* web_contents,
- const content::MediaStreamRequest& request,
- content::MediaResponseCallback callback) {
+ const content::MediaStreamRequest& request) {
base::RunLoop run_loop;
ASSERT_TRUE(quit_closure_.is_null());
quit_closure_ = run_loop.QuitClosure();
- MediaStreamDevicesController::RequestPermissions(request,
- std::move(callback));
+ permission_bubble_media_access_handler_->HandleRequest(
+ web_contents, request,
+ base::BindOnce(&MediaStreamDevicesControllerTest::OnMediaStreamResponse,
+ base::Unretained(this)),
+ nullptr);
run_loop.Run();
}
@@ -149,7 +154,9 @@ class MediaStreamDevicesControllerTest : public WebRtcTestBase {
int render_frame_id = GetWebContents()->GetMainFrame()->GetRoutingID();
return content::MediaStreamRequest(
render_process_id, render_frame_id, 0, example_url(), false,
- request_type, audio_id, video_id, audio_type, video_type, false);
+ request_type, audio_id, video_id, audio_type, video_type,
+ /*disable_local_echo=*/false,
+ /*request_pan_tilt_zoom_permission=*/false);
}
content::MediaStreamRequest CreateRequest(const std::string& audio_id,
@@ -170,12 +177,26 @@ class MediaStreamDevicesControllerTest : public WebRtcTestBase {
return prompt_factory_.get();
}
- private:
+ void VerifyResultState(blink::mojom::MediaStreamRequestResult result,
+ bool has_audio,
+ bool has_video) {
+ EXPECT_EQ(result, media_stream_result());
+ EXPECT_EQ(has_audio,
+ CheckDevicesListContains(
+ blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE));
+ EXPECT_EQ(has_video,
+ CheckDevicesListContains(
+ blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE));
+ }
+
void SetUpOnMainThread() override {
WebRtcTestBase::SetUpOnMainThread();
ASSERT_TRUE(embedded_test_server()->Start());
+ permission_bubble_media_access_handler_ =
+ std::make_unique<PermissionBubbleMediaAccessHandler>();
+
permissions::PermissionRequestManager* manager =
permissions::PermissionRequestManager::FromWebContents(
browser()->tab_strip_model()->GetActiveWebContents());
@@ -205,6 +226,7 @@ class MediaStreamDevicesControllerTest : public WebRtcTestBase {
}
void TearDownOnMainThread() override {
+ permission_bubble_media_access_handler_.reset();
prompt_factory_.reset();
WebRtcTestBase::TearDownOnMainThread();
@@ -220,6 +242,9 @@ class MediaStreamDevicesControllerTest : public WebRtcTestBase {
base::Closure quit_closure_;
std::unique_ptr<permissions::MockPermissionPromptFactory> prompt_factory_;
+
+ std::unique_ptr<PermissionBubbleMediaAccessHandler>
+ permission_bubble_media_access_handler_;
};
// Request and allow microphone access.
@@ -230,10 +255,8 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, RequestAndAllowMic) {
// settings are updated.
prompt_factory()->set_response_type(
permissions::PermissionRequestManager::ACCEPT_ALL);
- RequestPermissions(
- GetWebContents(), CreateRequest(example_audio_id(), std::string()),
- base::BindOnce(&MediaStreamDevicesControllerTest::OnMediaStreamResponse,
- base::Unretained(this)));
+ RequestPermissions(GetWebContents(),
+ CreateRequest(example_audio_id(), std::string()));
EXPECT_TRUE(GetContentSettings()->IsContentAllowed(
ContentSettingsType::MEDIASTREAM_MIC));
@@ -259,10 +282,8 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, RequestAndAllowCam) {
// settings are updated.
prompt_factory()->set_response_type(
permissions::PermissionRequestManager::ACCEPT_ALL);
- RequestPermissions(
- GetWebContents(), CreateRequest(std::string(), example_video_id()),
- base::BindOnce(&MediaStreamDevicesControllerTest::OnMediaStreamResponse,
- base::Unretained(this)));
+ RequestPermissions(GetWebContents(),
+ CreateRequest(std::string(), example_video_id()));
EXPECT_TRUE(GetContentSettings()->IsContentAllowed(
ContentSettingsType::MEDIASTREAM_CAMERA));
@@ -288,10 +309,8 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, RequestAndBlockMic) {
// settings are updated.
prompt_factory()->set_response_type(
permissions::PermissionRequestManager::ACCEPT_ALL);
- RequestPermissions(
- GetWebContents(), CreateRequest(example_audio_id(), std::string()),
- base::BindOnce(&MediaStreamDevicesControllerTest::OnMediaStreamResponse,
- base::Unretained(this)));
+ RequestPermissions(GetWebContents(),
+ CreateRequest(example_audio_id(), std::string()));
EXPECT_FALSE(GetContentSettings()->IsContentAllowed(
ContentSettingsType::MEDIASTREAM_MIC));
@@ -318,10 +337,8 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, RequestAndBlockCam) {
// settings are updated.
prompt_factory()->set_response_type(
permissions::PermissionRequestManager::ACCEPT_ALL);
- RequestPermissions(
- GetWebContents(), CreateRequest(std::string(), example_video_id()),
- base::BindOnce(&MediaStreamDevicesControllerTest::OnMediaStreamResponse,
- base::Unretained(this)));
+ RequestPermissions(GetWebContents(),
+ CreateRequest(std::string(), example_video_id()));
EXPECT_FALSE(GetContentSettings()->IsContentAllowed(
ContentSettingsType::MEDIASTREAM_CAMERA));
@@ -350,10 +367,8 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
// settings are updated.
prompt_factory()->set_response_type(
permissions::PermissionRequestManager::ACCEPT_ALL);
- RequestPermissions(
- GetWebContents(), CreateRequest(example_audio_id(), example_video_id()),
- base::BindOnce(&MediaStreamDevicesControllerTest::OnMediaStreamResponse,
- base::Unretained(this)));
+ RequestPermissions(GetWebContents(),
+ CreateRequest(example_audio_id(), example_video_id()));
EXPECT_TRUE(GetContentSettings()->IsContentAllowed(
ContentSettingsType::MEDIASTREAM_MIC));
@@ -386,10 +401,8 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
// settings are updated.
prompt_factory()->set_response_type(
permissions::PermissionRequestManager::ACCEPT_ALL);
- RequestPermissions(
- GetWebContents(), CreateRequest(example_audio_id(), example_video_id()),
- base::BindOnce(&MediaStreamDevicesControllerTest::OnMediaStreamResponse,
- base::Unretained(this)));
+ RequestPermissions(GetWebContents(),
+ CreateRequest(example_audio_id(), example_video_id()));
EXPECT_FALSE(GetContentSettings()->IsContentAllowed(
ContentSettingsType::MEDIASTREAM_MIC));
@@ -425,10 +438,8 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
// settings are updated.
prompt_factory()->set_response_type(
permissions::PermissionRequestManager::ACCEPT_ALL);
- RequestPermissions(
- GetWebContents(), CreateRequest(example_audio_id(), example_video_id()),
- base::BindOnce(&MediaStreamDevicesControllerTest::OnMediaStreamResponse,
- base::Unretained(this)));
+ RequestPermissions(GetWebContents(),
+ CreateRequest(example_audio_id(), example_video_id()));
EXPECT_FALSE(GetContentSettings()->IsContentAllowed(
ContentSettingsType::MEDIASTREAM_MIC));
@@ -464,10 +475,8 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
// settings are updated.
prompt_factory()->set_response_type(
permissions::PermissionRequestManager::ACCEPT_ALL);
- RequestPermissions(
- GetWebContents(), CreateRequest(example_audio_id(), example_video_id()),
- base::BindOnce(&MediaStreamDevicesControllerTest::OnMediaStreamResponse,
- base::Unretained(this)));
+ RequestPermissions(GetWebContents(),
+ CreateRequest(example_audio_id(), example_video_id()));
EXPECT_FALSE(GetContentSettings()->IsContentAllowed(
ContentSettingsType::MEDIASTREAM_MIC));
@@ -503,10 +512,8 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
// settings are updated.
prompt_factory()->set_response_type(
permissions::PermissionRequestManager::ACCEPT_ALL);
- RequestPermissions(
- GetWebContents(), CreateRequest(example_audio_id(), std::string()),
- base::BindOnce(&MediaStreamDevicesControllerTest::OnMediaStreamResponse,
- base::Unretained(this)));
+ RequestPermissions(GetWebContents(),
+ CreateRequest(example_audio_id(), std::string()));
EXPECT_FALSE(GetContentSettings()->IsContentAllowed(
ContentSettingsType::MEDIASTREAM_MIC));
EXPECT_TRUE(GetContentSettings()->IsContentBlocked(
@@ -518,10 +525,8 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
// Request cam and allow
SetDevicePolicy(DEVICE_TYPE_VIDEO, ACCESS_ALLOWED);
- RequestPermissions(
- GetWebContents(), CreateRequest(std::string(), example_video_id()),
- base::BindOnce(&MediaStreamDevicesControllerTest::OnMediaStreamResponse,
- base::Unretained(this)));
+ RequestPermissions(GetWebContents(),
+ CreateRequest(std::string(), example_video_id()));
EXPECT_TRUE(GetContentSettings()->IsContentAllowed(
ContentSettingsType::MEDIASTREAM_CAMERA));
EXPECT_FALSE(GetContentSettings()->IsContentBlocked(
@@ -552,10 +557,8 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
// settings are updated.
prompt_factory()->set_response_type(
permissions::PermissionRequestManager::ACCEPT_ALL);
- RequestPermissions(
- GetWebContents(), CreateRequest(std::string(), example_video_id()),
- base::BindOnce(&MediaStreamDevicesControllerTest::OnMediaStreamResponse,
- base::Unretained(this)));
+ RequestPermissions(GetWebContents(),
+ CreateRequest(std::string(), example_video_id()));
EXPECT_TRUE(GetContentSettings()->IsContentAllowed(
ContentSettingsType::MEDIASTREAM_CAMERA));
EXPECT_FALSE(GetContentSettings()->IsContentBlocked(
@@ -587,10 +590,8 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
// settings are updated.
prompt_factory()->set_response_type(
permissions::PermissionRequestManager::ACCEPT_ALL);
- RequestPermissions(
- GetWebContents(), CreateRequest(example_audio_id(), std::string()),
- base::BindOnce(&MediaStreamDevicesControllerTest::OnMediaStreamResponse,
- base::Unretained(this)));
+ RequestPermissions(GetWebContents(),
+ CreateRequest(example_audio_id(), std::string()));
EXPECT_FALSE(GetContentSettings()->IsContentAllowed(
ContentSettingsType::MEDIASTREAM_MIC));
EXPECT_TRUE(GetContentSettings()->IsContentBlocked(
@@ -702,10 +703,8 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, ContentSettings) {
prompt_factory()->set_response_type(
permissions::PermissionRequestManager::NONE);
}
- RequestPermissions(
- GetWebContents(), CreateRequest(example_audio_id(), example_video_id()),
- base::BindOnce(&MediaStreamDevicesControllerTest::OnMediaStreamResponse,
- base::Unretained(this)));
+ RequestPermissions(GetWebContents(),
+ CreateRequest(example_audio_id(), example_video_id()));
ASSERT_LE(prompt_factory()->TotalRequestCount(), 2);
ASSERT_EQ(
@@ -719,13 +718,9 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, ContentSettings) {
// Check the media stream result is expected and the devices returned are
// expected;
- ASSERT_EQ(test.ExpectedMediaStreamResult(), media_stream_result());
- ASSERT_EQ(CheckDevicesListContains(
- blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE),
- test.ExpectMicAllowed() && test.ExpectCamAllowed());
- ASSERT_EQ(CheckDevicesListContains(
- blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE),
- test.ExpectMicAllowed() && test.ExpectCamAllowed());
+ VerifyResultState(test.ExpectedMediaStreamResult(),
+ test.ExpectMicAllowed() && test.ExpectCamAllowed(),
+ test.ExpectMicAllowed() && test.ExpectCamAllowed());
}
}
@@ -733,18 +728,12 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, ContentSettings) {
IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
WebUIRequestAndAllowCam) {
InitWithUrl(GURL(chrome::kChromeUIVersionURL));
- RequestPermissions(
- GetWebContents(), CreateRequest(std::string(), example_video_id()),
- base::BindOnce(&MediaStreamDevicesControllerTest::OnMediaStreamResponse,
- base::Unretained(this)));
+ RequestPermissions(GetWebContents(),
+ CreateRequest(std::string(), example_video_id()));
ASSERT_EQ(0, prompt_factory()->TotalRequestCount());
- ASSERT_EQ(blink::mojom::MediaStreamRequestResult::OK, media_stream_result());
- ASSERT_FALSE(CheckDevicesListContains(
- blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE));
- ASSERT_TRUE(CheckDevicesListContains(
- blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE));
+ VerifyResultState(blink::mojom::MediaStreamRequestResult::OK, false, true);
}
IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
@@ -756,36 +745,23 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
// Test that a prompt is required.
prompt_factory()->set_response_type(
permissions::PermissionRequestManager::ACCEPT_ALL);
- RequestPermissions(
- GetWebContents(), CreateRequest(example_audio_id(), example_video_id()),
- base::BindOnce(&MediaStreamDevicesControllerTest::OnMediaStreamResponse,
- base::Unretained(this)));
+ RequestPermissions(GetWebContents(),
+ CreateRequest(example_audio_id(), example_video_id()));
ASSERT_EQ(2, prompt_factory()->TotalRequestCount());
ASSERT_TRUE(prompt_factory()->RequestTypeSeen(
permissions::PermissionRequestType::PERMISSION_MEDIASTREAM_CAMERA));
ASSERT_TRUE(prompt_factory()->RequestTypeSeen(
permissions::PermissionRequestType::PERMISSION_MEDIASTREAM_MIC));
- // Accept the prompt.
- ASSERT_EQ(blink::mojom::MediaStreamRequestResult::OK, media_stream_result());
- ASSERT_TRUE(CheckDevicesListContains(
- blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE));
- ASSERT_TRUE(CheckDevicesListContains(
- blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE));
+ VerifyResultState(blink::mojom::MediaStreamRequestResult::OK, true, true);
// Check that re-requesting allows without prompting.
prompt_factory()->ResetCounts();
- RequestPermissions(
- GetWebContents(), CreateRequest(example_audio_id(), example_video_id()),
- base::BindOnce(&MediaStreamDevicesControllerTest::OnMediaStreamResponse,
- base::Unretained(this)));
+ RequestPermissions(GetWebContents(),
+ CreateRequest(example_audio_id(), example_video_id()));
ASSERT_EQ(0, prompt_factory()->TotalRequestCount());
- ASSERT_EQ(blink::mojom::MediaStreamRequestResult::OK, media_stream_result());
- ASSERT_TRUE(CheckDevicesListContains(
- blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE));
- ASSERT_TRUE(CheckDevicesListContains(
- blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE));
+ VerifyResultState(blink::mojom::MediaStreamRequestResult::OK, true, true);
}
IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
@@ -798,21 +774,15 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
RequestPermissions(
GetWebContents(),
CreateRequestWithType(example_audio_id(), example_video_id(),
- blink::MEDIA_OPEN_DEVICE_PEPPER_ONLY),
- base::BindOnce(&MediaStreamDevicesControllerTest::OnMediaStreamResponse,
- base::Unretained(this)));
+ blink::MEDIA_OPEN_DEVICE_PEPPER_ONLY));
ASSERT_EQ(0, prompt_factory()->TotalRequestCount());
- ASSERT_EQ(blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED,
- media_stream_result());
- ASSERT_FALSE(CheckDevicesListContains(
- blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE));
- ASSERT_FALSE(CheckDevicesListContains(
- blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE));
+ VerifyResultState(blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED,
+ false, false);
}
IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, WebContentsDestroyed) {
- InitWithUrl(GURL("http://www.example.com"));
+ InitWithUrl(embedded_test_server()->GetURL("/simple.html"));
prompt_factory()->set_response_type(
permissions::PermissionRequestManager::ACCEPT_ALL);
@@ -823,18 +793,49 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, WebContentsDestroyed) {
request.render_frame_id = 0;
request.render_process_id = 0;
- RequestPermissions(
- nullptr, request,
- base::BindOnce(&MediaStreamDevicesControllerTest::OnMediaStreamResponse,
- base::Unretained(this)));
+ RequestPermissions(nullptr, request);
ASSERT_EQ(0, prompt_factory()->TotalRequestCount());
- ASSERT_EQ(blink::mojom::MediaStreamRequestResult::FAILED_DUE_TO_SHUTDOWN,
- media_stream_result());
- ASSERT_FALSE(CheckDevicesListContains(
- blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE));
- ASSERT_FALSE(CheckDevicesListContains(
- blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE));
+ VerifyResultState(
+ blink::mojom::MediaStreamRequestResult::FAILED_DUE_TO_SHUTDOWN, false,
+ false);
+}
+
+IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
+ WebContentsDestroyedDuringRequest) {
+ InitWithUrl(embedded_test_server()->GetURL("/simple.html"));
+ ui_test_utils::NavigateToURLWithDisposition(
+ browser(), GURL("about:blank"), WindowOpenDisposition::NEW_BACKGROUND_TAB,
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
+
+ prompt_factory()->set_response_type(
+ permissions::PermissionRequestManager::ACCEPT_ALL);
+
+ content::WebContents* prompt_contents = GetWebContents();
+ const int prompt_contents_index =
+ browser()->tab_strip_model()->GetIndexOfWebContents(prompt_contents);
+
+ // Now request permissions, but before the callback is asynchronously called,
+ // destroy the tab.
+ permission_bubble_media_access_handler_->HandleRequest(
+ prompt_contents, CreateRequest(example_audio_id(), example_video_id()),
+ base::BindOnce([](const blink::MediaStreamDevices& devices,
+ blink::mojom::MediaStreamRequestResult result,
+ std::unique_ptr<content::MediaStreamUI> ui) {
+ ADD_FAILURE() << " this callback shouldn't be reached";
+ }),
+ nullptr);
+ // Since the mock prompt factory holds a reference to the
+ // PermissionRequestManager for the WebContents and uses that reference in its
+ // destructor, it has to be destroyed before the tab.
+ prompt_factory_.reset();
+ ASSERT_TRUE(browser()->tab_strip_model()->CloseWebContentsAt(
+ prompt_contents_index, TabStripModel::CloseTypes::CLOSE_USER_GESTURE));
+ base::RunLoop().RunUntilIdle();
+
+ VerifyResultState(
+ blink::mojom::MediaStreamRequestResult::NUM_MEDIA_REQUEST_RESULTS, false,
+ false);
}
// Request and block microphone and camera access with kill switch.
@@ -856,19 +857,12 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
InitWithUrl(embedded_test_server()->GetURL("/simple.html"));
SetDevicePolicy(DEVICE_TYPE_AUDIO, ACCESS_ALLOWED);
SetDevicePolicy(DEVICE_TYPE_VIDEO, ACCESS_ALLOWED);
- RequestPermissions(
- GetWebContents(), CreateRequest(example_audio_id(), example_video_id()),
- base::BindOnce(&MediaStreamDevicesControllerTest::OnMediaStreamResponse,
- base::Unretained(this)));
+ RequestPermissions(GetWebContents(),
+ CreateRequest(example_audio_id(), example_video_id()));
ASSERT_EQ(0, prompt_factory()->TotalRequestCount());
-
- ASSERT_EQ(blink::mojom::MediaStreamRequestResult::KILL_SWITCH_ON,
- media_stream_result());
- ASSERT_FALSE(CheckDevicesListContains(
- blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE));
- ASSERT_FALSE(CheckDevicesListContains(
- blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE));
+ VerifyResultState(blink::mojom::MediaStreamRequestResult::KILL_SWITCH_ON,
+ false, false);
}
IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
@@ -891,19 +885,12 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
// Make the child frame the source of the request.
request.render_process_id = child_frame->GetProcess()->GetID();
request.render_frame_id = child_frame->GetRoutingID();
- RequestPermissions(
- GetWebContents(), request,
- base::BindOnce(&MediaStreamDevicesControllerTest::OnMediaStreamResponse,
- base::Unretained(this)));
+ RequestPermissions(GetWebContents(), request);
ASSERT_EQ(0, prompt_factory()->TotalRequestCount());
- ASSERT_EQ(blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED,
- media_stream_result());
- ASSERT_FALSE(CheckDevicesListContains(
- blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE));
- ASSERT_FALSE(CheckDevicesListContains(
- blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE));
+ VerifyResultState(blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED,
+ false, false);
EXPECT_EQ(TabSpecificContentSettings::MICROPHONE_CAMERA_NOT_ACCESSED,
GetContentSettings()->GetMicrophoneCameraState());
}
@@ -928,19 +915,12 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
// Make the child frame the source of the request.
request.render_process_id = child_frame->GetProcess()->GetID();
request.render_frame_id = child_frame->GetRoutingID();
- RequestPermissions(
- GetWebContents(), request,
- base::BindOnce(&MediaStreamDevicesControllerTest::OnMediaStreamResponse,
- base::Unretained(this)));
+ RequestPermissions(GetWebContents(), request);
ASSERT_EQ(0, prompt_factory()->TotalRequestCount());
- ASSERT_EQ(blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED,
- media_stream_result());
- ASSERT_FALSE(CheckDevicesListContains(
- blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE));
- ASSERT_FALSE(CheckDevicesListContains(
- blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE));
+ VerifyResultState(blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED,
+ false, false);
EXPECT_EQ(TabSpecificContentSettings::MICROPHONE_CAMERA_NOT_ACCESSED,
GetContentSettings()->GetMicrophoneCameraState());
}
@@ -952,15 +932,8 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
RequestPermissions(
GetWebContents(),
CreateRequestWithType(example_audio_id(), std::string(),
- blink::MEDIA_OPEN_DEVICE_PEPPER_ONLY),
- base::BindOnce(&MediaStreamDevicesControllerTest::OnMediaStreamResponse,
- base::Unretained(this)));
-
- EXPECT_EQ(blink::mojom::MediaStreamRequestResult::OK, media_stream_result());
- EXPECT_TRUE(CheckDevicesListContains(
- blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE));
- EXPECT_FALSE(CheckDevicesListContains(
- blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE));
+ blink::MEDIA_OPEN_DEVICE_PEPPER_ONLY));
+ VerifyResultState(blink::mojom::MediaStreamRequestResult::OK, true, false);
}
IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
@@ -970,13 +943,6 @@ IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest,
RequestPermissions(
GetWebContents(),
CreateRequestWithType(std::string(), example_video_id(),
- blink::MEDIA_OPEN_DEVICE_PEPPER_ONLY),
- base::BindOnce(&MediaStreamDevicesControllerTest::OnMediaStreamResponse,
- base::Unretained(this)));
-
- EXPECT_EQ(blink::mojom::MediaStreamRequestResult::OK, media_stream_result());
- EXPECT_FALSE(CheckDevicesListContains(
- blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE));
- EXPECT_TRUE(CheckDevicesListContains(
- blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE));
+ blink::MEDIA_OPEN_DEVICE_PEPPER_ONLY));
+ VerifyResultState(blink::mojom::MediaStreamRequestResult::OK, false, true);
}
diff --git a/chromium/chrome/browser/media/webrtc/media_stream_infobar_browsertest.cc b/chromium/chrome/browser/media/webrtc/media_stream_infobar_browsertest.cc
index 542e453329d..49d5e62e258 100644
--- a/chromium/chrome/browser/media/webrtc/media_stream_infobar_browsertest.cc
+++ b/chromium/chrome/browser/media/webrtc/media_stream_infobar_browsertest.cc
@@ -7,7 +7,6 @@
#include "base/macros.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
-#include "chrome/browser/media/webrtc/media_stream_devices_controller.h"
#include "chrome/browser/media/webrtc/webrtc_browsertest_base.h"
#include "chrome/browser/media/webrtc/webrtc_browsertest_common.h"
#include "chrome/browser/profiles/profile.h"
@@ -23,6 +22,7 @@
#include "content/public/browser/notification_service.h"
#include "content/public/common/content_switches.h"
#include "content/public/common/origin_util.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "media/base/media_switches.h"
#include "net/dns/mock_host_resolver.h"
diff --git a/chromium/chrome/browser/media/webrtc/permission_bubble_media_access_handler.cc b/chromium/chrome/browser/media/webrtc/permission_bubble_media_access_handler.cc
index 50b1ffab023..dacacfb851b 100644
--- a/chromium/chrome/browser/media/webrtc/permission_bubble_media_access_handler.cc
+++ b/chromium/chrome/browser/media/webrtc/permission_bubble_media_access_handler.cc
@@ -12,14 +12,19 @@
#include "base/metrics/field_trial.h"
#include "base/task/post_task.h"
#include "build/build_config.h"
+#include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
+#include "chrome/browser/media/webrtc/media_stream_capture_indicator.h"
#include "chrome/browser/media/webrtc/media_stream_device_permissions.h"
-#include "chrome/browser/media/webrtc/media_stream_devices_controller.h"
#include "chrome/browser/permissions/permission_manager_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/pref_names.h"
+#include "components/content_settings/browser/tab_specific_content_settings.h"
#include "components/content_settings/core/browser/host_content_settings_map.h"
#include "components/permissions/permission_manager.h"
#include "components/permissions/permission_result.h"
+#include "components/pref_registry/pref_registry_syncable.h"
+#include "components/prefs/pref_service.h"
+#include "components/webrtc/media_stream_devices_controller.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/notification_service.h"
@@ -53,6 +58,69 @@ using RepeatingMediaResponseCallback =
using system_media_permissions::SystemPermission;
#endif
+namespace {
+
+void UpdateTabSpecificContentSettings(
+ content::WebContents* web_contents,
+ const content::MediaStreamRequest& request,
+ ContentSetting audio_setting,
+ ContentSetting video_setting) {
+ if (!web_contents)
+ return;
+
+ auto* content_settings =
+ content_settings::TabSpecificContentSettings::FromWebContents(
+ web_contents);
+ if (!content_settings)
+ return;
+
+ content_settings::TabSpecificContentSettings::MicrophoneCameraState
+ microphone_camera_state = content_settings::TabSpecificContentSettings::
+ MICROPHONE_CAMERA_NOT_ACCESSED;
+ std::string selected_audio_device;
+ std::string selected_video_device;
+ std::string requested_audio_device = request.requested_audio_device_id;
+ std::string requested_video_device = request.requested_video_device_id;
+
+ // TODO(raymes): Why do we use the defaults here for the selected devices?
+ // Shouldn't we just use the devices that were actually selected?
+ Profile* profile =
+ Profile::FromBrowserContext(web_contents->GetBrowserContext());
+ if (audio_setting != CONTENT_SETTING_DEFAULT) {
+ selected_audio_device =
+ requested_audio_device.empty()
+ ? profile->GetPrefs()->GetString(prefs::kDefaultAudioCaptureDevice)
+ : requested_audio_device;
+ microphone_camera_state |=
+ content_settings::TabSpecificContentSettings::MICROPHONE_ACCESSED |
+ (audio_setting == CONTENT_SETTING_ALLOW
+ ? 0
+ : content_settings::TabSpecificContentSettings::
+ MICROPHONE_BLOCKED);
+ }
+
+ if (video_setting != CONTENT_SETTING_DEFAULT) {
+ selected_video_device =
+ requested_video_device.empty()
+ ? profile->GetPrefs()->GetString(prefs::kDefaultVideoCaptureDevice)
+ : requested_video_device;
+ microphone_camera_state |=
+ content_settings::TabSpecificContentSettings::CAMERA_ACCESSED |
+ (video_setting == CONTENT_SETTING_ALLOW
+ ? 0
+ : content_settings::TabSpecificContentSettings::CAMERA_BLOCKED);
+ }
+
+ content_settings->OnMediaStreamPermissionSet(
+ PermissionManagerFactory::GetForProfile(profile)->GetCanonicalOrigin(
+ ContentSettingsType::MEDIASTREAM_CAMERA, request.security_origin,
+ web_contents->GetLastCommittedURL()),
+ microphone_camera_state, selected_audio_device, selected_video_device,
+ requested_audio_device, requested_video_device);
+}
+
+} // namespace
+
struct PermissionBubbleMediaAccessHandler::PendingAccessRequest {
PendingAccessRequest(const content::MediaStreamRequest& request,
RepeatingMediaResponseCallback callback)
@@ -175,10 +243,11 @@ void PermissionBubbleMediaAccessHandler::ProcessQueuedAccessRequest(
}
#endif
- MediaStreamDevicesController::RequestPermissions(
- request, base::BindOnce(
- &PermissionBubbleMediaAccessHandler::OnAccessRequestResponse,
- base::Unretained(this), web_contents, request_id));
+ webrtc::MediaStreamDevicesController::RequestPermissions(
+ request, MediaCaptureDevicesDispatcher::GetInstance(),
+ base::BindOnce(
+ &PermissionBubbleMediaAccessHandler::OnMediaStreamRequestResponse,
+ base::Unretained(this), web_contents, request_id, request));
}
void PermissionBubbleMediaAccessHandler::UpdateMediaRequestState(
@@ -210,6 +279,47 @@ void PermissionBubbleMediaAccessHandler::UpdateMediaRequestState(
}
}
+// static
+void PermissionBubbleMediaAccessHandler::RegisterProfilePrefs(
+ user_prefs::PrefRegistrySyncable* prefs) {
+ prefs->RegisterBooleanPref(prefs::kVideoCaptureAllowed, true);
+ prefs->RegisterBooleanPref(prefs::kAudioCaptureAllowed, true);
+ prefs->RegisterListPref(prefs::kVideoCaptureAllowedUrls);
+ prefs->RegisterListPref(prefs::kAudioCaptureAllowedUrls);
+}
+
+void PermissionBubbleMediaAccessHandler::OnMediaStreamRequestResponse(
+ content::WebContents* web_contents,
+ int request_id,
+ content::MediaStreamRequest request,
+ const blink::MediaStreamDevices& devices,
+ blink::mojom::MediaStreamRequestResult result,
+ bool blocked_by_feature_policy,
+ ContentSetting audio_setting,
+ ContentSetting video_setting) {
+ if (pending_requests_.find(web_contents) == pending_requests_.end()) {
+ // WebContents has been destroyed. Don't need to do anything.
+ return;
+ }
+
+ // If the kill switch is, or the request was blocked because of feature
+ // policy we don't update the tab context.
+ if (result != blink::mojom::MediaStreamRequestResult::KILL_SWITCH_ON &&
+ !blocked_by_feature_policy) {
+ UpdateTabSpecificContentSettings(web_contents, request, audio_setting,
+ video_setting);
+ }
+
+ std::unique_ptr<content::MediaStreamUI> ui;
+ if (!devices.empty()) {
+ ui = MediaCaptureDevicesDispatcher::GetInstance()
+ ->GetMediaStreamCaptureIndicator()
+ ->RegisterMediaStream(web_contents, devices);
+ }
+ OnAccessRequestResponse(web_contents, request_id, devices, result,
+ std::move(ui));
+}
+
void PermissionBubbleMediaAccessHandler::OnAccessRequestResponse(
content::WebContents* web_contents,
int request_id,
diff --git a/chromium/chrome/browser/media/webrtc/permission_bubble_media_access_handler.h b/chromium/chrome/browser/media/webrtc/permission_bubble_media_access_handler.h
index 53da4bb7a94..dabea7e16a4 100644
--- a/chromium/chrome/browser/media/webrtc/permission_bubble_media_access_handler.h
+++ b/chromium/chrome/browser/media/webrtc/permission_bubble_media_access_handler.h
@@ -9,10 +9,15 @@
#include "base/memory/weak_ptr.h"
#include "chrome/browser/media/media_access_handler.h"
+#include "components/content_settings/core/common/content_settings.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "third_party/blink/public/mojom/mediastream/media_stream.mojom-shared.h"
+namespace user_prefs {
+class PrefRegistrySyncable;
+}
+
// MediaAccessHandler for permission bubble requests.
class PermissionBubbleMediaAccessHandler
: public MediaAccessHandler,
@@ -40,12 +45,24 @@ class PermissionBubbleMediaAccessHandler
blink::mojom::MediaStreamType stream_type,
content::MediaRequestState state) override;
+ // Registers the prefs backing the audio and video policies.
+ static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
+
private:
struct PendingAccessRequest;
using RequestsMap = std::map<int, PendingAccessRequest>;
using RequestsMaps = std::map<content::WebContents*, RequestsMap>;
void ProcessQueuedAccessRequest(content::WebContents* web_contents);
+ void OnMediaStreamRequestResponse(
+ content::WebContents* web_contents,
+ int request_id,
+ content::MediaStreamRequest request,
+ const blink::MediaStreamDevices& devices,
+ blink::mojom::MediaStreamRequestResult result,
+ bool blocked_by_feature_policy,
+ ContentSetting audio_setting,
+ ContentSetting video_setting);
void OnAccessRequestResponse(content::WebContents* web_contents,
int request_id,
const blink::MediaStreamDevices& devices,
diff --git a/chromium/chrome/browser/media/webrtc/system_media_capture_permissions_mac.mm b/chromium/chrome/browser/media/webrtc/system_media_capture_permissions_mac.mm
index 5e1d1bf2002..a75a5545edb 100644
--- a/chromium/chrome/browser/media/webrtc/system_media_capture_permissions_mac.mm
+++ b/chromium/chrome/browser/media/webrtc/system_media_capture_permissions_mac.mm
@@ -35,6 +35,7 @@
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "media/base/media_switches.h"
+#include "ui/base/cocoa/permissions_utils.h"
namespace system_media_permissions {
@@ -175,37 +176,9 @@ bool IsScreenCaptureAllowed() {
features::kMacSystemScreenCapturePermissionCheck)) {
return true;
}
-
- base::ScopedCFTypeRef<CFArrayRef> window_list(
- CGWindowListCopyWindowInfo(kCGWindowListOptionAll, kCGNullWindowID));
- int current_pid = [[NSProcessInfo processInfo] processIdentifier];
- for (NSDictionary* window in base::mac::CFToNSCast(window_list.get())) {
- NSNumber* window_pid =
- [window objectForKey:base::mac::CFToNSCast(kCGWindowOwnerPID)];
- if (!window_pid || [window_pid integerValue] == current_pid)
- continue;
-
- NSString* window_name =
- [window objectForKey:base::mac::CFToNSCast(kCGWindowName)];
- if (!window_name)
- continue;
-
- NSNumber* layer =
- [window objectForKey:base::mac::CFToNSCast(kCGWindowLayer)];
- if (!layer)
- continue;
-
- NSInteger layer_integer = [layer integerValue];
- if (layer_integer == CGWindowLevelForKey(kCGNormalWindowLevelKey) ||
- layer_integer == CGWindowLevelForKey(kCGDockWindowLevelKey)) {
- return true;
- }
- }
- return false;
}
- // Screen capture is always allowed in older macOS versions.
- return true;
+ return ui::IsScreenCaptureAllowed();
}
} // namespace
diff --git a/chromium/chrome/browser/media/webrtc/test_stats_dictionary.cc b/chromium/chrome/browser/media/webrtc/test_stats_dictionary.cc
index a02c385a068..91fbd4b94c0 100644
--- a/chromium/chrome/browser/media/webrtc/test_stats_dictionary.cc
+++ b/chromium/chrome/browser/media/webrtc/test_stats_dictionary.cc
@@ -4,8 +4,8 @@
#include "chrome/browser/media/webrtc/test_stats_dictionary.h"
+#include "base/check.h"
#include "base/json/json_writer.h"
-#include "base/logging.h"
namespace content {
diff --git a/chromium/chrome/browser/media/webrtc/test_stats_dictionary_unittest.cc b/chromium/chrome/browser/media/webrtc/test_stats_dictionary_unittest.cc
index 51bfa1630bc..a251a76823e 100644
--- a/chromium/chrome/browser/media/webrtc/test_stats_dictionary_unittest.cc
+++ b/chromium/chrome/browser/media/webrtc/test_stats_dictionary_unittest.cc
@@ -8,8 +8,8 @@
#include <set>
#include <vector>
+#include "base/check.h"
#include "base/json/json_reader.h"
-#include "base/logging.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/values.h"
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_apprtc_browsertest.cc b/chromium/chrome/browser/media/webrtc/webrtc_apprtc_browsertest.cc
index d6c52c727a2..3c8554aac21 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_apprtc_browsertest.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_apprtc_browsertest.cc
@@ -20,6 +20,7 @@
#include "chrome/test/base/ui_test_utils.h"
#include "components/permissions/permission_request_manager.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "media/base/media_switches.h"
#include "net/test/python_utils.h"
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_browsertest.cc b/chromium/chrome/browser/media/webrtc/webrtc_browsertest.cc
index 883a2821bd1..0165ea1cc6a 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_browsertest.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_browsertest.cc
@@ -17,6 +17,7 @@
#include "content/public/browser/network_service_instance.h"
#include "content/public/common/content_switches.h"
#include "content/public/common/network_service_util.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "media/base/media_switches.h"
#include "mojo/public/cpp/bindings/remote.h"
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_desktop_capture_browsertest.cc b/chromium/chrome/browser/media/webrtc/webrtc_desktop_capture_browsertest.cc
index b306be0be94..bc9cfa24d4d 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_desktop_capture_browsertest.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_desktop_capture_browsertest.cc
@@ -13,6 +13,7 @@
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "media/base/media_switches.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_disable_encryption_flag_browsertest.cc b/chromium/chrome/browser/media/webrtc/webrtc_disable_encryption_flag_browsertest.cc
index 47b9a0d487d..ad67e37d4c3 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_disable_encryption_flag_browsertest.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_disable_encryption_flag_browsertest.cc
@@ -10,6 +10,7 @@
#include "chrome/common/channel_info.h"
#include "components/version_info/version_info.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "media/base/media_switches.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_common_unittest.cc b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_common_unittest.cc
index 23afb746bae..3652333ba1f 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_common_unittest.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_common_unittest.cc
@@ -384,7 +384,7 @@ TEST_P(LogFileWriterTest, CallToWriteWithEmptyStringSucceeds) {
auto writer = CreateWriter(kMaxRemoteLogFileSizeBytes);
ASSERT_TRUE(writer);
- const std::string log = "";
+ const std::string log;
EXPECT_TRUE(writer->Write(log));
ASSERT_TRUE(writer->Close());
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_keyed_service.cc b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_keyed_service.cc
index ec5401e454a..a5524b4d601 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_keyed_service.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_keyed_service.cc
@@ -5,7 +5,7 @@
#include "chrome/browser/media/webrtc/webrtc_event_log_manager_keyed_service.h"
#include "base/callback_forward.h"
-#include "base/logging.h"
+#include "base/check.h"
#include "chrome/browser/media/webrtc/webrtc_event_log_manager.h"
#include "content/public/browser/browser_context.h"
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_keyed_service_factory.cc b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_keyed_service_factory.cc
index 5660683eebe..66b610544a1 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_keyed_service_factory.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_keyed_service_factory.cc
@@ -4,7 +4,7 @@
#include "chrome/browser/media/webrtc/webrtc_event_log_manager_keyed_service_factory.h"
-#include "base/logging.h"
+#include "base/check.h"
#include "chrome/browser/media/webrtc/webrtc_event_log_manager_keyed_service.h"
#include "components/keyed_service/content/browser_context_dependency_manager.h"
#include "content/public/browser/browser_context.h"
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_unittest_helpers.cc b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_unittest_helpers.cc
index 30fb9113e19..9fbb6b2e2de 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_unittest_helpers.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_event_log_manager_unittest_helpers.cc
@@ -4,8 +4,9 @@
#include "chrome/browser/media/webrtc/webrtc_event_log_manager_unittest_helpers.h"
+#include "base/check.h"
#include "base/files/file_util.h"
-#include "base/logging.h"
+#include "base/notreached.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace webrtc_event_logging {
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc b/chromium/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc
index be5c5c0bd74..b497841a433 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc
@@ -10,6 +10,7 @@
#include "chrome/common/chrome_switches.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "media/base/media_switches.h"
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_getmediadevices_browsertest.cc b/chromium/chrome/browser/media/webrtc/webrtc_getmediadevices_browsertest.cc
index 4e0c5b525f6..85232dea563 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_getmediadevices_browsertest.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_getmediadevices_browsertest.cc
@@ -22,6 +22,7 @@
#include "content/public/browser/browsing_data_remover.h"
#include "content/public/common/content_features.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/browsing_data_remover_test_util.h"
#include "media/audio/audio_device_description.h"
@@ -74,18 +75,15 @@ class WebRtcGetMediaDevicesBrowserTest
std::string devices_as_json = ExecuteJavascript("enumerateDevices()", tab);
EXPECT_FALSE(devices_as_json.empty());
- int error_code;
- std::string error_message;
- std::unique_ptr<base::Value> value =
- base::JSONReader::ReadAndReturnErrorDeprecated(
- devices_as_json, base::JSON_ALLOW_TRAILING_COMMAS, &error_code,
- &error_message);
+ base::JSONReader::ValueWithError parsed_json =
+ base::JSONReader::ReadAndReturnValueWithError(
+ devices_as_json, base::JSON_ALLOW_TRAILING_COMMAS);
- ASSERT_TRUE(value.get() != NULL) << error_message;
- EXPECT_EQ(value->type(), base::Value::Type::LIST);
+ ASSERT_TRUE(parsed_json.value) << parsed_json.error_message;
+ EXPECT_EQ(parsed_json.value->type(), base::Value::Type::LIST);
base::ListValue* values;
- ASSERT_TRUE(value->GetAsList(&values));
+ ASSERT_TRUE(parsed_json.value->GetAsList(&values));
ASSERT_FALSE(values->empty());
bool found_audio_input = false;
bool found_video_input = false;
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_internals_integration_browsertest.cc b/chromium/chrome/browser/media/webrtc/webrtc_internals_integration_browsertest.cc
index 8d930d2a051..bf4de4f39f0 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_internals_integration_browsertest.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_internals_integration_browsertest.cc
@@ -11,6 +11,7 @@
#include "chrome/browser/media/webrtc/webrtc_event_log_manager.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "media/base/media_switches.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "testing/gtest/include/gtest/gtest.h"
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_internals_perf_browsertest.cc b/chromium/chrome/browser/media/webrtc/webrtc_internals_perf_browsertest.cc
index a6fdde29865..ab809718d7e 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_internals_perf_browsertest.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_internals_perf_browsertest.cc
@@ -24,6 +24,7 @@
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "media/base/media_switches.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_log_buffer.cc b/chromium/chrome/browser/media/webrtc/webrtc_log_buffer.cc
index 14e87d6621d..b6a96770773 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_log_buffer.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_log_buffer.cc
@@ -4,7 +4,7 @@
#include "chrome/browser/media/webrtc/webrtc_log_buffer.h"
-#include "base/logging.h"
+#include "base/check_op.h"
WebRtcLogBuffer::WebRtcLogBuffer()
: buffer_(),
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_log_uploader_unittest.cc b/chromium/chrome/browser/media/webrtc/webrtc_log_uploader_unittest.cc
index b00d4b99f1a..6aa2a76c11f 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_log_uploader_unittest.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_log_uploader_unittest.cc
@@ -14,7 +14,6 @@
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/files/scoped_temp_dir.h"
-#include "base/logging.h"
#include "base/run_loop.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_split.h"
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_logging_controller.cc b/chromium/chrome/browser/media/webrtc/webrtc_logging_controller.cc
index 8a11beeab8a..8caf1d7fe01 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_logging_controller.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_logging_controller.cc
@@ -22,7 +22,6 @@
#include "components/webrtc_logging/browser/text_log_list.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/render_process_host.h"
-#include "services/service_manager/public/cpp/connector.h"
#if defined(OS_LINUX) || defined(OS_CHROMEOS)
#include "content/public/browser/child_process_security_policy.h"
@@ -492,9 +491,14 @@ void WebRtcLoggingController::DoUploadLogAndRtpDumps(
base::UmaHistogramSparse("WebRtcTextLogging.UploadFailureReason",
WebRtcLogUploadFailureReason::kInvalidState);
}
- base::SequencedTaskRunnerHandle::Get()->PostTask(
- FROM_HERE, base::BindOnce(callback, false, "",
- "Logging not stopped or no log open."));
+
+ // Do not fire callback if it is null. Nesting null callbacks is not
+ // allowed, as it can lead to crashes. See https://crbug.com/1071475
+ if (!callback.is_null()) {
+ base::SequencedTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE, base::BindOnce(callback, false, "",
+ "Logging not stopped or no log open."));
+ }
return;
}
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_pan_tilt_zoom_browsertest.cc b/chromium/chrome/browser/media/webrtc/webrtc_pan_tilt_zoom_browsertest.cc
new file mode 100644
index 00000000000..b8a3e81f925
--- /dev/null
+++ b/chromium/chrome/browser/media/webrtc/webrtc_pan_tilt_zoom_browsertest.cc
@@ -0,0 +1,103 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+
+#include "base/strings/stringprintf.h"
+#include "chrome/browser/media/webrtc/webrtc_browsertest_base.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
+#include "content/public/test/browser_test_utils.h"
+
+namespace {
+
+struct TestConfig {
+ const char* constraints;
+ const char* expected_microphone;
+ const char* expected_camera;
+ const char* expected_pan_tilt_zoom;
+};
+
+static const char kMainHtmlPage[] = "/webrtc/webrtc_pan_tilt_zoom_test.html";
+
+} // namespace
+
+class WebRtcPanTiltZoomBrowserTest
+ : public WebRtcTestBase,
+ public testing::WithParamInterface<TestConfig> {
+ public:
+ void SetUpCommandLine(base::CommandLine* command_line) override {
+ command_line->AppendSwitchASCII(switches::kEnableBlinkFeatures,
+ "MediaCapturePanTilt");
+ }
+
+ void SetUpInProcessBrowserTestFixture() override {
+ DetectErrorsInJavaScript();
+ }
+};
+
+IN_PROC_BROWSER_TEST_P(WebRtcPanTiltZoomBrowserTest,
+ TestRequestPanTiltZoomPermission) {
+ ASSERT_TRUE(embedded_test_server()->Start());
+ content::WebContents* tab = OpenTestPageInNewTab(kMainHtmlPage);
+
+ std::string result;
+ EXPECT_TRUE(content::ExecuteScriptAndExtractString(
+ tab->GetMainFrame(),
+ base::StringPrintf("runGetUserMedia(%s);", GetParam().constraints),
+ &result));
+ EXPECT_EQ(result, "runGetUserMedia-success");
+
+ std::string microphone;
+ EXPECT_TRUE(content::ExecuteScriptAndExtractString(
+ tab->GetMainFrame(), "getMicrophonePermission();", &microphone));
+ EXPECT_EQ(microphone, GetParam().expected_microphone);
+
+ std::string camera;
+ EXPECT_TRUE(content::ExecuteScriptAndExtractString(
+ tab->GetMainFrame(), "getCameraPermission();", &camera));
+ EXPECT_EQ(camera, GetParam().expected_camera);
+
+ std::string pan_tilt_zoom;
+ EXPECT_TRUE(content::ExecuteScriptAndExtractString(
+ tab->GetMainFrame(), "getPanTiltZoomPermission();", &pan_tilt_zoom));
+ EXPECT_EQ(pan_tilt_zoom, GetParam().expected_pan_tilt_zoom);
+}
+
+INSTANTIATE_TEST_SUITE_P(
+ RequestPanTiltZoomPermission,
+ WebRtcPanTiltZoomBrowserTest,
+ testing::Values(
+ TestConfig{"{ video: true }", "prompt", "granted", "prompt"},
+ TestConfig{"{ audio: true }", "granted", "prompt", "prompt"},
+ TestConfig{"{ audio: true, video: true }", "granted", "granted",
+ "prompt"},
+ TestConfig{"{ video: { pan : {} } }", "prompt", "granted", "prompt"},
+ TestConfig{"{ video: { tilt : {} } }", "prompt", "granted", "prompt"},
+ TestConfig{"{ video: { zoom : {} } }", "prompt", "granted", "prompt"},
+ TestConfig{"{ video: { advanced: [{ pan : {} }] } }", "prompt",
+ "granted", "prompt"},
+ TestConfig{"{ video: { advanced: [{ tilt : {} }] } }", "prompt",
+ "granted", "prompt"},
+ TestConfig{"{ video: { advanced: [{ zoom : {} }] } }", "prompt",
+ "granted", "prompt"},
+ TestConfig{"{ audio: { pan : {} } }", "granted", "prompt", "prompt"},
+ TestConfig{"{ audio: { tilt : {} } }", "granted", "prompt", "prompt"},
+ TestConfig{"{ audio: { zoom : {} } }", "granted", "prompt", "prompt"},
+ TestConfig{"{ video: { pan : 1 } }", "prompt", "granted", "granted"},
+ TestConfig{"{ video: { tilt : 1 } }", "prompt", "granted", "granted"},
+ TestConfig{"{ video: { zoom : 1 } }", "prompt", "granted", "granted"},
+ TestConfig{"{ video: { advanced: [{ pan : 1 }] } }", "prompt",
+ "granted", "granted"},
+ TestConfig{"{ video: { advanced: [{ tilt : 1 }] } }", "prompt",
+ "granted", "granted"},
+ TestConfig{"{ video: { advanced: [{ zoom : 1 }] } }", "prompt",
+ "granted", "granted"},
+ TestConfig{"{ audio: true, video: { pan : 1 } }", "granted", "granted",
+ "granted"},
+ TestConfig{"{ audio: true, video: { tilt : 1 } }", "granted", "granted",
+ "granted"},
+ TestConfig{"{ audio: true, video: { zoom : 1 } }", "granted", "granted",
+ "granted"}));
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_simulcast_browsertest.cc b/chromium/chrome/browser/media/webrtc/webrtc_simulcast_browsertest.cc
index 9170629d897..b98d937895c 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_simulcast_browsertest.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_simulcast_browsertest.cc
@@ -17,6 +17,7 @@
#include "content/public/browser/notification_service.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "media/base/media_switches.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_stats_perf_browsertest.cc b/chromium/chrome/browser/media/webrtc/webrtc_stats_perf_browsertest.cc
index 54ad5dd1af3..06213998515 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_stats_perf_browsertest.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_stats_perf_browsertest.cc
@@ -13,6 +13,7 @@
#include "chrome/browser/media/webrtc/webrtc_browsertest_base.h"
#include "chrome/browser/media/webrtc/webrtc_browsertest_common.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "media/base/media_switches.h"
#include "testing/perf/perf_test.h"
#include "third_party/blink/public/common/features.h"
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_text_log_handler.cc b/chromium/chrome/browser/media/webrtc/webrtc_text_log_handler.cc
index 28153db2eb8..dd27ecc5f0f 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_text_log_handler.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_text_log_handler.cc
@@ -10,10 +10,11 @@
#include <vector>
#include "base/bind.h"
+#include "base/check_op.h"
#include "base/cpu.h"
#include "base/feature_list.h"
-#include "base/logging.h"
#include "base/metrics/histogram_functions.h"
+#include "base/notreached.h"
#include "base/strings/strcat.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h"
@@ -487,10 +488,7 @@ void WebRtcTextLogHandler::OnGetNetworkInterfaceList(
features::kAudioServiceLaunchOnStartup),
", Sandbox=",
enabled_or_disabled_bool_string(
- service_manager::IsAudioSandboxEnabled()),
- ", ApmInAudioService=",
- enabled_or_disabled_bool_string(
- media::IsWebRtcApmInAudioServiceEnabled())}));
+ service_manager::IsAudioSandboxEnabled())}));
// Audio manager
// On some platforms, this can vary depending on build flags and failure
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc b/chromium/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc
index 10ad09dcd40..f99836a0f2e 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc
@@ -18,6 +18,7 @@
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "media/base/media_switches.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_video_high_bitrate_browsertest.cc b/chromium/chrome/browser/media/webrtc/webrtc_video_high_bitrate_browsertest.cc
index 14e42e44227..14a7b411abe 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_video_high_bitrate_browsertest.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_video_high_bitrate_browsertest.cc
@@ -11,6 +11,7 @@
#include "chrome/browser/media/webrtc/webrtc_browsertest_common.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "media/base/media_switches.h"
#include "testing/perf/perf_test.h"
#include "ui/gl/gl_switches.h"
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_video_quality_browsertest.cc b/chromium/chrome/browser/media/webrtc/webrtc_video_quality_browsertest.cc
index 680588e51c3..8208399fd00 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_video_quality_browsertest.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_video_quality_browsertest.cc
@@ -32,6 +32,7 @@
#include "chrome/test/base/in_process_browser_test.h"
#include "components/infobars/core/infobar.h"
#include "content/public/browser/notification_service.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "media/base/media_switches.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
diff --git a/chromium/chrome/browser/media/webrtc/webrtc_webcam_browsertest.cc b/chromium/chrome/browser/media/webrtc/webrtc_webcam_browsertest.cc
index 6d6d5e4c030..b1607dd7604 100644
--- a/chromium/chrome/browser/media/webrtc/webrtc_webcam_browsertest.cc
+++ b/chromium/chrome/browser/media/webrtc/webrtc_webcam_browsertest.cc
@@ -14,6 +14,7 @@
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/common/content_features.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "media/base/media_switches.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
diff --git a/chromium/chrome/browser/metrics/BUILD.gn b/chromium/chrome/browser/metrics/BUILD.gn
index 9b4525767a2..52838754894 100644
--- a/chromium/chrome/browser/metrics/BUILD.gn
+++ b/chromium/chrome/browser/metrics/BUILD.gn
@@ -7,8 +7,6 @@ import("//components/metrics/generate_expired_histograms_array.gni")
source_set("test_support") {
testonly = true
sources = [
- "testing/demographic_metrics_test_utils.cc",
- "testing/demographic_metrics_test_utils.h",
"testing/sync_metrics_test_utils.cc",
"testing/sync_metrics_test_utils.h",
]
@@ -16,11 +14,7 @@ source_set("test_support") {
deps = [
"//base",
"//chrome/browser",
- "//components/network_time",
- "//components/prefs",
"//components/signin/public/identity_manager",
- "//components/sync",
- "//components/sync/base",
"//components/sync/test/fake_server",
"//third_party/metrics_proto",
]
diff --git a/chromium/chrome/browser/net/cert_verify_proc_browsertest.cc b/chromium/chrome/browser/net/cert_verify_proc_browsertest.cc
index 22e89e6d74d..9ff2548e2cc 100644
--- a/chromium/chrome/browser/net/cert_verify_proc_browsertest.cc
+++ b/chromium/chrome/browser/net/cert_verify_proc_browsertest.cc
@@ -10,6 +10,7 @@
#include "build/build_config.h"
#include "chrome/test/base/chrome_test_utils.h"
#include "content/public/browser/network_service_instance.h"
+#include "content/public/test/browser_test.h"
#include "net/dns/mock_host_resolver.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "services/network/public/cpp/network_switches.h"
diff --git a/chromium/chrome/browser/net/chrome_accept_header_browsertest.cc b/chromium/chrome/browser/net/chrome_accept_header_browsertest.cc
index 6708c0357dc..3ba4488c5e2 100644
--- a/chromium/chrome/browser/net/chrome_accept_header_browsertest.cc
+++ b/chromium/chrome/browser/net/chrome_accept_header_browsertest.cc
@@ -7,8 +7,11 @@
#include "base/test/bind_test_util.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
+#include "media/media_buildflags.h"
#include "net/test/embedded_test_server/http_request.h"
+#include "third_party/blink/public/common/features.h"
using ChromeAcceptHeaderTest = InProcessBrowserTest;
@@ -40,12 +43,28 @@ IN_PROC_BROWSER_TEST_F(ChromeAcceptHeaderTest, Check) {
// With MimeHandlerViewInCrossProcessFrame, embedded PDF will go through the
// navigation code path and behaves similarly to PDF loaded inside <iframe>.
- ASSERT_EQ(
+ const char* expected_plugin_accept_header =
"text/html,application/xhtml+xml,application/xml;q=0.9,image/"
- "webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
- plugin_accept_header);
+ "webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9";
+#if BUILDFLAG(ENABLE_AV1_DECODER)
+ if (base::FeatureList::IsEnabled(blink::features::kAVIF)) {
+ expected_plugin_accept_header =
+ "text/html,application/xhtml+xml,application/xml;q=0.9,"
+ "image/avif,image/webp,image/apng,*/*;q=0.8,"
+ "application/signed-exchange;v=b3;q=0.9";
+ }
+#endif
+ ASSERT_EQ(expected_plugin_accept_header, plugin_accept_header);
- ASSERT_EQ("image/webp,image/apng,image/*,*/*;q=0.8", favicon_accept_header);
+ const char* expected_favicon_accept_header =
+ "image/webp,image/apng,image/*,*/*;q=0.8";
+#if BUILDFLAG(ENABLE_AV1_DECODER)
+ if (base::FeatureList::IsEnabled(blink::features::kAVIF)) {
+ expected_favicon_accept_header =
+ "image/avif,image/webp,image/apng,image/*,*/*;q=0.8";
+ }
+#endif
+ ASSERT_EQ(expected_favicon_accept_header, favicon_accept_header);
// Since the server uses local variables.
ASSERT_TRUE(server.ShutdownAndWaitUntilComplete());
diff --git a/chromium/chrome/browser/net/chrome_mojo_proxy_resolver_factory.cc b/chromium/chrome/browser/net/chrome_mojo_proxy_resolver_factory.cc
index 4f8b47a1bf5..1347508594b 100644
--- a/chromium/chrome/browser/net/chrome_mojo_proxy_resolver_factory.cc
+++ b/chromium/chrome/browser/net/chrome_mojo_proxy_resolver_factory.cc
@@ -7,7 +7,7 @@
#include <utility>
#include "base/bind.h"
-#include "base/logging.h"
+#include "base/check_op.h"
#include "base/no_destructor.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
diff --git a/chromium/chrome/browser/net/chrome_mojo_proxy_resolver_factory_browsertest.cc b/chromium/chrome/browser/net/chrome_mojo_proxy_resolver_factory_browsertest.cc
index f2a5516f626..0fee3b8c2fb 100644
--- a/chromium/chrome/browser/net/chrome_mojo_proxy_resolver_factory_browsertest.cc
+++ b/chromium/chrome/browser/net/chrome_mojo_proxy_resolver_factory_browsertest.cc
@@ -8,7 +8,6 @@
#include <vector>
-#include "base/logging.h"
#include "base/macros.h"
#include "base/optional.h"
#include "base/process/process.h"
@@ -21,6 +20,7 @@
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/service_process_host.h"
+#include "content/public/test/browser_test.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/proxy_resolver/public/mojom/proxy_resolver.mojom.h"
diff --git a/chromium/chrome/browser/net/chrome_network_delegate_browsertest.cc b/chromium/chrome/browser/net/chrome_network_delegate_browsertest.cc
index d1f01249ee2..aad27154325 100644
--- a/chromium/chrome/browser/net/chrome_network_delegate_browsertest.cc
+++ b/chromium/chrome/browser/net/chrome_network_delegate_browsertest.cc
@@ -13,6 +13,7 @@
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
#include "net/base/filename_util.h"
diff --git a/chromium/chrome/browser/net/chrome_network_service_browsertest.cc b/chromium/chrome/browser/net/chrome_network_service_browsertest.cc
index ccb124b45da..9ecc8c269a7 100644
--- a/chromium/chrome/browser/net/chrome_network_service_browsertest.cc
+++ b/chromium/chrome/browser/net/chrome_network_service_browsertest.cc
@@ -16,6 +16,7 @@
#include "content/public/test/browser_test.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h"
+#include "net/cookies/cookie_util.h"
#include "net/extras/sqlite/cookie_crypto_delegate.h"
#include "services/network/public/cpp/features.h"
#include "services/network/public/mojom/network_service.mojom.h"
@@ -49,7 +50,8 @@ void SetCookie(
net::COOKIE_PRIORITY_DEFAULT);
base::RunLoop run_loop;
cookie_manager->SetCanonicalCookie(
- cookie, "https", net::CookieOptions(),
+ cookie, net::cookie_util::SimulatedCookieSource(cookie, "https"),
+ net::CookieOptions(),
base::BindLambdaForTesting(
[&](net::CanonicalCookie::CookieInclusionStatus status) {
run_loop.Quit();
diff --git a/chromium/chrome/browser/net/cookie_policy_browsertest.cc b/chromium/chrome/browser/net/cookie_policy_browsertest.cc
index f92af6aca26..d00770b46bc 100644
--- a/chromium/chrome/browser/net/cookie_policy_browsertest.cc
+++ b/chromium/chrome/browser/net/cookie_policy_browsertest.cc
@@ -22,6 +22,7 @@
#include "components/prefs/pref_service.h"
#include "content/public/common/content_paths.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
#include "net/dns/mock_host_resolver.h"
diff --git a/chromium/chrome/browser/net/dns_over_https_browsertest.cc b/chromium/chrome/browser/net/dns_over_https_browsertest.cc
new file mode 100644
index 00000000000..4ae5b153e3e
--- /dev/null
+++ b/chromium/chrome/browser/net/dns_over_https_browsertest.cc
@@ -0,0 +1,80 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/common/chrome_features.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/common/content_features.h"
+#include "content/public/test/browser_test.h"
+#include "content/public/test/test_navigation_observer.h"
+#include "net/dns/public/doh_provider_list.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+namespace {
+
+struct DohParameter {
+ DohParameter(std::string provider, std::string template_uri, bool valid)
+ : doh_provider(std::move(provider)),
+ doh_template(std::move(template_uri)),
+ is_valid(valid) {}
+
+ std::string doh_provider;
+ std::string doh_template;
+ bool is_valid;
+};
+
+std::vector<DohParameter> GetDohServerTestCases() {
+ std::vector<DohParameter> doh_test_cases;
+ const auto& doh_providers = net::GetDohProviderList();
+ for (const auto& doh_provider : doh_providers) {
+ doh_test_cases.emplace_back(doh_provider.provider,
+ doh_provider.dns_over_https_template, true);
+ }
+ // Negative test-case
+ doh_test_cases.emplace_back("NegativeTestExampleCom",
+ "https://www.example.com", false);
+ return doh_test_cases;
+}
+
+} // namespace
+
+class DohBrowserTest : public InProcessBrowserTest,
+ public testing::WithParamInterface<DohParameter> {
+ public:
+ DohBrowserTest() : test_url_("https://www.google.com") {
+ // Allow test to use full host resolver code, instead of the test resolver
+ SetAllowNetworkAccessToHostResolutions();
+ }
+
+ void SetUpCommandLine(base::CommandLine* command_line) override {
+ scoped_feature_list_.InitWithFeaturesAndParameters(
+ {// {features::kNetworkServiceInProcess, {}}, // Turn on for debugging
+ {features::kDnsOverHttps,
+ {{"Fallback", "false"}, {"Templates", GetParam().doh_template}}}},
+ {});
+ }
+
+ protected:
+ base::test::ScopedFeatureList scoped_feature_list_;
+ const GURL test_url_;
+};
+
+IN_PROC_BROWSER_TEST_P(DohBrowserTest, MANUAL_ExternalDohServers) {
+ content::TestNavigationObserver nav_observer(
+ browser()->tab_strip_model()->GetActiveWebContents(), 1);
+ EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), test_url_));
+ nav_observer.WaitForNavigationFinished();
+ EXPECT_EQ(GetParam().is_valid, nav_observer.last_navigation_succeeded());
+}
+
+INSTANTIATE_TEST_SUITE_P(
+ DohBrowserParameterizedTest,
+ DohBrowserTest,
+ ::testing::ValuesIn(GetDohServerTestCases()),
+ [](const testing::TestParamInfo<DohBrowserTest::ParamType>& info) {
+ return info.param.doh_provider;
+ });
diff --git a/chromium/chrome/browser/net/dns_probe_browsertest.cc b/chromium/chrome/browser/net/dns_probe_browsertest.cc
index 3fc6670b241..b6f1bbf6687 100644
--- a/chromium/chrome/browser/net/dns_probe_browsertest.cc
+++ b/chromium/chrome/browser/net/dns_probe_browsertest.cc
@@ -15,8 +15,8 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/net/dns_probe_service_factory.h"
#include "chrome/browser/net/dns_probe_test_util.h"
-#include "chrome/browser/net/dns_util.h"
#include "chrome/browser/net/net_error_tab_helper.h"
+#include "chrome/browser/net/secure_dns_config.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_commands.h"
@@ -33,6 +33,7 @@
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
#include "content/public/test/url_loader_interceptor.h"
@@ -198,9 +199,11 @@ class DelayedURLLoader : public network::mojom::URLLoader,
void OnMojoDisconnect() { delete this; }
// mojom::URLLoader implementation:
- void FollowRedirect(const std::vector<std::string>& removed_headers,
- const net::HttpRequestHeaders& modified_headers,
- const base::Optional<GURL>& new_url) override {}
+ void FollowRedirect(
+ const std::vector<std::string>& removed_headers,
+ const net::HttpRequestHeaders& modified_headers,
+ const net::HttpRequestHeaders& modified_cors_exempt_headers,
+ const base::Optional<GURL>& new_url) override {}
void SetPriority(net::RequestPriority priority,
int32_t intra_priority_value) override {}
void PauseReadingBodyFromNet() override {}
@@ -692,7 +695,7 @@ class DnsProbeCurrentSecureConfigFailingProbesTest
PrefService* local_state = g_browser_process->local_state();
local_state->SetString(prefs::kDnsOverHttpsMode,
- chrome_browser_net::kDnsOverHttpsModeSecure);
+ SecureDnsConfig::kModeSecure);
local_state->SetString(prefs::kDnsOverHttpsTemplates,
"https://bar.test/dns-query{?dns}");
diff --git a/chromium/chrome/browser/net/dns_probe_service_factory.cc b/chromium/chrome/browser/net/dns_probe_service_factory.cc
index 8cf9f5c58fb..31331501597 100644
--- a/chromium/chrome/browser/net/dns_probe_service_factory.cc
+++ b/chromium/chrome/browser/net/dns_probe_service_factory.cc
@@ -18,6 +18,7 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/net/dns_probe_runner.h"
#include "chrome/browser/net/dns_probe_service.h"
+#include "chrome/browser/net/secure_dns_config.h"
#include "chrome/browser/net/stub_resolver_config_reader.h"
#include "chrome/browser/net/system_network_context_manager.h"
#include "chrome/browser/profiles/incognito_helpers.h"
@@ -223,12 +224,12 @@ void DnsProbeServiceImpl::OnDnsConfigChanged() {
}
void DnsProbeServiceImpl::SetUpCurrentConfigRunner() {
- bool insecure_stub_resolver_enabled;
- std::vector<net::DnsOverHttpsServerConfig> dns_over_https_servers;
- SystemNetworkContextManager::GetStubResolverConfigReader()->GetConfiguration(
- false /* force_check_parental_controls_for_automatic_mode */,
- &insecure_stub_resolver_enabled, &current_config_secure_dns_mode_,
- &dns_over_https_servers);
+ SecureDnsConfig secure_dns_config =
+ SystemNetworkContextManager::GetStubResolverConfigReader()
+ ->GetSecureDnsConfiguration(
+ false /* force_check_parental_controls_for_automatic_mode */);
+
+ current_config_secure_dns_mode_ = secure_dns_config.mode();
net::DnsConfigOverrides current_config_overrides;
current_config_overrides.search = std::vector<std::string>();
@@ -237,12 +238,9 @@ void DnsProbeServiceImpl::SetUpCurrentConfigRunner() {
if (current_config_secure_dns_mode_ ==
net::DnsConfig::SecureDnsMode::SECURE) {
- if (!dns_over_https_servers.empty()) {
- current_config_overrides.dns_over_https_servers.emplace();
- for (auto& doh_server : dns_over_https_servers) {
- current_config_overrides.dns_over_https_servers.value().push_back(
- std::move(doh_server));
- }
+ if (!secure_dns_config.servers().empty()) {
+ current_config_overrides.dns_over_https_servers.emplace(
+ secure_dns_config.servers());
}
current_config_overrides.secure_dns_mode =
net::DnsConfig::SecureDnsMode::SECURE;
@@ -385,7 +383,7 @@ void DnsProbeServiceImpl::SetupDnsConfigChangeNotifications() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
dns_config_change_manager_getter_.Run()->RequestNotifications(
receiver_.BindNewPipeAndPassRemote());
- receiver_.set_disconnect_handler(base::BindRepeating(
+ receiver_.set_disconnect_handler(base::BindOnce(
&DnsProbeServiceImpl::OnDnsConfigChangeManagerConnectionError,
base::Unretained(this)));
}
diff --git a/chromium/chrome/browser/net/dns_probe_service_factory_unittest.cc b/chromium/chrome/browser/net/dns_probe_service_factory_unittest.cc
index 33435a86be6..a7344031af8 100644
--- a/chromium/chrome/browser/net/dns_probe_service_factory_unittest.cc
+++ b/chromium/chrome/browser/net/dns_probe_service_factory_unittest.cc
@@ -17,7 +17,7 @@
#include "chrome/browser/net/dns_probe_runner.h"
#include "chrome/browser/net/dns_probe_service.h"
#include "chrome/browser/net/dns_probe_test_util.h"
-#include "chrome/browser/net/dns_util.h"
+#include "chrome/browser/net/secure_dns_config.h"
#include "chrome/browser/net/stub_resolver_config_reader.h"
#include "chrome/browser/net/system_network_context_manager.h"
#include "chrome/common/pref_names.h"
@@ -187,8 +187,7 @@ TEST_F(DnsProbeServiceTest, Probe_FAIL_OK_automatic) {
// being downgraded to off if the test environment is managed.
local_state()->SetManagedPref(
prefs::kDnsOverHttpsMode,
- std::make_unique<base::Value>(
- chrome_browser_net::kDnsOverHttpsModeAutomatic));
+ std::make_unique<base::Value>(SecureDnsConfig::kModeAutomatic));
ConfigureTest({{net::ERR_NAME_NOT_RESOLVED,
net::ResolveErrorInfo(net::ERR_NAME_NOT_RESOLVED),
FakeHostResolver::kNoResponse}},
@@ -202,8 +201,7 @@ TEST_F(DnsProbeServiceTest, Probe_FAIL_OK_secure) {
// being downgraded to off if the test environment is managed.
local_state()->SetManagedPref(
prefs::kDnsOverHttpsMode,
- std::make_unique<base::Value>(
- chrome_browser_net::kDnsOverHttpsModeSecure));
+ std::make_unique<base::Value>(SecureDnsConfig::kModeSecure));
ConfigureTest({{net::ERR_NAME_NOT_RESOLVED,
net::ResolveErrorInfo(
net::ERR_DNS_SECURE_RESOLVER_HOSTNAME_RESOLUTION_FAILED),
@@ -305,8 +303,7 @@ TEST_F(DnsProbeServiceTest, CurrentConfig_Automatic) {
// being downgraded to off if the test environment is managed.
local_state()->SetManagedPref(
prefs::kDnsOverHttpsMode,
- std::make_unique<base::Value>(
- chrome_browser_net::kDnsOverHttpsModeAutomatic));
+ std::make_unique<base::Value>(SecureDnsConfig::kModeAutomatic));
local_state()->SetManagedPref(
prefs::kDnsOverHttpsTemplates,
std::make_unique<base::Value>(kDohTemplateGet + " " + kDohTemplatePost));
@@ -332,8 +329,7 @@ TEST_F(DnsProbeServiceTest, CurrentConfig_Secure) {
// being downgraded to off if the test environment is managed.
local_state()->SetManagedPref(
prefs::kDnsOverHttpsMode,
- std::make_unique<base::Value>(
- chrome_browser_net::kDnsOverHttpsModeSecure));
+ std::make_unique<base::Value>(SecureDnsConfig::kModeSecure));
local_state()->SetManagedPref(
prefs::kDnsOverHttpsTemplates,
std::make_unique<base::Value>(kDohTemplateGet + " " + kDohTemplatePost));
diff --git a/chromium/chrome/browser/net/dns_probe_test_util.cc b/chromium/chrome/browser/net/dns_probe_test_util.cc
index 97ebe252b4b..7ca1bc2ce3e 100644
--- a/chromium/chrome/browser/net/dns_probe_test_util.cc
+++ b/chromium/chrome/browser/net/dns_probe_test_util.cc
@@ -139,6 +139,17 @@ void FakeHostResolverNetworkContext::CreateHostResolver(
}
}
+HangingHostResolverNetworkContext::HangingHostResolverNetworkContext() =
+ default;
+HangingHostResolverNetworkContext::~HangingHostResolverNetworkContext() =
+ default;
+
+void HangingHostResolverNetworkContext::CreateHostResolver(
+ const base::Optional<net::DnsConfigOverrides>& config_overrides,
+ mojo::PendingReceiver<network::mojom::HostResolver> receiver) {
+ resolver_ = std::make_unique<HangingHostResolver>(std::move(receiver));
+}
+
FakeDnsConfigChangeManager::FakeDnsConfigChangeManager(
mojo::PendingReceiver<network::mojom::DnsConfigChangeManager> receiver)
: receiver_(this, std::move(receiver)) {}
diff --git a/chromium/chrome/browser/net/dns_probe_test_util.h b/chromium/chrome/browser/net/dns_probe_test_util.h
index eb17bd6bb4e..bd9d45402e8 100644
--- a/chromium/chrome/browser/net/dns_probe_test_util.h
+++ b/chromium/chrome/browser/net/dns_probe_test_util.h
@@ -108,6 +108,19 @@ class FakeHostResolverNetworkContext : public network::TestNetworkContext {
std::unique_ptr<FakeHostResolver> google_config_resolver_;
};
+class HangingHostResolverNetworkContext : public network::TestNetworkContext {
+ public:
+ HangingHostResolverNetworkContext();
+ ~HangingHostResolverNetworkContext() override;
+
+ void CreateHostResolver(
+ const base::Optional<net::DnsConfigOverrides>& config_overrides,
+ mojo::PendingReceiver<network::mojom::HostResolver> receiver) override;
+
+ private:
+ std::unique_ptr<HangingHostResolver> resolver_;
+};
+
class FakeDnsConfigChangeManager
: public network::mojom::DnsConfigChangeManager {
public:
diff --git a/chromium/chrome/browser/net/errorpage_browsertest.cc b/chromium/chrome/browser/net/errorpage_browsertest.cc
index e835004ae91..d7f97d43a70 100644
--- a/chromium/chrome/browser/net/errorpage_browsertest.cc
+++ b/chromium/chrome/browser/net/errorpage_browsertest.cc
@@ -8,11 +8,11 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
+#include "base/check_op.h"
#include "base/command_line.h"
#include "base/compiler_specific.h"
#include "base/feature_list.h"
#include "base/files/scoped_temp_dir.h"
-#include "base/logging.h"
#include "base/macros.h"
#include "base/memory/ptr_util.h"
#include "base/memory/weak_ptr.h"
@@ -26,7 +26,6 @@
#include "base/values.h"
#include "build/build_config.h"
#include "chrome/browser/browser_process_platform_part.h"
-#include "chrome/browser/browsing_data/browsing_data_helper.h"
#include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h"
#include "chrome/browser/net/net_error_diagnostics_dialog.h"
#include "chrome/browser/profiles/profile.h"
@@ -40,6 +39,7 @@
#include "chrome/common/pref_names.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
+#include "components/browsing_data/content/browsing_data_helper.h"
#include "components/google/core/common/google_util.h"
#include "components/language/core/browser/pref_names.h"
#include "components/policy/core/browser/browser_policy_connector.h"
@@ -60,6 +60,7 @@
#include "content/public/browser/storage_partition.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_observer.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
#include "content/public/test/url_loader_interceptor.h"
diff --git a/chromium/chrome/browser/net/load_timing_browsertest.cc b/chromium/chrome/browser/net/load_timing_browsertest.cc
index 49b076abdbb..432d5ad5bce 100644
--- a/chromium/chrome/browser/net/load_timing_browsertest.cc
+++ b/chromium/chrome/browser/net/load_timing_browsertest.cc
@@ -27,6 +27,7 @@
#include "components/proxy_config/proxy_config_pref_names.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/common/content_features.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "net/test/spawned_test_server/spawned_test_server.h"
#include "url/gurl.h"
diff --git a/chromium/chrome/browser/net/log_net_log_browsertest.cc b/chromium/chrome/browser/net/log_net_log_browsertest.cc
index f0be881cc8a..b9ac22b7d7f 100644
--- a/chromium/chrome/browser/net/log_net_log_browsertest.cc
+++ b/chromium/chrome/browser/net/log_net_log_browsertest.cc
@@ -7,6 +7,7 @@
#include "base/json/json_reader.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/test/browser_test.h"
#include "services/network/public/cpp/network_switches.h"
#include "testing/gmock/include/gmock/gmock.h"
diff --git a/chromium/chrome/browser/net/net_error_diagnostics_dialog_posix.cc b/chromium/chrome/browser/net/net_error_diagnostics_dialog_posix.cc
index 2c21794a898..070573cf2f6 100644
--- a/chromium/chrome/browser/net/net_error_diagnostics_dialog_posix.cc
+++ b/chromium/chrome/browser/net/net_error_diagnostics_dialog_posix.cc
@@ -4,7 +4,7 @@
#include "chrome/browser/net/net_error_diagnostics_dialog.h"
-#include "base/logging.h"
+#include "base/notreached.h"
bool CanShowNetworkDiagnosticsDialog(content::WebContents* web_contents) {
return false;
diff --git a/chromium/chrome/browser/net/net_error_diagnostics_dialog_win.cc b/chromium/chrome/browser/net/net_error_diagnostics_dialog_win.cc
index ea046e11d3a..27d452619d9 100644
--- a/chromium/chrome/browser/net/net_error_diagnostics_dialog_win.cc
+++ b/chromium/chrome/browser/net/net_error_diagnostics_dialog_win.cc
@@ -13,9 +13,9 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
+#include "base/check.h"
#include "base/files/file_path.h"
#include "base/location.h"
-#include "base/logging.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/native_library.h"
diff --git a/chromium/chrome/browser/net/netinfo_network_quality_estimator_holdback_browsertest.cc b/chromium/chrome/browser/net/netinfo_network_quality_estimator_holdback_browsertest.cc
index 8dc697d4c74..35cf929ce9f 100644
--- a/chromium/chrome/browser/net/netinfo_network_quality_estimator_holdback_browsertest.cc
+++ b/chromium/chrome/browser/net/netinfo_network_quality_estimator_holdback_browsertest.cc
@@ -7,8 +7,9 @@
#include "base/metrics/field_trial_param_associator.h"
#include "base/bind.h"
-#include "base/logging.h"
+#include "base/check.h"
#include "base/macros.h"
+#include "base/notreached.h"
#include "base/run_loop.h"
#include "base/task/post_task.h"
#include "base/test/scoped_feature_list.h"
@@ -24,7 +25,6 @@
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/network_service_instance.h"
#include "content/public/common/content_features.h"
-#include "content/public/common/service_manager_connection.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_base.h"
#include "content/public/test/browser_test_utils.h"
diff --git a/chromium/chrome/browser/net/network_connection_tracker_browsertest.cc b/chromium/chrome/browser/net/network_connection_tracker_browsertest.cc
index 475f652dee0..520bd6e724b 100644
--- a/chromium/chrome/browser/net/network_connection_tracker_browsertest.cc
+++ b/chromium/chrome/browser/net/network_connection_tracker_browsertest.cc
@@ -4,8 +4,8 @@
#include "base/bind.h"
#include "base/callback_forward.h"
+#include "base/check_op.h"
#include "base/feature_list.h"
-#include "base/logging.h"
#include "base/macros.h"
#include "base/run_loop.h"
#include "base/sequence_checker.h"
@@ -96,8 +96,9 @@ class NetworkConnectionTrackerBrowserTest : public InProcessBrowserTest {
network_service_test.BindNewPipeAndPassReceiver());
base::RunLoop run_loop;
network_service_test->SimulateNetworkChange(
- type, base::Bind([](base::RunLoop* run_loop) { run_loop->Quit(); },
- base::Unretained(&run_loop)));
+ type,
+ base::BindOnce([](base::RunLoop* run_loop) { run_loop->Quit(); },
+ base::Unretained(&run_loop)));
run_loop.Run();
return;
}
diff --git a/chromium/chrome/browser/net/network_context_configuration_browsertest.cc b/chromium/chrome/browser/net/network_context_configuration_browsertest.cc
index a86aa822a9f..e297441ad05 100644
--- a/chromium/chrome/browser/net/network_context_configuration_browsertest.cc
+++ b/chromium/chrome/browser/net/network_context_configuration_browsertest.cc
@@ -57,6 +57,7 @@
#include "content/public/common/content_switches.h"
#include "content/public/common/network_service_util.h"
#include "content/public/common/url_constants.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/simple_url_loader_test_helper.h"
#include "mojo/public/cpp/bindings/remote.h"
@@ -567,8 +568,8 @@ class NetworkContextConfigurationBrowserTest
request->site_for_cookies = net::SiteForCookies::FromOrigin(origin);
request->trusted_params = network::ResourceRequest::TrustedParams();
- request->trusted_params->network_isolation_key =
- net::NetworkIsolationKey(origin, origin);
+ request->trusted_params->isolation_info =
+ net::IsolationInfo::CreateForInternalRequest(origin);
content::SimpleURLLoaderTestHelper simple_loader_helper;
std::unique_ptr<network::SimpleURLLoader> simple_loader =
@@ -802,8 +803,8 @@ IN_PROC_BROWSER_TEST_P(NetworkContextConfigurationBrowserTest,
url::Origin origin = url::Origin::Create(GURL(chrome::kChromeUIPrintURL));
request->site_for_cookies = net::SiteForCookies::FromOrigin(origin);
request->trusted_params = network::ResourceRequest::TrustedParams();
- request->trusted_params->network_isolation_key =
- net::NetworkIsolationKey(origin, origin);
+ request->trusted_params->isolation_info =
+ net::IsolationInfo::CreateForInternalRequest(origin);
content::SimpleURLLoaderTestHelper simple_loader_helper;
std::unique_ptr<network::SimpleURLLoader> simple_loader =
network::SimpleURLLoader::Create(std::move(request),
@@ -869,8 +870,8 @@ IN_PROC_BROWSER_TEST_P(NetworkContextConfigurationBrowserTest,
// This request will show up as cross-site because the chrome-extension URL
// won't match the test_server domain (127.0.0.1), but because we set
- // |attach_same_site_cookies| to true for extension-initiated requests, this
- // will actually be able to get the cookie.
+ // |force_ignore_site_for_cookies| to true for extension-initiated requests,
+ // this will actually be able to get the cookie.
GURL url = test_server.GetURL("/echocookieheader");
std::string script = R"((url => {
var xhr = new XMLHttpRequest();
@@ -926,8 +927,10 @@ IN_PROC_BROWSER_TEST_P(NetworkContextConfigurationBrowserTest, Cache) {
std::make_unique<network::ResourceRequest>();
request->url = request_url;
request->trusted_params = network::ResourceRequest::TrustedParams();
- request->trusted_params->network_isolation_key =
- net::NetworkIsolationKey(request_origin, request_origin);
+ request->trusted_params->isolation_info =
+ net::IsolationInfo::CreateForInternalRequest(request_origin);
+ request->site_for_cookies =
+ request->trusted_params->isolation_info.site_for_cookies();
content::SimpleURLLoaderTestHelper simple_loader_helper;
std::unique_ptr<network::SimpleURLLoader> simple_loader =
@@ -950,8 +953,10 @@ IN_PROC_BROWSER_TEST_P(NetworkContextConfigurationBrowserTest, Cache) {
std::make_unique<network::ResourceRequest>();
request2->url = request_url;
request2->trusted_params = network::ResourceRequest::TrustedParams();
- request2->trusted_params->network_isolation_key =
- net::NetworkIsolationKey(request_origin, request_origin);
+ request2->trusted_params->isolation_info =
+ net::IsolationInfo::CreateForInternalRequest(request_origin);
+ request2->site_for_cookies =
+ request2->trusted_params->isolation_info.site_for_cookies();
content::SimpleURLLoaderTestHelper simple_loader_helper2;
std::unique_ptr<network::SimpleURLLoader> simple_loader2 =
@@ -1039,8 +1044,10 @@ IN_PROC_BROWSER_TEST_P(NetworkContextConfigurationBrowserTest, PRE_DiskCache) {
std::make_unique<network::ResourceRequest>();
request->url = test_url;
request->trusted_params = network::ResourceRequest::TrustedParams();
- request->trusted_params->network_isolation_key =
- net::NetworkIsolationKey(test_origin, test_origin);
+ request->trusted_params->isolation_info =
+ net::IsolationInfo::CreateForInternalRequest(test_origin);
+ request->site_for_cookies =
+ request->trusted_params->isolation_info.site_for_cookies();
content::SimpleURLLoaderTestHelper simple_loader_helper;
std::unique_ptr<network::SimpleURLLoader> simple_loader =
@@ -1057,9 +1064,7 @@ IN_PROC_BROWSER_TEST_P(NetworkContextConfigurationBrowserTest, PRE_DiskCache) {
// Write the URL and expected response to a file.
std::string file_data =
test_url.spec() + "\n" + *simple_loader_helper.response_body();
- ASSERT_EQ(
- static_cast<int>(file_data.length()),
- base::WriteFile(save_url_file_path, file_data.data(), file_data.size()));
+ ASSERT_TRUE(base::WriteFile(save_url_file_path, file_data));
EXPECT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete());
}
@@ -1097,8 +1102,10 @@ IN_PROC_BROWSER_TEST_P(NetworkContextConfigurationBrowserTest, DiskCache) {
std::make_unique<network::ResourceRequest>();
request->url = test_url;
request->trusted_params = network::ResourceRequest::TrustedParams();
- request->trusted_params->network_isolation_key =
- net::NetworkIsolationKey(test_origin, test_origin);
+ request->trusted_params->isolation_info =
+ net::IsolationInfo::CreateForInternalRequest(test_origin);
+ request->site_for_cookies =
+ request->trusted_params->isolation_info.site_for_cookies();
content::SimpleURLLoaderTestHelper simple_loader_helper;
request->load_flags = net::LOAD_ONLY_FROM_CACHE;
@@ -1232,9 +1239,7 @@ IN_PROC_BROWSER_TEST_P(NetworkContextConfigurationBrowserTest, PRE_Hsts) {
base::FilePath save_url_file_path = browser()->profile()->GetPath().Append(
FILE_PATH_LITERAL("url_for_test.txt"));
std::string file_data = start_url.spec();
- ASSERT_EQ(
- static_cast<int>(file_data.length()),
- base::WriteFile(save_url_file_path, file_data.data(), file_data.size()));
+ ASSERT_TRUE(base::WriteFile(save_url_file_path, file_data));
}
// Checks if the HSTS information from the last test is still available after a
@@ -1570,9 +1575,21 @@ IN_PROC_BROWSER_TEST_P(NetworkContextConfigurationBrowserTest,
// The preference is expected to be reset in incognito mode.
if (is_incognito()) {
EXPECT_FALSE(GetPrefService()->GetBoolean(prefs::kBlockThirdPartyCookies));
+ EXPECT_EQ(
+ static_cast<int>(content_settings::CookieControlsMode::kIncognitoOnly),
+ GetPrefService()->GetInteger(prefs::kCookieControlsMode));
return;
}
+ // For regular sessions, the kBlockThirdpartyCookies preference gets migrated
+ // to kCookieControlsMode. Reset it so it doesn't interfere with the test.
+ EXPECT_EQ(
+ static_cast<int>(content_settings::CookieControlsMode::kBlockThirdParty),
+ GetPrefService()->GetInteger(prefs::kCookieControlsMode));
+ GetPrefService()->SetInteger(
+ prefs::kCookieControlsMode,
+ static_cast<int>(content_settings::CookieControlsMode::kIncognitoOnly));
+
// The kBlockThirdPartyCookies pref should carry over to the next session.
EXPECT_TRUE(GetPrefService()->GetBoolean(prefs::kBlockThirdPartyCookies));
SetCookie(CookieType::kThirdParty, CookiePersistenceType::kSession,
@@ -1792,9 +1809,7 @@ class NetworkContextConfigurationFilePacBrowserTest
temp_dir_.GetPath().AppendASCII(kPacFileName);
std::string pac_script = GetPacScript();
- ASSERT_EQ(
- static_cast<int>(pac_script.size()),
- base::WriteFile(pac_file_path, pac_script.c_str(), pac_script.size()));
+ ASSERT_TRUE(base::WriteFile(pac_file_path, pac_script));
command_line->AppendSwitchASCII(
switches::kProxyPacUrl, net::FilePathToFileURL(pac_file_path).spec());
diff --git a/chromium/chrome/browser/net/network_quality_estimator_browsertest.cc b/chromium/chrome/browser/net/network_quality_estimator_browsertest.cc
index e521ef39860..8d9840bf749 100644
--- a/chromium/chrome/browser/net/network_quality_estimator_browsertest.cc
+++ b/chromium/chrome/browser/net/network_quality_estimator_browsertest.cc
@@ -15,6 +15,7 @@
#include "chrome/test/base/in_process_browser_test.h"
#include "components/variations/variations_associated_data.h"
#include "content/public/browser/browser_thread.h"
+#include "content/public/test/browser_test.h"
#include "net/base/features.h"
#include "net/nqe/network_quality_estimator.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
diff --git a/chromium/chrome/browser/net/network_quality_estimator_prefs_browsertest.cc b/chromium/chrome/browser/net/network_quality_estimator_prefs_browsertest.cc
index 9e377e4bc99..d2b15b52a4e 100644
--- a/chromium/chrome/browser/net/network_quality_estimator_prefs_browsertest.cc
+++ b/chromium/chrome/browser/net/network_quality_estimator_prefs_browsertest.cc
@@ -5,10 +5,10 @@
#include <string>
#include "base/bind.h"
+#include "base/check_op.h"
#include "base/command_line.h"
#include "base/deferred_sequenced_task_runner.h"
#include "base/files/file_path.h"
-#include "base/logging.h"
#include "base/macros.h"
#include "base/path_service.h"
#include "base/process/memory.h"
diff --git a/chromium/chrome/browser/net/network_quality_netinfo_browsertest.cc b/chromium/chrome/browser/net/network_quality_netinfo_browsertest.cc
index 17dedc8195f..e78d136b5e8 100644
--- a/chromium/chrome/browser/net/network_quality_netinfo_browsertest.cc
+++ b/chromium/chrome/browser/net/network_quality_netinfo_browsertest.cc
@@ -15,6 +15,7 @@
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_base.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/content_browser_test.h"
diff --git a/chromium/chrome/browser/net/network_quality_tracker_browsertest.cc b/chromium/chrome/browser/net/network_quality_tracker_browsertest.cc
index e43c56e3a24..b1bb02b14b0 100644
--- a/chromium/chrome/browser/net/network_quality_tracker_browsertest.cc
+++ b/chromium/chrome/browser/net/network_quality_tracker_browsertest.cc
@@ -3,8 +3,8 @@
// found in the LICENSE file.
#include "base/bind.h"
+#include "base/check_op.h"
#include "base/deferred_sequenced_task_runner.h"
-#include "base/logging.h"
#include "base/macros.h"
#include "base/run_loop.h"
#include "base/task/post_task.h"
diff --git a/chromium/chrome/browser/net/network_request_metrics_browsertest.cc b/chromium/chrome/browser/net/network_request_metrics_browsertest.cc
index 3034b1467ce..ae08cdc870e 100644
--- a/chromium/chrome/browser/net/network_request_metrics_browsertest.cc
+++ b/chromium/chrome/browser/net/network_request_metrics_browsertest.cc
@@ -28,6 +28,7 @@
#include "chrome/test/base/ui_test_utils.h"
#include "components/prefs/pref_service.h"
#include "content/public/browser/web_contents_observer.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/download_test_observer.h"
#include "content/public/test/test_navigation_observer.h"
#include "net/base/filename_util.h"
@@ -133,11 +134,9 @@ class NetworkRequestMetricsBrowserTest
subresource_path.c_str());
case RequestType::kImage:
return base::StringPrintf("<img src='%s'>", subresource_path.c_str());
- break;
case RequestType::kScript:
return base::StringPrintf("<script src='%s'></script>",
subresource_path.c_str());
- break;
case RequestType::kMainFrame:
NOTREACHED();
}
@@ -570,9 +569,7 @@ IN_PROC_BROWSER_TEST_P(NetworkRequestMetricsBrowserTest, FileURLError) {
base::FilePath main_frame_path = temp_dir_.GetPath().AppendASCII("main.html");
if (GetParam() != RequestType::kMainFrame) {
std::string main_frame_data = GetMainFrameContents("subresource");
- ASSERT_EQ(static_cast<int>(main_frame_data.length()),
- base::WriteFile(main_frame_path, main_frame_data.c_str(),
- main_frame_data.length()));
+ ASSERT_TRUE(base::WriteFile(main_frame_path, main_frame_data));
}
ui_test_utils::NavigateToURL(browser(),
@@ -592,15 +589,11 @@ IN_PROC_BROWSER_TEST_P(NetworkRequestMetricsBrowserTest, FileURLSuccess) {
std::string main_frame_data = "foo";
if (GetParam() != RequestType::kMainFrame)
main_frame_data = GetMainFrameContents(kSubresourcePath);
- ASSERT_EQ(static_cast<int>(main_frame_data.length()),
- base::WriteFile(main_frame_path, main_frame_data.c_str(),
- main_frame_data.length()));
+ ASSERT_TRUE(base::WriteFile(main_frame_path, main_frame_data.c_str()));
if (GetParam() != RequestType::kMainFrame) {
std::string subresource_data = "foo";
- ASSERT_EQ(
- static_cast<int>(subresource_data.length()),
- base::WriteFile(temp_dir_.GetPath().AppendASCII(kSubresourcePath),
- subresource_data.c_str(), subresource_data.length()));
+ ASSERT_TRUE(base::WriteFile(
+ temp_dir_.GetPath().AppendASCII(kSubresourcePath), subresource_data));
}
ui_test_utils::NavigateToURL(browser(),
diff --git a/chromium/chrome/browser/net/nss_context_chromeos.cc b/chromium/chrome/browser/net/nss_context_chromeos.cc
index 9a2e69590eb..a57c61231c0 100644
--- a/chromium/chrome/browser/net/nss_context_chromeos.cc
+++ b/chromium/chrome/browser/net/nss_context_chromeos.cc
@@ -29,8 +29,8 @@ class NSSCertDatabaseChromeOSManager : public base::SupportsUserData::Data {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
crypto::ScopedPK11Slot private_slot(crypto::GetPrivateSlotForChromeOSUser(
username_hash,
- base::Bind(&NSSCertDatabaseChromeOSManager::DidGetPrivateSlot,
- weak_ptr_factory_.GetWeakPtr())));
+ base::BindOnce(&NSSCertDatabaseChromeOSManager::DidGetPrivateSlot,
+ weak_ptr_factory_.GetWeakPtr())));
if (private_slot)
DidGetPrivateSlot(std::move(private_slot));
}
diff --git a/chromium/chrome/browser/net/nss_context_chromeos_browsertest.cc b/chromium/chrome/browser/net/nss_context_chromeos_browsertest.cc
index 67db1777d36..833a109b11d 100644
--- a/chromium/chrome/browser/net/nss_context_chromeos_browsertest.cc
+++ b/chromium/chrome/browser/net/nss_context_chromeos_browsertest.cc
@@ -10,7 +10,7 @@
#include "base/run_loop.h"
#include "base/task/post_task.h"
#include "chrome/browser/chromeos/login/login_manager_test.h"
-#include "chrome/browser/chromeos/login/startup_utils.h"
+#include "chrome/browser/chromeos/login/test/login_manager_mixin.h"
#include "chrome/browser/chromeos/login/ui/user_adding_screen.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/profiles/profile.h"
@@ -18,15 +18,11 @@
#include "components/user_manager/user_manager.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
+#include "content/public/test/browser_test.h"
#include "net/cert/nss_cert_database.h"
namespace {
-constexpr char kTestUser1[] = "test-user1@gmail.com";
-constexpr char kTestUser1GaiaId[] = "1111111111";
-constexpr char kTestUser2[] = "test-user2@gmail.com";
-constexpr char kTestUser2GaiaId[] = "2222222222";
-
void NotCalledDbCallback(net::NSSCertDatabase* db) { ASSERT_TRUE(false); }
// DBTester handles retrieving the NSSCertDatabase for a given profile, and
@@ -156,25 +152,20 @@ class UserAddingFinishObserver : public chromeos::UserAddingScreen::Observer {
class NSSContextChromeOSBrowserTest : public chromeos::LoginManagerTest {
public:
- NSSContextChromeOSBrowserTest()
- : LoginManagerTest(true /* should_launch_browser */,
- true /* should_initialize_webui */) {}
+ NSSContextChromeOSBrowserTest() : LoginManagerTest() {
+ login_mixin_.AppendRegularUsers(2);
+ }
~NSSContextChromeOSBrowserTest() override {}
-};
-IN_PROC_BROWSER_TEST_F(NSSContextChromeOSBrowserTest, PRE_TwoUsers) {
- // Initialization for ChromeOS multi-profile test infrastructure.
- RegisterUser(AccountId::FromUserEmailGaiaId(kTestUser1, kTestUser1GaiaId));
- RegisterUser(AccountId::FromUserEmailGaiaId(kTestUser2, kTestUser2GaiaId));
- chromeos::StartupUtils::MarkOobeCompleted();
-}
+ protected:
+ chromeos::LoginManagerMixin login_mixin_{&mixin_host_};
+};
IN_PROC_BROWSER_TEST_F(NSSContextChromeOSBrowserTest, TwoUsers) {
user_manager::UserManager* user_manager = user_manager::UserManager::Get();
// Log in first user and get their DB.
- const AccountId account_id1(
- AccountId::FromUserEmailGaiaId(kTestUser1, kTestUser1GaiaId));
+ const AccountId account_id1(login_mixin_.users()[0].account_id);
LoginUser(account_id1);
Profile* profile1 = chromeos::ProfileHelper::Get()->GetProfileByUserUnsafe(
user_manager->FindUser(account_id1));
@@ -188,8 +179,7 @@ IN_PROC_BROWSER_TEST_F(NSSContextChromeOSBrowserTest, TwoUsers) {
chromeos::UserAddingScreen::Get()->Start();
base::RunLoop().RunUntilIdle();
- const AccountId account_id2(
- AccountId::FromUserEmailGaiaId(kTestUser2, kTestUser2GaiaId));
+ const AccountId account_id2(login_mixin_.users()[1].account_id);
AddUser(account_id2);
observer.WaitUntilUserAddingFinishedOrCancelled();
diff --git a/chromium/chrome/browser/net/prediction_options.cc b/chromium/chrome/browser/net/prediction_options.cc
index 493fb0792bc..5268257b841 100644
--- a/chromium/chrome/browser/net/prediction_options.cc
+++ b/chromium/chrome/browser/net/prediction_options.cc
@@ -4,7 +4,7 @@
#include "chrome/browser/net/prediction_options.h"
-#include "base/logging.h"
+#include "base/check_op.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/pref_names.h"
#include "components/pref_registry/pref_registry_syncable.h"
diff --git a/chromium/chrome/browser/net/profile_network_context_service.cc b/chromium/chrome/browser/net/profile_network_context_service.cc
index 44ce8ba980a..75a5ee19235 100644
--- a/chromium/chrome/browser/net/profile_network_context_service.cc
+++ b/chromium/chrome/browser/net/profile_network_context_service.cc
@@ -34,7 +34,6 @@
#include "chrome/common/pref_names.h"
#include "components/certificate_transparency/pref_names.h"
#include "components/content_settings/core/browser/host_content_settings_map.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
#include "components/language/core/browser/pref_names.h"
#include "components/metrics/metrics_pref_names.h"
#include "components/pref_registry/pref_registry_syncable.h"
@@ -55,7 +54,9 @@
#include "net/ssl/client_cert_store.h"
#include "services/network/public/cpp/cors/origin_access_list.h"
#include "services/network/public/cpp/features.h"
+#include "services/network/public/mojom/network_context.mojom.h"
#include "services/network/public/mojom/network_service.mojom.h"
+#include "third_party/blink/public/common/features.h"
#if defined(OS_CHROMEOS)
#include "chrome/browser/chromeos/certificate_provider/certificate_provider.h"
@@ -117,26 +118,6 @@ std::string ComputeAcceptLanguageFromPref(const std::string& language_pref) {
}
#if defined(OS_CHROMEOS)
-bool ShouldUseBuiltinCertVerifier(Profile* profile) {
- base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
- if (command_line->HasSwitch(chromeos::switches::kForceCertVerifierBuiltin))
- return true;
-
- if (chromeos::ProfileHelper::Get()->IsSigninProfile(profile) ||
- chromeos::ProfileHelper::Get()->IsLockScreenAppProfile(profile)) {
- return true;
- }
-
- const PrefService::Preference* builtin_cert_verifier_enabled_pref =
- g_browser_process->local_state()->FindPreference(
- prefs::kBuiltinCertificateVerifierEnabled);
- if (builtin_cert_verifier_enabled_pref->IsManaged())
- return builtin_cert_verifier_enabled_pref->GetValue()->GetBool();
-
- return base::FeatureList::IsEnabled(
- net::features::kCertVerifierBuiltinFeature);
-}
-
network::mojom::AdditionalCertificatesPtr GetAdditionalCertificates(
const policy::PolicyCertService* policy_cert_service,
const base::FilePath& storage_partition_path) {
@@ -146,7 +127,6 @@ network::mojom::AdditionalCertificatesPtr GetAdditionalCertificates(
&(additional_certificates->trust_anchors));
return additional_certificates;
}
-
#endif // defined (OS_CHROMEOS)
void InitializeCorsExtraSafelistedRequestHeaderNamesForProfile(
@@ -244,12 +224,6 @@ ProfileNetworkContextService::ProfileNetworkContextService(Profile* profile)
pref_change_registrar_.Init(profile_prefs);
-#if defined(OS_CHROMEOS)
- using_builtin_cert_verifier_ = ShouldUseBuiltinCertVerifier(profile_);
- VLOG(0) << "Using " << (using_builtin_cert_verifier_ ? "built-in" : "legacy")
- << " cert verifier.";
-#endif // OS_CHROMEOS
-
// When any of the following CT preferences change, we schedule an update
// to aggregate the actual update using a |ct_policy_update_timer_|.
pref_change_registrar_.Add(
@@ -283,20 +257,16 @@ ProfileNetworkContextService::ProfileNetworkContextService(Profile* profile)
base::Unretained(this)));
}
-ProfileNetworkContextService::~ProfileNetworkContextService() {}
+ProfileNetworkContextService::~ProfileNetworkContextService() = default;
-mojo::Remote<network::mojom::NetworkContext>
-ProfileNetworkContextService::CreateNetworkContext(
+void ProfileNetworkContextService::ConfigureNetworkContextParams(
bool in_memory,
- const base::FilePath& relative_partition_path) {
- mojo::Remote<network::mojom::NetworkContext> network_context;
-
- content::GetNetworkService()->CreateNetworkContext(
- network_context.BindNewPipeAndPassReceiver(),
- CreateNetworkContextParams(in_memory, relative_partition_path));
-
- network_context->SetSplitAuthCacheByNetworkIsolationKey(
- ShouldSplitAuthCacheByNetworkIsolationKey());
+ const base::FilePath& relative_partition_path,
+ network::mojom::NetworkContextParams* network_context_params,
+ network::mojom::CertVerifierCreationParams* cert_verifier_creation_params) {
+ ConfigureNetworkContextParamsInternal(in_memory, relative_partition_path,
+ network_context_params,
+ cert_verifier_creation_params);
if ((!in_memory && !profile_->IsOffTheRecord())) {
// TODO(jam): delete this code 1 year after Network Service shipped to all
@@ -313,11 +283,6 @@ ProfileNetworkContextService::CreateNetworkContext(
base::BindOnce(base::IgnoreResult(&base::DeleteFile), media_cache_path,
true /* recursive */));
}
-
- std::vector<network::mojom::NetworkContext*> contexts{network_context.get()};
- UpdateCTPolicyForContexts(contexts);
-
- return network_context;
}
#if defined(OS_CHROMEOS)
@@ -410,8 +375,7 @@ void ProfileNetworkContextService::UpdateReferrersEnabled() {
enable_referrers_.GetValue()));
}
-void ProfileNetworkContextService::UpdateCTPolicyForContexts(
- const std::vector<network::mojom::NetworkContext*>& contexts) {
+network::mojom::CTPolicyPtr ProfileNetworkContextService::GetCTPolicy() {
auto* prefs = profile_->GetPrefs();
const base::ListValue* ct_required =
prefs->GetList(certificate_transparency::prefs::kCTRequiredHosts);
@@ -429,9 +393,15 @@ void ProfileNetworkContextService::UpdateCTPolicyForContexts(
std::vector<std::string> excluded_legacy_spkis(
TranslateStringArray(ct_excluded_legacy_spkis));
+ return network::mojom::CTPolicy::New(std::move(required), std::move(excluded),
+ std::move(excluded_spkis),
+ std::move(excluded_legacy_spkis));
+}
+
+void ProfileNetworkContextService::UpdateCTPolicyForContexts(
+ const std::vector<network::mojom::NetworkContext*>& contexts) {
for (auto* context : contexts) {
- context->SetCTPolicy(required, excluded, excluded_spkis,
- excluded_legacy_spkis);
+ context->SetCTPolicy(GetCTPolicy());
}
}
@@ -527,6 +497,15 @@ ProfileNetworkContextService::CreateCookieManagerParams(
&settings_for_legacy_cookie_access);
out->settings_for_legacy_cookie_access =
std::move(settings_for_legacy_cookie_access);
+
+ ContentSettingsForOneType settings_for_storage_access;
+ if (base::FeatureList::IsEnabled(blink::features::kStorageAccessAPI)) {
+ host_content_settings_map->GetSettingsForOneType(
+ ContentSettingsType::STORAGE_ACCESS, std::string(),
+ &settings_for_storage_access);
+ }
+ out->settings_for_storage_access = std::move(settings_for_storage_access);
+
out->cookie_access_delegate_type =
network::mojom::CookieAccessDelegateType::USE_CONTENT_SETTINGS;
return out;
@@ -631,17 +610,18 @@ bool GetHttpCacheBackendResetParam(PrefService* local_state) {
current_field_trial_status != previous_field_trial_status;
}
-network::mojom::NetworkContextParamsPtr
-ProfileNetworkContextService::CreateNetworkContextParams(
+void ProfileNetworkContextService::ConfigureNetworkContextParamsInternal(
bool in_memory,
- const base::FilePath& relative_partition_path) {
+ const base::FilePath& relative_partition_path,
+ network::mojom::NetworkContextParams* network_context_params,
+ network::mojom::CertVerifierCreationParams* cert_verifier_creation_params) {
if (profile_->IsOffTheRecord())
in_memory = true;
base::FilePath path(GetPartitionPath(relative_partition_path));
- network::mojom::NetworkContextParamsPtr network_context_params =
- g_browser_process->system_network_context_manager()
- ->CreateDefaultNetworkContextParams();
+ g_browser_process->system_network_context_manager()
+ ->ConfigureDefaultNetworkContextParams(network_context_params,
+ cert_verifier_creation_params);
network_context_params->context_name = std::string("main");
@@ -750,27 +730,32 @@ ProfileNetworkContextService::CreateNetworkContextParams(
base::FeatureList::IsEnabled(features::kFtpProtocol);
#endif // !BUILDFLAG(DISABLE_FTP_SUPPORT)
- proxy_config_monitor_.AddToNetworkContextParams(network_context_params.get());
+ proxy_config_monitor_.AddToNetworkContextParams(network_context_params);
network_context_params->enable_certificate_reporting = true;
network_context_params->enable_expect_ct_reporting = true;
+ network_context_params->ct_policy = GetCTPolicy();
+
#if BUILDFLAG(TRIAL_COMPARISON_CERT_VERIFIER_SUPPORTED)
// Require the use_builtin_cert_verifier to be explicitly initialized, as
// using the TrialComparisonCertVerifier requires knowing whether Chrome is
// using the system verifier.
- DCHECK_NE(network_context_params->use_builtin_cert_verifier,
- network::mojom::NetworkContextParams::CertVerifierImpl::kDefault);
+ DCHECK(cert_verifier_creation_params);
+ DCHECK_NE(
+ cert_verifier_creation_params->use_builtin_cert_verifier,
+ network::mojom::CertVerifierCreationParams::CertVerifierImpl::kDefault);
if (!in_memory &&
- network_context_params->use_builtin_cert_verifier ==
- network::mojom::NetworkContextParams::CertVerifierImpl::kSystem &&
+ cert_verifier_creation_params->use_builtin_cert_verifier ==
+ network::mojom::CertVerifierCreationParams::CertVerifierImpl::
+ kSystem &&
TrialComparisonCertVerifierController::MaybeAllowedForProfile(profile_)) {
mojo::PendingRemote<network::mojom::TrialComparisonCertVerifierConfigClient>
config_client;
auto config_client_receiver =
config_client.InitWithNewPipeAndPassReceiver();
- network_context_params->trial_comparison_cert_verifier_params =
+ cert_verifier_creation_params->trial_comparison_cert_verifier_params =
network::mojom::TrialComparisonCertVerifierParams::New();
if (!trial_comparison_cert_verifier_controller_) {
@@ -779,12 +764,12 @@ ProfileNetworkContextService::CreateNetworkContextParams(
}
trial_comparison_cert_verifier_controller_->AddClient(
std::move(config_client),
- network_context_params->trial_comparison_cert_verifier_params
+ cert_verifier_creation_params->trial_comparison_cert_verifier_params
->report_client.InitWithNewPipeAndPassReceiver());
- network_context_params->trial_comparison_cert_verifier_params
+ cert_verifier_creation_params->trial_comparison_cert_verifier_params
->initial_allowed =
trial_comparison_cert_verifier_controller_->IsAllowed();
- network_context_params->trial_comparison_cert_verifier_params
+ cert_verifier_creation_params->trial_comparison_cert_verifier_params
->config_client_receiver = std::move(config_client_receiver);
}
#endif
@@ -802,25 +787,16 @@ ProfileNetworkContextService::CreateNetworkContextParams(
metrics::prefs::kMetricsReportingEnabled);
}
- if (data_reduction_proxy::params::IsEnabledWithNetworkService()) {
- auto* drp_settings =
- DataReductionProxyChromeSettingsFactory::GetForBrowserContext(profile_);
- if (drp_settings) {
- mojo::Remote<network::mojom::CustomProxyConfigClient> config_client;
- network_context_params->custom_proxy_config_client_receiver =
- config_client.BindNewPipeAndPassReceiver();
- drp_settings->AddCustomProxyConfigClient(std::move(config_client));
- }
+ auto* drp_settings =
+ DataReductionProxyChromeSettingsFactory::GetForBrowserContext(profile_);
+ if (drp_settings) {
+ mojo::Remote<network::mojom::CustomProxyConfigClient> config_client;
+ network_context_params->custom_proxy_config_client_receiver =
+ config_client.BindNewPipeAndPassReceiver();
+ drp_settings->AddCustomProxyConfigClient(std::move(config_client));
}
#if defined(OS_CHROMEOS)
- // Note: On non-ChromeOS platforms, the |use_builtin_cert_verifier| param
- // value is inherited from CreateDefaultNetworkContextParams.
- network_context_params->use_builtin_cert_verifier =
- using_builtin_cert_verifier_
- ? network::mojom::NetworkContextParams::CertVerifierImpl::kBuiltin
- : network::mojom::NetworkContextParams::CertVerifierImpl::kSystem;
-
bool profile_supports_policy_certs = false;
if (chromeos::ProfileHelper::IsSigninProfile(profile_))
profile_supports_policy_certs = true;
@@ -833,8 +809,8 @@ ProfileNetworkContextService::CreateNetworkContextParams(
// username hash is empty, even when the NSS is not initialized for the
// user.
if (user && !user->username_hash().empty()) {
- network_context_params->username_hash = user->username_hash();
- network_context_params->nss_path = profile_->GetPath();
+ cert_verifier_creation_params->username_hash = user->username_hash();
+ cert_verifier_creation_params->nss_path = profile_->GetPath();
profile_supports_policy_certs = true;
}
}
@@ -858,7 +834,12 @@ ProfileNetworkContextService::CreateNetworkContextParams(
network_context_params->reset_http_cache_backend =
GetHttpCacheBackendResetParam(g_browser_process->local_state());
- return network_context_params;
+ network_context_params->split_auth_cache_by_network_isolation_key =
+ ShouldSplitAuthCacheByNetworkIsolationKey();
+
+ // All consumers of the main NetworkContext must provide NetworkIsolationKeys
+ // / IsolationInfos, so storage can be isolated on a per-site basis.
+ network_context_params->require_network_isolation_key = true;
}
base::FilePath ProfileNetworkContextService::GetPartitionPath(
diff --git a/chromium/chrome/browser/net/profile_network_context_service.h b/chromium/chrome/browser/net/profile_network_context_service.h
index 82941477e64..be3bf57fd91 100644
--- a/chromium/chrome/browser/net/profile_network_context_service.h
+++ b/chromium/chrome/browser/net/profile_network_context_service.h
@@ -59,17 +59,18 @@ class ProfileNetworkContextService
explicit ProfileNetworkContextService(Profile* profile);
~ProfileNetworkContextService() override;
- // Creates a NetworkContext for the BrowserContext, using the specified
- // parameters. An empty |relative_partition_path| corresponds to the main
- // network context.
- mojo::Remote<network::mojom::NetworkContext> CreateNetworkContext(
+ // Configures the NetworkContextParams and the CertVerifierCreationParams for
+ // the BrowserContext, using the specified parameters. An empty
+ // |relative_partition_path| corresponds to the main network context.
+ void ConfigureNetworkContextParams(
bool in_memory,
- const base::FilePath& relative_partition_path);
+ const base::FilePath& relative_partition_path,
+ network::mojom::NetworkContextParams* network_context_params,
+ network::mojom::CertVerifierCreationParams*
+ cert_verifier_creation_params);
#if defined(OS_CHROMEOS)
void UpdateAdditionalCertificates();
-
- bool using_builtin_cert_verifier() { return using_builtin_cert_verifier_; }
#endif
static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
@@ -119,6 +120,9 @@ class ProfileNetworkContextService
void UpdateReferrersEnabled();
+ // Gets the current CTPolicy from preferences.
+ network::mojom::CTPolicyPtr GetCTPolicy();
+
// Update the CTPolicy for the given NetworkContexts.
void UpdateCTPolicyForContexts(
const std::vector<network::mojom::NetworkContext*>& contexts);
@@ -137,9 +141,12 @@ class ProfileNetworkContextService
// Creates parameters for the NetworkContext. Use |in_memory| instead of
// |profile_->IsOffTheRecord()| because sometimes normal profiles want off the
// record partitions (e.g. for webview tag).
- network::mojom::NetworkContextParamsPtr CreateNetworkContextParams(
+ void ConfigureNetworkContextParamsInternal(
bool in_memory,
- const base::FilePath& relative_partition_path);
+ const base::FilePath& relative_partition_path,
+ network::mojom::NetworkContextParams* network_context_params,
+ network::mojom::CertVerifierCreationParams*
+ cert_verifier_creation_params);
// Returns the path for a given storage partition.
base::FilePath GetPartitionPath(
@@ -183,10 +190,6 @@ class ProfileNetworkContextService
base::RepeatingCallback<std::unique_ptr<net::ClientCertStore>()>
client_cert_store_factory_;
-#if defined(OS_CHROMEOS)
- bool using_builtin_cert_verifier_;
-#endif
-
DISALLOW_COPY_AND_ASSIGN(ProfileNetworkContextService);
};
diff --git a/chromium/chrome/browser/net/profile_network_context_service_browsertest.cc b/chromium/chrome/browser/net/profile_network_context_service_browsertest.cc
index a72b0b8ad0b..5bd46dd35db 100644
--- a/chromium/chrome/browser/net/profile_network_context_service_browsertest.cc
+++ b/chromium/chrome/browser/net/profile_network_context_service_browsertest.cc
@@ -35,10 +35,12 @@
#include "chrome/common/pref_names.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
+#include "components/policy/core/common/policy_map.h"
#include "components/policy/policy_constants.h"
#include "components/prefs/pref_service.h"
#include "content/public/browser/storage_partition.h"
#include "content/public/common/content_features.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/simple_url_loader_test_helper.h"
#include "mojo/public/cpp/system/data_pipe_utils.h"
#include "net/base/features.h"
@@ -55,21 +57,6 @@
#include "services/network/public/mojom/url_loader_factory.mojom.h"
#include "testing/gtest/include/gtest/gtest.h"
-#if defined(OS_CHROMEOS)
-#include "chrome/browser/chromeos/policy/login_policy_test_base.h"
-#include "chrome/browser/chromeos/policy/user_policy_test_helper.h"
-#include "chrome/browser/chromeos/profiles/profile_helper.h"
-#include "components/policy/policy_constants.h"
-#include "net/base/features.h"
-#endif // defined(OS_CHROMEOS)
-
-#if BUILDFLAG(BUILTIN_CERT_VERIFIER_FEATURE_SUPPORTED)
-#include "chrome/browser/policy/policy_test_utils.h"
-#include "components/policy/core/common/policy_map.h"
-#include "components/policy/policy_constants.h"
-#include "net/base/features.h"
-#endif
-
// Most tests for this class are in NetworkContextConfigurationBrowserTest.
class ProfileNetworkContextServiceBrowsertest : public InProcessBrowserTest {
public:
@@ -134,10 +121,12 @@ IN_PROC_BROWSER_TEST_F(ProfileNetworkContextServiceBrowsertest,
ProfileNetworkContextService* profile_network_context_service =
ProfileNetworkContextServiceFactory::GetForContext(browser()->profile());
base::FilePath empty_relative_partition_path;
- network::mojom::NetworkContextParamsPtr network_context_params_ptr =
- profile_network_context_service->CreateNetworkContextParams(
- /*in_memory=*/false, empty_relative_partition_path);
- EXPECT_EQ(0, network_context_params_ptr->http_cache_max_size);
+ network::mojom::NetworkContextParams network_context_params;
+ network::mojom::CertVerifierCreationParams cert_verifier_creation_params;
+ profile_network_context_service->ConfigureNetworkContextParams(
+ /*in_memory=*/false, empty_relative_partition_path,
+ &network_context_params, &cert_verifier_creation_params);
+ EXPECT_EQ(0, network_context_params.http_cache_max_size);
}
IN_PROC_BROWSER_TEST_F(ProfileNetworkContextServiceBrowsertest, BrotliEnabled) {
@@ -442,149 +431,15 @@ IN_PROC_BROWSER_TEST_F(ProfileNetworkContextServiceDiskCacheBrowsertest,
ProfileNetworkContextService* profile_network_context_service =
ProfileNetworkContextServiceFactory::GetForContext(browser()->profile());
base::FilePath empty_relative_partition_path;
- network::mojom::NetworkContextParamsPtr network_context_params_ptr =
- profile_network_context_service->CreateNetworkContextParams(
- /*in_memory=*/false, empty_relative_partition_path);
- EXPECT_EQ(kCacheSize, network_context_params_ptr->http_cache_max_size);
+ network::mojom::NetworkContextParams network_context_params;
+ network::mojom::CertVerifierCreationParams cert_verifier_creation_params;
+ profile_network_context_service->ConfigureNetworkContextParams(
+ /*in_memory=*/false, empty_relative_partition_path,
+ &network_context_params, &cert_verifier_creation_params);
+ EXPECT_EQ(kCacheSize, network_context_params.http_cache_max_size);
}
-#if defined(OS_CHROMEOS)
-// Base class for verifying which certificate verifier is being used on Chrome
-// OS depending on feature state and policies.
-class ProfileNetworkContextServiceCertVerifierBrowsertestBase
- : public policy::LoginPolicyTestBase {
- public:
- ProfileNetworkContextServiceCertVerifierBrowsertestBase() = default;
- ~ProfileNetworkContextServiceCertVerifierBrowsertestBase() override = default;
-
- protected:
- void SetPolicyValue(base::StringPiece policy_key, base::Value value) {
- policy_values_.SetKey(policy_key, std::move(value));
- user_policy_helper()->SetPolicy(policy_values_,
- base::Value(base::Value::Type::DICTIONARY));
- }
-
- bool IsSigninProfileUsingBuiltinCertVerifier() {
- Profile* const profile = chromeos::ProfileHelper::GetSigninProfile();
- ProfileNetworkContextService* const service =
- ProfileNetworkContextServiceFactory::GetForContext(profile);
- return service->using_builtin_cert_verifier();
- }
-
- bool IsActiveProfileUsingBuiltinCertVerifier() {
- Profile* const profile = GetProfileForActiveUser();
- ProfileNetworkContextService* const service =
- ProfileNetworkContextServiceFactory::GetForContext(profile);
- return service->using_builtin_cert_verifier();
- }
-
- base::test::ScopedFeatureList scoped_feature_list_;
-
- private:
- base::Value policy_values_{base::Value::Type::DICTIONARY};
-
- DISALLOW_COPY_AND_ASSIGN(
- ProfileNetworkContextServiceCertVerifierBrowsertestBase);
-};
-
-// When using this class, the built-in certificate verifier has been enabled
-// using the UseBuiltinCertVerifier feature.
-class ProfileNetworkContextServiceCertVerifierBuiltinEnabledBrowsertest
- : public ProfileNetworkContextServiceCertVerifierBrowsertestBase {
- public:
- ProfileNetworkContextServiceCertVerifierBuiltinEnabledBrowsertest() = default;
- ~ProfileNetworkContextServiceCertVerifierBuiltinEnabledBrowsertest()
- override = default;
-
- void SetUpInProcessBrowserTestFixture() override {
- scoped_feature_list_.InitAndEnableFeature(
- net::features::kCertVerifierBuiltinFeature);
- ProfileNetworkContextServiceCertVerifierBrowsertestBase::
- SetUpInProcessBrowserTestFixture();
- }
-
- private:
- DISALLOW_COPY_AND_ASSIGN(
- ProfileNetworkContextServiceCertVerifierBuiltinEnabledBrowsertest);
-};
-
-// If the built-in cert verifier is enabled and no policy is present, it should
-// be enabled on the sign-in screen and in the user profile.
-IN_PROC_BROWSER_TEST_F(
- ProfileNetworkContextServiceCertVerifierBuiltinEnabledBrowsertest,
- TurnedOnByFeature) {
- SkipToLoginScreen();
- EXPECT_TRUE(IsSigninProfileUsingBuiltinCertVerifier());
-
- LogIn(kAccountId, kAccountPassword, kEmptyServices);
-
- EXPECT_TRUE(IsActiveProfileUsingBuiltinCertVerifier());
-}
-
-// If the built-in cert verifier is enabled, but user policy says to disable it,
-// it should be disabled in the user profile.
-IN_PROC_BROWSER_TEST_F(
- ProfileNetworkContextServiceCertVerifierBuiltinEnabledBrowsertest,
- TurnedOffByLegacyPolicy) {
- SkipToLoginScreen();
-
- SetPolicyValue(policy::key::kBuiltinCertificateVerifierEnabled,
- base::Value(false));
- LogIn(kAccountId, kAccountPassword, kEmptyServices);
-
- EXPECT_FALSE(IsActiveProfileUsingBuiltinCertVerifier());
-}
-
-// When using this class, the built-in certificate verifier has been disabled
-// using the UseBuiltinCertVerifier feature.
-class ProfileNetworkContextServiceCertVerifierBuiltinDisabledBrowsertest
- : public ProfileNetworkContextServiceCertVerifierBrowsertestBase {
- public:
- ProfileNetworkContextServiceCertVerifierBuiltinDisabledBrowsertest() =
- default;
- ~ProfileNetworkContextServiceCertVerifierBuiltinDisabledBrowsertest()
- override = default;
-
- void SetUpInProcessBrowserTestFixture() override {
- scoped_feature_list_.InitAndDisableFeature(
- net::features::kCertVerifierBuiltinFeature);
- ProfileNetworkContextServiceCertVerifierBrowsertestBase::
- SetUpInProcessBrowserTestFixture();
- }
-
- private:
- DISALLOW_COPY_AND_ASSIGN(
- ProfileNetworkContextServiceCertVerifierBuiltinDisabledBrowsertest);
-};
-
-// If the built-in cert verifier feature is disabled, it should be disabled in
-// user profiles but enabled in the sign-in profile.
-IN_PROC_BROWSER_TEST_F(
- ProfileNetworkContextServiceCertVerifierBuiltinDisabledBrowsertest,
- TurnedOffByFeature) {
- SkipToLoginScreen();
- EXPECT_TRUE(IsSigninProfileUsingBuiltinCertVerifier());
-
- LogIn(kAccountId, kAccountPassword, kEmptyServices);
-
- EXPECT_FALSE(IsActiveProfileUsingBuiltinCertVerifier());
-}
-
-// If the built-in cert verifier feature is disabled, but policy force-enables
-// it for a profile, it should be enabled in the profile.
-IN_PROC_BROWSER_TEST_F(
- ProfileNetworkContextServiceCertVerifierBuiltinDisabledBrowsertest,
- TurnedOffByFeatureOverrideByPolicy) {
- SkipToLoginScreen();
- EXPECT_TRUE(IsSigninProfileUsingBuiltinCertVerifier());
-
- SetPolicyValue(policy::key::kBuiltinCertificateVerifierEnabled,
- base::Value(true));
- LogIn(kAccountId, kAccountPassword, kEmptyServices);
-
- EXPECT_TRUE(IsActiveProfileUsingBuiltinCertVerifier());
-}
-#elif BUILDFLAG(BUILTIN_CERT_VERIFIER_FEATURE_SUPPORTED)
+#if BUILDFLAG(BUILTIN_CERT_VERIFIER_FEATURE_SUPPORTED)
class ProfileNetworkContextServiceCertVerifierBuiltinFeaturePolicyTest
: public policy::PolicyTest,
public testing::WithParamInterface<bool> {
@@ -606,14 +461,19 @@ IN_PROC_BROWSER_TEST_P(
ProfileNetworkContextService* profile_network_context_service =
ProfileNetworkContextServiceFactory::GetForContext(browser()->profile());
base::FilePath empty_relative_partition_path;
- network::mojom::NetworkContextParamsPtr network_context_params_ptr =
- profile_network_context_service->CreateNetworkContextParams(
- /*in_memory=*/false, empty_relative_partition_path);
- EXPECT_EQ(
- GetParam()
- ? network::mojom::NetworkContextParams::CertVerifierImpl::kBuiltin
- : network::mojom::NetworkContextParams::CertVerifierImpl::kSystem,
- network_context_params_ptr->use_builtin_cert_verifier);
+ {
+ network::mojom::NetworkContextParams network_context_params;
+ network::mojom::CertVerifierCreationParams cert_verifier_creation_params;
+ profile_network_context_service->ConfigureNetworkContextParams(
+ /*in_memory=*/false, empty_relative_partition_path,
+ &network_context_params, &cert_verifier_creation_params);
+
+ EXPECT_EQ(GetParam() ? network::mojom::CertVerifierCreationParams::
+ CertVerifierImpl::kBuiltin
+ : network::mojom::CertVerifierCreationParams::
+ CertVerifierImpl::kSystem,
+ cert_verifier_creation_params.use_builtin_cert_verifier);
+ }
#if BUILDFLAG(BUILTIN_CERT_VERIFIER_POLICY_SUPPORTED)
// If the BuiltinCertificateVerifierEnabled policy is set it should override
@@ -623,29 +483,39 @@ IN_PROC_BROWSER_TEST_P(
std::make_unique<base::Value>(true));
UpdateProviderPolicy(policies);
- network_context_params_ptr =
- profile_network_context_service->CreateNetworkContextParams(
- /*in_memory=*/false, empty_relative_partition_path);
- EXPECT_EQ(network::mojom::NetworkContextParams::CertVerifierImpl::kBuiltin,
- network_context_params_ptr->use_builtin_cert_verifier);
+ {
+ network::mojom::NetworkContextParams network_context_params;
+ network::mojom::CertVerifierCreationParams cert_verifier_creation_params;
+ profile_network_context_service->ConfigureNetworkContextParams(
+ /*in_memory=*/false, empty_relative_partition_path,
+ &network_context_params, &cert_verifier_creation_params);
+ EXPECT_EQ(
+ network::mojom::CertVerifierCreationParams::CertVerifierImpl::kBuiltin,
+ cert_verifier_creation_params.use_builtin_cert_verifier);
+ }
SetPolicy(&policies, policy::key::kBuiltinCertificateVerifierEnabled,
std::make_unique<base::Value>(false));
UpdateProviderPolicy(policies);
- network_context_params_ptr =
- profile_network_context_service->CreateNetworkContextParams(
- /*in_memory=*/false, empty_relative_partition_path);
- EXPECT_EQ(network::mojom::NetworkContextParams::CertVerifierImpl::kSystem,
- network_context_params_ptr->use_builtin_cert_verifier);
-#endif
+ {
+ network::mojom::NetworkContextParams network_context_params;
+ network::mojom::CertVerifierCreationParams cert_verifier_creation_params;
+ profile_network_context_service->ConfigureNetworkContextParams(
+ /*in_memory=*/false, empty_relative_partition_path,
+ &network_context_params, &cert_verifier_creation_params);
+ EXPECT_EQ(
+ network::mojom::CertVerifierCreationParams::CertVerifierImpl::kSystem,
+ cert_verifier_creation_params.use_builtin_cert_verifier);
+ }
+#endif // BUILDFLAG(BUILTIN_CERT_VERIFIER_POLICY_SUPPORTED)
}
INSTANTIATE_TEST_SUITE_P(
All,
ProfileNetworkContextServiceCertVerifierBuiltinFeaturePolicyTest,
::testing::Bool());
-#endif
+#endif // BUILDFLAG(BUILTIN_CERT_VERIFIER_FEATURE_SUPPORTED)
enum class CorsTestMode {
kWithCorsMitigationListPolicy,
diff --git a/chromium/chrome/browser/net/profile_network_context_service_test_utils.cc b/chromium/chrome/browser/net/profile_network_context_service_test_utils.cc
index b768aac1687..0e850e4c4b2 100644
--- a/chromium/chrome/browser/net/profile_network_context_service_test_utils.cc
+++ b/chromium/chrome/browser/net/profile_network_context_service_test_utils.cc
@@ -17,6 +17,7 @@
#include "chrome/common/chrome_features.h"
#include "chrome/test/base/search_test_utils.h"
#include "chrome/test/base/ui_test_utils.h"
+#include "services/network/public/mojom/network_context.mojom.h"
#include "testing/gtest/include/gtest/gtest.h"
enum class AmbientAuthProfileBit {
@@ -80,10 +81,12 @@ bool AmbientAuthenticationTestHelper::IsAmbientAuthAllowedForProfile(
ProfileNetworkContextService* profile_network_context_service =
ProfileNetworkContextServiceFactory::GetForContext(profile);
base::FilePath empty_relative_partition_path;
- network::mojom::NetworkContextParamsPtr network_context_params_ptr =
- profile_network_context_service->CreateNetworkContextParams(
- /*in_memory=*/false, empty_relative_partition_path);
- return network_context_params_ptr->http_auth_static_network_context_params
+ network::mojom::NetworkContextParams network_context_params;
+ network::mojom::CertVerifierCreationParams cert_verifier_creation_params;
+ profile_network_context_service->ConfigureNetworkContextParams(
+ /*in_memory=*/false, empty_relative_partition_path,
+ &network_context_params, &cert_verifier_creation_params);
+ return network_context_params.http_auth_static_network_context_params
->allow_default_credentials ==
net::HttpAuthPreferences::ALLOW_DEFAULT_CREDENTIALS;
}
diff --git a/chromium/chrome/browser/net/proxy_browsertest.cc b/chromium/chrome/browser/net/proxy_browsertest.cc
index e1ac8cacc9d..7f29ba9a19d 100644
--- a/chromium/chrome/browser/net/proxy_browsertest.cc
+++ b/chromium/chrome/browser/net/proxy_browsertest.cc
@@ -29,6 +29,7 @@
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/url_loader_interceptor.h"
#include "google_apis/gaia/gaia_urls.h"
diff --git a/chromium/chrome/browser/net/referrer.cc b/chromium/chrome/browser/net/referrer.cc
index ea3a6550718..95598b5ec53 100644
--- a/chromium/chrome/browser/net/referrer.cc
+++ b/chromium/chrome/browser/net/referrer.cc
@@ -10,8 +10,8 @@
#include <memory>
#include <utility>
+#include "base/check_op.h"
#include "base/compiler_specific.h"
-#include "base/logging.h"
#include "base/values.h"
namespace chrome_browser_net {
diff --git a/chromium/chrome/browser/net/referrer_policy_policy_browsertest.cc b/chromium/chrome/browser/net/referrer_policy_policy_browsertest.cc
index caa06f84b46..b1bea934bb6 100644
--- a/chromium/chrome/browser/net/referrer_policy_policy_browsertest.cc
+++ b/chromium/chrome/browser/net/referrer_policy_policy_browsertest.cc
@@ -13,6 +13,7 @@
#include "components/policy/core/common/policy_types.h"
#include "components/policy/policy_constants.h"
#include "content/public/common/referrer.h"
+#include "content/public/test/browser_test.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
diff --git a/chromium/chrome/browser/net/reporting_browsertest.cc b/chromium/chrome/browser/net/reporting_browsertest.cc
index 03eed3f603a..1ac33aeb99a 100644
--- a/chromium/chrome/browser/net/reporting_browsertest.cc
+++ b/chromium/chrome/browser/net/reporting_browsertest.cc
@@ -21,6 +21,7 @@
#include "content/public/browser/render_process_host.h"
#include "content/public/common/result_codes.h"
#include "content/public/common/url_constants.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/no_renderer_crashes_assertion.h"
#include "content/public/test/test_navigation_observer.h"
#include "net/dns/mock_host_resolver.h"
diff --git a/chromium/chrome/browser/net/samesite_cookies_policy_browsertest.cc b/chromium/chrome/browser/net/samesite_cookies_policy_browsertest.cc
index 5028e155e2b..e2b61208734 100644
--- a/chromium/chrome/browser/net/samesite_cookies_policy_browsertest.cc
+++ b/chromium/chrome/browser/net/samesite_cookies_policy_browsertest.cc
@@ -12,6 +12,7 @@
#include "chrome/test/base/in_process_browser_test.h"
#include "components/policy/core/common/policy_map.h"
#include "components/policy/policy_constants.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_utils.h"
#include "net/base/features.h"
diff --git a/chromium/chrome/browser/net/secure_dns_config.cc b/chromium/chrome/browser/net/secure_dns_config.cc
new file mode 100644
index 00000000000..7f1390dd207
--- /dev/null
+++ b/chromium/chrome/browser/net/secure_dns_config.cc
@@ -0,0 +1,46 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/net/secure_dns_config.h"
+
+// static
+constexpr char SecureDnsConfig::kModeOff[];
+constexpr char SecureDnsConfig::kModeAutomatic[];
+constexpr char SecureDnsConfig::kModeSecure[];
+
+SecureDnsConfig::SecureDnsConfig(
+ net::DnsConfig::SecureDnsMode mode,
+ std::vector<net::DnsOverHttpsServerConfig> servers,
+ ManagementMode management_mode)
+ : mode_(mode),
+ servers_(std::move(servers)),
+ management_mode_(management_mode) {}
+SecureDnsConfig::SecureDnsConfig(SecureDnsConfig&& other) = default;
+SecureDnsConfig& SecureDnsConfig::operator=(SecureDnsConfig&& other) = default;
+SecureDnsConfig::~SecureDnsConfig() = default;
+
+// static
+base::Optional<net::DnsConfig::SecureDnsMode> SecureDnsConfig::ParseMode(
+ base::StringPiece name) {
+ if (name == kModeSecure) {
+ return net::DnsConfig::SecureDnsMode::SECURE;
+ } else if (name == kModeAutomatic) {
+ return net::DnsConfig::SecureDnsMode::AUTOMATIC;
+ } else if (name == kModeOff) {
+ return net::DnsConfig::SecureDnsMode::OFF;
+ }
+ return base::nullopt;
+}
+
+// static
+const char* SecureDnsConfig::ModeToString(net::DnsConfig::SecureDnsMode mode) {
+ switch (mode) {
+ case net::DnsConfig::SecureDnsMode::SECURE:
+ return kModeSecure;
+ case net::DnsConfig::SecureDnsMode::AUTOMATIC:
+ return kModeAutomatic;
+ case net::DnsConfig::SecureDnsMode::OFF:
+ return kModeOff;
+ }
+}
diff --git a/chromium/chrome/browser/net/secure_dns_config.h b/chromium/chrome/browser/net/secure_dns_config.h
new file mode 100644
index 00000000000..f9d4ca156a4
--- /dev/null
+++ b/chromium/chrome/browser/net/secure_dns_config.h
@@ -0,0 +1,65 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_NET_SECURE_DNS_CONFIG_H_
+#define CHROME_BROWSER_NET_SECURE_DNS_CONFIG_H_
+
+#include <vector>
+
+#include "base/optional.h"
+#include "base/strings/string_piece.h"
+#include "net/dns/dns_config.h"
+
+namespace net {
+struct DnsOverHttpsServerConfig;
+} // namespace net
+
+// Representation of a complete Secure DNS configuration.
+class SecureDnsConfig {
+ public:
+ // Forced management description types. We will check for the override cases
+ // in the order they are listed in the enum.
+ enum class ManagementMode {
+ // Chrome did not override the secure DNS settings.
+ kNoOverride,
+ // Secure DNS was disabled due to detection of a managed environment.
+ kDisabledManaged,
+ // Secure DNS was disabled due to detection of OS-level parental controls.
+ kDisabledParentalControls,
+ };
+
+ // String representations for net::DnsConfig::SecureDnsMode. Used for both
+ // configuration storage and UI state.
+ static constexpr char kModeOff[] = "off";
+ static constexpr char kModeAutomatic[] = "automatic";
+ static constexpr char kModeSecure[] = "secure";
+
+ SecureDnsConfig(net::DnsConfig::SecureDnsMode mode,
+ std::vector<net::DnsOverHttpsServerConfig> servers,
+ ManagementMode management_mode);
+ // This class is move-only to avoid any accidental copying.
+ SecureDnsConfig(SecureDnsConfig&& other);
+ SecureDnsConfig& operator=(SecureDnsConfig&& other);
+ ~SecureDnsConfig();
+
+ // Identifies the SecureDnsMode corresponding to one of the above names, or
+ // returns nullopt if the name is unrecognized.
+ static base::Optional<net::DnsConfig::SecureDnsMode> ParseMode(
+ base::StringPiece name);
+ // Converts a secure DNS mode to one of the above names.
+ static const char* ModeToString(net::DnsConfig::SecureDnsMode mode);
+
+ net::DnsConfig::SecureDnsMode mode() { return mode_; }
+ const std::vector<net::DnsOverHttpsServerConfig>& servers() {
+ return servers_;
+ }
+ ManagementMode management_mode() { return management_mode_; }
+
+ private:
+ net::DnsConfig::SecureDnsMode mode_;
+ std::vector<net::DnsOverHttpsServerConfig> servers_;
+ ManagementMode management_mode_;
+};
+
+#endif // CHROME_BROWSER_NET_SECURE_DNS_CONFIG_H_
diff --git a/chromium/chrome/browser/net/secure_dns_config_unittest.cc b/chromium/chrome/browser/net/secure_dns_config_unittest.cc
new file mode 100644
index 00000000000..d950956d277
--- /dev/null
+++ b/chromium/chrome/browser/net/secure_dns_config_unittest.cc
@@ -0,0 +1,42 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/net/secure_dns_config.h"
+
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+TEST(SecureDnsConfig, ParseMode) {
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF,
+ SecureDnsConfig::ParseMode("off").value());
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::AUTOMATIC,
+ SecureDnsConfig::ParseMode("automatic").value());
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::SECURE,
+ SecureDnsConfig::ParseMode("secure").value());
+
+ EXPECT_FALSE(SecureDnsConfig::ParseMode("foo").has_value());
+ EXPECT_FALSE(SecureDnsConfig::ParseMode("").has_value());
+}
+
+TEST(SecureDnsConfig, ModeToString) {
+ EXPECT_EQ(std::string("off"),
+ SecureDnsConfig::ModeToString(net::DnsConfig::SecureDnsMode::OFF));
+ EXPECT_EQ(
+ std::string("automatic"),
+ SecureDnsConfig::ModeToString(net::DnsConfig::SecureDnsMode::AUTOMATIC));
+ EXPECT_EQ(std::string("secure"), SecureDnsConfig::ModeToString(
+ net::DnsConfig::SecureDnsMode::SECURE));
+}
+
+TEST(SecureDnsConfig, Constructor) {
+ std::vector<net::DnsOverHttpsServerConfig> servers{
+ {{"https://template1", false}, {"https://template2", true}}};
+ SecureDnsConfig config(
+ net::DnsConfig::SecureDnsMode::SECURE, servers,
+ SecureDnsConfig::ManagementMode::kDisabledParentalControls);
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::SECURE, config.mode());
+ EXPECT_THAT(config.servers(), testing::ElementsAreArray(servers));
+ EXPECT_EQ(SecureDnsConfig::ManagementMode::kDisabledParentalControls,
+ config.management_mode());
+}
diff --git a/chromium/chrome/browser/net/secure_dns_policy_handler.cc b/chromium/chrome/browser/net/secure_dns_policy_handler.cc
index db21b9f4747..cb94aec7a7d 100644
--- a/chromium/chrome/browser/net/secure_dns_policy_handler.cc
+++ b/chromium/chrome/browser/net/secure_dns_policy_handler.cc
@@ -9,7 +9,8 @@
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_piece.h"
#include "base/values.h"
-#include "chrome/browser/net/dns_util.h"
+#include "chrome/browser/net/secure_dns_config.h"
+#include "chrome/browser/net/secure_dns_util.h"
#include "chrome/browser/prefs/session_startup_pref.h"
#include "chrome/common/pref_names.h"
#include "components/policy/core/browser/policy_error_map.h"
@@ -45,9 +46,7 @@ bool SecureDnsPolicyHandler::CheckPolicySettings(const PolicyMap& policies,
if (mode_str.size() == 0) {
errors->AddError(key::kDnsOverHttpsMode, IDS_POLICY_NOT_SPECIFIED_ERROR);
mode_is_applicable = false;
- } else if (mode_str != chrome_browser_net::kDnsOverHttpsModeOff &&
- mode_str != chrome_browser_net::kDnsOverHttpsModeAutomatic &&
- mode_str != chrome_browser_net::kDnsOverHttpsModeSecure) {
+ } else if (!SecureDnsConfig::ParseMode(mode_str)) {
errors->AddError(key::kDnsOverHttpsMode,
IDS_POLICY_INVALID_SECURE_DNS_MODE_ERROR);
mode_is_applicable = false;
@@ -75,10 +74,10 @@ bool SecureDnsPolicyHandler::CheckPolicySettings(const PolicyMap& policies,
errors->AddError(key::kDnsOverHttpsTemplates,
IDS_POLICY_SECURE_DNS_TEMPLATES_INVALID_MODE_ERROR);
} else if (templates_str.size() != 0 &&
- mode_str == chrome_browser_net::kDnsOverHttpsModeOff) {
+ mode_str == SecureDnsConfig::kModeOff) {
errors->AddError(key::kDnsOverHttpsTemplates,
IDS_POLICY_SECURE_DNS_TEMPLATES_IRRELEVANT_MODE_ERROR);
- } else if (!chrome_browser_net::IsValidDohTemplateGroup(templates_str)) {
+ } else if (!chrome_browser_net::secure_dns::IsValidGroup(templates_str)) {
errors->AddError(key::kDnsOverHttpsTemplates,
IDS_POLICY_SECURE_DNS_TEMPLATES_INVALID_ERROR);
}
@@ -93,13 +92,11 @@ void SecureDnsPolicyHandler::ApplyPolicySettings(const PolicyMap& policies,
base::StringPiece mode_str;
if (mode && mode->is_string()) {
mode_str = mode->GetString();
- if (mode_str == chrome_browser_net::kDnsOverHttpsModeAutomatic ||
- mode_str == chrome_browser_net::kDnsOverHttpsModeSecure) {
+ if (SecureDnsConfig::ParseMode(mode_str)) {
prefs->SetString(prefs::kDnsOverHttpsMode, mode_str.as_string());
} else {
- // Captures "off".
- prefs->SetString(prefs::kDnsOverHttpsMode,
- chrome_browser_net::kDnsOverHttpsModeOff);
+ // Default to "off".
+ prefs->SetString(prefs::kDnsOverHttpsMode, SecureDnsConfig::kModeOff);
}
}
@@ -115,7 +112,7 @@ void SecureDnsPolicyHandler::ApplyPolicySettings(const PolicyMap& policies,
bool SecureDnsPolicyHandler::IsTemplatesPolicyNotSpecified(
const base::Value* templates,
base::StringPiece mode_str) {
- if (mode_str == chrome_browser_net::kDnsOverHttpsModeSecure) {
+ if (mode_str == SecureDnsConfig::kModeSecure) {
if (!templates)
return true;
diff --git a/chromium/chrome/browser/net/secure_dns_policy_handler_unittest.cc b/chromium/chrome/browser/net/secure_dns_policy_handler_unittest.cc
index 08ab428f9e7..c719a6aee14 100644
--- a/chromium/chrome/browser/net/secure_dns_policy_handler_unittest.cc
+++ b/chromium/chrome/browser/net/secure_dns_policy_handler_unittest.cc
@@ -14,7 +14,7 @@
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
-#include "chrome/browser/net/dns_util.h"
+#include "chrome/browser/net/secure_dns_config.h"
#include "chrome/browser/prefs/session_startup_pref.h"
#include "chrome/common/pref_names.h"
#include "components/policy/core/browser/configuration_policy_handler.h"
@@ -145,8 +145,7 @@ TEST_F(SecureDnsPolicyHandlerTest, InvalidModePolicyType) {
}
TEST_F(SecureDnsPolicyHandlerTest, ValidModePolicyValueOff) {
- const std::string test_policy_value =
- chrome_browser_net::kDnsOverHttpsModeOff;
+ const std::string test_policy_value = SecureDnsConfig::kModeOff;
SetPolicyValue(key::kDnsOverHttpsMode,
std::make_unique<base::Value>(test_policy_value));
@@ -163,8 +162,7 @@ TEST_F(SecureDnsPolicyHandlerTest, ValidModePolicyValueOff) {
}
TEST_F(SecureDnsPolicyHandlerTest, ValidModePolicyValueAutomatic) {
- const std::string test_policy_value =
- chrome_browser_net::kDnsOverHttpsModeAutomatic;
+ const std::string test_policy_value = SecureDnsConfig::kModeAutomatic;
SetPolicyValue(key::kDnsOverHttpsMode,
std::make_unique<base::Value>(test_policy_value));
@@ -181,8 +179,7 @@ TEST_F(SecureDnsPolicyHandlerTest, ValidModePolicyValueAutomatic) {
}
TEST_F(SecureDnsPolicyHandlerTest, ValidModePolicySecure) {
- const std::string test_policy_value =
- chrome_browser_net::kDnsOverHttpsModeSecure;
+ const std::string test_policy_value = SecureDnsConfig::kModeSecure;
SetPolicyValue(key::kDnsOverHttpsMode,
std::make_unique<base::Value>(test_policy_value));
@@ -206,9 +203,8 @@ TEST_F(SecureDnsPolicyHandlerTest, ValidModePolicySecure) {
TEST_F(SecureDnsPolicyHandlerTest, InvalidTemplatesPolicyValue) {
// The templates policy requires a valid Mode policy or it will give an error
// we're not testing for.
- SetPolicyValue(key::kDnsOverHttpsMode,
- std::make_unique<base::Value>(
- chrome_browser_net::kDnsOverHttpsModeAutomatic));
+ SetPolicyValue(key::kDnsOverHttpsMode, std::make_unique<base::Value>(
+ SecureDnsConfig::kModeAutomatic));
const std::string test_policy_value = "invalid";
SetPolicyValue(key::kDnsOverHttpsTemplates,
std::make_unique<base::Value>(test_policy_value));
@@ -232,9 +228,8 @@ TEST_F(SecureDnsPolicyHandlerTest, InvalidTemplatesPolicyValue) {
TEST_F(SecureDnsPolicyHandlerTest, InvalidTemplatesPolicyType) {
// The templates policy requires a valid Mode policy or it will give an error
// we're not testing for.
- SetPolicyValue(key::kDnsOverHttpsMode,
- std::make_unique<base::Value>(
- chrome_browser_net::kDnsOverHttpsModeAutomatic));
+ SetPolicyValue(key::kDnsOverHttpsMode, std::make_unique<base::Value>(
+ SecureDnsConfig::kModeAutomatic));
// Give an int to a string policy.
SetPolicyValue(key::kDnsOverHttpsTemplates, std::make_unique<base::Value>(1));
@@ -254,9 +249,8 @@ TEST_F(SecureDnsPolicyHandlerTest, InvalidTemplatesPolicyType) {
// Templates policy should error when the Mode makes its value irrelevant.
TEST_F(SecureDnsPolicyHandlerTest, IrrelevantTemplatesPolicyWithModeOff) {
- SetPolicyValue(
- key::kDnsOverHttpsMode,
- std::make_unique<base::Value>(chrome_browser_net::kDnsOverHttpsModeOff));
+ SetPolicyValue(key::kDnsOverHttpsMode,
+ std::make_unique<base::Value>(SecureDnsConfig::kModeOff));
// Set templates to anything.
const std::string test_policy_value = "https://foo.test/";
SetPolicyValue(key::kDnsOverHttpsTemplates,
@@ -331,8 +325,7 @@ TEST_F(SecureDnsPolicyHandlerTest, TemplatesWithModeInvalid) {
TEST_F(SecureDnsPolicyHandlerTest, TemplatesNotSetWithModeSecure) {
SetPolicyValue(key::kDnsOverHttpsMode,
- std::make_unique<base::Value>(
- chrome_browser_net::kDnsOverHttpsModeSecure));
+ std::make_unique<base::Value>(SecureDnsConfig::kModeSecure));
CheckAndApplyPolicySettings();
@@ -353,8 +346,7 @@ TEST_F(SecureDnsPolicyHandlerTest, TemplatesNotSetWithModeSecure) {
TEST_F(SecureDnsPolicyHandlerTest, TemplatesNotStringWithModeSecure) {
SetPolicyValue(key::kDnsOverHttpsMode,
- std::make_unique<base::Value>(
- chrome_browser_net::kDnsOverHttpsModeSecure));
+ std::make_unique<base::Value>(SecureDnsConfig::kModeSecure));
SetPolicyValue(key::kDnsOverHttpsTemplates, std::make_unique<base::Value>(1));
CheckAndApplyPolicySettings();
@@ -376,8 +368,7 @@ TEST_F(SecureDnsPolicyHandlerTest, TemplatesNotStringWithModeSecure) {
TEST_F(SecureDnsPolicyHandlerTest, TemplatesEmptyWithModeSecure) {
SetPolicyValue(key::kDnsOverHttpsMode,
- std::make_unique<base::Value>(
- chrome_browser_net::kDnsOverHttpsModeSecure));
+ std::make_unique<base::Value>(SecureDnsConfig::kModeSecure));
SetPolicyValue(key::kDnsOverHttpsTemplates,
std::make_unique<base::Value>(""));
@@ -399,9 +390,8 @@ TEST_F(SecureDnsPolicyHandlerTest, TemplatesEmptyWithModeSecure) {
}
TEST_F(SecureDnsPolicyHandlerTest, TemplatesEmptyWithModeAutomatic) {
- SetPolicyValue(key::kDnsOverHttpsMode,
- std::make_unique<base::Value>(
- chrome_browser_net::kDnsOverHttpsModeAutomatic));
+ SetPolicyValue(key::kDnsOverHttpsMode, std::make_unique<base::Value>(
+ SecureDnsConfig::kModeAutomatic));
SetPolicyValue(key::kDnsOverHttpsTemplates,
std::make_unique<base::Value>(""));
@@ -421,9 +411,8 @@ TEST_F(SecureDnsPolicyHandlerTest, TemplatesEmptyWithModeAutomatic) {
TEST_F(SecureDnsPolicyHandlerTest, TemplatesPolicyWithModeAutomatic) {
// The templates policy requires a valid Mode policy or it will give an error
// we're not testing for.
- SetPolicyValue(key::kDnsOverHttpsMode,
- std::make_unique<base::Value>(
- chrome_browser_net::kDnsOverHttpsModeAutomatic));
+ SetPolicyValue(key::kDnsOverHttpsMode, std::make_unique<base::Value>(
+ SecureDnsConfig::kModeAutomatic));
const std::string test_policy_value =
"https://foo.test/ https://bar.test/dns-query{?dns}";
@@ -445,8 +434,7 @@ TEST_F(SecureDnsPolicyHandlerTest, TemplatesPolicyWithModeSecure) {
// The templates policy requires a valid Mode policy or it will give an error
// we're not testing for.
SetPolicyValue(key::kDnsOverHttpsMode,
- std::make_unique<base::Value>(
- chrome_browser_net::kDnsOverHttpsModeSecure));
+ std::make_unique<base::Value>(SecureDnsConfig::kModeSecure));
const std::string test_policy_value =
"https://foo.test/ https://bar.test/dns-query{?dns}";
diff --git a/chromium/chrome/browser/net/dns_util.cc b/chromium/chrome/browser/net/secure_dns_util.cc
index d03c1e00a9a..e1c342e3a14 100644
--- a/chromium/chrome/browser/net/dns_util.cc
+++ b/chromium/chrome/browser/net/secure_dns_util.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/net/dns_util.h"
+#include "chrome/browser/net/secure_dns_util.h"
#include <algorithm>
#include <string>
@@ -13,23 +13,26 @@
#include "components/embedder_support/pref_names.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/pref_service.h"
+#include "net/dns/dns_config_overrides.h"
#include "net/dns/public/util.h"
#include "net/third_party/uri_template/uri_template.h"
#include "url/gurl.h"
namespace chrome_browser_net {
+namespace secure_dns {
+
namespace {
const char kAlternateErrorPagesBackup[] = "alternate_error_pages.backup";
} // namespace
-void RegisterDNSProbesSettingBackupPref(PrefRegistrySimple* registry) {
+void RegisterProbesSettingBackupPref(PrefRegistrySimple* registry) {
registry->RegisterBooleanPref(kAlternateErrorPagesBackup, true);
}
-void MigrateDNSProbesSettingToOrFromBackup(PrefService* prefs) {
+void MigrateProbesSettingToOrFromBackup(PrefService* prefs) {
// If the privacy settings redesign is enabled and the user value of the
// preference hasn't been backed up yet, back it up, and clear it. That way,
// the preference will revert to using the hardcoded default value (unless
@@ -65,19 +68,31 @@ void MigrateDNSProbesSettingToOrFromBackup(PrefService* prefs) {
}
}
-std::vector<base::StringPiece> SplitDohTemplateGroup(base::StringPiece group) {
+std::vector<base::StringPiece> SplitGroup(base::StringPiece group) {
// Templates in a group are whitespace-separated.
return SplitStringPiece(group, " ", base::TRIM_WHITESPACE,
base::SPLIT_WANT_NONEMPTY);
}
-bool IsValidDohTemplateGroup(base::StringPiece group) {
+bool IsValidGroup(base::StringPiece group) {
// All templates must be valid for the group to be considered valid.
- std::vector<base::StringPiece> templates = SplitDohTemplateGroup(group);
+ std::vector<base::StringPiece> templates = SplitGroup(group);
return std::all_of(templates.begin(), templates.end(), [](auto t) {
std::string method;
return net::dns_util::IsValidDohTemplate(t, &method);
});
}
+void ApplyTemplate(net::DnsConfigOverrides* overrides,
+ base::StringPiece server_template) {
+ std::string server_method;
+ // We only allow use of templates that have already passed a format
+ // validation check.
+ CHECK(net::dns_util::IsValidDohTemplate(server_template, &server_method));
+ overrides->dns_over_https_servers.emplace({net::DnsOverHttpsServerConfig(
+ std::string(server_template), server_method == "POST")});
+}
+
+} // namespace secure_dns
+
} // namespace chrome_browser_net
diff --git a/chromium/chrome/browser/net/dns_util.h b/chromium/chrome/browser/net/secure_dns_util.h
index 89b155d7310..98ec18fe744 100644
--- a/chromium/chrome/browser/net/dns_util.h
+++ b/chromium/chrome/browser/net/secure_dns_util.h
@@ -2,53 +2,50 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef CHROME_BROWSER_NET_DNS_UTIL_H_
-#define CHROME_BROWSER_NET_DNS_UTIL_H_
+#ifndef CHROME_BROWSER_NET_SECURE_DNS_UTIL_H_
+#define CHROME_BROWSER_NET_SECURE_DNS_UTIL_H_
#include <vector>
#include "base/strings/string_piece.h"
+namespace net {
+struct DnsConfigOverrides;
+} // namespace net
+
class PrefRegistrySimple;
class PrefService;
namespace chrome_browser_net {
+namespace secure_dns {
+
// Implements the whitespace-delimited group syntax for DoH templates.
-std::vector<base::StringPiece> SplitDohTemplateGroup(base::StringPiece group);
+std::vector<base::StringPiece> SplitGroup(base::StringPiece group);
// Returns true if a group of templates are all valid per
// net::dns_util::IsValidDohTemplate(). This should be checked before updating
// stored preferences.
-bool IsValidDohTemplateGroup(base::StringPiece group);
-
-const char kDnsOverHttpsModeOff[] = "off";
-const char kDnsOverHttpsModeAutomatic[] = "automatic";
-const char kDnsOverHttpsModeSecure[] = "secure";
-
-// Forced management description types. We will check for the override cases in
-// the order they are listed in the enum.
-enum class SecureDnsUiManagementMode {
- // Chrome did not override the secure DNS settings.
- kNoOverride,
- // Secure DNS was disabled due to detection of a managed environment.
- kDisabledManaged,
- // Secure DNS was disabled due to detection of OS-level parental controls.
- kDisabledParentalControls,
-};
+bool IsValidGroup(base::StringPiece group);
+
+// Modifies |overrides| to use the DoH server specified by |server_template|.
+void ApplyTemplate(net::DnsConfigOverrides* overrides,
+ base::StringPiece server_template);
// Registers the backup preference required for the DNS probes setting reset.
// TODO(crbug.com/1062698): Remove this once the privacy settings redesign
// is fully launched.
-void RegisterDNSProbesSettingBackupPref(PrefRegistrySimple* registry);
+void RegisterProbesSettingBackupPref(PrefRegistrySimple* registry);
// Backs up the unneeded preference controlling DNS and captive portal probes
// once the privacy settings redesign is enabled, or restores the backup
// in case the feature is rolled back.
// TODO(crbug.com/1062698): Remove this once the privacy settings redesign
// is fully launched.
-void MigrateDNSProbesSettingToOrFromBackup(PrefService* prefs);
+void MigrateProbesSettingToOrFromBackup(PrefService* prefs);
+
+} // namespace secure_dns
} // namespace chrome_browser_net
-#endif // CHROME_BROWSER_NET_DNS_UTIL_H_
+#endif // CHROME_BROWSER_NET_SECURE_DNS_UTIL_H_
diff --git a/chromium/chrome/browser/net/dns_util_unittest.cc b/chromium/chrome/browser/net/secure_dns_util_unittest.cc
index 578ca7a3d9b..d99da3b6e93 100644
--- a/chromium/chrome/browser/net/dns_util_unittest.cc
+++ b/chromium/chrome/browser/net/secure_dns_util_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/net/dns_util.h"
+#include "chrome/browser/net/secure_dns_util.h"
#include <memory>
@@ -11,6 +11,7 @@
#include "components/embedder_support/pref_names.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/testing_pref_service.h"
+#include "net/dns/dns_config_overrides.h"
#include "testing/gmock/include/gmock/gmock-matchers.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -24,6 +25,8 @@ const char kAlternateErrorPagesBackup[] = "alternate_error_pages.backup";
} // namespace
+namespace secure_dns {
+
class DNSUtilTest : public testing::Test {
public:
void SetUp() override { DisableRedesign(); }
@@ -40,7 +43,7 @@ class DNSUtilTest : public testing::Test {
base::test::ScopedFeatureList scoped_feature_list_;
};
-TEST_F(DNSUtilTest, MigrateDNSProbesPref) {
+TEST_F(DNSUtilTest, MigrateProbesPref) {
TestingPrefServiceSimple prefs;
prefs.registry()->RegisterBooleanPref(
embedder_support::kAlternateErrorPagesEnabled, true);
@@ -52,19 +55,19 @@ TEST_F(DNSUtilTest, MigrateDNSProbesPref) {
prefs.FindPreference(kAlternateErrorPagesBackup);
// No migration happens if the privacy settings redesign is not enabled.
- MigrateDNSProbesSettingToOrFromBackup(&prefs);
+ MigrateProbesSettingToOrFromBackup(&prefs);
EXPECT_FALSE(backup_pref->HasUserSetting());
// The hardcoded default value of TRUE gets correctly migrated.
EnableRedesign();
- MigrateDNSProbesSettingToOrFromBackup(&prefs);
+ MigrateProbesSettingToOrFromBackup(&prefs);
EXPECT_FALSE(current_pref->HasUserSetting());
EXPECT_TRUE(backup_pref->HasUserSetting());
EXPECT_TRUE(prefs.GetBoolean(kAlternateErrorPagesBackup));
// And correctly restored.
DisableRedesign();
- MigrateDNSProbesSettingToOrFromBackup(&prefs);
+ MigrateProbesSettingToOrFromBackup(&prefs);
EXPECT_TRUE(current_pref->HasUserSetting());
EXPECT_TRUE(prefs.GetBoolean(embedder_support::kAlternateErrorPagesEnabled));
EXPECT_FALSE(backup_pref->HasUserSetting());
@@ -72,14 +75,14 @@ TEST_F(DNSUtilTest, MigrateDNSProbesPref) {
// An explicit user value of TRUE will be correctly migrated.
EnableRedesign();
prefs.SetBoolean(embedder_support::kAlternateErrorPagesEnabled, true);
- MigrateDNSProbesSettingToOrFromBackup(&prefs);
+ MigrateProbesSettingToOrFromBackup(&prefs);
EXPECT_FALSE(current_pref->HasUserSetting());
EXPECT_TRUE(backup_pref->HasUserSetting());
EXPECT_TRUE(prefs.GetBoolean(kAlternateErrorPagesBackup));
// And correctly restored.
DisableRedesign();
- MigrateDNSProbesSettingToOrFromBackup(&prefs);
+ MigrateProbesSettingToOrFromBackup(&prefs);
EXPECT_TRUE(current_pref->HasUserSetting());
EXPECT_TRUE(prefs.GetBoolean(embedder_support::kAlternateErrorPagesEnabled));
EXPECT_FALSE(backup_pref->HasUserSetting());
@@ -87,14 +90,14 @@ TEST_F(DNSUtilTest, MigrateDNSProbesPref) {
// An explicit user value of FALSE will also be correctly migrated.
EnableRedesign();
prefs.SetBoolean(embedder_support::kAlternateErrorPagesEnabled, false);
- MigrateDNSProbesSettingToOrFromBackup(&prefs);
+ MigrateProbesSettingToOrFromBackup(&prefs);
EXPECT_FALSE(current_pref->HasUserSetting());
EXPECT_TRUE(backup_pref->HasUserSetting());
EXPECT_FALSE(prefs.GetBoolean(kAlternateErrorPagesBackup));
// And correctly restored.
DisableRedesign();
- MigrateDNSProbesSettingToOrFromBackup(&prefs);
+ MigrateProbesSettingToOrFromBackup(&prefs);
EXPECT_TRUE(current_pref->HasUserSetting());
EXPECT_FALSE(prefs.GetBoolean(embedder_support::kAlternateErrorPagesEnabled));
EXPECT_FALSE(backup_pref->HasUserSetting());
@@ -105,14 +108,14 @@ TEST_F(DNSUtilTest, MigrateDNSProbesPref) {
prefs.SetManagedPref(embedder_support::kAlternateErrorPagesEnabled,
std::make_unique<base::Value>(true));
EnableRedesign();
- MigrateDNSProbesSettingToOrFromBackup(&prefs);
+ MigrateProbesSettingToOrFromBackup(&prefs);
EXPECT_FALSE(current_pref->HasUserSetting());
EXPECT_TRUE(backup_pref->HasUserSetting());
EXPECT_FALSE(prefs.GetBoolean(kAlternateErrorPagesBackup));
// And correctly restored.
DisableRedesign();
- MigrateDNSProbesSettingToOrFromBackup(&prefs);
+ MigrateProbesSettingToOrFromBackup(&prefs);
EXPECT_TRUE(current_pref->HasUserSetting());
{
const base::Value* user_pref =
@@ -129,14 +132,14 @@ TEST_F(DNSUtilTest, MigrateDNSProbesPref) {
prefs.SetManagedPref(embedder_support::kAlternateErrorPagesEnabled,
std::make_unique<base::Value>(false));
EnableRedesign();
- MigrateDNSProbesSettingToOrFromBackup(&prefs);
+ MigrateProbesSettingToOrFromBackup(&prefs);
EXPECT_FALSE(current_pref->HasUserSetting());
EXPECT_TRUE(backup_pref->HasUserSetting());
EXPECT_TRUE(prefs.GetBoolean(kAlternateErrorPagesBackup));
// And correctly restored.
DisableRedesign();
- MigrateDNSProbesSettingToOrFromBackup(&prefs);
+ MigrateProbesSettingToOrFromBackup(&prefs);
EXPECT_TRUE(current_pref->HasUserSetting());
{
const base::Value* user_pref =
@@ -147,22 +150,44 @@ TEST_F(DNSUtilTest, MigrateDNSProbesPref) {
EXPECT_FALSE(backup_pref->HasUserSetting());
}
-TEST(DNSUtil, SplitDohTemplateGroup) {
- EXPECT_THAT(SplitDohTemplateGroup("a"), ElementsAre("a"));
- EXPECT_THAT(SplitDohTemplateGroup("a b"), ElementsAre("a", "b"));
- EXPECT_THAT(SplitDohTemplateGroup("a \tb\nc"), ElementsAre("a", "b\nc"));
- EXPECT_THAT(SplitDohTemplateGroup(" \ta b\n"), ElementsAre("a", "b"));
+TEST(DNSUtil, SplitGroup) {
+ EXPECT_THAT(SplitGroup("a"), ElementsAre("a"));
+ EXPECT_THAT(SplitGroup("a b"), ElementsAre("a", "b"));
+ EXPECT_THAT(SplitGroup("a \tb\nc"), ElementsAre("a", "b\nc"));
+ EXPECT_THAT(SplitGroup(" \ta b\n"), ElementsAre("a", "b"));
+}
+
+TEST(DNSUtil, IsValidGroup) {
+ EXPECT_TRUE(IsValidGroup(""));
+ EXPECT_TRUE(IsValidGroup("https://valid"));
+ EXPECT_TRUE(IsValidGroup("https://valid https://valid2"));
+
+ EXPECT_FALSE(IsValidGroup("https://valid invalid"));
+ EXPECT_FALSE(IsValidGroup("invalid https://valid"));
+ EXPECT_FALSE(IsValidGroup("invalid"));
+ EXPECT_FALSE(IsValidGroup("invalid invalid2"));
+}
+
+TEST(DNSUtil, ApplyDohTemplatePost) {
+ std::string post_template("https://valid");
+ net::DnsConfigOverrides overrides;
+ ApplyTemplate(&overrides, post_template);
+
+ EXPECT_THAT(overrides.dns_over_https_servers,
+ testing::Optional(ElementsAre(net::DnsOverHttpsServerConfig(
+ {post_template, true /* use_post */}))));
}
-TEST(DNSUtil, IsValidDohTemplateGroup) {
- EXPECT_TRUE(IsValidDohTemplateGroup(""));
- EXPECT_TRUE(IsValidDohTemplateGroup("https://valid"));
- EXPECT_TRUE(IsValidDohTemplateGroup("https://valid https://valid2"));
+TEST(DNSUtil, ApplyDohTemplateGet) {
+ std::string get_template("https://valid/{?dns}");
+ net::DnsConfigOverrides overrides;
+ ApplyTemplate(&overrides, get_template);
- EXPECT_FALSE(IsValidDohTemplateGroup("https://valid invalid"));
- EXPECT_FALSE(IsValidDohTemplateGroup("invalid https://valid"));
- EXPECT_FALSE(IsValidDohTemplateGroup("invalid"));
- EXPECT_FALSE(IsValidDohTemplateGroup("invalid invalid2"));
+ EXPECT_THAT(overrides.dns_over_https_servers,
+ testing::Optional(ElementsAre(net::DnsOverHttpsServerConfig(
+ {get_template, false /* use_post */}))));
}
+} // namespace secure_dns
+
} // namespace chrome_browser_net
diff --git a/chromium/chrome/browser/net/service_providers_win.cc b/chromium/chrome/browser/net/service_providers_win.cc
index 4eb2e4f1872..740d6703245 100644
--- a/chromium/chrome/browser/net/service_providers_win.cc
+++ b/chromium/chrome/browser/net/service_providers_win.cc
@@ -9,7 +9,7 @@
#include <memory>
-#include "base/logging.h"
+#include "base/notreached.h"
#include "base/stl_util.h"
#include "base/values.h"
diff --git a/chromium/chrome/browser/net/stub_resolver_config_reader.cc b/chromium/chrome/browser/net/stub_resolver_config_reader.cc
index a7ecf47d1be..37e70c07c4c 100644
--- a/chromium/chrome/browser/net/stub_resolver_config_reader.cc
+++ b/chromium/chrome/browser/net/stub_resolver_config_reader.cc
@@ -7,19 +7,22 @@
#include <set>
#include <string>
#include <utility>
+#include <vector>
#include "base/bind.h"
#include "base/callback.h"
+#include "base/check.h"
#include "base/feature_list.h"
#include "base/location.h"
-#include "base/logging.h"
#include "base/metrics/field_trial_params.h"
#include "base/metrics/histogram_macros.h"
+#include "base/notreached.h"
#include "base/strings/string_piece.h"
#include "base/values.h"
#include "build/build_config.h"
#include "chrome/browser/browser_process.h"
-#include "chrome/browser/net/dns_util.h"
+#include "chrome/browser/net/secure_dns_config.h"
+#include "chrome/browser/net/secure_dns_util.h"
#include "chrome/browser/policy/chrome_browser_policy_connector.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/pref_names.h"
@@ -121,18 +124,20 @@ StubResolverConfigReader::StubResolverConfigReader(PrefService* local_state,
if (set_up_pref_defaults) {
local_state_->SetDefaultPrefValue(prefs::kBuiltInDnsClientEnabled,
base::Value(ShouldEnableAsyncDns()));
- std::string default_doh_mode = chrome_browser_net::kDnsOverHttpsModeOff;
+ net::DnsConfig::SecureDnsMode default_secure_dns_mode =
+ net::DnsConfig::SecureDnsMode::OFF;
std::string default_doh_templates;
if (base::FeatureList::IsEnabled(features::kDnsOverHttps)) {
if (features::kDnsOverHttpsFallbackParam.Get()) {
- default_doh_mode = chrome_browser_net::kDnsOverHttpsModeAutomatic;
+ default_secure_dns_mode = net::DnsConfig::SecureDnsMode::AUTOMATIC;
} else {
- default_doh_mode = chrome_browser_net::kDnsOverHttpsModeSecure;
+ default_secure_dns_mode = net::DnsConfig::SecureDnsMode::SECURE;
}
default_doh_templates = features::kDnsOverHttpsTemplatesParam.Get();
}
- local_state_->SetDefaultPrefValue(prefs::kDnsOverHttpsMode,
- base::Value(default_doh_mode));
+ local_state_->SetDefaultPrefValue(
+ prefs::kDnsOverHttpsMode,
+ base::Value(SecureDnsConfig::ModeToString(default_secure_dns_mode)));
local_state_->SetDefaultPrefValue(prefs::kDnsOverHttpsTemplates,
base::Value(default_doh_templates));
@@ -147,11 +152,11 @@ StubResolverConfigReader::StubResolverConfigReader(PrefService* local_state,
if (entries.count("dns-over-https@1")) {
// The user has "Enabled" selected.
local_state_->SetString(prefs::kDnsOverHttpsMode,
- chrome_browser_net::kDnsOverHttpsModeAutomatic);
+ SecureDnsConfig::kModeAutomatic);
} else if (entries.count("dns-over-https@2")) {
// The user has "Disabled" selected.
local_state_->SetString(prefs::kDnsOverHttpsMode,
- chrome_browser_net::kDnsOverHttpsModeOff);
+ SecureDnsConfig::kModeOff);
} else {
// The user has "Default" selected.
local_state_->ClearPref(prefs::kDnsOverHttpsMode);
@@ -182,26 +187,17 @@ void StubResolverConfigReader::RegisterPrefs(PrefRegistrySimple* registry) {
registry->RegisterStringPref(prefs::kDnsOverHttpsTemplates, std::string());
}
-void StubResolverConfigReader::GetConfiguration(
- bool force_check_parental_controls_for_automatic_mode,
- bool* insecure_stub_resolver_enabled,
- net::DnsConfig::SecureDnsMode* secure_dns_mode,
- std::vector<net::DnsOverHttpsServerConfig>* dns_over_https_servers,
- chrome_browser_net::SecureDnsUiManagementMode* forced_management_mode) {
- GetAndUpdateConfiguration(force_check_parental_controls_for_automatic_mode,
- false /* record_metrics */,
- false /* update_network_service */,
- insecure_stub_resolver_enabled, secure_dns_mode,
- dns_over_https_servers, forced_management_mode);
+SecureDnsConfig StubResolverConfigReader::GetSecureDnsConfiguration(
+ bool force_check_parental_controls_for_automatic_mode) {
+ return GetAndUpdateConfiguration(
+ force_check_parental_controls_for_automatic_mode,
+ false /* record_metrics */, false /* update_network_service */);
}
void StubResolverConfigReader::UpdateNetworkService(bool record_metrics) {
GetAndUpdateConfiguration(
false /* force_check_parental_controls_for_automatic_mode */,
- record_metrics, true /* update_network_service */,
- nullptr /* insecure_stub_resolver_enabled */,
- nullptr /* secure_dns_mode */, nullptr /* dns_over_https_servers */,
- nullptr /* forced_management_mode */);
+ record_metrics, true /* update_network_service */);
}
bool StubResolverConfigReader::ShouldDisableDohForManaged() {
@@ -238,37 +234,31 @@ void StubResolverConfigReader::OnParentalControlsDelayTimer() {
UpdateNetworkService(false /* record_metrics */);
}
-void StubResolverConfigReader::GetAndUpdateConfiguration(
+bool StubResolverConfigReader::GetInsecureStubResolverEnabled() {
+ return local_state_->GetBoolean(prefs::kBuiltInDnsClientEnabled);
+}
+
+SecureDnsConfig StubResolverConfigReader::GetAndUpdateConfiguration(
bool force_check_parental_controls_for_automatic_mode,
bool record_metrics,
- bool update_network_service,
- bool* out_insecure_stub_resolver_enabled,
- net::DnsConfig::SecureDnsMode* out_secure_dns_mode,
- std::vector<net::DnsOverHttpsServerConfig>* out_dns_over_https_servers,
- chrome_browser_net::SecureDnsUiManagementMode* out_forced_management_mode) {
- DCHECK(!out_dns_over_https_servers || out_dns_over_https_servers->empty());
-
- bool insecure_stub_resolver_enabled =
- local_state_->GetBoolean(prefs::kBuiltInDnsClientEnabled);
-
- std::string doh_mode;
+ bool update_network_service) {
+ net::DnsConfig::SecureDnsMode secure_dns_mode;
SecureDnsModeDetailsForHistogram mode_details;
- chrome_browser_net::SecureDnsUiManagementMode forced_management_mode =
- chrome_browser_net::SecureDnsUiManagementMode::kNoOverride;
+ SecureDnsConfig::ManagementMode forced_management_mode =
+ SecureDnsConfig::ManagementMode::kNoOverride;
bool is_managed =
local_state_->FindPreference(prefs::kDnsOverHttpsMode)->IsManaged();
if (!is_managed && ShouldDisableDohForManaged()) {
- doh_mode = chrome_browser_net::kDnsOverHttpsModeOff;
- forced_management_mode =
- chrome_browser_net::SecureDnsUiManagementMode::kDisabledManaged;
+ secure_dns_mode = net::DnsConfig::SecureDnsMode::OFF;
+ forced_management_mode = SecureDnsConfig::ManagementMode::kDisabledManaged;
} else {
- doh_mode = local_state_->GetString(prefs::kDnsOverHttpsMode);
+ secure_dns_mode = SecureDnsConfig::ParseMode(
+ local_state_->GetString(prefs::kDnsOverHttpsMode))
+ .value_or(net::DnsConfig::SecureDnsMode::OFF);
}
- net::DnsConfig::SecureDnsMode secure_dns_mode;
bool check_parental_controls = false;
- if (doh_mode == chrome_browser_net::kDnsOverHttpsModeSecure) {
- secure_dns_mode = net::DnsConfig::SecureDnsMode::SECURE;
+ if (secure_dns_mode == net::DnsConfig::SecureDnsMode::SECURE) {
mode_details =
is_managed ? SecureDnsModeDetailsForHistogram::kSecureByEnterprisePolicy
: SecureDnsModeDetailsForHistogram::kSecureByUser;
@@ -277,8 +267,7 @@ void StubResolverConfigReader::GetAndUpdateConfiguration(
// enabled through policy, which takes precedence over parental controls)
// because the mode allows sending DoH requests immediately.
check_parental_controls = !is_managed;
- } else if (doh_mode == chrome_browser_net::kDnsOverHttpsModeAutomatic) {
- secure_dns_mode = net::DnsConfig::SecureDnsMode::AUTOMATIC;
+ } else if (secure_dns_mode == net::DnsConfig::SecureDnsMode::AUTOMATIC) {
mode_details =
is_managed
? SecureDnsModeDetailsForHistogram::kAutomaticByEnterprisePolicy
@@ -293,20 +282,18 @@ void StubResolverConfigReader::GetAndUpdateConfiguration(
parental_controls_checked_;
check_parental_controls = !is_managed && allow_check_parental_controls;
} else {
- secure_dns_mode = net::DnsConfig::SecureDnsMode::OFF;
switch (forced_management_mode) {
- case chrome_browser_net::SecureDnsUiManagementMode::kNoOverride:
+ case SecureDnsConfig::ManagementMode::kNoOverride:
mode_details =
is_managed
? SecureDnsModeDetailsForHistogram::kOffByEnterprisePolicy
: SecureDnsModeDetailsForHistogram::kOffByUser;
break;
- case chrome_browser_net::SecureDnsUiManagementMode::kDisabledManaged:
+ case SecureDnsConfig::ManagementMode::kDisabledManaged:
mode_details =
SecureDnsModeDetailsForHistogram::kOffByDetectedManagedEnvironment;
break;
- case chrome_browser_net::SecureDnsUiManagementMode::
- kDisabledParentalControls:
+ case SecureDnsConfig::ManagementMode::kDisabledParentalControls:
NOTREACHED();
break;
default:
@@ -321,8 +308,8 @@ void StubResolverConfigReader::GetAndUpdateConfiguration(
// checked if necessary for the otherwise-determined mode.
if (check_parental_controls) {
if (ShouldDisableDohForParentalControls()) {
- forced_management_mode = chrome_browser_net::SecureDnsUiManagementMode::
- kDisabledParentalControls;
+ forced_management_mode =
+ SecureDnsConfig::ManagementMode::kDisabledParentalControls;
secure_dns_mode = net::DnsConfig::SecureDnsMode::OFF;
mode_details =
SecureDnsModeDetailsForHistogram::kOffByDetectedParentalControls;
@@ -349,7 +336,7 @@ void StubResolverConfigReader::GetAndUpdateConfiguration(
if (!doh_templates.empty() &&
secure_dns_mode != net::DnsConfig::SecureDnsMode::OFF) {
for (base::StringPiece server_template :
- chrome_browser_net::SplitDohTemplateGroup(doh_templates)) {
+ chrome_browser_net::secure_dns::SplitGroup(doh_templates)) {
if (!net::dns_util::IsValidDohTemplate(server_template, &server_method)) {
continue;
}
@@ -373,16 +360,10 @@ void StubResolverConfigReader::GetAndUpdateConfiguration(
if (update_network_service) {
content::GetNetworkService()->ConfigureStubHostResolver(
- insecure_stub_resolver_enabled, secure_dns_mode,
+ GetInsecureStubResolverEnabled(), secure_dns_mode,
std::move(servers_mojo));
}
- if (out_insecure_stub_resolver_enabled)
- *out_insecure_stub_resolver_enabled = insecure_stub_resolver_enabled;
- if (out_secure_dns_mode)
- *out_secure_dns_mode = secure_dns_mode;
- if (out_dns_over_https_servers)
- *out_dns_over_https_servers = std::move(dns_over_https_servers);
- if (out_forced_management_mode)
- *out_forced_management_mode = forced_management_mode;
+ return SecureDnsConfig(secure_dns_mode, std::move(dns_over_https_servers),
+ forced_management_mode);
}
diff --git a/chromium/chrome/browser/net/stub_resolver_config_reader.h b/chromium/chrome/browser/net/stub_resolver_config_reader.h
index 14289873c0d..3aedabd184e 100644
--- a/chromium/chrome/browser/net/stub_resolver_config_reader.h
+++ b/chromium/chrome/browser/net/stub_resolver_config_reader.h
@@ -5,22 +5,15 @@
#ifndef CHROME_BROWSER_NET_STUB_RESOLVER_CONFIG_READER_H_
#define CHROME_BROWSER_NET_STUB_RESOLVER_CONFIG_READER_H_
-#include <vector>
-
#include "base/optional.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "components/prefs/pref_change_registrar.h"
-#include "net/dns/dns_config.h"
-#include "net/dns/public/dns_over_https_server_config.h"
#include "services/network/public/mojom/host_resolver.mojom-forward.h"
class PrefRegistrySimple;
class PrefService;
-
-namespace chrome_browser_net {
-enum class SecureDnsUiManagementMode;
-} // namespace chrome_browser_net
+class SecureDnsConfig;
// Retriever for Chrome configuration for the built-in DNS stub resolver.
class StubResolverConfigReader {
@@ -39,7 +32,7 @@ class StubResolverConfigReader {
static void RegisterPrefs(PrefRegistrySimple* registry);
- // Returns the current host resolver configuration.
+ // Returns the current secure DNS resolver configuration.
//
// Initial checks for parental controls (which cause DoH to be disabled) may
// be deferred for performance if called early during startup, if the
@@ -50,16 +43,10 @@ class StubResolverConfigReader {
// previously been deferred, and the check discovers that DoH should be
// disabled, the network service will be updated to disable DoH and ensure the
// service behavior matches the config returned by this method.
- //
- // |forced_management_mode| is an optional param that will be set to indicate
- // the type of override applied by Chrome if provided.
- void GetConfiguration(
- bool force_check_parental_controls_for_automatic_mode,
- bool* insecure_stub_resolver_enabled,
- net::DnsConfig::SecureDnsMode* secure_dns_mode,
- std::vector<net::DnsOverHttpsServerConfig>* dns_over_https_servers,
- chrome_browser_net::SecureDnsUiManagementMode* forced_management_mode =
- nullptr);
+ SecureDnsConfig GetSecureDnsConfiguration(
+ bool force_check_parental_controls_for_automatic_mode);
+
+ bool GetInsecureStubResolverEnabled();
// Updates the network service with the current configuration.
void UpdateNetworkService(bool record_metrics);
@@ -79,14 +66,10 @@ class StubResolverConfigReader {
// Updates network service if |update_network_service| or if necessary due to
// first read of parental controls.
- void GetAndUpdateConfiguration(
+ SecureDnsConfig GetAndUpdateConfiguration(
bool force_check_parental_controls_for_automatic_mode,
bool record_metrics,
- bool update_network_service,
- bool* insecure_stub_resolver_enabled,
- net::DnsConfig::SecureDnsMode* secure_dns_mode,
- std::vector<net::DnsOverHttpsServerConfig>* dns_over_https_servers,
- chrome_browser_net::SecureDnsUiManagementMode* forced_management_mode);
+ bool update_network_service);
PrefService* const local_state_;
diff --git a/chromium/chrome/browser/net/stub_resolver_config_reader_unittest.cc b/chromium/chrome/browser/net/stub_resolver_config_reader_unittest.cc
index 731c9e1161e..3952d2e3e9d 100644
--- a/chromium/chrome/browser/net/stub_resolver_config_reader_unittest.cc
+++ b/chromium/chrome/browser/net/stub_resolver_config_reader_unittest.cc
@@ -9,7 +9,7 @@
#include "base/test/task_environment.h"
#include "base/values.h"
-#include "chrome/browser/net/dns_util.h"
+#include "chrome/browser/net/secure_dns_config.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/scoped_testing_local_state.h"
#include "components/prefs/pref_service.h"
@@ -68,21 +68,15 @@ class StubResolverConfigReaderTest : public testing::Test {
std::make_unique<MockedStubResolverConfigReader>(&local_state_);
};
-TEST_F(StubResolverConfigReaderTest, GetConfiguration) {
- bool insecure_stub_resolver_enabled;
- net::DnsConfig::SecureDnsMode secure_dns_mode;
- std::vector<net::DnsOverHttpsServerConfig> dns_over_https_servers;
-
+TEST_F(StubResolverConfigReaderTest, GetSecureDnsConfiguration) {
// |force_check_parental_controls_for_automatic_mode = true| is not the main
// default case, but the specific behavior involved is tested separately.
- config_reader_->GetConfiguration(
- true /* force_check_parental_controls_for_automatic_mode */,
- &insecure_stub_resolver_enabled, &secure_dns_mode,
- &dns_over_https_servers);
+ SecureDnsConfig secure_dns_config = config_reader_->GetSecureDnsConfiguration(
+ true /* force_check_parental_controls_for_automatic_mode */);
- EXPECT_FALSE(insecure_stub_resolver_enabled);
- EXPECT_EQ(secure_dns_mode, net::DnsConfig::SecureDnsMode::OFF);
- EXPECT_TRUE(dns_over_https_servers.empty());
+ EXPECT_FALSE(config_reader_->GetInsecureStubResolverEnabled());
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF, secure_dns_config.mode());
+ EXPECT_TRUE(secure_dns_config.servers().empty());
// Parental controls should not be checked when DoH otherwise disabled.
EXPECT_FALSE(config_reader_->parental_controls_checked());
@@ -91,23 +85,17 @@ TEST_F(StubResolverConfigReaderTest, GetConfiguration) {
TEST_F(StubResolverConfigReaderTest, DohEnabled) {
local_state_.SetBoolean(prefs::kBuiltInDnsClientEnabled, true);
local_state_.SetString(prefs::kDnsOverHttpsMode,
- chrome_browser_net::kDnsOverHttpsModeAutomatic);
+ SecureDnsConfig::kModeAutomatic);
local_state_.SetString(prefs::kDnsOverHttpsTemplates, kDohServerTemplate);
- bool insecure_stub_resolver_enabled;
- net::DnsConfig::SecureDnsMode secure_dns_mode;
- std::vector<net::DnsOverHttpsServerConfig> dns_over_https_servers;
-
// |force_check_parental_controls_for_automatic_mode = true| is not the main
// default case, but the specific behavior involved is tested separately.
- config_reader_->GetConfiguration(
- true /* force_check_parental_controls_for_automatic_mode */,
- &insecure_stub_resolver_enabled, &secure_dns_mode,
- &dns_over_https_servers);
-
- EXPECT_TRUE(insecure_stub_resolver_enabled);
- EXPECT_EQ(secure_dns_mode, net::DnsConfig::SecureDnsMode::AUTOMATIC);
- EXPECT_THAT(dns_over_https_servers,
+ SecureDnsConfig secure_dns_config = config_reader_->GetSecureDnsConfiguration(
+ true /* force_check_parental_controls_for_automatic_mode */);
+
+ EXPECT_TRUE(config_reader_->GetInsecureStubResolverEnabled());
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::AUTOMATIC, secure_dns_config.mode());
+ EXPECT_THAT(secure_dns_config.servers(),
testing::ElementsAre(
net::DnsOverHttpsServerConfig("https://doh1.test",
true /* use_post */),
@@ -120,23 +108,17 @@ TEST_F(StubResolverConfigReaderTest, DohEnabled) {
TEST_F(StubResolverConfigReaderTest, DohEnabled_Secure) {
local_state_.SetBoolean(prefs::kBuiltInDnsClientEnabled, true);
local_state_.SetString(prefs::kDnsOverHttpsMode,
- chrome_browser_net::kDnsOverHttpsModeSecure);
+ SecureDnsConfig::kModeSecure);
local_state_.SetString(prefs::kDnsOverHttpsTemplates, kDohServerTemplate);
- bool insecure_stub_resolver_enabled;
- net::DnsConfig::SecureDnsMode secure_dns_mode;
- std::vector<net::DnsOverHttpsServerConfig> dns_over_https_servers;
-
// |force_check_parental_controls_for_automatic_mode| should have no effect on
// SECURE mode, so set to false to ensure check is not deferred.
- config_reader_->GetConfiguration(
- false /* force_check_parental_controls_for_automatic_mode */,
- &insecure_stub_resolver_enabled, &secure_dns_mode,
- &dns_over_https_servers);
-
- EXPECT_TRUE(insecure_stub_resolver_enabled);
- EXPECT_EQ(secure_dns_mode, net::DnsConfig::SecureDnsMode::SECURE);
- EXPECT_THAT(dns_over_https_servers,
+ SecureDnsConfig secure_dns_config = config_reader_->GetSecureDnsConfiguration(
+ false /* force_check_parental_controls_for_automatic_mode */);
+
+ EXPECT_TRUE(config_reader_->GetInsecureStubResolverEnabled());
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::SECURE, secure_dns_config.mode());
+ EXPECT_THAT(secure_dns_config.servers(),
testing::ElementsAre(
net::DnsOverHttpsServerConfig("https://doh1.test",
true /* use_post */),
@@ -151,23 +133,17 @@ TEST_F(StubResolverConfigReaderTest, DisabledForManaged) {
local_state_.SetBoolean(prefs::kBuiltInDnsClientEnabled, true);
local_state_.SetString(prefs::kDnsOverHttpsMode,
- chrome_browser_net::kDnsOverHttpsModeAutomatic);
+ SecureDnsConfig::kModeAutomatic);
local_state_.SetString(prefs::kDnsOverHttpsTemplates, kDohServerTemplate);
- bool insecure_stub_resolver_enabled;
- net::DnsConfig::SecureDnsMode secure_dns_mode;
- std::vector<net::DnsOverHttpsServerConfig> dns_over_https_servers;
-
// |force_check_parental_controls_for_automatic_mode = true| is not the main
// default case, but the specific behavior involved is tested separately.
- config_reader_->GetConfiguration(
- true /* force_check_parental_controls_for_automatic_mode */,
- &insecure_stub_resolver_enabled, &secure_dns_mode,
- &dns_over_https_servers);
+ SecureDnsConfig secure_dns_config = config_reader_->GetSecureDnsConfiguration(
+ true /* force_check_parental_controls_for_automatic_mode */);
- EXPECT_TRUE(insecure_stub_resolver_enabled);
- EXPECT_EQ(secure_dns_mode, net::DnsConfig::SecureDnsMode::OFF);
- EXPECT_TRUE(dns_over_https_servers.empty());
+ EXPECT_TRUE(config_reader_->GetInsecureStubResolverEnabled());
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF, secure_dns_config.mode());
+ EXPECT_TRUE(secure_dns_config.servers().empty());
// Parental controls should not be checked when DoH otherwise disabled.
EXPECT_FALSE(config_reader_->parental_controls_checked());
@@ -178,21 +154,15 @@ TEST_F(StubResolverConfigReaderTest, DisabledForManaged_Secure) {
local_state_.SetBoolean(prefs::kBuiltInDnsClientEnabled, true);
local_state_.SetString(prefs::kDnsOverHttpsMode,
- chrome_browser_net::kDnsOverHttpsModeSecure);
+ SecureDnsConfig::kModeSecure);
local_state_.SetString(prefs::kDnsOverHttpsTemplates, kDohServerTemplate);
- bool insecure_stub_resolver_enabled;
- net::DnsConfig::SecureDnsMode secure_dns_mode;
- std::vector<net::DnsOverHttpsServerConfig> dns_over_https_servers;
+ SecureDnsConfig secure_dns_config = config_reader_->GetSecureDnsConfiguration(
+ false /* force_check_parental_controls_for_automatic_mode */);
- config_reader_->GetConfiguration(
- false /* force_check_parental_controls_for_automatic_mode */,
- &insecure_stub_resolver_enabled, &secure_dns_mode,
- &dns_over_https_servers);
-
- EXPECT_TRUE(insecure_stub_resolver_enabled);
- EXPECT_EQ(secure_dns_mode, net::DnsConfig::SecureDnsMode::OFF);
- EXPECT_TRUE(dns_over_https_servers.empty());
+ EXPECT_TRUE(config_reader_->GetInsecureStubResolverEnabled());
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF, secure_dns_config.mode());
+ EXPECT_TRUE(secure_dns_config.servers().empty());
// Parental controls should not be checked when DoH otherwise disabled.
EXPECT_FALSE(config_reader_->parental_controls_checked());
@@ -203,23 +173,17 @@ TEST_F(StubResolverConfigReaderTest, DisabledForParentalControls) {
local_state_.SetBoolean(prefs::kBuiltInDnsClientEnabled, true);
local_state_.SetString(prefs::kDnsOverHttpsMode,
- chrome_browser_net::kDnsOverHttpsModeAutomatic);
+ SecureDnsConfig::kModeAutomatic);
local_state_.SetString(prefs::kDnsOverHttpsTemplates, kDohServerTemplate);
- bool insecure_stub_resolver_enabled;
- net::DnsConfig::SecureDnsMode secure_dns_mode;
- std::vector<net::DnsOverHttpsServerConfig> dns_over_https_servers;
-
// |force_check_parental_controls_for_automatic_mode = true| is not the main
// default case, but the specific behavior involved is tested separately.
- config_reader_->GetConfiguration(
- true /* force_check_parental_controls_for_automatic_mode */,
- &insecure_stub_resolver_enabled, &secure_dns_mode,
- &dns_over_https_servers);
+ SecureDnsConfig secure_dns_config = config_reader_->GetSecureDnsConfiguration(
+ true /* force_check_parental_controls_for_automatic_mode */);
- EXPECT_TRUE(insecure_stub_resolver_enabled);
- EXPECT_EQ(secure_dns_mode, net::DnsConfig::SecureDnsMode::OFF);
- EXPECT_TRUE(dns_over_https_servers.empty());
+ EXPECT_TRUE(config_reader_->GetInsecureStubResolverEnabled());
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF, secure_dns_config.mode());
+ EXPECT_TRUE(secure_dns_config.servers().empty());
EXPECT_TRUE(config_reader_->parental_controls_checked());
}
@@ -229,23 +193,17 @@ TEST_F(StubResolverConfigReaderTest, DisabledForParentalControls_Secure) {
local_state_.SetBoolean(prefs::kBuiltInDnsClientEnabled, true);
local_state_.SetString(prefs::kDnsOverHttpsMode,
- chrome_browser_net::kDnsOverHttpsModeSecure);
+ SecureDnsConfig::kModeSecure);
local_state_.SetString(prefs::kDnsOverHttpsTemplates, kDohServerTemplate);
- bool insecure_stub_resolver_enabled;
- net::DnsConfig::SecureDnsMode secure_dns_mode;
- std::vector<net::DnsOverHttpsServerConfig> dns_over_https_servers;
-
// |force_check_parental_controls_for_automatic_mode| should have no effect on
// SECURE mode, so set to false to ensure check is not deferred.
- config_reader_->GetConfiguration(
- false /* force_check_parental_controls_for_automatic_mode */,
- &insecure_stub_resolver_enabled, &secure_dns_mode,
- &dns_over_https_servers);
+ SecureDnsConfig secure_dns_config = config_reader_->GetSecureDnsConfiguration(
+ false /* force_check_parental_controls_for_automatic_mode */);
- EXPECT_TRUE(insecure_stub_resolver_enabled);
- EXPECT_EQ(secure_dns_mode, net::DnsConfig::SecureDnsMode::OFF);
- EXPECT_TRUE(dns_over_https_servers.empty());
+ EXPECT_TRUE(config_reader_->GetInsecureStubResolverEnabled());
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF, secure_dns_config.mode());
+ EXPECT_TRUE(secure_dns_config.servers().empty());
EXPECT_TRUE(config_reader_->parental_controls_checked());
}
@@ -255,22 +213,16 @@ TEST_F(StubResolverConfigReaderTest, DeferredParentalControlsCheck) {
local_state_.SetBoolean(prefs::kBuiltInDnsClientEnabled, true);
local_state_.SetString(prefs::kDnsOverHttpsMode,
- chrome_browser_net::kDnsOverHttpsModeAutomatic);
+ SecureDnsConfig::kModeAutomatic);
local_state_.SetString(prefs::kDnsOverHttpsTemplates, kDohServerTemplate);
- bool insecure_stub_resolver_enabled;
- net::DnsConfig::SecureDnsMode secure_dns_mode;
- std::vector<net::DnsOverHttpsServerConfig> dns_over_https_servers;
-
- config_reader_->GetConfiguration(
- false /* force_check_parental_controls_for_automatic_mode */,
- &insecure_stub_resolver_enabled, &secure_dns_mode,
- &dns_over_https_servers);
+ SecureDnsConfig secure_dns_config = config_reader_->GetSecureDnsConfiguration(
+ false /* force_check_parental_controls_for_automatic_mode */);
// Parental controls check initially skipped.
- EXPECT_TRUE(insecure_stub_resolver_enabled);
- EXPECT_EQ(secure_dns_mode, net::DnsConfig::SecureDnsMode::AUTOMATIC);
- EXPECT_THAT(dns_over_https_servers,
+ EXPECT_TRUE(config_reader_->GetInsecureStubResolverEnabled());
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::AUTOMATIC, secure_dns_config.mode());
+ EXPECT_THAT(secure_dns_config.servers(),
testing::ElementsAre(
net::DnsOverHttpsServerConfig("https://doh1.test",
true /* use_post */),
@@ -284,15 +236,12 @@ TEST_F(StubResolverConfigReaderTest, DeferredParentalControlsCheck) {
EXPECT_TRUE(config_reader_->parental_controls_checked());
- dns_over_https_servers.clear();
- config_reader_->GetConfiguration(
- false /* force_check_parental_controls_for_automatic_mode */,
- &insecure_stub_resolver_enabled, &secure_dns_mode,
- &dns_over_https_servers);
+ secure_dns_config = config_reader_->GetSecureDnsConfiguration(
+ false /* force_check_parental_controls_for_automatic_mode */);
- EXPECT_TRUE(insecure_stub_resolver_enabled);
- EXPECT_EQ(secure_dns_mode, net::DnsConfig::SecureDnsMode::OFF);
- EXPECT_TRUE(dns_over_https_servers.empty());
+ EXPECT_TRUE(config_reader_->GetInsecureStubResolverEnabled());
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF, secure_dns_config.mode());
+ EXPECT_TRUE(secure_dns_config.servers().empty());
}
TEST_F(StubResolverConfigReaderTest, DeferredParentalControlsCheck_Managed) {
@@ -302,26 +251,19 @@ TEST_F(StubResolverConfigReaderTest, DeferredParentalControlsCheck_Managed) {
local_state_.SetBoolean(prefs::kBuiltInDnsClientEnabled, true);
local_state_.SetManagedPref(
prefs::kDnsOverHttpsMode,
- std::make_unique<base::Value>(
- chrome_browser_net::kDnsOverHttpsModeAutomatic));
+ std::make_unique<base::Value>(SecureDnsConfig::kModeAutomatic));
local_state_.SetManagedPref(
prefs::kDnsOverHttpsTemplates,
std::make_unique<base::Value>(kDohServerTemplate));
- bool insecure_stub_resolver_enabled;
- net::DnsConfig::SecureDnsMode secure_dns_mode;
- std::vector<net::DnsOverHttpsServerConfig> dns_over_https_servers;
-
- config_reader_->GetConfiguration(
- false /* force_check_parental_controls_for_automatic_mode */,
- &insecure_stub_resolver_enabled, &secure_dns_mode,
- &dns_over_https_servers);
+ SecureDnsConfig secure_dns_config = config_reader_->GetSecureDnsConfiguration(
+ false /* force_check_parental_controls_for_automatic_mode */);
// Parental controls check initially skipped, and managed prefs take
// precedence over disables.
- EXPECT_TRUE(insecure_stub_resolver_enabled);
- EXPECT_EQ(secure_dns_mode, net::DnsConfig::SecureDnsMode::AUTOMATIC);
- EXPECT_THAT(dns_over_https_servers,
+ EXPECT_TRUE(config_reader_->GetInsecureStubResolverEnabled());
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::AUTOMATIC, secure_dns_config.mode());
+ EXPECT_THAT(secure_dns_config.servers(),
testing::ElementsAre(
net::DnsOverHttpsServerConfig("https://doh1.test",
true /* use_post */),
@@ -335,17 +277,14 @@ TEST_F(StubResolverConfigReaderTest, DeferredParentalControlsCheck_Managed) {
EXPECT_TRUE(config_reader_->parental_controls_checked());
- dns_over_https_servers.clear();
- config_reader_->GetConfiguration(
- false /* force_check_parental_controls_for_automatic_mode */,
- &insecure_stub_resolver_enabled, &secure_dns_mode,
- &dns_over_https_servers);
+ secure_dns_config = config_reader_->GetSecureDnsConfiguration(
+ false /* force_check_parental_controls_for_automatic_mode */);
// Expect DoH still enabled after parental controls check because managed
// prefs have precedence.
- EXPECT_TRUE(insecure_stub_resolver_enabled);
- EXPECT_EQ(secure_dns_mode, net::DnsConfig::SecureDnsMode::AUTOMATIC);
- EXPECT_THAT(dns_over_https_servers,
+ EXPECT_TRUE(config_reader_->GetInsecureStubResolverEnabled());
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::AUTOMATIC, secure_dns_config.mode());
+ EXPECT_THAT(secure_dns_config.servers(),
testing::ElementsAre(
net::DnsOverHttpsServerConfig("https://doh1.test",
true /* use_post */),
diff --git a/chromium/chrome/browser/net/system_network_context_manager.cc b/chromium/chrome/browser/net/system_network_context_manager.cc
index 11e4953a792..bb3b12d4667 100644
--- a/chromium/chrome/browser/net/system_network_context_manager.cc
+++ b/chromium/chrome/browser/net/system_network_context_manager.cc
@@ -24,12 +24,12 @@
#include "chrome/browser/component_updater/crl_set_component_installer.h"
#include "chrome/browser/component_updater/tls_deprecation_config_component_installer.h"
#include "chrome/browser/net/chrome_mojo_proxy_resolver_factory.h"
-#include "chrome/browser/net/dns_util.h"
#include "chrome/browser/safe_browsing/safe_browsing_service.h"
#include "chrome/browser/ssl/ssl_config_service_manager.h"
#include "chrome/common/channel_info.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/chrome_switches.h"
+#include "chrome/common/google_url_loader_throttle.h"
#include "chrome/common/pref_names.h"
#include "components/certificate_transparency/ct_known_logs.h"
#include "components/net_log/net_export_file_writer.h"
@@ -64,6 +64,7 @@
#include "services/network/public/cpp/cross_thread_pending_shared_url_loader_factory.h"
#include "services/network/public/cpp/features.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "services/network/public/mojom/network_context.mojom.h"
#include "services/proxy_resolver/public/mojom/proxy_resolver.mojom.h"
#include "third_party/blink/public/common/features.h"
#include "url/gurl.h"
@@ -153,6 +154,8 @@ network::mojom::HttpAuthDynamicParamsPtr CreateHttpAuthDynamicParams(
#endif // defined(OS_ANDROID)
#if defined(OS_CHROMEOS)
+ // TODO: Use KerberosCredentialsManager to determine whether Kerberos is
+ // enabled instead of relying directly on the preference.
policy::BrowserPolicyConnectorChromeOS* connector =
g_browser_process->platform_part()->browser_policy_connector_chromeos();
auth_dynamic_params->allow_gssapi_library_load =
@@ -235,7 +238,7 @@ class SystemNetworkContextManager::URLLoaderFactoryForSystem
private:
friend class base::RefCounted<URLLoaderFactoryForSystem>;
- ~URLLoaderFactoryForSystem() override {}
+ ~URLLoaderFactoryForSystem() override = default;
SEQUENCE_CHECKER(sequence_checker_);
SystemNetworkContextManager* manager_;
@@ -364,6 +367,8 @@ SystemNetworkContextManager::SystemNetworkContextManager(
#endif // defined(OS_ANDROID)
#if defined(OS_CHROMEOS)
+ // TODO: Use KerberosCredentialsManager::Observer to be notified of when the
+ // enabled state changes instead of relying directly on the preference.
pref_change_registrar_.Add(prefs::kKerberosEnabled, auth_pref_callback);
#endif // defined(OS_CHROMEOS)
@@ -531,12 +536,12 @@ void SystemNetworkContextManager::AddSSLConfigToNetworkContextParams(
network_context_params);
}
-network::mojom::NetworkContextParamsPtr
-SystemNetworkContextManager::CreateDefaultNetworkContextParams() {
- network::mojom::NetworkContextParamsPtr network_context_params =
- network::mojom::NetworkContextParams::New();
- content::UpdateCorsExemptHeader(network_context_params.get());
- variations::UpdateCorsExemptHeaderForVariations(network_context_params.get());
+void SystemNetworkContextManager::ConfigureDefaultNetworkContextParams(
+ network::mojom::NetworkContextParams* network_context_params,
+ network::mojom::CertVerifierCreationParams* cert_verifier_creation_params) {
+ content::UpdateCorsExemptHeader(network_context_params);
+ variations::UpdateCorsExemptHeaderForVariations(network_context_params);
+ GoogleURLLoaderThrottle::UpdateCorsExemptHeader(network_context_params);
network_context_params->enable_brotli = true;
@@ -561,7 +566,8 @@ SystemNetworkContextManager::CreateDefaultNetworkContextParams() {
version_info::GetProductNameAndVersionForUserAgent());
quic_user_agent_id.push_back(' ');
quic_user_agent_id.append(
- content::BuildOSCpuInfo(false /* include_android_build_number */));
+ content::BuildOSCpuInfo(content::IncludeAndroidBuildNumber::Exclude,
+ content::IncludeAndroidModel::Include));
}
network_context_params->quic_user_agent_id = quic_user_agent_id;
@@ -589,7 +595,7 @@ SystemNetworkContextManager::CreateDefaultNetworkContextParams() {
// configuration. The SystemNetworkContextManager is owned by the
// BrowserProcess itself, so will only be destroyed on shutdown, at which
// point, all NetworkContexts will be destroyed as well.
- AddSSLConfigToNetworkContextParams(network_context_params.get());
+ AddSSLConfigToNetworkContextParams(network_context_params);
#if !defined(OS_ANDROID)
@@ -625,12 +631,25 @@ SystemNetworkContextManager::CreateDefaultNetworkContextParams() {
#endif
#if BUILDFLAG(BUILTIN_CERT_VERIFIER_FEATURE_SUPPORTED)
- network_context_params->use_builtin_cert_verifier =
+ cert_verifier_creation_params->use_builtin_cert_verifier =
ShouldUseBuiltinCertVerifier(local_state_)
- ? network::mojom::NetworkContextParams::CertVerifierImpl::kBuiltin
- : network::mojom::NetworkContextParams::CertVerifierImpl::kSystem;
+ ? network::mojom::CertVerifierCreationParams::CertVerifierImpl::
+ kBuiltin
+ : network::mojom::CertVerifierCreationParams::CertVerifierImpl::
+ kSystem;
#endif
+}
+network::mojom::NetworkContextParamsPtr
+SystemNetworkContextManager::CreateDefaultNetworkContextParams() {
+ network::mojom::NetworkContextParamsPtr network_context_params =
+ network::mojom::NetworkContextParams::New();
+ network::mojom::CertVerifierCreationParamsPtr cert_verifier_creation_params =
+ network::mojom::CertVerifierCreationParams::New();
+ ConfigureDefaultNetworkContextParams(network_context_params.get(),
+ cert_verifier_creation_params.get());
+ network_context_params->cert_verifier_creation_params =
+ std::move(cert_verifier_creation_params);
return network_context_params;
}
diff --git a/chromium/chrome/browser/net/system_network_context_manager.h b/chromium/chrome/browser/net/system_network_context_manager.h
index 755ef5a9e3d..38ddec6c873 100644
--- a/chromium/chrome/browser/net/system_network_context_manager.h
+++ b/chromium/chrome/browser/net/system_network_context_manager.h
@@ -12,7 +12,6 @@
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/optional.h"
-#include "chrome/browser/net/dns_util.h"
#include "chrome/browser/net/proxy_config_monitor.h"
#include "chrome/browser/net/stub_resolver_config_reader.h"
#include "components/prefs/pref_change_registrar.h"
@@ -118,7 +117,15 @@ class SystemNetworkContextManager {
void AddSSLConfigToNetworkContextParams(
network::mojom::NetworkContextParams* network_context_params);
- // Returns default set of parameters for configuring the network service.
+ // Configures default set of parameters for configuring the network context.
+ void ConfigureDefaultNetworkContextParams(
+ network::mojom::NetworkContextParams* network_context_params,
+ network::mojom::CertVerifierCreationParams*
+ cert_verifier_creation_params);
+
+ // Same as ConfigureDefaultNetworkContextParams() but returns a newly
+ // allocated network::mojom::NetworkContextParams with the
+ // CertVerifierCreationParams already placed into the NetworkContextParams.
network::mojom::NetworkContextParamsPtr CreateDefaultNetworkContextParams();
// Returns a shared global NetExportFileWriter instance, used by net-export.
diff --git a/chromium/chrome/browser/net/system_network_context_manager_browsertest.cc b/chromium/chrome/browser/net/system_network_context_manager_browsertest.cc
index 742b72003f8..f1b01f338ac 100644
--- a/chromium/chrome/browser/net/system_network_context_manager_browsertest.cc
+++ b/chromium/chrome/browser/net/system_network_context_manager_browsertest.cc
@@ -13,7 +13,7 @@
#include "base/values.h"
#include "build/build_config.h"
#include "chrome/browser/browser_process.h"
-#include "chrome/browser/net/dns_util.h"
+#include "chrome/browser/net/secure_dns_config.h"
#include "chrome/browser/net/stub_resolver_config_reader.h"
#include "chrome/common/channel_info.h"
#include "chrome/common/chrome_features.h"
@@ -22,6 +22,7 @@
#include "components/prefs/pref_service.h"
#include "components/version_info/version_info.h"
#include "content/public/common/user_agent.h"
+#include "content/public/test/browser_test.h"
#include "services/network/public/cpp/network_service_buildflags.h"
#include "services/network/public/mojom/network_context.mojom.h"
#include "services/network/public/mojom/network_service.mojom.h"
@@ -42,16 +43,16 @@
namespace {
-void GetStubResolverConfig(
- bool force_check_parental_controls_for_automatic_mode,
- bool* insecure_stub_resolver_enabled,
- net::DnsConfig::SecureDnsMode* secure_dns_mode,
- std::vector<net::DnsOverHttpsServerConfig>* dns_over_https_servers) {
- dns_over_https_servers->clear();
+SecureDnsConfig GetSecureDnsConfiguration(
+ bool force_check_parental_controls_for_automatic_mode) {
+ return SystemNetworkContextManager::GetStubResolverConfigReader()
+ ->GetSecureDnsConfiguration(
+ force_check_parental_controls_for_automatic_mode);
+}
- SystemNetworkContextManager::GetStubResolverConfigReader()->GetConfiguration(
- force_check_parental_controls_for_automatic_mode,
- insecure_stub_resolver_enabled, secure_dns_mode, dns_over_https_servers);
+bool GetInsecureStubResolverEnabled() {
+ return SystemNetworkContextManager::GetStubResolverConfigReader()
+ ->GetInsecureStubResolverEnabled();
}
// Checks that the values returned by GetStubResolverConfigForTesting() match
@@ -64,20 +65,16 @@ void RunStubResolverConfigTests(bool async_dns_feature_enabled) {
base::win::ScopedDomainStateForTesting scoped_domain(false);
#endif
// Check initial state.
- bool insecure_stub_resolver_enabled = !async_dns_feature_enabled;
- net::DnsConfig::SecureDnsMode secure_dns_mode;
- std::vector<net::DnsOverHttpsServerConfig> dns_over_https_servers;
- GetStubResolverConfig(
- false /* force_check_parental_controls_for_automatic_mode */,
- &insecure_stub_resolver_enabled, &secure_dns_mode,
- &dns_over_https_servers);
- EXPECT_EQ(async_dns_feature_enabled, insecure_stub_resolver_enabled);
+ SecureDnsConfig secure_dns_config = GetSecureDnsConfiguration(
+ false /* force_check_parental_controls_for_automatic_mode */);
+ EXPECT_EQ(async_dns_feature_enabled, GetInsecureStubResolverEnabled());
if (base::FeatureList::IsEnabled(features::kDnsOverHttps)) {
- EXPECT_EQ(net::DnsConfig::SecureDnsMode::AUTOMATIC, secure_dns_mode);
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::AUTOMATIC,
+ secure_dns_config.mode());
} else {
- EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF, secure_dns_mode);
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF, secure_dns_config.mode());
}
- EXPECT_TRUE(dns_over_https_servers.empty());
+ EXPECT_TRUE(secure_dns_config.servers().empty());
std::string good_post_template = "https://foo.test/";
std::string good_get_template = "https://bar.test/dns-query{?dns}";
@@ -89,105 +86,91 @@ void RunStubResolverConfigTests(bool async_dns_feature_enabled) {
PrefService* local_state = g_browser_process->local_state();
local_state->SetString(prefs::kDnsOverHttpsMode,
- chrome_browser_net::kDnsOverHttpsModeSecure);
+ SecureDnsConfig::kModeSecure);
local_state->SetString(prefs::kDnsOverHttpsTemplates, bad_template);
- GetStubResolverConfig(
- false /* force_check_parental_controls_for_automatic_mode */,
- &insecure_stub_resolver_enabled, &secure_dns_mode,
- &dns_over_https_servers);
- EXPECT_EQ(async_dns_feature_enabled, insecure_stub_resolver_enabled);
- EXPECT_EQ(net::DnsConfig::SecureDnsMode::SECURE, secure_dns_mode);
- EXPECT_TRUE(dns_over_https_servers.empty());
+ secure_dns_config = GetSecureDnsConfiguration(
+ false /* force_check_parental_controls_for_automatic_mode */);
+ EXPECT_EQ(async_dns_feature_enabled, GetInsecureStubResolverEnabled());
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::SECURE, secure_dns_config.mode());
+ EXPECT_TRUE(secure_dns_config.servers().empty());
local_state->SetString(prefs::kDnsOverHttpsTemplates, good_post_template);
- GetStubResolverConfig(
- false /* force_check_parental_controls_for_automatic_mode */,
- &insecure_stub_resolver_enabled, &secure_dns_mode,
- &dns_over_https_servers);
- EXPECT_EQ(async_dns_feature_enabled, insecure_stub_resolver_enabled);
- EXPECT_EQ(net::DnsConfig::SecureDnsMode::SECURE, secure_dns_mode);
- ASSERT_EQ(1u, dns_over_https_servers.size());
- EXPECT_EQ(good_post_template, dns_over_https_servers.at(0).server_template);
- EXPECT_EQ(true, dns_over_https_servers.at(0).use_post);
+ secure_dns_config = GetSecureDnsConfiguration(
+ false /* force_check_parental_controls_for_automatic_mode */);
+ EXPECT_EQ(async_dns_feature_enabled, GetInsecureStubResolverEnabled());
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::SECURE, secure_dns_config.mode());
+ ASSERT_EQ(1u, secure_dns_config.servers().size());
+ EXPECT_EQ(good_post_template,
+ secure_dns_config.servers().at(0).server_template);
+ EXPECT_EQ(true, secure_dns_config.servers().at(0).use_post);
local_state->SetString(prefs::kDnsOverHttpsMode,
- chrome_browser_net::kDnsOverHttpsModeAutomatic);
+ SecureDnsConfig::kModeAutomatic);
local_state->SetString(prefs::kDnsOverHttpsTemplates, bad_template);
- GetStubResolverConfig(
- false /* force_check_parental_controls_for_automatic_mode */,
- &insecure_stub_resolver_enabled, &secure_dns_mode,
- &dns_over_https_servers);
- EXPECT_EQ(async_dns_feature_enabled, insecure_stub_resolver_enabled);
- EXPECT_EQ(net::DnsConfig::SecureDnsMode::AUTOMATIC, secure_dns_mode);
- EXPECT_TRUE(dns_over_https_servers.empty());
+ secure_dns_config = GetSecureDnsConfiguration(
+ false /* force_check_parental_controls_for_automatic_mode */);
+ EXPECT_EQ(async_dns_feature_enabled, GetInsecureStubResolverEnabled());
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::AUTOMATIC, secure_dns_config.mode());
+ EXPECT_TRUE(secure_dns_config.servers().empty());
local_state->SetString(prefs::kDnsOverHttpsTemplates, good_then_bad_template);
- GetStubResolverConfig(
- false /* force_check_parental_controls_for_automatic_mode */,
- &insecure_stub_resolver_enabled, &secure_dns_mode,
- &dns_over_https_servers);
- EXPECT_EQ(async_dns_feature_enabled, insecure_stub_resolver_enabled);
- EXPECT_EQ(net::DnsConfig::SecureDnsMode::AUTOMATIC, secure_dns_mode);
- ASSERT_EQ(1u, dns_over_https_servers.size());
- EXPECT_EQ(good_get_template, dns_over_https_servers.at(0).server_template);
- EXPECT_FALSE(dns_over_https_servers.at(0).use_post);
+ secure_dns_config = GetSecureDnsConfiguration(
+ false /* force_check_parental_controls_for_automatic_mode */);
+ EXPECT_EQ(async_dns_feature_enabled, GetInsecureStubResolverEnabled());
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::AUTOMATIC, secure_dns_config.mode());
+ ASSERT_EQ(1u, secure_dns_config.servers().size());
+ EXPECT_EQ(good_get_template,
+ secure_dns_config.servers().at(0).server_template);
+ EXPECT_FALSE(secure_dns_config.servers().at(0).use_post);
local_state->SetString(prefs::kDnsOverHttpsTemplates, bad_then_good_template);
- GetStubResolverConfig(
- false /* force_check_parental_controls_for_automatic_mode */,
- &insecure_stub_resolver_enabled, &secure_dns_mode,
- &dns_over_https_servers);
- EXPECT_EQ(async_dns_feature_enabled, insecure_stub_resolver_enabled);
- EXPECT_EQ(net::DnsConfig::SecureDnsMode::AUTOMATIC, secure_dns_mode);
- ASSERT_EQ(1u, dns_over_https_servers.size());
- EXPECT_EQ(good_get_template, dns_over_https_servers.at(0).server_template);
- EXPECT_FALSE(dns_over_https_servers.at(0).use_post);
+ secure_dns_config = GetSecureDnsConfiguration(
+ false /* force_check_parental_controls_for_automatic_mode */);
+ EXPECT_EQ(async_dns_feature_enabled, GetInsecureStubResolverEnabled());
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::AUTOMATIC, secure_dns_config.mode());
+ ASSERT_EQ(1u, secure_dns_config.servers().size());
+ EXPECT_EQ(good_get_template,
+ secure_dns_config.servers().at(0).server_template);
+ EXPECT_FALSE(secure_dns_config.servers().at(0).use_post);
local_state->SetString(prefs::kDnsOverHttpsTemplates,
multiple_good_templates);
- GetStubResolverConfig(
- false /* force_check_parental_controls_for_automatic_mode */,
- &insecure_stub_resolver_enabled, &secure_dns_mode,
- &dns_over_https_servers);
- EXPECT_EQ(async_dns_feature_enabled, insecure_stub_resolver_enabled);
- EXPECT_EQ(net::DnsConfig::SecureDnsMode::AUTOMATIC, secure_dns_mode);
- ASSERT_EQ(2u, dns_over_https_servers.size());
- EXPECT_EQ(good_get_template, dns_over_https_servers.at(0).server_template);
- EXPECT_FALSE(dns_over_https_servers.at(0).use_post);
- EXPECT_EQ(good_post_template, dns_over_https_servers.at(1).server_template);
- EXPECT_TRUE(dns_over_https_servers.at(1).use_post);
-
- local_state->SetString(prefs::kDnsOverHttpsMode,
- chrome_browser_net::kDnsOverHttpsModeOff);
+ secure_dns_config = GetSecureDnsConfiguration(
+ false /* force_check_parental_controls_for_automatic_mode */);
+ EXPECT_EQ(async_dns_feature_enabled, GetInsecureStubResolverEnabled());
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::AUTOMATIC, secure_dns_config.mode());
+ ASSERT_EQ(2u, secure_dns_config.servers().size());
+ EXPECT_EQ(good_get_template,
+ secure_dns_config.servers().at(0).server_template);
+ EXPECT_FALSE(secure_dns_config.servers().at(0).use_post);
+ EXPECT_EQ(good_post_template,
+ secure_dns_config.servers().at(1).server_template);
+ EXPECT_TRUE(secure_dns_config.servers().at(1).use_post);
+
+ local_state->SetString(prefs::kDnsOverHttpsMode, SecureDnsConfig::kModeOff);
local_state->SetString(prefs::kDnsOverHttpsTemplates, good_get_template);
- GetStubResolverConfig(
- false /* force_check_parental_controls_for_automatic_mode */,
- &insecure_stub_resolver_enabled, &secure_dns_mode,
- &dns_over_https_servers);
- EXPECT_EQ(async_dns_feature_enabled, insecure_stub_resolver_enabled);
- EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF, secure_dns_mode);
- EXPECT_TRUE(dns_over_https_servers.empty());
+ secure_dns_config = GetSecureDnsConfiguration(
+ false /* force_check_parental_controls_for_automatic_mode */);
+ EXPECT_EQ(async_dns_feature_enabled, GetInsecureStubResolverEnabled());
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF, secure_dns_config.mode());
+ EXPECT_TRUE(secure_dns_config.servers().empty());
local_state->SetString(prefs::kDnsOverHttpsMode, "no_match");
- GetStubResolverConfig(
- false /* force_check_parental_controls_for_automatic_mode */,
- &insecure_stub_resolver_enabled, &secure_dns_mode,
- &dns_over_https_servers);
- EXPECT_EQ(async_dns_feature_enabled, insecure_stub_resolver_enabled);
- EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF, secure_dns_mode);
- EXPECT_TRUE(dns_over_https_servers.empty());
+ secure_dns_config = GetSecureDnsConfiguration(
+ false /* force_check_parental_controls_for_automatic_mode */);
+ EXPECT_EQ(async_dns_feature_enabled, GetInsecureStubResolverEnabled());
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF, secure_dns_config.mode());
+ EXPECT_TRUE(secure_dns_config.servers().empty());
// Test case with policy BuiltInDnsClientEnabled enabled. The DoH fields
// should be unaffected.
local_state->Set(prefs::kBuiltInDnsClientEnabled,
base::Value(!async_dns_feature_enabled));
- GetStubResolverConfig(
- false /* force_check_parental_controls_for_automatic_mode */,
- &insecure_stub_resolver_enabled, &secure_dns_mode,
- &dns_over_https_servers);
- EXPECT_EQ(!async_dns_feature_enabled, insecure_stub_resolver_enabled);
- EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF, secure_dns_mode);
- EXPECT_TRUE(dns_over_https_servers.empty());
+ secure_dns_config = GetSecureDnsConfiguration(
+ false /* force_check_parental_controls_for_automatic_mode */);
+ EXPECT_EQ(!async_dns_feature_enabled, GetInsecureStubResolverEnabled());
+ EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF, secure_dns_config.mode());
+ EXPECT_TRUE(secure_dns_config.servers().empty());
}
} // namespace
@@ -386,7 +369,10 @@ IN_PROC_BROWSER_TEST_P(SystemNetworkContextManagerFreezeQUICUaBrowsertest,
EXPECT_TRUE(ContainsSubstring(quic_ua, chrome::GetChannelName()));
EXPECT_TRUE(ContainsSubstring(
quic_ua, version_info::GetProductNameAndVersionForUserAgent()));
- EXPECT_TRUE(ContainsSubstring(quic_ua, content::BuildOSCpuInfo(false)));
+ EXPECT_TRUE(ContainsSubstring(
+ quic_ua,
+ content::BuildOSCpuInfo(content::IncludeAndroidBuildNumber::Exclude,
+ content::IncludeAndroidModel::Include)));
}
}
@@ -490,13 +476,13 @@ IN_PROC_BROWSER_TEST_P(
Test) {
// If no BuiltinCertificateVerifierEnabled policy is set, the
// use_builtin_cert_verifier param should be set from the feature flag.
- EXPECT_EQ(
- GetParam()
- ? network::mojom::NetworkContextParams::CertVerifierImpl::kBuiltin
- : network::mojom::NetworkContextParams::CertVerifierImpl::kSystem,
- g_browser_process->system_network_context_manager()
- ->CreateDefaultNetworkContextParams()
- ->use_builtin_cert_verifier);
+ EXPECT_EQ(GetParam() ? network::mojom::CertVerifierCreationParams::
+ CertVerifierImpl::kBuiltin
+ : network::mojom::CertVerifierCreationParams::
+ CertVerifierImpl::kSystem,
+ g_browser_process->system_network_context_manager()
+ ->CreateDefaultNetworkContextParams()
+ ->cert_verifier_creation_params->use_builtin_cert_verifier);
#if BUILDFLAG(BUILTIN_CERT_VERIFIER_POLICY_SUPPORTED)
// If the BuiltinCertificateVerifierEnabled policy is set it should override
// the feature flag.
@@ -504,18 +490,20 @@ IN_PROC_BROWSER_TEST_P(
SetPolicy(&policies, policy::key::kBuiltinCertificateVerifierEnabled,
std::make_unique<base::Value>(true));
UpdateProviderPolicy(policies);
- EXPECT_EQ(network::mojom::NetworkContextParams::CertVerifierImpl::kBuiltin,
- g_browser_process->system_network_context_manager()
- ->CreateDefaultNetworkContextParams()
- ->use_builtin_cert_verifier);
+ EXPECT_EQ(
+ network::mojom::CertVerifierCreationParams::CertVerifierImpl::kBuiltin,
+ g_browser_process->system_network_context_manager()
+ ->CreateDefaultNetworkContextParams()
+ ->cert_verifier_creation_params->use_builtin_cert_verifier);
SetPolicy(&policies, policy::key::kBuiltinCertificateVerifierEnabled,
std::make_unique<base::Value>(false));
UpdateProviderPolicy(policies);
- EXPECT_EQ(network::mojom::NetworkContextParams::CertVerifierImpl::kSystem,
- g_browser_process->system_network_context_manager()
- ->CreateDefaultNetworkContextParams()
- ->use_builtin_cert_verifier);
+ EXPECT_EQ(
+ network::mojom::CertVerifierCreationParams::CertVerifierImpl::kSystem,
+ g_browser_process->system_network_context_manager()
+ ->CreateDefaultNetworkContextParams()
+ ->cert_verifier_creation_params->use_builtin_cert_verifier);
#endif // BUILDFLAG(BUILTIN_CERT_VERIFIER_POLICY_SUPPORTED)
}
diff --git a/chromium/chrome/browser/net/trial_comparison_cert_verifier_browsertest.cc b/chromium/chrome/browser/net/trial_comparison_cert_verifier_browsertest.cc
index 6d676834b67..1c431c79806 100644
--- a/chromium/chrome/browser/net/trial_comparison_cert_verifier_browsertest.cc
+++ b/chromium/chrome/browser/net/trial_comparison_cert_verifier_browsertest.cc
@@ -13,6 +13,7 @@
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/safe_browsing/core/common/safe_browsing_prefs.h"
+#include "content/public/test/browser_test.h"
#include "net/base/features.h"
#include "net/cert/trial_comparison_cert_verifier.h"
#include "net/net_buildflags.h"
diff --git a/chromium/chrome/browser/net/trust_token_usecounter_browsertest.cc b/chromium/chrome/browser/net/trust_token_usecounter_browsertest.cc
new file mode 100644
index 00000000000..7761755fc7b
--- /dev/null
+++ b/chromium/chrome/browser/net/trust_token_usecounter_browsertest.cc
@@ -0,0 +1,140 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/test/metrics/histogram_tester.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/test/browser_test.h"
+#include "content/public/test/browser_test_utils.h"
+#include "content/public/test/test_navigation_observer.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "services/network/public/cpp/features.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace content {
+
+// The Trust Token API (https://github.com/wicg/trust-token-api) allows clients
+// to annotate outgoing requests with certain cryptographic state, by providing
+// parameters alongside Fetch, XHR, and iframe-tag loads. These tests confirm
+// that providing Trust Tokens parameters to each of these API entry points
+// increments the corresponding Blink UseCounter. Although Trust Tokens is part
+// of the web platform and the use counters are incremented in Blink, these
+// tests live in //chrome because the Page Load Metrics framework, Chrome's way
+// of listening for use counter updates, is not available in the content shell.
+
+class TrustTokenUseCountersBrowsertest : public InProcessBrowserTest {
+ public:
+ TrustTokenUseCountersBrowsertest() {
+ features_.InitAndEnableFeature(network::features::kTrustTokens);
+ }
+
+ void SetUpOnMainThread() override {
+ server_.AddDefaultHandlers(
+ base::FilePath(FILE_PATH_LITERAL("chrome/test/data")));
+ ASSERT_TRUE(server_.Start());
+ }
+
+ protected:
+ base::test::ScopedFeatureList features_;
+
+ net::EmbeddedTestServer server_{net::EmbeddedTestServer::TYPE_HTTPS};
+};
+
+IN_PROC_BROWSER_TEST_F(TrustTokenUseCountersBrowsertest, CountsFetchUse) {
+ base::HistogramTester histograms;
+
+ GURL start_url(server_.GetURL("/title1.html"));
+ EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), start_url));
+
+ std::string cmd = R"(
+ (async () => {
+ await fetch("/page404.html", {trustToken: {type: 'token-request'}});
+ } )(); )";
+
+ // We use EvalJs here, not ExecJs, because EvalJs waits for promises to
+ // resolve. We expect a failure because the destination of the Trust
+ // Tokens operation-bearing request will 404; this is fine since we just need
+ // to test that the usage metric fired when the command was called.
+ EXPECT_FALSE(
+ content::EvalJs(browser()->tab_strip_model()->GetActiveWebContents(), cmd)
+ .error.empty());
+
+ // Navigate away in order to flush use counters.
+ EXPECT_TRUE(
+ ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)));
+
+ histograms.ExpectBucketCount("Blink.UseCounter.Features",
+ blink::mojom::WebFeature::kTrustTokenFetch, 1);
+}
+
+IN_PROC_BROWSER_TEST_F(TrustTokenUseCountersBrowsertest, CountsXhrUse) {
+ GURL start_url(server_.GetURL("/title1.html"));
+ EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), start_url));
+
+ base::HistogramTester histograms;
+
+ // Execute a Trust Tokens issuance against a nonexistent endpoint.
+ std::string cmd = R"(
+ (async () => {
+ let request = new XMLHttpRequest();
+ request.open('GET', '/page404.html');
+ request.setTrustToken({
+ type: 'token-request'
+ });
+ let promise = new Promise((res, rej) => {
+ request.onload = res; request.onerror = rej;
+ });
+ request.send();
+ await promise;
+ })(); )";
+
+ // We use EvalJs here, not ExecJs, because EvalJs waits for promises to
+ // resolve. We expect a failure because the destination of the Trust
+ // Tokens operation-bearing request will 404; this is fine since we just need
+ // to test that the usage metric fired when the command was called.
+ EXPECT_FALSE(
+ content::EvalJs(browser()->tab_strip_model()->GetActiveWebContents(), cmd)
+ .error.empty());
+
+ // Navigate away in order to flush use counters.
+ EXPECT_TRUE(
+ ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)));
+
+ histograms.ExpectBucketCount("Blink.UseCounter.Features",
+ blink::mojom::WebFeature::kTrustTokenXhr, 1);
+}
+
+IN_PROC_BROWSER_TEST_F(TrustTokenUseCountersBrowsertest, CountsIframeUse) {
+ base::HistogramTester histograms;
+
+ GURL start_url(server_.GetURL("/iframe.html"));
+ EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), start_url));
+
+ content::WebContents* web_contents =
+ browser()->tab_strip_model()->GetActiveWebContents();
+
+ // It's important to set the trust token arguments before updating src, as
+ // the latter triggers a load. It's also important to JsReplace the trustToken
+ // argument here, because iframe.trustToken expects a (properly escaped)
+ // JSON-encoded string as its value, not a JS object.
+ EXPECT_TRUE(ExecJs(web_contents,
+ JsReplace(
+ R"( const myFrame = document.getElementById("test");
+ myFrame.trustToken = $1;
+ myFrame.src = $2;)",
+ R"({"type": "token-request"})", "/page404.html")));
+ TestNavigationObserver load_observer(web_contents);
+ load_observer.Wait();
+
+ // Navigate away in order to flush use counters.
+ EXPECT_TRUE(
+ ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)));
+
+ histograms.ExpectBucketCount("Blink.UseCounter.Features",
+ blink::mojom::WebFeature::kTrustTokenIframe, 1);
+}
+
+} // namespace content
diff --git a/chromium/chrome/browser/net/variations_http_headers_browsertest.cc b/chromium/chrome/browser/net/variations_http_headers_browsertest.cc
index 485626d43c8..4b55712c322 100644
--- a/chromium/chrome/browser/net/variations_http_headers_browsertest.cc
+++ b/chromium/chrome/browser/net/variations_http_headers_browsertest.cc
@@ -30,6 +30,7 @@
#include "components/variations/variations_http_header_provider.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/storage_partition.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/network_connection_change_simulator.h"
#include "content/public/test/simple_url_loader_test_helper.h"
@@ -288,7 +289,7 @@ std::unique_ptr<net::test_server::HttpResponse>
VariationsHttpHeadersBrowserTest::RequestHandler(
const net::test_server::HttpRequest& request) {
// Retrieve the host name (without port) from the request headers.
- std::string host = "";
+ std::string host;
if (request.headers.find("Host") != request.headers.end())
host = request.headers.find("Host")->second;
if (host.find(':') != std::string::npos)
diff --git a/chromium/chrome/browser/net/websocket_browsertest.cc b/chromium/chrome/browser/net/websocket_browsertest.cc
index 03853a6a518..e96355ca123 100644
--- a/chromium/chrome/browser/net/websocket_browsertest.cc
+++ b/chromium/chrome/browser/net/websocket_browsertest.cc
@@ -2,11 +2,22 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <stdint.h>
+
+#include <memory>
#include <string>
+#include <utility>
+#include <vector>
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/check_op.h"
#include "base/macros.h"
+#include "base/notreached.h"
+#include "base/run_loop.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
+#include "base/test/bind_test_util.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/login/login_handler.h"
@@ -18,12 +29,27 @@
#include "content/public/browser/notification_details.h"
#include "content/public/browser/notification_registrar.h"
#include "content/public/browser/notification_source.h"
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/render_process_host.h"
+#include "content/public/browser/storage_partition.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "mojo/public/cpp/system/data_pipe.h"
+#include "net/base/network_isolation_key.h"
+#include "net/cookies/site_for_cookies.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "net/test/spawned_test_server/spawned_test_server.h"
#include "net/test/test_data_directory.h"
+#include "services/network/public/mojom/network_context.mojom.h"
+#include "services/network/public/mojom/websocket.mojom.h"
+#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
+#include "url/origin.h"
namespace {
@@ -354,4 +380,174 @@ IN_PROC_BROWSER_TEST_F(WebSocketBrowserTest, WebSocketAppliesHSTS) {
EXPECT_EQ("PASS", WaitAndGetTitle());
}
+// An implementation of WebSocketClient that expects the mojo connection to be
+// disconnected due to invalid UTF-8.
+class ExpectInvalidUtf8Client : public network::mojom::WebSocketClient {
+ public:
+ ExpectInvalidUtf8Client(base::OnceClosure success_closure,
+ base::RepeatingClosure fail_closure)
+ : success_closure_(std::move(success_closure)),
+ fail_closure_(fail_closure) {}
+
+ ~ExpectInvalidUtf8Client() override = default;
+
+ ExpectInvalidUtf8Client(const ExpectInvalidUtf8Client&) = delete;
+ ExpectInvalidUtf8Client& operator=(ExpectInvalidUtf8Client&) = delete;
+
+ void Bind(mojo::PendingReceiver<network::mojom::WebSocketClient> receiver) {
+ client_receiver_.Bind(std::move(receiver));
+ // This use of base::Unretained is safe because the disconnect handler will
+ // not be called after |client_receiver_| is destroyed.
+ client_receiver_.set_disconnect_with_reason_handler(base::BindRepeating(
+ &ExpectInvalidUtf8Client::OnDisconnect, base::Unretained(this)));
+ }
+
+ // Implementation of WebSocketClient
+ void OnDataFrame(bool fin,
+ network::mojom::WebSocketMessageType,
+ uint64_t data_length) override {
+ NOTREACHED();
+ }
+
+ void AddSendFlowControlQuota(int64_t quota) override {}
+
+ void OnDropChannel(bool was_clean,
+ uint16_t code,
+ const std::string& reason) override {
+ NOTREACHED();
+ }
+
+ void OnClosingHandshake() override { NOTREACHED(); }
+
+ private:
+ void OnDisconnect(uint32_t reason, const std::string& message) {
+ if (reason == network::mojom::WebSocket::kInternalFailure &&
+ message == "Browser sent a text frame containing invalid UTF-8") {
+ std::move(success_closure_).Run();
+ } else {
+ ADD_FAILURE() << "Unexpected disconnect: reason=" << reason
+ << " message=\"" << message << '"';
+ fail_closure_.Run();
+ }
+ }
+
+ base::OnceClosure success_closure_;
+ const base::RepeatingClosure fail_closure_;
+
+ mojo::Receiver<network::mojom::WebSocketClient> client_receiver_{this};
+};
+
+// An implementation of WebSocketHandshakeClient that sends a text message
+// containing invalid UTF-8 when the connection is established.
+class InvalidUtf8HandshakeClient
+ : public network::mojom::WebSocketHandshakeClient {
+ public:
+ InvalidUtf8HandshakeClient(std::unique_ptr<ExpectInvalidUtf8Client> client,
+ base::RepeatingClosure fail_closure)
+ : client_(std::move(client)), fail_closure_(fail_closure) {}
+ ~InvalidUtf8HandshakeClient() override = default;
+
+ InvalidUtf8HandshakeClient(const InvalidUtf8HandshakeClient&) = delete;
+ InvalidUtf8HandshakeClient& operator=(const InvalidUtf8HandshakeClient&) =
+ delete;
+
+ mojo::PendingRemote<network::mojom::WebSocketHandshakeClient> Bind() {
+ auto pending_remote = handshake_client_receiver_.BindNewPipeAndPassRemote();
+ // This use of base::Unretained is safe because the disconnect handler will
+ // not be called after |handshake_client_receiver_| is destroyed.
+ handshake_client_receiver_.set_disconnect_handler(
+ base::BindOnce(&InvalidUtf8HandshakeClient::FailIfNotConnected,
+ base::Unretained(this)));
+ return pending_remote;
+ }
+
+ // Implementation of WebSocketHandshakeClient
+ void OnOpeningHandshakeStarted(
+ network::mojom::WebSocketHandshakeRequestPtr) override {}
+
+ void OnConnectionEstablished(
+ mojo::PendingRemote<network::mojom::WebSocket> websocket,
+ mojo::PendingReceiver<network::mojom::WebSocketClient> client_receiver,
+ network::mojom::WebSocketHandshakeResponsePtr,
+ mojo::ScopedDataPipeConsumerHandle readable,
+ mojo::ScopedDataPipeProducerHandle writable) override {
+ client_->Bind(std::move(client_receiver));
+ websocket_.Bind(std::move(websocket));
+
+ // Invalid UTF-8.
+ static const uint32_t message[] = {0xff};
+ uint32_t size = static_cast<uint32_t>(sizeof(message));
+
+ websocket_->SendMessage(network::mojom::WebSocketMessageType::TEXT, size);
+
+ EXPECT_EQ(writable->WriteData(message, &size, MOJO_WRITE_DATA_FLAG_NONE),
+ MOJO_RESULT_OK);
+ EXPECT_EQ(size, sizeof(message));
+
+ connected_ = true;
+ }
+
+ private:
+ void FailIfNotConnected() {
+ if (!connected_) {
+ fail_closure_.Run();
+ }
+ }
+
+ const std::unique_ptr<ExpectInvalidUtf8Client> client_;
+ const base::RepeatingClosure fail_closure_;
+ bool connected_ = false;
+
+ mojo::Receiver<network::mojom::WebSocketHandshakeClient>
+ handshake_client_receiver_{this};
+ mojo::Remote<network::mojom::WebSocket> websocket_;
+};
+
+IN_PROC_BROWSER_TEST_F(WebSocketBrowserTest, SendBadUtf8) {
+ ASSERT_TRUE(ws_server_.Start());
+
+ base::RunLoop run_loop;
+
+ bool failed = false;
+
+ // This is a repeating closure for convenience so that we can use it in two
+ // places.
+ const base::RepeatingClosure fail_closure = base::BindLambdaForTesting([&]() {
+ failed = true;
+ run_loop.Quit();
+ });
+
+ auto client = std::make_unique<ExpectInvalidUtf8Client>(
+ run_loop.QuitClosure(), fail_closure);
+
+ content::RenderFrameHost* const frame =
+ browser()->tab_strip_model()->GetActiveWebContents()->GetMainFrame();
+ content::RenderProcessHost* const process = frame->GetProcess();
+
+ const GURL url = ws_server_.GetURL("close");
+ const std::vector<std::string> requested_protocols;
+ const net::SiteForCookies site_for_cookies;
+ // The actual value of this doesn't actually matter, it just can't be empty,
+ // to avoid a DCHECK.
+ const net::IsolationInfo isolation_info =
+ net::IsolationInfo::CreateForInternalRequest(url::Origin::Create(url));
+ std::vector<network::mojom::HttpHeaderPtr> additional_headers;
+ const url::Origin origin;
+ auto handshake_client = std::make_unique<InvalidUtf8HandshakeClient>(
+ std::move(client), fail_closure);
+ mojo::PendingRemote<network::mojom::WebSocketHandshakeClient>
+ handshake_client_remote = handshake_client->Bind();
+
+ process->GetStoragePartition()->GetNetworkContext()->CreateWebSocket(
+ url, requested_protocols, site_for_cookies, isolation_info,
+ std::move(additional_headers), process->GetID(), frame->GetRoutingID(),
+ origin, network::mojom::kWebSocketOptionNone,
+ std::move(handshake_client_remote), mojo::NullRemote(),
+ mojo::NullRemote());
+
+ run_loop.Run();
+
+ EXPECT_FALSE(failed);
+}
+
} // namespace
diff --git a/chromium/chrome/browser/offline_pages/android/BUILD.gn b/chromium/chrome/browser/offline_pages/android/BUILD.gn
new file mode 100644
index 00000000000..a5b1a67f9c7
--- /dev/null
+++ b/chromium/chrome/browser/offline_pages/android/BUILD.gn
@@ -0,0 +1,20 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/android/rules.gni")
+
+android_library("java") {
+ sources = [ "java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfiguration.java" ]
+
+ deps = [
+ "//chrome/browser/flags:java",
+ "//chrome/browser/profiles/android:java",
+ ]
+
+ annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
+}
+
+generate_jni("jni_headers") {
+ sources = [ "java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfiguration.java" ]
+}
diff --git a/chromium/chrome/browser/page_load_metrics/integration_tests/jsdeps.gni b/chromium/chrome/browser/page_load_metrics/integration_tests/jsdeps.gni
index 8b2c5abb261..e4db282e4c4 100644
--- a/chromium/chrome/browser/page_load_metrics/integration_tests/jsdeps.gni
+++ b/chromium/chrome/browser/page_load_metrics/integration_tests/jsdeps.gni
@@ -3,6 +3,11 @@
# found in the LICENSE file.
metric_integration_jsdeps = [
+ "//third_party/blink/web_tests/external/wpt/images/blue96x96.png",
+ "//third_party/blink/web_tests/external/wpt/images/green-16x16.png",
"//third_party/blink/web_tests/external/wpt/layout-instability/resources/util.js",
+ "//third_party/blink/web_tests/external/wpt/layout-instability/simple-block-movement.html",
+ "//third_party/blink/web_tests/external/wpt/layout-instability/sources-enclosure.html",
+ "//third_party/blink/web_tests/external/wpt/layout-instability/sources-maximpact.html",
"//third_party/blink/web_tests/external/wpt/resources/testharness.js",
]
diff --git a/chromium/chrome/browser/page_load_metrics/integration_tests/sources.gni b/chromium/chrome/browser/page_load_metrics/integration_tests/sources.gni
index c6be3a5b357..71d70117752 100644
--- a/chromium/chrome/browser/page_load_metrics/integration_tests/sources.gni
+++ b/chromium/chrome/browser/page_load_metrics/integration_tests/sources.gni
@@ -4,6 +4,7 @@
metric_integration_sources = [
"//chrome/browser/page_load_metrics/integration_tests/first_input_delay_browsertest.cc",
+ "//chrome/browser/page_load_metrics/integration_tests/largest_contentful_paint_browsertest.cc",
"//chrome/browser/page_load_metrics/integration_tests/layout_instability_browsertest.cc",
"//chrome/browser/page_load_metrics/integration_tests/metric_integration_test.cc",
"//chrome/browser/page_load_metrics/integration_tests/metric_integration_test.h",
diff --git a/chromium/chrome/browser/payments/BUILD.gn b/chromium/chrome/browser/payments/BUILD.gn
index 3d238407557..91e0bb1f831 100644
--- a/chromium/chrome/browser/payments/BUILD.gn
+++ b/chromium/chrome/browser/payments/BUILD.gn
@@ -6,6 +6,7 @@ source_set("browsertests") {
testonly = true
sources = [
+ "colocated_payment_manifests_browsertest.cc",
"empty_parameters_browsertest.cc",
"has_enrolled_instrument_browsertest.cc",
"has_enrolled_instrument_query_quota_browsertest.cc",
@@ -30,6 +31,7 @@ source_set("browsertests") {
"//chrome/test/payments:test_support",
"//components/payments/content",
"//components/payments/content:utils",
+ "//components/payments/core",
"//components/payments/core:test_support",
"//components/ukm:test_support",
]
@@ -73,9 +75,13 @@ source_set("unittests") {
sources += [
"android/android_payment_app_finder_unittest.cc",
"android/android_payment_app_unittest.cc",
+ "android/payment_app_service_bridge_unittest.cc",
"android/payment_manifest_verifier_unittest.cc",
]
- deps += [ "//chrome/android:native_j_unittests_jni_headers" ]
+ deps += [
+ "//chrome/android:native_j_unittests_jni_headers",
+ "//components/payments/content:utils",
+ ]
}
}
diff --git a/chromium/chrome/browser/payments/android/BUILD.gn b/chromium/chrome/browser/payments/android/BUILD.gn
index 49e98d56274..c37f61f4a5f 100644
--- a/chromium/chrome/browser/payments/android/BUILD.gn
+++ b/chromium/chrome/browser/payments/android/BUILD.gn
@@ -12,6 +12,7 @@ generate_jni("jni_headers") {
sources = [
"../../../android/java/src/org/chromium/chrome/browser/payments/CanMakePaymentQuery.java",
"../../../android/java/src/org/chromium/chrome/browser/payments/JourneyLogger.java",
+ "../../../android/java/src/org/chromium/chrome/browser/payments/PaymentAppServiceBridge.java",
"../../../android/java/src/org/chromium/chrome/browser/payments/PaymentManifestWebDataService.java",
"../../../android/java/src/org/chromium/chrome/browser/payments/ServiceWorkerPaymentAppBridge.java",
"../../../android/java/src/org/chromium/chrome/browser/payments/SslValidityChecker.java",
diff --git a/chromium/chrome/browser/performance_manager/BUILD.gn b/chromium/chrome/browser/performance_manager/BUILD.gn
deleted file mode 100644
index a0a384385da..00000000000
--- a/chromium/chrome/browser/performance_manager/BUILD.gn
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright 2019 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//chrome/common/features.gni")
-import("//third_party/protobuf/proto_library.gni")
-
-proto_library("site_data_proto") {
- sources = [ "persistence/site_data/site_data.proto" ]
-}
diff --git a/chromium/chrome/browser/policy/BUILD.gn b/chromium/chrome/browser/policy/BUILD.gn
index 87450f3ec30..ebc82e75d49 100644
--- a/chromium/chrome/browser/policy/BUILD.gn
+++ b/chromium/chrome/browser/policy/BUILD.gn
@@ -19,6 +19,12 @@ source_set("path_parser") {
]
if (is_win) {
+ deps += [ "//chrome/install_static:install_static_util" ]
+
libs = [ "wtsapi32.lib" ]
}
+
+ if (is_mac) {
+ deps += [ "//build:branding_buildflags" ]
+ }
}
diff --git a/chromium/chrome/browser/prefs/browser_prefs.cc b/chromium/chrome/browser/prefs/browser_prefs.cc
index b40d5bc7482..3d00fae9dc1 100644
--- a/chromium/chrome/browser/prefs/browser_prefs.cc
+++ b/chromium/chrome/browser/prefs/browser_prefs.cc
@@ -23,6 +23,7 @@
#include "chrome/browser/devtools/devtools_window.h"
#include "chrome/browser/download/download_prefs.h"
#include "chrome/browser/engagement/important_sites_util.h"
+#include "chrome/browser/enterprise/connectors/connectors_prefs.h"
#include "chrome/browser/external_protocol/external_protocol_handler.h"
#include "chrome/browser/first_run/first_run.h"
#include "chrome/browser/gpu/gpu_mode_manager.h"
@@ -33,14 +34,14 @@
#include "chrome/browser/media/media_storage_id_salt.h"
#include "chrome/browser/media/router/media_router_feature.h"
#include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
-#include "chrome/browser/media/webrtc/media_stream_devices_controller.h"
+#include "chrome/browser/media/webrtc/permission_bubble_media_access_handler.h"
#include "chrome/browser/media/webrtc/system_media_capture_permissions_stats_mac.h"
#include "chrome/browser/memory/enterprise_memory_limit_pref_observer.h"
#include "chrome/browser/metrics/chrome_metrics_service_client.h"
-#include "chrome/browser/net/dns_util.h"
#include "chrome/browser/net/net_error_tab_helper.h"
#include "chrome/browser/net/prediction_options.h"
#include "chrome/browser/net/profile_network_context_service.h"
+#include "chrome/browser/net/secure_dns_util.h"
#include "chrome/browser/net/system_network_context_manager.h"
#include "chrome/browser/notifications/notification_channels_provider_android.h"
#include "chrome/browser/notifications/notification_display_service_impl.h"
@@ -53,7 +54,7 @@
#include "chrome/browser/prefs/incognito_mode_prefs.h"
#include "chrome/browser/prefs/origin_trial_prefs.h"
#include "chrome/browser/prefs/session_startup_pref.h"
-#include "chrome/browser/previews/previews_lite_page_redirect_decider.h"
+#include "chrome/browser/previews/previews_https_notification_infobar_decider.h"
#include "chrome/browser/previews/previews_offline_helper.h"
#include "chrome/browser/printing/print_preview_sticky_settings.h"
#include "chrome/browser/profiles/chrome_version_service.h"
@@ -67,6 +68,7 @@
#include "chrome/browser/search/search.h"
#include "chrome/browser/sharing/sharing_sync_preference.h"
#include "chrome/browser/ssl/ssl_config_service_manager.h"
+#include "chrome/browser/storage/appcache_feature_prefs.h"
#include "chrome/browser/task_manager/task_manager_interface.h"
#include "chrome/browser/tracing/chrome_tracing_delegate.h"
#include "chrome/browser/ui/blocked_content/safe_browsing_triggered_popup_blocker.h"
@@ -116,6 +118,7 @@
#include "components/ntp_tiles/most_visited_sites.h"
#include "components/offline_pages/buildflags/buildflags.h"
#include "components/omnibox/browser/document_provider.h"
+#include "components/omnibox/browser/omnibox_prefs.h"
#include "components/omnibox/browser/zero_suggest_provider.h"
#include "components/optimization_guide/optimization_guide_prefs.h"
#include "components/password_manager/core/browser/password_bubble_experiment.h"
@@ -228,10 +231,12 @@
#include "components/ntp_snippets/category_rankers/click_based_category_ranker.h"
#include "components/ntp_tiles/popular_sites_impl.h"
#include "components/permissions/contexts/geolocation_permission_context_android.h"
+#include "components/query_tiles/tile_service_prefs.h"
#if BUILDFLAG(ENABLE_FEED_IN_CHROME)
#include "components/feed/core/common/pref_names.h"
#endif // BUILDFLAG(ENABLE_FEED_IN_CHROME)
#else // defined(OS_ANDROID)
+#include "chrome/browser/accessibility/caption_controller.h"
#include "chrome/browser/apps/app_service/app_service_proxy.h"
#include "chrome/browser/enterprise/reporting/prefs.h"
#include "chrome/browser/gcm/gcm_product_util.h"
@@ -266,6 +271,7 @@
#include "chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.h"
#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.h"
#include "chrome/browser/chromeos/crostini/crostini_pref_names.h"
+#include "chrome/browser/chromeos/cryptauth/client_app_metadata_provider_service.h"
#include "chrome/browser/chromeos/cryptauth/cryptauth_device_id_provider_impl.h"
#include "chrome/browser/chromeos/customization/customization_document.h"
#include "chrome/browser/chromeos/extensions/echo_private_api.h"
@@ -273,6 +279,7 @@
#if defined(USE_CUPS)
#include "chrome/browser/chromeos/extensions/printing/printing_api_handler.h"
#endif
+#include "chrome/browser/chromeos/child_accounts/secondary_account_consent_logger.h"
#include "chrome/browser/chromeos/file_system_provider/registry.h"
#include "chrome/browser/chromeos/first_run/first_run.h"
#include "chrome/browser/chromeos/guest_os/guest_os_pref_names.h"
@@ -313,7 +320,6 @@
#include "chrome/browser/chromeos/printing/enterprise_printers_provider.h"
#include "chrome/browser/chromeos/printing/history/print_job_history_service.h"
#include "chrome/browser/chromeos/release_notes/release_notes_storage.h"
-#include "chrome/browser/chromeos/resource_reporter/resource_reporter.h"
#include "chrome/browser/chromeos/settings/device_settings_cache.h"
#include "chrome/browser/chromeos/system/automatic_reboot_manager.h"
#include "chrome/browser/chromeos/system/input_device_settings.h"
@@ -322,7 +328,6 @@
#include "chrome/browser/extensions/extension_assets_manager_chromeos.h"
#include "chrome/browser/media/protected_media_identifier_permission_context.h"
#include "chrome/browser/metrics/chromeos_metrics_provider.h"
-#include "chrome/browser/supervised_user/child_accounts/secondary_account_consent_logger.h"
#include "chrome/browser/ui/app_list/app_list_syncable_service.h"
#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
#include "chrome/browser/ui/app_list/search/arc/arc_app_reinstall_search_provider.h"
@@ -383,53 +388,17 @@
#include "chrome/browser/device_identity//device_oauth2_token_store_desktop.h"
#include "chrome/browser/downgrade/downgrade_prefs.h"
#include "chrome/browser/ui/startup/default_browser_prompt.h"
-
#endif
#if defined(TOOLKIT_VIEWS)
#include "chrome/browser/ui/browser_view_prefs.h"
#endif
-namespace {
-
-// Deprecated 8/2018.
-const char kDnsPrefetchingStartupList[] = "dns_prefetching.startup_list";
-const char kDnsPrefetchingHostReferralList[] =
- "dns_prefetching.host_referral_list";
-
-// Deprecated 9/2018
-const char kGeolocationAccessToken[] = "geolocation.access_token";
-const char kGoogleServicesPasswordHash[] = "google.services.password_hash";
-const char kModuleConflictBubbleShown[] = "module_conflict.bubble_shown";
-const char kOptionsWindowLastTabIndex[] = "options_window.last_tab_index";
-const char kTrustedDownloadSources[] = "trusted_download_sources";
-#if defined(OS_WIN)
-const char kLastWelcomedOSVersion[] = "browser.last_welcomed_os_version";
+#if !defined(OS_ANDROID)
+#include "chrome/browser/media/feeds/media_feeds_service.h"
#endif
-const char kSupervisedUserCreationAllowed[] =
- "profile.managed_user_creation_allowed";
-
-// Deprecated 10/2018
-const char kReverseAutologinEnabled[] = "reverse_autologin.enabled";
-
-// Deprecated 11/2018.
-const char kNetworkQualities[] = "net.network_qualities";
-const char kForceSessionSync[] = "settings.history_recorded";
-const char kOnboardDuringNUX[] = "browser.onboard_during_nux";
-const char kNuxOnboardGroup[] = "browser.onboard_group";
-// This pref is particularly large, taking up 15+% of the prefs file, so should
-// perhaps be kept around longer than the others.
-const char kHttpServerProperties[] = "net.http_server_properties";
-
-// Deprecated 1/2019.
-const char kNextUpdateCheck[] = "extensions.autoupdate.next_check";
-const char kLastUpdateCheck[] = "extensions.autoupdate.last_check";
-
-// Deprecated 3/2019.
-const char kCurrentThemeImages[] = "extensions.theme.images";
-const char kCurrentThemeColors[] = "extensions.theme.colors";
-const char kCurrentThemeTints[] = "extensions.theme.tints";
-const char kCurrentThemeDisplayProperties[] = "extensions.theme.properties";
+
+namespace {
#if defined(OS_ANDROID)
// Deprecated 4/2019.
@@ -500,9 +469,10 @@ const char kNtpActivateHideShortcutsFieldTrial[] =
// on other platforms.
const char kWebAuthnLastTransportUsedPrefName[] =
"webauthn.last_transport_used";
+#endif // defined(OS_ANDROID)
+// Deprecated 4/2020
const char kWebAuthnBlePairedMacAddressesPrefName[] =
"webauthn.ble.paired_mac_addresses";
-#endif // defined(OS_ANDROID)
// Deprecated 7/2019
const char kLastKnownGoogleURL[] = "browser.last_known_google_url";
@@ -555,35 +525,50 @@ const char kInvalidatorClientId[] = "invalidator.client_id";
const char kInvalidatorInvalidationState[] = "invalidator.invalidation_state";
const char kInvalidatorSavedInvalidations[] = "invalidator.saved_invalidations";
+#if defined(OS_CHROMEOS)
+// Deprecated 4/2020
+const char kAmbientModeTopicSource[] = "settings.ambient_mode.topic_source";
+
+// Deprecated 4/2020
+const char kPrintingAllowedPageSizes[] = "printing.allowed_page_sizes";
+#endif // defined(OS_CHROMEOS)
+
+// Deprecated 4/2020
+const char kExcludedSchemes[] = "protocol_handler.excluded_schemes";
+
+// Deprecated 4/2020
+const char kPreviewsLPRHostBlacklist[] = "previews.litepage.host-blacklist";
+const char kPreviewsLPRProbeCache[] = "Availability.Prober.cache.Litepages";
+const char kPreviewsLPROriginProbeCache[] =
+ "Availability.Prober.cache.LitepagesOriginCheck";
+
+#if defined(OS_CHROMEOS)
+// Deprecated 4/2020
+const char kSupervisedUsersNextId[] = "LocallyManagedUsersNextId";
+#endif // defined(OS_CHROMEOS)
+
+// Register local state used only for migration (clearing or moving to a new
+// key).
+void RegisterLocalStatePrefsForMigration(PrefRegistrySimple* registry) {
+ registry->RegisterBooleanPref(kGCMChannelStatus, true);
+ registry->RegisterIntegerPref(kGCMChannelPollIntervalSeconds, 0);
+ registry->RegisterInt64Pref(kGCMChannelLastCheckTime, 0);
+ registry->RegisterListPref(kInvalidatorSavedInvalidations);
+ registry->RegisterStringPref(kInvalidatorInvalidationState, std::string());
+ registry->RegisterStringPref(kInvalidatorClientId, std::string());
+
+#if defined(OS_WIN)
+ registry->RegisterBooleanPref(kHasSeenWin10PromoPage, false);
+#endif
+
+#if defined(OS_CHROMEOS)
+ registry->RegisterIntegerPref(kSupervisedUsersNextId, 0);
+#endif // defined(OS_CHROMEOS)
+}
+
// Register prefs used only for migration (clearing or moving to a new key).
void RegisterProfilePrefsForMigration(
user_prefs::PrefRegistrySyncable* registry) {
- registry->RegisterListPref(kDnsPrefetchingStartupList);
- registry->RegisterListPref(kDnsPrefetchingHostReferralList);
-
- registry->RegisterStringPref(kGeolocationAccessToken, std::string());
- registry->RegisterStringPref(kGoogleServicesPasswordHash, std::string());
- registry->RegisterIntegerPref(kModuleConflictBubbleShown, 0);
- registry->RegisterIntegerPref(kOptionsWindowLastTabIndex, 0);
- registry->RegisterStringPref(kTrustedDownloadSources, std::string());
- registry->RegisterBooleanPref(kSupervisedUserCreationAllowed, true);
-
- registry->RegisterBooleanPref(kReverseAutologinEnabled, true);
-
- registry->RegisterDictionaryPref(kNetworkQualities, PrefRegistry::LOSSY_PREF);
- registry->RegisterBooleanPref(kForceSessionSync, false);
- registry->RegisterBooleanPref(kOnboardDuringNUX, false);
- registry->RegisterIntegerPref(kNuxOnboardGroup, 0);
- registry->RegisterDictionaryPref(kHttpServerProperties,
- PrefRegistry::LOSSY_PREF);
- registry->RegisterIntegerPref(kLastUpdateCheck, 0);
- registry->RegisterIntegerPref(kNextUpdateCheck, 0);
-
- registry->RegisterDictionaryPref(kCurrentThemeImages);
- registry->RegisterDictionaryPref(kCurrentThemeColors);
- registry->RegisterDictionaryPref(kCurrentThemeTints);
- registry->RegisterDictionaryPref(kCurrentThemeDisplayProperties);
-
#if defined(OS_ANDROID)
registry->RegisterListPref(kDismissedAssetDownloadSuggestions);
registry->RegisterListPref(kDismissedOfflinePageDownloadSuggestions);
@@ -619,8 +604,8 @@ void RegisterProfilePrefsForMigration(
#if defined(OS_ANDROID)
registry->RegisterStringPref(kWebAuthnLastTransportUsedPrefName,
std::string());
- registry->RegisterListPref(kWebAuthnBlePairedMacAddressesPrefName);
#endif // defined(OS_ANDROID)
+ registry->RegisterListPref(kWebAuthnBlePairedMacAddressesPrefName);
registry->RegisterStringPref(kLastKnownGoogleURL, std::string());
registry->RegisterStringPref(kLastPromptedGoogleURL, std::string());
@@ -652,7 +637,17 @@ void RegisterProfilePrefsForMigration(
registry->RegisterStringPref(kInvalidatorInvalidationState, std::string());
registry->RegisterStringPref(kInvalidatorClientId, std::string());
- chrome_browser_net::RegisterDNSProbesSettingBackupPref(registry);
+ chrome_browser_net::secure_dns::RegisterProbesSettingBackupPref(registry);
+
+#if defined(OS_CHROMEOS)
+ registry->RegisterIntegerPref(kAmbientModeTopicSource, 0);
+ registry->RegisterListPref(kPrintingAllowedPageSizes);
+#endif // defined(OS_CHROMEOS)
+
+ registry->RegisterDictionaryPref(kExcludedSchemes);
+ registry->RegisterDictionaryPref(kPreviewsLPRHostBlacklist);
+ registry->RegisterDictionaryPref(kPreviewsLPRProbeCache);
+ registry->RegisterDictionaryPref(kPreviewsLPROriginProbeCache);
}
} // namespace
@@ -695,6 +690,16 @@ void RegisterLocalState(PrefRegistrySimple* registry) {
update_client::RegisterPrefs(registry);
variations::VariationsService::RegisterPrefs(registry);
+ // Individual preferences. If you have multiple preferences that should
+ // clearly be grouped together, please group them together into a helper
+ // function called above. Please keep this list alphabetized.
+ registry->RegisterBooleanPref(
+ policy::policy_prefs::kUserAgentClientHintsEnabled, true);
+
+ // Below this point is for platform-specific and compile-time conditional
+ // calls. Please follow the helper-function-first-then-direct-calls pattern
+ // established above, and keep things alphabetized.
+
#if BUILDFLAG(ENABLE_BACKGROUND_MODE)
BackgroundModeManager::RegisterPrefs(registry);
#endif
@@ -706,6 +711,7 @@ void RegisterLocalState(PrefRegistrySimple* registry) {
#if defined(OS_ANDROID)
::android::RegisterPrefs(registry);
#else
+ enterprise_connectors::RegisterLocalStatePrefs(registry);
enterprise_reporting::RegisterLocalStatePrefs(registry);
gcm::RegisterPrefs(registry);
media_router::RegisterLocalStatePrefs(registry);
@@ -747,7 +753,6 @@ void RegisterLocalState(PrefRegistrySimple* registry) {
RegisterLocalStatePrefs(registry);
chromeos::Preferences::RegisterPrefs(registry);
chromeos::ResetScreen::RegisterPrefs(registry);
- chromeos::ResourceReporter::RegisterPrefs(registry);
chromeos::SchedulerConfigurationManager::RegisterLocalStatePrefs(registry);
chromeos::ServicesCustomizationDocument::RegisterPrefs(registry);
chromeos::SigninScreenHandler::RegisterPrefs(registry);
@@ -806,9 +811,6 @@ void RegisterLocalState(PrefRegistrySimple* registry) {
ModuleDatabase::RegisterLocalStatePrefs(registry);
ThirdPartyConflictsManager::RegisterLocalStatePrefs(registry);
#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING)
-
- registry->RegisterBooleanPref(kHasSeenWin10PromoPage, false); // DEPRECATED
- registry->RegisterStringPref(kLastWelcomedOSVersion, std::string());
#endif // defined(OS_WIN)
#if !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
@@ -817,8 +819,6 @@ void RegisterLocalState(PrefRegistrySimple* registry) {
DeviceOAuth2TokenStoreDesktop::RegisterPrefs(registry);
#endif
- // Obsolete. See MigrateObsoleteBrowserPrefs().
- registry->RegisterIntegerPref(metrics::prefs::kStabilityExecutionPhase, 0);
#if !defined(OS_ANDROID)
registry->RegisterBooleanPref(kNtpActivateHideShortcutsFieldTrial, false);
#endif // !defined(OS_ANDROID)
@@ -830,15 +830,7 @@ void RegisterLocalState(PrefRegistrySimple* registry) {
RegisterBrowserViewLocalPrefs(registry);
#endif
- // Obsolete. See MigrateObsoleteBrowserPrefs().
- registry->RegisterBooleanPref(kGCMChannelStatus, true);
- registry->RegisterIntegerPref(kGCMChannelPollIntervalSeconds, 0);
- registry->RegisterInt64Pref(kGCMChannelLastCheckTime, 0);
-
- // Obsolete. See MigrateObsoleteBrowserPrefs().
- registry->RegisterListPref(kInvalidatorSavedInvalidations);
- registry->RegisterStringPref(kInvalidatorInvalidationState, std::string());
- registry->RegisterStringPref(kInvalidatorClientId, std::string());
+ RegisterLocalStatePrefsForMigration(registry);
}
// Register prefs applicable to all profiles.
@@ -849,6 +841,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry,
AccessibilityLabelsService::RegisterProfilePrefs(registry);
AccessibilityUIMessageHandler::RegisterProfilePrefs(registry);
AnnouncementNotificationService::RegisterProfilePrefs(registry);
+ appcache_feature_prefs::RegisterProfilePrefs(registry);
AvailabilityProber::RegisterProfilePrefs(registry);
autofill::prefs::RegisterProfilePrefs(registry);
browsing_data::prefs::RegisterBrowserUserPrefs(registry);
@@ -874,7 +867,6 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry,
MediaDeviceIDSalt::RegisterProfilePrefs(registry);
MediaEngagementService::RegisterProfilePrefs(registry);
MediaStorageIdSalt::RegisterProfilePrefs(registry);
- MediaStreamDevicesController::RegisterProfilePrefs(registry);
NavigationCorrectionTabObserver::RegisterProfilePrefs(registry);
NotificationDisplayServiceImpl::RegisterProfilePrefs(registry);
NotifierStateTracker::RegisterProfilePrefs(registry);
@@ -888,12 +880,13 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry,
password_bubble_experiment::RegisterPrefs(registry);
password_manager::PasswordManager::RegisterProfilePrefs(registry);
payments::RegisterProfilePrefs(registry);
+ PermissionBubbleMediaAccessHandler::RegisterProfilePrefs(registry);
PlatformNotificationServiceImpl::RegisterProfilePrefs(registry);
policy::DeveloperToolsPolicyHandler::RegisterProfilePrefs(registry);
policy::URLBlacklistManager::RegisterProfilePrefs(registry);
PrefProxyConfigTrackerImpl::RegisterProfilePrefs(registry);
PrefsTabHelper::RegisterProfilePrefs(registry, locale);
- PreviewsLitePageRedirectDecider::RegisterProfilePrefs(registry);
+ PreviewsHTTPSNotificationInfoBarDecider::RegisterProfilePrefs(registry);
PreviewsOfflineHelper::RegisterProfilePrefs(registry);
Profile::RegisterProfilePrefs(registry);
ProfileImpl::RegisterProfilePrefs(registry);
@@ -915,6 +908,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry,
web_components_prefs::RegisterProfilePrefs(registry);
TemplateURLPrepopulateData::RegisterProfilePrefs(registry);
translate::TranslatePrefs::RegisterProfilePrefs(registry);
+ omnibox::RegisterProfilePrefs(registry);
ZeroSuggestProvider::RegisterProfilePrefs(registry);
#if BUILDFLAG(ENABLE_EXTENSIONS)
@@ -979,6 +973,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry,
ntp_tiles::PopularSitesImpl::RegisterProfilePrefs(registry);
OomInterventionDecider::RegisterProfilePrefs(registry);
PartnerBookmarksShim::RegisterProfilePrefs(registry);
+ query_tiles::RegisterPrefs(registry);
RecentTabsPagePrefs::RegisterProfilePrefs(registry);
usage_stats::UsageStatsBridge::RegisterProfilePrefs(registry);
variations::VariationsService::RegisterProfilePrefs(registry);
@@ -990,6 +985,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry,
apps::AppServiceProxy::RegisterProfilePrefs(registry);
AppShortcutManager::RegisterProfilePrefs(registry);
browser_sync::ForeignSessionHandler::RegisterProfilePrefs(registry);
+ captions::CaptionController::RegisterProfilePrefs(registry);
ChromeAuthenticatorRequestDelegate::RegisterProfilePrefs(registry);
DevToolsWindow::RegisterProfilePrefs(registry);
enterprise_reporting::RegisterProfilePrefs(registry);
@@ -1026,6 +1022,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry,
chromeos::app_time::AppTimeController::RegisterProfilePrefs(registry);
chromeos::assistant::prefs::RegisterProfilePrefs(registry);
chromeos::bluetooth::DebugLogsManager::RegisterPrefs(registry);
+ chromeos::ClientAppMetadataProviderService::RegisterProfilePrefs(registry);
chromeos::CupsPrintersManager::RegisterProfilePrefs(registry);
chromeos::device_sync::DeviceSyncImpl::RegisterProfilePrefs(registry);
chromeos::first_run::RegisterProfilePrefs(registry);
@@ -1095,6 +1092,10 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry,
RegisterBrowserViewProfilePrefs(registry);
#endif
+#if !defined(OS_ANDROID)
+ media_feeds::MediaFeedsService::RegisterProfilePrefs(registry);
+#endif
+
RegisterProfilePrefsForMigration(registry);
}
@@ -1127,25 +1128,7 @@ void RegisterSigninProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
#endif
// This method should be periodically pruned of year+ old migrations.
-void MigrateObsoleteBrowserPrefs(Profile* profile, PrefService* local_state) {
- // Added 12/2018.
- local_state->ClearPref(metrics::prefs::kStabilityExecutionPhase);
-
-#if defined(OS_ANDROID)
- // Added 9/2018
- local_state->ClearPref(
- metrics::prefs::kStabilityCrashCountWithoutGmsCoreUpdateObsolete);
-#endif // defined(OS_ANDROID)
-
-#if defined(OS_WIN)
- // Added 9/2018
- local_state->ClearPref(kLastWelcomedOSVersion);
-#endif
-#if defined(OS_CHROMEOS)
- // Added 12/2018
- local_state->ClearPref(prefs::kCarrierDealPromoShown);
-#endif
-
+void MigrateObsoleteLocalStatePrefs(PrefService* local_state) {
#if defined(OS_WIN)
// Added 6/2019.
local_state->ClearPref(kHasSeenWin10PromoPage);
@@ -1176,63 +1159,20 @@ void MigrateObsoleteBrowserPrefs(Profile* profile, PrefService* local_state) {
local_state->ClearPref(kInvalidatorSavedInvalidations);
local_state->ClearPref(kInvalidatorInvalidationState);
local_state->ClearPref(kInvalidatorClientId);
+
+#if defined(OS_CHROMEOS)
+ // Added 4/2020.
+ local_state->ClearPref(kSupervisedUsersNextId);
+#endif // defined(OS_CHROMEOS)
}
// This method should be periodically pruned of year+ old migrations.
void MigrateObsoleteProfilePrefs(Profile* profile) {
PrefService* profile_prefs = profile->GetPrefs();
- // Added 8/2018.
+ // Check MigrateDeprecatedAutofillPrefs() to see if this is safe to remove.
autofill::prefs::MigrateDeprecatedAutofillPrefs(profile_prefs);
- // Added 8/2018
- profile_prefs->ClearPref(kDnsPrefetchingStartupList);
- profile_prefs->ClearPref(kDnsPrefetchingHostReferralList);
-
- // Added 9/2018
- profile_prefs->ClearPref(kGeolocationAccessToken);
- profile_prefs->ClearPref(kGoogleServicesPasswordHash);
- profile_prefs->ClearPref(kModuleConflictBubbleShown);
- profile_prefs->ClearPref(kOptionsWindowLastTabIndex);
- profile_prefs->ClearPref(kTrustedDownloadSources);
- profile_prefs->ClearPref(kSupervisedUserCreationAllowed);
-
- // Added 10/2018
- profile_prefs->ClearPref(kReverseAutologinEnabled);
-
- // Added 11/2018.
- profile_prefs->ClearPref(kNetworkQualities);
- profile_prefs->ClearPref(kForceSessionSync);
- profile_prefs->ClearPref(kOnboardDuringNUX);
- profile_prefs->ClearPref(kNuxOnboardGroup);
- profile_prefs->ClearPref(kHttpServerProperties);
-
-#if defined(OS_CHROMEOS)
- // Added 12/2018.
- profile_prefs->ClearPref(prefs::kDataSaverPromptsShown);
-#endif
-
- // Added 1/2019.
- profile_prefs->ClearPref(kLastUpdateCheck);
- profile_prefs->ClearPref(kNextUpdateCheck);
-
- syncer::MigrateSessionsToProxyTabsPrefs(profile_prefs);
- syncer::ClearObsoleteUserTypePrefs(profile_prefs);
-
- // Added 2/2019.
- syncer::ClearObsoleteClearServerDataPrefs(profile_prefs);
- syncer::ClearObsoleteAuthErrorPrefs(profile_prefs);
-
- // Added 3/2019.
- syncer::ClearObsoleteFirstSyncTime(profile_prefs);
- syncer::ClearObsoleteSyncLongPollIntervalSeconds(profile_prefs);
-
- // Added 3/2019.
- profile_prefs->ClearPref(kCurrentThemeImages);
- profile_prefs->ClearPref(kCurrentThemeColors);
- profile_prefs->ClearPref(kCurrentThemeTints);
- profile_prefs->ClearPref(kCurrentThemeDisplayProperties);
-
#if defined(OS_ANDROID)
// Added 4/2019.
profile_prefs->ClearPref(kDismissedAssetDownloadSuggestions);
@@ -1287,8 +1227,9 @@ void MigrateObsoleteProfilePrefs(Profile* profile) {
#if defined(OS_ANDROID)
// Added 7/2019.
profile_prefs->ClearPref(kWebAuthnLastTransportUsedPrefName);
- profile_prefs->ClearPref(kWebAuthnBlePairedMacAddressesPrefName);
#endif // defined(OS_ANDROID)
+ // Added 4/2020.
+ profile_prefs->ClearPref(kWebAuthnBlePairedMacAddressesPrefName);
// Added 7/2019.
#if defined(USE_X11)
@@ -1327,5 +1268,22 @@ void MigrateObsoleteProfilePrefs(Profile* profile) {
// Added 3/2020.
profile_prefs->ClearPref(kDataReductionNetworkProperties);
- chrome_browser_net::MigrateDNSProbesSettingToOrFromBackup(profile_prefs);
+ chrome_browser_net::secure_dns::MigrateProbesSettingToOrFromBackup(
+ profile_prefs);
+
+#if defined(OS_CHROMEOS)
+ // Added 4/2020.
+ profile_prefs->ClearPref(kAmbientModeTopicSource);
+
+ // Added 4/2020.
+ profile_prefs->ClearPref(kPrintingAllowedPageSizes);
+#endif
+
+ // Added 4/2020
+ profile_prefs->ClearPref(kExcludedSchemes);
+
+ // Added 4/2020.
+ profile_prefs->ClearPref(kPreviewsLPRHostBlacklist);
+ profile_prefs->ClearPref(kPreviewsLPRProbeCache);
+ profile_prefs->ClearPref(kPreviewsLPROriginProbeCache);
}
diff --git a/chromium/chrome/browser/prefs/browser_prefs.h b/chromium/chrome/browser/prefs/browser_prefs.h
index 05f6c207446..bff02b10827 100644
--- a/chromium/chrome/browser/prefs/browser_prefs.h
+++ b/chromium/chrome/browser/prefs/browser_prefs.h
@@ -5,10 +5,9 @@
#ifndef CHROME_BROWSER_PREFS_BROWSER_PREFS_H_
#define CHROME_BROWSER_PREFS_BROWSER_PREFS_H_
-#include <set>
+#include <string>
#include "build/build_config.h"
-#include "components/prefs/pref_value_store.h"
class PrefRegistrySimple;
class PrefService;
@@ -41,8 +40,8 @@ void RegisterSigninProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
// Migrate/cleanup deprecated prefs in |local_state|. Over time, long deprecated
// prefs should be removed as new ones are added, but this call should never go
// away (even if it becomes an empty call for some time) as it should remain
-// *the* place to drop deprecated browser prefs at.
-void MigrateObsoleteBrowserPrefs(Profile* profile, PrefService* local_state);
+// *the* place to drop deprecated browser-level (Local State) prefs at.
+void MigrateObsoleteLocalStatePrefs(PrefService* local_state);
// Migrate/cleanup deprecated prefs in |profile|'s pref store. Over time, long
// deprecated prefs should be removed as new ones are added, but this call
diff --git a/chromium/chrome/browser/prefs/pref_functional_browsertest.cc b/chromium/chrome/browser/prefs/pref_functional_browsertest.cc
index 9c0624e57ab..c309e692782 100644
--- a/chromium/chrome/browser/prefs/pref_functional_browsertest.cc
+++ b/chromium/chrome/browser/prefs/pref_functional_browsertest.cc
@@ -26,6 +26,7 @@
#include "components/safe_browsing/core/common/safe_browsing_prefs.h"
#include "components/sync_preferences/pref_service_syncable.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/download_test_observer.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
diff --git a/chromium/chrome/browser/prefs/pref_service_browsertest.cc b/chromium/chrome/browser/prefs/pref_service_browsertest.cc
index ccfd545b870..b020aba589a 100644
--- a/chromium/chrome/browser/prefs/pref_service_browsertest.cc
+++ b/chromium/chrome/browser/prefs/pref_service_browsertest.cc
@@ -22,6 +22,7 @@
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/testing_profile.h"
#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/test/browser_test.h"
#include "ui/gfx/geometry/rect.h"
typedef InProcessBrowserTest PreservedWindowPlacement;
diff --git a/chromium/chrome/browser/prefs/profile_pref_store_manager.cc b/chromium/chrome/browser/prefs/profile_pref_store_manager.cc
index 1da9f38246f..7a071d99905 100644
--- a/chromium/chrome/browser/prefs/profile_pref_store_manager.cc
+++ b/chromium/chrome/browser/prefs/profile_pref_store_manager.cc
@@ -6,9 +6,9 @@
#include <utility>
+#include "base/check.h"
#include "base/files/file_util.h"
#include "base/json/json_file_value_serializer.h"
-#include "base/logging.h"
#include "base/metrics/histogram_macros.h"
#include "base/sequenced_task_runner.h"
#include "build/build_config.h"
@@ -21,7 +21,6 @@
#include "services/preferences/public/mojom/preferences.mojom.h"
#include "services/preferences/tracked/pref_hash_filter.h"
#include "services/preferences/tracked/tracked_persistent_pref_store_factory.h"
-#include "services/service_manager/public/cpp/connector.h"
#if defined(OS_WIN)
#include "chrome/install_static/install_util.h"
diff --git a/chromium/chrome/browser/prefs/tracked/pref_hash_browsertest.cc b/chromium/chrome/browser/prefs/tracked/pref_hash_browsertest.cc
index 061c2442bfc..5e192f0f61c 100644
--- a/chromium/chrome/browser/prefs/tracked/pref_hash_browsertest.cc
+++ b/chromium/chrome/browser/prefs/tracked/pref_hash_browsertest.cc
@@ -35,6 +35,7 @@
#include "components/prefs/scoped_user_pref_update.h"
#include "components/search_engines/default_search_manager.h"
#include "components/search_engines/template_url_data.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_launcher.h"
#include "extensions/browser/pref_names.h"
#include "extensions/common/extension.h"
@@ -377,10 +378,8 @@ class PrefHashBrowserTestBase
std::string num_tracked_prefs_str =
base::NumberToString(num_tracked_prefs_);
- EXPECT_EQ(static_cast<int>(num_tracked_prefs_str.size()),
- base::WriteFile(num_tracked_prefs_file,
- num_tracked_prefs_str.c_str(),
- num_tracked_prefs_str.size()));
+ EXPECT_TRUE(
+ base::WriteFile(num_tracked_prefs_file, num_tracked_prefs_str));
} else {
std::string num_tracked_prefs_str;
EXPECT_TRUE(base::ReadFileToString(num_tracked_prefs_file,
@@ -895,16 +894,10 @@ class PrefHashBrowserTestChangedSplitPref : public PrefHashBrowserTestBase {
}
void VerifyReactionToPrefAttack() override {
- // Expect a single split pref changed report with a count of 2 for tracked
- // pref #5 (extensions).
EXPECT_EQ(protection_level_ > PROTECTION_DISABLED_ON_PLATFORM ? 1 : 0,
GetTrackedPrefHistogramCount(
user_prefs::tracked::kTrackedPrefHistogramChanged,
BEGIN_ALLOW_SINGLE_BUCKET + 5));
- EXPECT_EQ(protection_level_ > PROTECTION_DISABLED_ON_PLATFORM ? 1 : 0,
- GetTrackedPrefHistogramCount(
- "Settings.TrackedSplitPreferenceChanged.extensions.settings",
- BEGIN_ALLOW_SINGLE_BUCKET + 2));
// Everything else should have remained unchanged.
EXPECT_EQ(
diff --git a/chromium/chrome/browser/printing/cloud_print/privet_http_unittest.cc b/chromium/chrome/browser/printing/cloud_print/privet_http_unittest.cc
index b15d7c30566..c56d0a23625 100644
--- a/chromium/chrome/browser/printing/cloud_print/privet_http_unittest.cc
+++ b/chromium/chrome/browser/printing/cloud_print/privet_http_unittest.cc
@@ -33,6 +33,7 @@
#if BUILDFLAG(ENABLE_PRINT_PREVIEW)
#include "chrome/browser/printing/pwg_raster_converter.h"
+#include "printing/mojom/print.mojom.h"
#include "printing/pwg_raster_settings.h"
#endif
@@ -754,7 +755,7 @@ TEST_P(PrivetLocalPrintTest, SuccessfulPWGLocalPrint) {
EXPECT_TRUE(SuccessfulResponse(kSubmitDocURL, kSampleLocalPrintResponse));
EXPECT_EQ("foobar", GetUploadData(kSubmitDocURL));
- EXPECT_EQ(printing::DuplexMode::SIMPLEX,
+ EXPECT_EQ(printing::mojom::DuplexMode::kSimplex,
pwg_converter_->bitmap_settings().duplex_mode);
EXPECT_EQ(printing::TRANSFORM_NORMAL,
pwg_converter_->bitmap_settings().odd_page_transform);
@@ -790,7 +791,7 @@ TEST_P(PrivetLocalPrintTest, SuccessfulPWGLocalPrintDuplex) {
SuccessfulResponse(kSubmitDocWithJobIDURL, kSampleLocalPrintResponse));
EXPECT_EQ("foobar", GetUploadData(kSubmitDocWithJobIDURL));
- EXPECT_EQ(printing::DuplexMode::SHORT_EDGE,
+ EXPECT_EQ(printing::mojom::DuplexMode::kShortEdge,
pwg_converter_->bitmap_settings().duplex_mode);
EXPECT_EQ(printing::TRANSFORM_ROTATE_180,
pwg_converter_->bitmap_settings().odd_page_transform);
diff --git a/chromium/chrome/browser/printing/pdf_nup_converter_client_browsertest.cc b/chromium/chrome/browser/printing/pdf_nup_converter_client_browsertest.cc
index a53556916cc..df8244fe585 100644
--- a/chromium/chrome/browser/printing/pdf_nup_converter_client_browsertest.cc
+++ b/chromium/chrome/browser/printing/pdf_nup_converter_client_browsertest.cc
@@ -15,6 +15,7 @@
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/test/base/in_process_browser_test.h"
+#include "content/public/test/browser_test.h"
#include "pdf/pdf.h"
#include "ui/gfx/geometry/size_f.h"
diff --git a/chromium/chrome/browser/printing/pdf_to_emf_converter.cc b/chromium/chrome/browser/printing/pdf_to_emf_converter.cc
index 79e5971f6b4..c9a0a512e5e 100644
--- a/chromium/chrome/browser/printing/pdf_to_emf_converter.cc
+++ b/chromium/chrome/browser/printing/pdf_to_emf_converter.cc
@@ -408,6 +408,16 @@ void PdfConverterImpl::RecordConversionMetrics() {
UMA_HISTOGRAM_MEMORY_KB("Printing.ConversionSize.PostScript3",
average_page_size_in_kb);
return;
+ case PdfRenderSettings::Mode::EMF_WITH_REDUCED_RASTERIZATION:
+ UMA_HISTOGRAM_MEMORY_KB(
+ "Printing.ConversionSize.EmfWithReducedRasterization",
+ average_page_size_in_kb);
+ return;
+ case PdfRenderSettings::Mode::EMF_WITH_REDUCED_RASTERIZATION_AND_GDI_TEXT:
+ UMA_HISTOGRAM_MEMORY_KB(
+ "Printing.ConversionSize.EmfWithReducedRasterizationAndGdiText",
+ average_page_size_in_kb);
+ return;
default:
NOTREACHED();
return;
diff --git a/chromium/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc b/chromium/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc
index 0eec97e7519..130fac6497a 100644
--- a/chromium/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc
+++ b/chromium/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc
@@ -18,6 +18,7 @@
#include "build/build_config.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/test/base/in_process_browser_test.h"
+#include "content/public/test/browser_test.h"
#include "printing/emf_win.h"
#include "printing/metafile.h"
#include "printing/pdf_render_settings.h"
@@ -265,6 +266,26 @@ IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, EmfBasic) {
}
}
+IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest,
+ EmfWithReducedRasterizationBasic) {
+ const PdfRenderSettings pdf_settings(
+ kLetter200DpiRect, gfx::Point(0, 0), k200DpiSize,
+ /*autorotate=*/false,
+ /*use_color=*/true,
+ PdfRenderSettings::Mode::EMF_WITH_REDUCED_RASTERIZATION);
+ constexpr int kNumberOfPages = 3;
+
+ ASSERT_TRUE(GetTestInput("pdf_converter_basic.pdf"));
+ ASSERT_TRUE(StartPdfConverter(pdf_settings, kNumberOfPages));
+ for (int i = 0; i < kNumberOfPages; ++i) {
+ ASSERT_TRUE(GetPage(i));
+ ASSERT_TRUE(GetPageExpectedEmfData(
+ GetFileNameForPageNumber("pdf_converter_basic_emf_page_", i)));
+ ComparePageEmfHeader();
+ // TODO(thestig): Check if ComparePageEmfPayload() works on bots.
+ }
+}
+
IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, PostScriptLevel2Basic) {
const PdfRenderSettings pdf_settings(
kLetter200DpiRect, gfx::Point(0, 0), k200DpiSize,
diff --git a/chromium/chrome/browser/printing/print_browsertest.cc b/chromium/chrome/browser/printing/print_browsertest.cc
index 0af8ae0aeda..3de2b60a683 100644
--- a/chromium/chrome/browser/printing/print_browsertest.cc
+++ b/chromium/chrome/browser/printing/print_browsertest.cc
@@ -25,7 +25,6 @@
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/prefs/pref_service.h"
-#include "components/printing/browser/features.h"
#include "components/printing/browser/print_composite_client.h"
#include "components/printing/browser/print_manager_utils.h"
#include "components/printing/common/print.mojom.h"
@@ -33,14 +32,18 @@
#include "content/public/browser/browser_message_filter.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
+#include "content/public/common/content_features.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/no_renderer_crashes_assertion.h"
#include "extensions/common/extension.h"
#include "mojo/public/cpp/bindings/associated_remote.h"
#include "net/dns/mock_host_resolver.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "testing/gmock/include/gmock/gmock.h"
#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
+#include "third_party/blink/public/common/scheduler/web_scheduler_tracked_feature.h"
namespace printing {
@@ -312,6 +315,74 @@ class IsolateOriginsPrintBrowserTest : public PrintBrowserTest {
}
};
+class BackForwardCachePrintBrowserTest : public PrintBrowserTest {
+ public:
+ BackForwardCachePrintBrowserTest() = default;
+ ~BackForwardCachePrintBrowserTest() override = default;
+
+ void SetUpCommandLine(base::CommandLine* command_line) override {
+ scoped_feature_list_.InitAndEnableFeatureWithParameters(
+ ::features::kBackForwardCache,
+ {
+ // Set a very long TTL before expiration (longer than the test
+ // timeout) so tests that are expecting deletion don't pass when
+ // they shouldn't.
+ {"TimeToLiveInBackForwardCacheInSeconds", "3600"},
+ });
+
+ InProcessBrowserTest::SetUpCommandLine(command_line);
+ }
+
+ content::WebContents* web_contents() const {
+ return browser()->tab_strip_model()->GetActiveWebContents();
+ }
+
+ content::RenderFrameHost* current_frame_host() {
+ return web_contents()->GetMainFrame();
+ }
+
+ void ExpectBlocklistedFeature(
+ blink::scheduler::WebSchedulerTrackedFeature feature,
+ base::Location location) {
+ base::HistogramBase::Sample sample = base::HistogramBase::Sample(feature);
+ AddSampleToBuckets(&expected_blocklisted_features_, sample);
+
+ EXPECT_THAT(
+ histogram_tester_.GetAllSamples(
+ "BackForwardCache.HistoryNavigationOutcome."
+ "BlocklistedFeature"),
+ testing::UnorderedElementsAreArray(expected_blocklisted_features_))
+ << location.ToString();
+
+ EXPECT_THAT(
+ histogram_tester_.GetAllSamples(
+ "BackForwardCache.AllSites.HistoryNavigationOutcome."
+ "BlocklistedFeature"),
+ testing::UnorderedElementsAreArray(expected_blocklisted_features_))
+ << location.ToString();
+ }
+
+ base::HistogramTester histogram_tester_;
+
+ private:
+ void AddSampleToBuckets(std::vector<base::Bucket>* buckets,
+ base::HistogramBase::Sample sample) {
+ auto it = std::find_if(
+ buckets->begin(), buckets->end(),
+ [sample](const base::Bucket& bucket) { return bucket.min == sample; });
+ if (it == buckets->end()) {
+ buckets->push_back(base::Bucket(sample, 1));
+ } else {
+ it->count++;
+ }
+ }
+
+ std::vector<base::Bucket> expected_blocklisted_features_;
+ base::test::ScopedFeatureList scoped_feature_list_;
+
+ DISALLOW_COPY_AND_ASSIGN(BackForwardCachePrintBrowserTest);
+};
+
constexpr char IsolateOriginsPrintBrowserTest::kIsolatedSite[];
class PrintExtensionBrowserTest : public extensions::ExtensionBrowserTest {
@@ -616,6 +687,29 @@ IN_PROC_BROWSER_TEST_F(IsolateOriginsPrintBrowserTest, OopifPrinting) {
EXPECT_TRUE(IsOopifEnabled());
}
+IN_PROC_BROWSER_TEST_F(BackForwardCachePrintBrowserTest, DisableCaching) {
+ ASSERT_TRUE(embedded_test_server()->Started());
+
+ // 1) Navigate to A and trigger printing.
+ GURL url(embedded_test_server()->GetURL("a.com", "/printing/test1.html"));
+ ui_test_utils::NavigateToURL(browser(), url);
+ content::RenderFrameHost* rfh_a = current_frame_host();
+ content::RenderFrameDeletedObserver delete_observer_rfh_a(rfh_a);
+ PrintAndWaitUntilPreviewIsReady(/*print_only_selection=*/false);
+
+ // 2) Navigate to B.
+ // The first page is not cached because printing preview was open.
+ GURL url_2(embedded_test_server()->GetURL("b.com", "/printing/test2.html"));
+ ui_test_utils::NavigateToURL(browser(), url_2);
+ delete_observer_rfh_a.WaitUntilDeleted();
+
+ // 3) Navigate back and checks the blocklisted feature is recorded in UMA.
+ web_contents()->GetController().GoBack();
+ EXPECT_TRUE(content::WaitForLoadStop(web_contents()));
+ ExpectBlocklistedFeature(
+ blink::scheduler::WebSchedulerTrackedFeature::kPrinting, FROM_HERE);
+}
+
// Printing an extension option page.
// The test should not crash or timeout.
IN_PROC_BROWSER_TEST_F(PrintExtensionBrowserTest, PrintOptionPage) {
diff --git a/chromium/chrome/browser/printing/print_dialog_cloud_posix.cc b/chromium/chrome/browser/printing/print_dialog_cloud_posix.cc
deleted file mode 100644
index c99401c70f9..00000000000
--- a/chromium/chrome/browser/printing/print_dialog_cloud_posix.cc
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/printing/print_dialog_cloud.h"
-
-#include "base/logging.h"
-
-namespace print_dialog_cloud {
-
-bool CreatePrintDialogFromCommandLine(Profile* profile,
- const base::CommandLine& command_line) {
- NOTIMPLEMENTED();
- return false;
-}
-
-} // namespace print_dialog_cloud
diff --git a/chromium/chrome/browser/printing/print_dialog_cloud_win.cc b/chromium/chrome/browser/printing/print_dialog_cloud_win.cc
index 42181f7590d..797306be519 100644
--- a/chromium/chrome/browser/printing/print_dialog_cloud_win.cc
+++ b/chromium/chrome/browser/printing/print_dialog_cloud_win.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/printing/print_dialog_cloud.h"
+#include "chrome/browser/printing/print_dialog_cloud_win.h"
#include <stddef.h>
#include <stdint.h>
@@ -74,8 +74,8 @@ class PrintDataSetter : public content::WebContentsObserver {
GURL url = web_contents()->GetURL();
if (cloud_devices::IsCloudPrintURL(url)) {
base::string16 origin = base::UTF8ToUTF16(url.GetOrigin().spec());
- content::MessagePortProvider::PostMessageToFrame(
- web_contents(), origin, origin, message_data_);
+ content::MessagePortProvider::PostMessageToFrame(web_contents(), origin,
+ origin, message_data_);
}
}
diff --git a/chromium/chrome/browser/printing/print_dialog_cloud.h b/chromium/chrome/browser/printing/print_dialog_cloud_win.h
index 25de632815c..e2a67535754 100644
--- a/chromium/chrome/browser/printing/print_dialog_cloud.h
+++ b/chromium/chrome/browser/printing/print_dialog_cloud_win.h
@@ -2,14 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef CHROME_BROWSER_PRINTING_PRINT_DIALOG_CLOUD_H_
-#define CHROME_BROWSER_PRINTING_PRINT_DIALOG_CLOUD_H_
+#ifndef CHROME_BROWSER_PRINTING_PRINT_DIALOG_CLOUD_WIN_H_
+#define CHROME_BROWSER_PRINTING_PRINT_DIALOG_CLOUD_WIN_H_
-#include <string>
-
-#include "base/callback_forward.h"
-
-class Browser;
class Profile;
namespace base {
@@ -18,16 +13,10 @@ class CommandLine;
namespace print_dialog_cloud {
-// Creates a tab with Google 'sign in' or 'add account' page, based on
-// passed |add_account| value.
-void CreateCloudPrintSigninTab(Browser* browser,
- bool add_account,
- base::OnceClosure callback);
-
// Parse switches from command_line and display the print dialog as appropriate.
bool CreatePrintDialogFromCommandLine(Profile* profile,
const base::CommandLine& command_line);
} // namespace print_dialog_cloud
-#endif // CHROME_BROWSER_PRINTING_PRINT_DIALOG_CLOUD_H_
+#endif // CHROME_BROWSER_PRINTING_PRINT_DIALOG_CLOUD_WIN_H_
diff --git a/chromium/chrome/browser/printing/print_job.cc b/chromium/chrome/browser/printing/print_job.cc
index 0cfd89165ad..806e3e3a72e 100644
--- a/chromium/chrome/browser/printing/print_job.cc
+++ b/chromium/chrome/browser/printing/print_job.cc
@@ -26,20 +26,50 @@
#if defined(OS_WIN)
#include "base/command_line.h"
#include "chrome/browser/printing/pdf_to_emf_converter.h"
+#include "chrome/browser/profiles/profile.h"
#include "chrome/common/chrome_features.h"
+#include "chrome/common/pref_names.h"
+#include "components/prefs/pref_service.h"
+#include "content/public/browser/web_contents.h"
#include "printing/pdf_render_settings.h"
#include "printing/printed_page_win.h"
+#include "printing/printing_features.h"
#endif
using base::TimeDelta;
namespace printing {
+namespace {
+
// Helper function to ensure |job| is valid until at least |callback| returns.
void HoldRefCallback(scoped_refptr<PrintJob> job, base::OnceClosure callback) {
std::move(callback).Run();
}
+#if defined(OS_WIN)
+// Those must be kept in sync with the values defined in policy_templates.json.
+enum class PrintRasterizationMode {
+ // Do full page rasterization if necessary. Default value when policy not set.
+ kFull = 0,
+ // Avoid rasterization if possible.
+ kFast = 1,
+ kMaxValue = kFast,
+};
+
+bool PrintWithReducedRasterization(PrefService* prefs) {
+ // Managed preference takes precedence over user preference and field trials.
+ if (prefs && prefs->IsManagedPreference(prefs::kPrintRasterizationMode)) {
+ int value = prefs->GetInteger(prefs::kPrintRasterizationMode);
+ return value == static_cast<int>(PrintRasterizationMode::kFast);
+ }
+
+ return base::FeatureList::IsEnabled(features::kPrintWithReducedRasterization);
+}
+#endif
+
+} // namespace
+
PrintJob::PrintJob() {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
}
@@ -319,11 +349,30 @@ void PrintJob::StartPdfToEmfConversion(
bool print_text_with_gdi =
settings.print_text_with_gdi() && !settings.printer_is_xps() &&
base::FeatureList::IsEnabled(::features::kGdiTextPrinting);
+
+ // TODO(thestig): Figure out why crbug.com/1083911 occurred, which is likely
+ // because |web_contents| was null. As a result, this section has many more
+ // pointer checks to avoid crashing.
+ content::WebContents* web_contents = worker_->GetWebContents();
+ content::BrowserContext* context =
+ web_contents ? web_contents->GetBrowserContext() : nullptr;
+ PrefService* prefs =
+ context ? Profile::FromBrowserContext(context)->GetPrefs() : nullptr;
+ bool print_with_reduced_rasterization = PrintWithReducedRasterization(prefs);
+
+ using RenderMode = PdfRenderSettings::Mode;
+ RenderMode mode;
+ if (print_with_reduced_rasterization) {
+ mode = print_text_with_gdi
+ ? RenderMode::EMF_WITH_REDUCED_RASTERIZATION_AND_GDI_TEXT
+ : RenderMode::EMF_WITH_REDUCED_RASTERIZATION;
+ } else {
+ mode = print_text_with_gdi ? RenderMode::GDI_TEXT : RenderMode::NORMAL;
+ }
+
PdfRenderSettings render_settings(
content_area, gfx::Point(0, 0), settings.dpi_size(),
- /*autorotate=*/true, settings.color() == COLOR,
- print_text_with_gdi ? PdfRenderSettings::Mode::GDI_TEXT
- : PdfRenderSettings::Mode::NORMAL);
+ /*autorotate=*/true, settings.color() == COLOR, mode);
pdf_conversion_state_->Start(
bytes, render_settings,
base::BindOnce(&PrintJob::OnPdfConversionStarted, this));
@@ -581,4 +630,5 @@ PrintedDocument* JobEventDetails::document() const { return document_.get(); }
#if defined(OS_WIN)
PrintedPage* JobEventDetails::page() const { return page_.get(); }
#endif
+
} // namespace printing
diff --git a/chromium/chrome/browser/printing/print_job.h b/chromium/chrome/browser/printing/print_job.h
index a7eead3be10..0eadb450baf 100644
--- a/chromium/chrome/browser/printing/print_job.h
+++ b/chromium/chrome/browser/printing/print_job.h
@@ -45,11 +45,14 @@ class PrintJob : public base::RefCountedThreadSafe<PrintJob>,
public content::NotificationObserver {
public:
#if defined(OS_CHROMEOS)
- // An enumeration of components where print jobs can come from.
+ // An enumeration of components where print jobs can come from. The order of
+ // these enums must match that of
+ // chrome/browser/chromeos/printing/history/print_job_info.proto.
enum class Source {
PRINT_PREVIEW,
ARC,
EXTENSION,
+ PRINT_PREVIEW_INCOGNITO,
};
#endif // defined(OS_CHROMEOS)
diff --git a/chromium/chrome/browser/printing/print_job_worker.cc b/chromium/chrome/browser/printing/print_job_worker.cc
index 33e17f0df35..9122bbf4f15 100644
--- a/chromium/chrome/browser/printing/print_job_worker.cc
+++ b/chromium/chrome/browser/printing/print_job_worker.cc
@@ -209,7 +209,9 @@ void PrintJobWorker::UpdatePrintSettings(base::Value new_settings,
DCHECK_CURRENTLY_ON(BrowserThread::UI);
std::unique_ptr<crash_keys::ScopedPrinterInfo> crash_key;
- if (new_settings.FindIntKey(kSettingPrinterType).value() == kLocalPrinter) {
+ PrinterType type = static_cast<PrinterType>(
+ new_settings.FindIntKey(kSettingPrinterType).value());
+ if (type == PrinterType::kLocal) {
#if defined(OS_WIN)
// Blocking is needed here because Windows printer drivers are oftentimes
// not thread-safe and have to be accessed on the UI thread.
@@ -222,8 +224,15 @@ void PrintJobWorker::UpdatePrintSettings(base::Value new_settings,
print_backend->GetPrinterDriverInfo(printer_name));
}
- PrintingContext::Result result =
- printing_context_->UpdatePrintSettings(std::move(new_settings));
+ PrintingContext::Result result;
+ {
+#if defined(OS_WIN)
+ // Blocking is needed here because Windows printer drivers are oftentimes
+ // not thread-safe and have to be accessed on the UI thread.
+ base::ScopedAllowBlocking allow_blocking;
+#endif
+ result = printing_context_->UpdatePrintSettings(std::move(new_settings));
+ }
GetSettingsDone(std::move(callback), result);
}
@@ -249,10 +258,7 @@ void PrintJobWorker::GetSettingsWithUI(int document_page_count,
SettingsCallback callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- PrintingContextDelegate* printing_context_delegate =
- static_cast<PrintingContextDelegate*>(printing_context_delegate_.get());
- content::WebContents* web_contents =
- printing_context_delegate->GetWebContents();
+ content::WebContents* web_contents = GetWebContents();
#if defined(OS_ANDROID)
if (is_scripted) {
@@ -263,6 +269,8 @@ void PrintJobWorker::GetSettingsWithUI(int document_page_count,
// call will return since startPendingPrint will make it return immediately
// in case of error.
if (tab) {
+ auto* printing_context_delegate = static_cast<PrintingContextDelegate*>(
+ printing_context_delegate_.get());
PrintingContextAndroid::SetPendingPrint(
web_contents->GetTopLevelNativeWindow(),
GetPrintableForTab(tab->GetJavaObject()),
@@ -481,8 +489,8 @@ void PrintJobWorker::SpoolPage(PrintedPage* page) {
// Signal everyone that the page is printed.
DCHECK(print_job_);
print_job_->PostTask(
- FROM_HERE, base::BindRepeating(
- &PageNotificationCallback, base::RetainedRef(print_job_),
+ FROM_HERE,
+ base::BindOnce(&PageNotificationCallback, base::RetainedRef(print_job_),
JobEventDetails::PAGE_DONE, printing_context_->job_id(),
base::RetainedRef(document_), base::RetainedRef(page)));
}
@@ -512,4 +520,10 @@ void PrintJobWorker::OnFailure() {
page_number_ = PageNumber::npos();
}
+content::WebContents* PrintJobWorker::GetWebContents() {
+ PrintingContextDelegate* printing_context_delegate =
+ static_cast<PrintingContextDelegate*>(printing_context_delegate_.get());
+ return printing_context_delegate->GetWebContents();
+}
+
} // namespace printing
diff --git a/chromium/chrome/browser/printing/print_job_worker.h b/chromium/chrome/browser/printing/print_job_worker.h
index 8541347f5a3..8e146205bb7 100644
--- a/chromium/chrome/browser/printing/print_job_worker.h
+++ b/chromium/chrome/browser/printing/print_job_worker.h
@@ -18,6 +18,10 @@
#include "printing/print_job_constants.h"
#include "printing/printing_context.h"
+namespace content {
+class WebContents;
+}
+
namespace printing {
class PrintJob;
@@ -97,6 +101,9 @@ class PrintJobWorker {
// Starts the thread.
bool Start();
+ // Returns the WebContents this work corresponds to.
+ content::WebContents* GetWebContents();
+
protected:
// Retrieves the context for testing only.
PrintingContext* printing_context() { return printing_context_.get(); }
diff --git a/chromium/chrome/browser/printing/print_preview_context_menu_observer.cc b/chromium/chrome/browser/printing/print_preview_context_menu_observer.cc
index 7f38fa4bd9f..3e416cc5e05 100644
--- a/chromium/chrome/browser/printing/print_preview_context_menu_observer.cc
+++ b/chromium/chrome/browser/printing/print_preview_context_menu_observer.cc
@@ -4,7 +4,7 @@
#include "chrome/browser/printing/print_preview_context_menu_observer.h"
-#include "base/logging.h"
+#include "base/notreached.h"
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/printing/print_preview_dialog_controller.h"
diff --git a/chromium/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc b/chromium/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc
index 0a2b3df356e..a76b50bba43 100644
--- a/chromium/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc
+++ b/chromium/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc
@@ -35,7 +35,9 @@
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/web_contents_observer.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
+#include "content/public/test/test_utils.h"
#include "ipc/ipc_message_macros.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/ui_base_switches.h"
@@ -103,23 +105,6 @@ class PrintPreviewDialogClonedObserver : public WebContentsObserver {
DISALLOW_COPY_AND_ASSIGN(PrintPreviewDialogClonedObserver);
};
-class PrintPreviewDialogDestroyedObserver : public WebContentsObserver {
- public:
- explicit PrintPreviewDialogDestroyedObserver(WebContents* dialog)
- : WebContentsObserver(dialog) {}
- ~PrintPreviewDialogDestroyedObserver() override = default;
-
- bool dialog_destroyed() const { return dialog_destroyed_; }
-
- private:
- // content::WebContentsObserver implementation.
- void WebContentsDestroyed() override { dialog_destroyed_ = true; }
-
- bool dialog_destroyed_ = false;
-
- DISALLOW_COPY_AND_ASSIGN(PrintPreviewDialogDestroyedObserver);
-};
-
void PluginsLoadedCallback(
base::OnceClosure quit_closure,
const std::vector<content::WebPluginInfo>& /* info */) {
@@ -243,9 +228,9 @@ IN_PROC_BROWSER_TEST_F(PrintPreviewDialogControllerBrowserTest,
// Navigate in the initiator tab. Make sure navigating destroys the print
// preview dialog.
- PrintPreviewDialogDestroyedObserver dialog_destroyed_observer(preview_dialog);
+ content::WebContentsDestroyedWatcher watcher(preview_dialog);
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
- ASSERT_TRUE(dialog_destroyed_observer.dialog_destroyed());
+ ASSERT_TRUE(watcher.IsDestroyed());
// Try printing again.
PrintPreview();
@@ -278,7 +263,7 @@ IN_PROC_BROWSER_TEST_F(PrintPreviewDialogControllerBrowserTest,
// Reload the initiator. Make sure reloading destroys the print preview
// dialog.
- PrintPreviewDialogDestroyedObserver dialog_destroyed_observer(preview_dialog);
+ content::WebContentsDestroyedWatcher watcher(preview_dialog);
chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
content::WaitForLoadStop(
browser()->tab_strip_model()->GetActiveWebContents());
@@ -287,7 +272,7 @@ IN_PROC_BROWSER_TEST_F(PrintPreviewDialogControllerBrowserTest,
// may occur right after the commit, before the widget is destroyed.
// Execute pending tasks to account for this.
base::RunLoop().RunUntilIdle();
- ASSERT_TRUE(dialog_destroyed_observer.dialog_destroyed());
+ ASSERT_TRUE(watcher.IsDestroyed());
// Try printing again.
PrintPreview();
diff --git a/chromium/chrome/browser/printing/print_preview_dialog_controller_unittest.cc b/chromium/chrome/browser/printing/print_preview_dialog_controller_unittest.cc
index 9b95dfaacf8..674f46509eb 100644
--- a/chromium/chrome/browser/printing/print_preview_dialog_controller_unittest.cc
+++ b/chromium/chrome/browser/printing/print_preview_dialog_controller_unittest.cc
@@ -22,32 +22,17 @@
#include "content/public/common/url_constants.h"
#include "content/public/test/mock_render_process_host.h"
#include "content/public/test/navigation_simulator.h"
+#include "content/public/test/test_utils.h"
#include "content/public/test/web_contents_tester.h"
using content::WebContents;
using content::WebContentsObserver;
namespace {
+
// content::WebContentsDelegate destructor is protected: subclass for testing.
class TestWebContentsDelegate : public content::WebContentsDelegate {};
-class PrintPreviewDialogDestroyedObserver : public WebContentsObserver {
- public:
- explicit PrintPreviewDialogDestroyedObserver(WebContents* dialog)
- : WebContentsObserver(dialog) {}
- ~PrintPreviewDialogDestroyedObserver() override = default;
-
- bool dialog_destroyed() const { return dialog_destroyed_; }
-
- private:
- // content::WebContentsObserver implementation.
- void WebContentsDestroyed() override { dialog_destroyed_ = true; }
-
- bool dialog_destroyed_ = false;
-
- DISALLOW_COPY_AND_ASSIGN(PrintPreviewDialogDestroyedObserver);
-};
-
} // namespace
namespace printing {
@@ -243,7 +228,7 @@ TEST_F(PrintPreviewDialogControllerUnitTest, CloseDialogOnNavigation) {
// still 1.
EXPECT_EQ(1, browser()->tab_strip_model()->count());
EXPECT_NE(web_contents, tiger_preview_dialog);
- PrintPreviewDialogDestroyedObserver tiger_destroyed(tiger_preview_dialog);
+ content::WebContentsDestroyedWatcher tiger_destroyed(tiger_preview_dialog);
// Navigate via link to a similar page.
content::NavigationSimulator::NavigateAndCommitFromBrowser(web_contents,
@@ -261,10 +246,10 @@ TEST_F(PrintPreviewDialogControllerUnitTest, CloseDialogOnNavigation) {
// Check a new dialog was created - either the pointers should be different or
// the previous web contents must have been destroyed.
- EXPECT_TRUE(tiger_destroyed.dialog_destroyed() ||
+ EXPECT_TRUE(tiger_destroyed.IsDestroyed() ||
tiger_barb_preview_dialog != tiger_preview_dialog);
EXPECT_NE(tiger_barb_preview_dialog, web_contents);
- PrintPreviewDialogDestroyedObserver tiger_barb_destroyed(
+ content::WebContentsDestroyedWatcher tiger_barb_destroyed(
tiger_barb_preview_dialog);
// Now this returns false as |tiger_barb_preview_dialog| is open.
@@ -281,10 +266,10 @@ TEST_F(PrintPreviewDialogControllerUnitTest, CloseDialogOnNavigation) {
ASSERT_TRUE(tiger_preview_dialog_2);
// Verify this is a new dialog.
- EXPECT_TRUE(tiger_barb_destroyed.dialog_destroyed() ||
+ EXPECT_TRUE(tiger_barb_destroyed.IsDestroyed() ||
tiger_barb_preview_dialog != tiger_preview_dialog_2);
EXPECT_NE(tiger_preview_dialog_2, web_contents);
- PrintPreviewDialogDestroyedObserver tiger_2_destroyed(
+ content::WebContentsDestroyedWatcher tiger_2_destroyed(
tiger_preview_dialog_2);
// Try to simulate Gmail navigation: Navigate to an existing page (via
@@ -304,7 +289,7 @@ TEST_F(PrintPreviewDialogControllerUnitTest, CloseDialogOnNavigation) {
// returned by GetOrCreatePreviewDialog should be the same as the earlier
// dialog.
EXPECT_FALSE(manager->PrintPreviewNow(web_contents->GetMainFrame(), false));
- EXPECT_FALSE(tiger_2_destroyed.dialog_destroyed());
+ EXPECT_FALSE(tiger_2_destroyed.IsDestroyed());
WebContents* tiger_preview_dialog_2b =
dialog_controller->GetOrCreatePreviewDialog(web_contents);
ASSERT_TRUE(tiger_preview_dialog_2b);
diff --git a/chromium/chrome/browser/printing/print_preview_message_handler.cc b/chromium/chrome/browser/printing/print_preview_message_handler.cc
index 38bc7246be8..124a5736168 100644
--- a/chromium/chrome/browser/printing/print_preview_message_handler.cc
+++ b/chromium/chrome/browser/printing/print_preview_message_handler.cc
@@ -44,6 +44,8 @@ namespace printing {
namespace {
+// TODO(https://crbug.com/1008939): Remove this once all preview UI messages
+// are moved to print_preview_ui.cc.
void StopWorker(int document_cookie) {
if (document_cookie <= 0)
return;
@@ -265,17 +267,6 @@ void PrintPreviewMessageHandler::OnMetafileReadyForPrinting(
}
}
-void PrintPreviewMessageHandler::OnPrintPreviewFailed(
- int document_cookie,
- const PrintHostMsg_PreviewIds& ids) {
- StopWorker(document_cookie);
-
- PrintPreviewUI* print_preview_ui = GetPrintPreviewUI(ids.ui_id);
- if (!print_preview_ui)
- return;
- print_preview_ui->OnPrintPreviewFailed(ids.request_id);
-}
-
void PrintPreviewMessageHandler::OnDidGetDefaultPageLayout(
const PageSizeMargins& page_layout_in_points,
const gfx::Rect& printable_area_in_points,
@@ -313,15 +304,6 @@ void PrintPreviewMessageHandler::OnInvalidPrinterSettings(
print_preview_ui->OnInvalidPrinterSettings(ids.request_id);
}
-void PrintPreviewMessageHandler::OnSetOptionsFromDocument(
- const PrintHostMsg_SetOptionsFromDocument_Params& params,
- const PrintHostMsg_PreviewIds& ids) {
- PrintPreviewUI* print_preview_ui = GetPrintPreviewUI(ids.ui_id);
- if (!print_preview_ui)
- return;
- print_preview_ui->OnSetOptionsFromDocument(params, ids.request_id);
-}
-
void PrintPreviewMessageHandler::NotifyUIPreviewPageReady(
PrintPreviewUI* print_preview_ui,
int page_number,
@@ -527,16 +509,12 @@ bool PrintPreviewMessageHandler::OnMessageReceived(
IPC_MESSAGE_HANDLER(PrintHostMsg_DidStartPreview, OnDidStartPreview)
IPC_MESSAGE_HANDLER(PrintHostMsg_DidPrepareDocumentForPreview,
OnDidPrepareForDocumentToPdf)
- IPC_MESSAGE_HANDLER(PrintHostMsg_PrintPreviewFailed,
- OnPrintPreviewFailed)
IPC_MESSAGE_HANDLER(PrintHostMsg_DidGetDefaultPageLayout,
OnDidGetDefaultPageLayout)
IPC_MESSAGE_HANDLER(PrintHostMsg_PrintPreviewCancelled,
OnPrintPreviewCancelled)
IPC_MESSAGE_HANDLER(PrintHostMsg_PrintPreviewInvalidPrinterSettings,
OnInvalidPrinterSettings)
- IPC_MESSAGE_HANDLER(PrintHostMsg_SetOptionsFromDocument,
- OnSetOptionsFromDocument)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
return handled;
diff --git a/chromium/chrome/browser/printing/print_preview_message_handler.h b/chromium/chrome/browser/printing/print_preview_message_handler.h
index 70f3385dbf9..d1354decb3d 100644
--- a/chromium/chrome/browser/printing/print_preview_message_handler.h
+++ b/chromium/chrome/browser/printing/print_preview_message_handler.h
@@ -18,7 +18,6 @@ struct PrintHostMsg_DidPreviewPage_Params;
struct PrintHostMsg_DidStartPreview_Params;
struct PrintHostMsg_PreviewIds;
struct PrintHostMsg_RequestPrintPreview_Params;
-struct PrintHostMsg_SetOptionsFromDocument_Params;
namespace base {
class RefCountedMemory;
@@ -81,15 +80,10 @@ class PrintPreviewMessageHandler
content::RenderFrameHost* render_frame_host,
const PrintHostMsg_DidPreviewDocument_Params& params,
const PrintHostMsg_PreviewIds& ids);
- void OnPrintPreviewFailed(int document_cookie,
- const PrintHostMsg_PreviewIds& ids);
void OnPrintPreviewCancelled(int document_cookie,
const PrintHostMsg_PreviewIds& ids);
void OnInvalidPrinterSettings(int document_cookie,
const PrintHostMsg_PreviewIds& ids);
- void OnSetOptionsFromDocument(
- const PrintHostMsg_SetOptionsFromDocument_Params& params,
- const PrintHostMsg_PreviewIds& ids);
void NotifyUIPreviewPageReady(
PrintPreviewUI* print_preview_ui,
diff --git a/chromium/chrome/browser/printing/print_preview_pdf_generated_browsertest.cc b/chromium/chrome/browser/printing/print_preview_pdf_generated_browsertest.cc
index bb799adf071..84ff5278fb3 100644
--- a/chromium/chrome/browser/printing/print_preview_pdf_generated_browsertest.cc
+++ b/chromium/chrome/browser/printing/print_preview_pdf_generated_browsertest.cc
@@ -23,7 +23,6 @@
#include "base/files/scoped_temp_dir.h"
#include "base/hash/md5.h"
#include "base/location.h"
-#include "base/logging.h"
#include "base/macros.h"
#include "base/path_service.h"
#include "base/run_loop.h"
@@ -43,6 +42,7 @@
#include "components/printing/common/print_messages.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui_message_handler.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "ipc/ipc_message_macros.h"
#include "net/base/filename_util.h"
diff --git a/chromium/chrome/browser/printing/print_test_utils.cc b/chromium/chrome/browser/printing/print_test_utils.cc
index ab3585c1be4..7d1c13d4263 100644
--- a/chromium/chrome/browser/printing/print_test_utils.cc
+++ b/chromium/chrome/browser/printing/print_test_utils.cc
@@ -10,6 +10,7 @@
#include "base/json/json_writer.h"
#include "base/values.h"
#include "chrome/browser/ui/webui/print_preview/print_preview_handler.h"
+#include "printing/mojom/print.mojom.h"
#include "printing/print_job_constants.h"
namespace printing {
@@ -31,14 +32,15 @@ base::Value GetPrintTicket(PrinterType type) {
ticket.SetIntKey(kSettingColor, 2); // color printing
ticket.SetBoolKey(kSettingHeaderFooterEnabled, false);
ticket.SetIntKey(kSettingMarginsType, 0); // default margins
- ticket.SetIntKey(kSettingDuplexMode, LONG_EDGE);
+ ticket.SetIntKey(kSettingDuplexMode,
+ static_cast<int>(mojom::DuplexMode::kLongEdge));
ticket.SetIntKey(kSettingCopies, 1);
ticket.SetBoolKey(kSettingCollate, true);
ticket.SetBoolKey(kSettingShouldPrintBackgrounds, false);
ticket.SetBoolKey(kSettingShouldPrintSelectionOnly, false);
ticket.SetBoolKey(kSettingPreviewModifiable, true);
ticket.SetBoolKey(kSettingPreviewIsPdf, false);
- ticket.SetIntKey(kSettingPrinterType, type);
+ ticket.SetIntKey(kSettingPrinterType, static_cast<int>(type));
ticket.SetBoolKey(kSettingRasterizePdf, false);
ticket.SetIntKey(kSettingScaleFactor, 100);
ticket.SetIntKey(kSettingScalingType, FIT_TO_PAGE);
@@ -50,9 +52,9 @@ base::Value GetPrintTicket(PrinterType type) {
ticket.SetIntKey(kSettingPageHeight, 279400);
ticket.SetBoolKey(kSettingShowSystemDialog, false);
- if (type == kCloudPrinter) {
+ if (type == PrinterType::kCloud) {
ticket.SetStringKey(kSettingCloudPrintId, kDummyPrinterName);
- } else if (type == kPrivetPrinter || type == kExtensionPrinter) {
+ } else if (type == PrinterType::kPrivet || type == PrinterType::kExtension) {
base::Value capabilities(base::Value::Type::DICTIONARY);
capabilities.SetBoolKey("duplex", true); // non-empty
std::string caps_string;
diff --git a/chromium/chrome/browser/printing/print_view_manager_base.cc b/chromium/chrome/browser/printing/print_view_manager_base.cc
index 3378f34bd8e..a058d93622f 100644
--- a/chromium/chrome/browser/printing/print_view_manager_base.cc
+++ b/chromium/chrome/browser/printing/print_view_manager_base.cc
@@ -9,6 +9,7 @@
#include "base/auto_reset.h"
#include "base/bind.h"
+#include "base/feature_list.h"
#include "base/location.h"
#include "base/memory/read_only_shared_memory_region.h"
#include "base/memory/ref_counted_memory.h"
@@ -31,6 +32,7 @@
#include "chrome/browser/ui/webui/print_preview/printer_handler.h"
#include "chrome/common/pref_names.h"
#include "chrome/grit/generated_resources.h"
+#include "chromeos/constants/chromeos_features.h"
#include "components/prefs/pref_service.h"
#include "components/printing/browser/print_composite_client.h"
#include "components/printing/browser/print_manager_utils.h"
@@ -180,7 +182,7 @@ void PrintViewManagerBase::PrintDocument(
// Update the rendered document. It will send notifications to the listener.
PrintedDocument* document = print_job_->document();
- document->SetDocument(std::move(metafile), page_size, content_area);
+ document->SetDocument(std::move(metafile));
ShouldQuitFromInnerMessageLoop();
}
@@ -571,8 +573,14 @@ bool PrintViewManagerBase::CreateNewPrintJob(
print_job_ = base::MakeRefCounted<PrintJob>();
print_job_->Initialize(std::move(query), RenderSourceName(), number_pages_);
#if defined(OS_CHROMEOS)
- print_job_->SetSource(PrintJob::Source::PRINT_PREVIEW, /*source_id=*/"");
-#endif // defined(OS_CHROMEOS)
+ PrintJob::Source source = PrintJob::Source::PRINT_PREVIEW;
+ if (base::FeatureList::IsEnabled(
+ chromeos::features::kPrintJobManagementApp) &&
+ web_contents()->GetBrowserContext()->IsOffTheRecord()) {
+ source = PrintJob::Source::PRINT_PREVIEW_INCOGNITO;
+ }
+ print_job_->SetSource(source, /*source_id=*/"");
+#endif
registrar_.Add(this, chrome::NOTIFICATION_PRINT_JOB_EVENT,
content::Source<PrintJob>(print_job_.get()));
diff --git a/chromium/chrome/browser/printing/print_view_manager_basic_unittest.cc b/chromium/chrome/browser/printing/print_view_manager_basic_unittest.cc
index ba2a26706b3..d7f6728dc08 100644
--- a/chromium/chrome/browser/printing/print_view_manager_basic_unittest.cc
+++ b/chromium/chrome/browser/printing/print_view_manager_basic_unittest.cc
@@ -56,7 +56,7 @@ TEST_F(PrintViewManagerBasicTest, CancelJobDuringDestruction) {
auto query = queue->CreatePrinterQuery(main_rfh()->GetProcess()->GetID(),
main_rfh()->GetRoutingID());
base::RunLoop runloop;
- query->SetSettings(GetPrintTicket(printing::kLocalPrinter),
+ query->SetSettings(GetPrintTicket(PrinterType::kLocal),
runloop.QuitClosure());
runloop.Run();
auto cookie = query->cookie();
diff --git a/chromium/chrome/browser/printing/print_view_manager_unittest.cc b/chromium/chrome/browser/printing/print_view_manager_unittest.cc
index 951972c49a3..81d6a2c91a8 100644
--- a/chromium/chrome/browser/printing/print_view_manager_unittest.cc
+++ b/chromium/chrome/browser/printing/print_view_manager_unittest.cc
@@ -146,7 +146,7 @@ TEST_F(PrintViewManagerTest, PostScriptHasCorrectOffsets) {
print_view_manager->PrintPreviewNow(web_contents->GetMainFrame(), false);
- base::Value print_ticket = GetPrintTicket(printing::kLocalPrinter);
+ base::Value print_ticket = GetPrintTicket(PrinterType::kLocal);
const char kTestData[] = "abc";
auto print_data = base::MakeRefCounted<base::RefCountedStaticMemory>(
kTestData, sizeof(kTestData));
diff --git a/chromium/chrome/browser/printing/printing_message_filter.cc b/chromium/chrome/browser/printing/printing_message_filter.cc
index 40762a36024..d105aae9c8b 100644
--- a/chromium/chrome/browser/printing/printing_message_filter.cc
+++ b/chromium/chrome/browser/printing/printing_message_filter.cc
@@ -139,7 +139,7 @@ bool PrintingMessageFilter::OnMessageReceived(const IPC::Message& message) {
void PrintingMessageFilter::OnGetDefaultPrintSettings(IPC::Message* reply_msg) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
if (!is_printing_enabled_.GetValue()) {
- // Reply with NULL query.
+ // Reply with null query.
OnGetDefaultPrintSettingsReply(nullptr, reply_msg);
return;
}
@@ -229,10 +229,18 @@ void PrintingMessageFilter::OnUpdatePrintSettings(int document_cookie,
base::Value job_settings,
IPC::Message* reply_msg) {
if (!is_printing_enabled_.GetValue()) {
- // Reply with NULL query.
+ // Reply with null query.
OnUpdatePrintSettingsReply(nullptr, reply_msg);
return;
}
+
+ if (!job_settings.is_dict() ||
+ !job_settings.FindIntKey(kSettingPrinterType)) {
+ // Reply with null query.
+ OnUpdatePrintSettingsReply(nullptr, reply_msg);
+ return;
+ }
+
std::unique_ptr<PrinterQuery> printer_query =
queue_->PopPrinterQuery(document_cookie);
if (!printer_query) {
diff --git a/chromium/chrome/browser/printing/pwg_raster_converter.cc b/chromium/chrome/browser/printing/pwg_raster_converter.cc
index a7f1a42938d..22ceb058e4c 100644
--- a/chromium/chrome/browser/printing/pwg_raster_converter.cc
+++ b/chromium/chrome/browser/printing/pwg_raster_converter.cc
@@ -11,9 +11,10 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/cancelable_callback.h"
-#include "base/logging.h"
+#include "base/check_op.h"
#include "base/macros.h"
#include "base/metrics/histogram_macros.h"
+#include "base/notreached.h"
#include "chrome/browser/printing/printing_service.h"
#include "chrome/services/printing/public/mojom/pdf_to_pwg_raster_converter.mojom.h"
#include "components/cloud_devices/common/cloud_device_description.h"
@@ -22,6 +23,7 @@
#include "content/public/browser/child_process_data.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "mojo/public/cpp/system/platform_handle.h"
+#include "printing/mojom/print.mojom.h"
#include "printing/pdf_render_settings.h"
#include "printing/pwg_raster_settings.h"
#include "printing/units.h"
@@ -243,7 +245,7 @@ PwgRasterSettings PwgRasterConverter::GetBitmapSettings(
PwgRasterSettings result;
switch (duplex_value) {
case cloud_devices::printer::DuplexType::NO_DUPLEX:
- result.duplex_mode = DuplexMode::SIMPLEX;
+ result.duplex_mode = mojom::DuplexMode::kSimplex;
result.odd_page_transform = TRANSFORM_NORMAL;
break;
case cloud_devices::printer::DuplexType::LONG_EDGE:
@@ -256,7 +258,7 @@ PwgRasterSettings PwgRasterConverter::GetBitmapSettings(
}
break;
case cloud_devices::printer::DuplexType::SHORT_EDGE:
- result.duplex_mode = DuplexMode::SHORT_EDGE;
+ result.duplex_mode = mojom::DuplexMode::kShortEdge;
if (document_sheet_back ==
cloud_devices::printer::DocumentSheetBack::MANUAL_TUMBLE) {
result.odd_page_transform = TRANSFORM_ROTATE_180;
diff --git a/chromium/chrome/browser/printing/pwg_raster_converter_browsertest.cc b/chromium/chrome/browser/printing/pwg_raster_converter_browsertest.cc
index 3f20e6a8ff9..eacacd846a5 100644
--- a/chromium/chrome/browser/printing/pwg_raster_converter_browsertest.cc
+++ b/chromium/chrome/browser/printing/pwg_raster_converter_browsertest.cc
@@ -15,6 +15,8 @@
#include "build/build_config.h"
#include "chrome/browser/printing/pwg_raster_converter.h"
#include "chrome/common/chrome_paths.h"
+#include "content/public/test/browser_test.h"
+#include "printing/mojom/print.mojom.h"
#include "printing/pdf_render_settings.h"
#include "printing/pwg_raster_settings.h"
@@ -127,7 +129,7 @@ IN_PROC_BROWSER_TEST_F(PdfToPwgRasterBrowserTest, TestSuccessColor) {
/*use_color=*/true,
PdfRenderSettings::Mode::NORMAL);
PwgRasterSettings pwg_settings;
- pwg_settings.duplex_mode = DuplexMode::SIMPLEX;
+ pwg_settings.duplex_mode = mojom::DuplexMode::kSimplex;
pwg_settings.odd_page_transform = PwgRasterTransformType::TRANSFORM_NORMAL;
pwg_settings.rotate_all_pages = false;
pwg_settings.reverse_page_order = false;
@@ -155,7 +157,7 @@ IN_PROC_BROWSER_TEST_F(PdfToPwgRasterBrowserTest, TestSuccessMono) {
/*use_color=*/false,
PdfRenderSettings::Mode::NORMAL);
PwgRasterSettings pwg_settings;
- pwg_settings.duplex_mode = DuplexMode::SIMPLEX;
+ pwg_settings.duplex_mode = mojom::DuplexMode::kSimplex;
pwg_settings.odd_page_transform = PwgRasterTransformType::TRANSFORM_NORMAL;
pwg_settings.rotate_all_pages = false;
pwg_settings.reverse_page_order = false;
@@ -183,7 +185,7 @@ IN_PROC_BROWSER_TEST_F(PdfToPwgRasterBrowserTest, TestSuccessLongDuplex) {
/*use_color=*/false,
PdfRenderSettings::Mode::NORMAL);
PwgRasterSettings pwg_settings;
- pwg_settings.duplex_mode = DuplexMode::LONG_EDGE;
+ pwg_settings.duplex_mode = mojom::DuplexMode::kLongEdge;
pwg_settings.odd_page_transform = PwgRasterTransformType::TRANSFORM_NORMAL;
pwg_settings.rotate_all_pages = false;
pwg_settings.reverse_page_order = false;
diff --git a/chromium/chrome/browser/profiles/android/BUILD.gn b/chromium/chrome/browser/profiles/android/BUILD.gn
index a8308d038a1..982a89f2d2b 100644
--- a/chromium/chrome/browser/profiles/android/BUILD.gn
+++ b/chromium/chrome/browser/profiles/android/BUILD.gn
@@ -12,12 +12,14 @@ android_library("java") {
"//base:jni_java",
"//chrome/browser/android/crypto:java",
"//chrome/browser/preferences:java",
+ "//components/embedder_support/android:browser_context_java",
"//content/public/android:content_java",
]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
sources = [
"java/src/org/chromium/chrome/browser/cookies/CanonicalCookie.java",
"java/src/org/chromium/chrome/browser/cookies/CookiesFetcher.java",
+ "java/src/org/chromium/chrome/browser/profiles/OTRProfileID.java",
"java/src/org/chromium/chrome/browser/profiles/OriginalProfileSupplier.java",
"java/src/org/chromium/chrome/browser/profiles/Profile.java",
"java/src/org/chromium/chrome/browser/profiles/ProfileKey.java",
@@ -29,6 +31,7 @@ android_library("java") {
generate_jni("jni_headers") {
sources = [
"java/src/org/chromium/chrome/browser/cookies/CookiesFetcher.java",
+ "java/src/org/chromium/chrome/browser/profiles/OTRProfileID.java",
"java/src/org/chromium/chrome/browser/profiles/Profile.java",
"java/src/org/chromium/chrome/browser/profiles/ProfileKey.java",
"java/src/org/chromium/chrome/browser/profiles/ProfileManager.java",
diff --git a/chromium/chrome/browser/profiling_host/BUILD.gn b/chromium/chrome/browser/profiling_host/BUILD.gn
index ea427aa14f1..2ed779cceb8 100644
--- a/chromium/chrome/browser/profiling_host/BUILD.gn
+++ b/chromium/chrome/browser/profiling_host/BUILD.gn
@@ -17,7 +17,7 @@ static_library("profiling_host") {
deps = [
"//base",
"//chrome/common:non_code_constants",
- "//components/heap_profiling",
+ "//components/heap_profiling/multi_process",
"//components/services/heap_profiling/public/cpp",
"//content/public/browser",
"//content/public/common",
@@ -39,7 +39,7 @@ source_set("profiling_browsertests") {
"//base",
"//base/allocator:buildflags",
"//chrome/common:non_code_constants",
- "//components/heap_profiling:test_support",
+ "//components/heap_profiling/multi_process:test_support",
"//components/services/heap_profiling/public/cpp",
"//content/public/common",
"//testing/gmock",
diff --git a/chromium/chrome/browser/renderer_host/chrome_extension_message_filter.cc b/chromium/chrome/browser/renderer_host/chrome_extension_message_filter.cc
index 79fcca57e9f..228ad3adfbf 100644
--- a/chromium/chrome/browser/renderer_host/chrome_extension_message_filter.cc
+++ b/chromium/chrome/browser/renderer_host/chrome_extension_message_filter.cc
@@ -8,9 +8,10 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
+#include "base/check_op.h"
#include "base/files/file_path.h"
-#include "base/logging.h"
#include "base/memory/ptr_util.h"
+#include "base/notreached.h"
#include "base/stl_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task/post_task.h"
diff --git a/chromium/chrome/browser/renderer_host/chrome_navigation_ui_data.cc b/chromium/chrome/browser/renderer_host/chrome_navigation_ui_data.cc
index b2bd3d47ed8..368d9d1313c 100644
--- a/chromium/chrome/browser/renderer_host/chrome_navigation_ui_data.cc
+++ b/chromium/chrome/browser/renderer_host/chrome_navigation_ui_data.cc
@@ -6,7 +6,6 @@
#include "chrome/browser/prerender/prerender_contents.h"
#include "chrome/browser/prerender/prerender_histograms.h"
-#include "chrome/browser/previews/previews_lite_page_redirect_decider.h"
#include "content/public/browser/navigation_handle.h"
#include "extensions/buildflags/buildflags.h"
#include "ui/base/window_open_disposition.h"
@@ -43,9 +42,6 @@ ChromeNavigationUIData::ChromeNavigationUIData(
prerender::PrerenderHistograms::GetHistogramPrefix(
prerender_contents->origin());
}
- data_reduction_proxy_page_id_ =
- PreviewsLitePageRedirectDecider::GeneratePageIdForWebContents(
- web_contents);
}
ChromeNavigationUIData::~ChromeNavigationUIData() {}
@@ -54,12 +50,9 @@ ChromeNavigationUIData::~ChromeNavigationUIData() {}
std::unique_ptr<ChromeNavigationUIData>
ChromeNavigationUIData::CreateForMainFrameNavigation(
content::WebContents* web_contents,
- WindowOpenDisposition disposition,
- int64_t data_reduction_proxy_page_id) {
+ WindowOpenDisposition disposition) {
auto navigation_ui_data = std::make_unique<ChromeNavigationUIData>();
navigation_ui_data->disposition_ = disposition;
- navigation_ui_data->data_reduction_proxy_page_id_ =
- data_reduction_proxy_page_id;
#if BUILDFLAG(ENABLE_EXTENSIONS)
int tab_id = extension_misc::kUnknownTabId;
@@ -82,7 +75,6 @@ std::unique_ptr<content::NavigationUIData> ChromeNavigationUIData::Clone() {
auto copy = std::make_unique<ChromeNavigationUIData>();
copy->disposition_ = disposition_;
- copy->data_reduction_proxy_page_id_ = data_reduction_proxy_page_id_;
#if BUILDFLAG(ENABLE_EXTENSIONS)
if (extension_data_)
diff --git a/chromium/chrome/browser/renderer_host/chrome_navigation_ui_data.h b/chromium/chrome/browser/renderer_host/chrome_navigation_ui_data.h
index 81b9b8df052..f7c2f9f72ba 100644
--- a/chromium/chrome/browser/renderer_host/chrome_navigation_ui_data.h
+++ b/chromium/chrome/browser/renderer_host/chrome_navigation_ui_data.h
@@ -33,8 +33,7 @@ class ChromeNavigationUIData : public content::NavigationUIData {
static std::unique_ptr<ChromeNavigationUIData> CreateForMainFrameNavigation(
content::WebContents* web_contents,
- WindowOpenDisposition disposition,
- int64_t data_reduction_proxy_page_id);
+ WindowOpenDisposition disposition);
// Creates a new ChromeNavigationUIData that is a deep copy of the original.
// Any changes to the original after the clone is created will not be
@@ -65,9 +64,6 @@ class ChromeNavigationUIData : public content::NavigationUIData {
const std::string& prerender_histogram_prefix() {
return prerender_histogram_prefix_;
}
- uint64_t data_reduction_proxy_page_id() const {
- return data_reduction_proxy_page_id_;
- }
private:
#if BUILDFLAG(ENABLE_EXTENSIONS)
@@ -84,7 +80,6 @@ class ChromeNavigationUIData : public content::NavigationUIData {
WindowOpenDisposition disposition_;
prerender::PrerenderMode prerender_mode_ = prerender::NO_PRERENDER;
std::string prerender_histogram_prefix_;
- uint64_t data_reduction_proxy_page_id_ = 0;
DISALLOW_COPY_AND_ASSIGN(ChromeNavigationUIData);
};
diff --git a/chromium/chrome/browser/renderer_host/chrome_render_widget_host_view_mac_history_swiper.mm b/chromium/chrome/browser/renderer_host/chrome_render_widget_host_view_mac_history_swiper.mm
index 724458d0e08..48000af5251 100644
--- a/chromium/chrome/browser/renderer_host/chrome_render_widget_host_view_mac_history_swiper.mm
+++ b/chromium/chrome/browser/renderer_host/chrome_render_widget_host_view_mac_history_swiper.mm
@@ -125,7 +125,7 @@ BOOL forceMagicMouse = NO;
- (void)rendererHandledGestureScrollEvent:(const blink::WebGestureEvent&)event
consumed:(BOOL)consumed {
switch (event.GetType()) {
- case blink::WebInputEvent::kGestureScrollBegin:
+ case blink::WebInputEvent::Type::kGestureScrollBegin:
if (event.data.scroll_begin.synthetic ||
event.data.scroll_begin.inertial_phase ==
blink::WebGestureEvent::InertialPhaseState::kMomentum) {
@@ -133,7 +133,7 @@ BOOL forceMagicMouse = NO;
}
_waitingForFirstGestureScroll = YES;
break;
- case blink::WebInputEvent::kGestureScrollUpdate:
+ case blink::WebInputEvent::Type::kGestureScrollUpdate:
if (_waitingForFirstGestureScroll)
_firstScrollUnconsumed = !consumed;
_waitingForFirstGestureScroll = NO;
diff --git a/chromium/chrome/browser/renderer_host/chrome_render_widget_host_view_mac_history_swiper_browsertest.mm b/chromium/chrome/browser/renderer_host/chrome_render_widget_host_view_mac_history_swiper_browsertest.mm
index 9b972bb85c8..6a030f43974 100644
--- a/chromium/chrome/browser/renderer_host/chrome_render_widget_host_view_mac_history_swiper_browsertest.mm
+++ b/chromium/chrome/browser/renderer_host/chrome_render_widget_host_view_mac_history_swiper_browsertest.mm
@@ -6,9 +6,9 @@
#include "base/bind.h"
#include "base/files/file_path.h"
-#include "base/logging.h"
#include "base/mac/scoped_nsobject.h"
#include "base/macros.h"
+#include "base/notreached.h"
#include "base/run_loop.h"
#include "base/test/simple_test_tick_clock.h"
#include "chrome/browser/ui/browser.h"
@@ -19,6 +19,7 @@
#include "content/public/browser/render_widget_host.h"
#include "content/public/browser/render_widget_host_view.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "third_party/blink/public/common/input/web_mouse_wheel_event.h"
#import "third_party/ocmock/OCMock/OCMock.h"
@@ -752,10 +753,10 @@ IN_PROC_BROWSER_TEST_F(ChromeRenderWidgetHostViewMacHistorySwiperTest,
content::InputEventAckWaiter wheel_end_ack_waiter(
GetWebContents()->GetRenderViewHost()->GetWidget(),
- base::BindRepeating([](content::InputEventAckSource,
- content::InputEventAckState,
+ base::BindRepeating([](blink::mojom::InputEventResultSource,
+ blink::mojom::InputEventResultState,
const blink::WebInputEvent& event) {
- return event.GetType() == blink::WebInputEvent::kMouseWheel &&
+ return event.GetType() == blink::WebInputEvent::Type::kMouseWheel &&
static_cast<const blink::WebMouseWheelEvent&>(event).phase ==
blink::WebMouseWheelEvent::kPhaseEnded;
}));
diff --git a/chromium/chrome/browser/renderer_host/pepper/pepper_flash_drm_host.cc b/chromium/chrome/browser/renderer_host/pepper/pepper_flash_drm_host.cc
index 2e51425cb66..7c8c292d6d4 100644
--- a/chromium/chrome/browser/renderer_host/pepper/pepper_flash_drm_host.cc
+++ b/chromium/chrome/browser/renderer_host/pepper/pepper_flash_drm_host.cc
@@ -9,9 +9,10 @@
#endif
#include "base/bind.h"
+#include "base/check.h"
#include "base/compiler_specific.h"
-#include "base/logging.h"
#include "base/memory/ref_counted.h"
+#include "base/notreached.h"
#include "base/task/post_task.h"
#include "build/build_config.h"
#include "content/public/browser/browser_ppapi_host.h"
diff --git a/chromium/chrome/browser/renderer_host/render_process_host_chrome_browsertest.cc b/chromium/chrome/browser/renderer_host/render_process_host_chrome_browsertest.cc
index dd94a6bbfa1..70f5d55fa10 100644
--- a/chromium/chrome/browser/renderer_host/render_process_host_chrome_browsertest.cc
+++ b/chromium/chrome/browser/renderer_host/render_process_host_chrome_browsertest.cc
@@ -33,6 +33,7 @@
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/no_renderer_crashes_assertion.h"
#include "content/public/test/test_navigation_observer.h"
diff --git a/chromium/chrome/browser/resources/BUILD.gn b/chromium/chrome/browser/resources/BUILD.gn
index f4ad27fb62d..c5f813e5c89 100644
--- a/chromium/chrome/browser/resources/BUILD.gn
+++ b/chromium/chrome/browser/resources/BUILD.gn
@@ -18,6 +18,7 @@ if (closure_compile) {
"engagement:closure_compile",
"interventions_internals:closure_compile",
"media:closure_compile",
+ "memory_internals:closure_compile",
"reset_password:closure_compile",
]
if (is_linux || is_win || is_mac) {
@@ -99,7 +100,7 @@ if (!is_android) {
} else {
source = "bookmarks/bookmarks_resources.grd"
- deps = [ "//chrome/browser/resources/bookmarks:polymer3_elements" ]
+ deps = [ "//chrome/browser/resources/bookmarks:web_components" ]
}
defines = chrome_grit_defines
@@ -120,7 +121,7 @@ if (!is_android) {
"root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir),
]
- deps = [ "//chrome/browser/resources/pdf/elements:polymer3_elements" ]
+ deps = [ "//chrome/browser/resources/pdf/elements:web_components" ]
defines = chrome_grit_defines
if (enable_hangout_services_extension) {
@@ -168,7 +169,7 @@ if (!is_android) {
} else {
source = "history/history_resources.grd"
- deps = [ "//chrome/browser/resources/history:polymer3_elements" ]
+ deps = [ "//chrome/browser/resources/history:web_components" ]
}
defines = chrome_grit_defines
@@ -192,13 +193,21 @@ if (!is_android) {
}
grit("new_tab_page_resources") {
- source = "new_tab_page/new_tab_page_resources.grd"
+ if (optimize_webui) {
+ source = "new_tab_page/new_tab_page_resources_vulcanized.grd"
+ } else {
+ source = "new_tab_page/new_tab_page_resources.grd"
+ }
deps = [
- "//chrome/browser/resources/new_tab_page:polymer3_elements",
"//chrome/browser/ui/webui/new_tab_page:mojo_bindings_js",
"//skia/public/mojom:mojom_js",
]
+ if (optimize_webui) {
+ deps += [ "//chrome/browser/resources/new_tab_page:optimized_js" ]
+ } else {
+ deps += [ "//chrome/browser/resources/new_tab_page:web_components" ]
+ }
grit_flags = [
"-E",
@@ -224,10 +233,7 @@ if (!is_android) {
if (optimize_webui) {
source = "settings/settings_resources_vulcanized.grd"
- deps = [
- "//chrome/browser/resources/settings:build",
- "//chrome/browser/resources/settings:build_polymer3",
- ]
+ deps = [ "//chrome/browser/resources/settings:build_polymer3" ]
} else {
source = "settings/settings_resources.grd"
deps = [ "//chrome/browser/resources/settings:polymer3_elements" ]
@@ -251,7 +257,7 @@ if (!is_android) {
} else {
source = "downloads/downloads_resources.grd"
- deps = [ "//chrome/browser/resources/downloads:polymer3_elements" ]
+ deps = [ "//chrome/browser/resources/downloads:web_components" ]
}
deps += [ "//chrome/browser/ui/webui/downloads:mojo_bindings_js" ]
@@ -273,10 +279,11 @@ if (!is_android) {
if (is_chromeos) {
grit("os_settings_resources") {
- deps = [
- "//chrome/browser/ui/webui/app_management:mojo_bindings_js",
- "//chrome/browser/ui/webui/settings/chromeos/search:mojo_bindings_js",
+ grit_flags = [
+ "-E",
+ "root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir),
]
+ deps = [ "//chrome/browser/ui/webui/settings/chromeos:mojom_js" ]
if (optimize_webui) {
# Required due to flattenhtml="true" on a generated file.
enable_input_discovery_for_gn_analyze = false
@@ -285,13 +292,10 @@ if (is_chromeos) {
deps += [ "//chrome/browser/resources/settings/chromeos:build" ]
} else {
source = "settings/os_settings_resources.grd"
+ deps +=
+ [ "//chrome/browser/resources/settings/chromeos:polymer3_elements" ]
}
- grit_flags = [
- "-E",
- "root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir),
- ]
-
defines = chrome_grit_defines
outputs = [
"grit/os_settings_resources.h",
@@ -307,7 +311,7 @@ if (!is_android && !is_chromeos) {
grit("welcome_resources") {
source = "welcome/welcome_resources.grd"
- deps = [ "//chrome/browser/resources/welcome:polymer3_elements" ]
+ deps = [ "//chrome/browser/resources/welcome:web_components" ]
grit_flags = [
"-E",
"root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir),
@@ -322,6 +326,24 @@ if (!is_android && !is_chromeos) {
]
output_dir = "$root_gen_dir/chrome"
}
+
+ grit("profile_picker_resources") {
+ source = "signin/profile_picker/profile_picker_resources.grd"
+
+ grit_flags = [
+ "-E",
+ "root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir),
+ ]
+
+ defines = chrome_grit_defines
+ outputs = [
+ "grit/profile_picker_resources.h",
+ "grit/profile_picker_resources_map.cc",
+ "grit/profile_picker_resources_map.h",
+ "profile_picker_resources.pak",
+ ]
+ output_dir = "$root_gen_dir/chrome"
+ }
}
if (enable_extensions) {
@@ -337,7 +359,7 @@ if (enable_extensions) {
} else {
source = "extensions/extensions_resources.grd"
- deps = [ "//chrome/browser/resources/extensions:polymer3_elements" ]
+ deps = [ "//chrome/browser/resources/extensions:web_components" ]
}
defines = chrome_grit_defines
@@ -371,10 +393,16 @@ if (enable_print_preview) {
if (optimize_webui) {
source = "print_preview/print_preview_resources_vulcanized.grd"
- deps = [ "//chrome/browser/resources/print_preview:build" ]
+ deps = [
+ "//chrome/browser/resources/pdf/elements:web_components",
+ "//chrome/browser/resources/print_preview:build",
+ ]
} else {
source = "print_preview/print_preview_resources.grd"
- deps = [ "//chrome/browser/resources/print_preview/ui:polymer3_elements" ]
+ deps = [
+ "//chrome/browser/resources/pdf/elements:web_components",
+ "//chrome/browser/resources/print_preview/ui:web_components",
+ ]
}
defines = chrome_grit_defines
@@ -392,7 +420,7 @@ if (enable_webui_tab_strip) {
grit("tab_strip_resources") {
source = "tab_strip/tab_strip_resources.grd"
defines = chrome_grit_defines
- deps = [ "tab_strip:tab_strip_modules" ]
+ deps = [ "tab_strip:web_components" ]
outputs = [
"grit/tab_strip_resources.h",
"grit/tab_strip_resources_map.cc",
diff --git a/chromium/chrome/browser/resources/about_sys/about_sys.css b/chromium/chrome/browser/resources/about_sys/about_sys.css
index d17e51e57ca..4d8b34769a7 100644
--- a/chromium/chrome/browser/resources/about_sys/about_sys.css
+++ b/chromium/chrome/browser/resources/about_sys/about_sys.css
@@ -152,6 +152,15 @@ tr > *:nth-child(2) {
white-space: pre-wrap;
}
+a.stat-name-link {
+ color: inherit;
+ text-decoration: none;
+}
+
+a.stat-name-link:hover {
+ text-decoration: underline;
+}
+
html[dir='rtl'] #details .name {
background-position-left: auto;
background-position-right: 5em;
diff --git a/chromium/chrome/browser/resources/about_sys/about_sys.js b/chromium/chrome/browser/resources/about_sys/about_sys.js
index ec28d40c486..4edba9ba018 100644
--- a/chromium/chrome/browser/resources/about_sys/about_sys.js
+++ b/chromium/chrome/browser/resources/about_sys/about_sys.js
@@ -112,7 +112,11 @@ function createNodeForLogEntry(log) {
nameCell.className = 'name';
const nameDiv = document.createElement('div');
nameDiv.className = 'stat-name';
- nameDiv.textContent = log.statName;
+ const a = document.createElement('a');
+ a.className = 'stat-name-link';
+ a.href = `#${log.statName}`;
+ a.name = a.text = log.statName;
+ nameDiv.appendChild(a);
nameCell.appendChild(nameDiv);
row.appendChild(nameCell);
@@ -160,7 +164,7 @@ function updateLogEntries(systemInfo) {
const table = $('details');
// Delete any existing log entries in the table
- table.innerHtml = '';
+ table.innerHTML = trustedTypes.emptyHTML;
table.appendChild(fragment);
}
diff --git a/chromium/chrome/browser/resources/accessibility/accessibility.js b/chromium/chrome/browser/resources/accessibility/accessibility.js
index 16ef356673b..b6ac8513857 100644
--- a/chromium/chrome/browser/resources/accessibility/accessibility.js
+++ b/chromium/chrome/browser/resources/accessibility/accessibility.js
@@ -391,7 +391,8 @@ cr.define('accessibility', function() {
function createErrorMessageElement(data) {
const errorMessageElement = document.createElement('div');
const errorMessage = data.error;
- errorMessageElement.innerHTML = errorMessage + '&nbsp;';
+ const nbsp = '\u00a0';
+ errorMessageElement.textContent = errorMessage + nbsp;
const closeLink = document.createElement('a');
closeLink.href = '#';
closeLink.textContent = '[close]';
diff --git a/chromium/chrome/browser/resources/bluetooth_internals/adapter_page.js b/chromium/chrome/browser/resources/bluetooth_internals/adapter_page.js
index 9d6787284e2..3e22d08b5f1 100644
--- a/chromium/chrome/browser/resources/bluetooth_internals/adapter_page.js
+++ b/chromium/chrome/browser/resources/bluetooth_internals/adapter_page.js
@@ -10,6 +10,7 @@ cr.define('adapter_page', function() {
const PROPERTY_NAMES = {
address: 'Address',
name: 'Name',
+ systemName: 'System Name',
initialized: 'Initialized',
present: 'Present',
powered: 'Powered',
@@ -40,6 +41,12 @@ cr.define('adapter_page', function() {
* @param {!bluetooth.mojom.AdapterInfo} info
*/
setAdapterInfo(info) {
+ if (info.hasOwnProperty('systemName') && !info.systemName) {
+ // The adapter might not implement 'systemName'. In that case, delete
+ // this property so that it's not displayed on adapterFieldSet.
+ delete info.systemName;
+ }
+
this.adapterFieldSet.setObject(info);
this.refreshBtn_.disabled = false;
}
diff --git a/chromium/chrome/browser/resources/bluetooth_internals/object_fieldset.js b/chromium/chrome/browser/resources/bluetooth_internals/object_fieldset.js
index 3e8991c59a0..70305d0493f 100644
--- a/chromium/chrome/browser/resources/bluetooth_internals/object_fieldset.js
+++ b/chromium/chrome/browser/resources/bluetooth_internals/object_fieldset.js
@@ -69,7 +69,7 @@ cr.define('object_fieldset', function() {
* Deletes and recreates the table structure with current object data.
*/
redraw() {
- this.innerHTML = '';
+ this.innerHTML = trustedTypes.emptyHTML;
Object.keys(assert(this.value)).forEach(function(propName) {
const value = this.value[propName];
diff --git a/chromium/chrome/browser/resources/bookmarks/BUILD.gn b/chromium/chrome/browser/resources/bookmarks/BUILD.gn
index b42844e5cd8..3c241d44826 100644
--- a/chromium/chrome/browser/resources/bookmarks/BUILD.gn
+++ b/chromium/chrome/browser/resources/bookmarks/BUILD.gn
@@ -5,7 +5,7 @@
import("//chrome/common/features.gni")
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/grit/grit_rule.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
import("../optimize_webui.gni")
if (optimize_webui) {
@@ -40,7 +40,7 @@ if (optimize_webui) {
"root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir),
]
- deps = [ ":polymer3_elements" ]
+ deps = [ ":web_components" ]
defines = chrome_grit_defines
outputs = [
"grit/bookmarks_resources.h",
@@ -52,81 +52,21 @@ if (optimize_webui) {
}
}
-group("polymer3_elements") {
- public_deps = [
- ":app_module",
- ":command_manager_module",
- ":edit_dialog_module",
- ":folder_node_module",
- ":item_module",
- ":list_module",
- ":router_module",
- ":shared_style_module",
- ":shared_vars_module",
- ":toolbar_module",
+html_to_js("web_components") {
+ js_files = [
+ "app.js",
+ "command_manager.js",
+ "edit_dialog.js",
+ "folder_node.js",
+ "item.js",
+ "list.js",
+ "router.js",
+ "shared_style.js",
+ "shared_vars.js",
+ "toolbar.js",
]
}
-polymer_modulizer("app") {
- html_file = "app.html"
- js_file = "app.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("command_manager") {
- html_file = "command_manager.html"
- js_file = "command_manager.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("edit_dialog") {
- html_file = "edit_dialog.html"
- js_file = "edit_dialog.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("folder_node") {
- html_file = "folder_node.html"
- js_file = "folder_node.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("item") {
- html_file = "item.html"
- js_file = "item.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("list") {
- html_file = "list.html"
- js_file = "list.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("router") {
- html_file = "router.html"
- js_file = "router.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("shared_style") {
- html_file = "shared_style.html"
- js_file = "shared_style.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("shared_vars") {
- html_file = "shared_vars.html"
- js_file = "shared_vars.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("toolbar") {
- html_file = "toolbar.html"
- js_file = "toolbar.js"
- html_type = "v3-ready"
-}
-
js_type_check("closure_compile") {
is_polymer3 = true
deps = [
diff --git a/chromium/chrome/browser/resources/bookmarks/bookmarks_resources.grd b/chromium/chrome/browser/resources/bookmarks/bookmarks_resources.grd
index 9a94da5f26c..c7be35f2e8a 100644
--- a/chromium/chrome/browser/resources/bookmarks/bookmarks_resources.grd
+++ b/chromium/chrome/browser/resources/bookmarks/bookmarks_resources.grd
@@ -14,80 +14,95 @@
<includes>
<include name="IDR_BOOKMARKS_APP_JS"
file="${root_gen_dir}/chrome/browser/resources/bookmarks/app.js"
- use_base_dir="false" type ="BINDATA" preprocess="true" />
+ use_base_dir="false" compress="false" type="BINDATA" preprocess="true" />
<include name="IDR_BOOKMARKS_COMMAND_MANAGER_JS"
file="${root_gen_dir}/chrome/browser/resources/bookmarks/command_manager.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_BOOKMARKS_EDIT_DIALOG_JS"
file="${root_gen_dir}/chrome/browser/resources/bookmarks/edit_dialog.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_BOOKMARKS_FOLDER_NODE_JS"
file="${root_gen_dir}/chrome/browser/resources/bookmarks/folder_node.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_BOOKMARKS_ITEM_JS"
file="${root_gen_dir}/chrome/browser/resources/bookmarks/item.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_BOOKMARKS_LIST_JS"
file="${root_gen_dir}/chrome/browser/resources/bookmarks/list.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_BOOKMARKS_ROUTER_JS"
file="${root_gen_dir}/chrome/browser/resources/bookmarks/router.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_BOOKMARKS_SHARED_STYLE_JS"
file="${root_gen_dir}/chrome/browser/resources/bookmarks/shared_style.js"
- use_base_dir="false" type ="BINDATA" preprocess="true" />
+ use_base_dir="false" compress="false" type="BINDATA" preprocess="true" />
<include name="IDR_BOOKMARKS_SHARED_VARS_JS"
file="${root_gen_dir}/chrome/browser/resources/bookmarks/shared_vars.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_BOOKMARKS_TOOLBAR_JS"
file="${root_gen_dir}/chrome/browser/resources/bookmarks/toolbar.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
</includes>
<structures>
<structure name="IDR_BOOKMARKS_ACTIONS_JS"
file="actions.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_BOOKMARKS_API_LISTENER_JS"
file="api_listener.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_BOOKMARKS_BOOKMARKS_HTML"
file="bookmarks.html"
+ compress="false"
type="chrome_html" />
<structure name="IDR_BOOKMARKS_BOOKMARKS_JS"
file="bookmarks.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_BOOKMARKS_BROWSER_PROXY_JS"
file="browser_proxy.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_BOOKMARKS_CONSTANTS_JS"
file="constants.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_BOOKMARKS_DEBOUNCER_JS"
file="debouncer.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_BOOKMARKS_DIALOG_FOCUS_MANAGER_JS"
file="dialog_focus_manager.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_BOOKMARKS_DND_MANAGER_JS"
file="dnd_manager.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_BOOKMARKS_MOUSE_FOCUS_BEHAVIOR_JS"
file="mouse_focus_behavior.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_BOOKMARKS_REDUCERS_JS"
file="reducers.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_BOOKMARKS_STORE_CLIENT_JS"
file="store_client.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_BOOKMARKS_STORE_JS"
file="store.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_BOOKMARKS_TYPES_JS"
file="types.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_BOOKMARKS_UTIL_JS"
file="util.js"
+ compress="false"
type="chrome_html" />
</structures>
</release>
diff --git a/chromium/chrome/browser/resources/browser_switch/BUILD.gn b/chromium/chrome/browser/resources/browser_switch/BUILD.gn
index 6e61ba0d07a..7d4fd08f6f4 100644
--- a/chromium/chrome/browser/resources/browser_switch/BUILD.gn
+++ b/chromium/chrome/browser/resources/browser_switch/BUILD.gn
@@ -3,7 +3,7 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
js_type_check("closure_compile") {
is_polymer3 = true
@@ -26,8 +26,6 @@ js_library("browser_switch_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
}
-polymer_modulizer("app") {
- js_file = "app.js"
- html_file = "app.html"
- html_type = "v3-ready"
+html_to_js("web_components") {
+ js_files = [ "app.js" ]
}
diff --git a/chromium/chrome/browser/resources/cast/cast.html b/chromium/chrome/browser/resources/cast/cast.html
deleted file mode 100644
index 8247cee9ee7..00000000000
--- a/chromium/chrome/browser/resources/cast/cast.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<!DOCTYPE HTML>
-<html dir="$i18n{textdirection}" lang="$i18n{language}">
-<head>
- <meta charset="utf-8">
- <title>Google Cast</title>
- <script src="chrome://resources/js/load_time_data.js"></script>
- <script src="strings.js"></script>
- <script src="cast.js"></script>
-</head>
-<body>
-</body>
-</html>
diff --git a/chromium/chrome/browser/resources/cast/cast.js b/chromium/chrome/browser/resources/cast/cast.js
deleted file mode 100644
index 75a7afbf4f6..00000000000
--- a/chromium/chrome/browser/resources/cast/cast.js
+++ /dev/null
@@ -1,6 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-window.location = 'chrome-extension://' +
- loadTimeData.getString('extensionId') + '/cast_setup/index.html#offers';
diff --git a/chromium/chrome/browser/resources/certificate_viewer.html b/chromium/chrome/browser/resources/certificate_viewer.html
index efbb1fc5ba4..8d7d2e22a0e 100644
--- a/chromium/chrome/browser/resources/certificate_viewer.html
+++ b/chromium/chrome/browser/resources/certificate_viewer.html
@@ -9,6 +9,7 @@
<link rel="stylesheet" href="certificate_viewer.css">
<script src="chrome://resources/js/load_time_data.js"></script>
<script src="strings.js"></script>
+ <script src="chrome://resources/js/promise_resolver.js"></script>
<script src="chrome://resources/js/cr.js"></script>
<script src="chrome://resources/js/cr/ui.js"></script>
<script src="chrome://resources/js/cr/ui/focus_outline_manager.js"></script>
diff --git a/chromium/chrome/browser/resources/certificate_viewer.js b/chromium/chrome/browser/resources/certificate_viewer.js
index 4cbea5a739b..0d27d0c4243 100644
--- a/chromium/chrome/browser/resources/certificate_viewer.js
+++ b/chromium/chrome/browser/resources/certificate_viewer.js
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-cr.define('cert_viewer', function() {
+(function() {
'use strict';
/**
@@ -166,7 +166,8 @@ cr.define('cert_viewer', function() {
clearCertificateFields();
const item = $('hierarchy').selectedItem;
if (item && item.detail.payload.index !== undefined) {
- chrome.send('requestCertificateFields', [item.detail.payload.index]);
+ cr.sendWithPromise('requestCertificateFields', item.detail.payload.index)
+ .then(onCertificateFields);
}
}
@@ -175,7 +176,7 @@ cr.define('cert_viewer', function() {
* @param {Object} certFields A dictionary containing the fields tree
* structure.
*/
- function getCertificateFields(certFields) {
+ function onCertificateFields(certFields) {
clearCertificateFields();
const treeItem = $('cert-fields');
treeItem.add(
@@ -183,6 +184,8 @@ cr.define('cert_viewer', function() {
revealTree(treeItem);
// Ensure the list is scrolled to the top by selecting the first item.
treeItem.children[0].selected = true;
+ document.body.dispatchEvent(
+ new CustomEvent('certificate-fields-updated-for-tesing'));
}
/**
@@ -207,10 +210,5 @@ cr.define('cert_viewer', function() {
}
}
- return {
- initialize: initialize,
- getCertificateFields: getCertificateFields,
- };
-});
-
-document.addEventListener('DOMContentLoaded', cert_viewer.initialize);
+ document.addEventListener('DOMContentLoaded', initialize);
+})();
diff --git a/chromium/chrome/browser/resources/chrome_urls_disabled_page/app.html b/chromium/chrome/browser/resources/chrome_urls_disabled_page/app.html
index df789944c83..848d6429806 100644
--- a/chromium/chrome/browser/resources/chrome_urls_disabled_page/app.html
+++ b/chromium/chrome/browser/resources/chrome_urls_disabled_page/app.html
@@ -1,20 +1,62 @@
<!doctype html>
<html dir="$i18n{textdirection}" lang="$i18n{language}">
-<head>
-<meta charset="utf-8">
-<meta name="viewport"
+ <head>
+ <meta charset="utf-8">
+ <meta name="viewport"
content="initial-scale=1, minimum-scale=1,width=device-width">
-<title>$i18n{disabledPageTitle}</title>
-<link rel="stylesheet" href="chrome://resources/css/text_defaults.css">
-</head>
-<body id="chrome-urls-disabled-block">
- <div class ="frame-disabled">
- <div id="information-container">
- <div id="main-message">
- <h1 id="disabled-page-header">$i18n{disabledPageHeader}</h1>
- <p id="disabled-message"> $i18n{disabledPageMessage}</p>
+ <title>$i18n{disabledPageHeader}</title>
+ <link rel="import" href="chrome://resources/html/polymer.html">
+ <link rel="import" href="chrome://resources/cr_elements/icons.html">
+ <link rel="import" href="chrome://resources/html/i18n_behavior.html">
+ <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
+ <style>
+ body {
+ --header-color: #202124;
+ --paragraph-color: #5f6368;
+ --iron-icon-width: 40px;
+ --iron-icon-height: 40px;
+ font-family: sans-serif;
+ padding: 24px 24px 20px 24px;
+ }
+
+ h1 {
+ color: var(--header-color);
+ font-size: 30px;
+ font-weight: normal;
+ margin-bottom: 16px;
+ }
+
+ p {
+ color: var(--paragraph-color);
+ font-size: 20px;
+ }
+
+ .frame-disabled {
+ margin: 100px auto 0;
+ text-align: center;
+ }
+
+ .information-container {
+ display: inline-block;
+ font-size: 125%;
+ letter-spacing: -0.35px;
+ text-align: start;
+ }
+
+ #main-message {
+ margin-top: 36px;
+ }
+ </style>
+ </head>
+ <body id="chrome-urls-disabled-block">
+ <div class="frame-disabled">
+ <div class="information-container">
+ <iron-icon icon="cr:domain" size="24"></iron-icon>
+ <div id="main-message">
+ <h1 id="disabled-page-header">$i18n{disabledPageTitle}</h1>
+ <p id="disabled-message"> $i18n{disabledPageMessage}</p>
+ </div>
</div>
</div>
- </div>
-</body>
+ </body>
</html>
diff --git a/chromium/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn b/chromium/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
index 72c226e7b04..7d16612e2df 100644
--- a/chromium/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
+++ b/chromium/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
@@ -21,11 +21,13 @@ closure_library_dir =
# List of all modules that are included in one or more of the production
# chromevox scripts.
chromevox_modules = [
+ "../common/automation_predicate.js",
+ "../common/automation_util.js",
+ "../common/constants.js",
+ "../common/tree_walker.js",
"background/annotation/node_identifier.js",
"background/annotation/user_annotation_handler.js",
"background/automation_object_constructor_installer.js",
- "../common/automation_predicate.js",
- "../common/automation_util.js",
"background/background.js",
"background/base_automation_handler.js",
"background/braille_background.js",
@@ -36,7 +38,6 @@ chromevox_modules = [
"background/classic_background.js",
"background/color.js",
"background/command_handler.js",
- "../common/constants.js",
"background/cursors.js",
"background/custom_automation_event.js",
"background/desktop_automation_handler.js",
@@ -51,9 +52,8 @@ chromevox_modules = [
"background/injected_script_loader.js",
"background/keyboard_handler.js",
"background/keymaps/key_map.js",
- "background/locale_output_helper.js",
- "learn_mode/kbexplorer.js",
"background/live_regions.js",
+ "background/locale_output_helper.js",
"background/logging/event_stream_logger.js",
"background/logging/log.js",
"background/logging/log_store.js",
@@ -71,8 +71,8 @@ chromevox_modules = [
"background/prefs.js",
"background/range_automation_handler.js",
"background/recovery_strategy.js",
+ "background/smart_sticky_mode.js",
"background/tabs_api_handler.js",
- "../common/tree_walker.js",
"braille/bluetooth_braille_display_manager.js",
"braille/bluetooth_braille_display_ui.js",
"braille/braille_display_manager.js",
@@ -108,6 +108,7 @@ chromevox_modules = [
"injected/api_implementation.js",
"injected/loader.js",
"injected/script_installer.js",
+ "learn_mode/kbexplorer.js",
"options/options.js",
"panel/annotations_ui.js",
"panel/i_search.js",
@@ -139,6 +140,7 @@ chromevox_out_dir = "$root_out_dir/resources/chromeos/accessibility/chromevox"
group("build") {
deps = [
":chromevox_copied_files",
+ ":chromevox_phonetic_dictionaries_js",
"//chrome/browser/resources/chromeos/accessibility/braille_ime:braille_ime_manifest",
"//third_party/chromevox:chromevox_third_party_resources",
"//third_party/liblouis",
@@ -251,6 +253,20 @@ template("generate_deps_js") {
}
}
+action("chromevox_phonetic_dictionaries_js") {
+ script = "tools/phonetic_dictionaries.py"
+ src_dir = [ "$root_out_dir/resources/chromeos/accessibility/_locales" ]
+ output_file = "$chromevox_out_dir/phonetic_dictionaries.js"
+ outputs = [ output_file ]
+ deps = [
+ "//chrome/browser/resources/chromeos/accessibility:accessibility_strings",
+ ]
+ args = [
+ "-o",
+ rebase_path(output_file, root_build_dir),
+ ] + rebase_path(src_dir, root_build_dir)
+}
+
if (chromevox_compress_js) {
template("compress_js") {
run_jsbundler(target_name) {
@@ -398,7 +414,9 @@ if (is_chromeos) {
"background/locale_output_helper_test.js",
"background/logging/log_store_test.js",
"background/output_test.js",
+ "background/portals_test.js",
"background/recovery_strategy_test.js",
+ "background/smart_sticky_mode_test.js",
"braille/braille_table_test.js",
"braille/braille_translator_manager_test.js",
"braille/liblouis_test.js",
diff --git a/chromium/chrome/browser/resources/chromeos/accessibility/common/BUILD.gn b/chromium/chrome/browser/resources/chromeos/accessibility/common/BUILD.gn
index bfdf5800371..8f6bb71d6e2 100644
--- a/chromium/chrome/browser/resources/chromeos/accessibility/common/BUILD.gn
+++ b/chromium/chrome/browser/resources/chromeos/accessibility/common/BUILD.gn
@@ -9,6 +9,7 @@ import("//chrome/common/features.gni")
import("//chrome/test/base/js2gtest.gni")
import("//testing/test.gni")
import("//third_party/closure_compiler/compile_js.gni")
+import("//third_party/closure_compiler/js_unit_tests.gni")
assert(is_chromeos || is_chromecast)
@@ -23,6 +24,7 @@ run_jsbundler("accessibility_common_copied_files") {
mode = "copy"
dest_dir = accessibility_common_out_dir
sources = [
+ "array_util.js",
"automation_predicate.js",
"automation_util.js",
"closure_shim.js",
@@ -44,6 +46,10 @@ js_library("tree_walker") {
]
}
+js_library("array_util") {
+ sources = [ "array_util.js" ]
+}
+
js_library("automation_predicate") {
sources = [ "automation_predicate.js" ]
deps = [ ":constants" ]
@@ -100,6 +106,7 @@ source_set("browser_tests") {
js2gtest("accessibility_tests") {
test_type = "extension"
sources = [
+ "array_util_test.js",
"automation_util_test.js",
"tree_walker_test.js",
]
@@ -109,6 +116,7 @@ js2gtest("accessibility_tests") {
"../chromevox/testing/chromevox_e2e_test_base.js",
"../chromevox/testing/chromevox_next_e2e_test_base.js",
"../chromevox/testing/mock_feedback.js",
+ "array_util.js",
]
if (is_chromeos) {
diff --git a/chromium/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp b/chromium/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp
index c47fc91cede..75c816257cb 100644
--- a/chromium/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp
+++ b/chromium/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp
@@ -430,6 +430,12 @@
<message desc="Describes a HTML radio button named 'name' in the unselected state." name="IDS_CHROMEVOX_DESCRIBE_RADIO_UNSELECTED">
<ph name="name">$1</ph>, radio button unselected
</message>
+ <message desc="Describes a HTML menu item radio button named 'name' in the selected state." name="IDS_CHROMEVOX_DESCRIBE_MENU_ITEM_RADIO_SELECTED">
+ <ph name="name">$1</ph>, menu item radio button selected
+ </message>
+ <message desc="Describes a HTML menu item radio button named 'name' in the unselected state." name="IDS_CHROMEVOX_DESCRIBE_MENU_ITEM_RADIO_UNSELECTED">
+ <ph name="name">$1</ph>, menu item radio button unselected
+ </message>
<message desc="Describes a window named 'name'." name="IDS_CHROMEVOX_DESCRIBE_WINDOW">
<ph name="name">$1</ph>, window
</message>
@@ -1492,6 +1498,15 @@
<message desc="Describes columns within tables on the web." name="IDS_CHROMEVOX_ROLE_COLUMN_BRL">
col
</message>
+ <message desc="A message spoken when the user switches to the form field control granularity, which allows users to navigate the page one form field control at a time." name="IDS_CHROMEVOX_FORM_FIELD_CONTROL_GRANULARITY">
+ Form field control
+ </message>
+ <message desc="A message spoken when the user switches to the link granularity, which allows users to navigate the page one link at a time." name="IDS_CHROMEVOX_LINK_GRANULARITY">
+ Link
+ </message>
+ <message desc="A message spoken when the user switches to the heading granularity, which allows users to navigate the page one heading at a time." name="IDS_CHROMEVOX_HEADING_GRANULARITY">
+ Heading
+ </message>
<message desc="A message spoken when the user switches to the line granularity, which allows users to navigate the page one line at a time." name="IDS_CHROMEVOX_LINE_GRANULARITY">
Line
</message>
@@ -1504,6 +1519,9 @@
<message desc="Spoken when the search widget first shows." name="IDS_CHROMEVOX_SEARCH_WIDGET_INTRO">
Find in page
</message>
+ <message desc="Instructions on how to use the ChromeVox find in page text input." name="IDS_CHROMEVOX_SEARCH_WIDGET_DESCRIPTION">
+ Type to search the page. Press enter to jump to the result, up or down arrows to browse results, keep typing to change your search, or escape to cancel.
+ </message>
<message desc="Category displayed in the options page under keyboard commands." name="IDS_CHROMEVOX_MODIFIER_KEYS">
Modifier Keys
</message>
@@ -2287,15 +2305,6 @@
<message desc="Hint for how to start editing a text field while exploring the screen using touch exploration." name="IDS_CHROMEVOX_HINT_DOUBLE_TAP_TO_EDIT">
Double tap to start editing
</message>
- <message desc="Describes a gesture to be performed on a touch screen." name="IDS_CHROMEVOX_TAP2_GESTURE">
- Tap with two fingers
- </message>
- <message desc="Describes a gesture to be performed on a touch screen." name="IDS_CHROMEVOX_TAP4_GESTURE">
- Tap with four fingers
- </message>
- <message desc="Describes a gesture to be performed on a touch screen." name="IDS_CHROMEVOX_CLICK_GESTURE">
- Double tap with one finger
- </message>
<message desc="Describes Learn Mode when the mode is initially entered." name="IDS_CHROMEVOX_LEARN_MODE_INTRO">
Starting Learn Mode. Press a qwerty key, refreshable braille key, or touch gesture to learn its function. Press control with w or escape to exit.
</message>
@@ -2879,9 +2888,12 @@
<message desc="Used to describe capital letters" name="IDS_CHROMEVOX_ANNOUNCE_CAPITAL_LETTER">
Cap <ph name="letter">$1<ex>A</ex></ph>
</message>
- <message desc="The hint text and label for the search bar in the ChromeVox menus" name="IDS_CHROMEVOX_SEARCH_CHROMEVOX_MENUS">
+ <message desc="The placeholder text for the search bar in the ChromeVox menus" name="IDS_CHROMEVOX_SEARCH_CHROMEVOX_MENUS_PLACEHOLDER">
Search the menus
</message>
+ <message desc="The aria-description text for the search bar in the ChromeVox menus" name="IDS_CHROMEVOX_SEARCH_CHROMEVOX_MENUS_DESCRIPTION">
+ Type to search the menus. Use the up and down arrows to cycle through results. Use the left and right arrows to adjust the text caret, and to move between menus.
+ </message>
<message desc="Title displayed in the panel for the search menu." name="IDS_CHROMEVOX_PANEL_SEARCH_MENU">
Search
</message>
@@ -2912,5 +2924,56 @@
<message desc="Announced to alert the user that ChromeVox has no current focus." name="IDS_CHROMEVOX_NO_FOCUS">
No current ChromeVox focus. Press Alt+Shift+L to go to the launcher.
</message>
+ <message desc="Announced to alert the user that ChromeVox has no current focus when using a touch screen." name="IDS_CHROMEVOX_NO_FOCUS_TOUCH">
+ No current ChromeVox focus. Touch explore to find items.
+ </message>
+ <message desc="Labels the checkbox on the options page that enables or disables Smart Sticky Mode. The label explains how the feature works." name="IDS_CHROMEVOX_OPTIONS_SMART_STICKY_MODE">
+ Turn off sticky mode when editing text (Smart Sticky Mode)
+ </message>
+ <message desc="Describes a gesture to be performed on a touch screen." name="IDS_CHROMEVOX_SWIPEUP1_GESTURE">
+ Swipe one finger up
+ </message>
+ <message desc="Describes a gesture to be performed on a touch screen." name="IDS_CHROMEVOX_SWIPEDOWN1_GESTURE">
+ Swipe one finger down
+ </message>
+ <message desc="Describes a gesture to be performed on a touch screen." name="IDS_CHROMEVOX_SWIPELEFT1_GESTURE">
+ Swipe one finger left
+ </message>
+ <message desc="Describes a gesture to be performed on a touch screen." name="IDS_CHROMEVOX_SWIPERIGHT1_GESTURE">
+ Swipe one finger right
+ </message>
+ <message desc="Describes a gesture to be performed on a touch screen." name="IDS_CHROMEVOX_SWIPEUP2_GESTURE">
+ Swipe two fingers up
+ </message>
+ <message desc="Describes a gesture to be performed on a touch screen." name="IDS_CHROMEVOX_SWIPEDOWN2_GESTURE">
+ Swipe two fingers down
+ </message>
+ <message desc="Describes a gesture to be performed on a touch screen." name="IDS_CHROMEVOX_SWIPELEFT2_GESTURE">
+ Swipe two fingers left
+ </message>
+ <message desc="Describes a gesture to be performed on a touch screen." name="IDS_CHROMEVOX_SWIPERIGHT2_GESTURE">
+ Swipe two fingers right
+ </message>
+ <message desc="Describes a gesture to be performed on a touch screen." name="IDS_CHROMEVOX_SWIPEUP3_GESTURE">
+ Swipe three fingers up
+ </message>
+ <message desc="Describes a gesture to be performed on a touch screen." name="IDS_CHROMEVOX_SWIPEDOWN3_GESTURE">
+ Swipe three fingers down
+ </message>
+ <message desc="Describes a gesture to be performed on a touch screen." name="IDS_CHROMEVOX_SWIPELEFT3_GESTURE">
+ Swipe three fingers left
+ </message>
+ <message desc="Describes a gesture to be performed on a touch screen." name="IDS_CHROMEVOX_SWIPERIGHT3_GESTURE">
+ Swipe three fingers right
+ </message>
+ <message desc="Describes a gesture to be performed on a touch screen." name="IDS_CHROMEVOX_TAP2_GESTURE">
+ Tap with two fingers
+ </message>
+ <message desc="Describes a gesture to be performed on a touch screen." name="IDS_CHROMEVOX_TAP4_GESTURE">
+ Tap with four fingers
+ </message>
+ <message desc="Describes a gesture to be performed on a touch screen." name="IDS_CHROMEVOX_CLICK_GESTURE">
+ Double tap with one finger
+ </message>
</grit-part>
diff --git a/chromium/chrome/browser/resources/chromeos/accessibility/switch_access/BUILD.gn b/chromium/chrome/browser/resources/chromeos/accessibility/switch_access/BUILD.gn
index 2ee94a9bb36..b930b96e57d 100644
--- a/chromium/chrome/browser/resources/chromeos/accessibility/switch_access/BUILD.gn
+++ b/chromium/chrome/browser/resources/chromeos/accessibility/switch_access/BUILD.gn
@@ -30,6 +30,7 @@ run_jsbundler("switch_access_copied_files") {
"commands.js",
"event_helper.js",
"focus_ring_manager.js",
+ "history.js",
"icons/back.svg",
"icons/copy.svg",
"icons/cut.svg",
@@ -138,6 +139,7 @@ js_type_check("closure_compile") {
":event_helper",
":focus_ring_manager",
":group_node",
+ ":history",
":keyboard_node",
":menu_manager",
":menu_panel",
@@ -233,6 +235,16 @@ js_library("group_node") {
]
}
+js_library("history") {
+ deps = [
+ ":desktop_node",
+ ":node_wrapper",
+ ":switch_access_node",
+ ":switch_access_predicate",
+ ]
+ externs_list = [ "$externs_path/automation.js" ]
+}
+
js_library("keyboard_node") {
sources = [ "nodes/keyboard_node.js" ]
deps = [
diff --git a/chromium/chrome/browser/resources/chromeos/camera/BUILD.gn b/chromium/chrome/browser/resources/chromeos/camera/BUILD.gn
index af8c9e69867..2c90301b56a 100644
--- a/chromium/chrome/browser/resources/chromeos/camera/BUILD.gn
+++ b/chromium/chrome/browser/resources/chromeos/camera/BUILD.gn
@@ -78,10 +78,6 @@ copy("chrome_camera_app_images") {
"src/images/camera_shutter_photo_start_hover.svg",
"src/images/camera_shutter_photo_stop.svg",
"src/images/camera_shutter_photo_stop_hover.svg",
- "src/images/camera_shutter_video_start.svg",
- "src/images/camera_shutter_video_start_hover.svg",
- "src/images/camera_shutter_video_stop.svg",
- "src/images/camera_shutter_video_stop_hover.svg",
"src/images/settings_button_back.svg",
"src/images/settings_button_expand.svg",
"src/images/settings_feedback.svg",
@@ -100,6 +96,7 @@ copy("chrome_camera_app_js") {
"src/js/background.js",
"src/js/background_ops.js",
"src/js/chrome_util.js",
+ "src/js/error.js",
"src/js/gallerybutton.js",
"src/js/intent.js",
"src/js/main.js",
@@ -140,8 +137,10 @@ copy("chrome_camera_app_js_device") {
copy("chrome_camera_app_js_lib") {
sources = [
+ "src/js/lib/analytics.js",
"src/js/lib/comlink.js",
- "src/js/lib/google-analytics-bundle.js",
+ "src/js/lib/ffmpeg.js",
+ "src/js/lib/ffmpeg.wasm",
]
outputs = [ "$chrome_camera_app_dir/js/lib/{{source_file_part}}" ]
@@ -152,9 +151,11 @@ copy("chrome_camera_app_js_models") {
"src/js/models/async_writer.js",
"src/js/models/filenamer.js",
"src/js/models/filesystem.js",
+ "src/js/models/mp4_video_processor.js",
+ "src/js/models/nop_video_processor.js",
"src/js/models/result_saver.js",
- "src/js/models/video_processor.js",
"src/js/models/video_saver.js",
+ "src/js/models/waitable_event.js",
]
outputs = [ "$chrome_camera_app_dir/js/models/{{source_file_part}}" ]
diff --git a/chromium/chrome/browser/resources/chromeos/camera/camera_resources.grd b/chromium/chrome/browser/resources/chromeos/camera/camera_resources.grd
index eacbf35d140..ab78c3f7507 100644
--- a/chromium/chrome/browser/resources/chromeos/camera/camera_resources.grd
+++ b/chromium/chrome/browser/resources/chromeos/camera/camera_resources.grd
@@ -12,21 +12,22 @@
</outputs>
<release seq="1">
<structures>
+ <structure name="IDR_CAMERA_ANALYTICS_JS" file="src/js/lib/analytics.js" type="chrome_html" />
<structure name="IDR_CAMERA_ASYNC_WRITER_JS" file="src/js/models/async_writer.js" type="chrome_html" />
<structure name="IDR_CAMERA_BACKGROUND_JS" file="src/js/background.js" type="chrome_html" />
- <structure name="IDR_CAMERA_BUNDLE_JS" file="src/js/lib/google-analytics-bundle.js" type="chrome_html" />
+ <structure name="IDR_CAMERA_BACKGROUND_OPS_JS" file="src/js/background_ops.js" type="chrome_html" />
<structure name="IDR_CAMERA_CAMERA3_DEVICE_INFO_JS" file="src/js/device/camera3_device_info.js" type="chrome_html" />
- <structure name="IDR_CAMERA_CAMERA_JS" file="src/js/views/camera.js" type="chrome_html" />
<structure name="IDR_CAMERA_CAMERA_INTENT_JS" file="src/js/views/camera_intent.js" type="chrome_html" />
- <structure name="IDR_CAMERA_COMLINK_JS" file="src/js/lib/comlink.js" type="chrome_html" />
- <structure name="IDR_CAMERA_CONSTRAINTS_PREFERRER_JS" file="src/js/device/constraints_preferrer.js" type="chrome_html" />
+ <structure name="IDR_CAMERA_CAMERA_JS" file="src/js/views/camera.js" type="chrome_html" />
<structure name="IDR_CAMERA_CHROME_HELPER_JS" file="src/js/mojo/chrome_helper.js" type="chrome_html" />
<structure name="IDR_CAMERA_CHROME_UTIL_JS" file="src/js/chrome_util.js" type="chrome_html" />
- <structure name="IDR_CAMERA_BACKGROUND_OPS_JS" file="src/js/background_ops.js" type="chrome_html" />
- <structure name="IDR_CAMERA_DEVICE_OPERATOR_JS" file="src/js/mojo/device_operator.js" type="chrome_html" />
+ <structure name="IDR_CAMERA_COMLINK_JS" file="src/js/lib/comlink.js" type="chrome_html" />
+ <structure name="IDR_CAMERA_CONSTRAINTS_PREFERRER_JS" file="src/js/device/constraints_preferrer.js" type="chrome_html" />
+ <structure name="IDR_CAMERA_DEVICE_ERROR_JS" file="src/js/device/error.js" type="chrome_html" />
<structure name="IDR_CAMERA_DEVICE_INFO_UPDATER_JS" file="src/js/device/device_info_updater.js" type="chrome_html" />
+ <structure name="IDR_CAMERA_DEVICE_OPERATOR_JS" file="src/js/mojo/device_operator.js" type="chrome_html" />
<structure name="IDR_CAMERA_DIALOG_JS" file="src/js/views/dialog.js" type="chrome_html" />
- <structure name="IDR_CAMERA_ERROR_JS" file="src/js/device/error.js" type="chrome_html" />
+ <structure name="IDR_CAMERA_ERROR_JS" file="src/js/error.js" type="chrome_html" />
<structure name="IDR_CAMERA_FILENAMER_JS" file="src/js/models/filenamer.js" type="chrome_html" />
<structure name="IDR_CAMERA_FILESYSTEM_JS" file="src/js/models/filesystem.js" type="chrome_html" />
<structure name="IDR_CAMERA_GALLERYBUTTON_JS" file="src/js/gallerybutton.js" type="chrome_html" />
@@ -39,7 +40,9 @@
<structure name="IDR_CAMERA_MANIFEST" file="manifest.json" type="chrome_html" />
<structure name="IDR_CAMERA_METRICS_JS" file="src/js/metrics.js" type="chrome_html" />
<structure name="IDR_CAMERA_MODES_JS" file="src/js/views/camera/modes.js" type="chrome_html" />
+ <structure name="IDR_CAMERA_MP4_VIDEO_PROCESSOR_JS" file="src/js/models/mp4_video_processor.js" type="chrome_html" />
<structure name="IDR_CAMERA_NAV_JS" file="src/js/nav.js" type="chrome_html" />
+ <structure name="IDR_CAMERA_NOP_VIDEO_PROCESSOR_JS" file="src/js/models/nop_video_processor.js" type="chrome_html" />
<structure name="IDR_CAMERA_OPTIONS_JS" file="src/js/views/camera/options.js" type="chrome_html" />
<structure name="IDR_CAMERA_PERF_JS" file="src/js/perf.js" type="chrome_html" />
<structure name="IDR_CAMERA_PREVIEW_JS" file="src/js/views/camera/preview.js" type="chrome_html" />
@@ -55,8 +58,8 @@
<structure name="IDR_CAMERA_TYPE_JS" file="src/js/type.js" type="chrome_html" />
<structure name="IDR_CAMERA_UTIL_JS" file="src/js/util.js" type="chrome_html" />
<structure name="IDR_CAMERA_VIDEO_SAVER_JS" file="src/js/models/video_saver.js" type="chrome_html" />
- <structure name="IDR_CAMERA_VIDEO_PROCESSOR_JS" file="src/js/models/video_processor.js" type="chrome_html" />
<structure name="IDR_CAMERA_VIEW_JS" file="src/js/views/view.js" type="chrome_html" />
+ <structure name="IDR_CAMERA_WAITABLE_EVENT_JS" file="src/js/models/waitable_event.js" type="chrome_html" />
<structure name="IDR_CAMERA_WARNING_JS" file="src/js/views/warning.js" type="chrome_html" />
<structure name="IDR_CAMERA_WEBUI_BROWSER_PROXY" file="src/js/browser_proxy/webui_browser_proxy.js" type="chrome_html" />
</structures>
@@ -87,6 +90,8 @@
use_base_dir="false"
type="BINDATA"/>
+ <!-- TODO(crbug.com/980846): Add FFMpeg library here with comrpession enabled once video recording is ready to test in SWA -->
+
<include name="IDR_CAMERA_RECORD_END_OGG" file="src/sounds/record_end.ogg" type="BINDATA" />
<include name="IDR_CAMERA_RECORD_START_OGG" file="src/sounds/record_start.ogg" type="BINDATA" />
<include name="IDR_CAMERA_SHUTTER_OGG" file="src/sounds/shutter.ogg" type="BINDATA" />
@@ -97,19 +102,18 @@
<include name="IDR_CAMERA_SETTINGS_BUTTON_BACK_SVG" file="src/images/settings_button_back.svg" type="BINDATA" />
<include name="IDR_CAMERA_CAMERA_MODE_PORTRAIT_SVG" file="src/images/camera_mode_portrait.svg" type="BINDATA" />
<include name="IDR_CAMERA_CAMERA_BUTTON_TIMER_ON_3S_SVG" file="src/images/camera_button_timer_on_3s.svg" type="BINDATA" />
- <include name="IDR_CAMERA_CAMERA_SHUTTER_VIDEO_START_HOVER_SVG" file="src/images/camera_shutter_video_start_hover.svg" type="BINDATA" />
<include name="IDR_CAMERA_SPINNER_SVG" file="src/images/spinner.svg" type="BINDATA" />
<include name="IDR_CAMERA_CAMERA_BUTTON_GRID_OFF_SVG" file="src/images/camera_button_grid_off.svg" type="BINDATA" />
<include name="IDR_CAMERA_CAMERA_BUTTON_MIC_ON_SVG" file="src/images/camera_button_mic_on.svg" type="BINDATA" />
<include name="IDR_CAMERA_CAMERA_MODE_VIDEO_SVG" file="src/images/camera_mode_video.svg" type="BINDATA" />
<include name="IDR_CAMERA_CAMERA_SHUTTER_PHOTO_STOP_SVG" file="src/images/camera_shutter_photo_stop.svg" type="BINDATA" />
<include name="IDR_CAMERA_CAMERA_BUTTON_MIC_OFF_SVG" file="src/images/camera_button_mic_off.svg" type="BINDATA" />
- <include name="IDR_CAMERA_CAMERA_SHUTTER_VIDEO_STOP_HOVER_SVG" file="src/images/camera_shutter_video_stop_hover.svg" type="BINDATA" />
<include name="IDR_CAMERA_SETTINGS_RESOLUTION_SVG" file="src/images/settings_resolution.svg" type="BINDATA" />
<include name="IDR_CAMERA_CAMERA_APP_ICONS_48_PNG" file="src/images/camera_app_icons_48.png" type="BINDATA" />
<include name="IDR_CAMERA_CAMERA_BUTTON_TIMER_OFF_SVG" file="src/images/camera_button_timer_off.svg" type="BINDATA" />
<include name="IDR_CAMERA_CAMERA_SHUTTER_PHOTO_START_ACTIVE_SVG" file="src/images/camera_shutter_photo_start_active.svg" type="BINDATA" />
<include name="IDR_CAMERA_CAMERA_APP_ICONS_128_PNG" file="src/images/camera_app_icons_128.png" type="BINDATA" />
+ <include name="IDR_CAMERA_CAMERA_APP_ICONS_192_PNG" file="src/images/camera_app_icons_192.png" type="BINDATA" />
<include name="IDR_CAMERA_SETTINGS_TIMER_DURATION_SVG" file="src/images/settings_timer_duration.svg" type="BINDATA" />
<include name="IDR_CAMERA_SETTINGS_HELP_SVG" file="src/images/settings_help.svg" type="BINDATA" />
<include name="IDR_CAMERA_CAMERA_BUTTON_MIRROR_ON_SVG" file="src/images/camera_button_mirror_on.svg" type="BINDATA" />
@@ -120,13 +124,11 @@
<include name="IDR_CAMERA_SETTINGS_GRID_TYPE_SVG" file="src/images/settings_grid_type.svg" type="BINDATA" />
<include name="IDR_CAMERA_CAMERA_BUTTON_MIRROR_OFF_SVG" file="src/images/camera_button_mirror_off.svg" type="BINDATA" />
<include name="IDR_CAMERA_CAMERA_SHUTTER_PHOTO_START_SVG" file="src/images/camera_shutter_photo_start.svg" type="BINDATA" />
- <include name="IDR_CAMERA_CAMERA_SHUTTER_VIDEO_STOP_SVG" file="src/images/camera_shutter_video_stop.svg" type="BINDATA" />
<include name="IDR_CAMERA_CAMERA_BUTTON_SWITCH_PHOTO_SVG" file="src/images/camera_button_switch_photo.svg" type="BINDATA" />
<include name="IDR_CAMERA_SETTINGS_FEEDBACK_SVG" file="src/images/settings_feedback.svg" type="BINDATA" />
<include name="IDR_CAMERA_CAMERA_BUTTON_SWITCH_VIDEO_SVG" file="src/images/camera_button_switch_video.svg" type="BINDATA" />
<include name="IDR_CAMERA_CAMERA_SHUTTER_PHOTO_START_HOVER_SVG" file="src/images/camera_shutter_photo_start_hover.svg" type="BINDATA" />
<include name="IDR_CAMERA_CAMERA_BUTTON_TIMER_ON_10S_SVG" file="src/images/camera_button_timer_on_10s.svg" type="BINDATA" />
- <include name="IDR_CAMERA_CAMERA_SHUTTER_VIDEO_START_SVG" file="src/images/camera_shutter_video_start.svg" type="BINDATA" />
<include name="IDR_CAMERA_CAMERA_MODE_PHOTO_SVG" file="src/images/camera_mode_photo.svg" type="BINDATA" />
<include name="IDR_CAMERA_CAMERA_FOCUS_AIM_SVG" file="src/images/camera_focus_aim.svg" type="BINDATA" />
<include name="IDR_CAMERA_CAMERA_BUTTON_SETTINGS_SVG" file="src/images/camera_button_settings.svg" type="BINDATA" />
diff --git a/chromium/chrome/browser/resources/chromeos/camera/src/js/BUILD.gn b/chromium/chrome/browser/resources/chromeos/camera/src/js/BUILD.gn
index eaf9be78d83..4e76d7e52c3 100644
--- a/chromium/chrome/browser/resources/chromeos/camera/src/js/BUILD.gn
+++ b/chromium/chrome/browser/resources/chromeos/camera/src/js/BUILD.gn
@@ -20,6 +20,7 @@ js_type_check("compile_resources") {
":background",
":background_ops",
":chrome_util",
+ ":error",
":gallerybutton",
":intent",
":main",
@@ -38,6 +39,10 @@ js_type_check("compile_resources") {
js_library("chrome_util") {
}
+js_library("error") {
+ deps = [ ":metrics" ]
+}
+
js_library("intent") {
deps = [
":chrome_util",
@@ -63,7 +68,7 @@ js_library("gallerybutton") {
js_library("metrics") {
deps = [
":state",
- "externs:chrome_platform_analytics",
+ "externs:universal_analytics_api",
]
}
@@ -105,7 +110,6 @@ js_library("state") {
deps = [
":perf",
":type",
- "views:view",
]
}
@@ -119,6 +123,7 @@ js_library("background") {
js_library("background_ops") {
deps = [
":chrome_util",
+ ":error",
":intent",
":perf",
]
@@ -134,10 +139,11 @@ js_library("tooltip") {
js_library("util") {
deps = [
+ ":state",
":tooltip",
":type",
"browser_proxy:browser_proxy",
- "externs:w3c_fileapi",
+ "externs:w3c_api",
"mojo:chrome_helper",
]
externs_list = [ "$externs_path/chrome_extensions.js" ]
diff --git a/chromium/chrome/browser/resources/chromeos/camera/src/js/externs/BUILD.gn b/chromium/chrome/browser/resources/chromeos/camera/src/js/externs/BUILD.gn
index 7db53bae1d7..cae1c53cb2d 100644
--- a/chromium/chrome/browser/resources/chromeos/camera/src/js/externs/BUILD.gn
+++ b/chromium/chrome/browser/resources/chromeos/camera/src/js/externs/BUILD.gn
@@ -4,14 +4,14 @@
import("//third_party/closure_compiler/compile_js.gni")
-js_library("chrome_platform_analytics") {
+js_library("universal_analytics_api") {
sources = []
- externs_list = [ "chrome_platform_analytics.js" ]
+ externs_list = [ "universal_analytics_api.js" ]
}
-js_library("w3c_fileapi") {
+js_library("w3c_api") {
sources = []
- externs_list = [ "w3c_fileapi.js" ]
+ externs_list = [ "w3c_api.js" ]
}
diff --git a/chromium/chrome/browser/resources/chromeos/camera/src/js/lib/BUILD.gn b/chromium/chrome/browser/resources/chromeos/camera/src/js/lib/BUILD.gn
index b9241fdf28c..67207741560 100644
--- a/chromium/chrome/browser/resources/chromeos/camera/src/js/lib/BUILD.gn
+++ b/chromium/chrome/browser/resources/chromeos/camera/src/js/lib/BUILD.gn
@@ -7,3 +7,7 @@ import("//third_party/closure_compiler/compile_js.gni")
js_library("comlink") {
sources = [ "comlink.js" ]
}
+
+js_library("ffmpeg") {
+ sources = [ "ffmpeg.js" ]
+}
diff --git a/chromium/chrome/browser/resources/chromeos/camera/src/js/models/BUILD.gn b/chromium/chrome/browser/resources/chromeos/camera/src/js/models/BUILD.gn
index ec38d8a722b..e2c787dd54f 100644
--- a/chromium/chrome/browser/resources/chromeos/camera/src/js/models/BUILD.gn
+++ b/chromium/chrome/browser/resources/chromeos/camera/src/js/models/BUILD.gn
@@ -29,12 +29,15 @@ js_library("result_saver") {
js_library("video_saver") {
sources = [
"async_writer.js",
- "video_processor.js",
+ "mp4_video_processor.js",
+ "nop_video_processor.js",
"video_saver.js",
+ "waitable_event.js",
]
deps = [
"..:intent",
- "../externs:w3c_fileapi",
+ "../externs:w3c_api",
"../lib:comlink",
+ "../lib:ffmpeg",
]
}
diff --git a/chromium/chrome/browser/resources/chromeos/camera/src/js/views/BUILD.gn b/chromium/chrome/browser/resources/chromeos/camera/src/js/views/BUILD.gn
index 59804f3efa5..6cfbb72e337 100644
--- a/chromium/chrome/browser/resources/chromeos/camera/src/js/views/BUILD.gn
+++ b/chromium/chrome/browser/resources/chromeos/camera/src/js/views/BUILD.gn
@@ -61,8 +61,6 @@ js_library("settings") {
js_library("view") {
deps = [ "..:toast" ]
-
- externs_list = [ "../externs/chrome.js" ]
}
js_library("warning") {
diff --git a/chromium/chrome/browser/resources/chromeos/edu_login/BUILD.gn b/chromium/chrome/browser/resources/chromeos/edu_login/BUILD.gn
index 7f88acdfd7b..842582276e7 100644
--- a/chromium/chrome/browser/resources/chromeos/edu_login/BUILD.gn
+++ b/chromium/chrome/browser/resources/chromeos/edu_login/BUILD.gn
@@ -16,24 +16,24 @@ js_type_check("closure_compile") {
":app",
":browser_proxy",
":edu_login_button",
+ ":edu_login_coexistence_info",
":edu_login_parent_info",
":edu_login_parent_signin",
":edu_login_parents",
":edu_login_signin",
":edu_login_template",
":edu_login_util",
- ":edu_login_welcome",
]
}
js_library("app") {
deps = [
+ ":edu_login_coexistence_info",
":edu_login_parent_info",
":edu_login_parent_signin",
":edu_login_parents",
":edu_login_signin",
":edu_login_util",
- ":edu_login_welcome",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_view_manager:cr_view_manager.m",
"//ui/webui/resources/js:assert.m",
@@ -67,12 +67,11 @@ js_library("browser_proxy") {
js_library("edu_login_util") {
}
-js_library("edu_login_welcome") {
+js_library("edu_login_coexistence_info") {
deps = [
":edu_login_button",
":edu_login_template",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/js:i18n_behavior.m",
]
}
@@ -145,12 +144,6 @@ polymer_modulizer("icons") {
html_type = "v3-ready"
}
-polymer_modulizer("edu_login_welcome") {
- js_file = "edu_login_welcome.js"
- html_file = "edu_login_welcome.html"
- html_type = "v3-ready"
-}
-
polymer_modulizer("edu_login_parents") {
js_file = "edu_login_parents.js"
html_file = "edu_login_parents.html"
@@ -169,6 +162,12 @@ polymer_modulizer("edu_login_parent_info") {
html_type = "v3-ready"
}
+polymer_modulizer("edu_login_coexistence_info") {
+ js_file = "edu_login_coexistence_info.js"
+ html_file = "edu_login_coexistence_info.html"
+ html_type = "v3-ready"
+}
+
polymer_modulizer("edu_login_signin") {
js_file = "edu_login_signin.js"
html_file = "edu_login_signin.html"
@@ -179,13 +178,13 @@ group("polymer3_elements") {
public_deps = [
":app_module",
":edu_login_button_module",
+ ":edu_login_coexistence_info_module",
":edu_login_css_module",
":edu_login_parent_info_module",
":edu_login_parent_signin_module",
":edu_login_parents_module",
":edu_login_signin_module",
":edu_login_template_module",
- ":edu_login_welcome_module",
":icons_module",
]
}
diff --git a/chromium/chrome/browser/resources/chromeos/login/BUILD.gn b/chromium/chrome/browser/resources/chromeos/login/BUILD.gn
index df3e3c5d5ac..c453524aa61 100644
--- a/chromium/chrome/browser/resources/chromeos/login/BUILD.gn
+++ b/chromium/chrome/browser/resources/chromeos/login/BUILD.gn
@@ -21,8 +21,6 @@ js_type_check("closure_compile") {
":gaia_input_form",
":gaia_password_changed",
":gesture_navigation",
- ":hd-iron-icon",
- ":html-echo",
":marketing_opt_in",
":multidevice_setup_first_run",
":navigation_bar",
@@ -31,12 +29,8 @@ js_type_check("closure_compile") {
":offline_ad_login",
":offline_gaia",
":oobe_a11y_option",
- ":oobe_buttons",
- ":oobe_dialog",
":oobe_enable_kiosk",
":oobe_eula",
- ":oobe_help_dialog",
- ":oobe_i18n_behavior",
":oobe_i18n_dropdown",
":oobe_network",
":oobe_reset",
@@ -55,51 +49,23 @@ js_type_check("closure_compile") {
###############################
# Closure compiler libraries below
-js_library("oobe_types") {
-}
-
-# This is special file to be used as a substutute of Oobe object for closure
-# compilation until we make real one closure compile.
-# TODO (https://crbug.com/950198)
-js_library("fake_oobe") {
- deps = [
- ":oobe_types",
- "//ui/login:display_manager_types",
- "//ui/webui/resources/js:util",
- ]
-}
-
-js_library("login_screen_behavior") {
- deps = [
- ":fake_oobe",
- "//ui/login:display_manager_types",
- ]
-}
-
-js_library("oobe_i18n_behavior") {
- deps = [ "//ui/webui/resources/js:i18n_behavior" ]
-}
-
-js_library("oobe_dialog_host_behavior") {
-}
-
js_library("oobe_select") {
}
js_library("oobe_welcome") {
deps = [
- ":fake_oobe",
- ":login_screen_behavior",
- ":oobe_dialog_host_behavior",
- ":oobe_i18n_behavior",
+ "components:fake_oobe",
+ "components:login_screen_behavior",
+ "components:oobe_dialog_host_behavior",
+ "components:oobe_i18n_behavior",
]
}
js_library("offline_ad_login") {
deps = [
- ":oobe_dialog_host_behavior",
- ":oobe_i18n_behavior",
":oobe_select",
+ "components:oobe_dialog_host_behavior",
+ "components:oobe_i18n_behavior",
"//ui/webui/resources/cr_elements/cr_input:cr_input",
"//ui/webui/resources/js:load_time_data",
]
@@ -107,7 +73,7 @@ js_library("offline_ad_login") {
js_library("multidevice_setup_first_run") {
deps = [
- ":oobe_i18n_behavior",
+ "components:oobe_i18n_behavior",
"//ui/webui/resources/cr_components/chromeos/multidevice_setup:mojo_api",
"//ui/webui/resources/cr_components/chromeos/multidevice_setup:multidevice_setup",
"//ui/webui/resources/js:cr",
@@ -115,51 +81,51 @@ js_library("multidevice_setup_first_run") {
}
js_library("active_directory_password_change") {
- deps = [ ":oobe_i18n_behavior" ]
+ deps = [ "components:oobe_i18n_behavior" ]
}
js_library("app_downloading") {
deps = [
- ":oobe_dialog_host_behavior",
- ":oobe_i18n_behavior",
+ "components:oobe_dialog_host_behavior",
+ "components:oobe_i18n_behavior",
]
}
js_library("arc_terms_of_service") {
deps = [
- ":html-echo",
- ":oobe_dialog_host_behavior",
- ":oobe_i18n_behavior",
+ "components:oobe_dialog_host_behavior",
+ "components:oobe_help_dialog",
+ "components:oobe_i18n_behavior",
]
}
js_library("demo_preferences") {
deps = [
- ":oobe_dialog_host_behavior",
- ":oobe_i18n_behavior",
+ "components:oobe_dialog_host_behavior",
+ "components:oobe_i18n_behavior",
]
}
js_library("demo_setup") {
deps = [
- ":oobe_dialog_host_behavior",
- ":oobe_i18n_behavior",
+ "components:oobe_dialog_host_behavior",
+ "components:oobe_i18n_behavior",
]
}
js_library("encryption_migration") {
deps = [
- ":oobe_dialog_host_behavior",
- ":oobe_i18n_behavior",
+ "components:oobe_dialog_host_behavior",
+ "components:oobe_i18n_behavior",
]
}
js_library("fingerprint_setup") {
deps = [
- ":oobe_dialog_host_behavior",
- ":oobe_i18n_behavior",
- "//ui/webui/resources/cr_elements/chromeos/cr_lottie:cr_lottie",
+ "components:oobe_dialog_host_behavior",
+ "components:oobe_i18n_behavior",
"//ui/webui/resources/cr_elements/cr_fingerprint:cr_fingerprint_progress_arc",
+ "//ui/webui/resources/cr_elements/cr_lottie:cr_lottie",
]
}
@@ -179,27 +145,21 @@ js_library("gaia_input") {
}
js_library("gaia_password_changed") {
- deps = [ ":oobe_i18n_behavior" ]
+ deps = [ "components:oobe_i18n_behavior" ]
}
js_library("gesture_navigation") {
deps = [
- ":login_screen_behavior",
- ":oobe_dialog_host_behavior",
- ":oobe_i18n_behavior",
+ "components:login_screen_behavior",
+ "components:oobe_dialog_host_behavior",
+ "components:oobe_i18n_behavior",
]
}
-js_library("hd-iron-icon") {
-}
-
-js_library("html-echo") {
-}
-
js_library("marketing_opt_in") {
deps = [
- ":oobe_dialog_host_behavior",
- ":oobe_i18n_behavior",
+ "components:oobe_dialog_host_behavior",
+ "components:oobe_i18n_behavior",
]
}
@@ -218,87 +178,77 @@ js_library("notification_card") {
js_library("offline_gaia") {
deps = [
- ":oobe_dialog_host_behavior",
- ":oobe_i18n_behavior",
+ "components:oobe_dialog_host_behavior",
+ "components:oobe_i18n_behavior",
]
}
js_library("oobe_a11y_option") {
}
-js_library("oobe_buttons") {
-}
-
-js_library("oobe_dialog") {
- deps = [ "//ui/webui/resources/cr_elements:cr_scrollable_behavior" ]
-}
-
js_library("oobe_enable_kiosk") {
deps = [
- ":login_screen_behavior",
- ":oobe_dialog_host_behavior",
- ":oobe_i18n_behavior",
+ "components:login_screen_behavior",
+ "components:oobe_dialog_host_behavior",
+ "components:oobe_i18n_behavior",
]
}
js_library("oobe_eula") {
deps = [
- ":oobe_dialog_host_behavior",
- ":oobe_i18n_behavior",
+ "components:oobe_dialog",
+ "components:oobe_dialog_host_behavior",
+ "components:oobe_i18n_behavior",
]
}
-js_library("oobe_help_dialog") {
- deps = [ ":oobe_i18n_behavior" ]
-}
-
js_library("oobe_i18n_dropdown") {
- deps = [ ":oobe_types" ]
+ deps = [ "components:oobe_types" ]
}
js_library("oobe_network") {
deps = [
- ":oobe_dialog_host_behavior",
- ":oobe_i18n_behavior",
+ "components:oobe_dialog_host_behavior",
+ "components:oobe_i18n_behavior",
]
}
js_library("oobe_reset") {
deps = [
- ":oobe_dialog_host_behavior",
- ":oobe_i18n_behavior",
+ "components:oobe_dialog_host_behavior",
+ "components:oobe_i18n_behavior",
]
}
js_library("oobe_supervision_transition") {
deps = [
- ":oobe_dialog_host_behavior",
- ":oobe_i18n_behavior",
+ "components:oobe_dialog_host_behavior",
+ "components:oobe_i18n_behavior",
]
}
js_library("oobe_update") {
deps = [
- ":oobe_dialog_host_behavior",
- ":oobe_i18n_behavior",
+ "components:oobe_dialog_host_behavior",
+ "components:oobe_i18n_behavior",
]
}
js_library("recommend_apps") {
deps = [
- ":oobe_dialog_host_behavior",
- ":oobe_i18n_behavior",
+ "components:oobe_dialog_host_behavior",
+ "components:oobe_i18n_behavior",
]
}
js_library("saml_confirm_password") {
- deps = [ ":oobe_i18n_behavior" ]
+ deps = [ "components:oobe_i18n_behavior" ]
}
js_library("sync_consent") {
deps = [
- ":oobe_dialog_host_behavior",
- ":oobe_i18n_behavior",
+ "components:oobe_dialog_host_behavior",
+ "components:oobe_i18n_behavior",
]
}
diff --git a/chromium/chrome/browser/resources/chromeos/login/components/BUILD.gn b/chromium/chrome/browser/resources/chromeos/login/components/BUILD.gn
index 96ebbf270c0..59876172124 100644
--- a/chromium/chrome/browser/resources/chromeos/login/components/BUILD.gn
+++ b/chromium/chrome/browser/resources/chromeos/login/components/BUILD.gn
@@ -6,12 +6,74 @@ import("//chrome/test/base/js2gtest.gni")
import("//third_party/closure_compiler/compile_js.gni")
js_type_check("closure_compile") {
- deps = [ ":progress_list_item" ]
+ deps = [
+ ":fake_oobe",
+ ":hd-iron-icon",
+ ":html-echo",
+ ":login_screen_behavior",
+ ":oobe_buttons",
+ ":oobe_dialog",
+ ":oobe_dialog_host_behavior",
+ ":oobe_help_dialog",
+ ":oobe_i18n_behavior",
+ ":oobe_types",
+ ":progress_list_item",
+ ]
}
###############################
# Closure compiler libraries below
+js_library("oobe_types") {
+}
+
+# This is special file to be used as a substutute of Oobe object for closure
+# compilation until we make real one closure compile.
+# TODO (https://crbug.com/950198)
+js_library("fake_oobe") {
+ deps = [
+ ":oobe_types",
+ "//ui/login:display_manager_types",
+ "//ui/webui/resources/js:util",
+ ]
+}
+
+js_library("oobe_i18n_behavior") {
+ deps = [ "//ui/webui/resources/js:i18n_behavior" ]
+}
+
+js_library("login_screen_behavior") {
+ deps = [
+ ":fake_oobe",
+ "//ui/login:display_manager_types",
+ ]
+}
+
+js_library("oobe_buttons") {
+ deps = [ ":oobe_i18n_behavior" ]
+}
+
+js_library("oobe_dialog") {
+ deps = [
+ ":fake_oobe",
+ "//ui/webui/resources/cr_elements:cr_scrollable_behavior",
+ "//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render",
+ ]
+}
+
+js_library("oobe_dialog_host_behavior") {
+}
+
+js_library("oobe_help_dialog") {
+ deps = [ ":oobe_i18n_behavior" ]
+}
+
+js_library("hd-iron-icon") {
+}
+
+js_library("html-echo") {
+}
+
js_library("progress_list_item") {
- deps = [ "../:oobe_i18n_behavior" ]
+ deps = [ ":oobe_i18n_behavior" ]
}
diff --git a/chromium/chrome/browser/resources/component_extension_resources.grd b/chromium/chrome/browser/resources/component_extension_resources.grd
index c737ee855ac..cf1d5e9e58b 100644
--- a/chromium/chrome/browser/resources/component_extension_resources.grd
+++ b/chromium/chrome/browser/resources/component_extension_resources.grd
@@ -95,13 +95,15 @@
<include name="IDR_ARC_SUPPORT_RECOMMEND_APP_LIST_VIEW_HTML" file="chromeos/arc_support/recommend_app_list_view.html" type="chrome_html" flattenhtml="true" />
</if>
<if expr="enable_plugins">
- <!-- Note that resources included here also must be included in
- print_preview_ui.cc such these resources will be exposed to
- PDF in print preview. -->
- <include name="IDR_PDF_INDEX_HTML" file="pdf/index.html" allowexternalscript="true" type="BINDATA" preprocess="true" />
- <include name="IDR_PDF_INDEX_CSS" file="pdf/index.css" allowexternalscript="true" type="BINDATA" />
+ <!-- Note that resources included here that are used in Print Preview
+ also must be included in print_preview_ui.cc such these resources
+ will be exposed to PDF in print preview. -->
+ <include name="IDR_PDF_INDEX_HTML" file="pdf/index.html" type="BINDATA" preprocess="true" />
+ <include name="IDR_PDF_INDEX_CSS" file="pdf/index.css" type="BINDATA" />
<include name="IDR_PDF_MAIN_JS" file="pdf/main.js" type="BINDATA" preprocess="true" />
+ <include name="IDR_PDF_MAIN_UTIL_JS" file="pdf/main_util.js" type="BINDATA" />
<include name="IDR_PDF_PDF_VIEWER_JS" file="pdf/pdf_viewer.js" type="BINDATA" />
+ <include name="IDR_PDF_BOOKMARK_TYPE_JS" file="pdf/bookmark_type.js" type="BINDATA" />
<include name="IDR_PDF_CONSTANTS_JS" file="pdf/constants.js" type="BINDATA" />
<include name="IDR_PDF_CONTROLLER_JS" file="pdf/controller.js" type="BINDATA" />
<include name="IDR_PDF_TOOLBAR_MANAGER_JS" file="pdf/toolbar_manager.js" type="BINDATA" />
@@ -126,7 +128,6 @@
<include name="IDR_PDF_VIEWER_PEN_OPTIONS_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-pen-options.js" use_base_dir="false" type="BINDATA" />
<include name="IDR_PDF_VIEWER_FORM_WARNING_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-form-warning.js" use_base_dir="false" type="BINDATA" />
</if>
- <include name="IDR_PDF_VIEWER_PAGE_INDICATOR_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-page-indicator.js" use_base_dir="false" type="BINDATA" />
<include name="IDR_PDF_VIEWER_PAGE_SELECTOR_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-page-selector.js" use_base_dir="false" type="BINDATA" />
<include name="IDR_PDF_VIEWER_PASSWORD_SCREEN_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-password-screen.js" use_base_dir="false" type="BINDATA" />
<include name="IDR_PDF_VIEWER_PDF_TOOLBAR_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-pdf-toolbar.js" use_base_dir="false" type="BINDATA" preprocess="true"/>
diff --git a/chromium/chrome/browser/resources/discards/.eslintrc.js b/chromium/chrome/browser/resources/discards/.eslintrc.js
new file mode 100644
index 00000000000..18f6e9550ca
--- /dev/null
+++ b/chromium/chrome/browser/resources/discards/.eslintrc.js
@@ -0,0 +1,11 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module.exports = {
+ 'env': {
+ 'browser': true,
+ 'es6': true,
+ },
+ 'rules': {'eqeqeq': ['error', 'always', {'null': 'ignore'}]},
+};
diff --git a/chromium/chrome/browser/resources/discards/database_tab.js b/chromium/chrome/browser/resources/discards/database_tab.js
index 93367e2adf3..c93db1e49ac 100644
--- a/chromium/chrome/browser/resources/discards/database_tab.js
+++ b/chromium/chrome/browser/resources/discards/database_tab.js
@@ -19,7 +19,7 @@ import {SortedTableBehavior} from './sorted_table_behavior.js';
* being compared.
* @param {discards.mojom.SiteCharacteristicsDatabaseEntry} b The second value
* being compared.
- * @return {number} A negative number if a < b, 0 if a == b, and a positive
+ * @return {number} A negative number if a < b, 0 if a === b, and a positive
* number if a > b.
*/
function compareRowsByOrigin(a, b) {
@@ -32,7 +32,7 @@ function compareRowsByOrigin(a, b) {
* being compared.
* @param {discards.mojom.SiteCharacteristicsDatabaseEntry} b The second value
* being compared.
- * @return {number} A negative number if a < b, 0 if a == b, and a positive
+ * @return {number} A negative number if a < b, 0 if a === b, and a positive
* number if a > b.
*/
function compareRowsByIsDirty(a, b) {
@@ -45,7 +45,7 @@ function compareRowsByIsDirty(a, b) {
* being compared.
* @param {discards.mojom.SiteCharacteristicsDatabaseEntry} b The second value
* being compared.
- * @return {number} A negative number if a < b, 0 if a == b, and a positive
+ * @return {number} A negative number if a < b, 0 if a === b, and a positive
* number if a > b.
*/
function compareRowsByLastLoaded(a, b) {
@@ -58,7 +58,7 @@ function compareRowsByLastLoaded(a, b) {
* being compared.
* @param {discards.mojom.SiteCharacteristicsDatabaseEntry} b The second value
* being compared.
- * @return {number} A negative number if a < b, 0 if a == b, and a positive
+ * @return {number} A negative number if a < b, 0 if a === b, and a positive
* number if a > b.
*/
function compareRowsByCpuUsage(a, b) {
@@ -75,7 +75,7 @@ function compareRowsByCpuUsage(a, b) {
* being compared.
* @param {discards.mojom.SiteCharacteristicsDatabaseEntry} b The second value
* being compared.
- * @return {number} A negative number if a < b, 0 if a == b, and a positive
+ * @return {number} A negative number if a < b, 0 if a === b, and a positive
* number if a > b.
*/
function compareRowsByMemoryUsage(a, b) {
@@ -92,7 +92,7 @@ function compareRowsByMemoryUsage(a, b) {
* being compared.
* @param {discards.mojom.SiteCharacteristicsDatabaseEntry} b The second value
* being compared.
- * @return {number} A negative number if a < b, 0 if a == b, and a positive
+ * @return {number} A negative number if a < b, 0 if a === b, and a positive
* number if a > b.
*/
function compareRowsByLoadDuration(a, b) {
@@ -110,7 +110,7 @@ function compareRowsByLoadDuration(a, b) {
* @return {function(discards.mojom.SiteCharacteristicsDatabaseEntry,
discards.mojom.SiteCharacteristicsDatabaseEntry): number}
* A comparison function that compares two tab infos, returns
- * negative number if a < b, 0 if a == b, and a positive
+ * negative number if a < b, 0 if a === b, and a positive
* number if a > b.
*/
function getSortFunctionForKey(sortKey) {
@@ -342,7 +342,7 @@ Polymer({
* @param {boolean} sortReverse True if sorting is reversed.
* @return {function({Object}, {Object}): number}
* A comparison function that compares two tab infos, returns
- * negative number if a < b, 0 if a == b, and a positive
+ * negative number if a < b, 0 if a === b, and a positive
* number if a > b.
* @private
*/
@@ -443,7 +443,7 @@ Polymer({
* @private
*/
kilobytesToString_(value) {
- return value == -1 ? 'N/A' : kilobytesToString(value);
+ return value === -1 ? 'N/A' : kilobytesToString(value);
},
/**
@@ -452,6 +452,6 @@ Polymer({
* @private
*/
optionalIntegerToString_(value) {
- return value == -1 ? 'N/A' : value.toString();
+ return value === -1 ? 'N/A' : value.toString();
},
});
diff --git a/chromium/chrome/browser/resources/discards/discards.js b/chromium/chrome/browser/resources/discards/discards.js
index b93201c96f2..7616bfd9a9d 100644
--- a/chromium/chrome/browser/resources/discards/discards.js
+++ b/chromium/chrome/browser/resources/discards/discards.js
@@ -33,10 +33,10 @@
* 's' is sufficient to make a string plural.
* @param {string} s The string to be made plural if necessary.
* @param {number} n The count of the number of ojects.
- * @return {string} The plural version of |s| if n != 1, otherwise |s|.
+ * @return {string} The plural version of |s| if n !== 1, otherwise |s|.
*/
export function maybeMakePlural(s, n) {
- return n == 1 ? s : s + 's';
+ return n === 1 ? s : s + 's';
}
/**
diff --git a/chromium/chrome/browser/resources/discards/discards_main.html b/chromium/chrome/browser/resources/discards/discards_main.html
index 28d9d876817..9ed843d25d7 100644
--- a/chromium/chrome/browser/resources/discards/discards_main.html
+++ b/chromium/chrome/browser/resources/discards/discards_main.html
@@ -22,6 +22,7 @@
overflow: hidden;
}
</style>
+ <iron-location path="{{path}}"></iron-location>
<cr-tabs selected="{{selected}}" tab-names="[[tabs]]"></cr-tabs>
<iron-pages selected="[[selected]]">
diff --git a/chromium/chrome/browser/resources/discards/discards_main.js b/chromium/chrome/browser/resources/discards/discards_main.js
index 13a6653bdea..c0b6712289c 100644
--- a/chromium/chrome/browser/resources/discards/discards_main.js
+++ b/chromium/chrome/browser/resources/discards/discards_main.js
@@ -4,6 +4,7 @@
import 'chrome://resources/cr_elements/hidden_style_css.m.js';
import 'chrome://resources/cr_elements/cr_tabs/cr_tabs.m.js';
+import 'chrome://resources/polymer/v3_0/iron-location/iron-location.js';
import 'chrome://resources/polymer/v3_0/iron-pages/iron-pages.js';
import './database_tab.js';
import './discards_tab.js';
@@ -21,6 +22,13 @@ Polymer({
selected: {
type: Number,
value: 0,
+ observer: 'selectedChanged_',
+ },
+
+ path: {
+ type: String,
+ value: '',
+ observer: 'pathChanged_',
},
tabs: {
@@ -28,4 +36,41 @@ Polymer({
value: () => ['Discards', 'Database', 'Graph'],
},
},
+
+ /**
+ * Updates the location hash on selection change.
+ * @param {number} newValue
+ * @param {number|undefined} oldValue
+ * @private
+ */
+ selectedChanged_(newValue, oldValue) {
+ if (oldValue !== undefined) {
+ // The first tab is special-cased to the empty path.
+ const defaultTab = this.tabs[0].toLowerCase();
+ const tabName = this.tabs[newValue].toLowerCase();
+ this.path = '/' + (tabName === defaultTab ? '' : tabName);
+ }
+ },
+
+ /**
+ * Returns the index of the currently selected tab corresponding to the
+ * path or zero if no match.
+ * @param {string} path
+ * @return {number}
+ * @private
+ */
+ selectedFromPath_(path) {
+ const index = this.tabs.findIndex(tab => path === tab.toLowerCase());
+ return Math.max(index, 0);
+ },
+
+ /**
+ * Updates the selection property on path change.
+ * @param {string} newValue
+ * @param {string|undefined} oldValue
+ * @private
+ */
+ pathChanged_(newValue, oldValue) {
+ this.selected = this.selectedFromPath_(newValue.substr(1));
+ },
});
diff --git a/chromium/chrome/browser/resources/discards/discards_tab.js b/chromium/chrome/browser/resources/discards/discards_tab.js
index d0adab8a334..2fef49056b5 100644
--- a/chromium/chrome/browser/resources/discards/discards_tab.js
+++ b/chromium/chrome/browser/resources/discards/discards_tab.js
@@ -19,7 +19,7 @@ import {SortedTableBehavior} from './sorted_table_behavior.js';
* attribute of the table headers for valid sort-keys.
* @param {boolean|number|string} a The first value being compared.
* @param {boolean|number|string} b The second value being compared.
- * @return {number} A negative number if a < b, 0 if a == b, and a positive
+ * @return {number} A negative number if a < b, 0 if a === b, and a positive
* number if a > b.
*/
export function compareTabDiscardsInfos(sortKey, a, b) {
@@ -27,10 +27,10 @@ export function compareTabDiscardsInfos(sortKey, a, b) {
let val2 = b[sortKey];
// Compares strings.
- if (sortKey == 'title' || sortKey == 'tabUrl') {
+ if (sortKey === 'title' || sortKey === 'tabUrl') {
val1 = val1.toLowerCase();
val2 = val2.toLowerCase();
- if (val1 == val2) {
+ if (val1 === val2) {
return 0;
}
return val1 > val2 ? 1 : -1;
@@ -38,17 +38,17 @@ export function compareTabDiscardsInfos(sortKey, a, b) {
// Compares boolean fields.
if (['canFreeze', 'isAutoDiscardable'].includes(sortKey)) {
- if (val1 == val2) {
+ if (val1 === val2) {
return 0;
}
return val1 ? 1 : -1;
}
// Compare lifecycle state. This is actually a compound key.
- if (sortKey == 'state') {
+ if (sortKey === 'state') {
// If the keys are discarding state, then break ties using the discard
// reason.
- if (val1 == val2 && val1 == mojom.LifecycleUnitState.DISCARDED) {
+ if (val1 === val2 && val1 === mojom.LifecycleUnitState.DISCARDED) {
val1 = a['discardReason'];
val2 = b['discardReason'];
}
@@ -113,7 +113,7 @@ Polymer({
* @param {boolean} sortReverse True if sorting is reversed.
* @return {function({Object}, {Object}): number}
* A comparison function that compares two tab infos, returns
- * negative number if a < b, 0 if a == b, and a positive
+ * negative number if a < b, 0 if a === b, and a positive
* number if a > b.
* @private
*/
@@ -225,12 +225,12 @@ Polymer({
return 'frozen';
case mojom.LifecycleUnitState.DISCARDED:
return 'discarded (' + this.discardReasonToString_(reason) + ')' +
- ((reason == mojom.LifecycleUnitDiscardReason.URGENT) ? ' at ' +
+ ((reason === mojom.LifecycleUnitDiscardReason.URGENT) ? ' at ' +
// Must convert since Date constructor takes
// milliseconds.
(new Date(stateChangeTime.microseconds / 1000))
.toLocaleString() :
- '');
+ '');
case mojom.LifecycleUnitState.PENDING_UNFREEZE:
return 'frozen (pending unfreeze)';
}
@@ -299,7 +299,7 @@ Polymer({
* @private
*/
getLifeCycleState_(item) {
- if (item.loadingState != mojom.LifecycleUnitLoadingState.UNLOADED ||
+ if (item.loadingState !== mojom.LifecycleUnitLoadingState.UNLOADED ||
item.discardCount > 0) {
return this.lifecycleStateToString_(
item.state, item.discardReason, item.visibility, item.hasFocus,
@@ -338,7 +338,7 @@ Polymer({
* @private
*/
hasCannotFreezeReasons_(item) {
- return item.cannotFreezeReasons.length != 0;
+ return item.cannotFreezeReasons.length !== 0;
},
/**
* Tests whether an item has reasons why it cannot be discarded.
@@ -348,7 +348,7 @@ Polymer({
* @private
*/
hasCannotDiscardReasons_(item) {
- return item.cannotDiscardReasons.length != 0;
+ return item.cannotDiscardReasons.length !== 0;
},
/**
@@ -358,7 +358,7 @@ Polymer({
* @private
*/
canLoad_(item) {
- return item.loadingState == mojom.LifecycleUnitLoadingState.UNLOADED;
+ return item.loadingState === mojom.LifecycleUnitLoadingState.UNLOADED;
},
/**
@@ -368,8 +368,8 @@ Polymer({
* @private
*/
canFreeze_(item) {
- if (item.visibility == discards.mojom.LifecycleUnitVisibility.HIDDEN ||
- item.visibility == discards.mojom.LifecycleUnitVisibility.OCCLUDED) {
+ if (item.visibility === discards.mojom.LifecycleUnitVisibility.HIDDEN ||
+ item.visibility === discards.mojom.LifecycleUnitVisibility.OCCLUDED) {
// Only tabs that aren't visible can be frozen for now.
switch (item.state) {
case mojom.LifecycleUnitState.DISCARDED:
@@ -389,8 +389,8 @@ Polymer({
* @private
*/
canDiscard_(item) {
- if (item.visibility == discards.mojom.LifecycleUnitVisibility.HIDDEN ||
- item.visibility == discards.mojom.LifecycleUnitVisibility.OCCLUDED) {
+ if (item.visibility === discards.mojom.LifecycleUnitVisibility.HIDDEN ||
+ item.visibility === discards.mojom.LifecycleUnitVisibility.OCCLUDED) {
// Only tabs that aren't visible can be discarded for now.
switch (item.state) {
case mojom.LifecycleUnitState.DISCARDED:
diff --git a/chromium/chrome/browser/resources/discards/graph_doc.js b/chromium/chrome/browser/resources/discards/graph_doc.js
index f0eabf7548c..37b9bc7d46d 100644
--- a/chromium/chrome/browser/resources/discards/graph_doc.js
+++ b/chromium/chrome/browser/resources/discards/graph_doc.js
@@ -22,6 +22,195 @@ const kFrameNodesTargetY = kPageNodesYRange + 50;
const kFrameNodesTopMargin = kPageNodesYRange;
const kFrameNodesBottomMargin = kWorkerNodesYRange + 50;
+class ToolTip {
+ /**
+ * @param {Element} div
+ * @param {GraphNode} node
+ */
+ constructor(div, node) {
+ /** @type {boolean} */
+ this.floating = true;
+
+ /** @type {number} */
+ this.x = node.x;
+
+ /** @type {number} */
+ this.y = node.y - 28;
+
+ /** @type {GraphNode} */
+ this.node = node;
+
+ /** @private {d3.selection} */
+ this.div_ = d3.select(div)
+ .append('div')
+ .attr('class', 'tooltip')
+ .style('opacity', 0)
+ .style('left', `${this.x}px`)
+ .style('top', `${this.y}px`);
+ this.div_.append('table').append('tbody');
+ this.div_.transition().duration(200).style('opacity', .9);
+
+ /** @private {string} */
+ this.description_json_ = '';
+ // Set up a drag behavior for this object's div.
+ const drag = d3.drag().subject(() => this);
+ drag.on('start', this.onDragStart_.bind(this));
+ drag.on('drag', this.onDrag_.bind(this));
+ this.div_.call(drag);
+
+ this.onDescription(JSON.stringify({}));
+ }
+
+ nodeMoved() {
+ if (!this.floating) {
+ return;
+ }
+
+ const node = this.node;
+ this.x = node.x;
+ this.y = node.y - 28;
+ this.div_.style('left', `${this.x}px`).style('top', `${this.y}px`);
+ }
+
+ /**
+ * @return {!Array<number>} The [x, y] center of the ToolTip's div
+ * element.
+ */
+ getCenter() {
+ const rect = this.div_.node().getBoundingClientRect();
+ return [rect.x + rect.width / 2, rect.y + rect.height / 2];
+ }
+
+ goAway() {
+ this.div_.transition().duration(200).style('opacity', 0).remove();
+ }
+
+ /**
+ * Updates the description displayed.
+ * @param {string} description_json A JSON string.
+ */
+ onDescription(description_json) {
+ if (this.description_json_ === description_json) {
+ return;
+ }
+
+ /**
+ * Helper for recursively flattening an Object.
+ *
+ * @param {!Set} visited The set of visited objects, excluding
+ * {@code object}.
+ * @param {!Object<?,?>} flattened The flattened object being built.
+ * @param {string} path The current flattened path.
+ * @param {!Object<?,?>} object The nested dict to be flattened.
+ */
+ function flattenObjectRec(visited, flattened, path, object) {
+ if (typeof object !== 'object' || visited.has(object)) {
+ return;
+ }
+ visited.add(object);
+ for (const [key, value] of Object.entries(object)) {
+ const fullPath = path ? `${path}.${key}` : key;
+ // Recurse on non-null objects.
+ if (!!value && typeof value === 'object') {
+ flattenObjectRec(
+ visited, flattened, fullPath,
+ /** @type {!Object<?,?>} */ (value));
+ } else {
+ // Everything else is considered a leaf value.
+ flattened[fullPath] = value;
+ }
+ }
+ }
+
+ /**
+ * Recursively flattens an Object of key/value pairs. Nested objects will be
+ * flattened to paths with a . separator between each key. If there are
+ * circular dependencies, they will not be expanded.
+ *
+ * For example, converting:
+ *
+ * {
+ * 'foo': 'hello',
+ * 'bar': 1,
+ * 'baz': {
+ * 'x': 43.5,
+ * 'y': 'fox'
+ * 'z': [1, 2]
+ * },
+ * 'self': (reference to self)
+ * }
+ *
+ * will yield:
+ *
+ * {
+ * 'foo': 'hello',
+ * 'bar': 1,
+ * 'baz.x': 43.5,
+ * 'baz.y': 'fox',
+ * 'baz.z.0': '1',
+ * 'baz.y.1': '2'
+ * }
+ * @param {!Object<?,?>} object The object to be flattened.
+ * @return {!Object<?,?>} the flattened object.
+ */
+ function flattenObject(object) {
+ const flattened = {};
+ flattenObjectRec(new Set(), flattened, '', object);
+ return flattened;
+ }
+
+ // The JSON is a dictionary of data describer name to their data. Assuming a
+ // convention that describers emit a dictionary from string->string, this is
+ // flattened to an array. Each top-level dictionary entry is flattened to a
+ // 'heading' with [`the describer's name`, null], followed by some number of
+ // entries with a two-element list, each representing a key/value pair.
+ this.description_json_ = description_json;
+ const description =
+ /** @type {!Object<?,?>} */ (JSON.parse(description_json));
+ const flattenedDescription = [];
+ for (const [title, value] of Object.entries(description)) {
+ flattenedDescription.push([title, null]);
+ const flattenedValue = flattenObject(value);
+ for (const [propName, propValue] of Object.entries(flattenedValue)) {
+ let strValue = String(propValue);
+ if (strValue.length > 50) {
+ strValue = `${strValue.substring(0, 47)}...`;
+ }
+ flattenedDescription.push([propName, strValue]);
+ }
+ }
+ if (flattenedDescription.length === 0) {
+ flattenedDescription.push(['No Data', null]);
+ }
+
+ let tr =
+ this.div_.selectAll('tbody').selectAll('tr').data(flattenedDescription);
+ tr.enter().append('tr').selectAll('td').data(d => d).enter().append('td');
+ tr.exit().remove();
+
+ tr = this.div_.selectAll('tr');
+ tr.select('td').attr('colspan', function(d) {
+ return (d3.select(this.parentElement).datum()[1] === null) ? 2 : null;
+ });
+ tr = tr.attr('class', d => d[1] === null ? 'heading' : 'value');
+ tr.selectAll('td').data(d => d).text(d => d === null ? '' : d);
+ }
+
+ /** @private */
+ onDragStart_() {
+ this.floating = false;
+ }
+
+ /** @private */
+ onDrag_() {
+ this.x = d3.event.x;
+ this.y = d3.event.y;
+ this.div_.style('left', `${this.x}px`).style('top', `${this.y}px`);
+
+ graph.updateToolTipLinks();
+ }
+}
+
/** @implements {d3.ForceNode} */
class GraphNode {
constructor(id) {
@@ -32,15 +221,18 @@ class GraphNode {
/** @type {string} */
this.iconUrl = '';
+ /** @type {ToolTip} */
+ this.tooltip = null;
+
/**
* Implementation of the d3.ForceNode interface.
* See https://github.com/d3/d3-force#simulation_nodes.
* @type {number|undefined}
*/
this.index;
- /** @type {number|undefined} */
+ /** @type {number} */
this.x;
- /** @type {number|undefined} */
+ /** @type {number} */
this.y;
/** @type {number|undefined} */
this.vx;
@@ -269,7 +461,7 @@ function boundingForce(graphHeight) {
const node = nodes[i];
const yOld = node.y;
const yNew = Math.max(bound[0], Math.min(yOld, bound[1]));
- if (yOld != yNew) {
+ if (yOld !== yNew) {
node.y = yNew;
// Zero the velocity of clamped nodes.
node.vy = 0;
@@ -294,14 +486,18 @@ class Graph {
* TODO(siggi): This should be SVGElement, but closure doesn't have externs
* for this yet.
* @param {Element} svg
+ * @param {Element} div
*/
- constructor(svg) {
+ constructor(svg, div) {
/**
* TODO(siggi): SVGElement.
* @private {Element}
*/
this.svg_ = svg;
+ /** @private {Element} */
+ this.div_ = div;
+
/** @private {boolean} */
this.wasResized_ = false;
@@ -314,6 +510,12 @@ class Graph {
this.simulation_ = null;
/**
+ * A selection for the top-level <g> node that contains all tooltip links.
+ * @private {d3.selection}
+ */
+ this.toolTipLinkGroup_ = null;
+
+ /**
* A selection for the top-level <g> node that contains all separators.
* @private {d3.selection}
*/
@@ -339,6 +541,24 @@ class Graph {
* @private {!Array<!d3.ForceLink>}
*/
this.links_ = [];
+
+ /**
+ * The host window.
+ * @private {Window}
+ */
+ this.hostWindow_ = null;
+
+ /**
+ * The interval timer used to poll for node descriptions.
+ * @private {number}
+ */
+ this.pollDescriptionsInterval_ = 0;
+
+ /**
+ * The d3.drag instance applied to nodes.
+ * @private {?d3.Drag}
+ */
+ this.drag_ = null;
}
initialize() {
@@ -347,7 +567,7 @@ class Graph {
// so these event handlers are never removed.
window.addEventListener('message', this.onMessage_.bind(this));
- // Set up a window resize listener to track the graph on resize.
+ // Set up a resize listener to track the graph on resize.
window.addEventListener('resize', this.onResize_.bind(this));
// Create the simulation and set up the permanent forces.
@@ -366,11 +586,19 @@ class Graph {
this.simulation_ = simulation;
// Create the <g> elements that host nodes and links.
- // The link group is created first so that all links end up behind nodes.
+ // The link groups are created first so that all links end up behind nodes.
const svg = d3.select(this.svg_);
+ this.toolTipLinkGroup_ = svg.append('g').attr('class', 'toolTipLinks');
this.linkGroup_ = svg.append('g').attr('class', 'links');
this.nodeGroup_ = svg.append('g').attr('class', 'nodes');
this.separatorGroup_ = svg.append('g').attr('class', 'separators');
+
+ const drag = d3.drag();
+ drag.clickDistance(4);
+ drag.on('start', this.onDragStart_.bind(this));
+ drag.on('drag', this.onDrag_.bind(this));
+ drag.on('end', this.onDragEnd_.bind(this));
+ this.drag_ = drag;
}
/** @override */
@@ -440,14 +668,89 @@ class Graph {
this.nodes_.delete(nodeId);
}
+ /** Updates floating tooltip positions as well as links to pinned tooltips */
+ updateToolTipLinks() {
+ const pinnedTooltips = [];
+ for (const node of this.nodes_.values()) {
+ const tooltip = node.tooltip;
+
+ if (tooltip) {
+ if (tooltip.floating) {
+ tooltip.nodeMoved();
+ } else {
+ pinnedTooltips.push(tooltip);
+ }
+ }
+ }
+
+ function setLineEndpoints(d) {
+ const line = d3.select(this);
+ const center = d.getCenter();
+ line.attr('x1', d => center[0])
+ .attr('y1', d => center[1])
+ .attr('x2', d => d.node.x)
+ .attr('y2', d => d.node.y);
+ }
+
+ const toolTipLinks =
+ this.toolTipLinkGroup_.selectAll('line').data(pinnedTooltips);
+ toolTipLinks.enter()
+ .append('line')
+ .attr('stroke', 'LightGray')
+ .attr('stroke-dasharray', '1')
+ .attr('stroke-opacity', '0.8')
+ .each(setLineEndpoints);
+ toolTipLinks.each(setLineEndpoints);
+ toolTipLinks.exit().remove();
+ }
+
/**
* @param {!GraphNode} node
* @private
*/
removeNodeLinks_(node) {
// Filter away any links to or from the deleted node.
- this.links_ =
- this.links_.filter(link => link.source != node && link.target != node);
+ this.links_ = this.links_.filter(
+ link => link.source !== node && link.target !== node);
+ }
+
+ /**
+ * @param {!Object<string>} nodeDescriptions
+ * @private
+ */
+ nodeDescriptions_(nodeDescriptions) {
+ for (const nodeId in nodeDescriptions) {
+ const node = this.nodes_.get(Number.parseInt(nodeId, 10));
+ if (node && node.tooltip) {
+ node.tooltip.onDescription(nodeDescriptions[nodeId]);
+ }
+ }
+ }
+
+ /**
+ * @private
+ */
+ pollForNodeDescriptions_() {
+ const nodeIds = [];
+ for (const node of this.nodes_.values()) {
+ if (node.tooltip) {
+ nodeIds.push(node.id);
+ }
+ }
+
+ if (nodeIds.length) {
+ this.hostWindow_.postMessage(['requestNodeDescriptions', nodeIds], '*');
+
+ if (this.pollDescriptionsInterval_ === 0) {
+ // Start polling if not already in progress.
+ this.pollDescriptionsInterval_ =
+ setInterval(this.pollForNodeDescriptions_.bind(this), 1000);
+ }
+ } else {
+ // No tooltips, stop polling.
+ clearInterval(this.pollDescriptionsInterval_);
+ this.pollDescriptionsInterval_ = 0;
+ }
}
/**
@@ -455,6 +758,10 @@ class Graph {
* @private
*/
onMessage_(event) {
+ if (!this.hostWindow_) {
+ this.hostWindow_ = event.source;
+ }
+
const type = /** @type {string} */ (event.data[0]);
const data = /** @type {Object|number} */ (event.data[1]);
switch (type) {
@@ -497,12 +804,31 @@ class Graph {
case 'nodeDeleted':
this.nodeDeleted(/** @type {number} */ (data));
break;
+ case 'nodeDescriptions':
+ this.nodeDescriptions_(/** @type {!Object<string>} */ (data));
+ break;
}
this.render_();
}
/**
+ * @param {GraphNode} node
+ * @private
+ */
+ onGraphNodeClick_(node) {
+ if (node.tooltip) {
+ node.tooltip.goAway();
+ node.tooltip = null;
+ } else {
+ node.tooltip = new ToolTip(this.div_, node);
+
+ // Poll for all tooltip node descriptions immediately.
+ this.pollForNodeDescriptions_();
+ }
+ }
+
+ /**
* Renders nodes_ and edges_ to the SVG DOM.
*
* Each edge is a line element.
@@ -533,14 +859,13 @@ class Graph {
// Add new nodes, if any.
if (!node.enter().empty()) {
- const drag = d3.drag();
- drag.on('start', this.onDragStart_.bind(this));
- drag.on('drag', this.onDrag_.bind(this));
- drag.on('end', this.onDragEnd_.bind(this));
-
- const newNodes = node.enter().append('g').call(drag);
+ const newNodes = node.enter()
+ .append('g')
+ .call(this.drag_)
+ .on('click', this.onGraphNodeClick_.bind(this));
const circles = newNodes.append('circle').attr('r', 9).attr(
'fill', 'green'); // New nodes appear green.
+
newNodes.append('image')
.attr('x', -8)
.attr('y', -8)
@@ -555,17 +880,31 @@ class Graph {
.attr('r', 6);
}
- // Give dead nodes a distinguishing class to exclude them from the selection
- // above. Interrupt any ongoing transitions, then transition them out.
- const deletedNodes = node.exit().classed('dead', true).interrupt();
+ if (!node.exit().empty()) {
+ // Give dead nodes a distinguishing class to exclude them from the
+ // selection above.
+ const deletedNodes = node.exit().classed('dead', true);
+
+ // Interrupt any ongoing transitions.
+ deletedNodes.interrupt();
- deletedNodes.select('circle')
- .attr('r', 9)
- .attr('fill', 'red')
- .transition()
- .duration(2000)
- .attr('r', 0)
- .remove();
+ // Turn down the node associated tooltips.
+ deletedNodes.each(d => {
+ if (d.tooltip) {
+ d.tooltip.goAway();
+ }
+ });
+
+ // Transition the nodes out and remove them at the end of transition.
+ deletedNodes.transition()
+ .remove()
+ .select('circle')
+ .attr('r', 9)
+ .attr('fill', 'red')
+ .transition()
+ .duration(2000)
+ .attr('r', 0);
+ }
// Update the title for all nodes.
node.selectAll('title').text(d => d.title);
@@ -592,6 +931,8 @@ class Graph {
.attr('y1', d => d.source.y)
.attr('x2', d => d.target.x)
.attr('y2', d => d.target.y);
+
+ this.updateToolTipLinks();
}
/**
@@ -770,10 +1111,11 @@ class Graph {
this.restartSimulation_();
}
}
-
+/* @type {?Graph} */
let graph = null;
function onLoad() {
- graph = new Graph(document.querySelector('svg'));
+ graph =
+ new Graph(document.querySelector('svg'), document.querySelector('div'));
graph.initialize();
}
diff --git a/chromium/chrome/browser/resources/discards/graph_doc_template.html b/chromium/chrome/browser/resources/discards/graph_doc_template.html
index 2f6b303810f..b9fdfb27c8d 100644
--- a/chromium/chrome/browser/resources/discards/graph_doc_template.html
+++ b/chromium/chrome/browser/resources/discards/graph_doc_template.html
@@ -34,7 +34,31 @@ URL. As result, this document needs to be self-contained, hence inline scripts.
.separator {
font: italic 13px sans-serif;
+ user-select: none;
}
+
+ div.tooltip {
+ background: lightsteelblue;
+ border: 0;
+ border-radius: 8px;
+ padding: 2px;
+ position: absolute;
+ text-align: center;
+ }
+
+ tr {
+ font: 10px sans-serif;
+ }
+
+ tr.heading > td {
+ font-weight: bold;
+ text-align: center;
+ }
+
+ tr.value > td:nth-child(1) {
+ text-align: end;
+ }
+
</style>
<script src="https://ajax.googleapis.com/ajax/libs/d3js/5.7.0/d3.min.js"
integrity="sha384-HL96dun1KbYEq6UT/ZlsspAODCyQ+Zp4z318ajUPBPSMzy5dvxl6ziwmnil8/Cpd"
@@ -45,6 +69,7 @@ ${javascript_file}
</script>
</head>
<body>
+ <div id="toolTips" width="100%" height="100%"></div>
<svg id="graphBody" width="100%" height="100%"></svg>
</body>
</html>
diff --git a/chromium/chrome/browser/resources/discards/graph_tab_template.js b/chromium/chrome/browser/resources/discards/graph_tab_template.js
index 7a1585912d0..62e0deda6e3 100644
--- a/chromium/chrome/browser/resources/discards/graph_tab_template.js
+++ b/chromium/chrome/browser/resources/discards/graph_tab_template.js
@@ -10,7 +10,9 @@ import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bun
* @implements {discards.mojom.GraphChangeStreamInterface}
*/
class DiscardsGraphChangeStreamImpl {
+ /** @param {Window} contentWindow */
constructor(contentWindow) {
+ /** @private {Window} */
this.contentWindow_ = contentWindow;
}
@@ -92,6 +94,12 @@ Polymer({
*/
changeListener_: null,
+ /**
+ * The WebView's content window object.
+ * @private {?Window}
+ */
+ contentWindow_: null,
+
/** @override */
ready() {
this.graphDump_ = discards.mojom.GraphDump.getRemote();
@@ -104,14 +112,37 @@ Polymer({
this.changeListener_ = null;
},
+ /**
+ * @param {!Event} event A request from the WebView.
+ * @private
+ */
+ onMessage_(event) {
+ const type = /** @type {string} */ (event.data[0]);
+ const data = /** @type {Object|number} */ (event.data[1]);
+ switch (type) {
+ case 'requestNodeDescriptions':
+ // Forward the request through the mojoms and bounce the reply back.
+ this.graphDump_
+ .requestNodeDescriptions(/** @type {!Array<number>} */ (data))
+ .then(
+ (descriptions) => this.contentWindow_.postMessage(
+ ['nodeDescriptions', descriptions.nodeDescriptionsJson],
+ '*'));
+ break;
+ }
+ },
+
/** @private */
onWebViewReady_() {
+ this.contentWindow_ = this.$.webView.contentWindow;
this.changeListener_ =
- new DiscardsGraphChangeStreamImpl(this.$.webView.contentWindow);
+ new DiscardsGraphChangeStreamImpl(this.contentWindow_);
this.client_ =
new discards.mojom.GraphChangeStreamReceiver(this.changeListener_);
// Subscribe for graph updates.
this.graphDump_.subscribeToChanges(
this.client_.$.bindNewPipeAndPassRemote());
+
+ window.addEventListener('message', this.onMessage_.bind(this));
},
});
diff --git a/chromium/chrome/browser/resources/discards/sorted_table_behavior.js b/chromium/chrome/browser/resources/discards/sorted_table_behavior.js
index 26fc907647f..2073050d7d5 100644
--- a/chromium/chrome/browser/resources/discards/sorted_table_behavior.js
+++ b/chromium/chrome/browser/resources/discards/sorted_table_behavior.js
@@ -50,7 +50,7 @@ export const SortedTableBehavior = {
}
const newSortKey = e.currentTarget.dataset.sortKey;
- if (newSortKey == this.sortKey) {
+ if (newSortKey === this.sortKey) {
this.sortReverse = !this.sortReverse;
} else {
this.setSortKey(newSortKey);
diff --git a/chromium/chrome/browser/resources/downloads/BUILD.gn b/chromium/chrome/browser/resources/downloads/BUILD.gn
index ea1077ddcd0..b54a16fd160 100644
--- a/chromium/chrome/browser/resources/downloads/BUILD.gn
+++ b/chromium/chrome/browser/resources/downloads/BUILD.gn
@@ -5,7 +5,7 @@
import("//chrome/common/features.gni")
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/grit/grit_rule.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
import("../optimize_webui.gni")
if (optimize_webui) {
@@ -47,7 +47,7 @@ if (optimize_webui) {
downloads_pak_file,
]
deps = [
- ":polymer3_elements",
+ ":web_components",
"//chrome/browser/ui/webui/downloads:mojo_bindings_js",
]
grit_flags = [
@@ -143,35 +143,11 @@ js_library("toolbar") {
]
}
-group("polymer3_elements") {
- public_deps = [
- ":icons_module",
- ":item_module",
- ":manager_module",
- ":toolbar_module",
+html_to_js("web_components") {
+ js_files = [
+ "icons.js",
+ "item.js",
+ "manager.js",
+ "toolbar.js",
]
}
-
-polymer_modulizer("item") {
- html_file = "item.html"
- js_file = "item.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("manager") {
- html_file = "manager.html"
- js_file = "manager.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("toolbar") {
- html_file = "toolbar.html"
- js_file = "toolbar.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("icons") {
- html_file = "icons.html"
- js_file = "icons.js"
- html_type = "v3-ready"
-}
diff --git a/chromium/chrome/browser/resources/downloads/downloads_resources.grd b/chromium/chrome/browser/resources/downloads/downloads_resources.grd
index cf2f8eee516..6ca8e0725cd 100644
--- a/chromium/chrome/browser/resources/downloads/downloads_resources.grd
+++ b/chromium/chrome/browser/resources/downloads/downloads_resources.grd
@@ -14,51 +14,64 @@
<includes>
<include name="IDR_DOWNLOADS_IMAGES_INCOGNITO_MARKER_SVG"
file="images\incognito_marker.svg"
+ compress="false"
type="BINDATA" />
<include name="IDR_DOWNLOADS_IMAGES_NO_DOWNLOADS_SVG"
file="images\no_downloads.svg"
+ compress="false"
type="BINDATA" />
<include name="IDR_DOWNLOADS_MOJO_LITE_JS"
file="${root_gen_dir}\chrome\browser\ui\webui\downloads\downloads.mojom-lite.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false"
+ type="chrome_html" />
<include name="IDR_DOWNLOADS_MANAGER_JS"
file="${root_gen_dir}\chrome\browser\resources\downloads\manager.js"
use_base_dir="false"
preprocess="true"
+ compress="false"
type="chrome_html" />
<include name="IDR_DOWNLOADS_ITEM_JS"
file="${root_gen_dir}\chrome\browser\resources\downloads\item.js"
use_base_dir="false"
+ compress="false"
type="chrome_html" />
<include name="IDR_DOWNLOADS_TOOLBAR_JS"
file="${root_gen_dir}\chrome\browser\resources\downloads\toolbar.js"
use_base_dir="false"
+ compress="false"
type="chrome_html" />
<include name="IDR_DOWNLOADS_ICONS_JS"
file="${root_gen_dir}\chrome\browser\resources\downloads\icons.js"
use_base_dir="false"
+ compress="false"
type="chrome_html" />
</includes>
<structures>
<structure name="IDR_DOWNLOADS_DOWNLOADS_HTML"
file="downloads.html"
preprocess="true"
+ compress="false"
type="chrome_html" />
<structure name="IDR_DOWNLOADS_BROWSER_PROXY_JS"
file="browser_proxy.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_DOWNLOADS_CONSTANTS_JS"
file="constants.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_DOWNLOADS_DOWNLOADS_JS"
file="downloads.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_DOWNLOADS_ICON_LOADER_JS"
file="icon_loader.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_DOWNLOADS_SEARCH_SERVICE_JS"
file="search_service.js"
+ compress="false"
type="chrome_html" />
</structures>
</release>
diff --git a/chromium/chrome/browser/resources/engagement/site_engagement.js b/chromium/chrome/browser/resources/engagement/site_engagement.js
index 39454c3d578..ca5211d6290 100644
--- a/chromium/chrome/browser/resources/engagement/site_engagement.js
+++ b/chromium/chrome/browser/resources/engagement/site_engagement.js
@@ -143,7 +143,7 @@ function initialize() {
* Remove all rows from the engagement table.
*/
function clearTable() {
- engagementTableBody.innerHTML = '';
+ engagementTableBody.innerHTML = trustedTypes.emptyHTML;
}
/**
diff --git a/chromium/chrome/browser/resources/extensions/BUILD.gn b/chromium/chrome/browser/resources/extensions/BUILD.gn
index 6b89fa93ad2..6ad3d269eb8 100644
--- a/chromium/chrome/browser/resources/extensions/BUILD.gn
+++ b/chromium/chrome/browser/resources/extensions/BUILD.gn
@@ -5,7 +5,7 @@
import("//chrome/common/features.gni")
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/grit/grit_rule.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
import("../optimize_webui.gni")
if (optimize_webui) {
@@ -40,7 +40,7 @@ if (optimize_webui) {
"root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir),
]
- deps = [ ":polymer3_elements" ]
+ deps = [ ":web_components" ]
defines = chrome_grit_defines
outputs = [
"grit/extensions_resources.h",
@@ -59,191 +59,46 @@ group("closure_compile") {
]
}
-group("polymer3_elements") {
+group("web_components") {
public_deps = [
- ":checkup_module",
- ":code_section_module",
- ":detail_view_module",
- ":drop_overlay_module",
- ":error_page_module",
- ":host_permissions_toggle_list_module",
- ":icons_module",
- ":install_warnings_dialog_module",
- ":item_list_module",
- ":item_module",
- ":keyboard_shortcuts_module",
- ":load_error_module",
- ":manager_module",
- ":options_dialog_module",
- ":pack_dialog_alert_module",
- ":pack_dialog_module",
- ":runtime_host_permissions_module",
- ":runtime_hosts_dialog_module",
- ":shared_style_module",
- ":shared_vars_module",
- ":shortcut_input_module",
- ":sidebar_module",
- ":toggle_row_module",
- ":toolbar_module",
- "activity_log:polymer3_elements",
+ ":web_components_local",
+ "activity_log:web_components",
]
- if (is_chromeos) {
- public_deps += [ ":kiosk_dialog_module" ]
- }
-}
-
-polymer_modulizer("checkup") {
- js_file = "checkup.js"
- html_file = "checkup.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("code_section") {
- js_file = "code_section.js"
- html_file = "code_section.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("detail_view") {
- js_file = "detail_view.js"
- html_file = "detail_view.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("drop_overlay") {
- js_file = "drop_overlay.js"
- html_file = "drop_overlay.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("error_page") {
- js_file = "error_page.js"
- html_file = "error_page.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("host_permissions_toggle_list") {
- js_file = "host_permissions_toggle_list.js"
- html_file = "host_permissions_toggle_list.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("icons") {
- js_file = "icons.js"
- html_file = "icons.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("install_warnings_dialog") {
- js_file = "install_warnings_dialog.js"
- html_file = "install_warnings_dialog.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("item") {
- js_file = "item.js"
- html_file = "item.html"
- html_type = "v3-ready"
}
-polymer_modulizer("item_list") {
- js_file = "item_list.js"
- html_file = "item_list.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("keyboard_shortcuts") {
- js_file = "keyboard_shortcuts.js"
- html_file = "keyboard_shortcuts.html"
- html_type = "v3-ready"
-}
+html_to_js("web_components_local") {
+ js_files = [
+ "checkup.js",
+ "code_section.js",
+ "detail_view.js",
+ "drop_overlay.js",
+ "error_page.js",
+ "host_permissions_toggle_list.js",
+ "icons.js",
+ "install_warnings_dialog.js",
+ "item.js",
+ "item_list.js",
+ "keyboard_shortcuts.js",
+ "load_error.js",
+ "manager.js",
+ "options_dialog.js",
+ "pack_dialog.js",
+ "pack_dialog_alert.js",
+ "runtime_host_permissions.js",
+ "runtime_hosts_dialog.js",
+ "shared_style.js",
+ "shared_vars.js",
+ "shortcut_input.js",
+ "sidebar.js",
+ "toggle_row.js",
+ "toolbar.js",
+ ]
-if (is_chromeos) {
- polymer_modulizer("kiosk_dialog") {
- js_file = "kiosk_dialog.js"
- html_file = "kiosk_dialog.html"
- html_type = "v3-ready"
+ if (is_chromeos) {
+ js_files += [ "kiosk_dialog.js" ]
}
}
-polymer_modulizer("load_error") {
- js_file = "load_error.js"
- html_file = "load_error.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("manager") {
- js_file = "manager.js"
- html_file = "manager.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("options_dialog") {
- js_file = "options_dialog.js"
- html_file = "options_dialog.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("pack_dialog") {
- js_file = "pack_dialog.js"
- html_file = "pack_dialog.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("pack_dialog_alert") {
- js_file = "pack_dialog_alert.js"
- html_file = "pack_dialog_alert.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("runtime_host_permissions") {
- js_file = "runtime_host_permissions.js"
- html_file = "runtime_host_permissions.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("runtime_hosts_dialog") {
- js_file = "runtime_hosts_dialog.js"
- html_file = "runtime_hosts_dialog.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("shared_style") {
- js_file = "shared_style.js"
- html_file = "shared_style.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("shared_vars") {
- js_file = "shared_vars.js"
- html_file = "shared_vars.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("shortcut_input") {
- js_file = "shortcut_input.js"
- html_file = "shortcut_input.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("sidebar") {
- js_file = "sidebar.js"
- html_file = "sidebar.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("toggle_row") {
- js_file = "toggle_row.js"
- html_file = "toggle_row.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("toolbar") {
- js_file = "toolbar.js"
- html_file = "toolbar.html"
- html_type = "v3-ready"
-}
-
js_type_check("extensions_module_resources") {
closure_flags = default_closure_args + [
"js_module_root=../../chrome/browser/resources/extensions/",
diff --git a/chromium/chrome/browser/resources/extensions/activity_log/BUILD.gn b/chromium/chrome/browser/resources/extensions/activity_log/BUILD.gn
index af6d5b02f3d..c0eff544781 100644
--- a/chromium/chrome/browser/resources/extensions/activity_log/BUILD.gn
+++ b/chromium/chrome/browser/resources/extensions/activity_log/BUILD.gn
@@ -3,45 +3,15 @@
#found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
-polymer_modulizer("activity_log") {
- js_file = "activity_log.js"
- html_file = "activity_log.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("activity_log_history") {
- js_file = "activity_log_history.js"
- html_file = "activity_log_history.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("activity_log_history_item") {
- js_file = "activity_log_history_item.js"
- html_file = "activity_log_history_item.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("activity_log_stream") {
- js_file = "activity_log_stream.js"
- html_file = "activity_log_stream.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("activity_log_stream_item") {
- js_file = "activity_log_stream_item.js"
- html_file = "activity_log_stream_item.html"
- html_type = "v3-ready"
-}
-
-group("polymer3_elements") {
- public_deps = [
- ":activity_log_history_item_module",
- ":activity_log_history_module",
- ":activity_log_module",
- ":activity_log_stream_item_module",
- ":activity_log_stream_module",
+html_to_js("web_components") {
+ js_files = [
+ "activity_log.js",
+ "activity_log_history.js",
+ "activity_log_history_item.js",
+ "activity_log_stream.js",
+ "activity_log_stream_item.js",
]
}
diff --git a/chromium/chrome/browser/resources/extensions/checkup.html b/chromium/chrome/browser/resources/extensions/checkup.html
index 43fef4133ad..8b53fd1d361 100644
--- a/chromium/chrome/browser/resources/extensions/checkup.html
+++ b/chromium/chrome/browser/resources/extensions/checkup.html
@@ -1,4 +1,4 @@
-<style include="iron-flex shared-style">
+<style include="cr-shared-style iron-flex shared-style">
:host {
--checkup-card-margin: 24px;
--banner-img-height: 115px;
@@ -25,7 +25,6 @@
}
#banner-description {
- @apply --cr-secondary-text;
flex-basis: var(--extensions-card-width);
text-overflow: ellipsis;
}
@@ -58,7 +57,7 @@
<div id="card">
<div id="banner-title" class="cr-title-text">$i18n{checkupTitle}</div>
<div id="banner-img"></div>
- <div id="banner-description">
+ <div id="banner-description" class="cr-secondary-text">
<p>$i18n{checkupBody1}</p>
<p>$i18n{checkupBody2}</p>
</div>
diff --git a/chromium/chrome/browser/resources/extensions/checkup.js b/chromium/chrome/browser/resources/extensions/checkup.js
index cb655c10d73..7bca4251098 100644
--- a/chromium/chrome/browser/resources/extensions/checkup.js
+++ b/chromium/chrome/browser/resources/extensions/checkup.js
@@ -3,6 +3,7 @@
// found in the LICENSE file.
import 'chrome://resources/cr_components/managed_footnote/managed_footnote.m.js';
+import 'chrome://resources/cr_elements/shared_style_css.m.js';
import './shared_style.js';
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chromium/chrome/browser/resources/extensions/detail_view.html b/chromium/chrome/browser/resources/extensions/detail_view.html
index de97fd2ba01..2e647218766 100644
--- a/chromium/chrome/browser/resources/extensions/detail_view.html
+++ b/chromium/chrome/browser/resources/extensions/detail_view.html
@@ -40,25 +40,15 @@
flex-grow: 1;
}
- .cr-section.block {
+ .section {
box-sizing: border-box;
- display: block;
- padding-bottom: var(--cr-section-vertical-padding);
- padding-top: var(--cr-section-vertical-padding);
- }
-
- .cr-section.continuation {
- border-top: none;
+ padding: var(--cr-section-vertical-padding) var(--cr-section-padding);
}
- .cr-section.control-line {
+ .cr-row.control-line {
justify-content: space-between;
}
- .cr-section:first-child {
- border: none;
- }
-
.section-content {
color: var(--cr-secondary-text-color);
}
@@ -146,7 +136,7 @@
[[data.name]]
</span>
</div>
- <div class="cr-section continuation control-line" id="enable-section">
+ <div class="cr-row first control-line" id="enable-section">
<span class$="[[computeEnabledStyle_(data.state)]]">
[[computeEnabledText_(data.state, '$i18nPolymer{itemOn}',
'$i18nPolymer{itemOff}')]]
@@ -163,6 +153,12 @@
$i18n{itemReload}
</cr-button>
</template>
+ <cr-tooltip-icon id="parentDisabledPermissionsToolTip"
+ hidden$="[[!data.disableReasons.parentDisabledPermissions]]"
+ tooltip-text="$i18n{parentDisabledPermissions}"
+ icon-class="cr20:kite"
+ icon-aria-label="$i18n{parentDisabledPermissions}">
+ </cr-tooltip-icon>
<cr-toggle id="enableToggle"
aria-label$="[[appOrExtension(
data.type,
@@ -178,7 +174,7 @@
</div>
<div id="warnings" hidden$="[[!hasWarnings_(data.*)]]">
<div id="runtime-warnings" hidden$="[[!data.runtimeWarnings.length]]"
- class="cr-section continuation warning control-line">
+ class="cr-row continuation warning control-line">
<iron-icon class="warning-icon" icon="cr:error"></iron-icon>
<span>
<template is="dom-repeat" items="[[data.runtimeWarnings]]">
@@ -192,7 +188,7 @@
</cr-button>
</template>
</div>
- <div class="cr-section continuation warning" id="suspicious-warning"
+ <div class="cr-row continuation warning" id="suspicious-warning"
hidden$="[[!data.disableReasons.suspiciousInstall]]">
<iron-icon class="warning-icon" icon="cr:warning"></iron-icon>
<span>
@@ -202,7 +198,7 @@
</a>
</span>
</div>
- <div class="cr-section continuation warning control-line"
+ <div class="cr-row continuation warning control-line"
id="corrupted-warning"
hidden$="[[!showRepairButton_(data.disableReasons.corruptInstall)]]">
<iron-icon class="warning-icon" icon="cr:warning"></iron-icon>
@@ -212,18 +208,18 @@
$i18n{itemRepair}
</cr-button>
</div>
- <div class="cr-section continuation warning" id="blacklisted-warning"
+ <div class="cr-row continuation warning" id="blacklisted-warning"
hidden$="[[!data.blacklistText]]">
<iron-icon class="warning-icon" icon="cr:warning"></iron-icon>
<span>[[data.blacklistText]]</span>
</div>
- <div class="cr-section continuation warning" id="update-required-warning"
+ <div class="cr-row continuation warning" id="update-required-warning"
hidden$="[[!data.disableReasons.updateRequired]]">
<iron-icon class="warning-icon" icon="cr:warning"></iron-icon>
<span>$i18n{updateRequiredByPolicy}</span>
</div>
</div>
- <div class="cr-section continuation block">
+ <div class="section">
<div class="section-title" role="heading" aria-level="2">
$i18n{itemDescriptionLabel}
</div>
@@ -231,13 +227,13 @@
[[getDescription_(data.description, '$i18nPolymer{noDescription}')]]
</div>
</div>
- <div class="cr-section block">
+ <div class="section hr">
<div class="section-title" role="heading" aria-level="2">
$i18n{itemVersion}
</div>
<div class="section-content">[[data.version]]</div>
</div>
- <div class="cr-section block">
+ <div class="section hr">
<div class="section-title" role="heading" aria-level="2">
$i18n{itemSize}
</div>
@@ -247,14 +243,14 @@
</paper-spinner-lite>
</div>
</div>
- <div class="cr-section block" id="id-section" hidden$="[[!inDevMode]]">
+ <div class="section hr" id="id-section" hidden$="[[!inDevMode]]">
<div class="section-title" role="heading" aria-level="2">
$i18n{itemIdHeading}
</div>
<div class="section-content">[[data.id]]</div>
</div>
<template is="dom-if" if="[[inDevMode]]">
- <div class="cr-section block" id="inspectable-views">
+ <div class="section hr" id="inspectable-views">
<div class="section-title" role="heading" aria-level="2">
$i18n{itemInspectViews}
</div>
@@ -275,7 +271,7 @@
</div>
</div>
</template>
- <div class="cr-section block">
+ <div class="section hr">
<div class="section-title" role="heading" aria-level="2">
$i18n{itemPermissions}
</div>
@@ -299,7 +295,7 @@
</ul>
</div>
</div>
- <div class="cr-section block">
+ <div class="section hr">
<div class="section-title" role="heading" aria-level="2">
$i18n{itemSiteAccess}
</div>
@@ -328,7 +324,7 @@
</div>
<template is="dom-if"
if="[[hasDependentExtensions_(data.dependentExtensions.splices)]]">
- <div class="cr-section block">
+ <div class="section hr">
<div class="section-title" role="heading" aria-level="2">
$i18n{itemDependencies}
</div>
@@ -389,7 +385,7 @@
<cr-link-row class="hr" hidden="[[!data.webStoreUrl.length]]"
id="viewInStore" label="$i18n{viewInStore}"
on-click="onViewInStoreTap_" external></cr-link-row>
- <div class="cr-section block">
+ <div class="section hr">
<div class="section-title" role="heading" aria-level="2">
$i18n{itemSource}
</div>
diff --git a/chromium/chrome/browser/resources/extensions/error_page.html b/chromium/chrome/browser/resources/extensions/error_page.html
index e5cb53d1172..bfb176278f9 100644
--- a/chromium/chrome/browser/resources/extensions/error_page.html
+++ b/chromium/chrome/browser/resources/extensions/error_page.html
@@ -42,7 +42,6 @@
}
.error-item {
- @apply --cr-section;
padding-inline-start: 0;
}
@@ -128,7 +127,7 @@
<div id="errorsList">
<template is="dom-repeat" items="[[entries_]]">
<div class="item-container">
- <div class$="error-item
+ <div class$="cr-row error-item
[[computeErrorClass_(item, selectedEntry_)]]">
<div actionable class="start" on-click="onErrorItemAction_"
on-keydown="onErrorItemAction_" tabindex="0"
diff --git a/chromium/chrome/browser/resources/extensions/extensions_resources.grd b/chromium/chrome/browser/resources/extensions/extensions_resources.grd
index 81d265b85a7..f149dd7f7c4 100644
--- a/chromium/chrome/browser/resources/extensions/extensions_resources.grd
+++ b/chromium/chrome/browser/resources/extensions/extensions_resources.grd
@@ -14,134 +14,144 @@
<includes>
<include name="IDR_EXTENSIONS_CODE_SECTION_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/code_section.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_ACTIVITY_LOG_ACTIVITY_LOG_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/activity_log/activity_log.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_ACTIVITY_LOG_ACTIVITY_LOG_HISTORY_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/activity_log/activity_log_history.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_ACTIVITY_LOG_ACTIVITY_LOG_HISTORY_ITEM_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/activity_log/activity_log_history_item.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_ACTIVITY_LOG_ACTIVITY_LOG_STREAM_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/activity_log/activity_log_stream.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_ACTIVITY_LOG_ACTIVITY_LOG_STREAM_ITEM_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/activity_log/activity_log_stream_item.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_CHECKUP_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/checkup.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_DETAIL_VIEW_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/detail_view.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_DROP_OVERLAY_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/drop_overlay.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_ERROR_PAGE_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/error_page.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_KEYBOARD_SHORTCUTS_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/keyboard_shortcuts.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<if expr="chromeos">
<include name="IDR_EXTENSIONS_KIOSK_DIALOG_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/kiosk_dialog.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
</if>
<include name="IDR_EXTENSIONS_MANAGER_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/manager.js"
- preprocess="true" use_base_dir="false" type ="BINDATA" />
+ preprocess="true" use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_ICONS_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/icons.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_INSTALL_WARNINGS_DIALOG_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/install_warnings_dialog.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_ITEM_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/item.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_ITEM_LIST_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/item_list.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_LOAD_ERROR_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/load_error.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_HOST_PERMISSIONS_TOGGLE_LIST_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/host_permissions_toggle_list.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_OPTIONS_DIALOG_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/options_dialog.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_PACK_DIALOG_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/pack_dialog.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_PACK_DIALOG_ALERT_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/pack_dialog_alert.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_RUNTIME_HOST_PERMISSIONS_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/runtime_host_permissions.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_RUNTIME_HOSTS_DIALOG_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/runtime_hosts_dialog.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_SHARED_STYLE_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/shared_style.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_SHARED_VARS_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/shared_vars.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_SHORTCUT_INPUT_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/shortcut_input.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_SIDEBAR_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/sidebar.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_TOGGLE_ROW_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/toggle_row.js"
- use_base_dir="false" type ="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_TOOLBAR_JS"
file="${root_gen_dir}/chrome/browser/resources/extensions/toolbar.js"
- preprocess="true" use_base_dir="false" type ="BINDATA" />
+ preprocess="true" use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_CHECKUP_IMAGE"
- file="checkup_image.svg" type="BINDATA" />
+ file="checkup_image.svg" compress="false" type="BINDATA" />
<include name="IDR_EXTENSIONS_CHECKUP_IMAGE_DARK"
- file="checkup_image_dark.svg" type="BINDATA" />
+ file="checkup_image_dark.svg" compress="false" type="BINDATA" />
</includes>
<structures>
<structure name="IDR_EXTENSIONS_ITEM_BEHAVIOR_JS"
file="item_behavior.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_EXTENSIONS_EXTENSIONS_HTML"
file="extensions.html"
+ compress="false"
type="chrome_html" />
<structure name="IDR_EXTENSIONS_DRAG_AND_DROP_HANDLER_JS"
file="drag_and_drop_handler.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_EXTENSIONS_EXTENSIONS_JS"
file="extensions.js"
preprocess="true"
+ compress="false"
type="chrome_html" />
<structure name="IDR_EXTENSIONS_KEYBOARD_SHORTCUT_DELEGATE_JS"
file="keyboard_shortcut_delegate.js"
+ compress="false"
type="chrome_html" />
<if expr="chromeos">
<structure name="IDR_EXTENSIONS_KIOSK_BROWSER_PROXY_JS"
file="kiosk_browser_proxy.js"
+ compress="false"
type="chrome_html" />
</if>
<structure name="IDR_EXTENSIONS_ITEM_UTIL_JS"
file="item_util.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_EXTENSIONS_NAVIGATION_HELPER_JS"
file="navigation_helper.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_EXTENSIONS_SERVICE_JS"
file="service.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_EXTENSIONS_SHORTCUT_UTIL_JS"
file="shortcut_util.js"
+ compress="false"
type="chrome_html" />
</structures>
</release>
diff --git a/chromium/chrome/browser/resources/extensions/item.html b/chromium/chrome/browser/resources/extensions/item.html
index c39e28b1c1c..712997e330d 100644
--- a/chromium/chrome/browser/resources/extensions/item.html
+++ b/chromium/chrome/browser/resources/extensions/item.html
@@ -1,4 +1,4 @@
-<style include="iron-flex cr-hidden-style cr-icons action-link
+<style include="iron-flex cr-shared-style cr-hidden-style cr-icons action-link
shared-style">
.bounded-text,
.multiline-clippable-text,
@@ -21,6 +21,10 @@
flex-shrink: 1;
}
+ cr-tooltip-icon {
+ margin-inline-end: 8px;
+ }
+
#icon-wrapper {
align-self: flex-start;
display: flex;
@@ -89,14 +93,6 @@
width: 18px;
}
- #description,
- #version,
- #extension-id,
- #inspect-views,
- #button-strip {
- @apply --cr-secondary-text;
- }
-
#extension-id {
flex-shrink: 0;
}
@@ -148,10 +144,7 @@
}
paper-tooltip {
- --paper-tooltip: {
- @apply --cr-tooltip;
- min-width: 0;
- };
+ --paper-tooltip-min-width: 0;
}
#errors-button {
@@ -214,12 +207,12 @@
<div id="name-and-version" class="layout horizontal center">
<div id="name" role="heading" aria-level="3"
class="clippable-flex-text">[[data.name]]</div>
- <span id="version" hidden$="[[!inDevMode]]">
+ <span id="version" class="cr-secondary-text" hidden$="[[!inDevMode]]">
[[data.version]]
</span>
</div>
</div>
- <div id="description" class="multiline-clippable-text"
+ <div id="description" class="cr-secondary-text multiline-clippable-text"
hidden$="[[hasWarnings_(data.disableReasons.*, data.*)]]">
[[data.description]]
</div>
@@ -250,13 +243,15 @@
</div>
</template>
<template is="dom-if" if="[[inDevMode]]">
- <div id="extension-id" class="bounded-text">[[data.id]]</div>
+ <div id="extension-id" class="bounded-text cr-secondary-text">
+ [[data.id]]
+ </div>
<template is="dom-if"
if="[[!computeInspectViewsHidden_(data.views)]]">
<!--Note: We wrap inspect-views in a div so that the outer div
doesn't shrink (because it's not display: flex).-->
<div>
- <div id="inspect-views">
+ <div id="inspect-views" class="cr-secondary-text">
<span aria-describedby="a11yAssociation">
$i18n{itemInspectViews}
</span>
@@ -276,7 +271,7 @@
</template>
</div>
</div>
- <div id="button-strip" class="layout horizontal center">
+ <div id="button-strip" class="layout horizontal center cr-secondary-text">
<div class="layout flex horizontal center">
<cr-button id="detailsButton" on-click="onDetailsTap_"
aria-describedby="a11yAssociation">
@@ -312,6 +307,12 @@
$i18n{itemReload}
</cr-button>
</template>
+ <cr-tooltip-icon id="parentDisabledPermissionsToolTip"
+ hidden$="[[!data.disableReasons.parentDisabledPermissions]]"
+ tooltip-text="$i18n{parentDisabledPermissions}"
+ icon-class="cr20:kite"
+ icon-aria-label="$i18n{parentDisabledPermissions}">
+ </cr-tooltip-icon>
<cr-toggle id="enableToggle"
aria-label$="[[appOrExtension(
data.type,
diff --git a/chromium/chrome/browser/resources/extensions/item.js b/chromium/chrome/browser/resources/extensions/item.js
index e82aecbfbe4..fb88800bb62 100644
--- a/chromium/chrome/browser/resources/extensions/item.js
+++ b/chromium/chrome/browser/resources/extensions/item.js
@@ -8,6 +8,7 @@ import 'chrome://resources/cr_elements/cr_icons_css.m.js';
import 'chrome://resources/cr_elements/cr_toggle/cr_toggle.m.js';
import 'chrome://resources/cr_elements/hidden_style_css.m.js';
import 'chrome://resources/cr_elements/icons.m.js';
+import 'chrome://resources/cr_elements/shared_style_css.m.js';
import 'chrome://resources/cr_elements/shared_vars_css.m.js';
import 'chrome://resources/js/action_link.js';
import 'chrome://resources/cr_elements/action_link_css.m.js';
diff --git a/chromium/chrome/browser/resources/extensions/manager.html b/chromium/chrome/browser/resources/extensions/manager.html
index 7cbf68e59ba..74239cd3977 100644
--- a/chromium/chrome/browser/resources/extensions/manager.html
+++ b/chromium/chrome/browser/resources/extensions/manager.html
@@ -39,7 +39,7 @@
<cr-drawer id="drawer" heading="$i18n{toolbarTitle}"
align="$i18n{textdirection}" on-close="onDrawerClose_">
<div class="drawer-content">
- <extensions-sidebar id="sidebar" is-supervised="[[isSupervised_]]"
+ <extensions-sidebar id="sidebar"
on-close-drawer="onCloseDrawer_">
</extensions-sidebar>
</div>
diff --git a/chromium/chrome/browser/resources/extensions/sidebar.html b/chromium/chrome/browser/resources/extensions/sidebar.html
index 3aa0c784932..e0f78db2567 100644
--- a/chromium/chrome/browser/resources/extensions/sidebar.html
+++ b/chromium/chrome/browser/resources/extensions/sidebar.html
@@ -69,7 +69,7 @@
<paper-ripple></paper-ripple>
</a>
</iron-selector>
-<div hidden="[[isSupervised]]">
+<div>
<div class="separator"></div>
<a class="section-item" id="more-extensions" target="_blank"
href="$i18n{getMoreExtensionsUrl}" on-click="onMoreExtensionsTap_">
diff --git a/chromium/chrome/browser/resources/extensions/sidebar.js b/chromium/chrome/browser/resources/extensions/sidebar.js
index 93932a8c7d2..63e8e5bbf67 100644
--- a/chromium/chrome/browser/resources/extensions/sidebar.js
+++ b/chromium/chrome/browser/resources/extensions/sidebar.js
@@ -16,10 +16,6 @@ Polymer({
_template: html`{__html_template__}`,
- properties: {
- isSupervised: Boolean,
- },
-
hostAttributes: {
role: 'navigation',
},
@@ -42,7 +38,6 @@ Polymer({
/** @private */
onMoreExtensionsTap_() {
- assert(!this.isSupervised);
chrome.metricsPrivate.recordUserAction('Options_GetMoreExtensions');
},
});
diff --git a/chromium/chrome/browser/resources/feed_internals/feed_internals.html b/chromium/chrome/browser/resources/feed_internals/feed_internals.html
index 4b8538e8343..809dbee88bf 100644
--- a/chromium/chrome/browser/resources/feed_internals/feed_internals.html
+++ b/chromium/chrome/browser/resources/feed_internals/feed_internals.html
@@ -17,6 +17,7 @@ found in the LICENSE file.
<script src="chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js"></script>
<script src="chrome://resources/mojo/url/mojom/url.mojom-lite.js"></script>
+ <script src="chrome://resources/mojo/mojo/public/mojom/base/time.mojom-lite.js"></script>
<script src="chrome://resources/js/util.js"></script>
<script src="feed_internals.mojom-lite.js"></script>
@@ -44,6 +45,10 @@ found in the LICENSE file.
<td id="is-prefetching-enabled"></td>
</tr>
<tr>
+ <td>Load Stream Status</td>
+ <td id="load-stream-status"></td>
+ </tr>
+ <tr>
<td>Feed Fetch URL</td>
<td id="feed-fetch-url"></td>
</tr>
diff --git a/chromium/chrome/browser/resources/feed_internals/feed_internals.js b/chromium/chrome/browser/resources/feed_internals/feed_internals.js
index 597a695ad84..03811954c5a 100644
--- a/chromium/chrome/browser/resources/feed_internals/feed_internals.js
+++ b/chromium/chrome/browser/resources/feed_internals/feed_internals.js
@@ -23,6 +23,7 @@ function updatePageWithProperties() {
$('is-feed-visible').textContent = properties.isFeedVisible;
$('is-feed-allowed').textContent = properties.isFeedAllowed;
$('is-prefetching-enabled').textContent = properties.isPrefetchingEnabled;
+ $('load-stream-status').textContent = properties.loadStreamStatus;
$('feed-fetch-url').textContent = properties.feedFetchUrl.url;
});
}
@@ -99,23 +100,15 @@ function setLinkNode(node, url) {
}
/**
- * Convert time to string for display.
+ * Convert timeSinceEpoch to string for display.
*
- * @param {feedInternals.mojom.Time|undefined} time
+ * @param {mojoBase.mojom.TimeDelta} timeSinceEpoch
* @return {string}
*/
-function toDateString(time) {
- return time == null ? '' : new Date(time.msSinceEpoch).toLocaleString();
-}
-
-/**
- * Update last fetch properties and current content following a Feed refresh.
- */
-function updateAfterRefresh() {
- // TODO(crbug.com/939907): Listen for Feed update events rather than waiting
- // an arbitrary period of time.
- setTimeout(updatePageWithLastFetchProperties, 1000);
- setTimeout(updatePageWithCurrentContent, 1000);
+function toDateString(timeSinceEpoch) {
+ return timeSinceEpoch.microseconds === 0 ?
+ '' :
+ new Date(timeSinceEpoch.microseconds / 1000).toLocaleString();
}
/**
@@ -129,12 +122,10 @@ function setupEventListeners() {
$('clear-cached-data').addEventListener('click', function() {
pageHandler.clearCachedDataAndRefreshFeed();
- updateAfterRefresh();
});
$('refresh-feed').addEventListener('click', function() {
pageHandler.refreshFeed();
- updateAfterRefresh();
});
$('dump-feed-process-scope').addEventListener('click', function() {
@@ -152,18 +143,23 @@ function setupEventListeners() {
});
$('feed-host-override-apply').addEventListener('click', function() {
- pageHandler.overrideFeedHost($('feed-host-override').value);
+ pageHandler.overrideFeedHost({url: $('feed-host-override').value});
});
}
-document.addEventListener('DOMContentLoaded', function() {
- // Setup backend mojo.
- pageHandler = feedInternals.mojom.PageHandler.getRemote();
-
+function updatePage() {
updatePageWithProperties();
updatePageWithUserClass();
updatePageWithLastFetchProperties();
updatePageWithCurrentContent();
+}
+
+document.addEventListener('DOMContentLoaded', function() {
+ // Setup backend mojo.
+ pageHandler = feedInternals.mojom.PageHandler.getRemote();
+
+ setInterval(updatePage, 2000);
+ updatePage();
setupEventListeners();
});
diff --git a/chromium/chrome/browser/resources/feedback/js/feedback.js b/chromium/chrome/browser/resources/feedback/js/feedback.js
index 28c0f6e72a5..5eeed5dbac3 100644
--- a/chromium/chrome/browser/resources/feedback/js/feedback.js
+++ b/chromium/chrome/browser/resources/feedback/js/feedback.js
@@ -240,8 +240,11 @@ function sendReport() {
feedbackInfo.sendHistograms = useHistograms;
- // If the user doesn't want to send the screenshot.
- if (!$('screenshot-checkbox').checked) {
+ if ($('screenshot-checkbox').checked) {
+ // The user is okay with sending the screenshot and tab titles.
+ feedbackInfo.sendTabTitles = true;
+ } else {
+ // The user doesn't want to send the screenshot, so clear it.
feedbackInfo.screenshot = null;
}
diff --git a/chromium/chrome/browser/resources/gaia_auth_host/authenticator.js b/chromium/chrome/browser/resources/gaia_auth_host/authenticator.js
index c219e01b3b0..a450e1d88e7 100644
--- a/chromium/chrome/browser/resources/gaia_auth_host/authenticator.js
+++ b/chromium/chrome/browser/resources/gaia_auth_host/authenticator.js
@@ -172,6 +172,16 @@ cr.define('cr.login', function() {
'samlAclUrl',
];
+ /**
+ * Extract domain name from an URL.
+ * @param {string} url An URL string.
+ * @return {string} The host name of the URL.
+ */
+ function extractDomain(url) {
+ const a = document.createElement('a');
+ a.href = url;
+ return a.hostname;
+ }
/**
* Handlers for the HTML5 messages received from Gaia.
@@ -319,6 +329,7 @@ cr.define('cr.login', function() {
this.onePasswordCallback = null;
this.insecureContentBlockedCallback = null;
this.samlApiUsedCallback = null;
+ this.recordSAMLProviderCallback = null;
this.missingGaiaInfoCallback = null;
/**
* Callback allowing to request whether the specified user which
@@ -937,6 +948,12 @@ cr.define('cr.login', function() {
return;
}
+ if (this.recordSAMLProviderCallback && this.authFlow == AuthFlow.SAML) {
+ // Makes distinction between different SAML providers
+ this.recordSAMLProviderCallback(
+ this.samlHandler_.x509certificate || '');
+ }
+
if (this.isSamlUserPasswordless_ && this.authFlow == AuthFlow.SAML &&
this.email_ && this.gaiaId_) {
// No password needed for this user, so complete immediately.
@@ -1126,7 +1143,6 @@ cr.define('cr.login', function() {
return;
}
- this.authDomain = this.samlHandler_.authDomain;
this.authFlow = AuthFlow.SAML;
this.webview_.focus();
@@ -1236,6 +1252,14 @@ cr.define('cr.login', function() {
return;
}
+ // Ignore errors from subframe loads, as these should not cause an error
+ // screen to be displayed. When a subframe load is triggered, it means
+ // that the main frame load has succeeded, so the host is reachable in
+ // general.
+ if (!e.isTopLevel) {
+ return;
+ }
+
this.dispatchEvent(new CustomEvent(
'loadAbort', {detail: {error_code: e.code, src: e.url}}));
}
@@ -1248,6 +1272,9 @@ cr.define('cr.login', function() {
if (this.gaiaId_) {
this.maybeCompleteAuth_();
}
+ if (e.isTopLevel) {
+ this.authDomain = extractDomain(e.url);
+ }
}
/**
diff --git a/chromium/chrome/browser/resources/gaia_auth_host/password_change_authenticator_test.unitjs b/chromium/chrome/browser/resources/gaia_auth_host/password_change_authenticator_test.unitjs
index 115e64badb3..96639449191 100644
--- a/chromium/chrome/browser/resources/gaia_auth_host/password_change_authenticator_test.unitjs
+++ b/chromium/chrome/browser/resources/gaia_auth_host/password_change_authenticator_test.unitjs
@@ -17,6 +17,11 @@ const EXAMPLE_PING_ENDPOINT =
'https://login.pingone.com/idp/directory/a/12345/password/chg/67890';
PasswordChangeAuthenticatorUnitTest = class extends testing.Test {
+ /** @override */
+ testGenCppIncludes() {
+ GEN(`#include "content/public/test/browser_test.h"`);
+ }
+
get browsePreload() {
return DUMMY_URL;
}
diff --git a/chromium/chrome/browser/resources/gaia_auth_host/saml_handler.js b/chromium/chrome/browser/resources/gaia_auth_host/saml_handler.js
index 6632731b94e..d5fd2b6e3bd 100644
--- a/chromium/chrome/browser/resources/gaia_auth_host/saml_handler.js
+++ b/chromium/chrome/browser/resources/gaia_auth_host/saml_handler.js
@@ -51,6 +51,12 @@ cr.define('cr.login', function() {
'x-verified-access-challenge-response';
/** @const */
+ const BEGIN_CERTIFICATE = '-----BEGIN CERTIFICATE-----';
+
+ /** @const */
+ const END_CERTIFICATE = '-----END CERTIFICATE-----';
+
+ /** @const */
const injectedScriptName = 'samlInjected';
/**
@@ -112,17 +118,6 @@ cr.define('cr.login', function() {
}
/**
- * Extract domain name from an URL.
- * @param {string} url An URL string.
- * @return {string} The host name of the URL.
- */
- function extractDomain(url) {
- const a = document.createElement('a');
- a.href = url;
- return a.hostname;
- }
-
- /**
* A handler to provide saml support for the given webview that hosts the
* auth IdP pages.
*/
@@ -189,12 +184,6 @@ cr.define('cr.login', function() {
this.abortedTopLevelUrl_ = null;
/**
- * The domain of the Saml IdP.
- * @type {string}
- */
- this.authDomain = '';
-
- /**
* Scraped password stored in an id to password field value map.
* @private {!Object<string, string>}
*/
@@ -264,6 +253,12 @@ cr.define('cr.login', function() {
this.verifiedAccessChallengeResponse_ = null;
/**
+ * Certificate that were extracted from the SAMLResponse.
+ * @public {?string}
+ */
+ this.x509certificate = null;
+
+ /**
* The password-attributes that were extracted from the SAMLResponse, if
* any. (Doesn't contain the password itself).
* @private {!PasswordAttributes}
@@ -441,6 +436,7 @@ cr.define('cr.login', function() {
this.lastApiPasswordBytes_ = null;
this.passwordAttributes_ =
samlPasswordAttributes.PasswordAttributes.EMPTY;
+ this.x509certificate = null;
}
/**
@@ -527,6 +523,31 @@ cr.define('cr.login', function() {
}
/**
+ * Set x509certificate in pem-format which is extracted from samlResponse
+ * and will be used to record SAML provider
+ * @param {string} samlResponse SAML response which is received from SAML
+ * page.
+ * @private
+ */
+ setX509certificate_(samlResponse) {
+ const parser = new DOMParser();
+ const xmlDoc = parser.parseFromString(samlResponse, 'text/xml');
+ let certificate = xmlDoc.getElementsByTagName('ds:X509Certificate');
+ if (!certificate || certificate.length == 0) {
+ // tag 'ds:X509Certificate' doesn't exist
+ certificate = xmlDoc.getElementsByTagName('X509Certificate');
+ }
+
+ if (certificate && certificate.length > 0 && certificate[0].childNodes &&
+ certificate[0].childNodes[0] &&
+ certificate[0].childNodes[0].nodeValue) {
+ certificate = certificate[0].childNodes[0].nodeValue;
+ this.x509certificate = BEGIN_CERTIFICATE + '\n' + certificate.trim() +
+ '\n' + END_CERTIFICATE + '\n';
+ }
+ }
+
+ /**
* Handler for webRequest.onBeforeRequest that looks for the Base64
* encoded SAMLResponse in the POST-ed formdata sent from the SAML page.
* Non-blocking.
@@ -557,6 +578,8 @@ cr.define('cr.login', function() {
return;
}
+ this.setX509certificate_(samlResponse);
+
this.passwordAttributes_ =
samlPasswordAttributes.readPasswordAttributes(samlResponse);
}
@@ -808,14 +831,8 @@ cr.define('cr.login', function() {
}
onPageLoaded_(channel, msg) {
- this.authDomain = extractDomain(msg.url);
- this.dispatchEvent(new CustomEvent('authPageLoaded', {
- detail: {
- url: msg.url,
- isSAMLPage: this.isSamlPage_,
- domain: this.authDomain
- }
- }));
+ this.dispatchEvent(new CustomEvent(
+ 'authPageLoaded', {detail: {isSAMLPage: this.isSamlPage_}}));
}
onScrollInfo_(channel, msg) {
diff --git a/chromium/chrome/browser/resources/gaia_auth_host/saml_password_attributes_test.unitjs b/chromium/chrome/browser/resources/gaia_auth_host/saml_password_attributes_test.unitjs
index d44e0ef2072..f684c53f2ea 100644
--- a/chromium/chrome/browser/resources/gaia_auth_host/saml_password_attributes_test.unitjs
+++ b/chromium/chrome/browser/resources/gaia_auth_host/saml_password_attributes_test.unitjs
@@ -22,6 +22,7 @@ SamlPasswordAttributesUnitTest.prototype = {
/** @override */
testGenCppIncludes() {
GEN(`#include "chrome/test/base/ui_test_utils.h"`);
+ GEN(`#include "content/public/test/browser_test.h"`);
},
/** @override */
diff --git a/chromium/chrome/browser/resources/gaia_auth_host/saml_timestamps_test.unitjs b/chromium/chrome/browser/resources/gaia_auth_host/saml_timestamps_test.unitjs
index 2069bee233d..22443c7c80f 100644
--- a/chromium/chrome/browser/resources/gaia_auth_host/saml_timestamps_test.unitjs
+++ b/chromium/chrome/browser/resources/gaia_auth_host/saml_timestamps_test.unitjs
@@ -16,6 +16,11 @@ SamlTimestampsUnitTest.prototype = {
// No need to run these checks - see comment in SamlPasswordAttributesTest.
runAccessibilityChecks: false,
+
+ /** @override */
+ testGenCppIncludes() {
+ GEN(`#include "content/public/test/browser_test.h"`);
+ },
};
const ROUNDTRIP_DATA = [
diff --git a/chromium/chrome/browser/resources/history/BUILD.gn b/chromium/chrome/browser/resources/history/BUILD.gn
index a7e687ec7d2..e23a639a4d9 100644
--- a/chromium/chrome/browser/resources/history/BUILD.gn
+++ b/chromium/chrome/browser/resources/history/BUILD.gn
@@ -5,7 +5,7 @@
import("//chrome/common/features.gni")
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/grit/grit_rule.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
import("../optimize_webui.gni")
if (optimize_webui) {
@@ -47,7 +47,7 @@ if (optimize_webui) {
"root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir),
]
- deps = [ ":polymer3_elements" ]
+ deps = [ ":web_components" ]
defines = chrome_grit_defines
outputs = [
"grit/history_resources.h",
@@ -213,77 +213,17 @@ js_library("synced_device_manager") {
]
}
-group("polymer3_elements") {
- public_deps = [
- ":app_module",
- ":history_item_module",
- ":history_list_module",
- ":history_toolbar_module",
- ":router_module",
- ":shared_style_module",
- ":shared_vars_module",
- ":side_bar_module",
- ":synced_device_card_module",
- ":synced_device_manager_module",
+html_to_js("web_components") {
+ js_files = [
+ "app.js",
+ "history_item.js",
+ "history_list.js",
+ "history_toolbar.js",
+ "router.js",
+ "shared_style.js",
+ "shared_vars.js",
+ "side_bar.js",
+ "synced_device_card.js",
+ "synced_device_manager.js",
]
}
-
-polymer_modulizer("app") {
- html_file = "app.html"
- js_file = "app.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("history_item") {
- html_file = "history_item.html"
- js_file = "history_item.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("history_list") {
- html_file = "history_list.html"
- js_file = "history_list.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("history_toolbar") {
- html_file = "history_toolbar.html"
- js_file = "history_toolbar.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("router") {
- html_file = "router.html"
- js_file = "router.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("shared_style") {
- html_file = "shared_style.html"
- js_file = "shared_style.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("shared_vars") {
- html_file = "shared_vars.html"
- js_file = "shared_vars.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("side_bar") {
- html_file = "side_bar.html"
- js_file = "side_bar.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("synced_device_card") {
- html_file = "synced_device_card.html"
- js_file = "synced_device_card.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("synced_device_manager") {
- html_file = "synced_device_manager.html"
- js_file = "synced_device_manager.js"
- html_type = "v3-ready"
-}
diff --git a/chromium/chrome/browser/resources/history/history_list.html b/chromium/chrome/browser/resources/history/history_list.html
index 1ee41a6085c..a60a4d21e86 100644
--- a/chromium/chrome/browser/resources/history/history_list.html
+++ b/chromium/chrome/browser/resources/history/history_list.html
@@ -5,9 +5,8 @@
overflow: auto;
}
- iron-list {
- @apply --card-sizing;
- margin-top: var(--first-card-padding-top);
+ .history-cards {
+ margin-block-start: var(--first-card-padding-top);
}
dialog [slot=body] {
@@ -19,7 +18,8 @@
[[noResultsMessage_(searchedTerm)]]
</div>
- <iron-list items="[[historyData_]]" as="item" id="infinite-list"
+ <iron-list class="history-cards"
+ items="[[historyData_]]" as="item" id="infinite-list"
role="grid" aria-rowcount$="[[historyData_.length]]"
hidden$="[[!hasResults_(historyData_.length)]]" preserve-focus>
<template>
diff --git a/chromium/chrome/browser/resources/history/history_resources.grd b/chromium/chrome/browser/resources/history/history_resources.grd
index 3268ac6eb86..ee746584034 100644
--- a/chromium/chrome/browser/resources/history/history_resources.grd
+++ b/chromium/chrome/browser/resources/history/history_resources.grd
@@ -15,65 +15,75 @@
<!-- Generated Polymer 3 elements -->
<include name="IDR_HISTORY_APP_JS"
file="${root_gen_dir}/chrome/browser/resources/history/app.js"
- use_base_dir="false" type="BINDATA" preprocess="true" />
+ use_base_dir="false" compress="false" type="BINDATA" preprocess="true" />
<include name="IDR_HISTORY_HISTORY_ITEM_JS"
file="${root_gen_dir}/chrome/browser/resources/history/history_item.js"
- use_base_dir="false" type="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_HISTORY_HISTORY_LIST_JS"
file="${root_gen_dir}/chrome/browser/resources/history/history_list.js"
- use_base_dir="false" type="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_HISTORY_HISTORY_TOOLBAR_JS"
file="${root_gen_dir}/chrome/browser/resources/history/history_toolbar.js"
- use_base_dir="false" type="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_HISTORY_ROUTER_JS"
file="${root_gen_dir}/chrome/browser/resources/history/router.js"
- use_base_dir="false" type="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_HISTORY_SHARED_STYLE_JS"
file="${root_gen_dir}/chrome/browser/resources/history/shared_style.js"
- use_base_dir="false" type="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_HISTORY_SHARED_VARS_JS"
file="${root_gen_dir}/chrome/browser/resources/history/shared_vars.js"
- use_base_dir="false" type="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_HISTORY_SIDE_BAR_JS"
file="${root_gen_dir}/chrome/browser/resources/history/side_bar.js"
- use_base_dir="false" type="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_HISTORY_SYNCED_DEVICE_CARD_JS"
file="${root_gen_dir}/chrome/browser/resources/history/synced_device_card.js"
- use_base_dir="false" type="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_HISTORY_SYNCED_DEVICE_MANAGER_JS"
file="${root_gen_dir}/chrome/browser/resources/history/synced_device_manager.js"
- use_base_dir="false" type="BINDATA" />
+ use_base_dir="false" compress="false" type="BINDATA" />
<include name="IDR_HISTORY_CONSTANTS_JS"
file="constants.js"
+ compress="false"
type="BINDATA" />
<include name="IDR_HISTORY_EXTERNS_JS"
file="externs.js"
+ compress="false"
type="BINDATA" />
<include name="IDR_HISTORY_HISTORY_HTML"
file="history.html"
preprocess="true"
+ compress="false"
type="BINDATA" />
<include name="IDR_HISTORY_HISTORY_JS"
file="history.js"
+ compress="false"
type="BINDATA" />
<include name="IDR_HISTORY_IMAGES_SIGN_IN_PROMO_DARK_SVG"
file="images\sign_in_promo_dark.svg"
+ compress="false"
type="BINDATA" />
<include name="IDR_HISTORY_IMAGES_SIGN_IN_PROMO_SVG"
file="images\sign_in_promo.svg"
+ compress="false"
type="BINDATA" />
<include name="IDR_HISTORY_BROWSER_SERVICE_JS"
file="browser_service.js"
+ compress="false"
type="BINDATA" />
<include name="IDR_HISTORY_LAZY_LOAD_JS"
file="lazy_load.js"
+ compress="false"
type="BINDATA" />
<include name="IDR_HISTORY_QUERY_MANAGER_JS"
file="query_manager.js"
+ compress="false"
type="BINDATA" />
<include name="IDR_HISTORY_SEARCHED_LABEL_JS"
file="searched_label.js"
+ compress="false"
type="BINDATA" />
</includes>
</release>
diff --git a/chromium/chrome/browser/resources/history/shared_style.html b/chromium/chrome/browser/resources/history/shared_style.html
index fb85d9ee6a1..6eeb8d12795 100644
--- a/chromium/chrome/browser/resources/history/shared_style.html
+++ b/chromium/chrome/browser/resources/history/shared_style.html
@@ -5,6 +5,14 @@
text-decoration: none;
}
+ .history-cards {
+ margin: 0 auto;
+ max-width: var(--card-max-width);
+ min-width: var(--card-min-width);
+ padding: 0 var(--card-padding-side);
+ width: calc(100% - 2 * var(--card-padding-side));
+ }
+
.card-title {
align-items: center;
border-bottom: 1px solid var(--card-border-color);
diff --git a/chromium/chrome/browser/resources/history/shared_vars.html b/chromium/chrome/browser/resources/history/shared_vars.html
index 0a91d29e929..5387f365c01 100644
--- a/chromium/chrome/browser/resources/history/shared_vars.html
+++ b/chromium/chrome/browser/resources/history/shared_vars.html
@@ -8,13 +8,6 @@
--card-min-width: 550px;
--card-padding-between: 16px;
--card-padding-side: 24px;
- --card-sizing: {
- margin: 0 auto;
- max-width: var(--card-max-width);
- min-width: var(--card-min-width);
- padding: 0 var(--card-padding-side);
- width: calc(100% - 2 * var(--card-padding-side));
- };
--first-card-padding-top: 24px;
--history-item-time-color: #646464;
--interactive-color: var(--google-blue-500);
diff --git a/chromium/chrome/browser/resources/history/synced_device_card.html b/chromium/chrome/browser/resources/history/synced_device_card.html
index 7f7b760db02..31ac12f98d8 100644
--- a/chromium/chrome/browser/resources/history/synced_device_card.html
+++ b/chromium/chrome/browser/resources/history/synced_device_card.html
@@ -1,9 +1,7 @@
<style include="shared-style">
:host {
- @apply --card-sizing;
-webkit-tap-highlight-color: transparent;
display: block;
- padding-bottom: var(--card-padding-between);
}
#card-heading {
diff --git a/chromium/chrome/browser/resources/history/synced_device_manager.html b/chromium/chrome/browser/resources/history/synced_device_manager.html
index 61f2d58223c..d03a367a7cb 100644
--- a/chromium/chrome/browser/resources/history/synced_device_manager.html
+++ b/chromium/chrome/browser/resources/history/synced_device_manager.html
@@ -49,10 +49,16 @@
#synced-device-list {
padding-top: var(--first-card-padding-top);
}
+
+ history-synced-device-card {
+ margin-block-end: var(--card-padding-between);
+ }
</style>
- <div id="synced-device-list" hidden="[[!syncedDevices_.length]]">
+ <div id="synced-device-list" class="history-cards"
+ hidden="[[!syncedDevices_.length]]">
<template is="dom-repeat" items="[[syncedDevices_]]" as="syncedDevice">
- <history-synced-device-card device="[[syncedDevice.device]]"
+ <history-synced-device-card
+ device="[[syncedDevice.device]]"
last-update-time="[[syncedDevice.lastUpdateTime]]"
tabs="[[syncedDevice.tabs]]"
separator-indexes="[[syncedDevice.separatorIndexes]]"
diff --git a/chromium/chrome/browser/resources/identity_scope_approval_dialog/background.js b/chromium/chrome/browser/resources/identity_scope_approval_dialog/background.js
index 2cbcbf5fb47..785ff0850d7 100644
--- a/chromium/chrome/browser/resources/identity_scope_approval_dialog/background.js
+++ b/chromium/chrome/browser/resources/identity_scope_approval_dialog/background.js
@@ -9,8 +9,9 @@
* @param {string} url A URL that will be loaded in the webview.
* @param {string} mode 'interactive' or 'silent'. The window will be displayed
* if the mode is 'interactive'.
+ * @param {string} partition A name used for the webview partition.
*/
-function showAuthDialog(key, url, mode) {
+function showAuthDialog(key, url, mode, partition) {
const options =
{frame: 'none', id: key, minWidth: 1024, minHeight: 768, hidden: true};
chrome.app.window.create(
@@ -20,7 +21,8 @@ function showAuthDialog(key, url, mode) {
if (mode == 'interactive') {
windowParam = win;
}
- win.contentWindow.loadAuthUrlAndShowWindow(url, windowParam);
+ win.contentWindow.loadAuthUrlAndShowWindow(
+ url, windowParam, partition);
});
});
}
diff --git a/chromium/chrome/browser/resources/identity_scope_approval_dialog/scope_approval_dialog.js b/chromium/chrome/browser/resources/identity_scope_approval_dialog/scope_approval_dialog.js
index 32abed9db34..c0c67900f09 100644
--- a/chromium/chrome/browser/resources/identity_scope_approval_dialog/scope_approval_dialog.js
+++ b/chromium/chrome/browser/resources/identity_scope_approval_dialog/scope_approval_dialog.js
@@ -12,8 +12,9 @@ let windowId;
* @param {Object} win The dialog window that contains this page. Can
* be left undefined if the caller does not want to display the
* window.
+ * @param {string} partition The partition name used for the webview.
*/
-function loadAuthUrlAndShowWindow(url, win) {
+function loadAuthUrlAndShowWindow(url, win, partition) {
// Send popups from the webview to a normal browser window.
webview.addEventListener('newwindow', function(e) {
e.window.discard();
@@ -43,11 +44,14 @@ function loadAuthUrlAndShowWindow(url, win) {
document.querySelector('.titlebar').classList.add('titlebar-border');
}
+ webview.partition = partition;
webview.src = url;
+ let windowShown = false;
webview.addEventListener('loadstop', function() {
- if (win) {
+ if (win && !windowShown) {
win.show();
windowId = win.id;
+ windowShown = true;
}
});
}
diff --git a/chromium/chrome/browser/resources/inline_login/OWNERS b/chromium/chrome/browser/resources/inline_login/OWNERS
index 408e7263ff1..4c9d8ae0b75 100644
--- a/chromium/chrome/browser/resources/inline_login/OWNERS
+++ b/chromium/chrome/browser/resources/inline_login/OWNERS
@@ -1 +1,3 @@
achuith@chromium.org
+anastasiian@chromium.org
+sinhak@chromium.org
diff --git a/chromium/chrome/browser/resources/inline_login/inline_login.css b/chromium/chrome/browser/resources/inline_login/inline_login.css
index dfbe238a01e..5e3a81b948c 100644
--- a/chromium/chrome/browser/resources/inline_login/inline_login.css
+++ b/chromium/chrome/browser/resources/inline_login/inline_login.css
@@ -55,6 +55,10 @@ body,
* button at the bottom.
*/
<if expr="chromeos">
+#signin-frame {
+ top: -35px; /*dialog top border size*/
+}
+
#contents,
#signin-frame {
height: calc(100% - 96px);
diff --git a/chromium/chrome/browser/resources/inspect/inspect.css b/chromium/chrome/browser/resources/inspect/inspect.css
index e13ea7a561a..b2bced22b9d 100644
--- a/chromium/chrome/browser/resources/inspect/inspect.css
+++ b/chromium/chrome/browser/resources/inspect/inspect.css
@@ -334,8 +334,8 @@ dialog.config {
position: relative;
}
-#port-forwarding-enable {
- vertical-align: middle;
+.port-forwarding-container {
+ display: flex;
}
.close-button {
diff --git a/chromium/chrome/browser/resources/inspect/inspect.html b/chromium/chrome/browser/resources/inspect/inspect.html
index cdd1e511b70..50b9762fc5b 100644
--- a/chromium/chrome/browser/resources/inspect/inspect.html
+++ b/chromium/chrome/browser/resources/inspect/inspect.html
@@ -98,7 +98,7 @@ found in the LICENSE file.
Specify hosts and ports of the target discovery servers.
</div>
<div class="config-buttons">
- <label class="port-forwarding">
+ <label class="port-forwarding-container">
<input id="port-forwarding-enable" type="checkbox" disabled>Enable port forwarding
</label>
<button id="button-done">Done</button>
diff --git a/chromium/chrome/browser/resources/interventions_internals/index.js b/chromium/chrome/browser/resources/interventions_internals/index.js
index 3e58e98b90f..752d3913dac 100644
--- a/chromium/chrome/browser/resources/interventions_internals/index.js
+++ b/chromium/chrome/browser/resources/interventions_internals/index.js
@@ -80,10 +80,8 @@ function addMoreDetailsButton(element, pageId) {
*/
function pushRowToTopOfLogsTable(row, table) {
const newRow = table.insertRow(1);
- newRow.className = row.className;
- newRow.id = row.id;
- newRow.innerHTML = row.innerHTML;
- row.remove();
+ table.querySelector('tbody').insertBefore(row, newRow);
+ newRow.remove();
}
/**
diff --git a/chromium/chrome/browser/resources/local_ntp/chevron.svg b/chromium/chrome/browser/resources/local_ntp/chevron.svg
new file mode 100644
index 00000000000..5a60ec24783
--- /dev/null
+++ b/chromium/chrome/browser/resources/local_ntp/chevron.svg
@@ -0,0 +1 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M12.884 16.123a1.229 1.229 0 0 1-1.768 0l-6.25-6.428a1.3 1.3 0 0 1-.366-.91c0-.709.56-1.285 1.25-1.285.345 0 .657.144.884.377L12 13.397l5.366-5.52a1.23 1.23 0 0 1 .884-.377c.69 0 1.25.576 1.25 1.286a1.3 1.3 0 0 1-.366.909l-6.25 6.428z" fill="#5F6368"/></svg> \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/local_ntp/doodles.css b/chromium/chrome/browser/resources/local_ntp/doodles.css
index ca9a379de2d..1b13665872c 100644
--- a/chromium/chrome/browser/resources/local_ntp/doodles.css
+++ b/chromium/chrome/browser/resources/local_ntp/doodles.css
@@ -3,9 +3,8 @@
* found in the LICENSE file. */
#logo {
- height: calc(var(--logo-height) + var(--logo-margin-bottom));
margin-top: var(--logo-margin-top);
- min-height: fit-content;
+ min-height: calc(var(--logo-height) + var(--logo-margin-bottom));
position: relative;
}
@@ -89,11 +88,11 @@ body.alternate-logo #logo-non-white {
}
#logo-default,
-.use-notifier #logo-non-white {
+.dont-show-doodle #logo-non-white {
display: block;
}
#logo-non-white,
-.use-notifier #logo-default {
+.dont-show-doodle #logo-default {
display: none;
}
@@ -108,8 +107,8 @@ body.alternate-logo #logo-non-white {
text-align: text-center;
}
-.use-notifier #logo-doodle-container,
-.use-notifier #logo-doodle-iframe {
+.dont-show-doodle #logo-doodle-container,
+.dont-show-doodle #logo-doodle-iframe {
display: none;
}
@@ -123,80 +122,6 @@ body.alternate-logo #logo-non-white {
width: var(--logo-iframe-width);
}
-#logo-doodle-notifier {
- display: none;
-}
-.use-notifier #logo-doodle-notifier {
- background: transparent;
- border: 0;
- cursor: pointer;
- display: inline-block;
- height: 24px;
- left: calc(50% + 148px);
- padding: 0;
- position: absolute;
- top: 100px;
- width: 24px;
-}
-@keyframes anim-pos {
- 0% { transform: translate(-98%, 0); }
- 100% { transform: translate(98%, 0); }
-}
-@keyframes anim-z-order {
- 0% { z-index: 100; }
- 100% { z-index: 1; }
-}
-.use-notifier #logo-doodle-notifier .outer {
- animation: anim-z-order 3520ms linear infinite;
- height: 37.5%;
- left: 50%;
- margin-inline-start: -18.75%;
- margin-top: -18.75%;
- position: absolute;
- top: 50%;
- width: 37.5%;
-}
-.use-notifier #logo-doodle-notifier .inner {
- animation: anim-pos 880ms cubic-bezier(.445, .05, .55, .95)
- infinite alternate;
- border-radius: 50%;
- height: 100%;
- position: absolute;
- transform: rotate(90deg);
- width: 100%;
-}
-.use-notifier #logo-doodle-notifier .ball0 {
- animation-delay: 2640ms;
- transform: rotate(45deg);
-}
-.use-notifier #logo-doodle-notifier .ball1 {
- animation-delay: 1760ms;
- transform: rotate(135deg);
-}
-.use-notifier #logo-doodle-notifier .ball2 {
- transform: rotate(225deg);
-}
-.use-notifier #logo-doodle-notifier .ball3 {
- animation-delay: 880ms;
- transform: rotate(315deg);
-}
-.use-notifier #logo-doodle-notifier .ball0 .inner {
- background: linear-gradient(
- 315deg, rgb(0, 85, 221), rgb(0, 119, 255), rgb(0, 119, 255));
-}
-.use-notifier #logo-doodle-notifier .ball1 .inner {
- background: linear-gradient(
- 225deg, rgb(221, 0, 0), rgb(238, 51, 51), rgb(255, 119, 85));
-}
-.use-notifier #logo-doodle-notifier .ball2 .inner {
- background: linear-gradient(
- 90deg, rgb(0, 119, 68), rgb(0, 153, 68), rgb(85, 187, 85));
-}
-.use-notifier #logo-doodle-notifier .ball3 .inner {
- background: linear-gradient(
- 0deg, rgb(255, 170, 51), rgb(255, 204, 0), rgb(255, 221, 102));
-}
-
#ddlsb {
border-radius: 6px;
cursor: pointer;
diff --git a/chromium/chrome/browser/resources/local_ntp/doodles.js b/chromium/chrome/browser/resources/local_ntp/doodles.js
index 2e0543b4161..b1b7d6e0473 100644
--- a/chromium/chrome/browser/resources/local_ntp/doodles.js
+++ b/chromium/chrome/browser/resources/local_ntp/doodles.js
@@ -43,7 +43,6 @@ doodles.IDS = {
LOGO_DOODLE_IFRAME: 'logo-doodle-iframe',
LOGO_DOODLE_CONTAINER: 'logo-doodle-container',
LOGO_DOODLE_BUTTON: 'logo-doodle-button',
- LOGO_DOODLE_NOTIFIER: 'logo-doodle-notifier',
LOGO_DOODLE_WRAPPER: 'logo-doodle-wrapper',
};
@@ -164,21 +163,6 @@ doodles.init = function() {
});
}
});
-
- // Set up doodle notifier (but it may be invisible).
- const doodleNotifier = $(doodles.IDS.LOGO_DOODLE_NOTIFIER);
- doodleNotifier.title = configData.translatedStrings.clickToViewDoodle;
- doodleNotifier.addEventListener('click', function(e) {
- e.preventDefault();
- const state = window.history.state || {};
- state.notheme = true;
- window.history.replaceState(state, document.title);
- ntpApiHandle.logEvent(doodles.LOG_TYPE.NTP_STATIC_LOGO_SHOWN_FROM_CACHE);
- ntpApiHandle.onthemechange();
- if (e.detail === 0) { // Activated by keyboard.
- $(doodles.IDS.LOGO_DOODLE_BUTTON).focus();
- }
- });
};
/**
diff --git a/chromium/chrome/browser/resources/local_ntp/externs.js b/chromium/chrome/browser/resources/local_ntp/externs.js
index 62e31b4748f..a23b3244f00 100644
--- a/chromium/chrome/browser/resources/local_ntp/externs.js
+++ b/chromium/chrome/browser/resources/local_ntp/externs.js
@@ -413,6 +413,8 @@ window.chrome.embeddedSearch.newTabPage.openExtensionsPage;
window.chrome.embeddedSearch.searchBox;
/** @param {number} line */
window.chrome.embeddedSearch.searchBox.deleteAutocompleteMatch;
+/** @param {number} suggestionGroupId */
+window.chrome.embeddedSearch.searchBox.toggleSuggestionGroupIdVisibility;
window.chrome.embeddedSearch.searchBox.isKeyCaptureEnabled;
/** @param {number} latencyMs */
window.chrome.embeddedSearch.searchBox.logCharTypedToRepaintLatency;
@@ -440,6 +442,7 @@ let ACMatchClassification;
* descriptionClass: !Array<!ACMatchClassification>,
* destinationUrl: string,
* fillIntoEdit: string,
+ * suggestionGroupId: number,
* iconUrl: string,
* imageDominantColor: string,
* imageUrl: string,
@@ -454,7 +457,16 @@ let AutocompleteMatch;
/**
* @typedef {{
+ * header: string,
+ * hidden: boolean,
+ * }}
+ */
+let SuggestionGroup;
+
+/**
+ * @typedef {{
* input: string,
+ * suggestionGroupsMap: !Object<!SuggestionGroup>,
* matches: !Array<!AutocompleteMatch>,
* }}
*/
diff --git a/chromium/chrome/browser/resources/local_ntp/local_ntp.css b/chromium/chrome/browser/resources/local_ntp/local_ntp.css
index e563fe18ff8..d972497fb8d 100644
--- a/chromium/chrome/browser/resources/local_ntp/local_ntp.css
+++ b/chromium/chrome/browser/resources/local_ntp/local_ntp.css
@@ -225,16 +225,17 @@ body.hide-fakebox #fakebox {
width: 24px;
}
-[dir=rtl] :-webkit-any(#realbox-icon, .match-icon) {
+[dir=rtl] #realbox-icon,
+[dir=rtl] .match-icon {
left: auto;
right: 16px;
}
-#realbox-icon[data-icon='google_g'] {
+#realbox-icon[data-icon='google_g.png'] {
background-size: 12px;
}
-#realbox-icon[data-icon='search'] {
+#realbox-icon[data-icon='search.svg'] {
-webkit-mask-size: 20px; /* Loupe in realbox is bigger than in matches. */
}
@@ -245,6 +246,7 @@ body.hide-fakebox #fakebox {
display: none;
left: 0;
overflow: hidden;
+ padding-bottom: 8px;
padding-top: var(--searchbox-height);
position: absolute;
right: 0;
@@ -263,6 +265,7 @@ body.hide-fakebox #fakebox {
}
#realbox-matches a {
+ display: block;
font-size: 16px;
line-height: 1;
outline: none;
@@ -277,6 +280,30 @@ body.hide-fakebox #fakebox {
white-space: nowrap;
}
+#realbox-matches .header {
+ color: rgb(var(--GG700-rgb));
+ font-size: 13px;
+ font-weight: 500;
+ line-height: 16px;
+ margin-top: 8px;
+ padding-inline-start: 12px;
+ text-transform: uppercase;
+}
+
+#realbox-matches .header .remove-icon {
+ -webkit-mask-image: url(chevron.svg);
+ -webkit-transform: rotate(180deg);
+ background-color: var(--search-box-icon, rgb(var(--GG900-rgb)));
+}
+
+#realbox-matches .collapsed .header .remove-icon {
+ -webkit-transform: none;
+}
+
+#realbox-matches .collapsed a:not(.header) {
+ display: none;
+}
+
[dir=rtl] #realbox-matches a {
background-position-x: calc(100% - 16px);
}
@@ -284,27 +311,33 @@ body.hide-fakebox #fakebox {
#realbox-matches a.has-image {
display: flex;
flex-direction: column;
- height: 32px;
- justify-content: center;
padding-bottom: 6px;
padding-top: 6px;
}
#realbox-matches a.has-image > span {
- margin-bottom: 2px;
- margin-top: 2px;
+ position: relative;
+}
+
+#realbox-matches a.has-image > span:first-of-type {
+ top: -1px; /* aligns the top of the text with the top of the image */
+}
+
+#realbox-matches a.has-image > span:last-of-type {
+ bottom: -1px; /* aligns the bottom of the text with the bottom of the image */
}
#realbox-matches a.has-image .description {
font-size: 14px;
+ margin-top: 2px;
}
-#realbox-matches.removable a {
- padding-inline-end: 48px;
+#realbox-matches a.has-image .remove-match {
+ top: 10px;
}
-#realbox-matches a:last-of-type {
- margin-bottom: 8px; /* Last result is tight with border-radius. */
+#realbox-matches.removable a {
+ padding-inline-end: 48px;
}
#realbox-matches a:-webkit-any(:focus-within, .selected) .match-icon {
@@ -340,7 +373,8 @@ html[dir=rtl] .image-container {
background-color: var(--search-box-results-bg-hovered, rgb(232, 232, 233));
}
-#realbox-matches a:-webkit-any(:focus-within, .selected) {
+#realbox-matches a:not(.header):-webkit-any(:focus-within, .selected),
+#realbox-matches a.header:focus-within:not(:focus) {
background-color: var(--search-box-results-bg-selected, rgb(219, 219, 220));
color: var(--search-box-results-text-selected, rgb(var(--GG900-rgb)));
}
@@ -368,6 +402,7 @@ html[dir=rtl] .image-container {
#realbox-matches .remove-match {
border-radius: 50%;
height: 24px;
+ outline: none;
position: absolute;
right: 16px;
top: 4px;
diff --git a/chromium/chrome/browser/resources/local_ntp/local_ntp.html b/chromium/chrome/browser/resources/local_ntp/local_ntp.html
index ccefbd553b0..1608f757440 100644
--- a/chromium/chrome/browser/resources/local_ntp/local_ntp.html
+++ b/chromium/chrome/browser/resources/local_ntp/local_ntp.html
@@ -54,14 +54,6 @@
</div>
</div>
<iframe id="logo-doodle-iframe" scrolling="no"></iframe>
- <!-- A spinner, prompting the doodle. Visible on NTPs with customized
- backgrounds. -->
- <button id="logo-doodle-notifier">
- <div class="outer ball0"><div class="inner"></div></div>
- <div class="outer ball1"><div class="inner"></div></div>
- <div class="outer ball2"><div class="inner"></div></div>
- <div class="outer ball3"><div class="inner"></div></div>
- </button>
</div>
</div>
diff --git a/chromium/chrome/browser/resources/local_ntp/local_ntp.js b/chromium/chrome/browser/resources/local_ntp/local_ntp.js
index 9ab299da153..15950635804 100644
--- a/chromium/chrome/browser/resources/local_ntp/local_ntp.js
+++ b/chromium/chrome/browser/resources/local_ntp/local_ntp.js
@@ -1,4 +1,3 @@
-
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -63,6 +62,7 @@ let RealboxOutputUpdate;
*/
const CLASSES = {
ALTERNATE_LOGO: 'alternate-logo', // Shows white logo if required by theme
+ COLLAPSED: 'collapsed',
// Applies styles to dialogs used in customization.
CUSTOMIZE_DIALOG: 'customize-dialog',
DELAYED_HIDE_NOTIFICATION: 'mv-notice-delayed-hide',
@@ -82,6 +82,7 @@ const CLASSES = {
HAS_IMAGE: 'has-image', // A realbox match with an image.
// Applies a different style to the error notification if a link is present.
HAS_LINK: 'has-link',
+ HEADER: 'header',
HIDE_FAKEBOX: 'hide-fakebox',
HIDE_NOTIFICATION: 'notice-hide',
// Contains the image next to a realbox match. Displays a placeholder color
@@ -102,8 +103,8 @@ const CLASSES = {
SHOW_ELEMENT: 'show-element',
// When the realbox has matches to show.
SHOW_MATCHES: 'show-matches',
- // Applied when the doodle notifier should be shown instead of the doodle.
- USE_NOTIFIER: 'use-notifier',
+ // Applied when the doodle shouldn't be shown, e.g. when a theme is applied.
+ DONT_SHOW_DOODLE: 'dont-show-doodle',
};
const DOCUMENT_MATCH_TYPE = 'document';
@@ -193,6 +194,13 @@ const MAX_NUM_TILES_CUSTOM_LINKS = 10;
const MAX_NUM_TILES_MOST_VISITED = 8;
/**
+ * Indicates a missing suggestion group Id. Based on
+ * SearchSuggestionParser::kNoSuggestionGroupId.
+ * @type {number}
+ */
+const NO_SUGGESTION_GROUP_ID = -1;
+
+/**
* The period of time (ms) before the Most Visited notification is hidden.
* @type {number}
*/
@@ -246,6 +254,14 @@ const REALBOX_KEYDOWN_HANDLED_KEYS = [
let autocompleteResult = null;
/**
+ * The time of the first character insert operation that has not yet been
+ * painted in floating point milliseconds. Used to measure the realbox
+ * responsiveness with a histogram.
+ * @type {number}
+ */
+let charTypedTime = 0;
+
+/**
* The currently visible notification element. Null if no notification is
* present.
* @type {?Object}
@@ -274,14 +290,6 @@ let enterWasPressed = false;
const faviconOrImageUrlToDataUrlCache = {};
/**
- * The time of the first character insert operation that has not yet been
- * painted in floating point milliseconds. Used to measure the realbox
- * responsiveness with a histogram.
- * @type {number}
- */
-let charTypedTime = 0;
-
-/**
* True if dark mode is enabled.
* @type {boolean}
*/
@@ -324,6 +332,12 @@ let lastOutput = {text: '', inline: ''};
let lastRealboxFocusTime = null;
/**
+ * Current realbox match elements.
+ * @type {!Array<!Element>}
+ */
+let matchEls = [];
+
+/**
* The browser embeddedSearch.newTabPage object.
* @type {Object}
*/
@@ -335,6 +349,12 @@ let ntpApiHandle;
*/
let pastedInRealbox = false;
+/**
+ * A map from a suggestion Group ID to the group element for that group ID.
+ * @type {!Object<!Element>}
+ */
+let suggestionGroupElsMap = {};
+
// Helper methods.
/** @return {boolean} */
@@ -349,7 +369,7 @@ function autocompleteResultChanged(result) {
return; // Stale result; ignore.
}
- renderAutocompleteMatches(result.matches);
+ renderAutocompleteMatches(result.matches, result.suggestionGroupsMap);
autocompleteResult = result;
@@ -360,9 +380,10 @@ function autocompleteResultChanged(result) {
text: lastQueriedInput || '',
});
+ assert(autocompleteResult.matches.length === matchEls.length);
const first = result.matches[0];
if (first && first.allowedToBeDefaultMatch) {
- selectMatchEl(assert($(IDS.REALBOX_MATCHES).firstElementChild));
+ selectMatchEl(matchEls[0]);
updateRealboxOutput({inline: first.inlineAutocompletion});
if (enterWasPressed) {
@@ -395,7 +416,6 @@ function autocompleteMatchImageAvailable(matchIndex, url, dataUrl) {
}
faviconOrImageUrlToDataUrlCache[url] = dataUrl;
- const matchEls = Array.from($(IDS.REALBOX_MATCHES).children);
assert(autocompleteResult.matches.length === matchEls.length);
// Update the match image/favicon.
@@ -731,35 +751,10 @@ function floatUpNotification(notification, notificationContainer) {
}
/**
- * Returns theme background info, first checking for history.state.notheme. If
- * the page has notheme set, returns a fallback light-colored theme (or dark-
- * colored theme if dark mode is enabled). This is used when the doodle is
- * displayed after clicking the notifier.
+ * Returns theme background info.
* @return {?NtpTheme}
*/
function getNtpTheme() {
- if (history.state && history.state.notheme) {
- return {
- alternateLogo: false,
- backgroundColorRgba:
- (isDarkModeEnabled ? NTP_DESIGN.darkBackgroundColor :
- NTP_DESIGN.backgroundColor),
- customBackgroundConfigured: false,
- customBackgroundDisabledByPolicy: false,
- iconBackgroundColor:
- (isDarkModeEnabled ? NTP_DESIGN.iconDarkBackgroundColor :
- NTP_DESIGN.iconBackgroundColor),
- isNtpBackgroundDark: isDarkModeEnabled,
- textColorLightRgba: [102, 102, 102, 255],
- textColorRgba:
- (isDarkModeEnabled ? NTP_DESIGN.titleColorAgainstDark :
- NTP_DESIGN.titleColor),
- useTitleContainer: false,
- useWhiteAddIcon: isDarkModeEnabled,
- usingDefaultTheme: true,
- };
- }
-
const info = window.chrome.embeddedSearch.newTabPage.ntpTheme;
const preview = $(customize.IDS.CUSTOM_BG_PREVIEW);
if (preview.dataset.hasPreview === 'true') {
@@ -1326,7 +1321,6 @@ function onRealboxCutCopy(e) {
return;
}
- const matchEls = Array.from($(IDS.REALBOX_MATCHES).children);
const selected = matchEls.findIndex(matchEl => {
return matchEl.classList.contains(CLASSES.SELECTED);
});
@@ -1380,16 +1374,21 @@ function onRealboxPaste() {
/** @param {!Event} e */
function onRealboxMatchesFocusIn(e) {
const target = /** @type {Element} */ (e.target);
- const link = findAncestor(target, el => el.nodeName === 'A');
- if (!link) {
+ const matchEl = findAncestor(target, el => el.nodeName === 'A');
+ if (!matchEl) {
+ return;
+ }
+ const selectedIndex = selectMatchEl(matchEl);
+ const selectedMatch = autocompleteResult.matches[selectedIndex];
+ if (!selectedMatch) {
return;
}
- const selectedIndex = selectMatchEl(link);
+
// It doesn't really make sense to use fillFromMatch() here as the focus
// change drops the selection (and is probably just noisy to
// screenreaders).
- const newFill = autocompleteResult.matches[selectedIndex].fillIntoEdit;
- updateRealboxOutput({moveCursorToEnd: true, inline: '', text: newFill});
+ updateRealboxOutput(
+ {moveCursorToEnd: true, inline: '', text: selectedMatch.fillIntoEdit});
}
/** @param {Event} e */
@@ -1467,15 +1466,11 @@ function onRealboxWrapperKeydown(e) {
return;
}
- const realboxMatchesEl = $(IDS.REALBOX_MATCHES);
- const matchEls = Array.from(realboxMatchesEl.children);
- assert(matchEls.length > 0);
+ assert(autocompleteResult.matches.length === matchEls.length);
const selected = matchEls.findIndex(matchEl => {
return matchEl.classList.contains(CLASSES.SELECTED);
});
- assert(autocompleteResult.matches.length === matchEls.length);
-
if (key === 'Enter') {
if (matchEls.concat(realboxEl).includes(e.target)) {
if (lastQueriedInput === autocompleteResult.input) {
@@ -1518,19 +1513,23 @@ function onRealboxWrapperKeydown(e) {
return;
}
+ const visibleMatchEls = matchEls.filter((matchEl) => {
+ return window.getComputedStyle(matchEl).display !== 'none';
+ });
/** @type {number} */ let newSelected;
if (key === 'ArrowDown') {
- newSelected = selected + 1 < matchEls.length ? selected + 1 : 0;
+ newSelected = selected + 1 < visibleMatchEls.length ? selected + 1 : 0;
} else if (key === 'ArrowUp') {
- newSelected = selected - 1 >= 0 ? selected - 1 : matchEls.length - 1;
+ newSelected = selected - 1 >= 0 ? selected - 1 : visibleMatchEls.length - 1;
} else if (key === 'Escape' || key === 'PageUp') {
newSelected = 0;
} else if (key === 'PageDown') {
- newSelected = matchEls.length - 1;
+ newSelected = visibleMatchEls.length - 1;
}
- assert(selectMatchEl(assert(matchEls[newSelected])) >= 0);
+ assert(selectMatchEl(assert(visibleMatchEls[newSelected])) >= 0);
e.preventDefault();
+ const realboxMatchesEl = $(IDS.REALBOX_MATCHES);
if (realboxMatchesEl.contains(document.activeElement)) {
// Selection should match focus if focus is currently in the matches.
matchEls[newSelected].focus();
@@ -1673,11 +1672,99 @@ function reloadTiles() {
/**
* @param {!Array<!AutocompleteMatch>} matches
+ * @param {!Object<!SuggestionGroup>} suggestionGroupsMap
*/
-function renderAutocompleteMatches(matches) {
+function renderAutocompleteMatches(matches, suggestionGroupsMap) {
const realboxMatchesEl = document.createElement('div');
realboxMatchesEl.setAttribute('role', 'listbox');
+ const newMatchEls = [];
+ suggestionGroupElsMap = {};
+
+ /**
+ * Creates and returns an action button that once clicked invokes |callback|.
+ * @param {!function()} callback
+ */
+ function createActionButton(callback) {
+ const icon = document.createElement('button');
+ icon.classList.add(CLASSES.REMOVE_ICON);
+ icon.tabIndex = -1;
+ icon.onmousedown = e => {
+ e.preventDefault(); // Stops default browser action (focus)
+ };
+ icon.onauxclick = e => {
+ if (e.button == 1) {
+ // Middle click on delete should just noop for now (matches omnibox).
+ e.preventDefault();
+ }
+ };
+ icon.onclick = e => {
+ callback();
+ e.preventDefault(); // Stops default browser action (navigation)
+ };
+
+ const action = document.createElement('div');
+
+ action.classList.add(CLASSES.REMOVE_MATCH);
+ action.tabIndex = 0;
+ action.setAttribute('role', 'button');
+ action.appendChild(icon);
+ return action;
+ }
+
+ /**
+ * Creates and returns an element to contain the header as well as the matches
+ * belonging to |suggestionGroupId|.
+ * @param {number} suggestionGroupId
+ */
+ function createSuggestionGroupEl(suggestionGroupId) {
+ if (suggestionGroupElsMap[suggestionGroupId]) {
+ return suggestionGroupElsMap[suggestionGroupId];
+ }
+
+ const suggestionGroup = assert(suggestionGroupsMap[suggestionGroupId]);
+
+ /**
+ * Updates the tooltip and a11y label of the suggestion group toggle button.
+ * @param {!Element} toggleButtonEl
+ * @param {boolean} groupIsHidden
+ */
+ function updateToggleButtonA11y(toggleButtonEl, groupIsHidden) {
+ toggleButtonEl.title = groupIsHidden ?
+ configData.translatedStrings.showSuggestions :
+ configData.translatedStrings.hideSuggestions;
+ toggleButtonEl.ariaLabel = utils.substituteString(
+ groupIsHidden ? configData.translatedStrings.showSection :
+ configData.translatedStrings.hideSection,
+ suggestionGroup.header);
+ }
+
+ const groupEl = document.createElement('div');
+ groupEl.classList.toggle(CLASSES.COLLAPSED, suggestionGroup.hidden);
+ const headerEl = document.createElement('a');
+ headerEl.classList.add(CLASSES.HEADER);
+ // The header cannot be tabbed into but it will get focus when clicked;
+ // preventing the popup from losing focus and closing as a result.
+ headerEl.tabIndex = -1;
+ headerEl.append(document.createTextNode(suggestionGroup.header));
+ if (configData.suggestionTransparencyEnabled) {
+ const toggle = createActionButton(() => {
+ groupEl.classList.toggle(CLASSES.COLLAPSED);
+ updateToggleButtonA11y(
+ toggle, groupEl.classList.contains(CLASSES.COLLAPSED));
+ window.chrome.embeddedSearch.searchBox
+ .toggleSuggestionGroupIdVisibility(suggestionGroupId);
+ });
+ updateToggleButtonA11y(toggle, suggestionGroup.hidden);
+ headerEl.appendChild(toggle);
+ realboxMatchesEl.classList.add(CLASSES.REMOVABLE);
+ }
+ groupEl.appendChild(headerEl);
+ realboxMatchesEl.appendChild(groupEl);
+ suggestionGroupElsMap[suggestionGroupId] = groupEl;
+ return groupEl;
+ }
+
for (let i = 0; i < matches.length; ++i) {
const match = matches[i];
const matchEl = document.createElement('a');
@@ -1766,32 +1853,22 @@ function renderAutocompleteMatches(matches) {
}
if (match.supportsDeletion && configData.suggestionTransparencyEnabled) {
- const icon = document.createElement('button');
- icon.title = configData.translatedStrings.removeSuggestion;
- icon.classList.add(CLASSES.REMOVE_ICON);
- icon.onmousedown = e => {
- e.preventDefault(); // Stops default browser action (focus)
- };
- icon.onauxclick = e => {
- if (e.button == 1) {
- // Middle click on delete should just noop for now (matches omnibox).
- e.preventDefault();
- }
- };
- icon.onclick = e => {
+ const remove = createActionButton(() => {
window.chrome.embeddedSearch.searchBox.deleteAutocompleteMatch(i);
- e.preventDefault(); // Stops default browser action (navigation)
- };
-
- const remove = document.createElement('div');
- remove.classList.add(CLASSES.REMOVE_MATCH);
-
- remove.appendChild(icon);
+ });
+ remove.title = configData.translatedStrings.removeSuggestion;
matchEl.appendChild(remove);
realboxMatchesEl.classList.add(CLASSES.REMOVABLE);
}
- realboxMatchesEl.append(matchEl);
+ if (match.suggestionGroupId &&
+ match.suggestionGroupId !== NO_SUGGESTION_GROUP_ID) {
+ const groupEl = createSuggestionGroupEl(match.suggestionGroupId);
+ groupEl.append(matchEl);
+ } else {
+ realboxMatchesEl.append(matchEl);
+ }
+ newMatchEls.push(matchEl);
}
if (charTypedTime) {
@@ -1812,6 +1889,7 @@ function renderAutocompleteMatches(matches) {
realboxMatchesEl.addEventListener('focusin', onRealboxMatchesFocusIn);
realboxWrapper.appendChild(realboxMatchesEl);
+ matchEls = newMatchEls;
realboxWrapper.addEventListener('focusout', onRealboxWrapperFocusOut);
@@ -1834,8 +1912,8 @@ function renderMatchClassifications(text, classifications) {
return classes.length ? spanWithClasses(classifiedText, classes) :
document.createTextNode(classifiedText);
})
- .reduce((container, currentElement) => {
- container.appendChild(currentElement);
+ .reduce((container, currentEl) => {
+ container.appendChild(currentEl);
return container;
}, document.createElement('span'));
}
@@ -1882,12 +1960,10 @@ function renderTheme() {
'--logo-color', convertToRGBAColor(theme.logoColor));
}
- // The doodle notifier should be shown for non-default backgrounds. This
- // includes non-white backgrounds, excluding dark mode gray if dark mode is
- // enabled.
- const isDefaultBackground = theme.usingDefaultTheme && !theme.imageUrl;
- const useNotifier = configData.doodleNotifierEnabled && !isDefaultBackground;
- document.body.classList.toggle(CLASSES.USE_NOTIFIER, useNotifier);
+ // The doodle shouldn't be shown for non-default backgrounds. This includes
+ // non-white backgrounds, excluding dark mode gray if dark mode is enabled.
+ document.body.classList.toggle(
+ CLASSES.DONT_SHOW_DOODLE, !theme.usingDefaultTheme || !!theme.imageUrl);
// If a custom background has been selected the image will be applied to the
// custom-background element instead of the body.
@@ -2037,13 +2113,13 @@ function requestAndInsertGoogleResources() {
}
/**
- * @param {!EventTarget} elToSelect
+ * @param {!EventTarget} matchElToSelect
* @return {number} The selected index (if found); else -1.
*/
-function selectMatchEl(elToSelect) {
+function selectMatchEl(matchElToSelect) {
let selectedIndex = -1;
- Array.from($(IDS.REALBOX_MATCHES).children).forEach((matchEl, i) => {
- const found = matchEl === elToSelect;
+ Array.from(matchEls).forEach((matchEl, i) => {
+ const found = matchEl === matchElToSelect;
matchEl.classList.toggle(CLASSES.SELECTED, found);
matchEl.setAttribute('aria-selected', found);
if (found) {
diff --git a/chromium/chrome/browser/resources/local_ntp/utils.js b/chromium/chrome/browser/resources/local_ntp/utils.js
index fdd0c6938d1..c73708c5ab6 100644
--- a/chromium/chrome/browser/resources/local_ntp/utils.js
+++ b/chromium/chrome/browser/resources/local_ntp/utils.js
@@ -60,3 +60,23 @@ utils.setPlatformClass = function(element) {
element.classList.toggle(
CLASSES.MAC, navigator.userAgent.indexOf('Mac') > -1);
};
+
+/**
+ * Returns a formatted localized string where $1 to $9 are replaced by the
+ * second to the tenth argument. Any standalone $ signs must be escaped as
+ * $$.
+ * Copied from //ui/webui/resources/js/load_time_data.js temporarily as the
+ * local NTP will be replaced by the WebUI NTP.
+ * @param {string} label The label to substitute through.
+ * This is not an resource ID.
+ * @param {...(string|number)} var_args The extra values to include in the
+ * formatted output.
+ * @return {string} The formatted string.
+ */
+utils.substituteString = function(label, var_args) {
+ const varArgs = arguments;
+ return label.replace(/\$(.|$|\n)/g, function(m) {
+ assert(m.match(/\$[$1-9]/), 'Unescaped $ found in localized string.');
+ return m === '$$' ? '$' : varArgs[m[1]];
+ });
+};
diff --git a/chromium/chrome/browser/resources/management/BUILD.gn b/chromium/chrome/browser/resources/management/BUILD.gn
index 8681246c50a..264df71fc56 100644
--- a/chromium/chrome/browser/resources/management/BUILD.gn
+++ b/chromium/chrome/browser/resources/management/BUILD.gn
@@ -3,7 +3,7 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
js_type_check("closure_compile") {
is_polymer3 = true
@@ -26,21 +26,9 @@ js_library("management_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
}
-polymer_modulizer("management_ui") {
- js_file = "management_ui.js"
- html_file = "management_ui.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("icons") {
- js_file = "icons.js"
- html_file = "icons.html"
- html_type = "v3-ready"
-}
-
-group("polymer3_elements") {
- public_deps = [
- ":icons_module",
- ":management_ui_module",
+html_to_js("web_components") {
+ js_files = [
+ "icons.js",
+ "management_ui.js",
]
}
diff --git a/chromium/chrome/browser/resources/management/icons.html b/chromium/chrome/browser/resources/management/icons.html
index 61de7530161..a17a0212875 100644
--- a/chromium/chrome/browser/resources/management/icons.html
+++ b/chromium/chrome/browser/resources/management/icons.html
@@ -13,6 +13,7 @@
</if>
<g id="account-circle"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z"></path><path d="M0 0h24v24H0z" fill="none"></path></g>
<g id="public"><path d="M0 0h24v24H0z" fill="none"></path><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z"></path></g>
+ <g id="vpn-lock"><path d="M22,4V3.5C22,2.1,20.9,1,19.5,1C18.1,1,17,2.1,17,3.5V4c-0.6,0-1,0.4-1,1v4c0,0.6,0.4,1,1,1h5c0.6,0,1-0.4,1-1V5C23,4.4,22.6,4,22,4z M21.2,4h-3.4V3.5c0-0.9,0.8-1.7,1.7-1.7c0.9,0,1.7,0.8,1.7,1.7V4z M18.9,12c0,0.3,0.1,0.7,0.1,1c0,2.1-0.8,4-2.1,5.4c-0.3-0.8-1-1.4-1.9-1.4h-1v-3c0-0.6-0.4-1-1-1H7v-2h2c0.6,0,1-0.4,1-1V8h2c1.1,0,2-0.9,2-2V3.5C13.1,3.2,12,3,11,3C5.5,3,1,7.5,1,13c0,5.5,4.5,10,10,10c5.5,0,10-4.5,10-10c0-0.3,0-0.7-0.1-1H18.9z M10,20.9c-3.9-0.5-7-3.9-7-7.9c0-0.6,0.1-1.2,0.2-1.8L8,16v1c0,1.1,0.9,2,2,2V20.9z"></path></g>
</defs>
</svg>
</iron-iconset-svg>
diff --git a/chromium/chrome/browser/resources/management/management_browser_proxy.js b/chromium/chrome/browser/resources/management/management_browser_proxy.js
index 9846ddc10c7..cf4a5a30586 100644
--- a/chromium/chrome/browser/resources/management/management_browser_proxy.js
+++ b/chromium/chrome/browser/resources/management/management_browser_proxy.js
@@ -74,7 +74,8 @@ export const DeviceReportingType = {
CROSTINI: 'crostini',
USERNAME: 'username',
EXTENSION: 'extension',
- ANDROID_APPLICATION: 'android application'
+ ANDROID_APPLICATION: 'android application',
+ PROXY_SERVER: 'proxy server'
};
diff --git a/chromium/chrome/browser/resources/management/management_ui.html b/chromium/chrome/browser/resources/management/management_ui.html
index 57fdf8e732d..0cb46863ce2 100644
--- a/chromium/chrome/browser/resources/management/management_ui.html
+++ b/chromium/chrome/browser/resources/management/management_ui.html
@@ -22,11 +22,6 @@
overflow: overlay;
}
- .sections-container {
- @apply --cr-centered-card-container;
- height: 100%;
- }
-
.card {
background-color: var(--cr-card-background-color);
box-shadow: var(--cr-card-shadow);
@@ -169,7 +164,7 @@
search-prompt="$i18n{searchPrompt}">
</cr-toolbar>
<main id="mainContent">
- <div class="sections-container">
+ <div class="cr-centered-card-container">
<div class="card">
<section hidden="[[!managed_]]" class="page-subtitle">
<cr-icon-button class="icon-arrow-back" id="closeButton"
diff --git a/chromium/chrome/browser/resources/management/management_ui.js b/chromium/chrome/browser/resources/management/management_ui.js
index 914d6adf30e..765261447a9 100644
--- a/chromium/chrome/browser/resources/management/management_ui.js
+++ b/chromium/chrome/browser/resources/management/management_ui.js
@@ -233,6 +233,8 @@ Polymer({
return 'cr:extension';
case DeviceReportingType.ANDROID_APPLICATION:
return 'management:play-store';
+ case DeviceReportingType.PROXY_SERVER:
+ return 'management:vpn-lock';
default:
return 'cr:computer';
}
diff --git a/chromium/chrome/browser/resources/media/media_engagement.js b/chromium/chrome/browser/resources/media/media_engagement.js
index d56ef21e6ff..6d88e07cd7a 100644
--- a/chromium/chrome/browser/resources/media/media_engagement.js
+++ b/chromium/chrome/browser/resources/media/media_engagement.js
@@ -53,7 +53,7 @@ function createRow(rowInfo) {
* Remove all rows from the engagement table.
*/
function clearTable() {
- engagementTableBody.innerHTML = '';
+ engagementTableBody.innerHTML = trustedTypes.emptyHTML;
}
/**
@@ -114,7 +114,7 @@ function createConfigRow(name, value) {
*/
function renderConfigTable(config) {
- configTableBody.innerHTML = '';
+ configTableBody.innerHTML = trustedTypes.emptyHTML;
configTableBody.appendChild(
createConfigRow('Min Sessions', config.scoreMinVisits));
diff --git a/chromium/chrome/browser/resources/media/media_feeds.html b/chromium/chrome/browser/resources/media/media_feeds.html
index b7e3edf4a5f..74429bf95b2 100644
--- a/chromium/chrome/browser/resources/media/media_feeds.html
+++ b/chromium/chrome/browser/resources/media/media_feeds.html
@@ -8,7 +8,9 @@
<script src="chrome://resources/js/promise_resolver.js"></script>
<script src="chrome://resources/mojo/mojo/public/mojom/base/big_buffer.mojom-lite.js"></script>
<script src="chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-lite.js"></script>
+ <script src="chrome://resources/mojo/mojo/public/mojom/base/unguessable_token.mojom-lite.js"></script>
<script src="chrome://resources/mojo/mojo/public/mojom/base/time.mojom-lite.js"></script>
+ <script src="chrome://resources/mojo/url/mojom/origin.mojom-lite.js"></script>
<script src="chrome://resources/mojo/url/mojom/url.mojom-lite.js"></script>
<script src="ui/gfx/geometry/mojom/geometry.mojom-lite.js"></script>
<script src="services/media_session/public/mojom/media_session.mojom-lite.js"></script>
@@ -83,6 +85,20 @@
<body>
<h1>Media Feeds</h1>
<button id="copy-all-to-clipboard">Copy all to clipboard</button>
+ <table>
+ <thead>
+ <tr id="config-table-header">
+ <th>
+ Setting Name
+ </th>
+ <th>
+ Setting Value
+ </th>
+ </tr>
+ </thead>
+ <tbody id="config-table-body">
+ </tbody>
+ </table>
<table id="feeds-table">
<thead>
<tr id="feed-table-header">
@@ -104,14 +120,17 @@
<th sort-key="userStatus">
User Status
</th>
+ <th sort-key="userIdentifier">
+ User ID
+ </th>
<th sort-key="lastFetchResult">
Last Fetch Result
</th>
<th sort-key="fetchFailedCount">
Fetch Failed Count
</th>
- <th sort-key="cacheExpiryTime">
- Cache Expiry Time
+ <th sort-key="lastFetchTimeNotCacheHit">
+ Last Fetch Time (not cache hit)
</th>
<th sort-key="lastFetchItemCount">
Last Fetch Item Count
@@ -122,8 +141,18 @@
<th sort-key="lastFetchContentTypes">
Last Fetch Content Types
</th>
+ <th sort-key="lastDisplayTime">
+ Last Display Time
+ </th>
+ <th sort-key="resetReason">
+ Reset Reason
+ </th>
+ <th data-key="associatedOrigins">
+ Associated Origins
+ </th>
<th data-key="logos">
Logos
+ </th>
<th data-key="actions">
Actions
</th>
@@ -196,6 +225,9 @@
<th sort-key="safeSearchResult">
Safe Search Result
</th>
+ <th sort-key="duration">
+ Duration (secs)
+ </th>
</tr>
</thead>
<tbody>
diff --git a/chromium/chrome/browser/resources/media/media_feeds.js b/chromium/chrome/browser/resources/media/media_feeds.js
index 9f0e1732a63..8ec4bee66af 100644
--- a/chromium/chrome/browser/resources/media/media_feeds.js
+++ b/chromium/chrome/browser/resources/media/media_feeds.js
@@ -16,12 +16,23 @@ function whenFeedTableIsPopulatedForTest() {
return mediaFeedItemsPageIsPopulatedResolver.promise;
}
+const mediaFeedsConfigTableIsPopulatedResolver = new PromiseResolver();
+function whenConfigTableIsPopulatedForTest() {
+ return mediaFeedsConfigTableIsPopulatedResolver.promise;
+}
+
+const mediaFeedsConfigTableIsUpdatedResolver = new PromiseResolver();
+function whenConfigTableIsUpdatedForTest() {
+ return mediaFeedsConfigTableIsUpdatedResolver.promise;
+}
+
(function() {
let delegate = null;
let feedsTable = null;
let feedItemsTable = null;
let store = null;
+let configTableBody = null;
/** @implements {cr.ui.MediaDataTableDelegate} */
class MediaFeedsTableDelegate {
@@ -41,14 +52,20 @@ class MediaFeedsTableDelegate {
td.appendChild(a);
a.addEventListener('click', () => {
- store.getItemsForMediaFeed(dataRow.id).then(response => {
- feedItemsTable.setData(response.items);
+ showFeedContents(dataRow);
+ });
+
+ td.appendChild(document.createElement('br'));
- // Show the feed items section.
- $('current-feed').textContent = dataRow.url.url;
- $('feed-content').style.display = 'block';
+ const fetchFeed = document.createElement('a');
+ fetchFeed.href = '#feed-content';
+ fetchFeed.textContent = 'Fetch Feed';
+ td.appendChild(fetchFeed);
- mediaFeedItemsPageIsPopulatedResolver.resolve();
+ fetchFeed.addEventListener('click', () => {
+ store.fetchMediaFeed(dataRow.id).then(response => {
+ updateFeedsTable();
+ showFeedContents(dataRow);
});
});
}
@@ -62,7 +79,8 @@ class MediaFeedsTableDelegate {
td.textContent = data.url;
} else if (
key === 'lastDiscoveryTime' || key === 'lastFetchTime' ||
- key === 'cacheExpiryTime' || key === 'datePublished') {
+ key === 'lastFetchTimeNotCacheHit' || key === 'datePublished' ||
+ key === 'lastDisplayTime') {
// Format a mojo time.
td.textContent =
convertMojoTimeToJS(/** @type {mojoBase.mojom.Time} */ (data))
@@ -102,6 +120,7 @@ class MediaFeedsTableDelegate {
contentTypes.length === 0 ? 'None' : contentTypes.join(',');
} else if (key === 'logos' || key === 'images') {
// Format an array of mojo media images.
+ // TODO(crbug.com/1074478): Display the image content attributes.
data.forEach((image) => {
const a = document.createElement('a');
a.href = image.src.url;
@@ -109,6 +128,19 @@ class MediaFeedsTableDelegate {
a.target = '_blank';
td.appendChild(a);
td.appendChild(document.createElement('br'));
+
+ const contentAttributes = [];
+ if (image.contentAttributes && image.contentAttributes.length !== 0) {
+ const p = document.createElement('p');
+ const contentAttributes = [];
+
+ image.contentAttributes.forEach((contentAttribute) => {
+ contentAttributes.push(formatContentAttribute(contentAttribute));
+ });
+
+ p.textContent = 'ContentAttributes=' + contentAttributes.join(', ');
+ td.appendChild(p);
+ }
});
} else if (key == 'type') {
// Format a MediaFeedItemType.
@@ -155,7 +187,7 @@ class MediaFeedsTableDelegate {
td.textContent = 'Unsafe';
break;
}
- } else if (key == 'startTime') {
+ } else if (key == 'startTime' || key == 'duration') {
// Format a start time.
td.textContent =
timeDeltaToSeconds(/** @type {mojoBase.mojom.TimeDelta} */ (data));
@@ -206,30 +238,20 @@ class MediaFeedsTableDelegate {
// Format an array of strings.
td.textContent = data.join(', ');
} else if (key == 'live') {
- // Format LiveDetails.
- td.textContent = 'Live';
-
- if (data.startTime) {
- td.textContent += ' ' +
- 'StartTime=' +
- convertMojoTimeToJS(
- /** @type {mojoBase.mojom.Time} */ (data.startTime))
- .toLocaleString();
- }
-
- if (data.endTime) {
- td.textContent += ' ' +
- 'EndTime=' +
- convertMojoTimeToJS(
- /** @type {mojoBase.mojom.Time} */ (data.endTime))
- .toLocaleString();
- }
+ td.textContent =
+ formatLiveDetails(/** @type {mediaFeeds.mojom.LiveDetails} */ (data));
} else if (key == 'tvEpisode') {
// Format a TV Episode.
td.textContent = data.name + ' EpisodeNumber=' + data.episodeNumber +
' SeasonNumber=' + data.seasonNumber + ' ' +
formatIdentifiers(/** @type {Array<mediaFeeds.mojom.Identifier>} */ (
- data.identifiers));
+ data.identifiers)) + ' DurationSecs=' +
+ timeDeltaToSeconds(data.duration);
+ if (data.live) {
+ td.textContent +=
+ ' LiveDetails=' + formatLiveDetails(
+ /** @type {mediaFeeds.mojom.LiveDetails} */ (data.live));
+ }
} else if (key == 'playNextCandidate') {
// Format a Play Next Candidate.
td.textContent = data.name + ' EpisodeNumber=' + data.episodeNumber +
@@ -249,6 +271,48 @@ class MediaFeedsTableDelegate {
// Format identifiers.
td.textContent = formatIdentifiers(
/** @type {Array<mediaFeeds.mojom.Identifier>} */ (data));
+ } else if (key === 'lastFetchItemCount') {
+ // Format the fetch item count.
+ td.textContent =
+ data + ' (' + dataRow.lastFetchSafeItemCount + ' confirmed as safe)';
+ } else if (key == 'resetReason') {
+ // Format a ResetReason.
+ switch (parseInt(data, 10)) {
+ case mediaFeeds.mojom.ResetReason.kNone:
+ td.textContent = 'None';
+ break;
+ case mediaFeeds.mojom.ResetReason.kCookies:
+ td.textContent = 'Cookies';
+ break;
+ case mediaFeeds.mojom.ResetReason.kVisit:
+ td.textContent = 'Visit';
+ break;
+ case mediaFeeds.mojom.ResetReason.kCache:
+ td.textContent = 'Cache';
+ break;
+ }
+ } else if (key === 'associatedOrigins') {
+ // Format the array of origins.
+ const origins = [];
+
+ data.forEach((origin) => {
+ const {scheme, host, port} = origin;
+ origins.push(new URL(`${scheme}://${host}:${port}`).origin);
+ });
+
+ td.textContent = origins.join(', ');
+ } else if (key === 'userIdentifier') {
+ if (data) {
+ td.textContent = 'Name=' + data.name;
+
+ if (data.email) {
+ td.textContent += ' Email=' + data.email;
+ }
+
+ if (data.image) {
+ td.textContent += ' Image=' + data.image.src.url;
+ }
+ }
} else {
td.textContent = data;
}
@@ -273,11 +337,13 @@ class MediaFeedsTableDelegate {
sortKey === 'userStatus' || sortKey === 'lastFetchResult' ||
sortKey === 'fetchFailedCount' || sortKey === 'lastFetchItemCount' ||
sortKey === 'lastFetchPlayNextCount' ||
- sortKey === 'lastFetchContentTypes' || sortKey === 'safeSearchResult') {
+ sortKey === 'lastFetchContentTypes' || sortKey === 'safeSearchResult' ||
+ sortKey === 'type') {
return val1 > val2 ? 1 : -1;
} else if (
sortKey === 'lastDiscoveryTime' || sortKey === 'lastFetchTime' ||
- sortKey === 'cacheExpiryTime') {
+ sortKey === 'lastFetchTimeNotCacheHit' ||
+ sortKey === 'lastDisplayTime') {
return val1.internalValue > val2.internalValue ? 1 : -1;
}
@@ -325,6 +391,69 @@ function formatIdentifiers(mojoIdentifiers) {
}
/**
+ * Formats a LiveDetails struct for display.
+ * @param {mediaFeeds.mojom.LiveDetails} mojoLiveDetails
+ * @returns {string}
+ */
+function formatLiveDetails(mojoLiveDetails) {
+ let textContent = 'Live';
+
+ if (mojoLiveDetails.startTime) {
+ textContent += ' ' +
+ 'StartTime=' +
+ convertMojoTimeToJS(
+ /** @type {mojoBase.mojom.Time} */ (mojoLiveDetails.startTime))
+ .toLocaleString();
+ }
+
+ if (mojoLiveDetails.endTime) {
+ textContent += ' ' +
+ 'EndTime=' +
+ convertMojoTimeToJS(
+ /** @type {mojoBase.mojom.Time} */ (mojoLiveDetails.endTime))
+ .toLocaleString();
+ }
+
+ return textContent;
+}
+
+/**
+ * Formats a single ContentAttribute for display.
+ * @param {mediaFeeds.mojom.ContentAttribute} contentAttribute
+ * @returns {string}
+ */
+function formatContentAttribute(contentAttribute) {
+ switch (parseInt(contentAttribute, 10)) {
+ case mediaFeeds.mojom.ContentAttribute.kIconic:
+ return 'Iconic';
+ case mediaFeeds.mojom.ContentAttribute.kSceneStill:
+ return 'SceneStill';
+ case mediaFeeds.mojom.ContentAttribute.kPoster:
+ return 'Poster';
+ case mediaFeeds.mojom.ContentAttribute.kBackground:
+ return 'Background';
+ case mediaFeeds.mojom.ContentAttribute.kForDarkBackground:
+ return 'ForDarkBackground';
+ case mediaFeeds.mojom.ContentAttribute.kForLightBackground:
+ return 'ForLightBackground';
+ case mediaFeeds.mojom.ContentAttribute.kCentered:
+ return 'Centered';
+ case mediaFeeds.mojom.ContentAttribute.kRightCentered:
+ return 'RightCentered';
+ case mediaFeeds.mojom.ContentAttribute.kLeftCentered:
+ return 'LeftCentered';
+ case mediaFeeds.mojom.ContentAttribute.kHasTransparentBackground:
+ return 'HasTransparentBackground';
+ case mediaFeeds.mojom.ContentAttribute.kHasTitle:
+ return 'HasTitle';
+ case mediaFeeds.mojom.ContentAttribute.kNoTitle:
+ return 'NoTitle';
+ default:
+ return 'Unknown';
+ }
+}
+
+/**
* Parses utf16 coded string.
* @param {?mojoBase.mojom.String16} arr
* @return {string}
@@ -362,6 +491,92 @@ function convertMojoTimeToJS(mojoTime) {
}
/**
+ * Creates a single row in the config table.
+ * @param {string} name The name of the config setting.
+ * @param {string} value The value of the config setting.
+ * @return {!Node}
+ */
+function createConfigRow(name, value) {
+ const tr = document.createElement('tr');
+
+ const nameCell = document.createElement('td');
+ nameCell.textContent = name;
+ tr.appendChild(nameCell);
+
+ const valueCell = document.createElement('td');
+ valueCell.textContent = value;
+ tr.appendChild(valueCell);
+
+ return tr;
+}
+
+/**
+ * Creates a single row in the config table with a toggle button.
+ * @param {string} name The name of the config setting.
+ * @param {string} value The value of the config setting.
+ * @param {Function} clickAction The function to be called to toggle the row.
+ * @return {!Node}
+ */
+function createConfigRowWithToggle(name, value, clickAction) {
+ const tr = document.createElement('tr');
+
+ const nameCell = document.createElement('td');
+ nameCell.textContent = name;
+ tr.appendChild(nameCell);
+
+ const valueCell = document.createElement('td');
+ tr.appendChild(valueCell);
+
+ const a = document.createElement('a');
+ a.href = '#';
+ a.textContent = value + ' (Toggle)';
+ a.addEventListener('click', clickAction);
+ valueCell.appendChild(a);
+
+ return tr;
+}
+
+/**
+ * Regenerates the config table.
+ * @param {!mediaFeeds.mojom.DebugInformation} info The debug info
+ */
+function renderConfigTable(info) {
+ configTableBody.innerHTML = '';
+
+ configTableBody.appendChild(createConfigRow(
+ 'Safe Search Enabled (value)',
+ formatFeatureFlag(info.safeSearchFeatureEnabled)));
+
+ configTableBody.appendChild(createConfigRowWithToggle(
+ 'Safe Search Enabled (pref)', formatFeatureFlag(info.safeSearchPrefValue),
+ () => {
+ store.setSafeSearchEnabledPref(!info.safeSearchPrefValue).then(() => {
+ updateConfigTable().then(
+ () => mediaFeedsConfigTableIsUpdatedResolver.resolve());
+ });
+ }));
+}
+
+/**
+ * Retrieve debug info and render the config table.
+ */
+function updateConfigTable() {
+ return store.getDebugInformation().then(response => {
+ renderConfigTable(response.info);
+ mediaFeedsConfigTableIsPopulatedResolver.resolve();
+ });
+}
+
+/**
+ * Converts a boolean into a string value.
+ * @param {boolean} value The value of the config setting.
+ * @return {string}
+ */
+function formatFeatureFlag(value) {
+ return value ? 'Enabled' : 'Disabled';
+}
+
+/**
* Retrieve feed info and render the feed table.
*/
function updateFeedsTable() {
@@ -371,9 +586,28 @@ function updateFeedsTable() {
});
}
+/**
+ * Retrieve feed items and render the feed contents table.
+ * @param {Object} dataRow
+ */
+function showFeedContents(dataRow) {
+ store.getItemsForMediaFeed(dataRow.id).then(response => {
+ feedItemsTable.setData(response.items);
+
+ // Show the feed items section.
+ $('current-feed').textContent = dataRow.url.url;
+ $('feed-content').style.display = 'block';
+
+ mediaFeedItemsPageIsPopulatedResolver.resolve();
+ });
+}
+
document.addEventListener('DOMContentLoaded', () => {
store = mediaFeeds.mojom.MediaFeedsStore.getRemote();
+ configTableBody = $('config-table-body');
+ updateConfigTable();
+
delegate = new MediaFeedsTableDelegate();
feedsTable = new cr.ui.MediaDataTable($('feeds-table'), delegate);
feedItemsTable = new cr.ui.MediaDataTable($('feed-items-table'), delegate);
diff --git a/chromium/chrome/browser/resources/memory_internals/BUILD.gn b/chromium/chrome/browser/resources/memory_internals/BUILD.gn
new file mode 100644
index 00000000000..59c5fc88e07
--- /dev/null
+++ b/chromium/chrome/browser/resources/memory_internals/BUILD.gn
@@ -0,0 +1,17 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//third_party/closure_compiler/compile_js.gni")
+
+js_type_check("closure_compile") {
+ uses_js_modules = true
+ deps = [ ":memory_internals" ]
+}
+
+js_library("memory_internals") {
+ deps = [
+ "//ui/webui/resources/js:cr.m",
+ "//ui/webui/resources/js:util.m",
+ ]
+}
diff --git a/chromium/chrome/browser/resources/memory_internals/memory_internals.html b/chromium/chrome/browser/resources/memory_internals/memory_internals.html
index 2c3a17b56f0..28757e75016 100644
--- a/chromium/chrome/browser/resources/memory_internals/memory_internals.html
+++ b/chromium/chrome/browser/resources/memory_internals/memory_internals.html
@@ -1,38 +1,42 @@
<!doctype html>
-<html><head>
-<title>Memory Internals</title>
-<style type="text/css">
- body {
- font-family: sans-serif;
- }
- th {
- border-bottom: 1px solid black;
- padding: 5px;
- text-align: start;
- }
- td {
- padding: 5px;
- }
- .message {
- font-style: italic;
- margin-bottom: 1em;
- padding: 5px;
- }
- .commands {
- padding: 5px;
- }
-</style>
-</head><body>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>Memory Internals</title>
+ <style type="text/css">
+ body {
+ font-family: sans-serif;
+ }
+ th {
+ border-bottom: 1px solid black;
+ padding: 5px;
+ text-align: start;
+ }
+ td {
+ padding: 5px;
+ }
+ #message {
+ font-style: italic;
+ margin-bottom: 1em;
+ padding: 5px;
+ }
+ .commands {
+ padding: 5px;
+ }
+ </style>
+ </head>
+ <body>
+ <h3>Experimental memory internals</h3>
+ <div id="message"></div>
-<script src="chrome://resources/js/util.js"></script>
-<script src="chrome://resources/js/cr.js"></script>
-<script src="chrome://memory-internals/memory_internals.js"></script>
+ <div class="commands">
+ <button id="refresh">↺ Refresh process list</button>
+ <button id="save">⇩ Save dump</button>
+ <div id="save-dump-text"></div>
+ </div>
-<h3>Experimental memory internals</h3>
-
-<div class="message" id="message"></div>
-
-<div id="proclist">loading...</div>
-
-</body></html>
+ <div id="proclist">loading...</div>
+ <script type="module" src="memory_internals.js"></script>
+ </body>
+</html>
diff --git a/chromium/chrome/browser/resources/memory_internals/memory_internals.js b/chromium/chrome/browser/resources/memory_internals/memory_internals.js
index d0e585531c7..903ce4c23cd 100644
--- a/chromium/chrome/browser/resources/memory_internals/memory_internals.js
+++ b/chromium/chrome/browser/resources/memory_internals/memory_internals.js
@@ -2,10 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-'use strict';
+import {addWebUIListener, sendWithPromise} from 'chrome://resources/js/cr.m.js';
+import {$} from 'chrome://resources/js/util.m.js';
function requestProcessList() {
- chrome.send('requestProcessList');
+ sendWithPromise('requestProcessList').then(onProcessListReceived);
}
function saveDump() {
@@ -34,11 +35,7 @@ function addListRow(table, celltype, cols) {
table.appendChild(tr);
}
-function setSaveDumpMessage(data) {
- $('save_dump_text').innerText = data;
-}
-
-function returnProcessList(data) {
+function onProcessListReceived(data) {
$('message').innerText = data['message'];
const proclist = $('proclist');
@@ -47,25 +44,7 @@ function returnProcessList(data) {
const processes = data['processes'];
if (processes.length == 0) {
return;
- } // No processes to dump, don't make the table and refresh button.
-
- // Add the refresh and save-dump buttons.
- const commandsDiv = document.createElement('div');
- commandsDiv.className = 'commands';
-
- const refreshButton = document.createElement('button');
- refreshButton.innerText = '\u21ba Refresh process list';
- refreshButton.onclick = () => requestProcessList();
- commandsDiv.appendChild(refreshButton);
- const saveDumpButton = document.createElement('button');
- saveDumpButton.innerText = '\u21e9 Save dump';
- saveDumpButton.onclick = () => saveDump();
- commandsDiv.appendChild(saveDumpButton);
- const saveDumpText = document.createElement('div');
- saveDumpText.id = 'save_dump_text';
- commandsDiv.appendChild(saveDumpText);
-
- proclist.appendChild(commandsDiv);
+ } // No processes to dump, don't make the table.
const table = document.createElement('table');
@@ -81,13 +60,11 @@ function returnProcessList(data) {
const description = document.createTextNode(proc[1]);
const profiled = proc[2];
- let button = null;
+ const button = document.createElement('button');
if (profiled) {
- button = document.createElement('button');
button.innerText = '\uD83D\uDC1E Report';
button.onclick = () => reportProcess(procId);
} else {
- button = document.createElement('button');
button.innerText = '\u2600 Start profiling';
button.onclick = () => startProfiling(procId);
}
@@ -99,11 +76,20 @@ function returnProcessList(data) {
}
// Get data and have it displayed upon loading.
-document.addEventListener('DOMContentLoaded', requestProcessList);
+document.addEventListener('DOMContentLoaded', () => {
+ $('refresh').onclick = requestProcessList;
+ $('save').onclick = saveDump;
+
+ addWebUIListener('save-dump-progress', progress => {
+ $('save-dump-text').innerText = progress;
+ });
+
+ requestProcessList();
+});
/* For manual testing.
function fakeResults() {
- returnProcessList([
+ onProcessListReceived([
[ 11234, "Process 11234 [Browser]" ],
[ 11235, "Process 11235 [Renderer]" ],
[ 11236, "Process 11236 [Renderer]" ]]);
diff --git a/chromium/chrome/browser/resources/net_internals/browser_bridge.js b/chromium/chrome/browser/resources/net_internals/browser_bridge.js
index fb05bc76ede..fac5fb1d4d1 100644
--- a/chromium/chrome/browser/resources/net_internals/browser_bridge.js
+++ b/chromium/chrome/browser/resources/net_internals/browser_bridge.js
@@ -101,6 +101,10 @@ const BrowserBridge = (function() {
this.send('storeCombinedDebugLogs');
},
+ storeFeedbackSystemLogs() {
+ this.send('storeFeedbackSystemLogs');
+ },
+
setNetworkDebugMode(subsystem) {
this.send('setNetworkDebugMode', [subsystem]);
},
@@ -149,6 +153,12 @@ const BrowserBridge = (function() {
}
},
+ receivedStoreFeedbackSystemLogs(status) {
+ for (let i = 0; i < this.storeDebugLogsObservers_.length; i++) {
+ this.storeDebugLogsObservers_[i].onStoreFeedbackSystemLogs(status);
+ }
+ },
+
receivedSetNetworkDebugMode(status) {
for (let i = 0; i < this.setNetworkDebugModeObservers_.length; i++) {
this.setNetworkDebugModeObservers_[i].onSetNetworkDebugMode(status);
diff --git a/chromium/chrome/browser/resources/net_internals/chromeos_view.css b/chromium/chrome/browser/resources/net_internals/chromeos_view.css
index 57399749be8..14090070e91 100644
--- a/chromium/chrome/browser/resources/net_internals/chromeos_view.css
+++ b/chromium/chrome/browser/resources/net_internals/chromeos_view.css
@@ -6,3 +6,7 @@
#chromeos-view-parse-status {
margin-top: 20px;
}
+
+input + label {
+ margin-inline-start: 10px;
+}
diff --git a/chromium/chrome/browser/resources/net_internals/chromeos_view.html b/chromium/chrome/browser/resources/net_internals/chromeos_view.html
index ad1a9651e62..ac4ae56ec08 100644
--- a/chromium/chrome/browser/resources/net_internals/chromeos_view.html
+++ b/chromium/chrome/browser/resources/net_internals/chromeos_view.html
@@ -14,22 +14,40 @@
<div id="chromeos-view-parse-status" hidden>
</div>
<div id="chromeos-view-store-debug-logs-div">
- <h4>Store Logs</h4>
+ <h4>Store system logs</h4>
<div>
+ <p>This stores system_logs_{date}-{time}.txt.zip to the Downloads
+ directory. The archive contains a single file identical to the
+ system_logs file attached to Feedback reports.</p>
+ <p>Also writes a policies_{date}-{time}.json file for providing policy
+ configurations when that might be a factor.</p>
+ <p>Prefer this when uploading logs to issues or sending logs to developers
+ (unless otherwise requested).</p>
<input type="button"
- id="chromeos-view-store-debug-logs"
- value="Store System Logs">
- <label for="chromeos-view-store-debug-logs"
- id="chromeos-view-store-debug-logs-status">
- </label>
+ id="chromeos-view-store-feedback-system-logs"
+ value="Store Feedback Report System Logs">
+ <label id="chromeos-view-store-feedback-system-logs-status"></label>
</div>
+ <h4>Store debugd system logs</h4>
<div>
+ <p>This stores the logs collected by debugd as individual files in a
+ single archive file in the Downloads directory:
+ debug-logs_{date}-{time}.tgz.
+ </p>
+ <p>Also writes a policies_{date}-{time}.json file for providing policy
+ configurations when that might be a factor.</p>
<input type="button"
- id="chromeos-view-store-combined-debug-logs"
- value="Store System and User Logs">
- <label for="chromeos-view-store-combined-debug-logs"
- id="chromeos-view-store-combined-debug-logs-status">
- </label>
+ id="chromeos-view-store-debug-logs"
+ value="Store System Logs">
+ <label id="chromeos-view-store-debug-logs-status"></label>
+ </div>
+ <div>
+ <p>Identical to the above, but also incldes the Chrome user logs.
+ The output file is named combined-logs_{date}-{time}.tgz.</p>
+ <input type="button"
+ id="chromeos-view-store-combined-debug-logs"
+ value="Store System and User Logs">
+ <label id="chromeos-view-store-combined-debug-logs-status"></label>
</div>
</div>
<div id="chromeos-view-network-debugging-div">
diff --git a/chromium/chrome/browser/resources/net_internals/chromeos_view.js b/chromium/chrome/browser/resources/net_internals/chromeos_view.js
index a83105a1282..07022b53664 100644
--- a/chromium/chrome/browser/resources/net_internals/chromeos_view.js
+++ b/chromium/chrome/browser/resources/net_internals/chromeos_view.js
@@ -130,6 +130,15 @@ const CrosView = (function() {
}
/**
+ * Set storing combined debug logs status.
+ *
+ * @private
+ */
+ function setStoreFeedbackSystemLogsStatus_(status) {
+ $(CrosView.STORE_FEEDBACK_SYSTEM_LOGS_STATUS_ID).innerText = status;
+ }
+
+ /**
* Set status for current debug mode.
*
* @private
@@ -177,6 +186,11 @@ const CrosView = (function() {
$(CrosView.STORE_COMBINED_DEBUG_LOGS_STATUS_ID).innerText = '';
g_browser.storeCombinedDebugLogs();
}, false);
+ $(CrosView.STORE_FEEDBACK_SYSTEM_LOGS_ID)
+ .addEventListener('click', function(event) {
+ $(CrosView.STORE_FEEDBACK_SYSTEM_LOGS_STATUS_ID).innerText = '';
+ g_browser.storeFeedbackSystemLogs();
+ }, false);
$(CrosView.DEBUG_WIFI_ID).addEventListener('click', function(event) {
setNetworkDebugMode_('wifi');
@@ -245,6 +259,10 @@ const CrosView = (function() {
'chromeos-view-store-combined-debug-logs';
CrosView.STORE_COMBINED_DEBUG_LOGS_STATUS_ID =
'chromeos-view-store-combined-debug-logs-status';
+ CrosView.STORE_FEEDBACK_SYSTEM_LOGS_ID =
+ 'chromeos-view-store-feedback-system-logs';
+ CrosView.STORE_FEEDBACK_SYSTEM_LOGS_STATUS_ID =
+ 'chromeos-view-store-feedback-system-logs-status';
CrosView.DEBUG_WIFI_ID = 'chromeos-view-network-debugging-wifi';
CrosView.DEBUG_ETHERNET_ID = 'chromeos-view-network-debugging-ethernet';
CrosView.DEBUG_CELLULAR_ID = 'chromeos-view-network-debugging-cellular';
@@ -260,6 +278,7 @@ const CrosView = (function() {
onONCFileParse: setParseStatus_,
onStoreDebugLogs: setStoreDebugLogsStatus_,
onStoreCombinedDebugLogs: setStoreCombinedDebugLogsStatus_,
+ onStoreFeedbackSystemLogs: setStoreFeedbackSystemLogsStatus_,
onSetNetworkDebugMode: setNetworkDebugModeStatus_,
};
diff --git a/chromium/chrome/browser/resources/new_tab_page/BUILD.gn b/chromium/chrome/browser/resources/new_tab_page/BUILD.gn
index d7bb922bdf5..c8a9b38a86f 100644
--- a/chromium/chrome/browser/resources/new_tab_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/new_tab_page/BUILD.gn
@@ -2,8 +2,10 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import("//chrome/browser/resources/optimize_webui.gni")
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/grit/grit_rule.gni")
+import("//tools/polymer/html_to_js.gni")
js_type_check("closure_compile") {
is_polymer3 = true
@@ -11,9 +13,15 @@ js_type_check("closure_compile") {
":app",
":browser_proxy",
":customize_dialog",
+ ":doodle_share_dialog",
":fakebox",
":grid",
":logo",
+ ":realbox",
+ ":realbox_button",
+ ":realbox_dropdown",
+ ":realbox_icon",
+ ":realbox_match",
":theme_icon",
":untrusted_iframe",
":utils",
@@ -23,6 +31,8 @@ js_type_check("closure_compile") {
js_library("browser_proxy") {
deps = [
+ ":background_manager",
+ ":utils",
"//chrome/browser/ui/webui/new_tab_page:mojo_bindings_js_library_for_compile",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:cr.m",
@@ -32,10 +42,12 @@ js_library("browser_proxy") {
js_library("app") {
deps = [
+ ":background_manager",
":browser_proxy",
":most_visited",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:event_tracker.m",
+ "//ui/webui/resources/js:load_time_data.m",
]
}
@@ -75,6 +87,8 @@ js_library("customize_themes") {
deps = [
":grid",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/cr_elements/cr_button:cr_button.m",
+ "//ui/webui/resources/cr_elements/cr_icon_button:cr_icon_button.m",
]
}
@@ -126,104 +140,147 @@ js_library("fakebox") {
]
}
-js_library("logo") {
+js_library("realbox") {
deps = [
+ ":browser_proxy",
+ ":realbox_icon",
+ ":utils",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/js:assert.m",
+ "//ui/webui/resources/js:load_time_data.m",
]
}
-polymer_modulizer("app") {
- js_file = "app.js"
- html_file = "app.html"
- html_type = "v3-ready"
+js_library("realbox_dropdown") {
+ deps = [
+ ":browser_proxy",
+ ":realbox_button",
+ ":realbox_match",
+ ":utils",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/js:assert.m",
+ "//ui/webui/resources/js:load_time_data.m",
+ ]
}
-polymer_modulizer("customize_dialog") {
- js_file = "customize_dialog.js"
- html_file = "customize_dialog.html"
- html_type = "v3-ready"
+js_library("realbox_button") {
+ deps = [
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ ]
}
-polymer_modulizer("mini_page") {
- js_file = "mini_page.js"
- html_file = "mini_page.html"
- html_type = "v3-ready"
+js_library("realbox_icon") {
+ deps = [
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ ]
}
-polymer_modulizer("most_visited") {
- js_file = "most_visited.js"
- html_file = "most_visited.html"
- html_type = "v3-ready"
+js_library("realbox_match") {
+ deps = [
+ ":realbox_button",
+ ":realbox_icon",
+ ":utils",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/js:load_time_data.m",
+ ]
}
-polymer_modulizer("customize_shortcuts") {
- js_file = "customize_shortcuts.js"
- html_file = "customize_shortcuts.html"
- html_type = "v3-ready"
+js_library("logo") {
+ deps = [
+ ":doodle_share_dialog",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/cr_elements/cr_button:cr_button.m",
+ ]
}
-polymer_modulizer("customize_backgrounds") {
- js_file = "customize_backgrounds.js"
- html_file = "customize_backgrounds.html"
- html_type = "v3-ready"
+js_library("doodle_share_dialog") {
+ deps = [
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/cr_elements/cr_button:cr_button.m",
+ "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
+ "//ui/webui/resources/cr_elements/cr_icon_button:cr_icon_button.m",
+ "//ui/webui/resources/cr_elements/cr_input:cr_input.m",
+ ]
}
-polymer_modulizer("customize_themes") {
- js_file = "customize_themes.js"
- html_file = "customize_themes.html"
- html_type = "v3-ready"
+js_library("background_manager") {
+ deps = [ ":utils" ]
}
-polymer_modulizer("theme_icon") {
- js_file = "theme_icon.js"
- html_file = "theme_icon.html"
- html_type = "v3-ready"
+html_to_js("web_components") {
+ js_files = [
+ "app.js",
+ "customize_backgrounds.js",
+ "customize_dialog.js",
+ "customize_shortcuts.js",
+ "customize_themes.js",
+ "doodle_share_dialog.js",
+ "fakebox.js",
+ "grid.js",
+ "logo.js",
+ "mini_page.js",
+ "most_visited.js",
+ "realbox_button.js",
+ "realbox_dropdown.js",
+ "realbox_icon.js",
+ "realbox_match.js",
+ "realbox.js",
+ "theme_icon.js",
+ "untrusted_iframe.js",
+ "voice_search_overlay.js",
+ ]
}
-polymer_modulizer("grid") {
- js_file = "grid.js"
- html_file = "grid.html"
- html_type = "v3-ready"
-}
+if (optimize_webui) {
+ grit("unoptimized_resources") {
+ source = "new_tab_page_resources.grd"
-polymer_modulizer("voice_search_overlay") {
- js_file = "voice_search_overlay.js"
- html_file = "voice_search_overlay.html"
- html_type = "v3-ready"
-}
+ deps = [
+ "//chrome/browser/resources/new_tab_page:web_components",
+ "//chrome/browser/ui/webui/new_tab_page:mojo_bindings_js",
+ "//skia/public/mojom:mojom_js",
+ ]
-polymer_modulizer("untrusted_iframe") {
- js_file = "untrusted_iframe.js"
- html_file = "untrusted_iframe.html"
- html_type = "v3-ready"
-}
+ grit_flags = [
+ "-E",
+ "root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir),
+ ]
-polymer_modulizer("fakebox") {
- js_file = "fakebox.js"
- html_file = "fakebox.html"
- html_type = "v3-ready"
-}
+ outputs = [
+ "grit/new_tab_page_resources.h",
+ "grit/new_tab_page_resources_map.cc",
+ "grit/new_tab_page_resources_map.h",
+ "new_tab_page_resources.pak",
+ ]
+ output_dir = "$root_gen_dir/chrome/browser/resources/new_tab_page"
+ }
-polymer_modulizer("logo") {
- js_file = "logo.js"
- html_file = "logo.html"
- html_type = "v3-ready"
-}
+ unpak("unpak") {
+ pak_file = "new_tab_page_resources.pak"
+ out_folder = "unpak"
+ deps = [ ":unoptimized_resources" ]
+ }
-group("polymer3_elements") {
- public_deps = [
- ":app_module",
- ":customize_backgrounds_module",
- ":customize_dialog_module",
- ":customize_shortcuts_module",
- ":customize_themes_module",
- ":fakebox_module",
- ":grid_module",
- ":logo_module",
- ":mini_page_module",
- ":most_visited_module",
- ":theme_icon_module",
- ":untrusted_iframe_module",
- ":voice_search_overlay_module",
- ]
+ optimize_webui("optimized_js") {
+ host = "new-tab-page"
+ input = rebase_path("$target_gen_dir/unpak", root_build_dir)
+ deps = [
+ ":unpak",
+ "//ui/webui/resources:modulize",
+ ]
+ js_module_in_files = [ "new_tab_page.js" ]
+ js_out_files = [ "new_tab_page.rollup.js" ]
+ excludes = [
+ "chrome://resources/js/cr.m.js",
+ "chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js",
+ "chrome://resources/mojo/mojo/public/mojom/base/big_buffer.mojom-lite.js",
+ "chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-lite.js",
+ "chrome://resources/mojo/mojo/public/mojom/base/text_direction.mojom-lite.js",
+ "chrome://resources/mojo/mojo/public/mojom/base/time.mojom-lite.js",
+ "chrome://resources/mojo/url/mojom/url.mojom-lite.js",
+ "new_tab_page.mojom-lite.js",
+ "omnibox.mojom-lite.js",
+ "skcolor.mojom-lite.js",
+ ]
+ }
}
diff --git a/chromium/chrome/browser/resources/new_tab_page/app.html b/chromium/chrome/browser/resources/new_tab_page/app.html
index d6ab6b198f2..381379df828 100644
--- a/chromium/chrome/browser/resources/new_tab_page/app.html
+++ b/chromium/chrome/browser/resources/new_tab_page/app.html
@@ -3,6 +3,7 @@
--ntp-theme-shortcut-background-color: rgb(229, 231, 232);
--ntp-theme-text-color: var(--google-grey-800);
--ntp-theme-text-shadow: none;
+ --ntp-one-google-bar-height: 56px;
}
@media (prefers-color-scheme: dark) {
@@ -16,50 +17,46 @@
--ntp-theme-text-shadow: 0 0 16px rgba(0, 0, 0, .3);
}
- #background {
- height: 100%;
- position: relative;
- width: 100%;
- }
-
- #background > * {
+ #oneGoogleBar {
+ clip-path: url(#oneGoogleBarClipPath);
height: 100%;
position: absolute;
top: 0;
width: 100%;
- }
-
- #backgroundImage {
- border: none;
- }
-
- #backgroundGradient {
- background: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.3));
+ z-index: 1000;
}
#content {
align-items: center;
display: flex;
flex-direction: column;
+ height: calc(100vh - var(--ntp-one-google-bar-height));
+ position: relative;
}
- #oneGoogleBar {
- pointer-events: none;
- }
-
- #oneGoogleBarSpacer {
- height: 56px;
- width: 100%;
+ :host([iframe-one-google-bar-enabled_]) #content {
+ padding-top: var(--ntp-one-google-bar-height);
}
#logo {
- margin-bottom: 38px;
+ margin-bottom: 8px;
+ z-index: 1; /* Needed so it layers on top of OneGoogleBar. */
}
- ntp-fakebox {
+ ntp-fakebox,
+ ntp-realbox {
+ flex-shrink: 0;
margin-bottom: 32px;
}
+ ntp-realbox {
+ visibility: hidden;
+ }
+
+ ntp-realbox[shown] {
+ visibility: visible;
+ }
+
ntp-most-visited[dark] {
--icon-button-color-active: var(--google-grey-refresh-300);
--icon-button-color: white;
@@ -68,33 +65,49 @@
#promo {
bottom: 16px;
- height: 35px;
+ height: 32px;
left: 0;
position: fixed;
right: 0;
width: 100%;
}
+ #customizeButtonSpacer {
+ flex-grow: 1;
+ }
+
#customizeButtonContainer {
+ align-self: flex-end;
background-color: var(--ntp-background-override-color);
- border-radius: calc(0.5 * var(--cr-button-height));
+ border-radius: calc(.5 * var(--cr-button-height));
bottom: 16px;
- position: absolute;
+ margin-inline-end: 16px;
+ position: sticky;
}
- :host-context([dir='ltr']) #customizeButtonContainer {
- right: 16px;
+ :host([show-background-image_]) #customizeButtonContainer {
+ background-color: transparent;
}
- :host-context([dir='rtl']) #customizeButtonContainer {
- left: 16px;
+ :host([show-background-image_]) #customizeButtonContainer:hover {
+ background-color: rgba(255, 255, 255, .1);
}
#customizeButton {
border: none;
- border-radius: calc(0.5 * var(--cr-button-height));
- box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 1px 2px rgba(0, 0, 0, 0.23);
+ border-radius: calc(.5 * var(--cr-button-height));
+ box-shadow: 0 3px 6px rgba(0, 0, 0, .16), 0 1px 2px rgba(0, 0, 0, .23);
font-weight: 400;
+ min-width: 32px;
+ }
+
+ :host([show-background-image_]) #customizeButton {
+ box-shadow: none;
+ padding: 0;
+ }
+
+ :host-context(.focus-outline-visible) #customizeButton:focus {
+ box-shadow: var(--ntp-focus-shadow);
}
#customizeIcon {
@@ -107,6 +120,33 @@
width: 16px;
}
+ :host([show-background-image_]) #customizeIcon {
+ background-color: white;
+ margin: 0;
+ }
+
+ @media (max-width: 550px) {
+ #customizeButton {
+ padding: 0;
+ }
+
+ #customizeIcon {
+ margin: 0;
+ }
+
+ #customizeText {
+ display: none;
+ }
+ }
+
+ #themeAttribution {
+ align-self: flex-start;
+ bottom: 16px;
+ color: var(--ntp-secondary-text-color);
+ margin-inline-start: 16px;
+ position: fixed;
+ }
+
#backgroundImageAttribution {
border-radius: 8px;
bottom: 16px;
@@ -114,7 +154,7 @@
line-height: 20px;
max-width: 50vw;
padding: 8px;
- position: absolute;
+ position: fixed;
text-shadow: var(--ntp-theme-text-shadow);
}
@@ -154,72 +194,113 @@
}
#backgroundImageAttribution1 {
- font-size: 0.875rem;
+ font-size: .875rem;
}
#backgroundImageAttribution2 {
- font-size: 0.75rem;
+ font-size: .75rem;
+ }
+
+ @keyframes fadein {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+ }
+
+ .fadein {
+ animation: 100ms ease-in-out fadein;
+ }
+
+ svg {
+ position: fixed;
}
</style>
-<div id="background"
- style="background-color: [[rgbOrInherit_(theme_.backgroundColor)]];
- --ntp-theme-text-color: [[rgbOrInherit_(theme_.shortcutTextColor)]];
+<div id="content"
+ style="--ntp-theme-text-color: [[rgbaOrInherit_(theme_.shortcutTextColor)]];
--ntp-theme-shortcut-background-color:
- [[rgbOrInherit_(theme_.shortcutBackgroundColor)]];
- --ntp-logo-color: [[rgbOrInherit_(theme_.logoColor)]];">
- <ntp-untrusted-iframe id="backgroundImage" path="[[backgroundImagePath_]]"
- hidden="[[!showBackgroundImage_]]">
- </ntp-untrusted-iframe>
- <div id="backgroundGradient" hidden="[[!showBackgroundImage_]]"></div>
- <div id="content">
- <div id="oneGoogleBarSpacer"></div>
- <ntp-logo id="logo" doodle-allowed$="[[doodleAllowed_]]"
- single-colored$="[[singleColoredLogo_]]">
- </ntp-logo>
- <ntp-fakebox id="fakebox" on-open-voice-search="onVoiceSearchClick_">
- </ntp-fakebox>
- <ntp-most-visited id="mostVisited" dark$="[[theme_.isDark]]">
- </ntp-most-visited>
- <dom-if if="[[showCustomizeDialog_]]" restamp>
- <template>
- <ntp-customize-dialog on-close="onCustomizeDialogClose_"
- theme="[[theme_]]">
- </ntp-customize-dialog>
- </template>
- </dom-if>
- <dom-if if="[[showVoiceSearchOverlay_]]" restamp>
- <template>
- <ntp-voice-search-overlay on-close="onVoiceSearchOverlayClose_">
- </ntp-voice-search-overlay>
- </template>
- </dom-if>
- <ntp-untrusted-iframe id="promo" path="promo" hidden$="[[!promoLoaded_]]">
- </ntp-untrusted-iframe>
- <!-- cr-button is transparent on hover. This leads to incorrect results when
- a custom background is set. Therefore, wrap customize button in
- container to enfore solid background color. -->
- <div id="customizeButtonContainer">
- <cr-button id="customizeButton" on-click="onCustomizeClick_">
- <div id="customizeIcon"></div>
- $i18n{customizeButton}
- </cr-button>
- </div>
- <a id="backgroundImageAttribution"
- href="[[theme_.backgroundImageAttributionUrl.url]]"
- hidden="[[!theme_.backgroundImageAttribution1]]">
- <div id="backgroundImageAttribution1Container">
- <div id="linkIcon"></div>
- <div id="backgroundImageAttribution1">
- [[theme_.backgroundImageAttribution1]]
+ [[rgbaOrInherit_(theme_.shortcutBackgroundColor)]];
+ --ntp-logo-color: [[rgbaOrInherit_(logoColor_)]];">
+ <dom-if if="[[showIframedOneGoogleBar_]]">
+ <template>
+ <ntp-untrusted-iframe id="oneGoogleBar" path="[[oneGoogleBarIframePath_]]"
+ hidden$="[[!oneGoogleBarLoaded_]]">
+ </ntp-untrusted-iframe>
+ </template>
+ </dom-if>
+ <ntp-logo id="logo" doodle-allowed$="[[doodleAllowed_]]"
+ single-colored$="[[singleColoredLogo_]]">
+ </ntp-logo>
+ <ntp-fakebox id="fakebox" on-open-voice-search="onVoiceSearchClick_"
+ hidden$="[[realboxEnabled_]]">
+ </ntp-fakebox>
+ <ntp-realbox id="realbox" on-open-voice-search="onVoiceSearchClick_"
+ theme="[[theme_.searchBox]]" shown$="[[realboxShown_]]"
+ hidden$="[[!realboxEnabled_]]">
+ </ntp-realbox>
+ <ntp-most-visited id="mostVisited" dark$="[[theme_.isDark]]"
+ use-white-add-icon$="[[theme_.shortcutUseWhiteAddIcon]]"
+ use-title-pill$="[[theme_.shortcutUseTitlePill]]">
+ </ntp-most-visited>
+ <dom-if if="[[lazyRender_]]">
+ <template>
+ <ntp-untrusted-iframe id="promo" path="promo" hidden$="[[!promoLoaded_]]">
+ </ntp-untrusted-iframe>
+ <a id="backgroundImageAttribution"
+ href="[[backgroundImageAttributionUrl_]]"
+ hidden="[[!backgroundImageAttribution1_]]">
+ <div id="backgroundImageAttribution1Container">
+ <div id="linkIcon"></div>
+ <div id="backgroundImageAttribution1">
+ [[backgroundImageAttribution1_]]
+ </div>
+ </div>
+ <div id="backgroundImageAttribution2"
+ hidden="[[!backgroundImageAttribution2_]]">
+ [[backgroundImageAttribution2_]]
</div>
+ </a>
+ <div id="customizeButtonSpacer"></div>
+ <!-- cr-button has a transparent background. This leads to incorrect
+ results when a custom background is set. Therefore, wrap customize
+ button in container to enfore solid background color. -->
+ <div id="customizeButtonContainer">
+ <cr-button id="customizeButton" on-click="onCustomizeClick_"
+ title="$i18n{customizeThisPage}">
+ <div id="customizeIcon"></div>
+ <div id="customizeText" hidden$="[[showBackgroundImage_]]">
+ $i18n{customizeButton}
+ </div>
+ </cr-button>
</div>
- <div id="backgroundImageAttribution2"
- hidden="[[!theme_.backgroundImageAttribution2]]">
- [[theme_.backgroundImageAttribution2]]
+ <div id="themeAttribution"
+ hidden$="[[!theme_.backgroundImage.attributionUrl]]">
+ <div>$i18n{themeCreatedBy}</div>
+ <img src="[[theme_.backgroundImage.attributionUrl.url]]"><img>
</div>
- </a>
- </div>
- <ntp-untrusted-iframe id="oneGoogleBar" path="one-google-bar"
- hidden$="[[!oneGoogleBarLoaded_]]">
- </ntp-untrusted-iframe>
+ </template>
+ </dom-if>
</div>
+<dom-if if="[[showVoiceSearchOverlay_]]" restamp>
+ <template>
+ <ntp-voice-search-overlay on-close="onVoiceSearchOverlayClose_">
+ </ntp-voice-search-overlay>
+ </template>
+</dom-if>
+<dom-if if="[[showCustomizeDialog_]]" restamp>
+ <template>
+ <ntp-customize-dialog on-close="onCustomizeDialogClose_"
+ theme="[[theme_]]"
+ background-selection="{{backgroundSelection_}}">
+ </ntp-customize-dialog>
+ </template>
+</dom-if>
+<svg>
+ <defs>
+ <clipPath id="oneGoogleBarClipPath">
+ <rect x="0" y="0" width="100vw" height="56"></rect>
+ </clipPath>
+ </defs>
+</svg>
diff --git a/chromium/chrome/browser/resources/new_tab_page/app.js b/chromium/chrome/browser/resources/new_tab_page/app.js
index f5a695ffdc4..74dbea61053 100644
--- a/chromium/chrome/browser/resources/new_tab_page/app.js
+++ b/chromium/chrome/browser/resources/new_tab_page/app.js
@@ -8,16 +8,21 @@ import './customize_dialog.js';
import './voice_search_overlay.js';
import './untrusted_iframe.js';
import './fakebox.js';
+import './realbox.js';
import './logo.js';
import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
import 'chrome://resources/cr_elements/shared_style_css.m.js';
import {assert} from 'chrome://resources/js/assert.m.js';
+import {FocusOutlineManager} from 'chrome://resources/js/cr/ui/focus_outline_manager.m.js';
import {EventTracker} from 'chrome://resources/js/event_tracker.m.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {BackgroundManager} from './background_manager.js';
import {BrowserProxy} from './browser_proxy.js';
-import {skColorToRgb} from './utils.js';
+import {BackgroundSelection, BackgroundSelectionType} from './customize_dialog.js';
+import {$$, hexColorToSkColor, skColorToRgba} from './utils.js';
class AppElement extends PolymerElement {
static get is() {
@@ -31,19 +36,64 @@ class AppElement extends PolymerElement {
static get properties() {
return {
/** @private */
+ iframeOneGoogleBarEnabled_: {
+ type: Boolean,
+ value: () => {
+ const params = new URLSearchParams(window.location.search);
+ if (params.has('ogbinline')) {
+ return false;
+ }
+ return loadTimeData.getBoolean('iframeOneGoogleBarEnabled') ||
+ params.has('ogbiframe');
+ },
+ reflectToAttribute: true,
+ },
+
+ /** @private */
+ oneGoogleBarIframePath_: {
+ type: String,
+ value: () => {
+ const params = new URLSearchParams();
+ params.set(
+ 'paramsencoded',
+ btoa(window.location.search.replace(/^[?]/, '&')));
+ return `one-google-bar?${params}`;
+ },
+ },
+
+ /** @private */
oneGoogleBarLoaded_: {
type: Boolean,
value: false,
},
/** @private */
+ oneGoogleBarDarkThemeEnabled_: {
+ type: Boolean,
+ computed: `computeOneGoogleBarDarkThemeEnabled_(oneGoogleBarLoaded_,
+ theme_, backgroundSelection_)`,
+ observer: 'onOneGoogleBarDarkThemeEnabledChange_',
+ },
+
+ /** @private */
+ showIframedOneGoogleBar_: {
+ type: Boolean,
+ value: false,
+ computed: `computeShowIframedOneGoogleBar_(iframeOneGoogleBarEnabled_,
+ lazyRender_)`,
+ },
+
+ /** @private */
promoLoaded_: {
type: Boolean,
value: false,
},
/** @private {!newTabPage.mojom.Theme} */
- theme_: Object,
+ theme_: {
+ observer: 'onThemeChange_',
+ type: Object,
+ },
/** @private */
showCustomizeDialog_: Boolean,
@@ -53,15 +103,38 @@ class AppElement extends PolymerElement {
/** @private */
showBackgroundImage_: {
- computed: 'computeShowBackgroundImage_(theme_)',
+ computed: 'computeShowBackgroundImage_(theme_, backgroundSelection_)',
+ observer: 'onShowBackgroundImageChange_',
reflectToAttribute: true,
type: Boolean,
},
+ /** @private {!BackgroundSelection} */
+ backgroundSelection_: {
+ type: Object,
+ value: () => ({type: BackgroundSelectionType.NO_SELECTION}),
+ observer: 'updateBackgroundImagePath_',
+ },
+
+ /** @private */
+ backgroundImageAttribution1_: {
+ type: String,
+ computed: `computeBackgroundImageAttribution1_(theme_,
+ backgroundSelection_)`,
+ },
+
+ /** @private */
+ backgroundImageAttribution2_: {
+ type: String,
+ computed: `computeBackgroundImageAttribution2_(theme_,
+ backgroundSelection_)`,
+ },
+
/** @private */
- backgroundImagePath_: {
- computed: 'computeBackgroundImagePath_(theme_)',
+ backgroundImageAttributionUrl_: {
type: String,
+ computed: `computeBackgroundImageAttributionUrl_(theme_,
+ backgroundSelection_)`,
},
/** @private */
@@ -71,21 +144,61 @@ class AppElement extends PolymerElement {
},
/** @private */
+ logoColor_: {
+ type: String,
+ computed: 'computeLogoColor_(theme_, backgroundSelection_)',
+ },
+
+ /** @private */
singleColoredLogo_: {
- computed: 'computeSingleColoredLogo_(theme_)',
+ computed: 'computeSingleColoredLogo_(theme_, backgroundSelection_)',
+ type: Boolean,
+ },
+
+ /** @private */
+ realboxEnabled_: {
type: Boolean,
+ value: () => loadTimeData.getBoolean('realboxEnabled'),
},
+
+ /** @private */
+ realboxShown_: {
+ type: Boolean,
+ computed: 'computeRealboxShown_(theme_)',
+ },
+
+ /**
+ * If true, renders additional elements that were not deemed crucial to
+ * to show up immediately on load.
+ * @private
+ */
+ lazyRender_: Boolean,
};
}
constructor() {
+ performance.mark('app-creation-start');
super();
/** @private {!newTabPage.mojom.PageCallbackRouter} */
this.callbackRouter_ = BrowserProxy.getInstance().callbackRouter;
+ /** @private {!BackgroundManager} */
+ this.backgroundManager_ = BackgroundManager.getInstance();
/** @private {?number} */
this.setThemeListenerId_ = null;
/** @private {!EventTracker} */
this.eventTracker_ = new EventTracker();
+ this.loadOneGoogleBar_();
+ /** @private {boolean} */
+ this.shouldPrintPerformance_ =
+ new URLSearchParams(location.search).has('print_perf');
+ /**
+ * Initialized with the start of the performance timeline in case the
+ * background image load is not triggered by JS.
+ * @private {number}
+ */
+ this.backgroundImageLoadStartEpoch_ = performance.timeOrigin;
+ /** @private {number} */
+ this.backgroundImageLoadStart_ = 0;
}
/** @override */
@@ -93,6 +206,7 @@ class AppElement extends PolymerElement {
super.connectedCallback();
this.setThemeListenerId_ =
this.callbackRouter_.setTheme.addListener(theme => {
+ performance.measure('theme-set');
this.theme_ = theme;
});
this.eventTracker_.add(window, 'message', ({data}) => {
@@ -109,6 +223,25 @@ class AppElement extends PolymerElement {
}
}
});
+ if (this.shouldPrintPerformance_) {
+ // It is possible that the background image has already loaded by now.
+ // If it has, we request it to re-send the load time so that we can
+ // actually catch the load time.
+ this.backgroundManager_.getBackgroundImageLoadTime().then(
+ time => {
+ const duration = time - this.backgroundImageLoadStartEpoch_;
+ this.printPerformanceDatum_(
+ 'background-image-load', this.backgroundImageLoadStart_,
+ duration);
+ this.printPerformanceDatum_(
+ 'background-image-loaded',
+ this.backgroundImageLoadStart_ + duration);
+ },
+ () => {
+ console.error('Failed to capture background image load time');
+ });
+ }
+ FocusOutlineManager.forDocument(document);
}
/** @override */
@@ -118,6 +251,182 @@ class AppElement extends PolymerElement {
this.eventTracker_.removeAll();
}
+ /** @override */
+ ready() {
+ super.ready();
+ // Let the browser breath and then render remaining elements.
+ BrowserProxy.getInstance().waitForLazyRender().then(() => {
+ this.lazyRender_ = true;
+ });
+ this.printPerformance_();
+ performance.measure('app-creation', 'app-creation-start');
+ }
+
+ /**
+ * @return {boolean}
+ * @private
+ */
+ computeOneGoogleBarDarkThemeEnabled_() {
+ if (!this.theme_ || !this.oneGoogleBarLoaded_) {
+ return false;
+ }
+ switch (this.backgroundSelection_.type) {
+ case BackgroundSelectionType.IMAGE:
+ return true;
+ case BackgroundSelectionType.NO_BACKGROUND:
+ case BackgroundSelectionType.DAILY_REFRESH:
+ case BackgroundSelectionType.NO_SELECTION:
+ default:
+ return this.theme_.isDark;
+ }
+ }
+
+ /**
+ * @return {!Promise}
+ * @private
+ */
+ async loadOneGoogleBar_() {
+ if (this.iframeOneGoogleBarEnabled_) {
+ const oneGoogleBar = document.querySelector('#oneGoogleBar');
+ oneGoogleBar.remove();
+ return;
+ }
+
+ const {parts} =
+ await BrowserProxy.getInstance().handler.getOneGoogleBarParts(
+ window.location.search.replace(/^[?]/, '&'));
+ if (!parts) {
+ return;
+ }
+
+ const inHeadStyle = document.createElement('style');
+ inHeadStyle.type = 'text/css';
+ inHeadStyle.appendChild(document.createTextNode(parts.inHeadStyle));
+ document.head.appendChild(inHeadStyle);
+
+ const inHeadScript = document.createElement('script');
+ inHeadScript.type = 'text/javascript';
+ inHeadScript.appendChild(document.createTextNode(parts.inHeadScript));
+ document.head.appendChild(inHeadScript);
+
+ this.oneGoogleBarLoaded_ = true;
+ const oneGoogleBar = document.querySelector('#oneGoogleBar');
+ oneGoogleBar.innerHTML = parts.barHtml;
+
+ const afterBarScript = document.createElement('script');
+ afterBarScript.type = 'text/javascript';
+ afterBarScript.appendChild(document.createTextNode(parts.afterBarScript));
+ oneGoogleBar.parentNode.insertBefore(
+ afterBarScript, oneGoogleBar.nextSibling);
+
+ document.querySelector('#oneGoogleBarEndOfBody').innerHTML =
+ parts.endOfBodyHtml;
+
+ const endOfBodyScript = document.createElement('script');
+ endOfBodyScript.type = 'text/javascript';
+ endOfBodyScript.appendChild(document.createTextNode(parts.endOfBodyScript));
+ document.body.appendChild(endOfBodyScript);
+
+ BrowserProxy.getInstance().handler.onOneGoogleBarRendered(
+ BrowserProxy.getInstance().now());
+ }
+
+ /** @private */
+ async onOneGoogleBarDarkThemeEnabledChange_() {
+ if (!this.oneGoogleBarLoaded_) {
+ return;
+ }
+ if (this.iframeOneGoogleBarEnabled_) {
+ $$(this, '#oneGoogleBar').postMessage({
+ type: 'enableDarkTheme',
+ enabled: this.oneGoogleBarDarkThemeEnabled_,
+ });
+ return;
+ }
+ const {gbar} = /** @type {{gbar}} */ (window);
+ if (!gbar) {
+ return;
+ }
+ const oneGoogleBar =
+ await /** @type {!{a: {bf: function(): !Promise<{pc: !Function}>}}} */ (
+ gbar)
+ .a.bf();
+ oneGoogleBar.pc.call(
+ oneGoogleBar, this.oneGoogleBarDarkThemeEnabled_ ? 1 : 0);
+ }
+
+ /**
+ * @return {boolean}
+ * @private
+ */
+ computeShowIframedOneGoogleBar_() {
+ return this.iframeOneGoogleBarEnabled_ && this.lazyRender_;
+ }
+
+ /**
+ * @return {string}
+ * @private
+ */
+ computeBackgroundImageAttribution1_() {
+ switch (this.backgroundSelection_.type) {
+ case BackgroundSelectionType.NO_SELECTION:
+ return this.theme_ && this.theme_.backgroundImageAttribution1 || '';
+ case BackgroundSelectionType.IMAGE:
+ return this.backgroundSelection_.image.attribution1;
+ case BackgroundSelectionType.NO_BACKGROUND:
+ case BackgroundSelectionType.DAILY_REFRESH:
+ default:
+ return '';
+ }
+ }
+
+ /**
+ * @return {string}
+ * @private
+ */
+ computeBackgroundImageAttribution2_() {
+ switch (this.backgroundSelection_.type) {
+ case BackgroundSelectionType.NO_SELECTION:
+ return this.theme_ && this.theme_.backgroundImageAttribution2 || '';
+ case BackgroundSelectionType.IMAGE:
+ return this.backgroundSelection_.image.attribution2;
+ case BackgroundSelectionType.NO_BACKGROUND:
+ case BackgroundSelectionType.DAILY_REFRESH:
+ default:
+ return '';
+ }
+ }
+
+ /**
+ * @return {string}
+ * @private
+ */
+ computeBackgroundImageAttributionUrl_() {
+ switch (this.backgroundSelection_.type) {
+ case BackgroundSelectionType.NO_SELECTION:
+ return this.theme_ && this.theme_.backgroundImageAttributionUrl ?
+ this.theme_.backgroundImageAttributionUrl.url :
+ '';
+ case BackgroundSelectionType.IMAGE:
+ return this.backgroundSelection_.image.attributionUrl.url;
+ case BackgroundSelectionType.NO_BACKGROUND:
+ case BackgroundSelectionType.DAILY_REFRESH:
+ default:
+ return '';
+ }
+ }
+
+ /**
+ * @return {boolean}
+ * @private
+ */
+ computeRealboxShown_() {
+ // If realbox is to match the Omnibox's theme, keep it hidden until the
+ // theme arrives. Otherwise mismatching colors will cause flicker.
+ return !loadTimeData.getBoolean('realboxMatchOmniboxTheme') ||
+ !!this.theme_;
+ }
+
/** @private */
onVoiceSearchClick_() {
this.showVoiceSearchOverlay_ = true;
@@ -143,8 +452,8 @@ class AppElement extends PolymerElement {
* @return {string}
* @private
*/
- rgbOrInherit_(skColor) {
- return skColor ? skColorToRgb(skColor) : 'inherit';
+ rgbaOrInherit_(skColor) {
+ return skColor ? skColorToRgba(skColor) : 'inherit';
}
/**
@@ -152,18 +461,85 @@ class AppElement extends PolymerElement {
* @private
*/
computeShowBackgroundImage_() {
- return !!this.theme_ && !!this.theme_.backgroundImageUrl;
+ switch (this.backgroundSelection_.type) {
+ case BackgroundSelectionType.NO_SELECTION:
+ return !!this.theme_ && !!this.theme_.backgroundImage;
+ case BackgroundSelectionType.IMAGE:
+ return true;
+ case BackgroundSelectionType.NO_BACKGROUND:
+ case BackgroundSelectionType.DAILY_REFRESH:
+ default:
+ return false;
+ }
+ }
+
+ /** @private */
+ onShowBackgroundImageChange_() {
+ this.backgroundManager_.setShowBackgroundImage(this.showBackgroundImage_);
+ }
+
+ /** @private */
+ onThemeChange_() {
+ if (this.theme_) {
+ this.backgroundManager_.setBackgroundColor(this.theme_.backgroundColor);
+ }
+ this.updateBackgroundImagePath_();
}
/**
- * @return {string}
+ * Set the #backgroundImage |path| only when different and non-empty. Reset
+ * the customize dialog background selection if the dialog is closed.
+ *
+ * The ntp-untrusted-iframe |path| is set directly. When using a data binding
+ * instead, the quick updates to the |path| result in iframe loading an error
+ * page.
* @private
*/
- computeBackgroundImagePath_() {
- if (!this.theme_ || !this.theme_.backgroundImageUrl) {
- return '';
+ updateBackgroundImagePath_() {
+ // The |backgroundSelection_| is retained after the dialog commits the
+ // change to the theme. Since |backgroundSelection_| has precedence over
+ // the theme background, the |backgroundSelection_| needs to be reset when
+ // the theme is updated. This is only necessary when the dialog is closed.
+ // If the dialog is open, it will either commit the |backgroundSelection_|
+ // or reset |backgroundSelection_| on cancel.
+ //
+ // Update after background image path is updated so the image is not shown
+ // before the path is updated.
+ if (!this.showCustomizeDialog_ &&
+ this.backgroundSelection_.type !==
+ BackgroundSelectionType.NO_SELECTION) {
+ // Wait when local image is selected, then no background is previewed
+ // followed by selecting a new local image. This avoids a flicker. The
+ // iframe with the old image is shown briefly before it navigates to a new
+ // iframe location, then fetches and renders the new local image.
+ if (this.backgroundSelection_.type ===
+ BackgroundSelectionType.NO_BACKGROUND) {
+ setTimeout(() => {
+ this.backgroundSelection_ = {
+ type: BackgroundSelectionType.NO_SELECTION
+ };
+ }, 100);
+ } else {
+ this.backgroundSelection_ = {
+ type: BackgroundSelectionType.NO_SELECTION
+ };
+ }
+ }
+ /** @type {newTabPage.mojom.BackgroundImage|undefined} */
+ let backgroundImage;
+ switch (this.backgroundSelection_.type) {
+ case BackgroundSelectionType.NO_SELECTION:
+ backgroundImage = this.theme_ && this.theme_.backgroundImage;
+ break;
+ case BackgroundSelectionType.IMAGE:
+ backgroundImage = {
+ url: {url: this.backgroundSelection_.image.imageUrl.url}
+ };
+ break;
+ }
+ if (backgroundImage) {
+ this.backgroundManager_.setBackgroundImage(backgroundImage);
}
- return `image?${this.theme_.backgroundImageUrl.url}`;
}
/**
@@ -171,9 +547,27 @@ class AppElement extends PolymerElement {
* @private
*/
computeDoodleAllowed_() {
- return !this.showBackgroundImage_ &&
- (!this.theme_ ||
- this.theme_.type === newTabPage.mojom.ThemeType.DEFAULT);
+ return !this.showBackgroundImage_ && this.theme_ &&
+ this.theme_.type === newTabPage.mojom.ThemeType.DEFAULT &&
+ !this.theme_.isDark;
+ }
+
+ /**
+ * @return {skia.mojom.SkColor}
+ * @private
+ */
+ computeLogoColor_() {
+ switch (this.backgroundSelection_.type) {
+ case BackgroundSelectionType.IMAGE:
+ return hexColorToSkColor('#ffffff');
+ case BackgroundSelectionType.NO_SELECTION:
+ case BackgroundSelectionType.NO_BACKGROUND:
+ case BackgroundSelectionType.DAILY_REFRESH:
+ default:
+ return this.theme_ &&
+ (this.theme_.logoColor ||
+ (this.theme_.isDark ? hexColorToSkColor('#ffffff') : null));
+ }
}
/**
@@ -181,27 +575,45 @@ class AppElement extends PolymerElement {
* @private
*/
computeSingleColoredLogo_() {
- return this.theme_ && !!this.theme_.logoColor;
+ switch (this.backgroundSelection_.type) {
+ case BackgroundSelectionType.IMAGE:
+ return true;
+ case BackgroundSelectionType.DAILY_REFRESH:
+ case BackgroundSelectionType.NO_BACKGROUND:
+ case BackgroundSelectionType.NO_SELECTION:
+ default:
+ return this.theme_ && (!!this.theme_.logoColor || this.theme_.isDark);
+ }
}
/**
* Handles messages from the OneGoogleBar iframe. The messages that are
- * handled include show bar on load and activate/deactivate.
- * The activate/deactivate controls if the OneGoogleBar accepts mouse events,
- * though other events need to be forwarded to support touch.
+ * handled include show bar on load and overlay updates.
+ * 'overlaysUpdated' message includes the updated array of overlay rects that
+ * are shown.
* @param {!Object} data
* @private
*/
handleOneGoogleBarMessage_(data) {
if (data.messageType === 'loaded') {
this.oneGoogleBarLoaded_ = true;
- this.eventTracker_.add(window, 'mousemove', ({x, y}) => {
- this.$.oneGoogleBar.postMessage({type: 'mousemove', x, y});
+ BrowserProxy.getInstance().handler.onOneGoogleBarRendered(
+ BrowserProxy.getInstance().now());
+ } else if (data.messageType === 'overlaysUpdated') {
+ this.$.oneGoogleBarClipPath.querySelectorAll('rect:not(:first-child)')
+ .forEach(el => {
+ el.remove();
+ });
+ const overlayRects = /** @type {!Array<!DOMRect>} */ (data.data);
+ overlayRects.forEach(({x, y, width, height}) => {
+ const rectElement =
+ document.createElementNS('http://www.w3.org/2000/svg', 'rect');
+ rectElement.setAttribute('x', x);
+ rectElement.setAttribute('y', y);
+ rectElement.setAttribute('width', width);
+ rectElement.setAttribute('height', height);
+ this.$.oneGoogleBarClipPath.appendChild(rectElement);
});
- } else if (data.messageType === 'activate') {
- this.$.oneGoogleBar.style.pointerEvents = 'unset';
- } else if (data.messageType === 'deactivate') {
- this.$.oneGoogleBar.style.pointerEvents = 'none';
}
}
@@ -217,12 +629,58 @@ class AppElement extends PolymerElement {
this.promoLoaded_ = true;
const onResize = () => {
const hidePromo = this.$.mostVisited.getBoundingClientRect().bottom >=
- this.$.promo.offsetTop;
- this.$.promo.style.opacity = hidePromo ? 0 : 1;
+ $$(this, '#promo').offsetTop;
+ $$(this, '#promo').style.opacity = hidePromo ? 0 : 1;
};
this.eventTracker_.add(window, 'resize', onResize);
onResize();
+ BrowserProxy.getInstance().handler.onPromoRendered(
+ BrowserProxy.getInstance().now());
+ } else if (data.messageType === 'link-clicked') {
+ BrowserProxy.getInstance().handler.onPromoLinkClicked(
+ BrowserProxy.getInstance().now());
+ }
+ }
+
+ /** @private */
+ printPerformanceDatum_(name, time, auxTime = 0) {
+ if (!this.shouldPrintPerformance_) {
+ return;
+ }
+ if (!auxTime) {
+ console.log(`${name}: ${time}`);
+ } else {
+ console.log(`${name}: ${time} (${auxTime})`);
+ }
+ }
+
+ /**
+ * Prints performance measurements to the console. Also, installs performance
+ * observer to continuously print performance measurements after.
+ * @private
+ */
+ printPerformance_() {
+ if (!this.shouldPrintPerformance_) {
+ return;
}
+ const entryTypes = ['paint', 'measure'];
+ const log = (entry) => {
+ this.printPerformanceDatum_(
+ entry.name, entry.duration ? entry.duration : entry.startTime,
+ entry.duration && entry.startTime ? entry.startTime : 0);
+ };
+ const observer = new PerformanceObserver(list => {
+ list.getEntries().forEach((entry) => {
+ log(entry);
+ });
+ });
+ observer.observe({entryTypes: entryTypes});
+ performance.getEntries().forEach((entry) => {
+ if (!entryTypes.includes(entry.entryType)) {
+ return;
+ }
+ log(entry);
+ });
}
}
diff --git a/chromium/chrome/browser/resources/new_tab_page/background_manager.js b/chromium/chrome/browser/resources/new_tab_page/background_manager.js
new file mode 100644
index 00000000000..5ce42ef901a
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/background_manager.js
@@ -0,0 +1,141 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {addSingletonGetter} from 'chrome://resources/js/cr.m.js';
+import {EventTracker} from 'chrome://resources/js/event_tracker.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+
+import {BrowserProxy} from './browser_proxy.js';
+import {skColorToRgba} from './utils.js';
+
+/**
+ * @fileoverview The background manager brokers access to background related
+ * DOM elements. The reason for this abstraction is that the these elements are
+ * not owned by any custom elements (this is done so that the aforementioned DOM
+ * elements load faster at startup).
+ *
+ * The background manager expects an iframe with ID 'backgroundImage' to be
+ * present in the DOM. It will use that element to set the background image URL.
+ */
+
+/**
+ * Installs a listener for background image load times and manages a
+ * |PromiseResolver| that resolves to the captured load time.
+ */
+class LoadTimeResolver {
+ /** @param {string} url */
+ constructor(url) {
+ /** @private {!PromiseResolver<number>} */
+ this.resolver_ = new PromiseResolver();
+ /** @private {!EventTracker} */
+ this.eventTracker_ = new EventTracker();
+ this.eventTracker_.add(window, 'message', ({data}) => {
+ if (data.frameType === 'background-image' &&
+ data.messageType === 'loaded' && url === data.url) {
+ this.resolve_(data.time);
+ }
+ });
+ }
+
+ /** @return {!Promise<number>} */
+ get promise() {
+ return this.resolver_.promise;
+ }
+
+ reject() {
+ this.resolver_.reject();
+ this.eventTracker_.removeAll();
+ }
+
+ /** @param {number} loadTime */
+ resolve_(loadTime) {
+ this.resolver_.resolve(loadTime);
+ this.eventTracker_.removeAll();
+ }
+}
+
+export class BackgroundManager {
+ constructor() {
+ /** @private {Element} */
+ this.backgroundImage_ = document.body.querySelector('#backgroundImage');
+ /** @private {LoadTimeResolver} */
+ this.loadTimeResolver_ = null;
+ }
+
+ /**
+ * Sets whether the background image should be shown.
+ * @param {boolean} show True, if the background image should be shown.
+ */
+ setShowBackgroundImage(show) {
+ document.body.toggleAttribute('show-background-image', show);
+ }
+
+ /**
+ * Sets the background color.
+ * @param {skia.mojom.SkColor} color The background color.
+ */
+ setBackgroundColor(color) {
+ document.body.style.backgroundColor = skColorToRgba(color);
+ }
+
+ /**
+ * Sets the background image.
+ * @param {!newTabPage.mojom.BackgroundImage} image The background image.
+ */
+ setBackgroundImage(image) {
+ const url =
+ new URL('chrome-untrusted://new-tab-page/custom_background_image');
+ url.searchParams.append('url', image.url.url);
+ if (image.url2x) {
+ url.searchParams.append('url2x', image.url2x.url);
+ }
+ if (image.size) {
+ url.searchParams.append('size', image.size);
+ }
+ if (image.repeatX) {
+ url.searchParams.append('repeatX', image.repeatX);
+ }
+ if (image.repeatY) {
+ url.searchParams.append('repeatY', image.repeatY);
+ }
+ if (image.positionX) {
+ url.searchParams.append('positionX', image.positionX);
+ }
+ if (image.positionY) {
+ url.searchParams.append('positionY', image.positionY);
+ }
+ if (url.href === this.backgroundImage_.src) {
+ return;
+ }
+ if (this.loadTimeResolver_) {
+ this.loadTimeResolver_.reject();
+ this.loadTimeResolver_ = null;
+ }
+ this.backgroundImage_.src = url.href;
+ }
+
+ /**
+ * Returns promise that resolves with the background image load time.
+ *
+ * The background image iframe proactively sends the load time as soon as it
+ * has loaded. However, this could be before we have installed the message
+ * listener in LoadTimeResolver. Therefore, we request the background image
+ * iframe to resend the load time in case it has already loaded. With that
+ * setup we ensure that the load time is (re)sent _after_ both the NTP top
+ * frame and the background image iframe have installed the required message
+ * listeners.
+ * @return {!Promise<number>}
+ */
+ getBackgroundImageLoadTime() {
+ if (!this.loadTimeResolver_) {
+ this.loadTimeResolver_ = new LoadTimeResolver(this.backgroundImage_.src);
+ BrowserProxy.getInstance().postMessage(
+ this.backgroundImage_, 'sendLoadTime',
+ 'chrome-untrusted://new-tab-page');
+ }
+ return this.loadTimeResolver_.promise;
+ }
+}
+
+addSingletonGetter(BackgroundManager);
diff --git a/chromium/chrome/browser/resources/new_tab_page/browser_proxy.js b/chromium/chrome/browser/resources/new_tab_page/browser_proxy.js
index 7744ba398a4..c91deaf6a0a 100644
--- a/chromium/chrome/browser/resources/new_tab_page/browser_proxy.js
+++ b/chromium/chrome/browser/resources/new_tab_page/browser_proxy.js
@@ -3,9 +3,13 @@
// found in the LICENSE file.
import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
+import 'chrome://resources/mojo/mojo/public/mojom/base/big_buffer.mojom-lite.js';
+import 'chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-lite.js';
import 'chrome://resources/mojo/mojo/public/mojom/base/text_direction.mojom-lite.js';
+import 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-lite.js';
import 'chrome://resources/mojo/url/mojom/url.mojom-lite.js';
+import './omnibox.mojom-lite.js';
import './skcolor.mojom-lite.js';
import './new_tab_page.mojom-lite.js';
@@ -30,6 +34,11 @@ export class BrowserProxy {
window.location.href = href;
}
+ /** @param {string} url */
+ open(url) {
+ window.open(url, '_blank');
+ }
+
/**
* @param {function()} callback
* @param {number} duration
@@ -64,6 +73,31 @@ export class BrowserProxy {
matchMedia(query) {
return window.matchMedia(query);
}
+
+ /** @return {number} */
+ now() {
+ return Date.now();
+ }
+
+ /**
+ * Returns promise that resolves when lazy rendering should be started.
+ * @return {!Promise}
+ */
+ waitForLazyRender() {
+ return new Promise((resolve, reject) => {
+ setTimeout(resolve, 50);
+ });
+ }
+
+ /**
+ * Posts |message| on the content window of |iframe| at |targetOrigin|.
+ * @param {!HTMLIFrameElement} iframe
+ * @param {*} message
+ * @param {string} targetOrigin
+ */
+ postMessage(iframe, message, targetOrigin) {
+ iframe.contentWindow.postMessage(message, targetOrigin);
+ }
}
addSingletonGetter(BrowserProxy);
diff --git a/chromium/chrome/browser/resources/new_tab_page/customize_backgrounds.html b/chromium/chrome/browser/resources/new_tab_page/customize_backgrounds.html
index c5ce1225f07..bd734769a8e 100644
--- a/chromium/chrome/browser/resources/new_tab_page/customize_backgrounds.html
+++ b/chromium/chrome/browser/resources/new_tab_page/customize_backgrounds.html
@@ -1,4 +1,9 @@
-<style>
+<style include="cr-hidden-style">
+ :host {
+ display: flex;
+ height: -webkit-fill-available;
+ }
+
#container {
padding: 4px;
}
@@ -17,7 +22,7 @@
}
:host-context(.focus-outline-visible) .tile:focus {
- box-shadow: 0 0 0 2px var(--ntp-focus-shadow-color);
+ box-shadow: var(--ntp-focus-shadow);
}
.image {
@@ -33,14 +38,167 @@
margin-top: 3px;
min-height: 30px;
}
+
+ .selected {
+ background-color: var(--ntp-selected-background-color);
+ border-radius: 4px;
+ position: relative;
+ }
+
+ .selected .image,
+ .selected #uploadFromDevice {
+ box-shadow: 0 1px 3px 0 rgba(var(--google-grey-800-rgb), .3),
+ 0 4px 8px 3px rgba(var(--google-grey-800-rgb), .15);
+ }
+
+ .selected .image {
+ transform: scale(.8);
+ }
+
+ .selected-circle {
+ background-color: var(--ntp-background-override-color);
+ border-radius: 50%;
+ box-shadow: 0 3px 6px 1px rgba(0, 0, 0, .16),
+ 0 1px 2px 1px rgba(0, 0, 0, .23);
+ display: none;
+ height: 22px;
+ left: initial;
+ position: absolute;
+ right: 10px;
+ top: 8px;
+ width: 22px;
+ }
+
+ :host-context([dir=rtl]) .selected-circle {
+ left: 10px;
+ right: initial;
+ }
+
+ .selected-check {
+ -webkit-mask-image: url(icons/check_circle.svg);
+ -webkit-mask-repeat: no-repeat;
+ -webkit-mask-size: 28px;
+ background-color: var(--ntp-selected-border-color);
+ display: none;
+ height: 28px;
+ left: initial;
+ position: absolute;
+ right: 7px;
+ top: 5px;
+ width: 28px;
+ }
+
+ :host-context([dir=rtl]) .selected-check {
+ left: 7px;
+ right: initial;
+ }
+
+ .selected :-webkit-any(.selected-circle, .selected-check) {
+ display: block;
+ }
+
+ #noBackground .image,
+ #uploadFromDevice .image {
+ background: var(--ntp-background-override-color);
+ border: 1px solid var(--ntp-border-color);
+ }
+
+ #uploadFromDevice {
+ position: relative;
+ }
+
+ #uploadFromDeviceImage {
+ position: absolute;
+ top: 0;
+ width: 100%;
+ }
+
+ #uploadFromDeviceImage .label {
+ text-align: center;
+ }
+
+ #uploadIcon {
+ -webkit-mask-image: url(icons/upload.svg);
+ -webkit-mask-repeat: no-repeat;
+ -webkit-mask-size: 100%;
+ background-color: var(--google-grey-refresh-700);
+ height: 32px;
+ margin: 61px auto 8px;
+ width: 32px;
+ }
+
+ #backgroundsDisabled {
+ align-items: center;
+ align-self: center;
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ }
+
+ #backgroundsDisabledIcon {
+ -webkit-mask-image: url(chrome://resources/images/business.svg);
+ -webkit-mask-repeat: no-repeat;
+ -webkit-mask-size: 100%;
+ background-color: var(--ntp-primary-text-color);
+ height: 48px;
+ margin: auto;
+ width: 48px;
+ }
+
+ #backgroundsDisabledTitle {
+ margin-top: 10px;
+ text-align: center;
+ width: 50%;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ .selected .image,
+ .selected #uploadFromDevice {
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .3),
+ 0 4px 8px 3px rgba(0, 0, 0, .15);
+ }
+
+ #uploadIcon {
+ background-color: var(--google-grey-refresh-500);
+ }
+ }
</style>
-<ntp-grid id="collections" columns="3" hidden="[[selectedCollection]]">
+<div id="backgroundsDisabled" hidden$="[[!customBackgroundDisabledByPolicy_]]">
+ <div id="backgroundsDisabledIcon"></div>
+ <div id="backgroundsDisabledTitle">$i18n{customBackgroundDisabled}</div>
+</div>
+<ntp-grid id="collections" columns="3" hidden="[[!showBackgroundSelection_]]">
+ <div id="uploadFromDevice" class="tile" role="button"
+ on-click="onUploadFromDeviceClick_" tabindex="0">
+ <div class$="[[getCustomBackgroundClass_(theme, backgroundSelection)]]">
+ <div class="image">
+ </div>
+ <div id="uploadFromDeviceImage">
+ <div id="uploadIcon"></div>
+ <div class="label">$i18n{uploadFromDevice}</div>
+ </div>
+ <div class="selected-circle"></div>
+ <div class="selected-check"></div>
+ </div>
+ <div class="label"></div>
+ </div>
+ <div id="noBackground" class="tile" role="button" on-click="onDefaultClick_"
+ tabindex="0">
+ <div class$="[[getNoBackgroundClass_(theme, backgroundSelection)]]">
+ <div class="image">
+ <ntp-mini-page></ntp-mini-page>
+ </div>
+ <div class="selected-circle"></div>
+ <div class="selected-check"></div>
+ </div>
+ <div class="label">$i18n{noBackground}</div>
+ </div>
<dom-repeat id="collectionsRepeat" items="[[collections_]]">
<template>
<div class="tile" tabindex="0" title="[[item.label]]" role="button"
- on-click="onCollectionClick_">
+ on-click="onCollectionClick_">
<ntp-untrusted-iframe class="image"
- path="image?[[item.previewImageUrl.url]]">
+ path="background_image?[[item.previewImageUrl.url]]">
</ntp-untrusted-iframe>
<div class="label">[[item.label]]</div>
</div>
@@ -48,12 +206,18 @@
</dom-repeat>
</ntp-grid>
<ntp-grid id="images" columns="3" hidden="[[!selectedCollection]]">
- <dom-repeat items="[[images_]]">
+ <dom-repeat id="imagesRepeat" items="[[images_]]">
<template>
- <div class="tile" tabindex="0" title="[[item.label]]" role="button">
+ <div
+ class$="tile
+ [[getImageSelectedClass_(index, theme, backgroundSelection)]]"
+ tabindex="0" title="[[item.attribution1]]" role="button"
+ on-click="onImageClick_">
<ntp-untrusted-iframe class="image"
- path="image?[[item.previewImageUrl.url]]">
+ path="background_image?[[item.previewImageUrl.url]]">
</ntp-untrusted-iframe>
+ <div class="selected-circle"></div>
+ <div class="selected-check"></div>
</div>
</template>
</dom-repeat>
diff --git a/chromium/chrome/browser/resources/new_tab_page/customize_backgrounds.js b/chromium/chrome/browser/resources/new_tab_page/customize_backgrounds.js
index 6779355f321..75ccde66924 100644
--- a/chromium/chrome/browser/resources/new_tab_page/customize_backgrounds.js
+++ b/chromium/chrome/browser/resources/new_tab_page/customize_backgrounds.js
@@ -2,11 +2,16 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+import 'chrome://resources/cr_elements/hidden_style_css.m.js';
import './grid.js';
+import './mini_page.js';
import './untrusted_iframe.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
import {BrowserProxy} from './browser_proxy.js';
+import {BackgroundSelection, BackgroundSelectionType} from './customize_dialog.js';
/** Element that lets the user configure the background. */
class CustomizeBackgroundsElement extends PolymerElement {
@@ -20,6 +25,26 @@ class CustomizeBackgroundsElement extends PolymerElement {
static get properties() {
return {
+ /** @type {!BackgroundSelection} */
+ backgroundSelection: {
+ type: Object,
+ value: () => ({type: BackgroundSelectionType.NO_SELECTION}),
+ notify: true,
+ },
+
+ /** @private */
+ customBackgroundDisabledByPolicy_: {
+ type: Boolean,
+ value: () =>
+ loadTimeData.getBoolean('customBackgroundDisabledByPolicy'),
+ },
+
+ /** @private */
+ showBackgroundSelection_: {
+ type: Boolean,
+ computed: 'computeShowBackgroundSelection_(selectedCollection)',
+ },
+
/** @private {newTabPage.mojom.BackgroundCollection} */
selectedCollection: {
notify: true,
@@ -28,20 +53,97 @@ class CustomizeBackgroundsElement extends PolymerElement {
value: null,
},
+ /** @type {!newTabPage.mojom.Theme} */
+ theme: Object,
+
/** @private {!Array<!newTabPage.mojom.BackgroundCollection>} */
collections_: Array,
- /** @private {!Array<!newTabPage.mojom.BackgroundImage>} */
+ /** @private {!Array<!newTabPage.mojom.CollectionImage>} */
images_: Array,
};
}
constructor() {
super();
- BrowserProxy.getInstance().handler.getBackgroundCollections().then(
- ({collections}) => {
- this.collections_ = collections;
- });
+ if (this.customBackgroundDisabledByPolicy_) {
+ return;
+ }
+ /** @private {newTabPage.mojom.PageHandlerRemote} */
+ this.pageHandler_ = BrowserProxy.getInstance().handler;
+ this.pageHandler_.getBackgroundCollections().then(({collections}) => {
+ this.collections_ = collections;
+ });
+ }
+
+ /**
+ * @return {boolean}
+ * @private
+ */
+ computeShowBackgroundSelection_() {
+ return !this.customBackgroundDisabledByPolicy_ && !this.selectedCollection;
+ }
+
+ /**
+ * @return {string}
+ * @private
+ */
+ getCustomBackgroundClass_() {
+ switch (this.backgroundSelection.type) {
+ case BackgroundSelectionType.NO_SELECTION:
+ return this.theme && this.theme.backgroundImage &&
+ this.theme.backgroundImage.url.url.startsWith(
+ 'chrome-untrusted://new-tab-page/background.jpg') ?
+ 'selected' :
+ '';
+ default:
+ return '';
+ }
+ }
+
+ /**
+ * @return {string}
+ * @private
+ */
+ getNoBackgroundClass_() {
+ switch (this.backgroundSelection.type) {
+ case BackgroundSelectionType.NO_BACKGROUND:
+ return 'selected';
+ case BackgroundSelectionType.NO_SELECTION:
+ return this.theme && !this.theme.backgroundImage &&
+ !this.theme.dailyRefreshCollectionId ?
+ 'selected' :
+ '';
+ case BackgroundSelectionType.IMAGE:
+ case BackgroundSelectionType.DAILY_REFRESH:
+ default:
+ return '';
+ }
+ }
+
+ /**
+ * @param {number} index
+ * @return {string}
+ * @private
+ */
+ getImageSelectedClass_(index) {
+ const {url} = this.images_[index].imageUrl;
+ switch (this.backgroundSelection.type) {
+ case BackgroundSelectionType.IMAGE:
+ return this.backgroundSelection.image.imageUrl.url === url ?
+ 'selected' :
+ '';
+ case BackgroundSelectionType.NO_SELECTION:
+ return this.theme && this.theme.backgroundImage &&
+ this.theme.backgroundImage.url.url === url &&
+ !this.theme.dailyRefreshCollectionId ?
+ 'selected' :
+ '';
+ case BackgroundSelectionType.NO_BACKGROUND:
+ case BackgroundSelectionType.DAILY_REFRESH:
+ default:
+ return '';
+ }
}
/**
@@ -50,6 +152,49 @@ class CustomizeBackgroundsElement extends PolymerElement {
*/
onCollectionClick_(e) {
this.selectedCollection = this.$.collectionsRepeat.itemForElement(e.target);
+ this.pageHandler_.onCustomizeDialogAction(
+ newTabPage.mojom.CustomizeDialogAction.BACKGROUNDS_COLLECTION_OPENED);
+ }
+
+ /** @private */
+ async onUploadFromDeviceClick_() {
+ this.pageHandler_.onCustomizeDialogAction(
+ newTabPage.mojom.CustomizeDialogAction
+ .BACKGROUNDS_UPLOAD_FROM_DEVICE_CLICKED);
+ const {success} = await this.pageHandler_.chooseLocalCustomBackground();
+ if (success) {
+ // The theme update is asynchronous. Close the dialog and allow ntp-app
+ // to update the |backgroundSelection|.
+ this.dispatchEvent(new Event('close', {bubbles: true, composed: true}));
+ }
+ }
+
+ /** @private */
+ onDefaultClick_() {
+ if (this.backgroundSelection.type !==
+ BackgroundSelectionType.NO_BACKGROUND) {
+ this.pageHandler_.onCustomizeDialogAction(
+ newTabPage.mojom.CustomizeDialogAction
+ .BACKGROUNDS_NO_BACKGROUND_SELECTED);
+ }
+ this.backgroundSelection = {type: BackgroundSelectionType.NO_BACKGROUND};
+ }
+
+ /**
+ * @param {!Event} e
+ * @private
+ */
+ onImageClick_(e) {
+ const image = this.$.imagesRepeat.itemForElement(e.target);
+ if (this.backgroundSelection.type !== BackgroundSelectionType.IMAGE ||
+ this.backgroundSelection.image !== image) {
+ this.pageHandler_.onCustomizeDialogAction(
+ newTabPage.mojom.CustomizeDialogAction.BACKGROUNDS_IMAGE_SELECTED);
+ }
+ this.backgroundSelection = {
+ type: BackgroundSelectionType.IMAGE,
+ image: image,
+ };
}
/** @private */
@@ -59,9 +204,7 @@ class CustomizeBackgroundsElement extends PolymerElement {
return;
}
const collectionId = this.selectedCollection.id;
- const {images} =
- await BrowserProxy.getInstance().handler.getBackgroundImages(
- collectionId);
+ const {images} = await this.pageHandler_.getBackgroundImages(collectionId);
// We check the IDs match since the user may have already moved to a
// different collection before the results come back.
if (!this.selectedCollection ||
diff --git a/chromium/chrome/browser/resources/new_tab_page/customize_dialog.html b/chromium/chrome/browser/resources/new_tab_page/customize_dialog.html
index 218fbacfab8..481090004be 100644
--- a/chromium/chrome/browser/resources/new_tab_page/customize_dialog.html
+++ b/chromium/chrome/browser/resources/new_tab_page/customize_dialog.html
@@ -1,4 +1,4 @@
-<style include="cr-icons">
+<style include="cr-hidden-style cr-icons">
::part(dialog) {
min-width: 800px;
}
@@ -12,21 +12,31 @@
color: var(--ntp-primary-text-color);
display: flex;
flex-direction: row;
- height: 80px;
+ height: 58px;
padding: 0;
}
div[slot=body] {
color: var(--cr-primary-text-color);
display: flex;
- flex-direction: row;
+ flex-direction: column;
overflow: hidden;
padding: 0;
}
+ #bodyContainer {
+ display: flex;
+ flex-direction: row;
+ overflow: hidden;
+ }
+
+ div[slot=button-container] {
+ padding-top: 16px;
+ }
+
#menuContainer,
#pagesContainer {
- max-height: 391px;
+ max-height: 395px;
overflow: hidden;
}
@@ -35,27 +45,41 @@
flex-basis: 232px;
}
+ #title {
+ line-height: 1.5;
+ margin-bottom: -2px;
+ padding-inline-end: 24px;
+ user-select: none;
+ }
+
#title,
#pagesContainer {
flex-grow: 1;
}
- #menu,
- #pages {
+ #menu {
height: calc(100% - 2 * var(--border-width));
overflow: auto;
}
+ #pages {
+ height: 100%;
+ overflow: auto;
+ }
+
#pages > iron-pages {
+ /* Margin is for focus outline. */
+ margin: 2px;
min-height: 389px;
}
div[scroll-border] {
- border-bottom: var(--border-width) solid var(--ntp-border-color);
+ border-bottom: var(--border-width) solid transparent;
}
- div[scroll-border]:not([show]) {
- --ntp-border-color: transparent;
+ div[scroll-border][show-1],
+ div[scroll-border][show-2] {
+ border-bottom-color: var(--ntp-border-color);
}
#menu {
@@ -128,8 +152,22 @@
/* So that the arrow aligns with the grid. */
margin-inline-start: -12px;
}
+
+ #titleNavigation {
+ align-items: center;
+ display: flex;
+ flex-direction: row;
+ }
+
+ cr-toggle {
+ margin-inline-end: 12px;
+ }
+
+ #collectionTitle {
+ flex-grow: 1;
+ }
</style>
-<cr-dialog id="dialog" show-on-attach>
+<cr-dialog id="dialog" on-cancel="onCancel_" show-on-attach>
<div slot="title">
<div id="leftTitleSpacer"></div>
<div id="title">
@@ -140,44 +178,54 @@
<cr-icon-button id="backButton" class="icon-arrow-back"
on-click="onBackClick_" title="$i18n{backButton}">
</cr-icon-button>
- [[selectedCollection_.label]]
+ <div id="collectionTitle">[[selectedCollection_.label]]</div>
+ <cr-toggle id="refreshToggle" checked="[[isRefreshToggleChecked_]]"
+ on-change="onBackgroundDailyRefreshToggleChange_">
+ </cr-toggle>
+ $i18n{refreshDaily}
</div>
</div>
</div>
<div slot="body">
- <div id="menuContainer">
- <div id="menu">
- <iron-selector selected-attribute="selected"
- attr-for-selected="page-name" selected="{{selectedPage_}}"
- on-keydown="onMenuItemKeyDown_">
- <div class="menu-item" page-name="backgrounds" tabindex="0">
- <div id="backgroundsIcon" class="menu-item-icon"></div>
- $i18n{backgroundsMenuItem}
- </div>
- <div class="menu-item" page-name="shortcuts" tabindex="0">
- <div id="shortcutsIcon" class="menu-item-icon"></div>
- $i18n{shortcutsMenuItem}
- </div>
- <div class="menu-item" page-name="themes" tabindex="0">
- <div id="themesIcon" class="menu-item-icon"></div>
- $i18n{themesMenuItem}
- </div>
- </iron-selector>
+ <div id="topPageScrollBorder" scroll-border></div>
+ <div id="bodyContainer">
+ <div id="menuContainer">
+ <div id="menu">
+ <iron-selector selected-attribute="selected"
+ attr-for-selected="page-name" selected="{{selectedPage_}}"
+ on-keydown="onMenuItemKeyDown_">
+ <div class="menu-item" page-name="backgrounds" tabindex="0">
+ <div id="backgroundsIcon" class="menu-item-icon"></div>
+ $i18n{backgroundsMenuItem}
+ </div>
+ <div class="menu-item" page-name="shortcuts" tabindex="0">
+ <div id="shortcutsIcon" class="menu-item-icon"></div>
+ $i18n{shortcutsMenuItem}
+ </div>
+ <div class="menu-item" page-name="themes" tabindex="0">
+ <div id="themesIcon" class="menu-item-icon"></div>
+ $i18n{themesMenuItem}
+ </div>
+ </iron-selector>
+ </div>
</div>
- </div>
- <div id="pagesContainer">
- <div id="pages">
- <iron-pages selected="[[selectedPage_]]" attr-for-selected="page-name">
- <ntp-customize-backgrounds id="backgrounds" page-name="backgrounds"
- selected-collection="{{selectedCollection_}}">
- </ntp-customize-backgrounds>
- <ntp-customize-shortcuts page-name="shortcuts">
- </ntp-customize-shortcuts>
- <ntp-customize-themes page-name="themes" theme="[[theme]]">
- </ntp-customize-themes>
- </iron-pages>
+ <div id="pagesContainer">
+ <div id="pages">
+ <iron-pages selected="[[selectedPage_]]"
+ attr-for-selected="page-name">
+ <ntp-customize-backgrounds id="backgrounds" page-name="backgrounds"
+ selected-collection="{{selectedCollection_}}" theme="[[theme]]"
+ background-selection="{{backgroundSelection}}">
+ </ntp-customize-backgrounds>
+ <ntp-customize-shortcuts page-name="shortcuts">
+ </ntp-customize-shortcuts>
+ <ntp-customize-themes page-name="themes" theme="[[theme]]">
+ </ntp-customize-themes>
+ </iron-pages>
+ </div>
</div>
</div>
+ <div id="bottomPageScrollBorder" scroll-border></div>
</div>
<div slot="button-container">
<cr-button class="cancel-button" on-click="onCancelClick_">
diff --git a/chromium/chrome/browser/resources/new_tab_page/customize_dialog.js b/chromium/chrome/browser/resources/new_tab_page/customize_dialog.js
index 64d1dc6b590..8429868e232 100644
--- a/chromium/chrome/browser/resources/new_tab_page/customize_dialog.js
+++ b/chromium/chrome/browser/resources/new_tab_page/customize_dialog.js
@@ -4,17 +4,40 @@
import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
+import 'chrome://resources/cr_elements/cr_toggle/cr_toggle.m.js';
+import 'chrome://resources/cr_elements/hidden_style_css.m.js';
import 'chrome://resources/polymer/v3_0/iron-pages/iron-pages.js';
import 'chrome://resources/polymer/v3_0/iron-selector/iron-selector.js';
import './customize_backgrounds.js';
import './customize_shortcuts.js';
import './customize_themes.js';
+import {assert} from 'chrome://resources/js/assert.m.js';
import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {BrowserProxy} from './browser_proxy.js';
import {createScrollBorders} from './utils.js';
+/** @enum {number} */
+export const BackgroundSelectionType = {
+ NO_SELECTION: 0,
+ NO_BACKGROUND: 1,
+ IMAGE: 2,
+ DAILY_REFRESH: 3,
+};
+
+/**
+ * A user can make three types of background selections: no background, image
+ * or daily refresh for a selected collection. The selection is tracked an
+ * object of this type.
+ * @typedef {{
+ * type: !BackgroundSelectionType,
+ * image: (!newTabPage.mojom.CollectionImage|undefined),
+ * dailyRefreshCollectionId: (string|undefined),
+ * }}
+ */
+export let BackgroundSelection;
+
/**
* Dialog that lets the user customize the NTP such as the background color or
* image.
@@ -30,6 +53,17 @@ class CustomizeDialogElement extends PolymerElement {
static get properties() {
return {
+ /**
+ * This is the background selection which is two-way bound to ntp-app for
+ * previewing the background and ntp-customize-background which makes the
+ * image and no background selections.
+ * @type {!BackgroundSelection}
+ */
+ backgroundSelection: {
+ type: Object,
+ notify: true,
+ },
+
/** @type {!newTabPage.mojom.Theme} */
theme: Object,
@@ -50,6 +84,13 @@ class CustomizeDialogElement extends PolymerElement {
'computeShowTitleNavigation_(selectedPage_, selectedCollection_)',
value: false,
},
+
+ /** @private */
+ isRefreshToggleChecked_: {
+ type: Boolean,
+ computed: `computeIsRefreshToggleChecked_(theme, selectedCollection_,
+ backgroundSelection)`,
+ },
};
}
@@ -59,6 +100,7 @@ class CustomizeDialogElement extends PolymerElement {
this.pageHandler_ = BrowserProxy.getInstance().handler;
/** @private {!Array<!IntersectionObserver>} */
this.intersectionObservers_ = [];
+ this.backgroundSelection = {type: BackgroundSelectionType.NO_SELECTION};
}
/** @override */
@@ -74,21 +116,59 @@ class CustomizeDialogElement extends PolymerElement {
ready() {
super.ready();
this.intersectionObservers_ = [
- this.$.menu,
- this.$.pages,
- ].map(createScrollBorders);
+ createScrollBorders(
+ this.$.menu, this.$.topPageScrollBorder,
+ this.$.bottomPageScrollBorder, 'show-1'),
+ createScrollBorders(
+ this.$.pages, this.$.topPageScrollBorder,
+ this.$.bottomPageScrollBorder, 'show-2'),
+ ];
+ this.pageHandler_.onCustomizeDialogAction(
+ newTabPage.mojom.CustomizeDialogAction.OPEN_CLICKED);
}
/** @private */
- onCancelClick_() {
+ onCancel_() {
this.pageHandler_.revertThemeChanges();
- this.$.dialog.cancel();
+ this.backgroundSelection = {type: BackgroundSelectionType.NO_SELECTION};
}
/** @private */
+ onCancelClick_() {
+ this.pageHandler_.onCustomizeDialogAction(
+ newTabPage.mojom.CustomizeDialogAction.CANCEL_CLICKED);
+ this.$.dialog.cancel();
+ }
+
+ /**
+ * The |backgroundSelection| is used in ntp-app to preview the image and has
+ * precedence over the theme background setting. |backgroundSelection| is not
+ * reset because it takes time for the theme to update, and after the update
+ * the theme and |backgroundSelection| are the same. By not resetting the
+ * value here, ntp-app can reset it if needed (other theme update). This
+ * prevents a flicker between |backgroundSelection| and the previous theme
+ * background setting.
+ * @private
+ */
onDoneClick_() {
this.pageHandler_.confirmThemeChanges();
this.shadowRoot.querySelector('ntp-customize-shortcuts').apply();
+ switch (this.backgroundSelection.type) {
+ case BackgroundSelectionType.NO_BACKGROUND:
+ this.pageHandler_.setNoBackgroundImage();
+ break;
+ case BackgroundSelectionType.IMAGE:
+ const {attribution1, attribution2, attributionUrl, imageUrl} =
+ assert(this.backgroundSelection.image);
+ this.pageHandler_.setBackgroundImage(
+ attribution1, attribution2, attributionUrl, imageUrl);
+ break;
+ case BackgroundSelectionType.DAILY_REFRESH:
+ this.pageHandler_.setDailyRefreshCollectionId(
+ assert(this.backgroundSelection.dailyRefreshCollectionId));
+ }
+ this.pageHandler_.onCustomizeDialogAction(
+ newTabPage.mojom.CustomizeDialogAction.DONE_CLICKED);
this.$.dialog.close();
}
@@ -110,14 +190,53 @@ class CustomizeDialogElement extends PolymerElement {
this.$.pages.scrollTop = 0;
}
- /** @private */
+ /**
+ * @return {boolean}
+ * @private
+ */
+ computeIsRefreshToggleChecked_() {
+ if (!this.selectedCollection_) {
+ return false;
+ }
+ switch (this.backgroundSelection.type) {
+ case BackgroundSelectionType.NO_SELECTION:
+ return !!this.theme &&
+ this.selectedCollection_.id === this.theme.dailyRefreshCollectionId;
+ case BackgroundSelectionType.DAILY_REFRESH:
+ return this.selectedCollection_.id ===
+ this.backgroundSelection.dailyRefreshCollectionId;
+ }
+ return false;
+ }
+
+ /**
+ * @return {boolean}
+ * @private
+ */
computeShowTitleNavigation_() {
- return this.selectedPage_ === 'backgrounds' && this.selectedCollection_;
+ return this.selectedPage_ === 'backgrounds' && !!this.selectedCollection_;
}
/** @private */
onBackClick_() {
this.selectedCollection_ = null;
+ this.pageHandler_.onCustomizeDialogAction(
+ newTabPage.mojom.CustomizeDialogAction.BACKGROUNDS_BACK_CLICKED);
+ }
+
+ /** @private */
+ onBackgroundDailyRefreshToggleChange_() {
+ if (this.$.refreshToggle.checked) {
+ this.backgroundSelection = {
+ type: BackgroundSelectionType.DAILY_REFRESH,
+ dailyRefreshCollectionId: this.selectedCollection_.id,
+ };
+ } else {
+ this.backgroundSelection = {type: BackgroundSelectionType.NO_BACKGROUND};
+ }
+ this.pageHandler_.onCustomizeDialogAction(
+ newTabPage.mojom.CustomizeDialogAction
+ .BACKGROUNDS_REFRESH_TOGGLE_CLICKED);
}
}
diff --git a/chromium/chrome/browser/resources/new_tab_page/customize_shortcuts.html b/chromium/chrome/browser/resources/new_tab_page/customize_shortcuts.html
index 7689938f87a..1c414c9b89d 100644
--- a/chromium/chrome/browser/resources/new_tab_page/customize_shortcuts.html
+++ b/chromium/chrome/browser/resources/new_tab_page/customize_shortcuts.html
@@ -18,11 +18,14 @@
box-sizing: border-box;
cursor: pointer;
height: 176px;
- outline: none;
position: relative;
width: 268px;
}
+ :host-context(.focus-outline-visible) .option-image:focus {
+ box-shadow: var(--ntp-focus-shadow);
+ }
+
.selected .option-image {
background-color: var(--ntp-selected-background-color);
border-color: var(--ntp-selected-border-color);
@@ -59,11 +62,11 @@
}
ntp-mini-page {
- --mini-page-shortcut-color: var(--google-grey-refresh-500);
+ --ntp-mini-page-shortcut-color: var(--google-grey-refresh-500);
}
.selected ntp-mini-page {
- --mini-page-shortcut-color: var(--ntp-selected-border-color);
+ --ntp-mini-page-shortcut-color: var(--ntp-selected-border-color);
}
.option-icon {
@@ -230,35 +233,34 @@
<div id="options">
<div id="optionCustomLinks"
class$="option [[getCustomLinksSelected_(customLinksEnabled_, hide_)]]">
- <div id="optionCustomLinksButton" class="option-image" tabindex="0"
- role="button"
+ <cr-button id="optionCustomLinksButton" class="option-image" tabindex="0"
aria-pressed$="[[getCustomLinksAriaPressed_(customLinksEnabled_,
hide_)]]"
- title="$i18n{myShortcuts}" on-click="onCustomLinksClick_">
+ title="$i18n{myShortcuts}" on-click="onCustomLinksClick_" noink>
<div class="option-icon"></div>
<div class="option-mini">
- <ntp-mini-page></ntp-mini-page>
+ <ntp-mini-page single-colored-logo></ntp-mini-page>
</div>
<div class="selected-circle"></div>
<div class="selected-check"></div>
- </div>
+ </cr-button>
<div class="option-title">$i18n{myShortcuts}</div>
$i18n{shortcutsCurated}
</div>
<div id="optionMostVisited"
class$="option [[getMostVisitedSelected_(customLinksEnabled_, hide_)]]">
- <div id="optionMostVisitedButton" class="option-image" tabindex="0"
- role="button"
+ <cr-button id="optionMostVisitedButton" class="option-image" tabindex="0"
aria-pressed$="[[getMostVisitedAriaPressed_(customLinksEnabled_,
hide_)]]"
- title="$i18n{mostVisited}" on-click="onMostVisitedClick_">
+ title="$i18n{mostVisited}" on-click="onMostVisitedClick_"
+ on-keydown="onMostVistedKey" noink>
<div class="option-icon"></div>
<div class="option-mini">
- <ntp-mini-page></ntp-mini-page>
+ <ntp-mini-page single-colored-logo></ntp-mini-page>
</div>
<div class="selected-circle"></div>
<div class="selected-check"></div>
- </div>
+ </cr-button>
<div class="option-title">$i18n{mostVisited}</div>
$i18n{shortcutsSuggested}
</div>
diff --git a/chromium/chrome/browser/resources/new_tab_page/customize_shortcuts.js b/chromium/chrome/browser/resources/new_tab_page/customize_shortcuts.js
index 6aef1a199f1..f442964666d 100644
--- a/chromium/chrome/browser/resources/new_tab_page/customize_shortcuts.js
+++ b/chromium/chrome/browser/resources/new_tab_page/customize_shortcuts.js
@@ -5,8 +5,10 @@
import './mini_page.js';
import 'chrome://resources/cr_elements/cr_icons_css.m.js';
import 'chrome://resources/cr_elements/cr_toggle/cr_toggle.m.js';
+import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
import {assert} from 'chrome://resources/js/assert.m.js';
+import {FocusOutlineManager} from 'chrome://resources/js/cr/ui/focus_outline_manager.m.js';
import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {BrowserProxy} from './browser_proxy.js';
@@ -51,6 +53,7 @@ class CustomizeShortcutsElement extends PolymerElement {
this.hide_ = !info.visible;
});
this.pageHandler_.updateMostVisitedInfo();
+ FocusOutlineManager.forDocument(document);
}
/** @override */
@@ -107,6 +110,11 @@ class CustomizeShortcutsElement extends PolymerElement {
/** @private */
onCustomLinksClick_() {
+ if (!this.customLinksEnabled_) {
+ this.pageHandler_.onCustomizeDialogAction(
+ newTabPage.mojom.CustomizeDialogAction
+ .SHORTCUTS_CUSTOM_LINKS_CLICKED);
+ }
this.customLinksEnabled_ = true;
this.hide_ = false;
}
@@ -116,12 +124,20 @@ class CustomizeShortcutsElement extends PolymerElement {
* @private
*/
onHideChange_(e) {
+ this.pageHandler_.onCustomizeDialogAction(
+ newTabPage.mojom.CustomizeDialogAction
+ .SHORTCUTS_VISIBILITY_TOGGLE_CLICKED);
this.hide_ = e.detail;
}
/** @private */
onMostVisitedClick_() {
+ if (this.customLinksEnabled_) {
+ this.pageHandler_.onCustomizeDialogAction(
+ newTabPage.mojom.CustomizeDialogAction
+ .SHORTCUTS_MOST_VISITED_CLICKED);
+ }
this.customLinksEnabled_ = false;
this.hide_ = false;
}
diff --git a/chromium/chrome/browser/resources/new_tab_page/customize_themes.html b/chromium/chrome/browser/resources/new_tab_page/customize_themes.html
index bd90bd9f961..a0920f697b6 100644
--- a/chromium/chrome/browser/resources/new_tab_page/customize_themes.html
+++ b/chromium/chrome/browser/resources/new_tab_page/customize_themes.html
@@ -1,5 +1,6 @@
-<style>
+<style include="cr-hidden-style cr-icons">
#thirdPartyThemeContainer {
+ max-width: 544px;
width: 100%;
}
@@ -34,13 +35,8 @@
}
#thirdPartyLink {
- -webkit-mask-image: url(chrome://resources/images/open_in_new.svg);
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-size: 100%;
- background-color: var(--ntp-primary-text-color);
- height: 20px;
+ --cr-icon-button-fill-color: var(--ntp-primary-text-color);
margin-inline-end: 24px;
- width: 20px;
}
#uninstallThirdPartyButton {
@@ -107,9 +103,9 @@
$i18n{thirdPartyThemeDescription}
</div>
</div>
- <a id="thirdPartyLink" target="_blank"
- href$="[[getThirdPartyLink_(theme.info.thirdPartyThemeInfo.id)]]">
- </a>
+ <cr-icon-button id="thirdPartyLink" class="icon-external" role="link"
+ on-click="onThirdPartyLinkButtonClick_">
+ </cr-icon-button>
<cr-button id="uninstallThirdPartyButton"
on-click="onUninstallThirdPartyThemeClick_">
$i18n{uninstallThirdPartyThemeButton}
@@ -135,9 +131,9 @@
<template>
<ntp-theme-icon title="[[item.label]]" on-click="onChromeThemeClick_"
style="--ntp-theme-icon-frame-color:
- [[skColorToRgb_(item.colors.frame)]];
+ [[skColorToRgba_(item.colors.frame)]];
--ntp-theme-icon-active-tab-color:
- [[skColorToRgb_(item.colors.activeTab)]];"
+ [[skColorToRgba_(item.colors.activeTab)]];"
tabindex="0"
selected$="[[isThemeIconSelected_(item.id, theme)]]">
</ntp-theme-icon>
diff --git a/chromium/chrome/browser/resources/new_tab_page/customize_themes.js b/chromium/chrome/browser/resources/new_tab_page/customize_themes.js
index 1fab40bd1d2..a6987bdedba 100644
--- a/chromium/chrome/browser/resources/new_tab_page/customize_themes.js
+++ b/chromium/chrome/browser/resources/new_tab_page/customize_themes.js
@@ -3,13 +3,14 @@
// found in the LICENSE file.
import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
+import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
import './grid.js';
import './theme_icon.js';
import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {BrowserProxy} from './browser_proxy.js';
-import {hexColorToSkColor, skColorToRgb} from './utils.js';
+import {hexColorToSkColor, skColorToRgba} from './utils.js';
/** Element that lets the user configure the theme. */
class CustomizeThemesElement extends PolymerElement {
@@ -76,18 +77,18 @@ class CustomizeThemesElement extends PolymerElement {
if (this.theme.type !== newTabPage.mojom.ThemeType.AUTOGENERATED) {
return;
}
- const rgbFrameColor =
- skColorToRgb(this.theme.info.autogeneratedThemeColors.frame);
- const rgbActiveTabColor =
- skColorToRgb(this.theme.info.autogeneratedThemeColors.activeTab);
+ const rgbaFrameColor =
+ skColorToRgba(this.theme.info.autogeneratedThemeColors.frame);
+ const rgbaActiveTabColor =
+ skColorToRgba(this.theme.info.autogeneratedThemeColors.activeTab);
this.$.autogeneratedTheme.style.setProperty(
- '--ntp-theme-icon-frame-color', rgbFrameColor);
+ '--ntp-theme-icon-frame-color', rgbaFrameColor);
this.$.autogeneratedTheme.style.setProperty(
- '--ntp-theme-icon-stroke-color', rgbFrameColor);
+ '--ntp-theme-icon-stroke-color', rgbaFrameColor);
this.$.autogeneratedTheme.style.setProperty(
- '--ntp-theme-icon-active-tab-color', rgbActiveTabColor);
+ '--ntp-theme-icon-active-tab-color', rgbaActiveTabColor);
this.$.colorPickerIcon.style.setProperty(
- 'background-color', skColorToRgb(this.theme.shortcutTextColor));
+ 'background-color', skColorToRgba(this.theme.shortcutTextColor));
}
/**
@@ -126,16 +127,11 @@ class CustomizeThemesElement extends PolymerElement {
return this.theme.type === newTabPage.mojom.ThemeType.THIRD_PARTY;
}
- /**
- * @return {string}
- * @private
- */
- getThirdPartyLink_() {
- if (!this.isThirdPartyTheme_()) {
- return '';
- }
- return 'https://chrome.google.com/webstore/detail/' +
- this.theme.info.thirdPartyThemeInfo.id;
+ /** @private */
+ onThirdPartyLinkButtonClick_() {
+ BrowserProxy.getInstance().open(
+ `https://chrome.google.com/webstore/detail/${
+ this.theme.info.thirdPartyThemeInfo.id}`);
}
/**
@@ -143,8 +139,8 @@ class CustomizeThemesElement extends PolymerElement {
* @return {string}
* @private
*/
- skColorToRgb_(skColor) {
- return skColorToRgb(skColor);
+ skColorToRgba_(skColor) {
+ return skColorToRgba(skColor);
}
}
diff --git a/chromium/chrome/browser/resources/new_tab_page/doodle_share_dialog.html b/chromium/chrome/browser/resources/new_tab_page/doodle_share_dialog.html
new file mode 100644
index 00000000000..c41b624700a
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/doodle_share_dialog.html
@@ -0,0 +1,81 @@
+<style>
+ #dialog::part(dialog) {
+ max-width: 300px;
+ }
+
+ #buttons {
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ margin-bottom: 28px;
+ margin-top: 20px;
+ }
+
+ #buttons cr-button {
+ background-position: center;
+ background-repeat: no-repeat;
+ background-size: cover;
+ border: none;
+ height: 48px;
+ min-width: 48px;
+ width: 48px;
+ }
+
+ #buttons cr-button:hover {
+ opacity: 0.8;
+ }
+
+ #buttons > :not(:last-child) {
+ margin-inline-end: 12px;
+ }
+
+ #facebookButton {
+ background-image: url(icons/facebook.svg);
+ }
+
+ #twitterButton {
+ background-image: url(icons/twitter.svg);
+ }
+
+ #emailButton {
+ background-image: url(icons/mail.svg);
+ }
+
+ #url {
+ --cr-input-error-display: none;
+ }
+
+ #copyButton {
+ --cr-icon-image: url(icons/copy.svg);
+ margin-inline-start: 2px;
+ }
+</style>
+<cr-dialog id="dialog" show-on-attach>
+ <div id="title" slot="title">
+ [[title]]
+ </div>
+ <div slot="body">
+ <div id="buttons">
+ <cr-button id="facebookButton" title="$i18n{facebook}"
+ on-click="onFacebookClick_">
+ </cr-button>
+ <cr-button id="twitterButton" title="$i18n{twitter}"
+ on-click="onTwitterClick_">
+ </cr-button>
+ <cr-button id="emailButton" title="$i18n{email}"
+ on-click="onEmailClick_">
+ </cr-button>
+ </div>
+ <cr-input readonly label="$i18n{doodleLink}" id="url"
+ value="[[url.url]]">
+ <cr-icon-button id="copyButton" slot="suffix" title="$i18n{copyLink}"
+ on-click="onCopyClick_">
+ </cr-icon-button>
+ </cr-input>
+ </div>
+ <div slot="button-container">
+ <cr-button id="doneButton" class="action-button" on-click="onCloseClick_">
+ $i18n{doneButton}
+ </cr-button>
+ </div>
+</cr-dialog>
diff --git a/chromium/chrome/browser/resources/new_tab_page/doodle_share_dialog.js b/chromium/chrome/browser/resources/new_tab_page/doodle_share_dialog.js
new file mode 100644
index 00000000000..e59bc37d06a
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/doodle_share_dialog.js
@@ -0,0 +1,92 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
+import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
+import 'chrome://resources/cr_elements/cr_input/cr_input.m.js';
+import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
+
+import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {BrowserProxy} from './browser_proxy.js';
+
+/**
+ * The ID of the doodle app for Facebook. Used to share doodles to Facebook.
+ * @type {number}
+ */
+const FACEBOOK_APP_ID = 738026486351791;
+
+// Dialog that lets the user share the doodle.
+class DoodleShareDialogElement extends PolymerElement {
+ static get is() {
+ return 'ntp-doodle-share-dialog';
+ }
+
+ static get template() {
+ return html`{__html_template__}`;
+ }
+
+ static get properties() {
+ return {
+ /**
+ * Title shown on the dialog.
+ * @type {string}
+ */
+ title: String,
+
+ /**
+ * Share URL provided to the user.
+ * @type {url.mojom.Url}
+ */
+ url: Object,
+ };
+ }
+
+ /** @private */
+ onFacebookClick_() {
+ const url = 'https://www.facebook.com/dialog/share' +
+ `?app_id=${FACEBOOK_APP_ID}` +
+ `&href=${encodeURIComponent(this.url.url)}` +
+ `&hashtag=${encodeURIComponent('#GoogleDoodle')}`;
+ BrowserProxy.getInstance().open(url);
+ this.notifyShare_(newTabPage.mojom.DoodleShareChannel.FACEBOOK);
+ }
+
+ /** @private */
+ onTwitterClick_() {
+ const url = 'https://twitter.com/intent/tweet' +
+ `?text=${encodeURIComponent(`${this.title}\n${this.url.url}`)}`;
+ BrowserProxy.getInstance().open(url);
+ this.notifyShare_(newTabPage.mojom.DoodleShareChannel.TWITTER);
+ }
+
+ /** @private */
+ onEmailClick_() {
+ const url = `mailto:?subject=${encodeURIComponent(this.title)}` +
+ `&body=${encodeURIComponent(this.url.url)}`;
+ BrowserProxy.getInstance().navigate(url);
+ this.notifyShare_(newTabPage.mojom.DoodleShareChannel.EMAIL);
+ }
+
+ /** @private */
+ onCopyClick_() {
+ this.$.url.select();
+ navigator.clipboard.writeText(this.url.url);
+ this.notifyShare_(newTabPage.mojom.DoodleShareChannel.LINK_COPY);
+ }
+
+ /** @private */
+ onCloseClick_() {
+ this.$.dialog.close();
+ }
+
+ /**
+ * @param {newTabPage.mojom.DoodleShareChannel} channel
+ * @private
+ */
+ notifyShare_(channel) {
+ this.dispatchEvent(new CustomEvent('share', {detail: channel}));
+ }
+}
+
+customElements.define(DoodleShareDialogElement.is, DoodleShareDialogElement);
diff --git a/chromium/chrome/browser/resources/new_tab_page/fakebox.html b/chromium/chrome/browser/resources/new_tab_page/fakebox.html
index ef01fba11c6..8603b202d88 100644
--- a/chromium/chrome/browser/resources/new_tab_page/fakebox.html
+++ b/chromium/chrome/browser/resources/new_tab_page/fakebox.html
@@ -100,19 +100,20 @@
background: url(icons/googlemic_clr_24px.svg) no-repeat center;
background-size: 21px 21px;
border: none;
+ border-radius: 2px;
cursor: pointer;
- height: 21px;
+ height: 100%;
outline: none;
padding: 0;
pointer-events: auto;
- width: 21px;
+ width: 26px;
}
:host-context(.focus-outline-visible) #voiceSearchButton:focus {
- box-shadow: 0 0 0 2px var(--ntp-focus-shadow-color);
+ box-shadow: var(--ntp-focus-shadow);
}
</style>
-<input id="input" on-mousedown="onMousedown_" on-paste="onPaste_"
+<input id="input" on-pointerdown="onPointerDown_" on-paste="onPaste_"
on-dragenter="onDragenter_" on-dragleave="onDragleave_" on-drop="onDrop_"
autocomplete="off" tabindex="-1" type="url" aria-hidden="true">
</input>
diff --git a/chromium/chrome/browser/resources/new_tab_page/fakebox.js b/chromium/chrome/browser/resources/new_tab_page/fakebox.js
index 621159904f8..802d3bbab4a 100644
--- a/chromium/chrome/browser/resources/new_tab_page/fakebox.js
+++ b/chromium/chrome/browser/resources/new_tab_page/fakebox.js
@@ -40,6 +40,7 @@ class FakeboxElement extends PolymerElement {
}
constructor() {
+ performance.mark('fakebox-creation-start');
super();
/** @private {newTabPage.mojom.PageHandlerRemote} */
this.pageHandler_ = BrowserProxy.getInstance().handler;
@@ -74,8 +75,14 @@ class FakeboxElement extends PolymerElement {
assert(this.setFakeboxVisibleListenerId_));
}
+ /** @override */
+ ready() {
+ super.ready();
+ performance.measure('fakebox-creation', 'fakebox-creation-start');
+ }
+
/** @private */
- onMousedown_() {
+ onPointerDown_() {
this.pageHandler_.focusOmnibox();
}
diff --git a/chromium/chrome/browser/resources/new_tab_page/icons/chevron.svg b/chromium/chrome/browser/resources/new_tab_page/icons/chevron.svg
new file mode 100644
index 00000000000..5a60ec24783
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/icons/chevron.svg
@@ -0,0 +1 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M12.884 16.123a1.229 1.229 0 0 1-1.768 0l-6.25-6.428a1.3 1.3 0 0 1-.366-.91c0-.709.56-1.285 1.25-1.285.345 0 .657.144.884.377L12 13.397l5.366-5.52a1.23 1.23 0 0 1 .884-.377c.69 0 1.25.576 1.25 1.286a1.3 1.3 0 0 1-.366.909l-6.25 6.428z" fill="#5F6368"/></svg> \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/new_tab_page/icons/colored_header.svg b/chromium/chrome/browser/resources/new_tab_page/icons/colored_header.svg
new file mode 100644
index 00000000000..fdd5c8268a5
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/icons/colored_header.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="130" height="40"><path d="M52.792 16.638c-1.558-.64-2.468-1.578-3.063-3.157-.258-.686-.303-1.064-.253-2.158.075-1.668.544-2.71 1.692-3.759 1.13-1.031 2.114-1.367 3.8-1.294 1.165.05 1.439.118 2.258.556 1.7.91 2.652 2.416 2.778 4.395.166 2.6-1.34 4.847-3.73 5.566-1.069.322-2.485.261-3.482-.149zM56.47 14.4c1.672-1.344 1.808-3.922.28-5.33-1.044-.963-2.202-1.121-3.47-.474-.664.339-.948.656-1.32 1.479-.6 1.32-.312 3.055.667 4.032.653.653 1.188.836 2.296.787.844-.037 1.066-.108 1.547-.494zM93.244 16.791c-1.323-.431-2.606-1.588-3.17-2.857-.444-.997-.539-3.115-.187-4.18.46-1.391 1.29-2.403 2.499-3.047.656-.35.897-.392 2.21-.392 1.75 0 2.262.211 3.365 1.39.739.79 1.547 2.312 1.328 2.502-.07.061-1.701.762-3.626 1.557-1.924.795-3.498 1.502-3.498 1.57 0 .286 1.09 1.3 1.564 1.457.645.213 1.77.21 2.344-.006.24-.09.684-.404.984-.696l.547-.531.816.541c.449.298.816.601.816.674 0 .245-1.458 1.446-2.169 1.786-.874.42-2.878.54-3.823.232zm1.315-6.424c1.257-.532 2.172-1.001 2.172-1.115 0-.348-.956-.944-1.67-1.042-.933-.128-1.865.242-2.511.997-.45.525-.827 1.486-.827 2.104 0 .266-.146.315 2.836-.944z" fill="#d93025"/><path d="M85.978 8.598V.643h2.209v15.91h-2.209z" fill="#1e8e3e"/><path d="M76.853 21.599a7.671 7.671 0 01-1.259-.713c-.645-.462-1.625-1.763-1.533-2.037.027-.083.437-.306.911-.497.823-.33.869-.334 1.007-.078.08.147.394.508.699.802.996.962 2.691 1.08 3.833.266.567-.403.988-1.368 1.105-2.531.11-1.085 0-1.225-.555-.707-.644.6-1.325.816-2.552.812-1.055-.004-1.277-.057-2.11-.505-3.862-2.074-3.867-7.55-.008-9.65 1.098-.598 2.689-.694 3.77-.229.417.179.872.452 1.012.606.358.397.503.35.503-.16v-.442h2.062v5.296c0 3.363-.06 5.58-.165 6.076-.36 1.69-1.29 2.955-2.612 3.55-.954.43-3.221.507-4.108.14zm3.009-6.823c1.131-.428 1.868-1.67 1.873-3.158.003-.865-.066-1.158-.426-1.816-.676-1.237-1.92-1.816-3.204-1.493-1.451.365-2.322 1.598-2.322 3.287 0 1.537.698 2.683 1.937 3.179.475.19 1.639.19 2.142 0zM37.703 16.572c-3.608-1.039-6.261-4.439-6.261-8.025 0-2.287.798-4.165 2.489-5.858 3.118-3.122 7.698-3.493 11.098-.9l.705.537-.76.77-.76.769-.463-.353c-.255-.194-.858-.538-1.34-.764-.787-.368-1.04-.41-2.433-.41-1.5 0-1.593.018-2.676.554-3.84 1.897-4.67 7.02-1.633 10.057 2.929 2.929 8.493 1.989 9.609-1.623.168-.545.306-1.084.306-1.197 0-.168-.503-.205-2.799-.205h-2.799v-2.21h7.808v1.319c0 .725-.074 1.67-.163 2.099-.548 2.629-2.66 4.78-5.383 5.482-1.198.309-3.397.289-4.545-.042z" fill="#1a73e8"/><path d="M64.866 16.648c-1.44-.592-2.16-1.252-2.901-2.657-.362-.685-.397-.898-.397-2.373 0-1.476.036-1.695.411-2.459.536-1.091 1.755-2.208 2.867-2.627.7-.264 1.076-.31 2.172-.262 1.165.05 1.44.118 2.258.556 1.688.904 2.648 2.43 2.783 4.424.13 1.939-.71 3.74-2.24 4.792-1.466 1.01-3.396 1.246-4.953.606zm3.654-2.249c1.166-.937 1.64-2.559 1.165-3.99-.89-2.68-4.316-2.984-5.576-.496-.713 1.407-.506 3.033.523 4.116.689.725 1.2.914 2.341.864.845-.037 1.067-.108 1.547-.494z" fill="#f9ab00"/><path d="M3.759 39.742c-1.016-.273-1.588-.63-2.364-1.472C.428 37.222.137 36.45.147 34.967c.006-1.008.077-1.395.362-1.989.519-1.08 1.672-2.172 2.697-2.556l.85-.318 61.165.038 61.165.037.778.41c1.996 1.052 3.042 3.124 2.657 5.262-.294 1.632-1.313 2.918-2.902 3.663l-.828.388-60.767.028c-52.87.024-60.87 0-61.565-.188z" fill="none"/><path d="M3.586 39.61c-.385-.139-1.066-.56-1.513-.935-2.708-2.273-2.233-6.47.908-8.035l1.075-.536h60.925c45.633 0 61.127.061 61.731.242.444.133 1.173.555 1.62.938 2.838 2.429 1.95 7.049-1.597 8.315-1.1.392-122.065.404-123.149.012z" fill="#dadce0"/></svg> \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/new_tab_page/icons/copy.svg b/chromium/chrome/browser/resources/new_tab_page/icons/copy.svg
new file mode 100644
index 00000000000..fd4c870c66d
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/icons/copy.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48"><path d="M35.25 14a.76.76 0 0 1 .75.75v25.5a.76.76 0 0 1-.75.75h-16.5a.76.76 0 0 1-.75-.75v-25.5a.76.76 0 0 1 .75-.75h16.5m0-4h-16.5A4.77 4.77 0 0 0 14 14.75v25.5A4.77 4.77 0 0 0 18.75 45h16.5A4.77 4.77 0 0 0 40 40.25v-25.5A4.77 4.77 0 0 0 35.25 10z" fill="#666"/><path d="M9 38V9.75A4.77 4.77 0 0 1 13.75 5h19.16" fill="none" stroke="#666" stroke-miterlimit="10" stroke-width="4"/></svg> \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/new_tab_page/icons/facebook.svg b/chromium/chrome/browser/resources/new_tab_page/icons/facebook.svg
new file mode 100644
index 00000000000..dbf2fd8aa42
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/icons/facebook.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48"><path d="M43.5 48h-39C2 48 0 46 0 43.5v-39C0 2 2 0 4.5 0h39C46 0 48 2 48 4.5v39c0 2.5-2 4.5-4.5 4.5z" fill="#3a589b"/><path d="M39.4 29.4l.9-7.3h-7.2v-4.7c0-2.1.6-3.5 3.6-3.5h3.8V7.5c-.7-.1-2.9-.3-5.6-.3-5.5 0-9.3 3.4-9.3 9.6v5.3h-6.2v7.3h6.2V48h7.5V29.4h6.3z" fill="#fff"/></svg> \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/new_tab_page/icons/header.svg b/chromium/chrome/browser/resources/new_tab_page/icons/header.svg
deleted file mode 100644
index e5b1f63dfb7..00000000000
--- a/chromium/chrome/browser/resources/new_tab_page/icons/header.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="130" height="40" xmlns="http://www.w3.org/2000/svg"><g fill="#000" fill-rule="evenodd"><path d="M39.972 16.969c-4.685 0-8.62-3.81-8.62-8.485C31.352 3.81 35.287 0 39.972 0c2.593 0 4.438 1.012 5.826 2.342l-1.635 1.631c-.995-.93-2.346-1.658-4.191-1.658-3.424 0-6.1 2.752-6.1 6.17 0 3.416 2.676 6.169 6.1 6.169 2.219 0 3.48-.894 4.292-1.695.667-.665 1.096-1.613 1.26-2.916h-5.552V7.719h7.817c.082.41.128.911.128 1.449 0 1.74-.475 3.891-2.01 5.422-1.497 1.55-3.396 2.379-5.935 2.379zm17.79-5.367c0-1.983-1.41-3.333-3.038-3.333-1.63 0-3.039 1.359-3.039 3.333 0 1.956 1.41 3.333 3.039 3.333 1.629 0 3.038-1.368 3.038-3.333zm2.37 0c0 3.168-2.425 5.5-5.408 5.5-2.984 0-5.41-2.332-5.41-5.5 0-3.186 2.426-5.5 5.41-5.5 2.983 0 5.409 2.314 5.409 5.5zm9.683 0c0-1.983-1.41-3.333-3.039-3.333-1.63 0-3.039 1.359-3.039 3.333 0 1.956 1.41 3.333 3.039 3.333 1.63.01 3.039-1.368 3.039-3.333zm2.361 0c0 3.168-2.425 5.5-5.41 5.5-2.974 0-5.408-2.332-5.408-5.5 0-3.186 2.425-5.5 5.409-5.5s5.41 2.314 5.41 5.5zm9.533.016c0-1.93-1.277-3.348-2.9-3.348-1.648 0-3.025 1.409-3.025 3.348 0 1.912 1.377 3.302 3.026 3.302 1.622 0 2.899-1.39 2.899-3.302zm2.102-5.178v9.843c0 4.052-2.365 5.708-5.164 5.708-2.637 0-4.212-1.784-4.81-3.238l2.074-.87c.372.898 1.278 1.949 2.736 1.949 1.795 0 2.899-1.125 2.899-3.22v-.786h-.082c-.533.668-1.567 1.244-2.863 1.244-2.718 0-5.2-2.388-5.2-5.461 0-3.092 2.491-5.507 5.2-5.507 1.296 0 2.33.585 2.863 1.226h.082V6.44h2.265zm2.041 10.254V.602h2.45v16.092h-2.45zm5.98-5.267L96.72 9.39c-.273-.689-1.075-1.166-2.033-1.166-1.222 0-2.917 1.083-2.855 3.204zm5.736 1.984l1.86 1.249c-.602.9-2.052 2.442-4.56 2.442-3.108 0-5.342-2.415-5.342-5.5 0-3.269 2.26-5.5 5.078-5.5 2.836 0 4.222 2.268 4.678 3.498l.246.625-7.303 3.048c.556 1.102 1.431 1.671 2.653 1.671 1.223 0 2.07-.615 2.69-1.533z"/><rect y="30" width="130" height="10" rx="5"/></g></svg> \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/new_tab_page/icons/mail.svg b/chromium/chrome/browser/resources/new_tab_page/icons/mail.svg
new file mode 100644
index 00000000000..8851e4298fc
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/icons/mail.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48"><path d="M43.5 48h-39C2 48 0 46 0 43.5v-39C0 2 2 0 4.5 0h39C46 0 48 2 48 4.5v39c0 2.5-2 4.5-4.5 4.5z" fill="#9da6aa"/><path d="M35.9 12.8H12.1c-2.2 0-4 1.8-4 4v14.4c0 2.2 1.8 4 4 4h23.8c2.2 0 4-1.8 4-4V16.8c0-2.2-1.8-4-4-4z" fill="#fff"/><path fill="none" stroke="#9da6aa" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M35.4 17.2L24 26.1l-11.4-8.9"/></svg> \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/new_tab_page/icons/twitter.svg b/chromium/chrome/browser/resources/new_tab_page/icons/twitter.svg
new file mode 100644
index 00000000000..4aeae35c2bb
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/icons/twitter.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48"><path d="M43.5 48h-39C2 48 0 46 0 43.5v-39C0 2 2 0 4.5 0h39C46 0 48 2 48 4.5v39c0 2.5-2 4.5-4.5 4.5z" fill="#3aaae1"/><path d="M39.3 15.5c-1.1.5-2.3.8-3.5.9 1.2-.7 2.2-1.9 2.6-3.3-1.1.7-2.5 1.2-3.8 1.5-1.1-1.1-2.6-1.9-4.4-1.9-3.3 0-6 2.7-6 6 0 .5.1.9.1 1.3-4.9-.3-9.4-2.6-12.4-6.3-.5.9-.8 1.9-.8 3 0 2 1.1 3.9 2.7 5-1 0-1.9-.3-2.7-.8v.1c0 2.9 2 5.3 4.8 5.9-.5.1-1.1.2-1.6.2-.4 0-.8-.1-1.1-.1.8 2.4 3 4.1 5.6 4.2-2 1.6-4.7 2.5-7.4 2.5-.5 0-1 0-1.4-.1 2.7 1.7 5.8 2.7 9.2 2.7 11 0 17-9.1 17-17v-.8c1.3-.8 2.3-1.8 3.1-3z" fill="#fff"/></svg> \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/new_tab_page/icons/upload.svg b/chromium/chrome/browser/resources/new_tab_page/icons/upload.svg
new file mode 100644
index 00000000000..89021d161b8
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/icons/upload.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><g fill-rule="evenodd"><path fill-rule="nonzero" d="M3 12v2h10v-2z"/><path d="M3 6.846h2.99V11h3.996V6.846H13L8 2z"/></g></svg> \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/new_tab_page/logo.html b/chromium/chrome/browser/resources/new_tab_page/logo.html
index 3b90291fbf7..ce8504f079c 100644
--- a/chromium/chrome/browser/resources/new_tab_page/logo.html
+++ b/chromium/chrome/browser/resources/new_tab_page/logo.html
@@ -1,6 +1,9 @@
-<style>
- :host(:not([hidden])) {
+<style include="cr-hidden-style">
+ :host {
+ --ntp-logo-height: 230px;
display: inline-block;
+ flex-shrink: 0;
+ min-height: var(--ntp-logo-height);
}
#singleColoredLogo,
@@ -21,26 +24,102 @@
background-image: url(chrome://resources/images/google_logo.svg);
}
+ #imageContainer {
+ cursor: pointer;
+ display: grid;
+ height: fit-content;
+ outline: none;
+ position: relative;
+ width: fit-content;
+ }
+
+ :host-context(.focus-outline-visible) #imageContainer:focus {
+ box-shadow: 0 0 0 2px rgba(var(--google-blue-600-rgb), .4);
+ }
+
+ #imageContainer > * {
+ grid-column-start: 1;
+ grid-row-start: 1;
+ }
+
+ #image {
+ max-height: var(--ntp-logo-height);
+ max-width: 100%;
+ }
+
+ #animation {
+ height: 100%;
+ pointer-events: none;
+ width: 100%;
+ }
+
+ #shareButton {
+ border: none;
+ height: 26px;
+ min-width: 26px;
+ opacity: 0.8;
+ outline: initial;
+ padding: 2px;
+ position: absolute;
+ width: 26px;
+ }
+
+ #shareButton:hover {
+ opacity: 1;
+ }
+
#iframe {
- height: var(--height, 200px);
+ height: var(--height);
transition-duration: var(--duration, 100ms);
transition-property: height, width;
- width: var(--width, 500px);
+ width: var(--width);
}
</style>
-<iron-pages selected="[[mode_]]" attr-for-selected="id">
- <div id="logo">
- <!-- TODO(crbug.com/1039910): Add flower if doodle available. -->
- <div id="singleColoredLogo" hidden="[[!singleColored]]"></div>
- <div id="multiColoredLogo" hidden="[[singleColored]]"></div>
- </div>
- <div id="doodle">
- <img id="image" src="[[imageUrl_]]" hidden="[[!imageUrl_]]"></img>
- <ntp-untrusted-iframe id="iframe" path="[[iframeUrl_]]"
- hidden="[[!iframeUrl_]]"
- style="--duration: [[valueOrUnset_(duration_)]];
- --height: [[valueOrUnset_(height_)]];
- --width: [[valueOrUnset_(width_)]];">
- </ntp-untrusted-iframe>
- </div>
-</iron-pages>
+<dom-if if="[[showLogo_]]" restamp>
+ <template>
+ <div id="logo">
+ <div id="singleColoredLogo" hidden="[[!singleColored]]"></div>
+ <div id="multiColoredLogo" hidden="[[singleColored]]"></div>
+ </div>
+ </template>
+</dom-if>
+<dom-if if="[[showDoodle_]]" restamp>
+ <template>
+ <div id="doodle" title="[[doodle_.description]]">
+ <div id="imageContainer" hidden="[[!doodle_.content.imageDoodle]]"
+ tabindex="1" on-click="onImageClick_" on-keydown="onImageKeydown_">
+ <!-- The static image is always visible and the animated image is
+ stacked on top of the static image so that there is no flicker when
+ starting the animation. -->
+ <img id="image" src="[[imageUrl_]]" on-load="onImageLoad_">
+ </img>
+ <ntp-untrusted-iframe id="animation" path="[[animationUrl_]]"
+ hidden="[[!showAnimation_]]">
+ </ntp-untrusted-iframe>
+ <cr-button id="shareButton" title="$i18n{shareDoodle}"
+ on-click="onShareButtonClick_"
+ style="background-color: [[rgbaOrUnset_(doodle_.content.imageDoodle.shareButton.backgroundColor)]];
+ left: [[doodle_.content.imageDoodle.shareButton.x]]px;
+ top: [[doodle_.content.imageDoodle.shareButton.y]]px;">
+ <img id="shareButtonImage"
+ src="[[doodle_.content.imageDoodle.shareButton.iconUrl.url]]">
+ </img>
+ </cr-button>
+ </div>
+ <ntp-untrusted-iframe id="iframe" path="[[iframeUrl_]]"
+ hidden="[[!iframeUrl_]]"
+ style="--duration: [[valueOrUnset_(duration_)]];
+ --height: [[valueOrUnset_(height_)]];
+ --width: [[valueOrUnset_(width_)]];">
+ </ntp-untrusted-iframe>
+ </div>
+ </template>
+</dom-if>
+<dom-if if="[[showShareDialog_]]" restamp>
+ <template>
+ <ntp-doodle-share-dialog title="[[doodle_.description]]"
+ url="[[doodle_.content.imageDoodle.shareUrl]]"
+ on-close="onShareDialogClose_" on-share="onShare_">
+ </ntp-doodle-share-dialog>
+ </template>
+</dom-if>
diff --git a/chromium/chrome/browser/resources/new_tab_page/logo.js b/chromium/chrome/browser/resources/new_tab_page/logo.js
index e0ca6af58d2..41af57ef294 100644
--- a/chromium/chrome/browser/resources/new_tab_page/logo.js
+++ b/chromium/chrome/browser/resources/new_tab_page/logo.js
@@ -2,13 +2,16 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'chrome://resources/polymer/v3_0/iron-pages/iron-pages.js';
+import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
+import 'chrome://resources/cr_elements/hidden_style_css.m.js';
import './untrusted_iframe.js';
+import './doodle_share_dialog.js';
import {assert} from 'chrome://resources/js/assert.m.js';
import {EventTracker} from 'chrome://resources/js/event_tracker.m.js';
import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {BrowserProxy} from './browser_proxy.js';
+import {skColorToRgba} from './utils.js';
// Shows the Google logo or a doodle if available.
class LogoElement extends PolymerElement {
@@ -45,12 +48,24 @@ class LogoElement extends PolymerElement {
/** @private */
loaded_: Boolean,
- /** @private */
+ /** @private {newTabPage.mojom.Doodle} */
doodle_: Object,
/** @private */
- mode_: {
- computed: 'computeMode_(doodleAllowed, loaded_, doodle_)',
+ canShowDoodle_: {
+ computed: 'computeCanShowDoodle_(doodle_)',
+ type: Boolean,
+ },
+
+ /** @private */
+ showLogo_: {
+ computed: 'computeShowLogo_(doodleAllowed, loaded_, canShowDoodle_)',
+ type: Boolean,
+ },
+
+ /** @private */
+ showDoodle_: {
+ computed: 'computeShowDoodle_(doodleAllowed, loaded_, canShowDoodle_)',
type: Boolean,
},
@@ -61,6 +76,18 @@ class LogoElement extends PolymerElement {
},
/** @private */
+ showAnimation_: {
+ type: Boolean,
+ value: false,
+ },
+
+ /** @private */
+ animationUrl_: {
+ computed: 'computeAnimationUrl_(doodle_)',
+ type: String,
+ },
+
+ /** @private */
iframeUrl_: {
computed: 'computeIframeUrl_(doodle_)',
type: String,
@@ -83,17 +110,33 @@ class LogoElement extends PolymerElement {
type: String,
value: null,
},
+
+ /** @private */
+ showShareDialog_: Boolean,
};
}
constructor() {
+ performance.mark('logo-creation-start');
super();
/** @private {!EventTracker} */
this.eventTracker_ = new EventTracker();
- BrowserProxy.getInstance().handler.getDoodle().then(({doodle}) => {
+ /** @private {newTabPage.mojom.PageHandlerRemote} */
+ this.pageHandler_ = BrowserProxy.getInstance().handler;
+ this.pageHandler_.getDoodle().then(({doodle}) => {
this.doodle_ = doodle;
this.loaded_ = true;
+ if (this.doodle_ && this.doodle_.content.interactiveDoodle) {
+ this.width_ = `${this.doodle_.content.interactiveDoodle.width}px`;
+ this.height_ = `${this.doodle_.content.interactiveDoodle.height}px`;
+ }
});
+ /** @private {?string} */
+ this.imageClickParams_;
+ /** @private {url.mojom.Url} */
+ this.interactionLogUrl_;
+ /** @private {?string} */
+ this.shareId_;
}
/** @override */
@@ -115,23 +158,128 @@ class LogoElement extends PolymerElement {
this.eventTracker_.removeAll();
}
+ /** @override */
+ ready() {
+ super.ready();
+ performance.measure('logo-creation', 'logo-creation-start');
+ }
+
/**
- * @return {string}
+ * @return {boolean}
* @private
*/
- computeMode_() {
- if (this.doodleAllowed) {
- if (!this.loaded_) {
- return 'none';
- }
- if (this.doodle_ &&
- /* We hide interactive doodles when offline. Otherwise, the iframe
- would show an ugly error page. */
- (!this.doodle_.content.url || window.navigator.onLine)) {
- return 'doodle';
+ computeCanShowDoodle_() {
+ return !!this.doodle_ &&
+ /* We hide interactive doodles when offline. Otherwise, the iframe
+ would show an ugly error page. */
+ (!this.doodle_.content.interactiveDoodle || window.navigator.onLine);
+ }
+
+ /**
+ * @return {boolean}
+ * @private
+ */
+ computeShowLogo_() {
+ return !this.doodleAllowed || (!!this.loaded_ && !this.canShowDoodle_);
+ }
+
+ /**
+ * @return {boolean}
+ * @private
+ */
+ computeShowDoodle_() {
+ return !!this.doodleAllowed && this.canShowDoodle_;
+ }
+
+ /**
+ * Called when a simple or animated doodle was clicked. Starts animation if
+ * clicking preview image of animated doodle. Otherwise, opens
+ * doodle-associated URL in new tab/window.
+ * @private
+ */
+ onImageClick_() {
+ if (this.isCtaImageShown_()) {
+ this.showAnimation_ = true;
+ this.pageHandler_.onDoodleImageClicked(
+ newTabPage.mojom.DoodleImageType.CTA, this.interactionLogUrl_);
+
+ // TODO(tiborg): This is technically not correct since we don't know if
+ // the animation has loaded yet. However, since the animation is loaded
+ // inside an iframe retrieving the proper load signal is not trivial. In
+ // practice this should be good enough but we could improve that in the
+ // future.
+ this.logImageRendered_(
+ newTabPage.mojom.DoodleImageType.ANIMATION,
+ /** @type {!url.mojom.Url} */
+ (this.doodle_.content.imageDoodle.animationImpressionLogUrl));
+
+ return;
+ }
+ this.pageHandler_.onDoodleImageClicked(
+ this.showAnimation_ ? newTabPage.mojom.DoodleImageType.ANIMATION :
+ newTabPage.mojom.DoodleImageType.STATIC,
+ null);
+ const onClickUrl = new URL(this.doodle_.content.imageDoodle.onClickUrl.url);
+ if (this.imageClickParams_) {
+ for (const param of new URLSearchParams(this.imageClickParams_)) {
+ onClickUrl.searchParams.append(param[0], param[1]);
}
}
- return 'logo';
+ BrowserProxy.getInstance().open(onClickUrl.toString());
+ }
+
+ /** @private */
+ onImageLoad_() {
+ this.logImageRendered_(
+ this.isCtaImageShown_() ? newTabPage.mojom.DoodleImageType.CTA :
+ newTabPage.mojom.DoodleImageType.STATIC,
+ this.doodle_.content.imageDoodle.imageImpressionLogUrl);
+ }
+
+ /**
+ * @param {newTabPage.mojom.DoodleImageType} type
+ * @param {!url.mojom.Url} logUrl
+ * @private
+ */
+ async logImageRendered_(type, logUrl) {
+ const {imageClickParams, interactionLogUrl, shareId} =
+ await this.pageHandler_.onDoodleImageRendered(
+ type, BrowserProxy.getInstance().now(), logUrl);
+ this.imageClickParams_ = imageClickParams;
+ this.interactionLogUrl_ = interactionLogUrl;
+ this.shareId_ = shareId;
+ }
+
+ /**
+ * @param {!Event} e
+ * @private
+ */
+ onImageKeydown_(e) {
+ if ([' ', 'Enter'].includes(e.key)) {
+ this.onImageClick_();
+ }
+ }
+
+ /**
+ * @param {!CustomEvent} e
+ * @private
+ */
+ onShare_(e) {
+ const doodleId = new URL(this.doodle_.content.imageDoodle.onClickUrl.url)
+ .searchParams.get('ct');
+ if (!doodleId) {
+ return;
+ }
+ this.pageHandler_.onDoodleShared(e.detail, doodleId, this.shareId_);
+ }
+
+ /**
+ * @returns {boolean}
+ * @private
+ */
+ isCtaImageShown_() {
+ return !this.showAnimation_ && !!this.doodle_ &&
+ !!this.doodle_.content.imageDoodle.animationUrl;
}
/**
@@ -139,8 +287,20 @@ class LogoElement extends PolymerElement {
* @private
*/
computeImageUrl_() {
- return (this.doodle_ && this.doodle_.content.image) ?
- this.doodle_.content.image :
+ return (this.doodle_ && this.doodle_.content.imageDoodle &&
+ this.doodle_.content.imageDoodle.imageUrl) ?
+ this.doodle_.content.imageDoodle.imageUrl.url :
+ '';
+ }
+
+ /**
+ * @return {string}
+ * @private
+ */
+ computeAnimationUrl_() {
+ return (this.doodle_ && this.doodle_.content.imageDoodle &&
+ this.doodle_.content.imageDoodle.animationUrl) ?
+ `image?${this.doodle_.content.imageDoodle.animationUrl.url}` :
'';
}
@@ -149,8 +309,8 @@ class LogoElement extends PolymerElement {
* @private
*/
computeIframeUrl_() {
- return (this.doodle_ && this.doodle_.content.url) ?
- `iframe?${this.doodle_.content.url.url}` :
+ return (this.doodle_ && this.doodle_.content.interactiveDoodle) ?
+ `iframe?${this.doodle_.content.interactiveDoodle.url.url}` :
'';
}
@@ -162,6 +322,29 @@ class LogoElement extends PolymerElement {
valueOrUnset_(value) {
return value || 'unset';
}
+
+ /**
+ * @param {skia.mojom.SkColor} skColor
+ * @return {string}
+ * @private
+ */
+ rgbaOrUnset_(skColor) {
+ return skColor ? skColorToRgba(skColor) : 'unset';
+ }
+
+ /**
+ * @param {!Event} e
+ * @private
+ */
+ onShareButtonClick_(e) {
+ e.stopPropagation();
+ this.showShareDialog_ = true;
+ }
+
+ /** @private */
+ onShareDialogClose_() {
+ this.showShareDialog_ = false;
+ }
}
customElements.define(LogoElement.is, LogoElement);
diff --git a/chromium/chrome/browser/resources/new_tab_page/mini_page.html b/chromium/chrome/browser/resources/new_tab_page/mini_page.html
index 4c4cfbeb308..3e137310a5c 100644
--- a/chromium/chrome/browser/resources/new_tab_page/mini_page.html
+++ b/chromium/chrome/browser/resources/new_tab_page/mini_page.html
@@ -1,32 +1,53 @@
<style>
:host {
- --mini-page-shortcut-color: var(--google-grey-refresh-300);
+ --ntp-mini-page-shortcut-color: var(--google-grey-refresh-300);
}
.mini-page {
- margin: auto;
- padding-top: 26px;
- width: fit-content;
+ align-items: center;
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ justify-content: center;
+ width: 100%;
}
.mini-header {
- -webkit-mask-image: url(icons/header.svg);
+ height: 28%;
+ width: 92%;
+ }
+
+ :host(:not([single-colored-logo])) .mini-header {
+ background-image: url(icons/colored_header.svg);
+ background-repeat: no-repeat;
+ background-size: 100%;
+ }
+
+ :host([single-colored-logo]) .mini-header {
+ -webkit-mask-image: url(icons/colored_header.svg);
-webkit-mask-repeat: no-repeat;
-webkit-mask-size: 100%;
background-color: var(--google-grey-refresh-300);
- height: 40px;
- width: 130px;
}
.mini-shortcuts {
-webkit-mask-image: url(icons/shortcut_circles.svg);
-webkit-mask-repeat: no-repeat;
-webkit-mask-size: 100%;
- background-color: var(--mini-page-shortcut-color);
- height: 42px;
- margin-inline-start: 7px;
- margin-top: 12px;
- width: 116px;
+ background-color: var(--ntp-mini-page-shortcut-color);
+ height: 29%;
+ margin-top: 8%;
+ width: 82%;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ :host(:not([single-colored-logo])) .mini-header,
+ .mini-header {
+ -webkit-mask-image: url(icons/colored_header.svg);
+ -webkit-mask-repeat: no-repeat;
+ -webkit-mask-size: 100%;
+ background: white;
+ }
}
</style>
<div class="mini-page">
diff --git a/chromium/chrome/browser/resources/new_tab_page/most_visited.html b/chromium/chrome/browser/resources/new_tab_page/most_visited.html
index 3c09c59a78c..6054974dbde 100644
--- a/chromium/chrome/browser/resources/new_tab_page/most_visited.html
+++ b/chromium/chrome/browser/resources/new_tab_page/most_visited.html
@@ -15,21 +15,32 @@
+ 1px);
display: flex;
flex-wrap: wrap;
+ height: calc(var(--row-count) * 128px);
justify-content: center;
+ opacity: 0;
overflow: hidden;
+ padding-top: 3px;
transition: opacity 300ms ease-in-out;
width: calc(var(--content-width) + 12px);
}
- #addShortCutIcon {
+ :host([visible_]) #container {
+ opacity: 1;
+ }
+
+ #addShortcutIcon {
-webkit-mask-image: url(chrome://resources/images/add.svg);
-webkit-mask-repeat: no-repeat;
-webkit-mask-size: 100%;
- background-color: var(--ntp-theme-text-color);
+ background-color: var(--google-grey-900);
height: 24px;
width: 24px;
}
+ :host([use-white-add-icon]) #addShortcutIcon {
+ background-color: white;
+ }
+
.tile,
#addShortcut {
-webkit-tap-highlight-color: transparent;
@@ -42,6 +53,7 @@
height: var(--tile-size);
margin-bottom: var(--tile-margin);
opacity: 1;
+ outline: none;
padding-top: var(--tile-margin);
position: relative;
text-decoration: none;
@@ -52,9 +64,16 @@
width: var(--tile-size);
}
- :host-context(html:not(.focus-outline-visible)) .tile,
- :host-context(html:not(.focus-outline-visible)) #addShortcut {
- outline: none;
+ :host-context(.focus-outline-visible) .tile:focus,
+ :host-context(.focus-outline-visible) #addShortcut:focus {
+ box-shadow: var(--ntp-focus-shadow);
+ }
+
+ #addShortcut {
+ background-color: transparent;
+ border: none;
+ box-shadow: none;
+ padding: 0;
}
:host(:not([reordering_])) .tile:hover,
@@ -74,19 +93,38 @@
}
.tile-icon img {
- height: 32px;
- width: 32px;
+ height: 24px;
+ width: 24px;
}
.tile-title {
+ align-items: center;
+ border-radius: 12px;
color: var(--ntp-theme-text-color);
- margin-top: 16px;
+ display: flex;
+ height: 24px;
+ margin-top: 7px;
+ padding: 0 8px;
+ width: 88px;
+ }
+
+ :host([use-title-pill]) .tile-title {
+ background-color: white;
+ color: var(--google-grey-800);
+ }
+
+ .tile-title span {
+ font-weight: 400;
overflow: hidden;
text-align: center;
text-overflow: ellipsis;
text-shadow: var(--ntp-theme-text-shadow);
white-space: nowrap;
- width: 88px;
+ width: 100%;
+ }
+
+ :host([use-title-pill]) .tile-title span {
+ text-shadow: none;
}
.title-rtl {
@@ -111,7 +149,7 @@
position: absolute;
right: 0;
top: 0;
- transition-property: opacity;
+ transition: opacity 100ms ease-in-out;
}
:host-context([dir=rtl]) cr-icon-button {
@@ -122,7 +160,7 @@
:host(:not([reordering_])) .tile:hover cr-icon-button,
.force-hover cr-icon-button {
opacity: 1;
- transition-delay: 500ms;
+ transition-delay: 400ms;
}
:host(:not([reordering_])) cr-icon-button:active,
@@ -133,47 +171,45 @@
opacity: 1;
transition-delay: 0s;
}
-
- @media (prefers-color-scheme: dark) {
- :host {
- --icon-button-color: var(--google-grey-400);
- --icon-button-color-active: var(--google-grey-200);
- --tile-hover-color: rgba(255, 255, 255, .1);
- }
- }
</style>
-<div id="container" style="--column-count: [[columnCount_]];">
- <dom-repeat id="tiles" items="[[tiles_]]">
+<div id="container"
+ style="--column-count: [[columnCount_]]; --row-count: [[rowCount_]];">
+ <dom-repeat id="tiles" items="[[tiles_]]" on-dom-change="onTilesRendered_">
<template>
<a class="tile" draggable="true" href$="[[item.url.url]]"
title$="[[item.title]]" on-dragstart="onDragStart_"
on-touchstart="onTouchStart_"
hidden$="[[isHidden_(index, columnCount_)]]"
- on-keydown="onTileKeyDown_">
- <cr-icon-button class$="[[getTileIconButtonIcon_(customLinksEnabled_)]]"
- on-click="onTileIconButtonClick_" tabindex="0"></cr-icon-button>
+ on-click="onTileClick_" on-keydown="onTileKeyDown_">
+ <cr-icon-button id="actionMenuButton" class="icon-more-vert"
+ title="$i18n{moreActions}" on-click="onTileActionButtonClick_"
+ tabindex="0" hidden$="[[!customLinksEnabled_]]"></cr-icon-button>
+ <cr-icon-button id="removeButton" class="icon-clear"
+ title="$i18n{linkRemove}" on-click="onTileRemoveButtonClick_"
+ tabindex="0" hidden$="[[customLinksEnabled_]]"></cr-icon-button>
<div class="tile-icon">
<img src$="[[getFaviconUrl_(item.url)]]" draggable="false"></img>
</div>
<div class$="tile-title [[getTileTitleDirectionClass_(item)]]">
- [[item.title]]
+ <span>[[item.title]]</span>
</div>
</a>
</template>
</dom-repeat>
- <a id="addShortcut" tabindex="0" on-click="onAdd_" hidden$="[[!showAdd_]]"
- title="$i18n{addLinkTitle}" on-keydown="onAddShortcutKeyDown_">
+ <cr-button id="addShortcut" tabindex="0" on-click="onAdd_"
+ hidden$="[[!showAdd_]]" on-keydown="onAddShortcutKeyDown_" noink>
<div class="tile-icon">
- <div id="addShortCutIcon" draggable="false"></div>
+ <div id="addShortcutIcon" draggable="false"></div>
+ </div>
+ <div class="tile-title">
+ <span>$i18n{addLinkTitle}</span>
</div>
- <div class="tile-title">$i18n{addLinkTitle}</div>
- </a>
+ </cr-button>
<cr-dialog id="dialog" on-close="onDialogClose_">
<div slot="title">[[dialogTitle_]]</div>
<div slot="body">
- <cr-input id="dialogInputName" class$="[[dialogTileTitleDirectionClass_]]"
- label="$i18n{nameField}" value="{{dialogTileTitle_}}"
- spellcheck="false" autofocus></cr-input>
+ <cr-input id="dialogInputName" label="$i18n{nameField}"
+ value="{{dialogTileTitle_}}" spellcheck="false" autofocus></cr-input>
<cr-input id="dialogInputUrl" label="$i18n{urlField}"
value="{{dialogTileUrl_}}" invalid="[[dialogTileUrlInvalid_]]"
error-message="$i18n{invalidUrl}" spellcheck="false" type="url">
diff --git a/chromium/chrome/browser/resources/new_tab_page/most_visited.js b/chromium/chrome/browser/resources/new_tab_page/most_visited.js
index 5d41829de26..92b0f5ae097 100644
--- a/chromium/chrome/browser/resources/new_tab_page/most_visited.js
+++ b/chromium/chrome/browser/resources/new_tab_page/most_visited.js
@@ -17,6 +17,7 @@ import './strings.m.js';
import {assert} from 'chrome://resources/js/assert.m.js';
import {isMac} from 'chrome://resources/js/cr.m.js';
import {FocusOutlineManager} from 'chrome://resources/js/cr/ui/focus_outline_manager.m.js';
+import {EventTracker} from 'chrome://resources/js/event_tracker.m.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {Debouncer, html, microTask, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -48,7 +49,7 @@ function resetTilePosition(tile) {
* @private
*/
function setTilePosition(tile, {x, y}) {
- tile.style.position = 'absolute';
+ tile.style.position = 'fixed';
tile.style.left = `${x}px`;
tile.style.top = `${y}px`;
}
@@ -76,21 +77,40 @@ class MostVisitedElement extends PolymerElement {
static get properties() {
return {
+ /**
+ * When the tile icon background is dark, the add icon color is white for
+ * contrast. This can be used to determine the color of the tile hover as
+ * well.
+ */
+ useWhiteAddIcon: {
+ type: Boolean,
+ reflectToAttribute: true,
+ },
+
+ /* If true wraps the tile titles in white pills. */
+ useTitlePill: {
+ type: Boolean,
+ reflectToAttribute: true,
+ },
+
/** @private */
columnCount_: {
- type: Boolean,
+ type: Number,
computed: `computeColumnCount_(tiles_, screenWidth_, maxTiles_,
visible_)`,
},
/** @private */
- customLinksEnabled_: Boolean,
+ rowCount_: {
+ type: Number,
+ computed: 'computeRowCount_(columnCount_, tiles_)',
+ },
/** @private */
- dialogTileTitle_: String,
+ customLinksEnabled_: Boolean,
/** @private */
- dialogTileTitleDirectionClass_: String,
+ dialogTileTitle_: String,
/** @private */
dialogTileUrl_: String,
@@ -104,13 +124,6 @@ class MostVisitedElement extends PolymerElement {
/** @private */
dialogTitle_: String,
- /** @private */
- isRtl_: {
- type: Boolean,
- value: false,
- reflectToAttribute: true,
- },
-
/**
* Used to hide hover style and cr-icon-button of tiles while the tiles
* are being reordered.
@@ -148,7 +161,10 @@ class MostVisitedElement extends PolymerElement {
toastContent_: String,
/** @private */
- visible_: Boolean,
+ visible_: {
+ type: Boolean,
+ reflectToAttribute: true,
+ },
};
}
@@ -159,6 +175,7 @@ class MostVisitedElement extends PolymerElement {
}
constructor() {
+ performance.mark('most-visited-creation-start');
super();
/** @private {boolean} */
this.adding_ = false;
@@ -187,12 +204,24 @@ class MostVisitedElement extends PolymerElement {
super.connectedCallback();
/** @private {boolean} */
this.isRtl_ = window.getComputedStyle(this)['direction'] === 'rtl';
+ /** @private {!EventTracker} */
+ this.eventTracker_ = new EventTracker();
+
this.setMostVisitedInfoListenerId_ =
this.callbackRouter_.setMostVisitedInfo.addListener(info => {
+ performance.measure('most-visited-mojo', 'most-visited-mojo-start');
this.visible_ = info.visible;
this.customLinksEnabled_ = info.customLinksEnabled;
this.tiles_ = info.tiles.slice(0, 10);
});
+ performance.mark('most-visited-mojo-start');
+ this.eventTracker_.add(document, 'visibilitychange', () => {
+ // This updates the most visited tiles every time the NTP tab gets
+ // activated.
+ if (document.visibilityState === 'visible') {
+ this.pageHandler_.updateMostVisitedInfo();
+ }
+ });
this.pageHandler_.updateMostVisitedInfo();
FocusOutlineManager.forDocument(document);
}
@@ -208,6 +237,7 @@ class MostVisitedElement extends PolymerElement {
assert(this.boundOnWidthChange_));
this.ownerDocument.removeEventListener(
'keydown', this.boundOnDocumentKeyDown_);
+ this.eventTracker_.removeAll();
}
/** @override */
@@ -229,6 +259,8 @@ class MostVisitedElement extends PolymerElement {
this.onDocumentKeyDown_(/** @type {!KeyboardEvent} */ (e));
this.ownerDocument.addEventListener(
'keydown', this.boundOnDocumentKeyDown_);
+
+ performance.measure('most-visited-creation', 'most-visited-creation-start');
}
/** @private */
@@ -269,6 +301,19 @@ class MostVisitedElement extends PolymerElement {
* @return {number}
* @private
*/
+ computeRowCount_() {
+ if (this.columnCount_ === 0) {
+ return 0;
+ }
+
+ const shortcutCount = this.tiles_ ? this.tiles_.length : 0;
+ return this.columnCount_ <= shortcutCount ? 2 : 1;
+ }
+
+ /**
+ * @return {number}
+ * @private
+ */
computeMaxTiles_() {
return !this.visible_ ? 0 : (this.customLinksEnabled_ ? 10 : 8);
}
@@ -416,8 +461,8 @@ class MostVisitedElement extends PolymerElement {
*/
getFaviconUrl_(url) {
const faviconUrl = new URL('chrome://favicon2/');
- faviconUrl.searchParams.set('size', '32');
- faviconUrl.searchParams.set('scale_factor', '2x');
+ faviconUrl.searchParams.set('size', '24');
+ faviconUrl.searchParams.set('scale_factor', '1x');
faviconUrl.searchParams.set('show_fallback_monogram', '');
faviconUrl.searchParams.set('page_url', url.url);
return faviconUrl.href;
@@ -445,14 +490,6 @@ class MostVisitedElement extends PolymerElement {
}
/**
- * @return {string}
- * @private
- */
- getTileIconButtonIcon_() {
- return this.customLinksEnabled_ ? 'icon-more-vert' : 'icon-clear';
- }
-
- /**
* @param {number} index
* @return {boolean}
* @private
@@ -465,7 +502,6 @@ class MostVisitedElement extends PolymerElement {
onAdd_() {
this.dialogTitle_ = loadTimeData.getString('addLinkTitle');
this.dialogTileTitle_ = '';
- this.dialogTileTitleDirectionClass_ = '';
this.dialogTileUrl_ = '';
this.dialogTileUrlInvalid_ = false;
this.adding_ = true;
@@ -480,10 +516,6 @@ class MostVisitedElement extends PolymerElement {
if (e.altKey || e.shiftKey || e.metaKey || e.ctrlKey) {
return;
}
- if (e.key === 'Enter' || e.key === ' ') {
- e.preventDefault();
- this.onAdd_();
- }
if (!this.tiles_ || this.tiles_.length === 0) {
return;
@@ -566,8 +598,6 @@ class MostVisitedElement extends PolymerElement {
this.dialogTitle_ = loadTimeData.getString('editLinkTitle');
const tile = this.tiles_[this.actionMenuTargetIndex_];
this.dialogTileTitle_ = tile.title;
- this.dialogTileTitleDirectionClass_ =
- this.getTileTitleDirectionClass_(tile);
this.dialogTileUrl_ = tile.url.url;
this.dialogTileUrlInvalid_ = false;
this.$.dialog.showModal();
@@ -628,15 +658,31 @@ class MostVisitedElement extends PolymerElement {
* @param {!Event} e
* @private
*/
- onTileIconButtonClick_(e) {
+ onTileActionButtonClick_(e) {
e.preventDefault();
const {index} = this.$.tiles.modelForElement(e.target.parentElement);
- if (this.customLinksEnabled_) {
- this.actionMenuTargetIndex_ = index;
- this.$.actionMenu.showAt(e.target);
- } else {
- this.tileRemove_(index);
- }
+ this.actionMenuTargetIndex_ = index;
+ this.$.actionMenu.showAt(e.target);
+ }
+
+ /**
+ * @param {!Event} e
+ * @private
+ */
+ onTileRemoveButtonClick_(e) {
+ e.preventDefault();
+ const {index} = this.$.tiles.modelForElement(e.target.parentElement);
+ this.tileRemove_(index);
+ }
+
+ /**
+ * @param {!Event} e
+ * @private
+ */
+ onTileClick_(e) {
+ this.pageHandler_.onMostVisitedTileNavigation(
+ this.$.tiles.itemForElement(e.target),
+ this.$.tiles.indexForElement(e.target));
}
/**
@@ -751,6 +797,13 @@ class MostVisitedElement extends PolymerElement {
this.screenWidth_ = ScreenWidth.NARROW;
}
}
+
+ /** @private */
+ onTilesRendered_() {
+ performance.measure('most-visited-rendered');
+ this.pageHandler_.onMostVisitedTilesRendered(
+ this.tiles_, BrowserProxy.getInstance().now());
+ }
}
customElements.define(MostVisitedElement.is, MostVisitedElement);
diff --git a/chromium/chrome/browser/resources/new_tab_page/new_tab_page.html b/chromium/chrome/browser/resources/new_tab_page/new_tab_page.html
index 393cdb7242a..98dbd86af18 100644
--- a/chromium/chrome/browser/resources/new_tab_page/new_tab_page.html
+++ b/chromium/chrome/browser/resources/new_tab_page/new_tab_page.html
@@ -4,22 +4,39 @@
<meta charset="utf-8">
<title>$i18n{title}</title>
<style>
- html,
body {
+ background: $i18n{backgroundColor};
+ margin: 0;
+ }
+
+ #oneGoogleBar {
+ height: 56px;
+ }
+
+ #backgroundImage {
+ border: none;
height: 100%;
- overflow: hidden;
+ pointer-events: none;
+ position: fixed;
+ top: 0;
+ visibility: hidden;
+ width: 100%;
}
- body {
- background: $i18n{backgroundColor};
- margin: 0;
+ [show-background-image] #backgroundImage {
+ visibility: visible;
}
</style>
</head>
<body>
+ <div id="oneGoogleBar"></div>
+ <iframe id="backgroundImage"
+ src="chrome-untrusted://new-tab-page/custom_background_image?url=$i18nRaw{backgroundImageUrl}">
+ </iframe>
<ntp-app></ntp-app>
- <script type="module" src="app.js"></script>
+ <script type="module" src="new_tab_page.js"></script>
<link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css">
<link rel="stylesheet" href="shared_vars.css">
+ <div id="oneGoogleBarEndOfBody"></div>
</body>
</html>
diff --git a/chromium/chrome/browser/resources/new_tab_page/new_tab_page.js b/chromium/chrome/browser/resources/new_tab_page/new_tab_page.js
new file mode 100644
index 00000000000..e4639f76b5d
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/new_tab_page.js
@@ -0,0 +1,19 @@
+
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview This file exists to make tests work. Optimizing the NTP
+ * flattens most JS files into a single new_tab_page.rollup.js. Therefore, tests
+ * cannot import things from individual modules anymore. This file exports the
+ * things tests need.
+ */
+
+import './app.js';
+
+export {BackgroundManager} from './background_manager.js';
+export {BrowserProxy} from './browser_proxy.js';
+export {BackgroundSelectionType} from './customize_dialog.js';
+export {NO_SUGGESTION_GROUP_ID} from './realbox_dropdown.js';
+export {$$, createScrollBorders, decodeString16, hexColorToSkColor, mojoString16, skColorToRgba} from './utils.js';
diff --git a/chromium/chrome/browser/resources/new_tab_page/new_tab_page_resources.grd b/chromium/chrome/browser/resources/new_tab_page/new_tab_page_resources.grd
index 3ffb582ae0a..35e62f674fc 100644
--- a/chromium/chrome/browser/resources/new_tab_page/new_tab_page_resources.grd
+++ b/chromium/chrome/browser/resources/new_tab_page/new_tab_page_resources.grd
@@ -12,103 +12,72 @@
</outputs>
<release seq="1">
<includes>
- <include name="IDR_NEW_TAB_PAGE_SKCOLOR_MOJO_LITE_JS"
- file="${root_gen_dir}/skia/public/mojom/skcolor.mojom-lite.js"
- use_base_dir="false" type="BINDATA" compress="gzip" />
- <include name="IDR_NEW_TAB_PAGE_MOJO_LITE_JS"
- file="${root_gen_dir}/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom-lite.js"
- use_base_dir="false" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_NEW_TAB_PAGE_JS"
+ file="new_tab_page.js" type="BINDATA" compress="false" />
<include name="IDR_NEW_TAB_PAGE_APP_JS"
file="${root_gen_dir}/chrome/browser/resources/new_tab_page/app.js"
- use_base_dir="false" type="BINDATA" compress="gzip" />
+ use_base_dir="false" type="BINDATA" compress="false" />
<include name="IDR_NEW_TAB_PAGE_MOST_VISITED_JS"
file="${root_gen_dir}/chrome/browser/resources/new_tab_page/most_visited.js"
- use_base_dir="false" type="BINDATA" compress="gzip" />
+ use_base_dir="false" type="BINDATA" compress="false" />
<include name="IDR_NEW_TAB_PAGE_CUSTOMIZE_DIALOG_JS"
file="${root_gen_dir}/chrome/browser/resources/new_tab_page/customize_dialog.js"
- use_base_dir="false" type="BINDATA" compress="gzip" />
+ use_base_dir="false" type="BINDATA" compress="false" />
<include name="IDR_NEW_TAB_PAGE_VOICE_SEARCH_OVERLAY_JS"
file="${root_gen_dir}/chrome/browser/resources/new_tab_page/voice_search_overlay.js"
- use_base_dir="false" type="BINDATA" compress="gzip" />
+ use_base_dir="false" type="BINDATA" compress="false" />
<include name="IDR_NEW_TAB_PAGE_CUSTOMIZE_BACKGROUNDS_JS"
file="${root_gen_dir}/chrome/browser/resources/new_tab_page/customize_backgrounds.js"
- use_base_dir="false" type="BINDATA" compress="gzip" />
+ use_base_dir="false" type="BINDATA" compress="false" />
<include name="IDR_NEW_TAB_PAGE_CUSTOMIZE_SHORTCUTS_JS"
file="${root_gen_dir}/chrome/browser/resources/new_tab_page/customize_shortcuts.js"
- use_base_dir="false" type="BINDATA" compress="gzip" />
+ use_base_dir="false" type="BINDATA" compress="false" />
<include name="IDR_NEW_TAB_PAGE_CUSTOMIZE_THEMES_JS"
file="${root_gen_dir}/chrome/browser/resources/new_tab_page/customize_themes.js"
- use_base_dir="false" type="BINDATA" compress="gzip" />
+ use_base_dir="false" type="BINDATA" compress="false" />
<include name="IDR_NEW_TAB_PAGE_THEME_ICON_JS"
file="${root_gen_dir}/chrome/browser/resources/new_tab_page/theme_icon.js"
- use_base_dir="false" type="BINDATA" compress="gzip" />
+ use_base_dir="false" type="BINDATA" compress="false" />
<include name="IDR_NEW_TAB_PAGE_GRID_JS"
file="${root_gen_dir}/chrome/browser/resources/new_tab_page/grid.js"
- use_base_dir="false" type="BINDATA" compress="gzip" />
+ use_base_dir="false" type="BINDATA" compress="false" />
<include name="IDR_NEW_TAB_UNTRUSTED_IFRAME_JS"
file="${root_gen_dir}/chrome/browser/resources/new_tab_page/untrusted_iframe.js"
- use_base_dir="false" type="BINDATA" compress="gzip" />
- <include name="IDR_NEW_TAB_PAGE_ACCOUNT_CIRCLE_SVG"
- file="icons/account_circle.svg" type="BINDATA" compress="gzip" />
- <include name="IDR_NEW_TAB_PAGE_BRUSH_ICON_SVG"
- file="icons/brush.svg" type="BINDATA" compress="gzip" />
- <include name="IDR_NEW_TAB_PAGE_CHECK_CIRCLE_SVG"
- file="icons/check_circle.svg" type="BINDATA" compress="gzip" />
- <include name="IDR_NEW_TAB_PAGE_GENERIC_GLOBE_SVG"
- file="icons/generic_globe.svg" type="BINDATA" compress="gzip" />
- <include name="IDR_NEW_TAB_PAGE_PENCIL_ICON_SVG"
- file="icons/icon_pencil.svg" type="BINDATA" compress="gzip" />
- <include name="IDR_NEW_TAB_PAGE_LINK_ICON_SVG"
- file="icons/link.svg" type="BINDATA" compress="gzip" />
- <include name="IDR_NEW_TAB_PAGE_BACKGROUNDS_ICON_SVG"
- file="icons/backgrounds.svg" type="BINDATA" compress="gzip" />
- <include name="IDR_NEW_TAB_PAGE_COLORS_ICON_SVG"
- file="icons/colors.svg" type="BINDATA" compress="gzip" />
- <include name="IDR_NEW_TAB_PAGE_COLORIZE_ICON_SVG"
- file="icons/colorize.svg" type="BINDATA" compress="gzip" />
- <include name="IDR_NEW_TAB_PAGE_SHORTCUT_CIRCLES_SVG"
- file="icons/shortcut_circles.svg" type="BINDATA" compress="gzip" />
- <include name="IDR_NEW_TAB_PAGE_HEADER_SVG"
- file="icons/header.svg" type="BINDATA" compress="gzip" />
- <include name="IDR_NEW_TAB_PAGE_GOOGLE_MIC_SVG"
- file="icons/googlemic_clr_24px.svg" type="BINDATA" compress="gzip" />
- <include name="IDR_NEW_TAB_PAGE_MIC_SVG"
- file="icons/mic.svg" type="BINDATA" compress="gzip" />
- <include name="IDR_NEW_TAB_PAGE_LINK_SVG"
- file="icons/link.svg" type="BINDATA" compress="gzip" />
+ use_base_dir="false" type="BINDATA" compress="false" />
<include name="IDR_NEW_TAB_PAGE_MINI_PAGE_JS"
file="${root_gen_dir}/chrome/browser/resources/new_tab_page/mini_page.js"
- use_base_dir="false" type="BINDATA" compress="gzip" />
+ use_base_dir="false" type="BINDATA" compress="false" />
<include name="IDR_NEW_TAB_PAGE_FAKEBOX_JS"
file="${root_gen_dir}/chrome/browser/resources/new_tab_page/fakebox.js"
- use_base_dir="false" type="BINDATA" compress="gzip" />
+ use_base_dir="false" type="BINDATA" compress="false" />
<include name="IDR_NEW_TAB_PAGE_LOGO_JS"
file="${root_gen_dir}/chrome/browser/resources/new_tab_page/logo.js"
- use_base_dir="false" type="BINDATA" compress="gzip" />
+ use_base_dir="false" type="BINDATA" compress="false" />
+ <include name="IDR_NEW_TAB_PAGE_DOODLE_SHARE_DIALOG_JS"
+ file="${root_gen_dir}/chrome/browser/resources/new_tab_page/doodle_share_dialog.js"
+ use_base_dir="false" type="BINDATA" compress="false" />
+ <include name="IDR_NEW_TAB_PAGE_REALBOX_JS"
+ file="${root_gen_dir}/chrome/browser/resources/new_tab_page/realbox.js"
+ use_base_dir="false" type="BINDATA" compress="false" />
+ <include name="IDR_NEW_TAB_PAGE_REALBOX_BUTTON_JS"
+ file="${root_gen_dir}/chrome/browser/resources/new_tab_page/realbox_button.js"
+ use_base_dir="false" type="BINDATA" compress="false" />
+ <include name="IDR_NEW_TAB_PAGE_REALBOX_DROPDOWN_JS"
+ file="${root_gen_dir}/chrome/browser/resources/new_tab_page/realbox_dropdown.js"
+ use_base_dir="false" type="BINDATA" compress="false" />
+ <include name="IDR_NEW_TAB_PAGE_REALBOX_ICON_JS"
+ file="${root_gen_dir}/chrome/browser/resources/new_tab_page/realbox_icon.js"
+ use_base_dir="false" type="BINDATA" compress="false" />
+ <include name="IDR_NEW_TAB_PAGE_REALBOX_MATCH_JS"
+ file="${root_gen_dir}/chrome/browser/resources/new_tab_page/realbox_match.js"
+ use_base_dir="false" type="BINDATA" compress="false" />
+ <include name="IDR_NEW_TAB_PAGE_BROWSER_PROXY_JS"
+ file="browser_proxy.js" type="BINDATA" compress="false" />
+ <include name="IDR_NEW_TAB_PAGE_UTILS_JS"
+ file="utils.js" type="BINDATA" compress="false" />
+ <include name="IDR_NEW_TAB_PAGE_BACKGROUND_MANAGER_JS"
+ file="background_manager.js" type="BINDATA" compress="false" />
+ <part file="new_tab_page_resources_common.grdp" />
</includes>
- <structures>
- <structure name="IDR_NEW_TAB_PAGE_NEW_TAB_PAGE_HTML"
- file="new_tab_page.html" type="chrome_html" compress="gzip" />
- <structure name="IDR_NEW_TAB_PAGE_SHARED_VARS_CSS"
- file="shared_vars.css" type="chrome_html" compress="gzip" />
- <structure name="IDR_NEW_TAB_PAGE_BROWSER_PROXY_JS"
- file="browser_proxy.js" type="chrome_html" compress="gzip" />
- <structure name="IDR_NEW_TAB_PAGE_UTILS_JS"
- file="utils.js" type="chrome_html" compress="gzip" />
- <structure name="IDR_NEW_TAB_PAGE_UNTRUSTED_ONE_GOOGLE_BAR_HTML"
- file="untrusted/one_google_bar.html" type="chrome_html"
- compress="gzip" />
- <structure name="IDR_NEW_TAB_PAGE_UNTRUSTED_ONE_GOOGLE_BAR_JS"
- file="untrusted/one_google_bar.js" type="chrome_html"
- compress="gzip" />
- <structure name="IDR_NEW_TAB_PAGE_UNTRUSTED_PROMO_HTML"
- file="untrusted/promo.html" type="chrome_html" compress="gzip" />
- <structure name="IDR_NEW_TAB_PAGE_UNTRUSTED_PROMO_JS"
- file="untrusted/promo.js" type="chrome_html" compress="gzip" />
- <structure name="IDR_NEW_TAB_PAGE_UNTRUSTED_IMAGE_HTML"
- file="untrusted/image.html" type="chrome_html" compress="gzip" />
- <structure name="IDR_NEW_TAB_PAGE_UNTRUSTED_IFRAME_HTML"
- file="untrusted/iframe.html" type="chrome_html" compress="gzip" />
- </structures>
</release>
</grit>
diff --git a/chromium/chrome/browser/resources/new_tab_page/new_tab_page_resources_common.grdp b/chromium/chrome/browser/resources/new_tab_page/new_tab_page_resources_common.grdp
new file mode 100644
index 00000000000..c8170087238
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/new_tab_page_resources_common.grdp
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<grit-part>
+ <include name="IDR_NEW_TAB_PAGE_SKCOLOR_MOJO_LITE_JS"
+ file="${root_gen_dir}/skia/public/mojom/skcolor.mojom-lite.js"
+ use_base_dir="false" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_MOJO_LITE_JS"
+ file="${root_gen_dir}/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom-lite.js"
+ use_base_dir="false" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_OMNIBOX_MOJO_LITE_JS"
+ file="${root_gen_dir}/chrome/common/search/omnibox.mojom-lite.js"
+ use_base_dir="false" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_ACCOUNT_CIRCLE_SVG"
+ file="icons/account_circle.svg" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_BRUSH_ICON_SVG"
+ file="icons/brush.svg" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_CHECK_CIRCLE_SVG"
+ file="icons/check_circle.svg" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_CHEVRON_SVG"
+ file="icons/chevron.svg" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_GENERIC_GLOBE_SVG"
+ file="icons/generic_globe.svg" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_PENCIL_ICON_SVG"
+ file="icons/icon_pencil.svg" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_LINK_ICON_SVG"
+ file="icons/link.svg" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_BACKGROUNDS_ICON_SVG"
+ file="icons/backgrounds.svg" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_COLORED_HEADER_SVG"
+ file="icons/colored_header.svg" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_COLORS_ICON_SVG"
+ file="icons/colors.svg" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_COLORIZE_ICON_SVG"
+ file="icons/colorize.svg" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_SHORTCUT_CIRCLES_SVG"
+ file="icons/shortcut_circles.svg" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_GOOGLE_MIC_SVG"
+ file="icons/googlemic_clr_24px.svg" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_MIC_SVG"
+ file="icons/mic.svg" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_COPY_SVG"
+ file="icons/copy.svg" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_FACEBOOK_SVG"
+ file="icons/facebook.svg" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_TWITTER_SVG"
+ file="icons/twitter.svg" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_MAIL_SVG"
+ file="icons/mail.svg" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_UPLOAD_SVG" file="icons/upload.svg"
+ type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_NEW_TAB_PAGE_HTML"
+ file="new_tab_page.html" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_SHARED_VARS_CSS"
+ file="shared_vars.css" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_UNTRUSTED_ONE_GOOGLE_BAR_HTML"
+ file="untrusted/one_google_bar.html" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_UNTRUSTED_ONE_GOOGLE_BAR_JS"
+ file="untrusted/one_google_bar.js" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_UNTRUSTED_PROMO_HTML"
+ file="untrusted/promo.html" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_UNTRUSTED_PROMO_JS"
+ file="untrusted/promo.js" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_UNTRUSTED_IMAGE_HTML"
+ file="untrusted/image.html" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_UNTRUSTED_BACKGROUND_IMAGE_HTML"
+ file="untrusted/background_image.html" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_UNTRUSTED_BACKGROUND_IMAGE_JS"
+ file="untrusted/background_image.js" type="BINDATA" compress="gzip" />
+ <include name="IDR_NEW_TAB_PAGE_UNTRUSTED_IFRAME_HTML"
+ file="untrusted/iframe.html" type="BINDATA" compress="gzip" />
+</grit-part>
diff --git a/chromium/chrome/browser/resources/new_tab_page/new_tab_page_resources_vulcanized.grd b/chromium/chrome/browser/resources/new_tab_page/new_tab_page_resources_vulcanized.grd
new file mode 100644
index 00000000000..dea0262271b
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/new_tab_page_resources_vulcanized.grd
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+ <outputs>
+ <output filename="grit/new_tab_page_resources.h" type="rc_header">
+ <emit emit_type='prepend'></emit>
+ </output>
+ <output filename="grit/new_tab_page_resources_map.cc"
+ type="resource_file_map_source" />
+ <output filename="grit/new_tab_page_resources_map.h"
+ type="resource_map_header" />
+ <output filename="new_tab_page_resources.pak" type="data_package" />
+ </outputs>
+ <release seq="1">
+ <includes>
+ <include name="IDR_NEW_TAB_PAGE_NEW_TAB_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/new_tab_page/new_tab_page.rollup.js"
+ use_base_dir="false" type="BINDATA" compress="gzip"
+ preprocess="true" />
+ <part file="new_tab_page_resources_common.grdp" />
+ </includes>
+ </release>
+</grit>
diff --git a/chromium/chrome/browser/resources/new_tab_page/realbox.html b/chromium/chrome/browser/resources/new_tab_page/realbox.html
new file mode 100644
index 00000000000..8d3acd17ac7
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/realbox.html
@@ -0,0 +1,137 @@
+<style>
+ :host {
+ --ntp-realbox-height: 44px;
+ border-radius: calc(0.5 * var(--ntp-realbox-height));
+ box-shadow: 0 1px 6px 0 rgba(32, 33, 36, .28);
+ height: var(--ntp-realbox-height);
+ width: 337px;
+ }
+
+ :host([matches-are-visible]) {
+ box-shadow: none;
+ }
+
+ @media (min-width: 560px) {
+ :host {
+ width: 449px;
+ }
+ }
+
+ @media (min-width: 672px) {
+ :host {
+ width: 561px;
+ }
+ }
+
+ #inputWrapper {
+ height: 100%;
+ position: relative;
+ }
+
+ input {
+ background-color: var(--search-box-bg, white);
+ border-radius: calc(0.5 * var(--ntp-realbox-height));
+ border: none;
+ color: var(--search-box-text);
+ font-size: 16px;
+ height: 100%;
+ outline: none;
+ padding-inline-end: 40px;
+ padding-inline-start: 52px;
+ position: relative;
+ width: 100%;
+ }
+
+ input::-webkit-search-decoration,
+ input::-webkit-search-cancel-button,
+ input::-webkit-search-results-button,
+ input::-webkit-search-results-decoration {
+ display: none;
+ }
+
+ input::placeholder {
+ color: var(--search-box-placeholder, var(--google-grey-refresh-700));
+ }
+
+ input:focus::placeholder {
+ color: transparent;
+ }
+
+ input:focus,
+ :host([matches-are-visible]) input {
+ background-color: var(--search-box-results-bg, white);
+ }
+
+ ntp-realbox-icon {
+ height: 100%;
+ left: 12px;
+ position: absolute;
+ top: 0;
+ }
+
+ :host-context([dir='rtl']) ntp-realbox-icon {
+ left: unset;
+ right: 12px;
+ }
+
+ #voiceSearchButton {
+ background: url(icons/googlemic_clr_24px.svg) no-repeat center;
+ background-size: 21px 21px;
+ border: none;
+ border-radius: 2px;
+ cursor: pointer;
+ height: 100%;
+ outline: none;
+ padding: 0;
+ pointer-events: auto;
+ position: absolute;
+ right: 16px;
+ width: 26px;
+ }
+
+ :host-context([dir='rtl']) #voiceSearchButton {
+ left: 16px;
+ right: unset;
+ }
+
+ :host-context(.focus-outline-visible) #voiceSearchButton:focus {
+ box-shadow: var(--ntp-focus-shadow);
+ }
+
+ :-webkit-any(input, ntp-realbox-icon, #voiceSearchButton) {
+ z-index: 2;
+ }
+
+ ntp-realbox-dropdown {
+ border-radius: calc(0.25 * var(--ntp-realbox-height));
+ box-shadow: 0 1px 6px 0 rgba(32, 33, 36, .28);
+ left: 0;
+ padding-bottom: 8px;
+ padding-top: var(--ntp-realbox-height);
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 1;
+ }
+</style>
+<div id="inputWrapper" on-focusout=onInputWrapperFocusout_
+ on-keydown="onInputWrapperKeydown_">
+ <input id="input" type="search" autocomplete="off" spellcheck="false"
+ aria-live="polite" placeholder="$i18n{searchBoxHint}"
+ on-copy="onInputCutCopy_" on-cut="onInputCutCopy_"
+ on-focus="onInputFocus_" on-input="onInputInput_"
+ on-keydown="onInputKeydown_" on-keyup="onInputKeyup_"
+ on-mousedown="onInputMouseDown_" on-paste="onInputPaste_">
+ <ntp-realbox-icon id="icon" match="[[selectedMatch_]]"
+ default-icon="[[realboxIcon_]]" in-searchbox>
+ </ntp-realbox-icon>
+ <button id="voiceSearchButton" on-click="onVoiceSearchClick_"
+ title="$i18n{voiceSearchButtonLabel}">
+ </button>
+ <ntp-realbox-dropdown id="matches" role="listbox" theme="[[theme]]"
+ result="[[result_]]" selected-match-index="{{selectedMatchIndex_}}"
+ on-result-repaint="onResultRepaint_" on-match-focusin="onMatchFocusin_"
+ on-match-click="onMatchClick_" on-match-remove="onMatchRemove_"
+ hidden$="[[!matchesAreVisible]]">
+ </ntp-realbox-dropdown>
+</div>
diff --git a/chromium/chrome/browser/resources/new_tab_page/realbox.js b/chromium/chrome/browser/resources/new_tab_page/realbox.js
new file mode 100644
index 00000000000..9ab63767a23
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/realbox.js
@@ -0,0 +1,730 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './strings.m.js';
+import './realbox_dropdown.js';
+import './realbox_icon.js';
+
+import {assert} from 'chrome://resources/js/assert.m.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {BrowserProxy} from './browser_proxy.js';
+import {decodeString16, mojoString16, mojoTimeDelta, skColorToRgba} from './utils.js';
+
+/** @typedef {{text: string, inline: string,}} */
+let Input;
+
+/**
+ * @typedef {{
+ * text: (string|undefined),
+ * inline: (string|undefined),
+ * moveCursorToEnd: (boolean|undefined),
+ * }}
+ */
+let InputUpdate;
+
+// A real search box that behaves just like the Omnibox.
+class RealboxElement extends PolymerElement {
+ static get is() {
+ return 'ntp-realbox';
+ }
+
+ static get template() {
+ return html`{__html_template__}`;
+ }
+
+ static get properties() {
+ return {
+ //========================================================================
+ // Public properties
+ //========================================================================
+
+ /**
+ * Whether matches are currently visible.
+ * @type {boolean}
+ */
+ matchesAreVisible: {
+ type: Boolean,
+ value: false,
+ reflectToAttribute: true,
+ },
+
+ /**
+ * @type {!newTabPage.mojom.SearchBoxTheme}
+ */
+ theme: {
+ type: Object,
+ observer: 'onThemeChange_',
+ },
+
+ //========================================================================
+ // Private properties
+ //========================================================================
+
+ /**
+ * The time of the first character insert operation that has not yet been
+ * painted in milliseconds. Used to measure the realbox responsiveness.
+ * @type {number}
+ * @private
+ */
+ charTypedTime_: {
+ type: Number,
+ value: 0,
+ },
+
+ /**
+ * Whether user is deleting text in the input. Used to prevent the default
+ * match from offering inline autocompletion.
+ * @type {boolean}
+ * @private
+ */
+ isDeletingInput_: {
+ type: Boolean,
+ value: false,
+ },
+
+ /**
+ * The 'Enter' keydown event that was ignored due to matches being stale.
+ * Used to navigate to the default match once up-to-date matches arrive.
+ * @type {?Event}
+ * @private
+ */
+ lastIgnoredEnterEvent_: {
+ type: Object,
+ value: null,
+ },
+
+ /**
+ * Last state of the input (text and inline autocompletion). Updated
+ * by the user input or by the currently selected autocomplete match.
+ * @type {!Input}
+ * @private
+ */
+ lastInput_: {
+ type: Object,
+ value: {text: '', inline: ''},
+ },
+
+ /**
+ * The time at which the input was last focused in milliseconds. Passed to
+ * the browser when navigating to a match.
+ * @type {?number}
+ * @private
+ */
+ lastInputFocusTime_: {
+ type: Number,
+ value: null,
+ },
+
+ /**
+ * The last queried input text.
+ * @type {?string}
+ * @private
+ */
+ lastQueriedInput_: {
+ type: String,
+ value: null,
+ },
+
+ /**
+ * True if user just pasted into the input. Used to prevent the default
+ * match from offering inline autocompletion.
+ * @type {boolean}
+ * @private
+ */
+ pastedInInput_: {
+ type: Boolean,
+ value: false,
+ },
+
+ /**
+ * Realbox default icon (i.e., Google G icon or the search loupe).
+ * @private
+ */
+ realboxIcon_: {
+ type: String,
+ value: () => loadTimeData.getString('realboxDefaultIcon'),
+ },
+
+ /**
+ * @type {?search.mojom.AutocompleteResult}
+ * @private
+ */
+ result_: {
+ type: Object,
+ },
+
+ /**
+ * The currently selected match, if any.
+ * @type {?search.mojom.AutocompleteMatch}
+ * @private
+ */
+ selectedMatch_: {
+ type: Object,
+ computed: `computeSelectedMatch_(result_, selectedMatchIndex_)`,
+ },
+
+ /**
+ * Index of the currently selected match, if any.
+ * Do not modify this. Use <ntp-realbox-dropdown> API to change selection.
+ * @type {number}
+ * @private
+ */
+ selectedMatchIndex_: {
+ type: Number,
+ value: -1,
+ },
+ };
+ }
+
+ constructor() {
+ performance.mark('realbox-creation-start');
+ super();
+ /** @private {newTabPage.mojom.PageHandlerRemote} */
+ this.pageHandler_ = BrowserProxy.getInstance().handler;
+ /** @private {!newTabPage.mojom.PageCallbackRouter} */
+ this.callbackRouter_ = BrowserProxy.getInstance().callbackRouter;
+ /** @private {?number} */
+ this.autocompleteResultChangedListenerId_ = null;
+ /** @private {?number} */
+ this.autocompleteMatchImageAvailableListenerId_ = null;
+ }
+
+ /** @override */
+ connectedCallback() {
+ super.connectedCallback();
+ this.autocompleteResultChangedListenerId_ =
+ this.callbackRouter_.autocompleteResultChanged.addListener(
+ this.onAutocompleteResultChanged_.bind(this));
+ this.autocompleteMatchImageAvailableListenerId_ =
+ this.callbackRouter_.autocompleteMatchImageAvailable.addListener(
+ this.onAutocompleteMatchImageAvailable_.bind(this));
+ }
+
+ /** @override */
+ disconnectedCallback() {
+ super.disconnectedCallback();
+ this.callbackRouter_.removeListener(
+ assert(this.autocompleteResultChangedListenerId_));
+ this.callbackRouter_.removeListener(
+ assert(this.autocompleteMatchImageAvailableListenerId_));
+ }
+
+ /** @override */
+ ready() {
+ super.ready();
+ performance.measure('realbox-creation', 'realbox-creation-start');
+ }
+
+ //============================================================================
+ // Callbacks
+ //============================================================================
+
+ /**
+ * @param {number} matchIndex match index
+ * @param {!url.mojom.Url} url match imageUrl or destinationUrl.
+ * @param {string} dataUrl match image or favicon content in in base64 encoded
+ * Data URL format.
+ * @private
+ */
+ onAutocompleteMatchImageAvailable_(matchIndex, url, dataUrl) {
+ if (!this.result_ || !this.result_.matches) {
+ return;
+ }
+
+ const match = this.result_.matches[matchIndex];
+ if (!match || this.selectedMatchIndex_ !== matchIndex) {
+ return;
+ }
+
+ // Set favicon content of the selected match, if applicable.
+ if (match.destinationUrl.url === url.url) {
+ /** @suppress {checkTypes} */
+ match.faviconDataUrl = dataUrl;
+ this.notifyPath('selectedMatch_.faviconDataUrl');
+ }
+ }
+
+ /**
+ * @private
+ * @param {search.mojom.AutocompleteResult} result
+ */
+ onAutocompleteResultChanged_(result) {
+ if (this.lastQueriedInput_ === null ||
+ this.lastQueriedInput_.trimLeft() !== decodeString16(result.input)) {
+ return; // Stale result; ignore.
+ }
+
+ this.result_ = result;
+ const hasMatches = result && result.matches && result.matches.length > 0;
+ this.matchesAreVisible = hasMatches;
+
+ this.$.input.focus();
+
+ const firstMatch = hasMatches ? this.result_.matches[0] : null;
+ if (firstMatch && firstMatch.allowedToBeDefaultMatch) {
+ this.$.matches.selectFirst();
+ this.updateInput_(
+ {inline: decodeString16(firstMatch.inlineAutocompletion)});
+
+ // Navigate to the default up-to-date match if the user typed and pressed
+ // 'Enter' too fast.
+ if (this.lastIgnoredEnterEvent_) {
+ this.navigateToMatch_(0, this.lastIgnoredEnterEvent_);
+ this.lastIgnoredEnterEvent_ = null;
+ }
+ } else if (
+ hasMatches && this.selectedMatchIndex_ !== -1 &&
+ this.selectedMatchIndex_ < this.result_.matches.length) {
+ // Restore the selection, if any.
+ this.$.matches.selectIndex(this.selectedMatchIndex_);
+ this.updateInput_({
+ text: decodeString16(this.selectedMatch_.fillIntoEdit),
+ inline: '',
+ moveCursorToEnd: true
+ });
+ } else {
+ this.$.matches.unselect();
+ this.updateInput_({
+ inline: '',
+ });
+ }
+ }
+
+ /**
+ * @private
+ */
+ onThemeChange_() {
+ if (!loadTimeData.getBoolean('realboxMatchOmniboxTheme')) {
+ return;
+ }
+
+ this.updateStyles({
+ '--search-box-bg': skColorToRgba(assert(this.theme.bg)),
+ '--search-box-placeholder': skColorToRgba(assert(this.theme.placeholder)),
+ '--search-box-results-bg': skColorToRgba(assert(this.theme.resultsBg)),
+ '--search-box-text': skColorToRgba(assert(this.theme.text)),
+ '--search-box-icon': skColorToRgba(assert(this.theme.icon)),
+ });
+ }
+
+ //============================================================================
+ // Event handlers
+ //============================================================================
+
+ /**
+ * @param {!Event} e
+ * @private
+ */
+ onInputCutCopy_(e) {
+ // Only handle cut/copy when input has content and it's all selected.
+ if (!this.$.input.value || this.$.input.selectionStart !== 0 ||
+ this.$.input.selectionEnd !== this.$.input.value.length ||
+ !this.result_ || this.result_.matches.length === 0) {
+ return;
+ }
+
+ if (this.selectedMatch_ && !this.selectedMatch_.isSearchType) {
+ e.clipboardData.setData(
+ 'text/plain', this.selectedMatch_.destinationUrl.url);
+ e.preventDefault();
+ if (e.type === 'cut') {
+ this.$.input.value = '';
+ }
+ }
+ }
+
+ /**
+ * @private
+ */
+ onInputFocus_() {
+ this.lastInputFocusTime_ = window.performance.now();
+ }
+
+ /**
+ * @private
+ */
+ onInputInput_() {
+ const inputValue = this.$.input.value;
+ this.updateInput_({text: inputValue, inline: ''});
+
+ const charTyped = !this.isDeletingInput_ && !!inputValue.trim();
+ // If a character has been typed, update |charTypedTime_|. Otherwise reset
+ // it. If |charTypedTime_| is not 0, there's a pending typed character for
+ // which the results have not been painted yet. In that case, keep the
+ // earlier time.
+ this.charTypedTime_ =
+ charTyped ? this.charTypedTime_ || window.performance.now() : 0;
+
+ if (inputValue.trim()) {
+ this.queryAutocomplete_(inputValue);
+ } else {
+ this.matchesAreVisible = false;
+ this.clearAutocompleteMatches_();
+ }
+
+ this.pastedInInput_ = false;
+ }
+
+ /**
+ * @param {Event} e
+ * @private
+ */
+ onInputKeydown_(e) {
+ // Ignore this event if the input does not have any inline autocompletion.
+ if (!this.lastInput_.inline) {
+ return;
+ }
+
+ const inputValue = this.$.input.value;
+ const inputSelection = inputValue.substring(
+ this.$.input.selectionStart, this.$.input.selectionEnd);
+ const lastInputValue = this.lastInput_.text + this.lastInput_.inline;
+ // If the current input state (its value and selection) matches its last
+ // state (text and inline autocompletion) and the user types the next
+ // character in the inline autocompletion, stop the keydown event. Just move
+ // the selection and requery autocomplete. This is needed to avoid flicker.
+ if (inputSelection === this.lastInput_.inline &&
+ inputValue === lastInputValue &&
+ this.lastInput_.inline[0].toLocaleLowerCase() ===
+ e.key.toLocaleLowerCase()) {
+ this.updateInput_({
+ text: assert(this.lastInput_.text + e.key),
+ inline: this.lastInput_.inline.substr(1),
+ });
+
+ // If |charTypedTime_| is not 0, there's a pending typed character for
+ // which the results have not been painted yet. In that case, keep the
+ // earlier time.
+ this.charTypedTime_ = this.charTypedTime_ || window.performance.now();
+
+ this.queryAutocomplete_(this.lastInput_.text);
+ e.preventDefault();
+ }
+ }
+
+ /**
+ * @param {Event} e
+ * @private
+ */
+ onInputKeyup_(e) {
+ if (e.key !== 'Tab') {
+ return;
+ }
+
+ // Query for zero-prefix matches if user is tabbing into an empty input.
+ if (!this.$.input.value) {
+ this.queryAutocomplete_('');
+ }
+ }
+
+ /**
+ * @param {Event} e
+ * @private
+ */
+ onInputMouseDown_(e) {
+ if (e.button !== 0) {
+ // Only handle main (generally left) button presses.
+ return;
+ }
+ if (!this.$.input.value) {
+ this.queryAutocomplete_('');
+ }
+ }
+
+ /**
+ * @param {Event} e
+ * @private
+ */
+ onInputPaste_(e) {
+ this.pastedInInput_ = true;
+ }
+
+ /**
+ * @param {Event} e
+ * @private
+ */
+ onInputWrapperFocusout_(e) {
+ // Hide the matches and stop autocomplete only when the focus goes outside
+ // of the realbox wrapper.
+ const relatedTarget = /** @type {Element} */ (e.relatedTarget);
+ if (!this.$.inputWrapper.contains(relatedTarget)) {
+ // Unselect the selected match and clear the input if the input was empty
+ // when the matches arrived.
+ if (this.lastQueriedInput_ === '') {
+ this.$.matches.unselect();
+ this.updateInput_({text: '', inline: ''});
+ }
+ this.matchesAreVisible = false;
+
+ // Stop autocomplete but leave (potentially stale) results and continue
+ // listening for key presses. These stale results should never be shown.
+ // They correspond to the potentially stale suggestion left in the realbox
+ // when blurred. That stale result may be navigated to by focusing and
+ // pressing 'Enter'.
+ this.pageHandler_.stopAutocomplete(/*clearResult=*/ false);
+ }
+ }
+
+ /**
+ * @param {Event} e
+ * @private
+ */
+ onInputWrapperKeydown_(e) {
+ const KEYDOWN_HANDLED_KEYS = [
+ 'ArrowDown',
+ 'ArrowUp',
+ 'Delete',
+ 'Enter',
+ 'Escape',
+ 'PageDown',
+ 'PageUp',
+ ];
+ if (!KEYDOWN_HANDLED_KEYS.includes(e.key)) {
+ return;
+ }
+
+ if (e.defaultPrevented) {
+ // Ignore previousely handled events.
+ return;
+ }
+
+ // ArrowUp/ArrowDown query autocomplete when matches are not visible.
+ if (!this.matchesAreVisible) {
+ if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {
+ const inputValue = this.$.input.value;
+ if (inputValue.trim() || !inputValue) {
+ this.queryAutocomplete_(inputValue);
+ }
+ e.preventDefault();
+ return;
+ }
+ }
+
+ // Do not handle the following keys if there are no matches available.
+ if (!this.result_ || this.result_.matches.length === 0) {
+ return;
+ }
+
+ if (e.key === 'Enter') {
+ if ([this.$.matches, this.$.input].includes(e.target)) {
+ if (this.lastQueriedInput_ === decodeString16(this.result_.input)) {
+ if (this.selectedMatch_) {
+ this.navigateToMatch_(this.selectedMatchIndex_, e);
+ }
+ } else {
+ // User typed and pressed 'Enter' too quickly. Ignore this for now
+ // because the matches are stale. Navigate to the default match (if
+ // one exists) once the up-to-date matches arrive.
+ this.lastIgnoredEnterEvent_ = e;
+ e.preventDefault();
+ }
+ }
+ return;
+ }
+
+ if (e.key === 'Delete') {
+ if (e.shiftKey && !e.altKey && !e.ctrlKey && !e.metaKey) {
+ if (this.selectedMatch_ && this.selectedMatch_.supportsDeletion) {
+ this.pageHandler_.deleteAutocompleteMatch(this.selectedMatchIndex_);
+ e.preventDefault();
+ }
+ }
+ return;
+ }
+
+ // Do not handle the following keys if there are key modifiers.
+ if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) {
+ return;
+ }
+
+ if (e.key === 'Escape' && this.selectedMatchIndex_ === 0) {
+ this.updateInput_({text: '', inline: ''});
+ this.matchesAreVisible = false;
+ this.clearAutocompleteMatches_();
+ e.preventDefault();
+ return;
+ }
+
+ if (e.key === 'ArrowDown') {
+ this.$.matches.selectNext();
+ } else if (e.key === 'ArrowUp') {
+ this.$.matches.selectPrevious();
+ } else if (e.key === 'Escape' || e.key === 'PageUp') {
+ this.$.matches.selectFirst();
+ } else if (e.key === 'PageDown') {
+ this.$.matches.selectLast();
+ }
+ e.preventDefault();
+
+ // Focus the selected match if focus is currently in the matches.
+ if (this.shadowRoot.activeElement === this.$.matches) {
+ this.$.matches.focusSelected();
+ }
+
+ // Update the input.
+ const newFill = decodeString16(this.selectedMatch_.fillIntoEdit);
+ const newInline = this.selectedMatch_.allowedToBeDefaultMatch ?
+ decodeString16(this.selectedMatch_.inlineAutocompletion) :
+ '';
+ const newFillEnd = newFill.length - newInline.length;
+ this.updateInput_({
+ text: assert(newFill.substr(0, newFillEnd)),
+ inline: newInline,
+ moveCursorToEnd: newInline.length === 0,
+ });
+ }
+
+ /**
+ * @param {!CustomEvent<{index: number, event:!MouseEvent}>} e Event
+ * containing index of the match that was clicked.
+ * @private
+ */
+ onMatchClick_(e) {
+ this.navigateToMatch_(e.detail.index, e.detail.event);
+ }
+
+ /**
+ * @param {!CustomEvent<number>} e Event containing index of the match that
+ * received focus.
+ * @private
+ */
+ onMatchFocusin_(e) {
+ // Select the match that received focus.
+ this.$.matches.selectIndex(e.detail);
+ // Input selection (if any) likely drops due to focus change. Simply fill
+ // the input with the match and move the cursor to the end.
+ this.updateInput_({
+ text: decodeString16(this.selectedMatch_.fillIntoEdit),
+ inline: '',
+ moveCursorToEnd: true
+ });
+ }
+
+ /**
+ * @param {!CustomEvent<number>} e Event containing index of the match that
+ * was removed.
+ * @private
+ */
+ onMatchRemove_(e) {
+ this.pageHandler_.deleteAutocompleteMatch(e.detail);
+ }
+
+ /**
+ * @param {!CustomEvent<number>} e Event containing the result repaint time.
+ * @private
+ */
+ onResultRepaint_(e) {
+ if (this.charTypedTime_) {
+ this.pageHandler_.logCharTypedToRepaintLatency(
+ mojoTimeDelta(e.detail - this.charTypedTime_));
+ this.charTypedTime_ = 0;
+ }
+ }
+
+ /** @private */
+ onVoiceSearchClick_() {
+ this.dispatchEvent(new Event('open-voice-search'));
+ }
+
+ //============================================================================
+ // Helpers
+ //============================================================================
+
+ /**
+ * @return {?search.mojom.AutocompleteMatch}
+ * @private
+ */
+ computeSelectedMatch_() {
+ if (!this.result_ || !this.result_.matches) {
+ return null;
+ }
+ return this.result_.matches[this.selectedMatchIndex_] || null;
+ }
+
+ /**
+ * Clears the autocomplete result on the page and on the autocomplete backend.
+ * @private
+ */
+ clearAutocompleteMatches_() {
+ this.result_ = null;
+ this.$.matches.unselect();
+ this.pageHandler_.stopAutocomplete(/*clearResult=*/ true);
+ // Autocomplete sends updates once it is stopped. Invalidate those results
+ // by setting the |this.lastQueriedInput_| to its default value.
+ this.lastQueriedInput_ = null;
+ }
+
+ /**
+ * @param {number} matchIndex
+ * @param {!Event} e
+ * @private
+ */
+ navigateToMatch_(matchIndex, e) {
+ assert(matchIndex >= 0);
+ const match = assert(this.result_.matches[matchIndex]);
+ assert(this.lastInputFocusTime_);
+ const delta =
+ mojoTimeDelta(window.performance.now() - this.lastInputFocusTime_);
+ this.pageHandler_.openAutocompleteMatch(
+ matchIndex, match.destinationUrl, this.matchesAreVisible, delta,
+ e.button || 0, e.altKey, e.ctrlKey, e.metaKey, e.shiftKey);
+ e.preventDefault();
+ }
+
+ /**
+ * @param {string} input
+ * @private
+ */
+ queryAutocomplete_(input) {
+ this.lastQueriedInput_ = input;
+
+ const caretNotAtEnd = this.$.input.selectionStart !== input.length;
+ const preventInlineAutocomplete =
+ this.isDeletingInput_ || this.pastedInInput_ || caretNotAtEnd;
+ this.pageHandler_.queryAutocomplete(
+ mojoString16(input), preventInlineAutocomplete);
+ }
+
+ /**
+ * Updates the input state (text and inline autocompletion) with |update|.
+ * @param {!InputUpdate} update
+ * @private
+ */
+ updateInput_(update) {
+ const newInput =
+ /** @type {!Input} */ (Object.assign({}, this.lastInput_, update));
+ const newInputValue = newInput.text + newInput.inline;
+ const lastInputValue = this.lastInput_.text + this.lastInput_.inline;
+
+ const inlineDiffers = newInput.inline !== this.lastInput_.inline;
+ const preserveSelection = !inlineDiffers && !update.moveCursorToEnd;
+ let needsSelectionUpdate = !preserveSelection;
+
+ const oldSelectionStart = this.$.input.selectionStart;
+ const oldSelectionEnd = this.$.input.selectionEnd;
+
+ if (newInputValue !== this.$.input.value) {
+ this.$.input.value = newInputValue;
+ needsSelectionUpdate = true; // Setting .value blows away selection.
+ }
+
+ if (newInputValue.trim() && needsSelectionUpdate) {
+ // If the cursor is to be moved to the end (implies selection should not
+ // be perserved), set the selection start to same as the selection end.
+ this.$.input.selectionStart = preserveSelection ?
+ oldSelectionStart :
+ update.moveCursorToEnd ? newInputValue.length : newInput.text.length;
+ this.$.input.selectionEnd =
+ preserveSelection ? oldSelectionEnd : newInputValue.length;
+ }
+
+ this.isDeletingInput_ = lastInputValue.length > newInputValue.length &&
+ lastInputValue.startsWith(newInputValue);
+ this.lastInput_ = newInput;
+ }
+}
+
+customElements.define(RealboxElement.is, RealboxElement);
diff --git a/chromium/chrome/browser/resources/new_tab_page/realbox_button.html b/chromium/chrome/browser/resources/new_tab_page/realbox_button.html
new file mode 100644
index 00000000000..63dad83da38
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/realbox_button.html
@@ -0,0 +1,54 @@
+<style>
+ :host {
+ align-items: center;
+ border-radius: 50%;
+ display: flex;
+ flex-shrink: 0;
+ height: 24px;
+ justify-content: center;
+ outline: none;
+ width: 24px;
+ }
+
+ :host([hidden]) {
+ display: none;
+ }
+
+ :host(:hover) {
+ background-color: var(--search-box-icon-bg-hovered, rgba(var(--google-grey-900-rgb), .16));
+ }
+
+ :host(:focus-within) {
+ background-color: var(--search-box-icon-bg-focused, rgba(var(--google-grey-900-rgb), .32));
+ }
+
+ #icon {
+ -webkit-mask-image: url(chrome://resources/images/icon_clear.svg);
+ -webkit-mask-position: center;
+ -webkit-mask-repeat: no-repeat;
+ -webkit-mask-size: 16px;
+ height: 100%;
+ width: 100%;
+ }
+
+ :host-context(.header) #icon {
+ -webkit-mask-image: url(icons/chevron.svg);
+ -webkit-transform: rotate(180deg);
+ background-color: var(--search-box-icon, var(--google-grey-900));
+ }
+
+ :host-context(.header[group-is-hidden]) #icon {
+ -webkit-transform: none;
+ }
+
+ :host-context(ntp-realbox-match:hover) #icon {
+ background-color: var(--search-box-icon, var(--google-grey-900));
+ }
+
+ :host-context(ntp-realbox-match:-webkit-any(:focus-within, .selected)) #icon,
+ :host-context(.header:focus-within) #icon {
+ background-color: var(--search-box-icon-selected, var(--google-grey-900));
+ }
+</style>
+<div id="icon"></div>
+
diff --git a/chromium/chrome/browser/resources/new_tab_page/realbox_button.js b/chromium/chrome/browser/resources/new_tab_page/realbox_button.js
new file mode 100644
index 00000000000..e15cea1144b
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/realbox_button.js
@@ -0,0 +1,38 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './strings.m.js';
+
+import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+// The RHS action button. Used on autocomplete matches as the remove button as
+// well as on suggestion group headers as the toggle button.
+class RealboxButtonElement extends PolymerElement {
+ static get is() {
+ return 'ntp-realbox-button';
+ }
+
+ static get template() {
+ return html`{__html_template__}`;
+ }
+
+ ready() {
+ super.ready();
+
+ this.addEventListener('mousedown', this.onMouseDown_.bind(this));
+ }
+
+ //============================================================================
+ // Event handlers
+ //============================================================================
+
+ /**
+ * @param {!Event} e
+ */
+ onMouseDown_(e) {
+ e.preventDefault(); // Prevents default browser action (focus).
+ }
+}
+
+customElements.define(RealboxButtonElement.is, RealboxButtonElement);
diff --git a/chromium/chrome/browser/resources/new_tab_page/realbox_dropdown.html b/chromium/chrome/browser/resources/new_tab_page/realbox_dropdown.html
new file mode 100644
index 00000000000..f8fbddc2cb1
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/realbox_dropdown.html
@@ -0,0 +1,89 @@
+<style>
+ :host {
+ background-color: var(--search-box-results-bg, white);
+ overflow: hidden;
+ }
+
+ @media (min-width: 560px) {
+ :host {
+ width: 449px;
+ }
+ }
+
+ @media (min-width: 672px) {
+ :host {
+ width: 561px;
+ }
+ }
+
+ ntp-realbox-match {
+ color: var(--search-box-results-text);
+ }
+
+ .header {
+ align-items: center;
+ display: flex;
+ justify-content: space-between;
+ margin-top: 8px;
+ outline: none;
+ padding-bottom: 4px;
+ padding-inline-end: 16px;
+ padding-inline-start: 12px;
+ padding-top: 4px;
+ }
+
+ .header .text {
+ color: var(--google-grey-refresh-700);
+ cursor: default;
+ font-size: 13px;
+ font-weight: 500;
+ line-height: 16px;
+ overflow: hidden;
+ padding-inline-end: 8px;
+ text-overflow: ellipsis;
+ text-transform: uppercase;
+ user-select: none;
+ white-space: nowrap;
+ }
+
+ ntp-realbox-match:hover,
+ .header:hover {
+ background-color: var(--search-box-results-bg-hovered, rgba(var(--google-grey-900-rgb), .1));
+ }
+
+ ntp-realbox-match:-webkit-any(:focus-within, .selected),
+ .header:focus-within:not(:focus) {
+ background-color: var(--search-box-results-bg-selected, rgba(var(--google-grey-900-rgb), .16));
+ color: var(--search-box-results-text-selected, var(--google-grey-900));
+ }
+</style>
+<iron-selector id="selector" selectable="ntp-realbox-match"
+ items="{{selectableMatchElements_}}" selected="{{selectedMatchIndex}}"
+ selected-class="selected">
+ <template is="dom-repeat" items="[[groupIds_]]" as="groupId">
+ <template is="dom-if" if="[[groupHasHeader_(groupId)]]">
+ <!-- Header cannot be tabbed into but gets focus when clicked. This stops
+ the dropdown from losing focus and closing as a result. -->
+ <div class="header" tabindex="-1" on-focusin="onHeaderFocusin_"
+ aria-hidden="true"
+ group-is-hidden$="[[groupIsHidden_(groupId, hiddenGroupIds_.*)]]">
+ <span class="text">[[headerForGroup_(groupId)]]</span>
+ <ntp-realbox-button data-id$="[[groupId]]" tabindex="0" role="button"
+ title="[[toggleButtonTitleForGroup_(groupId, hiddenGroupIds_.*)]]"
+ aria-label$="[[toggleButtonA11yLabelForGroup_(groupId, hiddenGroupIds_.*)]]"
+ on-click="onToggleButtonClick_" on-keydown="onToggleButtonKeydown_">
+ </ntp-realbox-button>
+ </div>
+ </template>
+ <template is="dom-if" if="[[!groupIsHidden_(groupId, hiddenGroupIds_.*)]]"
+ restamp>
+ <template is="dom-repeat" items="[[result.matches]]"
+ filter="[[computeMatchBelongsToGroup_(groupId)]]"
+ on-dom-change="onResultRepaint_">
+ <ntp-realbox-match tabindex="0" role="option" match="[[item]]"
+ match-index="[[matchIndex_(item)]]">
+ </ntp-realbox-match>
+ </template>
+ </template>
+ <template>
+</iron-selector>
diff --git a/chromium/chrome/browser/resources/new_tab_page/realbox_dropdown.js b/chromium/chrome/browser/resources/new_tab_page/realbox_dropdown.js
new file mode 100644
index 00000000000..7d902a2cdfb
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/realbox_dropdown.js
@@ -0,0 +1,438 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './strings.m.js';
+import './realbox_button.js';
+import './realbox_match.js';
+
+import {assert} from 'chrome://resources/js/assert.m.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {BrowserProxy} from './browser_proxy.js';
+import {decodeString16, skColorToRgba} from './utils.js';
+
+/**
+ * Indicates a missing suggestion group Id. Based on
+ * SearchSuggestionParser::kNoSuggestionGroupId.
+ * @type {string}
+ */
+export const NO_SUGGESTION_GROUP_ID = '-1';
+
+// A dropdown element that contains autocomplete matches. Provides an API for
+// the embedder (i.e., <ntp-realbox>) to change the selection.
+class RealboxDropdownElement extends PolymerElement {
+ static get is() {
+ return 'ntp-realbox-dropdown';
+ }
+
+ static get template() {
+ return html`{__html_template__}`;
+ }
+
+ static get properties() {
+ return {
+ //========================================================================
+ // Public properties
+ //========================================================================
+
+ /**
+ * @type {!search.mojom.AutocompleteResult}
+ */
+ result: {
+ type: Object,
+ },
+
+ /**
+ * Index of the selected match.
+ * @type {number}
+ */
+ selectedMatchIndex: {
+ type: Number,
+ value: -1,
+ notify: true,
+ },
+
+ /**
+ * @type {!newTabPage.mojom.SearchBoxTheme}
+ */
+ theme: {
+ type: Object,
+ observer: 'onThemeChange_',
+ },
+
+ //========================================================================
+ // Private properties
+ //========================================================================
+
+ /**
+ * The list of suggestion group IDs matches belong to.
+ * @type {!Array<string>}
+ * @private
+ */
+ groupIds_: {
+ type: Array,
+ computed: `computeGroupIds_(result)`,
+ },
+
+ /**
+ * The list of suggestion group IDs whose matches should be hidden.
+ * @type {!Array<string>}
+ * @private
+ */
+ hiddenGroupIds_: {
+ type: Array,
+ computed: `computeHiddenGroupIds_(result)`,
+ },
+
+ /**
+ * The list of selectable match elements.
+ * @type {!Array<!Element>}
+ * @private
+ */
+ selectableMatchElements_: {
+ type: Array,
+ value: () => [],
+ },
+ };
+ }
+
+ constructor() {
+ super();
+ /** @private {!newTabPage.mojom.PageCallbackRouter} */
+ this.callbackRouter_ = BrowserProxy.getInstance().callbackRouter;
+ /** @private {newTabPage.mojom.PageHandlerRemote} */
+ this.pageHandler_ = BrowserProxy.getInstance().handler;
+ /** @private {?number} */
+ this.autocompleteMatchImageAvailableListenerId_ = null;
+ }
+
+ /** @override */
+ connectedCallback() {
+ super.connectedCallback();
+ this.autocompleteMatchImageAvailableListenerId_ =
+ this.callbackRouter_.autocompleteMatchImageAvailable.addListener(
+ this.onAutocompleteMatchImageAvailable_.bind(this));
+ }
+
+ /** @override */
+ disconnectedCallback() {
+ super.disconnectedCallback();
+ this.callbackRouter_.removeListener(
+ assert(this.autocompleteMatchImageAvailableListenerId_));
+ }
+
+ //============================================================================
+ // Public methods
+ //============================================================================
+
+ /**
+ * Unselects the currently selected match, if any.
+ */
+ unselect() {
+ this.selectedMatchIndex = -1;
+ }
+
+ /**
+ * Focuses the selected match, if any.
+ */
+ focusSelected() {
+ if (this.$.selector.selectedItem) {
+ this.$.selector.selectedItem.focus();
+ }
+ }
+
+ /**
+ * Selects the first match.
+ */
+ selectFirst() {
+ this.selectedMatchIndex = 0;
+ }
+
+ /**
+ * Selects the match at the given index.
+ * @param {number} index
+ */
+ selectIndex(index) {
+ this.selectedMatchIndex = index;
+ }
+
+ /**
+ * Selects the previous match with respect to the currently selected one.
+ * Selects the last match if the first one is currently selected.
+ */
+ selectPrevious() {
+ this.selectedMatchIndex = this.selectedMatchIndex - 1 >= 0 ?
+ this.selectedMatchIndex - 1 :
+ this.selectableMatchElements_.length - 1;
+ }
+
+ /**
+ * Selects the last match.
+ */
+ selectLast() {
+ this.selectedMatchIndex = this.selectableMatchElements_.length - 1;
+ }
+
+ /**
+ * Selects the next match with respect to the currently selected one.
+ * Selects the first match if the last one is currently selected.
+ */
+ selectNext() {
+ this.selectedMatchIndex =
+ this.selectedMatchIndex + 1 < this.selectableMatchElements_.length ?
+ this.selectedMatchIndex + 1 :
+ 0;
+ }
+
+ //============================================================================
+ // Callbacks
+ //============================================================================
+
+ /**
+ * @param {number} matchIndex match index
+ * @param {!url.mojom.Url} url match imageUrl or destinationUrl.
+ * @param {string} dataUrl match image or favicon content in in base64 encoded
+ * Data URL format.
+ * @private
+ */
+ onAutocompleteMatchImageAvailable_(matchIndex, url, dataUrl) {
+ if (!this.result || !this.result.matches) {
+ return;
+ }
+
+ const match = this.result.matches[matchIndex];
+ if (!match) {
+ return;
+ }
+
+ // Set image or favicon content of the match, if applicable.
+ if (match.destinationUrl.url === url.url) {
+ this.set(`result.matches.${matchIndex}.faviconDataUrl`, dataUrl);
+ } else if (match.imageUrl === url.url) {
+ this.set(`result.matches.${matchIndex}.imageDataUrl`, dataUrl);
+ }
+ }
+
+ /**
+ * @private
+ */
+ onResultRepaint_() {
+ this.dispatchEvent(new CustomEvent('result-repaint', {
+ bubbles: true,
+ composed: true,
+ detail: window.performance.now(),
+ }));
+ }
+
+ /**
+ * @private
+ */
+ onThemeChange_() {
+ if (!loadTimeData.getBoolean('realboxMatchOmniboxTheme')) {
+ return;
+ }
+
+ const icon = assert(this.theme.icon);
+ // Icon's background color in a hovered context (0x29 == .16).
+ // TODO(crbug.com/1041129): Share this with the Omnibox.
+ const iconBgHovered = {value: icon.value & 0x29ffffff};
+
+ const iconSelected = assert(this.theme.iconSelected);
+ // Icon's background color in a focused context (0x52 == .32).
+ // TODO(crbug.com/1041129): Share this with the Omnibox.
+ const iconBgFocused = {value: iconSelected.value & 0x52ffffff};
+
+ this.updateStyles({
+ '--search-box-icon-bg-focused': skColorToRgba(iconBgFocused),
+ '--search-box-icon-bg-hovered': skColorToRgba(iconBgHovered),
+ '--search-box-icon-selected': skColorToRgba(iconSelected),
+ '--search-box-icon': skColorToRgba(icon),
+ '--search-box-results-bg-hovered':
+ skColorToRgba(assert(this.theme.resultsBgHovered)),
+ '--search-box-results-bg-selected':
+ skColorToRgba(assert(this.theme.resultsBgSelected)),
+ '--search-box-results-bg': skColorToRgba(assert(this.theme.resultsBg)),
+ '--search-box-results-dim-selected':
+ skColorToRgba(assert(this.theme.resultsDimSelected)),
+ '--search-box-results-dim': skColorToRgba(assert(this.theme.resultsDim)),
+ '--search-box-results-text-selected':
+ skColorToRgba(assert(this.theme.resultsTextSelected)),
+ '--search-box-results-text':
+ skColorToRgba(assert(this.theme.resultsText)),
+ '--search-box-results-url-selected':
+ skColorToRgba(assert(this.theme.resultsUrlSelected)),
+ '--search-box-results-url': skColorToRgba(assert(this.theme.resultsUrl)),
+ });
+ }
+
+ //============================================================================
+ // Event handlers
+ //============================================================================
+
+ /**
+ * @private
+ */
+ onHeaderFocusin_() {
+ // The header got focus. Unselect the selected match, if any.
+ this.unselect();
+ }
+
+ /**
+ * @param {!Event} e
+ * @private
+ */
+ onToggleButtonClick_(e) {
+ const groupId = e.target.dataset.id;
+
+ // Tell the backend to toggle visibility of the given suggestion group ID.
+ this.pageHandler_.toggleSuggestionGroupIdVisibility(groupId);
+
+ // Hide/Show matches with the given suggestion group ID.
+ const index = this.hiddenGroupIds_.indexOf(groupId);
+ if (index === -1) {
+ this.push('hiddenGroupIds_', groupId);
+ } else {
+ this.splice('hiddenGroupIds_', index, 1);
+ }
+ }
+
+ /**
+ * @param {!Event} e
+ * @private
+ */
+ onToggleButtonKeydown_(e) {
+ if (e.key !== 'Enter' && e.key !== ' ') {
+ return;
+ }
+
+ // Simulate a click so that it gets handled by |onToggleButtonClick_|.
+ e.target.click();
+ e.preventDefault(); // Prevents default browser action.
+ }
+
+ //============================================================================
+ // Helpers
+ //============================================================================
+
+ /**
+ * @returns {number} Index of the match in the autocomplete result. Passed to
+ * the match so it knows abut its position in the list of matches.
+ * @private
+ */
+ matchIndex_(match) {
+ if (!this.result || !this.result.matches) {
+ return -1;
+ }
+
+ return this.result.matches.indexOf(match);
+ }
+
+ /**
+ * @returns {!Array<string>}
+ * @private
+ */
+ computeGroupIds_() {
+ if (!this.result) {
+ return [];
+ }
+
+ // Add |NO_SUGGESTION_GROUP_ID| to the list of suggestion group IDs.
+ return [NO_SUGGESTION_GROUP_ID].concat(
+ Object.keys(this.result.suggestionGroupsMap));
+ }
+
+ /**
+ * @returns {!Array<string>}
+ * @private
+ */
+ computeHiddenGroupIds_() {
+ if (!this.result) {
+ return [];
+ }
+
+ return Object.keys(this.result.suggestionGroupsMap)
+ .filter((groupId => {
+ return this.result.suggestionGroupsMap[groupId].hidden;
+ }).bind(this));
+ }
+
+ /**
+ * @param {string} groupId
+ * @returns {!function(!search.mojom.AutocompleteMatch):boolean} The filter
+ * function to filter matches that belong to the given suggestion group
+ * ID.
+ * @private
+ */
+ computeMatchBelongsToGroup_(groupId) {
+ return (match) => {
+ return match.suggestionGroupId === Number(groupId);
+ };
+ }
+
+ /**
+ * @param {string} groupId
+ * @returns {boolean} Whether the given suggestion group ID has a header.
+ * @private
+ */
+ groupHasHeader_(groupId) {
+ return groupId !== NO_SUGGESTION_GROUP_ID;
+ }
+
+ /**
+ * @param {string} groupId
+ * @returns {boolean} Whether matches with the given suggestion group ID
+ * should be hidden.
+ * @private
+ */
+ groupIsHidden_(groupId) {
+ return this.hiddenGroupIds_.indexOf(groupId) !== -1;
+ }
+
+ /**
+ * @param {string} groupId
+ * @returns {string} The header for the given suggestion group ID.
+ * @private
+ * @suppress {checkTypes}
+ */
+ headerForGroup_(groupId) {
+ if (!this.groupHasHeader_(groupId)) {
+ return '';
+ }
+ return (this.result && this.result.suggestionGroupsMap &&
+ this.result.suggestionGroupsMap[groupId]) ?
+ decodeString16(this.result.suggestionGroupsMap[groupId].header) :
+ '';
+ }
+
+ /**
+ * @param {string} groupId
+ * @returns {string} Tooltip for suggestion group show/hide toggle button.
+ * @private
+ */
+ toggleButtonTitleForGroup_(groupId) {
+ if (!this.groupHasHeader_(groupId)) {
+ return '';
+ }
+ return loadTimeData.getString(
+ this.groupIsHidden_(groupId) ? 'showSuggestions' : 'hideSuggestions');
+ }
+
+ /**
+ * @param {string} groupId
+ * @returns {string} A11y label for suggestion group show/hide toggle button.
+ * @private
+ */
+ toggleButtonA11yLabelForGroup_(groupId) {
+ if (!this.groupHasHeader_(groupId)) {
+ return '';
+ }
+ return loadTimeData.substituteString(
+ loadTimeData.getString(
+ this.groupIsHidden_(groupId) ? 'showSection' : 'hideSection'),
+ this.headerForGroup_(groupId));
+ }
+}
+
+customElements.define(RealboxDropdownElement.is, RealboxDropdownElement);
diff --git a/chromium/chrome/browser/resources/new_tab_page/realbox_icon.html b/chromium/chrome/browser/resources/new_tab_page/realbox_icon.html
new file mode 100644
index 00000000000..4b2251a3d69
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/realbox_icon.html
@@ -0,0 +1,58 @@
+<style>
+ :host {
+ align-items: center;
+ display: flex;
+ flex-shrink: 0;
+ justify-content: center;
+ width: 32px;
+ }
+
+ #imageContainer {
+ align-items: center;
+ border-radius: 8px;
+ display: none;
+ height: 32px;
+ justify-content: center;
+ overflow: hidden;
+ width: 32px;
+ }
+
+ :host-context(ntp-realbox-match[has-image]) #imageContainer {
+ display: flex;
+ }
+
+ #image {
+ max-height: 32px;
+ max-width: 32px;
+ }
+
+ #icon {
+ -webkit-mask-position: center;
+ -webkit-mask-repeat: no-repeat;
+ -webkit-mask-size: 16px;
+ background-color: var(--search-box-icon, var(--google-grey-refresh-700));
+ background-position: center center;
+ background-repeat: no-repeat;
+ background-size: 16px;
+ height: 24px;
+ width: 24px;
+ }
+
+ :host-context(ntp-realbox-match[has-image]) #icon {
+ display: none;
+ }
+
+ :host([in-searchbox][background-image='google_g.png']) #icon {
+ background-size: 12px;
+ }
+
+ :host([in-searchbox][mask-image='search.svg']) #icon {
+ -webkit-mask-size: 20px; /* Loupe in realbox is larger than in matches. */
+ }
+</style>
+<div id="imageContainer" style$="[[imageContainerStyle_]]">
+ <image id="image" src$="[[imageSrc_]]"></image>
+</div>
+<div id="icon" style$="[[iconStyle_]]">
+</div>
+
diff --git a/chromium/chrome/browser/resources/new_tab_page/realbox_icon.js b/chromium/chrome/browser/resources/new_tab_page/realbox_icon.js
new file mode 100644
index 00000000000..6f534ed9fd5
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/realbox_icon.js
@@ -0,0 +1,190 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './strings.m.js';
+
+import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+const DOCUMENT_MATCH_TYPE = 'document';
+
+// The LHS icon. Used on autocomplete matches as well as the realbox input to
+// render icons, favicons, and entity images.
+class RealboxIconElement extends PolymerElement {
+ static get is() {
+ return 'ntp-realbox-icon';
+ }
+
+ static get template() {
+ return html`{__html_template__}`;
+ }
+
+ static get properties() {
+ return {
+ //========================================================================
+ // Public properties
+ //========================================================================
+
+ /**
+ * Used as a background image on #icon if non-empty.
+ * @type {string}
+ */
+ backgroundImage: {
+ type: String,
+ computed: `computeBackgroundImage_(match.faviconDataUrl, match)`,
+ reflectToAttribute: true,
+ },
+
+ /**
+ * The default icon to show when no match is selected and/or for
+ * non-navigation matches. Only set in the context of the realbox input.
+ * @type {string}
+ */
+ defaultIcon: {
+ type: String,
+ value: '',
+ },
+
+ /**
+ * Used as a mask image on #icon if |backgroundImage| is empty.
+ * @type {string}
+ */
+ maskImage: {
+ type: String,
+ computed: `computeMaskImage_(match)`,
+ reflectToAttribute: true,
+ },
+
+ /**
+ * @type {!search.mojom.AutocompleteMatch}
+ */
+ match: {
+ type: Object,
+ },
+
+ //========================================================================
+ // Private properties
+ //========================================================================
+
+ /**
+ * @type {string}
+ * @private
+ */
+ iconStyle_: {
+ type: String,
+ computed: `computeIconStyle_(backgroundImage, maskImage)`,
+ },
+
+ /**
+ * @type {string}
+ * @private
+ */
+ imageContainerStyle_: {
+ type: String,
+ computed: `computeImageContainerStyle_(imageSrc_, match)`,
+ },
+
+ /**
+ * @type {string}
+ * @private
+ */
+ imageSrc_: {
+ type: String,
+ computed: `computeImageSrc_(match.imageDataUrl, match)`,
+ },
+ };
+ }
+
+ //============================================================================
+ // Helpers
+ //============================================================================
+
+ /**
+ * @returns {string}
+ * @private
+ * @suppress {checkTypes}
+ */
+ computeBackgroundImage_() {
+ // If the match is a navigation one and has a favicon loaded, display that
+ // as background image. Otherwise, display the colored SVG icon for
+ // 'document' matches.
+ // If 'google_g' is the default icon, display that as background image when
+ // there is no match or the match is not a navigation one. Otherwise, don't
+ // use a background image (use a mask image instead).
+ if (this.match && !this.match.isSearchType) {
+ if (this.match.faviconDataUrl) {
+ return this.match.faviconDataUrl;
+ } else if (this.match.type === DOCUMENT_MATCH_TYPE) {
+ return this.match.iconUrl;
+ } else {
+ return '';
+ }
+ } else if (this.defaultIcon === 'google_g.png') {
+ return this.defaultIcon;
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * @returns {string}
+ * @private
+ */
+ computeMaskImage_() {
+ // Use the match icon if available. Otherwise use the default icon.
+ if (this.match) {
+ return this.match.iconUrl;
+ } else {
+ return this.defaultIcon;
+ }
+ }
+
+ /**
+ * @returns {string}
+ * @private
+ */
+ computeIconStyle_() {
+ // Use a background image if applicabale. Otherwise use a mask image.
+ if (this.backgroundImage) {
+ return `background-image: url(${this.backgroundImage});` +
+ `background-color: transparent;`;
+ } else {
+ return `-webkit-mask-image: url(${this.maskImage});`;
+ }
+ }
+
+ /**
+ * @returns {string}
+ * @private
+ */
+ computeImageContainerStyle_() {
+ // Show a background color until the image loads.
+ return (this.match && this.match.imageDominantColor && !this.imageSrc_) ?
+ // .25 opacity matching c/b/u/views/omnibox/omnibox_match_cell_view.cc.
+ `background-color: ${this.match.imageDominantColor}40;` :
+ 'background-color: transparent;';
+ }
+
+ /**
+ * @returns {string}
+ * @private
+ * @suppress {checkTypes}
+ */
+ computeImageSrc_() {
+ if (!this.match) {
+ return '';
+ }
+
+ if (this.match.imageDataUrl) {
+ return this.match.imageDataUrl;
+ } else if (
+ this.match.imageUrl && this.match.imageUrl.startsWith('data:image/')) {
+ // zero-prefix matches come with the image content in |match.imageUrl|.
+ return this.match.imageUrl;
+ } else {
+ return '';
+ }
+ }
+}
+
+customElements.define(RealboxIconElement.is, RealboxIconElement);
diff --git a/chromium/chrome/browser/resources/new_tab_page/realbox_match.html b/chromium/chrome/browser/resources/new_tab_page/realbox_match.html
new file mode 100644
index 00000000000..52f59f29d20
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/realbox_match.html
@@ -0,0 +1,87 @@
+<style>
+ :host {
+ align-items: center;
+ cursor: default;
+ display: flex;
+ font-size: 16px;
+ line-height: 1;
+ outline: none;
+ padding-bottom: 6px;
+ padding-inline-end: 16px;
+ padding-inline-start: 12px;
+ padding-top: 6px;
+ }
+
+ #container {
+ align-items: center;
+ display: flex;
+ flex-grow: 1;
+ overflow: hidden;
+ padding-inline-end: 8px;
+ padding-inline-start: 8px;
+ white-space: nowrap;
+ }
+
+ #contents,
+ #description {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ #separator {
+ white-space: pre;
+ }
+
+ :host([has-image]) #container {
+ align-items: flex-start;
+ flex-direction: column;
+ }
+
+ :host([has-image]) #separator {
+ display: none;
+ }
+
+ :host([has-image]) #contents {
+ width: 100%;
+ }
+
+ :host([has-image]) #description {
+ font-size: 14px;
+ line-height: 16px;
+ margin-top: 2px;
+ width: 100%;
+ }
+
+ .match {
+ font-weight: 500;
+ }
+
+ :host([has-image]) #description,
+ .dim {
+ color: var(--search-box-results-dim, var(--google-grey-600));
+ }
+
+ :host-context(ntp-realbox-match:-webkit-any(:focus-within, .selected)):host([has-image]) #description,
+ :host-context(ntp-realbox-match:-webkit-any(:focus-within, .selected)) .dim {
+ color: var(--search-box-results-dim-selected, var(--google-grey-600));
+ }
+
+ .url {
+ color: var(--search-box-results-url, var(--google-grey-600));
+ }
+
+ :host-context(ntp-realbox-match:-webkit-any(:focus-within, .selected)) .url {
+ color: var(--search-box-results-url-selected, var(--google-grey-600));
+ }
+
+</style>
+<ntp-realbox-icon id="icon" match="[[match]]"></ntp-realbox-icon>
+<div id="container">
+ <span id="contents" inner-h-t-m-l="[[contentsHtml_]]"></span>
+ <span id="separator">[[separatorText_]]</span>
+ <span id="description" inner-h-t-m-l="[[descriptionHtml_]]"></span>
+</div>
+<ntp-realbox-button id="remove" tabindex="0" role="button"
+ on-click="onRemoveButtonClick_" on-keydown="onRemoveButtonKeydown_"
+ title$="[[removeButtonTitle_]]" hidden$="[[!removeButtonIsVisible_]]">
+</ntp-realbox-button>
diff --git a/chromium/chrome/browser/resources/new_tab_page/realbox_match.js b/chromium/chrome/browser/resources/new_tab_page/realbox_match.js
new file mode 100644
index 00000000000..485ad83f65a
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/realbox_match.js
@@ -0,0 +1,352 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './strings.m.js';
+import './realbox_button.js';
+import './realbox_icon.js';
+
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {decodeString16} from './utils.js';
+
+// clang-format off
+/**
+ * Bitmap used to decode the value of search.mojom.ACMatchClassification style
+ * field.
+ * See components/omnibox/browser/autocomplete_match.h.
+ * @enum {number}
+ */
+const ACMatchClassificationStyle = {
+ NONE: 0,
+ URL: 1 << 0, // A URL.
+ MATCH: 1 << 1, // A match for the user's search term.
+ DIM: 1 << 2, // A "helper text".
+};
+// clang-format on
+
+// Displays an autocomplete match similar to those in the Omnibox.
+class RealboxMatchElement extends PolymerElement {
+ static get is() {
+ return 'ntp-realbox-match';
+ }
+
+ static get template() {
+ return html`{__html_template__}`;
+ }
+
+ static get properties() {
+ return {
+ //========================================================================
+ // Public properties
+ //========================================================================
+
+ /**
+ * Element's 'aria-label' attribute.
+ * @type {string}
+ */
+ ariaLabel: {
+ type: String,
+ computed: `computeAriaLabel_(match)`,
+ reflectToAttribute: true,
+ },
+
+ /**
+ * Whether the match features an image (as opposed to an icon or favicon).
+ * @type {boolean}
+ */
+ hasImage: {
+ type: Boolean,
+ computed: `computeHasImage_(match)`,
+ reflectToAttribute: true,
+ },
+
+ /**
+ * @type {!search.mojom.AutocompleteMatch}
+ */
+ match: {
+ type: Object,
+ },
+
+ /**
+ * Index of the match in the autocomplete result. Used to inform embedder
+ * of events such as deletion, click, etc.
+ * @type {number}
+ */
+ matchIndex: {
+ type: Number,
+ value: -1,
+ },
+
+ //========================================================================
+ // Private properties
+ //========================================================================
+
+ /**
+ * Rendered match contents based on autocomplete provided styling.
+ * @type {string}
+ * @private
+ */
+ contentsHtml_: {
+ type: String,
+ computed: `computeContentsHtml_(match)`,
+ },
+
+ /**
+ * Rendered match description based on autocomplete provided styling.
+ * @type {string}
+ * @private
+ */
+ descriptionHtml_: {
+ type: String,
+ computed: `computeDescriptionHtml_(match)`,
+ },
+
+ /**
+ * @type {boolean}
+ * @private
+ */
+ removeButtonIsVisible_: {
+ type: Boolean,
+ computed: `computeRemoveButtonIsVisible_(match)`,
+ },
+
+ /**
+ * @type {string}
+ * @private
+ */
+ removeButtonTitle_: {
+ type: String,
+ value: () => loadTimeData.getString('removeSuggestion'),
+ },
+
+ /**
+ * Used to separate the contents from the description.
+ * @type {string}
+ * @private
+ */
+ separatorText_: {
+ type: String,
+ computed: `computeSeparatorText_(match)`,
+ },
+ };
+ }
+
+ ready() {
+ super.ready();
+
+ this.addEventListener('click', this.onMatchClick_.bind(this));
+ this.addEventListener('focusin', this.onMatchFocusin_.bind(this));
+ }
+
+ //============================================================================
+ // Event handlers
+ //============================================================================
+
+ /**
+ * @param {!Event} e
+ * @private
+ */
+ onMatchClick_(e) {
+ if (e.button > 1) {
+ // Only handle main (generally left) and middle button presses.
+ return;
+ }
+
+ this.dispatchEvent(new CustomEvent('match-click', {
+ bubbles: true,
+ composed: true,
+ detail: {index: this.matchIndex, event: e},
+ }));
+
+ e.preventDefault(); // Prevents default browser action (navigation).
+ e.stopPropagation(); // Prevents <iron-selector> from selecting the match.
+ }
+
+ /**
+ * @param {!Event} e
+ * @private
+ */
+ onMatchFocusin_(e) {
+ this.dispatchEvent(new CustomEvent('match-focusin', {
+ bubbles: true,
+ composed: true,
+ detail: this.matchIndex,
+ }));
+ }
+
+ /**
+ * @param {!Event} e
+ * @private
+ */
+ onRemoveButtonClick_(e) {
+ if (e.button !== 0) {
+ // Only handle main (generally left) button presses.
+ return;
+ }
+ this.dispatchEvent(new CustomEvent('match-remove', {
+ bubbles: true,
+ composed: true,
+ detail: this.matchIndex,
+ }));
+
+ e.preventDefault(); // Prevents default browser action (navigation).
+ e.stopPropagation(); // Prevents <iron-selector> from selecting the match.
+ }
+
+ /**
+ * @param {!Event} e
+ * @private
+ */
+ onRemoveButtonKeydown_(e) {
+ if (e.key !== 'Enter' && e.key !== ' ') {
+ return;
+ }
+
+ // Simulate a click so that it gets handled by |onRemoveButtonClick_|.
+ e.target.click();
+ e.preventDefault(); // Prevents default browser action.
+ }
+
+ //============================================================================
+ // Helpers
+ //============================================================================
+
+ /**
+ * @return {string}
+ * @private
+ */
+ computeAriaLabel_() {
+ if (!this.match) {
+ return '';
+ }
+ const contents = decodeString16(this.match.contents);
+ const description = decodeString16(this.match.description);
+ return this.match.swapContentsAndDescription ?
+ description + this.separatorText_ + contents :
+ contents + this.separatorText_ + description;
+ }
+
+ /**
+ * @return {string}
+ * @private
+ */
+ computeContentsHtml_() {
+ if (!this.match) {
+ return '';
+ }
+ const match = this.match;
+ return match.swapContentsAndDescription ?
+ this.renderTextWithClassifications_(
+ decodeString16(match.description), match.descriptionClass)
+ .innerHTML :
+ this.renderTextWithClassifications_(
+ decodeString16(match.contents), match.contentsClass)
+ .innerHTML;
+ }
+
+ /**
+ * @return {string}
+ * @private
+ */
+ computeDescriptionHtml_() {
+ if (!this.match) {
+ return '';
+ }
+ const match = this.match;
+ return match.swapContentsAndDescription ?
+ this.renderTextWithClassifications_(
+ decodeString16(match.contents), match.contentsClass)
+ .innerHTML :
+ this.renderTextWithClassifications_(
+ decodeString16(match.description), match.descriptionClass)
+ .innerHTML;
+ }
+
+ /**
+ * @return {boolean}
+ * @private
+ */
+ computeHasImage_() {
+ return this.match && !!this.match.imageUrl;
+ }
+
+ /**
+ * @return {boolean}
+ * @private
+ */
+ computeRemoveButtonIsVisible_() {
+ return this.match && this.match.supportsDeletion &&
+ loadTimeData.getBoolean('suggestionTransparencyEnabled');
+ }
+
+ /**
+ * @return {string}
+ * @private
+ */
+ computeSeparatorText_() {
+ return this.match && decodeString16(this.match.description) ?
+ loadTimeData.getString('realboxSeparator') :
+ '';
+ }
+
+ /**
+ * Decodes the ACMatchClassificationStyle enteries encoded in the given
+ * search.mojom.ACMatchClassification style field, maps each entry to a CSS
+ * class and returns them.
+ * @param {number} style
+ * @return {!Array<string>}
+ */
+ convertClassificationStyleToCSSClasses_(style) {
+ const classes = [];
+ if (style & ACMatchClassificationStyle.DIM) {
+ classes.push('dim');
+ }
+ if (style & ACMatchClassificationStyle.MATCH) {
+ classes.push('match');
+ }
+ if (style & ACMatchClassificationStyle.URL) {
+ classes.push('url');
+ }
+ return classes;
+ }
+
+ /**
+ * @param {string} text
+ * @param {!Array<string>} classes
+ * @return {!Element}
+ */
+ createSpanWithClasses_(text, classes) {
+ const span = document.createElement('span');
+ if (classes.length) {
+ span.classList.add(...classes);
+ }
+ span.textContent = text;
+ return span;
+ }
+
+ /**
+ * Renders |text| based on the given search.mojom.ACMatchClassification(s)
+ * Each classification contains an 'offset' and an encoded list of styles for
+ * styling a substring starting with the 'offset' and ending with the next.
+ * @param {string} text
+ * @param {!Array<!search.mojom.ACMatchClassification>} classifications
+ * @return {!Element} A <span> with <span> children for each styled substring.
+ */
+ renderTextWithClassifications_(text, classifications) {
+ return classifications
+ .map(({offset, style}, index) => {
+ const next = classifications[index + 1] || {offset: text.length};
+ const subText = text.substring(offset, next.offset);
+ const classes = this.convertClassificationStyleToCSSClasses_(style);
+ return this.createSpanWithClasses_(subText, classes);
+ })
+ .reduce((container, currentElement) => {
+ container.appendChild(currentElement);
+ return container;
+ }, document.createElement('span'));
+ }
+}
+
+customElements.define(RealboxMatchElement.is, RealboxMatchElement);
diff --git a/chromium/chrome/browser/resources/new_tab_page/shared_vars.css b/chromium/chrome/browser/resources/new_tab_page/shared_vars.css
index eaffc0a0af1..11cd6f1239e 100644
--- a/chromium/chrome/browser/resources/new_tab_page/shared_vars.css
+++ b/chromium/chrome/browser/resources/new_tab_page/shared_vars.css
@@ -8,6 +8,7 @@
* 'ui/webui/resources/shared_vars_css.m.js'.
*/
html {
+ /* Colors: */
--ntp-active-background-color: rgba(var(--google-grey-900-rgb), .16);
--ntp-background-override-color: white;
--ntp-border-color: var(--google-grey-refresh-300);
@@ -20,10 +21,14 @@ html {
--ntp-selected-border-color: var(--google-blue-600);
--ntp-selected-light-background-color: rgba(var(--google-blue-600-rgb), .24);
--ntp-selected-primary-text-color: var(--google-blue-refresh-700);
+
+ /* Other: */
+ --ntp-focus-shadow: 0 0 0 2px var(--ntp-focus-shadow-color);
}
@media (prefers-color-scheme: dark) {
html {
+ /* Colors: */
--ntp-active-background-color: rgba(var(--google-grey-200-rgb), .16);
--ntp-background-override-color: var(--google-grey-900);
--ntp-border-color: var(--google-grey-refresh-700);
diff --git a/chromium/chrome/browser/resources/new_tab_page/theme_icon.html b/chromium/chrome/browser/resources/new_tab_page/theme_icon.html
index eed43bffbb4..311b79bab74 100644
--- a/chromium/chrome/browser/resources/new_tab_page/theme_icon.html
+++ b/chromium/chrome/browser/resources/new_tab_page/theme_icon.html
@@ -45,8 +45,8 @@
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
- <linearGradient id="gradient" gradientUnits="userSpaceOnUse" x1="32" y1="32"
- x2="32.08" y2="32">
+ <linearGradient id="gradient" gradientUnits="objectBoundingBox"
+ x1="50%" y1="0" x2="50.01%" y2="0">
<stop id="leftColor" offset="0%"></stop>
<stop id="rightColor" offset="100%"></stop>
</linearGradient>
diff --git a/chromium/chrome/browser/resources/new_tab_page/untrusted/background_image.html b/chromium/chrome/browser/resources/new_tab_page/untrusted/background_image.html
new file mode 100644
index 00000000000..163aaac751c
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/untrusted/background_image.html
@@ -0,0 +1,50 @@
+<!doctype html>
+<html>
+ <head>
+ <style>
+ html,
+ body,
+ #image,
+ #gradient {
+ height: 100%;
+ width: 100%;
+ }
+
+ #image,
+ #gradient {
+ position: fixed;
+ top: 0;
+ }
+
+ body {
+ margin: 0;
+ opacity: 0;
+ transition: opacity 700ms;
+ }
+
+ body[shown] {
+ opacity: 1;
+ }
+
+ #image {
+ background-image: $i18nRaw{backgroundUrl};
+ background-position: $i18nRaw{positionX} $i18nRaw{positionY};
+ background-repeat: $i18nRaw{repeatX} $i18nRaw{repeatY};
+ background-size: $i18nRaw{size};
+ }
+
+ #gradient {
+ background: radial-gradient(transparent 50%, black),
+ linear-gradient(transparent, black);
+ opacity: .2;
+ }
+ </style>
+ </head>
+ <body>
+ <script src="background_image.js"></script>
+ <!-- The img tag purely exists to capture the load event. -->
+ <img src="$i18nRaw{url}" onload="onImageLoad()" hidden></img>
+ <div id="image"></div>
+ <div id="gradient"></div>
+ </body>
+</html>
diff --git a/chromium/chrome/browser/resources/new_tab_page/untrusted/background_image.js b/chromium/chrome/browser/resources/new_tab_page/untrusted/background_image.js
new file mode 100644
index 00000000000..1649942109c
--- /dev/null
+++ b/chromium/chrome/browser/resources/new_tab_page/untrusted/background_image.js
@@ -0,0 +1,36 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview The code in this file tracks the load time of the background
+ * image in order to send that time to the main NTP frame for metrics logging.
+ */
+
+let loadTime;
+
+function sendLoadTime(time) {
+ window.parent.postMessage(
+ {
+ frameType: 'background-image',
+ messageType: 'loaded',
+ url: location.href,
+ time: time,
+ },
+ 'chrome://new-tab-page');
+}
+
+function onImageLoad() {
+ document.body.toggleAttribute('shown', true);
+ loadTime = Date.now();
+ sendLoadTime(loadTime);
+}
+
+// The NTP requests the load time as soon as it has installed the message
+// listener. In case we have already sent the load time we re-send the load time
+// so that the NTP has a chance to actually catch it.
+window.addEventListener('message', ({data}) => {
+ if (data === 'sendLoadTime' && loadTime) {
+ sendLoadTime(loadTime);
+ }
+});
diff --git a/chromium/chrome/browser/resources/new_tab_page/untrusted/image.html b/chromium/chrome/browser/resources/new_tab_page/untrusted/image.html
index b6e86cb3169..2a49937064c 100644
--- a/chromium/chrome/browser/resources/new_tab_page/untrusted/image.html
+++ b/chromium/chrome/browser/resources/new_tab_page/untrusted/image.html
@@ -9,12 +9,16 @@
}
body {
- background-image: url($i18nRaw{url});
- background-position: center;
- background-size: cover;
margin: 0
}
+
+ img {
+ max-height: 100%;
+ max-width: 100%;
+ }
</style>
</head>
- <body></body>
+ <body>
+ <img src="$i18nRaw{url}"></img>
+ </body>
</html>
diff --git a/chromium/chrome/browser/resources/new_tab_page/untrusted/one_google_bar.html b/chromium/chrome/browser/resources/new_tab_page/untrusted/one_google_bar.html
index ae67db29484..96d509ff436 100644
--- a/chromium/chrome/browser/resources/new_tab_page/untrusted/one_google_bar.html
+++ b/chromium/chrome/browser/resources/new_tab_page/untrusted/one_google_bar.html
@@ -1,6 +1,7 @@
<!doctype html>
-<html>
+<html dir="$i18n{textdirection}">
<head>
+ <meta charset="utf-8">
<style>
body {
margin: 0;
diff --git a/chromium/chrome/browser/resources/new_tab_page/untrusted/one_google_bar.js b/chromium/chrome/browser/resources/new_tab_page/untrusted/one_google_bar.js
index e0c0cee628c..416e82acdee 100644
--- a/chromium/chrome/browser/resources/new_tab_page/untrusted/one_google_bar.js
+++ b/chromium/chrome/browser/resources/new_tab_page/untrusted/one_google_bar.js
@@ -2,53 +2,122 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+const oneGoogleBarHeightInPixels = 64;
+
/**
- * The following |messageType|'s are sent to the parent frame:
- * - loaded: initial load
- * - deactivate: the pointer is not over OneGoogleBar content
- * - activate: the pointer is over OneGoogleBar content
- *
- * TODO(crbug.com/1039913): add support for light/dark theme. add support for
- * forwarding touch events when OneGoogleBar is active.
- *
- * @param {string} messageType
+ * @param {boolean} enabled
+ * @return {!Promise}
*/
-function postMessage(messageType) {
- window.parent.postMessage(
- {frameType: 'one-google-bar', messageType}, 'chrome://new-tab-page');
+async function enableDarkTheme(enabled) {
+ if (!window.gbar) {
+ return;
+ }
+ const ogb = await window.gbar.a.bf();
+ ogb.pc.call(ogb, enabled ? 1 : 0);
}
-// Tracks if the OneGoogleBar is active and should accept pointer events.
-let isActive;
-
/**
- * @param {number} x
- * @param {number} y
+ * The following |messageType|'s are sent to the parent frame:
+ * - loaded: sent on initial load.
+ * - overlaysUpdated: sent when an overlay is updated. The overlay bounding
+ * rects are included in the |data|.
+ * @param {string} messageType
+ * @param {Object} data
*/
-function updateActiveState(x, y) {
- const shouldBeActive = document.elementFromPoint(x, y).tagName !== 'HTML';
- if (shouldBeActive === isActive) {
+function postMessage(messageType, data) {
+ if (window === window.parent) {
return;
}
- isActive = shouldBeActive;
- postMessage(shouldBeActive ? 'activate' : 'deactivate');
+ window.parent.postMessage(
+ {frameType: 'one-google-bar', messageType, data},
+ 'chrome://new-tab-page');
+}
+
+const overlays = new Set();
+
+function sendOverlayUpdate() {
+ // Remove overlays detached from DOM or elements in a parent overlay.
+ Array.from(overlays).forEach(overlay => {
+ if (!overlay.parentElement) {
+ overlays.delete(overlay);
+ return;
+ }
+ let parent = overlay.parentElement;
+ while (parent) {
+ if (overlays.has(parent)) {
+ overlays.delete(overlay);
+ return;
+ }
+ parent = parent.parentElement;
+ }
+ });
+ // Check if an overlay and its parents are visible.
+ const overlayRects =
+ Array.from(overlays)
+ .filter(overlay => {
+ if (window.getComputedStyle(overlay).visibility === 'hidden') {
+ return false;
+ }
+ let current = overlay;
+ while (current) {
+ if (window.getComputedStyle(current).display === 'none') {
+ return false;
+ }
+ current = current.parentElement;
+ }
+ return true;
+ })
+ .map(el => el.getBoundingClientRect());
+ postMessage('overlaysUpdated', overlayRects);
+}
+
+function trackOverlayState() {
+ const observer = new MutationObserver(mutations => {
+ // After loaded, there could exist overlays that are shown, but not mutated.
+ // Add all elements that could be an overlay. The children of the actual
+ // overlay element are removed before sending any overlay update message.
+ if (overlays.size === 0) {
+ Array.from(document.body.querySelectorAll('*')).forEach(el => {
+ if (el.offsetTop + el.offsetHeight > oneGoogleBarHeightInPixels) {
+ overlays.add(el);
+ }
+ });
+ }
+ // Add any mutated element that is an overlay to |overlays|.
+ mutations.forEach(({target}) => {
+ if (target.id === 'gb' || target.tagName === 'BODY' ||
+ overlays.has(target)) {
+ return;
+ }
+ if (target.offsetTop + target.offsetHeight > oneGoogleBarHeightInPixels) {
+ overlays.add(target);
+ }
+ // Update links that are loaded dynamically to ensure target is "_blank"
+ // or "_top".
+ // TODO(crbug.com/1039913): remove after OneGoogleBar links are updated.
+ if (target.parentElement) {
+ target.parentElement.querySelectorAll('a').forEach(el => {
+ if (el.target !== '_blank' && el.target !== '_top') {
+ el.target = '_top';
+ }
+ });
+ }
+ });
+ sendOverlayUpdate();
+ });
+ observer.observe(
+ document, {attributes: true, childList: true, subtree: true});
}
-// Handle messages from parent frame which include forwarded mousemove events.
-// The OneGoogleBar is loaded in an iframe on top of the embedder parent frame.
-// The mousemove events are used to determine if the OneGoogleBar should be
-// active or not.
-// TODO(crbug.com/1039913): add support for touch which does not send mousemove
-// events.
window.addEventListener('message', ({data}) => {
- if (data.type === 'mousemove') {
- updateActiveState(data.x, data.y);
+ if (data.type === 'enableDarkTheme') {
+ enableDarkTheme(data.enabled);
}
});
-window.addEventListener('mousemove', ({x, y}) => {
- updateActiveState(x, y);
-});
+// Need to send overlay updates on resize because overlay bounding rects are
+// absolutely positioned.
+window.addEventListener('resize', sendOverlayUpdate);
document.addEventListener('DOMContentLoaded', () => {
// TODO(crbug.com/1039913): remove after OneGoogleBar links are updated.
@@ -59,4 +128,5 @@ document.addEventListener('DOMContentLoaded', () => {
}
});
postMessage('loaded');
+ trackOverlayState();
});
diff --git a/chromium/chrome/browser/resources/new_tab_page/untrusted/promo.html b/chromium/chrome/browser/resources/new_tab_page/untrusted/promo.html
index 2fd986f6f8e..04cd9358e1a 100644
--- a/chromium/chrome/browser/resources/new_tab_page/untrusted/promo.html
+++ b/chromium/chrome/browser/resources/new_tab_page/untrusted/promo.html
@@ -1,6 +1,7 @@
<!doctype html>
-<html>
+<html dir="$i18n{textdirection}">
<head>
+ <meta charset="utf-8">
<style>
html {
--google-blue-400-rgb: 107, 165, 237; /* #6ba5ed */
@@ -11,6 +12,8 @@
--google-grey-200: rgb(var(--google-grey-200-rgb));
--google-grey-900-rgb: 32, 33, 36; /* #202124 */
--google-grey-900: rgb(var(--google-grey-900-rgb));
+ --google-blue-refresh-300-rgb: 138, 180, 248; /* #8ab4f8 */
+ --google-blue-refresh-300: rgb(var(--google-blue-refresh-300-rgb));
--google-grey-refresh-300-rgb: 218, 220, 224; /* #dadce0 */
--google-grey-refresh-300: rgb(var(--google-grey-refresh-300-rgb));
--google-grey-refresh-700-rgb: 95, 99, 104; /* #5f6368 */
@@ -60,10 +63,18 @@
text-decoration: none;
}
+ body > div > a:focus {
+ outline: solid 2px rgba(var(--google-blue-600-rgb), .4);
+ }
+
@media (prefers-color-scheme: dark) {
body > div > a {
color: var(--google-blue-400);
}
+
+ body > div > a:focus {
+ outline: solid 2px rgba(var(--google-blue-refresh-300-rgb), .5);
+ }
}
body > div > img {
diff --git a/chromium/chrome/browser/resources/new_tab_page/untrusted/promo.js b/chromium/chrome/browser/resources/new_tab_page/untrusted/promo.js
index de53758beaa..454df0f2dc9 100644
--- a/chromium/chrome/browser/resources/new_tab_page/untrusted/promo.js
+++ b/chromium/chrome/browser/resources/new_tab_page/untrusted/promo.js
@@ -16,6 +16,11 @@ document.addEventListener('DOMContentLoaded', () => {
if (el.target !== '_blank') {
el.target = '_top';
}
+ el.addEventListener('click', () => {
+ window.parent.postMessage(
+ {frameType: 'promo', messageType: 'link-clicked'},
+ 'chrome://new-tab-page');
+ });
});
// Inform the embedder that the promo has loaded and can be displayed.
window.parent.postMessage(
diff --git a/chromium/chrome/browser/resources/new_tab_page/utils.js b/chromium/chrome/browser/resources/new_tab_page/utils.js
index 72fffb416b7..9d335347372 100644
--- a/chromium/chrome/browser/resources/new_tab_page/utils.js
+++ b/chromium/chrome/browser/resources/new_tab_page/utils.js
@@ -4,20 +4,16 @@
/**
* Converts an SkColor object to a string in the form
- * "rgb(<red>, <green>, <blue>)".
- * Note: Can only convert opaque SkColors.
+ * "rgba(<red>, <green>, <blue>, <alpha>)".
* @param {skia.mojom.SkColor} skColor The input color.
- * @return {string} The rgb string.
+ * @return {string} The rgba string.
*/
-export function skColorToRgb(skColor) {
- // Bail on transparent colors.
- if (skColor.value < 0xff000000) {
- return 'rgb(0, 0, 0)';
- }
+export function skColorToRgba(skColor) {
+ const a = (skColor.value >> 24) & 0xff;
const r = (skColor.value >> 16) & 0xff;
const g = (skColor.value >> 8) & 0xff;
const b = skColor.value & 0xff;
- return `rgb(${r}, ${g}, ${b})`;
+ return `rgba(${r}, ${g}, ${b}, ${(a / 255).toFixed(2)})`;
}
/**
@@ -43,27 +39,25 @@ export function hexColorToSkColor(hexColor) {
*
* Returns an |IntersectionObserver| so the caller can disconnect the observer
* when needed.
- * @param {!HTMLElement} container
+ * @param {!Element} container
+ * @param {!Element} topBorder
+ * @param {!Element} bottomBorder
+ * @param {string} showAttribute
* @return {!IntersectionObserver}
*/
-export function createScrollBorders(container) {
+export function createScrollBorders(
+ container, topBorder, bottomBorder, showAttribute) {
const topProbe = document.createElement('div');
container.prepend(topProbe);
const bottomProbe = document.createElement('div');
container.append(bottomProbe);
- const topBorder = document.createElement('div');
- topBorder.toggleAttribute('scroll-border', true);
- container.parentNode.insertBefore(topBorder, container);
- const bottomBorder = document.createElement('div');
- bottomBorder.toggleAttribute('scroll-border', true);
- container.parentNode.insertBefore(bottomBorder, container.nextSibling);
const observer = new IntersectionObserver(entries => {
entries.forEach(({target, intersectionRatio}) => {
const show = intersectionRatio === 0;
if (target === topProbe) {
- topBorder.toggleAttribute('show', show);
+ topBorder.toggleAttribute(showAttribute, show);
} else if (target === bottomProbe) {
- bottomBorder.toggleAttribute('show', show);
+ bottomBorder.toggleAttribute(showAttribute, show);
}
});
}, {root: container});
@@ -71,3 +65,45 @@ export function createScrollBorders(container) {
observer.observe(bottomProbe);
return observer;
}
+
+/**
+ * Converts a mojoBase.mojom.String16 to a JavaScript String.
+ * @param {?mojoBase.mojom.String16} str
+ * @return {string}
+ */
+export function decodeString16(str) {
+ return str ? str.data.map(ch => String.fromCodePoint(ch)).join('') : '';
+}
+
+/**
+ * Converts a JavaScript String to a mojoBase.mojom.String16.
+ * @param {string} str
+ * @return {!mojoBase.mojom.String16}
+ */
+export function mojoString16(str) {
+ const array = new Array(str.length);
+ for (let i = 0; i < str.length; ++i) {
+ array[i] = str.charCodeAt(i);
+ }
+ return {data: array};
+}
+
+/**
+ * Converts a time delta in milliseconds to mojoBase.mojom.TimeDelta.
+ * @param {number} timeDelta time delta in milliseconds
+ * @returns {!mojoBase.mojom.TimeDelta}
+ */
+export function mojoTimeDelta(timeDelta) {
+ return {microseconds: Math.floor(timeDelta * 1000)};
+}
+
+/**
+ * Queries |selector| on |element|'s shadow root and returns the resulting
+ * element if there is any.
+ * @param {!Element} element
+ * @param {string} selector
+ * @return {Element}
+ */
+export function $$(element, selector) {
+ return element.shadowRoot.querySelector(selector);
+}
diff --git a/chromium/chrome/browser/resources/new_tab_page/voice_search_overlay.html b/chromium/chrome/browser/resources/new_tab_page/voice_search_overlay.html
index 88dd7098ac5..20e0a48c862 100644
--- a/chromium/chrome/browser/resources/new_tab_page/voice_search_overlay.html
+++ b/chromium/chrome/browser/resources/new_tab_page/voice_search_overlay.html
@@ -48,7 +48,7 @@
}
:host-context(.focus-outline-visible) #closeButton:focus {
- box-shadow: 0 0 0 2px var(--ntp-focus-shadow-color);
+ box-shadow: var(--ntp-focus-shadow);
}
:host-context([dir='ltr']) #closeButton {
diff --git a/chromium/chrome/browser/resources/pdf/BUILD.gn b/chromium/chrome/browser/resources/pdf/BUILD.gn
index f93045f59b9..c975fd597e2 100644
--- a/chromium/chrome/browser/resources/pdf/BUILD.gn
+++ b/chromium/chrome/browser/resources/pdf/BUILD.gn
@@ -17,6 +17,9 @@ group("closure_compile") {
js_library("annotation_tool") {
}
+js_library("bookmark_type") {
+}
+
js_library("browser_api") {
deps = [ "//ui/webui/resources/js:assert.m" ]
externs_list = [
@@ -95,6 +98,7 @@ js_library("controller") {
js_library("pdf_viewer") {
deps = [
+ ":bookmark_type",
":constants",
":controller",
":metrics",
@@ -103,7 +107,6 @@ js_library("pdf_viewer") {
":toolbar_manager",
":viewport",
":viewport_scroller",
- "elements:viewer-bookmark",
"elements:viewer-error-screen",
"elements:viewer-page-indicator",
"elements:viewer-password-screen",
@@ -118,13 +121,21 @@ js_library("pdf_viewer") {
externs_list = [ "$externs_path/resources_private.js" ]
}
-js_library("main") {
+js_library("main_util") {
deps = [
":browser_api",
":pdf_viewer",
]
}
+js_library("main") {
+ deps = [ ":main_util" ]
+}
+
+js_library("main_pp") {
+ deps = [ ":main_util" ]
+}
+
js_type_check("pdf_resources") {
is_polymer3 = true
deps = [
@@ -134,6 +145,8 @@ js_type_check("pdf_resources") {
":controller",
":gesture_detector",
":main",
+ ":main_pp",
+ ":main_util",
":metrics",
":navigator",
":open_pdf_params_parser",
diff --git a/chromium/chrome/browser/resources/pdf/bookmark_type.js b/chromium/chrome/browser/resources/pdf/bookmark_type.js
new file mode 100644
index 00000000000..b8f9b199b72
--- /dev/null
+++ b/chromium/chrome/browser/resources/pdf/bookmark_type.js
@@ -0,0 +1,27 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * The |title| is the text label displayed for the bookmark.
+ *
+ * The bookmark may point at a location in the PDF or a URI.
+ * If it points at a location, |page| indicates which 0-based page it leads to.
+ * Optionally, |x| is the x position in that page, |y| is the y position in that
+ * page, in pixel coordinates and |zoom| is the new zoom value. If it points at
+ * an URI, |uri| is the target for that bookmark.
+ *
+ * |children| is an array of the |Bookmark|s that are below this in a table of
+ * contents tree
+ * structure.
+ * @typedef {{
+ * title: string,
+ * page: (number | undefined),
+ * x: (number | undefined),
+ * y: (number | undefined),
+ * zoom: (number | undefined),
+ * uri: (string | undefined),
+ * children: !Array<!Bookmark>
+ * }}
+ */
+export let Bookmark;
diff --git a/chromium/chrome/browser/resources/pdf/elements/BUILD.gn b/chromium/chrome/browser/resources/pdf/elements/BUILD.gn
index 923473079db..1980c0a3421 100644
--- a/chromium/chrome/browser/resources/pdf/elements/BUILD.gn
+++ b/chromium/chrome/browser/resources/pdf/elements/BUILD.gn
@@ -3,7 +3,7 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
js_type_check("closure_compile") {
is_polymer3 = true
@@ -29,6 +29,7 @@ js_type_check("closure_compile") {
js_library("viewer-bookmark") {
deps = [
+ "..:bookmark_type",
"//third_party/polymer/v3_0/components-chromium/iron-a11y-keys-behavior",
]
}
@@ -98,109 +99,25 @@ js_library("viewer-zoom-button") {
deps = []
}
-polymer_modulizer("viewer-bookmark") {
- js_file = "viewer-bookmark.js"
- html_file = "viewer-bookmark.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("viewer-error-screen") {
- js_file = "viewer-error-screen.js"
- html_file = "viewer-error-screen.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("viewer-form-warning") {
- js_file = "viewer-form-warning.js"
- html_file = "viewer-form-warning.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("viewer-ink-host") {
- js_file = "viewer-ink-host.js"
- html_file = "viewer-ink-host.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("viewer-page-indicator") {
- js_file = "viewer-page-indicator.js"
- html_file = "viewer-page-indicator.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("viewer-page-selector") {
- js_file = "viewer-page-selector.js"
- html_file = "viewer-page-selector.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("viewer-password-screen") {
- js_file = "viewer-password-screen.js"
- html_file = "viewer-password-screen.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("viewer-pdf-toolbar") {
- js_file = "viewer-pdf-toolbar.js"
- html_file = "viewer-pdf-toolbar.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("viewer-pen-options") {
- js_file = "viewer-pen-options.js"
- html_file = "viewer-pen-options.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("viewer-toolbar-dropdown") {
- js_file = "viewer-toolbar-dropdown.js"
- html_file = "viewer-toolbar-dropdown.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("viewer-zoom-button") {
- js_file = "viewer-zoom-button.js"
- html_file = "viewer-zoom-button.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("viewer-zoom-toolbar") {
- js_file = "viewer-zoom-toolbar.js"
- html_file = "viewer-zoom-toolbar.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("shared-vars") {
- js_file = "shared-vars.js"
- html_file = "shared-vars.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("icons") {
- js_file = "icons.js"
- html_file = "icons.html"
- html_type = "v3-ready"
-}
-
-group("polymer3_elements") {
- public_deps = [
- ":icons_module",
- ":shared-vars_module",
- ":viewer-bookmark_module",
- ":viewer-error-screen_module",
- ":viewer-page-indicator_module",
- ":viewer-page-selector_module",
- ":viewer-password-screen_module",
- ":viewer-pdf-toolbar_module",
- ":viewer-toolbar-dropdown_module",
- ":viewer-zoom-button_module",
- ":viewer-zoom-toolbar_module",
+html_to_js("web_components") {
+ js_files = [
+ "icons.js",
+ "shared-vars.js",
+ "viewer-bookmark.js",
+ "viewer-error-screen.js",
+ "viewer-page-indicator.js",
+ "viewer-page-selector.js",
+ "viewer-password-screen.js",
+ "viewer-pdf-toolbar.js",
+ "viewer-toolbar-dropdown.js",
+ "viewer-zoom-button.js",
+ "viewer-zoom-toolbar.js",
]
if (is_chromeos) {
- public_deps += [
- ":viewer-form-warning_module",
- ":viewer-ink-host_module",
- ":viewer-pen-options_module",
+ js_files += [
+ "viewer-form-warning.js",
+ "viewer-ink-host.js",
+ "viewer-pen-options.js",
]
}
}
diff --git a/chromium/chrome/browser/resources/pdf/elements/viewer-bookmark.html b/chromium/chrome/browser/resources/pdf/elements/viewer-bookmark.html
index f143d09bd5d..ec39a68550e 100644
--- a/chromium/chrome/browser/resources/pdf/elements/viewer-bookmark.html
+++ b/chromium/chrome/browser/resources/pdf/elements/viewer-bookmark.html
@@ -1,8 +1,8 @@
<style>
#item {
- @apply --layout-center;
- @apply --layout-horizontal;
+ align-items: center;
cursor: pointer;
+ display: flex;
height: 30px;
position: relative;
}
diff --git a/chromium/chrome/browser/resources/pdf/elements/viewer-bookmark.js b/chromium/chrome/browser/resources/pdf/elements/viewer-bookmark.js
index 20363c71137..2e056577a3f 100644
--- a/chromium/chrome/browser/resources/pdf/elements/viewer-bookmark.js
+++ b/chromium/chrome/browser/resources/pdf/elements/viewer-bookmark.js
@@ -11,29 +11,7 @@ import 'chrome://resources/polymer/v3_0/paper-styles/color.js';
import {IronA11yKeysBehavior} from 'chrome://resources/polymer/v3_0/iron-a11y-keys-behavior/iron-a11y-keys-behavior.js';
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-/**
- * The |title| is the text label displayed for the bookmark.
- *
- * The bookmark may point at a location in the PDF or a URI.
- * If it points at a location, |page| indicates which 0-based page it leads to.
- * Optionally, |x| is the x position in that page, |y| is the y position in that
- * page, in pixel coordinates and |zoom| is the new zoom value. If it points at
- * an URI, |uri| is the target for that bookmark.
- *
- * |children| is an array of the |Bookmark|s that are below this in a table of
- * contents tree
- * structure.
- * @typedef {{
- * title: string,
- * page: (number | undefined),
- * x: (number | undefined),
- * y: (number | undefined),
- * zoom: (number | undefined),
- * uri: (string | undefined),
- * children: !Array<!Bookmark>
- * }}
- */
-export let Bookmark;
+import {Bookmark} from '../bookmark_type.js';
/** Amount that each level of bookmarks is indented by (px). */
const BOOKMARK_INDENT = 20;
diff --git a/chromium/chrome/browser/resources/pdf/elements/viewer-page-selector.html b/chromium/chrome/browser/resources/pdf/elements/viewer-page-selector.html
index b950e33988e..1402b838971 100644
--- a/chromium/chrome/browser/resources/pdf/elements/viewer-page-selector.html
+++ b/chromium/chrome/browser/resources/pdf/elements/viewer-page-selector.html
@@ -9,39 +9,33 @@
background: rgba(255, 255, 255, 0.3);
}
- #pageselector-container,
- #pagelength-spacer {
+ #pageselector::part(input),
+ #pagelength {
+ box-sizing: content-box;
padding: 0 3px;
- text-align: start;
- /* --page-length-digits is set through JavaScript */
- width: calc(var(--page-length-digits, 1) * 1ch);
- }
-
- #pageselector-container:focus-within,
- #pageselector-container:hover {
- background: rgba(0, 0, 0, 0.5);
+ /* --page-length-digits is set through JavaScript. 1px is added because
+ * the unit 'ch' does not provide exact whole number pixels, and
+ * therefore seems to have 1px-off bugginess. */
+ width: calc(var(--page-length-digits) * 1ch + 1px);
}
#pageselector {
- --cr-input-focus-color: transparent;
- --cr-input-error-display: none;
--cr-input-background-color: transparent;
+ --cr-input-border-radius: 0;
--cr-input-color: white;
+ --cr-input-error-display: none;
+ --cr-input-focus-color: transparent;
}
#pageselector::part(input) {
+ background: rgba(0, 0, 0, 0.5);
caret-color: var(--cr-input-color);
- padding: 0;
text-align: end;
}
</style>
- <div id="pageselector-container">
- <cr-input id="pageselector" value="[[pageNo]]" on-mouseup="select"
- on-value-changed="onInputValueChange_" on-change="pageNoCommitted"
- aria-label$="{{strings.labelPageNumber}}">
- </cr-input>
- </div>
- <span id="slash">/</span>
- <span id="pagelength-spacer">
- <span id="pagelength">{{docLength}}</span>
- </span>
+ <cr-input id="pageselector" value="[[pageNo]]" on-mouseup="select"
+ on-value-changed="onInputValueChange_" on-change="pageNoCommitted"
+ aria-label$="{{strings.labelPageNumber}}">
+ </cr-input>
+ /
+ <span id="pagelength">{{docLength}}</span>
diff --git a/chromium/chrome/browser/resources/pdf/elements/viewer-pdf-toolbar.js b/chromium/chrome/browser/resources/pdf/elements/viewer-pdf-toolbar.js
index 1a5af6551ab..9fb821a0ac4 100644
--- a/chromium/chrome/browser/resources/pdf/elements/viewer-pdf-toolbar.js
+++ b/chromium/chrome/browser/resources/pdf/elements/viewer-pdf-toolbar.js
@@ -7,6 +7,7 @@ import 'chrome://resources/cr_elements/hidden_style_css.m.js';
import 'chrome://resources/polymer/v3_0/paper-progress/paper-progress.js';
import 'chrome://resources/cr_elements/icons.m.js';
import './icons.js';
+import './viewer-bookmark.js';
import './viewer-page-selector.js';
import './viewer-toolbar-dropdown.js';
@@ -15,7 +16,7 @@ import './viewer-pen-options.js';
// </if>
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {Bookmark} from './viewer-bookmark.js';
+import {Bookmark} from '../bookmark_type.js';
Polymer({
is: 'viewer-pdf-toolbar',
diff --git a/chromium/chrome/browser/resources/pdf/elements/viewer-zoom-toolbar.js b/chromium/chrome/browser/resources/pdf/elements/viewer-zoom-toolbar.js
index ec5e991934f..d58712f7562 100644
--- a/chromium/chrome/browser/resources/pdf/elements/viewer-zoom-toolbar.js
+++ b/chromium/chrome/browser/resources/pdf/elements/viewer-zoom-toolbar.js
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+import 'chrome://resources/cr_elements/hidden_style_css.m.js';
import 'chrome://resources/cr_elements/icons.m.js';
import './icons.js';
import './viewer-zoom-button.js';
diff --git a/chromium/chrome/browser/resources/pdf/index.html b/chromium/chrome/browser/resources/pdf/index.html
index 59965552797..6a78136126d 100644
--- a/chromium/chrome/browser/resources/pdf/index.html
+++ b/chromium/chrome/browser/resources/pdf/index.html
@@ -15,8 +15,6 @@
<viewer-zoom-toolbar id="zoom-toolbar" hidden></viewer-zoom-toolbar>
-<viewer-page-indicator id="page-indicator"></viewer-page-indicator>
-
<viewer-error-screen id="error-screen"></viewer-error-screen>
<if expr="chromeos">
diff --git a/chromium/chrome/browser/resources/pdf/index_pp.html b/chromium/chrome/browser/resources/pdf/index_pp.html
new file mode 100644
index 00000000000..5c44ada5d73
--- /dev/null
+++ b/chromium/chrome/browser/resources/pdf/index_pp.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<html $i18n{a11yenhanced}>
+<head>
+ <meta charset="utf-8">
+
+ <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css">
+ <link rel="stylesheet" href="index.css">
+</head>
+<body>
+
+<div id="sizer"></div>
+<viewer-zoom-toolbar id="zoom-toolbar" hidden></viewer-zoom-toolbar>
+
+<viewer-page-indicator id="page-indicator"></viewer-page-indicator>
+
+<viewer-error-screen id="error-screen"></viewer-error-screen>
+
+<div id="content"></div>
+
+</body>
+<script type="module" src="main_pp.js"></script>
+</html>
diff --git a/chromium/chrome/browser/resources/pdf/main.js b/chromium/chrome/browser/resources/pdf/main.js
index 0ea634e1fa6..28e1726b30b 100644
--- a/chromium/chrome/browser/resources/pdf/main.js
+++ b/chromium/chrome/browser/resources/pdf/main.js
@@ -3,7 +3,6 @@
// found in the LICENSE file.
import './elements/viewer-error-screen.js';
-import './elements/viewer-page-indicator.js';
import './elements/viewer-password-screen.js';
import './elements/viewer-pdf-toolbar.js';
import './elements/viewer-zoom-toolbar.js';
@@ -13,84 +12,6 @@ import './elements/viewer-ink-host.js';
import './elements/viewer-form-warning.js';
// </if>
-import {BrowserApi, createBrowserApi} from './browser_api.js';
-import {PDFViewer} from './pdf_viewer.js';
-
-/**
- * Global PDFViewer object, accessible for testing.
- *
- * @type Object
- */
-window.viewer = null;
-
-
-/**
- * Stores any pending messages received which should be passed to the
- * PDFViewer when it is created.
- *
- * @type Array
- */
-const pendingMessages = [];
-
-/**
- * Handles events that are received prior to the PDFViewer being created.
- *
- * @param {Object} message A message event received.
- */
-function handleScriptingMessage(message) {
- pendingMessages.push(message);
-}
-
-/**
- * Initialize the global PDFViewer and pass any outstanding messages to it.
- *
- * @param {!BrowserApi} browserApi
- */
-function initViewer(browserApi) {
- // PDFViewer will handle any messages after it is created.
- window.removeEventListener('message', handleScriptingMessage, false);
- window.viewer = new PDFViewer(browserApi);
- while (pendingMessages.length > 0) {
- window.viewer.handleScriptingMessage(pendingMessages.shift());
- }
-}
-
-/**
- * Determine if the content settings allow PDFs to execute javascript.
- *
- * @param {!BrowserApi} browserApi
- * @return {!Promise<!BrowserApi>}
- */
-function configureJavaScriptContentSetting(browserApi) {
- return new Promise((resolve, reject) => {
- chrome.contentSettings.javascript.get(
- {
- 'primaryUrl': browserApi.getStreamInfo().originalUrl,
- 'secondaryUrl': window.location.origin
- },
- (result) => {
- browserApi.getStreamInfo().javascript = result.setting;
- resolve(browserApi);
- });
- });
-}
-
-/**
- * Entrypoint for starting the PDF viewer. This function obtains the browser
- * API for the PDF and constructs a PDFViewer object with it.
- */
-function main() {
- // Set up an event listener to catch scripting messages which are sent prior
- // to the PDFViewer being created.
- window.addEventListener('message', handleScriptingMessage, false);
- let chain = createBrowserApi();
-
- // Content settings may not be present in test environments.
- if (chrome.contentSettings) {
- chain = chain.then(configureJavaScriptContentSetting);
- }
-
- chain.then(initViewer);
-}
+import {main} from './main_util.js';
main();
diff --git a/chromium/chrome/browser/resources/pdf/main_pp.js b/chromium/chrome/browser/resources/pdf/main_pp.js
new file mode 100644
index 00000000000..b21153858b0
--- /dev/null
+++ b/chromium/chrome/browser/resources/pdf/main_pp.js
@@ -0,0 +1,12 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './elements/viewer-error-screen.js';
+import './elements/viewer-page-indicator.js';
+import './elements/viewer-zoom-toolbar.js';
+import './elements/shared-vars.js';
+
+import {main} from './main_util.js';
+
+main();
diff --git a/chromium/chrome/browser/resources/pdf/main_util.js b/chromium/chrome/browser/resources/pdf/main_util.js
new file mode 100644
index 00000000000..a0585f05ff4
--- /dev/null
+++ b/chromium/chrome/browser/resources/pdf/main_util.js
@@ -0,0 +1,83 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {BrowserApi, createBrowserApi} from './browser_api.js';
+import {PDFViewer} from './pdf_viewer.js';
+
+
+/**
+ * Global PDFViewer object, accessible for testing.
+ *
+ * @type Object
+ */
+window.viewer = null;
+
+
+/**
+ * Stores any pending messages received which should be passed to the
+ * PDFViewer when it is created.
+ *
+ * @type Array
+ */
+const pendingMessages = [];
+
+/**
+ * Handles events that are received prior to the PDFViewer being created.
+ *
+ * @param {Object} message A message event received.
+ */
+function handleScriptingMessage(message) {
+ pendingMessages.push(message);
+}
+/**
+ * Initialize the global PDFViewer and pass any outstanding messages to it.
+ *
+ * @param {!BrowserApi} browserApi
+ */
+function initViewer(browserApi) {
+ // PDFViewer will handle any messages after it is created.
+ window.removeEventListener('message', handleScriptingMessage, false);
+ window.viewer = new PDFViewer(browserApi);
+ while (pendingMessages.length > 0) {
+ window.viewer.handleScriptingMessage(pendingMessages.shift());
+ }
+}
+
+/**
+ * Determine if the content settings allow PDFs to execute javascript.
+ *
+ * @param {!BrowserApi} browserApi
+ * @return {!Promise<!BrowserApi>}
+ */
+function configureJavaScriptContentSetting(browserApi) {
+ return new Promise((resolve, reject) => {
+ chrome.contentSettings.javascript.get(
+ {
+ 'primaryUrl': browserApi.getStreamInfo().originalUrl,
+ 'secondaryUrl': window.location.origin
+ },
+ (result) => {
+ browserApi.getStreamInfo().javascript = result.setting;
+ resolve(browserApi);
+ });
+ });
+}
+
+/**
+ * Entrypoint for starting the PDF viewer. This function obtains the browser
+ * API for the PDF and constructs a PDFViewer object with it.
+ */
+export function main() {
+ // Set up an event listener to catch scripting messages which are sent prior
+ // to the PDFViewer being created.
+ window.addEventListener('message', handleScriptingMessage, false);
+ let chain = createBrowserApi();
+
+ // Content settings may not be present in test environments.
+ if (chrome.contentSettings) {
+ chain = chain.then(configureJavaScriptContentSetting);
+ }
+
+ chain.then(initViewer);
+}
diff --git a/chromium/chrome/browser/resources/pdf/pdf_viewer.js b/chromium/chrome/browser/resources/pdf/pdf_viewer.js
index 296c0fc0cce..e6fc90845ab 100644
--- a/chromium/chrome/browser/resources/pdf/pdf_viewer.js
+++ b/chromium/chrome/browser/resources/pdf/pdf_viewer.js
@@ -8,10 +8,10 @@ import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
import {$, hasKeyModifiers, isRTL} from 'chrome://resources/js/util.m.js';
+import {Bookmark} from './bookmark_type.js';
import {BrowserApi} from './browser_api.js';
import {FittingType, TwoUpViewAction} from './constants.js';
import {ContentController, InkController, MessageData, PluginController, PrintPreviewParams} from './controller.js';
-import {Bookmark} from './elements/viewer-bookmark.js';
import {FitToChangedEvent} from './elements/viewer-zoom-toolbar.js';
import {GestureDetector} from './gesture_detector.js';
import {PDFMetrics} from './metrics.js';
@@ -221,11 +221,13 @@ export class PDFViewer {
/** @private {?ViewerPasswordScreenElement} */
this.passwordScreen_ =
- /** @type {!ViewerPasswordScreenElement} */ ($('password-screen'));
- this.passwordScreen_.addEventListener('password-submitted', e => {
- this.onPasswordSubmitted_(
- /** @type {!CustomEvent<{password: string}>} */ (e));
- });
+ /** @type {?ViewerPasswordScreenElement} */ ($('password-screen'));
+ if (this.passwordScreen_) {
+ this.passwordScreen_.addEventListener('password-submitted', e => {
+ this.onPasswordSubmitted_(
+ /** @type {!CustomEvent<{password: string}>} */ (e));
+ });
+ }
/** @private {?ViewerErrorScreenElement} */
this.errorScreen_ =
@@ -879,7 +881,7 @@ export class PDFViewer {
// Document load failed.
this.errorScreen_.show();
this.sizer_.style.display = 'none';
- if (this.passwordScreen_.active) {
+ if (this.passwordScreen_ && this.passwordScreen_.active) {
this.passwordScreen_.deny();
this.passwordScreen_.close();
}
@@ -934,19 +936,21 @@ export class PDFViewer {
if (this.isPrintPreview_) {
this.sendBackgroundColorForPrintPreview_();
+ } else {
+ $('toolbar').strings = strings;
+ $('toolbar').pdfAnnotationsEnabled =
+ loadTimeData.getBoolean('pdfAnnotationsEnabled');
+ $('toolbar').printingEnabled = loadTimeData.getBoolean('printingEnabled');
}
-
- $('toolbar').strings = strings;
- $('toolbar').pdfAnnotationsEnabled =
- loadTimeData.getBoolean('pdfAnnotationsEnabled');
- $('toolbar').printingEnabled = loadTimeData.getBoolean('printingEnabled');
$('zoom-toolbar').setStrings(strings);
$('zoom-toolbar').twoUpViewEnabled =
loadTimeData.getBoolean('pdfTwoUpViewEnabled') && !this.isPrintPreview_;
// Display the zoom toolbar after the UI text direction is set, to ensure it
// appears on the correct side of the PDF viewer.
$('zoom-toolbar').hidden = false;
- $('password-screen').strings = strings;
+ if (this.passwordScreen_) {
+ $('password-screen').strings = strings;
+ }
$('error-screen').strings = strings;
if ($('form-warning')) {
$('form-warning').strings = strings;
@@ -1294,7 +1298,7 @@ export class PDFViewer {
this.isUserInitiatedEvent_ = true;
// If we received the document dimensions, the password was good so we
// can dismiss the password screen.
- if (this.passwordScreen_.active) {
+ if (this.passwordScreen_ && this.passwordScreen_.active) {
this.passwordScreen_.close();
}
@@ -1319,6 +1323,7 @@ export class PDFViewer {
handlePasswordRequest_() {
// If the password screen isn't up, put it up. Otherwise we're
// responding to an incorrect password so deny it.
+ assert(!!this.passwordScreen_);
if (!this.passwordScreen_.active) {
this.hadPassword_ = true;
this.updateAnnotationAvailable_();
diff --git a/chromium/chrome/browser/resources/plugin_metadata/plugins_linux.json b/chromium/chrome/browser/resources/plugin_metadata/plugins_linux.json
index e4ebe1274d3..a005a83ce64 100644
--- a/chromium/chrome/browser/resources/plugin_metadata/plugins_linux.json
+++ b/chromium/chrome/browser/resources/plugin_metadata/plugins_linux.json
@@ -1,5 +1,5 @@
{
- "x-version": 43,
+ "x-version": 44,
"adobe-flash-player": {
"mime_types": [
"application/futuresplash",
@@ -10,9 +10,9 @@
],
"versions": [
{
- "version": "32.0.0.330",
+ "version": "32.0.0.387",
"status": "up_to_date",
- "reference": "https://helpx.adobe.com/security/products/flash-player/apsb20-06.html"
+ "reference": "https://helpx.adobe.com/security/products/flash-player/apsb20-30.html"
}
],
"lang": "en-US",
diff --git a/chromium/chrome/browser/resources/plugin_metadata/plugins_mac.json b/chromium/chrome/browser/resources/plugin_metadata/plugins_mac.json
index f26dc10cce3..9f02c597fa1 100644
--- a/chromium/chrome/browser/resources/plugin_metadata/plugins_mac.json
+++ b/chromium/chrome/browser/resources/plugin_metadata/plugins_mac.json
@@ -1,5 +1,5 @@
{
- "x-version": 49,
+ "x-version": 50,
"adobe-flash-player": {
"mime_types": [
"application/futuresplash",
@@ -7,9 +7,9 @@
],
"versions": [
{
- "version": "32.0.0.330",
+ "version": "32.0.0.387",
"status": "requires_authorization",
- "reference": "https://helpx.adobe.com/security/products/flash-player/apsb20-06.html"
+ "reference": "https://helpx.adobe.com/security/products/flash-player/apsb20-30.html"
}
],
"lang": "en-US",
diff --git a/chromium/chrome/browser/resources/plugin_metadata/plugins_win.json b/chromium/chrome/browser/resources/plugin_metadata/plugins_win.json
index 68dbb851351..02f8a244785 100644
--- a/chromium/chrome/browser/resources/plugin_metadata/plugins_win.json
+++ b/chromium/chrome/browser/resources/plugin_metadata/plugins_win.json
@@ -1,5 +1,5 @@
{
- "x-version": 58,
+ "x-version": 59,
"adobe-flash-player": {
"mime_types": [
"application/futuresplash",
@@ -7,9 +7,9 @@
],
"versions": [
{
- "version": "32.0.0.330",
+ "version": "32.0.0.387",
"status": "requires_authorization",
- "reference": "https://helpx.adobe.com/security/products/flash-player/apsb20-06.html"
+ "reference": "https://helpx.adobe.com/security/products/flash-player/apsb20-30.html"
}
],
"lang": "en-US",
diff --git a/chromium/chrome/browser/resources/print_preview/BUILD.gn b/chromium/chrome/browser/resources/print_preview/BUILD.gn
index eac678d2bba..63df1dd2a18 100644
--- a/chromium/chrome/browser/resources/print_preview/BUILD.gn
+++ b/chromium/chrome/browser/resources/print_preview/BUILD.gn
@@ -43,7 +43,10 @@ if (optimize_webui) {
"root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir),
]
- deps = [ "ui:polymer3_elements" ]
+ deps = [
+ "../pdf/elements:web_components",
+ "ui:web_components",
+ ]
defines = chrome_grit_defines
outputs = [
"grit/print_preview_resources.h",
@@ -67,9 +70,7 @@ js_type_check("print_preview_module_resources") {
is_polymer3 = true
deps = [
":cloud_print_interface",
- ":cloud_print_interface_js",
- ":cloud_print_interface_manager",
- ":cloud_print_interface_native",
+ ":cloud_print_interface_impl",
":dark_mode_behavior",
":metrics",
":native_layer",
@@ -91,23 +92,14 @@ js_library("metrics") {
js_library("cloud_print_interface") {
deps = [
+ ":native_layer",
"data:destination",
"data:invitation",
"//ui/webui/resources/js/cr:event_target.m",
]
}
-js_library("cloud_print_interface_manager") {
- deps = [
- ":cloud_print_interface",
- ":cloud_print_interface_js",
- ":cloud_print_interface_native",
- ":native_layer",
- "//ui/webui/resources/js:load_time_data.m",
- ]
-}
-
-js_library("cloud_print_interface_js") {
+js_library("cloud_print_interface_impl") {
deps = [
":cloud_print_interface",
":native_layer",
@@ -115,14 +107,11 @@ js_library("cloud_print_interface_js") {
"data:destination",
"data:invitation",
"//ui/webui/resources/js:assert.m",
+ "//ui/webui/resources/js:cr.m",
"//ui/webui/resources/js/cr:event_target.m",
]
}
-js_library("cloud_print_interface_native") {
- deps = [ ":cloud_print_interface" ]
-}
-
js_library("native_layer") {
deps = [
"data:destination",
diff --git a/chromium/chrome/browser/resources/print_preview/cloud_print_interface.js b/chromium/chrome/browser/resources/print_preview/cloud_print_interface.js
index de2a7ba09a4..e144820a901 100644
--- a/chromium/chrome/browser/resources/print_preview/cloud_print_interface.js
+++ b/chromium/chrome/browser/resources/print_preview/cloud_print_interface.js
@@ -5,6 +5,7 @@
import {NativeEventTarget as EventTarget} from 'chrome://resources/js/cr/event_target.m.js';
import {Destination, DestinationOrigin} from './data/destination.js';
import {Invitation} from './data/invitation.js';
+import {NativeLayer} from './native_layer.js';
/**
* Event types dispatched by the cloudprint interface.
@@ -76,6 +77,21 @@ export class CloudPrintInterface {
areCookieDestinationsDisabled() {}
/**
+ * @param {string} baseUrl Base part of the Google Cloud Print service URL
+ * with no trailing slash. For example,
+ * 'https://www.google.com/cloudprint'.
+ * @param {!NativeLayer} nativeLayer Native layer used to get
+ * Auth2 tokens.
+ * @param {boolean} isInAppKioskMode Whether the print preview is in App
+ * Kiosk mode.
+ * @param {string} uiLocale The UI locale.
+ */
+ configure(baseUrl, nativeLayer, isInAppKioskMode, uiLocale) {}
+
+ /** @return {boolean} Whether the interface has been configured. */
+ isConfigured() {}
+
+ /**
* @return {boolean} Whether a search for cloud destinations is in progress.
*/
isCloudDestinationSearchInProgress() {}
diff --git a/chromium/chrome/browser/resources/print_preview/cloud_print_interface_js.js b/chromium/chrome/browser/resources/print_preview/cloud_print_interface_impl.js
index 16af9283310..604425764cf 100644
--- a/chromium/chrome/browser/resources/print_preview/cloud_print_interface_js.js
+++ b/chromium/chrome/browser/resources/print_preview/cloud_print_interface_impl.js
@@ -3,6 +3,7 @@
// found in the LICENSE file.
import {assert} from 'chrome://resources/js/assert.m.js';
+import {addSingletonGetter} from 'chrome://resources/js/cr.m.js';
import {NativeEventTarget as EventTarget} from 'chrome://resources/js/cr/event_target.m.js';
import {CloudPrintInterface, CloudPrintInterfaceErrorEventDetail, CloudPrintInterfaceEventType} from './cloud_print_interface.js';
@@ -13,44 +14,33 @@ import {NativeLayer} from './native_layer.js';
/** @implements {CloudPrintInterface} */
-export class CloudPrintInterfaceJS {
- /**
- * API to the Google Cloud Print service.
- * @param {string} baseUrl Base part of the Google Cloud Print service URL
- * with no trailing slash. For example,
- * 'https://www.google.com/cloudprint'.
- * @param {!NativeLayer} nativeLayer Native layer used to get
- * Auth2 tokens.
- * @param {boolean} isInAppKioskMode Whether the print preview is in App
- * Kiosk mode.
- * @param {string} uiLocale The UI locale.
- */
- constructor(baseUrl, nativeLayer, isInAppKioskMode, uiLocale) {
+export class CloudPrintInterfaceImpl {
+ constructor() {
/**
* The base URL of the Google Cloud Print API.
* @private {string}
*/
- this.baseUrl_ = baseUrl;
+ this.baseUrl_ = '';
/**
* Used to get Auth2 tokens.
- * @private {!NativeLayer}
+ * @private {?NativeLayer}
*/
- this.nativeLayer_ = nativeLayer;
+ this.nativeLayer_ = null;
/**
* Whether Print Preview is in App Kiosk mode; use only printers available
* for the device and disable cookie destinations.
* @private {boolean}
*/
- this.isInAppKioskMode_ = isInAppKioskMode;
+ this.isInAppKioskMode_ = false;
/**
* The UI locale, used to get printer information in the correct locale
* from Google Cloud Print.
* @private {string}
*/
- this.uiLocale_ = uiLocale;
+ this.uiLocale_ = '';
/**
* Currently logged in users (identified by email) mapped to the Google
@@ -87,6 +77,19 @@ export class CloudPrintInterfaceJS {
}
/** @override */
+ configure(baseUrl, nativeLayer, isInAppKioskMode, uiLocale) {
+ this.baseUrl_ = baseUrl;
+ this.nativeLayer_ = nativeLayer;
+ this.isInAppKioskMode_ = isInAppKioskMode;
+ this.uiLocale_ = uiLocale;
+ }
+
+ /** @override */
+ isConfigured() {
+ return this.baseUrl_ !== '';
+ }
+
+ /** @override */
areCookieDestinationsDisabled() {
return this.isInAppKioskMode_;
}
@@ -625,6 +628,8 @@ export class CloudPrintInterfaceJS {
}
}
+addSingletonGetter(CloudPrintInterfaceImpl);
+
/**
* Content type header value for a URL encoded HTTP request.
* @const {string}
diff --git a/chromium/chrome/browser/resources/print_preview/cloud_print_interface_manager.js b/chromium/chrome/browser/resources/print_preview/cloud_print_interface_manager.js
deleted file mode 100644
index f33ac2897d5..00000000000
--- a/chromium/chrome/browser/resources/print_preview/cloud_print_interface_manager.js
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (c) 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {CloudPrintInterface} from './cloud_print_interface.js';
-import {CloudPrintInterfaceJS} from './cloud_print_interface_js.js';
-import {CloudPrintInterfaceNative} from './cloud_print_interface_native.js';
-import {NativeLayer} from './native_layer.js';
-
-/** @type {?CloudPrintInterface} */
-let instance = null;
-
-/**
- * @param {string} baseUrl Base part of the Google Cloud Print service URL
- * with no trailing slash. For example,
- * 'https://www.google.com/cloudprint'.
- * @param {!NativeLayer} nativeLayer Native layer instance.
- * @param {boolean} isInAppKioskMode Whether the print preview is in App
- * Kiosk mode.
- * @param {string} uiLocale The UI locale, for example "en-US" or "fr".
- * @return {!CloudPrintInterface}
- */
-export function getCloudPrintInterface(
- baseUrl, nativeLayer, isInAppKioskMode, uiLocale) {
- if (instance === null) {
- if (loadTimeData.getBoolean('cloudPrinterHandlerEnabled')) {
- instance = new CloudPrintInterfaceNative();
- } else {
- instance = new CloudPrintInterfaceJS(
- baseUrl, nativeLayer, isInAppKioskMode, uiLocale);
- }
- }
- return instance;
-}
-
-/**
- * Sets the CloudPrintInterface singleton instance, useful for testing.
- * @param {!CloudPrintInterface} cloudPrintInterface
- */
-export function setCloudPrintInterfaceForTesting(cloudPrintInterface) {
- instance = cloudPrintInterface;
-}
diff --git a/chromium/chrome/browser/resources/print_preview/cloud_print_interface_native.js b/chromium/chrome/browser/resources/print_preview/cloud_print_interface_native.js
deleted file mode 100644
index 983e2ffe8ba..00000000000
--- a/chromium/chrome/browser/resources/print_preview/cloud_print_interface_native.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import {CloudPrintInterface} from './cloud_print_interface.js';
-
-/** @implements {CloudPrintInterface} */
-export class CloudPrintInterfaceNative {
- constructor() {}
-
- /** @override */
- areCookieDestinationsDisabled() {}
-
- /** @override */
- isCloudDestinationSearchInProgress() {}
-
- /** @override */
- getEventTarget() {}
-
- /** @override */
- search(opt_account, opt_origin) {}
-
- /** @override */
- setUsers(users) {}
-
- /** @override */
- invites(account) {}
-
- /** @override */
- processInvite(invitation, accept) {}
-
- /** @override */
- submit(destination, printTicket, documentTitle, data) {}
-
- /** @override */
- printer(printerId, origin, account) {}
-}
diff --git a/chromium/chrome/browser/resources/print_preview/data/destination.js b/chromium/chrome/browser/resources/print_preview/data/destination.js
index 80124d68cbc..3c6155bd266 100644
--- a/chromium/chrome/browser/resources/print_preview/data/destination.js
+++ b/chromium/chrome/browser/resources/print_preview/data/destination.js
@@ -949,3 +949,7 @@ Destination.GooglePromotedId = {
DOCS: '__google__docs',
SAVE_AS_PDF: 'Save as PDF'
};
+
+/** @type {string} Unique identifier for the Save as PDF destination */
+export const PDF_DESTINATION_KEY =
+ `${Destination.GooglePromotedId.SAVE_AS_PDF}/${DestinationOrigin.LOCAL}/`;
diff --git a/chromium/chrome/browser/resources/print_preview/data/destination_store.js b/chromium/chrome/browser/resources/print_preview/data/destination_store.js
index fab9b6385db..f8b40cdd974 100644
--- a/chromium/chrome/browser/resources/print_preview/data/destination_store.js
+++ b/chromium/chrome/browser/resources/print_preview/data/destination_store.js
@@ -890,17 +890,9 @@ export class DestinationStore extends EventTarget {
PrinterType.LOCAL_PRINTER,
];
- // If the cloud printer handler is enabled, request cloud printers from
- // the handler instead of trying to directly communicate with the cloud
- // print server. See https://crbug.com/829414.
- if (loadTimeData.getBoolean('cloudPrinterHandlerEnabled')) {
- // Add cloud printer to the map.
- this.destinationSearchStatus_.set(
- PrinterType.CLOUD_PRINTER, DestinationStorePrinterSearchStatus.START);
- types.push(PrinterType.CLOUD_PRINTER);
- } else {
- this.startLoadCloudDestinations();
- }
+ // Cloud destinations are pulled from the cloud print server instead of the
+ // NativeLayer/PrintPreviewHandler.
+ this.startLoadCloudDestinations();
for (const printerType of types) {
this.startLoadDestinations_(printerType);
diff --git a/chromium/chrome/browser/resources/print_preview/data/model.js b/chromium/chrome/browser/resources/print_preview/data/model.js
index 24f2b0c5cac..8eea52a6e5f 100644
--- a/chromium/chrome/browser/resources/print_preview/data/model.js
+++ b/chromium/chrome/browser/resources/print_preview/data/model.js
@@ -99,7 +99,8 @@ export let SerializedSettings;
/**
* @typedef {{
* value: *,
- * managed: boolean
+ * managed: boolean,
+ * applyOnDestinationUpdate: boolean
* }}
*/
export let PolicyEntry;
@@ -108,6 +109,8 @@ export let PolicyEntry;
* @typedef {{
* headerFooter: (PolicyEntry | undefined),
* cssBackground: (PolicyEntry | undefined),
+ * mediaSize: (PolicyEntry | undefined),
+ * sheets: (number | undefined),
* }}
*/
export let PolicySettings;
@@ -482,6 +485,13 @@ Polymer({
/** @type {!Size} */
pageSize: Object,
+
+ /** @private {number} */
+ maxSheets: {
+ type: Number,
+ value: 0,
+ notify: true,
+ }
},
observers: [
@@ -1005,15 +1015,18 @@ Polymer({
* @param {string} settingName Name of the setting being applied.
* @param {*} value Value of the setting provided via policy.
* @param {boolean} managed Flag showing whether value of setting is managed.
+ * @param {boolean} applyOnDestinationUpdate Flag showing whether policy
+ * should be applied on every destination update.
* @private
*/
- setPolicySetting_(settingName, value, managed) {
+ setPolicySetting_(settingName, value, managed, applyOnDestinationUpdate) {
if (!this.policySettings_) {
this.policySettings_ = {};
}
this.policySettings_[settingName] = {
value: value,
managed: managed,
+ applyOnDestinationUpdate: applyOnDestinationUpdate,
};
},
@@ -1030,7 +1043,9 @@ Polymer({
case 'headerFooter': {
const value = allowedMode !== undefined ? allowedMode : defaultMode;
if (value !== undefined) {
- this.setPolicySetting_(settingName, value, allowedMode !== undefined);
+ this.setPolicySetting_(
+ settingName, value, allowedMode !== undefined,
+ /*applyOnDestinationUpdate=*/ false);
}
break;
}
@@ -1039,7 +1054,15 @@ Polymer({
if (value !== undefined) {
this.setPolicySetting_(
settingName, value === BackgroundGraphicsModeRestriction.ENABLED,
- !!allowedMode);
+ !!allowedMode, /*applyOnDestinationUpdate=*/ false);
+ }
+ break;
+ }
+ case 'mediaSize': {
+ if (defaultMode !== undefined) {
+ this.setPolicySetting_(
+ settingName, defaultMode, /*managed=*/ false,
+ /*applyOnDestinationUpdate=*/ true);
}
break;
}
@@ -1057,7 +1080,7 @@ Polymer({
if (policies === undefined) {
return;
}
- ['headerFooter', 'cssBackground'].forEach(settingName => {
+ ['headerFooter', 'cssBackground', 'mediaSize'].forEach(settingName => {
if (!policies[settingName]) {
return;
}
@@ -1065,6 +1088,17 @@ Polymer({
const allowedMode = policies[settingName].allowedMode;
this.configurePolicySetting_(settingName, allowedMode, defaultMode);
});
+ // <if expr="chromeos">
+ if (policies['sheets']) {
+ if (!this.policySettings_) {
+ this.policySettings_ = {};
+ }
+ this.policySettings_['sheets'] = {
+ value: policies['sheets'].value,
+ applyOnDestinationUpdate: false
+ };
+ }
+ // </if>
},
applyStickySettings() {
@@ -1121,22 +1155,30 @@ Polymer({
if (this.policySettings_) {
for (const [settingName, policy] of Object.entries(
this.policySettings_)) {
- if (policy.value !== undefined) {
- this.setSetting(settingName, policy.value, true);
+ // <if expr="chromeos">
+ if (settingName === 'sheets') {
+ this.maxSheets = this.policySettings_['sheets'].value;
+ continue;
}
- if (policy.managed) {
- this.set(`settings.${settingName}.setByPolicy`, true);
+ // </if>
+ if (policy.value !== undefined && !policy.applyOnDestinationUpdate) {
+ this.setSetting(settingName, policy.value, true);
+ if (policy.managed) {
+ this.set(`settings.${settingName}.setByPolicy`, true);
+ }
}
}
}
},
- // <if expr="chromeos">
+ // TODO (crbug.com/1069802): Migrate these policies from Destination.policies
+ // to NativeInitialSettings.policies.
/**
* Restricts settings and applies defaults as defined by policy applicable to
* current destination.
*/
applyDestinationSpecificPolicies() {
+ // <if expr="chromeos">
const colorPolicy = this.destination.colorPolicy;
const colorValue =
colorPolicy ? colorPolicy : this.destination.defaultColorPolicy;
@@ -1179,10 +1221,25 @@ Polymer({
this.set('settings.pin.value', pinValue === PinModeRestriction.PIN);
}
this.set('settings.pin.setByPolicy', !!pinPolicy);
+ // </if>
+
+ if (this.settings.mediaSize.available && this.policySettings_) {
+ const mediaSizePolicy = this.policySettings_['mediaSize'] &&
+ this.policySettings_['mediaSize'].value;
+ if (mediaSizePolicy !== undefined) {
+ const matchingOption =
+ this.destination.capabilities.printer.media_size.option.find(o => {
+ return o.width_microns === mediaSizePolicy.width &&
+ o.height_microns === mediaSizePolicy.height;
+ });
+ if (matchingOption !== undefined) {
+ this.set('settings.mediaSize.value', matchingOption);
+ }
+ }
+ }
this.updateManaged_();
},
- // </if>
/** @private */
updateManaged_() {
diff --git a/chromium/chrome/browser/resources/print_preview/data/user_manager.js b/chromium/chrome/browser/resources/print_preview/data/user_manager.js
index fb96c98cfbc..7fc1ee44a96 100644
--- a/chromium/chrome/browser/resources/print_preview/data/user_manager.js
+++ b/chromium/chrome/browser/resources/print_preview/data/user_manager.js
@@ -8,6 +8,7 @@ import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behav
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {CloudPrintInterface, CloudPrintInterfaceErrorEventDetail, CloudPrintInterfaceEventType} from '../cloud_print_interface.js';
+import {CloudPrintInterfaceImpl} from '../cloud_print_interface_impl.js';
import {Destination, DestinationOrigin} from './destination.js';
import {DestinationStore} from './destination_store.js';
@@ -34,14 +35,7 @@ Polymer({
cloudPrintDisabled: {
type: Boolean,
- value: true,
- notify: true,
- },
-
- /** @type {?CloudPrintInterface} */
- cloudPrintInterface: {
- type: Object,
- observer: 'onCloudPrintInterfaceSet_',
+ observer: 'onCloudPrintDisabledChanged_',
},
/** @type {?DestinationStore} */
@@ -62,6 +56,9 @@ Polymer({
},
},
+ /** @private {?CloudPrintInterface} */
+ cloudPrintInterface_: null,
+
/** @private {boolean} */
initialized_: false,
@@ -108,23 +105,26 @@ Polymer({
},
/** @private */
- onCloudPrintInterfaceSet_() {
+ onCloudPrintDisabledChanged_() {
+ if (this.cloudPrintDisabled) {
+ return;
+ }
+
+ this.cloudPrintInterface_ = CloudPrintInterfaceImpl.getInstance();
this.tracker_.add(
- this.cloudPrintInterface.getEventTarget(),
+ this.cloudPrintInterface_.getEventTarget(),
CloudPrintInterfaceEventType.UPDATE_USERS,
this.onCloudPrintUpdateUsers_.bind(this));
[CloudPrintInterfaceEventType.SEARCH_FAILED,
CloudPrintInterfaceEventType.PRINTER_FAILED,
].forEach(eventType => {
this.tracker_.add(
- this.cloudPrintInterface.getEventTarget(), eventType,
+ this.cloudPrintInterface_.getEventTarget(), eventType,
this.checkCloudPrintStatus_.bind(this));
});
if (this.users.length > 0) {
- this.cloudPrintInterface.setUsers(this.users);
+ this.cloudPrintInterface_.setUsers(this.users);
}
- assert(this.cloudPrintDisabled);
- this.cloudPrintDisabled = false;
},
/**
@@ -136,7 +136,7 @@ Polymer({
*/
checkCloudPrintStatus_(event) {
if (event.detail.status !== 403 ||
- this.cloudPrintInterface.areCookieDestinationsDisabled()) {
+ this.cloudPrintInterface_.areCookieDestinationsDisabled()) {
return;
}
@@ -167,8 +167,8 @@ Polymer({
const updateActiveUser = (users.length > 0 && this.users.length === 0) ||
!users.includes(this.activeUser);
this.users = users;
- if (this.cloudPrintInterface) {
- this.cloudPrintInterface.setUsers(users);
+ if (this.cloudPrintInterface_) {
+ this.cloudPrintInterface_.setUsers(users);
}
if (updateActiveUser) {
this.updateActiveUser(this.users[0] || '');
diff --git a/chromium/chrome/browser/resources/print_preview/native_layer.js b/chromium/chrome/browser/resources/print_preview/native_layer.js
index 7e4ae9a91e3..ff0c3d18686 100644
--- a/chromium/chrome/browser/resources/print_preview/native_layer.js
+++ b/chromium/chrome/browser/resources/print_preview/native_layer.js
@@ -58,6 +58,15 @@ export const BackgroundGraphicsModeRestriction = {
* cssBackground: ({
* allowedMode: (BackgroundGraphicsModeRestriction | undefined),
* defaultMode: (BackgroundGraphicsModeRestriction | undefined),
+ * } | undefined),
+ * mediaSize: ({
+ * defaultMode: ({
+ * width: (number | undefined),
+ * height: (number | undefined),
+ * } | undefined),
+ * } | undefined),
+ * sheets: ({
+ * value: (number | undefined),
* } | undefined)
* }}
*/
@@ -256,12 +265,7 @@ export class NativeLayer {
* printing settings in the Settings App.
*/
openSettingsPrintPage() {
- // <if expr="chromeos">
chrome.send('openPrinterSettings');
- // </if>
- // <if expr="not chromeos">
- window.open('chrome://settings/printing');
- // </if>
}
/**
diff --git a/chromium/chrome/browser/resources/print_preview/print_preview.js b/chromium/chrome/browser/resources/print_preview/print_preview.js
index 80aa82a4711..21658c88e7f 100644
--- a/chromium/chrome/browser/resources/print_preview/print_preview.js
+++ b/chromium/chrome/browser/resources/print_preview/print_preview.js
@@ -5,7 +5,7 @@
import './ui/app.js';
export {CloudPrintInterface, CloudPrintInterfaceEventType} from './cloud_print_interface.js';
-export {setCloudPrintInterfaceForTesting} from './cloud_print_interface_manager.js';
+export {CloudPrintInterfaceImpl} from './cloud_print_interface_impl.js';
export {ColorMode, createDestinationKey, Destination, DestinationCertificateStatus, DestinationConnectionStatus, DestinationOrigin, DestinationType, makeRecentDestination} from './data/destination.js';
export {PrinterType} from './data/destination_match.js';
// <if expr="chromeos">
diff --git a/chromium/chrome/browser/resources/print_preview/print_preview_resources.grd b/chromium/chrome/browser/resources/print_preview/print_preview_resources.grd
index 57807c67d4a..8f7cd3fe0b5 100644
--- a/chromium/chrome/browser/resources/print_preview/print_preview_resources.grd
+++ b/chromium/chrome/browser/resources/print_preview/print_preview_resources.grd
@@ -15,232 +15,277 @@
<!-- Generated Polymer 3 elements -->
<include name="IDR_PRINT_PREVIEW_UI_APP_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/app.js"
- use_base_dir="false" type="BINDATA" preprocess="true"/>
+ use_base_dir="false" compress="false" type="BINDATA" preprocess="true"/>
<include name="IDR_PRINT_PREVIEW_UI_SIDEBAR_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/sidebar.js"
- use_base_dir="false" type="BINDATA" preprocess="true"/>
+ use_base_dir="false" compress="false" type="BINDATA" preprocess="true"/>
<include name="IDR_PRINT_PREVIEW_UI_MARGIN_CONTROL_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/margin_control.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
<include name="IDR_PRINT_PREVIEW_UI_MARGIN_CONTROL_CONTAINER_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/margin_control_container.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
<include name="IDR_PRINT_PREVIEW_UI_PREVIEW_AREA_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/preview_area.js"
- use_base_dir="false" type="BINDATA" preprocess="true"/>
+ use_base_dir="false" compress="false" type="BINDATA" preprocess="true"/>
<include name="IDR_PRINT_PREVIEW_UI_HEADER_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/header.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
<include name="IDR_PRINT_PREVIEW_UI_BUTTON_STRIP_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/button_strip.js"
- use_base_dir="false" type="BINDATA" preprocess="true"/>
+ use_base_dir="false" compress="false" type="BINDATA" preprocess="true"/>
<include name="IDR_PRINT_PREVIEW_UI_SETTINGS_SECTION_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/settings_section.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
<include name="IDR_PRINT_PREVIEW_UI_SETTINGS_SELECT_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/settings_select.js"
- use_base_dir="false" type="BINDATA"/>
- <include name="IDR_PRINT_PREVIEW_UI_DESTINATION_SELECT_JS"
- file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/destination_select.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
+ <if expr="not chromeos">
+ <include name="IDR_PRINT_PREVIEW_UI_DESTINATION_SELECT_JS"
+ file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/destination_select.js"
+ use_base_dir="false" compress="false" type="BINDATA"/>
+ </if>
+ <if expr="chromeos">
+ <include name="IDR_PRINT_PREVIEW_UI_DESTINATION_SELECT_CROS_JS"
+ file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/destination_select_cros.js"
+ use_base_dir="false" compress="false" type="BINDATA"/>
+ </if>
+ <include name="IDR_PRINT_PREVIEW_UI_DESTINATION_SELECT_CSS_JS"
+ file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/destination_select_css.js"
+ use_base_dir="false" compress="false" type="BINDATA"/>
<include name="IDR_PRINT_PREVIEW_UI_DESTINATION_SETTINGS_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/destination_settings.js"
- use_base_dir="false" type="BINDATA" preprocess="true"/>
- <if expr="chromeos">
- <include name="IDR_PRINT_PREVIEW_UI_PIN_SETTINGS_JS"
- file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/pin_settings.js"
- use_base_dir="false" type="BINDATA"/>
- </if>
+ use_base_dir="false" compress="false" type="BINDATA" preprocess="true"/>
+ <if expr="chromeos">
+ <include name="IDR_PRINT_PREVIEW_UI_PIN_SETTINGS_JS"
+ file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/pin_settings.js"
+ use_base_dir="false" compress="false" type="BINDATA"/>
+ </if>
<include name="IDR_PRINT_PREVIEW_UI_PAGES_SETTINGS_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/pages_settings.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
<include name="IDR_PRINT_PREVIEW_UI_COPIES_SETTINGS_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/copies_settings.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
<include name="IDR_PRINT_PREVIEW_UI_LAYOUT_SETTINGS_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/layout_settings.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
<include name="IDR_PRINT_PREVIEW_UI_COLOR_SETTINGS_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/color_settings.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
<include name="IDR_PRINT_PREVIEW_UI_MEDIA_SIZE_SETTINGS_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/media_size_settings.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
<include name="IDR_PRINT_PREVIEW_UI_MARGINS_SETTINGS_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/margins_settings.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
<include name="IDR_PRINT_PREVIEW_UI_DPI_SETTINGS_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/dpi_settings.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
<include name="IDR_PRINT_PREVIEW_UI_DUPLEX_SETTINGS_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/duplex_settings.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
<include name="IDR_PRINT_PREVIEW_UI_SCALING_SETTINGS_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/scaling_settings.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
<include name="IDR_PRINT_PREVIEW_UI_PAGES_PER_SHEET_SETTINGS_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/pages_per_sheet_settings.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
<include name="IDR_PRINT_PREVIEW_UI_OTHER_OPTIONS_SETTINGS_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/other_options_settings.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
<include name="IDR_PRINT_PREVIEW_UI_ADVANCED_OPTIONS_SETTINGS_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/advanced_options_settings.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
<include name="IDR_PRINT_PREVIEW_UI_MORE_SETTINGS_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/more_settings.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
<include name="IDR_PRINT_PREVIEW_UI_ADVANCED_SETTINGS_DIALOG_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/advanced_settings_dialog.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
<include name="IDR_PRINT_PREVIEW_UI_ADVANCED_SETTINGS_ITEM_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/advanced_settings_item.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
<include name="IDR_PRINT_PREVIEW_UI_NUMBER_SETTINGS_SECTION_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/number_settings_section.js"
- use_base_dir="false" type="BINDATA"/>
- <if expr="not chromeos">
- <include name="IDR_PRINT_PREVIEW_UI_LINK_CONTAINER_JS"
- file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/link_container.js"
- use_base_dir="false" type="BINDATA" preprocess="true"/>
- </if>
+ use_base_dir="false" compress="false" type="BINDATA"/>
+ <if expr="not chromeos">
+ <include name="IDR_PRINT_PREVIEW_UI_LINK_CONTAINER_JS"
+ file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/link_container.js"
+ use_base_dir="false" compress="false" type="BINDATA" preprocess="true"/>
+ </if>
<include name="IDR_PRINT_PREVIEW_UI_DESTINATION_DIALOG_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/destination_dialog.js"
- use_base_dir="false" type="BINDATA" preprocess="true"/>
+ use_base_dir="false" compress="false" type="BINDATA" preprocess="true"/>
<include name="IDR_PRINT_PREVIEW_UI_DESTINATION_LIST_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/destination_list.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
<include name="IDR_PRINT_PREVIEW_UI_DESTINATION_LIST_ITEM_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/destination_list_item.js"
- use_base_dir="false" type="BINDATA" preprocess="true"/>
+ use_base_dir="false" compress="false" type="BINDATA" preprocess="true"/>
<include name="IDR_PRINT_PREVIEW_UI_PROVISIONAL_DESTINATION_RESOLVER_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/provisional_destination_resolver.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
<include name="IDR_PRINT_PREVIEW_UI_PRINT_PREVIEW_SEARCH_BOX_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/print_preview_search_box.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
<include name="IDR_PRINT_PREVIEW_UI_PRINT_PREVIEW_SHARED_CSS_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/print_preview_shared_css.js"
- use_base_dir="false" type="BINDATA" preprocess="true"/>
+ use_base_dir="false" compress="false" type="BINDATA" preprocess="true"/>
<include name="IDR_PRINT_PREVIEW_UI_PRINT_PREVIEW_VARS_CSS_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/print_preview_vars_css.js"
- use_base_dir="false" type="BINDATA" preprocess="true"/>
+ use_base_dir="false" compress="false" type="BINDATA" preprocess="true"/>
<include name="IDR_PRINT_PREVIEW_UI_THROBBER_CSS_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/throbber_css.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
<include name="IDR_PRINT_PREVIEW_UI_ICONS_JS"
file="${root_gen_dir}/chrome/browser/resources/print_preview/ui/icons.js"
- use_base_dir="false" type="BINDATA"/>
+ use_base_dir="false" compress="false" type="BINDATA"/>
+ <include name="IDR_PRINT_PREVIEW_PDF_INDEX_PP_HTML"
+ file="../pdf/index_pp.html"
+ type="BINDATA" />
+ <include name="IDR_PRINT_PREVIEW_PDF_MAIN_PP_JS"
+ file="../pdf/main_pp.js"
+ type="BINDATA" />
+ <include name="IDR_PRINT_PREVIEW_PDF_VIEWER_PAGE_INDICATOR_JS"
+ file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-page-indicator.js"
+ use_base_dir="false"
+ type="BINDATA" />
</includes>
<structures>
<structure name="IDR_PRINT_PREVIEW_PRINT_PREVIEW_HTML"
file="print_preview.html"
+ compress="false"
type="chrome_html"
preprocess="true" />
<structure name="IDR_PRINT_PREVIEW_PRINT_PREVIEW_JS"
file="print_preview.js"
+ compress="false"
type="chrome_html"
preprocess="true" />
<structure name="IDR_PRINT_PREVIEW_DATA_MODEL_JS"
file="data/model.js"
+ compress="false"
type="chrome_html"
preprocess="true" />
<structure name="IDR_PRINT_PREVIEW_CLOUD_PRINT_INTERFACE_JS"
file="cloud_print_interface.js"
+ compress="false"
type="chrome_html" />
- <structure name="IDR_PRINT_PREVIEW_CLOUD_PRINT_INTERFACE_JS_JS"
- file="cloud_print_interface_js.js"
+ <structure name="IDR_PRINT_PREVIEW_CLOUD_PRINT_INTERFACE_IMPL_JS"
+ file="cloud_print_interface_impl.js"
+ compress="false"
type="chrome_html"
preprocess="true" />
- <structure name="IDR_PRINT_PREVIEW_CLOUD_PRINT_INTERFACE_NATIVE_JS"
- file="cloud_print_interface_native.js"
- type="chrome_html" />
- <structure name="IDR_PRINT_PREVIEW_CLOUD_PRINT_INTERFACE_MANAGER_JS"
- file="cloud_print_interface_manager.js"
- type="chrome_html" />
<structure name="IDR_PRINT_PREVIEW_NATIVE_LAYER_JS"
file="native_layer.js"
+ compress="false"
type="chrome_html"
preprocess="true" />
<structure name="IDR_PRINT_PREVIEW_DATA_DESTINATION_JS"
file="data/destination.js"
+ compress="false"
type="chrome_html"
preprocess="true" />
<structure name="IDR_PRINT_PREVIEW_DATA_DESTINATION_MATCH_JS"
file="data/destination_match.js"
+ compress="false"
type="chrome_html" />
- <if expr="chromeos">
- <structure name="IDR_PRINT_PREVIEW_DATA_DESTINATION_POLICIES_JS"
- file="data/destination_policies.js"
- type="chrome_html" />
- </if>
+ <if expr="chromeos">
+ <structure name="IDR_PRINT_PREVIEW_DATA_DESTINATION_POLICIES_JS"
+ file="data/destination_policies.js"
+ compress="false"
+ type="chrome_html" />
+ </if>
<structure name="IDR_PRINT_PREVIEW_DATA_DESTINATION_STORE_JS"
file="data/destination_store.js"
+ compress="false"
type="chrome_html"
preprocess="true" />
<structure name="IDR_PRINT_PREVIEW_DATA_CLOUD_PARSERS_JS"
file="data/cloud_parsers.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_PRINT_PREVIEW_DATA_LOCAL_PARSERS_JS"
file="data/local_parsers.js"
+ compress="false"
type="chrome_html"
preprocess="true" />
<structure name="IDR_PRINT_PREVIEW_DATA_INVITATION_JS"
file="data/invitation.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_PRINT_PREVIEW_DATA_INVITATION_STORE_JS"
file="data/invitation_store.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_PRINT_PREVIEW_DATA_MARGINS_JS"
file="data/margins.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_PRINT_PREVIEW_DATA_USER_MANAGER_JS"
file="data/user_manager.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_PRINT_PREVIEW_METRICS_JS"
file="metrics.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_PRINT_PREVIEW_PRINT_PREVIEW_UTILS_JS"
file="print_preview_utils.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_PRINT_PREVIEW_PRINT_DARK_MODE_BEHAVIOR_JS"
file="dark_mode_behavior.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_PRINT_PREVIEW_DATA_DOCUMENT_INFO_JS"
file="data/document_info.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_PRINT_PREVIEW_DATA_SCALING_JS"
file="data/scaling.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_PRINT_PREVIEW_DATA_SIZE_JS"
file="data/size.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_PRINT_PREVIEW_DATA_COORDINATE2D_JS"
file="data/coordinate2d.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_PRINT_PREVIEW_DATA_MEASUREMENT_SYSTEM_JS"
file="data/measurement_system.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_PRINT_PREVIEW_DATA_PRINTABLE_AREA_JS"
file="data/printable_area.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_PRINT_PREVIEW_UI_PLUGIN_PROXY_JS"
file="ui/plugin_proxy.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_PRINT_PREVIEW_UI_SETTINGS_BEHAVIOR_JS"
file="ui/settings_behavior.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_PRINT_PREVIEW_UI_INPUT_BEHAVIOR_JS"
file="ui/input_behavior.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_PRINT_PREVIEW_UI_SELECT_BEHAVIOR_JS"
file="ui/select_behavior.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_PRINT_PREVIEW_DATA_STATE_JS"
file="data/state.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_PRINT_PREVIEW_UI_HIGHLIGHT_UTILS_JS"
file="ui/highlight_utils.js"
+ compress="false"
type="chrome_html" />
</structures>
</release>
diff --git a/chromium/chrome/browser/resources/print_preview/print_preview_resources_vulcanized.grd b/chromium/chrome/browser/resources/print_preview/print_preview_resources_vulcanized.grd
index 79ab4094294..0eecabc3c5d 100644
--- a/chromium/chrome/browser/resources/print_preview/print_preview_resources_vulcanized.grd
+++ b/chromium/chrome/browser/resources/print_preview/print_preview_resources_vulcanized.grd
@@ -23,6 +23,16 @@
preprocess="true"
compress="gzip"
type="BINDATA" />
+ <include name="IDR_PRINT_PREVIEW_PDF_INDEX_PP_HTML"
+ file="../pdf/index_pp.html"
+ type="BINDATA" />
+ <include name="IDR_PRINT_PREVIEW_PDF_MAIN_PP_JS"
+ file="../pdf/main_pp.js"
+ type="BINDATA" />
+ <include name="IDR_PRINT_PREVIEW_PDF_VIEWER_PAGE_INDICATOR_JS"
+ file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-page-indicator.js"
+ use_base_dir="false"
+ type="BINDATA" />
</includes>
</release>
</grit>
diff --git a/chromium/chrome/browser/resources/print_preview/ui/BUILD.gn b/chromium/chrome/browser/resources/print_preview/ui/BUILD.gn
index b33e1f7e245..860caec75e9 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/BUILD.gn
+++ b/chromium/chrome/browser/resources/print_preview/ui/BUILD.gn
@@ -3,7 +3,7 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
js_type_check("closure_compile_module") {
is_polymer3 = true
@@ -23,7 +23,6 @@ js_type_check("closure_compile_module") {
":destination_dialog",
":destination_list",
":destination_list_item",
- ":destination_select",
":destination_settings",
":dpi_settings",
":duplex_settings",
@@ -53,7 +52,12 @@ js_type_check("closure_compile_module") {
]
if (is_chromeos) {
- deps += [ ":pin_settings" ]
+ deps += [
+ ":destination_select_cros",
+ ":pin_settings",
+ ]
+ } else {
+ deps += [ ":destination_select" ]
}
}
@@ -62,7 +66,7 @@ js_library("app") {
":preview_area",
":sidebar",
"..:cloud_print_interface",
- "..:cloud_print_interface_manager",
+ "..:cloud_print_interface_impl",
"..:native_layer",
"../data:destination",
"../data:document_info",
@@ -98,7 +102,6 @@ js_library("sidebar") {
":pages_per_sheet_settings",
":pages_settings",
":scaling_settings",
- "..:cloud_print_interface",
"..:dark_mode_behavior",
"..:metrics",
"../data:destination",
@@ -134,9 +137,8 @@ js_library("header") {
js_library("destination_settings") {
deps = [
":destination_dialog",
- ":destination_select",
":settings_behavior",
- "..:cloud_print_interface",
+ "..:cloud_print_interface_impl",
"../data:destination",
"../data:destination_store",
"../data:invitation_store",
@@ -147,21 +149,27 @@ js_library("destination_settings") {
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
-}
-js_library("destination_select") {
- deps = [
- ":select_behavior",
- "..:print_preview_utils",
- "../data:destination",
- "//third_party/polymer/v3_0/components-chromium/iron-iconset-svg:iron-iconset-svg",
- "//third_party/polymer/v3_0/components-chromium/iron-meta:iron-meta",
- "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/js:i18n_behavior.m",
- ]
+ if (is_chromeos) {
+ deps += [ ":destination_select_cros" ]
+ } else {
+ deps += [ ":destination_select" ]
+ }
}
if (is_chromeos) {
+ js_library("destination_select_cros") {
+ deps = [
+ ":select_behavior",
+ "..:print_preview_utils",
+ "../data:destination",
+ "//third_party/polymer/v3_0/components-chromium/iron-iconset-svg:iron-iconset-svg",
+ "//third_party/polymer/v3_0/components-chromium/iron-meta:iron-meta",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/js:i18n_behavior.m",
+ ]
+ }
+
js_library("pin_settings") {
deps = [
":input_behavior",
@@ -170,6 +178,18 @@ if (is_chromeos) {
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
}
+} else {
+ js_library("destination_select") {
+ deps = [
+ ":select_behavior",
+ "..:print_preview_utils",
+ "../data:destination",
+ "//third_party/polymer/v3_0/components-chromium/iron-iconset-svg:iron-iconset-svg",
+ "//third_party/polymer/v3_0/components-chromium/iron-meta:iron-meta",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/js:i18n_behavior.m",
+ ]
+ }
}
js_library("pages_settings") {
@@ -482,273 +502,52 @@ js_library("highlight_utils") {
]
}
-group("polymer3_elements") {
- public_deps = [
- ":advanced_options_settings_module",
- ":advanced_settings_dialog_module",
- ":advanced_settings_item_module",
- ":app_module",
- ":button_strip_module",
- ":color_settings_module",
- ":copies_settings_module",
- ":destination_dialog_module",
- ":destination_list_item_module",
- ":destination_list_module",
- ":destination_select_module",
- ":destination_settings_module",
- ":dpi_settings_module",
- ":duplex_settings_module",
- ":header_module",
- ":icons_module",
- ":layout_settings_module",
- ":link_container_module",
- ":margin_control_container_module",
- ":margin_control_module",
- ":margins_settings_module",
- ":media_size_settings_module",
- ":more_settings_module",
- ":number_settings_section_module",
- ":other_options_settings_module",
- ":pages_per_sheet_settings_module",
- ":pages_settings_module",
- ":pin_settings_module",
- ":preview_area_module",
- ":print_preview_search_box_module",
- ":print_preview_shared_css_module",
- ":print_preview_vars_css_module",
- ":provisional_destination_resolver_module",
- ":scaling_settings_module",
- ":settings_section_module",
- ":settings_select_module",
- ":sidebar_module",
- ":throbber_css_module",
+html_to_js("web_components") {
+ js_files = [
+ "advanced_options_settings.js",
+ "advanced_settings_dialog.js",
+ "advanced_settings_item.js",
+ "app.js",
+ "button_strip.js",
+ "color_settings.js",
+ "copies_settings.js",
+ "destination_dialog.js",
+ "destination_list_item.js",
+ "destination_list.js",
+ "destination_select_css.js",
+ "destination_settings.js",
+ "dpi_settings.js",
+ "duplex_settings.js",
+ "header.js",
+ "icons.js",
+ "layout_settings.js",
+ "link_container.js",
+ "margin_control_container.js",
+ "margin_control.js",
+ "margins_settings.js",
+ "media_size_settings.js",
+ "more_settings.js",
+ "number_settings_section.js",
+ "other_options_settings.js",
+ "pages_per_sheet_settings.js",
+ "pages_settings.js",
+ "preview_area.js",
+ "print_preview_search_box.js",
+ "print_preview_shared_css.js",
+ "print_preview_vars_css.js",
+ "provisional_destination_resolver.js",
+ "scaling_settings.js",
+ "settings_section.js",
+ "settings_select.js",
+ "sidebar.js",
+ "throbber_css.js",
]
-}
-
-polymer_modulizer("advanced_options_settings") {
- html_file = "advanced_options_settings.html"
- js_file = "advanced_options_settings.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("advanced_settings_dialog") {
- html_file = "advanced_settings_dialog.html"
- js_file = "advanced_settings_dialog.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("advanced_settings_item") {
- html_file = "advanced_settings_item.html"
- js_file = "advanced_settings_item.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("app") {
- html_file = "app.html"
- js_file = "app.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("button_strip") {
- html_file = "button_strip.html"
- js_file = "button_strip.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("color_settings") {
- html_file = "color_settings.html"
- js_file = "color_settings.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("copies_settings") {
- html_file = "copies_settings.html"
- js_file = "copies_settings.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("destination_dialog") {
- html_file = "destination_dialog.html"
- js_file = "destination_dialog.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("destination_list") {
- html_file = "destination_list.html"
- js_file = "destination_list.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("destination_list_item") {
- html_file = "destination_list_item.html"
- js_file = "destination_list_item.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("destination_select") {
- html_file = "destination_select.html"
- js_file = "destination_select.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("destination_settings") {
- html_file = "destination_settings.html"
- js_file = "destination_settings.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("dpi_settings") {
- html_file = "dpi_settings.html"
- js_file = "dpi_settings.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("duplex_settings") {
- html_file = "duplex_settings.html"
- js_file = "duplex_settings.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("header") {
- html_file = "header.html"
- js_file = "header.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("layout_settings") {
- html_file = "layout_settings.html"
- js_file = "layout_settings.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("link_container") {
- html_file = "link_container.html"
- js_file = "link_container.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("margin_control_container") {
- html_file = "margin_control_container.html"
- js_file = "margin_control_container.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("margin_control") {
- html_file = "margin_control.html"
- js_file = "margin_control.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("margins_settings") {
- html_file = "margins_settings.html"
- js_file = "margins_settings.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("media_size_settings") {
- html_file = "media_size_settings.html"
- js_file = "media_size_settings.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("more_settings") {
- html_file = "more_settings.html"
- js_file = "more_settings.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("number_settings_section") {
- html_file = "number_settings_section.html"
- js_file = "number_settings_section.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("other_options_settings") {
- html_file = "other_options_settings.html"
- js_file = "other_options_settings.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("pages_per_sheet_settings") {
- html_file = "pages_per_sheet_settings.html"
- js_file = "pages_per_sheet_settings.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("pages_settings") {
- html_file = "pages_settings.html"
- js_file = "pages_settings.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("pin_settings") {
- html_file = "pin_settings.html"
- js_file = "pin_settings.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("preview_area") {
- html_file = "preview_area.html"
- js_file = "preview_area.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("print_preview_search_box") {
- html_file = "print_preview_search_box.html"
- js_file = "print_preview_search_box.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("provisional_destination_resolver") {
- html_file = "provisional_destination_resolver.html"
- js_file = "provisional_destination_resolver.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("scaling_settings") {
- html_file = "scaling_settings.html"
- js_file = "scaling_settings.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("settings_section") {
- html_file = "settings_section.html"
- js_file = "settings_section.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("settings_select") {
- html_file = "settings_select.html"
- js_file = "settings_select.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("sidebar") {
- html_file = "sidebar.html"
- js_file = "sidebar.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("print_preview_shared_css") {
- html_file = "print_preview_shared_css.html"
- js_file = "print_preview_shared_css.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("throbber_css") {
- html_file = "throbber_css.html"
- js_file = "throbber_css.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("print_preview_vars_css") {
- html_file = "print_preview_vars_css.html"
- js_file = "print_preview_vars_css.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("icons") {
- html_file = "icons.html"
- js_file = "icons.js"
- html_type = "v3-ready"
+ if (is_chromeos) {
+ js_files += [
+ "destination_select_cros.js",
+ "pin_settings.js",
+ ]
+ } else {
+ js_files += [ "destination_select.js" ]
+ }
}
diff --git a/chromium/chrome/browser/resources/print_preview/ui/app.html b/chromium/chrome/browser/resources/print_preview/ui/app.html
index 7e82be9e9a1..8b4aaa35de9 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/app.html
+++ b/chromium/chrome/browser/resources/print_preview/ui/app.html
@@ -28,6 +28,7 @@
settings-managed="{{settingsManaged_}}" destination="[[destination_]]"
document-settings="[[documentSettings_]]"
margins="[[margins_]]" page-size="[[pageSize_]]"
+ max-sheets="{{maxSheets_}}"
on-preview-setting-changed="onPreviewSettingChanged_"
on-sticky-setting-changed="onStickySettingChanged_"
on-setting-valid-changed="onSettingValidChanged_">
@@ -46,13 +47,13 @@
</print-preview-preview-area>
</div>
<print-preview-sidebar id="sidebar"
- cloud-print-interface="[[cloudPrintInterface_]]"
cloud-print-error-message="[[cloudPrintErrorMessage_]]"
destination-state="{{destinationState_}}"
controls-managed="[[controlsManaged_]]" destination="{{destination_}}"
error="{{error_}}" is-pdf="[[documentSettings_.isPdf]]"
page-count="[[documentSettings_.pageCount]]"
- settings="[[settings]]" state="[[state]]" on-focus="onSidebarFocus_"
+ settings="[[settings]]" state="[[state]]"
+ max-sheets="[[maxSheets_]]" on-focus="onSidebarFocus_"
<if expr="is_macosx">
on-open-pdf-in-preview="onOpenPdfInPreview_"
</if>
diff --git a/chromium/chrome/browser/resources/print_preview/ui/app.js b/chromium/chrome/browser/resources/print_preview/ui/app.js
index 7e8e246f32d..575afacd7aa 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/app.js
+++ b/chromium/chrome/browser/resources/print_preview/ui/app.js
@@ -17,7 +17,7 @@ import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behav
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {CloudPrintInterface, CloudPrintInterfaceErrorEventDetail, CloudPrintInterfaceEventType} from '../cloud_print_interface.js';
-import {getCloudPrintInterface} from '../cloud_print_interface_manager.js';
+import {CloudPrintInterfaceImpl} from '../cloud_print_interface_impl.js';
import {Destination} from '../data/destination.js';
import {DocumentSettings} from '../data/document_info.js';
import {Margins} from '../data/margins.js';
@@ -59,7 +59,7 @@ Polymer({
controlsManaged_: {
type: Boolean,
computed: 'computeControlsManaged_(destinationsManaged_, ' +
- 'settingsManaged_)',
+ 'settingsManaged_, maxSheets_)',
},
/** @private {Destination} */
@@ -109,6 +109,9 @@ Polymer({
type: Object,
value: null,
},
+
+ /** @private {number} */
+ maxSheets_: Number,
},
listeners: {
@@ -340,7 +343,8 @@ Polymer({
*/
initializeCloudPrint_(cloudPrintUrl, appKioskMode, uiLocale) {
assert(!this.cloudPrintInterface_);
- this.cloudPrintInterface_ = getCloudPrintInterface(
+ this.cloudPrintInterface_ = CloudPrintInterfaceImpl.getInstance();
+ this.cloudPrintInterface_.configure(
cloudPrintUrl, assert(this.nativeLayer_), appKioskMode, uiLocale);
this.tracker_.add(
assert(this.cloudPrintInterface_).getEventTarget(),
@@ -357,7 +361,9 @@ Polymer({
* @private
*/
computeControlsManaged_() {
- return this.destinationsManaged_ || this.settingsManaged_;
+ // If |this.maxSheets_| equals to 0, no sheets limit policy is present.
+ return this.destinationsManaged_ || this.settingsManaged_ ||
+ this.maxSheets_ > 0;
},
/** @private */
@@ -374,9 +380,7 @@ Polymer({
this.$.model.applyStickySettings();
}
- // <if expr="chromeos">
this.$.model.applyDestinationSpecificPolicies();
- // </if>
this.startPreviewWhenReady_ = true;
this.$.state.transitTo(State.READY);
diff --git a/chromium/chrome/browser/resources/print_preview/ui/button_strip.html b/chromium/chrome/browser/resources/print_preview/ui/button_strip.html
index 35c8c9877af..2e2195ca87a 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/button_strip.html
+++ b/chromium/chrome/browser/resources/print_preview/ui/button_strip.html
@@ -1,5 +1,6 @@
-<style>
- :host {
+<style include="cr-hidden-style">
+ :host .controls {
+ align-items: center;
display: flex;
flex-direction: row;
justify-content: flex-end;
@@ -21,18 +22,34 @@
:host cr-button:last-child {
margin-inline-end: 0;
}
+
+<if expr="chromeos">
+ .error-message {
+ color: red;
+ margin: 16px 16px 0;
+ text-align: start;
+ }
+</if>
</style>
+<if expr="chromeos">
+<div class="error-message"
+ hidden="[[!showSheetsError_(destination.id, maxSheets, sheetCount)]]">
+ [[errorMessage_]]
+</div>
+</if>
+<div class="controls">
<if expr="not is_win">
-<cr-button class="cancel-button" on-click="onCancelClick_">
- $i18n{cancel}
-</cr-button>
+ <cr-button class="cancel-button" on-click="onCancelClick_">
+ $i18n{cancel}
+ </cr-button>
</if>
-<cr-button class="action-button" on-click="onPrintClick_"
- disabled$="[[!printButtonEnabled_]]">
- [[printButtonLabel_]]
-</cr-button>
+ <cr-button class="action-button" on-click="onPrintClick_"
+ disabled$="[[!printButtonEnabled_]]">
+ [[printButtonLabel_]]
+ </cr-button>
<if expr="is_win">
-<cr-button class="cancel-button" on-click="onCancelClick_">
- $i18n{cancel}
-</cr-button>
+ <cr-button class="cancel-button" on-click="onCancelClick_">
+ $i18n{cancel}
+ </cr-button>
</if>
+</div>
diff --git a/chromium/chrome/browser/resources/print_preview/ui/button_strip.js b/chromium/chrome/browser/resources/print_preview/ui/button_strip.js
index 6629a3cb3c2..28ea8d6232d 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/button_strip.js
+++ b/chromium/chrome/browser/resources/print_preview/ui/button_strip.js
@@ -3,10 +3,12 @@
// found in the LICENSE file.
import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
+import 'chrome://resources/cr_elements/hidden_style_css.m.js';
import 'chrome://resources/cr_elements/shared_vars_css.m.js';
import '../strings.m.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+import {IronA11yAnnouncer} from 'chrome://resources/polymer/v3_0/iron-a11y-announcer/iron-a11y-announcer.js';
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {Destination} from '../data/destination.js';
@@ -23,11 +25,12 @@ Polymer({
firstLoad: Boolean,
+ maxSheets: Number,
+
+ sheetCount: Number,
+
/** @type {!State} */
- state: {
- type: Number,
- observer: 'updatePrintButtonEnabled_',
- },
+ state: Number,
/** @private */
printButtonEnabled_: {
@@ -42,9 +45,21 @@ Polymer({
return loadTimeData.getString('printButton');
},
},
+
+ // <if expr="chromeos">
+ /** @private */
+ errorMessage_: {
+ type: String,
+ computed: 'computeErrorMessage_(destination.id, maxSheets, sheetCount)',
+ observer: 'errorMessageChanged_',
+ },
+ // </if>
},
- observers: ['updatePrintButtonLabel_(destination.id)'],
+ observers: [
+ 'updatePrintButtonLabel_(destination.id)',
+ 'updatePrintButtonEnabled_(state, destination.id, maxSheets, sheetCount)',
+ ],
/** @private {!State} */
lastState_: State.NOT_READY,
@@ -82,7 +97,12 @@ Polymer({
this.printButtonEnabled_ = false;
break;
case (State.READY):
+ // <if expr="chromeos">
+ this.printButtonEnabled_ = !this.printButtonDisabled_();
+ // </if>
+ // <if expr="not chromeos">
this.printButtonEnabled_ = true;
+ // </if>
if (this.firstLoad) {
this.$$('cr-button.action-button').focus();
this.fire('print-button-focused');
@@ -94,4 +114,56 @@ Polymer({
}
this.lastState_ = this.state;
},
+
+ // <if expr="chromeos">
+ /**
+ * @return {boolean} Whether to disable "Print" button because of sheets limit
+ * policy.
+ * @private
+ */
+ printButtonDisabled_() {
+ // The "Print" button is disabled if 3 conditions are met:
+ // * This is "real" printing, i.e. not saving to PDF/Drive.
+ // * Sheets policy is present.
+ // * Either number of sheets is not calculated or exceeds policy limit.
+ return !this.isPdfOrDrive_() && this.maxSheets > 0 &&
+ (this.sheetCount === 0 || this.sheetCount > this.maxSheets);
+ },
+
+ /**
+ * @return {boolean} Whether to show the "Too many sheets" error.
+ * @private
+ */
+ showSheetsError_() {
+ // The error is shown if the number of sheets is already calculated and the
+ // print button is disabled.
+ return this.sheetCount > 0 && this.printButtonDisabled_();
+ },
+
+ /**
+ * @return {string} Localized message to show as an error.
+ * @private
+ */
+ computeErrorMessage_() {
+ if (!this.showSheetsError_()) {
+ return '';
+ }
+
+ const singularOrPlural = this.maxSheets > 1 ? 'Plural' : 'Singular';
+ const label = loadTimeData.getString(`sheetsLimitLabel${singularOrPlural}`);
+ return loadTimeData.getStringF(
+ 'sheetsLimitErrorMessage', this.maxSheets.toLocaleString(), label);
+ },
+
+ /**
+ * Uses IronA11yAnnouncer to notify screen readers that an error is set.
+ * @private
+ */
+ errorMessageChanged_() {
+ if (this.errorMessage_ !== '') {
+ IronA11yAnnouncer.requestAvailability();
+ this.fire('iron-announce', {text: this.errorMessage_});
+ }
+ },
+ // </if>
});
diff --git a/chromium/chrome/browser/resources/print_preview/ui/destination_select.html b/chromium/chrome/browser/resources/print_preview/ui/destination_select.html
index c93947a7634..4ec05c3fe7b 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/destination_select.html
+++ b/chromium/chrome/browser/resources/print_preview/ui/destination_select.html
@@ -1,45 +1,42 @@
-<style include="print-preview-shared md-select cr-hidden-style">
- :host {
- --printer-icon-side-padding: 4px;
- --printer-icon-size: 20px;
- }
-
- select.md-select {
- background-position: var(--printer-icon-side-padding) center,
- calc(100% - var(--md-select-side-padding)) center;
- background-size: var(--printer-icon-size), var(--md-arrow-width);
- margin: 2px;
- padding-inline-start: 32px;
- --md-select-width: calc(100% - 4px);
- }
-
- :host-context([dir=rtl]) .md-select {
- background-position-x: calc(100% - var(--printer-icon-side-padding)),
- var(--md-select-side-padding);
- }
+<style include="print-preview-shared throbber md-select destination-select cr-hidden-style">
</style>
-<select class="md-select" aria-label$="[[i18n(destinationLabel)]]"
- style="background-image:
- [[getBackgroundImages_(selectedValue, destination,
- destinationState, dark)]];"
- disabled$="[[disabled]]"
- value="{{selectedValue::change}}">
- <template is="dom-repeat" items="[[recentDestinationList]]">
- <option value="[[item.key]]">[[item.displayName]]</option>
- </template>
- <option value="[[getPdfDestinationKey_()]]"
- hidden$="[[pdfPrinterDisabled]]">
- $i18n{printToPDF}
- </option>
- <option value="[[getGoogleDriveDestinationKey_(activeUser)]]"
- hidden$="[[!driveDestinationReady]]">
- $i18n{printToGoogleDrive}
- </option>
- <option value="noDestinations"
- hidden$="[[!noDestinations]]" selected$="[[noDestinations]]">
- $i18n{noDestinationsMessage}
- </option>
- <option value="seeMore" aria-label$="[[i18n(seeMoreDestinationsLabel)]]">
- $i18n{seeMore}
- </option>
-</select>
+<print-preview-settings-section>
+ <span slot="title">$i18n{destinationLabel}</span>
+ <div slot="controls">
+ <div class="throbber-container" hidden$="[[loaded]]">
+ <div class="throbber"></div>
+ </div>
+ <select class="md-select" aria-label$="[[i18n(destinationLabel)]]"
+ hidden$="[[!loaded]]"
+ style="background-image:
+ [[getBackgroundImages_(selectedValue, destination,
+ noDestinations, dark)]];"
+ disabled$="[[disabled]]"
+ value="{{selectedValue::change}}">
+ <template is="dom-repeat" items="[[recentDestinationList]]">
+ <option value="[[item.key]]">[[item.displayName]]</option>
+ </template>
+ <option value="[[pdfDestinationKey_]]" hidden$="[[pdfPrinterDisabled]]">
+ $i18n{printToPDF}
+ </option>
+ <option value="[[driveDestinationKey]]"
+ hidden$="[[!driveDestinationKey]]">
+ $i18n{printToGoogleDrive}
+ </option>
+ <option value="noDestinations"
+ hidden$="[[!noDestinations]]" selected$="[[noDestinations]]">
+ $i18n{noDestinationsMessage}
+ </option>
+ <option value="seeMore" aria-label$="[[i18n(seeMoreDestinationsLabel)]]">
+ $i18n{seeMore}
+ </option>
+ </select>
+ </div>
+</print-preview-settings-section>
+<print-preview-settings-section class="destination-additional-info"
+ hidden$="[[!statusText_]]">
+ <div slot="title"></div>
+ <div slot="controls">
+ <div class="destination-status">[[statusText_]]</div>
+ </div>
+</print-preview-settings-section>
diff --git a/chromium/chrome/browser/resources/print_preview/ui/destination_select.js b/chromium/chrome/browser/resources/print_preview/ui/destination_select.js
index 4798ea2bcfb..3232ecbedcd 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/destination_select.js
+++ b/chromium/chrome/browser/resources/print_preview/ui/destination_select.js
@@ -2,20 +2,28 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+/**
+ * Note: Chrome OS uses print-preview-destination-select-cros rather than the
+ * element in this file. Ensure any fixes for cross platform bugs work on both
+ * Chrome OS and non-Chrome OS.
+ */
+
import 'chrome://resources/cr_elements/hidden_style_css.m.js';
import 'chrome://resources/cr_elements/shared_vars_css.m.js';
import 'chrome://resources/cr_elements/md_select_css.m.js';
import 'chrome://resources/js/util.m.js';
import 'chrome://resources/polymer/v3_0/iron-iconset-svg/iron-iconset-svg.js';
import 'chrome://resources/polymer/v3_0/iron-meta/iron-meta.js';
+import './destination_select_css.js';
import './icons.js';
import './print_preview_shared_css.js';
+import './throbber_css.js';
import '../strings.m.js';
import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
import {Base, html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {createDestinationKey, Destination, DestinationOrigin, RecentDestination} from '../data/destination.js';
+import {Destination, DestinationOrigin, PDF_DESTINATION_KEY, RecentDestination} from '../data/destination.js';
import {getSelectDropdownBackground} from '../print_preview_utils.js';
import {SelectBehavior} from './select_behavior.js';
@@ -37,7 +45,9 @@ Polymer({
disabled: Boolean,
- driveDestinationReady: Boolean,
+ driveDestinationKey: String,
+
+ loaded: Boolean,
noDestinations: Boolean,
@@ -45,6 +55,18 @@ Polymer({
/** @type {!Array<!Destination>} */
recentDestinationList: Array,
+
+ /** @private {string} */
+ pdfDestinationKey_: {
+ type: String,
+ value: PDF_DESTINATION_KEY,
+ },
+
+ /** @private {string} */
+ statusText_: {
+ type: String,
+ computed: 'computeStatusText_(destination)',
+ },
},
/** @private {!IronMetaElement} */
@@ -61,25 +83,6 @@ Polymer({
},
/**
- * @return {string} Unique identifier for the Save as PDF destination
- * @private
- */
- getPdfDestinationKey_() {
- return createDestinationKey(
- Destination.GooglePromotedId.SAVE_AS_PDF, DestinationOrigin.LOCAL, '');
- },
-
- /**
- * @return {string} Unique identifier for the Save to Google Drive destination
- * @private
- */
- getGoogleDriveDestinationKey_() {
- return createDestinationKey(
- Destination.GooglePromotedId.DOCS, DestinationOrigin.COOKIES,
- this.activeUser);
- },
-
- /**
* Returns the iconset and icon for the selected printer. If printer details
* have not yet been retrieved from the backend, attempts to return an
* appropriate icon early based on the printer's sticky information.
@@ -144,4 +147,19 @@ Polymer({
onProcessSelectChange(value) {
this.fire('selected-option-change', value);
},
+
+ /**
+ * @return {string} The connection status text to display.
+ * @private
+ */
+ computeStatusText_() {
+ // |destination| can be either undefined, or null here.
+ if (!this.destination) {
+ return '';
+ }
+
+ return this.destination.shouldShowInvalidCertificateError ?
+ this.i18n('noLongerSupportedFragment') :
+ this.destination.connectionStatusText;
+ },
});
diff --git a/chromium/chrome/browser/resources/print_preview/ui/destination_select_cros.html b/chromium/chrome/browser/resources/print_preview/ui/destination_select_cros.html
new file mode 100644
index 00000000000..2d8d0b8d28f
--- /dev/null
+++ b/chromium/chrome/browser/resources/print_preview/ui/destination_select_cros.html
@@ -0,0 +1,57 @@
+<style include="print-preview-shared throbber md-select destination-select cr-hidden-style">
+</style>
+<print-preview-settings-section>
+ <span slot="title">$i18n{destinationLabel}</span>
+ <div slot="controls">
+ <div class="throbber-container" hidden$="[[loaded]]">
+ <div class="throbber"></div>
+ </div>
+ <template is="dom-if" if="[[!printerStatusFlagEnabled_]]">
+ <select class="md-select" aria-label$="[[i18n(destinationLabel)]]"
+ hidden$="[[!loaded]]"
+ style="background-image:[[backgroundImages_]];"
+ disabled$="[[disabled]]"
+ value="{{selectedValue::change}}">
+ <template is="dom-repeat" items="[[recentDestinationList]]">
+ <option value="[[item.key]]">[[item.displayName]]</option>
+ </template>
+ <option value="[[pdfDestinationKey_]]" hidden$="[[pdfPrinterDisabled]]">
+ $i18n{printToPDF}
+ </option>
+ <option value="[[driveDestinationKey]]"
+ hidden$="[[!driveDestinationKey]]">
+ $i18n{printToGoogleDrive}
+ </option>
+ <option value="noDestinations"
+ hidden$="[[!noDestinations]]" selected$="[[noDestinations]]">
+ $i18n{noDestinationsMessage}
+ </option>
+ <option value="seeMore"
+ aria-label$="[[i18n(seeMoreDestinationsLabel)]]">
+ $i18n{seeMore}
+ </option>
+ </select>
+ </template>
+ <template is="dom-if" if="[[printerStatusFlagEnabled_]]">
+ <div>print-preview-destination-select-cros</div>
+ </template>
+ </div>
+</print-preview-settings-section>
+<print-preview-settings-section class="destination-additional-info"
+ hidden$="[[!statusText_]]">
+ <div slot="title"></div>
+ <div slot="controls">
+ <div class="destination-status">[[statusText_]]</div>
+ </div>
+</print-preview-settings-section>
+<print-preview-settings-section class="destination-additional-info"
+ id="destinationEulaWrapper"
+ hidden$="[[!destination.eulaUrl]]">
+ <div slot="title"></div>
+ <div slot="controls">
+ <a class="destination-status" href="[[destination.eulaUrl]]"
+ target="_blank">
+ $i18n{printerEulaURL}
+ </a>
+ </div>
+</print-preview-settings-section>
diff --git a/chromium/chrome/browser/resources/print_preview/ui/destination_select_cros.js b/chromium/chrome/browser/resources/print_preview/ui/destination_select_cros.js
new file mode 100644
index 00000000000..f76ac017631
--- /dev/null
+++ b/chromium/chrome/browser/resources/print_preview/ui/destination_select_cros.js
@@ -0,0 +1,176 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'chrome://resources/cr_elements/hidden_style_css.m.js';
+import 'chrome://resources/cr_elements/shared_vars_css.m.js';
+import 'chrome://resources/cr_elements/md_select_css.m.js';
+import 'chrome://resources/js/util.m.js';
+import 'chrome://resources/polymer/v3_0/iron-iconset-svg/iron-iconset-svg.js';
+import 'chrome://resources/polymer/v3_0/iron-meta/iron-meta.js';
+import './destination_select_css.js';
+import './icons.js';
+import './print_preview_shared_css.js';
+import './throbber_css.js';
+import '../strings.m.js';
+
+import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+import {Base, html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {Destination, DestinationOrigin, PDF_DESTINATION_KEY, RecentDestination} from '../data/destination.js';
+import {getSelectDropdownBackground} from '../print_preview_utils.js';
+
+import {SelectBehavior} from './select_behavior.js';
+
+Polymer({
+ is: 'print-preview-destination-select-cros',
+
+ _template: html`{__html_template__}`,
+
+ behaviors: [I18nBehavior, SelectBehavior],
+
+ properties: {
+ activeUser: String,
+
+ dark: Boolean,
+
+ /** @type {!Destination} */
+ destination: Object,
+
+ disabled: Boolean,
+
+ driveDestinationKey: String,
+
+ loaded: Boolean,
+
+ noDestinations: Boolean,
+
+ pdfPrinterDisabled: Boolean,
+
+ /** @type {!Array<!Destination>} */
+ recentDestinationList: Array,
+
+ /** @private {string} */
+ pdfDestinationKey_: {
+ type: String,
+ value: PDF_DESTINATION_KEY,
+ },
+
+ /** @private {string} */
+ statusText_: {
+ type: String,
+ computed: 'computeStatusText_(destination)',
+ },
+
+ /** @private {string} */
+ backgroundImages_: {
+ type: String,
+ computed:
+ 'computeBackgroundImages_(selectedValue, destination, noDestinations, dark)',
+ },
+
+ /** @private */
+ printerStatusFlagEnabled_: {
+ type: Boolean,
+ value() {
+ return loadTimeData.getBoolean('showPrinterStatus');
+ },
+ readOnly: true,
+ },
+ },
+
+ /** @private {!IronMetaElement} */
+ meta_: /** @type {!IronMetaElement} */ (
+ Base.create('iron-meta', {type: 'iconset'})),
+
+ focus() {
+ this.$$('.md-select').focus();
+ },
+
+ /** Sets the select to the current value of |destination|. */
+ updateDestination() {
+ this.selectedValue = this.destination.key;
+ },
+
+ /**
+ * Returns the iconset and icon for the selected printer. If printer details
+ * have not yet been retrieved from the backend, attempts to return an
+ * appropriate icon early based on the printer's sticky information.
+ * @return {string} The iconset and icon for the current selection.
+ * @private
+ */
+ getDestinationIcon_() {
+ if (!this.selectedValue) {
+ return '';
+ }
+
+ // If the destination matches the selected value, pull the icon from the
+ // destination.
+ if (this.destination && this.destination.key === this.selectedValue) {
+ return this.destination.icon;
+ }
+
+ // Check for the Docs or Save as PDF ids first.
+ const keyParams = this.selectedValue.split('/');
+ if (keyParams[0] === Destination.GooglePromotedId.DOCS) {
+ return 'print-preview:save-to-drive';
+ }
+ if (keyParams[0] === Destination.GooglePromotedId.SAVE_AS_PDF) {
+ return 'cr:insert-drive-file';
+ }
+
+ // Otherwise, must be in the recent list.
+ const recent = this.recentDestinationList.find(d => {
+ return d.key === this.selectedValue;
+ });
+ if (recent && recent.icon) {
+ return recent.icon;
+ }
+
+ // The key/recent destinations don't have information about what icon to
+ // use, so just return the generic print icon for now. It will be updated
+ // when the destination is set.
+ return 'print-preview:print';
+ },
+
+ /**
+ * @return {string} An inline svg corresponding to the icon for the current
+ * destination and the image for the dropdown arrow.
+ * @private
+ */
+ computeBackgroundImages_() {
+ const icon = this.getDestinationIcon_();
+ if (!icon) {
+ return '';
+ }
+
+ let iconSetAndIcon = null;
+ if (this.noDestinations) {
+ iconSetAndIcon = ['cr', 'error'];
+ }
+ iconSetAndIcon = iconSetAndIcon || icon.split(':');
+ const iconset = /** @type {!IronIconsetSvgElement} */ (
+ this.meta_.byKey(iconSetAndIcon[0]));
+ return getSelectDropdownBackground(iconset, iconSetAndIcon[1], this);
+ },
+
+ onProcessSelectChange(value) {
+ this.fire('selected-option-change', value);
+ },
+
+ /**
+ * @return {string} The connection status text to display.
+ * @private
+ */
+ computeStatusText_() {
+ // |destination| can be either undefined, or null here.
+ if (!this.destination) {
+ return '';
+ }
+
+ return this.destination.shouldShowInvalidCertificateError ?
+ this.i18n('noLongerSupportedFragment') :
+ this.destination.connectionStatusText;
+ },
+});
diff --git a/chromium/chrome/browser/resources/print_preview/ui/destination_select_css.html b/chromium/chrome/browser/resources/print_preview/ui/destination_select_css.html
new file mode 100644
index 00000000000..1d00c9f5f16
--- /dev/null
+++ b/chromium/chrome/browser/resources/print_preview/ui/destination_select_css.html
@@ -0,0 +1,41 @@
+<template>
+ <style include="cr-shared-style">
+ :host {
+ --printer-icon-side-padding: 4px;
+ --printer-icon-size: 20px;
+ }
+
+ select.md-select {
+ background-position: var(--printer-icon-side-padding) center,
+ calc(100% - var(--md-select-side-padding)) center;
+ background-size: var(--printer-icon-size), var(--md-arrow-width);
+ padding-inline-start: 32px;
+ }
+
+ :host-context([dir=rtl]) .md-select {
+ background-position-x: calc(100% - var(--printer-icon-side-padding)),
+ var(--md-select-side-padding);
+ }
+
+ .throbber-container {
+ align-items: center;
+ display: flex;
+ overflow: hidden;
+ }
+
+ .destination-additional-info,
+ .destination-additional-info div {
+ height: 100%;
+ min-height: 0;
+ }
+
+ .destination-status {
+ color: var(--cr-secondary-text-color);
+ font-size: calc(12/13 * 1em);
+ overflow: hidden;
+ padding-top: 4px;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ </style>
+</template>
diff --git a/chromium/chrome/browser/resources/print_preview/ui/destination_select_css.js b/chromium/chrome/browser/resources/print_preview/ui/destination_select_css.js
new file mode 100644
index 00000000000..e7d02157773
--- /dev/null
+++ b/chromium/chrome/browser/resources/print_preview/ui/destination_select_css.js
@@ -0,0 +1,14 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'chrome://resources/cr_elements/shared_style_css.m.js';
+import 'chrome://resources/cr_elements/shared_vars_css.m.js';
+
+import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+const template = document.createElement('template');
+template.innerHTML = `
+<dom-module id="destination-select">{__html_template__}</dom-module>
+`;
+document.body.appendChild(template.content.cloneNode(true));
diff --git a/chromium/chrome/browser/resources/print_preview/ui/destination_settings.html b/chromium/chrome/browser/resources/print_preview/ui/destination_settings.html
index 9c6d5c8b1f8..9d9e3e3ca3d 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/destination_settings.html
+++ b/chromium/chrome/browser/resources/print_preview/ui/destination_settings.html
@@ -1,83 +1,43 @@
-<style include="print-preview-shared throbber cr-hidden-style">
+<style include="print-preview-shared">
<if expr="chromeos">
:host([has-pin-setting_]) {
margin-bottom: 0 !important;
}
</if>
-
- .throbber-container {
- align-items: center;
- display: flex;
- overflow: hidden;
- }
-
- .destination-additional-info,
- .destination-additional-info div {
- height: 100%;
- min-height: 0;
- }
-
- .destination-status {
- color: var(--cr-secondary-text-color);
- font-size: calc(12/13 * 1em);
- overflow: hidden;
- padding-top: 4px;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
-
- #destinationSelect {
- /* Reduce margin by 2px so that the <select> inside this element will
- be aligned with others after adding margin for the border. */
- margin: 0 calc(var(--print-preview-sidebar-margin) - 2px);
- }
</style>
<print-preview-user-manager id="userManager" active-user="{{activeUser_}}"
- cloud-print-disabled="{{cloudPrintDisabled_}}"
- cloud-print-interface="[[cloudPrintInterface]]"
+ cloud-print-disabled="[[cloudPrintDisabled_]]"
users="{{users_}}" destination-store="[[destinationStore_]]"
invitation-store="[[invitationStore_]]"
should-reload-cookies="[[isDialogOpen_]]">
</print-preview-user-manager>
-<print-preview-settings-section>
- <span slot="title">$i18n{destinationLabel}</span>
- <div slot="controls">
- <div class="throbber-container" hidden$="[[shouldHideSpinner_]]">
- <div class="throbber"></div>
- </div>
- <print-preview-destination-select id="destinationSelect"
- hidden$="[[!shouldHideSpinner_]]"
- active-user="[[activeUser_]]" dark="[[dark]]"
- destination="[[destination]]"
- disabled="[[shouldDisableDropdown_(
- destinationState, state, disabled)]]"
- drive-destination-ready="[[driveDestinationReady_]]"
- no-destinations="[[noDestinations_]]"
- pdf-printer-disabled="[[pdfPrinterDisabled_]]"
- recent-destination-list="[[displayedDestinations_]]"
- on-selected-option-change="onSelectedDestinationOptionChange_">
- </print-preview-destination-select>
- </div>
-</print-preview-settings-section>
-<print-preview-settings-section class="destination-additional-info"
- hidden$="[[!statusText_]]">
- <div slot="title"></div>
- <div slot="controls">
- <div class="destination-status">[[statusText_]]</div>
- </div>
-</print-preview-settings-section>
+<if expr="not chromeos">
+ <print-preview-destination-select id="destinationSelect"
+ active-user="[[activeUser_]]" dark="[[dark]]"
+ destination="[[destination]]"
+ disabled="[[shouldDisableDropdown_(
+ destinationState, state, disabled)]]"
+ drive-destination-key="[[driveDestinationKey_]]"
+ loaded="[[loaded_]]"
+ no-destinations="[[noDestinations_]]"
+ pdf-printer-disabled="[[pdfPrinterDisabled_]]"
+ recent-destination-list="[[displayedDestinations_]]"
+ on-selected-option-change="onSelectedDestinationOptionChange_">
+ </print-preview-destination-select>
+</if>
<if expr="chromeos">
- <print-preview-settings-section class="destination-additional-info"
- id="destinationEulaWrapper"
- hidden$="[[!destination.eulaUrl]]">
- <div slot="title"></div>
- <div slot="controls">
- <a class="destination-status" href="[[destination.eulaUrl]]"
- target="_blank">
- $i18n{printerEulaURL}
- </a>
- </div>
- </print-preview-settings-section>
+ <print-preview-destination-select-cros id="destinationSelect"
+ active-user="[[activeUser_]]" dark="[[dark]]"
+ destination="[[destination]]"
+ disabled="[[shouldDisableDropdown_(
+ destinationState, state, disabled)]]"
+ drive-destination-key="[[driveDestinationKey_]]"
+ loaded="[[loaded_]]"
+ no-destinations="[[noDestinations_]]"
+ pdf-printer-disabled="[[pdfPrinterDisabled_]]"
+ recent-destination-list="[[displayedDestinations_]]"
+ on-selected-option-change="onSelectedDestinationOptionChange_">
+ </print-preview-destination-select-cros>
</if>
<cr-lazy-render id="destinationDialog">
<template>
diff --git a/chromium/chrome/browser/resources/print_preview/ui/destination_settings.js b/chromium/chrome/browser/resources/print_preview/ui/destination_settings.js
index 6d1d029ebcb..f7259dbcfd0 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/destination_settings.js
+++ b/chromium/chrome/browser/resources/print_preview/ui/destination_settings.js
@@ -7,7 +7,12 @@ import 'chrome://resources/cr_elements/hidden_style_css.m.js';
import 'chrome://resources/cr_elements/shared_vars_css.m.js';
import '../data/user_manager.js';
import './destination_dialog.js';
+// <if expr="not chromeos">
import './destination_select.js';
+// </if>
+// <if expr="chromeos">
+import './destination_select_cros.js';
+// </if>
import './print_preview_shared_css.js';
import './print_preview_vars_css.js';
import './throbber_css.js';
@@ -20,7 +25,7 @@ import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behavior.m.js';
import {beforeNextRender, html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {CloudPrintInterface} from '../cloud_print_interface.js';
+import {CloudPrintInterfaceImpl} from '../cloud_print_interface_impl.js';
import {createDestinationKey, createRecentDestinationKey, Destination, DestinationOrigin, makeRecentDestination, RecentDestination} from '../data/destination.js';
import {DestinationErrorType, DestinationStore} from '../data/destination_store.js';
import {InvitationStore} from '../data/invitation_store.js';
@@ -52,12 +57,6 @@ Polymer({
],
properties: {
- /** @type {CloudPrintInterface} */
- cloudPrintInterface: {
- type: Object,
- observer: 'onCloudPrintInterfaceSet_',
- },
-
dark: Boolean,
/** @type {?Destination} */
@@ -96,7 +95,10 @@ Polymer({
},
/** @private {boolean} */
- cloudPrintDisabled_: Boolean,
+ cloudPrintDisabled_: {
+ type: Boolean,
+ value: true,
+ },
/** @private {?DestinationStore} */
destinationStore_: {
@@ -143,15 +145,9 @@ Polymer({
pdfPrinterDisabled_: Boolean,
/** @private */
- shouldHideSpinner_: {
+ loaded_: {
type: Boolean,
- computed: 'computeShouldHideSpinner_(destinationState, destination)',
- },
-
- /** @private {string} */
- statusText_: {
- type: String,
- computed: 'computeStatusText_(destination)',
+ computed: 'computeLoaded_(destinationState, destination)',
},
/** @private {!Array<string>} */
@@ -205,26 +201,19 @@ Polymer({
},
/** @private */
- onCloudPrintInterfaceSet_() {
- const cloudPrintInterface = assert(this.cloudPrintInterface);
- this.destinationStore_.setCloudPrintInterface(cloudPrintInterface);
- this.invitationStore_.setCloudPrintInterface(cloudPrintInterface);
- },
-
- /** @private */
- updateDriveDestinationReady_() {
+ updateDriveDestination_() {
const key = createDestinationKey(
Destination.GooglePromotedId.DOCS, DestinationOrigin.COOKIES,
this.activeUser_);
- this.driveDestinationReady_ =
- !!this.destinationStore_.getDestinationByKey(key);
+ this.driveDestinationKey_ =
+ this.destinationStore_.getDestinationByKey(key) ? key : '';
},
/** @private */
onActiveUserChanged_() {
this.destinationStore_.startLoadCookieDestination(
Destination.GooglePromotedId.DOCS);
- this.updateDriveDestinationReady_();
+ this.updateDriveDestination_();
const recentDestinations = this.getSettingValue('recentDestinations');
recentDestinations.forEach(destination => {
if (destination.origin === DestinationOrigin.COOKIES &&
@@ -293,6 +282,12 @@ Polymer({
init(
defaultPrinter, pdfPrinterDisabled, serializedDefaultDestinationRulesStr,
userAccounts, syncAvailable) {
+ const cloudPrintInterface = CloudPrintInterfaceImpl.getInstance();
+ if (cloudPrintInterface.isConfigured()) {
+ this.cloudPrintDisabled_ = false;
+ this.destinationStore_.setCloudPrintInterface(cloudPrintInterface);
+ this.invitationStore_.setCloudPrintInterface(cloudPrintInterface);
+ }
this.pdfPrinterDisabled_ = pdfPrinterDisabled;
this.$.userManager.initUserAccounts(userAccounts, syncAvailable);
this.destinationStore_.init(
@@ -437,7 +432,7 @@ Polymer({
});
this.displayedDestinations_ = updatedDestinations;
- this.updateDriveDestinationReady_();
+ this.updateDriveDestination_();
},
/**
@@ -451,7 +446,7 @@ Polymer({
},
/** @private */
- computeShouldHideSpinner_() {
+ computeLoaded_() {
return this.destinationState === DestinationState.ERROR ||
this.destinationState === DestinationState.UPDATED ||
(this.destinationState === DestinationState.SET && !!this.destination &&
@@ -459,21 +454,6 @@ Polymer({
this.destination.id === Destination.GooglePromotedId.SAVE_AS_PDF));
},
- /**
- * @return {string} The connection status text to display.
- * @private
- */
- computeStatusText_() {
- // |destination| can be either undefined, or null here.
- if (!this.destination) {
- return '';
- }
-
- return this.destination.shouldShowInvalidCertificateError ?
- this.i18n('noLongerSupportedFragment') :
- this.destination.connectionStatusText;
- },
-
// <if expr="chromeos">
/**
* @return {boolean}
@@ -511,7 +491,7 @@ Polymer({
*/
onAccountChange_(e) {
this.$.userManager.updateActiveUser(e.detail, true);
- this.updateDriveDestinationReady_();
+ this.updateDriveDestination_();
},
/** @private */
diff --git a/chromium/chrome/browser/resources/print_preview/ui/dpi_settings.html b/chromium/chrome/browser/resources/print_preview/ui/dpi_settings.html
index 5590b9d192e..b143c2009b1 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/dpi_settings.html
+++ b/chromium/chrome/browser/resources/print_preview/ui/dpi_settings.html
@@ -6,7 +6,7 @@
<print-preview-settings-section>
<span id="dpi-label" slot="title">$i18n{dpiLabel}</span>
<div slot="controls">
- <print-preview-settings-select aria-labelledby="dpi-label"
+ <print-preview-settings-select aria-label="$i18n{dpiLabel}"
capability="[[capabilityWithLabels_]]" setting-name="dpi"
settings="{{settings}}" disabled="[[disabled]]">
</print-preview-settings-select>
diff --git a/chromium/chrome/browser/resources/print_preview/ui/media_size_settings.html b/chromium/chrome/browser/resources/print_preview/ui/media_size_settings.html
index 3a03c196566..bcf5dec989c 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/media_size_settings.html
+++ b/chromium/chrome/browser/resources/print_preview/ui/media_size_settings.html
@@ -6,7 +6,7 @@
<print-preview-settings-section>
<span id="media-size-label" slot="title">$i18n{mediaSizeLabel}</span>
<div slot="controls">
- <print-preview-settings-select aria-labelledby="media-size-label"
+ <print-preview-settings-select aria-label="$i18n{mediaSizeLabel}"
capability="[[capability]]" setting-name="mediaSize"
settings="{{settings}}" disabled="[[disabled]]">
</print-preview-settings-select>
diff --git a/chromium/chrome/browser/resources/print_preview/ui/settings_select.html b/chromium/chrome/browser/resources/print_preview/ui/settings_select.html
index 1d870ba5ce4..07b8fa9f072 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/settings_select.html
+++ b/chromium/chrome/browser/resources/print_preview/ui/settings_select.html
@@ -5,7 +5,7 @@
}
</style>
<select class="md-select" disabled$="[[disabled]]"
- value="{{selectedValue::change}}">
+ aria-label$="[[ariaLabel]]" value="{{selectedValue::change}}">
<template is="dom-repeat" items="[[capability.option]]">
<option selected="[[isSelected_(item, selectedValue)]]"
value="[[getValue_(item)]]">
diff --git a/chromium/chrome/browser/resources/print_preview/ui/settings_select.js b/chromium/chrome/browser/resources/print_preview/ui/settings_select.js
index 8325d8e3d3d..140e9bcfb7d 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/settings_select.js
+++ b/chromium/chrome/browser/resources/print_preview/ui/settings_select.js
@@ -32,6 +32,8 @@ Polymer({
behaviors: [SettingsBehavior, SelectBehavior],
properties: {
+ ariaLabel: String,
+
/** @type {{ option: Array<!SelectOption> }} */
capability: Object,
diff --git a/chromium/chrome/browser/resources/print_preview/ui/sidebar.html b/chromium/chrome/browser/resources/print_preview/ui/sidebar.html
index 81f744fcd68..19bdf26e677 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/sidebar.html
+++ b/chromium/chrome/browser/resources/print_preview/ui/sidebar.html
@@ -42,8 +42,8 @@
</print-preview-header>
<div id="container" show-bottom-shadow>
<print-preview-destination-settings id="destinationSettings"
- cloud-print-interface="[[cloudPrintInterface]]" dark="[[inDarkMode]]"
- destination="{{destination}}" destination-state="{{destinationState}}"
+ dark="[[inDarkMode]]" destination="{{destination}}"
+ destination-state="{{destinationState}}"
error="{{error}}" first-load="[[firstLoad_]]" settings="[[settings]]"
state="[[state]]" app-kiosk-mode="[[isInAppKioskMode_]]"
disabled="[[controlsDisabled_]]"
@@ -132,5 +132,6 @@
</div>
<print-preview-button-strip destination="[[destination]]"
state="[[state]]" first-load="[[firstLoad_]]"
+ sheet-count="[[sheetCount_]]" max-sheets="[[maxSheets]]"
on-print-button-focused="onPrintButtonFocused_">
</print-preview-button-strip>
diff --git a/chromium/chrome/browser/resources/print_preview/ui/sidebar.js b/chromium/chrome/browser/resources/print_preview/ui/sidebar.js
index 53ae52d65ea..208d1ba2abe 100644
--- a/chromium/chrome/browser/resources/print_preview/ui/sidebar.js
+++ b/chromium/chrome/browser/resources/print_preview/ui/sidebar.js
@@ -35,7 +35,6 @@ import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behavior.m.js';
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {CloudPrintInterface} from '../cloud_print_interface.js';
import {DarkModeBehavior} from '../dark_mode_behavior.js';
import {Destination} from '../data/destination.js';
import {Error, State} from '../data/state.js';
@@ -65,9 +64,6 @@ Polymer({
properties: {
cloudPrintErrorMessage: String,
- /** @type {CloudPrintInterface} */
- cloudPrintInterface: Object,
-
controlsManaged: Boolean,
/** @type {Destination} */
@@ -104,6 +100,8 @@ Polymer({
computed: 'computeControlsDisabled_(state)',
},
+ maxSheets: Number,
+
/** @private {number} */
sheetCount_: {
type: Number,
diff --git a/chromium/chrome/browser/resources/quota_internals/event_handler.js b/chromium/chrome/browser/resources/quota_internals/event_handler.js
index 512ecd473fa..6d0e7ddd9d3 100644
--- a/chromium/chrome/browser/resources/quota_internals/event_handler.js
+++ b/chromium/chrome/browser/resources/quota_internals/event_handler.js
@@ -253,7 +253,7 @@ function getOriginObject(type, host, origin) {
*/
function handleAvailableSpace(event) {
availableSpace = event.detail;
- $('diskspace-entry').innerHTML = numBytesToText_(availableSpace);
+ $('diskspace-entry').textContent = numBytesToText_(availableSpace);
}
/**
@@ -378,13 +378,15 @@ function handleStatistics(event) {
for (const key in data) {
let entry = statistics[key];
if (!entry) {
- entry = document.createElement('tr');
+ const template = document.querySelector('#table-row-template');
+ entry = template.content.cloneNode(true).querySelector('tr');
$('stat-entries').appendChild(entry);
statistics[key] = entry;
}
entry.detail = data[key];
- entry.innerHTML = '<td>' + stringToText_(key) + '</td>' +
- '<td>' + stringToText_(entry.detail) + '</td>';
+
+ entry.querySelectorAll('td')[0].textContent = stringToText_(key);
+ entry.querySelectorAll('td')[1].textContent = stringToText_(entry.detail);
}
}
@@ -395,7 +397,7 @@ function handleStatistics(event) {
function updateDescription() {
const item = getTreeViewObject().selectedItem;
const tbody = $('tree-item-description');
- tbody.innerHTML = '';
+ tbody.innerHTML = trustedTypes.emptyHTML;
if (item) {
const keyAndLabel = [
@@ -417,9 +419,10 @@ function updateDescription() {
const normalize = keyAndLabel[i][2] || stringToText_;
- const row = document.createElement('tr');
- row.innerHTML = '<td>' + label + '</td>' +
- '<td>' + normalize(entry) + '</td>';
+ const template = document.querySelector('#table-row-template');
+ const row = template.content.cloneNode(true).querySelector('tr');
+ row.querySelectorAll('td')[0].textContent = label;
+ row.querySelectorAll('td')[1].textContent = normalize(entry);
tbody.appendChild(row);
}
}
diff --git a/chromium/chrome/browser/resources/quota_internals/main.html b/chromium/chrome/browser/resources/quota_internals/main.html
index c8af0620678..59d0a4bbb2d 100644
--- a/chromium/chrome/browser/resources/quota_internals/main.html
+++ b/chromium/chrome/browser/resources/quota_internals/main.html
@@ -36,6 +36,14 @@ found in the LICENSE file.
<tabpanel>
<!-- Summary -->
<h2>Summary</h2>
+
+ <template id="table-row-template">
+ <tr>
+ <td></td>
+ <td></td>
+ </tr>
+ </template>
+
<table>
<tbody>
<tr>
diff --git a/chromium/chrome/browser/resources/settings/BUILD.gn b/chromium/chrome/browser/resources/settings/BUILD.gn
index e05a2589a3e..4250f4fa750 100644
--- a/chromium/chrome/browser/resources/settings/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/BUILD.gn
@@ -5,6 +5,7 @@
import("//chrome/common/features.gni")
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/grit/grit_rule.gni")
+import("//tools/polymer/html_to_js.gni")
import("//tools/polymer/polymer.gni")
import("//ui/webui/resources/tools/js_modulizer.gni")
import("//ui/webui/webui_features.gni")
@@ -15,27 +16,6 @@ if (optimize_webui) {
settings_pak_file = "settings_resources.pak"
unpak_folder = "settings_resources.unpak"
- optimize_webui("build") {
- host = "settings"
- html_in_files = [
- "settings.html",
- "lazy_load.html",
- ]
- html_out_files = [
- "vulcanized.html",
- "lazy_load.vulcanized.html",
- ]
- insert_in_head = "<base href=\"chrome://settings\">"
- input = rebase_path("$target_gen_dir/$unpak_folder", root_build_dir)
- js_out_files = [
- "crisper.js",
- "lazy_load.crisper.js",
- ]
- excludes = [ "chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom.html" ]
-
- deps = [ ":unpak" ]
- }
-
optimize_webui("build_polymer3") {
host = "settings"
input = rebase_path("$target_gen_dir/$unpak_folder", root_build_dir)
@@ -89,43 +69,15 @@ group("closure_compile") {
"a11y_page:closure_compile",
"about_page:closure_compile",
"appearance_page:closure_compile",
- "autofill_page:closure_compile",
- "basic_page:closure_compile",
- "clear_browsing_data_dialog:closure_compile",
"controls:closure_compile",
- "downloads_page:closure_compile",
"languages_page:closure_compile",
- "on_startup_page:closure_compile",
"people_page:closure_compile",
"prefs:closure_compile",
- "printing_page:closure_compile",
"privacy_page:closure_compile",
- "reset_page:closure_compile",
- "safety_check_page:closure_compile",
"search_engines_page:closure_compile",
- "search_page:closure_compile",
- "settings_main:closure_compile",
- "settings_menu:closure_compile",
"settings_page:closure_compile",
- "settings_ui:closure_compile",
- "site_settings:closure_compile",
- "site_settings_page:closure_compile",
]
- if (is_win) {
- deps += [
- "chrome_cleanup_page:closure_compile",
- "incompatible_applications_page:closure_compile",
- ]
- }
-
- if (!is_chromeos) {
- deps += [
- "default_browser_page:closure_compile",
- "system_page:closure_compile",
- ]
- }
-
if (is_chromeos) {
deps += [
"../../../test/data/webui/settings/chromeos:closure_compile",
@@ -138,16 +90,9 @@ js_type_check("settings_resources") {
deps = [
":extension_control_browser_proxy",
":global_scroll_target_behavior",
- ":hats_browser_proxy",
":lifetime_browser_proxy",
- ":metrics_browser_proxy",
- ":open_window_proxy",
- ":page_visibility",
- ":plural_string_proxy",
- ":route",
":router",
":search_settings",
- ":settings_routes",
]
}
@@ -166,39 +111,11 @@ js_library("global_scroll_target_behavior") {
]
}
-js_library("hats_browser_proxy") {
- deps = [ "//ui/webui/resources/js:cr" ]
- externs_list = [ "$externs_path/chrome_send.js" ]
-}
-
js_library("lifetime_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr" ]
externs_list = [ "$externs_path/chrome_send.js" ]
}
-js_library("metrics_browser_proxy") {
- deps = [ "//ui/webui/resources/js:cr" ]
- externs_list = [ "$externs_path/chrome_send.js" ]
-}
-
-js_library("open_window_proxy") {
- deps = [ "//ui/webui/resources/js:cr" ]
-}
-
-js_library("plural_string_proxy") {
- deps = [ "//ui/webui/resources/js:cr" ]
-}
-
-js_library("route") {
- deps = [
- ":page_visibility",
- ":router",
- ":settings_routes",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:load_time_data",
- ]
-}
-
js_library("router") {
deps = [
"//ui/webui/resources/js:cr",
@@ -207,17 +124,6 @@ js_library("router") {
externs_list = [ "$externs_path/metrics_private.js" ]
}
-js_library("settings_routes") {
- deps = [ ":router" ]
-}
-
-js_library("page_visibility") {
- deps = [
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:load_time_data",
- ]
-}
-
js_library("search_settings") {
deps = [
"//ui/webui/resources/js:assert",
@@ -271,25 +177,48 @@ group("closure_compile_module") {
"incompatible_applications_page:closure_compile_module",
]
}
+
+ if (is_chromeos) {
+ deps += [ "chromeos:closure_compile_module" ]
+ }
}
js_type_check("closure_compile_local_module") {
is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [
":extension_control_browser_proxy.m",
":global_scroll_target_behavior.m",
- ":hats_browser_proxy.m",
- ":i18n_setup.m",
+ ":hats_browser_proxy",
+ ":i18n_setup",
+ ":lazy_load",
":lifetime_browser_proxy.m",
- ":metrics_browser_proxy.m",
- ":open_window_proxy.m",
- ":page_visibility.m",
- ":plural_string_proxy.m",
- ":route.m",
+ ":metrics_browser_proxy",
+ ":open_window_proxy",
+ ":page_visibility",
+ ":plural_string_proxy",
+ ":route",
":router.m",
":search_settings.m",
- ":settings_routes.m",
- ":site_favicon.m",
+ ":settings",
+ ":settings_routes",
+ ":site_favicon",
+ ]
+}
+
+js_library("settings") {
+ deps = [
+ ":hats_browser_proxy",
+ ":lifetime_browser_proxy.m",
+ ":metrics_browser_proxy",
+ ":open_window_proxy",
+ "about_page:about_page_browser_proxy.m",
+ "autofill_page:password_manager_proxy",
+ "people_page:sync_browser_proxy.m",
+ "privacy_page:privacy_page_browser_proxy.m",
+ "safety_check_page:safety_check_browser_proxy",
+ "search_engines_page:search_engines_browser_proxy.m",
+ "settings_ui:settings_ui",
]
}
@@ -300,7 +229,7 @@ js_library("extension_control_browser_proxy.m") {
externs_list = [ "$externs_path/chrome_send.js" ]
}
-js_library("i18n_setup.m") {
+js_library("i18n_setup") {
deps = [ "//ui/webui/resources/js:load_time_data.m" ]
}
@@ -313,12 +242,22 @@ js_library("global_scroll_target_behavior.m") {
extra_deps = [ ":modulize" ]
}
-js_library("hats_browser_proxy.m") {
- sources = [
- "$root_gen_dir/chrome/browser/resources/settings/hats_browser_proxy.m.js",
- ]
+js_library("hats_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
+}
+
+js_library("lazy_load") {
+ deps = [
+ "autofill_page:autofill_section",
+ "autofill_page:payments_section",
+ "privacy_page:cookies_page",
+ "privacy_page:safe_browsing_browser_proxy",
+ "privacy_page:security_page",
+ "site_settings:local_data_browser_proxy",
+ "site_settings:protocol_handlers",
+ "site_settings:site_settings_prefs_browser_proxy",
+ "site_settings_page",
+ ]
}
js_library("lifetime_browser_proxy.m") {
@@ -327,44 +266,29 @@ js_library("lifetime_browser_proxy.m") {
extra_deps = [ ":modulize" ]
}
-js_library("metrics_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/metrics_browser_proxy.m.js" ]
+js_library("metrics_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
}
-js_library("open_window_proxy.m") {
- sources = [
- "$root_gen_dir/chrome/browser/resources/settings/open_window_proxy.m.js",
- ]
+js_library("open_window_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
}
-js_library("page_visibility.m") {
- sources =
- [ "$root_gen_dir/chrome/browser/resources/settings/page_visibility.m.js" ]
+js_library("page_visibility") {
deps = [ "//ui/webui/resources/js:load_time_data.m" ]
- extra_deps = [ ":modulize" ]
}
-js_library("plural_string_proxy.m") {
- sources = [
- "$root_gen_dir/chrome/browser/resources/settings/plural_string_proxy.m.js",
- ]
+js_library("plural_string_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
}
-js_library("route.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/route.m.js" ]
+js_library("route") {
deps = [
- ":page_visibility.m",
+ ":page_visibility",
":router.m",
- ":settings_routes.m",
+ ":settings_routes",
"//ui/webui/resources/js:load_time_data.m",
]
- extra_deps = [ ":modulize" ]
}
js_library("router.m") {
@@ -391,72 +315,65 @@ js_library("search_settings.m") {
extra_deps = [ ":modulize" ]
}
-js_library("settings_routes.m") {
- sources =
- [ "$root_gen_dir/chrome/browser/resources/settings/settings_routes.m.js" ]
+js_library("settings_routes") {
deps = [ ":router.m" ]
- extra_deps = [ ":modulize" ]
}
-js_library("site_favicon.m") {
- sources =
- [ "$root_gen_dir/chrome/browser/resources/settings/site_favicon.m.js" ]
+js_library("site_favicon") {
deps = [
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:icon.m",
]
- extra_deps = [ ":site_favicon_module" ]
}
group("polymer3_elements") {
public_deps = [
# Sub-folder targets
"a11y_page:polymer3_elements",
- "about_page:polymer3_elements",
- "appearance_page:polymer3_elements",
- "autofill_page:polymer3_elements",
- "basic_page:polymer3_elements",
- "clear_browsing_data_dialog:polymer3_elements",
+ "about_page:web_components",
+ "appearance_page:web_components",
+ "autofill_page:web_components",
+ "basic_page:web_components",
+ "clear_browsing_data_dialog:web_components",
"controls:polymer3_elements",
- "downloads_page:polymer3_elements",
+ "downloads_page:web_components",
"languages_page:polymer3_elements",
- "on_startup_page:polymer3_elements",
+ "on_startup_page:web_components",
"people_page:polymer3_elements",
"prefs:polymer3_elements",
- "printing_page:polymer3_elements",
+ "printing_page:web_components",
"privacy_page:polymer3_elements",
- "reset_page:polymer3_elements",
- "safety_check_page:polymer3_elements",
- "search_engines_page:polymer3_elements",
- "search_page:polymer3_elements",
- "settings_main:polymer3_elements",
- "settings_menu:polymer3_elements",
+ "reset_page:web_components",
+ "safety_check_page:web_components",
+ "search_engines_page:web_components",
+ "search_page:web_components",
+ "settings_main:web_components",
+ "settings_menu:web_components",
"settings_page:polymer3_elements",
- "settings_ui:polymer3_elements",
- "site_settings:polymer3_elements",
- "site_settings_page:polymer3_elements",
+ "settings_ui:web_components",
+ "site_settings:web_components",
+ "site_settings_page:web_components",
# Local targets
- ":ensure_lazy_loaded_module",
":icons_module",
":modulize",
":settings_page_css_module",
":settings_shared_css_module",
":settings_vars_css_module",
- ":site_favicon_module",
+ ":web_components_local",
]
if (!is_chromeos) {
public_deps += [
- "default_browser_page:polymer3_elements",
- "system_page:polymer3_elements",
+ "default_browser_page:web_components",
+ "system_page:web_components",
]
}
if (is_win) {
public_deps += [
- "chrome_cleanup_page:polymer3_elements",
- "incompatible_applications_page:polymer3_elements",
+ "chrome_cleanup_page:web_components",
+ "incompatible_applications_page:web_components",
]
}
}
@@ -485,34 +402,17 @@ polymer_modulizer("settings_vars_css") {
html_type = "custom-style"
}
-polymer_modulizer("site_favicon") {
- js_file = "site_favicon.js"
- html_file = "site_favicon.html"
- html_type = "dom-module"
- auto_imports =
- [ "ui/webui/resources/html/icon.html|getFavicon,getFaviconForPageURL" ]
-}
-
-polymer_modulizer("ensure_lazy_loaded") {
- js_file = "ensure_lazy_loaded.m.js"
- html_file = "ensure_lazy_loaded.html"
- html_type = "v3-ready"
+html_to_js("web_components_local") {
+ js_files = [ "site_favicon.js" ]
}
js_modulizer("modulize") {
input_files = [
"extension_control_browser_proxy.js",
"global_scroll_target_behavior.js",
- "hats_browser_proxy.js",
"lifetime_browser_proxy.js",
- "metrics_browser_proxy.js",
- "open_window_proxy.js",
- "plural_string_proxy.js",
- "page_visibility.js",
- "route.js",
"router.js",
"search_settings.js",
- "settings_routes.js",
]
namespace_rewrites = settings_namespace_rewrites + [
"cr.search_highlight_utils.createEmptySearchBubble|createEmptySearchBubble",
diff --git a/chromium/chrome/browser/resources/settings/a11y_page/BUILD.gn b/chromium/chrome/browser/resources/settings/a11y_page/BUILD.gn
index 0279924a335..b87d67a7220 100644
--- a/chromium/chrome/browser/resources/settings/a11y_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/a11y_page/BUILD.gn
@@ -4,15 +4,10 @@
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/polymer/polymer.gni")
-import("//ui/webui/resources/tools/js_modulizer.gni")
import("../settings.gni")
js_type_check("closure_compile") {
- deps = [
- ":a11y_page",
- ":captions_browser_proxy",
- ":captions_subpage",
- ]
+ deps = [ ":captions_subpage" ]
}
js_library("captions_subpage") {
@@ -26,48 +21,29 @@ js_library("captions_subpage") {
]
}
-js_library("a11y_page") {
- deps = [
- "..:route",
- "..:router",
- "../settings_page:settings_animated_pages",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
-}
-
-js_library("captions_browser_proxy") {
- deps = [ "//ui/webui/resources/js:cr" ]
-}
-
js_type_check("closure_compile_module") {
is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [
- ":a11y_page.m",
- ":captions_browser_proxy.m",
+ ":a11y_page",
+ ":captions_browser_proxy",
":captions_subpage.m",
]
}
-js_library("a11y_page.m") {
- sources = [
- "$root_gen_dir/chrome/browser/resources/settings/a11y_page/a11y_page.m.js",
- ]
+js_library("a11y_page") {
deps = [
- ":captions_browser_proxy.m",
- "..:route.m",
+ ":captions_browser_proxy",
+ "..:route",
"..:router.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":a11y_page_module" ]
}
-js_library("captions_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/a11y_page/captions_browser_proxy.m.js" ]
+js_library("captions_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
}
js_library("captions_subpage.m") {
@@ -87,35 +63,23 @@ group("polymer3_elements") {
public_deps = [
":a11y_page_module",
":captions_subpage_module",
- ":modulize",
]
}
polymer_modulizer("a11y_page") {
js_file = "a11y_page.js"
html_file = "a11y_page.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/a11y_page/captions_browser_proxy.html|CaptionsBrowserProxyImpl",
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/router.html|Router",
- ]
- namespace_rewrites = settings_namespace_rewrites
+ html_type = "v3-ready"
}
polymer_modulizer("captions_subpage") {
js_file = "captions_subpage.js"
html_file = "captions_subpage.html"
html_type = "dom-module"
+ migrated_imports = settings_migrated_imports
auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/a11y_page/captions_browser_proxy.html|CaptionsBrowserProxy",
"chrome/browser/resources/settings/controls/settings_dropdown_menu.html|DropdownMenuOptionList",
"chrome/browser/resources/settings/appearance_page/fonts_browser_proxy.html|FontsBrowserProxy, FontsBrowserProxyImpl, FontsData",
]
namespace_rewrites = settings_namespace_rewrites
}
-
-js_modulizer("modulize") {
- input_files = [ "captions_browser_proxy.js" ]
- namespace_rewrites = settings_namespace_rewrites
-}
diff --git a/chromium/chrome/browser/resources/settings/about_page/BUILD.gn b/chromium/chrome/browser/resources/settings/about_page/BUILD.gn
index 1589b17c9d6..d8e4ec9c6b3 100644
--- a/chromium/chrome/browser/resources/settings/about_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/about_page/BUILD.gn
@@ -3,27 +3,12 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
import("//ui/webui/resources/tools/js_modulizer.gni")
import("../settings.gni")
js_type_check("closure_compile") {
- deps = [
- ":about_page",
- ":about_page_browser_proxy",
- ]
-}
-
-js_library("about_page") {
- deps = [
- ":about_page_browser_proxy",
- "..:lifetime_browser_proxy",
- "..:router",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:parse_html_subset",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
+ deps = [ ":about_page_browser_proxy" ]
}
js_library("about_page_browser_proxy") {
@@ -33,14 +18,14 @@ js_library("about_page_browser_proxy") {
js_type_check("closure_compile_module") {
is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [
- ":about_page.m",
+ ":about_page",
":about_page_browser_proxy.m",
]
}
-js_library("about_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/about_page/about_page.m.js" ]
+js_library("about_page") {
deps = [
":about_page_browser_proxy.m",
"..:lifetime_browser_proxy.m",
@@ -51,34 +36,23 @@ js_library("about_page.m") {
"//ui/webui/resources/js:parse_html_subset.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":about_page_module" ]
}
js_library("about_page_browser_proxy.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/about_page/about_page_browser_proxy.m.js" ]
deps = [ "//ui/webui/resources/js:cr.m" ]
- externs_list = [ "$externs_path/chrome_send.js" ]
extra_deps = [ ":modulize" ]
}
-group("polymer3_elements") {
+group("web_components") {
public_deps = [
- ":about_page_module",
":modulize",
+ ":web_components_local",
]
}
-polymer_modulizer("about_page") {
- js_file = "about_page.js"
- html_file = "about_page.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "ui/webui/resources/html/assert.html|assert",
- "chrome/browser/resources/settings/router.html|Router",
- "chrome/browser/resources/settings/lifetime_browser_proxy.html|LifetimeBrowserProxy, LifetimeBrowserProxyImpl",
- "chrome/browser/resources/settings/about_page/about_page_browser_proxy.html|AboutPageBrowserProxy, AboutPageBrowserProxyImpl, UpdateStatus, UpdateStatusChangedEvent, PromoteUpdaterStatus",
- ]
- namespace_rewrites = settings_namespace_rewrites
+html_to_js("web_components_local") {
+ js_files = [ "about_page.js" ]
}
js_modulizer("modulize") {
diff --git a/chromium/chrome/browser/resources/settings/appearance_page/BUILD.gn b/chromium/chrome/browser/resources/settings/appearance_page/BUILD.gn
index a223588107a..77b91120dfe 100644
--- a/chromium/chrome/browser/resources/settings/appearance_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/appearance_page/BUILD.gn
@@ -3,61 +3,12 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
import("//ui/webui/resources/tools/js_modulizer.gni")
import("../settings.gni")
js_type_check("closure_compile") {
- deps = [
- ":appearance_browser_proxy",
- ":appearance_fonts_page",
- ":appearance_page",
- ":fonts_browser_proxy",
- ":home_url_input",
- ]
-}
-
-js_library("appearance_fonts_page") {
- deps = [
- ":fonts_browser_proxy",
- "../controls:settings_dropdown_menu",
- "//ui/webui/resources/cr_elements/cr_slider:cr_slider",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
- externs_list = [ "$externs_path/chrome_send.js" ]
-}
-
-js_library("appearance_browser_proxy") {
- deps = [
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:load_time_data",
- ]
- externs_list = [
- "$externs_path/chrome_send.js",
- "$externs_path/management.js",
- "$externs_path/settings_private.js",
- ]
-}
-
-js_library("appearance_page") {
- deps = [
- ":appearance_browser_proxy",
- "..:page_visibility",
- "..:route",
- "..:router",
- "../controls:settings_dropdown_menu",
- "../settings_page:settings_animated_pages",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:load_time_data",
- ]
- externs_list = [
- "$externs_path/settings_private.js",
- "$externs_path/chrome_send.js",
- ]
+ deps = [ ":fonts_browser_proxy" ]
}
js_library("fonts_browser_proxy") {
@@ -68,45 +19,30 @@ js_library("fonts_browser_proxy") {
externs_list = [ "$externs_path/chrome_send.js" ]
}
-js_library("home_url_input") {
- deps = [
- ":appearance_browser_proxy",
- "../controls:pref_control_behavior",
- "//ui/webui/resources/cr_elements/policy:cr_policy_indicator_behavior",
- "//ui/webui/resources/cr_elements/policy:cr_policy_pref_behavior",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:load_time_data",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
js_type_check("closure_compile_module") {
is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [
- ":appearance_browser_proxy.m",
- ":appearance_fonts_page.m",
- ":appearance_page.m",
+ ":appearance_browser_proxy",
+ ":appearance_fonts_page",
+ ":appearance_page",
":fonts_browser_proxy.m",
- ":home_url_input.m",
+ ":home_url_input",
]
}
-js_library("appearance_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/appearance_page/appearance_browser_proxy.m.js" ]
+js_library("appearance_browser_proxy") {
deps = [
"//ui/webui/resources/js:cr.m",
"//ui/webui/resources/js:load_time_data.m",
]
externs_list = [
- "$externs_path/chrome_send.js",
"$externs_path/management.js",
"$externs_path/settings_private.js",
]
- extra_deps = [ ":modulize" ]
}
-js_library("appearance_fonts_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.m.js" ]
+js_library("appearance_fonts_page") {
deps = [
":fonts_browser_proxy.m",
"../controls:settings_dropdown_menu.m",
@@ -115,16 +51,13 @@ js_library("appearance_fonts_page.m") {
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- externs_list = [ "$externs_path/chrome_send.js" ]
- extra_deps = [ ":appearance_fonts_page_module" ]
}
-js_library("appearance_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/appearance_page/appearance_page.m.js" ]
+js_library("appearance_page") {
deps = [
- ":appearance_browser_proxy.m",
- "..:page_visibility.m",
- "..:route.m",
+ ":appearance_browser_proxy",
+ "..:page_visibility",
+ "..:route",
"..:router.m",
"../controls:settings_dropdown_menu.m",
"../settings_page:settings_animated_pages.m",
@@ -132,11 +65,6 @@ js_library("appearance_page.m") {
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:load_time_data.m",
]
- externs_list = [
- "$externs_path/settings_private.js",
- "$externs_path/chrome_send.js",
- ]
- extra_deps = [ ":appearance_page_module" ]
}
js_library("fonts_browser_proxy.m") {
@@ -145,10 +73,9 @@ js_library("fonts_browser_proxy.m") {
extra_deps = [ ":modulize" ]
}
-js_library("home_url_input.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/appearance_page/home_url_input.m.js" ]
+js_library("home_url_input") {
deps = [
- ":appearance_browser_proxy.m",
+ ":appearance_browser_proxy",
"../controls:pref_control_behavior.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/policy:cr_policy_indicator_behavior.m",
@@ -156,60 +83,24 @@ js_library("home_url_input.m") {
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
]
- extra_deps = [ ":home_url_input_module" ]
}
-group("polymer3_elements") {
+group("web_components") {
public_deps = [
- ":appearance_fonts_page_module",
- ":appearance_page_module",
- ":home_url_input_module",
":modulize",
+ ":web_components_local",
]
}
-polymer_modulizer("appearance_fonts_page") {
- js_file = "appearance_fonts_page.js"
- html_file = "appearance_fonts_page.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "ui/webui/resources/cr_elements/cr_slider/cr_slider.html|SliderTick",
- "chrome/browser/resources/settings/appearance_page/fonts_browser_proxy.html|FontsBrowserProxy, FontsBrowserProxyImpl, FontsData",
- "chrome/browser/resources/settings/controls/settings_dropdown_menu.html|DropdownMenuOptionList",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("appearance_page") {
- js_file = "appearance_page.js"
- html_file = "appearance_page.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "ui/webui/resources/html/assert.html|assert",
- "chrome/browser/resources/settings/appearance_page/appearance_browser_proxy.html|AppearanceBrowserProxy, AppearanceBrowserProxyImpl",
- "chrome/browser/resources/settings/controls/settings_dropdown_menu.html|DropdownMenuOptionList",
- "chrome/browser/resources/settings/page_visibility.html|AppearancePageVisibility",
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/router.html|Router",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("home_url_input") {
- js_file = "home_url_input.js"
- html_file = "home_url_input.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [
- "ui/webui/resources/html/assert.html|assert",
- "chrome/browser/resources/settings/appearance_page/appearance_browser_proxy.html|AppearanceBrowserProxy, AppearanceBrowserProxyImpl",
- ]
+html_to_js("web_components_local") {
+ js_files = [
+ "appearance_fonts_page.js",
+ "appearance_page.js",
+ "home_url_input.js",
+ ]
}
js_modulizer("modulize") {
- input_files = [
- "appearance_browser_proxy.js",
- "fonts_browser_proxy.js",
- ]
+ input_files = [ "fonts_browser_proxy.js" ]
namespace_rewrites = settings_namespace_rewrites
}
diff --git a/chromium/chrome/browser/resources/settings/autofill_page/BUILD.gn b/chromium/chrome/browser/resources/settings/autofill_page/BUILD.gn
index bae62b7a7f8..f48d5203d74 100644
--- a/chromium/chrome/browser/resources/settings/autofill_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/autofill_page/BUILD.gn
@@ -3,11 +3,12 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
-import("//ui/webui/resources/tools/js_modulizer.gni")
+import("//tools/polymer/html_to_js.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [
":address_edit_dialog",
":autofill_page",
@@ -18,11 +19,13 @@ js_type_check("closure_compile") {
":password_check",
":password_check_behavior",
":password_check_edit_dialog",
+ ":password_check_edit_disclaimer_dialog",
":password_check_list_item",
":password_edit_dialog",
":password_list_item",
":password_manager_proxy",
":password_remove_confirmation_dialog",
+ ":passwords_export_dialog",
":passwords_section",
":payments_list",
":payments_section",
@@ -31,214 +34,8 @@ js_type_check("closure_compile") {
]
}
-js_library("autofill_page") {
- deps = [
- ":autofill_section",
- ":password_check_behavior",
- ":passwords_section",
- ":payments_section",
- "..:open_window_proxy",
- "..:route",
- "..:router",
- "../prefs:prefs_behavior",
- "../settings_page:settings_animated_pages",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- ]
- externs_list = [
- "$externs_path/passwords_private.js",
- "$externs_path/settings_private.js",
- ]
-}
-
-js_library("autofill_section") {
- deps = [
- ":address_edit_dialog",
- ":password_check_behavior",
- "//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js/cr/ui:focus_without_ink",
- ]
- externs_list = [ "$externs_path/autofill_private.js" ]
-}
-
-js_library("blocking_request_manager") {
-}
-
-js_library("payments_section") {
- deps = [
- ":credit_card_edit_dialog",
- ":payments_list",
- "..:metrics_browser_proxy",
- "//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- "//ui/webui/resources/js/cr/ui:focus_without_ink",
- ]
- externs_list = [ "$externs_path/autofill_private.js" ]
-}
-
js_library("address_edit_dialog") {
deps = [
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:i18n_behavior",
- ]
- externs_list = [ "$externs_path/autofill_private.js" ]
-}
-
-js_library("credit_card_edit_dialog") {
- deps = [ "//ui/webui/resources/js:i18n_behavior" ]
- externs_list = [ "$externs_path/autofill_private.js" ]
-}
-
-js_library("credit_card_list_entry") {
- deps = [ "//ui/webui/resources/js:i18n_behavior" ]
- externs_list = [ "$externs_path/autofill_private.js" ]
-}
-
-js_library("password_check") {
- deps = [
- ":blocking_request_manager",
- ":password_check_behavior",
- ":password_manager_proxy",
- "..:plural_string_proxy",
- "../prefs:prefs_behavior",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:util",
- "//ui/webui/resources/js/cr/ui:focus_without_ink",
- ]
- externs_list = [ "$externs_path/quick_unlock_private.js" ]
-}
-
-js_library("password_check_behavior") {
- deps = [
- ":password_manager_proxy",
- "..:plural_string_proxy",
- ]
- externs_list = [ "$externs_path/passwords_private.js" ]
-}
-
-js_library("password_check_edit_dialog") {
- deps = [
- ":password_manager_proxy",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:i18n_behavior",
- ]
-}
-
-js_library("password_remove_confirmation_dialog") {
- deps = [
- ":password_manager_proxy",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:i18n_behavior",
- ]
-}
-
-js_library("password_check_list_item") {
- deps = [
- ":blocking_request_manager",
- ":password_manager_proxy",
- "..:open_window_proxy",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:i18n_behavior",
- ]
-}
-
-js_library("password_list_item") {
- deps = [
- ":show_password_behavior",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js/cr/ui:focus_row_behavior",
- ]
-}
-
-js_library("password_manager_proxy") {
- deps = [ "//ui/webui/resources/js:cr" ]
- externs_list = [ "$externs_path/passwords_private.js" ]
-}
-
-js_library("passwords_section") {
- deps = [
- ":password_edit_dialog",
- ":password_list_item",
- ":password_manager_proxy",
- "..:global_scroll_target_behavior",
- "..:plural_string_proxy",
- "..:route",
- "../people_page:sync_browser_proxy",
- "//third_party/polymer/v1_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer-extracted",
- "//third_party/polymer/v1_0/components-chromium/iron-a11y-keys-behavior:iron-a11y-keys-behavior-extracted",
- "//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu",
- "//ui/webui/resources/cr_elements/cr_toast:cr_toast_manager",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:list_property_update_behavior",
- "//ui/webui/resources/js:util",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- "//ui/webui/resources/js/cr/ui:focus_without_ink",
- ]
- externs_list = [
- "$externs_path/passwords_private.js",
- "$externs_path/quick_unlock_private.js",
- ]
-}
-
-js_library("password_edit_dialog") {
- deps = [
- ":show_password_behavior",
- "//ui/webui/resources/cr_elements/cr_input:cr_input",
- ]
-}
-
-js_library("payments_list") {
- deps = [
- ":credit_card_list_entry",
- ":upi_id_list_entry",
- "//ui/webui/resources/js:i18n_behavior",
- ]
-}
-
-js_library("show_password_behavior") {
- deps = [ ":blocking_request_manager" ]
- externs_list = [ "$externs_path/passwords_private.js" ]
-}
-
-js_library("upi_id_list_entry") {
- deps = [ "//ui/webui/resources/js:i18n_behavior" ]
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- deps = [
- ":address_edit_dialog.m",
- ":autofill_page.m",
- ":autofill_section.m",
- ":blocking_request_manager.m",
- ":credit_card_edit_dialog.m",
- ":credit_card_list_entry.m",
- ":password_check.m",
- ":password_check_behavior.m",
- ":password_check_edit_dialog.m",
- ":password_check_list_item.m",
- ":password_edit_dialog.m",
- ":password_list_item.m",
- ":password_manager_proxy.m",
- ":password_remove_confirmation_dialog.m",
- ":passwords_export_dialog.m",
- ":passwords_section.m",
- ":payments_list.m",
- ":payments_section.m",
- ":show_password_behavior.m",
- ":upi_id_list_entry.m",
- ]
-}
-
-js_library("address_edit_dialog.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/autofill_page/address_edit_dialog.m.js" ]
- deps = [
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
"//ui/webui/resources/js:assert.m",
@@ -246,15 +43,13 @@ js_library("address_edit_dialog.m") {
"//ui/webui/resources/js:i18n_behavior.m",
]
externs_list = [ "$externs_path/autofill_private.js" ]
- extra_deps = [ ":address_edit_dialog_module" ]
}
-js_library("autofill_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/autofill_page/autofill_page.m.js" ]
+js_library("autofill_page") {
deps = [
- ":password_check_behavior.m",
- "..:open_window_proxy.m",
- "..:route.m",
+ ":password_check_behavior",
+ "..:open_window_proxy",
+ "..:route",
"..:router.m",
"../prefs:prefs_behavior.m",
]
@@ -262,13 +57,11 @@ js_library("autofill_page.m") {
"$externs_path/passwords_private.js",
"$externs_path/settings_private.js",
]
- extra_deps = [ ":autofill_page_module" ]
}
-js_library("autofill_section.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/autofill_page/autofill_section.m.js" ]
+js_library("autofill_section") {
deps = [
- ":address_edit_dialog.m",
+ ":address_edit_dialog",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu.m",
"//ui/webui/resources/js:assert.m",
@@ -280,145 +73,124 @@ js_library("autofill_section.m") {
"$externs_path/autofill_private.js",
"$externs_path/metrics_private.js",
]
- extra_deps = [ ":autofill_section_module" ]
}
-js_library("blocking_request_manager.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/autofill_page/blocking_request_manager.m.js" ]
- extra_deps = [ ":modulize" ]
+js_library("blocking_request_manager") {
}
-js_library("credit_card_edit_dialog.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/autofill_page/credit_card_edit_dialog.m.js" ]
+js_library("credit_card_edit_dialog") {
deps = [
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
"//ui/webui/resources/js:i18n_behavior.m",
]
externs_list = [ "$externs_path/autofill_private.js" ]
- extra_deps = [ ":credit_card_edit_dialog_module" ]
}
-js_library("credit_card_list_entry.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/autofill_page/credit_card_list_entry.m.js" ]
+js_library("credit_card_list_entry") {
deps = [
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:i18n_behavior.m",
]
externs_list = [ "$externs_path/autofill_private.js" ]
- extra_deps = [ ":credit_card_list_entry_module" ]
}
-js_library("password_check.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/autofill_page/password_check.m.js" ]
+js_library("password_check") {
deps = [
- ":blocking_request_manager.m",
- ":password_check_behavior.m",
- ":password_manager_proxy.m",
- "..:plural_string_proxy.m",
+ ":blocking_request_manager",
+ ":password_check_behavior",
+ ":password_manager_proxy",
+ "..:plural_string_proxy",
"../prefs:prefs_behavior.m",
+ "..:route",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
- "//ui/webui/resources/js:util.m",
- "//ui/webui/resources/js/cr/ui:focus_without_ink.m",
]
- externs_list = [ "$externs_path/quick_unlock_private.js" ]
- extra_deps = [ ":password_check_module" ]
}
-js_library("password_check_behavior.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/autofill_page/password_check_behavior.m.js" ]
+js_library("password_check_behavior") {
deps = [
- ":password_manager_proxy.m",
- "..:plural_string_proxy.m",
+ ":password_manager_proxy",
+ "..:plural_string_proxy",
]
externs_list = [ "$externs_path/passwords_private.js" ]
- extra_deps = [ ":modulize" ]
}
-js_library("password_check_edit_dialog.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/autofill_page/password_check_edit_dialog.m.js" ]
+js_library("password_check_edit_dialog") {
deps = [
- ":password_manager_proxy.m",
+ ":password_manager_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
]
- extra_deps = [ ":password_check_edit_dialog_module" ]
}
-js_library("password_check_list_item.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/autofill_page/password_check_list_item.m.js" ]
+js_library("password_check_edit_disclaimer_dialog") {
+ deps = [
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/js:i18n_behavior.m",
+ ]
+}
+
+js_library("password_check_list_item") {
deps = [
- ":blocking_request_manager.m",
- ":password_manager_proxy.m",
- "..:open_window_proxy.m",
+ ":blocking_request_manager",
+ ":password_manager_proxy",
+ "..:open_window_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
- "//ui/webui/resources/js:i18n_behavior",
+ "//ui/webui/resources/js:i18n_behavior.m",
]
- extra_deps = [ ":password_check_list_item_module" ]
}
-js_library("password_edit_dialog.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/autofill_page/password_edit_dialog.m.js" ]
+js_library("password_edit_dialog") {
deps = [
- ":show_password_behavior.m",
+ ":show_password_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_input:cr_input.m",
]
- extra_deps = [ ":password_edit_dialog_module" ]
}
-js_library("password_remove_confirmation_dialog.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/autofill_page/password_remove_confirmation_dialog.m.js" ]
+js_library("password_remove_confirmation_dialog") {
deps = [
- ":password_manager_proxy.m",
+ ":password_manager_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
]
- extra_deps = [ ":password_remove_confirmation_dialog_module" ]
}
-js_library("password_list_item.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/autofill_page/password_list_item.m.js" ]
+js_library("password_list_item") {
deps = [
- ":blocking_request_manager.m",
- ":show_password_behavior.m",
+ ":blocking_request_manager",
+ ":show_password_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js/cr/ui:focus_row_behavior.m",
]
- extra_deps = [ ":password_list_item_module" ]
}
-js_library("password_manager_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/autofill_page/password_manager_proxy.m.js" ]
+js_library("password_manager_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
externs_list = [ "$externs_path/passwords_private.js" ]
- extra_deps = [ ":modulize" ]
}
-js_library("passwords_export_dialog.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/autofill_page/passwords_export_dialog.m.js" ]
+js_library("passwords_export_dialog") {
deps = [
- ":blocking_request_manager.m",
- ":password_manager_proxy.m",
+ ":blocking_request_manager",
+ ":password_manager_proxy",
]
- extra_deps = [ ":passwords_export_dialog_module" ]
}
-js_library("passwords_section.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/autofill_page/passwords_section.m.js" ]
+js_library("passwords_section") {
deps = [
- ":password_edit_dialog.m",
- ":password_list_item.m",
- ":password_manager_proxy.m",
+ ":password_edit_dialog",
+ ":password_list_item",
+ ":password_manager_proxy",
"..:global_scroll_target_behavior.m",
- "..:plural_string_proxy.m",
- "..:route.m",
+ "..:plural_string_proxy",
+ "..:route",
"../people_page:sync_browser_proxy.m",
"../prefs:prefs_behavior.m",
"//third_party/polymer/v3_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer",
@@ -436,28 +208,24 @@ js_library("passwords_section.m") {
"$externs_path/passwords_private.js",
"$externs_path/quick_unlock_private.js",
]
- extra_deps = [ ":passwords_section_module" ]
}
-js_library("payments_list.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/autofill_page/payments_list.m.js" ]
+js_library("payments_list") {
deps = [
- ":credit_card_list_entry.m",
- ":upi_id_list_entry.m",
+ ":credit_card_list_entry",
+ ":upi_id_list_entry",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:load_time_data.m",
]
- extra_deps = [ ":payments_list_module" ]
}
-js_library("payments_section.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/autofill_page/payments_section.m.js" ]
+js_library("payments_section") {
deps = [
- ":autofill_section.m",
- ":credit_card_edit_dialog.m",
- ":payments_list.m",
- "..:metrics_browser_proxy.m",
+ ":autofill_section",
+ ":credit_card_edit_dialog",
+ ":payments_list",
+ "..:metrics_browser_proxy",
"//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu.m",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:cr.m",
@@ -467,232 +235,42 @@ js_library("payments_section.m") {
"//ui/webui/resources/js/cr/ui:focus_without_ink.m",
]
externs_list = [ "$externs_path/autofill_private.js" ]
- extra_deps = [ ":payments_section_module" ]
}
-js_library("show_password_behavior.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/autofill_page/show_password_behavior.m.js" ]
+js_library("show_password_behavior") {
deps = [
- ":blocking_request_manager.m",
- ":password_manager_proxy.m",
+ ":blocking_request_manager",
+ ":password_manager_proxy",
]
externs_list = [ "$externs_path/passwords_private.js" ]
- extra_deps = [ ":modulize" ]
}
-js_library("upi_id_list_entry.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/autofill_page/upi_id_list_entry.m.js" ]
+js_library("upi_id_list_entry") {
deps = [
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:i18n_behavior.m",
]
- extra_deps = [ ":upi_id_list_entry_module" ]
-}
-
-group("polymer3_elements") {
- public_deps = [
- ":address_edit_dialog_module",
- ":autofill_page_module",
- ":autofill_section_module",
- ":credit_card_edit_dialog_module",
- ":credit_card_list_entry_module",
- ":modulize",
- ":password_check_edit_dialog_module",
- ":password_check_list_item_module",
- ":password_check_module",
- ":password_edit_dialog_module",
- ":password_list_item_module",
- ":password_remove_confirmation_dialog_module",
- ":passwords_export_dialog_module",
- ":passwords_section_module",
- ":passwords_shared_css_module",
- ":payments_list_module",
- ":payments_section_module",
- ":upi_id_list_entry_module",
- ]
-}
-
-polymer_modulizer("address_edit_dialog") {
- js_file = "address_edit_dialog.js"
- html_file = "address_edit_dialog.html"
- html_type = "dom-module"
- auto_imports = [
- "ui/webui/resources/html/assert.html|assertNotReached",
- "ui/webui/resources/html/cr.html|addSingletonGetter",
- "ui/webui/resources/html/polymer.html|html,flush,Polymer",
- ]
- namespace_rewrites =
- settings_namespace_rewrites +
- [ "settings.address.AddressComponentUI|AddressComponentUI" ]
-}
-
-polymer_modulizer("autofill_page") {
- js_file = "autofill_page.js"
- html_file = "autofill_page.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/autofill_page/password_manager_proxy.html|PasswordManagerImpl",
- "chrome/browser/resources/settings/open_window_proxy.html|OpenWindowProxyImpl",
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/router.html|Router",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("autofill_section") {
- js_file = "autofill_section.js"
- html_file = "autofill_section.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "ui/webui/resources/html/assert.html|assert",
- "ui/webui/resources/html/cr.html|addSingletonGetter",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("credit_card_edit_dialog") {
- js_file = "credit_card_edit_dialog.js"
- html_file = "credit_card_edit_dialog.html"
- html_type = "dom-module"
-}
-
-polymer_modulizer("credit_card_list_entry") {
- js_file = "credit_card_list_entry.js"
- html_file = "credit_card_list_entry.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("password_check") {
- js_file = "password_check.js"
- html_file = "password_check.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/autofill_page/password_manager_proxy.html|PasswordManagerImpl,PasswordManagerProxy",
- "chrome/browser/resources/settings/people_page/sync_browser_proxy.html|SyncBrowserProxyImpl,SyncPrefs,SyncStatus",
- "chrome/browser/resources/settings/plural_string_proxy.html|PluralStringProxyImpl",
- "chrome/browser/resources/settings/router.html|Router",
- "ui/webui/resources/html/assert.html|assert",
- "ui/webui/resources/html/util.html|getDeepActiveElement",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("password_check_edit_dialog") {
- js_file = "password_check_edit_dialog.js"
- html_file = "password_check_edit_dialog.html"
- html_type = "dom-module"
- auto_imports = [
- "ui/webui/resources/html/assert.html|assert",
- "chrome/browser/resources/settings/autofill_page/password_manager_proxy.html|PasswordManagerImpl,PasswordManagerProxy",
- ]
-}
-
-polymer_modulizer("password_check_list_item") {
- js_file = "password_check_list_item.js"
- html_file = "password_check_list_item.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/open_window_proxy.html|OpenWindowProxyImpl",
- "chrome/browser/resources/settings/autofill_page/password_manager_proxy.html|PasswordManagerImpl,PasswordManagerProxy",
- "ui/webui/resources/html/assert.html|assert",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("password_edit_dialog") {
- js_file = "password_edit_dialog.js"
- html_file = "password_edit_dialog.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports
-}
-
-polymer_modulizer("password_list_item") {
- js_file = "password_list_item.js"
- html_file = "password_list_item.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [ "chrome/browser/resources/settings/autofill_page/password_manager_proxy.html|PasswordManagerProxy" ]
-}
-
-polymer_modulizer("passwords_export_dialog") {
- js_file = "passwords_export_dialog.js"
- html_file = "passwords_export_dialog.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [ "chrome/browser/resources/settings/autofill_page/password_manager_proxy.html|PasswordManagerImpl, PasswordManagerProxy" ]
-}
-
-polymer_modulizer("password_remove_confirmation_dialog") {
- js_file = "password_remove_confirmation_dialog.js"
- html_file = "password_remove_confirmation_dialog.html"
- html_type = "dom-module"
- auto_imports = [
- "chrome/browser/resources/settings/autofill_page/password_manager_proxy.html|PasswordManagerImpl,PasswordManagerProxy",
- "ui/webui/resources/html/assert.html|assert",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("passwords_section") {
- js_file = "passwords_section.js"
- html_file = "passwords_section.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites +
- [ "Polymer.IronA11yKeysBehavior|IronA11yKeysBehavior" ]
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/autofill_page/password_manager_proxy.html|PasswordManagerImpl,PasswordManagerProxy",
- "chrome/browser/resources/settings/people_page/sync_browser_proxy.html|SyncBrowserProxyImpl,SyncPrefs,SyncStatus",
- "chrome/browser/resources/settings/plural_string_proxy.html|PluralStringProxyImpl",
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/router.html|Router",
- "third_party/polymer/v1_0/components-chromium/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html|IronA11yKeysBehavior",
- "ui/webui/resources/cr_elements/cr_toast/cr_toast_manager.html|getToastManager",
- "ui/webui/resources/html/assert.html|assert",
- "ui/webui/resources/html/polymer.html|afterNextRender,html,Polymer",
- "ui/webui/resources/html/util.html|getDeepActiveElement",
- ]
-}
-
-polymer_modulizer("passwords_shared_css") {
- js_file = "passwords_shared_css.m.js"
- html_file = "passwords_shared_css.html"
- html_type = "style-module"
-}
-
-polymer_modulizer("payments_list") {
- js_file = "payments_list.js"
- html_file = "payments_list.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("payments_section") {
- js_file = "payments_section.js"
- html_file = "payments_section.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/autofill_page/autofill_section.html|AutofillManager",
- "chrome/browser/resources/settings/metrics_browser_proxy.html|MetricsBrowserProxyImpl,PrivacyElementInteractions",
- "ui/webui/resources/html/assert.html|assert",
- "ui/webui/resources/html/cr.html|addSingletonGetter",
- ]
- namespace_rewrites = settings_namespace_rewrites +
- [ "settings.PaymentsManager|PaymentsManager" ]
-}
-
-polymer_modulizer("upi_id_list_entry") {
- js_file = "upi_id_list_entry.js"
- html_file = "upi_id_list_entry.html"
- html_type = "dom-module"
}
-js_modulizer("modulize") {
- input_files = [
- "blocking_request_manager.js",
- "password_check_behavior.js",
- "password_manager_proxy.js",
- "show_password_behavior.js",
+html_to_js("web_components") {
+ js_files = [
+ "address_edit_dialog.js",
+ "autofill_page.js",
+ "autofill_section.js",
+ "credit_card_edit_dialog.js",
+ "credit_card_list_entry.js",
+ "password_check_edit_dialog.js",
+ "password_check_edit_disclaimer_dialog.js",
+ "password_check_list_item.js",
+ "password_check.js",
+ "password_edit_dialog.js",
+ "password_list_item.js",
+ "password_remove_confirmation_dialog.js",
+ "passwords_export_dialog.js",
+ "passwords_section.js",
+ "passwords_shared_css.js",
+ "payments_list.js",
+ "payments_section.js",
+ "upi_id_list_entry.js",
]
- namespace_rewrites = settings_namespace_rewrites
}
diff --git a/chromium/chrome/browser/resources/settings/basic_page/BUILD.gn b/chromium/chrome/browser/resources/settings/basic_page/BUILD.gn
index 7d7144891ab..21924f68c30 100644
--- a/chromium/chrome/browser/resources/settings/basic_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/basic_page/BUILD.gn
@@ -3,10 +3,12 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [ ":basic_page" ]
}
@@ -14,52 +16,17 @@ js_library("basic_page") {
deps = [
"..:page_visibility",
"..:route",
- "..:router",
- "..:search_settings",
- "../chrome_cleanup_page:chrome_cleanup_proxy",
- "../prefs:prefs_behavior",
- "../settings_page:main_page_behavior",
- "//ui/webui/resources/js:load_time_data",
- ]
- externs_list = [ "$externs_path/pending_polymer.js" ]
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- deps = [ ":basic_page.m" ]
-}
-
-js_library("basic_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/basic_page/basic_page.m.js" ]
- deps = [
- "..:page_visibility.m",
- "..:route.m",
"..:router.m",
"..:search_settings.m",
- "../chrome_cleanup_page:chrome_cleanup_proxy.m",
+ "../chrome_cleanup_page:chrome_cleanup_proxy",
"../prefs:prefs_behavior.m",
+ "../safety_check_page:safety_check_page",
+ "../search_page",
"../settings_page:main_page_behavior.m",
"//ui/webui/resources/js:load_time_data.m",
]
- extra_deps = [ ":basic_page_module" ]
-}
-
-group("polymer3_elements") {
- public_deps = [ ":basic_page_module" ]
}
-polymer_modulizer("basic_page") {
- js_file = "basic_page.js"
- html_file = "basic_page.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/page_visibility.html|PageVisibility",
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/router.html|Route, Router, RouteObserverBehavior",
- "chrome/browser/resources/settings/settings_page/main_page_behavior.html|MainPageBehavior",
- "chrome/browser/resources/settings/search_settings.html|getSearchManager, SearchResult",
- "ui/webui/resources/html/assert.html|assert",
- "ui/webui/resources/html/polymer.html|beforeNextRender,html,Polymer",
- ]
- namespace_rewrites = settings_namespace_rewrites
+html_to_js("web_components") {
+ js_files = [ "basic_page.js" ]
}
diff --git a/chromium/chrome/browser/resources/settings/chrome_cleanup_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chrome_cleanup_page/BUILD.gn
index 71b108e45e9..1ca63afb2c8 100644
--- a/chromium/chrome/browser/resources/settings/chrome_cleanup_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chrome_cleanup_page/BUILD.gn
@@ -3,11 +3,12 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
-import("//ui/webui/resources/tools/js_modulizer.gni")
+import("//tools/polymer/html_to_js.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [
":chrome_cleanup_page",
":chrome_cleanup_proxy",
@@ -15,103 +16,32 @@ js_type_check("closure_compile") {
]
}
-js_library("chrome_cleanup_proxy") {
- deps = [
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- ]
-}
-
js_library("chrome_cleanup_page") {
deps = [
":chrome_cleanup_proxy",
- "//ui/webui/resources/cr_elements/cr_expand_button:cr_expand_button",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js:util",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
-js_library("items_to_remove_list") {
- deps = [
- ":chrome_cleanup_proxy",
- "//ui/webui/resources/js:cr",
- ]
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- deps = [
- ":chrome_cleanup_page.m",
- ":chrome_cleanup_proxy.m",
- ":items_to_remove_list.m",
- ]
-}
-
-js_library("chrome_cleanup_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/chrome_cleanup_page/chrome_cleanup_page.m.js" ]
- deps = [
- ":chrome_cleanup_proxy.m",
- ":items_to_remove_list.m",
+ ":items_to_remove_list",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":chrome_cleanup_page_module" ]
externs_list = [ "$externs_path/settings_private.js" ]
}
-js_library("chrome_cleanup_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/chrome_cleanup_page/chrome_cleanup_proxy.m.js" ]
+js_library("chrome_cleanup_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
}
-js_library("items_to_remove_list.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/chrome_cleanup_page/items_to_remove_list.m.js" ]
+js_library("items_to_remove_list") {
deps = [
- ":chrome_cleanup_proxy.m",
+ ":chrome_cleanup_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
- extra_deps = [ ":items_to_remove_list_module" ]
-}
-
-group("polymer3_elements") {
- public_deps = [
- ":chrome_cleanup_page_module",
- ":items_to_remove_list_module",
- ":modulize",
- ]
}
-polymer_modulizer("chrome_cleanup_page") {
- js_file = "chrome_cleanup_page.js"
- html_file = "chrome_cleanup_page.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites + [
- "settings.ChromeCleaner|ChromeCleaner",
- "settings.ChromeCleanup|ChromeCleanup",
- ]
- auto_imports = [
- "ui/webui/resources/html/assert.html|assert",
- "chrome/browser/resources/settings/chrome_cleanup_page/chrome_cleanup_proxy.html|ChromeCleanupProxyImpl,ChromeCleanupProxy",
- "chrome/browser/resources/settings/chrome_cleanup_page/items_to_remove_list.html|ChromeCleanupRemovalListItem",
+html_to_js("web_components") {
+ js_files = [
+ "chrome_cleanup_page.js",
+ "items_to_remove_list.js",
]
}
-
-polymer_modulizer("items_to_remove_list") {
- js_file = "items_to_remove_list.js"
- html_file = "items_to_remove_list.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = [ "chrome/browser/resources/settings/chrome_cleanup_page/chrome_cleanup_proxy.html|ChromeCleanupProxyImpl" ]
-}
-
-js_modulizer("modulize") {
- input_files = [ "chrome_cleanup_proxy.js" ]
- namespace_rewrites = settings_namespace_rewrites
-}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/BUILD.gn
index 01feaf04caa..2e345985162 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/BUILD.gn
@@ -5,6 +5,7 @@
import("//chrome/common/features.gni")
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/grit/grit_rule.gni")
+import("//ui/webui/resources/tools/js_modulizer.gni")
import("//ui/webui/webui_features.gni")
import("../../optimize_webui.gni")
@@ -38,6 +39,8 @@ if (optimize_webui) {
"chrome://os-settings/app-management/image_info.mojom-lite.js",
"chrome://os-settings/app-management/image.mojom-lite.js",
"chrome://os-settings/app-management/types.mojom-lite.js",
+ "chrome://os-settings/constants/routes.mojom-lite.js",
+ "chrome://os-settings/constants/setting.mojom-lite.js",
"chrome://os-settings/search/search.mojom-lite.js",
"chrome://os-settings/search/search_result_icon.mojom-lite.js",
"chrome://os-settings/search/user_action_recorder.mojom-lite.js",
@@ -59,16 +62,14 @@ if (optimize_webui) {
grit("flattened_resources") {
source = "../os_settings_resources.grd"
- deps = [
- "//chrome/browser/ui/webui/app_management:mojo_bindings_js",
- "//chrome/browser/ui/webui/settings/chromeos/search:mojo_bindings_js",
- ]
+ deps = [ "//chrome/browser/ui/webui/settings/chromeos:mojom_js" ]
grit_flags = [
"-E",
"root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir),
]
+ deps += [ ":polymer3_elements" ]
defines = chrome_grit_defines
outputs = [
"grit/os_settings_resources.h",
@@ -87,6 +88,7 @@ group("closure_compile") {
":os_route",
":os_settings_routes",
":route_origin_behavior",
+ ":search_handler",
"ambient_mode_page:closure_compile",
"bluetooth_page:closure_compile",
"crostini_page:closure_compile",
@@ -98,7 +100,6 @@ group("closure_compile") {
"multidevice_page:closure_compile",
"os_a11y_page:closure_compile",
"os_apps_page:closure_compile",
- "os_apps_page/app_management_page:closure_compile",
"os_files_page:closure_compile",
"os_languages_page:closure_compile",
"os_people_page:closure_compile",
@@ -113,7 +114,11 @@ group("closure_compile") {
"os_settings_ui:closure_compile",
"parental_controls_page:closure_compile",
"personalization_page:closure_compile",
- "plugin_vm_page:closure_compile",
+
+ # TODO: These subpages should be listed in the BUILD files of their direct
+ # parents instead of here.
+ "os_apps_page/app_management_page:closure_compile",
+ "os_apps_page/app_management_page/plugin_vm_page:closure_compile",
]
}
@@ -128,6 +133,7 @@ js_library("os_route") {
deps = [
":os_settings_routes",
"..:router",
+ "//chrome/browser/ui/webui/settings/chromeos/constants:mojom_js_library_for_compile",
"//ui/webui/resources/js:cr",
"//ui/webui/resources/js:load_time_data",
]
@@ -153,3 +159,213 @@ js_library("metrics_recorder") {
"//ui/webui/resources/js:cr",
]
}
+
+js_library("search_handler") {
+ deps = [
+ "//chrome/browser/ui/webui/settings/chromeos/search:mojo_bindings_js_library_for_compile",
+ "//ui/webui/resources/js:cr",
+ ]
+}
+
+# Polymer 3 related rules.
+
+group("closure_compile_module") {
+ deps = [
+ # TODO: Uncomment as the Polymer3 migration makes progress.
+ #":closure_compile_local_module",
+ #"ambient_mode_page:closure_compile_module",
+ #"bluetooth_page:closure_compile_module",
+ #"crostini_page:closure_compile_module",
+ #"date_time_page:closure_compile_module",
+ #"device_page:closure_compile_module",
+ #"google_assistant_page:closure_compile_module",
+ #"internet_page:closure_compile_module",
+ #"localized_link:closure_compile_module",
+ #"multidevice_page:closure_compile_module",
+ #"os_a11y_page:closure_compile_module",
+ #"os_about_page:closure_compile_module",
+ #"os_apps_page:closure_compile_module",
+ #"os_apps_page/app_management_page/plugin_vm_page:closure_compile_module",
+ #"os_files_page:closure_compile_module",
+ #"os_languages_page:closure_compile_module",
+ #"os_people_page:closure_compile_module",
+ #"os_printing_page:closure_compile_module",
+ #"os_privacy_page:closure_compile_module",
+ #"os_reset_page:closure_compile_module",
+ #"os_search_page:closure_compile_module",
+ #"os_settings_main:closure_compile_module",
+ #"os_settings_menu:closure_compile_module",
+ #"os_settings_page:closure_compile_module",
+ #"os_settings_search_box:closure_compile_module",
+ #"os_settings_ui:closure_compile_module",
+ #"os_toolbar:closure_compile_module",
+ #"parental_controls_page:closure_compile_module",
+ #"personalization_page:closure_compile_module",
+ ]
+}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_local_module") {
+# is_polymer3 = true
+# deps = [
+# ":metrics_recorder.m",
+# ":os_icons.m",
+# ":os_page_visibility.m",
+# ":os_route.m",
+# ":os_settings.m",
+# ":os_settings_icons_css.m",
+# ":os_settings_routes.m",
+# ":route_origin_behavior.m",
+# ":search_handler.m",
+# ]
+#}
+
+js_library("metrics_recorder.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/metrics_recorder.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":metrics_recorder_module" ]
+}
+
+js_library("os_icons.m") {
+ sources = [
+ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_icons.m.js",
+ ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_icons_module" ]
+}
+
+js_library("os_page_visibility.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_page_visibility.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_page_visibility_module" ]
+}
+
+js_library("os_route.m") {
+ sources = [
+ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_route.m.js",
+ ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_route_module" ]
+}
+
+js_library("os_settings_icons_css.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_settings_icons_css.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_settings_icons_css_module" ]
+}
+
+js_library("os_settings_routes.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_settings_routes.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("route_origin_behavior.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/route_origin_behavior.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("search_handler.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/search_handler.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [
+ # Sub-folder targets
+ "ambient_mode_page:polymer3_elements",
+ "bluetooth_page:polymer3_elements",
+ "crostini_page:polymer3_elements",
+ "date_time_page:polymer3_elements",
+ "device_page:polymer3_elements",
+ "google_assistant_page:polymer3_elements",
+ "internet_page:polymer3_elements",
+ "localized_link:polymer3_elements",
+ "multidevice_page:polymer3_elements",
+ "os_a11y_page:polymer3_elements",
+ "os_about_page:polymer3_elements",
+ "os_apps_page:polymer3_elements",
+ "os_apps_page/app_management_page/plugin_vm_page:polymer3_elements",
+ "os_files_page:polymer3_elements",
+ "os_languages_page:polymer3_elements",
+ "os_people_page:polymer3_elements",
+ "os_printing_page:polymer3_elements",
+ "os_privacy_page:polymer3_elements",
+ "os_reset_page:polymer3_elements",
+ "os_search_page:polymer3_elements",
+ "os_settings_main:polymer3_elements",
+ "os_settings_menu:polymer3_elements",
+ "os_settings_page:polymer3_elements",
+ "os_settings_search_box:polymer3_elements",
+ "os_settings_ui:polymer3_elements",
+ "os_toolbar:polymer3_elements",
+ "parental_controls_page:polymer3_elements",
+ "personalization_page:polymer3_elements",
+
+ # Local targets
+ ":metrics_recorder_module",
+ ":modulize",
+ ":os_icons_module",
+ ":os_page_visibility_module",
+ ":os_route_module",
+ ":os_settings_icons_css_module",
+ ]
+}
+
+polymer_modulizer("metrics_recorder") {
+ js_file = "metrics_recorder.js"
+ html_file = "metrics_recorder.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("os_icons") {
+ js_file = "os_icons.m.js"
+ html_file = "os_icons.html"
+ html_type = "iron-iconset"
+}
+
+polymer_modulizer("os_page_visibility") {
+ js_file = "os_page_visibility.js"
+ html_file = "os_page_visibility.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("os_route") {
+ js_file = "os_route.js"
+ html_file = "os_route.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("os_settings_icons_css") {
+ js_file = "os_settings_icons_css.m.js"
+ html_file = "os_settings_icons_css.html"
+ html_type = "style-module"
+}
+
+js_modulizer("modulize") {
+ input_files = [
+ "os_settings_routes.js",
+ "route_origin_behavior.js",
+ "search_handler.js",
+ ]
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/ambient_mode_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/ambient_mode_page/BUILD.gn
index 583c5bdb26d..3e19c60857f 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/ambient_mode_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/ambient_mode_page/BUILD.gn
@@ -23,5 +23,52 @@ js_library("ambient_mode_page") {
"//ui/webui/resources/js:cr",
"//ui/webui/resources/js:i18n_behavior",
"//ui/webui/resources/js:load_time_data",
+ "//ui/webui/resources/js:web_ui_listener_behavior",
]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":ambient_mode_browser_proxy.m",
+# ":ambient_mode_page.m"
+# ]
+#}
+
+js_library("ambient_mode_browser_proxy.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/ambient_mode_page/ambient_mode_browser_proxy.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("ambient_mode_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/ambient_mode_page/ambient_mode_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":ambient_mode_page_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [
+ ":ambient_mode_page_module",
+ ":modulize",
+ ]
+}
+
+polymer_modulizer("ambient_mode_page") {
+ js_file = "ambient_mode_page.js"
+ html_file = "ambient_mode_page.html"
+ html_type = "dom-module"
+}
+
+import("//ui/webui/resources/tools/js_modulizer.gni")
+
+js_modulizer("modulize") {
+ input_files = [ "ambient_mode_browser_proxy.js" ]
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/bluetooth_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/bluetooth_page/BUILD.gn
index 8e257d5727e..a3432524ed1 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/bluetooth_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/bluetooth_page/BUILD.gn
@@ -68,3 +68,65 @@ js_library("bluetooth_system_on_extensions") {
sources = []
deps = [ "//services/device/public/mojom:mojom_js_library_for_compile" ]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":bluetooth_device_list_item.m",
+# ":bluetooth_page.m",
+# ":bluetooth_subpage.m"
+# ]
+#}
+
+js_library("bluetooth_device_list_item.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/bluetooth_page/bluetooth_device_list_item.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":bluetooth_device_list_item_module" ]
+}
+
+js_library("bluetooth_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/bluetooth_page/bluetooth_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":bluetooth_page_module" ]
+}
+
+js_library("bluetooth_subpage.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/bluetooth_page/bluetooth_subpage.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":bluetooth_subpage_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [
+ ":bluetooth_device_list_item_module",
+ ":bluetooth_page_module",
+ ":bluetooth_subpage_module",
+ ]
+}
+
+polymer_modulizer("bluetooth_device_list_item") {
+ js_file = "bluetooth_device_list_item.js"
+ html_file = "bluetooth_device_list_item.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("bluetooth_page") {
+ js_file = "bluetooth_page.js"
+ html_file = "bluetooth_page.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("bluetooth_subpage") {
+ js_file = "bluetooth_subpage.js"
+ html_file = "bluetooth_subpage.html"
+ html_type = "dom-module"
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/crostini_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/crostini_page/BUILD.gn
index 2cf11208bdd..8da221484d9 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/crostini_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/crostini_page/BUILD.gn
@@ -82,8 +82,13 @@ js_library("crostini_shared_usb_devices") {
js_library("crostini_port_forwarding") {
deps = [
":crostini_browser_proxy",
- "../..:route",
+ "..:metrics_recorder",
+ "..:os_route",
"../../prefs:prefs_behavior",
+ "//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu",
+ "//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render",
+ "//ui/webui/resources/js:cr",
+ "//ui/webui/resources/js:web_ui_listener_behavior",
]
}
@@ -98,3 +103,240 @@ js_library("crostini_subpage") {
"../../prefs:prefs_behavior",
]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":crostini_arc_adb.m",
+# ":crostini_arc_adb_confirmation_dialog.m",
+# ":crostini_browser_proxy.m",
+# ":crostini_disk_resize_dialog.m",
+# ":crostini_disk_resize_confirmation_dialog.m",
+# ":crostini_export_import.m",
+# ":crostini_import_confirmation_dialog.m",
+# ":crostini_mic_sharing_dialog.m",
+# ":crostini_page.m",
+# ":crostini_port_forwarding.m",
+# ":crostini_port_forwarding_add_port_dialog.m",
+# ":crostini_shared_paths.m",
+# ":crostini_shared_usb_devices.m",
+# ":crostini_subpage.m"
+# ]
+#}
+
+js_library("crostini_arc_adb.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/crostini_page/crostini_arc_adb.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":crostini_arc_adb_module" ]
+}
+
+js_library("crostini_arc_adb_confirmation_dialog.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/crostini_page/crostini_arc_adb_confirmation_dialog.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":crostini_arc_adb_confirmation_dialog_module" ]
+}
+
+js_library("crostini_browser_proxy.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/crostini_page/crostini_browser_proxy.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("crostini_disk_resize_dialog.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/crostini_page/crostini_disk_resize_dialog.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":crostini_disk_resize_dialog_module" ]
+}
+
+js_library("crostini_disk_resize_confirmation_dialog.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/crostini_page/crostini_disk_resize_confirmation_dialog.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":crostini_disk_resize_confirmation_dialog_module" ]
+}
+
+js_library("crostini_export_import.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/crostini_page/crostini_export_import.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":crostini_export_import_module" ]
+}
+
+js_library("crostini_import_confirmation_dialog.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/crostini_page/crostini_import_confirmation_dialog.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":crostini_import_confirmation_dialog_module" ]
+}
+
+js_library("crostini_mic_sharing_dialog.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/crostini_page/crostini_mic_sharing_dialog.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":crostini_mic_sharing_dialog_module" ]
+}
+
+js_library("crostini_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/crostini_page/crostini_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":crostini_page_module" ]
+}
+
+js_library("crostini_port_forwarding.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/crostini_page/crostini_port_forwarding.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":crostini_port_forwarding_module" ]
+}
+
+js_library("crostini_port_forwarding_add_port_dialog.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/crostini_page/crostini_port_forwarding_add_port_dialog.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":crostini_port_forwarding_add_port_dialog_module" ]
+}
+
+js_library("crostini_shared_paths.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/crostini_page/crostini_shared_paths.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":crostini_shared_paths_module" ]
+}
+
+js_library("crostini_shared_usb_devices.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/crostini_page/crostini_shared_usb_devices.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":crostini_shared_usb_devices_module" ]
+}
+
+js_library("crostini_subpage.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/crostini_page/crostini_subpage.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":crostini_subpage_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [
+ ":crostini_arc_adb_confirmation_dialog_module",
+ ":crostini_arc_adb_module",
+ ":crostini_disk_resize_dialog_module",
+ ":crostini_export_import_module",
+ ":crostini_import_confirmation_dialog_module",
+ ":crostini_mic_sharing_dialog_module",
+ ":crostini_page_module",
+ ":crostini_port_forwarding_add_port_dialog_module",
+ ":crostini_port_forwarding_module",
+ ":crostini_shared_paths_module",
+ ":crostini_shared_usb_devices_module",
+ ":crostini_subpage_module",
+ ":modulize",
+ ]
+}
+
+polymer_modulizer("crostini_arc_adb") {
+ js_file = "crostini_arc_adb.js"
+ html_file = "crostini_arc_adb.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("crostini_arc_adb_confirmation_dialog") {
+ js_file = "crostini_arc_adb_confirmation_dialog.js"
+ html_file = "crostini_arc_adb_confirmation_dialog.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("crostini_disk_resize_dialog") {
+ js_file = "crostini_disk_resize_dialog.js"
+ html_file = "crostini_disk_resize_dialog.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("crostini_disk_resize_confirmation_dialog") {
+ js_file = "crostini_disk_resize_confirmation_dialog.js"
+ html_file = "crostini_disk_resize_confirmation_dialog.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("crostini_export_import") {
+ js_file = "crostini_export_import.js"
+ html_file = "crostini_export_import.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("crostini_import_confirmation_dialog") {
+ js_file = "crostini_import_confirmation_dialog.js"
+ html_file = "crostini_import_confirmation_dialog.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("crostini_mic_sharing_dialog") {
+ js_file = "crostini_mic_sharing_dialog.js"
+ html_file = "crostini_mic_sharing_dialog.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("crostini_page") {
+ js_file = "crostini_page.js"
+ html_file = "crostini_page.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("crostini_port_forwarding") {
+ js_file = "crostini_port_forwarding.js"
+ html_file = "crostini_port_forwarding.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("crostini_port_forwarding_add_port_dialog") {
+ js_file = "crostini_port_forwarding_add_port_dialog.js"
+ html_file = "crostini_port_forwarding_add_port_dialog.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("crostini_shared_paths") {
+ js_file = "crostini_shared_paths.js"
+ html_file = "crostini_shared_paths.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("crostini_shared_usb_devices") {
+ js_file = "crostini_shared_usb_devices.js"
+ html_file = "crostini_shared_usb_devices.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("crostini_subpage") {
+ js_file = "crostini_subpage.js"
+ html_file = "crostini_subpage.html"
+ html_type = "dom-module"
+}
+
+import("//ui/webui/resources/tools/js_modulizer.gni")
+
+js_modulizer("modulize") {
+ input_files = [ "crostini_browser_proxy.js" ]
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/date_time_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/date_time_page/BUILD.gn
index 7cbb19ab5e7..4d73c447751 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/date_time_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/date_time_page/BUILD.gn
@@ -51,3 +51,81 @@ js_library("timezone_subpage") {
"//ui/webui/resources/js:cr",
]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":date_time_page.m",
+# ":date_time_types.m",
+# ":timezone_selector.m",
+# ":timezone_subpage.m"
+# ]
+#}
+
+js_library("date_time_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/date_time_page/date_time_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":date_time_page_module" ]
+}
+
+js_library("date_time_types.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/date_time_page/date_time_types.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":date_time_types_module" ]
+}
+
+js_library("timezone_selector.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/date_time_page/timezone_selector.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":timezone_selector_module" ]
+}
+
+js_library("timezone_subpage.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/date_time_page/timezone_subpage.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":timezone_subpage_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [
+ ":date_time_page_module",
+ ":date_time_types_module",
+ ":timezone_selector_module",
+ ":timezone_subpage_module",
+ ]
+}
+
+polymer_modulizer("date_time_page") {
+ js_file = "date_time_page.js"
+ html_file = "date_time_page.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("date_time_types") {
+ js_file = "date_time_types.js"
+ html_file = "date_time_types.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("timezone_selector") {
+ js_file = "timezone_selector.js"
+ html_file = "timezone_selector.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("timezone_subpage") {
+ js_file = "timezone_subpage.js"
+ html_file = "timezone_subpage.html"
+ html_type = "dom-module"
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn
index 94869ce7620..a9273bb0410 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn
@@ -11,6 +11,7 @@ js_type_check("closure_compile") {
":display",
":display_layout",
":display_overscan_dialog",
+ ":dlc_subpage",
":drag_behavior",
":keyboard",
":layout_behavior",
@@ -72,6 +73,7 @@ js_library("stylus") {
js_library("display") {
deps = [
":display_layout",
+ "../..:router",
"../../controls:settings_dropdown_menu",
"../../controls:settings_slider",
"../../prefs:prefs_behavior",
@@ -107,6 +109,10 @@ js_library("display_overscan_dialog") {
extra_sources = [ "$interfaces_path/system_display_interface.js" ]
}
+js_library("dlc_subpage") {
+ deps = [ ":device_page_browser_proxy" ]
+}
+
js_library("drag_behavior") {
deps = [ "//ui/webui/resources/js:cr" ]
}
@@ -149,3 +155,263 @@ js_library("storage") {
"//ui/webui/resources/js/cr/ui:focus_without_ink",
]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":device_page.m",
+# ":device_page_browser_proxy.m",
+# ":display.m",
+# ":display_layout.m",
+# ":display_overscan_dialog.m",
+# ":dlc_subpage.m",
+# ":drag_behavior.m",
+# ":keyboard.m",
+# ":layout_behavior.m",
+# ":night_light_slider.m",
+# ":pointers.m",
+# ":power.m",
+# ":storage.m",
+# ":storage_external.m",
+# ":storage_external_entry.m",
+# ":stylus.m"
+# ]
+#}
+
+js_library("device_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/device_page/device_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":device_page_module" ]
+}
+
+js_library("device_page_browser_proxy.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/device_page/device_page_browser_proxy.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("display.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/device_page/display.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":display_module" ]
+}
+
+js_library("display_layout.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/device_page/display_layout.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":display_layout_module" ]
+}
+
+js_library("display_overscan_dialog.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/device_page/display_overscan_dialog.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":display_overscan_dialog_module" ]
+}
+
+js_library("dlc_subpage.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/device_page/dlc_subpage.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":dlc_subpage_module" ]
+}
+
+js_library("drag_behavior.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/device_page/drag_behavior.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("keyboard.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/device_page/keyboard.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":keyboard_module" ]
+}
+
+js_library("layout_behavior.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/device_page/layout_behavior.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("night_light_slider.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/device_page/night_light_slider.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":night_light_slider_module" ]
+}
+
+js_library("pointers.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/device_page/pointers.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":pointers_module" ]
+}
+
+js_library("power.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/device_page/power.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":power_module" ]
+}
+
+js_library("storage.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/device_page/storage.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":storage_module" ]
+}
+
+js_library("storage_external.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/device_page/storage_external.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":storage_external_module" ]
+}
+
+js_library("storage_external_entry.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/device_page/storage_external_entry.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":storage_external_entry_module" ]
+}
+
+js_library("stylus.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/device_page/stylus.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":stylus_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [
+ ":device_page_module",
+ ":display_layout_module",
+ ":display_module",
+ ":display_overscan_dialog_module",
+ ":dlc_subpage_module",
+ ":keyboard_module",
+ ":modulize",
+ ":night_light_slider_module",
+ ":pointers_module",
+ ":power_module",
+ ":storage_external_entry_module",
+ ":storage_external_module",
+ ":storage_module",
+ ":stylus_module",
+ ]
+}
+
+polymer_modulizer("device_page") {
+ js_file = "device_page.js"
+ html_file = "device_page.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("display") {
+ js_file = "display.js"
+ html_file = "display.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("display_layout") {
+ js_file = "display_layout.js"
+ html_file = "display_layout.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("display_overscan_dialog") {
+ js_file = "display_overscan_dialog.js"
+ html_file = "display_overscan_dialog.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("dlc_subpage") {
+ js_file = "dlc_subpage.js"
+ html_file = "dlc_subpage.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("keyboard") {
+ js_file = "keyboard.js"
+ html_file = "keyboard.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("night_light_slider") {
+ js_file = "night_light_slider.js"
+ html_file = "night_light_slider.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("pointers") {
+ js_file = "pointers.js"
+ html_file = "pointers.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("power") {
+ js_file = "power.js"
+ html_file = "power.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("storage") {
+ js_file = "storage.js"
+ html_file = "storage.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("storage_external") {
+ js_file = "storage_external.js"
+ html_file = "storage_external.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("storage_external_entry") {
+ js_file = "storage_external_entry.js"
+ html_file = "storage_external_entry.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("stylus") {
+ js_file = "stylus.js"
+ html_file = "stylus.html"
+ html_type = "dom-module"
+}
+
+import("//ui/webui/resources/tools/js_modulizer.gni")
+
+js_modulizer("modulize") {
+ input_files = [
+ "device_page_browser_proxy.js",
+ "drag_behavior.js",
+ "layout_behavior.js",
+ ]
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/google_assistant_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/google_assistant_page/BUILD.gn
index 0c330bb0e5e..e6ec1bbc610 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/google_assistant_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/google_assistant_page/BUILD.gn
@@ -27,3 +27,49 @@ js_library("google_assistant_page") {
"//ui/webui/resources/js:web_ui_listener_behavior",
]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":google_assistant_browser_proxy.m",
+# ":google_assistant_page.m"
+# ]
+#}
+
+js_library("google_assistant_browser_proxy.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/google_assistant_page/google_assistant_browser_proxy.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("google_assistant_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/google_assistant_page/google_assistant_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":google_assistant_page_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [
+ ":google_assistant_page_module",
+ ":modulize",
+ ]
+}
+
+polymer_modulizer("google_assistant_page") {
+ js_file = "google_assistant_page.js"
+ html_file = "google_assistant_page.html"
+ html_type = "dom-module"
+}
+
+import("//ui/webui/resources/tools/js_modulizer.gni")
+
+js_modulizer("modulize") {
+ input_files = [ "google_assistant_browser_proxy.js" ]
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn
index e5182752260..c09ff76361b 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn
@@ -26,7 +26,9 @@ js_library("internet_page") {
"..:metrics_recorder",
"..:os_route",
"../..:router",
+ "../../people_page:sync_browser_proxy",
"../../settings_page:settings_animated_pages",
+ "../os_people_page:os_sync_browser_proxy",
"//chromeos/services/network_config/public/mojom:mojom_js_library_for_compile",
"//ui/webui/resources/cr_components/chromeos/network:mojo_interface_provider",
"//ui/webui/resources/cr_components/chromeos/network:network_listener_behavior",
@@ -151,3 +153,193 @@ js_library("tether_connection_dialog") {
"//ui/webui/resources/js:i18n_behavior",
]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":internet_config.m",
+# ":internet_detail_page.m",
+# ":internet_known_networks_page.m",
+# ":internet_page.m",
+# ":internet_page_browser_proxy.m",
+# ":internet_shared_css.m",
+# ":internet_subpage.m",
+# ":network_proxy_section.m",
+# ":network_summary.m",
+# ":network_summary_item.m",
+# ":tether_connection_dialog.m"
+# ]
+#}
+
+js_library("internet_config.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/internet_page/internet_config.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":internet_config_module" ]
+}
+
+js_library("internet_detail_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":internet_detail_page_module" ]
+}
+
+js_library("internet_known_networks_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/internet_page/internet_known_networks_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":internet_known_networks_page_module" ]
+}
+
+js_library("internet_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/internet_page/internet_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":internet_page_module" ]
+}
+
+js_library("internet_page_browser_proxy.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/internet_page/internet_page_browser_proxy.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("internet_shared_css.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/internet_page/internet_shared_css.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":internet_shared_css_module" ]
+}
+
+js_library("internet_subpage.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":internet_subpage_module" ]
+}
+
+js_library("network_proxy_section.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":network_proxy_section_module" ]
+}
+
+js_library("network_summary.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/internet_page/network_summary.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":network_summary_module" ]
+}
+
+js_library("network_summary_item.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/internet_page/network_summary_item.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":network_summary_item_module" ]
+}
+
+js_library("tether_connection_dialog.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/internet_page/tether_connection_dialog.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":tether_connection_dialog_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [
+ ":internet_config_module",
+ ":internet_detail_page_module",
+ ":internet_known_networks_page_module",
+ ":internet_page_module",
+ ":internet_shared_css_module",
+ ":internet_subpage_module",
+ ":modulize",
+ ":network_proxy_section_module",
+ ":network_summary_item_module",
+ ":network_summary_module",
+ ":tether_connection_dialog_module",
+ ]
+}
+
+polymer_modulizer("internet_config") {
+ js_file = "internet_config.js"
+ html_file = "internet_config.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("internet_detail_page") {
+ js_file = "internet_detail_page.js"
+ html_file = "internet_detail_page.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("internet_known_networks_page") {
+ js_file = "internet_known_networks_page.js"
+ html_file = "internet_known_networks_page.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("internet_page") {
+ js_file = "internet_page.js"
+ html_file = "internet_page.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("internet_shared_css") {
+ js_file = "internet_shared_css.m.js"
+ html_file = "internet_shared_css.html"
+ html_type = "style-module"
+}
+
+polymer_modulizer("internet_subpage") {
+ js_file = "internet_subpage.js"
+ html_file = "internet_subpage.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("network_proxy_section") {
+ js_file = "network_proxy_section.js"
+ html_file = "network_proxy_section.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("network_summary") {
+ js_file = "network_summary.js"
+ html_file = "network_summary.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("network_summary_item") {
+ js_file = "network_summary_item.js"
+ html_file = "network_summary_item.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("tether_connection_dialog") {
+ js_file = "tether_connection_dialog.js"
+ html_file = "tether_connection_dialog.html"
+ html_type = "dom-module"
+}
+
+import("//ui/webui/resources/tools/js_modulizer.gni")
+
+js_modulizer("modulize") {
+ input_files = [ "internet_page_browser_proxy.js" ]
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/localized_link/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/localized_link/BUILD.gn
index c480094420a..7bd578dc434 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/localized_link/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/localized_link/BUILD.gn
@@ -11,3 +11,31 @@ js_type_check("closure_compile") {
js_library("localized_link") {
deps = [ "//ui/webui/resources/js:assert" ]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":localized_link.m"
+# ]
+#}
+
+js_library("localized_link.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/localized_link/localized_link.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":localized_link_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [ ":localized_link_module" ]
+}
+
+polymer_modulizer("localized_link") {
+ js_file = "localized_link.js"
+ html_file = "localized_link.html"
+ html_type = "dom-module"
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn
index 9906b2220f9..238c338b802 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn
@@ -67,6 +67,7 @@ js_library("multidevice_page") {
"//ui/webui/resources/js:cr",
"//ui/webui/resources/js:web_ui_listener_behavior",
]
+ externs_list = [ "$externs_path/pending_polymer.js" ]
}
js_library("multidevice_radio_button") {
@@ -95,7 +96,6 @@ js_library("multidevice_subpage") {
":multidevice_constants",
"..:os_route",
"..:os_settings_routes",
- "../..:settings_routes",
"//ui/webui/resources/cr_components/chromeos/network:network_listener_behavior",
]
externs_list = [ "$externs_path/networking_private.js" ]
@@ -113,3 +113,173 @@ js_library("multidevice_tether_item") {
externs_list = [ "$externs_path/networking_private.js" ]
extra_sources = [ "$interfaces_path/networking_private_interface.js" ]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":multidevice_browser_proxy.m",
+# ":multidevice_constants.m",
+# ":multidevice_feature_behavior.m",
+# ":multidevice_feature_item.m",
+# ":multidevice_feature_toggle.m",
+# ":multidevice_page.m",
+# ":multidevice_radio_button.m",
+# ":multidevice_smartlock_subpage.m",
+# ":multidevice_subpage.m",
+# ":multidevice_tether_item.m"
+# ]
+#}
+
+js_library("multidevice_browser_proxy.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_browser_proxy.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("multidevice_constants.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_constants.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":multidevice_constants_module" ]
+}
+
+js_library("multidevice_feature_behavior.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_behavior.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("multidevice_feature_item.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_item.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":multidevice_feature_item_module" ]
+}
+
+js_library("multidevice_feature_toggle.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_toggle.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":multidevice_feature_toggle_module" ]
+}
+
+js_library("multidevice_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":multidevice_page_module" ]
+}
+
+js_library("multidevice_radio_button.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_radio_button.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":multidevice_radio_button_module" ]
+}
+
+js_library("multidevice_smartlock_subpage.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_subpage.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":multidevice_smartlock_subpage_module" ]
+}
+
+js_library("multidevice_subpage.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_subpage.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":multidevice_subpage_module" ]
+}
+
+js_library("multidevice_tether_item.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_tether_item.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":multidevice_tether_item_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [
+ ":modulize",
+ ":multidevice_constants_module",
+ ":multidevice_feature_item_module",
+ ":multidevice_feature_toggle_module",
+ ":multidevice_page_module",
+ ":multidevice_radio_button_module",
+ ":multidevice_smartlock_subpage_module",
+ ":multidevice_subpage_module",
+ ":multidevice_tether_item_module",
+ ]
+}
+
+polymer_modulizer("multidevice_constants") {
+ js_file = "multidevice_constants.js"
+ html_file = "multidevice_constants.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("multidevice_feature_item") {
+ js_file = "multidevice_feature_item.js"
+ html_file = "multidevice_feature_item.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("multidevice_feature_toggle") {
+ js_file = "multidevice_feature_toggle.js"
+ html_file = "multidevice_feature_toggle.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("multidevice_page") {
+ js_file = "multidevice_page.js"
+ html_file = "multidevice_page.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("multidevice_radio_button") {
+ js_file = "multidevice_radio_button.js"
+ html_file = "multidevice_radio_button.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("multidevice_smartlock_subpage") {
+ js_file = "multidevice_smartlock_subpage.js"
+ html_file = "multidevice_smartlock_subpage.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("multidevice_subpage") {
+ js_file = "multidevice_subpage.js"
+ html_file = "multidevice_subpage.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("multidevice_tether_item") {
+ js_file = "multidevice_tether_item.js"
+ html_file = "multidevice_tether_item.html"
+ html_type = "dom-module"
+}
+
+import("//ui/webui/resources/tools/js_modulizer.gni")
+
+js_modulizer("modulize") {
+ input_files = [
+ "multidevice_browser_proxy.js",
+ "multidevice_feature_behavior.js",
+ ]
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn
index c34b0f10c6e..e9d2407632d 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn
@@ -64,3 +64,97 @@ js_library("tts_subpage") {
js_library("externs") {
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":externs.m",
+# ":manage_a11y_page.m",
+# ":os_a11y_page.m",
+# ":switch_access_subpage.m",
+# ":tts_subpage.m"
+# ]
+#}
+
+js_library("externs.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_a11y_page/externs.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("manage_a11y_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":manage_a11y_page_module" ]
+}
+
+js_library("os_a11y_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_a11y_page_module" ]
+}
+
+js_library("switch_access_subpage.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":switch_access_subpage_module" ]
+}
+
+js_library("tts_subpage.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_a11y_page/tts_subpage.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":tts_subpage_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [
+ ":manage_a11y_page_module",
+ ":modulize",
+ ":os_a11y_page_module",
+ ":switch_access_subpage_module",
+ ":tts_subpage_module",
+ ]
+}
+
+polymer_modulizer("manage_a11y_page") {
+ js_file = "manage_a11y_page.js"
+ html_file = "manage_a11y_page.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("os_a11y_page") {
+ js_file = "os_a11y_page.js"
+ html_file = "os_a11y_page.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("switch_access_subpage") {
+ js_file = "switch_access_subpage.js"
+ html_file = "switch_access_subpage.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("tts_subpage") {
+ js_file = "tts_subpage.js"
+ html_file = "tts_subpage.html"
+ html_type = "dom-module"
+}
+
+import("//ui/webui/resources/tools/js_modulizer.gni")
+
+js_modulizer("modulize") {
+ input_files = [ "externs.js" ]
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_about_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_about_page/BUILD.gn
index c49063b1f47..e34ecfe812a 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_about_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_about_page/BUILD.gn
@@ -46,3 +46,81 @@ js_library("channel_switcher_dialog") {
"//ui/webui/resources/js:load_time_data",
]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":channel_switcher_dialog.m",
+# ":detailed_build_info.m",
+# ":os_about_page.m",
+# ":update_warning_dialog.m"
+# ]
+#}
+
+js_library("channel_switcher_dialog.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_about_page/channel_switcher_dialog.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":channel_switcher_dialog_module" ]
+}
+
+js_library("detailed_build_info.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_about_page/detailed_build_info.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":detailed_build_info_module" ]
+}
+
+js_library("os_about_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_about_page_module" ]
+}
+
+js_library("update_warning_dialog.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_about_page/update_warning_dialog.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":update_warning_dialog_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [
+ ":channel_switcher_dialog_module",
+ ":detailed_build_info_module",
+ ":os_about_page_module",
+ ":update_warning_dialog_module",
+ ]
+}
+
+polymer_modulizer("channel_switcher_dialog") {
+ js_file = "channel_switcher_dialog.js"
+ html_file = "channel_switcher_dialog.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("detailed_build_info") {
+ js_file = "detailed_build_info.js"
+ html_file = "detailed_build_info.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("os_about_page") {
+ js_file = "os_about_page.js"
+ html_file = "os_about_page.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("update_warning_dialog") {
+ js_file = "update_warning_dialog.js"
+ html_file = "update_warning_dialog.html"
+ html_type = "dom-module"
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_apps_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_apps_page/BUILD.gn
index 0a79aec884e..f635bdada2b 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_apps_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_apps_page/BUILD.gn
@@ -44,3 +44,65 @@ js_library("os_apps_page") {
externs_list = [ "$externs_path/metrics_private.js" ]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":android_apps_browser_proxy.m",
+# ":android_apps_subpage.m",
+# ":os_apps_page.m"
+# ]
+#}
+
+js_library("android_apps_browser_proxy.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_apps_page/android_apps_browser_proxy.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("android_apps_subpage.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_apps_page/android_apps_subpage.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":android_apps_subpage_module" ]
+}
+
+js_library("os_apps_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_apps_page_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [
+ ":android_apps_subpage_module",
+ ":modulize",
+ ":os_apps_page_module",
+ ]
+}
+
+polymer_modulizer("android_apps_subpage") {
+ js_file = "android_apps_subpage.js"
+ html_file = "android_apps_subpage.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("os_apps_page") {
+ js_file = "os_apps_page.js"
+ html_file = "os_apps_page.html"
+ html_type = "dom-module"
+}
+
+import("//ui/webui/resources/tools/js_modulizer.gni")
+
+js_modulizer("modulize") {
+ input_files = [ "android_apps_browser_proxy.js" ]
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/BUILD.gn
index 8c4309e620a..7de06d704df 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/BUILD.gn
@@ -67,10 +67,8 @@ js_library("app_management_page") {
js_library("app_detail_view") {
deps = [
- ":arc_detail_view",
- ":chrome_app_detail_view",
+ ":actions",
":dom_switch",
- ":pwa_detail_view",
":store_client",
"../..:os_route",
"../../..:router",
@@ -104,6 +102,7 @@ js_library("chrome_app_detail_view") {
}
js_library("constants") {
+ deps = [ "//chrome/browser/ui/webui/app_management:mojo_bindings_js_library_for_compile" ]
}
js_library("dom_switch") {
@@ -131,6 +130,7 @@ js_library("main_view") {
js_library("permission_item") {
deps = [
+ ":browser_proxy",
":fake_page_handler",
":store_client",
":toggle_row",
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/BUILD.gn
new file mode 100644
index 00000000000..3c63e8b8004
--- /dev/null
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/BUILD.gn
@@ -0,0 +1,94 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//third_party/closure_compiler/compile_js.gni")
+
+js_type_check("closure_compile") {
+ deps = [
+ ":plugin_vm_browser_proxy",
+ ":plugin_vm_detail_view",
+ ":plugin_vm_shared_paths",
+ ]
+}
+
+js_library("plugin_vm_browser_proxy") {
+ deps = [ "//ui/webui/resources/js:cr" ]
+}
+
+js_library("plugin_vm_detail_view") {
+ deps = [
+ "../:constants",
+ "../:store_client",
+ "../:util",
+ ]
+}
+
+js_library("plugin_vm_shared_paths") {
+ deps = [
+ ":plugin_vm_browser_proxy",
+ "../../..:metrics_recorder",
+ ]
+}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":plugin_vm_browser_proxy.m",
+# ":plugin_vm_detail_view.m",
+# ":plugin_vm_shared_paths.m",
+# ]
+#}
+
+js_library("plugin_vm_browser_proxy.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_browser_proxy.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("plugin_vm_detail_view.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_detail_view.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":plugin_vm_detail_view_module" ]
+}
+
+js_library("plugin_vm_shared_paths.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_shared_paths.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":plugin_vm_shared_paths_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [
+ ":modulize",
+ ":plugin_vm_detail_view_module",
+ ":plugin_vm_shared_paths_module",
+ ]
+}
+
+polymer_modulizer("plugin_vm_detail_view") {
+ js_file = "plugin_vm_detail_view.js"
+ html_file = "plugin_vm_detail_view.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("plugin_vm_shared_paths") {
+ js_file = "plugin_vm_shared_paths.js"
+ html_file = "plugin_vm_shared_paths.html"
+ html_type = "dom-module"
+}
+
+import("//ui/webui/resources/tools/js_modulizer.gni")
+
+js_modulizer("modulize") {
+ input_files = [ "plugin_vm_browser_proxy.js" ]
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_files_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_files_page/BUILD.gn
index f5dbaca98bd..bec2d536c33 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_files_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_files_page/BUILD.gn
@@ -26,3 +26,49 @@ js_library("os_files_page") {
"../..:router",
]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":os_files_page.m",
+# ":smb_shares_page.m"
+# ]
+#}
+
+js_library("os_files_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_files_page/os_files_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_files_page_module" ]
+}
+
+js_library("smb_shares_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_files_page/smb_shares_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":smb_shares_page_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [
+ ":os_files_page_module",
+ ":smb_shares_page_module",
+ ]
+}
+
+polymer_modulizer("os_files_page") {
+ js_file = "os_files_page.js"
+ html_file = "os_files_page.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("smb_shares_page") {
+ js_file = "smb_shares_page.js"
+ html_file = "smb_shares_page.html"
+ html_type = "dom-module"
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn
index 2fc4836f26f..1af53f2340e 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn
@@ -68,3 +68,81 @@ js_library("os_add_languages_dialog") {
"//ui/webui/resources/js:find_shortcut_behavior",
]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":manage_input_methods_page.m",
+# ":os_add_languages_dialog.m",
+# ":os_languages_page.m",
+# ":os_languages_section.m"
+# ]
+#}
+
+js_library("manage_input_methods_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_languages_page/manage_input_methods_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":manage_input_methods_page_module" ]
+}
+
+js_library("os_add_languages_dialog.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_languages_page/os_add_languages_dialog.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_add_languages_dialog_module" ]
+}
+
+js_library("os_languages_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_languages_page_module" ]
+}
+
+js_library("os_languages_section.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_languages_section_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [
+ ":manage_input_methods_page_module",
+ ":os_add_languages_dialog_module",
+ ":os_languages_page_module",
+ ":os_languages_section_module",
+ ]
+}
+
+polymer_modulizer("manage_input_methods_page") {
+ js_file = "manage_input_methods_page.js"
+ html_file = "manage_input_methods_page.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("os_add_languages_dialog") {
+ js_file = "os_add_languages_dialog.js"
+ html_file = "os_add_languages_dialog.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("os_languages_page") {
+ js_file = "os_languages_page.js"
+ html_file = "os_languages_page.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("os_languages_section") {
+ js_file = "os_languages_section.js"
+ html_file = "os_languages_section.html"
+ html_type = "dom-module"
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn
index 2b0c1a7178d..23cc34fa5db 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn
@@ -171,8 +171,8 @@ js_library("setup_fingerprint_dialog") {
deps = [
":fingerprint_browser_proxy",
"..:metrics_recorder",
- "//ui/webui/resources/cr_elements/chromeos/cr_lottie:cr_lottie",
"//ui/webui/resources/cr_elements/cr_fingerprint:cr_fingerprint_progress_arc",
+ "//ui/webui/resources/cr_elements/cr_lottie:cr_lottie",
"//ui/webui/resources/js:i18n_behavior",
"//ui/webui/resources/js:web_ui_listener_behavior",
]
@@ -213,3 +213,273 @@ js_library("users_page") {
"//ui/webui/resources/js/cr/ui:focus_without_ink",
]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":account_manager.m",
+# ":fingerprint_browser_proxy.m",
+# ":fingerprint_list.m",
+# ":kerberos_accounts.m",
+# ":kerberos_accounts_browser_proxy.m",
+# ":kerberos_add_account_dialog.m",
+# ":lock_screen.m",
+# ":lock_screen_password_prompt_dialog.m",
+# ":lock_state_behavior.m",
+# ":os_people_page.m",
+# ":os_sync_browser_proxy.m",
+# ":os_sync_controls.m",
+# ":setup_fingerprint_dialog.m",
+# ":setup_pin_dialog.m",
+# ":user_list.m",
+# ":users_add_user_dialog.m",
+# ":users_page.m"
+# ]
+#}
+
+js_library("account_manager.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":account_manager_module" ]
+}
+
+js_library("fingerprint_browser_proxy.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_people_page/fingerprint_browser_proxy.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("fingerprint_list.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_people_page/fingerprint_list.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":fingerprint_list_module" ]
+}
+
+js_library("kerberos_accounts.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_people_page/kerberos_accounts.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":kerberos_accounts_module" ]
+}
+
+js_library("kerberos_accounts_browser_proxy.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_people_page/kerberos_accounts_browser_proxy.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("kerberos_add_account_dialog.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_people_page/kerberos_add_account_dialog.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":kerberos_add_account_dialog_module" ]
+}
+
+js_library("lock_screen.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":lock_screen_module" ]
+}
+
+js_library("lock_screen_password_prompt_dialog.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen_password_prompt_dialog.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":lock_screen_password_prompt_dialog_module" ]
+}
+
+js_library("lock_state_behavior.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_people_page/lock_state_behavior.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("os_people_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_people_page_module" ]
+}
+
+js_library("os_sync_browser_proxy.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_browser_proxy.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("os_sync_controls.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_sync_controls_module" ]
+}
+
+js_library("setup_fingerprint_dialog.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_people_page/setup_fingerprint_dialog.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":setup_fingerprint_dialog_module" ]
+}
+
+js_library("setup_pin_dialog.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_people_page/setup_pin_dialog.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":setup_pin_dialog_module" ]
+}
+
+js_library("user_list.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_people_page/user_list.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":user_list_module" ]
+}
+
+js_library("users_add_user_dialog.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_people_page/users_add_user_dialog.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":users_add_user_dialog_module" ]
+}
+
+js_library("users_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_people_page/users_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":users_page_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [
+ ":account_manager_module",
+ ":fingerprint_list_module",
+ ":kerberos_accounts_module",
+ ":kerberos_add_account_dialog_module",
+ ":lock_screen_module",
+ ":lock_screen_password_prompt_dialog_module",
+ ":modulize",
+ ":os_people_page_module",
+ ":os_sync_controls_module",
+ ":setup_fingerprint_dialog_module",
+ ":setup_pin_dialog_module",
+ ":user_list_module",
+ ":users_add_user_dialog_module",
+ ":users_page_module",
+ ]
+}
+
+polymer_modulizer("account_manager") {
+ js_file = "account_manager.js"
+ html_file = "account_manager.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("fingerprint_list") {
+ js_file = "fingerprint_list.js"
+ html_file = "fingerprint_list.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("kerberos_accounts") {
+ js_file = "kerberos_accounts.js"
+ html_file = "kerberos_accounts.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("kerberos_add_account_dialog") {
+ js_file = "kerberos_add_account_dialog.js"
+ html_file = "kerberos_add_account_dialog.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("lock_screen") {
+ js_file = "lock_screen.js"
+ html_file = "lock_screen.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("lock_screen_password_prompt_dialog") {
+ js_file = "lock_screen_password_prompt_dialog.js"
+ html_file = "lock_screen_password_prompt_dialog.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("os_people_page") {
+ js_file = "os_people_page.js"
+ html_file = "os_people_page.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("os_sync_controls") {
+ js_file = "os_sync_controls.js"
+ html_file = "os_sync_controls.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("setup_fingerprint_dialog") {
+ js_file = "setup_fingerprint_dialog.js"
+ html_file = "setup_fingerprint_dialog.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("setup_pin_dialog") {
+ js_file = "setup_pin_dialog.js"
+ html_file = "setup_pin_dialog.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("user_list") {
+ js_file = "user_list.js"
+ html_file = "user_list.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("users_add_user_dialog") {
+ js_file = "users_add_user_dialog.js"
+ html_file = "users_add_user_dialog.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("users_page") {
+ js_file = "users_page.js"
+ html_file = "users_page.html"
+ html_type = "dom-module"
+}
+
+import("//ui/webui/resources/tools/js_modulizer.gni")
+
+js_modulizer("modulize") {
+ input_files = [
+ "fingerprint_browser_proxy.js",
+ "kerberos_accounts_browser_proxy.js",
+ "lock_state_behavior.js",
+ "os_sync_browser_proxy.js",
+ ]
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_printing_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_printing_page/BUILD.gn
index 04f4ad8d05e..5a9af5bd713 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_printing_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_printing_page/BUILD.gn
@@ -6,17 +6,43 @@ import("//third_party/closure_compiler/compile_js.gni")
js_type_check("closure_compile") {
deps = [
+ ":cups_add_print_server_dialog",
":cups_add_printer_dialog",
- ":cups_add_printer_dialog_elements",
+ ":cups_add_printer_manually_dialog",
+ ":cups_add_printer_manufacturer_model_dialog",
":cups_edit_printer_dialog",
+ ":cups_printer_dialog_error",
":cups_printer_dialog_util",
":cups_printers",
":cups_printers_browser_proxy",
+ ":cups_settings_add_printer_dialog",
":os_printing_page",
]
}
-js_library("cups_add_printer_dialog") {
+js_library("cups_settings_add_printer_dialog") {
+ deps = [
+ ":cups_add_print_server_dialog",
+ ":cups_add_printer_dialog",
+ ":cups_add_printer_manually_dialog",
+ ":cups_add_printer_manufacturer_model_dialog",
+ ":cups_printers_browser_proxy",
+ "../localized_link:localized_link",
+ "//ui/webui/resources/js:load_time_data",
+ "//ui/webui/resources/js:web_ui_listener_behavior",
+ ]
+}
+
+js_library("cups_add_print_server_dialog") {
+ deps = [
+ ":cups_printers_browser_proxy",
+ "../localized_link:localized_link",
+ "//ui/webui/resources/js:load_time_data",
+ "//ui/webui/resources/js:web_ui_listener_behavior",
+ ]
+}
+
+js_library("cups_add_printer_manufacturer_model_dialog") {
deps = [
":cups_printers_browser_proxy",
"../localized_link:localized_link",
@@ -25,7 +51,20 @@ js_library("cups_add_printer_dialog") {
]
}
-js_library("cups_add_printer_dialog_elements") {
+js_library("cups_add_printer_manually_dialog") {
+ deps = [
+ ":cups_printers_browser_proxy",
+ "../localized_link:localized_link",
+ "//ui/webui/resources/js:load_time_data",
+ "//ui/webui/resources/js:web_ui_listener_behavior",
+ ]
+}
+
+js_library("cups_add_printer_dialog") {
+ deps = [ ":cups_printers_browser_proxy" ]
+}
+
+js_library("cups_printer_dialog_error") {
deps = [ ":cups_printers_browser_proxy" ]
}
@@ -130,3 +169,301 @@ js_library("os_printing_page") {
"//ui/webui/resources/js:load_time_data",
]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":cups_settings_add_printer_dialog.m",
+# ":cups_add_print_server_dialog.m",
+# ":cups_add_printer_manually_dialog.m",
+# ":cups_add_printer_dialog.m",
+# ":cups_add_printer_manufacturer_model_dialog",
+# ":cups_printer_dialog_error.m"
+# ":cups_edit_printer_dialog.m",
+# ":cups_nearby_printers.m",
+# ":cups_printer_dialog_util.m",
+# ":cups_printer_shared_css.m",
+# ":cups_printer_types.m",
+# ":cups_printers.m",
+# ":cups_printers_browser_proxy.m",
+# ":cups_printers_entry.m",
+# ":cups_printers_entry_list_behavior.m",
+# ":cups_printers_entry_manager.m",
+# ":cups_saved_printers.m",
+# ":os_printing_page.m"
+# ]
+#}
+
+js_library("cups_settings_add_printer_dialog.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_printing_page/cups_settings_add_printer_dialog.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":cups_settings_add_printer_dialog_module" ]
+}
+
+js_library("cups_add_print_server_dialog.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_printing_page/cups_add_print_server_dialog.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":cups_add_print_server_dialog_module" ]
+}
+
+js_library("cups_add_printer_manufacturer_model_dialog.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_printing_page/cups_add_printer_manufacturer_model_dialog.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":cups_add_printer_manufacturer_model_dialog_module" ]
+}
+
+js_library("cups_add_printer_manually_dialog.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_printing_page/cups_add_printer_manually_dialog.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":cups_add_printer_manually_dialog_module" ]
+}
+
+js_library("cups_add_printer_dialog.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_printing_page/cups_add_printer_dialog.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":cups_add_printer_dialog_module" ]
+}
+
+js_library("cups_printer_dialog_error.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printer_dialog_error.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":cups_printer_dialog_error_module" ]
+}
+
+js_library("cups_edit_printer_dialog.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":cups_edit_printer_dialog_module" ]
+}
+
+js_library("cups_nearby_printers.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_printing_page/cups_nearby_printers.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":cups_nearby_printers_module" ]
+}
+
+js_library("cups_printer_dialog_util.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printer_dialog_util.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":cups_printer_dialog_util_module" ]
+}
+
+js_library("cups_printer_shared_css.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printer_shared_css.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":cups_printer_shared_css_module" ]
+}
+
+js_library("cups_printer_types.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printer_types.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":cups_printer_types_module" ]
+}
+
+js_library("cups_printers.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":cups_printers_module" ]
+}
+
+js_library("cups_printers_browser_proxy.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_browser_proxy.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("cups_printers_entry.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_entry.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":cups_printers_entry_module" ]
+}
+
+js_library("cups_printers_entry_list_behavior.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_entry_list_behavior.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("cups_printers_entry_manager.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_entry_manager.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":cups_printers_entry_manager_module" ]
+}
+
+js_library("cups_saved_printers.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_printing_page/cups_saved_printers.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":cups_saved_printers_module" ]
+}
+
+js_library("os_printing_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_printing_page/os_printing_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_printing_page_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [
+ ":cups_add_print_server_dialog",
+ ":cups_add_printer_dialog",
+ ":cups_add_printer_dialog_module",
+ ":cups_add_printer_manually_dialog",
+ ":cups_add_printer_manufacturer_model_dialog",
+ ":cups_edit_printer_dialog_module",
+ ":cups_nearby_printers_module",
+ ":cups_printer_dialog_error_module",
+ ":cups_printer_dialog_util_module",
+ ":cups_printer_shared_css_module",
+ ":cups_printer_types_module",
+ ":cups_printers_entry_manager_module",
+ ":cups_printers_entry_module",
+ ":cups_printers_module",
+ ":cups_saved_printers_module",
+ ":modulize",
+ ":os_printing_page_module",
+ ]
+}
+
+polymer_modulizer("cups_settings_add_printer_dialog") {
+ js_file = "cups_settings_add_printer_dialog.js"
+ html_file = "cups_settings_add_printer_dialog.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("cups_add_print_server_dialog") {
+ js_file = "cups_add_print_server_dialog.js"
+ html_file = "cups_add_print_server_dialog.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("cups_add_printer_manufacturer_model_dialog") {
+ js_file = "cups_add_printer_manufacturer_model_dialog.js"
+ html_file = "cups_add_printer_manufacturer_model_dialog.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("cups_add_printer_manually_dialog") {
+ js_file = "cups_add_printer_manually_dialog.js"
+ html_file = "cups_add_printer_manually_dialog.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("cups_add_printer_dialog") {
+ js_file = "cups_add_printer_dialog.js"
+ html_file = "cups_add_printer_dialog.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("cups_printer_dialog_error") {
+ js_file = "cups_printer_dialog_error.js"
+ html_file = "cups_printer_dialog_error.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("cups_edit_printer_dialog") {
+ js_file = "cups_edit_printer_dialog.js"
+ html_file = "cups_edit_printer_dialog.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("cups_nearby_printers") {
+ js_file = "cups_nearby_printers.js"
+ html_file = "cups_nearby_printers.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("cups_printer_dialog_util") {
+ js_file = "cups_printer_dialog_util.js"
+ html_file = "cups_printer_dialog_util.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("cups_printer_shared_css") {
+ js_file = "cups_printer_shared_css.m.js"
+ html_file = "cups_printer_shared_css.html"
+ html_type = "style-module"
+}
+
+polymer_modulizer("cups_printer_types") {
+ js_file = "cups_printer_types.js"
+ html_file = "cups_printer_types.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("cups_printers") {
+ js_file = "cups_printers.js"
+ html_file = "cups_printers.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("cups_printers_entry") {
+ js_file = "cups_printers_entry.js"
+ html_file = "cups_printers_entry.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("cups_printers_entry_manager") {
+ js_file = "cups_printers_entry_manager.js"
+ html_file = "cups_printers_entry_manager.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("cups_saved_printers") {
+ js_file = "cups_saved_printers.js"
+ html_file = "cups_saved_printers.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("os_printing_page") {
+ js_file = "os_printing_page.js"
+ html_file = "os_printing_page.html"
+ html_type = "dom-module"
+}
+
+import("//ui/webui/resources/tools/js_modulizer.gni")
+
+js_modulizer("modulize") {
+ input_files = [
+ "cups_printers_browser_proxy.js",
+ "cups_printers_entry_list_behavior.js",
+ ]
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_privacy_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_privacy_page/BUILD.gn
index 84cb81f6e22..f89ff3750c3 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_privacy_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_privacy_page/BUILD.gn
@@ -12,3 +12,31 @@ js_library("os_privacy_page") {
deps =
[ "//chrome/browser/resources/settings/controls:settings_toggle_button" ]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":os_privacy_page.m"
+# ]
+#}
+
+js_library("os_privacy_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_privacy_page/os_privacy_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_privacy_page_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [ ":os_privacy_page_module" ]
+}
+
+polymer_modulizer("os_privacy_page") {
+ js_file = "os_privacy_page.js"
+ html_file = "os_privacy_page.html"
+ html_type = "dom-module"
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_reset_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_reset_page/BUILD.gn
index b9af9f2bccf..cf97405216f 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_reset_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_reset_page/BUILD.gn
@@ -33,3 +33,65 @@ js_library("os_reset_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr" ]
externs_list = [ "$externs_path/chrome_send.js" ]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":os_powerwash_dialog.m",
+# ":os_reset_browser_proxy.m",
+# ":os_reset_page.m"
+# ]
+#}
+
+js_library("os_powerwash_dialog.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_powerwash_dialog_module" ]
+}
+
+js_library("os_reset_browser_proxy.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_reset_page/os_reset_browser_proxy.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("os_reset_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_reset_page/os_reset_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_reset_page_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [
+ ":modulize",
+ ":os_powerwash_dialog_module",
+ ":os_reset_page_module",
+ ]
+}
+
+polymer_modulizer("os_powerwash_dialog") {
+ js_file = "os_powerwash_dialog.js"
+ html_file = "os_powerwash_dialog.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("os_reset_page") {
+ js_file = "os_reset_page.js"
+ html_file = "os_reset_page.html"
+ html_type = "dom-module"
+}
+
+import("//ui/webui/resources/tools/js_modulizer.gni")
+
+js_modulizer("modulize") {
+ input_files = [ "os_reset_browser_proxy.js" ]
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_search_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_search_page/BUILD.gn
index 03206cb5851..c48a50c3619 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_search_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_search_page/BUILD.gn
@@ -19,3 +19,31 @@ js_library("os_search_page") {
"//ui/webui/resources/js:i18n_behavior",
]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":os_search_page.m"
+# ]
+#}
+
+js_library("os_search_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_search_page/os_search_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_search_page_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [ ":os_search_page_module" ]
+}
+
+polymer_modulizer("os_search_page") {
+ js_file = "os_search_page.js"
+ html_file = "os_search_page.html"
+ html_type = "dom-module"
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_settings_main/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_settings_main/BUILD.gn
index de7de58cf2a..8d7c32450f0 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_settings_main/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_settings_main/BUILD.gn
@@ -20,3 +20,34 @@ js_library("os_settings_main") {
"//ui/webui/resources/js:load_time_data",
]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":os_settings_main.m"
+# ]
+#}
+
+js_library("os_settings_main.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_settings_main_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [
+ # TODO: Fix and re-enable
+ #":os_settings_main_module"
+ ]
+}
+
+polymer_modulizer("os_settings_main") {
+ js_file = "os_settings_main.js"
+ html_file = "os_settings_main.html"
+ html_type = "dom-module"
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_settings_menu/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_settings_menu/BUILD.gn
index f440c89ec61..1521e8cee6d 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_settings_menu/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_settings_menu/BUILD.gn
@@ -16,3 +16,31 @@ js_library("os_settings_menu") {
"//ui/webui/resources/js:load_time_data",
]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":os_settings_menu.m"
+# ]
+#}
+
+js_library("os_settings_menu.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_settings_menu_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [ ":os_settings_menu_module" ]
+}
+
+polymer_modulizer("os_settings_menu") {
+ js_file = "os_settings_menu.js"
+ html_file = "os_settings_menu.html"
+ html_type = "dom-module"
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_settings_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_settings_page/BUILD.gn
index 3588ee98f95..f9e55626477 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_settings_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_settings_page/BUILD.gn
@@ -22,3 +22,31 @@ js_library("os_settings_page") {
]
externs_list = [ "$externs_path/pending.js" ]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":os_settings_page.m"
+# ]
+#}
+
+js_library("os_settings_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_settings_page_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [ ":os_settings_page_module" ]
+}
+
+polymer_modulizer("os_settings_page") {
+ js_file = "os_settings_page.js"
+ html_file = "os_settings_page.html"
+ html_type = "dom-module"
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_settings_resources_v3.grdp b/chromium/chrome/browser/resources/settings/chromeos/os_settings_resources_v3.grdp
new file mode 100644
index 00000000000..db555e9d3a1
--- /dev/null
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_settings_resources_v3.grdp
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <include name="IDR_OS_SETTINGS_SEARCH_HANDLER_M_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/chromeos/search_handler.m.js"
+ use_base_dir="false"
+ type="BINDATA" />
+ <include name="IDR_OS_SETTINGS_SETTINGS_V3_HTML"
+ file="chromeos/os_settings_v3.html"
+ type="BINDATA" />
+ <include name="IDR_OS_SETTINGS_SETTINGS_V3_JS"
+ file="chromeos/os_settings.js"
+ type="BINDATA" />
+</grit-part> \ No newline at end of file
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_settings_search_box/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_settings_search_box/BUILD.gn
index 91cddc459c6..a206a3b623f 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_settings_search_box/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_settings_search_box/BUILD.gn
@@ -15,7 +15,8 @@ js_library("os_settings_search_box") {
deps = [
":os_search_result_row",
"..:metrics_recorder",
- "//chrome/browser/ui/webui/settings/chromeos/search:mojo_bindings_js_library_for_compile",
+ "..:search_handler",
+ "//third_party/polymer/v1_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer-extracted",
"//third_party/polymer/v1_0/components-chromium/iron-dropdown:iron-dropdown-extracted",
"//third_party/polymer/v1_0/components-chromium/iron-list:iron-list-extracted",
"//ui/webui/resources/cr_elements/cr_toolbar:cr_toolbar_search_field",
@@ -26,7 +27,57 @@ js_library("os_settings_search_box") {
js_library("os_search_result_row") {
deps = [
"..:os_route",
+ "..:search_handler",
"../..:router",
+ "//third_party/polymer/v1_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer-extracted",
+ "//ui/webui/resources/js:assert",
+ "//ui/webui/resources/js:i18n_behavior",
"//ui/webui/resources/js/cr/ui:focus_row_behavior",
]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":os_search_result_row.m",
+# ":os_settings_search_box.m"
+# ]
+#}
+
+js_library("os_search_result_row.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_search_result_row.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_search_result_row_module" ]
+}
+
+js_library("os_settings_search_box.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_settings_search_box.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_settings_search_box_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [
+ ":os_search_result_row_module",
+ ":os_settings_search_box_module",
+ ]
+}
+
+polymer_modulizer("os_search_result_row") {
+ js_file = "os_search_result_row.js"
+ html_file = "os_search_result_row.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("os_settings_search_box") {
+ js_file = "os_settings_search_box.js"
+ html_file = "os_settings_search_box.html"
+ html_type = "dom-module"
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_settings_ui/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_settings_ui/BUILD.gn
index ffdf1bb4d37..3a4197151b3 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_settings_ui/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_settings_ui/BUILD.gn
@@ -25,3 +25,34 @@ js_library("os_settings_ui") {
"//ui/webui/resources/js:find_shortcut_behavior",
]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":os_settings_ui.m"
+# ]
+#}
+
+js_library("os_settings_ui.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_settings_ui_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [
+ # TODO: Fix and re-enable
+ ":os_settings_ui_module",
+ ]
+}
+
+polymer_modulizer("os_settings_ui") {
+ js_file = "os_settings_ui.js"
+ html_file = "os_settings_ui.html"
+ html_type = "dom-module"
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/os_toolbar/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/os_toolbar/BUILD.gn
index eb6484e5902..c167fd3d098 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/os_toolbar/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/os_toolbar/BUILD.gn
@@ -14,3 +14,31 @@ js_library("os_toolbar") {
"//ui/webui/resources/cr_elements/cr_toolbar:cr_toolbar_search_field",
]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":os_toolbar.m"
+# ]
+#}
+
+js_library("os_toolbar.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_toolbar/os_toolbar.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":os_toolbar_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [ ":os_toolbar_module" ]
+}
+
+polymer_modulizer("os_toolbar") {
+ js_file = "os_toolbar.js"
+ html_file = "os_toolbar.html"
+ html_type = "dom-module"
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/parental_controls_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/parental_controls_page/BUILD.gn
index 1f0323fbd66..9c9e665523a 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/parental_controls_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/parental_controls_page/BUILD.gn
@@ -21,3 +21,49 @@ js_library("parental_controls_page") {
"//ui/webui/resources/js:web_ui_listener_behavior",
]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":parental_controls_browser_proxy.m",
+# ":parental_controls_page.m"
+# ]
+#}
+
+js_library("parental_controls_browser_proxy.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/parental_controls_page/parental_controls_browser_proxy.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("parental_controls_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/parental_controls_page/parental_controls_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":parental_controls_page_module" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [
+ ":modulize",
+ ":parental_controls_page_module",
+ ]
+}
+
+polymer_modulizer("parental_controls_page") {
+ js_file = "parental_controls_page.js"
+ html_file = "parental_controls_page.html"
+ html_type = "dom-module"
+}
+
+import("//ui/webui/resources/tools/js_modulizer.gni")
+
+js_modulizer("modulize") {
+ input_files = [ "parental_controls_browser_proxy.js" ]
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/personalization_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/personalization_page/BUILD.gn
index 5b6f3667c12..766826b0561 100644
--- a/chromium/chrome/browser/resources/settings/chromeos/personalization_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/chromeos/personalization_page/BUILD.gn
@@ -49,3 +49,77 @@ js_library("wallpaper_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr" ]
externs_list = [ "$externs_path/chrome_send.js" ]
}
+
+# TODO: Uncomment as the Polymer3 migration makes progress.
+#js_type_check("closure_compile_module") {
+# is_polymer3 = true
+# deps = [
+# ":change_picture.m",
+# ":change_picture_browser_proxy.m",
+# ":personalization_page.m",
+# ":wallpaper_browser_proxy.m"
+# ]
+#}
+
+js_library("change_picture.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/personalization_page/change_picture.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":change_picture_module" ]
+}
+
+js_library("change_picture_browser_proxy.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/personalization_page/change_picture_browser_proxy.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("personalization_page.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":personalization_page_module" ]
+}
+
+js_library("wallpaper_browser_proxy.m") {
+ sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/personalization_page/wallpaper_browser_proxy.m.js" ]
+ deps = [
+ # TODO: Fill those in.
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+import("//tools/polymer/polymer.gni")
+
+group("polymer3_elements") {
+ public_deps = [
+ ":change_picture_module",
+ ":modulize",
+ ":personalization_page_module",
+ ]
+}
+
+polymer_modulizer("change_picture") {
+ js_file = "change_picture.js"
+ html_file = "change_picture.html"
+ html_type = "dom-module"
+}
+
+polymer_modulizer("personalization_page") {
+ js_file = "personalization_page.js"
+ html_file = "personalization_page.html"
+ html_type = "dom-module"
+}
+
+import("//ui/webui/resources/tools/js_modulizer.gni")
+
+js_modulizer("modulize") {
+ input_files = [
+ "change_picture_browser_proxy.js",
+ "wallpaper_browser_proxy.js",
+ ]
+}
diff --git a/chromium/chrome/browser/resources/settings/chromeos/plugin_vm_page/BUILD.gn b/chromium/chrome/browser/resources/settings/chromeos/plugin_vm_page/BUILD.gn
deleted file mode 100644
index aab887277ef..00000000000
--- a/chromium/chrome/browser/resources/settings/chromeos/plugin_vm_page/BUILD.gn
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright 2019 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/closure_compiler/compile_js.gni")
-
-js_type_check("closure_compile") {
- deps = [
- ":plugin_vm_browser_proxy",
- ":plugin_vm_page",
- ":plugin_vm_remove_confirmation_dialog",
- ":plugin_vm_shared_paths",
- ":plugin_vm_subpage",
- "..:metrics_recorder",
- ]
-}
-
-js_library("plugin_vm_browser_proxy") {
- deps = [ "//ui/webui/resources/js:cr" ]
-}
-
-js_library("plugin_vm_page") {
- deps = [
- "..:os_route",
- "../..:router",
- "../../prefs:prefs_behavior",
- "//ui/webui/resources/js:i18n_behavior",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
-js_library("plugin_vm_shared_paths") {
- deps = [
- ":plugin_vm_browser_proxy",
- "../..:router",
- ]
-}
-
-js_library("plugin_vm_subpage") {
- deps = [
- "..:os_route",
- "../..:router",
- "../../prefs:prefs_behavior",
- ]
-}
-
-js_library("plugin_vm_remove_confirmation_dialog") {
- deps = [ ":plugin_vm_browser_proxy" ]
-}
diff --git a/chromium/chrome/browser/resources/settings/clear_browsing_data_dialog/BUILD.gn b/chromium/chrome/browser/resources/settings/clear_browsing_data_dialog/BUILD.gn
index c296d8d5edd..c39c2fc34fd 100644
--- a/chromium/chrome/browser/resources/settings/clear_browsing_data_dialog/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/clear_browsing_data_dialog/BUILD.gn
@@ -3,135 +3,55 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
-import("//ui/webui/resources/tools/js_modulizer.gni")
+import("//tools/polymer/html_to_js.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [
":clear_browsing_data_browser_proxy",
":clear_browsing_data_dialog",
+ ":history_deletion_dialog",
":installed_app_checkbox",
]
}
js_library("clear_browsing_data_browser_proxy") {
- deps = [
- "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog",
- "//ui/webui/resources/js:cr",
- ]
+ deps = [ "//ui/webui/resources/js:cr.m" ]
}
js_library("clear_browsing_data_dialog") {
deps = [
":clear_browsing_data_browser_proxy",
"..:route",
- "..:router",
- "../controls:settings_checkbox",
- "../controls:settings_dropdown_menu",
- "../people_page:sync_browser_proxy",
- "//third_party/polymer/v1_0/components-chromium/iron-pages:iron-pages-extracted",
- "//third_party/polymer/v1_0/components-chromium/iron-resizable-behavior:iron-resizable-behavior-extracted",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
-}
-
-js_library("installed_app_checkbox") {
- deps = [
- ":clear_browsing_data_browser_proxy",
- "../controls:settings_boolean_control_behavior",
- ]
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- deps = [
- ":clear_browsing_data_browser_proxy.m",
- ":clear_browsing_data_dialog.m",
- ":history_deletion_dialog.m",
- ":installed_app_checkbox.m",
- ]
-}
-
-js_library("clear_browsing_data_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_browser_proxy.m.js" ]
- deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
-}
-
-js_library("clear_browsing_data_dialog.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.m.js" ]
- deps = [
- ":clear_browsing_data_browser_proxy.m",
- "..:route.m",
"..:router.m",
- "../controls:settings_checkbox.m",
+ "../controls:settings_checkbox",
"../controls:settings_dropdown_menu.m",
"../people_page:sync_browser_proxy.m",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":clear_browsing_data_dialog_module" ]
}
-js_library("history_deletion_dialog.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/clear_browsing_data_dialog/history_deletion_dialog.m.js" ]
+js_library("history_deletion_dialog") {
deps = [
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
]
- extra_deps = [ ":history_deletion_dialog_module" ]
}
-js_library("installed_app_checkbox.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/clear_browsing_data_dialog/installed_app_checkbox.m.js" ]
+js_library("installed_app_checkbox") {
deps = [
- ":clear_browsing_data_browser_proxy.m",
+ ":clear_browsing_data_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
- extra_deps = [ ":installed_app_checkbox_module" ]
}
-group("polymer3_elements") {
- public_deps = [
- ":clear_browsing_data_dialog_module",
- ":history_deletion_dialog_module",
- ":installed_app_checkbox_module",
- ":modulize",
+html_to_js("web_components") {
+ js_files = [
+ "clear_browsing_data_dialog.js",
+ "history_deletion_dialog.js",
+ "installed_app_checkbox.js",
]
}
-
-polymer_modulizer("clear_browsing_data_dialog") {
- js_file = "clear_browsing_data_dialog.js"
- html_file = "clear_browsing_data_dialog.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/router.html|Route, Router, RouteObserverBehavior",
- "chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_browser_proxy.html|ClearBrowsingDataBrowserProxy, ClearBrowsingDataBrowserProxyImpl, InstalledApp",
- "chrome/browser/resources/settings/controls/settings_dropdown_menu.html|DropdownMenuOptionList",
- "chrome/browser/resources/settings/people_page/sync_browser_proxy.html|StatusAction, SyncBrowserProxy, SyncBrowserProxyImpl, SyncStatus",
- "ui/webui/resources/html/assert.html|assert",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("history_deletion_dialog") {
- js_file = "history_deletion_dialog.js"
- html_file = "history_deletion_dialog.html"
- html_type = "dom-module"
-}
-
-polymer_modulizer("installed_app_checkbox") {
- js_file = "installed_app_checkbox.js"
- html_file = "installed_app_checkbox.html"
- html_type = "dom-module"
- auto_imports = [ "chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_browser_proxy.html|InstalledApp" ]
-}
-
-js_modulizer("modulize") {
- input_files = [ "clear_browsing_data_browser_proxy.js" ]
- namespace_rewrites = settings_namespace_rewrites
-}
diff --git a/chromium/chrome/browser/resources/settings/controls/BUILD.gn b/chromium/chrome/browser/resources/settings/controls/BUILD.gn
index d8677c75898..69216da31e1 100644
--- a/chromium/chrome/browser/resources/settings/controls/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/controls/BUILD.gn
@@ -3,6 +3,7 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/polymer/html_to_js.gni")
import("//tools/polymer/polymer.gni")
import("//ui/webui/resources/tools/js_modulizer.gni")
import("../settings.gni")
@@ -15,7 +16,6 @@ js_type_check("closure_compile") {
":password_prompt_dialog",
":pref_control_behavior",
":settings_boolean_control_behavior",
- ":settings_checkbox",
":settings_dropdown_menu",
":settings_idle_load",
":settings_radio_group",
@@ -29,7 +29,6 @@ js_library("controlled_button") {
deps = [
":pref_control_behavior",
"//ui/webui/resources/cr_elements/policy:cr_policy_pref_behavior",
- "//ui/webui/resources/js:assert",
]
}
@@ -75,10 +74,6 @@ js_library("settings_boolean_control_behavior") {
]
}
-js_library("settings_checkbox") {
- deps = [ ":settings_boolean_control_behavior" ]
-}
-
js_library("settings_dropdown_menu") {
deps = [
":pref_control_behavior",
@@ -127,6 +122,7 @@ js_library("settings_toggle_button") {
js_type_check("closure_compile_module") {
is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [
":controlled_button.m",
":controlled_radio_button.m",
@@ -134,7 +130,7 @@ js_type_check("closure_compile_module") {
":password_prompt_dialog.m",
":pref_control_behavior.m",
":settings_boolean_control_behavior.m",
- ":settings_checkbox.m",
+ ":settings_checkbox",
":settings_dropdown_menu.m",
":settings_idle_load.m",
":settings_radio_group.m",
@@ -150,7 +146,6 @@ js_library("controlled_button.m") {
":pref_control_behavior.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/policy:cr_policy_pref_behavior.m",
- "//ui/webui/resources/js:assert.m",
]
extra_deps = [ ":controlled_button_module" ]
}
@@ -209,13 +204,11 @@ js_library("settings_boolean_control_behavior.m") {
extra_deps = [ ":modulize" ]
}
-js_library("settings_checkbox.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/controls/settings_checkbox.m.js" ]
+js_library("settings_checkbox") {
deps = [
":settings_boolean_control_behavior.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
- extra_deps = [ ":settings_checkbox_module" ]
}
js_library("settings_dropdown_menu.m") {
@@ -291,21 +284,26 @@ group("polymer3_elements") {
":extension_controlled_indicator_module",
":modulize",
":password_prompt_dialog_module",
- ":settings_checkbox_module",
":settings_dropdown_menu_module",
":settings_idle_load_module",
":settings_radio_group_module",
":settings_slider_module",
":settings_textarea_module",
":settings_toggle_button_module",
+ ":web_components",
]
}
+html_to_js("web_components") {
+ js_files = [ "settings_checkbox.js" ]
+}
+
polymer_modulizer("controlled_button") {
js_file = "controlled_button.js"
html_file = "controlled_button.html"
html_type = "dom-module"
auto_imports = settings_auto_imports
+ migrated_imports = settings_migrated_imports
}
polymer_modulizer("controlled_radio_button") {
@@ -328,6 +326,7 @@ polymer_modulizer("extension_controlled_indicator") {
"chrome/browser/resources/settings/extension_control_browser_proxy.html|ExtensionControlBrowserProxyImpl",
"ui/webui/resources/html/assert.html|assert",
]
+ migrated_imports = settings_migrated_imports
namespace_rewrites = settings_namespace_rewrites
}
@@ -337,17 +336,11 @@ polymer_modulizer("password_prompt_dialog") {
html_type = "dom-module"
}
-polymer_modulizer("settings_checkbox") {
- js_file = "settings_checkbox.js"
- html_file = "settings_checkbox.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports
-}
-
polymer_modulizer("settings_dropdown_menu") {
js_file = "settings_dropdown_menu.js"
html_file = "settings_dropdown_menu.html"
html_type = "dom-module"
+ migrated_imports = settings_migrated_imports
auto_imports = settings_auto_imports + [
"chrome/browser/resources/settings/prefs/pref_util.html|stringToPrefValue, prefToString",
"ui/webui/resources/html/assert.html|assert",
@@ -359,14 +352,14 @@ polymer_modulizer("settings_idle_load") {
js_file = "settings_idle_load.js"
html_file = "settings_idle_load.html"
html_type = "dom-module"
+ migrated_imports = settings_migrated_imports
auto_imports = [
"chrome/browser/resources/settings/ensure_lazy_loaded.html|ensureLazyLoaded",
"ui/webui/resources/html/assert.html|assert",
"ui/webui/resources/html/polymer.html|Polymer,html,templatize,TemplateInstanceBase",
]
- namespace_rewrites = settings_namespace_rewrites + [
- "Polymer.Templatize.templatize|templatize",
- ]
+ namespace_rewrites = settings_namespace_rewrites +
+ [ "Polymer.Templatize.templatize|templatize" ]
}
polymer_modulizer("settings_radio_group") {
@@ -381,6 +374,7 @@ polymer_modulizer("settings_slider") {
js_file = "settings_slider.js"
html_file = "settings_slider.html"
html_type = "dom-module"
+ migrated_imports = settings_migrated_imports
auto_imports =
settings_auto_imports + [
"ui/webui/resources/html/assert.html|assert",
diff --git a/chromium/chrome/browser/resources/settings/default_browser_page/BUILD.gn b/chromium/chrome/browser/resources/settings/default_browser_page/BUILD.gn
index dc82219540a..617370381ac 100644
--- a/chromium/chrome/browser/resources/settings/default_browser_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/default_browser_page/BUILD.gn
@@ -3,11 +3,12 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
-import("//ui/webui/resources/tools/js_modulizer.gni")
+import("//tools/polymer/html_to_js.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [
":default_browser_browser_proxy",
":default_browser_page",
@@ -15,57 +16,17 @@ js_type_check("closure_compile") {
}
js_library("default_browser_browser_proxy") {
- deps = [ "//ui/webui/resources/js:cr" ]
+ deps = [ "//ui/webui/resources/js:cr.m" ]
}
js_library("default_browser_page") {
deps = [
":default_browser_browser_proxy",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- deps = [
- ":default_browser_browser_proxy.m",
- ":default_browser_page.m",
- ]
-}
-
-js_library("default_browser_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/default_browser_page/default_browser_browser_proxy.m.js" ]
- deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
-}
-
-js_library("default_browser_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/default_browser_page/default_browser_page.m.js" ]
- deps = [
- ":default_browser_browser_proxy.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":default_browser_page_module" ]
-}
-
-group("polymer3_elements") {
- public_deps = [
- ":default_browser_page_module",
- ":modulize",
- ]
-}
-
-polymer_modulizer("default_browser_page") {
- js_file = "default_browser_page.js"
- html_file = "default_browser_page.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = [ "chrome/browser/resources/settings/default_browser_page/default_browser_browser_proxy.html|DefaultBrowserBrowserProxyImpl,DefaultBrowserBrowserProxy,DefaultBrowserInfo" ]
}
-js_modulizer("modulize") {
- input_files = [ "default_browser_browser_proxy.js" ]
- namespace_rewrites = settings_namespace_rewrites
+html_to_js("web_components") {
+ js_files = [ "default_browser_page.js" ]
}
diff --git a/chromium/chrome/browser/resources/settings/downloads_page/BUILD.gn b/chromium/chrome/browser/resources/settings/downloads_page/BUILD.gn
index 9b31bc2d09c..a8679afb78f 100644
--- a/chromium/chrome/browser/resources/settings/downloads_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/downloads_page/BUILD.gn
@@ -3,11 +3,12 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
-import("//ui/webui/resources/tools/js_modulizer.gni")
+import("//tools/polymer/html_to_js.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [
":downloads_browser_proxy",
":downloads_page",
@@ -15,64 +16,19 @@ js_type_check("closure_compile") {
}
js_library("downloads_browser_proxy") {
- deps = [
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- ]
+ deps = [ "//ui/webui/resources/js:cr.m" ]
}
js_library("downloads_page") {
deps = [
":downloads_browser_proxy",
- "../prefs:prefs_behavior",
- "//ui/webui/resources/js:util",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- deps = [
- ":downloads_browser_proxy.m",
- ":downloads_page.m",
- ]
-}
-
-js_library("downloads_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/downloads_page/downloads_browser_proxy.m.js" ]
- deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
-}
-
-js_library("downloads_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/downloads_page/downloads_page.m.js" ]
- deps = [
- ":downloads_browser_proxy.m",
"../prefs:prefs_behavior.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:util.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":downloads_page_module" ]
-}
-
-group("polymer3_elements") {
- public_deps = [
- ":downloads_page_module",
- ":modulize",
- ]
-}
-
-polymer_modulizer("downloads_page") {
- js_file = "downloads_page.js"
- html_file = "downloads_page.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports =
- settings_auto_imports + [ "ui/webui/resources/html/util.html|listenOnce" ]
}
-js_modulizer("modulize") {
- input_files = [ "downloads_browser_proxy.js" ]
- namespace_rewrites = settings_namespace_rewrites
+html_to_js("web_components") {
+ js_files = [ "downloads_page.js" ]
}
diff --git a/chromium/chrome/browser/resources/settings/incompatible_applications_page/BUILD.gn b/chromium/chrome/browser/resources/settings/incompatible_applications_page/BUILD.gn
index 29066a8fbe9..b8fe18792b9 100644
--- a/chromium/chrome/browser/resources/settings/incompatible_applications_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/incompatible_applications_page/BUILD.gn
@@ -3,11 +3,12 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
-import("//ui/webui/resources/tools/js_modulizer.gni")
+import("//tools/polymer/html_to_js.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [
":incompatible_application_item",
":incompatible_applications_browser_proxy",
@@ -15,98 +16,33 @@ js_type_check("closure_compile") {
]
}
-js_library("incompatible_applications_browser_proxy") {
- deps = [ "//ui/webui/resources/js:cr" ]
-}
-
-js_library("incompatible_applications_page") {
- deps = [
- ":incompatible_applications_browser_proxy",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
-}
-
js_library("incompatible_application_item") {
deps = [
":incompatible_applications_browser_proxy",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:i18n_behavior",
- ]
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- deps = [
- ":incompatible_application_item.m",
- ":incompatible_applications_browser_proxy.m",
- ":incompatible_applications_page.m",
- ]
-}
-
-js_library("incompatible_application_item.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/incompatible_applications_page/incompatible_application_item.m.js" ]
- deps = [
- ":incompatible_applications_browser_proxy.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
]
- extra_deps = [ ":incompatible_application_item_module" ]
}
-js_library("incompatible_applications_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/incompatible_applications_page/incompatible_applications_browser_proxy.m.js" ]
+js_library("incompatible_applications_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
externs_list = [ "$externs_path/chrome_send.js" ]
- extra_deps = [ ":modulize" ]
}
-js_library("incompatible_applications_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/incompatible_applications_page/incompatible_applications_page.m.js" ]
+js_library("incompatible_applications_page") {
deps = [
- ":incompatible_applications_browser_proxy.m",
- "..:i18n_setup.m",
+ ":incompatible_applications_browser_proxy",
+ "..:i18n_setup",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":incompatible_applications_page_module" ]
}
-group("polymer3_elements") {
- public_deps = [
- ":incompatible_application_item_module",
- ":incompatible_applications_page_module",
- ":modulize",
+html_to_js("web_components") {
+ js_files = [
+ "incompatible_application_item.js",
+ "incompatible_applications_page.js",
]
}
-
-polymer_modulizer("incompatible_application_item") {
- js_file = "incompatible_application_item.js"
- html_file = "incompatible_application_item.html"
- html_type = "dom-module"
- namespace_rewrites =
- settings_namespace_rewrites + [ "settings.ActionTypes|ActionTypes" ]
- auto_imports = [
- "ui/webui/resources/html/assert.html|assertNotReached",
- "chrome/browser/resources/settings/incompatible_applications_page/incompatible_applications_browser_proxy.html|ActionTypes,IncompatibleApplicationsBrowserProxyImpl,IncompatibleApplicationsBrowserProxy",
- ]
-}
-
-polymer_modulizer("incompatible_applications_page") {
- js_file = "incompatible_applications_page.js"
- html_file = "incompatible_applications_page.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [
- "ui/webui/resources/html/assert.html|assert",
- "chrome/browser/resources/settings/incompatible_applications_page/incompatible_applications_browser_proxy.html|IncompatibleApplicationsBrowserProxyImpl, IncompatibleApplication",
- ]
-}
-
-js_modulizer("modulize") {
- input_files = [ "incompatible_applications_browser_proxy.js" ]
- namespace_rewrites = settings_namespace_rewrites
-}
diff --git a/chromium/chrome/browser/resources/settings/languages_page/BUILD.gn b/chromium/chrome/browser/resources/settings/languages_page/BUILD.gn
index 9bbcf64228c..95ebf73a699 100644
--- a/chromium/chrome/browser/resources/settings/languages_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/languages_page/BUILD.gn
@@ -3,29 +3,15 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/polymer/html_to_js.gni")
import("//tools/polymer/polymer.gni")
import("//ui/webui/resources/tools/js_modulizer.gni")
import("../settings.gni")
js_type_check("closure_compile") {
deps = [
- ":add_languages_dialog",
- ":edit_dictionary_page",
":languages",
":languages_browser_proxy",
- ":languages_page",
- ":languages_types",
- ]
-}
-
-js_library("edit_dictionary_page") {
- deps = [
- ":languages_browser_proxy",
- "..:global_scroll_target_behavior",
- "..:route",
- "../prefs",
- "//ui/webui/resources/cr_elements/cr_button:cr_button",
- "//ui/webui/resources/cr_elements/cr_input:cr_input",
]
}
@@ -63,84 +49,52 @@ js_library("languages") {
]
}
-js_library("languages_page") {
- deps = [
- ":languages",
- ":languages_types",
- "..:lifetime_browser_proxy",
- "..:route",
- "..:router",
- "../settings_page:settings_animated_pages",
- "//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu",
- "//ui/webui/resources/cr_elements/cr_expand_button:cr_expand_button",
- "//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js/cr/ui:focus_without_ink",
- ]
-}
-
js_library("languages_types") {
- deps = []
externs_list = [ "$externs_path/language_settings_private.js" ]
}
-js_library("add_languages_dialog") {
- deps = [
- ":languages",
- ":languages_types",
- "//ui/webui/resources/cr_elements:cr_scrollable_behavior",
- "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field",
- "//ui/webui/resources/js:find_shortcut_behavior",
- ]
-}
-
js_type_check("closure_compile_module") {
is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [
- ":add_languages_dialog.m",
- ":edit_dictionary_page.m",
+ ":add_languages_dialog",
+ ":edit_dictionary_page",
":languages.m",
":languages_browser_proxy.m",
- ":languages_page.m",
- ":languages_types.m",
+ ":languages_page",
+ ":languages_types",
]
}
-js_library("add_languages_dialog.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/languages_page/add_languages_dialog.m.js" ]
+js_library("add_languages_dialog") {
deps = [
":languages.m",
- ":languages_types.m",
+ ":languages_types",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements:cr_scrollable_behavior.m",
"//ui/webui/resources/cr_elements/cr_search_field:cr_search_field.m",
"//ui/webui/resources/js:find_shortcut_behavior.m",
]
- extra_deps = [ ":add_languages_dialog_module" ]
}
-js_library("edit_dictionary_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/languages_page/edit_dictionary_page.m.js" ]
+js_library("edit_dictionary_page") {
deps = [
":languages_browser_proxy.m",
"..:global_scroll_target_behavior.m",
- "..:route.m",
+ "..:route",
"../prefs:prefs.m",
"//third_party/polymer/v3_0/components-chromium/iron-list:iron-list",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_button:cr_button.m",
"//ui/webui/resources/cr_elements/cr_input:cr_input.m",
]
- extra_deps = [ ":edit_dictionary_page_module" ]
}
js_library("languages.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/languages_page/languages.m.js" ]
deps = [
":languages_browser_proxy.m",
- ":languages_types.m",
+ ":languages_types",
"../prefs:prefs.m",
"../prefs:prefs_behavior.m",
"../prefs:prefs_types.m",
@@ -176,13 +130,11 @@ js_library("languages_browser_proxy.m") {
extra_deps = [ ":modulize" ]
}
-js_library("languages_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/languages_page/languages_page.m.js" ]
+js_library("languages_page") {
deps = [
":languages.m",
- ":languages_types.m",
"..:lifetime_browser_proxy.m",
- "..:route.m",
+ "..:route",
"..:router.m",
"../settings_page:settings_animated_pages.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
@@ -194,41 +146,22 @@ js_library("languages_page.m") {
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js/cr/ui:focus_without_ink.m",
]
- extra_deps = [ ":languages_page_module" ]
-}
-
-js_library("languages_types.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/languages_page/languages_types.m.js" ]
- externs_list = [ "$externs_path/language_settings_private.js" ]
- extra_deps = [ ":modulize" ]
}
group("polymer3_elements") {
public_deps = [
- ":add_languages_dialog_module",
- ":edit_dictionary_page_module",
":languages_module",
- ":languages_page_module",
":modulize",
+ ":web_components",
]
}
-polymer_modulizer("add_languages_dialog") {
- js_file = "add_languages_dialog.js"
- html_file = "add_languages_dialog.html"
- html_type = "dom-module"
-}
-
-polymer_modulizer("edit_dictionary_page") {
- js_file = "edit_dictionary_page.js"
- html_file = "edit_dictionary_page.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/languages_page/languages_browser_proxy.html|LanguagesBrowserProxyImpl",
- "chrome/browser/resources/settings/route.html|routes",
- "ui/webui/resources/html/polymer.html|Polymer,html,flush",
- ]
+html_to_js("web_components") {
+ js_files = [
+ "add_languages_dialog.js",
+ "edit_dictionary_page.js",
+ "languages_page.js",
+ ]
}
polymer_modulizer("languages") {
@@ -243,26 +176,7 @@ polymer_modulizer("languages") {
namespace_rewrites = settings_namespace_rewrites
}
-polymer_modulizer("languages_page") {
- js_file = "languages_page.js"
- html_file = "languages_page.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/lifetime_browser_proxy.html|LifetimeBrowserProxyImpl",
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/router.html|Route,Router",
- "ui/webui/resources/html/assert.html|assert",
- "ui/webui/resources/html/cr.html|isChromeOS, isWindows",
- "ui/webui/resources/html/polymer.html|Polymer,html,flush",
- ]
- namespace_rewrites = settings_namespace_rewrites +
- [ "settings.kMenuCloseDelay|kMenuCloseDelay" ]
-}
-
js_modulizer("modulize") {
- input_files = [
- "languages_browser_proxy.js",
- "languages_types.js",
- ]
+ input_files = [ "languages_browser_proxy.js" ]
namespace_rewrites = settings_namespace_rewrites
}
diff --git a/chromium/chrome/browser/resources/settings/on_startup_page/BUILD.gn b/chromium/chrome/browser/resources/settings/on_startup_page/BUILD.gn
index 93a4ce2f937..18ca090d579 100644
--- a/chromium/chrome/browser/resources/settings/on_startup_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/on_startup_page/BUILD.gn
@@ -3,11 +3,12 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
-import("//ui/webui/resources/tools/js_modulizer.gni")
+import("//tools/polymer/html_to_js.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [
":on_startup_browser_proxy",
":on_startup_page",
@@ -19,183 +20,56 @@ js_type_check("closure_compile") {
}
js_library("on_startup_browser_proxy") {
- deps = [
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- ]
+ deps = [ "//ui/webui/resources/js:cr.m" ]
}
js_library("on_startup_page") {
deps = [
":on_startup_browser_proxy",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
-}
-
-js_library("startup_urls_page") {
- deps = [
- ":startup_url_entry",
- ":startup_urls_page_browser_proxy",
- "//ui/webui/resources/cr_elements:cr_scrollable_behavior",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- "//ui/webui/resources/js/cr/ui:focus_without_ink",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
-js_library("startup_urls_page_browser_proxy") {
- deps = [
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- ]
- externs_list = [ "$externs_path/chrome_send.js" ]
-}
-
-js_library("startup_url_entry") {
- deps = [
- ":startup_urls_page_browser_proxy",
- "//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu",
- "//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:icon",
- "//ui/webui/resources/js/cr/ui:focus_row_behavior",
+ "//ui/webui/resources/js:web_ui_listener_behavior.m",
]
}
js_library("startup_url_dialog") {
deps = [
":startup_urls_page_browser_proxy",
- "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:load_time_data",
- ]
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- deps = [
- ":on_startup_browser_proxy.m",
- ":on_startup_page.m",
- ":startup_url_dialog.m",
- ":startup_url_entry.m",
- ":startup_urls_page.m",
- ":startup_urls_page_browser_proxy.m",
- ]
-}
-
-js_library("on_startup_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/on_startup_page/on_startup_browser_proxy.m.js" ]
- deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
-}
-
-js_library("on_startup_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/on_startup_page/on_startup_page.m.js" ]
- deps = [
- ":on_startup_browser_proxy.m",
- "//ui/webui/resources/js:web_ui_listener_behavior.m",
- ]
- extra_deps = [ ":on_startup_page_module" ]
-}
-
-js_library("startup_url_dialog.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/on_startup_page/startup_url_dialog.m.js" ]
- deps = [
- ":startup_urls_page_browser_proxy.m",
- "..:i18n_setup.m",
+ "..:i18n_setup",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
]
- extra_deps = [ ":startup_url_dialog_module" ]
}
-js_library("startup_url_entry.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/on_startup_page/startup_url_entry.m.js" ]
+js_library("startup_url_entry") {
deps = [
- ":startup_urls_page_browser_proxy.m",
+ ":startup_urls_page_browser_proxy",
"//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu.m",
"//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render.m",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:icon.m",
"//ui/webui/resources/js/cr/ui:focus_row_behavior.m",
]
- extra_deps = [ ":startup_url_entry_module" ]
}
-js_library("startup_urls_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/on_startup_page/startup_urls_page.m.js" ]
+js_library("startup_urls_page") {
deps = [
- ":startup_url_entry.m",
- ":startup_urls_page_browser_proxy.m",
+ ":startup_url_entry",
+ ":startup_urls_page_browser_proxy",
"//ui/webui/resources/cr_elements:cr_scrollable_behavior.m",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
"//ui/webui/resources/js/cr/ui:focus_without_ink.m",
]
externs_list = [ "$externs_path/settings_private.js" ]
- extra_deps = [ ":startup_urls_page_module" ]
}
-js_library("startup_urls_page_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/on_startup_page/startup_urls_page_browser_proxy.m.js" ]
+js_library("startup_urls_page_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
-}
-
-group("polymer3_elements") {
- public_deps = [
- ":modulize",
- ":on_startup_page_module",
- ":startup_url_dialog_module",
- ":startup_url_entry_module",
- ":startup_urls_page_module",
- ]
-}
-
-polymer_modulizer("on_startup_page") {
- js_file = "on_startup_page.js"
- html_file = "on_startup_page.html"
- html_type = "dom-module"
- auto_imports = [ "chrome/browser/resources/settings/on_startup_page/on_startup_browser_proxy.html|NtpExtension, OnStartupBrowserProxyImpl" ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("startup_url_dialog") {
- js_file = "startup_url_dialog.js"
- html_file = "startup_url_dialog.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [ "chrome/browser/resources/settings/on_startup_page/startup_urls_page_browser_proxy.html|StartupPageInfo, StartupUrlsPageBrowserProxy, StartupUrlsPageBrowserProxyImpl" ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("startup_url_entry") {
- js_file = "startup_url_entry.js"
- html_file = "startup_url_entry.html"
- html_type = "dom-module"
- auto_imports = [
- "ui/webui/resources/html/assert.html|assert",
- "chrome/browser/resources/settings/on_startup_page/startup_urls_page_browser_proxy.html|StartupPageInfo, StartupUrlsPageBrowserProxyImpl",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("startup_urls_page") {
- js_file = "startup_urls_page.js"
- html_file = "startup_urls_page.html"
- html_type = "dom-module"
- auto_imports = [
- "ui/webui/resources/html/assert.html|assert",
- "chrome/browser/resources/settings/on_startup_page/startup_url_entry.html|EDIT_STARTUP_URL_EVENT",
- "chrome/browser/resources/settings/on_startup_page/startup_urls_page_browser_proxy.html|StartupPageInfo, StartupUrlsPageBrowserProxy, StartupUrlsPageBrowserProxyImpl",
- ]
- namespace_rewrites = settings_namespace_rewrites
}
-js_modulizer("modulize") {
- input_files = [
- "on_startup_browser_proxy.js",
- "startup_urls_page_browser_proxy.js",
+html_to_js("web_components") {
+ js_files = [
+ "on_startup_page.js",
+ "startup_url_dialog.js",
+ "startup_url_entry.js",
+ "startup_urls_page.js",
]
- namespace_rewrites = settings_namespace_rewrites
}
diff --git a/chromium/chrome/browser/resources/settings/os_settings_resources.grd b/chromium/chrome/browser/resources/settings/os_settings_resources.grd
index 05e7cf5cad9..cf80563c962 100644
--- a/chromium/chrome/browser/resources/settings/os_settings_resources.grd
+++ b/chromium/chrome/browser/resources/settings/os_settings_resources.grd
@@ -12,1317 +12,1365 @@
</outputs>
<release seq="1">
<includes>
+ <part file="chromeos/os_settings_resources_v3.grdp" />
+
+ <!-- Constants -->
+ <include name="IDR_OS_SETTINGS_ROUTES_MOJOM_LITE_JS"
+ file="${root_gen_dir}\chrome\browser\ui\webui\settings\chromeos\constants\routes.mojom-lite.js"
+ use_base_dir="false"
+ compress="false" type="BINDATA" />
+ <include name="IDR_OS_SETTINGS_SETTING_MOJOM_LITE_JS"
+ file="${root_gen_dir}\chrome\browser\ui\webui\settings\chromeos\constants\setting.mojom-lite.js"
+ use_base_dir="false"
+ compress="false" type="BINDATA" />
+
<!-- App Management -->
<include name="IDR_OS_SETTINGS_APP_MANAGEMENT_BITMAP_MOJO_LITE_JS"
file="${root_gen_dir}\skia\public\mojom\bitmap.mojom-lite.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_OS_SETTINGS_APP_MANAGEMENT_FILE_PATH_MOJO_LITE_JS"
file="${root_gen_dir}\mojo\public\mojom\base\file_path.mojom-lite.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_OS_SETTINGS_APP_MANAGEMENT_IMAGE_INFO_MOJO_LITE_JS"
file="${root_gen_dir}\skia\public\mojom\image_info.mojom-lite.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_OS_SETTINGS_APP_MANAGEMENT_IMAGE_MOJO_LITE_JS"
file="${root_gen_dir}\ui\gfx\image\mojom\image.mojom-lite.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_OS_SETTINGS_APP_MANAGEMENT_MOJO_LITE_JS"
file="${root_gen_dir}\chrome\browser\ui\webui\app_management\app_management.mojom-lite.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_OS_SETTINGS_APP_MANAGEMENT_TYPES_MOJO_LITE_JS"
file="${root_gen_dir}\chrome\services\app_service\public\mojom\types.mojom-lite.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<!-- Search -->
<include name="IDR_OS_SETTINGS_SEARCH_MOJOM_LITE_JS"
file="${root_gen_dir}\chrome\browser\ui\webui\settings\chromeos\search\search.mojom-lite.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_OS_SETTINGS_SEARCH_RESULT_ICON_MOJOM_LITE_JS"
file="${root_gen_dir}\chrome\browser\ui\webui\settings\chromeos\search\search_result_icon.mojom-lite.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_OS_SETTINGS_USER_ACTION_RECORDER_MOJOM_LITE_JS"
file="${root_gen_dir}\chrome\browser\ui\webui\settings\chromeos\search\user_action_recorder.mojom-lite.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
</includes>
<structures>
<structure name="IDR_OS_SETTINGS_LOCALIZED_LINK_JS"
file="chromeos/localized_link/localized_link.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_LOCALIZED_LINK_HTML"
file="chromeos/localized_link/localized_link.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_A11Y_PAGE_JS"
file="chromeos/os_a11y_page/os_a11y_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_A11Y_PAGE_HTML"
file="chromeos/os_a11y_page/os_a11y_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_AMBIENT_MODE_PAGE_AMBIENT_MODE_PAGE_JS"
file="chromeos/ambient_mode_page/ambient_mode_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_AMBIENT_MODE_PAGE_AMBIENT_MODE_PAGE_HTML"
file="chromeos/ambient_mode_page/ambient_mode_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_AMBIENT_MODE_PAGE_AMBIENT_MODE_BROWSER_PROXY_JS"
file="chromeos/ambient_mode_page/ambient_mode_browser_proxy.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_AMBIENT_MODE_PAGE_AMBIENT_MODE_BROWSER_PROXY_HTML"
file="chromeos/ambient_mode_page/ambient_mode_browser_proxy.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APPS_PAGE_JS"
file="chromeos/os_apps_page/os_apps_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APPS_PAGE_HTML"
file="chromeos/os_apps_page/os_apps_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_JS"
file="chromeos/os_apps_page/app_management_page/app_management_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_HTML"
file="chromeos/os_apps_page/app_management_page/app_management_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_CONSTANTS_JS"
file="chromeos/os_apps_page/app_management_page/constants.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_CONSTANTS_HTML"
file="chromeos/os_apps_page/app_management_page/constants.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_STORE_CLIENT_JS"
file="chromeos/os_apps_page/app_management_page/store_client.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_STORE_CLIENT_HTML"
file="chromeos/os_apps_page/app_management_page/store_client.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_STORE_JS"
file="chromeos/os_apps_page/app_management_page/store.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_STORE_HTML"
file="chromeos/os_apps_page/app_management_page/store.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_ACTIONS_JS"
file="chromeos/os_apps_page/app_management_page/actions.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_ACTIONS_HTML"
file="chromeos/os_apps_page/app_management_page/actions.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_APP_ITEM_JS"
file="chromeos/os_apps_page/app_management_page/app_item.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_APP_ITEM_HTML"
file="chromeos/os_apps_page/app_management_page/app_item.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_BROWSER_PROXY_JS"
file="chromeos/os_apps_page/app_management_page/browser_proxy.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_BROWSER_PROXY_HTML"
file="chromeos/os_apps_page/app_management_page/browser_proxy.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_FAKE_PAGE_HANDLER_JS"
file="chromeos/os_apps_page/app_management_page/fake_page_handler.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_MAIN_VIEW_JS"
file="chromeos/os_apps_page/app_management_page/main_view.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_MAIN_VIEW_HTML"
file="chromeos/os_apps_page/app_management_page/main_view.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_TYPES_JS"
file="chromeos/os_apps_page/app_management_page/types.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_UTIL_JS"
file="chromeos/os_apps_page/app_management_page/util.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_UTIL_HTML"
file="chromeos/os_apps_page/app_management_page/util.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_SHARED_STYLE_HTML"
file="chromeos/os_apps_page/app_management_page/shared_style.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_SHARED_VARS_HTML"
file="chromeos/os_apps_page/app_management_page/shared_vars.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_REDUCERS_JS"
file="chromeos/os_apps_page/app_management_page/reducers.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_REDUCERS_HTML"
file="chromeos/os_apps_page/app_management_page/reducers.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_API_LISTENER_JS"
file="chromeos/os_apps_page/app_management_page/api_listener.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_API_LISTENER_HTML"
file="chromeos/os_apps_page/app_management_page/api_listener.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_DOM_SWITCH_JS"
file="chromeos/os_apps_page/app_management_page/dom_switch.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_DOM_SWITCH_HTML"
file="chromeos/os_apps_page/app_management_page/dom_switch.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_PWA_DETAIL_VIEW_JS"
file="chromeos/os_apps_page/app_management_page/pwa_detail_view.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_PWA_DETAIL_VIEW_HTML"
file="chromeos/os_apps_page/app_management_page/pwa_detail_view.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_PERMISSION_ITEM_JS"
file="chromeos/os_apps_page/app_management_page/permission_item.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_PERMISSION_ITEM_HTML"
file="chromeos/os_apps_page/app_management_page/permission_item.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_PIN_TO_SHELF_ITEM_JS"
file="chromeos/os_apps_page/app_management_page/pin_to_shelf_item.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_PIN_TO_SHELF_ITEM_HTML"
file="chromeos/os_apps_page/app_management_page/pin_to_shelf_item.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_TOGGLE_ROW_JS"
file="chromeos/os_apps_page/app_management_page/toggle_row.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_TOGGLE_ROW_HTML"
file="chromeos/os_apps_page/app_management_page/toggle_row.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_APP_DETAIL_VIEW_JS"
file="chromeos/os_apps_page/app_management_page/app_detail_view.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_APP_DETAIL_VIEW_HTML"
file="chromeos/os_apps_page/app_management_page/app_detail_view.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_ARC_DETAIL_VIEW_JS"
file="chromeos/os_apps_page/app_management_page/arc_detail_view.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_ARC_DETAIL_VIEW_HTML"
file="chromeos/os_apps_page/app_management_page/arc_detail_view.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_CHROME_APP_DETAIL_VIEW_JS"
file="chromeos/os_apps_page/app_management_page/chrome_app_detail_view.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_CHROME_APP_DETAIL_VIEW_HTML"
file="chromeos/os_apps_page/app_management_page/chrome_app_detail_view.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_ICONS_HTML"
file="chromeos/os_apps_page/app_management_page/icons.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_UNINSTALL_BUTTON_JS"
file="chromeos/os_apps_page/app_management_page/uninstall_button.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_APP_UNINSTALL_BUTTON_HTML"
file="chromeos/os_apps_page/app_management_page/uninstall_button.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
+ <structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PLUGIN_VM_DETAIL_VIEW_JS"
+ file="chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_detail_view.js"
+ compress="false" type="chrome_html" />
+ <structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PLUGIN_VM_DETAIL_VIEW_HTML"
+ file="chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_detail_view.html"
+ compress="false" type="chrome_html" />
+ <structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PLUGIN_VM_SHARED_PATHS_HTML"
+ file="chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_shared_paths.html"
+ compress="false" type="chrome_html" />
+ <structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PLUGIN_VM_SHARED_PATHS_JS"
+ file="chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_shared_paths.js"
+ compress="false" type="chrome_html" />
+ <structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PLUGIN_VM_BROWSER_PROXY_JS"
+ file="chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_browser_proxy.js"
+ compress="false" type="chrome_html" />
+ <structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PLUGIN_VM_BROWSER_PROXY_HTML"
+ file="chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_browser_proxy.html"
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CAPTIONS_SUBPAGE_JS"
file="a11y_page/captions_subpage.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CAPTIONS_SUBPAGE_HTML"
file="a11y_page/captions_subpage.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_FONTS_BROWSER_PROXY_HTML"
file="appearance_page/fonts_browser_proxy.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_FONTS_BROWSER_PROXY_JS"
file="appearance_page/fonts_browser_proxy.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MANAGE_A11Y_PAGE_JS"
file="chromeos/os_a11y_page/manage_a11y_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MANAGE_A11Y_PAGE_HTML"
file="chromeos/os_a11y_page/manage_a11y_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDS_OS_SETTINGS_SWITCH_ACCESS_SUBPAGE_JS"
file="chromeos/os_a11y_page/switch_access_subpage.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_SWITCH_ACCESS_SUBPAGE_HTML"
file="chromeos/os_a11y_page/switch_access_subpage.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_TTS_SUBPAGE_JS"
file="chromeos/os_a11y_page/tts_subpage.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_TTS_SUBPAGE_HTML"
file="chromeos/os_a11y_page/tts_subpage.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MANIFEST"
file="os_settings_manifest.json"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_ABOUT_PAGE_BROWSER_PROXY_HTML"
file="about_page/about_page_browser_proxy.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_ABOUT_PAGE_BROWSER_PROXY_JS"
file="about_page/about_page_browser_proxy.js"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_ABOUT_PAGE_JS"
file="chromeos/os_about_page/os_about_page.js"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_ABOUT_PAGE_HTML"
file="chromeos/os_about_page/os_about_page.html"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_CHANNEL_SWITCHER_DIALOG_HTML"
file="chromeos/os_about_page/channel_switcher_dialog.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CHANNEL_SWITCHER_DIALOG_JS"
file="chromeos/os_about_page/channel_switcher_dialog.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DETAILED_BUILD_INFO_JS"
file="chromeos/os_about_page/detailed_build_info.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DETAILED_BUILD_INFO_HTML"
file="chromeos/os_about_page/detailed_build_info.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_UPDATE_WARNING_DIALOG_HTML"
file="chromeos/os_about_page/update_warning_dialog.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_UPDATE_WARNING_DIALOG_JS"
file="chromeos/os_about_page/update_warning_dialog.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CR_SETTINGS_ANIMATED_PAGES_HTML"
file="settings_page/settings_animated_pages.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CR_SETTINGS_ANIMATED_PAGES_JS"
file="settings_page/settings_animated_pages.js"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_PERSONALIZATION_PAGE_HTML"
file="chromeos/personalization_page/personalization_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PERSONALIZATION_PAGE_JS"
file="chromeos/personalization_page/personalization_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_OS_SETTINGS_PAGE_JS"
file="chromeos/os_settings_page/os_settings_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_OS_SETTINGS_PAGE_HTML"
file="chromeos/os_settings_page/os_settings_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_ENSURE_LAZY_LOADED_HTML"
file="ensure_lazy_loaded.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_EXTENSION_CONTROL_BROWSER_PROXY_JS"
file="extension_control_browser_proxy.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_EXTENSION_CONTROL_BROWSER_PROXY_HTML"
file="extension_control_browser_proxy.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_LIFETIME_BROWSER_PROXY_HTML"
file="lifetime_browser_proxy.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_LIFETIME_BROWSER_PROXY_JS"
file="lifetime_browser_proxy.js"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_SEARCH_SETTINGS_JS"
file="search_settings.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CR_OS_SETTINGS_MAIN_HTML"
file="chromeos/os_settings_main/os_settings_main.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CR_OS_SETTINGS_MAIN_JS"
file="chromeos/os_settings_main/os_settings_main.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CR_OS_SETTINGS_MENU_HTML"
file="chromeos/os_settings_menu/os_settings_menu.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CR_OS_SETTINGS_MENU_JS"
file="chromeos/os_settings_menu/os_settings_menu.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CR_SETTINGS_SECTION_HTML"
file="settings_page/settings_section.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CR_SETTINGS_SECTION_JS"
file="settings_page/settings_section.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CR_SETTINGS_SUBPAGE_HTML"
file="settings_page/settings_subpage.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CR_SETTINGS_SUBPAGE_JS"
file="settings_page/settings_subpage.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CR_SETTINGS_PAGE_CSS_HTML"
file="settings_page_css.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MAIN_PAGE_BEHAVIOR_HTML"
file="settings_page/main_page_behavior.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MAIN_PAGE_BEHAVIOR_JS"
file="settings_page/main_page_behavior.js"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_SETTINGS_VARS_CSS_HTML"
file="settings_vars_css.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_SETTINGS_SHARED_CSS_HTML"
file="settings_shared_css.html"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_CR_OS_SETTINGS_UI_HTML"
file="chromeos/os_settings_ui/os_settings_ui.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CR_OS_SETTINGS_UI_JS"
file="chromeos/os_settings_ui/os_settings_ui.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_GLOBAL_SCROLL_TARGET_BEHAVIOR_HTML"
file="global_scroll_target_behavior.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_GLOBAL_SCROLL_TARGET_BEHAVIOR_JS"
file="global_scroll_target_behavior.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CONTROLS_BOOLEAN_CONTROL_BEHAVIOR_HTML"
file="controls/settings_boolean_control_behavior.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CONTROLS_BOOLEAN_CONTROL_BEHAVIOR_JS"
file="controls/settings_boolean_control_behavior.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CONTROLS_CONTROLLED_BUTTON_JS"
file="controls/controlled_button.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CONTROLS_CONTROLLED_BUTTON_HTML"
file="controls/controlled_button.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CONTROLS_CONTROLLED_RADIO_BUTTON_JS"
file="controls/controlled_radio_button.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CONTROLS_CONTROLLED_RADIO_BUTTON_HTML"
file="controls/controlled_radio_button.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CONTROLS_EXTENSION_CONTROLLED_INDICATOR_JS"
file="controls/extension_controlled_indicator.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CONTROLS_EXTENSION_CONTROLLED_INDICATOR_HTML"
file="controls/extension_controlled_indicator.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CONTROLS_DROPDOWN_MENU_HTML"
file="controls/settings_dropdown_menu.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CONTROLS_DROPDOWN_MENU_JS"
file="controls/settings_dropdown_menu.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CONTROLS_PASSWORD_PROMPT_DIALOG_JS"
file="controls/password_prompt_dialog.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CONTROLS_PASSWORD_PROMPT_DIALOG_HTML"
file="controls/password_prompt_dialog.html"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_CONTROLS_PREF_CONTROL_BEHAVIOR_HTML"
file="controls/pref_control_behavior.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CONTROLS_PREF_CONTROL_BEHAVIOR_JS"
file="controls/pref_control_behavior.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CONTROLS_RADIO_GROUP_HTML"
file="controls/settings_radio_group.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CONTROLS_RADIO_GROUP_JS"
file="controls/settings_radio_group.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CONTROLS_SETTINGS_IDLE_LOAD_HTML"
file="controls/settings_idle_load.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CONTROLS_SETTINGS_IDLE_LOAD_JS"
file="controls/settings_idle_load.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CONTROLS_SLIDER_HTML"
file="controls/settings_slider.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CONTROLS_SLIDER_JS"
file="controls/settings_slider.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CONTROLS_TEXTAREA_HTML"
file="controls/settings_textarea.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CONTROLS_TEXTAREA_JS"
file="controls/settings_textarea.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CONTROLS_TOGGLE_BUTTON_HTML"
file="controls/settings_toggle_button.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CONTROLS_TOGGLE_BUTTON_JS"
file="controls/settings_toggle_button.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_BROWSER_PROXY_HTML"
file="chromeos/device_page/device_page_browser_proxy.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_BROWSER_PROXY_JS"
file="chromeos/device_page/device_page_browser_proxy.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_DISPLAY_HTML"
file="chromeos/device_page/display.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_DISPLAY_JS"
file="chromeos/device_page/display.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_DISPLAY_LAYOUT_HTML"
file="chromeos/device_page/display_layout.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_DISPLAY_LAYOUT_JS"
file="chromeos/device_page/display_layout.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_DISPLAY_OVERSCAN_DIALOG_HTML"
file="chromeos/device_page/display_overscan_dialog.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_DISPLAY_OVERSCAN_DIALOG_JS"
file="chromeos/device_page/display_overscan_dialog.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
+ <structure name="IDR_OS_SETTINGS_DEVICE_DLC_SUBPAGE_HTML"
+ file="chromeos/device_page/dlc_subpage.html"
+ compress="false" type="chrome_html" />
+ <structure name="IDR_OS_SETTINGS_DEVICE_DLC_SUBPAGE_JS"
+ file="chromeos/device_page/dlc_subpage.js"
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_KEYBOARD_HTML"
file="chromeos/device_page/keyboard.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_KEYBOARD_JS"
file="chromeos/device_page/keyboard.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_POWER_HTML"
file="chromeos/device_page/power.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_POWER_JS"
file="chromeos/device_page/power.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_STORAGE_HTML"
file="chromeos/device_page/storage.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_STORAGE_JS"
file="chromeos/device_page/storage.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_SETTINGS_DEVICE_STORAGE_EXTERNAL_ENTRY_HTML"
file="chromeos/device_page/storage_external_entry.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_SETTINGS_DEVICE_STORAGE_EXTERNAL_ENTRY_JS"
file="chromeos/device_page/storage_external_entry.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_SETTINGS_DEVICE_STORAGE_EXTERNAL_HTML"
file="chromeos/device_page/storage_external.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_SETTINGS_DEVICE_STORAGE_EXTERNAL_JS"
file="chromeos/device_page/storage_external.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_STYLUS_HTML"
file="chromeos/device_page/stylus.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_STYLUS_JS"
file="chromeos/device_page/stylus.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_PAGE_HTML"
file="chromeos/device_page/device_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_PAGE_JS"
file="chromeos/device_page/device_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_POINTERS_HTML"
file="chromeos/device_page/pointers.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_POINTERS_JS"
file="chromeos/device_page/pointers.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_DRAG_BEHAVIOR_HTML"
file="chromeos/device_page/drag_behavior.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_DRAG_BEHAVIOR_JS"
file="chromeos/device_page/drag_behavior.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_LAYOUT_BEHAVIOR_HTML"
file="chromeos/device_page/layout_behavior.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_LAYOUT_BEHAVIOR_JS"
file="chromeos/device_page/layout_behavior.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_NIGHT_LIGHT_SLIDER_HTML"
file="chromeos/device_page/night_light_slider.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DEVICE_NIGHT_LIGHT_SLIDER_JS"
file="chromeos/device_page/night_light_slider.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_FILES_PAGE_HTML"
file="chromeos/os_files_page/os_files_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_FILES_PAGE_JS"
file="chromeos/os_files_page/os_files_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_SMB_SHARES_PAGE_HTML"
file="chromeos/os_files_page/smb_shares_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_SMB_SHARES_PAGE_JS"
file="chromeos/os_files_page/smb_shares_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_I18n_SETUP_HTML"
file="i18n_setup.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_ICONS"
file="icons.html"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_OS_ICONS"
file="chromeos/os_icons.html"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_OS_SETTINGS_ICONS_CSS_HTML"
file="chromeos/os_settings_icons_css.html"
flattenhtml="true"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_POWERWASH_DIALOG_HTML"
file="chromeos/os_reset_page/os_powerwash_dialog.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_POWERWASH_DIALOG_JS"
file="chromeos/os_reset_page/os_powerwash_dialog.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_RESET_PAGE_HTML"
file="chromeos/os_reset_page/os_reset_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_RESET_PAGE_JS"
file="chromeos/os_reset_page/os_reset_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_RESET_BROWSER_PROXY_JS"
file="chromeos/os_reset_page/os_reset_browser_proxy.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_RESET_BROWSER_PROXY_HTML"
file="chromeos/os_reset_page/os_reset_browser_proxy.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_LANGUAGES_HTML"
file="languages_page/languages.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_LANGUAGES_JS"
file="languages_page/languages.js"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_LANGUAGES_BROWSER_PROXY_HTML"
file="languages_page/languages_browser_proxy.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_LANGUAGES_BROWSER_PROXY_JS"
file="languages_page/languages_browser_proxy.js"
preprocess="true"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_LANGUAGES_ADD_LANGUAGES_DIALOG_HTML"
file="chromeos/os_languages_page/os_add_languages_dialog.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_LANGUAGES_ADD_LANGUAGES_DIALOG_JS"
file="chromeos/os_languages_page/os_add_languages_dialog.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_LANGUAGES_PAGE_HTML"
file="chromeos/os_languages_page/os_languages_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_LANGUAGES_PAGE_JS"
file="chromeos/os_languages_page/os_languages_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_LANGUAGES_SECTION_HTML"
file="chromeos/os_languages_page/os_languages_section.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_LANGUAGES_SECTION_JS"
file="chromeos/os_languages_page/os_languages_section.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_LANGUAGES_MANAGE_INPUT_METHODS_PAGE_HTML"
file="chromeos/os_languages_page/manage_input_methods_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_LANGUAGES_MANAGE_INPUT_METHODS_PAGE_JS"
file="chromeos/os_languages_page/manage_input_methods_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
+ <structure name="IDR_OS_SETTINGS_LANGUAGES_SMART_INPUTS_PAGE_HTML"
+ file="chromeos/os_languages_page/smart_inputs_page.html"
+ compress="false" type="chrome_html" />
+ <structure name="IDR_OS_SETTINGS_LANGUAGES_SMART_INPUTS_PAGE_JS"
+ file="chromeos/os_languages_page/smart_inputs_page.js"
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_OS_SEARCH_RESULT_ROW_JS"
file="chromeos/os_settings_search_box/os_search_result_row.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_OS_SEARCH_RESULT_ROW_HTML"
file="chromeos/os_settings_search_box/os_search_result_row.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_OS_SETTINGS_SEARCH_BOX_JS"
file="chromeos/os_settings_search_box/os_settings_search_box.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_OS_SETTINGS_SEARCH_BOX_HTML"
file="chromeos/os_settings_search_box/os_settings_search_box.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_OS_TOOLBAR_JS"
file="chromeos/os_toolbar/os_toolbar.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_OS_TOOLBAR_HTML"
file="chromeos/os_toolbar/os_toolbar.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PEOPLE_PAGE_HTML"
file="chromeos/os_people_page/os_people_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PEOPLE_PAGE_JS"
file="chromeos/os_people_page/os_people_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_OS_SYNC_BROWSER_PROXY_HTML"
file="chromeos/os_people_page/os_sync_browser_proxy.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_OS_SYNC_BROWSER_PROXY_JS"
file="chromeos/os_people_page/os_sync_browser_proxy.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_OS_SYNC_CONTROLS_JS"
file="chromeos/os_people_page/os_sync_controls.js"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_OS_SYNC_CONTROLS_HTML"
file="chromeos/os_people_page/os_sync_controls.html"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_PEOPLE_PAGE_SIGNOUT_DIALOG_HTML"
file="people_page/signout_dialog.html"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_PEOPLE_PAGE_SIGNOUT_DIALOG_JS"
file="people_page/signout_dialog.js"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_PEOPLE_PAGE_PROFILE_INFO_BROWSER_PROXY_HTML"
file="people_page/profile_info_browser_proxy.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PEOPLE_PAGE_PROFILE_INFO_BROWSER_PROXY_JS"
file="people_page/profile_info_browser_proxy.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PEOPLE_PAGE_SYNC_BROWSER_PROXY_HTML"
file="people_page/sync_browser_proxy.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PEOPLE_PAGE_SYNC_BROWSER_PROXY_JS"
file="people_page/sync_browser_proxy.js"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_PREF_UTIL_HTML"
file="prefs/pref_util.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PREF_UTIL_JS"
file="prefs/pref_util.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PREFS_HTML"
file="prefs/prefs.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PREFS_JS"
file="prefs/prefs.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PREFS_BEHAVIOR_HTML"
file="prefs/prefs_behavior.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PREFS_BEHAVIOR_JS"
file="prefs/prefs_behavior.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PREFS_TYPES_HTML"
file="prefs/prefs_types.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PREFS_TYPES_JS"
file="prefs/prefs_types.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PRINTING_PAGE_HTML"
file="chromeos/os_printing_page/os_printing_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PRINTING_PAGE_JS"
file="chromeos/os_printing_page/os_printing_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CUPS_PRINTER_TYPES_HTML"
file="chromeos/os_printing_page/cups_printer_types.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CUPS_PRINTER_TYPES_JS"
file="chromeos/os_printing_page/cups_printer_types.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CUPS_PRINTER_SHARED_CSS_HTML"
file="chromeos/os_printing_page/cups_printer_shared_css.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CUPS_PRINTING_PAGE_HTML"
file="chromeos/os_printing_page/cups_printers.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CUPS_PRINTING_PAGE_JS"
file="chromeos/os_printing_page/cups_printers.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CUPS_PRINTERS_BROWSER_PROXY_HTML"
file="chromeos/os_printing_page/cups_printers_browser_proxy.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CUPS_PRINTERS_BROWSER_PROXY_JS"
file="chromeos/os_printing_page/cups_printers_browser_proxy.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CUPS_PRINTERS_ENTRY_HTML"
file="chromeos/os_printing_page/cups_printers_entry.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CUPS_PRINTERS_ENTRY_JS"
file="chromeos/os_printing_page/cups_printers_entry.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CUPS_PRINTERS_ENTRY_LIST_BEHAVIOR_HTML"
file="chromeos/os_printing_page/cups_printers_entry_list_behavior.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CUPS_PRINTERS_ENTRY_LIST_BEHAVIOR_JS"
file="chromeos/os_printing_page/cups_printers_entry_list_behavior.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CUPS_PRINTERS_ENTRY_MANAGER_HTML"
file="chromeos/os_printing_page/cups_printers_entry_manager.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CUPS_PRINTERS_ENTRY_MANAGER_JS"
file="chromeos/os_printing_page/cups_printers_entry_manager.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CUPS_EDIT_PRINTER_DIALOG_HTML"
file="chromeos/os_printing_page/cups_edit_printer_dialog.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CUPS_EDIT_PRINTER_DIALOG_JS"
file="chromeos/os_printing_page/cups_edit_printer_dialog.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
+ <structure name="IDR_OS_SETTINGS_CUPS_SETTINGS_ADD_PRINTER_DIALOG_HTML"
+ file="chromeos/os_printing_page/cups_settings_add_printer_dialog.html"
+ compress="false" type="chrome_html" />
+ <structure name="IDR_OS_SETTINGS_CUPS_SETTINGS_ADD_PRINTER_DIALOG_JS"
+ file="chromeos/os_printing_page/cups_settings_add_printer_dialog.js"
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CUPS_ADD_PRINTER_DIALOG_HTML"
file="chromeos/os_printing_page/cups_add_printer_dialog.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CUPS_ADD_PRINTER_DIALOG_JS"
file="chromeos/os_printing_page/cups_add_printer_dialog.js"
- type="chrome_html" />
- <structure name="IDR_OS_SETTINGS_CUPS_ADD_PRINTER_DIALOG_ELEMENTS_HTML"
- file="chromeos/os_printing_page/cups_add_printer_dialog_elements.html"
- type="chrome_html" />
- <structure name="IDR_OS_SETTINGS_CUPS_ADD_PRINTER_DIALOG_ELEMENTS_JS"
- file="chromeos/os_printing_page/cups_add_printer_dialog_elements.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
+ <structure name="IDR_OS_SETTINGS_CUPS_ADD_PRINT_SERVER_DIALOG_HTML"
+ file="chromeos/os_printing_page/cups_add_print_server_dialog.html"
+ compress="false" type="chrome_html" />
+ <structure name="IDR_OS_SETTINGS_CUPS_ADD_PRINT_SERVER_DIALOG_JS"
+ file="chromeos/os_printing_page/cups_add_print_server_dialog.js"
+ compress="false" type="chrome_html" />
+ <structure name="IDR_OS_SETTINGS_CUPS_PRINTER_DIALOG_ERROR_HTML"
+ file="chromeos/os_printing_page/cups_printer_dialog_error.html"
+ compress="false" type="chrome_html" />
+ <structure name="IDR_OS_SETTINGS_CUPS_PRINTER_DIALOG_ERROR_JS"
+ file="chromeos/os_printing_page/cups_printer_dialog_error.js"
+ compress="false" type="chrome_html" />
+ <structure name="IDR_OS_SETTINGS_CUPS_ADD_PRINTER_MANUFACTURER_MODEL_DIALOG_HTML"
+ file="chromeos/os_printing_page/cups_add_printer_manufacturer_model_dialog.html"
+ compress="false" type="chrome_html" />
+ <structure name="IDR_OS_SETTINGS_CUPS_ADD_PRINTER_MANUFACTURER_MODEL_DIALOG_JS"
+ file="chromeos/os_printing_page/cups_add_printer_manufacturer_model_dialog.js"
+ compress="false" type="chrome_html" />
+ <structure name="IDR_OS_SETTINGS_CUPS_ADD_PRINTER_MANUALLY_DIALOG_HTML"
+ file="chromeos/os_printing_page/cups_add_printer_manually_dialog.html"
+ compress="false" type="chrome_html" />
+ <structure name="IDR_OS_SETTINGS_CUPS_ADD_PRINTER_MANUALLY_DIALOG_JS"
+ file="chromeos/os_printing_page/cups_add_printer_manually_dialog.js"
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CUPS_PRINTER_DIALOG_UTIL_HTML"
file="chromeos/os_printing_page/cups_printer_dialog_util.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CUPS_PRINTER_DIALOG_UTIL_JS"
file="chromeos/os_printing_page/cups_printer_dialog_util.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CUPS_SAVED_PRINTERS_HTML"
file="chromeos/os_printing_page/cups_saved_printers.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CUPS_SAVED_PRINTERS_JS"
file="chromeos/os_printing_page/cups_saved_printers.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CUPS_NEARBY_PRINTERS_HTML"
file="chromeos/os_printing_page/cups_nearby_printers.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CUPS_NEARBY_PRINTERS_JS"
file="chromeos/os_printing_page/cups_nearby_printers.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_OS_PAGE_VISIBILITY_HTML"
file="chromeos/os_page_visibility.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_OS_PAGE_VISIBILITY_JS"
file="chromeos/os_page_visibility.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<!-- TODO(jamescook): Remove after sync settings is forked. -->
<structure name="IDR_OS_SETTINGS_PERSONALIZATION_OPTIONS_HTML"
file="privacy_page/personalization_options.html"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_PERSONALIZATION_OPTIONS_JS"
file="privacy_page/personalization_options.js"
preprocess="true"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<!-- TODO(jamescook): Remove after sync settings is forked. -->
<structure name="IDR_OS_SETTINGS_PRIVACY_PAGE_BROWSER_PROXY_HTML"
file="privacy_page/privacy_page_browser_proxy.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PRIVACY_PAGE_BROWSER_PROXY_JS"
file="privacy_page/privacy_page_browser_proxy.js"
preprocess="true"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_OS_PRIVACY_PAGE_HTML"
file="chromeos/os_privacy_page/os_privacy_page.html"
- type="chrome_html"
+ compress="false" type="chrome_html"
flattenhtml="true"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_OS_PRIVACY_PAGE_JS"
file="chromeos/os_privacy_page/os_privacy_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_OS_ROUTE_HTML"
file="chromeos/os_route.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_OS_ROUTE_JS"
file="chromeos/os_route.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_ROUTER_HTML"
file="router.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_ROUTER_JS"
file="router.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_ROUTE_ORIGIN_BEHAVIOR_HTML"
file="chromeos/route_origin_behavior.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_ROUTE_ORIGIN_BEHAVIOR_JS"
file="chromeos/route_origin_behavior.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_SEARCH_ENGINES_BROWSER_PROXY_JS"
file="search_engines_page/search_engines_browser_proxy.js"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_SEARCH_ENGINES_BROWSER_PROXY_HTML"
file="search_engines_page/search_engines_browser_proxy.html"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_GOOGLE_ASSISTANT_PAGE_GOOGLE_ASSISTANT_PAGE_JS"
file="chromeos/google_assistant_page/google_assistant_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_GOOGLE_ASSISTANT_PAGE_GOOGLE_ASSISTANT_PAGE_HTML"
file="chromeos/google_assistant_page/google_assistant_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_GOOGLE_ASSISTANT_PAGE_GOOGLE_ASSISTANT_BROWSER_PROXY_JS"
file="chromeos/google_assistant_page/google_assistant_browser_proxy.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_GOOGLE_ASSISTANT_PAGE_GOOGLE_ASSISTANT_BROWSER_PROXY_HTML"
file="chromeos/google_assistant_page/google_assistant_browser_proxy.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_SEARCH_PAGE_JS"
file="chromeos/os_search_page/os_search_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_SEARCH_PAGE_HTML"
file="chromeos/os_search_page/os_search_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_SYNC_CONTROLS_JS"
file="people_page/sync_controls.js"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_SYNC_CONTROLS_HTML"
file="people_page/sync_controls.html"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<!-- TODO(jamescook): Remove when SplitSettingsSync is the default. -->
<structure name="IDR_OS_SETTINGS_SYNC_ENCRYPTION_OPTIONS_JS"
file="people_page/sync_encryption_options.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_SYNC_ENCRYPTION_OPTIONS_HTML"
file="people_page/sync_encryption_options.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_SYNC_PAGE_JS"
file="people_page/sync_page.js"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_SYNC_PAGE_HTML"
file="people_page/sync_page.html"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_SETTINGS_PEOPLE_PAGE_SYNC_ACCOUNT_CONTROL_HTML"
file="people_page/sync_account_control.html"
- type="chrome_html"
+ compress="false" type="chrome_html"
flattenhtml="true"
allowexternalscript="true" />
<structure name="IDR_SETTINGS_PEOPLE_PAGE_SYNC_ACCOUNT_CONTROL_JS"
file="people_page/sync_account_control.js"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_SETTINGS_HTML"
file="chromeos/os_settings.html"
preprocess="true"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_LAZY_LOAD_HTML"
file="chromeos/lazy_load.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_ANDROID_APPS_SUBPAGE_HTML"
file="chromeos/os_apps_page/android_apps_subpage.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_ANDROID_APPS_SUBPAGE_JS"
file="chromeos/os_apps_page/android_apps_subpage.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_ANDROID_APPS_BROWSER_PROXY_JS"
file="chromeos/os_apps_page/android_apps_browser_proxy.js"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_ANDROID_APPS_BROWSER_PROXY_HTML"
file="chromeos/os_apps_page/android_apps_browser_proxy.html"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_CROSTINI_PAGE_HTML"
file="chromeos/crostini_page/crostini_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CROSTINI_PAGE_JS"
file="chromeos/crostini_page/crostini_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CROSTINI_SUBPAGE_HTML"
file="chromeos/crostini_page/crostini_subpage.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CROSTINI_SUBPAGE_JS"
file="chromeos/crostini_page/crostini_subpage.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CROSTINI_ARC_ADB_HTML"
file="chromeos/crostini_page/crostini_arc_adb.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CROSTINI_ARC_ADB_JS"
file="chromeos/crostini_page/crostini_arc_adb.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CROSTINI_ARC_ADB_CONFIRMATION_DIALOG_HTML"
file="chromeos/crostini_page/crostini_arc_adb_confirmation_dialog.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CROSTINI_ARC_ADB_CONFIRMATION_DIALOG_JS"
file="chromeos/crostini_page/crostini_arc_adb_confirmation_dialog.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CROSTINI_DISK_RESIZE_DIALOG_HTML"
file="chromeos/crostini_page/crostini_disk_resize_dialog.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CROSTINI_DISK_RESIZE_DIALOG_JS"
file="chromeos/crostini_page/crostini_disk_resize_dialog.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
+ <structure name="IDR_OS_SETTINGS_CROSTINI_DISK_RESIZE_CONFIRMATION_DIALOG_HTML"
+ file="chromeos/crostini_page/crostini_disk_resize_confirmation_dialog.html"
+ compress="false" type="chrome_html" />
+ <structure name="IDR_OS_SETTINGS_CROSTINI_DISK_RESIZE_CONFIRMATION_DIALOG_JS"
+ file="chromeos/crostini_page/crostini_disk_resize_confirmation_dialog.js"
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CROSTINI_EXPORT_IMPORT_HTML"
file="chromeos/crostini_page/crostini_export_import.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CROSTINI_EXPORT_IMPORT_JS"
file="chromeos/crostini_page/crostini_export_import.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CROSTINI_PORT_FORWARDING_HTML"
file="chromeos/crostini_page/crostini_port_forwarding.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CROSTINI_PORT_FORWARDING_ADD_PORT_DIALOG_HTML"
file="chromeos/crostini_page/crostini_port_forwarding_add_port_dialog.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CROSTINI_PORT_FORWARDING_ADD_PORT_DIALOG_JS"
file="chromeos/crostini_page/crostini_port_forwarding_add_port_dialog.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CROSTINI_PORT_FORWARDING_JS"
file="chromeos/crostini_page/crostini_port_forwarding.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CROSTINI_MIC_SHARING_DIALOG_HTML"
file="chromeos/crostini_page/crostini_mic_sharing_dialog.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CROSTINI_MIC_SHARING_DIALOG_JS"
file="chromeos/crostini_page/crostini_mic_sharing_dialog.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CROSTINI_SHARED_PATHS_HTML"
file="chromeos/crostini_page/crostini_shared_paths.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CROSTINI_SHARED_PATHS_JS"
file="chromeos/crostini_page/crostini_shared_paths.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CROSTINI_SHARED_USB_DEVICES_HTML"
file="chromeos/crostini_page/crostini_shared_usb_devices.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CROSTINI_SHARED_USB_DEVICES_JS"
file="chromeos/crostini_page/crostini_shared_usb_devices.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_CROSTINI_BROWSER_PROXY_JS"
file="chromeos/crostini_page/crostini_browser_proxy.js"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_CROSTINI_BROWSER_PROXY_HTML"
file="chromeos/crostini_page/crostini_browser_proxy.html"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_SETTINGS_CROSTINI_IMPORT_CONFIRMATION_DIALOG_HTML"
file="chromeos/crostini_page/crostini_import_confirmation_dialog.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_SETTINGS_CROSTINI_IMPORT_CONFIRMATION_DIALOG_JS"
file="chromeos/crostini_page/crostini_import_confirmation_dialog.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_BLUETOOTH_DEVICE_LIST_ITEM_HTML"
file="chromeos/bluetooth_page/bluetooth_device_list_item.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_BLUETOOTH_DEVICE_LIST_ITEM_JS"
file="chromeos/bluetooth_page/bluetooth_device_list_item.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_BLUETOOTH_PAGE_HTML"
file="chromeos/bluetooth_page/bluetooth_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_BLUETOOTH_PAGE_JS"
file="chromeos/bluetooth_page/bluetooth_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_BLUETOOTH_SUBPAGE_HTML"
file="chromeos/bluetooth_page/bluetooth_subpage.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_BLUETOOTH_SUBPAGE_JS"
file="chromeos/bluetooth_page/bluetooth_subpage.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DATE_TIME_PAGE_HTML"
file="chromeos/date_time_page/date_time_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DATE_TIME_PAGE_JS"
file="chromeos/date_time_page/date_time_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DATE_TIME_TYPES_HTML"
file="chromeos/date_time_page/date_time_types.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_DATE_TIME_TYPES_JS"
file="chromeos/date_time_page/date_time_types.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_TIMEZONE_SELECTOR_HTML"
file="chromeos/date_time_page/timezone_selector.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_TIMEZONE_SELECTOR_JS"
file="chromeos/date_time_page/timezone_selector.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_TIMEZONE_SUBPAGE_HTML"
file="chromeos/date_time_page/timezone_subpage.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_TIMEZONE_SUBPAGE_JS"
file="chromeos/date_time_page/timezone_subpage.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_INTERNET_CONFIG_HTML"
file="chromeos/internet_page/internet_config.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_INTERNET_CONFIG_JS"
file="chromeos/internet_page/internet_config.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_INTERNET_DETAIL_PAGE_HTML"
file="chromeos/internet_page/internet_detail_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_INTERNET_DETAIL_PAGE_JS"
file="chromeos/internet_page/internet_detail_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_INTERNET_KNOWN_NETWORKS_PAGE_HTML"
file="chromeos/internet_page/internet_known_networks_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_INTERNET_KNOWN_NETWORKS_PAGE_JS"
file="chromeos/internet_page/internet_known_networks_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_INTERNET_PAGE_BROWSER_PROXY_HTML"
file="chromeos/internet_page/internet_page_browser_proxy.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_INTERNET_PAGE_BROWSER_PROXY_JS"
file="chromeos/internet_page/internet_page_browser_proxy.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_INTERNET_PAGE_HTML"
file="chromeos/internet_page/internet_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_INTERNET_PAGE_JS"
file="chromeos/internet_page/internet_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_INTERNET_SHARED_CSS_HTML"
file="chromeos/internet_page/internet_shared_css.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_INTERNET_SUBPAGE_HTML"
file="chromeos/internet_page/internet_subpage.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_INTERNET_SUBPAGE_JS"
file="chromeos/internet_page/internet_subpage.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MULTIDEVICE_BROWSER_PROXY_HTML"
file="chromeos/multidevice_page/multidevice_browser_proxy.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MULTIDEVICE_BROWSER_PROXY_JS"
file="chromeos/multidevice_page/multidevice_browser_proxy.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MULTIDEVICE_CONSTANTS_HTML"
file="chromeos/multidevice_page/multidevice_constants.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MULTIDEVICE_CONSTANTS_JS"
file="chromeos/multidevice_page/multidevice_constants.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MULTIDEVICE_FEATURE_BEHAVIOR_HTML"
file="chromeos/multidevice_page/multidevice_feature_behavior.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MULTIDEVICE_FEATURE_BEHAVIOR_JS"
file="chromeos/multidevice_page/multidevice_feature_behavior.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MULTIDEVICE_FEATURE_ITEM_HTML"
file="chromeos/multidevice_page/multidevice_feature_item.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MULTIDEVICE_FEATURE_ITEM_JS"
file="chromeos/multidevice_page/multidevice_feature_item.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MULTIDEVICE_FEATURE_TOGGLE_HTML"
file="chromeos/multidevice_page/multidevice_feature_toggle.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MULTIDEVICE_FEATURE_TOGGLE_JS"
file="chromeos/multidevice_page/multidevice_feature_toggle.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MULTIDEVICE_PAGE_HTML"
file="chromeos/multidevice_page/multidevice_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MULTIDEVICE_PAGE_JS"
file="chromeos/multidevice_page/multidevice_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MULTIDEVICE_RADIO_BUTTON_HTML"
file="chromeos/multidevice_page/multidevice_radio_button.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MULTIDEVICE_RADIO_BUTTON_JS"
file="chromeos/multidevice_page/multidevice_radio_button.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MULTIDEVICE_SMARTLOCK_SUBPAGE_HTML"
file="chromeos/multidevice_page/multidevice_smartlock_subpage.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MULTIDEVICE_SMARTLOCK_SUBPAGE_JS"
file="chromeos/multidevice_page/multidevice_smartlock_subpage.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MULTIDEVICE_SUBPAGE_HTML"
file="chromeos/multidevice_page/multidevice_subpage.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MULTIDEVICE_SUBPAGE_JS"
file="chromeos/multidevice_page/multidevice_subpage.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MULTIDEVICE_TETHER_ITEM_HTML"
file="chromeos/multidevice_page/multidevice_tether_item.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MULTIDEVICE_TETHER_ITEM_JS"
file="chromeos/multidevice_page/multidevice_tether_item.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_NETWORK_PROXY_SECTION_HTML"
file="chromeos/internet_page/network_proxy_section.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_NETWORK_PROXY_SECTION_JS"
file="chromeos/internet_page/network_proxy_section.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_NETWORK_SUMMARY_HTML"
file="chromeos/internet_page/network_summary.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_NETWORK_SUMMARY_JS"
file="chromeos/internet_page/network_summary.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_NETWORK_SUMMARY_ITEM_HTML"
file="chromeos/internet_page/network_summary_item.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_NETWORK_SUMMARY_ITEM_JS"
file="chromeos/internet_page/network_summary_item.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_TETHER_CONNECTION_DIALOG_HTML"
file="chromeos/internet_page/tether_connection_dialog.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_TETHER_CONNECTION_DIALOG_JS"
file="chromeos/internet_page/tether_connection_dialog.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PARENTAL_CONTROLS_BROWSER_PROXY_HTML"
file="chromeos/parental_controls_page/parental_controls_browser_proxy.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PARENTAL_CONTROLS_BROWSER_PROXY_JS"
file="chromeos/parental_controls_page/parental_controls_browser_proxy.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PARENTAL_CONTROLS_PAGE_HTML"
file="chromeos/parental_controls_page/parental_controls_page.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PARENTAL_CONTROLS_PAGE_JS"
file="chromeos/parental_controls_page/parental_controls_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PEOPLE_PAGE_ACCOUNT_MANAGER_HTML"
file="chromeos/os_people_page/account_manager.html"
- type="chrome_html"/>
+ compress="false" type="chrome_html"/>
<structure name="IDR_OS_SETTINGS_PEOPLE_PAGE_ACCOUNT_MANAGER_JS"
file="chromeos/os_people_page/account_manager.js"
- type="chrome_html"/>
+ compress="false" type="chrome_html"/>
<structure name="IDR_OS_SETTINGS_PEOPLE_PAGE_ACCOUNT_MANAGER_BROWSER_PROXY_HTML"
file="people_page/account_manager_browser_proxy.html"
- type="chrome_html"/>
+ compress="false" type="chrome_html"/>
<structure name="IDR_OS_SETTINGS_PEOPLE_PAGE_ACCOUNT_MANAGER_BROWSER_PROXY_JS"
file="people_page/account_manager_browser_proxy.js"
- type="chrome_html"/>
+ compress="false" type="chrome_html"/>
<structure name="IDR_OS_SETTINGS_PERSONALIZATION_PAGE_CHANGE_PICTURE_HTML"
file="chromeos/personalization_page/change_picture.html"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_PERSONALIZATION_PAGE_CHANGE_PICTURE_JS"
file="chromeos/personalization_page/change_picture.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PERSONALIZATION_PAGE_CHANGE_PICTURE_BROWSER_PROXY_JS"
file="chromeos/personalization_page/change_picture_browser_proxy.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PERSONALIZATION_PAGE_CHANGE_PICTURE_BROWSER_PROXY_HTML"
file="chromeos/personalization_page/change_picture_browser_proxy.html"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_PEOPLE_PAGE_KERBEROS_ACCOUNTS_HTML"
file="chromeos/os_people_page/kerberos_accounts.html"
- type="chrome_html"/>
+ compress="false" type="chrome_html"/>
<structure name="IDR_OS_SETTINGS_PEOPLE_PAGE_KERBEROS_ACCOUNTS_JS"
file="chromeos/os_people_page/kerberos_accounts.js"
- type="chrome_html"/>
+ compress="false" type="chrome_html"/>
<structure name="IDR_OS_SETTINGS_PEOPLE_PAGE_KERBEROS_ADD_ACCOUNT_DIALOG_HTML"
file="chromeos/os_people_page/kerberos_add_account_dialog.html"
- type="chrome_html"/>
+ compress="false" type="chrome_html"/>
<structure name="IDR_OS_SETTINGS_PEOPLE_PAGE_KERBEROS_ADD_ACCOUNT_DIALOG_JS"
file="chromeos/os_people_page/kerberos_add_account_dialog.js"
- type="chrome_html"/>
+ compress="false" type="chrome_html"/>
<structure name="IDR_OS_SETTINGS_PEOPLE_PAGE_KEREROS_ACCOUNTS_BROWSER_PROXY_HTML"
file="chromeos/os_people_page/kerberos_accounts_browser_proxy.html"
- type="chrome_html"/>
+ compress="false" type="chrome_html"/>
<structure name="IDR_OS_SETTINGS_PEOPLE_PAGE_KEREROS_ACCOUNTS_BROWSER_PROXY_JS"
file="chromeos/os_people_page/kerberos_accounts_browser_proxy.js"
- type="chrome_html"/>
+ compress="false" type="chrome_html"/>
<structure name="IDR_OS_SETTINGS_PEOPLE_LOCK_SCREEN_PASSWORD_PROMPT_DIALOG_JS"
file="chromeos/os_people_page/lock_screen_password_prompt_dialog.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PEOPLE_LOCK_SCREEN_PASSWORD_PROMPT_DIALOG_HTML"
file="chromeos/os_people_page/lock_screen_password_prompt_dialog.html"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_PEOPLE_LOCK_SCREEN_JS"
file="chromeos/os_people_page/lock_screen.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PEOPLE_LOCK_SCREEN_HTML"
file="chromeos/os_people_page/lock_screen.html"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_PEOPLE_LOCK_STATE_BEHAVIOR_JS"
file="chromeos/os_people_page/lock_state_behavior.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PEOPLE_LOCK_STATE_BEHAVIOR_HTML"
file="chromeos/os_people_page/lock_state_behavior.html"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_PEOPLE_SETUP_PIN_DIALOG_JS"
file="chromeos/os_people_page/setup_pin_dialog.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PEOPLE_SETUP_PIN_DIALOG_HTML"
file="chromeos/os_people_page/setup_pin_dialog.html"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_PEOPLE_FINGERPRINT_LIST_JS"
file="chromeos/os_people_page/fingerprint_list.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PEOPLE_FINGERPRINT_LIST_HTML"
file="chromeos/os_people_page/fingerprint_list.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PEOPLE_SETUP_FINGERPRINT_DIALOG_JS"
file="chromeos/os_people_page/setup_fingerprint_dialog.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PEOPLE_SETUP_FINGERPRINT_DIALOG_HTML"
file="chromeos/os_people_page/setup_fingerprint_dialog.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PEOPLE_FINGERPRINT_BROWSER_PROXY_JS"
file="chromeos/os_people_page/fingerprint_browser_proxy.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_PEOPLE_FINGERPRINT_BROWSER_PROXY_HTML"
file="chromeos/os_people_page/fingerprint_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_OS_SETTINGS_PLUGIN_VM_PAGE_HTML"
- file="chromeos/plugin_vm_page/plugin_vm_page.html"
- type="chrome_html" />
- <structure name="IDR_OS_SETTINGS_PLUGIN_VM_PAGE_JS"
- file="chromeos/plugin_vm_page/plugin_vm_page.js"
- type="chrome_html" />
- <structure name="IDR_OS_SETTINGS_PLUGIN_VM_SHARED_PATHS_HTML"
- file="chromeos/plugin_vm_page/plugin_vm_shared_paths.html"
- type="chrome_html" />
- <structure name="IDR_OS_SETTINGS_PLUGIN_VM_SHARED_PATHS_JS"
- file="chromeos/plugin_vm_page/plugin_vm_shared_paths.js"
- type="chrome_html" />
- <structure name="IDR_OS_SETTINGS_PLUGIN_VM_SUBPAGE_HTML"
- file="chromeos/plugin_vm_page/plugin_vm_subpage.html"
- type="chrome_html" />
- <structure name="IDR_OS_SETTINGS_PLUGIN_VM_SUBPAGE_JS"
- file="chromeos/plugin_vm_page/plugin_vm_subpage.js"
- type="chrome_html" />
- <structure name="IDR_OS_SETTINGS_PLUGIN_VM_BROWSER_PROXY_JS"
- file="chromeos/plugin_vm_page/plugin_vm_browser_proxy.js"
- type="chrome_html" />
- <structure name="IDR_OS_SETTINGS_PLUGIN_VM_BROWSER_PROXY_HTML"
- file="chromeos/plugin_vm_page/plugin_vm_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_OS_SETTINGS_PLUGIN_VM_REMOVE_CONFIRMATION_DIALOG_JS"
- file="chromeos/plugin_vm_page/plugin_vm_remove_confirmation_dialog.js"
- type="chrome_html" />
- <structure name="IDR_OS_SETTINGS_PLUGIN_VM_REMOVE_CONFIRMATION_DIALOG_HTML"
- file="chromeos/plugin_vm_page/plugin_vm_remove_confirmation_dialog.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_USERS_PAGE_ADD_USER_DIALOG_JS"
file="chromeos/os_people_page/users_add_user_dialog.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_USERS_PAGE_ADD_USER_DIALOG_HTML"
file="chromeos/os_people_page/users_add_user_dialog.html"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_USERS_PAGE_USER_LIST_JS"
file="chromeos/os_people_page/user_list.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_USERS_PAGE_USER_LIST_HTML"
file="chromeos/os_people_page/user_list.html"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_USERS_PAGE_JS"
file="chromeos/os_people_page/users_page.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_USERS_PAGE_HTML"
file="chromeos/os_people_page/users_page.html"
- type="chrome_html"
+ compress="false" type="chrome_html"
preprocess="true" />
<structure name="IDR_OS_SETTINGS_WALLPAPER_BROWSER_PROXY_HTML"
file="chromeos/personalization_page/wallpaper_browser_proxy.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_WALLPAPER_BROWSER_PROXY_JS"
file="chromeos/personalization_page/wallpaper_browser_proxy.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_METRICS_RECORDER_HTML"
file="chromeos/metrics_recorder.html"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
<structure name="IDR_OS_SETTINGS_METRICS_RECORDER_JS"
file="chromeos/metrics_recorder.js"
- type="chrome_html" />
+ compress="false" type="chrome_html" />
+ <structure name="IDR_OS_SETTINGS_SEARCH_HANDLER_HTML"
+ file="chromeos/search_handler.html"
+ compress="false" type="chrome_html" />
+ <structure name="IDR_OS_SETTINGS_SEARCH_HANDLER_JS"
+ file="chromeos/search_handler.js"
+ compress="false" type="chrome_html" />
</structures>
</release>
</grit>
diff --git a/chromium/chrome/browser/resources/settings/os_settings_resources_vulcanized.grd b/chromium/chrome/browser/resources/settings/os_settings_resources_vulcanized.grd
index 4518589cb40..88da13ccd00 100644
--- a/chromium/chrome/browser/resources/settings/os_settings_resources_vulcanized.grd
+++ b/chromium/chrome/browser/resources/settings/os_settings_resources_vulcanized.grd
@@ -43,6 +43,16 @@
type="BINDATA"
compress="gzip" />
+ <!-- Constants -->
+ <include name="IDR_OS_SETTINGS_ROUTES_MOJOM_LITE_JS"
+ file="${root_gen_dir}\chrome\browser\ui\webui\settings\chromeos\constants\routes.mojom-lite.js"
+ use_base_dir="false"
+ type="BINDATA" />
+ <include name="IDR_OS_SETTINGS_SETTING_MOJOM_LITE_JS"
+ file="${root_gen_dir}\chrome\browser\ui\webui\settings\chromeos\constants\setting.mojom-lite.js"
+ use_base_dir="false"
+ type="BINDATA" />
+
<!-- App Management -->
<include name="IDR_OS_SETTINGS_APP_MANAGEMENT_BITMAP_MOJO_LITE_JS"
file="${root_gen_dir}\skia\public\mojom\bitmap.mojom-lite.js"
diff --git a/chromium/chrome/browser/resources/settings/people_page/BUILD.gn b/chromium/chrome/browser/resources/settings/people_page/BUILD.gn
index 526c7543251..efc53f2116e 100644
--- a/chromium/chrome/browser/resources/settings/people_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/people_page/BUILD.gn
@@ -3,13 +3,13 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/polymer/html_to_js.gni")
import("//tools/polymer/polymer.gni")
import("//ui/webui/resources/tools/js_modulizer.gni")
import("../settings.gni")
js_type_check("closure_compile") {
deps = [
- ":people_page",
":profile_info_browser_proxy",
":signout_dialog",
":sync_account_control",
@@ -19,15 +19,6 @@ js_type_check("closure_compile") {
":sync_page",
]
- if (!is_chromeos) {
- deps += [
- ":import_data_browser_proxy",
- ":import_data_dialog",
- ":manage_profile",
- ":manage_profile_browser_proxy",
- ]
- }
-
if (is_chromeos) {
deps += [ ":account_manager_browser_proxy" ]
}
@@ -37,50 +28,6 @@ js_library("account_manager_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr" ]
}
-js_library("import_data_browser_proxy") {
- deps = [ "//ui/webui/resources/js:cr" ]
-}
-
-js_library("manage_profile") {
- deps = [
- ":manage_profile_browser_proxy",
- ":sync_browser_proxy",
- "..:route",
- "..:router",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
-}
-
-js_library("manage_profile_browser_proxy") {
- deps = [
- "//ui/webui/resources/cr_elements/cr_profile_avatar_selector:cr_profile_avatar_selector",
- "//ui/webui/resources/js:cr",
- ]
-}
-
-js_library("people_page") {
- deps = [
- ":profile_info_browser_proxy",
- ":signout_dialog",
- ":sync_browser_proxy",
- "..:open_window_proxy",
- "..:page_visibility",
- "..:route",
- "..:router",
- "../settings_page:settings_animated_pages",
- "//ui/webui/resources/cr_components/chromeos/quick_unlock:lock_screen_constants",
- "//ui/webui/resources/cr_elements/chromeos/cr_picture:png",
- "//ui/webui/resources/cr_elements/cr_toast:cr_toast",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:icon",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- "//ui/webui/resources/js/cr/ui:focus_without_ink",
- ]
-}
-
js_library("profile_info_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr" ]
}
@@ -103,8 +50,6 @@ js_library("sync_page") {
":sync_account_control",
":sync_browser_proxy",
":sync_encryption_options",
- "..:page_visibility",
- "..:router",
"../settings_page:settings_animated_pages",
"//ui/webui/resources/cr_elements/cr_expand_button:cr_expand_button",
"//ui/webui/resources/cr_elements/cr_input:cr_input",
@@ -128,16 +73,6 @@ js_library("sync_controls") {
deps = [ "..:router" ]
}
-js_library("import_data_dialog") {
- deps = [
- ":import_data_browser_proxy",
- "../controls:settings_checkbox",
- "../prefs:prefs_behavior",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
-}
-
js_library("sync_account_control") {
deps = [
":profile_info_browser_proxy",
@@ -163,9 +98,10 @@ js_library("sync_encryption_options") {
js_type_check("closure_compile_module") {
is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [
":account_manager_browser_proxy.m",
- ":people_page.m",
+ ":people_page",
":profile_info_browser_proxy.m",
":signout_dialog.m",
":sync_account_control.m",
@@ -177,10 +113,10 @@ js_type_check("closure_compile_module") {
if (!is_chromeos) {
deps += [
- ":import_data_browser_proxy.m",
- ":import_data_dialog.m",
- ":manage_profile.m",
- ":manage_profile_browser_proxy.m",
+ ":import_data_browser_proxy",
+ ":import_data_dialog",
+ ":manage_profile",
+ ":manage_profile_browser_proxy",
]
}
}
@@ -192,59 +128,50 @@ js_library("account_manager_browser_proxy.m") {
}
if (!is_chromeos) {
- js_library("import_data_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/people_page/import_data_browser_proxy.m.js" ]
+ js_library("import_data_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
externs_list = [ "$externs_path/metrics_private.js" ]
- extra_deps = [ ":modulize" ]
}
- js_library("import_data_dialog.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/people_page/import_data_dialog.m.js" ]
+ js_library("import_data_dialog") {
deps = [
- ":import_data_browser_proxy.m",
- "../controls:settings_checkbox.m",
+ ":import_data_browser_proxy",
+ "../controls:settings_checkbox",
"../prefs:prefs_behavior.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":import_data_dialog_module" ]
}
- js_library("manage_profile.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/people_page/manage_profile.m.js" ]
+ js_library("manage_profile") {
deps = [
- ":manage_profile_browser_proxy.m",
+ ":manage_profile_browser_proxy",
":sync_browser_proxy.m",
- "..:i18n_setup.m",
- "..:route.m",
+ "..:i18n_setup",
+ "..:route",
"..:router.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
- extra_deps = [ ":manage_profile_module" ]
}
- js_library("manage_profile_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/people_page/manage_profile_browser_proxy.m.js" ]
+ js_library("manage_profile_browser_proxy") {
deps = [
"//ui/webui/resources/cr_elements/cr_profile_avatar_selector:cr_profile_avatar_selector.m",
"//ui/webui/resources/js:cr.m",
]
- extra_deps = [ ":modulize" ]
}
}
-js_library("people_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/people_page/people_page.m.js" ]
+js_library("people_page") {
deps = [
":account_manager_browser_proxy.m",
":profile_info_browser_proxy.m",
":sync_browser_proxy.m",
- "..:i18n_setup.m",
- "..:open_window_proxy.m",
- "..:page_visibility.m",
- "..:route.m",
+ "..:i18n_setup",
+ "..:open_window_proxy",
+ "..:page_visibility",
+ "..:route",
"..:router.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/chromeos/cr_picture:png.m",
@@ -254,7 +181,6 @@ js_library("people_page.m") {
"//ui/webui/resources/js:icon.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":people_page_module" ]
}
js_library("profile_info_browser_proxy.m") {
@@ -268,7 +194,7 @@ js_library("signout_dialog.m") {
deps = [
":profile_info_browser_proxy.m",
":sync_browser_proxy.m",
- "..:i18n_setup.m",
+ "..:i18n_setup",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
@@ -280,7 +206,7 @@ js_library("sync_account_control.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/people_page/sync_account_control.m.js" ]
deps = [
":sync_browser_proxy.m",
- "..:i18n_setup.m",
+ "..:i18n_setup",
"..:router.m",
"../prefs:prefs_behavior.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
@@ -301,7 +227,7 @@ js_library("sync_controls.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/people_page/sync_controls.m.js" ]
deps = [
":sync_browser_proxy.m",
- "..:i18n_setup.m",
+ "..:i18n_setup",
"..:router.m",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
@@ -323,7 +249,7 @@ js_library("sync_page.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/people_page/sync_page.m.js" ]
deps = [
":sync_browser_proxy.m",
- "..:i18n_setup.m",
+ "..:i18n_setup",
"..:router.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
@@ -336,69 +262,32 @@ js_library("sync_page.m") {
group("polymer3_elements") {
public_deps = [
":modulize",
- ":people_page_module",
":signout_dialog_module",
":sync_account_control_module",
":sync_controls_module",
":sync_encryption_options_module",
":sync_page_module",
+ ":web_components",
]
+}
+
+html_to_js("web_components") {
+ js_files = [ "people_page.js" ]
if (!is_chromeos) {
- public_deps += [
- ":import_data_dialog_module",
- ":manage_profile_module",
+ js_files += [
+ "import_data_dialog.js",
+ "manage_profile.js",
]
}
}
-polymer_modulizer("import_data_dialog") {
- js_file = "import_data_dialog.js"
- html_file = "import_data_dialog.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [ "chrome/browser/resources/settings/people_page/import_data_browser_proxy.html|ImportDataBrowserProxy,ImportDataBrowserProxyImpl,ImportDataStatus,BrowserProfile" ]
-}
-
-polymer_modulizer("manage_profile") {
- js_file = "manage_profile.js"
- html_file = "manage_profile.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/people_page/manage_profile_browser_proxy.html|ManageProfileBrowserProxy,ManageProfileBrowserProxyImpl,ProfileShortcutStatus",
- "chrome/browser/resources/settings/people_page/sync_browser_proxy.html|SyncStatus",
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/router.html|Router,RouteObserverBehavior",
- "ui/webui/resources/cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.html|AvatarIcon",
- ]
-}
-
-polymer_modulizer("people_page") {
- js_file = "people_page.js"
- html_file = "people_page.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/open_window_proxy.html|OpenWindowProxyImpl",
- "chrome/browser/resources/settings/router.html|Router,RouteObserverBehavior",
- "ui/webui/resources/cr_elements/chromeos/cr_picture/png.html|convertImageSequenceToPng",
- "ui/webui/resources/html/assert.html|assert",
- "ui/webui/resources/html/cr.html|isChromeOS",
- "ui/webui/resources/html/icon.html|getImage",
- "chrome/browser/resources/settings/page_visibility.html|PageVisibility",
- "chrome/browser/resources/settings/people_page/account_manager_browser_proxy.html|AccountManagerBrowserProxyImpl",
- "chrome/browser/resources/settings/people_page/profile_info_browser_proxy.html|ProfileInfoBrowserProxyImpl,ProfileInfoBrowserProxy,ProfileInfo",
- "chrome/browser/resources/settings/people_page/sync_browser_proxy.html|SyncBrowserProxyImpl,SyncBrowserProxy,SyncStatus,StoredAccount",
- ]
-}
-
polymer_modulizer("signout_dialog") {
js_file = "signout_dialog.js"
html_file = "signout_dialog.html"
html_type = "dom-module"
namespace_rewrites = settings_namespace_rewrites
+ migrated_imports = settings_migrated_imports
auto_imports = settings_auto_imports + [
"chrome/browser/resources/settings/people_page/profile_info_browser_proxy.html|ProfileInfoBrowserProxyImpl",
"chrome/browser/resources/settings/people_page/sync_browser_proxy.html|SyncBrowserProxyImpl,SyncStatus",
@@ -410,9 +299,10 @@ polymer_modulizer("sync_account_control") {
html_file = "sync_account_control.html"
html_type = "dom-module"
namespace_rewrites = settings_namespace_rewrites
+ migrated_imports = settings_migrated_imports
auto_imports = settings_auto_imports + [
"chrome/browser/resources/settings/people_page/sync_browser_proxy.html|SyncBrowserProxy,SyncBrowserProxyImpl,SyncStatus,StatusAction,StoredAccount",
- "chrome/browser/resources/settings/router.html|Router",
+ "chrome/browser/resources/settings/router.html|Route,Router",
"ui/webui/resources/html/assert.html|assert",
]
}
@@ -422,6 +312,7 @@ polymer_modulizer("sync_controls") {
html_file = "sync_controls.html"
html_type = "dom-module"
namespace_rewrites = settings_namespace_rewrites
+ migrated_imports = settings_migrated_imports
auto_imports = settings_auto_imports + [
"chrome/browser/resources/settings/router.html|Router,RouteObserverBehavior",
"chrome/browser/resources/settings/people_page/sync_browser_proxy.html|SyncBrowserProxy,SyncBrowserProxyImpl,StatusAction,SyncStatus,SyncPrefs",
@@ -445,9 +336,10 @@ polymer_modulizer("sync_page") {
html_file = "sync_page.html"
html_type = "dom-module"
namespace_rewrites = settings_namespace_rewrites
+ migrated_imports = settings_migrated_imports
auto_imports = settings_auto_imports + [
"ui/webui/resources/html/polymer.html|Polymer,html,flush",
- "chrome/browser/resources/settings/router.html|Router,RouteObserverBehavior",
+ "chrome/browser/resources/settings/router.html|Route,Router,RouteObserverBehavior",
"chrome/browser/resources/settings/people_page/sync_browser_proxy.html|SyncBrowserProxy,SyncBrowserProxyImpl,PageStatus,StatusAction,SyncStatus,SyncPrefs",
"ui/webui/resources/html/assert.html|assert,assertNotReached",
]
@@ -460,12 +352,5 @@ js_modulizer("modulize") {
"sync_browser_proxy.js",
]
- if (!is_chromeos) {
- input_files += [
- "import_data_browser_proxy.js",
- "manage_profile_browser_proxy.js",
- ]
- }
-
namespace_rewrites = settings_namespace_rewrites
}
diff --git a/chromium/chrome/browser/resources/settings/printing_page/BUILD.gn b/chromium/chrome/browser/resources/settings/printing_page/BUILD.gn
index 751b4e43c85..e7fa5f2ee31 100644
--- a/chromium/chrome/browser/resources/settings/printing_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/printing_page/BUILD.gn
@@ -3,11 +3,12 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
-import("//ui/webui/resources/tools/js_modulizer.gni")
+import("//tools/polymer/html_to_js.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [
":cloud_printers",
":printing_page",
@@ -19,88 +20,28 @@ js_type_check("closure_compile") {
}
js_library("cloud_printers") {
-}
-
-js_library("printing_browser_proxy") {
- deps = [ "//ui/webui/resources/js:cr" ]
-}
-
-js_library("printing_page") {
- deps = [
- ":printing_browser_proxy",
- "..:route",
- "..:router",
- "../settings_page:settings_animated_pages",
- ]
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- deps = [
- ":cloud_printers.m",
- ":printing_page.m",
- ]
-
- if (!is_chromeos) {
- deps += [ ":printing_browser_proxy.m" ]
- }
-}
-
-js_library("cloud_printers.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/printing_page/cloud_printers.m.js" ]
deps = [
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
- extra_deps = [ ":cloud_printers_module" ]
}
-js_library("printing_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/printing_page/printing_browser_proxy.m.js" ]
+js_library("printing_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
}
-js_library("printing_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/printing_page/printing_page.m.js" ]
+js_library("printing_page") {
deps = [
- ":printing_browser_proxy.m",
- "..:route.m",
+ ":printing_browser_proxy",
+ "..:route",
"..:router.m",
"../settings_page:settings_animated_pages.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
- extra_deps = [ ":printing_page_module" ]
}
-group("polymer3_elements") {
- public_deps = [
- ":cloud_printers_module",
- ":printing_page_module",
+html_to_js("web_components") {
+ js_files = [
+ "cloud_printers.js",
+ "printing_page.js",
]
-
- if (!is_chromeos) {
- public_deps += [ ":modulize" ]
- }
-}
-
-polymer_modulizer("cloud_printers") {
- js_file = "cloud_printers.js"
- html_file = "cloud_printers.html"
- html_type = "dom-module"
-}
-
-polymer_modulizer("printing_page") {
- js_file = "printing_page.js"
- html_file = "printing_page.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/router.html|Router",
- ]
-}
-
-js_modulizer("modulize") {
- input_files = [ "printing_browser_proxy.js" ]
- namespace_rewrites = settings_namespace_rewrites
}
diff --git a/chromium/chrome/browser/resources/settings/privacy_page/BUILD.gn b/chromium/chrome/browser/resources/settings/privacy_page/BUILD.gn
index 414008552b4..c8b89afc3b5 100644
--- a/chromium/chrome/browser/resources/settings/privacy_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/privacy_page/BUILD.gn
@@ -3,72 +3,24 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/polymer/html_to_js.gni")
import("//tools/polymer/polymer.gni")
import("//ui/webui/resources/tools/js_modulizer.gni")
import("../settings.gni")
js_type_check("closure_compile") {
deps = [
- ":collapse_radio_button",
- ":cookies_page",
- ":disable_safebrowsing_dialog",
- ":do_not_track_toggle",
- ":passwords_leak_detection_toggle",
":personalization_options",
- ":privacy_page",
":privacy_page_browser_proxy",
- ":safe_browsing_browser_proxy",
- ":secure_dns",
- ":secure_dns_input",
- ":security_keys_bio_enroll_dialog",
- ":security_keys_credential_management_dialog",
- ":security_keys_reset_dialog",
- ":security_keys_set_pin_dialog",
- ":security_keys_subpage",
- ":security_page",
- ]
-}
-
-js_library("collapse_radio_button") {
- deps = [
- "//ui/webui/resources/cr_elements/cr_radio_button:cr_radio_button_behavior",
- "//ui/webui/resources/cr_elements/policy:cr_policy_indicator",
- ]
-}
-
-js_library("cookies_page") {
- deps = [
- "..:metrics_browser_proxy",
- "..:route",
- "..:router",
- "../prefs:prefs_behavior",
- "../site_settings:constants",
- "../site_settings:site_settings_prefs_browser_proxy",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- "//ui/webui/resources/js/cr/ui:focus_without_ink",
- ]
-}
-
-js_library("disable_safebrowsing_dialog") {
- deps = [ "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog" ]
-}
-
-js_library("do_not_track_toggle") {
- deps = [
- "..:metrics_browser_proxy",
- "../controls:settings_toggle_button",
- "//ui/webui/resources/js/cr/ui:focus_without_ink",
]
}
js_library("personalization_options") {
deps = [
":privacy_page_browser_proxy",
- "..:page_visibility",
"..:router",
"../controls:settings_toggle_button",
+ "../people_page:signout_dialog",
"../people_page:sync_browser_proxy",
"../prefs:prefs_behavior",
"//ui/webui/resources/js:load_time_data",
@@ -77,16 +29,6 @@ js_library("personalization_options") {
externs_list = [ "$externs_path/settings_private.js" ]
}
-js_library("passwords_leak_detection_toggle") {
- deps = [
- "../people_page:sync_browser_proxy",
- "../prefs:prefs_behavior",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
-}
-
js_library("privacy_page_browser_proxy") {
deps = [
"..:lifetime_browser_proxy",
@@ -95,239 +37,106 @@ js_library("privacy_page_browser_proxy") {
externs_list = [ "$externs_path/chrome_send.js" ]
}
-js_library("privacy_page") {
- deps = [
- ":privacy_page_browser_proxy",
- "..:hats_browser_proxy",
- "..:metrics_browser_proxy",
- "..:page_visibility",
- "..:route",
- "..:router",
- "../controls:settings_toggle_button",
- "../people_page:signout_dialog",
- "../people_page:sync_browser_proxy",
- "../settings_page:settings_animated_pages",
- "../site_settings:constants",
- "../site_settings:site_data_details_subpage",
- "../site_settings:site_settings_prefs_browser_proxy",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- "//ui/webui/resources/js/cr/ui:focus_without_ink",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
-js_library("safe_browsing_browser_proxy") {
- deps = [
- "../site_settings:site_settings_prefs_browser_proxy",
- "//ui/webui/resources/js:cr",
- ]
- externs_list = [ "$externs_path/chrome_send.js" ]
-}
-
-js_library("secure_dns") {
- deps = [
- ":privacy_page_browser_proxy",
- "../prefs:prefs_behavior",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
-js_library("secure_dns_input") {
- deps = [
- ":privacy_page_browser_proxy",
- "//ui/webui/resources/js:load_time_data",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
-js_library("security_keys_browser_proxy") {
- deps = [ "//ui/webui/resources/js:cr" ]
- externs_list = [ "$externs_path/chrome_send.js" ]
-}
-
-js_library("security_keys_subpage") {
- deps = [
- ":security_keys_browser_proxy",
- "..:router",
- "../settings_page:settings_animated_pages",
- "//ui/webui/resources/js:i18n_behavior",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
-js_library("security_keys_set_pin_dialog") {
- deps = [
- ":security_keys_browser_proxy",
- "//third_party/polymer/v1_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer-extracted",
- "//ui/webui/resources/js:i18n_behavior",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
-js_library("security_keys_pin_field") {
- deps = [ "//ui/webui/resources/js:i18n_behavior" ]
-}
-
-js_library("security_keys_credential_management_dialog") {
- deps = [
- ":security_keys_browser_proxy",
- ":security_keys_pin_field",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
-}
-
-js_library("security_keys_reset_dialog") {
- deps = [
- ":security_keys_browser_proxy",
- "//ui/webui/resources/js:i18n_behavior",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
-js_library("security_keys_bio_enroll_dialog") {
- deps = [
- ":security_keys_browser_proxy",
- ":security_keys_pin_field",
- "//third_party/polymer/v1_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer-extracted",
- "//ui/webui/resources/cr_elements/cr_fingerprint:cr_fingerprint_progress_arc",
- "//ui/webui/resources/js:i18n_behavior",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
-js_library("security_page") {
- deps = [
- ":disable_safebrowsing_dialog",
- ":privacy_page_browser_proxy",
- ":safe_browsing_browser_proxy",
- "..:metrics_browser_proxy",
- "..:route",
- "..:router",
- "../people_page:sync_browser_proxy",
- "../prefs:prefs_behavior",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- "//ui/webui/resources/js/cr/ui:focus_without_ink",
- ]
-}
-
js_type_check("closure_compile_module") {
is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [
- ":collapse_radio_button.m",
- ":cookies_page.m",
- ":disable_safebrowsing_dialog.m",
- ":do_not_track_toggle.m",
- ":passwords_leak_detection_toggle.m",
+ ":collapse_radio_button",
+ ":cookies_page",
+ ":disable_safebrowsing_dialog",
+ ":do_not_track_toggle",
+ ":passwords_leak_detection_toggle",
":personalization_options.m",
- ":privacy_page.m",
+ ":privacy_page",
":privacy_page_browser_proxy.m",
- ":safe_browsing_browser_proxy.m",
- ":secure_dns.m",
- ":secure_dns_input.m",
- ":security_keys_bio_enroll_dialog.m",
- ":security_keys_browser_proxy.m",
- ":security_keys_credential_management_dialog.m",
- ":security_keys_pin_field.m",
- ":security_keys_reset_dialog.m",
- ":security_keys_set_pin_dialog.m",
- ":security_keys_subpage.m",
- ":security_page.m",
+ ":safe_browsing_browser_proxy",
+ ":secure_dns",
+ ":secure_dns_input",
+ ":security_keys_bio_enroll_dialog",
+ ":security_keys_browser_proxy",
+ ":security_keys_credential_management_dialog",
+ ":security_keys_pin_field",
+ ":security_keys_reset_dialog",
+ ":security_keys_set_pin_dialog",
+ ":security_keys_subpage",
+ ":security_page",
]
}
-js_library("cookies_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/cookies_page.m.js" ]
+js_library("cookies_page") {
deps = [
- "..:metrics_browser_proxy.m",
- "..:route.m",
+ ":collapse_radio_button",
+ "..:metrics_browser_proxy",
+ "..:route",
"..:router.m",
+ "../controls:settings_toggle_button.m",
"../prefs:prefs_behavior.m",
- "../site_settings:site_settings_prefs_browser_proxy.m",
+ "../site_settings:site_list",
+ "../site_settings:site_settings_prefs_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":cookies_page_module" ]
}
-js_library("collapse_radio_button.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/collapse_radio_button.m.js" ]
+js_library("collapse_radio_button") {
deps = [
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_radio_button:cr_radio_button_behavior.m",
"//ui/webui/resources/cr_elements/policy:cr_policy_indicator_behavior.m",
]
- extra_deps = [ ":collapse_radio_button_module" ]
}
-js_library("secure_dns.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/secure_dns.m.js" ]
+js_library("secure_dns") {
deps = [
":privacy_page_browser_proxy.m",
- "..:i18n_setup.m",
+ "..:i18n_setup",
"../prefs:prefs_behavior.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":secure_dns_module" ]
}
-js_library("secure_dns_input.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/secure_dns_input.m.js" ]
+js_library("secure_dns_input") {
deps = [
":privacy_page_browser_proxy.m",
- "..:i18n_setup.m",
+ "..:i18n_setup",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
- extra_deps = [ ":secure_dns_input_module" ]
}
-js_library("disable_safebrowsing_dialog.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/disable_safebrowsing_dialog.m.js" ]
+js_library("disable_safebrowsing_dialog") {
deps = [
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
]
- extra_deps = [ ":disable_safebrowsing_dialog_module" ]
}
-js_library("do_not_track_toggle.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/do_not_track_toggle.m.js" ]
+js_library("do_not_track_toggle") {
deps = [
- "..:metrics_browser_proxy.m",
+ "..:metrics_browser_proxy",
"../controls:settings_toggle_button.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js/cr/ui:focus_without_ink.m",
]
- extra_deps = [ ":do_not_track_toggle_module" ]
}
-js_library("passwords_leak_detection_toggle.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/passwords_leak_detection_toggle.m.js" ]
+js_library("passwords_leak_detection_toggle") {
deps = [
- "..:metrics_browser_proxy.m",
+ "..:metrics_browser_proxy",
"../people_page:sync_browser_proxy.m",
"../prefs:prefs_behavior.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":passwords_leak_detection_toggle_module" ]
}
js_library("personalization_options.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/personalization_options.m.js" ]
deps = [
":privacy_page_browser_proxy.m",
- "..:i18n_setup.m",
+ "..:i18n_setup",
"..:lifetime_browser_proxy.m",
"../controls:settings_toggle_button.m",
"../people_page:signout_dialog.m",
@@ -339,29 +148,27 @@ js_library("personalization_options.m") {
extra_deps = [ ":personalization_options_module" ]
}
-js_library("privacy_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/privacy_page.m.js" ]
+js_library("privacy_page") {
deps = [
":privacy_page_browser_proxy.m",
- "..:hats_browser_proxy.m",
- "..:i18n_setup.m",
- "..:metrics_browser_proxy.m",
- "..:page_visibility.m",
- "..:route.m",
+ "..:hats_browser_proxy",
+ "..:i18n_setup",
+ "..:metrics_browser_proxy",
+ "..:page_visibility",
+ "..:route",
"..:router.m",
"../controls:settings_toggle_button.m",
"../people_page:sync_browser_proxy.m",
"../prefs:prefs_behavior.m",
- "../site_settings:constants.m",
- "../site_settings:site_data_details_subpage.m",
- "../site_settings:site_settings_prefs_browser_proxy.m",
+ "../site_settings:constants",
+ "../site_settings:site_data_details_subpage",
+ "../site_settings:site_settings_prefs_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
"//ui/webui/resources/js/cr/ui:focus_without_ink.m",
]
- extra_deps = [ ":privacy_page_module" ]
}
js_library("privacy_page_browser_proxy.m") {
@@ -370,20 +177,17 @@ js_library("privacy_page_browser_proxy.m") {
extra_deps = [ ":modulize" ]
}
-js_library("safe_browsing_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/safe_browsing_browser_proxy.m.js" ]
+js_library("safe_browsing_browser_proxy") {
deps = [
- "../site_settings:site_settings_prefs_browser_proxy.m",
+ "../site_settings:site_settings_prefs_browser_proxy",
"//ui/webui/resources/js:cr.m",
]
- extra_deps = [ ":modulize" ]
}
-js_library("security_keys_bio_enroll_dialog.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/security_keys_bio_enroll_dialog.m.js" ]
+js_library("security_keys_bio_enroll_dialog") {
deps = [
- ":security_keys_browser_proxy.m",
- ":security_keys_pin_field.m",
+ ":security_keys_browser_proxy",
+ ":security_keys_pin_field",
"//third_party/polymer/v3_0/components-chromium/iron-a11y-announcer",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_fingerprint:cr_fingerprint_progress_arc.m",
@@ -391,78 +195,64 @@ js_library("security_keys_bio_enroll_dialog.m") {
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":security_keys_bio_enroll_dialog_module" ]
}
-js_library("security_keys_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/security_keys_browser_proxy.m.js" ]
+js_library("security_keys_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
}
-js_library("security_keys_credential_management_dialog.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/security_keys_credential_management_dialog.m.js" ]
+js_library("security_keys_credential_management_dialog") {
deps = [
- ":security_keys_browser_proxy.m",
- ":security_keys_pin_field.m",
+ ":security_keys_browser_proxy",
+ ":security_keys_pin_field",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":security_keys_credential_management_dialog_module" ]
}
-js_library("security_keys_pin_field.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/security_keys_pin_field.m.js" ]
+js_library("security_keys_pin_field") {
deps = [
"//third_party/polymer/v3_0/components-chromium/iron-a11y-announcer",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:i18n_behavior.m",
]
- extra_deps = [ ":security_keys_pin_field_module" ]
}
-js_library("security_keys_reset_dialog.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/security_keys_reset_dialog.m.js" ]
+js_library("security_keys_reset_dialog") {
deps = [
- ":security_keys_browser_proxy.m",
+ ":security_keys_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:i18n_behavior.m",
]
- extra_deps = [ ":security_keys_reset_dialog_module" ]
}
-js_library("security_keys_set_pin_dialog.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/security_keys_set_pin_dialog.m.js" ]
+js_library("security_keys_set_pin_dialog") {
deps = [
- ":security_keys_browser_proxy.m",
+ ":security_keys_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/iron-a11y-announcer",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:i18n_behavior.m",
]
- extra_deps = [ ":security_keys_set_pin_dialog_module" ]
}
-js_library("security_keys_subpage.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/security_keys_subpage.m.js" ]
+js_library("security_keys_subpage") {
deps = [
- "..:i18n_setup.m",
+ "..:i18n_setup",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
]
- extra_deps = [ ":security_keys_subpage_module" ]
}
-js_library("security_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/security_page.m.js" ]
+js_library("security_page") {
deps = [
- ":disable_safebrowsing_dialog.m",
+ ":disable_safebrowsing_dialog",
":privacy_page_browser_proxy.m",
- ":safe_browsing_browser_proxy.m",
- "..:i18n_setup.m",
- "..:metrics_browser_proxy.m",
- "..:route.m",
+ ":safe_browsing_browser_proxy",
+ "..:i18n_setup",
+ "..:metrics_browser_proxy",
+ "..:route",
"..:router.m",
"../people_page:sync_browser_proxy.m",
"../prefs:prefs_behavior.m",
@@ -470,101 +260,34 @@ js_library("security_page.m") {
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js/cr/ui:focus_without_ink.m",
]
- extra_deps = [ ":security_page_module" ]
}
group("polymer3_elements") {
public_deps = [
- ":collapse_radio_button_module",
- ":cookies_page_module",
- ":disable_safebrowsing_dialog_module",
- ":do_not_track_toggle_module",
":modulize",
- ":passwords_leak_detection_toggle_module",
":personalization_options_module",
- ":privacy_page_module",
- ":secure_dns_input_module",
- ":secure_dns_module",
- ":security_keys_bio_enroll_dialog_module",
- ":security_keys_credential_management_dialog_module",
- ":security_keys_pin_field_module",
- ":security_keys_reset_dialog_module",
- ":security_keys_set_pin_dialog_module",
- ":security_keys_subpage_module",
- ":security_page_module",
+ ":v3_ready_elements",
]
}
-polymer_modulizer("cookies_page") {
- js_file = "cookies_page.js"
- html_file = "cookies_page.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/router.html|Router",
- "chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.html|SiteSettingsPrefsBrowserProxy,SiteSettingsPrefsBrowserProxyImpl,ContentSettingProvider,CookieControlsManagedState,DefaultContentSetting",
- "chrome/browser/resources/settings/site_settings/constants.html|ContentSettingsTypes,SiteSettingSource,CookieControlsMode,ContentSetting",
- "ui/webui/resources/html/assert.html|assert",
- "chrome/browser/resources/settings/metrics_browser_proxy.html|PrivacyElementInteractions,MetricsBrowserProxy,MetricsBrowserProxyImpl",
- ]
-}
-
-polymer_modulizer("collapse_radio_button") {
- js_file = "collapse_radio_button.js"
- html_file = "collapse_radio_button.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [
- "ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.html|CrPolicyIndicatorType",
- "ui/webui/resources/cr_elements/cr_radio_button:cr_radio_button_behavior.html|CrRadioButtonBehavior",
- ]
-}
-
-polymer_modulizer("disable_safebrowsing_dialog") {
- js_file = "disable_safebrowsing_dialog.js"
- html_file = "disable_safebrowsing_dialog.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports
-}
-
-polymer_modulizer("secure_dns") {
- js_file = "secure_dns.js"
- html_file = "secure_dns.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/privacy_page/privacy_page_browser_proxy.html|PrivacyPageBrowserProxy,PrivacyPageBrowserProxyImpl,SecureDnsUiManagementMode,SecureDnsMode,ResolverOption,SecureDnsSetting",
- "ui/webui/resources/html/assert.html|assertNotReached",
- ]
-}
-
-polymer_modulizer("secure_dns_input") {
- js_file = "secure_dns_input.js"
- html_file = "secure_dns_input.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [ "chrome/browser/resources/settings/privacy_page/privacy_page_browser_proxy.html|PrivacyPageBrowserProxy,PrivacyPageBrowserProxyImpl" ]
-}
-
-polymer_modulizer("do_not_track_toggle") {
- js_file = "do_not_track_toggle.js"
- html_file = "do_not_track_toggle.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [ "chrome/browser/resources/settings/metrics_browser_proxy.html|PrivacyElementInteractions,MetricsBrowserProxyImpl" ]
-}
-
-polymer_modulizer("passwords_leak_detection_toggle") {
- js_file = "passwords_leak_detection_toggle.js"
- html_file = "passwords_leak_detection_toggle.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/people_page/sync_browser_proxy.html|SyncBrowserProxyImpl,SyncStatus,StoredAccount",
- "chrome/browser/resources/settings/metrics_browser_proxy.html|PrivacyElementInteractions,MetricsBrowserProxyImpl",
- ]
+html_to_js("v3_ready_elements") {
+ js_files = [
+ "collapse_radio_button.js",
+ "cookies_page.js",
+ "disable_safebrowsing_dialog.js",
+ "do_not_track_toggle.js",
+ "passwords_leak_detection_toggle.js",
+ "privacy_page.js",
+ "secure_dns.js",
+ "secure_dns_input.js",
+ "security_keys_bio_enroll_dialog.js",
+ "security_keys_credential_management_dialog.js",
+ "security_keys_pin_field.js",
+ "security_keys_reset_dialog.js",
+ "security_keys_set_pin_dialog.js",
+ "security_keys_subpage.js",
+ "security_page.js",
+ ]
}
polymer_modulizer("personalization_options") {
@@ -572,6 +295,7 @@ polymer_modulizer("personalization_options") {
html_file = "personalization_options.html"
html_type = "dom-module"
namespace_rewrites = settings_namespace_rewrites
+ migrated_imports = settings_migrated_imports
auto_imports = settings_auto_imports + [
"chrome/browser/resources/settings/privacy_page/privacy_page_browser_proxy.html|PrivacyPageBrowserProxy,PrivacyPageBrowserProxyImpl,MetricsReporting",
"chrome/browser/resources/settings/people_page/sync_browser_proxy.html|StatusAction,SyncStatus",
@@ -579,108 +303,7 @@ polymer_modulizer("personalization_options") {
]
}
-polymer_modulizer("privacy_page") {
- js_file = "privacy_page.js"
- html_file = "privacy_page.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [
- "ui/webui/resources/html/assert.html|assert",
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/metrics_browser_proxy.html|PrivacyElementInteractions,MetricsBrowserProxyImpl",
- "chrome/browser/resources/settings/privacy_page/privacy_page_browser_proxy.html|PrivacyPageBrowserProxy,PrivacyPageBrowserProxyImpl",
- "chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.html|SiteSettingsPrefsBrowserProxyImpl",
- "chrome/browser/resources/settings/site_settings/constants.html|ContentSettingsTypes,CookieControlsMode,ChooserType",
- "chrome/browser/resources/settings/people_page/sync_browser_proxy.html|SyncBrowserProxyImpl,SyncStatus",
- "chrome/browser/resources/settings/hats_browser_proxy.html|HatsBrowserProxyImpl",
- "chrome/browser/resources/settings/page_visibility.html|PrivacyPageVisibility",
- "chrome/browser/resources/settings/router.html|RouteObserverBehavior,Router",
- ]
-}
-
-polymer_modulizer("security_keys_bio_enroll_dialog") {
- js_file = "security_keys_bio_enroll_dialog.js"
- html_file = "security_keys_bio_enroll_dialog.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/privacy_page/security_keys_browser_proxy.html|SecurityKeysBioEnrollProxy,SecurityKeysBioEnrollProxyImpl,Ctap2Status,SampleStatus,Enrollment,EnrollmentResponse,SampleResponse,",
- "ui/webui/resources/html/assert.html|assert,assertNotReached",
- "ui/webui/resources/html/polymer.html|afterNextRender,html,Polymer",
- ]
-}
-
-polymer_modulizer("security_keys_credential_management_dialog") {
- js_file = "security_keys_credential_management_dialog.js"
- html_file = "security_keys_credential_management_dialog.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/privacy_page/security_keys_browser_proxy.html|SecurityKeysCredentialBrowserProxy,SecurityKeysCredentialBrowserProxyImpl,Credential",
- "ui/webui/resources/html/assert.html|assert,assertNotReached",
- ]
-}
-
-polymer_modulizer("security_keys_pin_field") {
- js_file = "security_keys_pin_field.js"
- html_file = "security_keys_pin_field.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports =
- settings_auto_imports +
- [ "ui/webui/resources/html/polymer.html|afterNextRender,html,Polymer" ]
-}
-
-polymer_modulizer("security_keys_reset_dialog") {
- js_file = "security_keys_reset_dialog.js"
- html_file = "security_keys_reset_dialog.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [ "chrome/browser/resources/settings/privacy_page/security_keys_browser_proxy.html|SecurityKeysResetBrowserProxy,SecurityKeysResetBrowserProxyImpl" ]
-}
-
-polymer_modulizer("security_keys_set_pin_dialog") {
- js_file = "security_keys_set_pin_dialog.js"
- html_file = "security_keys_set_pin_dialog.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/privacy_page/security_keys_browser_proxy.html|SecurityKeysPINBrowserProxy,SecurityKeysPINBrowserProxyImpl",
- "ui/webui/resources/html/polymer.html|afterNextRender,html,Polymer",
- ]
-}
-
-polymer_modulizer("security_keys_subpage") {
- js_file = "security_keys_subpage.js"
- html_file = "security_keys_subpage.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports =
- settings_auto_imports + [ "ui/webui/resources/html/assert.html|assert" ]
-}
-
-polymer_modulizer("security_page") {
- js_file = "security_page.js"
- html_file = "security_page.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [
- "ui/webui/resources/html/assert.html|assert",
- "chrome/browser/resources/settings/router.html|Router",
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/metrics_browser_proxy.html|PrivacyElementInteractions,MetricsBrowserProxy,MetricsBrowserProxyImpl",
- "chrome/browser/resources/settings/privacy_page/privacy_page_browser_proxy.html|PrivacyPageBrowserProxy,PrivacyPageBrowserProxyImpl",
- "chrome/browser/resources/settings/privacy_page/safe_browsing_browser_proxy.html|SafeBrowsingBrowserProxy,SafeBrowsingBrowserProxyImpl,SafeBrowsingRadioManagedState",
- "chrome/browser/resources/settings/people_page/sync_browser_proxy.html|SyncStatus",
- ]
-}
-
js_modulizer("modulize") {
- input_files = [
- "privacy_page_browser_proxy.js",
- "safe_browsing_browser_proxy.js",
- "security_keys_browser_proxy.js",
- ]
-
+ input_files = [ "privacy_page_browser_proxy.js" ]
namespace_rewrites = settings_namespace_rewrites
}
diff --git a/chromium/chrome/browser/resources/settings/reset_page/BUILD.gn b/chromium/chrome/browser/resources/settings/reset_page/BUILD.gn
index 31c4ec6700d..c3285ca5844 100644
--- a/chromium/chrome/browser/resources/settings/reset_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/reset_page/BUILD.gn
@@ -3,11 +3,12 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
-import("//ui/webui/resources/tools/js_modulizer.gni")
+import("//tools/polymer/html_to_js.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [
":reset_browser_proxy",
":reset_page",
@@ -16,146 +17,47 @@ js_type_check("closure_compile") {
]
}
-js_library("reset_page") {
- deps = [
- ":reset_profile_dialog",
- "..:route",
- "..:router",
- "//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js/cr/ui:focus_without_ink",
- ]
-}
-
js_library("reset_browser_proxy") {
- deps = [ "//ui/webui/resources/js:cr" ]
- externs_list = [ "$externs_path/chrome_send.js" ]
-}
-
-js_library("reset_profile_dialog") {
- deps = [
- ":reset_browser_proxy",
- "..:route",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
-}
-
-js_library("reset_profile_banner") {
- deps = [
- ":reset_browser_proxy",
- "..:route",
- "..:router",
- "//ui/webui/resources/cr_elements/cr_dialog",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- deps = [
- ":reset_browser_proxy.m",
- ":reset_page.m",
- ":reset_profile_banner.m",
- ":reset_profile_dialog.m",
- ]
-}
-
-js_library("reset_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/reset_page/reset_browser_proxy.m.js" ]
deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
}
-js_library("reset_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/reset_page/reset_page.m.js" ]
+js_library("reset_page") {
deps = [
- ":reset_profile_dialog.m",
- "..:route.m",
+ ":reset_profile_dialog",
+ "..:route",
"..:router.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render.m",
"//ui/webui/resources/js:assert",
"//ui/webui/resources/js:load_time_data.m",
]
- extra_deps = [ ":reset_page_module" ]
}
-js_library("reset_profile_banner.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/reset_page/reset_profile_banner.m.js" ]
+js_library("reset_profile_banner") {
deps = [
- ":reset_browser_proxy.m",
- "..:route.m",
+ ":reset_browser_proxy",
+ "..:route",
"..:router.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
]
- extra_deps = [ ":reset_profile_banner_module" ]
}
-js_library("reset_profile_dialog.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/reset_page/reset_profile_dialog.m.js" ]
+js_library("reset_profile_dialog") {
deps = [
- ":reset_browser_proxy.m",
- "..:route.m",
+ ":reset_browser_proxy",
+ "..:route",
"..:router.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":reset_profile_dialog_module" ]
}
-group("polymer3_elements") {
- public_deps = [
- ":modulize",
- ":reset_page_module",
- ":reset_profile_banner_module",
- ":reset_profile_dialog_module",
+html_to_js("web_components") {
+ js_files = [
+ "reset_page.js",
+ "reset_profile_banner.js",
+ "reset_profile_dialog.js",
]
}
-
-polymer_modulizer("reset_page") {
- js_file = "reset_page.js"
- html_file = "reset_page.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [
- "ui/webui/resources/html/assert.html|assert",
- "chrome/browser/resources/settings/reset_page/reset_browser_proxy.html|ResetBrowserProxyImpl",
- "chrome/browser/resources/settings/router.html|Router,Route,RouteObserverBehavior",
- "chrome/browser/resources/settings/route.html|routes",
- ]
-}
-
-polymer_modulizer("reset_profile_banner") {
- js_file = "reset_profile_banner.js"
- html_file = "reset_profile_banner.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/reset_page/reset_browser_proxy.html|ResetBrowserProxyImpl",
- "chrome/browser/resources/settings/router.html|Router",
- "chrome/browser/resources/settings/route.html|routes",
- ]
-}
-
-polymer_modulizer("reset_profile_dialog") {
- js_file = "reset_profile_dialog.js"
- html_file = "reset_profile_dialog.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/reset_page/reset_browser_proxy.html|ResetBrowserProxyImpl,ResetBrowserProxy",
- "chrome/browser/resources/settings/router.html|Router",
- "chrome/browser/resources/settings/route.html|routes",
- ]
-}
-
-js_modulizer("modulize") {
- input_files = [ "reset_browser_proxy.js" ]
- namespace_rewrites = settings_namespace_rewrites
-}
diff --git a/chromium/chrome/browser/resources/settings/safety_check_page/BUILD.gn b/chromium/chrome/browser/resources/settings/safety_check_page/BUILD.gn
index 539f64fd088..bbe3b9a0e4d 100644
--- a/chromium/chrome/browser/resources/settings/safety_check_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/safety_check_page/BUILD.gn
@@ -3,103 +3,109 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
-import("//ui/webui/resources/tools/js_modulizer.gni")
+import("//tools/polymer/html_to_js.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [
":safety_check_browser_proxy",
+ ":safety_check_child",
+ ":safety_check_extensions_element",
":safety_check_page",
- "..:lifetime_browser_proxy",
+ ":safety_check_passwords_element",
+ ":safety_check_safe_browsing_element",
+ ":safety_check_updates_element",
+ ]
+}
+
+js_library("safety_check_browser_proxy") {
+ deps = [ "//ui/webui/resources/js:cr.m" ]
+}
+
+js_library("safety_check_child") {
+ deps = [
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/js:assert.m",
+ "//ui/webui/resources/js:i18n_behavior.m",
+ ]
+}
+
+js_library("safety_check_extensions_element") {
+ deps = [
+ ":safety_check_child",
"..:metrics_browser_proxy",
- "../autofill_page:password_manager_proxy",
+ "..:open_window_proxy",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/js:assert.m",
+ "//ui/webui/resources/js:web_ui_listener_behavior.m",
]
}
js_library("safety_check_page") {
deps = [
":safety_check_browser_proxy",
+ ":safety_check_extensions_element",
+ ":safety_check_passwords_element",
+ ":safety_check_safe_browsing_element",
+ ":safety_check_updates_element",
"..:hats_browser_proxy",
- "..:lifetime_browser_proxy",
"..:metrics_browser_proxy",
- "..:open_window_proxy",
- "..:route",
- "..:router",
"../autofill_page:password_manager_proxy",
- "//third_party/polymer/v1_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer-extracted",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:web_ui_listener_behavior",
+ "//third_party/polymer/v3_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer",
+ "//third_party/polymer/v3_0/components-chromium/iron-collapse:iron-collapse",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/js:assert.m",
+ "//ui/webui/resources/js:i18n_behavior.m",
+ "//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- externs_list = [ "$externs_path/chrome_send.js" ]
}
-js_library("safety_check_browser_proxy") {
- deps = [ "//ui/webui/resources/js:cr" ]
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
+js_library("safety_check_passwords_element") {
deps = [
- ":safety_check_browser_proxy.m",
- ":safety_check_page.m",
+ ":safety_check_child",
+ "..:metrics_browser_proxy",
+ "..:route",
+ "..:router.m",
+ "../autofill_page:password_manager_proxy",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/js:assert.m",
+ "//ui/webui/resources/js:web_ui_listener_behavior.m",
]
}
-js_library("safety_check_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/safety_check_page/safety_check_browser_proxy.m.js" ]
- deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
-}
-
-js_library("safety_check_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/safety_check_page/safety_check_page.m.js" ]
+js_library("safety_check_safe_browsing_element") {
deps = [
- ":safety_check_browser_proxy.m",
- "..:hats_browser_proxy.m",
- "..:lifetime_browser_proxy.m",
- "..:metrics_browser_proxy.m",
- "..:open_window_proxy.m",
- "..:route.m",
+ ":safety_check_child",
+ "..:metrics_browser_proxy",
+ "..:route",
"..:router.m",
- "../autofill_page:password_manager_proxy.m",
- "//third_party/polymer/v3_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":safety_check_page_module" ]
}
-group("polymer3_elements") {
- public_deps = [
- ":modulize",
- ":safety_check_page_module",
+js_library("safety_check_updates_element") {
+ deps = [
+ ":safety_check_child",
+ "..:lifetime_browser_proxy.m",
+ "..:metrics_browser_proxy",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/js:assert.m",
+ "//ui/webui/resources/js:web_ui_listener_behavior.m",
]
}
-polymer_modulizer("safety_check_page") {
- js_file = "safety_check_page.js"
- html_file = "safety_check_page.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/router.html|Router",
- "chrome/browser/resources/settings/autofill_page/password_manager_proxy.html|PasswordManagerImpl,PasswordManagerProxy",
- "chrome/browser/resources/settings/lifetime_browser_proxy.html|LifetimeBrowserProxy,LifetimeBrowserProxyImpl",
- "chrome/browser/resources/settings/hats_browser_proxy.html|HatsBrowserProxyImpl",
- "chrome/browser/resources/settings/metrics_browser_proxy.html|SafetyCheckInteractions,MetricsBrowserProxy,MetricsBrowserProxyImpl",
- "chrome/browser/resources/settings/open_window_proxy.html|OpenWindowProxyImpl",
- "chrome/browser/resources/settings/safety_check_page/safety_check_browser_proxy.html|SafetyCheckBrowserProxy,SafetyCheckBrowserProxyImpl,SafetyCheckExtensionsStatus,SafetyCheckPasswordsStatus,SafetyCheckUpdatesStatus,SafetyCheckSafeBrowsingStatus,SafetyCheckCallbackConstants",
- "ui/webui/resources/html/assert.html|assertNotReached",
- "ui/webui/resources/html/polymer.html|Polymer,html,flush",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-js_modulizer("modulize") {
- input_files = [ "safety_check_browser_proxy.js" ]
- namespace_rewrites = settings_namespace_rewrites
+html_to_js("web_components") {
+ js_files = [
+ "safety_check_child.js",
+ "safety_check_extensions_element.js",
+ "safety_check_page.js",
+ "safety_check_passwords_element.js",
+ "safety_check_safe_browsing_element.js",
+ "safety_check_updates_element.js",
+ ]
}
diff --git a/chromium/chrome/browser/resources/settings/search_engines_page/BUILD.gn b/chromium/chrome/browser/resources/settings/search_engines_page/BUILD.gn
index 95e4d6c114e..8e4934f6d98 100644
--- a/chromium/chrome/browser/resources/settings/search_engines_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/search_engines_page/BUILD.gn
@@ -3,53 +3,12 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
import("//ui/webui/resources/tools/js_modulizer.gni")
import("../settings.gni")
js_type_check("closure_compile") {
- deps = [
- ":omnibox_extension_entry",
- ":search_engine_dialog",
- ":search_engine_entry",
- ":search_engines_browser_proxy",
- ":search_engines_list",
- ":search_engines_page",
- ]
-}
-
-js_library("search_engine_dialog") {
- deps = [
- ":search_engines_browser_proxy",
- "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
-}
-
-js_library("search_engine_entry") {
- deps = [
- ":search_engines_browser_proxy",
- "//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:icon",
- "//ui/webui/resources/js/cr/ui:focus_row_behavior",
- "//ui/webui/resources/js/cr/ui:focus_without_ink",
- ]
-}
-
-js_library("omnibox_extension_entry") {
- deps = [
- ":search_engines_browser_proxy",
- "..:extension_control_browser_proxy",
- "//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:icon",
- "//ui/webui/resources/js/cr/ui:focus_row_behavior",
- ]
+ deps = [ ":search_engines_browser_proxy" ]
}
js_library("search_engines_browser_proxy") {
@@ -59,41 +18,20 @@ js_library("search_engines_browser_proxy") {
]
}
-js_library("search_engines_list") {
- deps = [
- ":search_engines_browser_proxy",
- "//ui/webui/resources/js:cr",
- ]
-}
-
-js_library("search_engines_page") {
- deps = [
- ":search_engines_browser_proxy",
- "..:global_scroll_target_behavior",
- "..:route",
- "//third_party/polymer/v1_0/components-chromium/iron-list:iron-list-extracted",
- "//third_party/polymer/v1_0/components-chromium/iron-resizable-behavior:iron-resizable-behavior-extracted",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js/cr/ui:focus_without_ink",
- ]
-}
-
js_type_check("closure_compile_module") {
is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [
- ":omnibox_extension_entry.m",
- ":search_engine_dialog.m",
- ":search_engine_entry.m",
+ ":omnibox_extension_entry",
+ ":search_engine_dialog",
+ ":search_engine_entry",
":search_engines_browser_proxy.m",
- ":search_engines_list.m",
- ":search_engines_page.m",
+ ":search_engines_list",
+ ":search_engines_page",
]
}
-js_library("omnibox_extension_entry.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/search_engines_page/omnibox_extension_entry.m.js" ]
+js_library("omnibox_extension_entry") {
deps = [
":search_engines_browser_proxy.m",
"..:extension_control_browser_proxy.m",
@@ -102,23 +40,19 @@ js_library("omnibox_extension_entry.m") {
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js/cr/ui:focus_row_behavior.m",
]
- extra_deps = [ ":omnibox_extension_entry_module" ]
}
-js_library("search_engine_dialog.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/search_engines_page/search_engine_dialog.m.js" ]
+js_library("search_engine_dialog") {
deps = [
":search_engines_browser_proxy.m",
- "..:i18n_setup.m",
+ "..:i18n_setup",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":search_engine_dialog_module" ]
}
-js_library("search_engine_entry.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/search_engines_page/search_engine_entry.m.js" ]
+js_library("search_engine_entry") {
deps = [
":search_engines_browser_proxy.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
@@ -126,7 +60,6 @@ js_library("search_engine_entry.m") {
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js/cr/ui:focus_row_behavior.m",
]
- extra_deps = [ ":search_engine_entry_module" ]
}
js_library("search_engines_browser_proxy.m") {
@@ -135,97 +68,41 @@ js_library("search_engines_browser_proxy.m") {
extra_deps = [ ":modulize" ]
}
-js_library("search_engines_list.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/search_engines_page/search_engines_list.m.js" ]
+js_library("search_engines_list") {
deps = [
":search_engines_browser_proxy.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
- extra_deps = [ ":search_engines_list_module" ]
}
-js_library("search_engines_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/search_engines_page/search_engines_page.m.js" ]
+js_library("search_engines_page") {
deps = [
":search_engines_browser_proxy.m",
"..:global_scroll_target_behavior.m",
- "..:settings_routes.m",
+ "..:settings_routes",
"//third_party/polymer/v3_0/components-chromium/iron-list",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":search_engines_page_module" ]
}
-group("polymer3_elements") {
+group("web_components") {
public_deps = [
":modulize",
- ":omnibox_extension_entry_module",
- ":search_engine_dialog_module",
- ":search_engine_entry_css_module",
- ":search_engine_entry_module",
- ":search_engines_list_module",
- ":search_engines_page_module",
+ ":web_components_local",
]
}
-polymer_modulizer("omnibox_extension_entry") {
- js_file = "omnibox_extension_entry.js"
- html_file = "omnibox_extension_entry.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/search_engines_page/search_engines_browser_proxy.html|SearchEngine",
- "ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.html|AnchorAlignment",
- "ui/webui/resources/html/assert.html|assert",
- ]
-}
-
-polymer_modulizer("search_engine_dialog") {
- js_file = "search_engine_dialog.js"
- html_file = "search_engine_dialog.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [ "chrome/browser/resources/settings/search_engines_page/search_engines_browser_proxy.html|SearchEnginesBrowserProxyImpl,SearchEnginesBrowserProxy,SearchEngine,SearchEnginesInfo" ]
-}
-
-polymer_modulizer("search_engine_entry") {
- js_file = "search_engine_entry.js"
- html_file = "search_engine_entry.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/search_engines_page/search_engines_browser_proxy.html|SearchEnginesBrowserProxyImpl,SearchEnginesBrowserProxy,SearchEngine",
- "ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.html|AnchorAlignment",
- "ui/webui/resources/html/assert.html|assert",
- ]
-}
-
-polymer_modulizer("search_engine_entry_css") {
- js_file = "search_engine_entry_css.m.js"
- html_file = "search_engine_entry_css.html"
- html_type = "style-module"
-}
-
-polymer_modulizer("search_engines_list") {
- js_file = "search_engines_list.js"
- html_file = "search_engines_list.html"
- html_type = "dom-module"
- auto_imports = [ "chrome/browser/resources/settings/search_engines_page/search_engines_browser_proxy.html|SearchEngine" ]
-}
-
-polymer_modulizer("search_engines_page") {
- js_file = "search_engines_page.js"
- html_file = "search_engines_page.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/search_engines_page/search_engines_browser_proxy.html|SearchEnginesBrowserProxyImpl,SearchEngine,SearchEnginesInfo",
- "chrome/browser/resources/settings/route.html|routes",
- "ui/webui/resources/html/assert.html|assert",
- "ui/webui/resources/html/polymer.html|afterNextRender,html,Polymer",
- ]
+html_to_js("web_components_local") {
+ js_files = [
+ "omnibox_extension_entry.js",
+ "search_engine_dialog.js",
+ "search_engine_entry_css.js",
+ "search_engine_entry.js",
+ "search_engines_list.js",
+ "search_engines_page.js",
+ ]
}
js_modulizer("modulize") {
diff --git a/chromium/chrome/browser/resources/settings/search_page/BUILD.gn b/chromium/chrome/browser/resources/settings/search_page/BUILD.gn
index 8f902780a4d..19a32b66c7f 100644
--- a/chromium/chrome/browser/resources/settings/search_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/search_page/BUILD.gn
@@ -3,55 +3,26 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [ ":search_page" ]
}
js_library("search_page") {
deps = [
"..:route",
- "..:router",
- "../prefs",
- "../search_engines_page:search_engines_browser_proxy",
- "../settings_page:settings_animated_pages",
- "//ui/webui/resources/js:cr",
- ]
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- deps = [ ":search_page.m" ]
-}
-
-js_library("search_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/search_page/search_page.m.js" ]
- deps = [
- "..:route.m",
"..:router.m",
"../search_engines_page:search_engines_browser_proxy.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:cr.m",
]
- extra_deps = [ ":search_page_module" ]
externs_list = [ "$externs_path/settings_private.js" ]
}
-group("polymer3_elements") {
- public_deps = [ ":search_page_module" ]
-}
-
-polymer_modulizer("search_page") {
- js_file = "search_page.js"
- html_file = "search_page.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = [
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/router.html|Router",
- "chrome/browser/resources/settings/search_engines_page/search_engines_browser_proxy.html|SearchEnginesBrowserProxyImpl,SearchEnginesBrowserProxy,SearchEngine",
- "ui/webui/resources/html/cr.html|addWebUIListener",
- ]
+html_to_js("web_components") {
+ js_files = [ "search_page.js" ]
}
diff --git a/chromium/chrome/browser/resources/settings/settings.gni b/chromium/chrome/browser/resources/settings/settings.gni
index e3ba931f4fc..48e79e57b99 100644
--- a/chromium/chrome/browser/resources/settings/settings.gni
+++ b/chromium/chrome/browser/resources/settings/settings.gni
@@ -2,6 +2,8 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import("//third_party/closure_compiler/compile_js.gni")
+
# Common namespace rewrites for all polymer_modulizer() or js_modulizer()
# targets in Settings.
settings_namespace_rewrites = [
@@ -96,6 +98,8 @@ settings_namespace_rewrites = [
"settings.SafetyCheckBrowserProxy|SafetyCheckBrowserProxy",
"settings.SafetyCheckCallbackConstants|SafetyCheckCallbackConstants",
"settings.SafetyCheckExtensionsStatus|SafetyCheckExtensionsStatus",
+ "settings.SafetyCheckIconStatus|SafetyCheckIconStatus",
+ "settings.SafetyCheckParentStatus|SafetyCheckParentStatus",
"settings.SafetyCheckPasswordsStatus|SafetyCheckPasswordsStatus",
"settings.SafetyCheckSafeBrowsingStatus|SafetyCheckSafeBrowsingStatus",
"settings.SafetyCheckUpdatesStatus|SafetyCheckUpdatesStatus",
@@ -132,5 +136,17 @@ settings_auto_imports = [
"chrome/browser/resources/settings/prefs/prefs_behavior.html|PrefsBehavior",
"chrome/browser/resources/settings/prefs/prefs_types.html|CrSettingsPrefs",
"chrome/browser/resources/settings/printing_page/printing_browser_proxy.html|PrintingBrowserProxyImpl",
- "chrome/browser/resources/settings/site_settings/site_settings_behavior.html|SiteSettingsBehavior",
+]
+
+settings_closure_flags =
+ default_closure_args + [
+ "js_module_root=../../chrome/browser/resources/settings/",
+ "js_module_root=./gen/chrome/browser/resources/settings/",
+ ]
+
+settings_migrated_imports = [
+ "chrome/browser/resources/settings/i18n_setup.html",
+ "chrome/browser/resources/settings/ensure_lazy_loaded.html",
+ "chrome/browser/resources/settings/settings_main/settings_main.html",
+ "chrome/browser/resources/settings/settings_menu/settings_menu.html",
]
diff --git a/chromium/chrome/browser/resources/settings/settings_main/BUILD.gn b/chromium/chrome/browser/resources/settings/settings_main/BUILD.gn
index 19101578cb4..acd8b51d278 100644
--- a/chromium/chrome/browser/resources/settings/settings_main/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/settings_main/BUILD.gn
@@ -3,10 +3,12 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [ ":settings_main" ]
}
@@ -14,54 +16,18 @@ js_library("settings_main") {
deps = [
"..:page_visibility",
"..:route",
- "..:router",
- "..:search_settings",
- "../about_page",
- "../basic_page:basic_page",
- "../settings_page:main_page_behavior",
- "//third_party/polymer/v1_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer-extracted",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:load_time_data",
- ]
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- deps = [ ":settings_main.m" ]
-}
-
-js_library("settings_main.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/settings_main/settings_main.m.js" ]
- deps = [
- "..:page_visibility.m",
- "..:route.m",
"..:router.m",
"..:search_settings.m",
- "../about_page:about_page.m",
+ "../about_page:about_page",
"../about_page:about_page_browser_proxy.m",
- "../basic_page:basic_page.m",
+ "../basic_page:basic_page",
"../settings_page:main_page_behavior.m",
"//third_party/polymer/v3_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
]
- extra_deps = [ ":settings_main_module" ]
-}
-
-group("polymer3_elements") {
- public_deps = [ ":settings_main_module" ]
}
-polymer_modulizer("settings_main") {
- js_file = "settings_main.js"
- html_file = "settings_main.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/about_page/about_page_browser_proxy.html|AboutPageBrowserProxyImpl",
- "chrome/browser/resources/settings/page_visibility.html|PageVisibility",
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/router.html|Route,Router,RouteObserverBehavior",
- "ui/webui/resources/html/assert.html|assert,assertNotReached",
- ]
- namespace_rewrites = settings_namespace_rewrites
+html_to_js("web_components") {
+ js_files = [ "settings_main.js" ]
}
diff --git a/chromium/chrome/browser/resources/settings/settings_menu/BUILD.gn b/chromium/chrome/browser/resources/settings/settings_menu/BUILD.gn
index 94d054eae0c..c19f01c1bba 100644
--- a/chromium/chrome/browser/resources/settings/settings_menu/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/settings_menu/BUILD.gn
@@ -3,50 +3,25 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [ ":settings_menu" ]
}
js_library("settings_menu") {
deps = [
"..:page_visibility",
- "..:router",
- "//third_party/polymer/v1_0/components-chromium/paper-ripple:paper-ripple-extracted",
- ]
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- deps = [ ":settings_menu.m" ]
-}
-
-js_library("settings_menu.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/settings_menu/settings_menu.m.js" ]
- deps = [
- "..:page_visibility.m",
"..:router.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
]
- extra_deps = [ ":settings_menu_module" ]
}
-group("polymer3_elements") {
- public_deps = [ ":settings_menu_module" ]
-}
-
-polymer_modulizer("settings_menu") {
- js_file = "settings_menu.js"
- html_file = "settings_menu.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = [
- "chrome/browser/resources/settings/page_visibility.html|PageVisibility",
- "chrome/browser/resources/settings/router.html|RouteObserverBehavior,Router,Route",
- "ui/webui/resources/html/assert.html|assert",
- ]
+html_to_js("web_components") {
+ js_files = [ "settings_menu.js" ]
}
diff --git a/chromium/chrome/browser/resources/settings/settings_page/BUILD.gn b/chromium/chrome/browser/resources/settings/settings_page/BUILD.gn
index e8a15f26d84..fda50ecb1e5 100644
--- a/chromium/chrome/browser/resources/settings/settings_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/settings_page/BUILD.gn
@@ -144,6 +144,7 @@ polymer_modulizer("settings_subpage") {
js_file = "settings_subpage.js"
html_file = "settings_subpage.html"
html_type = "dom-module"
+ migrated_imports = settings_migrated_imports
auto_imports = settings_auto_imports + [
"chrome/browser/resources/settings/router.html|RouteObserverBehavior,Router",
"third_party/polymer/v1_0/components-chromium/iron-resizable-behavior/iron-resizable-behavior.html|IronResizableBehavior",
diff --git a/chromium/chrome/browser/resources/settings/settings_resources.grd b/chromium/chrome/browser/resources/settings/settings_resources.grd
index 27b17e0fb2a..fcb4816318b 100644
--- a/chromium/chrome/browser/resources/settings/settings_resources.grd
+++ b/chromium/chrome/browser/resources/settings/settings_resources.grd
@@ -15,1220 +15,54 @@
<part file="settings_resources_v3.grdp" />
</includes>
<structures>
- <structure name="IDR_SETTINGS_A11Y_PAGE_JS"
- file="a11y_page/a11y_page.js"
- preprocess="true"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_A11Y_PAGE_HTML"
- file="a11y_page/a11y_page.html"
- type="chrome_html"
- preprocess="true" />
-
- <if expr="not is_macosx and not chromeos">
- <structure name="IDR_SETTINGS_CAPTIONS_SUBPAGE_HTML"
- file="a11y_page/captions_subpage.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CAPTIONS_SUBPAGE_JS"
- file="a11y_page/captions_subpage.js"
- type="chrome_html" />
- </if>
- <if expr="is_win or is_macosx">
- <structure name="IDR_SETTINGS_CAPTIONS_BROWSER_PROXY_HTML"
- file="a11y_page/captions_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CAPTIONS_BROWSER_PROXY_JS"
- file="a11y_page/captions_browser_proxy.js"
- type="chrome_html" />
- </if>
- <structure name="IDR_SETTINGS_ABOUT_PAGE_BROWSER_PROXY_HTML"
- file="about_page/about_page_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_ABOUT_PAGE_BROWSER_PROXY_JS"
- file="about_page/about_page_browser_proxy.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_ABOUT_PAGE_JS"
- file="about_page/about_page.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_ABOUT_PAGE_HTML"
- file="about_page/about_page.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_ADD_SITE_DIALOG_HTML"
- file="site_settings/add_site_dialog.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_ADD_SITE_DIALOG_JS"
- file="site_settings/add_site_dialog.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_ALL_SITES_HTML"
- file="site_settings/all_sites.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_ALL_SITES_JS"
- file="site_settings/all_sites.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_ALL_SITES_ICONS_HTML"
- file="site_settings/all_sites_icons.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SITE_ENTRY_HTML"
- file="site_settings/site_entry.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SITE_ENTRY_JS"
- file="site_settings/site_entry.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CLEAR_STORAGE_DIALOG_CSS"
- file="site_settings/clear_storage_dialog_css.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CATEGORY_DEFAULT_SETTING_HTML"
- file="site_settings/category_default_setting.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CATEGORY_DEFAULT_SETTING_JS"
- file="site_settings/category_default_setting.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CATEGORY_SETTING_EXCEPTIONS_HTML"
- file="site_settings/category_setting_exceptions.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_CATEGORY_SETTING_EXCEPTIONS_JS"
- file="site_settings/category_setting_exceptions.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CHOOSER_EXCEPTION_LIST_HTML"
- file="site_settings/chooser_exception_list.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CHOOSER_EXCEPTION_LIST_JS"
- file="site_settings/chooser_exception_list.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CHOOSER_EXCEPTION_LIST_ENTRY_HTML"
- file="site_settings/chooser_exception_list_entry.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CHOOSER_EXCEPTION_LIST_ENTRY_JS"
- file="site_settings/chooser_exception_list_entry.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CR_SETTINGS_ANIMATED_PAGES_HTML"
- file="settings_page/settings_animated_pages.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CR_SETTINGS_ANIMATED_PAGES_JS"
- file="settings_page/settings_animated_pages.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_APPEARANCE_BROWSER_PROXY_HTML"
- file="appearance_page/appearance_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_APPEARANCE_BROWSER_PROXY_JS"
- file="appearance_page/appearance_browser_proxy.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_APPEARANCE_FONTS_PAGE_HTML"
- file="appearance_page/appearance_fonts_page.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_APPEARANCE_FONTS_PAGE_JS"
- file="appearance_page/appearance_fonts_page.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_APPEARANCE_PAGE_HTML"
- file="appearance_page/appearance_page.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_APPEARANCE_PAGE_JS"
- file="appearance_page/appearance_page.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_APPEARANCE_HOME_URL_INPUT_HTML"
- file="appearance_page/home_url_input.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_APPEARANCE_HOME_URL_INPUT_JS"
- file="appearance_page/home_url_input.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_BASIC_PAGE_JS"
- file="basic_page/basic_page.js"
- preprocess="true"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_BASIC_PAGE_HTML"
- file="basic_page/basic_page.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_EDIT_EXCEPTION_DIALOG_HTML"
- file="site_settings/edit_exception_dialog.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_EDIT_EXCEPTION_DIALOG_JS"
- file="site_settings/edit_exception_dialog.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_EXTENSION_CONTROL_BROWSER_PROXY_JS"
- file="extension_control_browser_proxy.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_EXTENSION_CONTROL_BROWSER_PROXY_HTML"
- file="extension_control_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_FONTS_BROWSER_PROXY_HTML"
- file="appearance_page/fonts_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_FONTS_BROWSER_PROXY_JS"
- file="appearance_page/fonts_browser_proxy.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_LIFETIME_BROWSER_PROXY_HTML"
- file="lifetime_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_LIFETIME_BROWSER_PROXY_JS"
- file="lifetime_browser_proxy.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_ON_STARTUP_BROWSER_PROXY_HTML"
- file="on_startup_page/on_startup_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_ON_STARTUP_BROWSER_PROXY_JS"
- file="on_startup_page/on_startup_browser_proxy.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_ON_STARTUP_PAGE_HTML"
- file="on_startup_page/on_startup_page.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_ON_STARTUP_PAGE_JS"
- file="on_startup_page/on_startup_page.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SEARCH_SETTINGS_HTML"
- file="search_settings.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SEARCH_SETTINGS_JS"
- file="search_settings.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_STARTUP_URLS_PAGE_HTML"
- file="on_startup_page/startup_urls_page.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_STARTUP_URLS_PAGE_JS"
- file="on_startup_page/startup_urls_page.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_STARTUP_URLS_PAGE_BROWSER_PROXY_JS"
- file="on_startup_page/startup_urls_page_browser_proxy.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_STARTUP_URLS_PAGE_BROWSER_PROXY_HTML"
- file="on_startup_page/startup_urls_page_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_STARTUP_URL_DIALOG_JS"
- file="on_startup_page/startup_url_dialog.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_STARTUP_URL_DIALOG_HTML"
- file="on_startup_page/startup_url_dialog.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_STARTUP_URL_ENTRY_JS"
- file="on_startup_page/startup_url_entry.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_STARTUP_URL_ENTRY_HTML"
- file="on_startup_page/startup_url_entry.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CR_SETTINGS_MAIN_HTML"
- file="settings_main/settings_main.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_CR_SETTINGS_MAIN_JS"
- file="settings_main/settings_main.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CR_SETTINGS_MENU_HTML"
- file="settings_menu/settings_menu.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_CR_SETTINGS_MENU_JS"
- file="settings_menu/settings_menu.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CR_SETTINGS_SECTION_HTML"
- file="settings_page/settings_section.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CR_SETTINGS_SECTION_JS"
- file="settings_page/settings_section.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CR_SETTINGS_SUBPAGE_HTML"
- file="settings_page/settings_subpage.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CR_SETTINGS_SUBPAGE_JS"
- file="settings_page/settings_subpage.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CR_SETTINGS_PAGE_CSS_HTML"
- file="settings_page_css.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_MAIN_PAGE_BEHAVIOR_HTML"
- file="settings_page/main_page_behavior.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_MAIN_PAGE_BEHAVIOR_JS"
- file="settings_page/main_page_behavior.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SETTINGS_VARS_CSS_HTML"
- file="settings_vars_css.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SETTINGS_SHARED_CSS_HTML"
- file="settings_shared_css.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_CR_SETTINGS_UI_HTML"
- file="settings_ui/settings_ui.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_CR_SETTINGS_UI_JS"
- file="settings_ui/settings_ui.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_GLOBAL_SCROLL_TARGET_BEHAVIOR_HTML"
- file="global_scroll_target_behavior.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_GLOBAL_SCROLL_TARGET_BEHAVIOR_JS"
- file="global_scroll_target_behavior.js"
- type="chrome_html" />
- <if expr="is_win">
- <structure name="IDR_SETTINGS_CHROME_CLEANUP_PROXY_HTML"
- file="chrome_cleanup_page/chrome_cleanup_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CHROME_CLEANUP_PROXY_JS"
- file="chrome_cleanup_page/chrome_cleanup_proxy.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CHROME_CLEANUP_PAGE_HTML"
- file="chrome_cleanup_page/chrome_cleanup_page.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_CHROME_CLEANUP_PAGE_JS"
- file="chrome_cleanup_page/chrome_cleanup_page.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CHROME_CLEANUP_ITEMS_TO_REMOVE_LIST_HTML"
- file="chrome_cleanup_page/items_to_remove_list.html"
- type="chrome_html"/>
- <structure name="IDR_SETTINGS_CHROME_CLEANUP_ITEMS_TO_REMOVE_LIST_JS"
- file="chrome_cleanup_page/items_to_remove_list.js"
- type="chrome_html"/>
- </if>
- <if expr="is_win and _google_chrome">
- <structure name="IDR_SETTINGS_INCOMPATIBLE_APPLICATIONS_PAGE_HTML"
- file="incompatible_applications_page/incompatible_applications_page.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_INCOMPATIBLE_APPLICATIONS_PAGE_JS"
- file="incompatible_applications_page/incompatible_applications_page.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_INCOMPATIBLE_APPLICATIONS_BROWSER_PROXY_HTML"
- file="incompatible_applications_page/incompatible_applications_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_INCOMPATIBLE_APPLICATIONS_BROWSER_PROXY_JS"
- file="incompatible_applications_page/incompatible_applications_browser_proxy.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_INCOMPATIBLE_APPLICATIONS_INCOMPATIBLE_APPLICATION_ITEM_HTML"
- file="incompatible_applications_page/incompatible_application_item.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_INCOMPATIBLE_APPLICATIONS_INCOMPATIBLE_APPLICATION_ITEM_JS"
- file="incompatible_applications_page/incompatible_application_item.js"
- type="chrome_html" />
- </if>
- <structure name="IDR_SETTINGS_CLEAR_BROWSING_DATA_BROWSER_PROXY_HTML"
- file="clear_browsing_data_dialog/clear_browsing_data_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CLEAR_BROWSING_DATA_BROWSER_PROXY_JS"
- file="clear_browsing_data_dialog/clear_browsing_data_browser_proxy.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CLEAR_BROWSING_DATA_DIALOG_HTML"
- file="clear_browsing_data_dialog/clear_browsing_data_dialog.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CLEAR_BROWSING_DATA_DIALOG_JS"
- file="clear_browsing_data_dialog/clear_browsing_data_dialog.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_CLEAR_BROWSING_DATA_INSTALLED_APP_CHECKBOX_HTML"
- file="clear_browsing_data_dialog/installed_app_checkbox.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CLEAR_BROWSING_DATA_INSTALLED_APP_CHECKBOX_JS"
- file="clear_browsing_data_dialog/installed_app_checkbox.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_HISTORY_DELETION_DIALOG_HTML"
- file="clear_browsing_data_dialog/history_deletion_dialog.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_HISTORY_DELETION_DIALOG_JS"
- file="clear_browsing_data_dialog/history_deletion_dialog.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SECURITY_KEYS_SUBPAGE_HTML"
- file="privacy_page/security_keys_subpage.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SECURITY_KEYS_SUBPAGE_JS"
- file="privacy_page/security_keys_subpage.js"
- type="chrome_html"/>
- <structure name="IDR_SETTINGS_SECURITY_KEYS_SET_PIN_DIALOG_HTML"
- file="privacy_page/security_keys_set_pin_dialog.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SECURITY_KEYS_SET_PIN_DIALOG_JS"
- file="privacy_page/security_keys_set_pin_dialog.js"
- type="chrome_html"/>
- <structure name="IDR_SETTINGS_SECURITY_KEYS_PIN_FIELD_HTML"
- file="privacy_page/security_keys_pin_field.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SECURITY_KEYS_PIN_FIELD_JS"
- file="privacy_page/security_keys_pin_field.js"
- type="chrome_html"/>
- <structure name="IDR_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_DIALOG_HTML"
- file="privacy_page/security_keys_credential_management_dialog.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_DIALOG_JS"
- file="privacy_page/security_keys_credential_management_dialog.js"
- type="chrome_html"/>
- <structure name="IDR_SETTINGS_SECURITY_KEYS_RESET_DIALOG_HTML"
- file="privacy_page/security_keys_reset_dialog.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SECURITY_KEYS_RESET_DIALOG_JS"
- file="privacy_page/security_keys_reset_dialog.js"
- type="chrome_html"/>
- <structure name="IDR_SETTINGS_SECURITY_KEYS_BIO_ENROLL_DIALOG_HTML"
- file="privacy_page/security_keys_bio_enroll_dialog.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SECURITY_KEYS_BIO_ENROLL_DIALOG_JS"
- file="privacy_page/security_keys_bio_enroll_dialog.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SECURITY_KEYS_BROWSER_PROXY_HTML"
- file="privacy_page/security_keys_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SECURITY_KEYS_BROWSER_PROXY_JS"
- file="privacy_page/security_keys_browser_proxy.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_BOOLEAN_CONTROL_BEHAVIOR_HTML"
- file="controls/settings_boolean_control_behavior.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_BOOLEAN_CONTROL_BEHAVIOR_JS"
- file="controls/settings_boolean_control_behavior.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_CONTROLLED_BUTTON_JS"
- file="controls/controlled_button.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_CONTROLLED_BUTTON_HTML"
- file="controls/controlled_button.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_CONTROLLED_RADIO_BUTTON_JS"
- file="controls/controlled_radio_button.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_CONTROLLED_RADIO_BUTTON_HTML"
- file="controls/controlled_radio_button.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_EXTENSION_CONTROLLED_INDICATOR_JS"
- file="controls/extension_controlled_indicator.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_EXTENSION_CONTROLLED_INDICATOR_HTML"
- file="controls/extension_controlled_indicator.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_CHECKBOX_HTML"
- file="controls/settings_checkbox.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_CHECKBOX_JS"
- file="controls/settings_checkbox.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_DROPDOWN_MENU_HTML"
- file="controls/settings_dropdown_menu.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_DROPDOWN_MENU_JS"
- file="controls/settings_dropdown_menu.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_PASSWORD_PROMPT_DIALOG_JS"
- file="controls/password_prompt_dialog.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_PASSWORD_PROMPT_DIALOG_HTML"
- file="controls/password_prompt_dialog.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_CONTROLS_PREF_CONTROL_BEHAVIOR_HTML"
- file="controls/pref_control_behavior.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_PREF_CONTROL_BEHAVIOR_JS"
- file="controls/pref_control_behavior.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_RADIO_GROUP_HTML"
- file="controls/settings_radio_group.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_RADIO_GROUP_JS"
- file="controls/settings_radio_group.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_SETTINGS_IDLE_LOAD_HTML"
- file="controls/settings_idle_load.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_SETTINGS_IDLE_LOAD_JS"
- file="controls/settings_idle_load.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_SLIDER_HTML"
- file="controls/settings_slider.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_SLIDER_JS"
- file="controls/settings_slider.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_TEXTAREA_HTML"
- file="controls/settings_textarea.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_TEXTAREA_JS"
- file="controls/settings_textarea.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_TOGGLE_BUTTON_HTML"
- file="controls/settings_toggle_button.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONTROLS_TOGGLE_BUTTON_JS"
- file="controls/settings_toggle_button.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_COOKIE_INFO_HTML"
- file="site_settings/cookie_info.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_COOKIE_INFO_JS"
- file="site_settings/cookie_info.js"
- type="chrome_html" />
- <if expr="not chromeos">
- <structure name="IDR_SETTINGS_DEFAULT_BROWSER_BROWSER_PROXY_HTML"
- file="default_browser_page/default_browser_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_DEFAULT_BROWSER_BROWSER_PROXY_JS"
- file="default_browser_page/default_browser_browser_proxy.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_DEFAULT_BROWSER_PAGE_HTML"
- file="default_browser_page/default_browser_page.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_DEFAULT_BROWSER_PAGE_JS"
- file="default_browser_page/default_browser_page.js"
- type="chrome_html" />
- </if>
- <structure name="IDR_SETTINGS_DOWNLOADS_BROWSER_PROXY_HTML"
- file="downloads_page/downloads_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_DOWNLOADS_BROWSER_PROXY_JS"
- file="downloads_page/downloads_browser_proxy.js"
- preprocess="true"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_DOWNLOADS_PAGE_HTML"
- file="downloads_page/downloads_page.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_DOWNLOADS_PAGE_JS"
- file="downloads_page/downloads_page.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_I18n_SETUP_HTML"
- file="i18n_setup.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_ICONS"
- file="icons.html"
- type="chrome_html"
- preprocess="true" />
<structure name="IDR_SETTINGS_IMAGES_COOKIES_BANNER_SVG"
file="images/cookies_banner.svg"
+ compress="false"
type="chrome_html" />
<structure name="IDR_SETTINGS_IMAGES_COOKIES_BANNER_DARK_SVG"
file="images/cookies_banner_dark.svg"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_IMAGES_PERMISSIONS_BANNER_SVG"
- file="images/permissions_banner.svg"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_IMAGES_PERMISSIONS_BANNER_DARK_SVG"
- file="images/permissions_banner_dark.svg"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_IMAGES_SAFE_BROWSING_BANNER_SVG"
- file="images/safe_browsing_banner.svg"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_IMAGES_SAFE_BROWSING_BANNER_DARK_SVG"
- file="images/safe_browsing_banner_dark.svg"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_IMAGES_SYNC_BANNER_SVG"
- file="images/sync_banner.svg"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_IMAGES_SYNC_BANNER_DARK_SVG"
- file="images/sync_banner_dark.svg"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_RESET_PAGE_HTML"
- file="reset_page/reset_page.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_RESET_PAGE_JS"
- file="reset_page/reset_page.js"
- preprocess="true"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_RESET_PROFILE_DIALOG_HTML"
- file="reset_page/reset_profile_dialog.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_RESET_PROFILE_DIALOG_JS"
- file="reset_page/reset_profile_dialog.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_RESET_PROFILE_BANNER_HTML"
- file="reset_page/reset_profile_banner.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_RESET_PROFILE_BANNER_JS"
- file="reset_page/reset_profile_banner.js"
- type="chrome_html"/>
- <structure name="IDR_SETTINGS_RESET_BROWSER_PROXY_JS"
- file="reset_page/reset_browser_proxy.js"
- preprocess="true"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_RESET_BROWSER_PROXY_HTML"
- file="reset_page/reset_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_LANGUAGES_HTML"
- file="languages_page/languages.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_LANGUAGES_JS"
- file="languages_page/languages.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_LANGUAGES_BROWSER_PROXY_HTML"
- file="languages_page/languages_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_LANGUAGES_BROWSER_PROXY_JS"
- file="languages_page/languages_browser_proxy.js"
- preprocess="true"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_LANGUAGES_ADD_LANGUAGES_DIALOG_HTML"
- file="languages_page/add_languages_dialog.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_LANGUAGES_ADD_LANGUAGES_DIALOG_JS"
- file="languages_page/add_languages_dialog.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_LANGUAGES_PAGE_HTML"
- file="languages_page/languages_page.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_LANGUAGES_PAGE_JS"
- file="languages_page/languages_page.js"
- type="chrome_html"
- preprocess="true" />
- <if expr="not is_macosx">
- <structure name="IDR_SETTINGS_LANGUAGES_EDIT_DICTIONARY_PAGE_HTML"
- file="languages_page/edit_dictionary_page.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_LANGUAGES_EDIT_DICTIONARY_PAGE_JS"
- file="languages_page/edit_dictionary_page.js"
- type="chrome_html" />
- </if>
- <structure name="IDR_SETTINGS_MEDIA_PICKER_HTML"
- file="site_settings/media_picker.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_MEDIA_PICKER_JS"
- file="site_settings/media_picker.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_AUTOFILL_PAGE_HTML"
- file="autofill_page/autofill_page.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_AUTOFILL_PAGE_JS"
- file="autofill_page/autofill_page.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PAYMENTS_LIST_HTML"
- file="autofill_page/payments_list.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PAYMENTS_LIST_JS"
- file="autofill_page/payments_list.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CREDIT_CARD_LIST_ENTRY_HTML"
- file="autofill_page/credit_card_list_entry.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CREDIT_CARD_LIST_ENTRY_JS"
- file="autofill_page/credit_card_list_entry.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_UPI_ID_LIST_ENTRY_HTML"
- file="autofill_page/upi_id_list_entry.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_UPI_ID_LIST_ENTRY_JS"
- file="autofill_page/upi_id_list_entry.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PASSWORDS_SHARED_CSS_HTML"
- file="autofill_page/passwords_shared_css.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_CREDIT_CARD_EDIT_DIALOG_HTML"
- file="autofill_page/credit_card_edit_dialog.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CREDIT_CARD_EDIT_DIALOG_JS"
- file="autofill_page/credit_card_edit_dialog.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_AUTOFILL_SECTION_HTML"
- file="autofill_page/autofill_section.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_AUTOFILL_SECTION_JS"
- file="autofill_page/autofill_section.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_ADDRESS_EDIT_DIALOG_HTML"
- file="autofill_page/address_edit_dialog.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_ADDRESS_EDIT_DIALOG_JS"
- file="autofill_page/address_edit_dialog.js"
- type="chrome_html" />
- <if expr="chromeos">
- <structure name="IDR_SETTINGS_BLOCKING_REQUEST_MANAGER_HTML"
- file="autofill_page/blocking_request_manager.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_BLOCKING_REQUEST_MANAGER_JS"
- file="autofill_page/blocking_request_manager.js"
- type="chrome_html" />
- </if>
- <structure name="IDR_SETTINGS_SHOW_PASSWORD_BEHAVIOR_HTML"
- file="autofill_page/show_password_behavior.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_SHOW_PASSWORD_BEHAVIOR_JS"
- file="autofill_page/show_password_behavior.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_PASSWORD_CHECK_HTML"
- file="autofill_page/password_check.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_PASSWORD_CHECK_JS"
- file="autofill_page/password_check.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_PASSWORD_CHECK_BEHAVIOR_HTML"
- file="autofill_page/password_check_behavior.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PASSWORD_CHECK_BEHAVIOR_JS"
- file="autofill_page/password_check_behavior.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PASSWORD_CHECK_EDIT_DIALOG_HTML"
- file="autofill_page/password_check_edit_dialog.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PASSWORD_CHECK_EDIT_DIALOG_JS"
- file="autofill_page/password_check_edit_dialog.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PASSWORD_CHECK_LIST_ITEM_HTML"
- file="autofill_page/password_check_list_item.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_PASSWORD_CHECK_LIST_ITEM_JS"
- file="autofill_page/password_check_list_item.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_PASSWORD_LIST_ITEM_HTML"
- file="autofill_page/password_list_item.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_PASSWORD_LIST_ITEM_JS"
- file="autofill_page/password_list_item.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PASSWORD_MANAGER_PROXY_HTML"
- file="autofill_page/password_manager_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PASSWORD_MANAGER_PROXY_JS"
- file="autofill_page/password_manager_proxy.js"
+ compress="false"
type="chrome_html" />
<structure name="IDR_SETTINGS_IMAGES_PASSWORD_CHECK_NEUTRAL_SVG"
file="images/password_check_neutral.svg"
+ compress="false"
type="chrome_html" />
<structure name="IDR_SETTINGS_IMAGES_PASSWORD_CHECK_NEUTRAL_DARK_SVG"
file="images/password_check_neutral_dark.svg"
+ compress="false"
type="chrome_html" />
<structure name="IDR_SETTINGS_IMAGES_PASSWORD_CHECK_POSITIVE_SVG"
file="images/password_check_positive.svg"
+ compress="false"
type="chrome_html" />
<structure name="IDR_SETTINGS_IMAGES_PASSWORD_CHECK_POSITIVE_DARK_SVG"
file="images/password_check_positive_dark.svg"
+ compress="false"
type="chrome_html" />
- <structure name="IDR_SETTINGS_PASSWORDS_SECTION_HTML"
- file="autofill_page/passwords_section.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_PASSWORDS_SECTION_JS"
- file="autofill_page/passwords_section.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_PASSWORD_EDIT_DIALOG_HTML"
- file="autofill_page/password_edit_dialog.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_PASSWORD_EDIT_DIALOG_JS"
- file="autofill_page/password_edit_dialog.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PASSWORDS_EXPORT_DIALOG_HTML"
- file="autofill_page/passwords_export_dialog.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_PASSWORDS_EXPORT_DIALOG_JS"
- file="autofill_page/passwords_export_dialog.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_PASSWORD_REMOVE_CONFIRMATION_DIALOG_HTML"
- file="autofill_page/password_remove_confirmation_dialog.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PASSWORD_REMOVE_CONFIRMATION_DIALOG_JS"
- file="autofill_page/password_remove_confirmation_dialog.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PAYMENTS_SECTION_HTML"
- file="autofill_page/payments_section.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PAYMENTS_SECTION_JS"
- file="autofill_page/payments_section.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PEOPLE_PAGE_HTML"
- file="people_page/people_page.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_PEOPLE_PAGE_JS"
- file="people_page/people_page.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_PEOPLE_PAGE_SYNC_ACCOUNT_CONTROL_HTML"
- file="people_page/sync_account_control.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_PEOPLE_PAGE_SYNC_ACCOUNT_CONTROL_JS"
- file="people_page/sync_account_control.js"
- type="chrome_html"
- preprocess="true" />
- <if expr="not chromeos">
- <structure name="IDR_SETTINGS_PEOPLE_PAGE_IMPORT_DATA_DIALOG_HTML"
- file="people_page/import_data_dialog.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PEOPLE_PAGE_IMPORT_DATA_DIALOG_JS"
- file="people_page/import_data_dialog.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PEOPLE_PAGE_IMPORT_DATA_BROWSER_PROXY_HTML"
- file="people_page/import_data_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PEOPLE_PAGE_IMPORT_DATA_BROWSER_PROXY_JS"
- file="people_page/import_data_browser_proxy.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PEOPLE_PAGE_MANAGE_PROFILE_HTML"
- file="people_page/manage_profile.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PEOPLE_PAGE_MANAGE_PROFILE_JS"
- file="people_page/manage_profile.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PEOPLE_PAGE_MANAGE_PROFILE_BROWSER_PROXY_HTML"
- file="people_page/manage_profile_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PEOPLE_PAGE_MANAGE_PROFILE_BROWSER_PROXY_JS"
- file="people_page/manage_profile_browser_proxy.js"
- type="chrome_html" />
- </if>
- <structure name="IDR_SETTINGS_PEOPLE_PAGE_SIGNOUT_DIALOG_HTML"
- file="people_page/signout_dialog.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_PEOPLE_PAGE_SIGNOUT_DIALOG_JS"
- file="people_page/signout_dialog.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_PEOPLE_PAGE_PROFILE_INFO_BROWSER_PROXY_HTML"
- file="people_page/profile_info_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PEOPLE_PAGE_PROFILE_INFO_BROWSER_PROXY_JS"
- file="people_page/profile_info_browser_proxy.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PEOPLE_PAGE_SYNC_BROWSER_PROXY_HTML"
- file="people_page/sync_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PEOPLE_PAGE_SYNC_BROWSER_PROXY_JS"
- file="people_page/sync_browser_proxy.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_PREF_UTIL_HTML"
- file="prefs/pref_util.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PREF_UTIL_JS"
- file="prefs/pref_util.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PREFS_HTML"
- file="prefs/prefs.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PREFS_JS"
- file="prefs/prefs.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PREFS_BEHAVIOR_HTML"
- file="prefs/prefs_behavior.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PREFS_BEHAVIOR_JS"
- file="prefs/prefs_behavior.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PREFS_TYPES_HTML"
- file="prefs/prefs_types.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PREFS_TYPES_JS"
- file="prefs/prefs_types.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PRINTING_PAGE_HTML"
- file="printing_page/printing_page.html"
- preprocess="true"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PRINTING_PAGE_JS"
- file="printing_page/printing_page.js"
- preprocess="true"
- type="chrome_html" />
- <if expr="not chromeos">
- <structure name="IDR_SETTINGS_PRINTING_BROWSER_PROXY_HTML"
- file="printing_page/printing_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PRINTING_BROWSER_PROXY_JS"
- file="printing_page/printing_browser_proxy.js"
- type="chrome_html" />
- </if>
- <structure name="IDR_SETTINGS_CLOUD_PRINTING_PAGE_HTML"
- file="printing_page/cloud_printers.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CLOUD_PRINTING_PAGE_JS"
- file="printing_page/cloud_printers.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_LOCAL_DATA_BROWSER_PROXY_HTML"
- file="site_settings/local_data_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_LOCAL_DATA_BROWSER_PROXY_JS"
- file="site_settings/local_data_browser_proxy.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_OPEN_WINDOW_PROXY_HTML"
- file="open_window_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_OPEN_WINDOW_PROXY_JS"
- file="open_window_proxy.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PLURAL_STRING_PROXY_HTML"
- file="plural_string_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PLURAL_STRING_PROXY_JS"
- file="plural_string_proxy.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PAGE_VISIBILITY_HTML"
- file="page_visibility.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PAGE_VISIBILITY_JS"
- file="page_visibility.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_PDF_DOCUMENTS_HTML"
- file="site_settings/pdf_documents.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PDF_DOCUMENTS_JS"
- file="site_settings/pdf_documents.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_COOKIES_PAGE_HTML"
- file="privacy_page/cookies_page.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_COOKIES_PAGE_JS"
- file="privacy_page/cookies_page.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_DO_NOT_TRACK_TOGGLE_HTML"
- file="privacy_page/do_not_track_toggle.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_DO_NOT_TRACK_TOGGLE_JS"
- file="privacy_page/do_not_track_toggle.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PERSONALIZATION_OPTIONS_HTML"
- file="privacy_page/personalization_options.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_PERSONALIZATION_OPTIONS_JS"
- file="privacy_page/personalization_options.js"
- preprocess="true"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PASSWORDS_LEAK_DETECTION_TOGGLE_HTML"
- file="privacy_page/passwords_leak_detection_toggle.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PASSWORDS_LEAK_DETECTION_TOGGLE_JS"
- file="privacy_page/passwords_leak_detection_toggle.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_COLLAPSE_RADIO_BUTTON_HTML"
- file="privacy_page/collapse_radio_button.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_COLLAPSE_RADIO_BUTTON_JS"
- file="privacy_page/collapse_radio_button.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SECURE_DNS_HTML"
- file="privacy_page/secure_dns.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SECURE_DNS_JS"
- file="privacy_page/secure_dns.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SECURE_DNS_INPUT_HTML"
- file="privacy_page/secure_dns_input.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SECURE_DNS_INPUT_JS"
- file="privacy_page/secure_dns_input.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SECURITY_PAGE_HTML"
- file="privacy_page/security_page.html"
- preprocess="true"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SECURITY_PAGE_JS"
- file="privacy_page/security_page.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_DISABLE_SAFEBROWSING_DIALOG_HTML"
- file="privacy_page/disable_safebrowsing_dialog.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_DISABLE_SAFEBROWSING_DIALOG_JS"
- file="privacy_page/disable_safebrowsing_dialog.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PRIVACY_PAGE_HTML"
- file="privacy_page/privacy_page.html"
- preprocess="true"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PRIVACY_PAGE_JS"
- file="privacy_page/privacy_page.js"
- preprocess="true"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PRIVACY_PAGE_BROWSER_PROXY_HTML"
- file="privacy_page/privacy_page_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PRIVACY_PAGE_BROWSER_PROXY_JS"
- file="privacy_page/privacy_page_browser_proxy.js"
- preprocess="true"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SAFE_BROWSING_BROWSER_PROXY_HTML"
- file="privacy_page/safe_browsing_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SAFE_BROWSING_BROWSER_PROXY_JS"
- file="privacy_page/safe_browsing_browser_proxy.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SAFETY_CHECK_PAGE_HTML"
- file="safety_check_page/safety_check_page.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SAFETY_CHECK_PAGE_JS"
- file="safety_check_page/safety_check_page.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SAFETY_CHECK_BROWSER_PROXY_HTML"
- file="safety_check_page/safety_check_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SAFETY_CHECK_BROWSER_PROXY_JS"
- file="safety_check_page/safety_check_browser_proxy.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PROTOCOL_HANDLERS_HTML"
- file="site_settings/protocol_handlers.html"
- preprocess="true"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_PROTOCOL_HANDLERS_JS"
- file="site_settings/protocol_handlers.js"
- preprocess="true"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_HATS_BROWSER_PROXY_HTML"
- file="hats_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_HATS_BROWSER_PROXY_JS"
- file="hats_browser_proxy.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_METRICS_BROWSER_PROXY_HTML"
- file="metrics_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_METRICS_BROWSER_PROXY_JS"
- file="metrics_browser_proxy.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_RECENT_SITE_PERMISSIONS_HTML"
- file="site_settings_page/recent_site_permissions.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_RECENT_SITE_PERMISSIONS_JS"
- file="site_settings_page/recent_site_permissions.js"
- preprocess="true"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_ROUTE_HTML"
- file="route.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_ROUTE_JS"
- file="route.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_ROUTER_HTML"
- file="router.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_ROUTER_JS"
- file="router.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SITE_FAVICON_HTML"
- file="site_favicon.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SITE_FAVICON_JS"
- file="site_favicon.js"
- type="chrome_html" />
- <if expr="chromeos">
- <structure name="IDR_SETTINGS_ANDROID_INFO_BROWSER_PROXY_HTML"
- file="site_settings/android_info_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_ANDROID_INFO_BROWSER_PROXY_JS"
- file="site_settings/android_info_browser_proxy.js"
- type="chrome_html" />
- </if>
- <structure name="IDR_SETTINGS_SITE_DATA_HTML"
- file="site_settings/site_data.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SITE_DATA_JS"
- file="site_settings/site_data.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SITE_DATA_DETAILS_SUBPAGE_HTML"
- file="site_settings/site_data_details_subpage.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SITE_DATA_DETAILS_SUBPAGE_JS"
- file="site_settings/site_data_details_subpage.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SITE_DATA_ENTRY_HTML"
- file="site_settings/site_data_entry.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SITE_DATA_ENTRY_JS"
- file="site_settings/site_data_entry.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SITE_LIST_HTML"
- file="site_settings/site_list.html"
- preprocess="true"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SITE_LIST_JS"
- file="site_settings/site_list.js"
- preprocess="true"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SITE_LIST_ENTRY_HTML"
- file="site_settings/site_list_entry.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SITE_LIST_ENTRY_JS"
- file="site_settings/site_list_entry.js"
- preprocess="true"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SITE_SETTINGS_BEHAVIOR_HTML"
- file="site_settings/site_settings_behavior.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SITE_SETTINGS_BEHAVIOR_JS"
- file="site_settings/site_settings_behavior.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_CONSTANTS_JS"
- file="site_settings/constants.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_CONSTANTS_HTML"
- file="site_settings/constants.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SITE_SETTINGS_PAGE_HTML"
- file="site_settings_page/site_settings_page.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SITE_SETTINGS_PAGE_JS"
- file="site_settings_page/site_settings_page.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_SITE_SETTINGS_LIST_HTML"
- file="site_settings_page/site_settings_list.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SITE_SETTINGS_LIST_JS"
- file="site_settings_page/site_settings_list.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SITE_SETTINGS_PREFS_BROWSER_PROXY_HTML"
- file="site_settings/site_settings_prefs_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SITE_SETTINGS_PREFS_BROWSER_PROXY_JS"
- file="site_settings/site_settings_prefs_browser_proxy.js"
- preprocess="true"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SITE_DETAILS_HTML"
- file="site_settings/site_details.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_SITE_DETAILS_JS"
- file="site_settings/site_details.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_SITE_DETAILS_PERMISSION_HTML"
- file="site_settings/site_details_permission.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SITE_DETAILS_PERMISSION_JS"
- file="site_settings/site_details_permission.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINE_DIALOG_JS"
- file="search_engines_page/search_engine_dialog.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINE_DIALOG_HTML"
- file="search_engines_page/search_engine_dialog.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINE_ENTRY_JS"
- file="search_engines_page/search_engine_entry.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINE_ENTRY_HTML"
- file="search_engines_page/search_engine_entry.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINE_ENTRY_CSS_HTML"
- file="search_engines_page/search_engine_entry_css.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_OMNIBOX_EXTENSION_ENTRY_JS"
- file="search_engines_page/omnibox_extension_entry.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_OMNIBOX_EXTENSION_ENTRY_HTML"
- file="search_engines_page/omnibox_extension_entry.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINES_LIST_JS"
- file="search_engines_page/search_engines_list.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINES_LIST_HTML"
- file="search_engines_page/search_engines_list.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINES_PAGE_JS"
- file="search_engines_page/search_engines_page.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINES_PAGE_HTML"
- file="search_engines_page/search_engines_page.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_SEARCH_ENGINES_BROWSER_PROXY_JS"
- file="search_engines_page/search_engines_browser_proxy.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_SEARCH_ENGINES_BROWSER_PROXY_HTML"
- file="search_engines_page/search_engines_browser_proxy.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_SEARCH_PAGE_JS"
- file="search_page/search_page.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SEARCH_PAGE_HTML"
- file="search_page/search_page.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SYNC_CONTROLS_JS"
- file="people_page/sync_controls.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SYNC_CONTROLS_HTML"
- file="people_page/sync_controls.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SYNC_ENCRYPTION_OPTIONS_JS"
- file="people_page/sync_encryption_options.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SYNC_ENCRYPTION_OPTIONS_HTML"
- file="people_page/sync_encryption_options.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SYNC_PAGE_JS"
- file="people_page/sync_page.js"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_SETTINGS_SYNC_PAGE_HTML"
- file="people_page/sync_page.html"
- type="chrome_html"
- preprocess="true" />
- <if expr="not chromeos">
- <structure name="IDR_SETTINGS_SYSTEM_PAGE_BROWSER_PROXY_HTML"
- file="system_page/system_page_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SYSTEM_PAGE_BROWSER_PROXY"
- file="system_page/system_page_browser_proxy.js"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SYSTEM_PAGE_HTML"
- file="system_page/system_page.html"
- preprocess="true"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_SYSTEM_PAGE_JS"
- file="system_page/system_page.js"
- type="chrome_html" />
- </if>
- <structure name="IDR_SETTINGS_SETTINGS_HTML"
- preprocess="true"
- file="settings.html"
- type="chrome_html" />
- <structure name="IDR_SETTINGS_LAZY_LOAD_HTML"
- preprocess="true"
- file="lazy_load.html"
+ <structure name="IDR_SETTINGS_IMAGES_PERMISSIONS_BANNER_SVG"
+ file="images/permissions_banner.svg"
+ compress="false"
type="chrome_html" />
- <structure name="IDR_SETTINGS_ENSURE_LAZY_LOADED_HTML"
- file="ensure_lazy_loaded.html"
+ <structure name="IDR_SETTINGS_IMAGES_PERMISSIONS_BANNER_DARK_SVG"
+ file="images/permissions_banner_dark.svg"
+ compress="false"
type="chrome_html" />
- <structure name="IDR_SETTINGS_WEBSITE_USAGE_BROWSER_PROXY_HTML"
- file="site_settings/website_usage_browser_proxy.html"
+ <structure name="IDR_SETTINGS_IMAGES_SAFE_BROWSING_BANNER_SVG"
+ file="images/safe_browsing_banner.svg"
+ compress="false"
type="chrome_html" />
- <structure name="IDR_SETTINGS_WEBSITE_USAGE_BROWSER_PROXY_JS"
- file="site_settings/website_usage_browser_proxy.js"
+ <structure name="IDR_SETTINGS_IMAGES_SAFE_BROWSING_BANNER_DARK_SVG"
+ file="images/safe_browsing_banner_dark.svg"
+ compress="false"
type="chrome_html" />
- <structure name="IDR_SETTINGS_ZOOM_LEVELS_HTML"
- file="site_settings/zoom_levels.html"
+ <structure name="IDR_SETTINGS_IMAGES_SYNC_BANNER_SVG"
+ file="images/sync_banner.svg"
+ compress="false"
type="chrome_html" />
- <structure name="IDR_SETTINGS_ZOOM_LEVELS_JS"
- file="site_settings/zoom_levels.js"
+ <structure name="IDR_SETTINGS_IMAGES_SYNC_BANNER_DARK_SVG"
+ file="images/sync_banner_dark.svg"
+ compress="false"
type="chrome_html" />
- <if expr="chromeos">
- <structure name="IDR_SETTINGS_PEOPLE_PAGE_ACCOUNT_MANAGER_BROWSER_PROXY_HTML"
- file="people_page/account_manager_browser_proxy.html"
- type="chrome_html"/>
- <structure name="IDR_SETTINGS_PEOPLE_PAGE_ACCOUNT_MANAGER_BROWSER_PROXY_JS"
- file="people_page/account_manager_browser_proxy.js"
- type="chrome_html"/>
- </if>
</structures>
</release>
</grit>
diff --git a/chromium/chrome/browser/resources/settings/settings_resources_v3.grdp b/chromium/chrome/browser/resources/settings/settings_resources_v3.grdp
index c519226f257..4953d88930c 100644
--- a/chromium/chrome/browser/resources/settings/settings_resources_v3.grdp
+++ b/chromium/chrome/browser/resources/settings/settings_resources_v3.grdp
@@ -1,815 +1,803 @@
<?xml version="1.0" encoding="utf-8"?>
<grit-part>
<!-- Polymer 3.0 Elements -->
- <include name="IDR_SETTINGS_A11Y_PAGE_A11Y_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/a11y_page/a11y_page.m.js"
+ <include name="IDR_SETTINGS_A11Y_PAGE_A11Y_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/a11y_page/a11y_page.js"
use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
<if expr="not is_macosx and not chromeos">
<include name="IDR_SETTINGS_A11Y_PAGE_CAPTIONS_SUBPAGE_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/a11y_page/captions_subpage.m.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
</if>
<if expr="is_win or is_macosx">
- <include name="IDR_SETTINGS_A11Y_PAGE_CAPTIONS_BROWSER_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/a11y_page/captions_browser_proxy.m.js"
- use_base_dir="false"
- type="BINDATA" />
+ <include name="IDR_SETTINGS_A11Y_PAGE_CAPTIONS_BROWSER_PROXY_JS"
+ file="a11y_page/captions_browser_proxy.js"
+ compress="false" type="BINDATA" />
</if>
<include name="IDR_SETTINGS_ABOUT_PAGE_ABOUT_PAGE_BROWSER_PROXY_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/about_page/about_page_browser_proxy.m.js"
use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
<include name="IDR_SETTINGS_ABOUT_PAGE_ABOUT_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/about_page/about_page.m.js"
+ file="${root_gen_dir}/chrome/browser/resources/settings/about_page/about_page.js"
use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
- <include name="IDR_SETTINGS_APPEARANCE_PAGE_APPEARANCE_BROWSER_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/appearance_page/appearance_browser_proxy.m.js"
- use_base_dir="false"
+ <include name="IDR_SETTINGS_APPEARANCE_PAGE_APPEARANCE_BROWSER_PROXY_JS"
+ file="appearance_page/appearance_browser_proxy.js"
preprocess="true"
- type="BINDATA" />
- <include name="IDR_SETTINGS_APPEARANCE_PAGE_APPEARANCE_FONTS_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_APPEARANCE_PAGE_APPEARANCE_FONTS_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_APPEARANCE_PAGE_APPEARANCE_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/appearance_page/appearance_page.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_APPEARANCE_PAGE_APPEARANCE_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/appearance_page/appearance_page.js"
use_base_dir="false"
preprocess="true"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_APPEARANCE_PAGE_FONTS_BROWSER_PROXY_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/appearance_page/fonts_browser_proxy.m.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_APPEARANCE_PAGE_HOME_URL_INPUT_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/appearance_page/home_url_input.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_APPEARANCE_PAGE_HOME_URL_INPUT_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/appearance_page/home_url_input.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_AUTOFILL_PAGE_AUTOFILL_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/autofill_page.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_AUTOFILL_PAGE_AUTOFILL_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/autofill_page.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_AUTOFILL_PAGE_PAYMENTS_LIST_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/payments_list.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_AUTOFILL_PAGE_PAYMENTS_LIST_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/payments_list.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_AUTOFILL_PAGE_CREDIT_CARD_LIST_ENTRY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/credit_card_list_entry.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_AUTOFILL_PAGE_CREDIT_CARD_LIST_ENTRY_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/credit_card_list_entry.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_AUTOFILL_PAGE_UPI_ID_LIST_ENTRY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/upi_id_list_entry.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_AUTOFILL_PAGE_UPI_ID_LIST_ENTRY_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/upi_id_list_entry.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORDS_SHARED_CSS_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/passwords_shared_css.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORDS_SHARED_CSS_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/passwords_shared_css.js"
use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
- <include name="IDR_SETTINGS_AUTOFILL_PAGE_CREDIT_CARD_EDIT_DIALOG_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/credit_card_edit_dialog.m.js"
+ <include name="IDR_SETTINGS_AUTOFILL_PAGE_CREDIT_CARD_EDIT_DIALOG_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/credit_card_edit_dialog.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_AUTOFILL_PAGE_AUTOFILL_SECTION_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/autofill_section.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_AUTOFILL_PAGE_AUTOFILL_SECTION_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/autofill_section.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_AUTOFILL_PAGE_ADDRESS_EDIT_DIALOG_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/address_edit_dialog.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_AUTOFILL_PAGE_ADDRESS_EDIT_DIALOG_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/address_edit_dialog.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<if expr="chromeos">
- <include name="IDR_SETTINGS_AUTOFILL_PAGE_BLOCKING_REQUEST_MANAGER_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/blocking_request_manager.m.js"
- use_base_dir="false"
- type="BINDATA" />
+ <include name="IDR_SETTINGS_AUTOFILL_PAGE_BLOCKING_REQUEST_MANAGER_JS"
+ file="autofill_page/blocking_request_manager.js"
+ compress="false" type="BINDATA" />
</if>
- <include name="IDR_SETTINGS_AUTOFILL_PAGE_SHOW_PASSWORD_BEHAVIOR_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/show_password_behavior.m.js"
- use_base_dir="false"
- type="BINDATA"
+ <include name="IDR_SETTINGS_AUTOFILL_PAGE_SHOW_PASSWORD_BEHAVIOR_JS"
+ file="autofill_page/show_password_behavior.js"
+ compress="false" type="BINDATA"
preprocess="true" />
- <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_CHECK_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/password_check.m.js"
+ <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_CHECK_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/password_check.js"
use_base_dir="false"
- type="BINDATA"
+ preprocess="true"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_CHECK_BEHAVIOR_JS"
+ file="autofill_page/password_check_behavior.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_CHECK_EDIT_DIALOG_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/password_check_edit_dialog.js"
+ use_base_dir="false"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_CHECK_EDIT_DISCLAIMER_DIALOG_M_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/password_check_edit_disclaimer_dialog.js"
+ use_base_dir="false"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_CHECK_LIST_ITEM_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/password_check_list_item.js"
+ use_base_dir="false"
+ compress="false" type="BINDATA"
preprocess="true"/>
- <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_CHECK_BEHAVIOR_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/password_check_behavior.m.js"
+ <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_LIST_ITEM_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/password_list_item.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_CHECK_EDIT_DIALOG_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/password_check_edit_dialog.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_MANAGER_PROXY_JS"
+ file="autofill_page/password_manager_proxy.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_REMOVE_CONFIRMATION_DIALOG_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/password_remove_confirmation_dialog.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_CHECK_LIST_ITEM_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/password_check_list_item.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORDS_SECTION_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/passwords_section.js"
use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
- <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_LIST_ITEM_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/password_list_item.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_MANAGER_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/password_manager_proxy.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_REMOVE_CONFIRMATION_DIALOG_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/password_remove_confirmation_dialog.m.js"
+ <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_EDIT_DIALOG_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/password_edit_dialog.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORDS_SECTION_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/passwords_section.m.js"
- use_base_dir="false"
- type="BINDATA"
- preprocess="true" />
- <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_EDIT_DIALOG_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/password_edit_dialog.m.js"
- use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
- <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORDS_EXPORT_DIALOG_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/passwords_export_dialog.m.js"
+ <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORDS_EXPORT_DIALOG_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/passwords_export_dialog.js"
use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
- <include name="IDR_SETTINGS_AUTOFILL_PAGE_PAYMENTS_SECTION_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/payments_section.m.js"
+ <include name="IDR_SETTINGS_AUTOFILL_PAGE_PAYMENTS_SECTION_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/payments_section.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_BASIC_PAGE_BASIC_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/basic_page/basic_page.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_BASIC_PAGE_BASIC_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/basic_page/basic_page.js"
use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
<if expr="is_win">
- <include name="IDR_SETTINGS_CHROME_CLEANUP_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/chrome_cleanup_page/chrome_cleanup_proxy.m.js"
+ <include name="IDR_SETTINGS_CHROME_CLEANUP_PROXY_JS"
+ file="chrome_cleanup_page/chrome_cleanup_proxy.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_CHROME_CLEANUP_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/chrome_cleanup_page/chrome_cleanup_page.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_CHROME_CLEANUP_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/chrome_cleanup_page/chrome_cleanup_page.m.js"
- use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
- <include name="IDR_SETTINGS_CHROME_CLEANUP_ITEMS_TO_REMOVE_LIST_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/chrome_cleanup_page/items_to_remove_list.m.js"
+ <include name="IDR_SETTINGS_CHROME_CLEANUP_ITEMS_TO_REMOVE_LIST_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/chrome_cleanup_page/items_to_remove_list.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
</if>
<include name="IDR_SETTINGS_CLEAR_BROWSING_DATA_DIALOG_CLEAR_BROWSING_DATA_BROWSER_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_browser_proxy.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_CLEAR_BROWSING_DATA_DIALOG_CLEAR_BROWSING_DATA_DIALOG_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.m.js"
+ file="clear_browsing_data_dialog/clear_browsing_data_browser_proxy.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_CLEAR_BROWSING_DATA_DIALOG_CLEAR_BROWSING_DATA_DIALOG_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.js"
use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
- <include name="IDR_SETTINGS_CLEAR_BROWSING_DATA_DIALOG_HISTORY_DELETION_DIALOG_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/clear_browsing_data_dialog/history_deletion_dialog.m.js"
+ <include name="IDR_SETTINGS_CLEAR_BROWSING_DATA_DIALOG_HISTORY_DELETION_DIALOG_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/clear_browsing_data_dialog/history_deletion_dialog.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_CLEAR_BROWSING_DATA_DIALOG_INSTALLED_APP_CHECKBOX_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/clear_browsing_data_dialog/installed_app_checkbox.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_CLEAR_BROWSING_DATA_DIALOG_INSTALLED_APP_CHECKBOX_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/clear_browsing_data_dialog/installed_app_checkbox.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_CONTROLS_CONTROLLED_BUTTON_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/controls/controlled_button.m.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_CONTROLS_CONTROLLED_RADIO_BUTTON_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/controls/controlled_radio_button.m.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_CONTROLS_EXTENSION_CONTROLLED_INDICATOR_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/controls/extension_controlled_indicator.m.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_CONTROLS_PASSWORD_PROMPT_DIALOG_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/controls/password_prompt_dialog.m.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_CONTROLS_SETTINGS_BOOLEAN_CONTROL_BEHAVIOR_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/controls/settings_boolean_control_behavior.m.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_CONTROLS_SETTINGS_CHECKBOX_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/controls/settings_checkbox.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_CONTROLS_SETTINGS_CHECKBOX_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/controls/settings_checkbox.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_CONTROLS_SETTINGS_DROPDOWN_MENU_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/controls/settings_dropdown_menu.m.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_CONTROLS_SETTINGS_IDLE_LOAD_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/controls/settings_idle_load.m.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_CONTROLS_PREF_CONTROL_BEHAVIOR_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/controls/pref_control_behavior.m.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_CONTROLS_SETTINGS_RADIO_GROUP_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/controls/settings_radio_group.m.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_CONTROLS_SETTINGS_SLIDER_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/controls/settings_slider.m.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_CONTROLS_SETTINGS_TEXTAREA_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/controls/settings_textarea.m.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_CONTROLS_SETTINGS_TOGGLE_BUTTON_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/controls/settings_toggle_button.m.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<if expr="not chromeos">
- <include name="IDR_SETTINGS_DEFAULT_BROWSER_BROWSER_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/default_browser_page/default_browser_browser_proxy.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_DEFAULT_BROWSER_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/default_browser_page/default_browser_page.m.js"
+ <include name="IDR_SETTINGS_DEFAULT_BROWSER_BROWSER_PROXY_JS"
+ file="default_browser_page/default_browser_browser_proxy.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_DEFAULT_BROWSER_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/default_browser_page/default_browser_page.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
</if>
- <include name="IDR_SETTINGS_DOWNLOADS_BROWSER_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/downloads_page/downloads_browser_proxy.m.js"
- use_base_dir="false"
- type="BINDATA"
+ <include name="IDR_SETTINGS_DOWNLOADS_PAGE_DOWNLOADS_BROWSER_PROXY_JS"
+ file="downloads_page/downloads_browser_proxy.js"
+ compress="false" type="BINDATA"
preprocess="true" />
- <include name="IDR_SETTINGS_DOWNLOADS_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/downloads_page/downloads_page.m.js"
+ <include name="IDR_SETTINGS_DOWNLOADS_PAGE_DOWNLOADS_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/downloads_page/downloads_page.js"
use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
<include name="IDR_SETTINGS_ENSURE_LAZY_LOADED_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/ensure_lazy_loaded.m.js"
+ file="ensure_lazy_loaded.js"
preprocess="true"
- use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_EXTENSION_CONTROL_BROWSER_PROXY_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/extension_control_browser_proxy.m.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_GLOBAL_SCROLL_TARGET_BEHAVIOR_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/global_scroll_target_behavior.m.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_HATS_BROWSER_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/hats_browser_proxy.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_I18N_SETUP_M_JS"
- file="i18n_setup.m.js"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_HATS_BROWSER_PROXY_JS"
+ file="hats_browser_proxy.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_I18N_SETUP_JS"
+ file="i18n_setup.js"
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_ICONS_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/icons.m.js"
use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
<if expr="is_win and _google_chrome">
- <include name="IDR_SETTINGS_INCOMPATIBLE_APPLICATIONS_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/incompatible_applications_page/incompatible_applications_page.m.js"
+ <include name="IDR_SETTINGS_INCOMPATIBLE_APPLICATIONS_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/incompatible_applications_page/incompatible_applications_page.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_INCOMPATIBLE_APPLICATIONS_BROWSER_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/incompatible_applications_page/incompatible_applications_browser_proxy.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_INCOMPATIBLE_APPLICATIONS_BROWSER_PROXY_JS"
+ file="incompatible_applications_page/incompatible_applications_browser_proxy.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_INCOMPATIBLE_APPLICATIONS_INCOMPATIBLE_APPLICATION_ITEM_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/incompatible_applications_page/incompatible_application_item.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_INCOMPATIBLE_APPLICATIONS_INCOMPATIBLE_APPLICATION_ITEM_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/incompatible_applications_page/incompatible_application_item.m.js"
- use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
</if>
<include name="IDR_SETTINGS_LANGUAGES_PAGE_LANGUAGES_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/languages_page/languages.m.js"
use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
<include name="IDR_SETTINGS_LANGUAGES_PAGE_LANGUAGES_BROWSER_PROXY_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/languages_page/languages_browser_proxy.m.js"
use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
- <include name="IDR_SETTINGS_LANGUAGES_PAGE_ADD_LANGUAGES_DIALOG_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/languages_page/add_languages_dialog.m.js"
+ <include name="IDR_SETTINGS_LANGUAGES_PAGE_ADD_LANGUAGES_DIALOG_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/languages_page/add_languages_dialog.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_LANGUAGES_PAGE_LANGUAGES_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/languages_page/languages_page.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_LANGUAGES_PAGE_LANGUAGES_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/languages_page/languages_page.js"
use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
<if expr="not is_macosx">
- <include name="IDR_SETTINGS_LANGUAGES_PAGE_EDIT_DICTIONARY_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/languages_page/edit_dictionary_page.m.js"
+ <include name="IDR_SETTINGS_LANGUAGES_PAGE_EDIT_DICTIONARY_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/languages_page/edit_dictionary_page.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
</if>
<include name="IDR_SETTINGS_LAZY_LOAD_V3_JS"
file="lazy_load.js"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
<include name="IDR_SETTINGS_LIFETIME_BROWSER_PROXY_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/lifetime_browser_proxy.m.js"
use_base_dir="false"
- type="BINDATA"
- preprocess="true" />
- <include name="IDR_SETTINGS_MENU_SETTINGS_MENU_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/settings_menu/settings_menu.m.js"
- use_base_dir="false"
- type="BINDATA"
- preprocess="true" />
- <include name="IDR_SETTINGS_METRICS_BROWSER_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/metrics_browser_proxy.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_ON_STARTUP_PAGE_ON_STARTUP_BROWSER_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/on_startup_page/on_startup_browser_proxy.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_ON_STARTUP_PAGE_ON_STARTUP_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/on_startup_page/on_startup_page.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_ON_STARTUP_PAGE_STARTUP_URL_DIALOG_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/on_startup_page/startup_url_dialog.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_ON_STARTUP_PAGE_STARTUP_URL_ENTRY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/on_startup_page/startup_url_entry.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_ON_STARTUP_PAGE_STARTUP_URLS_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/on_startup_page/startup_urls_page.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_ON_STARTUP_PAGE_STARTUP_URLS_PAGE_BROWSER_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/on_startup_page/startup_urls_page_browser_proxy.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_OPEN_WINDOW_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/open_window_proxy.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PAGE_VISIBILITY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/page_visibility.m.js"
- use_base_dir="false"
+ compress="false" type="BINDATA"
+ preprocess="true" />
+ <include name="IDR_SETTINGS_MENU_SETTINGS_MENU_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/settings_menu/settings_menu.js"
+ use_base_dir="false"
+ compress="false" type="BINDATA"
+ preprocess="true" />
+ <include name="IDR_SETTINGS_METRICS_BROWSER_PROXY_JS"
+ file="metrics_browser_proxy.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_ON_STARTUP_PAGE_ON_STARTUP_BROWSER_PROXY_JS"
+ file="on_startup_page/on_startup_browser_proxy.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_ON_STARTUP_PAGE_ON_STARTUP_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/on_startup_page/on_startup_page.js"
+ use_base_dir="false"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_ON_STARTUP_PAGE_STARTUP_URL_DIALOG_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/on_startup_page/startup_url_dialog.js"
+ use_base_dir="false"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_ON_STARTUP_PAGE_STARTUP_URL_ENTRY_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/on_startup_page/startup_url_entry.js"
+ use_base_dir="false"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_ON_STARTUP_PAGE_STARTUP_URLS_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/on_startup_page/startup_urls_page.js"
+ use_base_dir="false"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_ON_STARTUP_PAGE_STARTUP_URLS_PAGE_BROWSER_PROXY_JS"
+ file="on_startup_page/startup_urls_page_browser_proxy.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_OPEN_WINDOW_PROXY_JS"
+ file="open_window_proxy.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PAGE_VISIBILITY_JS"
+ file="page_visibility.js"
preprocess="true"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<if expr="not chromeos">
- <include name="IDR_SETTINGS_PEOPLE_PAGE_IMPORT_DATA_DIALOG_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/people_page/import_data_dialog.m.js"
+ <include name="IDR_SETTINGS_PEOPLE_PAGE_IMPORT_DATA_DIALOG_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/people_page/import_data_dialog.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PEOPLE_PAGE_IMPORT_DATA_BROWSER_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/people_page/import_data_browser_proxy.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PEOPLE_PAGE_IMPORT_DATA_BROWSER_PROXY_JS"
+ file="people_page/import_data_browser_proxy.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PEOPLE_PAGE_MANAGE_PROFILE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/people_page/manage_profile.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PEOPLE_PAGE_MANAGE_PROFILE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/people_page/manage_profile.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PEOPLE_PAGE_MANAGE_PROFILE_BROWSER_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/people_page/manage_profile_browser_proxy.m.js"
- use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PEOPLE_PAGE_MANAGE_PROFILE_BROWSER_PROXY_JS"
+ file="people_page/manage_profile_browser_proxy.js"
+ compress="false" type="BINDATA" />
</if>
<if expr="chromeos">
<include name="IDR_SETTINGS_PEOPLE_PAGE_ACCOUNT_MANAGER_BROWSER_PROXY_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/people_page/account_manager_browser_proxy.m.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
</if>
<include name="IDR_SETTINGS_PEOPLE_PAGE_SYNC_ACCOUNT_CONTROL_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/people_page/sync_account_control.m.js"
use_base_dir="false"
preprocess="true"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_PEOPLE_PAGE_SYNC_BROWSER_PROXY_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/people_page/sync_browser_proxy.m.js"
use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
<include name="IDR_SETTINGS_PEOPLE_PAGE_SYNC_ENCRYPTION_OPTIONS_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/people_page/sync_encryption_options.m.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PEOPLE_PAGE_PEOPLE_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/people_page/people_page.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PEOPLE_PAGE_PEOPLE_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/people_page/people_page.js"
use_base_dir="false"
preprocess="true"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_PEOPLE_PAGE_PROFILE_INFO_BROWSER_PROXY_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/people_page/profile_info_browser_proxy.m.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_PEOPLE_PAGE_SIGNOUT_DIALOG_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/people_page/signout_dialog.m.js"
use_base_dir="false"
preprocess="true"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_PEOPLE_PAGE_SYNC_CONTROLS_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/people_page/sync_controls.m.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_PEOPLE_PAGE_SYNC_PAGE_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/people_page/sync_page.m.js"
use_base_dir="false"
preprocess="true"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PLURAL_STRING_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/plural_string_proxy.m.js"
- use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PLURAL_STRING_PROXY_JS"
+ file="plural_string_proxy.js"
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_PREFS_PREFS_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/prefs/prefs.m.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_PREFS_PREFS_BEHAVIOR_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/prefs/prefs_behavior.m.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_PREFS_PREFS_TYPES_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/prefs/prefs_types.m.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_PREFS_PREF_UTIL_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/prefs/pref_util.m.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PRINTING_PAGE_CLOUD_PRINTERS_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/printing_page/cloud_printers.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PRINTING_PAGE_CLOUD_PRINTERS_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/printing_page/cloud_printers.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PRINTING_PAGE_PRINTING_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/printing_page/printing_page.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PRINTING_PAGE_PRINTING_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/printing_page/printing_page.js"
use_base_dir="false"
preprocess="true"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PRIVACY_PAGE_COLLAPSE_RADIO_BUTTON_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/collapse_radio_button.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PRIVACY_PAGE_COLLAPSE_RADIO_BUTTON_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/collapse_radio_button.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PRIVACY_PAGE_COOKIES_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/cookies_page.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PRIVACY_PAGE_COOKIES_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/cookies_page.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PRIVACY_PAGE_DO_NOT_TRACK_TOGGLE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/do_not_track_toggle.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PRIVACY_PAGE_DO_NOT_TRACK_TOGGLE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/do_not_track_toggle.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PRIVACY_PAGE_PRIVACY_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/privacy_page.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PRIVACY_PAGE_PRIVACY_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/privacy_page.js"
use_base_dir="false"
preprocess="true"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PRIVACY_PAGE_PASSWORDS_LEAK_DETECTION_TOGGLE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/passwords_leak_detection_toggle.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PRIVACY_PAGE_PASSWORDS_LEAK_DETECTION_TOGGLE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/passwords_leak_detection_toggle.js"
use_base_dir="false"
preprocess="true"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_PRIVACY_PAGE_PERSONALIZATION_OPTIONS_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/personalization_options.m.js"
use_base_dir="false"
preprocess="true"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_PRIVACY_PAGE_BROWSER_PROXY_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/privacy_page_browser_proxy.m.js"
use_base_dir="false"
preprocess="true"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PRIVACY_PAGE_SAFE_BROWSING_BROWSER_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/safe_browsing_browser_proxy.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PRIVACY_PAGE_SAFE_BROWSING_BROWSER_PROXY_JS"
+ file="privacy_page/safe_browsing_browser_proxy.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURE_DNS_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/secure_dns.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURE_DNS_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/secure_dns.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURE_DNS_INPUT_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/secure_dns_input.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURE_DNS_INPUT_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/secure_dns_input.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_page.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_page.js"
use_base_dir="false"
preprocess="true"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PRIVACY_PAGE_DISABLE_SAFEBROWSING_DIALOG_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/disable_safebrowsing_dialog.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_KEYS_BIO_ENROLL_DIALOG_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_keys_bio_enroll_dialog.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PRIVACY_PAGE_DISABLE_SAFEBROWSING_DIALOG_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/disable_safebrowsing_dialog.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_KEYS_BROWSER_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_keys_browser_proxy.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_KEYS_BIO_ENROLL_DIALOG_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_keys_bio_enroll_dialog.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_DIALOG_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_keys_credential_management_dialog.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_KEYS_BROWSER_PROXY_JS"
+ file="privacy_page/security_keys_browser_proxy.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_DIALOG_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_keys_credential_management_dialog.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_KEYS_PIN_FIELD_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_keys_pin_field.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_KEYS_PIN_FIELD_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_keys_pin_field.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_KEYS_RESET_DIALOG_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_keys_reset_dialog.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_KEYS_RESET_DIALOG_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_keys_reset_dialog.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_KEYS_SET_PIN_DIALOG_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_keys_set_pin_dialog.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_KEYS_SET_PIN_DIALOG_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_keys_set_pin_dialog.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_KEYS_SUBPAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_keys_subpage.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_KEYS_SUBPAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_keys_subpage.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_RESET_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/reset_page/reset_page.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_RESET_PAGE_RESET_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/reset_page/reset_page.js"
use_base_dir="false"
preprocess="true"
- type="BINDATA" />
- <include name="IDR_SETTINGS_RESET_PROFILE_DIALOG_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/reset_page/reset_profile_dialog.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_RESET_PROFILE_BANNER_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/reset_page/reset_profile_banner.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_RESET_PAGE_RESET_PROFILE_DIALOG_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/reset_page/reset_profile_dialog.js"
use_base_dir="false"
- type="BINDATA"/>
- <include name="IDR_SETTINGS_RESET_BROWSER_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/reset_page/reset_browser_proxy.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_RESET_PAGE_RESET_PROFILE_BANNER_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/reset_page/reset_profile_banner.js"
use_base_dir="false"
+ compress="false" type="BINDATA"/>
+ <include name="IDR_SETTINGS_RESET_PAGE_RESET_BROWSER_PROXY_JS"
+ file="reset_page/reset_browser_proxy.js"
preprocess="true"
- type="BINDATA" />
- <include name="IDR_SETTINGS_ROUTE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/route.m.js"
- use_base_dir="false"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_ROUTE_JS"
+ file="route.js"
preprocess="true"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_ROUTER_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/router.m.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SAFETY_CHECK_PAGE_SAFETY_CHECK_BROWSER_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/safety_check_page/safety_check_browser_proxy.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SAFETY_CHECK_PAGE_SAFETY_CHECK_BROWSER_PROXY_JS"
+ file="safety_check_page/safety_check_browser_proxy.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SAFETY_CHECK_PAGE_SAFETY_CHECK_CHILD_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/safety_check_page/safety_check_child.js"
+ use_base_dir="false"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SAFETY_CHECK_PAGE_SAFETY_CHECK_EXTENSIONS_ELEMENT_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/safety_check_page/safety_check_extensions_element.js"
+ use_base_dir="false"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SAFETY_CHECK_PAGE_SAFETY_CHECK_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/safety_check_page/safety_check_page.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SAFETY_CHECK_PAGE_SAFETY_CHECK_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/safety_check_page/safety_check_page.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SAFETY_CHECK_PAGE_SAFETY_CHECK_PASSWORDS_ELEMENT_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/safety_check_page/safety_check_passwords_element.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SAFETY_CHECK_PAGE_SAFETY_CHECK_SAFE_BROWSING_ELEMENT_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/safety_check_page/safety_check_safe_browsing_element.js"
+ use_base_dir="false"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SAFETY_CHECK_PAGE_SAFETY_CHECK_UPDATES_ELEMENT_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/safety_check_page/safety_check_updates_element.js"
+ use_base_dir="false"
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_SEARCH_ENGINES_BROWSER_PROXY_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/search_engines_page/search_engines_browser_proxy.m.js"
use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
- <include name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_OMNIBOX_EXTENSION_ENTRY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/search_engines_page/omnibox_extension_entry.m.js"
+ <include name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_OMNIBOX_EXTENSION_ENTRY_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/search_engines_page/omnibox_extension_entry.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINE_DIALOG_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/search_engines_page/search_engine_dialog.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINE_DIALOG_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/search_engines_page/search_engine_dialog.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINE_ENTRY_CSS_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/search_engines_page/search_engine_entry_css.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINE_ENTRY_CSS_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/search_engines_page/search_engine_entry_css.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINE_ENTRY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/search_engines_page/search_engine_entry.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINE_ENTRY_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/search_engines_page/search_engine_entry.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINES_LIST_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/search_engines_page/search_engines_list.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINES_LIST_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/search_engines_page/search_engines_list.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINES_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/search_engines_page/search_engines_page.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINES_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/search_engines_page/search_engines_page.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SEARCH_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/search_page/search_page.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SEARCH_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/search_page/search_page.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_SEARCH_SETTINGS_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/search_settings.m.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SETTINGS_MAIN_SETTINGS_MAIN_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/settings_main/settings_main.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SETTINGS_MAIN_SETTINGS_MAIN_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/settings_main/settings_main.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_SETTINGS_PAGE_MAIN_PAGE_BEHAVIOR_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/settings_page/main_page_behavior.m.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_SETTINGS_PAGE_SETTINGS_ANIMATED_PAGES_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/settings_page/settings_animated_pages.m.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_SETTINGS_PAGE_SETTINGS_SECTION_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/settings_page/settings_section.m.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_SETTINGS_PAGE_SETTINGS_SUBPAGE_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/settings_page/settings_subpage.m.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SETTINGS_UI_SETTINGS_UI_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/settings_ui/settings_ui.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SETTINGS_UI_SETTINGS_UI_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/settings_ui/settings_ui.js"
use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
- <include name="IDR_SETTINGS_SETTINGS_ROUTES_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/settings_routes.m.js"
- use_base_dir="false"
- type="BINDATA" />
+ <include name="IDR_SETTINGS_SETTINGS_ROUTES_JS"
+ file="settings_routes.js"
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_SETTINGS_PAGE_CSS_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/settings_page_css.m.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_SETTINGS_SHARED_CSS_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/settings_shared_css.m.js"
use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
<include name="IDR_SETTINGS_SETTINGS_VARS_CSS_M_JS"
file="${root_gen_dir}/chrome/browser/resources/settings/settings_vars_css.m.js"
use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
<include name="IDR_SETTINGS_SETTINGS_V3_HTML"
file="settings_v3.html"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<include name="IDR_SETTINGS_SETTINGS_V3_JS"
file="settings.js"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
- <include name="IDR_SETTINGS_SITE_FAVICON_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_favicon.m.js"
+ <include name="IDR_SETTINGS_SITE_FAVICON_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_favicon.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_ADD_SITE_DIALOG_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/add_site_dialog.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SITE_SETTINGS_ADD_SITE_DIALOG_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/add_site_dialog.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_ALL_SITES_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/all_sites.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SITE_SETTINGS_ALL_SITES_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/all_sites.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_ALL_SITES_ICONS_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/all_sites_icons.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SITE_SETTINGS_ALL_SITES_ICONS_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/all_sites_icons.js"
use_base_dir="false"
- type="BINDATA" />
+ compress="false" type="BINDATA" />
<if expr="chromeos">
- <include name="IDR_SETTINGS_SITE_SETTINGS_ANDROID_INFO_BROWSER_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/android_info_browser_proxy.m.js"
- use_base_dir="false"
- type="BINDATA" />
+ <include name="IDR_SETTINGS_SITE_SETTINGS_ANDROID_INFO_BROWSER_PROXY_JS"
+ file="site_settings/android_info_browser_proxy.js"
+ compress="false" type="BINDATA" />
</if>
- <include name="IDR_SETTINGS_SITE_SETTINGS_CATEGORY_DEFAULT_SETTING_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/category_default_setting.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_CATEGORY_SETTING_EXCEPTIONS_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/category_setting_exceptions.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_CHOOSER_EXCEPTION_LIST_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/chooser_exception_list.m.js"
+ <include name="IDR_SETTINGS_SITE_SETTINGS_CATEGORY_DEFAULT_SETTING_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/category_default_setting.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_CHOOSER_EXCEPTION_LIST_ENTRY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/chooser_exception_list_entry.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SITE_SETTINGS_CATEGORY_SETTING_EXCEPTIONS_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/category_setting_exceptions.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_CLEAR_STORAGE_DIALOG_CSS_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/clear_storage_dialog_css.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SITE_SETTINGS_CHOOSER_EXCEPTION_LIST_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/chooser_exception_list.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_CONSTANTS_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/constants.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SITE_SETTINGS_CHOOSER_EXCEPTION_LIST_ENTRY_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/chooser_exception_list_entry.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_COOKIE_INFO_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/cookie_info.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SITE_SETTINGS_CLEAR_STORAGE_DIALOG_CSS_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/clear_storage_dialog_css.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_EDIT_EXCEPTION_DIALOG_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/edit_exception_dialog.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SITE_SETTINGS_CONSTANTS_JS"
+ file="site_settings/constants.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SITE_SETTINGS_COOKIE_INFO_JS"
+ file="site_settings/cookie_info.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SITE_SETTINGS_EDIT_EXCEPTION_DIALOG_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/edit_exception_dialog.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_LOCAL_DATA_BROWSER_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/local_data_browser_proxy.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SITE_SETTINGS_LOCAL_DATA_BROWSER_PROXY_JS"
+ file="site_settings/local_data_browser_proxy.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SITE_SETTINGS_MEDIA_PICKER_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/media_picker.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_MEDIA_PICKER_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/media_picker.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SITE_SETTINGS_PDF_DOCUMENTS_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/pdf_documents.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_PDF_DOCUMENTS_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/pdf_documents.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SITE_SETTINGS_PROTOCOL_HANDLERS_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/protocol_handlers.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_PROTOCOL_HANDLERS_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/protocol_handlers.m.js"
- use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_DATA_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_data.m.js"
+ <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_DATA_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_data.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_DATA_DETAILS_SUBPAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_data_details_subpage.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_DATA_DETAILS_SUBPAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_data_details_subpage.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_DATA_ENTRY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_data_entry.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_DATA_ENTRY_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_data_entry.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_DETAILS_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_details.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_DETAILS_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_details.js"
use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_DETAILS_PERMISSION_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_details_permission.m.js"
+ <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_DETAILS_PERMISSION_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_details_permission.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_ENTRY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_entry.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_ENTRY_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_entry.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_LIST_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_list.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_LIST_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_list.js"
use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_LIST_ENTRY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_list_entry.m.js"
+ <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_LIST_ENTRY_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_list_entry.js"
use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_SETTINGS_BEHAVIOR_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_settings_behavior.m.js"
- use_base_dir="false"
- type="BINDATA"
+ <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_SETTINGS_BEHAVIOR_JS"
+ file="site_settings/site_settings_behavior.js"
+ compress="false" type="BINDATA"
preprocess="true" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_SETTINGS_PREFS_BROWSER_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.m.js"
- use_base_dir="false"
- type="BINDATA"
+ <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_SETTINGS_PREFS_BROWSER_PROXY_JS"
+ file="site_settings/site_settings_prefs_browser_proxy.js"
+ compress="false" type="BINDATA"
preprocess="true" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_WEBSITE_USAGE_BROWSER_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/website_usage_browser_proxy.m.js"
+ <include name="IDR_SETTINGS_SITE_SETTINGS_WEBSITE_USAGE_BROWSER_PROXY_JS"
+ file="site_settings/website_usage_browser_proxy.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SITE_SETTINGS_ZOOM_LEVELS_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/zoom_levels.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_ZOOM_LEVELS_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/zoom_levels.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SITE_SETTINGS_PAGE_RECENT_SITE_PERMISSIONS_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_PAGE_RECENT_SITE_PERMISSIONS_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SITE_SETTINGS_PAGE_SITE_SETTINGS_LIST_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_settings_page/site_settings_list.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_PAGE_SITE_SETTINGS_LIST_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings_page/site_settings_list.m.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SITE_SETTINGS_PAGE_SITE_SETTINGS_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/site_settings_page/site_settings_page.js"
use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SITE_SETTINGS_PAGE_SITE_SETTINGS_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/site_settings_page/site_settings_page.m.js"
- use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
<if expr="not chromeos">
- <include name="IDR_SETTINGS_PRINTING_PAGE_PRINTING_BROWSER_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/printing_page/printing_browser_proxy.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SYSTEM_PAGE_BROWSER_PROXY_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/system_page/system_page_browser_proxy.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_SETTINGS_SYSTEM_PAGE_M_JS"
- file="${root_gen_dir}/chrome/browser/resources/settings/system_page/system_page.m.js"
+ <include name="IDR_SETTINGS_PRINTING_PAGE_PRINTING_BROWSER_PROXY_JS"
+ file="printing_page/printing_browser_proxy.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SYSTEM_PAGE_BROWSER_PROXY_JS"
+ file="system_page/system_page_browser_proxy.js"
+ compress="false" type="BINDATA" />
+ <include name="IDR_SETTINGS_SYSTEM_PAGE_JS"
+ file="${root_gen_dir}/chrome/browser/resources/settings/system_page/system_page.js"
use_base_dir="false"
- type="BINDATA"
+ compress="false" type="BINDATA"
preprocess="true" />
</if>
</grit-part>
diff --git a/chromium/chrome/browser/resources/settings/settings_resources_vulcanized.grd b/chromium/chrome/browser/resources/settings/settings_resources_vulcanized.grd
index 5c4b44a2c1b..51e23355bdf 100644
--- a/chromium/chrome/browser/resources/settings/settings_resources_vulcanized.grd
+++ b/chromium/chrome/browser/resources/settings/settings_resources_vulcanized.grd
@@ -12,30 +12,6 @@
</outputs>
<release seq="1">
<includes>
- <include name="IDR_SETTINGS_VULCANIZED_HTML"
- file="${root_gen_dir}\chrome\browser\resources\settings\vulcanized.html"
- use_base_dir="false"
- preprocess="true"
- type="BINDATA"
- compress="gzip" />
- <include name="IDR_SETTINGS_CRISPER_JS"
- file="${root_gen_dir}\chrome\browser\resources\settings\crisper.js"
- use_base_dir="false"
- preprocess="true"
- type="BINDATA"
- compress="gzip" />
- <include name="IDR_SETTINGS_LAZY_LOAD_VULCANIZED_HTML"
- file="${root_gen_dir}\chrome\browser\resources\settings\lazy_load.vulcanized.html"
- use_base_dir="false"
- preprocess="true"
- type="BINDATA"
- compress="gzip" />
- <include name="IDR_SETTINGS_LAZY_LOAD_CRISPER_JS"
- file="${root_gen_dir}\chrome\browser\resources\settings\lazy_load.crisper.js"
- use_base_dir="false"
- preprocess="true"
- type="BINDATA"
- compress="gzip" />
<include name="IDR_SETTINGS_IMAGES_COOKIES_BANNER_SVG"
file="images/cookies_banner.svg"
type="BINDATA"
diff --git a/chromium/chrome/browser/resources/settings/settings_ui/BUILD.gn b/chromium/chrome/browser/resources/settings/settings_ui/BUILD.gn
index 92a83108aa8..5cc7141efdd 100644
--- a/chromium/chrome/browser/resources/settings/settings_ui/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/settings_ui/BUILD.gn
@@ -3,44 +3,24 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [ ":settings_ui" ]
}
js_library("settings_ui") {
deps = [
- "..:global_scroll_target_behavior",
+ "..:global_scroll_target_behavior.m",
"..:page_visibility",
"..:route",
- "..:router",
- "../prefs",
- "../settings_main:settings_main",
- "//ui/webui/resources/cr_elements:cr_container_shadow_behavior",
- "//ui/webui/resources/cr_elements/cr_drawer:cr_drawer",
- "//ui/webui/resources/cr_elements/cr_toolbar:cr_toolbar",
- "//ui/webui/resources/cr_elements/cr_toolbar:cr_toolbar_search_field",
- "//ui/webui/resources/cr_elements/policy:cr_policy_indicator_behavior",
- "//ui/webui/resources/js:find_shortcut_behavior",
- ]
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- deps = [ ":settings_ui.m" ]
-}
-
-js_library("settings_ui.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/settings_ui/settings_ui.m.js" ]
- deps = [
- "..:global_scroll_target_behavior.m",
- "..:page_visibility.m",
- "..:route.m",
"..:router.m",
+ "../basic_page:basic_page",
"../prefs:prefs.m",
- "../settings_main:settings_main.m",
+ "../settings_main:settings_main",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements:cr_container_shadow_behavior.m",
"//ui/webui/resources/cr_elements/cr_drawer:cr_drawer.m",
@@ -52,29 +32,8 @@ js_library("settings_ui.m") {
"//ui/webui/resources/js:find_shortcut_behavior.m",
"//ui/webui/resources/js:util.m",
]
- extra_deps = [ ":settings_ui_module" ]
-}
-
-group("polymer3_elements") {
- public_deps = [ ":settings_ui_module" ]
}
-polymer_modulizer("settings_ui") {
- js_file = "settings_ui.js"
- html_file = "settings_ui.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/global_scroll_target_behavior.html|setGlobalScrollTarget,resetGlobalScrollTargetForTesting",
- "chrome/browser/resources/settings/page_visibility.html|PageVisibility,pageVisibility",
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/router.html|Route,Router,RouteObserverBehavior",
- "ui/webui/resources/html/assert.html|assert",
- "ui/webui/resources/html/cr.html|isChromeOS",
- "ui/webui/resources/html/util.html|listenOnce",
- "ui/webui/resources/cr_elements/cr_container_shadow_behavior.html|CrContainerShadowBehavior",
- ]
- namespace_rewrites = settings_namespace_rewrites + [
- "settings.setGlobalScrollTarget|setGlobalScrollTarget",
- "settings.resetGlobalScrollTargetForTesting|resetGlobalScrollTargetForTesting",
- ]
+html_to_js("web_components") {
+ js_files = [ "settings_ui.js" ]
}
diff --git a/chromium/chrome/browser/resources/settings/site_settings/BUILD.gn b/chromium/chrome/browser/resources/settings/site_settings/BUILD.gn
index e72d5093127..6099176e819 100644
--- a/chromium/chrome/browser/resources/settings/site_settings/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/site_settings/BUILD.gn
@@ -3,22 +3,26 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
-import("//ui/webui/resources/tools/js_modulizer.gni")
+import("//tools/polymer/html_to_js.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [
":add_site_dialog",
":all_sites",
+ ":android_info_browser_proxy",
":category_default_setting",
":category_setting_exceptions",
":chooser_exception_list",
":chooser_exception_list_entry",
":constants",
":cookie_info",
+ ":edit_exception_dialog",
":local_data_browser_proxy",
":media_picker",
+ ":pdf_documents",
":protocol_handlers",
":site_data",
":site_data_details_subpage",
@@ -39,457 +43,140 @@ js_library("add_site_dialog") {
deps = [
":constants",
":site_settings_behavior",
- "//ui/webui/resources/js:web_ui_listener_behavior",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
+ "//ui/webui/resources/js:assert.m",
+ "//ui/webui/resources/js:web_ui_listener_behavior.m",
]
}
js_library("all_sites") {
deps = [
":constants",
- ":site_settings_behavior",
- "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
-js_library("android_info_browser_proxy") {
- deps = [ "//ui/webui/resources/js:cr" ]
- externs_list = [ "$externs_path/chrome_send.js" ]
-}
-
-js_library("category_default_setting") {
- deps = [
- ":constants",
- ":site_settings_behavior",
- "..:route",
- "../settings_page:settings_animated_pages",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
-js_library("category_setting_exceptions") {
- deps = [
- ":constants",
- "../settings_page:settings_animated_pages",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
-js_library("chooser_exception_list") {
- deps = [
- ":chooser_exception_list_entry",
- ":constants",
- ":site_settings_behavior",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:list_property_update_behavior",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
-js_library("chooser_exception_list_entry") {
- deps = [
- ":constants",
- ":site_list_entry",
- ":site_settings_behavior",
- "//ui/webui/resources/js/cr/ui:focus_without_ink",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
-js_library("constants") {
- deps = [ "//ui/webui/resources/js:cr" ]
-}
-
-js_library("local_data_browser_proxy") {
- deps = [
- ":constants",
- ":cookie_info",
- "//ui/webui/resources/js:cr",
- ]
- externs_list = [
- "$externs_path/chrome_send.js",
- "$externs_path/settings_private.js",
- ]
-}
-
-js_library("media_picker") {
- deps = [
- ":site_settings_behavior",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
-}
-
-js_library("cookie_info") {
- deps = [ "//ui/webui/resources/js:load_time_data" ]
-}
-
-js_library("protocol_handlers") {
- deps = [
- ":site_settings_behavior",
-
- # Must be included on all platforms to satisfy closure compiler.
- ":android_info_browser_proxy",
- "//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
-}
-
-js_library("site_data") {
- deps = [
- ":cookie_info",
- ":local_data_browser_proxy",
- ":site_data_entry",
- ":site_settings_behavior",
- "..:global_scroll_target_behavior",
- "..:route",
- "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:list_property_update_behavior",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- "//ui/webui/resources/js/cr/ui:focus_without_ink",
- ]
-}
-
-js_library("site_data_details_subpage") {
- deps = [
- ":local_data_browser_proxy",
- "..:route",
- "..:router",
- "//third_party/polymer/v1_0/components-chromium/iron-list:iron-list-extracted",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
-}
-
-js_library("site_data_entry") {
- deps = [
- ":cookie_info",
- ":local_data_browser_proxy",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:icon",
- "//ui/webui/resources/js/cr/ui:focus_row_behavior",
- ]
-}
-
-js_library("site_details") {
- deps = [
- ":constants",
- ":site_details_permission",
- ":site_settings_behavior",
- ":website_usage_browser_proxy",
- "..:router",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:load_time_data",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
-js_library("site_details_permission") {
- deps = [
- ":constants",
- ":site_settings_behavior",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
-}
-
-js_library("site_entry") {
- deps = [
- ":constants",
":local_data_browser_proxy",
":site_settings_behavior",
":site_settings_prefs_browser_proxy",
- "..:route",
- "..:router",
- "//third_party/polymer/v1_0/components-chromium/iron-collapse:iron-collapse-extracted",
- "//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu",
- "//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:load_time_data",
- ]
-}
-
-js_library("site_list") {
- deps = [
- ":android_info_browser_proxy",
- ":constants",
- ":site_list_entry",
- ":site_settings_behavior",
- "//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:list_property_update_behavior",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- "//ui/webui/resources/js/cr/ui:focus_without_ink",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
-js_library("site_list_entry") {
- deps = [
- ":constants",
- ":site_settings_behavior",
- "..:router",
- "//ui/webui/resources/cr_elements/policy:cr_policy_pref_indicator",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js/cr/ui:focus_row_behavior",
- ]
-}
-
-js_library("site_settings_behavior") {
- deps = [
- ":constants",
- ":site_settings_prefs_browser_proxy",
- "..:router",
- "//ui/webui/resources/cr_elements/policy:cr_policy_indicator_behavior",
- "//ui/webui/resources/cr_elements/policy:cr_policy_pref_behavior",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:icon",
- "//ui/webui/resources/js:load_time_data",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
-js_library("site_settings_prefs_browser_proxy") {
- deps = [
- ":constants",
- "//ui/webui/resources/js:cr",
- ]
- externs_list = [
- "$externs_path/chrome_send.js",
- "$externs_path/settings_private.js",
- ]
-}
-
-js_library("website_usage_browser_proxy") {
- deps = [ "//ui/webui/resources/js:cr" ]
- externs_list = [ "$externs_path/chrome_send.js" ]
-}
-
-js_library("zoom_levels") {
- deps = [
- ":site_settings_behavior",
- "//ui/webui/resources/js:list_property_update_behavior",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- deps = [
- ":add_site_dialog.m",
- ":all_sites.m",
- ":android_info_browser_proxy.m",
- ":category_default_setting.m",
- ":category_setting_exceptions.m",
- ":chooser_exception_list.m",
- ":chooser_exception_list_entry.m",
- ":constants.m",
- ":cookie_info.m",
- ":edit_exception_dialog.m",
- ":local_data_browser_proxy.m",
- ":media_picker.m",
- ":pdf_documents.m",
- ":protocol_handlers.m",
- ":site_data.m",
- ":site_data_details_subpage.m",
- ":site_data_entry.m",
- ":site_details.m",
- ":site_details_permission.m",
- ":site_entry.m",
- ":site_list.m",
- ":site_list_entry.m",
- ":site_settings_behavior.m",
- ":site_settings_prefs_browser_proxy.m",
- ":website_usage_browser_proxy.m",
- ":zoom_levels.m",
- ]
-}
-
-js_library("add_site_dialog.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/add_site_dialog.m.js" ]
- deps = [
- ":constants.m",
- ":site_settings_behavior.m",
- "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
- "//ui/webui/resources/js:assert.m",
- "//ui/webui/resources/js:web_ui_listener_behavior.m",
- ]
- extra_deps = [ ":add_site_dialog_module" ]
-}
-
-js_library("all_sites.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/all_sites.m.js" ]
- deps = [
- ":constants.m",
- ":local_data_browser_proxy.m",
- ":site_settings_behavior.m",
- ":site_settings_prefs_browser_proxy.m",
"..:global_scroll_target_behavior.m",
"..:router.m",
+ "..:settings_routes",
+ "//third_party/polymer/v3_0/components-chromium/iron-list",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu.m",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
externs_list = [ "$externs_path/settings_private.js" ]
- extra_deps = [ ":all_sites_module" ]
}
-js_library("android_info_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/android_info_browser_proxy.m.js" ]
+js_library("android_info_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
}
-js_library("category_default_setting.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/category_default_setting.m.js" ]
+js_library("category_default_setting") {
deps = [
- ":constants.m",
- ":site_settings_behavior.m",
- "..:route.m",
+ ":constants",
+ ":site_settings_behavior",
+ "..:route",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
externs_list = [ "$externs_path/settings_private.js" ]
- extra_deps = [ ":category_default_setting_module" ]
}
-js_library("category_setting_exceptions.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/category_setting_exceptions.m.js" ]
+js_library("category_setting_exceptions") {
deps = [
- ":constants.m",
- ":site_settings_behavior.m",
+ ":constants",
+ ":site_settings_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
externs_list = [ "$externs_path/settings_private.js" ]
- extra_deps = [ ":category_setting_exceptions_module" ]
}
-js_library("chooser_exception_list.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/chooser_exception_list.m.js" ]
+js_library("chooser_exception_list") {
deps = [
- ":chooser_exception_list_entry.m",
- ":site_settings_behavior.m",
- ":site_settings_prefs_browser_proxy.m",
+ ":chooser_exception_list_entry",
+ ":site_settings_behavior",
+ ":site_settings_prefs_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:list_property_update_behavior.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
externs_list = [ "$externs_path/settings_private.js" ]
- extra_deps = [ ":chooser_exception_list_module" ]
}
-js_library("chooser_exception_list_entry.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/chooser_exception_list_entry.m.js" ]
+js_library("chooser_exception_list_entry") {
deps = [
- ":site_list_entry.m",
- ":site_settings_behavior.m",
- ":site_settings_prefs_browser_proxy.m",
+ ":site_list_entry",
+ ":site_settings_behavior",
+ ":site_settings_prefs_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
externs_list = [ "$externs_path/settings_private.js" ]
- extra_deps = [ ":chooser_exception_list_entry_module" ]
}
-js_library("constants.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/constants.m.js" ]
- extra_deps = [ ":modulize" ]
+js_library("constants") {
}
-js_library("cookie_info.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/cookie_info.m.js" ]
+js_library("cookie_info") {
deps = [ "//ui/webui/resources/js:load_time_data.m" ]
- extra_deps = [ ":modulize" ]
}
-js_library("edit_exception_dialog.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/edit_exception_dialog.m.js" ]
+js_library("edit_exception_dialog") {
deps = [
- ":constants.m",
- ":site_settings_prefs_browser_proxy.m",
+ ":constants",
+ ":site_settings_prefs_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
+ "//ui/webui/resources/cr_elements/cr_input:cr_input.m",
]
- extra_deps = [ ":edit_exception_dialog_module" ]
}
-js_library("local_data_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/local_data_browser_proxy.m.js" ]
+js_library("local_data_browser_proxy") {
deps = [
- ":cookie_info.m",
+ ":cookie_info",
"//ui/webui/resources/js:cr.m",
]
- extra_deps = [ ":modulize" ]
}
-js_library("media_picker.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/media_picker.m.js" ]
+js_library("media_picker") {
deps = [
- ":site_settings_behavior.m",
- ":site_settings_prefs_browser_proxy.m",
+ ":site_settings_behavior",
+ ":site_settings_prefs_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":media_picker_module" ]
}
-js_library("pdf_documents.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/pdf_documents.m.js" ]
+js_library("pdf_documents") {
deps = [
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
- extra_deps = [ ":pdf_documents_module" ]
}
-js_library("protocol_handlers.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/protocol_handlers.m.js" ]
+js_library("protocol_handlers") {
deps = [
- ":site_settings_behavior.m",
+ ":site_settings_behavior",
# Must be included on all platforms to satisfy closure compiler.
- ":android_info_browser_proxy.m",
+ ":android_info_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":protocol_handlers_module" ]
}
-js_library("site_data.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/site_data.m.js" ]
+js_library("site_data") {
deps = [
- ":cookie_info.m",
- ":local_data_browser_proxy.m",
- ":site_data_entry.m",
- ":site_settings_behavior.m",
+ ":local_data_browser_proxy",
+ ":site_settings_behavior",
"..:global_scroll_target_behavior.m",
- "..:route.m",
+ "..:route",
+ "//third_party/polymer/v3_0/components-chromium/iron-list:iron-list",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_search_field:cr_search_field.m",
"//ui/webui/resources/js:assert.m",
@@ -499,42 +186,35 @@ js_library("site_data.m") {
"//ui/webui/resources/js:web_ui_listener_behavior.m",
"//ui/webui/resources/js/cr/ui:focus_without_ink.m",
]
- extra_deps = [ ":site_data_module" ]
}
-js_library("site_data_details_subpage.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/site_data_details_subpage.m.js" ]
+js_library("site_data_details_subpage") {
deps = [
- ":local_data_browser_proxy.m",
- "..:route.m",
+ ":local_data_browser_proxy",
+ "..:route",
"..:router.m",
"//third_party/polymer/v3_0/components-chromium/iron-list:iron-list",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":site_data_details_subpage_module" ]
}
-js_library("site_data_entry.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/site_data_entry.m.js" ]
+js_library("site_data_entry") {
deps = [
- ":cookie_info.m",
- ":local_data_browser_proxy.m",
+ ":local_data_browser_proxy",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:icon.m",
"//ui/webui/resources/js/cr/ui:focus_row_behavior.m",
]
- extra_deps = [ ":site_data_entry_module" ]
}
-js_library("site_details.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/site_details.m.js" ]
+js_library("site_details") {
deps = [
- ":constants.m",
- ":site_details_permission.m",
- ":site_settings_behavior.m",
- ":website_usage_browser_proxy.m",
+ ":constants",
+ ":site_details_permission",
+ ":site_settings_behavior",
+ ":website_usage_browser_proxy",
"..:router.m",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
@@ -542,31 +222,27 @@ js_library("site_details.m") {
"//ui/webui/resources/js/cr/ui:focus_without_ink.m",
]
externs_list = [ "$externs_path/settings_private.js" ]
- extra_deps = [ ":site_details_module" ]
}
-js_library("site_details_permission.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/site_details_permission.m.js" ]
+js_library("site_details_permission") {
deps = [
- ":constants.m",
- ":site_settings_behavior.m",
+ ":constants",
+ ":site_settings_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":site_details_permission_module" ]
}
-js_library("site_entry.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/site_entry.m.js" ]
+js_library("site_entry") {
deps = [
- ":constants.m",
- ":local_data_browser_proxy.m",
- ":site_settings_behavior.m",
- ":site_settings_prefs_browser_proxy.m",
- "..:route.m",
+ ":constants",
+ ":local_data_browser_proxy",
+ ":site_settings_behavior",
+ ":site_settings_prefs_browser_proxy",
+ "..:route",
"..:router.m",
"//third_party/polymer/v3_0/components-chromium/iron-collapse:iron-collapse",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
@@ -575,17 +251,17 @@ js_library("site_entry.m") {
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js/cr/ui:focus_row_behavior.m",
]
- extra_deps = [ ":site_entry_module" ]
}
-js_library("site_list.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/site_list.m.js" ]
+js_library("site_list") {
deps = [
- ":android_info_browser_proxy.m",
- ":constants.m",
- ":site_list_entry.m",
- ":site_settings_behavior.m",
- ":site_settings_prefs_browser_proxy.m",
+ ":add_site_dialog",
+ ":android_info_browser_proxy",
+ ":constants",
+ ":edit_exception_dialog",
+ ":site_list_entry",
+ ":site_settings_behavior",
+ ":site_settings_prefs_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/paper-tooltip:paper-tooltip",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu.m",
@@ -595,322 +271,75 @@ js_library("site_list.m") {
"//ui/webui/resources/js/cr/ui:focus_without_ink.m",
]
externs_list = [ "$externs_path/settings_private.js" ]
- extra_deps = [ ":site_list_module" ]
}
-js_library("site_list_entry.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/site_list_entry.m.js" ]
+js_library("site_list_entry") {
deps = [
- ":constants.m",
- ":site_settings_behavior.m",
- "..:route.m",
+ ":constants",
+ ":site_settings_behavior",
+ "..:route",
"..:router.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/policy:cr_policy_pref_indicator",
+ "//ui/webui/resources/cr_elements/policy:cr_policy_pref_indicator.m",
"//ui/webui/resources/js/cr/ui:focus_row_behavior.m",
]
- extra_deps = [ ":site_list_entry_module" ]
}
-js_library("site_settings_behavior.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/site_settings_behavior.m.js" ]
+js_library("site_settings_behavior") {
deps = [
- ":constants.m",
- ":site_settings_prefs_browser_proxy.m",
+ ":constants",
+ ":site_settings_prefs_browser_proxy",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:icon.m",
"//ui/webui/resources/js:load_time_data.m",
]
- extra_deps = [ ":modulize" ]
}
-js_library("site_settings_prefs_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.m.js" ]
+js_library("site_settings_prefs_browser_proxy") {
deps = [
- ":constants.m",
+ ":constants",
"//ui/webui/resources/cr_elements/policy:cr_policy_indicator_behavior.m",
"//ui/webui/resources/js:cr.m",
]
- extra_deps = [ ":modulize" ]
+ externs_list = [ "$externs_path/settings_private.js" ]
}
-js_library("website_usage_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/website_usage_browser_proxy.m.js" ]
+js_library("website_usage_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr.m" ]
- extra_deps = [ ":modulize" ]
}
-js_library("zoom_levels.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/zoom_levels.m.js" ]
+js_library("zoom_levels") {
deps = [
- ":site_settings_behavior.m",
- ":site_settings_prefs_browser_proxy.m",
+ ":site_settings_behavior",
+ ":site_settings_prefs_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:list_property_update_behavior.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":zoom_levels_module" ]
-}
-
-group("polymer3_elements") {
- public_deps = [
- ":add_site_dialog_module",
- ":all_sites_icons_module",
- ":all_sites_module",
- ":category_default_setting_module",
- ":category_setting_exceptions_module",
- ":chooser_exception_list_entry_module",
- ":chooser_exception_list_module",
- ":clear_storage_dialog_css_module",
- ":edit_exception_dialog_module",
- ":media_picker_module",
- ":modulize",
- ":pdf_documents_module",
- ":protocol_handlers_module",
- ":site_data_details_subpage_module",
- ":site_data_entry_module",
- ":site_data_module",
- ":site_details_module",
- ":site_details_permission_module",
- ":site_entry_module",
- ":site_list_entry_module",
- ":site_list_module",
- ":zoom_levels_module",
- ]
-}
-
-polymer_modulizer("add_site_dialog") {
- js_file = "add_site_dialog.js"
- html_file = "add_site_dialog.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/site_settings/constants.html|ContentSetting,ContentSettingsTypes,SITE_EXCEPTION_WILDCARD",
- "ui/webui/resources/html/assert.html|assert",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("all_sites") {
- js_file = "all_sites.js"
- html_file = "all_sites.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/global_scroll_target_behavior.html|GlobalScrollTargetBehavior,GlobalScrollTargetBehaviorImpl",
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/router.html|Route,Router,RouteObserverBehavior",
- "chrome/browser/resources/settings/site_settings/constants.html|ALL_SITES_DIALOG,AllSitesAction2,ContentSetting,ContentSettingsTypes,SortMethod",
- "chrome/browser/resources/settings/site_settings/local_data_browser_proxy.html|LocalDataBrowserProxy,LocalDataBrowserProxyImpl",
- "chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.html|SiteGroup",
- "ui/webui/resources/html/polymer.html|afterNextRender,html,Polymer",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("all_sites_icons") {
- js_file = "all_sites_icons.m.js"
- html_file = "all_sites_icons.html"
- html_type = "iron-iconset"
-}
-
-polymer_modulizer("category_default_setting") {
- js_file = "category_default_setting.js"
- html_file = "category_default_setting.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/site_settings/constants.html|ContentSetting,ContentSettingsTypes",
- "chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.html|ContentSettingProvider,DefaultContentSetting",
- "ui/webui/resources/html/assert.html|assert,assertNotReached",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("category_setting_exceptions") {
- js_file = "category_setting_exceptions.js"
- html_file = "category_setting_exceptions.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [ "chrome/browser/resources/settings/site_settings/constants.html|ContentSetting,ContentSettingsTypes,SiteSettingSource" ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("chooser_exception_list") {
- js_file = "chooser_exception_list.js"
- html_file = "chooser_exception_list.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/site_settings/constants.html|ChooserType,ContentSettingsTypes",
- "chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.html|ChooserException,RawChooserException",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("chooser_exception_list_entry") {
- js_file = "chooser_exception_list_entry.js"
- html_file = "chooser_exception_list_entry.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [ "chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.html|ChooserException" ]
-}
-
-polymer_modulizer("clear_storage_dialog_css") {
- js_file = "clear_storage_dialog_css.m.js"
- html_file = "clear_storage_dialog_css.html"
- html_type = "style-module"
-}
-
-polymer_modulizer("edit_exception_dialog") {
- js_file = "edit_exception_dialog.js"
- html_file = "edit_exception_dialog.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/site_settings/constants.html|SITE_EXCEPTION_WILDCARD",
- "chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.html|SiteException,SiteSettingsPrefsBrowserProxy,SiteSettingsPrefsBrowserProxyImpl",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("media_picker") {
- js_file = "media_picker.js"
- html_file = "media_picker.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [ "chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.html|MediaPickerEntry" ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("pdf_documents") {
- js_file = "pdf_documents.js"
- html_file = "pdf_documents.html"
- html_type = "dom-module"
-}
-
-polymer_modulizer("protocol_handlers") {
- js_file = "protocol_handlers.js"
- html_file = "protocol_handlers.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [ "chrome/browser/resources/settings/site_settings/android_info_browser_proxy.html|AndroidInfoBrowserProxyImpl,AndroidAppsInfo" ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("site_data") {
- js_file = "site_data.js"
- html_file = "site_data.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/global_scroll_target_behavior.html|GlobalScrollTargetBehavior,GlobalScrollTargetBehaviorImpl",
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/router.html|Route,Router,RouteObserverBehavior",
- "chrome/browser/resources/settings/site_settings/local_data_browser_proxy.html|LocalDataBrowserProxy,LocalDataBrowserProxyImpl",
- "chrome/browser/resources/settings/site_settings/site_data_entry.html|CookieDataSummaryItem",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("site_data_details_subpage") {
- js_file = "site_data_details_subpage.js"
- html_file = "site_data_details_subpage.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/router.html|Route,Router,RouteObserverBehavior",
- "chrome/browser/resources/settings/site_settings/cookie_info.html|CookieDataForDisplay,CookieDetails,getCookieData",
- "chrome/browser/resources/settings/site_settings/local_data_browser_proxy.html|CookieList,LocalDataBrowserProxy,LocalDataBrowserProxyImpl",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("site_data_entry") {
- js_file = "site_data_entry.js"
- html_file = "site_data_entry.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [ "chrome/browser/resources/settings/site_settings/local_data_browser_proxy.html|LocalDataBrowserProxy,LocalDataBrowserProxyImpl" ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("site_details") {
- js_file = "site_details.js"
- html_file = "site_details.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/router.html|Route,Router,RouteObserverBehavior",
- "chrome/browser/resources/settings/site_settings/constants.html|ContentSetting,ContentSettingsTypes",
- "chrome/browser/resources/settings/site_settings/website_usage_browser_proxy.html|WebsiteUsageBrowserProxy,WebsiteUsageBrowserProxyImpl",
- "ui/webui/resources/html/assert.html|assert",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("site_details_permission") {
- js_file = "site_details_permission.js"
- html_file = "site_details_permission.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/site_settings/constants.html|ContentSetting,ContentSettingsTypes,SiteSettingSource",
- "chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.html|RawSiteException",
- "ui/webui/resources/html/assert.html|assert",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("site_entry") {
- js_file = "site_entry.js"
- html_file = "site_entry.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/site_settings/constants.html|AllSitesAction2,SortMethod",
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/router.html|Router",
- "chrome/browser/resources/settings/site_settings/local_data_browser_proxy.html|LocalDataBrowserProxy,LocalDataBrowserProxyImpl",
- "chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.html|OriginInfo,SiteGroup",
- "ui/webui/resources/html/assert.html|assert",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("site_list") {
- js_file = "site_list.js"
- html_file = "site_list.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/site_settings/android_info_browser_proxy.html|AndroidInfoBrowserProxyImpl,AndroidSmsInfo",
- "chrome/browser/resources/settings/site_settings/constants.html|ContentSetting,ContentSettingsTypes,INVALID_CATEGORY_SUBTYPE",
- "chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.html|RawSiteException,SiteException,SiteSettingsPrefsBrowserProxyImpl",
- "ui/webui/resources/html/assert.html|assert",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("site_list_entry") {
- js_file = "site_list_entry.js"
- html_file = "site_list_entry.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/router.html|Router",
- "chrome/browser/resources/settings/site_settings/constants.html|ChooserType,ContentSettingsTypes,SITE_EXCEPTION_WILDCARD",
- "chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.html|SiteException",
- "ui/webui/resources/html/assert.html|assert",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("zoom_levels") {
- js_file = "zoom_levels.js"
- html_file = "zoom_levels.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [ "chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.html|ZoomLevelEntry" ]
- namespace_rewrites = settings_namespace_rewrites
}
-js_modulizer("modulize") {
- input_files = [
- "constants.js",
- "cookie_info.js",
- "android_info_browser_proxy.js",
- "local_data_browser_proxy.js",
- "site_settings_behavior.js",
- "site_settings_prefs_browser_proxy.js",
- "website_usage_browser_proxy.js",
+html_to_js("web_components") {
+ js_files = [
+ "add_site_dialog.js",
+ "all_sites.js",
+ "all_sites_icons.js",
+ "category_default_setting.js",
+ "category_setting_exceptions.js",
+ "chooser_exception_list.js",
+ "chooser_exception_list_entry.js",
+ "clear_storage_dialog_css.js",
+ "edit_exception_dialog.js",
+ "media_picker.js",
+ "pdf_documents.js",
+ "protocol_handlers.js",
+ "site_data.js",
+ "site_data_details_subpage.js",
+ "site_data_entry.js",
+ "site_details.js",
+ "site_details_permission.js",
+ "site_entry.js",
+ "site_list.js",
+ "site_list_entry.js",
+ "zoom_levels.js",
]
- namespace_rewrites = settings_namespace_rewrites
}
diff --git a/chromium/chrome/browser/resources/settings/site_settings_page/BUILD.gn b/chromium/chrome/browser/resources/settings/site_settings_page/BUILD.gn
index 2cb8a6e32bf..37b50fcd15c 100644
--- a/chromium/chrome/browser/resources/settings/site_settings_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/site_settings_page/BUILD.gn
@@ -3,10 +3,12 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [
":recent_site_permissions",
":site_settings_list",
@@ -17,146 +19,50 @@ js_type_check("closure_compile") {
js_library("recent_site_permissions") {
deps = [
"..:route",
- "..:router",
- "../people_page:sync_browser_proxy",
- "../prefs:prefs_behavior",
- "../site_settings:site_settings_behavior",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- ]
-}
-
-js_library("site_settings_page") {
- deps = [
- ":recent_site_permissions",
- ":site_settings_list",
- "..:route",
- "..:router",
- "../site_settings:constants",
- "../site_settings:site_settings_prefs_browser_proxy",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js/cr/ui:focus_without_ink",
- ]
-}
-
-js_library("site_settings_list") {
- deps = [
- "..:router",
- "../site_settings:constants",
- "../site_settings:site_settings_prefs_browser_proxy",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js:web_ui_listener_behavior",
- "//ui/webui/resources/js/cr/ui:focus_without_ink",
- ]
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- deps = [
- ":recent_site_permissions.m",
- ":site_settings_list.m",
- ":site_settings_page.m",
- ]
-}
-
-js_library("recent_site_permissions.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.m.js" ]
- deps = [
- "..:route.m",
"..:router.m",
"../people_page:sync_browser_proxy.m",
"../prefs:prefs_behavior.m",
- "../site_settings:constants.m",
- "../site_settings:site_settings_behavior.m",
+ "../site_settings:constants",
+ "../site_settings:site_settings_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
]
- extra_deps = [ ":recent_site_permissions_module" ]
}
-js_library("site_settings_list.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings_page/site_settings_list.m.js" ]
+js_library("site_settings_list") {
deps = [
"..:router.m",
- "../site_settings:constants.m",
- "../site_settings:site_settings_prefs_browser_proxy.m",
+ "../site_settings:constants",
+ "../site_settings:site_settings_prefs_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m",
"//ui/webui/resources/js/cr/ui:focus_without_ink.m",
]
- extra_deps = [ ":site_settings_list_module" ]
}
-js_library("site_settings_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings_page/site_settings_page.m.js" ]
+js_library("site_settings_page") {
deps = [
- ":recent_site_permissions.m",
- ":site_settings_list.m",
- "..:route.m",
+ ":recent_site_permissions",
+ ":site_settings_list",
+ "..:route",
"..:router.m",
- "../site_settings:constants.m",
- "../site_settings:site_settings_prefs_browser_proxy.m",
+ "../site_settings:constants",
+ "../site_settings:site_settings_prefs_browser_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js/cr/ui:focus_without_ink.m",
]
- extra_deps = [ ":site_settings_page_module" ]
}
-group("polymer3_elements") {
- public_deps = [
- ":recent_site_permissions_module",
- ":site_settings_list_module",
- ":site_settings_page_module",
+html_to_js("web_components") {
+ js_files = [
+ "recent_site_permissions.js",
+ "site_settings_list.js",
+ "site_settings_page.js",
]
}
-
-polymer_modulizer("recent_site_permissions") {
- js_file = "recent_site_permissions.js"
- html_file = "recent_site_permissions.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/router.html|Route,Router,RouteObserverBehavior",
- "chrome/browser/resources/settings/site_settings/constants.html|AllSitesAction,ContentSetting,SiteSettingSource",
- "chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.html|RawSiteException,RecentSitePermissions",
- "ui/webui/resources/html/assert.html|assert",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("site_settings_list") {
- js_file = "site_settings_list.js"
- html_file = "site_settings_list.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/router.html|Route,Router",
- "chrome/browser/resources/settings/site_settings/constants.html|ContentSetting,ContentSettingsTypes",
- "chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.html|SiteSettingsPrefsBrowserProxy,SiteSettingsPrefsBrowserProxyImpl",
- "ui/webui/resources/html/assert.html|assert",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
-
-polymer_modulizer("site_settings_page") {
- js_file = "site_settings_page.js"
- html_file = "site_settings_page.html"
- html_type = "dom-module"
- auto_imports = settings_auto_imports + [
- "chrome/browser/resources/settings/route.html|routes",
- "chrome/browser/resources/settings/router.html|Route,Router",
- "chrome/browser/resources/settings/site_settings/constants.html|ContentSettingsTypes",
- "chrome/browser/resources/settings/site_settings_page/site_settings_list.html|CategoryListItem",
- "ui/webui/resources/html/assert.html|assert",
- ]
- namespace_rewrites = settings_namespace_rewrites
-}
diff --git a/chromium/chrome/browser/resources/settings/system_page/BUILD.gn b/chromium/chrome/browser/resources/settings/system_page/BUILD.gn
index 63950561901..276b5491ea9 100644
--- a/chromium/chrome/browser/resources/settings/system_page/BUILD.gn
+++ b/chromium/chrome/browser/resources/settings/system_page/BUILD.gn
@@ -3,80 +3,34 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
-import("//ui/webui/resources/tools/js_modulizer.gni")
+import("//tools/polymer/html_to_js.gni")
import("../settings.gni")
-js_type_check("closure_compile") {
+js_type_check("closure_compile_module") {
+ is_polymer3 = true
+ closure_flags = settings_closure_flags
deps = [
":system_page",
":system_page_browser_proxy",
]
}
-js_library("system_page_browser_proxy") {
- deps = [
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js:load_time_data",
- ]
- externs_list = [ "$externs_path/chrome_send.js" ]
-}
-
js_library("system_page") {
deps = [
":system_page_browser_proxy",
- "..:lifetime_browser_proxy",
- ]
- externs_list = [ "$externs_path/settings_private.js" ]
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- deps = [
- ":system_page.m",
- ":system_page_browser_proxy.m",
- ]
-}
-
-js_library("system_page.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/system_page/system_page.m.js" ]
- deps = [
- ":system_page_browser_proxy.m",
"..:lifetime_browser_proxy.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
externs_list = [ "$externs_path/settings_private.js" ]
- extra_deps = [ ":system_page_module" ]
}
-js_library("system_page_browser_proxy.m") {
- sources = [ "$root_gen_dir/chrome/browser/resources/settings/system_page/system_page_browser_proxy.m.js" ]
+js_library("system_page_browser_proxy") {
deps = [
"//ui/webui/resources/js:cr.m",
"//ui/webui/resources/js:load_time_data.m",
]
- extra_deps = [ ":modulize" ]
-}
-
-group("polymer3_elements") {
- public_deps = [
- ":modulize",
- ":system_page_module",
- ]
-}
-
-polymer_modulizer("system_page") {
- js_file = "system_page.js"
- html_file = "system_page.html"
- html_type = "dom-module"
- namespace_rewrites = settings_namespace_rewrites
- auto_imports = [
- "chrome/browser/resources/settings/lifetime_browser_proxy.html|LifetimeBrowserProxyImpl",
- "chrome/browser/resources/settings/system_page/system_page_browser_proxy.html|SystemPageBrowserProxyImpl",
- ]
}
-js_modulizer("modulize") {
- input_files = [ "system_page_browser_proxy.js" ]
- namespace_rewrites = settings_namespace_rewrites
+html_to_js("web_components") {
+ js_files = [ "system_page.js" ]
}
diff --git a/chromium/chrome/browser/resources/signin/BUILD.gn b/chromium/chrome/browser/resources/signin/BUILD.gn
index 0fb2cd86ca8..8f8022c8193 100644
--- a/chromium/chrome/browser/resources/signin/BUILD.gn
+++ b/chromium/chrome/browser/resources/signin/BUILD.gn
@@ -2,7 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
group("closure_compile") {
deps = [ "sync_confirmation:closure_compile" ]
@@ -14,18 +14,19 @@ group("closure_compile") {
}
}
-group("polymer3_elements") {
+group("web_components") {
public_deps = [
- ":signin_shared_css_module",
- "sync_confirmation:polymer3_elements",
+ ":web_components_local",
+ "sync_confirmation:web_components",
]
if (!is_chromeos) {
- public_deps += [ "signin_email_confirmation:polymer3_elements" ]
+ public_deps += [
+ "signin_email_confirmation:web_components",
+ "signin_error:web_components",
+ ]
}
}
-polymer_modulizer("signin_shared_css") {
- html_file = "signin_shared_css.html"
- js_file = "signin_shared_css.js"
- html_type = "v3-ready"
+html_to_js("web_components_local") {
+ js_files = [ "signin_shared_css.js" ]
}
diff --git a/chromium/chrome/browser/resources/signin/profile_picker/OWNERS b/chromium/chrome/browser/resources/signin/profile_picker/OWNERS
new file mode 100644
index 00000000000..19d8d690d8d
--- /dev/null
+++ b/chromium/chrome/browser/resources/signin/profile_picker/OWNERS
@@ -0,0 +1,3 @@
+# https://crbug.com/1063856
+
+msalama@chromium.org
diff --git a/chromium/chrome/browser/resources/signin/profile_picker/profile_picker.html b/chromium/chrome/browser/resources/signin/profile_picker/profile_picker.html
new file mode 100644
index 00000000000..8ddf6a371f0
--- /dev/null
+++ b/chromium/chrome/browser/resources/signin/profile_picker/profile_picker.html
@@ -0,0 +1,8 @@
+<!doctype html>
+<html dir="$i18n{textdirection}" lang="$i18n{language}">
+ <head>
+ <meta charset="utf-8">
+ </head>
+ <body>
+ </body>
+</html>
diff --git a/chromium/chrome/browser/resources/signin/profile_picker/profile_picker_resources.grd b/chromium/chrome/browser/resources/signin/profile_picker/profile_picker_resources.grd
new file mode 100644
index 00000000000..d77a8a27541
--- /dev/null
+++ b/chromium/chrome/browser/resources/signin/profile_picker/profile_picker_resources.grd
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+ <outputs>
+ <output filename="grit/profile_picker_resources.h" type="rc_header">
+ <emit emit_type='prepend'></emit>
+ </output>
+ <output filename="grit/profile_picker_resources_map.cc"
+ type="resource_file_map_source" />
+ <output filename="grit/profile_picker_resources_map.h"
+ type="resource_map_header" />
+ <output filename="profile_picker_resources.pak" type="data_package" />
+ </outputs>
+ <release seq="1">
+ <structures>
+ <structure
+ name="IDR_PROFILE_PICKER_PROFILE_PICKER_HTML"
+ file="profile_picker.html"
+ type="chrome_html"
+ compress="false"/>
+ </structures>
+ </release>
+</grit>
diff --git a/chromium/chrome/browser/resources/signin/signin_email_confirmation/BUILD.gn b/chromium/chrome/browser/resources/signin/signin_email_confirmation/BUILD.gn
index 8f802a44ce6..472eb61bb47 100644
--- a/chromium/chrome/browser/resources/signin/signin_email_confirmation/BUILD.gn
+++ b/chromium/chrome/browser/resources/signin/signin_email_confirmation/BUILD.gn
@@ -3,7 +3,7 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
js_type_check("closure_compile") {
is_polymer3 = true
@@ -18,12 +18,6 @@ js_library("signin_email_confirmation_app") {
]
}
-group("polymer3_elements") {
- public_deps = [ ":signin_email_confirmation_app_module" ]
-}
-
-polymer_modulizer("signin_email_confirmation_app") {
- html_file = "signin_email_confirmation_app.html"
- js_file = "signin_email_confirmation_app.js"
- html_type = "v3-ready"
+html_to_js("web_components") {
+ js_files = [ "signin_email_confirmation_app.js" ]
}
diff --git a/chromium/chrome/browser/resources/signin/signin_error/BUILD.gn b/chromium/chrome/browser/resources/signin/signin_error/BUILD.gn
index 14ad99a38ff..de1381ce48b 100644
--- a/chromium/chrome/browser/resources/signin/signin_error/BUILD.gn
+++ b/chromium/chrome/browser/resources/signin/signin_error/BUILD.gn
@@ -3,8 +3,10 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/polymer/html_to_js.gni")
js_type_check("closure_compile") {
+ is_polymer3 = true
deps = [
":signin_error",
":signin_error_app",
@@ -12,12 +14,17 @@ js_type_check("closure_compile") {
}
js_library("signin_error") {
- deps = [ "//ui/webui/resources/js:cr" ]
+ deps = [ "//ui/webui/resources/js:cr.m" ]
}
js_library("signin_error_app") {
deps = [
- "//ui/webui/resources/js:load_time_data",
- "//ui/webui/resources/js:web_ui_listener_behavior",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/js:load_time_data.m",
+ "//ui/webui/resources/js:web_ui_listener_behavior.m",
]
}
+
+html_to_js("web_components") {
+ js_files = [ "signin_error_app.js" ]
+}
diff --git a/chromium/chrome/browser/resources/signin/signin_error/signin_error.html b/chromium/chrome/browser/resources/signin/signin_error/signin_error.html
index a17d6283850..00803bcae9f 100644
--- a/chromium/chrome/browser/resources/signin/signin_error/signin_error.html
+++ b/chromium/chrome/browser/resources/signin/signin_error/signin_error.html
@@ -3,9 +3,7 @@
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="chrome://resources/css/md_colors.css">
- <link rel="import" href="chrome://resources/html/load_time_data.html">
- <script src="strings.js"></script>
- <link rel="import" href="signin_error_app.html">
+ <script type="module" src="signin_error_app.js"></script>
<style>
body {
margin: 0;
@@ -22,6 +20,5 @@
<signin-error-app></signin-error-app>
</body>
<link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css">
- <link rel="import" href="chrome://resources/html/cr.html">
- <script src="signin_error.js"></script>
+ <script type="module" src="signin_error.js"></script>
</html>
diff --git a/chromium/chrome/browser/resources/signin/signin_error/signin_error.js b/chromium/chrome/browser/resources/signin/signin_error/signin_error.js
index f264d64e9ac..fd8fd98f9e4 100644
--- a/chromium/chrome/browser/resources/signin/signin_error/signin_error.js
+++ b/chromium/chrome/browser/resources/signin/signin_error/signin_error.js
@@ -2,9 +2,10 @@
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file. */
-(function() {
+import {addWebUIListener} from 'chrome://resources/js/cr.m.js';
+
function initialize() {
- cr.addWebUIListener('clear-focus', clearFocus);
+ addWebUIListener('clear-focus', clearFocus);
// Prefer using |document.body.offsetHeight| instead of
// |document.body.scrollHeight| as it returns the correct height of the
@@ -17,4 +18,3 @@ function clearFocus() {
}
document.addEventListener('DOMContentLoaded', initialize);
-})();
diff --git a/chromium/chrome/browser/resources/signin/signin_error/signin_error_app.html b/chromium/chrome/browser/resources/signin/signin_error/signin_error_app.html
index 1178a949ec5..8e5db6f273d 100644
--- a/chromium/chrome/browser/resources/signin/signin_error/signin_error_app.html
+++ b/chromium/chrome/browser/resources/signin/signin_error/signin_error_app.html
@@ -1,15 +1,3 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
-
-<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html">
-<link rel="import" href="chrome://resources/cr_elements/icons.html">
-<link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html">
-<link rel="import" href="chrome://resources/html/load_time_data.html">
-<link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
-<link rel="import" href="signin_shared_old_css.html">
-
-<dom-module id="signin-error-app">
- <template>
<style include="signin-dialog-shared">
.details {
line-height: 20px;
@@ -93,6 +81,3 @@
</cr-button>
</div>
</div>
- </template>
- <script src="signin_error_app.js"></script>
-</dom-module>
diff --git a/chromium/chrome/browser/resources/signin/signin_error/signin_error_app.js b/chromium/chrome/browser/resources/signin/signin_error/signin_error_app.js
index a5782fdc518..5ed8b298b33 100644
--- a/chromium/chrome/browser/resources/signin/signin_error/signin_error_app.js
+++ b/chromium/chrome/browser/resources/signin/signin_error/signin_error_app.js
@@ -2,9 +2,22 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
+import 'chrome://resources/cr_elements/icons.m.js';
+import 'chrome://resources/cr_elements/shared_vars_css.m.js';
+import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
+import './strings.m.js';
+import './signin_shared_css.js';
+
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behavior.m.js';
+import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
Polymer({
is: 'signin-error-app',
+ _template: html`{__html_template__}`,
+
behaviors: [
WebUIListenerBehavior,
],
diff --git a/chromium/chrome/browser/resources/signin/signin_shared_old_css.html b/chromium/chrome/browser/resources/signin/signin_shared_old_css.html
deleted file mode 100644
index 8267ae51398..00000000000
--- a/chromium/chrome/browser/resources/signin/signin_shared_old_css.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html">
-
-<!-- Common styles for signin-related tab modal dialogs. -->
-<dom-module id="signin-dialog-shared">
- <template>
- <style>
- a {
- color: var(--cr-link-color);
- text-decoration: none;
- }
-
- body {
- margin: 0;
- padding: 0;
- }
-
- .container {
- color: var(--cr-primary-text-color);
- width: 448px;
- }
-
- .top-title-bar {
- align-items: center;
- border-bottom: var(--cr-separator-line);
- display: flex;
- font-size: 16px;
- height: 52px;
- padding: 0 24px;
- }
-
- .action-container {
- display: flex;
- justify-content: flex-end;
- padding: 16px;
- }
-
-<if expr="is_macosx or is_linux">
- .action-container {
- flex-flow: row-reverse;
- justify-content: flex-start;
- }
-</if>
- </style>
- </template>
-</dom-module>
diff --git a/chromium/chrome/browser/resources/signin/sync_confirmation/BUILD.gn b/chromium/chrome/browser/resources/signin/sync_confirmation/BUILD.gn
index b0de948da72..3939608a8e5 100644
--- a/chromium/chrome/browser/resources/signin/sync_confirmation/BUILD.gn
+++ b/chromium/chrome/browser/resources/signin/sync_confirmation/BUILD.gn
@@ -3,7 +3,7 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
js_type_check("closure_compile") {
is_polymer3 = true
@@ -48,21 +48,9 @@ js_library("sync_disabled_confirmation_app") {
]
}
-group("polymer3_elements") {
- public_deps = [
- ":sync_confirmation_app_module",
- ":sync_disabled_confirmation_app_module",
+html_to_js("web_components") {
+ js_files = [
+ "sync_confirmation_app.js",
+ "sync_disabled_confirmation_app.js",
]
}
-
-polymer_modulizer("sync_confirmation_app") {
- html_file = "sync_confirmation_app.html"
- js_file = "sync_confirmation_app.js"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("sync_disabled_confirmation_app") {
- html_file = "sync_disabled_confirmation_app.html"
- js_file = "sync_disabled_confirmation_app.js"
- html_type = "v3-ready"
-}
diff --git a/chromium/chrome/browser/resources/tab_strip/BUILD.gn b/chromium/chrome/browser/resources/tab_strip/BUILD.gn
index 2e3220be9ae..47d3cb8be86 100644
--- a/chromium/chrome/browser/resources/tab_strip/BUILD.gn
+++ b/chromium/chrome/browser/resources/tab_strip/BUILD.gn
@@ -3,7 +3,7 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
js_type_check("closure_compile") {
uses_js_modules = true
@@ -109,42 +109,12 @@ js_library("tab_strip_options") {
js_library("tab_swiper") {
}
-group("tab_strip_modules") {
- public_deps = [
- ":alert_indicator_module",
- ":alert_indicators_module",
- ":tab_group_module",
- ":tab_list_module",
- ":tab_module",
+html_to_js("web_components") {
+ js_files = [
+ "alert_indicator.js",
+ "alert_indicators.js",
+ "tab_group.js",
+ "tab_list.js",
+ "tab.js",
]
}
-
-polymer_modulizer("alert_indicator") {
- js_file = "alert_indicator.js"
- html_file = "alert_indicator.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("alert_indicators") {
- js_file = "alert_indicators.js"
- html_file = "alert_indicators.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("tab") {
- js_file = "tab.js"
- html_file = "tab.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("tab_group") {
- js_file = "tab_group.js"
- html_file = "tab_group.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("tab_list") {
- js_file = "tab_list.js"
- html_file = "tab_list.html"
- html_type = "v3-ready"
-}
diff --git a/chromium/chrome/browser/resources/tab_strip/alert_indicator.html b/chromium/chrome/browser/resources/tab_strip/alert_indicator.html
index eff3a70c61a..078f7f20878 100644
--- a/chromium/chrome/browser/resources/tab_strip/alert_indicator.html
+++ b/chromium/chrome/browser/resources/tab_strip/alert_indicator.html
@@ -8,49 +8,49 @@
width: 16px;
}
- :host([alert-state_='0']),
- :host([alert-state_='9']) {
+ :host([alert-state_='media-recording']),
+ :host([alert-state_='desktop-capturing']) {
-webkit-mask-image: url(alert_indicators/tab_media_recording.svg);
background-color: var(--tabstrip-indicator-recording-color);
}
- :host([alert-state_='1']) {
+ :host([alert-state_='tab-capturing']) {
-webkit-mask-image:
url(alert_indicators/tab_media_capturing_with_arrow.svg);
background-color: var(--tabstrip-indicator-capturing-color);
}
- :host([alert-state_='2']) {
+ :host([alert-state_='audio-playing']) {
-webkit-mask-image: url(alert_indicators/tab_audio_rounded.svg);
}
- :host([alert-state_='3']) {
+ :host([alert-state_='audio-muting']) {
-webkit-mask-image: url(alert_indicators/tab_audio_muting_rounded.svg);
}
- :host([alert-state_='4']) {
+ :host([alert-state_='bluetooth-connected']) {
-webkit-mask-image: url(alert_indicators/tab_bluetooth_connected.svg);
}
- :host([alert-state_='5']) {
+ :host([alert-state_='usb-connected']) {
-webkit-mask-image: url(alert_indicators/tab_usb_connected.svg);
-webkit-mask-size: 20px;
}
- :host([alert-state_='6']) {
+ :host([alert-state_='hid-connected']) {
-webkit-mask-image: url(alert_indicators/tab_hid_connected.svg);
}
- :host([alert-state_='7']) {
+ :host([alert-state_='serial-connected']) {
-webkit-mask-image: url(alert_indicators/serial_port.svg);
}
- :host([alert-state_='8']) {
+ :host([alert-state_='pip-playing']) {
-webkit-mask-image: url(alert_indicators/picture_in_picture_alt.svg);
background-color: var(--tabstrip-indicator-pip-color);
}
- :host([alert-state_='10']) {
+ :host([alert-state_='vr-presenting']) {
-webkit-mask-image: url(alert_indicators/vr_headset.svg);
}
</style>
diff --git a/chromium/chrome/browser/resources/tab_strip/alert_indicators.js b/chromium/chrome/browser/resources/tab_strip/alert_indicators.js
index e3dd5dcd0be..eec52526ad3 100644
--- a/chromium/chrome/browser/resources/tab_strip/alert_indicators.js
+++ b/chromium/chrome/browser/resources/tab_strip/alert_indicators.js
@@ -47,7 +47,7 @@ export class AlertIndicatorsElement extends CustomElement {
let alertIndicatorCount = 0;
for (const [index, alertState] of alertStates.entries()) {
- const alertIndicator = alertIndicators[index];
+ const alertIndicator = alertIndicators[/** @type {number} */ (index)];
// Don't show unsupported indicators.
if (!alertIndicator) {
diff --git a/chromium/chrome/browser/resources/tab_strip/tab_swiper.js b/chromium/chrome/browser/resources/tab_strip/tab_swiper.js
index 269f16ed8b7..7a351d47764 100644
--- a/chromium/chrome/browser/resources/tab_strip/tab_swiper.js
+++ b/chromium/chrome/browser/resources/tab_strip/tab_swiper.js
@@ -133,7 +133,7 @@ export class TabSwiper {
* @private
*/
onPointerDown_(event) {
- if (this.currentPointerDownEvent_) {
+ if (this.currentPointerDownEvent_ || event.pointerType !== 'touch') {
return;
}
diff --git a/chromium/chrome/browser/resources/tab_strip/tabs_api_proxy.js b/chromium/chrome/browser/resources/tab_strip/tabs_api_proxy.js
index ca87356a5d4..a2faa8074d7 100644
--- a/chromium/chrome/browser/resources/tab_strip/tabs_api_proxy.js
+++ b/chromium/chrome/browser/resources/tab_strip/tabs_api_proxy.js
@@ -29,20 +29,20 @@ export const TabNetworkState = {
/**
* Must be kept in sync with TabAlertState from
* //chrome/browser/ui/tabs/tab_utils.h
- * @enum {number}
+ * @enum {string}
*/
export const TabAlertState = {
- MEDIA_RECORDING: 0,
- TAB_CAPTURING: 1,
- AUDIO_PLAYING: 2,
- AUDIO_MUTING: 3,
- BLUETOOTH_CONNECTED: 4,
- USB_CONNECTED: 5,
- HID_CONNECTED: 6,
- SERIAL_CONNECTED: 7,
- PIP_PLAYING: 8,
- DESKTOP_CAPTURING: 9,
- VR_PRESENTING_IN_HEADSET: 10,
+ AUDIO_MUTING: 'audio-muting',
+ AUDIO_PLAYING: 'audio-playing',
+ BLUETOOTH_CONNECTED: 'bluetooth-connected',
+ DESKTOP_CAPTURING: 'desktop-capturing',
+ HID_CONNECTED: 'hid-connected',
+ MEDIA_RECORDING: 'media-recording',
+ PIP_PLAYING: 'pip-playing',
+ SERIAL_CONNECTED: 'serial-connected',
+ TAB_CAPTURING: 'tab-capturing',
+ USB_CONNECTED: 'usb-connected',
+ VR_PRESENTING_IN_HEADSET: 'vr-presenting',
};
/**
diff --git a/chromium/chrome/browser/resources/tools/rollup_plugin.js b/chromium/chrome/browser/resources/tools/rollup_plugin.js
index f462ab10cb0..d6c49bf8164 100644
--- a/chromium/chrome/browser/resources/tools/rollup_plugin.js
+++ b/chromium/chrome/browser/resources/tools/rollup_plugin.js
@@ -12,7 +12,14 @@ const polymerUrl = 'chrome://resources/polymer/v3_0/';
// TODO: Determine whether it is worth maintaining this list vs always checking
// both directories for the existence of a file.
-const nonGeneratedFiles = ['cr.m.js', 'cr_splitter.js', 'action_link.js'];
+const nonGeneratedFiles = [
+ 'action_link.js',
+ 'certificate_manager_types.js',
+ 'certificate_provisioning_browser_proxy.js',
+ 'certificates_browser_proxy.js',
+ 'cr.m.js',
+ 'cr_splitter.js',
+];
function normalizeSlashes(filepath) {
return filepath.replace(/\\/gi, '/');
diff --git a/chromium/chrome/browser/resources/usb_internals/devices_page.js b/chromium/chrome/browser/resources/usb_internals/devices_page.js
index 2589e5eb286..16d61da3ad6 100644
--- a/chromium/chrome/browser/resources/usb_internals/devices_page.js
+++ b/chromium/chrome/browser/resources/usb_internals/devices_page.js
@@ -34,7 +34,7 @@ cr.define('devices_page', function() {
const devices = response.results;
const tableBody = $('device-list');
- tableBody.innerHTML = '';
+ tableBody.innerHTML = trustedTypes.emptyHTML;
const rowTemplate = document.querySelector('#device-row');
diff --git a/chromium/chrome/browser/resources/usb_internals/usb_internals.js b/chromium/chrome/browser/resources/usb_internals/usb_internals.js
index 6d9fc98f6f2..e9d42969aa8 100644
--- a/chromium/chrome/browser/resources/usb_internals/usb_internals.js
+++ b/chromium/chrome/browser/resources/usb_internals/usb_internals.js
@@ -43,7 +43,7 @@ cr.define('usb_internals', function() {
const response = await this.usbManagerTest_.getTestDevices();
const tableBody = $('test-device-list');
- tableBody.innerHTML = '';
+ tableBody.innerHTML = trustedTypes.emptyHTML;
const rowTemplate = document.querySelector('#test-device-row');
const td = rowTemplate.content.querySelectorAll('td');
diff --git a/chromium/chrome/browser/resources/welcome/BUILD.gn b/chromium/chrome/browser/resources/welcome/BUILD.gn
index dc3f647f2f2..6ceb9074db8 100644
--- a/chromium/chrome/browser/resources/welcome/BUILD.gn
+++ b/chromium/chrome/browser/resources/welcome/BUILD.gn
@@ -3,7 +3,7 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
group("closure_compile") {
deps = [
@@ -81,32 +81,20 @@ js_library("welcome_browser_proxy") {
externs_list = [ "$externs_path/chrome_send.js" ]
}
-polymer_modulizer("welcome_app") {
- js_file = "welcome_app.js"
- html_file = "welcome_app.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("landing_view") {
- js_file = "landing_view.js"
- html_file = "landing_view.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("signin_view") {
- js_file = "signin_view.js"
- html_file = "signin_view.html"
- html_type = "v3-ready"
+group("web_components") {
+ public_deps = [
+ ":web_components_local",
+ "./google_apps:web_components",
+ "./ntp_background:web_components",
+ "./set_as_default:web_components",
+ "./shared:web_components",
+ ]
}
-group("polymer3_elements") {
- public_deps = [
- ":landing_view_module",
- ":signin_view_module",
- ":welcome_app_module",
- "./google_apps:nux_google_apps_module",
- "./ntp_background:nux_ntp_background_module",
- "./set_as_default:nux_set_as_default_module",
- "./shared:polymer3_elements",
+html_to_js("web_components_local") {
+ js_files = [
+ "landing_view.js",
+ "signin_view.js",
+ "welcome_app.js",
]
}
diff --git a/chromium/chrome/browser/resources/welcome/google_apps/BUILD.gn b/chromium/chrome/browser/resources/welcome/google_apps/BUILD.gn
index 5e14c83a05d..c6b73f121ea 100644
--- a/chromium/chrome/browser/resources/welcome/google_apps/BUILD.gn
+++ b/chromium/chrome/browser/resources/welcome/google_apps/BUILD.gn
@@ -3,7 +3,7 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
js_type_check("closure_compile") {
closure_flags = default_closure_args + [
@@ -43,8 +43,6 @@ js_library("google_apps_metrics_proxy") {
deps = [ "../shared:module_metrics_proxy" ]
}
-polymer_modulizer("nux_google_apps") {
- js_file = "nux_google_apps.js"
- html_file = "nux_google_apps.html"
- html_type = "v3-ready"
+html_to_js("web_components") {
+ js_files = [ "nux_google_apps.js" ]
}
diff --git a/chromium/chrome/browser/resources/welcome/ntp_background/BUILD.gn b/chromium/chrome/browser/resources/welcome/ntp_background/BUILD.gn
index 09daeacfd15..310c3d62908 100644
--- a/chromium/chrome/browser/resources/welcome/ntp_background/BUILD.gn
+++ b/chromium/chrome/browser/resources/welcome/ntp_background/BUILD.gn
@@ -3,7 +3,7 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
js_type_check("closure_compile") {
is_polymer3 = true
closure_flags = default_closure_args + [
@@ -32,10 +32,8 @@ js_library("ntp_background_metrics_proxy") {
]
}
-polymer_modulizer("nux_ntp_background") {
- js_file = "nux_ntp_background.js"
- html_file = "nux_ntp_background.html"
- html_type = "v3-ready"
+html_to_js("web_components") {
+ js_files = [ "nux_ntp_background.js" ]
}
js_library("nux_ntp_background") {
diff --git a/chromium/chrome/browser/resources/welcome/set_as_default/BUILD.gn b/chromium/chrome/browser/resources/welcome/set_as_default/BUILD.gn
index d553722f577..eacb2b02225 100644
--- a/chromium/chrome/browser/resources/welcome/set_as_default/BUILD.gn
+++ b/chromium/chrome/browser/resources/welcome/set_as_default/BUILD.gn
@@ -3,7 +3,7 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
js_type_check("closure_compile") {
is_polymer3 = true
@@ -30,8 +30,6 @@ js_library("nux_set_as_default_proxy") {
externs_list = [ "$externs_path/metrics_private.js" ]
}
-polymer_modulizer("nux_set_as_default") {
- js_file = "nux_set_as_default.js"
- html_file = "nux_set_as_default.html"
- html_type = "v3-ready"
+html_to_js("web_components") {
+ js_files = [ "nux_set_as_default.js" ]
}
diff --git a/chromium/chrome/browser/resources/welcome/shared/BUILD.gn b/chromium/chrome/browser/resources/welcome/shared/BUILD.gn
index f7254eb1469..4c9544a4dd7 100644
--- a/chromium/chrome/browser/resources/welcome/shared/BUILD.gn
+++ b/chromium/chrome/browser/resources/welcome/shared/BUILD.gn
@@ -3,7 +3,7 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
js_type_check("closure_compile") {
is_polymer3 = true
@@ -41,56 +41,14 @@ js_library("step_indicator") {
]
}
-polymer_modulizer("animations_css") {
- js_file = "animations_css.js"
- html_file = "animations_css.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("chooser_shared_css") {
- js_file = "chooser_shared_css.js"
- html_file = "chooser_shared_css.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("navi_colors_css") {
- js_file = "navi_colors_css.js"
- html_file = "navi_colors_css.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("action_link_style_css") {
- js_file = "action_link_style_css.js"
- html_file = "action_link_style_css.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("splash_pages_shared_css") {
- js_file = "splash_pages_shared_css.js"
- html_file = "splash_pages_shared_css.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("onboarding_background") {
- js_file = "onboarding_background.js"
- html_file = "onboarding_background.html"
- html_type = "v3-ready"
-}
-
-polymer_modulizer("step_indicator") {
- js_file = "step_indicator.js"
- html_file = "step_indicator.html"
- html_type = "v3-ready"
-}
-
-group("polymer3_elements") {
- public_deps = [
- ":action_link_style_css_module",
- ":animations_css_module",
- ":chooser_shared_css_module",
- ":navi_colors_css_module",
- ":onboarding_background_module",
- ":splash_pages_shared_css_module",
- ":step_indicator_module",
+html_to_js("web_components") {
+ js_files = [
+ "action_link_style_css.js",
+ "animations_css.js",
+ "chooser_shared_css.js",
+ "navi_colors_css.js",
+ "onboarding_background.js",
+ "splash_pages_shared_css.js",
+ "step_indicator.js",
]
}
diff --git a/chromium/chrome/browser/safe_browsing/BUILD.gn b/chromium/chrome/browser/safe_browsing/BUILD.gn
index 14bef91c537..d041bd3f61a 100644
--- a/chromium/chrome/browser/safe_browsing/BUILD.gn
+++ b/chromium/chrome/browser/safe_browsing/BUILD.gn
@@ -2,11 +2,10 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import("//build/config/jumbo.gni")
import("//components/safe_browsing/buildflags.gni")
import("//extensions/buildflags/buildflags.gni")
-jumbo_static_library("safe_browsing") {
+static_library("safe_browsing") {
sources = [
"chrome_controller_client.cc",
"chrome_controller_client.h",
@@ -75,6 +74,8 @@ jumbo_static_library("safe_browsing") {
"certificate_reporting_service_factory.h",
"chrome_password_protection_service.cc",
"chrome_password_protection_service.h",
+ "delayed_warning_navigation_throttle.cc",
+ "delayed_warning_navigation_throttle.h",
"safe_browsing_blocking_page.cc",
"safe_browsing_blocking_page.h",
"safe_browsing_navigation_observer.cc",
@@ -121,6 +122,7 @@ jumbo_static_library("safe_browsing") {
"//components/safe_browsing/core/db:metadata_proto",
"//components/safe_browsing/core/triggers",
"//components/safe_browsing/core/triggers:trigger_throttler",
+ "//services/preferences/public/mojom:mojom",
]
if (safe_browsing_mode == 1) {
# "Safe Browsing Full" files in addition to the "basic" ones to use for
@@ -136,6 +138,8 @@ jumbo_static_library("safe_browsing") {
"client_side_detection_host.h",
"client_side_detection_service.cc",
"client_side_detection_service.h",
+ "client_side_detection_service_factory.cc",
+ "client_side_detection_service_factory.h",
"client_side_model_loader.cc",
"client_side_model_loader.h",
"cloud_content_scanning/binary_fcm_service.cc",
@@ -168,8 +172,6 @@ jumbo_static_library("safe_browsing") {
"download_protection/download_feedback.h",
"download_protection/download_feedback_service.cc",
"download_protection/download_feedback_service.h",
- "download_protection/download_item_request.cc",
- "download_protection/download_item_request.h",
"download_protection/download_protection_service.cc",
"download_protection/download_protection_service.h",
"download_protection/download_protection_util.cc",
@@ -248,6 +250,7 @@ jumbo_static_library("safe_browsing") {
"//components/content_settings/core/browser",
"//components/language/core/common",
"//components/prefs",
+ "//components/safe_browsing/core:client_model_proto",
"//components/safe_browsing/core:webprotect_proto",
"//components/safe_browsing/core/db",
"//components/security_interstitials/content:security_interstitial_page",
@@ -285,6 +288,7 @@ source_set("url_lookup_service_factory") {
":verdict_cache_manager_factory",
"//chrome/common",
"//components/keyed_service/content",
+ "//components/safe_browsing:buildflags",
"//components/safe_browsing/core/realtime:url_lookup_service",
"//components/signin/public/identity_manager",
"//content/public/browser",
@@ -298,6 +302,7 @@ source_set("verdict_cache_manager_factory") {
]
deps = [
+ "//chrome/common",
"//components/content_settings/core/browser",
"//components/history/core/browser",
"//components/keyed_service/content",
diff --git a/chromium/chrome/browser/safe_browsing/chrome_cleaner/BUILD.gn b/chromium/chrome/browser/safe_browsing/chrome_cleaner/BUILD.gn
index 5cb868b9950..fcc691839bf 100644
--- a/chromium/chrome/browser/safe_browsing/chrome_cleaner/BUILD.gn
+++ b/chromium/chrome/browser/safe_browsing/chrome_cleaner/BUILD.gn
@@ -2,7 +2,6 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import("//build/config/jumbo.gni")
import("//third_party/protobuf/proto_library.gni")
source_set("public") {
@@ -27,7 +26,7 @@ source_set("public") {
]
}
-jumbo_static_library("chrome_cleaner") {
+static_library("chrome_cleaner") {
sources = [
"chrome_cleaner_controller_impl_win.cc",
"chrome_cleaner_controller_impl_win.h",
diff --git a/chromium/chrome/browser/settings/BUILD.gn b/chromium/chrome/browser/settings/BUILD.gn
index b49326cbfcf..3de774ae89e 100644
--- a/chromium/chrome/browser/settings/BUILD.gn
+++ b/chromium/chrome/browser/settings/BUILD.gn
@@ -5,7 +5,10 @@
import("//build/config/android/rules.gni")
android_library("java") {
- sources = [ "android/java/src/org/chromium/chrome/browser/settings/ChromeManagedPreferenceDelegate.java" ]
+ sources = [
+ "android/java/src/org/chromium/chrome/browser/settings/ChromeManagedPreferenceDelegate.java",
+ "android/java/src/org/chromium/chrome/browser/settings/SettingsLauncher.java",
+ ]
deps = [
"//chrome/browser/preferences:java",
"//components/browser_ui/settings/android:java",
@@ -24,6 +27,7 @@ android_library("javatests") {
deps = [
":java",
+ ":test_support_java",
"//chrome/android:chrome_java",
"//chrome/test/android:chrome_java_test_support",
"//content/public/test/android:content_java_test_support",
@@ -36,3 +40,16 @@ android_library("javatests") {
"//third_party/junit",
]
}
+
+android_library("test_support_java") {
+ testonly = true
+
+ sources = [ "android/java/src/org/chromium/chrome/browser/settings/SettingsActivityTestRule.java" ]
+
+ deps = [
+ "//chrome/android:chrome_java",
+ "//content/public/test/android:content_java_test_support",
+ "//third_party/android_deps:androidx_preference_preference_java",
+ "//third_party/android_support_test_runner:rules_java",
+ ]
+}
diff --git a/chromium/chrome/browser/share/BUILD.gn b/chromium/chrome/browser/share/BUILD.gn
index 5cf94f28eb1..f985017e519 100644
--- a/chromium/chrome/browser/share/BUILD.gn
+++ b/chromium/chrome/browser/share/BUILD.gn
@@ -6,6 +6,14 @@ source_set("share") {
sources = [
"features.cc",
"features.h",
+ "qr_code_generation_request.cc",
+ "qr_code_generation_request.h",
+ ]
+ deps = [
+ "//base",
+ "//chrome/browser/share/android:jni_headers",
+ "//chrome/services/qrcode_generator/public/cpp",
+ "//chrome/services/qrcode_generator/public/mojom",
+ "//skia",
]
- deps = [ "//base" ]
}
diff --git a/chromium/chrome/browser/share/android/BUILD.gn b/chromium/chrome/browser/share/android/BUILD.gn
index d630fe60b66..a2f5d566a68 100644
--- a/chromium/chrome/browser/share/android/BUILD.gn
+++ b/chromium/chrome/browser/share/android/BUILD.gn
@@ -6,20 +6,21 @@ import("//build/config/android/rules.gni")
android_resources("java_resources") {
sources = [
- "java/res/drawable-hdpi/camera.png",
- "java/res/drawable-mdpi/camera.png",
- "java/res/drawable-xhdpi/camera.png",
- "java/res/drawable-xxhdpi/camera.png",
- "java/res/drawable-xxxhdpi/camera.png",
+ "java/res/drawable/camera_img.xml",
"java/res/drawable/qrcode_background.xml",
"java/res/layout/qrcode_camera_error_layout.xml",
"java/res/layout/qrcode_dialog.xml",
"java/res/layout/qrcode_open_settings_layout.xml",
"java/res/layout/qrcode_permission_layout.xml",
"java/res/layout/qrcode_share_layout.xml",
+ "java/res/values-night/colors.xml",
"java/res/values-sw600dp/dimens.xml",
"java/res/values/colors.xml",
"java/res/values/dimens.xml",
]
- custom_package = "org.chromium.chrome.browser.share.qrcode"
+ custom_package = "org.chromium.chrome.browser.share"
+}
+
+generate_jni("jni_headers") {
+ sources = [ "java/src/org/chromium/chrome/browser/share/qrcode/QRCodeGenerationRequest.java" ]
}
diff --git a/chromium/chrome/browser/share/android/java_sources.gni b/chromium/chrome/browser/share/android/java_sources.gni
index 767fcd5bf86..83b88104972 100644
--- a/chromium/chrome/browser/share/android/java_sources.gni
+++ b/chromium/chrome/browser/share/android/java_sources.gni
@@ -8,6 +8,7 @@ share_java_sources = [
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/SaveImageNotificationManager.java",
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/ShareImageFileUtils.java",
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/clipboard/ClipboardImageFileProvider.java",
+ "//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/QRCodeGenerationRequest.java",
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/QrCodeCoordinator.java",
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/QrCodeDialog.java",
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/QrCodeDialogTab.java",
diff --git a/chromium/chrome/browser/share/android/test_java_sources.gni b/chromium/chrome/browser/share/android/test_java_sources.gni
index f891735ffcb..9b4b3a09254 100644
--- a/chromium/chrome/browser/share/android/test_java_sources.gni
+++ b/chromium/chrome/browser/share/android/test_java_sources.gni
@@ -3,4 +3,7 @@
# found in the LICENSE file.
# TODO(crbug.com/1022172): This should be a separate build target when circular dependencies are removed.
-share_test_java_sources = [ "//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/ShareImageFileUtilsTest.java" ]
+share_test_java_sources = [
+ "//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/ShareImageFileUtilsTest.java",
+ "//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/clipboard/ClipboardImageFileProviderTest.java",
+]
diff --git a/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_mac_browsertest.cc b/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_mac_browsertest.cc
index 8bf74d31846..675f03f7a70 100644
--- a/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_mac_browsertest.cc
+++ b/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_mac_browsertest.cc
@@ -11,6 +11,7 @@
#include "chrome/browser/ui/browser.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "content/public/browser/browser_context.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/mock_render_process_host.h"
#include "mojo/public/cpp/bindings/remote.h"
diff --git a/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_win_browsertest.cc b/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_win_browsertest.cc
index ec20bc039a1..d838e7028bc 100644
--- a/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_win_browsertest.cc
+++ b/chromium/chrome/browser/spellchecker/spell_check_host_chrome_impl_win_browsertest.cc
@@ -19,6 +19,7 @@
#include "components/spellcheck/common/spellcheck_features.h"
#include "components/spellcheck/spellcheck_buildflags.h"
#include "content/public/browser/browser_context.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/mock_render_process_host.h"
#include "mojo/public/cpp/bindings/remote.h"
diff --git a/chromium/chrome/browser/spellchecker/spellcheck_custom_dictionary.cc b/chromium/chrome/browser/spellchecker/spellcheck_custom_dictionary.cc
index 7b85b1eb915..cdda080ce7f 100644
--- a/chromium/chrome/browser/spellchecker/spellcheck_custom_dictionary.cc
+++ b/chromium/chrome/browser/spellchecker/spellcheck_custom_dictionary.cc
@@ -305,7 +305,8 @@ void SpellcheckCustomDictionary::WaitUntilReadyToSync(base::OnceClosure done) {
wait_until_ready_to_sync_cb_ = std::move(done);
}
-syncer::SyncMergeResult SpellcheckCustomDictionary::MergeDataAndStartSyncing(
+base::Optional<syncer::ModelError>
+SpellcheckCustomDictionary::MergeDataAndStartSyncing(
syncer::ModelType type,
const syncer::SyncDataList& initial_sync_data,
std::unique_ptr<syncer::SyncChangeProcessor> sync_processor,
@@ -337,10 +338,7 @@ syncer::SyncMergeResult SpellcheckCustomDictionary::MergeDataAndStartSyncing(
Notify(*to_change_locally);
Save(std::move(to_change_locally));
- // Send local changes to the sync server.
- syncer::SyncMergeResult result(type);
- result.set_error(Sync(to_change_remotely));
- return result;
+ return Sync(to_change_remotely);
}
void SpellcheckCustomDictionary::StopSyncing(syncer::ModelType type) {
@@ -366,7 +364,8 @@ syncer::SyncDataList SpellcheckCustomDictionary::GetAllSyncDataForTesting(
return data;
}
-syncer::SyncError SpellcheckCustomDictionary::ProcessSyncChanges(
+base::Optional<syncer::ModelError>
+SpellcheckCustomDictionary::ProcessSyncChanges(
const base::Location& from_here,
const syncer::SyncChangeList& change_list) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -385,10 +384,11 @@ syncer::SyncError SpellcheckCustomDictionary::ProcessSyncChanges(
case syncer::SyncChange::ACTION_UPDATE:
// Intentionally fall through.
case syncer::SyncChange::ACTION_INVALID:
- return sync_error_handler_->CreateAndUploadError(
- FROM_HERE,
- "Processing sync changes failed on change type " +
- syncer::SyncChange::ChangeTypeToString(change.change_type()));
+ return syncer::ConvertToModelError(
+ sync_error_handler_->CreateAndUploadError(
+ FROM_HERE, "Processing sync changes failed on change type " +
+ syncer::SyncChange::ChangeTypeToString(
+ change.change_type())));
}
}
@@ -397,7 +397,7 @@ syncer::SyncError SpellcheckCustomDictionary::ProcessSyncChanges(
Notify(*dictionary_change);
Save(std::move(dictionary_change));
- return syncer::SyncError();
+ return base::nullopt;
}
SpellcheckCustomDictionary::LoadFileResult::LoadFileResult()
@@ -489,12 +489,11 @@ void SpellcheckCustomDictionary::Save(
std::move(dictionary_change), custom_dictionary_path_));
}
-syncer::SyncError SpellcheckCustomDictionary::Sync(
+base::Optional<syncer::ModelError> SpellcheckCustomDictionary::Sync(
const Change& dictionary_change) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- syncer::SyncError error;
if (!IsSyncing() || dictionary_change.empty())
- return error;
+ return base::nullopt;
// The number of words on the sync server should not exceed the limits.
int server_size = static_cast<int>(words_.size()) -
@@ -529,8 +528,9 @@ syncer::SyncError SpellcheckCustomDictionary::Sync(
}
// Send the changes to the sync processor.
- error = sync_processor_->ProcessSyncChanges(FROM_HERE, sync_change_list);
- if (error.IsSet())
+ base::Optional<syncer::ModelError> error =
+ sync_processor_->ProcessSyncChanges(FROM_HERE, sync_change_list);
+ if (error.has_value())
return error;
// Turn off syncing of this dictionary if the server already has the maximum
@@ -538,7 +538,7 @@ syncer::SyncError SpellcheckCustomDictionary::Sync(
if (words_.size() > spellcheck::kMaxSyncableDictionaryWords)
StopSyncing(syncer::DICTIONARY);
- return error;
+ return base::nullopt;
}
void SpellcheckCustomDictionary::Notify(const Change& dictionary_change) {
diff --git a/chromium/chrome/browser/spellchecker/spellcheck_custom_dictionary.h b/chromium/chrome/browser/spellchecker/spellcheck_custom_dictionary.h
index 61e2e8a57fc..445ab778e4c 100644
--- a/chromium/chrome/browser/spellchecker/spellcheck_custom_dictionary.h
+++ b/chromium/chrome/browser/spellchecker/spellcheck_custom_dictionary.h
@@ -17,9 +17,8 @@
#include "base/observer_list.h"
#include "base/sequenced_task_runner.h"
#include "components/spellcheck/browser/spellcheck_dictionary.h"
+#include "components/sync/model/model_error.h"
#include "components/sync/model/sync_data.h"
-#include "components/sync/model/sync_error.h"
-#include "components/sync/model/sync_merge_result.h"
#include "components/sync/model/syncable_service.h"
namespace base {
@@ -148,14 +147,14 @@ class SpellcheckCustomDictionary : public SpellcheckDictionary,
// Overridden from syncer::SyncableService:
void WaitUntilReadyToSync(base::OnceClosure done) override;
- syncer::SyncMergeResult MergeDataAndStartSyncing(
+ base::Optional<syncer::ModelError> MergeDataAndStartSyncing(
syncer::ModelType type,
const syncer::SyncDataList& initial_sync_data,
std::unique_ptr<syncer::SyncChangeProcessor> sync_processor,
std::unique_ptr<syncer::SyncErrorFactory> sync_error_handler) override;
void StopSyncing(syncer::ModelType type) override;
syncer::SyncDataList GetAllSyncDataForTesting(syncer::ModelType type) const;
- syncer::SyncError ProcessSyncChanges(
+ base::Optional<syncer::ModelError> ProcessSyncChanges(
const base::Location& from_here,
const syncer::SyncChangeList& change_list) override;
@@ -193,7 +192,7 @@ class SpellcheckCustomDictionary : public SpellcheckDictionary,
// Notifies the sync service of the |dictionary_change|. Syncs up to the
// maximum syncable words on the server. Disables syncing of this dictionary
// if the server contains the maximum number of syncable words.
- syncer::SyncError Sync(const Change& dictionary_change);
+ base::Optional<syncer::ModelError> Sync(const Change& dictionary_change);
// Notifies observers of the dictionary change if the dictionary has been
// changed.
diff --git a/chromium/chrome/browser/spellchecker/spellcheck_custom_dictionary_unittest.cc b/chromium/chrome/browser/spellchecker/spellcheck_custom_dictionary_unittest.cc
index 385d13fe3e8..8c8ad6af6af 100644
--- a/chromium/chrome/browser/spellchecker/spellcheck_custom_dictionary_unittest.cc
+++ b/chromium/chrome/browser/spellchecker/spellcheck_custom_dictionary_unittest.cc
@@ -422,7 +422,7 @@ TEST_F(SpellcheckCustomDictionaryTest, ProcessSyncChanges) {
syncer::SyncData::CreateLocalData(word, word, specifics)));
}
- EXPECT_FALSE(dictionary->ProcessSyncChanges(FROM_HERE, changes).IsSet());
+ EXPECT_FALSE(dictionary->ProcessSyncChanges(FROM_HERE, changes).has_value());
const std::set<std::string>& words = dictionary->GetWords();
EXPECT_EQ(2UL, words.size());
@@ -466,8 +466,7 @@ TEST_F(SpellcheckCustomDictionaryTest, MergeDataAndStartSyncing) {
custom_dictionary2)),
std::unique_ptr<syncer::SyncErrorFactory>(
new SyncErrorFactoryStub(&error_counter)))
- .error()
- .IsSet());
+ .has_value());
EXPECT_EQ(0, error_counter);
EXPECT_TRUE(custom_dictionary->IsSyncing());
@@ -527,8 +526,7 @@ TEST_F(SpellcheckCustomDictionaryTest, SyncBeforeLoadDoesNotDuplicateWords) {
custom_dictionary2)),
std::unique_ptr<syncer::SyncErrorFactory>(
new SyncErrorFactoryStub(&error_counter)))
- .error()
- .IsSet());
+ .has_value());
EXPECT_EQ(0, error_counter);
EXPECT_TRUE(custom_dictionary->IsSyncing());
@@ -576,8 +574,7 @@ TEST_F(SpellcheckCustomDictionaryTest, DictionaryTooBigBeforeSyncing) {
custom_dictionary2)),
std::unique_ptr<syncer::SyncErrorFactory>(
new SyncErrorFactoryStub(&error_counter)))
- .error()
- .IsSet());
+ .has_value());
EXPECT_EQ(0, error_counter);
EXPECT_FALSE(custom_dictionary->IsSyncing());
@@ -632,8 +629,7 @@ TEST_F(SpellcheckCustomDictionaryTest, DictionaryTooBigAndServerFull) {
custom_dictionary2)),
std::unique_ptr<syncer::SyncErrorFactory>(
new SyncErrorFactoryStub(&error_counter)))
- .error()
- .IsSet());
+ .has_value());
EXPECT_EQ(0, error_counter);
EXPECT_FALSE(custom_dictionary->IsSyncing());
@@ -686,8 +682,7 @@ TEST_F(SpellcheckCustomDictionaryTest, ServerTooBig) {
custom_dictionary2)),
std::unique_ptr<syncer::SyncErrorFactory>(
new SyncErrorFactoryStub(&error_counter)))
- .error()
- .IsSet());
+ .has_value());
EXPECT_EQ(0, error_counter);
EXPECT_FALSE(custom_dictionary->IsSyncing());
@@ -736,8 +731,7 @@ TEST_F(SpellcheckCustomDictionaryTest, DictionaryTooBigToStartSyncing) {
custom_dictionary2)),
std::unique_ptr<syncer::SyncErrorFactory>(
new SyncErrorFactoryStub(&error_counter)))
- .error()
- .IsSet());
+ .has_value());
EXPECT_EQ(0, error_counter);
EXPECT_FALSE(custom_dictionary->IsSyncing());
@@ -783,8 +777,7 @@ TEST_F(SpellcheckCustomDictionaryTest, DictionaryTooBigToContiueSyncing) {
custom_dictionary2)),
std::unique_ptr<syncer::SyncErrorFactory>(
new SyncErrorFactoryStub(&error_counter)))
- .error()
- .IsSet());
+ .has_value());
EXPECT_EQ(0, error_counter);
EXPECT_TRUE(custom_dictionary->IsSyncing());
@@ -834,8 +827,7 @@ TEST_F(SpellcheckCustomDictionaryTest, LoadAfterSyncStart) {
custom_dictionary2)),
std::unique_ptr<syncer::SyncErrorFactory>(
new SyncErrorFactoryStub(&error_counter)))
- .error()
- .IsSet());
+ .has_value());
EXPECT_EQ(0, error_counter);
EXPECT_TRUE(custom_dictionary->IsSyncing());
@@ -881,8 +873,7 @@ TEST_F(SpellcheckCustomDictionaryTest, LoadAfterSyncStartTooBigToSync) {
custom_dictionary2)),
std::unique_ptr<syncer::SyncErrorFactory>(
new SyncErrorFactoryStub(&error_counter)))
- .error()
- .IsSet());
+ .has_value());
EXPECT_EQ(0, error_counter);
EXPECT_TRUE(custom_dictionary->IsSyncing());
@@ -937,8 +928,7 @@ TEST_F(SpellcheckCustomDictionaryTest, LoadDuplicatesAfterSync) {
custom_dictionary2)),
std::unique_ptr<syncer::SyncErrorFactory>(
new SyncErrorFactoryStub(&error_counter)))
- .error()
- .IsSet());
+ .has_value());
EXPECT_EQ(0, error_counter);
EXPECT_TRUE(custom_dictionary->IsSyncing());
@@ -1062,8 +1052,7 @@ TEST_F(SpellcheckCustomDictionaryTest, DictionarySyncNotification) {
custom_dictionary2)),
std::unique_ptr<syncer::SyncErrorFactory>(
new SyncErrorFactoryStub(&error_counter)))
- .error()
- .IsSet());
+ .has_value());
EXPECT_EQ(0, error_counter);
EXPECT_TRUE(custom_dictionary->IsSyncing());
@@ -1113,8 +1102,7 @@ TEST_F(SpellcheckCustomDictionaryTest, DictionarySyncLimit) {
server_custom_dictionary)),
std::unique_ptr<syncer::SyncErrorFactory>(
new SyncErrorFactoryStub(&error_counter)))
- .error()
- .IsSet());
+ .has_value());
EXPECT_EQ(0, error_counter);
EXPECT_TRUE(custom_dictionary->IsSyncing());
EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords,
@@ -1159,8 +1147,7 @@ TEST_F(SpellcheckCustomDictionaryTest, DictionarySyncLimit) {
server_custom_dictionary)),
std::unique_ptr<syncer::SyncErrorFactory>(
new SyncErrorFactoryStub(&error_counter)))
- .error()
- .IsSet());
+ .has_value());
EXPECT_EQ(0, error_counter);
EXPECT_FALSE(client_custom_dictionary->IsSyncing());
EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords * 2,
diff --git a/chromium/chrome/browser/spellchecker/spellcheck_hunspell_dictionary.cc b/chromium/chrome/browser/spellchecker/spellcheck_hunspell_dictionary.cc
index 47179fbe844..25feeebf536 100644
--- a/chromium/chrome/browser/spellchecker/spellcheck_hunspell_dictionary.cc
+++ b/chromium/chrome/browser/spellchecker/spellcheck_hunspell_dictionary.cc
@@ -9,10 +9,11 @@
#include <utility>
#include "base/bind.h"
+#include "base/check_op.h"
#include "base/files/file_util.h"
#include "base/lazy_instance.h"
#include "base/location.h"
-#include "base/logging.h"
+#include "base/notreached.h"
#include "base/path_service.h"
#include "base/single_thread_task_runner.h"
#include "base/task/post_task.h"
diff --git a/chromium/chrome/browser/spellchecker/spellcheck_language_blacklist_policy_handler.cc b/chromium/chrome/browser/spellchecker/spellcheck_language_blacklist_policy_handler.cc
index 77fd7c2490d..c6e9b802038 100644
--- a/chromium/chrome/browser/spellchecker/spellcheck_language_blacklist_policy_handler.cc
+++ b/chromium/chrome/browser/spellchecker/spellcheck_language_blacklist_policy_handler.cc
@@ -12,12 +12,13 @@
#include "base/syslog_logging.h"
#include "base/values.h"
#include "build/build_config.h"
+#include "chrome/browser/spellchecker/spellcheck_service.h"
#include "chrome/common/pref_names.h"
#include "components/policy/core/browser/policy_error_map.h"
#include "components/policy/policy_constants.h"
#include "components/prefs/pref_value_map.h"
#include "components/spellcheck/browser/pref_names.h"
-#include "components/spellcheck/common/spellcheck_common.h"
+#include "components/spellcheck/common/spellcheck_features.h"
#include "components/strings/grit/components_strings.h"
SpellcheckLanguageBlacklistPolicyHandler::
@@ -113,9 +114,11 @@ void SpellcheckLanguageBlacklistPolicyHandler::SortBlacklistedLanguages(
// Separate the valid languages from the unknown / unsupported languages and
// the languages that also appear in the SpellcheckLanguage policy.
for (const base::Value& language : value->GetList()) {
+ std::string candidate_language =
+ base::TrimWhitespaceASCII(language.GetString(), base::TRIM_ALL)
+ .as_string();
std::string current_language =
- spellcheck::GetCorrespondingSpellCheckLanguage(
- base::TrimWhitespaceASCII(language.GetString(), base::TRIM_ALL));
+ SpellcheckService::GetSupportedAcceptLanguageCode(candidate_language);
if (current_language.empty()) {
unknown->emplace_back(language.GetString());
diff --git a/chromium/chrome/browser/spellchecker/spellcheck_language_policy_handler.cc b/chromium/chrome/browser/spellchecker/spellcheck_language_policy_handler.cc
index b5407f513e3..7724da7d1bd 100644
--- a/chromium/chrome/browser/spellchecker/spellcheck_language_policy_handler.cc
+++ b/chromium/chrome/browser/spellchecker/spellcheck_language_policy_handler.cc
@@ -11,12 +11,13 @@
#include "base/syslog_logging.h"
#include "base/values.h"
#include "build/build_config.h"
+#include "chrome/browser/spellchecker/spellcheck_service.h"
#include "chrome/common/pref_names.h"
#include "components/policy/core/browser/policy_error_map.h"
#include "components/policy/policy_constants.h"
#include "components/prefs/pref_value_map.h"
#include "components/spellcheck/browser/pref_names.h"
-#include "components/spellcheck/common/spellcheck_common.h"
+#include "components/spellcheck/common/spellcheck_features.h"
#include "components/strings/grit/components_strings.h"
SpellcheckLanguagePolicyHandler::SpellcheckLanguagePolicyHandler()
@@ -86,9 +87,11 @@ void SpellcheckLanguagePolicyHandler::SortForcedLanguages(
// Separate the valid languages from the unknown / unsupported languages.
for (const base::Value& language : value->GetList()) {
+ std::string candidate_language =
+ base::TrimWhitespaceASCII(language.GetString(), base::TRIM_ALL)
+ .as_string();
std::string current_language =
- spellcheck::GetCorrespondingSpellCheckLanguage(
- base::TrimWhitespaceASCII(language.GetString(), base::TRIM_ALL));
+ SpellcheckService::GetSupportedAcceptLanguageCode(candidate_language);
if (current_language.empty()) {
unknown->emplace_back(language.GetString());
diff --git a/chromium/chrome/browser/spellchecker/spellcheck_language_policy_handlers_unittest.cc b/chromium/chrome/browser/spellchecker/spellcheck_language_policy_handlers_unittest.cc
new file mode 100644
index 00000000000..fd5ff6c2907
--- /dev/null
+++ b/chromium/chrome/browser/spellchecker/spellcheck_language_policy_handlers_unittest.cc
@@ -0,0 +1,207 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Chromium style is to have one unit test per one header file. However, the
+// applied blocked spellcheck language policy depends on the applied forced
+// language policy. If a language is both blocked and forced, forced wins. It is
+// only practical to test this interaction in a single unit test covering both
+// header files.
+#include "chrome/browser/spellchecker/spellcheck_language_blacklist_policy_handler.h"
+#include "chrome/browser/spellchecker/spellcheck_language_policy_handler.h"
+
+#include <ostream>
+#include <string>
+#include <vector>
+
+#include "base/strings/string_util.h"
+#include "base/test/scoped_feature_list.h"
+#include "base/values.h"
+#include "chrome/common/pref_names.h"
+#include "components/policy/core/common/policy_map.h"
+#include "components/policy/policy_constants.h"
+#include "components/prefs/pref_value_map.h"
+#include "components/spellcheck/browser/pref_names.h"
+#include "components/spellcheck/common/spellcheck_features.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace policy {
+
+struct TestCase {
+ TestCase(const std::vector<std::string>& blocked_languages,
+ const std::vector<std::string>& forced_languages,
+ const std::vector<std::string>& expected_blocked_languages,
+ const std::vector<std::string>& expected_forced_languages,
+ bool spellcheck_enabled,
+ bool windows_spellchecker_enabled)
+ : blocked_languages(blocked_languages),
+ forced_languages(forced_languages),
+ expected_blocked_languages(expected_blocked_languages),
+ expected_forced_languages(expected_forced_languages),
+ spellcheck_enabled(spellcheck_enabled),
+ windows_spellchecker_enabled(windows_spellchecker_enabled) {}
+
+ std::vector<std::string> blocked_languages;
+ std::vector<std::string> forced_languages;
+ std::vector<std::string> expected_blocked_languages;
+ std::vector<std::string> expected_forced_languages;
+ bool spellcheck_enabled;
+ bool windows_spellchecker_enabled;
+};
+
+std::ostream& operator<<(std::ostream& out, const TestCase& test_case) {
+ out << "blocked_languages=["
+ << base::JoinString(test_case.blocked_languages, ",")
+ << "], forced_languages=["
+ << base::JoinString(test_case.forced_languages, ",")
+ << "], expected_blocked_languages=["
+ << base::JoinString(test_case.expected_blocked_languages, ",")
+ << "], expected_forced_languages=["
+ << base::JoinString(test_case.expected_forced_languages, ",")
+ << "], spellcheck_enabled=" << test_case.spellcheck_enabled
+ << "], windows_spellchecker_enabled="
+ << test_case.windows_spellchecker_enabled;
+ return out;
+}
+
+class SpellcheckLanguagePolicyHandlersTest
+ : public testing::TestWithParam<TestCase> {
+ public:
+ SpellcheckLanguagePolicyHandlersTest() = default;
+ ~SpellcheckLanguagePolicyHandlersTest() override = default;
+
+ void CheckPrefs(const PrefValueMap& prefs,
+ const std::string& key,
+ const std::vector<std::string>& expected) {
+ // Retrieve the spellcheck enabled pref (if it exists).
+ const base::Value* spellcheck_enabled_pref = nullptr;
+ const bool is_spellcheck_enabled_pref_set = prefs.GetValue(
+ spellcheck::prefs::kSpellCheckEnable, &spellcheck_enabled_pref);
+
+ const base::Value* languages_list = nullptr;
+ if (GetParam().spellcheck_enabled) {
+ EXPECT_TRUE(is_spellcheck_enabled_pref_set);
+ EXPECT_TRUE(spellcheck_enabled_pref->is_bool());
+ EXPECT_TRUE(spellcheck_enabled_pref->GetBool());
+
+ EXPECT_TRUE(prefs.GetValue(key, &languages_list));
+ EXPECT_TRUE(languages_list->is_list());
+ EXPECT_EQ(expected.size(), languages_list->GetList().size());
+
+ for (const auto& language : languages_list->GetList()) {
+ EXPECT_TRUE(language.is_string());
+ EXPECT_TRUE(std::find(expected.begin(), expected.end(),
+ language.GetString()) != expected.end());
+ }
+ } else {
+ EXPECT_FALSE(is_spellcheck_enabled_pref_set);
+ // No language list should be added to prefs if spellchecking disabled.
+ EXPECT_FALSE(prefs.GetValue(key, &languages_list));
+ }
+ }
+};
+
+TEST_P(SpellcheckLanguagePolicyHandlersTest, ApplyPolicySettings) {
+#if BUILDFLAG(USE_WIN_HYBRID_SPELLCHECKER)
+ base::test::ScopedFeatureList feature_list;
+ if (GetParam().windows_spellchecker_enabled) {
+ if (!spellcheck::WindowsVersionSupportsSpellchecker())
+ return;
+
+ // Force hybrid spellchecking to be enabled.
+ feature_list.InitWithFeatures(
+ /*enabled_features=*/{spellcheck::kWinUseBrowserSpellChecker,
+ spellcheck::kWinUseHybridSpellChecker},
+ /*disabled_features=*/{});
+ } else {
+ // Hunspell-only spellcheck languages will be used.
+ feature_list.InitAndDisableFeature(spellcheck::kWinUseBrowserSpellChecker);
+ }
+#endif // BUILDFLAG(USE_WIN_HYBRID_SPELLCHECKER)
+
+ PrefValueMap prefs;
+ policy::PolicyMap policy;
+
+ base::Value blocked_languages_list(base::Value::Type::LIST);
+ for (const auto& blocked_language : GetParam().blocked_languages) {
+ blocked_languages_list.Append(std::move(blocked_language));
+ }
+
+ base::Value forced_languages_list(base::Value::Type::LIST);
+ for (const auto& forced_language : GetParam().forced_languages) {
+ forced_languages_list.Append(std::move(forced_language));
+ }
+
+ policy.Set(policy::key::kSpellcheckLanguageBlacklist,
+ policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
+ policy::POLICY_SOURCE_ENTERPRISE_DEFAULT,
+ base::Value::ToUniquePtrValue(std::move(blocked_languages_list)),
+ nullptr);
+
+ policy.Set(
+ policy::key::kSpellcheckLanguage, policy::POLICY_LEVEL_MANDATORY,
+ policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_ENTERPRISE_DEFAULT,
+ base::Value::ToUniquePtrValue(std::move(forced_languages_list)), nullptr);
+
+ policy.Set(
+ policy::key::kSpellcheckEnabled, policy::POLICY_LEVEL_MANDATORY,
+ policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_ENTERPRISE_DEFAULT,
+ std::make_unique<base::Value>(GetParam().spellcheck_enabled), nullptr);
+
+ // Apply policy to the forced languages handler.
+ SpellcheckLanguagePolicyHandler forced_languages_handler;
+ forced_languages_handler.ApplyPolicySettings(policy, &prefs);
+
+ // Apply policy to the blocked languages handler.
+ SpellcheckLanguageBlacklistPolicyHandler blocked_languages_handler;
+ blocked_languages_handler.ApplyPolicySettings(policy, &prefs);
+
+ // Check if forced languages preferences are as expected.
+ CheckPrefs(prefs, spellcheck::prefs::kSpellCheckForcedDictionaries,
+ GetParam().expected_forced_languages);
+
+ // Check if blocked languages preferences are as expected.
+ CheckPrefs(prefs, spellcheck::prefs::kSpellCheckBlacklistedDictionaries,
+ GetParam().expected_blocked_languages);
+}
+
+INSTANTIATE_TEST_SUITE_P(
+ TestCases,
+ SpellcheckLanguagePolicyHandlersTest,
+ testing::Values(
+#if BUILDFLAG(USE_WIN_HYBRID_SPELLCHECKER)
+ // Test cases for Windows spellchecker (policy languages not restricted
+ // to Hunspell).
+ TestCase({"ar-SA", "es-MX", "fi", "fr",
+ "not-a-language"} /* blocked languages */,
+ {"fi", "fr", "not-another-language"} /* forced languages */,
+ {"ar", "es-MX"} /* expected blocked languages */,
+ {"fi", "fr"} /* expected forced languages */,
+ true /* spellcheck enabled */,
+ true /* windows spellchecker enabled */),
+ TestCase({"ar-SA", "es-MX", "fi", "fr "} /* blocked languages */,
+ {"fi", "fr"} /* forced languages */,
+ {""} /* expected blocked languages */,
+ {""} /* expected forced languages */,
+ false /* spellcheck enabled */,
+ true /* windows spellchecker enabled */),
+#endif // BUILDFLAG(USE_WIN_HYBRID_SPELLCHECKER)
+ // Test cases for Hunspell only spellchecker. ar-SA and fi are
+ // non-Hunspell languages so are ignored for policy enforcement. If they
+ // ever obtain Hunspell support, the first test case below will fail.
+ TestCase({"ar-SA", "es-MX", "fi", "fr",
+ "not-a-language"} /* blocked languages */,
+ {"fi", "fr", "not-another-language"} /* forced languages */,
+ {"es-MX"} /* expected blocked languages */,
+ {"fr"} /* expected forced languages */,
+ true /* spellcheck enabled */,
+ false /* windows spellchecker enabled */),
+ TestCase({"ar-SA", "es-MX", "fi", "fr",
+ "not-a-language"} /* blocked languages */,
+ {"fi", "fr", "not-another-language"} /* forced languages */,
+ {""} /* expected blocked languages */,
+ {""} /* expected forced languages */,
+ false /* spellcheck enabled */,
+ false /* windows spellchecker enabled */)));
+
+} // namespace policy
diff --git a/chromium/chrome/browser/spellchecker/spellcheck_mac_view_interactive_uitest.mm b/chromium/chrome/browser/spellchecker/spellcheck_mac_view_interactive_uitest.mm
index 5bb646f0fca..98ad68ef4ca 100644
--- a/chromium/chrome/browser/spellchecker/spellcheck_mac_view_interactive_uitest.mm
+++ b/chromium/chrome/browser/spellchecker/spellcheck_mac_view_interactive_uitest.mm
@@ -11,6 +11,7 @@
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_widget_host_view.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
#if BUILDFLAG(ENABLE_SPELLCHECK)
#include "chrome/browser/spellchecker/test/spellcheck_panel_browsertest_helper.h"
diff --git a/chromium/chrome/browser/spellchecker/spellcheck_service.cc b/chromium/chrome/browser/spellchecker/spellcheck_service.cc
index 7d3ddb783ca..af11ea50738 100644
--- a/chromium/chrome/browser/spellchecker/spellcheck_service.cc
+++ b/chromium/chrome/browser/spellchecker/spellcheck_service.cc
@@ -5,11 +5,12 @@
#include "chrome/browser/spellchecker/spellcheck_service.h"
#include <algorithm>
+#include <iterator>
#include <set>
#include <utility>
#include "base/bind.h"
-#include "base/logging.h"
+#include "base/check_op.h"
#include "base/no_destructor.h"
#include "base/stl_util.h"
#include "base/strings/string_split.h"
@@ -38,6 +39,7 @@
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/storage_partition.h"
#include "mojo/public/cpp/bindings/remote.h"
+#include "ui/base/l10n/l10n_util.h"
#if defined(OS_WIN) && BUILDFLAG(USE_BROWSER_SPELLCHECKER)
#include "base/task/post_task.h"
@@ -200,6 +202,84 @@ bool SpellcheckService::SignalStatusEvent(
return true;
}
+// static
+std::string SpellcheckService::GetSupportedAcceptLanguageCode(
+ const std::string& supported_language_full_tag) {
+ // Default to accept language in hardcoded list of Hunspell dictionaries
+ // (kSupportedSpellCheckerLanguages).
+ std::string supported_accept_language =
+ spellcheck::GetCorrespondingSpellCheckLanguage(
+ supported_language_full_tag);
+
+#if defined(OS_WIN)
+ if (!spellcheck::UseWinHybridSpellChecker())
+ return supported_accept_language;
+
+ // Collect the hardcoded list of accept-languages supported by the browser,
+ // that is, languages that can be added as preferred languages in the
+ // languages settings page.
+ std::vector<std::string> accept_languages;
+ l10n_util::GetAcceptLanguages(&accept_languages);
+
+ // First try exact match. Per BCP47, tags are in ASCII and should be treated
+ // as case-insensitive (although there are conventions for the capitalization
+ // of subtags).
+ auto iter =
+ std::find_if(accept_languages.begin(), accept_languages.end(),
+ [supported_language_full_tag](const auto& accept_language) {
+ return base::EqualsCaseInsensitiveASCII(
+ supported_language_full_tag, accept_language);
+ });
+ if (iter != accept_languages.end())
+ return *iter;
+
+ // Then try matching just the language and (optional) script subtags, but
+ // not the region subtag. For example, Edge supports sr-Cyrl-RS as an accept
+ // language, but not sr-Cyrl-CS. Matching language + script subtags assures
+ // we get the correct script for spellchecking, and not use sr-Latn-RS if
+ // language packs for both scripts are installed on the system.
+ if (!base::Contains(supported_language_full_tag, "-"))
+ return "";
+
+ iter =
+ std::find_if(accept_languages.begin(), accept_languages.end(),
+ [supported_language_full_tag](const auto& accept_language) {
+ return base::EqualsCaseInsensitiveASCII(
+ SpellcheckService::GetLanguageAndScriptTag(
+ supported_language_full_tag,
+ /* include_script_tag */ true),
+ SpellcheckService::GetLanguageAndScriptTag(
+ accept_language,
+ /* include_script_tag */ true));
+ });
+
+ if (iter != accept_languages.end())
+ return *iter;
+
+ // Then try just matching the leading language subtag. E.g. Edge supports
+ // kok as an accept language, but if the Konkani language pack is
+ // installed the Windows spellcheck API reports kok-Deva-IN for the
+ // dictionary name.
+ iter =
+ std::find_if(accept_languages.begin(), accept_languages.end(),
+ [supported_language_full_tag](const auto& accept_language) {
+ return base::EqualsCaseInsensitiveASCII(
+ SpellcheckService::GetLanguageAndScriptTag(
+ supported_language_full_tag,
+ /* include_script_tag */ false),
+ SpellcheckService::GetLanguageAndScriptTag(
+ accept_language,
+ /* include_script_tag */ false));
+ });
+
+ if (iter != accept_languages.end())
+ return *iter;
+
+#endif // defined(OS_WIN)
+
+ return supported_accept_language;
+}
+
void SpellcheckService::StartRecordingMetrics(bool spellcheck_enabled) {
metrics_ = std::make_unique<SpellCheckHostMetrics>();
metrics_->RecordEnabledStats(spellcheck_enabled);
@@ -361,6 +441,33 @@ void SpellcheckService::OverrideBinderForTesting(SpellCheckerBinder binder) {
}
// static
+std::string SpellcheckService::GetLanguageAndScriptTag(
+ const std::string& full_tag,
+ bool include_script_tag) {
+ std::string language_and_script_tag;
+
+ std::vector<std::string> subtags = base::SplitString(
+ full_tag, "-", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
+ // Language subtag is required, all others optional.
+ DCHECK_GE(subtags.size(), 1ULL);
+ std::vector<std::string> subtag_tokens_to_pass;
+ subtag_tokens_to_pass.push_back(subtags.front());
+ subtags.erase(subtags.begin());
+
+ // The optional script subtag always follows the language subtag, and is 4
+ // characters in length.
+ if (include_script_tag) {
+ if (!subtags.empty() && subtags.front().length() == 4) {
+ subtag_tokens_to_pass.push_back(subtags.front());
+ }
+ }
+
+ language_and_script_tag = base::JoinString(subtag_tokens_to_pass, "-");
+
+ return language_and_script_tag;
+}
+
+// static
void SpellcheckService::AttachStatusEvent(base::WaitableEvent* status_event) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
diff --git a/chromium/chrome/browser/spellchecker/spellcheck_service.h b/chromium/chrome/browser/spellchecker/spellcheck_service.h
index 803c7dad0d3..97df131375c 100644
--- a/chromium/chrome/browser/spellchecker/spellcheck_service.h
+++ b/chromium/chrome/browser/spellchecker/spellcheck_service.h
@@ -94,6 +94,13 @@ class SpellcheckService : public KeyedService,
// when we do not set an event to |status_event_|.
static bool SignalStatusEvent(EventType type);
+ // Get the best match of a supported accept language code for the provided
+ // language tag. Returns an empty string if no match is found. Method cannot
+ // be defined in spellcheck_common.h as it depends on l10n_util, and code
+ // under components cannot depend on ui/base.
+ static std::string GetSupportedAcceptLanguageCode(
+ const std::string& supported_language_full_tag);
+
// Instantiates SpellCheckHostMetrics object and makes it ready for recording
// metrics. This should be called only if the metrics recording is active.
void StartRecordingMetrics(bool spellcheck_enabled);
@@ -161,6 +168,11 @@ class SpellcheckService : public KeyedService,
private:
FRIEND_TEST_ALL_PREFIXES(SpellcheckServiceBrowserTest, DeleteCorruptedBDICT);
+ // Parses a full BCP47 language tag to return just the language subtag,
+ // optionally with a hyphen and script subtag appended.
+ static std::string GetLanguageAndScriptTag(const std::string& full_tag,
+ bool include_script_tag);
+
// Attaches an event so browser tests can listen the status events.
static void AttachStatusEvent(base::WaitableEvent* status_event);
diff --git a/chromium/chrome/browser/spellchecker/spellcheck_service_browsertest.cc b/chromium/chrome/browser/spellchecker/spellcheck_service_browsertest.cc
index 109bf1ae019..ef602ba4d53 100644
--- a/chromium/chrome/browser/spellchecker/spellcheck_service_browsertest.cc
+++ b/chromium/chrome/browser/spellchecker/spellcheck_service_browsertest.cc
@@ -36,6 +36,7 @@
#include "components/spellcheck/common/spellcheck_result.h"
#include "components/spellcheck/spellcheck_buildflags.h"
#include "components/user_prefs/user_prefs.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/mock_render_process_host.h"
#include "content/public/test/test_utils.h"
diff --git a/chromium/chrome/browser/subresource_filter/BUILD.gn b/chromium/chrome/browser/subresource_filter/BUILD.gn
index d112ecdc244..86151132998 100644
--- a/chromium/chrome/browser/subresource_filter/BUILD.gn
+++ b/chromium/chrome/browser/subresource_filter/BUILD.gn
@@ -25,6 +25,8 @@ if (is_android) {
"//base:base_java_test_support",
"//chrome/android:chrome_java",
"//chrome/android:chrome_test_java",
+ "//chrome/browser/tab:java",
+ "//chrome/browser/ui/messages/android:java",
"//chrome/test/android:chrome_java_test_support",
"//components/safe_browsing/android:safe_browsing_java",
"//content/public/test/android:content_java_test_support",
diff --git a/chromium/chrome/browser/supervised_user/BUILD.gn b/chromium/chrome/browser/supervised_user/BUILD.gn
index 93832b65bb7..7544a675864 100644
--- a/chromium/chrome/browser/supervised_user/BUILD.gn
+++ b/chromium/chrome/browser/supervised_user/BUILD.gn
@@ -17,3 +17,16 @@ grit("supervised_user_unscaled_resources") {
"root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir),
]
}
+
+static_library("test_support") {
+ testonly = true
+ sources = [
+ "supervised_user_test_util.cc",
+ "supervised_user_test_util.h",
+ ]
+ deps = [
+ "//chrome/browser",
+ "//chrome/common:constants",
+ "//components/prefs",
+ ]
+}
diff --git a/chromium/chrome/browser/supervised_user/supervised_user_unscaled_resources.grd b/chromium/chrome/browser/supervised_user/supervised_user_unscaled_resources.grd
index 8d4792b7fb5..ac16af796b3 100644
--- a/chromium/chrome/browser/supervised_user/supervised_user_unscaled_resources.grd
+++ b/chromium/chrome/browser/supervised_user/supervised_user_unscaled_resources.grd
@@ -8,7 +8,7 @@
</outputs>
<release seq="1">
<includes>
- <include name="IDR_FAMILY_LINK_LOGO" file="supervised_user_error_page/resources/default_100_percent/family_link_logo.png" type="BINDATA" />
+ <include name="IDR_SUPERVISED_USER_ICON" file="resources/supervised_user_icon.png" type="BINDATA" />
</includes>
</release>
</grit>
diff --git a/chromium/chrome/browser/tab/BUILD.gn b/chromium/chrome/browser/tab/BUILD.gn
new file mode 100644
index 00000000000..cef802edf3a
--- /dev/null
+++ b/chromium/chrome/browser/tab/BUILD.gn
@@ -0,0 +1,33 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/android/config.gni")
+import("//build/config/android/rules.gni")
+import("//chrome/android/features/android_library_factory_tmpl.gni")
+import("//chrome/browser/buildflags.gni")
+
+android_library("java") {
+ sources = [
+ "java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java",
+ "java/src/org/chromium/chrome/browser/tab/Tab.java",
+ "java/src/org/chromium/chrome/browser/tab/TabAttributeKeys.java",
+ "java/src/org/chromium/chrome/browser/tab/TabAttributes.java",
+ "java/src/org/chromium/chrome/browser/tab/TabCreationState.java",
+ "java/src/org/chromium/chrome/browser/tab/TabHidingType.java",
+ "java/src/org/chromium/chrome/browser/tab/TabLifecycle.java",
+ "java/src/org/chromium/chrome/browser/tab/TabObserver.java",
+ ]
+
+ # TabSelectionType, TabLaunchType
+ srcjar_deps = [ "//chrome/browser/ui:tab_model_enums_java" ]
+
+ deps = [
+ "//base:base_java",
+ "//chrome/browser/ui/android/native_page:java",
+ "//components/embedder_support/android:content_view_java",
+ "//components/find_in_page/android:java",
+ "//content/public/android:content_java",
+ "//ui/android:ui_full_java",
+ ]
+}
diff --git a/chromium/chrome/browser/tab_contents/navigation_metrics_recorder.cc b/chromium/chrome/browser/tab_contents/navigation_metrics_recorder.cc
index 859d8eedb4b..dfdd6924d2b 100644
--- a/chromium/chrome/browser/tab_contents/navigation_metrics_recorder.cc
+++ b/chromium/chrome/browser/tab_contents/navigation_metrics_recorder.cc
@@ -4,7 +4,9 @@
#include "chrome/browser/tab_contents/navigation_metrics_recorder.h"
+#include "base/metrics/histogram_macros.h"
#include "build/build_config.h"
+#include "chrome/browser/engagement/site_engagement_service.h"
#include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_metrics.h"
@@ -27,7 +29,9 @@
NavigationMetricsRecorder::NavigationMetricsRecorder(
content::WebContents* web_contents)
- : content::WebContentsObserver(web_contents) {
+ : content::WebContentsObserver(web_contents),
+ site_engagement_service_(SiteEngagementService::Get(
+ Profile::FromBrowserContext(web_contents->GetBrowserContext()))) {
#if defined(OS_ANDROID)
// The site isolation synthetic field trial is only needed on Android, as on
// desktop it would be unnecessarily set for all users.
@@ -77,11 +81,25 @@ void NavigationMetricsRecorder::DidFinishNavigation(
content::NavigationEntry* last_committed_entry =
web_contents()->GetController().GetLastCommittedEntry();
+ const GURL url = last_committed_entry->GetVirtualURL();
Profile* profile = Profile::FromBrowserContext(context);
navigation_metrics::RecordMainFrameNavigation(
- last_committed_entry->GetVirtualURL(),
- navigation_handle->IsSameDocument(), profile->IsOffTheRecord(),
+ url, navigation_handle->IsSameDocument(), profile->IsOffTheRecord(),
ProfileMetrics::GetBrowserProfileType(profile));
+
+ if (url.SchemeIsHTTPOrHTTPS() && !navigation_handle->IsSameDocument() &&
+ !navigation_handle->IsDownload() && !profile->IsOffTheRecord()) {
+ blink::mojom::EngagementLevel engagement_level =
+ site_engagement_service_->GetEngagementLevel(url);
+ UMA_HISTOGRAM_ENUMERATION("Navigation.MainFrame.SiteEngagementLevel",
+ engagement_level);
+
+ if (navigation_handle->IsFormSubmission()) {
+ UMA_HISTOGRAM_ENUMERATION(
+ "Navigation.MainFrameFormSubmission.SiteEngagementLevel",
+ engagement_level);
+ }
+ }
}
WEB_CONTENTS_USER_DATA_KEY_IMPL(NavigationMetricsRecorder)
diff --git a/chromium/chrome/browser/tab_contents/navigation_metrics_recorder.h b/chromium/chrome/browser/tab_contents/navigation_metrics_recorder.h
index 9eac02c3e7e..a90a01ecb23 100644
--- a/chromium/chrome/browser/tab_contents/navigation_metrics_recorder.h
+++ b/chromium/chrome/browser/tab_contents/navigation_metrics_recorder.h
@@ -9,6 +9,8 @@
#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_contents_user_data.h"
+class SiteEngagementService;
+
class NavigationMetricsRecorder
: public content::WebContentsObserver,
public content::WebContentsUserData<NavigationMetricsRecorder> {
@@ -28,6 +30,7 @@ class NavigationMetricsRecorder
void DidFinishNavigation(
content::NavigationHandle* navigation_handle) override;
+ SiteEngagementService* site_engagement_service_;
bool is_synthetic_isolation_trial_enabled_;
WEB_CONTENTS_USER_DATA_KEY_DECL();
diff --git a/chromium/chrome/browser/tab_contents/navigation_metrics_recorder_browsertest.cc b/chromium/chrome/browser/tab_contents/navigation_metrics_recorder_browsertest.cc
index 397aad0fd05..c3e8989646e 100644
--- a/chromium/chrome/browser/tab_contents/navigation_metrics_recorder_browsertest.cc
+++ b/chromium/chrome/browser/tab_contents/navigation_metrics_recorder_browsertest.cc
@@ -3,19 +3,44 @@
// found in the LICENSE file.
#include "base/test/metrics/histogram_tester.h"
+#include "chrome/browser/engagement/site_engagement_score.h"
+#include "chrome/browser/engagement/site_engagement_service.h"
#include "chrome/browser/tab_contents/navigation_metrics_recorder.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/interactive_test_utils.h"
#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/browser/render_view_host.h"
+#include "content/public/browser/render_widget_host.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
+#include "ui/events/keycodes/dom/keycode_converter.h"
+#include "ui/events/keycodes/keyboard_code_conversion.h"
namespace {
typedef InProcessBrowserTest NavigationMetricsRecorderBrowserTest;
+// A site engagement score that falls into the range for HIGH engagement level.
+const int kHighEngagementScore = 50;
+
+// Types a character in the given web content.
+void TypeText(content::WebContents* web_contents) {
+ content::DOMMessageQueue msg_queue;
+ const std::string code_string = "KeyA";
+ std::string reply;
+ ui::DomKey dom_key = ui::KeycodeConverter::KeyStringToDomKey(code_string);
+ ui::DomCode dom_code = ui::KeycodeConverter::CodeStringToDomCode(code_string);
+ SimulateKeyPress(web_contents, dom_key, dom_code,
+ ui::DomCodeToUsLayoutKeyboardCode(dom_code), false, false,
+ false, false);
+ ASSERT_TRUE(msg_queue.WaitForMessage(&reply));
+ ASSERT_EQ("\"entry\"", reply);
+}
+
IN_PROC_BROWSER_TEST_F(NavigationMetricsRecorderBrowserTest, TestMetrics) {
content::WebContents* web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
@@ -35,4 +60,112 @@ IN_PROC_BROWSER_TEST_F(NavigationMetricsRecorderBrowserTest, TestMetrics) {
5 /* data: */, 1);
}
+IN_PROC_BROWSER_TEST_F(NavigationMetricsRecorderBrowserTest,
+ Navigation_EngagementLevel) {
+ content::WebContents* web_contents =
+ browser()->tab_strip_model()->GetActiveWebContents();
+
+ NavigationMetricsRecorder* recorder =
+ content::WebContentsUserData<NavigationMetricsRecorder>::FromWebContents(
+ web_contents);
+ ASSERT_TRUE(recorder);
+
+ const GURL url("https://google.com");
+ base::HistogramTester histograms;
+ ui_test_utils::NavigateToURL(browser(), url);
+ histograms.ExpectTotalCount("Navigation.MainFrame.SiteEngagementLevel", 1);
+ histograms.ExpectBucketCount("Navigation.MainFrame.SiteEngagementLevel",
+ blink::mojom::EngagementLevel::NONE, 1);
+
+ SiteEngagementService::Get(browser()->profile())
+ ->ResetBaseScoreForURL(url, kHighEngagementScore);
+ ui_test_utils::NavigateToURL(browser(), url);
+ histograms.ExpectTotalCount("Navigation.MainFrame.SiteEngagementLevel", 2);
+ histograms.ExpectBucketCount("Navigation.MainFrame.SiteEngagementLevel",
+ blink::mojom::EngagementLevel::NONE, 1);
+ histograms.ExpectBucketCount("Navigation.MainFrame.SiteEngagementLevel",
+ blink::mojom::EngagementLevel::HIGH, 1);
+}
+
+IN_PROC_BROWSER_TEST_F(NavigationMetricsRecorderBrowserTest,
+ FormSubmission_EngagementLevel) {
+ content::WebContents* web_contents =
+ browser()->tab_strip_model()->GetActiveWebContents();
+
+ ASSERT_TRUE(embedded_test_server()->Start());
+ const GURL url(embedded_test_server()->GetURL("/form.html"));
+ ui_test_utils::NavigateToURL(browser(), url);
+
+ // Submit a form and check the histograms. Before doing so, we set a high site
+ // engagement score so that a single form submission doesn't affect the score
+ // much.
+ SiteEngagementService::Get(browser()->profile())
+ ->ResetBaseScoreForURL(url, kHighEngagementScore);
+ base::HistogramTester histograms;
+ content::TestNavigationObserver observer(web_contents);
+ const char* const kScript = "document.getElementById('form').submit()";
+ EXPECT_TRUE(content::ExecuteScript(web_contents, kScript));
+ observer.WaitForNavigationFinished();
+
+ histograms.ExpectTotalCount(
+ "Navigation.MainFrameFormSubmission.SiteEngagementLevel", 1);
+ histograms.ExpectBucketCount(
+ "Navigation.MainFrameFormSubmission.SiteEngagementLevel",
+ blink::mojom::EngagementLevel::HIGH, 1);
+}
+
+IN_PROC_BROWSER_TEST_F(NavigationMetricsRecorderBrowserTest,
+ PasswordEntry_EngagementLevel) {
+ content::WebContents* web_contents =
+ browser()->tab_strip_model()->GetActiveWebContents();
+
+ ASSERT_TRUE(embedded_test_server()->Start());
+ const GURL url(
+ embedded_test_server()->GetURL("/password/password_form.html"));
+ SiteEngagementService::Get(browser()->profile())
+ ->ResetBaseScoreForURL(url, kHighEngagementScore);
+ ui_test_utils::NavigateToURL(browser(), url);
+
+ // Submit a form and check the histograms. Before doing so, we set a high site
+ // engagement score so that a single form submission doesn't affect the score
+ // much.
+ SiteEngagementService::Get(browser()->profile())
+ ->ResetBaseScoreForURL(url, kHighEngagementScore);
+
+ // Setup handlers:
+ const char* const kScript =
+ "var f = document.getElementById('password_field');"
+ "f.onfocus = function() { "
+ " setTimeout(function() { window.domAutomationController.send('focus'); "
+ "}, "
+ "0);};"
+ "f.onkeyup = function() { "
+ " setTimeout(function() { window.domAutomationController.send('entry'); "
+ "}, "
+ "0);};"
+ "window.domAutomationController.send('setup');";
+ std::string reply1;
+ EXPECT_TRUE(
+ content::ExecuteScriptAndExtractString(web_contents, kScript, &reply1));
+ EXPECT_EQ("setup", reply1);
+
+ base::HistogramTester histograms;
+ std::string reply;
+ EXPECT_TRUE(content::ExecuteScriptAndExtractString(
+ web_contents, "document.getElementById('password_field').focus()",
+ &reply));
+ EXPECT_EQ("focus", reply);
+ TypeText(web_contents);
+ // Navigate away to flush the metrics.
+ ui_test_utils::NavigateToURL(browser(), GURL("about:blank"));
+
+ histograms.ExpectTotalCount("Security.PasswordFocus.SiteEngagementLevel", 1);
+ histograms.ExpectBucketCount("Security.PasswordFocus.SiteEngagementLevel",
+ blink::mojom::EngagementLevel::HIGH, 1);
+
+ histograms.ExpectTotalCount("Security.PasswordEntry.SiteEngagementLevel", 1);
+ histograms.ExpectBucketCount("Security.PasswordEntry.SiteEngagementLevel",
+ blink::mojom::EngagementLevel::HIGH, 1);
+}
+
} // namespace
diff --git a/chromium/chrome/browser/tab_contents/view_source_browsertest.cc b/chromium/chrome/browser/tab_contents/view_source_browsertest.cc
index 0231b9e9235..bd11caab8dd 100644
--- a/chromium/chrome/browser/tab_contents/view_source_browsertest.cc
+++ b/chromium/chrome/browser/tab_contents/view_source_browsertest.cc
@@ -24,6 +24,7 @@
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
#include "content/public/test/test_utils.h"
diff --git a/chromium/chrome/browser/test_dummy/BUILD.gn b/chromium/chrome/browser/test_dummy/BUILD.gn
new file mode 100644
index 00000000000..ca6a13ff527
--- /dev/null
+++ b/chromium/chrome/browser/test_dummy/BUILD.gn
@@ -0,0 +1,11 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/android/rules.gni")
+
+android_library("java") {
+ sources = [
+ "android/java/src/org/chromium/chrome/browser/test_dummy/TestDummy.java",
+ ]
+}
diff --git a/chromium/chrome/browser/test_dummy/internal/BUILD.gn b/chromium/chrome/browser/test_dummy/internal/BUILD.gn
new file mode 100644
index 00000000000..9abc277c2d8
--- /dev/null
+++ b/chromium/chrome/browser/test_dummy/internal/BUILD.gn
@@ -0,0 +1,71 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/buildflag_header.gni")
+import("//build/config/android/rules.gni")
+import("//chrome/android/modules/buildflags.gni")
+import("//tools/grit/grit_rule.gni")
+
+android_resources("java_resources") {
+ sources = [ "android/java/res/raw/dummy_resource" ]
+ custom_package = "org.chromium.chrome.browser.test_dummy"
+}
+
+android_library("java") {
+ deps = [
+ ":base_module_java",
+ ":java_resources",
+ "//base:base_java",
+ "//chrome/browser/test_dummy:java",
+ "//third_party/android_deps:android_support_v7_appcompat_java",
+ "//third_party/android_deps:androidx_annotation_annotation_java",
+ ]
+ sources = [ "android/java/src/org/chromium/chrome/browser/test_dummy/TestDummyImpl.java" ]
+
+ annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
+ deps += [ "//base:jni_java" ]
+}
+
+source_set("native") {
+ sources = [ "android/test_dummy_impl.cc" ]
+
+ deps = [
+ ":jni_headers",
+ ":resources_native",
+ "//base",
+ "//ui/base",
+ ]
+}
+
+# Java code that should go into the base module. If this were a normal feature,
+# this target would reside in the client code using the module. Since this is a
+# test dummy module, it has no pre-existing client, and hence the target is
+# squatting here for convenience. The same is true for the corresponding native
+# target.
+android_library("base_module_java") {
+ deps = [
+ "//base:base_java",
+ "//chrome/android/modules/test_dummy/provider:java",
+ "//chrome/android/modules/test_dummy/public:java",
+ "//chrome/browser/test_dummy:java",
+ "//third_party/android_deps:android_support_v7_appcompat_java",
+ "//third_party/android_deps:androidx_annotation_annotation_java",
+ ]
+ sources = [ "android/java/src/org/chromium/chrome/browser/test_dummy/TestDummyActivity.java" ]
+}
+
+generate_jni("jni_headers") {
+ sources = [ "android/java/src/org/chromium/chrome/browser/test_dummy/TestDummyImpl.java" ]
+}
+
+# Cannot call this just "resources" since all targets with that name in
+# //chrome/android need a build_config, which grit targets don't have.
+grit("resources_native") {
+ source = "android/resources/resources.grd"
+ outputs = [
+ "grit/test_dummy_resources.h",
+ "test_dummy_resources.pak",
+ ]
+ output_dir = "$root_gen_dir/chrome"
+}
diff --git a/chromium/chrome/browser/test_dummy/internal/android/resources/resources.grd b/chromium/chrome/browser/test_dummy/internal/android/resources/resources.grd
new file mode 100644
index 00000000000..2f90200e989
--- /dev/null
+++ b/chromium/chrome/browser/test_dummy/internal/android/resources/resources.grd
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<grit latest_public_release="0"
+ current_release="1"
+ output_all_resource_defines="false">
+ <outputs>
+ <output filename="grit/test_dummy_resources.h"
+ type="rc_header">
+ <emit emit_type='prepend'></emit>
+ </output>
+ <output filename="test_dummy_resources.pak"
+ type="data_package" />
+ </outputs>
+ <release seq="1">
+ <includes>
+ <include name="IDR_TEST_DUMMY_TEST_RESOURCE"
+ file="test_resource.txt"
+ type="BINDATA" />
+ </includes>
+ </release>
+</grit>
diff --git a/chromium/chrome/browser/thumbnail/generator/BUILD.gn b/chromium/chrome/browser/thumbnail/generator/BUILD.gn
index ccee81b7018..a4dd63a43df 100644
--- a/chromium/chrome/browser/thumbnail/generator/BUILD.gn
+++ b/chromium/chrome/browser/thumbnail/generator/BUILD.gn
@@ -2,6 +2,8 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import("//media/media_options.gni")
+
if (is_android) {
import("//build/config/android/config.gni")
import("//build/config/android/rules.gni")
@@ -42,6 +44,18 @@ source_set("generator") {
"android/thumbnail_media_parser.h",
]
+ if (media_use_ffmpeg) {
+ sources += [
+ "android/thumbnail_media_parser_impl.cc",
+ "android/thumbnail_media_parser_impl.h",
+ ]
+ } else {
+ sources += [
+ "android/noop_thumbnail_media_parser.cc",
+ "android/noop_thumbnail_media_parser.h",
+ ]
+ }
+
deps += [
":jni_headers",
"//third_party/android_opengl/etc1",
@@ -57,6 +71,7 @@ if (is_android) {
"//base:base_java",
"//base:jni_java",
"//chrome/browser/util:java",
+ "//components/browser_ui/util/android:java",
"//content/public/android:content_java",
"//third_party/android_deps:android_support_v4_java",
"//third_party/android_deps:androidx_annotation_annotation_java",
diff --git a/chromium/chrome/browser/touch_to_fill/android/BUILD.gn b/chromium/chrome/browser/touch_to_fill/android/BUILD.gn
index d8ad039a4a6..de15117cc14 100644
--- a/chromium/chrome/browser/touch_to_fill/android/BUILD.gn
+++ b/chromium/chrome/browser/touch_to_fill/android/BUILD.gn
@@ -31,6 +31,7 @@ android_library("public_java") {
# TODO(crbug.com/1004415): Remove dependency on chrome_java and depend on
# bottomsheet directly. Add public_java to chrome_java target instead.
"//chrome/android:chrome_java",
+ "//components/browser_ui/android/bottomsheet:java",
"//ui/android:ui_java",
]
@@ -73,6 +74,7 @@ android_library("test_java") {
"//chrome/android:chrome_test_util_java",
"//chrome/browser/touch_to_fill/android/internal:java",
"//chrome/test/android:chrome_java_test_support",
+ "//components/browser_ui/android/bottomsheet:java",
"//content/public/test/android:content_java_test_support",
"//third_party/android_deps:androidx_recyclerview_recyclerview_java",
"//third_party/espresso:espresso_all_java",
diff --git a/chromium/chrome/browser/touch_to_fill/android/internal/java/strings/android_touch_to_fill_strings.grd b/chromium/chrome/browser/touch_to_fill/android/internal/java/strings/android_touch_to_fill_strings.grd
index 7654801f0b4..a57ab8ef5fa 100644
--- a/chromium/chrome/browser/touch_to_fill/android/internal/java/strings/android_touch_to_fill_strings.grd
+++ b/chromium/chrome/browser/touch_to_fill/android/internal/java/strings/android_touch_to_fill_strings.grd
@@ -71,6 +71,7 @@
<output filename="values-sl/android_touch_to_fill_strings.xml" lang="sl" type="android" />
<output filename="values-sq/android_touch_to_fill_strings.xml" lang="sq" type="android" />
<output filename="values-sr/android_touch_to_fill_strings.xml" lang="sr" type="android" />
+ <output filename="values-b+sr+Latn/android_touch_to_fill_strings.xml" lang="sr-Latn" type="android" />
<output filename="values-sv/android_touch_to_fill_strings.xml" lang="sv" type="android" />
<output filename="values-sw/android_touch_to_fill_strings.xml" lang="sw" type="android" />
<output filename="values-ta/android_touch_to_fill_strings.xml" lang="ta" type="android" />
diff --git a/chromium/chrome/browser/ui/BUILD.gn b/chromium/chrome/browser/ui/BUILD.gn
index dfffff81bcf..4a31f9315ce 100644
--- a/chromium/chrome/browser/ui/BUILD.gn
+++ b/chromium/chrome/browser/ui/BUILD.gn
@@ -7,7 +7,6 @@ import("//build/config/chromecast_build.gni")
import("//build/config/compiler/compiler.gni")
import("//build/config/crypto.gni")
import("//build/config/features.gni")
-import("//build/config/jumbo.gni")
import("//build/config/linux/gtk/gtk.gni")
import("//build/config/ui.gni")
import("//chrome/browser/buildflags.gni")
@@ -29,7 +28,7 @@ import("//ui/views/features.gni")
# Use a static library here because many test binaries depend on this but don't
# require many files from it. This makes linking more efficient.
-jumbo_static_library("ui") {
+static_library("ui") {
sources = [
"accelerator_utils.h",
"app_list/app_list_util.cc",
@@ -122,6 +121,8 @@ jumbo_static_library("ui") {
"native_file_system_dialogs.h",
"navigation_correction_tab_observer.cc",
"navigation_correction_tab_observer.h",
+ "page_info/chrome_page_info_client.cc",
+ "page_info/chrome_page_info_client.h",
"page_info/chrome_page_info_delegate.cc",
"page_info/chrome_page_info_delegate.h",
"page_info/chrome_page_info_ui_delegate.cc",
@@ -137,7 +138,6 @@ jumbo_static_library("ui") {
"passwords/password_generation_popup_controller_impl.cc",
"passwords/password_generation_popup_controller_impl.h",
"passwords/password_generation_popup_observer.h",
- "passwords/password_generation_popup_view.cc",
"passwords/password_generation_popup_view.h",
"passwords/settings/password_manager_porter.cc",
"passwords/settings/password_manager_porter.h",
@@ -207,8 +207,6 @@ jumbo_static_library("ui") {
"webui/autofill_and_password_manager_internals/internals_ui_handler.h",
"webui/autofill_and_password_manager_internals/password_manager_internals_ui.cc",
"webui/autofill_and_password_manager_internals/password_manager_internals_ui.h",
- "webui/chrome_url_disabled_ui.cc",
- "webui/chrome_url_disabled_ui.h",
"webui/chrome_web_ui_controller_factory.cc",
"webui/chrome_web_ui_controller_factory.h",
"webui/components/components_handler.cc",
@@ -255,8 +253,6 @@ jumbo_static_library("ui") {
"webui/log_web_ui_url.h",
"webui/media/media_engagement_ui.cc",
"webui/media/media_engagement_ui.h",
- "webui/media/media_feeds_ui.cc",
- "webui/media/media_feeds_ui.h",
"webui/media/media_history_ui.cc",
"webui/media/media_history_ui.h",
"webui/media/webrtc_logs_ui.cc",
@@ -417,6 +413,7 @@ jumbo_static_library("ui") {
"//chrome/browser/ui/webui/usb_internals:mojo_bindings",
"//chrome/common",
"//chrome/common/net",
+ "//chrome/common/search:mojo_bindings",
"//chrome/installer/util:with_no_strings",
"//chrome/services/qrcode_generator/public/cpp",
"//chrome/services/qrcode_generator/public/mojom",
@@ -431,8 +428,12 @@ jumbo_static_library("ui") {
"//components/browsing_data/core",
"//components/captive_portal/content",
"//components/captive_portal/core:buildflags",
+ "//components/client_hints/browser",
"//components/consent_auditor/",
+ "//components/content_settings/browser",
+ "//components/content_settings/common:mojom",
"//components/content_settings/core/browser",
+ "//components/content_settings/core/common",
"//components/country_codes",
"//components/crx_file",
"//components/data_reduction_proxy/core/browser",
@@ -455,7 +456,7 @@ jumbo_static_library("ui") {
"//components/flags_ui",
"//components/gcm_driver",
"//components/google/core/common",
- "//components/heap_profiling",
+ "//components/heap_profiling/multi_process",
"//components/history/content/browser",
"//components/history/core/browser",
"//components/history/core/common",
@@ -467,7 +468,7 @@ jumbo_static_library("ui") {
"//components/keyed_service/core",
"//components/language/core/browser",
"//components/language/core/common",
- "//components/lookalikes",
+ "//components/lookalikes/core",
"//components/metrics_services_manager",
"//components/navigation_metrics",
"//components/net_log",
@@ -508,6 +509,7 @@ jumbo_static_library("ui") {
"//components/safe_browsing/core/common:safe_browsing_prefs",
"//components/safe_browsing/core/db:database_manager",
"//components/safe_browsing/core/db:util",
+ "//components/schema_org/common:improved_mojom",
"//components/search",
"//components/search_engines",
"//components/security_interstitials/content:security_interstitial_page",
@@ -583,6 +585,7 @@ jumbo_static_library("ui") {
"//third_party/zlib",
"//ui/accessibility",
"//ui/base",
+ "//ui/base:data_exchange",
"//ui/base/clipboard",
"//ui/base/ime",
"//ui/compositor",
@@ -618,15 +621,23 @@ jumbo_static_library("ui") {
if (is_android) {
deps += [
+ "//chrome/app:chromium_strings",
"//chrome/browser/ui/webui/explore_sites_internals:mojo_bindings",
"//chrome/browser/ui/webui/snippets_internals:mojo_bindings",
"//components/browser_ui/util/android",
+ "//components/security_state/content/android",
]
if (enable_feed_in_chrome) {
deps += [ "//chrome/browser/ui/webui/feed_internals:mojo_bindings" ]
}
} else {
# !is_android
+
+ sources += [
+ "webui/media/media_feeds_ui.cc",
+ "webui/media/media_feeds_ui.h",
+ ]
+
deps += [ "//components/autofill/content/browser/webauthn" ]
}
@@ -741,10 +752,6 @@ jumbo_static_library("ui") {
"android/omnibox/omnibox_view_util.h",
"android/overlay/overlay_window_android.cc",
"android/overlay/overlay_window_android.h",
- "android/page_info/connection_info_popup_android.cc",
- "android/page_info/connection_info_popup_android.h",
- "android/page_info/page_info_controller_android.cc",
- "android/page_info/page_info_controller_android.h",
"android/passwords/credential_leak_dialog_view_android.cc",
"android/passwords/credential_leak_dialog_view_android.h",
"android/passwords/manual_filling_view_android.cc",
@@ -808,8 +815,13 @@ jumbo_static_library("ui") {
"webui/feed_internals/feed_internals_page_handler.h",
"webui/feed_internals/feed_internals_ui.cc",
"webui/feed_internals/feed_internals_ui.h",
+ "webui/feed_internals/feedv2_internals_page_handler.cc",
+ "webui/feed_internals/feedv2_internals_page_handler.h",
+ ]
+ deps += [
+ "//components/feed/core/common:feed_core_common",
+ "//components/feed/core/v2:feed_core_v2",
]
- deps += [ "//components/feed/core/common:feed_core_common" ]
}
if (enable_password_change_in_leaked_dialog) {
@@ -919,6 +931,7 @@ jumbo_static_library("ui") {
"browser_window.h",
"browser_window_state.cc",
"browser_window_state.h",
+ "caption_bubble_controller.h",
"chrome_pages.cc",
"chrome_pages.h",
"chrome_web_modal_dialog_manager_delegate.cc",
@@ -1081,8 +1094,12 @@ jumbo_static_library("ui") {
"passwords/bubble_controllers/generation_confirmation_bubble_controller.h",
"passwords/bubble_controllers/items_bubble_controller.cc",
"passwords/bubble_controllers/items_bubble_controller.h",
+ "passwords/bubble_controllers/move_to_account_store_bubble_controller.cc",
+ "passwords/bubble_controllers/move_to_account_store_bubble_controller.h",
"passwords/bubble_controllers/password_bubble_controller_base.cc",
"passwords/bubble_controllers/password_bubble_controller_base.h",
+ "passwords/bubble_controllers/post_save_compromised_bubble_controller.cc",
+ "passwords/bubble_controllers/post_save_compromised_bubble_controller.h",
"passwords/bubble_controllers/save_unsynced_credentials_locally_bubble_controller.cc",
"passwords/bubble_controllers/save_unsynced_credentials_locally_bubble_controller.h",
"passwords/bubble_controllers/save_update_bubble_controller.cc",
@@ -1128,6 +1145,8 @@ jumbo_static_library("ui") {
"search/ntp_user_data_logger.cc",
"search/ntp_user_data_logger.h",
"search/ntp_user_data_types.h",
+ "search/omnibox_mojo_utils.cc",
+ "search/omnibox_mojo_utils.h",
"search/omnibox_utils.cc",
"search/omnibox_utils.h",
"search/search_ipc_router.cc",
@@ -1228,6 +1247,8 @@ jumbo_static_library("ui") {
"task_manager/task_manager_table_model.h",
"thumbnails/thumbnail_image.cc",
"thumbnails/thumbnail_image.h",
+ "thumbnails/thumbnail_readiness_tracker.cc",
+ "thumbnails/thumbnail_readiness_tracker.h",
"thumbnails/thumbnail_tab_helper.cc",
"thumbnails/thumbnail_tab_helper.h",
"toolbar/app_menu_icon_controller.cc",
@@ -1258,6 +1279,8 @@ jumbo_static_library("ui") {
"uma_browsing_activity_observer.h",
"unload_controller.cc",
"unload_controller.h",
+ "views/eye_dropper/eye_dropper.cc",
+ "views/eye_dropper/eye_dropper.h",
"webui/app_launcher_login_handler.cc",
"webui/app_launcher_login_handler.h",
"webui/app_management/app_management_page_handler.cc",
@@ -1270,8 +1293,6 @@ jumbo_static_library("ui") {
"webui/bookmarks/bookmarks_ui.h",
"webui/chrome_web_contents_handler.cc",
"webui/chrome_web_contents_handler.h",
- "webui/constrained_web_dialog_delegate_base.cc",
- "webui/constrained_web_dialog_delegate_base.h",
"webui/devtools_ui.cc",
"webui/devtools_ui.h",
"webui/devtools_ui_data_source.cc",
@@ -1348,8 +1369,6 @@ jumbo_static_library("ui") {
"webui/policy_indicator_localized_strings_provider.h",
"webui/profile_info_watcher.cc",
"webui/profile_info_watcher.h",
- "webui/recent_site_settings_helper.cc",
- "webui/recent_site_settings_helper.h",
"webui/settings/about_handler.cc",
"webui/settings/about_handler.h",
"webui/settings/accessibility_main_handler.cc",
@@ -1382,6 +1401,8 @@ jumbo_static_library("ui") {
"webui/settings/profile_info_handler.h",
"webui/settings/protocol_handlers_handler.cc",
"webui/settings/protocol_handlers_handler.h",
+ "webui/settings/recent_site_settings_helper.cc",
+ "webui/settings/recent_site_settings_helper.h",
"webui/settings/reset_settings_handler.cc",
"webui/settings/reset_settings_handler.h",
"webui/settings/safe_browsing_handler.cc",
@@ -1412,6 +1433,8 @@ jumbo_static_library("ui") {
"webui/settings/shared_settings_localized_strings_provider.h",
"webui/settings/site_settings_handler.cc",
"webui/settings/site_settings_handler.h",
+ "webui/settings/site_settings_helper.cc",
+ "webui/settings/site_settings_helper.h",
"webui/settings_utils.cc",
"webui/settings_utils.h",
"webui/signin/login_ui_service.cc",
@@ -1420,8 +1443,6 @@ jumbo_static_library("ui") {
"webui/signin/login_ui_service_factory.h",
"webui/signin/signin_utils.cc",
"webui/signin/signin_utils.h",
- "webui/site_settings_helper.cc",
- "webui/site_settings_helper.h",
"webui/sync_file_system_internals/dump_database_handler.cc",
"webui/sync_file_system_internals/dump_database_handler.h",
"webui/sync_file_system_internals/extension_statuses_handler.cc",
@@ -1460,9 +1481,9 @@ jumbo_static_library("ui") {
"//chrome/browser/ui/color:mixers",
"//chrome/browser/ui/webui/app_management:mojo_bindings",
"//chrome/common:buildflags",
- "//chrome/common:search_mojom",
"//chrome/common/media_router/mojom:media_router",
"//chrome/common/search:generate_chrome_colors_info",
+ "//chrome/common/search:mojo_bindings",
"//chrome/common/themes:autogenerated_theme_util",
"//chrome/services/app_service/public/cpp:app_update",
"//chrome/services/app_service/public/mojom",
@@ -1471,6 +1492,7 @@ jumbo_static_library("ui") {
"//components/network_session_configurator/common",
"//components/page_load_metrics/browser",
"//components/profile_metrics",
+ "//components/safety_check",
"//components/search_provider_logos",
"//components/ui_metrics",
"//components/url_formatter",
@@ -1482,6 +1504,7 @@ jumbo_static_library("ui") {
"//device/fido",
"//services/device/public/mojom",
"//services/metrics/public/cpp:metrics_cpp",
+ "//services/preferences/public/mojom:mojom",
"//third_party/blink/public/common:headers",
"//third_party/libaddressinput",
"//third_party/libaddressinput:strings",
@@ -1535,7 +1558,6 @@ jumbo_static_library("ui") {
if (is_chromeos) {
assert(enable_extensions)
assert(toolkit_views)
- never_build_jumbo = true
sources += [
"app_list/app_sync_ui_state.cc",
"app_list/app_sync_ui_state.h",
@@ -1554,10 +1576,8 @@ jumbo_static_library("ui") {
"app_list/search/launcher_search/launcher_search_result.h",
"ash/accessibility/accessibility_controller_client.cc",
"ash/accessibility/accessibility_controller_client.h",
- "ash/ambient/photo_client.cc",
- "ash/ambient/photo_client.h",
- "ash/ambient/photo_controller_impl.cc",
- "ash/ambient/photo_controller_impl.h",
+ "ash/ambient/ambient_client_impl.cc",
+ "ash/ambient/ambient_client_impl.h",
"ash/arc_chrome_actions_client.cc",
"ash/arc_chrome_actions_client.h",
"ash/arc_custom_tab_modal_dialog_host.cc",
@@ -1713,6 +1733,8 @@ jumbo_static_library("ui") {
"views/platform_keys_certificate_selector_chromeos.h",
"views/profiles/profile_indicator_icon.cc",
"views/profiles/profile_indicator_icon.h",
+ "webui/chrome_url_disabled_ui.cc",
+ "webui/chrome_url_disabled_ui.h",
# On chromeos, file manager extension handles the file open/save dialog.
"views/select_file_dialog_extension.cc",
@@ -1723,6 +1745,8 @@ jumbo_static_library("ui") {
"views/touch_selection_menu_chromeos.h",
"views/touch_selection_menu_runner_chromeos.cc",
"views/touch_selection_menu_runner_chromeos.h",
+ "webui/certificate_provisioning_ui_handler.cc",
+ "webui/certificate_provisioning_ui_handler.h",
"webui/chromeos/account_manager_error_ui.cc",
"webui/chromeos/account_manager_error_ui.h",
"webui/chromeos/account_manager_welcome_dialog.cc",
@@ -1830,6 +1854,8 @@ jumbo_static_library("ui") {
"webui/chromeos/login/base_webui_handler.h",
"webui/chromeos/login/core_oobe_handler.cc",
"webui/chromeos/login/core_oobe_handler.h",
+ "webui/chromeos/login/debug/debug_overlay_handler.cc",
+ "webui/chromeos/login/debug/debug_overlay_handler.h",
"webui/chromeos/login/demo_preferences_screen_handler.cc",
"webui/chromeos/login/demo_preferences_screen_handler.h",
"webui/chromeos/login/demo_setup_screen_handler.cc",
@@ -1976,8 +2002,12 @@ jumbo_static_library("ui") {
"webui/help/help_utils_chromeos.h",
"webui/help/version_updater_chromeos.cc",
"webui/help/version_updater_chromeos.h",
+ "webui/settings/chromeos/about_section.cc",
+ "webui/settings/chromeos/about_section.h",
"webui/settings/chromeos/accessibility_handler.cc",
"webui/settings/chromeos/accessibility_handler.h",
+ "webui/settings/chromeos/accessibility_section.cc",
+ "webui/settings/chromeos/accessibility_section.h",
"webui/settings/chromeos/account_manager_handler.cc",
"webui/settings/chromeos/account_manager_handler.h",
"webui/settings/chromeos/ambient_mode_handler.cc",
@@ -1986,61 +2016,103 @@ jumbo_static_library("ui") {
"webui/settings/chromeos/android_apps_handler.h",
"webui/settings/chromeos/app_management/app_management_page_handler_factory.cc",
"webui/settings/chromeos/app_management/app_management_page_handler_factory.h",
+ "webui/settings/chromeos/apps_section.cc",
+ "webui/settings/chromeos/apps_section.h",
+ "webui/settings/chromeos/bluetooth_section.cc",
+ "webui/settings/chromeos/bluetooth_section.h",
"webui/settings/chromeos/calculator/size_calculator.cc",
"webui/settings/chromeos/calculator/size_calculator.h",
"webui/settings/chromeos/change_picture_handler.cc",
"webui/settings/chromeos/change_picture_handler.h",
+ "webui/settings/chromeos/constants/constants_util.cc",
+ "webui/settings/chromeos/constants/constants_util.h",
+ "webui/settings/chromeos/constants/routes_util.cc",
+ "webui/settings/chromeos/constants/routes_util.h",
"webui/settings/chromeos/crostini_handler.cc",
"webui/settings/chromeos/crostini_handler.h",
+ "webui/settings/chromeos/crostini_section.cc",
+ "webui/settings/chromeos/crostini_section.h",
"webui/settings/chromeos/cups_printers_handler.cc",
"webui/settings/chromeos/cups_printers_handler.h",
"webui/settings/chromeos/date_time_handler.cc",
"webui/settings/chromeos/date_time_handler.h",
+ "webui/settings/chromeos/date_time_section.cc",
+ "webui/settings/chromeos/date_time_section.h",
+ "webui/settings/chromeos/device_display_handler.cc",
+ "webui/settings/chromeos/device_display_handler.h",
+ "webui/settings/chromeos/device_dlc_handler.cc",
+ "webui/settings/chromeos/device_dlc_handler.h",
"webui/settings/chromeos/device_keyboard_handler.cc",
"webui/settings/chromeos/device_keyboard_handler.h",
"webui/settings/chromeos/device_pointer_handler.cc",
"webui/settings/chromeos/device_pointer_handler.h",
"webui/settings/chromeos/device_power_handler.cc",
"webui/settings/chromeos/device_power_handler.h",
+ "webui/settings/chromeos/device_section.cc",
+ "webui/settings/chromeos/device_section.h",
"webui/settings/chromeos/device_storage_handler.cc",
"webui/settings/chromeos/device_storage_handler.h",
"webui/settings/chromeos/device_stylus_handler.cc",
"webui/settings/chromeos/device_stylus_handler.h",
+ "webui/settings/chromeos/files_section.cc",
+ "webui/settings/chromeos/files_section.h",
"webui/settings/chromeos/fingerprint_handler.cc",
"webui/settings/chromeos/fingerprint_handler.h",
"webui/settings/chromeos/google_assistant_handler.cc",
"webui/settings/chromeos/google_assistant_handler.h",
"webui/settings/chromeos/internet_handler.cc",
"webui/settings/chromeos/internet_handler.h",
- "webui/settings/chromeos/internet_strings_provider.cc",
- "webui/settings/chromeos/internet_strings_provider.h",
+ "webui/settings/chromeos/internet_section.cc",
+ "webui/settings/chromeos/internet_section.h",
"webui/settings/chromeos/kerberos_accounts_handler.cc",
"webui/settings/chromeos/kerberos_accounts_handler.h",
+ "webui/settings/chromeos/languages_section.cc",
+ "webui/settings/chromeos/languages_section.h",
+ "webui/settings/chromeos/main_section.cc",
+ "webui/settings/chromeos/main_section.h",
"webui/settings/chromeos/multidevice_handler.cc",
"webui/settings/chromeos/multidevice_handler.h",
- "webui/settings/chromeos/os_settings_localized_strings_provider.cc",
- "webui/settings/chromeos/os_settings_localized_strings_provider.h",
- "webui/settings/chromeos/os_settings_localized_strings_provider_factory.cc",
- "webui/settings/chromeos/os_settings_localized_strings_provider_factory.h",
- "webui/settings/chromeos/os_settings_per_page_strings_provider.cc",
- "webui/settings/chromeos/os_settings_per_page_strings_provider.h",
+ "webui/settings/chromeos/multidevice_section.cc",
+ "webui/settings/chromeos/multidevice_section.h",
+ "webui/settings/chromeos/os_settings_features_util.cc",
+ "webui/settings/chromeos/os_settings_features_util.h",
+ "webui/settings/chromeos/os_settings_manager.cc",
+ "webui/settings/chromeos/os_settings_manager.h",
+ "webui/settings/chromeos/os_settings_manager_factory.cc",
+ "webui/settings/chromeos/os_settings_manager_factory.h",
+ "webui/settings/chromeos/os_settings_section.cc",
+ "webui/settings/chromeos/os_settings_section.h",
+ "webui/settings/chromeos/os_settings_sections.cc",
+ "webui/settings/chromeos/os_settings_sections.h",
"webui/settings/chromeos/os_settings_ui.cc",
"webui/settings/chromeos/os_settings_ui.h",
"webui/settings/chromeos/parental_controls_handler.cc",
"webui/settings/chromeos/parental_controls_handler.h",
+ "webui/settings/chromeos/people_section.cc",
+ "webui/settings/chromeos/people_section.h",
+ "webui/settings/chromeos/personalization_section.cc",
+ "webui/settings/chromeos/personalization_section.h",
"webui/settings/chromeos/plugin_vm_handler.cc",
"webui/settings/chromeos/plugin_vm_handler.h",
"webui/settings/chromeos/pref_names.cc",
"webui/settings/chromeos/pref_names.h",
+ "webui/settings/chromeos/printing_section.cc",
+ "webui/settings/chromeos/printing_section.h",
+ "webui/settings/chromeos/privacy_section.cc",
+ "webui/settings/chromeos/privacy_section.h",
"webui/settings/chromeos/quick_unlock_handler.cc",
"webui/settings/chromeos/quick_unlock_handler.h",
+ "webui/settings/chromeos/reset_section.cc",
+ "webui/settings/chromeos/reset_section.h",
"webui/settings/chromeos/search/search_concept.h",
"webui/settings/chromeos/search/search_handler.cc",
"webui/settings/chromeos/search/search_handler.h",
- "webui/settings/chromeos/search/search_handler_factory.cc",
- "webui/settings/chromeos/search/search_handler_factory.h",
+ "webui/settings/chromeos/search/search_tag_registry.cc",
+ "webui/settings/chromeos/search/search_tag_registry.h",
"webui/settings/chromeos/search/settings_user_action_tracker.cc",
"webui/settings/chromeos/search/settings_user_action_tracker.h",
+ "webui/settings/chromeos/search_section.cc",
+ "webui/settings/chromeos/search_section.h",
"webui/settings/chromeos/server_printer_url_util.cc",
"webui/settings/chromeos/server_printer_url_util.h",
"webui/settings/chromeos/wallpaper_handler.cc",
@@ -2073,9 +2145,9 @@ jumbo_static_library("ui") {
"//chrome/browser/ui/webui/chromeos/crostini_installer:mojo_bindings",
"//chrome/browser/ui/webui/chromeos/crostini_upgrader:mojo_bindings",
"//chrome/browser/ui/webui/chromeos/machine_learning:mojo_bindings",
+ "//chrome/browser/ui/webui/settings/chromeos/constants:mojom",
"//chrome/browser/ui/webui/settings/chromeos/search:mojo_bindings",
"//chrome/services/file_util/public/cpp",
- "//chrome/services/local_search_service",
"//chromeos",
"//chromeos/assistant:buildflags",
"//chromeos/audio",
@@ -2095,19 +2167,22 @@ jumbo_static_library("ui") {
"//chromeos/dbus/audio",
"//chromeos/dbus/cryptohome",
"//chromeos/dbus/cryptohome:cryptohome_proto",
+ "//chromeos/dbus/dlcservice:dlcservice",
"//chromeos/dbus/kerberos:kerberos_proto",
"//chromeos/dbus/power",
"//chromeos/dbus/session_manager",
"//chromeos/dbus/system_clock",
+ "//chromeos/dbus/upstart",
"//chromeos/disks",
"//chromeos/login/auth",
"//chromeos/login/login_state",
"//chromeos/login/session",
"//chromeos/network",
"//chromeos/resources:resources_grit",
- "//chromeos/services/assistant/public:feature_flags",
+ "//chromeos/services/assistant/public/cpp",
"//chromeos/services/assistant/public/mojom",
- "//chromeos/services/assistant/public/proto:proto",
+ "//chromeos/services/assistant/public/proto",
+ "//chromeos/services/assistant/public/shared",
"//chromeos/services/cellular_setup",
"//chromeos/services/cellular_setup/public/mojom",
"//chromeos/services/machine_learning/public/cpp",
@@ -2153,18 +2228,6 @@ jumbo_static_library("ui") {
if (use_cras) {
defines += [ "USE_CRAS" ]
}
-
- if (enable_cros_libassistant) {
- sources += [
- "ash/ambient/backdrop/photo_client_impl.cc",
- "ash/ambient/backdrop/photo_client_impl.h",
- ]
-
- deps += [
- "//chromeos/assistant/internal/ambient",
- "//chromeos/assistant/internal/proto/google3",
- ]
- }
}
if (is_win || is_mac || is_desktop_linux || is_chromeos) {
@@ -2186,10 +2249,13 @@ jumbo_static_library("ui") {
"avatar_button_error_controller_delegate.h",
"frame/window_frame_util.cc",
"frame/window_frame_util.h",
+ "passwords/account_storage_auth_helper.cc",
+ "passwords/account_storage_auth_helper.h",
"signin_reauth_popup_delegate.cc",
"signin_reauth_popup_delegate.h",
"signin_view_controller.cc",
"signin_view_controller.h",
+ "signin_view_controller_delegate.cc",
"signin_view_controller_delegate.h",
"tab_contents/chrome_web_contents_view_handle_drop.cc",
"tab_contents/chrome_web_contents_view_handle_drop.h",
@@ -2235,6 +2301,7 @@ jumbo_static_library("ui") {
sources += [
"bookmarks/bookmark_bubble_sign_in_delegate.cc",
"bookmarks/bookmark_bubble_sign_in_delegate.h",
+ "profile_picker.h",
"startup/default_browser_infobar_delegate.cc",
"startup/default_browser_infobar_delegate.h",
"startup/default_browser_prompt.cc",
@@ -2248,6 +2315,8 @@ jumbo_static_library("ui") {
"views/external_protocol_dialog.h",
"views/profiles/badged_profile_photo.cc",
"views/profiles/badged_profile_photo.h",
+ "views/profiles/profile_picker_view.cc",
+ "views/profiles/profile_picker_view.h",
"views/profiles/user_manager_view.cc",
"views/profiles/user_manager_view.h",
"webui/app_launcher_page_ui.cc",
@@ -2264,6 +2333,8 @@ jumbo_static_library("ui") {
"webui/settings/system_handler.h",
"webui/signin/inline_login_handler_impl.cc",
"webui/signin/inline_login_handler_impl.h",
+ "webui/signin/profile_picker_ui.cc",
+ "webui/signin/profile_picker_ui.h",
"webui/signin/signin_create_profile_handler.cc",
"webui/signin/signin_create_profile_handler.h",
"webui/signin/signin_email_confirmation_dialog.cc",
@@ -2312,13 +2383,6 @@ jumbo_static_library("ui") {
}
}
- if (is_win || is_mac || is_chromeos) {
- sources += [
- "webui/cast/cast_ui.cc",
- "webui/cast/cast_ui.h",
- ]
- }
-
if (is_win || is_mac) {
sources += [
"webui/settings/native_certificates_handler.cc",
@@ -2482,7 +2546,6 @@ jumbo_static_library("ui") {
"views/frame/native_browser_frame_factory_mac.mm",
"views/tab_contents/chrome_web_contents_view_delegate_views_mac.h",
"views/tab_contents/chrome_web_contents_view_delegate_views_mac.mm",
- "views/tabs/window_finder_mac.mm",
"web_contents_sizer.mm",
"webui/help/version_updater_mac.h",
"webui/help/version_updater_mac.mm",
@@ -2529,6 +2592,8 @@ jumbo_static_library("ui") {
"views/color_chooser_win.cc",
"views/critical_notification_bubble_view.cc",
"views/critical_notification_bubble_view.h",
+ "views/eye_dropper/eye_dropper_win.cc",
+ "views/eye_dropper/eye_dropper_win.h",
"views/frame/browser_desktop_window_tree_host.h",
"views/frame/browser_desktop_window_tree_host_win.cc",
"views/frame/browser_desktop_window_tree_host_win.h",
@@ -2552,7 +2617,6 @@ jumbo_static_library("ui") {
"views/status_icons/status_tray_state_changer_win.h",
"views/status_icons/status_tray_win.cc",
"views/status_icons/status_tray_win.h",
- "views/tabs/window_finder_win.cc",
"views/try_chrome_dialog_win/arrow_border.cc",
"views/try_chrome_dialog_win/arrow_border.h",
"views/try_chrome_dialog_win/button_layout.cc",
@@ -2584,6 +2648,7 @@ jumbo_static_library("ui") {
"//chrome/browser/ui/startup:buildflags",
"//chrome/browser/win/conflicts:module_info",
"//chrome/credential_provider/common:common_constants",
+ "//chrome/services/util_win/public/mojom:mojom",
"//components/search_engines",
"//third_party/iaccessible2",
"//third_party/isimpledom",
@@ -2670,7 +2735,6 @@ jumbo_static_library("ui") {
"views/javascript_app_modal_event_blocker_x11.cc",
"views/javascript_app_modal_event_blocker_x11.h",
]
- configs += [ "//build/config/linux:x11" ]
deps += [
"//components/dbus/menu",
"//ui/events/devices",
@@ -2714,23 +2778,14 @@ jumbo_static_library("ui") {
if (use_aura) {
deps += [ "//third_party/fontconfig" ]
}
-
- # WindowFinder implementation selection is a bit tricky, so do all here
- # to get it right and prevent ODR violations.
- if (is_chromeos) {
- sources += [ "views/tabs/window_finder_chromeos.cc" ]
- } else if (use_x11) {
- sources += [ "views/tabs/window_finder_x11.cc" ]
- } else {
- assert(use_ozone)
- sources += [ "views/tabs/window_finder_ozone.cc" ]
- }
}
if (is_chromeos) {
sources += [
"views/parent_permission_dialog_view.cc",
"views/parent_permission_dialog_view.h",
+ "views/supervised_user/extension_install_blocked_by_parent_dialog_view.cc",
+ "views/supervised_user/extension_install_blocked_by_parent_dialog_view.h",
]
}
@@ -2774,6 +2829,8 @@ jumbo_static_library("ui") {
"translate/translate_bubble_test_utils.h",
"views/accessibility/caption_bubble.cc",
"views/accessibility/caption_bubble.h",
+ "views/accessibility/caption_bubble_controller_views.cc",
+ "views/accessibility/caption_bubble_controller_views.h",
"views/accessibility/invert_bubble_view.cc",
"views/accessibility/invert_bubble_view.h",
"views/accessibility/non_accessible_image_view.cc",
@@ -2998,8 +3055,6 @@ jumbo_static_library("ui") {
"views/frame/system_menu_model_delegate.h",
"views/frame/tab_strip_region_view.cc",
"views/frame/tab_strip_region_view.h",
- "views/frame/terminal_system_app_menu_button_chromeos.cc",
- "views/frame/terminal_system_app_menu_button_chromeos.h",
"views/frame/toolbar_button_provider.h",
"views/frame/top_container_background.cc",
"views/frame/top_container_background.h",
@@ -3140,6 +3195,10 @@ jumbo_static_library("ui") {
"views/omnibox/omnibox_popup_contents_view.h",
"views/omnibox/omnibox_result_view.cc",
"views/omnibox/omnibox_result_view.h",
+ "views/omnibox/omnibox_row_view.cc",
+ "views/omnibox/omnibox_row_view.h",
+ "views/omnibox/omnibox_suggestion_button_row_view.cc",
+ "views/omnibox/omnibox_suggestion_button_row_view.h",
"views/omnibox/omnibox_tab_switch_button.cc",
"views/omnibox/omnibox_tab_switch_button.h",
"views/omnibox/omnibox_text_view.cc",
@@ -3204,6 +3263,8 @@ jumbo_static_library("ui") {
"views/passwords/credentials_item_view.h",
"views/passwords/manage_passwords_icon_views.cc",
"views/passwords/manage_passwords_icon_views.h",
+ "views/passwords/move_to_account_store_bubble_view.cc",
+ "views/passwords/move_to_account_store_bubble_view.h",
"views/passwords/password_auto_sign_in_view.cc",
"views/passwords/password_auto_sign_in_view.h",
"views/passwords/password_bubble_view_base.cc",
@@ -3220,6 +3281,8 @@ jumbo_static_library("ui") {
"views/passwords/password_save_update_view.h",
"views/passwords/password_save_update_with_account_store_view.cc",
"views/passwords/password_save_update_with_account_store_view.h",
+ "views/passwords/post_save_compromised_bubble_view.cc",
+ "views/passwords/post_save_compromised_bubble_view.h",
"views/payments/contact_info_editor_view_controller.cc",
"views/payments/contact_info_editor_view_controller.h",
"views/payments/credit_card_editor_view_controller.cc",
@@ -3288,8 +3351,6 @@ jumbo_static_library("ui") {
"views/relaunch_notification/relaunch_required_timer.h",
"views/relaunch_notification/relaunch_required_timer_internal.cc",
"views/relaunch_notification/relaunch_required_timer_internal.h",
- "views/relaunch_notification/wall_clock_timer.cc",
- "views/relaunch_notification/wall_clock_timer.h",
"views/sad_tab_view.cc",
"views/sad_tab_view.h",
"views/safe_browsing/deep_scanning_failure_modal_dialog.cc",
@@ -3382,6 +3443,7 @@ jumbo_static_library("ui") {
"views/tabs/tab_style_views.h",
"views/tabs/tab_width_constraints.cc",
"views/tabs/tab_width_constraints.h",
+ "views/tabs/window_finder.cc",
"views/tabs/window_finder.h",
"views/task_manager_view.cc",
"views/task_manager_view.h",
@@ -3442,8 +3504,8 @@ jumbo_static_library("ui") {
"views/web_apps/web_app_origin_text.h",
"views/web_apps/web_app_uninstall_dialog_view.cc",
"views/web_apps/web_app_uninstall_dialog_view.h",
- "views/webauthn/authenticator_ble_pin_entry_sheet_view.cc",
- "views/webauthn/authenticator_ble_pin_entry_sheet_view.h",
+ "views/webauthn/authenticator_bio_enrollment_sheet_view.cc",
+ "views/webauthn/authenticator_bio_enrollment_sheet_view.h",
"views/webauthn/authenticator_client_pin_entry_sheet_view.cc",
"views/webauthn/authenticator_client_pin_entry_sheet_view.h",
"views/webauthn/authenticator_client_pin_entry_view.cc",
@@ -3458,20 +3520,18 @@ jumbo_static_library("ui") {
"views/webauthn/authenticator_select_account_sheet_view.h",
"views/webauthn/authenticator_transport_selector_sheet_view.cc",
"views/webauthn/authenticator_transport_selector_sheet_view.h",
- "views/webauthn/ble_device_selection_sheet_view.cc",
- "views/webauthn/ble_device_selection_sheet_view.h",
- "views/webauthn/ble_pin_entry_view.cc",
- "views/webauthn/ble_pin_entry_view.h",
"views/webauthn/hover_list_view.cc",
"views/webauthn/hover_list_view.h",
+ "views/webauthn/ring_progress_bar.cc",
+ "views/webauthn/ring_progress_bar.h",
"views/webauthn/sheet_view_factory.cc",
"views/webauthn/sheet_view_factory.h",
+ "views/webauthn/webauthn_hover_button.cc",
+ "views/webauthn/webauthn_hover_button.h",
"webauthn/account_hover_list_model.cc",
"webauthn/account_hover_list_model.h",
"webauthn/authenticator_request_sheet_model.cc",
"webauthn/authenticator_request_sheet_model.h",
- "webauthn/ble_device_hover_list_model.cc",
- "webauthn/ble_device_hover_list_model.h",
"webauthn/hover_list_model.h",
"webauthn/other_transports_menu_model.cc",
"webauthn/other_transports_menu_model.h",
@@ -3484,6 +3544,7 @@ jumbo_static_library("ui") {
]
deps += [
+ "//base/util/timer",
"//chrome/browser/ui/views",
"//chrome/common/qr_code_generator",
"//components/constrained_window",
@@ -3570,13 +3631,11 @@ jumbo_static_library("ui") {
"views/chrome_browser_main_extra_parts_views_linux.h",
]
if (use_gtk) {
- deps += [
- "//ui/gtk",
- ]
+ deps += [ "//ui/gtk" ]
if (use_x11) {
deps += [
"//ui/gfx/x",
- "//ui/gtk:x",
+ "//ui/gtk/x",
]
}
if (use_ozone) {
@@ -3713,6 +3772,8 @@ jumbo_static_library("ui") {
"app_list/app_list_model_updater.cc",
"app_list/app_list_model_updater.h",
"app_list/app_list_model_updater_observer.h",
+ "app_list/app_list_notifier_impl.cc",
+ "app_list/app_list_notifier_impl.h",
"app_list/app_list_syncable_service.cc",
"app_list/app_list_syncable_service.h",
"app_list/app_list_syncable_service_factory.cc",
@@ -3775,12 +3836,8 @@ jumbo_static_library("ui") {
"app_list/crostini/crostini_app_icon.h",
"app_list/extension_app_context_menu.cc",
"app_list/extension_app_context_menu.h",
- "app_list/extension_app_item.cc",
- "app_list/extension_app_item.h",
"app_list/extension_app_utils.cc",
"app_list/extension_app_utils.h",
- "app_list/internal_app/internal_app_context_menu.cc",
- "app_list/internal_app/internal_app_context_menu.h",
"app_list/internal_app/internal_app_metadata.cc",
"app_list/internal_app/internal_app_metadata.h",
"app_list/md_icon_normalizer.cc",
@@ -3815,6 +3872,8 @@ jumbo_static_library("ui") {
"app_list/search/arc/arc_playstore_search_provider.h",
"app_list/search/arc/arc_playstore_search_result.cc",
"app_list/search/arc/arc_playstore_search_result.h",
+ "app_list/search/assistant_search_provider.cc",
+ "app_list/search/assistant_search_provider.h",
"app_list/search/chrome_search_result.cc",
"app_list/search/chrome_search_result.h",
"app_list/search/common/file_icon_util.cc",
@@ -3839,10 +3898,14 @@ jumbo_static_library("ui") {
"app_list/search/omnibox_provider.h",
"app_list/search/omnibox_result.cc",
"app_list/search/omnibox_result.h",
+ "app_list/search/os_settings_provider.cc",
+ "app_list/search/os_settings_provider.h",
"app_list/search/search_controller.cc",
"app_list/search/search_controller.h",
"app_list/search/search_controller_factory.cc",
"app_list/search/search_controller_factory.h",
+ "app_list/search/search_metrics_observer.cc",
+ "app_list/search/search_metrics_observer.h",
"app_list/search/search_provider.cc",
"app_list/search/search_provider.h",
"app_list/search/search_resource_manager.cc",
@@ -3899,10 +3962,6 @@ jumbo_static_library("ui") {
"ash/assistant/assistant_client_impl.h",
"ash/assistant/assistant_context_util.cc",
"ash/assistant/assistant_context_util.h",
- "ash/assistant/assistant_image_downloader.cc",
- "ash/assistant/assistant_image_downloader.h",
- "ash/assistant/assistant_service_connection.cc",
- "ash/assistant/assistant_service_connection.h",
"ash/assistant/assistant_setup.cc",
"ash/assistant/assistant_setup.h",
"ash/assistant/assistant_state_client.cc",
@@ -3924,6 +3983,10 @@ jumbo_static_library("ui") {
"ash/assistant/proactive_suggestions_client_impl.h",
"ash/assistant/proactive_suggestions_loader.cc",
"ash/assistant/proactive_suggestions_loader.h",
+ "ash/assistant/search_and_assistant_enabled_checker.cc",
+ "ash/assistant/search_and_assistant_enabled_checker.h",
+ "ash/image_downloader_impl.cc",
+ "ash/image_downloader_impl.h",
"ash/launcher/app_service/app_service_app_window_arc_tracker.cc",
"ash/launcher/app_service/app_service_app_window_arc_tracker.h",
"ash/launcher/app_service/app_service_app_window_crostini_tracker.cc",
@@ -3998,12 +4061,12 @@ jumbo_static_library("ui") {
"views/plugin_vm/plugin_vm_installer_view.h",
]
deps += [
- # TODO(wutao): Put new icons resources to ash/public/cpp/vector_icons/
- # when UX provides them.
"//ash/app_list",
+ "//ash/assistant/model",
+ "//ash/assistant/util",
"//ash/public/cpp",
"//ash/public/cpp/app_list/vector_icons",
- "//ash/resources/vector_icons",
+ "//ash/public/cpp/vector_icons",
"//chrome/browser/chromeos/crostini:crostini_installer_types_mojom",
"//chrome/browser/ui/app_list/search/cros_action_history:cros_action_proto",
"//chrome/browser/ui/app_list/search/search_result_ranker:app_launch_event_logger_proto",
@@ -4076,6 +4139,8 @@ jumbo_static_library("ui") {
"extensions/extension_message_bubble_factory.h",
"extensions/extension_removal_watcher.cc",
"extensions/extension_removal_watcher.h",
+ "extensions/extension_settings_overridden_dialog.cc",
+ "extensions/extension_settings_overridden_dialog.h",
"extensions/extensions_container.h",
"extensions/hosted_app_browser_controller.cc",
"extensions/hosted_app_browser_controller.h",
@@ -4085,8 +4150,9 @@ jumbo_static_library("ui") {
"extensions/installation_error_infobar_delegate.h",
"extensions/settings_api_bubble_helpers.cc",
"extensions/settings_api_bubble_helpers.h",
- "extensions/terminal_system_app_menu_model_chromeos.cc",
- "extensions/terminal_system_app_menu_model_chromeos.h",
+ "extensions/settings_overridden_dialog_controller.h",
+ "extensions/settings_overridden_params_providers.cc",
+ "extensions/settings_overridden_params_providers.h",
"views/extensions/browser_action_drag_data.cc",
"views/extensions/browser_action_drag_data.h",
"views/extensions/extension_action_platform_delegate_views.cc",
@@ -4103,6 +4169,8 @@ jumbo_static_library("ui") {
"views/extensions/media_galleries_dialog_views.h",
"views/extensions/media_gallery_checkbox_view.cc",
"views/extensions/media_gallery_checkbox_view.h",
+ "views/extensions/settings_overridden_dialog_view.cc",
+ "views/extensions/settings_overridden_dialog_view.h",
"web_applications/app_browser_controller.cc",
"web_applications/app_browser_controller.h",
"web_applications/system_web_app_ui_utils.cc",
@@ -4174,8 +4242,8 @@ jumbo_static_library("ui") {
}
if (enable_print_preview) {
sources += [
- "webui/print_preview/cloud_printer_handler.cc",
- "webui/print_preview/cloud_printer_handler.h",
+ "webui/print_preview/cloud_print_signin.cc",
+ "webui/print_preview/cloud_print_signin.h",
"webui/print_preview/extension_printer_handler.cc",
"webui/print_preview/extension_printer_handler.h",
"webui/print_preview/pdf_printer_handler.cc",
@@ -4184,6 +4252,8 @@ jumbo_static_library("ui") {
"webui/print_preview/policy_settings.h",
"webui/print_preview/print_preview_handler.cc",
"webui/print_preview/print_preview_handler.h",
+ "webui/print_preview/print_preview_metrics.cc",
+ "webui/print_preview/print_preview_metrics.h",
"webui/print_preview/print_preview_ui.cc",
"webui/print_preview/print_preview_ui.h",
"webui/print_preview/print_preview_utils.cc",
@@ -4193,6 +4263,7 @@ jumbo_static_library("ui") {
]
deps += [
"//components/printing/common:mojo_interfaces",
+ "//printing/mojom",
"//services/device/public/cpp/usb",
"//services/device/public/mojom:usb",
]
@@ -4351,19 +4422,19 @@ static_library("test_support") {
]
sources += [
"extensions/extension_action_test_helper.h",
+ "views/extensions/extension_action_test_helper_mac.mm",
+ "views/extensions/extension_action_test_helper_views.cc",
+ "views/extensions/extension_action_test_helper_views.h",
"views/extensions/extensions_menu_test_util.cc",
"views/extensions/extensions_menu_test_util.h",
"views/find_bar_host_unittest_util_views.cc",
"views/payments/test_chrome_payment_request_delegate.cc",
"views/payments/test_chrome_payment_request_delegate.h",
- "views/toolbar/extension_action_test_helper_mac.mm",
- "views/toolbar/extension_action_test_helper_views.cc",
- "views/toolbar/extension_action_test_helper_views.h",
"views/webauthn/authenticator_request_dialog_view_test_api.cc",
"views/webauthn/authenticator_request_dialog_view_test_api.h",
]
if (use_aura) {
- sources += [ "views/toolbar/extension_action_test_helper_aura.cc" ]
+ sources += [ "views/extensions/extension_action_test_helper_aura.cc" ]
deps += [
"//ui/aura",
"//ui/wm",
@@ -4443,8 +4514,14 @@ if (is_chromeos) {
}
if (is_android) {
- java_cpp_enum("cookie_controls_enforcement_javagen") {
- sources = [ "cookie_controls/cookie_controls_service.h" ]
+ java_cpp_enum("infobar_android_enums") {
+ sources = [ "android/infobars/infobar_android.h" ]
+ }
+
+ android_library("infobar_android_enums_java") {
+ deps = [ "//third_party/android_deps:androidx_annotation_annotation_java" ]
+
+ srcjar_deps = [ ":infobar_android_enums" ]
}
java_cpp_enum("tab_model_enums_java") {
diff --git a/chromium/chrome/browser/ui/android/appmenu/BUILD.gn b/chromium/chrome/browser/ui/android/appmenu/BUILD.gn
index 665fe8c6026..26b23eec23f 100644
--- a/chromium/chrome/browser/ui/android/appmenu/BUILD.gn
+++ b/chromium/chrome/browser/ui/android/appmenu/BUILD.gn
@@ -1,6 +1,7 @@
# Copyright 2019 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+
import("//build/config/android/rules.gni")
import("//chrome/android/features/android_library_factory_tmpl.gni")
@@ -24,26 +25,11 @@ android_library_factory("factory_java") {
sources = [ "java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuCoordinatorFactory.java" ]
}
-android_library("test_support_java") {
- testonly = true
-
- sources = [
- "test/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuTestSupport.java",
- "test/java/src/org/chromium/chrome/browser/ui/appmenu/TestAppMenuObserver.java",
- ]
- deps = [
- "//base:base_java_test_support",
- "//chrome/browser/ui/android/appmenu:java",
- "//chrome/browser/ui/android/appmenu/internal:java",
- ]
-}
-
android_resources("java_resources") {
custom_package = "org.chromium.chrome.browser.ui.appmenu"
sources = [ "java/res/values/styles.xml" ]
deps = [
"//components/browser_ui/styles/android:java_resources",
- "//third_party/android_deps:com_google_android_material_material_java",
"//ui/android:ui_java_resources",
]
}
diff --git a/chromium/chrome/browser/ui/android/appmenu/internal/BUILD.gn b/chromium/chrome/browser/ui/android/appmenu/internal/BUILD.gn
index 0bdd9235cc8..81e5cda8251 100644
--- a/chromium/chrome/browser/ui/android/appmenu/internal/BUILD.gn
+++ b/chromium/chrome/browser/ui/android/appmenu/internal/BUILD.gn
@@ -5,6 +5,12 @@
import("//build/config/android/rules.gni")
android_library("java") {
+ visibility = [
+ ":*",
+ "//chrome/android:chrome_all_java",
+ "//chrome/browser/ui/android/appmenu/test:*",
+ ]
+
sources = [
"java/src/org/chromium/chrome/browser/ui/appmenu/AppMenu.java",
"java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuAdapter.java",
@@ -21,7 +27,6 @@ android_library("java") {
"//base:base_java",
"//chrome/browser/android/lifecycle:java",
"//chrome/browser/ui/android/appmenu:java",
- "//chrome/browser/ui/android/appmenu:java_resources",
"//components/browser_ui/widget/android:java",
"//third_party/android_deps:android_support_v7_appcompat_java",
"//third_party/android_deps:androidx_annotation_annotation_java",
@@ -64,7 +69,7 @@ android_library("javatests") {
"//base:base_java_test_support",
"//chrome/browser/android/lifecycle:java",
"//chrome/browser/ui/android/appmenu:java",
- "//chrome/browser/ui/android/appmenu:test_support_java",
+ "//chrome/browser/ui/android/appmenu/test:test_support_java",
"//chrome/test/android:chrome_java_test_support",
"//components/browser_ui/widget/android:test_support_java",
"//content/public/test/android:content_java_test_support",
diff --git a/chromium/chrome/browser/ui/android/appmenu/test/BUILD.gn b/chromium/chrome/browser/ui/android/appmenu/test/BUILD.gn
new file mode 100644
index 00000000000..96827d1a8e5
--- /dev/null
+++ b/chromium/chrome/browser/ui/android/appmenu/test/BUILD.gn
@@ -0,0 +1,19 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/android/rules.gni")
+
+android_library("test_support_java") {
+ testonly = true
+
+ sources = [
+ "java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuTestSupport.java",
+ "java/src/org/chromium/chrome/browser/ui/appmenu/TestAppMenuObserver.java",
+ ]
+ deps = [
+ "//base:base_java_test_support",
+ "//chrome/browser/ui/android/appmenu:java",
+ "//chrome/browser/ui/android/appmenu/internal:java",
+ ]
+}
diff --git a/chromium/chrome/browser/ui/android/favicon/BUILD.gn b/chromium/chrome/browser/ui/android/favicon/BUILD.gn
index de37e227079..b58869d3c73 100644
--- a/chromium/chrome/browser/ui/android/favicon/BUILD.gn
+++ b/chromium/chrome/browser/ui/android/favicon/BUILD.gn
@@ -8,7 +8,6 @@ android_library("java") {
"java/src/org/chromium/chrome/browser/ui/favicon/FaviconHelper.java",
"java/src/org/chromium/chrome/browser/ui/favicon/FaviconUtils.java",
"java/src/org/chromium/chrome/browser/ui/favicon/LargeIconBridge.java",
- "java/src/org/chromium/chrome/browser/ui/favicon/RoundedIconGenerator.java",
]
deps = [
@@ -17,6 +16,8 @@ android_library("java") {
"//base:jni_java",
"//chrome/browser/profiles/android:java",
"//chrome/browser/util:java",
+ "//components/browser_ui/util/android:java",
+ "//components/browser_ui/widget/android:java",
"//components/embedder_support/android:util_java",
"//components/url_formatter/android:url_formatter_java",
"//content/public/android:content_java",
@@ -55,16 +56,3 @@ android_resources("java_resources") {
deps = [ "//ui/android:ui_java_resources" ]
}
-
-android_library("javatests") {
- testonly = true
-
- sources = [ "java/src/org/chromium/chrome/browser/ui/favicon/RoundedIconGeneratorTest.java" ]
- deps = [
- ":java",
- "//chrome/test/android:chrome_java_test_support",
- "//third_party/android_support_test_runner:rules_java",
- "//third_party/android_support_test_runner:runner_java",
- "//third_party/junit",
- ]
-}
diff --git a/chromium/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chromium/chrome/browser/ui/android/strings/android_chrome_strings.grd
index be1676f7c93..5958622986a 100644
--- a/chromium/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chromium/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -98,6 +98,7 @@ CHAR-LIMIT guidelines:
<output filename="values-sl/android_chrome_strings.xml" lang="sl" type="android" />
<output filename="values-sq/android_chrome_strings.xml" lang="sq" type="android" />
<output filename="values-sr/android_chrome_strings.xml" lang="sr" type="android" />
+ <output filename="values-b+sr+Latn/android_chrome_strings.xml" lang="sr-Latn" type="android" />
<output filename="values-sv/android_chrome_strings.xml" lang="sv" type="android" />
<output filename="values-sw/android_chrome_strings.xml" lang="sw" type="android" />
<output filename="values-ta/android_chrome_strings.xml" lang="ta" type="android" />
@@ -203,9 +204,6 @@ CHAR-LIMIT guidelines:
<message name="IDS_SETTINGS" desc="Title for Chrome's Settings.">
Settings
</message>
- <message name="IDS_MENU_HELP" desc="Menu item for opening the help page. [CHAR-LIMIT=27]">
- Help &amp; feedback
- </message>
<message name="IDS_PREFS_SECTION_BASICS" desc='Title of "Basics" section of preferences. [CHAR-LIMIT=32]'>
Basics
</message>
@@ -215,18 +213,17 @@ CHAR-LIMIT guidelines:
<message name="IDS_ENTER_VR" desc="Menu item for entering VR. [CHAR-LIMIT=27]">
Enter VR
</message>
+
+ <!-- Notification channels -->
<message name="IDS_NOTIFICATION_CATEGORY_GROUP_GENERAL" desc='Subheading for "General" section of a list of notification categories. [CHAR-LIMIT=32]'>
General
</message>
+ <message name="IDS_NOTIFICATION_CATEGORY_GROUP_SITES" desc='Subheading for "Sites" section of a list of notification categories. [CHAR-LIMIT=32]'>
+ Sites
+ </message>
<message name="IDS_NOTIFICATION_CATEGORY_INCOGNITO" desc="Label for notification that indicates incognito mode is active, within a list of notification categories. [CHAR-LIMIT=32]">
Incognito
</message>
- <message name="IDS_NOTIFICATION_CATEGORY_MEDIA" desc="Label for notifications shown when media is playing or recording, within a list of notification categories. [CHAR-LIMIT=32]">
- Media
- </message>
- <message name="IDS_NOTIFICATION_CATEGORY_DOWNLOADS" desc="Label for notifications shown when something is downloading, within a list of notification categories. [CHAR-LIMIT=32]">
- Downloads
- </message>
<message name="IDS_NOTIFICATION_CATEGORY_SHARING" desc="Label for sharing-related notifications, within a list of notification categories. [CHAR-LIMIT=32]">
Sharing
</message>
@@ -249,14 +246,18 @@ CHAR-LIMIT guidelines:
Virtual Reality
</message>
<message name="IDS_NOTIFICATION_CATEGORY_UPDATES" desc="Label for update notifications, within a list of notification categories. [CHAR-LIMIT=32]">
- Updates
+ Updates
+ </message>
+ <message name="IDS_NOTIFICATION_CATEGORY_ANNOUNCEMENT" desc="Label for announcements notifications, within a list of notification categories. [CHAR-LIMIT=32]">
+ Announcements
</message>
- <message name="IDS_NOTIFICATION_CATEGORY_COMPLETED_DOWNLOADS" desc="Label for completed download notifications, within a list of notification categories. [CHAR-LIMIT=32]">
- Completed downloads
+ <message name="IDS_NOTIFICATION_CATEGORY_MEDIA_PLAYBACK" desc="Label for media playback notifications, within a list of notification categories. [CHAR-LIMIT=32]">
+ Playing media
</message>
<message name="IDS_NOTIFICATION_CATEGORY_PERMISSION_REQUESTS" desc="Label for permission requests, within a list of notification categories. [CHAR-LIMIT=32]">
Permission requests
</message>
+
<message name="IDS_UNSUPPORTED" desc="Message displayed to the user when an attempted action is not supported.">
Unsupported
</message>
@@ -311,6 +312,9 @@ CHAR-LIMIT guidelines:
<message name="IDS_SERVICES_CATEGORY_TITLE" desc="Title for the group of preferences that control non-personalized Google services. This group contains preferences for data that is not tied to user's Google Account.">
Other Google services
</message>
+ <message name="IDS_PREFS_GOOGLE_SERVICES" desc="Title for the group of preferences that control non-personalized Google services. This group contains preferences for data that is not tied to user's Google Account. [CHAR-LIMIT=40]">
+ Google services
+ </message>
<message name="IDS_AUTOCOMPLETE_SEARCHES_AND_URLS_TITLE" desc="Title for a checkbox in Settings that controls URL and search autocompletion and informs the user about the data shared by this feature.">
Autocomplete searches and URLs
</message>
@@ -559,7 +563,7 @@ CHAR-LIMIT guidelines:
Export passwords stored with Chrome
</message>
<message name="IDS_SETTINGS_PASSWORDS_EXPORT_DESCRIPTION" desc="Text shown to the user who initiated exporting passwords, as a warning before any passwords have been exported.">
- Your passwords will be visible to anyone who can see the exported file.
+ Your passwords will be exported and downloaded as a text file. They will be visible to anyone and any app with access to the destination folder.
</message>
<message name="IDS_SETTINGS_PASSWORDS_PREPARING_EXPORT" desc="Text shown to the user above a progress bar, informing the user that passwords are being prepared for export.">
Preparing passwords…
@@ -608,6 +612,27 @@ CHAR-LIMIT guidelines:
Chrome’s homepage
</message>
+ <!-- Homepage Promo card -->
+ <message name="IDS_HOMEPAGE_PROMO_TITLE" desc="The title displayed on homepage promo card, which guide user set chrome's new tab page as their new homepage.">
+ Get here quicker
+ </message>
+ <message name="IDS_HOMEPAGE_PROMO_TITLE_SLIM" desc="The title displayed on homepage promo card, which guide user set chrome's new tab page as their new homepage. Used for the one liner variation.">
+ Make this page your homepage
+ </message>
+ <message name="IDS_HOMEPAGE_PROMO_DESCRIPTION" desc="The description displayed on homepage promo card, which guide user set chrome's new tab page as their new homepage.">
+ See your top sites and recent stories whenever you tap the Home button
+ </message>
+ <message name="IDS_HOMEPAGE_PROMO_PRIMARY_BUTTON" desc="The text displayed on homepage promo card's primary button compat, which will change the user's homepage to new tab page when they tab.">
+ Change homepage
+ </message>
+ <message name="IDS_HOMEPAGE_PROMO_PRIMARY_BUTTON_SLIM" desc="The text displayed on homepage promo card's primary button compat, which will change the user's homepage to new tab page when they tab. Used for the slim variation that has a smaller space for the button.">
+ Change
+ </message>
+ <message name="IDS_HOMEPAGE_PROMO_SNACKBAR_MESSAGE" desc="The text displayed on the snackbar that appears after setting homepage by click on homepage promo card's primary button, which will change the user's homepage to new tab page.">
+ Homepage changed
+ </message>
+
+
<!-- Notifications preferences -->
<message name="IDS_PREFS_NOTIFICATIONS" desc="Title for Notification preferences.">
Notifications
@@ -765,8 +790,17 @@ Your Google account may have other forms of browsing history like searches and a
<message name="IDS_CLEAR_BROWSING_DATA_TAB_PERIOD_EVERYTHING" desc="The option to delete browsing data from the beginning of time.">
All time
</message>
+ <message name="IDS_IMPORTANT_SITES_TITLE" desc="Title of clear storage dialogs used in a couple different places to confirm clearing site storage data. [CHAR-LIMIT=24]">
+ Also clear data from these sites?
+ </message>
+ <message name="IDS_IMPORTANT_SITES_TITLE_WITH_APP" desc="Title of clear storage dialogs used in a couple different places to confirm clearing site storage data (when there are also apps involved). [CHAR-LIMIT=24]">
+ Also clear data from these sites &amp; apps?
+ </message>
<message name="IDS_CLEAR_BROWSING_DATA_IMPORTANT_DIALOG_TEXT" desc="The text of the dialog presenting the user with 'important' sites that they can exclude from clearing.">
- This will clear data for all sites, including:
+ These sites seem important to you:
+ </message>
+ <message name="IDS_CLEAR_BROWSING_DATA_IMPORTANT_DIALOG_TEXT_WITH_APP" desc="The text of the dialog presenting the user with 'important' sites that they can exclude from clearing, and a site on the list is related to an installed app.">
+ These sites and apps seem important to you:
</message>
<message name="IDS_CLEAR_BROWSING_DATA_IMPORTANT_DIALOG_BUTTON" desc="The text of the button to perform the clear action in the dialog presenting the user with 'important' sites that they can exclude from clearing.">
Clear
@@ -819,341 +853,6 @@ Your Google account may have other forms of browsing history like searches and a
Captions
</message>
- <!-- Site settings -->
- <message name="IDS_PREFS_SITE_SETTINGS" desc="Title of the Website Settings screen. [CHAR-LIMIT=32]">
- Site settings
- </message>
- <message name="IDS_ALL_SITES" desc='Title of the "All sites" settings screen that allows the user to see permissions for all websites. [CHAR-LIMIT=32]'>
- All sites
- </message>
- <message name="IDS_INTRUSIVE_ADS_INFORMATION" desc="The extra information at the top of the Site Details page when the site tends to show intrusive ads">
- This site shows intrusive or misleading ads
- </message>
- <message name="IDS_ADS_PERMISSION_TITLE" desc="Title for the ads permission [CHAR-LIMIT=32]">
- Ads
- </message>
- <message name="IDS_AR_PERMISSION_TITLE" desc="Title of the permission to use Augmented Reality [CHAR-LIMIT=32]">
- Augmented reality
- </message>
- <message name="IDS_COOKIES_TITLE" desc="Title for the Cookies settings screen [CHAR-LIMIT=32]">
- Cookies
- </message>
- <message name="IDS_BLOCK_THIRD_PARTY_COOKIES_TITLE" desc="Title for Block Third Party Cookies preference">
- Block third-party cookies
- </message>
- <message name="IDS_BLOCK_THIRD_PARTY_COOKIES_SUMMARY" desc="Summary text for Block Third Party Cookies preference">
- Prevent third-party websites from saving and reading cookie data
- </message>
- <message name="IDS_JAVASCRIPT_PERMISSION_TITLE" desc="Title of the permission to run javascript [CHAR-LIMIT=32]">
- JavaScript
- </message>
- <message name="IDS_POPUP_PERMISSION_TITLE" desc="Title of the permission to display pop-up windows and redirects [CHAR-LIMIT=32]">
- Pop-ups and redirects
- </message>
- <message name="IDS_NFC_PERMISSION_TITLE" desc="Title of the permission to use NFC [CHAR-LIMIT=32]">
- NFC devices
- </message>
- <message name="IDS_PUSH_NOTIFICATIONS_PERMISSION_TITLE" desc="Title for the permission for showing push notifications [CHAR-LIMIT=32]">
- Notifications
- </message>
- <message name="IDS_SENSORS_PERMISSION_TITLE" desc="Title of the permission to use device's sensors [CHAR-LIMIT=32]">
- Motion or light sensors
- </message>
- <message name="IDS_MOTION_SENSORS_PERMISSION_TITLE" desc="Title of the permission to use device's motion sensors (accelerometer, gyroscope, magnetometer) [CHAR-LIMIT=32]">
- Motion sensors
- </message>
- <message name="IDS_SOUND_PERMISSION_TITLE" desc="Title of the permission to play sound [CHAR-LIMIT=32]">
- Sound
- </message>
- <message name="IDS_CLIPBOARD_PERMISSION_TITLE" desc="Title of the permission to read from clipboard [CHAR-LIMIT=32]">
- Clipboard
- </message>
- <message name="IDS_VR_PERMISSION_TITLE" desc="Title of the permission to use Virtual Reality [CHAR-LIMIT=32]">
- Virtual reality
- </message>
- <message name="IDS_ENABLE_NOTIFICATIONS_VIBRATE_TITLE" desc="Title for the preference to enable vibration for notifications">
- Vibrate
- </message>
- <message name="IDS_ENABLE_NOTIFICATIONS_VIBRATE_SUMMARY" desc="Summary for the preference to enable vibration for notifications">
- Notifications may vibrate the device
- </message>
- <message name="IDS_MIDI_SYSEX_PERMISSION_TITLE" desc="Title of the permission that allows a website to get full control of MIDI devices [CHAR-LIMIT=32]">
- Allow full control of MIDI devices
- </message>
- <message name="IDS_BACKGROUND_SYNC_PERMISSION_TITLE" desc="Title of the permission that allows websites to queue an operation for the next time the device is online[CHAR-LIMIT=32]">
- Background sync
- </message>
- <message name="IDS_AUTOMATIC_DOWNLOADS_PERMISSION_TITLE" desc="Title of the permission that allows websites to download multiple files automatically.">
- Automatic downloads
- </message>
- <message name="IDS_WEBSITE_SETTINGS_ADD_SITE" desc="The label for the button to add a new website to the exception list.">
- Add site exception
- </message>
- <message name="IDS_WEBSITE_SETTINGS_ADD_SITE_DIALOG_TITLE" desc="The title of the dialog to add a website to a list.">
- Add site
- </message>
- <message name="IDS_WEBSITE_SETTINGS_ADD_SITE_ADD_BUTTON" desc="The label for the button to add a website to a list.">
- Add
- </message>
- <message name="IDS_WEBSITE_SETTINGS_ADD_SITE_TOAST" desc="The toast shown when a new site has been added to the whitelist.">
- Site <ph name="SITE_NAME">%1$s<ex>google.com</ex></ph> added
- </message>
- <message name="IDS_WEBSITE_SETTINGS_ADD_SITE_DESCRIPTION_JAVASCRIPT_ALLOW" desc="The description for the allow Javascript for website dialog.">
- Allow JavaScript for a specific site.
- </message>
- <message name="IDS_WEBSITE_SETTINGS_ADD_SITE_DESCRIPTION_JAVASCRIPT_BLOCK" desc="The description for the block Javascript for website dialog.">
- Block JavaScript for a specific site.
- </message>
- <message name="IDS_WEBSITE_SETTINGS_ADD_SITE_DESCRIPTION_BACKGROUND_SYNC" desc="The description for the allow Background Sync for website dialog.">
- Allow Background Sync for a specific site.
- </message>
- <message name="IDS_WEBSITE_SETTINGS_ADD_SITE_DESCRIPTION_AUTOMATIC_DOWNLOADS" desc="The description for the allow Automatic Downloads for website dialog.">
- Allow a site to download multiple files automatically.
- </message>
- <message name="IDS_WEBSITE_SETTINGS_ADD_SITE_DESCRIPTION_COOKIES_ALLOW" desc="The description for the allow Cookies for website dialog.">
- Allow cookies for a specific site.
- </message>
- <message name="IDS_WEBSITE_SETTINGS_ADD_SITE_DESCRIPTION_COOKIES_BLOCK" desc="The description for the block Cookies for website dialog.">
- Block cookies for a specific site.
- </message>
- <message name="IDS_WEBSITE_SETTINGS_THIRD_PARTY_COOKIES_EXCEPTION_LABEL" desc="The label for site exceptions that affect third party cookies.">
- All cookies, on this site only
- </message>
- <message name="IDS_WEBSITE_SETTINGS_ADD_SITE_DESCRIPTION_SOUND_ALLOW" desc="The description for the allow sound for website dialog.">
- Allow sound for a specific site.
- </message>
- <message name="IDS_WEBSITE_SETTINGS_ADD_SITE_DESCRIPTION_SOUND_BLOCK" desc="The description for the mute sound for website dialog.">
- Mute sound for a specific site.
- </message>
- <message name="IDS_WEBSITE_SETTINGS_COOKIE_INFO" desc="Text describing cookie and third-party cookie settings.">
- Cookies are files created by websites you visit. Sites use them to remember your preferences. Third-party cookies are created by other sites. These sites own some of the content, like ads or images, that you see on the webpage you visit.
- </message>
- <message name="IDS_WEBSITE_SETTINGS_ADD_SITE_SITE_URL" desc="The label for the input field where the user can type a website URL.">
- Site URL
- </message>
- <message name="IDS_EXAMPLE_URL" desc="The hint for a website url field, showing an example url.">
- www.example.com
- </message>
- <message name="IDS_WEBSITE_SETTINGS_SITE_CATEGORY" desc="The headline above the website name on the website details page.">
- Site
- </message>
- <message name="IDS_WEBSITE_SETTINGS_USAGE_CATEGORY" desc="The headline above the usage stats (how much storage the site is using) on the website details page.">
- Usage
- </message>
- <message name="IDS_WEBSITE_SETTINGS_PERMISSIONS_CATEGORY" desc="The headline above all the permissions on the website details page.">
- Permissions
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_ALLOWED" desc="Summary text explaining that a permission is allowed, e.g. JavaScript: allowed.">
- Allowed
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_BLOCKED" desc="Summary text explaining that a permission is blocked, e.g. JavaScript: blocked.">
- Blocked
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_ALLOWED_EXCEPT_THIRD_PARTY" desc="Summary text for when only third-party cookies are blocked.">
- Allowed, except third-party
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_ASK" desc="Summary text explaining that Chrome will ask the user before allowing a site to use a certain permission, e.g. JavaScript: ask first.">
- Ask first
- </message>
- <message name="IDS_WEBSITE_SETTINGS_BLOCKED_GROUP_HEADING" desc="The heading for a list of websites that have been blocked from using a particular permission, e.g. blocked from accessing the user's location.">
- Blocked
- </message>
- <message name="IDS_WEBSITE_SETTINGS_BLOCKED_GROUP_HEADING_SOUND" desc="The heading for a list of websites that have been muted.">
- Muted
- </message>
- <message name="IDS_WEBSITE_SETTINGS_MANAGED_GROUP_HEADING" desc="The heading for a list of websites that are managed by an external app.">
- Managed by app
- </message>
- <message name="IDS_WEBSITE_SETTINGS_ALLOWED_GROUP_HEADING" desc="The heading for a list of websites that have been allowed to use a particular permission, e.g. allowed to access a user's location.">
- Allowed
- </message>
- <message name="IDS_WEBSITE_SETTINGS_EXCEPTIONS_GROUP_HEADING" desc="The heading for a list of websites that have been granted an exception to access a particular permission, e.g. to access the user's location.">
- Exceptions
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_ALLOWED_RECOMMENDED" desc="Summary text explaining that a permission is allowed, which is the recommended setting.">
- Allowed (recommended)
- </message>
-
- <!-- Cookie settings strings. -->
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_COOKIE_ALLOWED" desc="Summary text explaining that sites are allowed to use cookies and that it is the recommended setting.">
- Allow sites to save and read cookie data (recommended)
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_COOKIE_ALLOW_TITLE" desc="Text used to explain the allow cookies option in settings">
- Allow cookies
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_COOKIE_BLOCK_THIRD_PARTY_INCOGNITO_TITLE" desc="Text used to explain the block third-party cookies in incognito option in settings">
- Block third-party cookies in Incognito
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_COOKIE_BLOCK_THIRD_PARTY_TITLE" desc="Text used to explain the block third-party cookies option in settings">
- Block third-party cookies
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_COOKIE_BLOCK_TITLE" desc="Text used to explain the block cookies option in settings">
- Block all cookies (not recommended)
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_COOKIE_ALLOW_ADDITION" desc="Additional text used to explain the allow cookies option in settings">
- Sites will work normally
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_COOKIE_BLOCK_THIRD_PARTY_ADDITION" desc="Additional text used to explain the block third-party cookies option in settings">
- Features on some sites may break
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_COOKIE_BLOCK_ADDITION" desc="Additional text used to explain the block cookies option in settings">
- Features on many sites may break
- </message>
-
-
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_JAVASCRIPT_ALLOWED" desc="Summary text explaining that sites are allowed to run Javascript and that it is the recommended setting.">
- Allow sites to run JavaScript (recommended)
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_CLIPBOARD_ASK" desc="Summary text explaining that sites need to ask for permission before reading from the clipboard and that it is the recommended setting.">
- Ask before allowing sites to read text and images from the clipboard (recommended)
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_CLIPBOARD_BLOCKED" desc="Summary text explaining that sites are currently blocked from reading from the clipboard.">
- Block sites from reading text and images from the clipboard
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_CLIPBOARD_BLOCKED_LIST" desc="Summary text explaining that the clipboard permission is set to block read access on some sites. To be shown in the list of permission categories.">
- Blocked from reading clipboard
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_ALLOWED_RECOMMENDED" desc="Summary text explaining that sites are allowed to play protected content and that it is the recommended setting.">
- Allow sites to play protected content (recommended)
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_ALLOWED" desc="Summary text explaining that sites are allowed to play protected content.">
- Allow sites to play protected content
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_ASK_RECOMMENDED" desc="Summary text explaining that sites need to ask for permission before playing protected content and that it is the recommended setting.">
- Ask before allowing sites to play protected content (recommended)
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_ASK" desc="Summary text explaining that sites need to ask for permission before playing protected content.">
- Ask before allowing sites to play protected content
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_BLOCKED" desc="Summary text explaining that sites are blocked from playing protected content.">
- Block sites from playing protected content
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_AR_ASK" desc="Summary text explaining that sites need to ask for permission before using AR and that it is the recommended setting.">
- Ask before allowing sites to create a 3D map of your surroundings or track camera position (recommended)
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_AR_BLOCKED" desc="Summary text explaining that sites are blocked from using AR.">
- Block sites from creating a 3D map of your surroundings or tracking camera position
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_NFC_ASK" desc="Summary text explaining that sites need to ask for permission before using NFC and that it is the recommended setting.">
- Ask before allowing sites to send and receive info when you tap NFC devices (recommended)
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_NFC_BLOCKED" desc="Summary text explaining that sites are blocked from using NFC.">
- Block sites from sending and receiving info when you tap NFC devices
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_VR_ASK" desc="Summary text explaining that sites need to ask for permission before using VR and that it is the recommended setting.">
- Ask before allowing sites to use your virtual reality device and data (recommended)
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_VR_BLOCKED" desc="Summary text explaining that sites are blocked from using VR.">
- Block sites from using your virtual reality device and data
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_SENSORS_ALLOWED" desc="Summary text explaining that sites are allowed to use device's sensors and that it is the recommended setting.">
- Allow sites to access sensors (recommended)
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_MOTION_SENSORS_ALLOWED" desc="Label text shown in settings; explaining that the current toggle state will allow websites to access the device's motion sensors (accelerometer, gyroscope, magnetometer).">
- Allow sites to access motion sensors (recommended)
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_SENSORS_BLOCKED" desc="Summary text explaining that access to sensors is being blocked on some sites.">
- Block sites from accessing sensors
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_MOTION_SENSORS_BLOCKED" desc="Label text shown in settings; explaining that the current toggle state will prevent websites from accessing the device's motion sensors (accelerometer, gyroscope, magnetometer).">
- Block sites from accessing motion sensors
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_SOUND_ALLOWED" desc="Summary text explaining that sites are allowed to play sound and that it is the recommended setting.">
- Allow sites to play sound (recommended)
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_SOUND_BLOCKED" desc="Summary text explaining that sound is being muted on some sites.">
- Mute sites that play sound
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_SOUND_BLOCKED_LIST" desc="Summary text explaining that the sound permission is set to mute sound on some sites. To be shown in the list of permission categories.">
- Muted
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_USB_ASK" desc="Summary text explaining that the USB permission is set to ask the user for permission to access individual devices. To be shown in the list of permission categories.">
- Ask before allowing sites to connect to a device (recommended)
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_USB_BLOCKED" desc="Summary text explaining that the USB permission is set to block all requests for access to devices. To be shown in the list of permission categories.">
- Block sites from connecting to devices
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_POPUPS_REDIRECTS_BLOCKED" desc="Summary text explaining that sites are blocked from showing popups/redirects and that it is the recommended setting.">
- Block sites from showing pop-ups and redirects (recommended)
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_ADS_BLOCKED" desc="A setting that, if turned on, will block intrusive or misleading ads on sites that have a history of showing such ads.">
- Block ads on sites that show intrusive or misleading ads
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_ADS_BLOCKED_LIST" desc="Summary text explaining that the Ads permission is set to block ads on some sites. To be shown in the list of permission categories.">
- Blocked on some sites
- </message>
- <message name="IDS_WEBSITE_SETTINGS_PERMISSIONS_ADS_BLOCK" desc="The Blocked string for the ads permission on Site Details">
- Block if site shows intrusive or misleading ads (recommended)
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_LOCATION_ASK" desc="Summary text explaining that sites need to ask for permission before knowing location and that it is the recommended setting.">
- Ask before allowing sites to know your location (recommended)
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_NOTIFICATIONS_ASK" desc="Summary text explaining that sites need to ask for permission before sending notifications.">
- Sites can ask to send notifications
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_NOTIFICATIONS_BLOCK" desc="Summary text explaining that sites will not be able to send notifications.">
- Sites can't ask to send notifications
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_NOTIFICATIONS_QUIET" desc="A setting that, if turned on will enable a quieter permission prompt for notifications.">
- Use quieter messaging (blocks notification prompts from interrupting you)
- </message>
- <message name="IDS_NOTIFICATIONS_IPH" desc="A message that explains to the users that notification permission requests will appear as an infobar from now on because the user repeatedly denied the notification permission in the past.">
- You usually block notifications. To allow, tap Details.
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_CAMERA_ASK" desc="Summary text explaining that sites need to ask for permission before accessing the camera and that it is the recommended setting.">
- Ask first before allowing sites to use your camera (recommended)
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_MIC_ASK" desc="Summary text explaining that sites need to ask for permission before accessing the microphone and that it is the recommended setting.">
- Ask first before allowing sites to use your microphone (recommended)
- </message>
- <message name="IDS_WEBSITE_SETTINGS_CATEGORY_BLUETOOTH_SCANNING_ASK" desc="Summary text explaining that the Bluetooth scanning permission is set to ask the user for permission to do Bluetooth scanning. To be shown in the list of permission categories.">
- Ask when a site wants to discover nearby Bluetooth devices (recommended)
- </message>
- <message name="IDS_WEBSITE_SETTINGS_PERMISSIONS_ALLOW" desc="Summary text explaining that Chrome will allow a website to access some permission, e.g. JavaScript: allow.">
- Allow
- </message>
- <message name="IDS_WEBSITE_SETTINGS_PERMISSIONS_BLOCK" desc="Summary text explaining that Chrome will block a website from accessing some permission, e.g. JavaScript: block.">
- Block
- </message>
- <message name="IDS_WEBSITE_SETTINGS_PERMISSIONS_ALLOW_DSE" desc="Summary text explaining that Chrome will allow the default search engine to access the user's location, both when performed from the address bar and from search result pages. e.g. Location access: Allow for current search engine">
- Allow for current search engine
- </message>
- <message name="IDS_WEBSITE_SETTINGS_PERMISSIONS_BLOCK_DSE" desc="Summary text explaining that Chrome will block the default search engine from accessing the user's location, both when performed from the address bar and from search result pages. e.g. Location access: Block for current search engine">
- Block for current search engine
- </message>
- <message name="IDS_WEBSITE_RESET" desc="The label for the button allowing users to clear all data and reset the permissions for a website.">
- Clear &amp; reset
- </message>
- <message name="IDS_WEBSITE_RESET_CONFIRMATION" desc="The confirmation text asking if the user is sure about clearing all data and reset the permissions for a site.">
- Are you sure you want to clear all local data, including cookies, and reset all permissions for this website?
- </message>
- <message name="IDS_CHOSEN_OBJECT_WEBSITE_RESET_CONFIRMATION_FOR" desc="The confirmation asking if the user is sure about clearing all site permissions for the chosen object">
- Are you sure you want to reset all site permissions for <ph name="CHOSEN_OBJECT_NAME">%1$s<ex>Weblight</ex></ph>?
- </message>
- <message name="IDS_WEBSTORAGE_CLEAR_DATA_DIALOG_TITLE" desc="Title of the confirmation dialog when the user ask to clear all data for an origin">
- Clear stored data
- </message>
- <message name="IDS_WEBSTORAGE_CLEAR_DATA_DIALOG_MESSAGE" desc="Text of the confirmation dialog when the user ask to clear all data for an origin">
- All local data stored by this website, including cookies, will be deleted.
- </message>
- <message name="IDS_WEBSTORAGE_CLEAR_DATA_DIALOG_OK_BUTTON" desc="Button confirming site data cleanup [CHAR-LIMIT=20]">
- Clear all
- </message>
- <message name="IDS_WEBSITE_NOTIFICATION_MANAGED_BY_APP" desc="String used to indicate that notifications are managed by an installed app">
- Managed by <ph name="APP_NAME">%1$s<ex>Notification App Name</ex></ph>
- </message>
- <message name="IDS_WEBSITE_NOTIFICATION_SETTINGS" desc="Accessibility string for the notification settings">
- Open notification settings
- </message>
- <message name="IDS_WEBSITE_SETTINGS_EMBEDDED_ON" desc="String used to indicate the embedder origin of a site">
- Embedded on <ph name="WEBSITE_URL">%1$s<ex>google.com</ex></ph>
- </message>
-
- <!-- Single site settings -->
- <message name="IDS_NO_SAVED_WEBSITE_SETTINGS" desc="Text to display when there are no saved website settings.">
- Files saved by websites appear here
- </message>
-
<!-- Language Settings -->
<message name="IDS_LANGUAGE_SETTINGS" desc="Title for the Languages settings screen that allows users to manage their languages preferences. [CHAR-LIMIT=32]">
Languages
@@ -1174,81 +873,6 @@ Your Google account may have other forms of browsing history like searches and a
What languages do you read?
</message>
- <!-- Location preferences -->
- <message name="IDS_WEBSITE_SETTINGS_DEVICE_LOCATION" desc="Title for Location settings, which control which websites can access your location." meaning="Geolocation">
- Location
- </message>
- <message name="IDS_GEOLOCATION_PERMISSION_TITLE" desc="Title for the permission of accessing the current location of a device [CHAR-LIMIT=32]">
- Location access
- </message>
- <message name="IDS_ANDROID_PERMISSION_OFF_PLURAL" desc="Text at the top of the Website list, explaining to the user that multiple permissions, such as the location service, are turned off. Contains a link to the settings menu to change it.">
- Turn on permissions for Chrome in <ph name="BEGIN_LINK">&lt;link&gt;</ph>Android Settings<ph name="END_LINK">&lt;/link&gt;</ph>.
- </message>
- <message name="IDS_ANDROID_PERMISSION_OFF" desc="Text at the top of the Website list, explaining to the user that a permission, such as the location service, is turned off. Contains a link to the settings menu to change it.">
- Turn on permission for Chrome in <ph name="BEGIN_LINK">&lt;link&gt;</ph>Android Settings<ph name="END_LINK">&lt;/link&gt;</ph>.
- </message>
- <message name="IDS_ANDROID_LOCATION_PERMISSION_OFF" desc="The message to show when the location permission needs to be turned on not just in Chrome, but also in Android settings.">
- To let Chrome access your location, also turn on location in <ph name="BEGIN_LINK">&lt;link&gt;</ph>Android Settings<ph name="END_LINK">&lt;/link&gt;</ph>.
- </message>
- <message name="IDS_ANDROID_CAMERA_PERMISSION_OFF" desc="The message to show when the camera permission needs to be turned on not just in Chrome, but also in Android settings.">
- To let Chrome access your camera, also turn on camera in <ph name="BEGIN_LINK">&lt;link&gt;</ph>Android Settings<ph name="END_LINK">&lt;/link&gt;</ph>.
- </message>
- <message name="IDS_ANDROID_NOTIFICATIONS_PERMISSION_OFF" desc="The message to show when the notifications permission needs to be turned on not just in Chrome, but also in Android settings.">
- To let Chrome send you notifications, also turn on notifications in <ph name="BEGIN_LINK">&lt;link&gt;</ph>Android Settings<ph name="END_LINK">&lt;/link&gt;</ph>.
- </message>
- <message name="IDS_ANDROID_MICROPHONE_PERMISSION_OFF" desc="The message to show when the microphone permission needs to be turned on not just in Chrome, but also in Android settings.">
- To let Chrome access your microphone, also turn on microphone in <ph name="BEGIN_LINK">&lt;link&gt;</ph>Android Settings<ph name="END_LINK">&lt;/link&gt;</ph>.
- </message>
- <message name="IDS_ANDROID_LOCATION_OFF_GLOBALLY" desc="The message to show when Location has been turned off globally in Android. Contains a link to the settings menu to enable location.">
- Location access is off for this device. Turn it on in <ph name="BEGIN_LINK">&lt;link&gt;</ph>Android Settings<ph name="END_LINK">&lt;/link&gt;</ph>.
- </message>
- <message name="IDS_ANDROID_LOCATION_ALSO_OFF_GLOBALLY" desc="The additional message to show when Location has not just been turned off for Chrome but also globally in Android. Contains a link to the settings menu to enable location.">
- Location access is also off for this device. Turn it on in <ph name="BEGIN_LINK">&lt;link&gt;</ph>Android Settings<ph name="END_LINK">&lt;/link&gt;</ph>.
- </message>
-
- <!-- Camera and microphone preferences -->
- <message name="IDS_WEBSITE_SETTINGS_USE_CAMERA" desc="The category filter 'Camera' for site settings.">
- Camera
- </message>
- <message name="IDS_WEBSITE_SETTINGS_USE_MIC" desc="The category filter 'Mic' for site settings.">
- Microphone
- </message>
- <message name="IDS_CAMERA_PERMISSION_TITLE" desc="Title text to be shown when the user has allowed/denied video access for the website [CHAR-LIMIT=32]">
- Access your camera
- </message>
- <message name="IDS_MIC_PERMISSION_TITLE" desc="Title text to be shown when the user has allowed/denied voice access for the website [CHAR-LIMIT=32]">
- Access your microphone
- </message>
-
- <!-- Protected content preferences -->
- <message name="IDS_PROTECTED_CONTENT" desc="Title for link to protected content settings [CHAR-LIMIT=32]">
- Protected content
- </message>
-
- <!-- Storage preferences -->
- <message name="IDS_WEBSITE_SETTINGS_STORAGE" desc="Title for Storage settings which show how much data websites are storing on the user's device. [CHAR-LIMIT=32]">
- Storage
- </message>
- <message name="IDS_ORIGIN_SETTINGS_STORAGE_USAGE_BRIEF" desc="Explanation of how much local storage a website is using">
- <ph name="STORAGE_AMOUNT">%1$s<ex>2 MB</ex></ph> stored data
- </message>
-
- <!-- USB preferences -->
- <message name="IDS_WEBSITE_SETTINGS_USB" desc="Title for USB settings, which control which of the user's USB devices can be accessed from websites.">
- USB
- </message>
- <message name="IDS_WEBSITE_SETTINGS_REVOKE_DEVICE_PERMISSION" desc="Content description for revoking a website's permission to access a device.">
- Revoke device permission
- </message>
- <message name="IDS_WEBSITE_SETTINGS_REVOKE_ALL_PERMISSIONS_FOR_DEVICE" desc="Content description for revoking all of the website permissions for a device.">
- Revoke all permissions for device
- </message>
-
- <!-- Bluetooth scanning preferences -->
- <message name="IDS_WEBSITE_SETTINGS_BLUETOOTH_SCANNING" desc="Title for Bluetooth scanning settings, which control whether websites can do Bluetooth scanning.">
- Bluetooth scanning
- </message>
-
<!-- Lite Mode-->
<message name="IDS_DATA_REDUCTION_TITLE_LITE_MODE" desc="Menu item for Lite mode, which allows users to save mobile data by compressing network traffic.">
Lite mode
@@ -2189,36 +1813,6 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
</message>
<!-- Page info popup -->
- <message name="IDS_PAGE_INFO_SITE_SETTINGS_BUTTON" desc="Text in the button that opens a website's Site Settings from the Page Info dialog.">
- Site settings
- </message>
- <message name="IDS_PAGE_INFO_PERMISSIONS_TITLE" desc="Label used in the Page Info dialog above the permissions list.">
- Permissions
- </message>
- <message name="IDS_PAGE_INFO_INSTANT_APP_BUTTON" desc="Text in the button that opens an Android Instant app that is associated with the website's URL.">
- Open Instant App
- </message>
- <message name="IDS_PAGE_INFO_DSE_PERMISSION_ALLOWED" desc="The label used in the Page Info dialog to describe an allowed location permission for the current search engine. Eg: Location - Allowed for current search engine">
- Allowed for current search engine
- </message>
- <message name="IDS_PAGE_INFO_DSE_PERMISSION_BLOCKED" desc="The label used in the Page Info dialog to describe a blocked location permission for the current search engine. Eg: Location - Blocked for current search engine">
- Blocked for current search engine
- </message>
- <message name="IDS_PAGE_INFO_PERMISSION_ALLOWED" desc="The label used in the Page Info dialog to describe an allowed permission. Eg: Location - Allowed">
- Allowed
- </message>
- <message name="IDS_PAGE_INFO_PERMISSION_BLOCKED" desc="The label used in the Page Info dialog to describe a blocked permission. Eg: Location - Blocked">
- Blocked
- </message>
- <message name="IDS_PAGE_INFO_ANDROID_PERMISSION_BLOCKED" desc="The label used in the Page Info dialog to indicate a permission has been blocked within Android settings">
- Turned off in Android settings
- </message>
- <message name="IDS_PAGE_INFO_ANDROID_LOCATION_BLOCKED" desc="The label used in the Page Info dialog to indicate that location has been been disabled for the device in Android settings">
- Turned off for this device
- </message>
- <message name="IDS_PAGE_INFO_ANDROID_NFC_UNSUPPORTED" desc="The label used in the Page Info dialog to indicate NFC is not supported by this device">
- This device can't read NFC
- </message>
<message name="IDS_PAGE_INFO_CONNECTION_OFFLINE" desc="Message to display in the page info bubble when viewing and offline page.">
You are viewing an offline copy of this page from <ph name="CREATION_TIME">%1$s<ex>Feb 9, 2016</ex></ph>
</message>
@@ -2228,15 +1822,6 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_PAGE_INFO_OFFLINE_PAGE_NOT_TRUSTED_WITHOUT_DATE" desc="Additional message to be shown in the page info bubble, when the offline page shown is not trusted. The offline page creation date will not be displayed.">
This page may differ from the online version.
</message>
- <message name="IDS_PAGE_INFO_DOMAIN_HIDDEN" desc="Message to display in the page info bubble when the domain is hidden.">
- This content is from <ph name="DOMAIN_NAME">%1$s<ex>google.com</ex></ph>, delivered by Google.
- </message>
- <message name="IDS_PAGE_INFO_OPEN_ONLINE_BUTTON" desc="Text in the button that attempts to open an online version of the offline website displayed in the tab.">
- Open Online
- </message>
- <message name="IDS_PAGE_INFO_PREVIEW_MESSAGE" desc="This text is displayed in the page info bubble when the currently viewed page has been modified by Google to be a lighter and faster version of the original page. The word 'Lite' should match the translation in TC ID 1019734090540434451">
- Lite page provided by Google
- </message>
<message name="IDS_PAGE_INFO_PREVIEW_LOAD_ORIGINAL" desc="This text, when clicked, loads the original page from its origin without any treatments. This text is shown in the page info bubble when the currently viewed page has been modified to be a lighter and faster version of the original page.">
<ph name="BEGIN_LINK">&lt;link&gt;</ph>Load original page<ph name="END_LINK">&lt;/link&gt;</ph> from <ph name="DOMAIN_NAME">%1$s<ex>google.com</ex></ph>
</message>
@@ -2266,21 +1851,9 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
</message>
<!-- Download UI -->
- <message name="IDS_DOWNLOAD_NOTIFICATION_CANCEL_BUTTON" desc="Text on the button that cancels a download.">
- Cancel
- </message>
<message name="IDS_DOWNLOAD_NOTIFICATION_COMPLETED" desc="Download notification to be displayed when a download completes.">
Download complete
</message>
- <message name="IDS_DOWNLOAD_NOTIFICATION_COMPLETED_WITH_SIZE" desc="Download notification to be displayed when a download completes, includes the size of the download as well after a separator character.">
- Download complete <ph name="SEPARATOR">•</ph> <ph name="BYTES_DOWNLOADED">%1$s<ex>4.3 MB</ex></ph>
- </message>
- <message name="IDS_DOWNLOAD_NOTIFICATION_FAILED" desc="Download notification to be displayed when a download fails.">
- Download failed
- </message>
- <message name="IDS_DOWNLOAD_NOTIFICATION_PAUSED" desc="Download notification to be displayed when a download pauses.">
- Download paused
- </message>
<message name="IDS_DOWNLOAD_NOTIFICATION_PENDING" desc="Download notification to be displayed when a download has been scheduled but has not started being fetched from the network.">
Download pending…
</message>
@@ -2296,12 +1869,6 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_DOWNLOAD_CANT_OPEN_FILE" desc="Toast that appears when a downloaded file can't be opened.">
Can’t open file
</message>
- <message name="IDS_DOWNLOAD_NOTIFICATION_PAUSE_BUTTON" desc="Text on the button that pauses a download.">
- Pause
- </message>
- <message name="IDS_DOWNLOAD_NOTIFICATION_RESUME_BUTTON" desc="Text on the button that resumes a paused download.">
- Resume
- </message>
<message name="IDS_DOWNLOAD_FAILED_REASON_FILE_ALREADY_EXISTS" desc="Message to explain that the download failed because file already exists.">
<ph name="FILE_NAME">%1$s<ex>http://abc.com/test.pdf</ex></ph> download prevented because file already exists.
</message>
@@ -2326,30 +1893,6 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_DOWNLOAD_STARTED" desc="Message to show when download has started [CHAR LIMIT=30]">
Downloading…
</message>
- <message name="IDS_DOWNLOAD_UI_KB" desc="String indicating the size of a downloaded file (in progress or complete), in kilobytes.">
- <ph name="kilobytes">%1$3.2f<ex>12.5</ex></ph> KB
- </message>
- <message name="IDS_DOWNLOAD_UI_MB" desc="String indicating the size of a downloaded file (in progress or complete), in megabytes.">
- <ph name="megabytes">%1$3.2f<ex>12.5</ex></ph> MB
- </message>
- <message name="IDS_DOWNLOAD_UI_GB" desc="String indicating the size of a downloaded file (in progress or complete), in gigabytes.">
- <ph name="gigabytes">%1$3.2f<ex>12.5</ex></ph> GB
- </message>
- <message name="IDS_DOWNLOAD_UI_INDETERMINATE_BYTES" desc="Appears in a notification when a user starts downloading a file. Indicates the number of bytes downloaded out of an unknown total file size. E.g. 3/? MB [downloaded]. As appropriate for your language, use '/' or 'of'; and change word order as needed.">
- <ph name="BYTES_DOWNLOADED_WITH_UNITS">%1$s<ex>12.2 MB</ex></ph> / ?
- </message>
- <message name="IDS_DOWNLOAD_UI_DETERMINATE_BYTES" desc="Appears in a notification when a user starts downloading a file. Indicates the number of bytes downloaded out of the total file size. E.g. 3/7 MB [downloaded]. As appropriate for your language, use '/' or 'of'; and change word order as needed.">
- <ph name="BYTES_DOWNLOADED_WITH_UNITS">%1$s<ex>12.2 MB</ex></ph> / <ph name="FILE_SIZE_WITH_UNITS">%2$s<ex>20.3 GB</ex></ph>
- </message>
- <message name="IDS_FILE_SIZE_DOWNLOADED_KB" desc="Notification message showing how many KBs have been downloaded.">
- Downloaded <ph name="KBS">%1$.1f<ex>10.1</ex></ph> KB
- </message>
- <message name="IDS_FILE_SIZE_DOWNLOADED_MB" desc="Notification message showing how many MBs have been downloaded.">
- Downloaded <ph name="MBS">%1$.1f<ex>10.1</ex></ph> MB
- </message>
- <message name="IDS_FILE_SIZE_DOWNLOADED_GB" desc="Notification message showing how many GBs have been downloaded.">
- Downloaded <ph name="GBS">%1$.1f<ex>10.1</ex></ph> GB
- </message>
<message name="IDS_ONE_FILE_LEFT" desc="Message showing 1 file left">
1 file left
</message>
@@ -2654,9 +2197,6 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_ACCESSIBILITY_PAUSE" desc="The pause button that pauses playing the media.">
Pause
</message>
- <message name="IDS_ACCESSIBILITY_STOP" desc="The stop button that stops playing the media.">
- Stop
- </message>
<message name="IDS_ACCESSIBILITY_PREVIOUS_TRACK" desc="The previous track button that switches media to the previous track.">
Previous track
</message>
@@ -2734,9 +2274,6 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_ACCESSIBILITY_NTP_OFFLINE_BADGE" desc="Content description for the badge that indicates offline availability of a most visited item or content suggestion on the new tab page.">
Available offline
</message>
- <message name="IDS_ACCESSIBILITY_SUGGESTION_WITH_VIDEO_BADGE" desc="Content description for the badge that indicates a content suggestion on the new tab page has a video.">
- With video
- </message>
<message name="IDS_NTP_LEARN_MORE_ABOUT_SUGGESTED_CONTENT" desc="Text in the footer of the New Tab Page. Part of the text is a link to a help center page where the user can learn more about suggested content.">
<ph name="BEGIN_LINK">&lt;link&gt;</ph>Learn more<ph name="END_LINK">&lt;/link&gt;</ph> about suggested content
</message>
@@ -2746,6 +2283,39 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_NTP_SUGGESTIONS_FETCH_NO_NEW_SUGGESTIONS" desc="Snackbar text shown when the user presses the More button to get more suggestions, the fetch succeeds but provides no new suggestions.">
No new suggestions
</message>
+ <message name="IDS_NTP_MANAGE_MY_ACTIVITY" desc="Content description to manage my activity from the feed header overflow menu.">
+ Manage activity
+ </message>
+ <message name="IDS_NTP_MANAGE_INTERESTS" desc="Content description to manage settings from the feed header overflow menu.">
+ Manage interests
+ </message>
+ <message name="IDS_NTP_TURN_OFF_FEED" desc="Content description to turn off the feed from the feed header overflow menu.">
+ Turn off
+ </message>
+ <message name="IDS_NTP_TURN_ON_FEED" desc="Content description to turn on the feed from the feed header overflow menu.">
+ Turn on
+ </message>
+ <message name="IDS_NTP_DISCOVER_ON" desc="Title in the feed header when the feed is turned on. Please use the branded term for Discover, as listed under Product Names in the Google Glossary Manager.">
+ Discover
+ </message>
+ <message name="IDS_NTP_DISCOVER_ON_BRANDED" desc="Title in the feed header when the feed is turned on and the default search engine is not Google. Please use the branded term for Discover, as listed under Product Names in the Google Glossary Manager.">
+ Discover by Google
+ </message>
+ <message name="IDS_NTP_DISCOVER_OFF" desc="Title in the feed header when the feed is turned off. Please use the branded term for Discover, as listed under Product Names in the Google Glossary Manager.">
+ Discover - off
+ </message>
+ <message name="IDS_NTP_DISCOVER_OFF_BRANDED" desc="Title in the feed header when the feed is turned off and the default search engine is not Google. Please use the branded term for Discover, as listed under Product Names in the Google Glossary Manager.">
+ Discover by Google - off
+ </message>
+ <message name="IDS_NTP_FEED_MENU_IPH" desc="In-product help that points at the menu icon for the news feed on Chrome's new tab page. This string instructs the user to open the menu for settings that let them control the content that appears on the feed.">
+ Control your stories and activity here
+ </message>
+ <message name="IDS_ACCESSIBILITY_NTP_FEED_MENU_BUTTON" desc="Content description for the feed header menu button. Please use the branded term for Discover, as listed under Product Names in the Google Glossary Manager.">
+ Options for Discover
+ </message>
+ <message name="IDS_ACCESSIBILITY_NTP_FEED_MENU_IPH" desc="In-product help that points at the menu icon for the news feed on Chrome's new tab page. This string instructs the user to open the menu for settings that let them control the content that appears on the feed.">
+ Control your stories from the Options for Discover button
+ </message>
<!-- Explore sites strings -->
<message name="IDS_EXPLORE_SITES_TITLE" desc="Title of a section showing different categories, each with a number of popular websites">
@@ -3180,32 +2750,13 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
Tap to collapse
</message>
- <message name="IDS_ANNOUNCEMENT_NOTIFICATION_CHANNEL_NAME" desc="The channel name for announcement notification, will show on the Android notification setting UI as a channel category.">
- Announcements
- </message>
-
<message name="IDS_TAB_SWITCHER_BUTTON_LABEL" desc="Label for tab switcher button">
Tabs
</message>
- <message name="IDS_MEDIA_NOTIFICATION_LINK_TEXT" desc="Url of the current tab. The notification will display this text for the user to identify the tab to return to.">
- Touch to return to <ph name="URL_OF_THE_CURRENT_TAB">%1$s<ex>https://apprtc.appspot.com</ex></ph>
- </message>
- <message name="IDS_MEDIA_NOTIFICATION_LINK_TEXT_INCOGNITO" desc="The notification will display this text for the user to return to the incognito tab which has created the notification.">
- Tap to go to site
- </message>
- <message name="IDS_MEDIA_NOTIFICATION_INCOGNITO" desc="Text used as a placeholder for media notifications content, when notification is shown from incognito tab.">
+ <message name="IDS_MEDIA_NOTIFICATION_INCOGNITO" desc="Text used as a placeholder for a media notification about playing media, when notification is shown from incognito tab.">
A site is playing media
</message>
- <message name="IDS_NOTIFICATION_INCOGNITO_TAB" desc="Text used as notifications source when the notification is from incognito tabs.">
- Incognito tab
- </message>
- <message name="IDS_SCREEN_CAPTURE_NOTIFICATION_TEXT" desc="Text to be shown as a notification when screen capture is in progress.">
- <ph name="URL_OF_THE_CURRENT_TAB">%1$s<ex>https://apprtc.appspot.com</ex></ph> is sharing your screen
- </message>
- <message name="IDS_SCREEN_CAPTURE_INCOGNITO_NOTIFICATION_TEXT" desc="Text to be shown as a notification when screen capture is in progress in incognito mode.">
- A site is sharing your screen
- </message>
<!-- Contextual Search -->
<message name="IDS_CONTEXTUAL_SEARCH_NETWORK_UNAVAILABLE" desc="Tells the user the network is not accessible.">
@@ -3288,14 +2839,6 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
Unsupported number of Chrome instances.
</message>
- <!-- Override URL -->
- <message name="IDS_BLOCKED_NAVIGATION_WARNING" desc="Warning message added to dev tools console when navigation to a given URL is blocked.">
- Navigation is blocked: <ph name="URL">%1$s<ex>intent://abcd</ex></ph>
- </message>
- <message name="IDS_UNREACHABLE_NAVIGATION_WARNING" desc="Warning message added to dev tools console when navigation to a given URL is unreachable.">
- Navigation is unreachable: <ph name="URL">%1$s<ex>intent://abcd</ex></ph>
- </message>
-
<message name="IDS_CLOSE_TAB" desc="Context menu option that allows the user to close the selected tab.">
Close tab
</message>
@@ -3338,9 +2881,6 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_STORAGE_MANAGEMENT_ACTIVITY_LABEL" desc="Title for Chrome's Manage Space Activity.">
Google <ph name="APP_NAME">%1$s<ex>Chrome</ex></ph> storage
</message>
- <message name="IDS_STORAGE_CLEAR_SITE_STORAGE_TITLE" desc="Title of clear storage dialogs used in a couple different places to confirm clearing site storage data. [CHAR-LIMIT=24]">
- Clear site storage?
- </message>
<message name="IDS_STORAGE_MANAGEMENT_UNIMPORTANT_SITE_DATA_DESCRIPTION" desc="Text to describe the data stored by unimportant or infrequent sites.">
Site storage Chrome doesn't think is important (e.g. sites with no saved settings or that you don't visit often)
</message>
@@ -3381,16 +2921,6 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
All Chrome’s app data will be deleted permanently. This includes all files, settings, accounts, databases, etc.
</message>
- <message name="IDS_STORAGE_CLEAR_BUTTON_TITLE" desc="Title of a button in the storage UI used to clear all storage data. [CHAR-LIMIT=24]">
- Clear site storage
- </message>
- <message name="IDS_STORAGE_CLEAR_DIALOG_TEXT" desc="Text of the clear storage dialog which give the user a choice to reset the app or delete site storage data.">
- This will clear all <ph name="SIZE_IN_KB">%1$s<ex>101kb</ex></ph> of website storage.
- </message>
- <message name="IDS_STORAGE_CLEAR_DIALOG_CLEAR_STORAGE_OPTION" desc="Text of the button that will clear website storage.">
- Clear
- </message>
-
<!-- Client certificate selection failure strings. -->
<message name="IDS_CLIENT_CERT_UNSUPPORTED_TITLE" desc="Title of a dialog box for when the operating system does not support client SSL certificate selection">
Unable to select certificate.
@@ -3457,6 +2987,9 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_DECODER_DESCRIPTION" desc="The title for the image decoder utility service.">
Image decoder
</message>
+ <message name="IDS_FAST_FORWARD_HINT" desc="The hint string shown when a user drags the tumb in the video seeker (reminding them of an easier way to skip ahead/go back).">
+ Double tap video left or right to skip 10s
+ </message>
<message name="IDS_ACCESSIBILITY_PLAY_VIDEO" desc="The accessibility string for the play video button.">
Play video
</message>
@@ -3505,6 +3038,18 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_TWA_RUNNING_IN_CHROME" desc="Message on a snackbar indicating that the current Activity may use Chrome data (the rest of the app may not be).">
Running in Chrome
</message>
+ <message name="IDS_TWA_RUNNING_IN_CHROME_V2" desc="Updated message on a snackbar indicating that the current Activity may use Chrome data (the rest of the app may not be).">
+ You'll see your <ph name="SITE_NAME">%1$s<ex>www.youtube.com</ex></ph> sign-in status, browsing data, and site data in Chrome.
+ </message>
+ <message name="IDS_GOT_IT" desc="Button for the user to accept a disclosure/message">
+ Got it
+ </message>
+ <message name="IDS_TWA_RUNNING_IN_CHROME_CHANNEL_NAME_INITIAL" desc="Notification channel name for the initial, urgent priority notification telling the user a TWA is running in Chrome.">
+ Web apps
+ </message>
+ <message name="IDS_TWA_RUNNING_IN_CHROME_CHANNEL_NAME_SUBSEQUENT" desc="Notification channel name for follow up notifications telling the user a TWA is running in Chrome.">
+ Web apps (quiet)
+ </message>
<message name="IDS_TWA_CLEAR_DATA_DIALOG_TITLE" desc="Title of the clear data dialog showing after user uninstalls or clears data of an app hosting a Trusted Web Activity">
<ph name="APP_NAME">%1$s<ex>YouTube</ex></ph> also has data in Chrome
</message>
@@ -3993,6 +3538,16 @@ Only you can see what your camera is looking at. The site can't see your camera'
Extra ICU
</message>
+ <message name="IDS_CABLEV2_AUTHENTICATOR_MODULE_TITLE"
+ desc="Text shown when the caBLEv2 module (i.e. for Phone as a Security Key) is
+ referenced in install start, success, and failure UI (e.g. in
+ IDS_MODULE_INSTALL_START_TEXT, which will expand to 'Installing Phone as a
+ Security Key Support for Chrome…'). A security key is usually a physical piece of
+ hardware used for authentication and this feature is about using a mobile
+ phone in place of one.">
+ Phone as a Security Key Support
+ </message>
+
<!-- QR Code -->
<message name="IDS_QR_CODE_SHARE_ICON_LABEL" desc="Icon label for sharing with QR Code activity.">
QR Code
@@ -4037,7 +3592,7 @@ Only you can see what your camera is looking at. The site can't see your camera'
</message>
<message name="IDS_QR_CODE_PERMISSION_DESCRIPTION" desc="Text on QR code sharing tab indicating that permissions need to be given.">
- Please enable your camera to scan a QR code
+ To scan a QR code, let Chrome use your camera
</message>
<message name="IDS_QR_CODE_OPEN_SETTINGS_DESCRIPTION" desc="Text on QR code sharing tab indicating that user needs to open settings to give camera permission.">
@@ -4076,6 +3631,21 @@ Only you can see what your camera is looking at. The site can't see your camera'
chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS">%1$s<ex>1582667748515</ex></ph>
</message>
+ <message name="IDS_QR_CODE_SUCCESSFUL_DOWNLOAD_TITLE" desc="Notification title for successful QR code download.">
+ QR code downloaded
+ </message>
+
+ <message name="IDS_QR_CODE_SUCCESSFUL_DOWNLOAD_TEXT" desc="Notification text for successful QR code download.">
+ Tap to open QR code
+ </message>
+
+ <message name="IDS_QR_CODE_FAILED_DOWNLOAD_TITLE" desc="Notification title for failed QR code download.">
+ Can't download QR code
+ </message>
+
+ <message name="IDS_QR_CODE_FAILED_DOWNLOAD_TEXT" desc="Notification text for failed QR code download.">
+ Something went wrong
+ </message>
<!-- Chime DFM module strings -->
<message name="IDS_CHIME_MODULE_TITLE" desc="Text shown when the chime module is referenced in install start, success, failure UI (e.g. in IDS_MODULE_INSTALL_START_TEXT, which will expand to 'Installing Google Notifications Platform for Chrome…').">
Google Notifications Platform
@@ -4086,14 +3656,6 @@ Only you can see what your camera is looking at. The site can't see your camera'
Image Editor
</message>
- <!-- NFC prompt -->
- <message name="IDS_ANDROID_NFC_OFF_GLOBALLY" desc="The message to show when NFC has been turned off globally in Android. Contains a link to the settings menu to enable NFC.">
- NFC is off for this device. Turn it on in <ph name="BEGIN_LINK">&lt;link&gt;</ph>Android Settings<ph name="END_LINK">&lt;/link&gt;</ph>.
- </message>
- <message name="IDS_ANDROID_NFC_UNSUPPORTED" desc="The message to show when NFC is not supported globally in Android">
- This device can't read NFC
- </message>
-
<!-- Paint Preview Demo -->
<message name="IDS_PAINT_PREVIEW_DEMO_CAPTURE_SUCCESS" desc="Toast message displayed when paint preview capture finishes successfully. Used in paint preview demo mode." translateable="false">
Paint Preview captured successfully.
@@ -4110,6 +3672,26 @@ Only you can see what your camera is looking at. The site can't see your camera'
<message name="IDS_PAINT_PREVIEW_DEMO_PLAYBACK_FAILURE" desc="Toast message displayed when there is a failure in playing back a paint preview for the demo. Used in paint preview demo mode." translateable="false">
Paint Preview playback failed.
</message>
+
+ <!-- Browser Promo Notification Strings -->
+ <message name="IDS_CHROME_REENGAGEMENT_NOTIFICATION_1_TITLE" desc="The title of a notification shown to suggest that users use Chrome. Users probably have not opened Chrome in a while. Promotes relevant articles Chrome has.">
+ Read today's news <ph name="NEWS_ICON">📰</ph>
+ </message>
+ <message name="IDS_CHROME_REENGAGEMENT_NOTIFICATION_1_DESCRIPTION" desc="The body text of a notification shown to suggest that users use Chrome. Users probably have not opened Chrome in a while. Promotes relevant articles Chrome has.">
+ Articles on your interests on Chrome
+ </message>
+ <message name="IDS_CHROME_REENGAGEMENT_NOTIFICATION_2_TITLE" desc="The title of a notification shown to suggest that users use Chrome. Users probably have not opened Chrome in a while. Promotes data savings.">
+ Save up to 60% data
+ </message>
+ <message name="IDS_CHROME_REENGAGEMENT_NOTIFICATION_2_DESCRIPTION" desc="The body text of a notification shown to suggest that users use Chrome. Users probably have not opened Chrome in a while. Promotes data savings.">
+ Use Lite mode on Google Chrome
+ </message>
+ <message name="IDS_CHROME_REENGAGEMENT_NOTIFICATION_3_TITLE" desc="The title of a notification shown to suggest that users use Chrome. Users probably have not opened Chrome in a while.">
+ Google recommends Chrome
+ </message>
+ <message name="IDS_CHROME_REENGAGEMENT_NOTIFICATION_3_DESCRIPTION" desc="The title of a notification shown to suggest that users use Chrome. Users probably have not opened Chrome in a while. Promotes data savings and relevant news.">
+ Save up to 60% data, read today's news
+ </message>
</messages>
</release>
</grit>
diff --git a/chromium/chrome/browser/ui/messages/android/BUILD.gn b/chromium/chrome/browser/ui/messages/android/BUILD.gn
index 05e17f71c7f..44070c13f12 100644
--- a/chromium/chrome/browser/ui/messages/android/BUILD.gn
+++ b/chromium/chrome/browser/ui/messages/android/BUILD.gn
@@ -5,6 +5,7 @@ import("//build/config/android/rules.gni")
android_resources("java_resources") {
custom_package = "org.chromium.chrome.ui.messages"
+
sources = [
"java/res/drawable-hdpi/infobar_shadow_left.9.png",
"java/res/drawable-hdpi/infobar_shadow_top.png",
@@ -27,6 +28,7 @@ android_resources("java_resources") {
"java/res/values/dimens.xml",
"java/res/values/ids.xml",
]
+
deps = [
"//chrome/browser/ui/android/strings:ui_strings_grd",
"//components/browser_ui/strings/android:browser_ui_strings_grd",
@@ -37,36 +39,55 @@ android_resources("java_resources") {
android_library("java") {
sources = [
+ "java/src/org/chromium/chrome/browser/ui/messages/infobar/ConfirmInfoBar.java",
+ "java/src/org/chromium/chrome/browser/ui/messages/infobar/InfoBar.java",
"java/src/org/chromium/chrome/browser/ui/messages/infobar/InfoBarCompactLayout.java",
"java/src/org/chromium/chrome/browser/ui/messages/infobar/InfoBarControlLayout.java",
"java/src/org/chromium/chrome/browser/ui/messages/infobar/InfoBarInteractionHandler.java",
"java/src/org/chromium/chrome/browser/ui/messages/infobar/InfoBarLayout.java",
"java/src/org/chromium/chrome/browser/ui/messages/infobar/InfoBarMessageView.java",
"java/src/org/chromium/chrome/browser/ui/messages/infobar/InfoBarUiItem.java",
+ "java/src/org/chromium/chrome/browser/ui/messages/infobar/SimpleConfirmInfoBarBuilder.java",
"java/src/org/chromium/chrome/browser/ui/messages/snackbar/Snackbar.java",
"java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarCollection.java",
"java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager.java",
"java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarView.java",
]
+
deps = [
":java_resources",
"//base:base_java",
+ "//base:jni_java",
+ "//chrome/browser/ui:infobar_android_enums_java",
"//chrome/browser/util:java",
"//components/browser_ui/styles/android:java_resources",
"//components/browser_ui/widget/android:java",
"//components/infobars/core:infobar_enums_java",
"//third_party/android_deps:androidx_annotation_annotation_java",
- "//third_party/android_deps:com_android_support_appcompat_v7_java",
+ "//third_party/android_deps:androidx_appcompat_appcompat_java",
"//ui/android:ui_full_java",
"//ui/android:ui_utils_java",
]
+
+ annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
+}
+
+generate_jni("jni_headers") {
+ sources = [
+ "java/src/org/chromium/chrome/browser/ui/messages/infobar/ConfirmInfoBar.java",
+ "java/src/org/chromium/chrome/browser/ui/messages/infobar/InfoBar.java",
+ "java/src/org/chromium/chrome/browser/ui/messages/infobar/SimpleConfirmInfoBarBuilder.java",
+ ]
}
java_library("junit") {
# Skip platform checks since Robolectric depends on requires_android targets.
bypass_platform_checks = true
+
testonly = true
+
sources = [ "java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarCollectionUnitTest.java" ]
+
deps = [
":java",
"//base:base_java_test_support",
@@ -77,10 +98,12 @@ java_library("junit") {
android_library("javatests") {
testonly = true
+
sources = [
"java/src/org/chromium/chrome/browser/ui/messages/infobar/InfoBarControlLayoutTest.java",
"java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarTest.java",
]
+
deps = [
":java",
"//base:base_java",
diff --git a/chromium/chrome/browser/ui/webui/about_ui.cc b/chromium/chrome/browser/ui/webui/about_ui.cc
index 8973b1954c0..2bda9c07e29 100644
--- a/chromium/chrome/browser/ui/webui/about_ui.cc
+++ b/chromium/chrome/browser/ui/webui/about_ui.cc
@@ -319,8 +319,11 @@ class ChromeOSTermsHandler
DCHECK_CURRENTLY_ON(BrowserThread::UI);
// If we fail to load Chrome OS EULA from disk, load it from resources.
// Do nothing if OEM EULA or Play Store ToS load failed.
- if (contents_.empty() && path_.empty())
- contents_ = l10n_util::GetStringUTF8(IDS_TERMS_HTML);
+ if (contents_.empty() && path_.empty()) {
+ contents_ =
+ ui::ResourceBundle::GetSharedInstance().LoadLocalizedResourceString(
+ IDS_TERMS_HTML);
+ }
std::move(callback_).Run(base::RefCountedString::TakeString(&contents_));
}
@@ -361,17 +364,17 @@ class ChromeOSCreditsHandler
void StartOnUIThread() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (path_ == kKeyboardUtilsPath) {
- contents_ = ui::ResourceBundle::GetSharedInstance()
- .GetRawDataResource(IDR_KEYBOARD_UTILS_JS)
- .as_string();
+ contents_ =
+ ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(
+ IDR_KEYBOARD_UTILS_JS);
ResponseOnUIThread();
return;
}
// Load local Chrome OS credits from the disk.
base::ThreadPool::PostTaskAndReply(
FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
- base::Bind(&ChromeOSCreditsHandler::LoadCreditsFileAsync, this),
- base::Bind(&ChromeOSCreditsHandler::ResponseOnUIThread, this));
+ base::BindOnce(&ChromeOSCreditsHandler::LoadCreditsFileAsync, this),
+ base::BindOnce(&ChromeOSCreditsHandler::ResponseOnUIThread, this));
}
void LoadCreditsFileAsync() {
@@ -428,13 +431,13 @@ class CrostiniCreditsHandler
void StartOnUIThread() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (path_ == kKeyboardUtilsPath) {
- contents_ = ui::ResourceBundle::GetSharedInstance()
- .GetRawDataResource(IDR_KEYBOARD_UTILS_JS)
- .as_string();
+ contents_ =
+ ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(
+ IDR_KEYBOARD_UTILS_JS);
ResponseOnUIThread();
return;
}
- auto* component_manager =
+ auto component_manager =
g_browser_process->platform_part()->cros_component_manager();
if (!component_manager) {
LoadCredits(base::FilePath(chrome::kLinuxCreditsPath));
@@ -636,7 +639,9 @@ void AboutUIHTMLSource::StartDataRequest(
return;
}
#endif
- response = l10n_util::GetStringUTF8(IDS_TERMS_HTML);
+ response =
+ ui::ResourceBundle::GetSharedInstance().LoadLocalizedResourceString(
+ IDS_TERMS_HTML);
#endif
}
diff --git a/chromium/chrome/browser/ui/webui/about_ui_unittest.cc b/chromium/chrome/browser/ui/webui/about_ui_unittest.cc
index 118ca6c7065..091a58094c2 100644
--- a/chromium/chrome/browser/ui/webui/about_ui_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/about_ui_unittest.cc
@@ -93,11 +93,7 @@ class ChromeOSTermsTest : public testing::Test {
if (!base::CreateDirectory(dir))
return false;
- if (base::WriteFile(dir.AppendASCII("terms.html"), locale.c_str(),
- locale.length()) != static_cast<int>(locale.length())) {
- return false;
- }
- return true;
+ return base::WriteFile(dir.AppendASCII("terms.html"), locale);
}
// Creates directory for the given |locale| that contains privacy_policy.pdf.
@@ -107,11 +103,7 @@ class ChromeOSTermsTest : public testing::Test {
if (!base::CreateDirectory(dir))
return false;
- if (base::WriteFile(dir.AppendASCII("privacy_policy.pdf"), locale.c_str(),
- locale.length()) != static_cast<int>(locale.length())) {
- return false;
- }
- return true;
+ return base::WriteFile(dir.AppendASCII("privacy_policy.pdf"), locale);
}
// Sets device region in VPD.
@@ -128,8 +120,8 @@ class ChromeOSTermsTest : public testing::Test {
GURL(base::StrCat(
{"chrome://", chrome::kChromeUITermsHost, "/", request_url})),
std::move(wc_getter),
- base::BindRepeating(&TestDataReceiver::OnDataReceived,
- base::Unretained(data_receiver)));
+ base::BindOnce(&TestDataReceiver::OnDataReceived,
+ base::Unretained(data_receiver)));
task_environment_.RunUntilIdle();
}
diff --git a/chromium/chrome/browser/ui/webui/app_launcher_page_ui.cc b/chromium/chrome/browser/ui/webui/app_launcher_page_ui.cc
index f4d500f5ffc..a6b2b88ee09 100644
--- a/chromium/chrome/browser/ui/webui/app_launcher_page_ui.cc
+++ b/chromium/chrome/browser/ui/webui/app_launcher_page_ui.cc
@@ -18,6 +18,7 @@
#include "chrome/browser/ui/webui/ntp/core_app_launcher_handler.h"
#include "chrome/browser/ui/webui/ntp/ntp_resource_cache.h"
#include "chrome/browser/ui/webui/theme_handler.h"
+#include "chrome/browser/web_applications/web_app_provider.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/generated_resources.h"
#include "chrome/grit/theme_resources.h"
@@ -42,9 +43,13 @@ AppLauncherPageUI::AppLauncherPageUI(content::WebUI* web_ui)
if (!GetProfile()->IsOffTheRecord()) {
extensions::ExtensionService* service =
extensions::ExtensionSystem::Get(GetProfile())->extension_service();
- // We should not be launched without an ExtensionService.
+ web_app::WebAppProvider* web_app_provider =
+ web_app::WebAppProvider::Get(GetProfile());
+ DCHECK(web_app_provider);
DCHECK(service);
- web_ui->AddMessageHandler(std::make_unique<AppLauncherHandler>(service));
+ // We should not be launched without an ExtensionService or WebAppProvider.
+ web_ui->AddMessageHandler(
+ std::make_unique<AppLauncherHandler>(service, web_app_provider));
web_ui->AddMessageHandler(std::make_unique<CoreAppLauncherHandler>());
web_ui->AddMessageHandler(std::make_unique<AppIconWebUIHandler>());
web_ui->AddMessageHandler(std::make_unique<MetricsHandler>());
@@ -142,8 +147,8 @@ std::string AppLauncherPageUI::HTMLSource::GetContentSecurityPolicyStyleSrc() {
}
std::string AppLauncherPageUI::HTMLSource::GetContentSecurityPolicyImgSrc() {
- return "img-src chrome://extension-icon chrome://theme chrome://resources "
- "data:;";
+ return "img-src chrome://extension-icon chrome://app-icon chrome://theme "
+ "chrome://resources data:;";
}
-AppLauncherPageUI::HTMLSource::~HTMLSource() {}
+AppLauncherPageUI::HTMLSource::~HTMLSource() = default;
diff --git a/chromium/chrome/browser/ui/webui/app_management/app_management.mojom b/chromium/chrome/browser/ui/webui/app_management/app_management.mojom
index 993f37268bb..dce93502f75 100644
--- a/chromium/chrome/browser/ui/webui/app_management/app_management.mojom
+++ b/chromium/chrome/browser/ui/webui/app_management/app_management.mojom
@@ -83,3 +83,8 @@ enum PwaPermissionType {
MEDIASTREAM_MIC = 9,
MEDIASTREAM_CAMERA = 10,
};
+
+// The Plugin VM app publisher uses this enum directly.
+enum PluginVmPermissionType {
+ PRINTING = 0,
+};
diff --git a/chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/OWNERS b/chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/OWNERS
index 85ef92a8da9..f7b1a422a6c 100644
--- a/chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/OWNERS
+++ b/chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/OWNERS
@@ -1,4 +1,5 @@
battre@chromium.org
dvadym@chromium.org
+koerber@google.com
# COMPONENT: UI>Browser>Passwords
diff --git a/chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui_browsertest.cc b/chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui_browsertest.cc
index 79b870a64ba..cf9e5e19db5 100644
--- a/chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui_browsertest.cc
@@ -12,6 +12,7 @@
#include "components/autofill/core/browser/logging/log_router.h"
#include "components/password_manager/content/browser/password_manager_log_router_factory.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
class PasswordManagerInternalsWebUIBrowserTest : public WebUIBrowserTest {
public:
@@ -163,9 +164,10 @@ IN_PROC_BROWSER_TEST_F(PasswordManagerInternalsWebUIBrowserTest,
IN_PROC_BROWSER_TEST_F(PasswordManagerInternalsWebUIBrowserTest,
IncognitoMessage) {
Browser* incognito = CreateIncognitoBrowser();
+ EXPECT_TRUE(incognito->profile()->IsOffTheRecord());
autofill::LogRouter* log_router =
password_manager::PasswordManagerLogRouterFactory::GetForBrowserContext(
- incognito->profile()->GetOffTheRecordProfile());
+ incognito->profile());
EXPECT_FALSE(log_router); // There should be no log_router for Incognito.
OpenInternalsPageWithBrowser(incognito, WindowOpenDisposition::CURRENT_TAB);
SetWebUIInstance(
diff --git a/chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.cc b/chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.cc
index d1138c1d553..33da2b12ec6 100644
--- a/chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.cc
+++ b/chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.cc
@@ -28,7 +28,7 @@ BluetoothInternalsHandler::~BluetoothInternalsHandler() = default;
void BluetoothInternalsHandler::GetAdapter(GetAdapterCallback callback) {
if (device::BluetoothAdapterFactory::IsBluetoothSupported()) {
- device::BluetoothAdapterFactory::GetAdapter(
+ device::BluetoothAdapterFactory::Get()->GetAdapter(
base::BindOnce(&BluetoothInternalsHandler::OnGetAdapter,
weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
} else {
diff --git a/chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.cc b/chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.cc
index 912e21c429f..efc6427495a 100644
--- a/chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.cc
+++ b/chromium/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.cc
@@ -7,6 +7,7 @@
#include "base/bind.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.h"
+#include "chrome/browser/ui/webui/webui_util.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/bluetooth_internals_resources.h"
#include "chrome/grit/bluetooth_internals_resources_map.h"
@@ -31,10 +32,9 @@ BluetoothInternalsUI::BluetoothInternalsUI(content::WebUI* web_ui)
IDR_BLUETOOTH_INTERNALS_MOJO_JS);
html_source->AddResourcePath("uuid.mojom-lite.js",
IDR_BLUETOOTH_INTERNALS_UUID_MOJO_JS);
- for (size_t i = 0; i < kBluetoothInternalsResourcesSize; i++) {
- html_source->AddResourcePath(kBluetoothInternalsResources[i].name,
- kBluetoothInternalsResources[i].value);
- }
+ webui::AddResourcePathsBulk(
+ html_source, base::make_span(kBluetoothInternalsResources,
+ kBluetoothInternalsResourcesSize));
html_source->SetDefaultResource(IDR_BLUETOOTH_INTERNALS_HTML);
Profile* profile = Profile::FromWebUI(web_ui);
diff --git a/chromium/chrome/browser/ui/webui/cast/OWNERS b/chromium/chrome/browser/ui/webui/cast/OWNERS
deleted file mode 100644
index 1de9e6bb6d7..00000000000
--- a/chromium/chrome/browser/ui/webui/cast/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-# Component: Chromecast
diff --git a/chromium/chrome/browser/ui/webui/cast/cast_ui.cc b/chromium/chrome/browser/ui/webui/cast/cast_ui.cc
deleted file mode 100644
index 1c27f5122b3..00000000000
--- a/chromium/chrome/browser/ui/webui/cast/cast_ui.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/webui/cast/cast_ui.h"
-
-#include "chrome/browser/media/router/event_page_request_manager.h"
-#include "chrome/browser/media/router/event_page_request_manager_factory.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/common/url_constants.h"
-#include "chrome/grit/browser_resources.h"
-#include "content/public/browser/web_contents.h"
-#include "content/public/browser/web_ui.h"
-#include "content/public/browser/web_ui_data_source.h"
-
-// TODO: Figure out a way to self-navigate the WebUI in C++ on instantiation,
-// and replace the navigation in cast.js with that.
-CastUI::CastUI(content::WebUI* web_ui)
- : content::WebUIController(web_ui) {
- // Retrieve the ID of the component extension.
- auto* event_page_request_manager =
- media_router::EventPageRequestManagerFactory::GetApiForBrowserContext(
- web_ui->GetWebContents()->GetBrowserContext());
- std::string extension_id =
- event_page_request_manager->media_route_provider_extension_id();
-
- // Set up the chrome://cast data source and add required resources.
- content::WebUIDataSource* html_source =
- content::WebUIDataSource::Create(chrome::kChromeUICastHost);
-
- html_source->AddResourcePath("cast.js", IDR_CAST_JS);
- html_source->AddString("extensionId", extension_id);
- html_source->UseStringsJs();
- html_source->SetDefaultResource(IDR_CAST_HTML);
-
- content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), html_source);
-}
-
-CastUI::~CastUI() {
-}
diff --git a/chromium/chrome/browser/ui/webui/cast/cast_ui.h b/chromium/chrome/browser/ui/webui/cast/cast_ui.h
deleted file mode 100644
index 2cae6ddb476..00000000000
--- a/chromium/chrome/browser/ui/webui/cast/cast_ui.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_WEBUI_CAST_CAST_UI_H_
-#define CHROME_BROWSER_UI_WEBUI_CAST_CAST_UI_H_
-
-#include "base/macros.h"
-#include "base/values.h"
-#include "content/public/browser/web_ui_controller.h"
-
-// The WebUI for chrome://cast
-class CastUI : public content::WebUIController {
- public:
- explicit CastUI(content::WebUI* web_ui);
- ~CastUI() override;
- private:
- DISALLOW_COPY_AND_ASSIGN(CastUI);
-};
-
-#endif // CHROME_BROWSER_UI_WEBUI_CAST_CAST_UI_H_
diff --git a/chromium/chrome/browser/ui/webui/certificate_manager_localized_strings_provider.cc b/chromium/chrome/browser/ui/webui/certificate_manager_localized_strings_provider.cc
index 1fb5f60dbe8..d250a3880c5 100644
--- a/chromium/chrome/browser/ui/webui/certificate_manager_localized_strings_provider.cc
+++ b/chromium/chrome/browser/ui/webui/certificate_manager_localized_strings_provider.cc
@@ -15,74 +15,92 @@ namespace certificate_manager {
void AddLocalizedStrings(content::WebUIDataSource* html_source) {
static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"certificateManagerExpandA11yLabel",
- IDS_SETTINGS_CERTIFICATE_MANAGER_EXPAND_ACCESSIBILITY_LABEL},
- {"certificateManagerNoCertificates",
- IDS_SETTINGS_CERTIFICATE_MANAGER_NO_CERTIFICATES},
- {"certificateManagerYourCertificates",
- IDS_SETTINGS_CERTIFICATE_MANAGER_YOUR_CERTIFICATES},
- {"certificateManagerYourCertificatesDescription",
- IDS_SETTINGS_CERTIFICATE_MANAGER_YOUR_CERTIFICATES_DESCRIPTION},
- {"certificateManagerServers", IDS_SETTINGS_CERTIFICATE_MANAGER_SERVERS},
- {"certificateManagerServersDescription",
- IDS_SETTINGS_CERTIFICATE_MANAGER_SERVERS_DESCRIPTION},
- {"certificateManagerAuthorities",
- IDS_SETTINGS_CERTIFICATE_MANAGER_AUTHORITIES},
- {"certificateManagerAuthoritiesDescription",
- IDS_SETTINGS_CERTIFICATE_MANAGER_AUTHORITIES_DESCRIPTION},
- {"certificateManagerOthers", IDS_SETTINGS_CERTIFICATE_MANAGER_OTHERS},
- {"certificateManagerOthersDescription",
- IDS_SETTINGS_CERTIFICATE_MANAGER_OTHERS_DESCRIPTION},
- {"certificateManagerView", IDS_SETTINGS_CERTIFICATE_MANAGER_VIEW},
- {"certificateManagerImport", IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT},
- {"certificateManagerImportAndBind",
- IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_AND_BIND},
- {"certificateManagerExport", IDS_SETTINGS_CERTIFICATE_MANAGER_EXPORT},
- {"certificateManagerDelete", IDS_SETTINGS_DELETE},
- {"certificateManagerUntrusted",
- IDS_SETTINGS_CERTIFICATE_MANAGER_UNTRUSTED},
- // CA trust edit dialog.
- {"certificateManagerCaTrustEditDialogTitle",
- IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_TITLE},
- {"certificateManagerCaTrustEditDialogDescription",
- IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_DESCRIPTION},
- {"certificateManagerCaTrustEditDialogExplanation",
- IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_EXPLANATION},
- {"certificateManagerCaTrustEditDialogSsl",
- IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_SSL},
- {"certificateManagerCaTrustEditDialogEmail",
- IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_EMAIL},
- {"certificateManagerCaTrustEditDialogObjSign",
- IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_OBJ_SIGN},
- // Certificate delete confirmation dialog.
- {"certificateManagerDeleteUserTitle",
- IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_USER_TITLE},
- {"certificateManagerDeleteUserDescription",
- IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_USER_DESCRIPTION},
- {"certificateManagerDeleteServerTitle",
- IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_SERVER_TITLE},
- {"certificateManagerDeleteServerDescription",
- IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_SERVER_DESCRIPTION},
- {"certificateManagerDeleteCaTitle",
- IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_CA_TITLE},
- {"certificateManagerDeleteCaDescription",
- IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_CA_DESCRIPTION},
- {"certificateManagerDeleteOtherTitle",
- IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_OTHER_TITLE},
- // Encrypt/decrypt password dialogs.
- {"certificateManagerEncryptPasswordTitle",
- IDS_SETTINGS_CERTIFICATE_MANAGER_ENCRYPT_PASSWORD_TITLE},
- {"certificateManagerDecryptPasswordTitle",
- IDS_SETTINGS_CERTIFICATE_MANAGER_DECRYPT_PASSWORD_TITLE},
- {"certificateManagerEncryptPasswordDescription",
- IDS_SETTINGS_CERTIFICATE_MANAGER_ENCRYPT_PASSWORD_DESCRIPTION},
- {"certificateManagerPassword", IDS_SETTINGS_CERTIFICATE_MANAGER_PASSWORD},
- {"certificateManagerConfirmPassword",
- IDS_SETTINGS_CERTIFICATE_MANAGER_CONFIRM_PASSWORD},
- {"certificateImportErrorFormat",
- IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_ERROR_FORMAT},
- // For A11y.
- {"menu", IDS_MENU},
+ {"certificateManagerExpandA11yLabel",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_EXPAND_ACCESSIBILITY_LABEL},
+ {"certificateManagerNoCertificates",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_NO_CERTIFICATES},
+ {"certificateManagerYourCertificates",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_YOUR_CERTIFICATES},
+ {"certificateManagerYourCertificatesDescription",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_YOUR_CERTIFICATES_DESCRIPTION},
+ {"certificateManagerServers", IDS_SETTINGS_CERTIFICATE_MANAGER_SERVERS},
+ {"certificateManagerServersDescription",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_SERVERS_DESCRIPTION},
+ {"certificateManagerAuthorities",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_AUTHORITIES},
+ {"certificateManagerAuthoritiesDescription",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_AUTHORITIES_DESCRIPTION},
+ {"certificateManagerOthers", IDS_SETTINGS_CERTIFICATE_MANAGER_OTHERS},
+ {"certificateManagerOthersDescription",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_OTHERS_DESCRIPTION},
+ {"certificateManagerView", IDS_SETTINGS_CERTIFICATE_MANAGER_VIEW},
+ {"certificateManagerImport", IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT},
+ {"certificateManagerImportAndBind",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_AND_BIND},
+ {"certificateManagerExport", IDS_SETTINGS_CERTIFICATE_MANAGER_EXPORT},
+ {"certificateManagerDelete", IDS_SETTINGS_DELETE},
+ {"certificateManagerUntrusted", IDS_SETTINGS_CERTIFICATE_MANAGER_UNTRUSTED},
+ // CA trust edit dialog.
+ {"certificateManagerCaTrustEditDialogTitle",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_TITLE},
+ {"certificateManagerCaTrustEditDialogDescription",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_DESCRIPTION},
+ {"certificateManagerCaTrustEditDialogExplanation",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_EXPLANATION},
+ {"certificateManagerCaTrustEditDialogSsl",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_SSL},
+ {"certificateManagerCaTrustEditDialogEmail",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_EMAIL},
+ {"certificateManagerCaTrustEditDialogObjSign",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_OBJ_SIGN},
+ // Certificate delete confirmation dialog.
+ {"certificateManagerDeleteUserTitle",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_USER_TITLE},
+ {"certificateManagerDeleteUserDescription",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_USER_DESCRIPTION},
+ {"certificateManagerDeleteServerTitle",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_SERVER_TITLE},
+ {"certificateManagerDeleteServerDescription",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_SERVER_DESCRIPTION},
+ {"certificateManagerDeleteCaTitle",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_CA_TITLE},
+ {"certificateManagerDeleteCaDescription",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_CA_DESCRIPTION},
+ {"certificateManagerDeleteOtherTitle",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_OTHER_TITLE},
+ // Encrypt/decrypt password dialogs.
+ {"certificateManagerEncryptPasswordTitle",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_ENCRYPT_PASSWORD_TITLE},
+ {"certificateManagerDecryptPasswordTitle",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_DECRYPT_PASSWORD_TITLE},
+ {"certificateManagerEncryptPasswordDescription",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_ENCRYPT_PASSWORD_DESCRIPTION},
+ {"certificateManagerPassword", IDS_SETTINGS_CERTIFICATE_MANAGER_PASSWORD},
+ {"certificateManagerConfirmPassword",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_CONFIRM_PASSWORD},
+ {"certificateImportErrorFormat",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_ERROR_FORMAT},
+#if defined(OS_CHROMEOS)
+ {"certificateProvisioningListHeader",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_LIST_HEADER},
+ {"certificateProvisioningRefresh",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_REFRESH},
+ {"certificateProvisioningDetails",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_DETAILS},
+ {"certificateProvisioningAdvancedSectionTitle",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_ADVANCED},
+ {"certificateProvisioningProfile",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_CERTIFICATE_PROFILE},
+ {"certificateProvisioningStatus",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS},
+ {"certificateProvisioningStatusId",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_ID},
+ {"certificateProvisioningLastUpdate",
+ IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_LAST_UPDATE},
+ {"certificateProvisioningPublicKey", IDS_CERT_DETAILS_SUBJECT_KEY},
+#endif // defined(OS_CHROMEOS)
+ // For A11y.
+ {"menu", IDS_MENU},
};
AddLocalizedStringsBulk(html_source, kLocalizedStrings);
}
diff --git a/chromium/chrome/browser/ui/webui/certificate_provisioning_ui_handler.cc b/chromium/chrome/browser/ui/webui/certificate_provisioning_ui_handler.cc
new file mode 100644
index 00000000000..1542ce8726d
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/certificate_provisioning_ui_handler.cc
@@ -0,0 +1,247 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+
+#include "chrome/browser/ui/webui/certificate_provisioning_ui_handler.h"
+
+#include "base/bind.h"
+#include "base/containers/span.h"
+#include "base/strings/string16.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "base/time/time.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/browser_process_platform_part.h"
+#include "chrome/browser/chromeos/cert_provisioning/cert_provisioning_common.h"
+#include "chrome/browser/chromeos/cert_provisioning/cert_provisioning_scheduler.h"
+#include "chrome/browser/chromeos/cert_provisioning/cert_provisioning_scheduler_user_service.h"
+#include "chrome/browser/chromeos/cert_provisioning/cert_provisioning_worker.h"
+#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/common/net/x509_certificate_model_nss.h"
+#include "chrome/grit/generated_resources.h"
+#include "components/user_manager/user.h"
+#include "components/user_manager/user_manager.h"
+#include "content/public/browser/web_ui.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/l10n/time_format.h"
+
+namespace chromeos {
+namespace cert_provisioning {
+
+namespace {
+
+// Returns localized representation for the state of a certificate provisioning
+// process.
+base::string16 GetProvisioningProcessStatus(
+ chromeos::cert_provisioning::CertProvisioningWorkerState state) {
+ using CertProvisioningWorkerState =
+ chromeos::cert_provisioning::CertProvisioningWorkerState;
+ switch (state) {
+ case CertProvisioningWorkerState ::kInitState:
+ return l10n_util::GetStringUTF16(
+ IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_PREPARING_CSR);
+ case CertProvisioningWorkerState ::kKeypairGenerated:
+ return l10n_util::GetStringUTF16(
+ IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_PREPARING_CSR_WAITING);
+ case CertProvisioningWorkerState::kStartCsrResponseReceived:
+ // Intentional fall-through.
+ case CertProvisioningWorkerState::kVaChallengeFinished:
+ // Intentional fall-through.
+ case CertProvisioningWorkerState::kKeyRegistered:
+ // Intentional fall-through.
+ case CertProvisioningWorkerState::kKeypairMarked:
+ return l10n_util::GetStringUTF16(
+ IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_PREPARING_CSR);
+ case CertProvisioningWorkerState::kSignCsrFinished:
+ return l10n_util::GetStringUTF16(
+ IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_PREPARING_CSR_WAITING);
+ case CertProvisioningWorkerState::kFinishCsrResponseReceived:
+ return l10n_util::GetStringUTF16(
+ IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_WAITING_FOR_CA);
+ case CertProvisioningWorkerState::kSucceeded:
+ return l10n_util::GetStringUTF16(
+ IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_SUCCESS);
+ case CertProvisioningWorkerState::kFailed:
+ return l10n_util::GetStringUTF16(
+ IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_FAILURE);
+ case CertProvisioningWorkerState::kInconsistentDataError:
+ return l10n_util::GetStringUTF16(
+ IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_PREPARING_CSR_WAITING);
+ case CertProvisioningWorkerState::kCanceled:
+ return l10n_util::GetStringUTF16(
+ IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_CANCELED);
+ }
+ NOTREACHED();
+}
+
+// Returns a localized representation of the last update time as a delay (e.g.
+// "5 minutes ago".
+base::string16 GetTimeSinceLastUpdate(base::Time last_update_time) {
+ const base::Time now = base::Time::NowFromSystemTime();
+ if (last_update_time.is_null() || last_update_time > now)
+ return base::string16();
+ const base::TimeDelta elapsed_time = now - last_update_time;
+ return ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_ELAPSED,
+ ui::TimeFormat::LENGTH_SHORT, elapsed_time);
+}
+
+base::Value CreateProvisioningProcessEntry(
+ const std::string& cert_profile_id,
+ bool is_device_wide,
+ chromeos::cert_provisioning::CertProvisioningWorkerState state,
+ base::Time time_since_last_update,
+ const std::string& public_key_spki_der) {
+ base::Value entry(base::Value::Type::DICTIONARY);
+ entry.SetStringKey("certProfileId", cert_profile_id);
+ entry.SetBoolKey("isDeviceWide", is_device_wide);
+ entry.SetStringKey("status", GetProvisioningProcessStatus(state));
+ entry.SetIntKey("stateId", static_cast<int>(state));
+ entry.SetStringKey("timeSinceLastUpdate",
+ GetTimeSinceLastUpdate(time_since_last_update));
+
+ auto spki_der_bytes = base::as_bytes(base::make_span(public_key_spki_der));
+ entry.SetStringKey(
+ "publicKey",
+ x509_certificate_model::ProcessRawSubjectPublicKeyInfo(spki_der_bytes));
+
+ return entry;
+}
+
+// Collects information about certificate provisioning processes from
+// |cert_provisioning_scheduler| and appends them to |list_to_append_to|.
+void CollectProvisioningProcesses(
+ base::Value* list_to_append_to,
+ CertProvisioningScheduler* cert_provisioning_scheduler,
+ bool is_device_wide) {
+ for (const auto& worker_entry : cert_provisioning_scheduler->GetWorkers()) {
+ CertProvisioningWorker* worker = worker_entry.second.get();
+ list_to_append_to->Append(CreateProvisioningProcessEntry(
+ worker_entry.first, is_device_wide, worker->GetState(),
+ worker->GetLastUpdateTime(), worker->GetPublicKey()));
+ }
+ for (const auto& failed_worker_entry :
+ cert_provisioning_scheduler->GetFailedCertProfileIds()) {
+ const chromeos::cert_provisioning::FailedWorkerInfo& worker =
+ failed_worker_entry.second;
+ list_to_append_to->Append(CreateProvisioningProcessEntry(
+ failed_worker_entry.first, is_device_wide, worker.state,
+ worker.last_update_time, worker.public_key));
+ }
+}
+
+} // namespace
+
+CertificateProvisioningUiHandler::CertificateProvisioningUiHandler() = default;
+CertificateProvisioningUiHandler::~CertificateProvisioningUiHandler() = default;
+
+void CertificateProvisioningUiHandler::RegisterMessages() {
+ // Passing base::Unretained(this) to web_ui()->RegisterMessageCallback is fine
+ // because in chrome Web UI, web_ui() has acquired ownership of |this| and
+ // maintains the life time of |this| accordingly.
+ web_ui()->RegisterMessageCallback(
+ "refreshCertificateProvisioningProcessses",
+ base::BindRepeating(&CertificateProvisioningUiHandler::
+ HandleRefreshCertificateProvisioningProcesses,
+ base::Unretained(this)));
+ web_ui()->RegisterMessageCallback(
+ "triggerCertificateProvisioningProcessUpdate",
+ base::BindRepeating(&CertificateProvisioningUiHandler::
+ HandleTriggerCertificateProvisioningProcessUpdate,
+ base::Unretained(this)));
+}
+
+CertProvisioningScheduler*
+CertificateProvisioningUiHandler::GetCertProvisioningSchedulerForUser(
+ Profile* user_profile) {
+ chromeos::cert_provisioning::CertProvisioningSchedulerUserService*
+ user_service = chromeos::cert_provisioning::
+ CertProvisioningSchedulerUserServiceFactory::GetForProfile(
+ user_profile);
+ if (!user_service)
+ return nullptr;
+ return user_service->scheduler();
+}
+
+CertProvisioningScheduler*
+CertificateProvisioningUiHandler::GetCertProvisioningSchedulerForDevice(
+ Profile* user_profile) {
+ const user_manager::User* user =
+ chromeos::ProfileHelper::Get()->GetUserByProfile(user_profile);
+ if (!user || !user->IsAffiliated())
+ return nullptr;
+
+ policy::BrowserPolicyConnectorChromeOS* connector =
+ g_browser_process->platform_part()->browser_policy_connector_chromeos();
+ return connector->GetDeviceCertProvisioningScheduler();
+}
+
+void CertificateProvisioningUiHandler::
+ HandleRefreshCertificateProvisioningProcesses(const base::ListValue* args) {
+ CHECK_EQ(0U, args->GetSize());
+ AllowJavascript();
+ RefreshCertificateProvisioningProcesses();
+}
+
+void CertificateProvisioningUiHandler::
+ HandleTriggerCertificateProvisioningProcessUpdate(
+ const base::ListValue* args) {
+ CHECK_EQ(2U, args->GetSize());
+ if (!args->is_list())
+ return;
+ const base::Value& cert_profile_id = args->GetList()[0];
+ if (!cert_profile_id.is_string())
+ return;
+ const base::Value& device_wide = args->GetList()[1];
+ if (!device_wide.is_bool())
+ return;
+
+ Profile* profile = Profile::FromWebUI(web_ui());
+ CertProvisioningScheduler* scheduler =
+ device_wide.GetBool() ? GetCertProvisioningSchedulerForDevice(profile)
+ : GetCertProvisioningSchedulerForUser(profile);
+ if (!scheduler)
+ return;
+
+ scheduler->UpdateOneCert(cert_profile_id.GetString());
+
+ // Send an update to the UI immediately to reflect a possible status change.
+ RefreshCertificateProvisioningProcesses();
+
+ // Trigger a refresh in a few seconds, in case the state has triggered a
+ // refresh with the server.
+ // TODO(https://crbug.com/1045895): Use a real observer instead.
+ constexpr base::TimeDelta kTimeToWaitBeforeRefresh =
+ base::TimeDelta::FromSeconds(10);
+ base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+ FROM_HERE,
+ base::BindOnce(&CertificateProvisioningUiHandler::
+ RefreshCertificateProvisioningProcesses,
+ weak_ptr_factory_.GetWeakPtr()),
+ kTimeToWaitBeforeRefresh);
+}
+
+void CertificateProvisioningUiHandler::
+ RefreshCertificateProvisioningProcesses() {
+ Profile* profile = Profile::FromWebUI(web_ui());
+
+ base::ListValue all_processes;
+ CertProvisioningScheduler* scheduler_for_user =
+ GetCertProvisioningSchedulerForUser(profile);
+ if (scheduler_for_user)
+ CollectProvisioningProcesses(&all_processes, scheduler_for_user,
+ /*is_device_wide=*/false);
+
+ CertProvisioningScheduler* scheduler_for_device =
+ GetCertProvisioningSchedulerForDevice(profile);
+ if (scheduler_for_device)
+ CollectProvisioningProcesses(&all_processes, scheduler_for_device,
+ /*is_device_wide=*/true);
+
+ FireWebUIListener("certificate-provisioning-processes-changed",
+ std::move(all_processes));
+}
+
+} // namespace cert_provisioning
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/certificate_provisioning_ui_handler.h b/chromium/chrome/browser/ui/webui/certificate_provisioning_ui_handler.h
new file mode 100644
index 00000000000..16c2808849d
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/certificate_provisioning_ui_handler.h
@@ -0,0 +1,69 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_CERTIFICATE_PROVISIONING_UI_HANDLER_H_
+#define CHROME_BROWSER_UI_WEBUI_CERTIFICATE_PROVISIONING_UI_HANDLER_H_
+
+#include "base/memory/weak_ptr.h"
+#include "base/values.h"
+#include "content/public/browser/web_ui_message_handler.h"
+
+class Profile;
+
+namespace chromeos {
+namespace cert_provisioning {
+
+class CertProvisioningScheduler;
+
+class CertificateProvisioningUiHandler : public content::WebUIMessageHandler {
+ public:
+ CertificateProvisioningUiHandler();
+
+ CertificateProvisioningUiHandler(
+ const CertificateProvisioningUiHandler& other) = delete;
+ CertificateProvisioningUiHandler& operator=(
+ const CertificateProvisioningUiHandler& other) = delete;
+
+ ~CertificateProvisioningUiHandler() override;
+
+ // content::WebUIMessageHandler.
+ void RegisterMessages() override;
+
+ private:
+ // Returns the per-user CertProvisioningScheduler for |user_profile|, if it
+ // has any.
+ chromeos::cert_provisioning::CertProvisioningScheduler*
+ GetCertProvisioningSchedulerForUser(Profile* user_profile);
+
+ // Returns the per-device CertProvisioningScheduler, if |user_profile| is
+ // associated with a user that has access to device-wide client certificates.
+ chromeos::cert_provisioning::CertProvisioningScheduler*
+ GetCertProvisioningSchedulerForDevice(Profile* user_profile);
+
+ // Send the list of certificate provisioning processes to the UI, triggered by
+ // the UI when it loads.
+ // |args| is expected to be empty.
+ void HandleRefreshCertificateProvisioningProcesses(
+ const base::ListValue* args);
+
+ // Trigger an update / refresh on a certificate provisioning process.
+ // |args| is expected to contain two arguments:
+ // The argument at index 0 is a string specifying the certificate profile id
+ // of the process that an update should be triggered for. The argument at
+ // index 1 is a boolean specifying whether the process is a user-specific
+ // (false) or a device-wide (true) certificate provisioning process.
+ void HandleTriggerCertificateProvisioningProcessUpdate(
+ const base::ListValue* args);
+
+ // Send the list of certificate provisioning processes to the UI.
+ void RefreshCertificateProvisioningProcesses();
+
+ base::WeakPtrFactory<CertificateProvisioningUiHandler> weak_ptr_factory_{
+ this};
+};
+
+} // namespace cert_provisioning
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_CERTIFICATE_PROVISIONING_UI_HANDLER_H_
diff --git a/chromium/chrome/browser/ui/webui/certificate_viewer_webui.cc b/chromium/chrome/browser/ui/webui/certificate_viewer_webui.cc
index 2bd1c78de41..e1f05685f69 100644
--- a/chromium/chrome/browser/ui/webui/certificate_viewer_webui.cc
+++ b/chromium/chrome/browser/ui/webui/certificate_viewer_webui.cc
@@ -310,18 +310,19 @@ CertificateViewerDialogHandler::~CertificateViewerDialogHandler() {
void CertificateViewerDialogHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback(
"exportCertificate",
- base::BindRepeating(&CertificateViewerDialogHandler::ExportCertificate,
- base::Unretained(this)));
+ base::BindRepeating(
+ &CertificateViewerDialogHandler::HandleExportCertificate,
+ base::Unretained(this)));
web_ui()->RegisterMessageCallback(
"requestCertificateFields",
base::BindRepeating(
- &CertificateViewerDialogHandler::RequestCertificateFields,
+ &CertificateViewerDialogHandler::HandleRequestCertificateFields,
base::Unretained(this)));
}
-void CertificateViewerDialogHandler::ExportCertificate(
+void CertificateViewerDialogHandler::HandleExportCertificate(
const base::ListValue* args) {
- int cert_index = GetCertificateIndex(args);
+ int cert_index = GetCertificateIndex(args->GetList()[0].GetInt());
if (cert_index < 0)
return;
@@ -333,9 +334,11 @@ void CertificateViewerDialogHandler::ExportCertificate(
cert_chain_.end());
}
-void CertificateViewerDialogHandler::RequestCertificateFields(
+void CertificateViewerDialogHandler::HandleRequestCertificateFields(
const base::ListValue* args) {
- int cert_index = GetCertificateIndex(args);
+ AllowJavascript();
+ const base::Value& callback_id = args->GetList()[0];
+ int cert_index = GetCertificateIndex(args->GetList()[1].GetInt());
if (cert_index < 0)
return;
@@ -452,17 +455,12 @@ void CertificateViewerDialogHandler::RequestCertificateFields(
.Build());
// Send certificate information to javascript.
- web_ui()->CallJavascriptFunctionUnsafe("cert_viewer.getCertificateFields",
- root_list);
+ ResolveJavascriptCallback(callback_id, root_list);
}
int CertificateViewerDialogHandler::GetCertificateIndex(
- const base::ListValue* args) const {
- int cert_index;
- double val;
- if (!(args->GetDouble(0, &val)))
- return -1;
- cert_index = static_cast<int>(val);
+ int requested_index) const {
+ int cert_index = requested_index;
if (cert_index < 0 || cert_index >= static_cast<int>(cert_chain_.size()))
return -1;
return cert_index;
diff --git a/chromium/chrome/browser/ui/webui/certificate_viewer_webui.h b/chromium/chrome/browser/ui/webui/certificate_viewer_webui.h
index b4e185e8a74..6aa0969aa7a 100644
--- a/chromium/chrome/browser/ui/webui/certificate_viewer_webui.h
+++ b/chromium/chrome/browser/ui/webui/certificate_viewer_webui.h
@@ -88,18 +88,18 @@ class CertificateViewerDialogHandler : public content::WebUIMessageHandler {
// chain.
//
// The input is an integer index to the certificate in the chain to export.
- void ExportCertificate(const base::ListValue* args);
+ void HandleExportCertificate(const base::ListValue* args);
- // Gets the details for a specific certificate in the certificate chain. Calls
- // the javascript function cert_viewer.getCertificateFields with a tree
- // structure containing the fields and values for certain nodes.
+ // Gets the details for a specific certificate in the certificate chain.
+ // Responds with a tree structure containing the fields and values for certain
+ // nodes.
//
// The input is an integer index to the certificate in the chain to view.
- void RequestCertificateFields(const base::ListValue* args);
+ void HandleRequestCertificateFields(const base::ListValue* args);
- // Helper function to get the certificate index from |args|. Returns -1 if
- // the index is out of range.
- int GetCertificateIndex(const base::ListValue* args) const;
+ // Helper function to get the certificate index. Returns -1 if the index is
+ // out of range.
+ int GetCertificateIndex(int requested_index) const;
// The dialog.
CertificateViewerDialog* dialog_;
diff --git a/chromium/chrome/browser/ui/webui/certificates_handler.cc b/chromium/chrome/browser/ui/webui/certificates_handler.cc
index c545456883d..e5d76bf269a 100644
--- a/chromium/chrome/browser/ui/webui/certificates_handler.cc
+++ b/chromium/chrome/browser/ui/webui/certificates_handler.cc
@@ -995,8 +995,8 @@ void CertificatesHandler::HandleRefreshCertificates(
// Request that a model be created.
CertificateManagerModel::Create(
Profile::FromWebUI(web_ui()), this,
- base::Bind(&CertificatesHandler::OnCertificateManagerModelCreated,
- weak_ptr_factory_.GetWeakPtr()));
+ base::BindOnce(&CertificatesHandler::OnCertificateManagerModelCreated,
+ weak_ptr_factory_.GetWeakPtr()));
requested_certificate_manager_model_ = true;
return;
}
diff --git a/chromium/chrome/browser/ui/webui/certificates_handler_unittest.cc b/chromium/chrome/browser/ui/webui/certificates_handler_unittest.cc
index 6977fd0295c..6ada07d72d6 100644
--- a/chromium/chrome/browser/ui/webui/certificates_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/certificates_handler_unittest.cc
@@ -4,7 +4,6 @@
#include "chrome/browser/ui/webui/certificates_handler.h"
-#include "base/logging.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "chrome/test/base/testing_profile.h"
diff --git a/chromium/chrome/browser/ui/webui/chrome_url_data_manager_browsertest.cc b/chromium/chrome/browser/ui/webui/chrome_url_data_manager_browsertest.cc
index f0960599cfb..99a612517da 100644
--- a/chromium/chrome/browser/ui/webui/chrome_url_data_manager_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/chrome_url_data_manager_browsertest.cc
@@ -3,6 +3,8 @@
// found in the LICENSE file.
#include "base/macros.h"
+#include "base/strings/string_piece.h"
+#include "base/test/scoped_feature_list.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/url_constants.h"
@@ -14,6 +16,9 @@
#include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_source.h"
#include "content/public/browser/notification_types.h"
+#include "content/public/common/content_features.h"
+#include "content/public/test/browser_test.h"
+#include "content/public/test/browser_test_utils.h"
namespace {
@@ -133,3 +138,257 @@ IN_PROC_BROWSER_TEST_F(ChromeURLDataManagerTest, LargeResourceScale) {
// original url.
EXPECT_NE(net::OK, observer.net_error());
}
+
+class ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled
+ : public InProcessBrowserTest {
+ public:
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled() {
+ feature_list_.InitAndEnableFeature(features::kWebUIReportOnlyTrustedTypes);
+ }
+
+ void CheckTrustedTypesViolation(base::StringPiece url) {
+ std::string message_filter = "*This document requires*assignment*";
+ content::WebContents* content =
+ browser()->tab_strip_model()->GetActiveWebContents();
+ content::WebContentsConsoleObserver console_observer(content);
+ console_observer.SetPattern(message_filter);
+
+ ASSERT_TRUE(embedded_test_server()->Start());
+ ui_test_utils::NavigateToURL(browser(), GURL(url));
+
+ // Round trip to the renderer to ensure that the page is loaded
+ EXPECT_TRUE(content::ExecuteScript(content, "var a = 0;"));
+ EXPECT_TRUE(console_observer.messages().empty());
+ }
+
+ private:
+ base::test::ScopedFeatureList feature_list_;
+};
+
+// Verify that there's no Trusted Types violation in chrome://chrome-urls
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInChromeUrls) {
+ CheckTrustedTypesViolation("chrome://chrome-urls");
+}
+
+// Verify that there's no Trusted Types violation in chrome://blob-internals
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInBlobInternals) {
+ CheckTrustedTypesViolation("chrome://blob-internals");
+}
+
+// Verify that there's no Trusted Types violation in chrome://device-log
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInDeviceLog) {
+ CheckTrustedTypesViolation("chrome://device-log");
+}
+
+// Verify that there's no Trusted Types violation in chrome://devices
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInDevices) {
+ CheckTrustedTypesViolation("chrome://devices");
+}
+
+// Verify that there's no Trusted Types violation in chrome://gcm-internals
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInGCMInternals) {
+ CheckTrustedTypesViolation("chrome://gcm-internals");
+}
+
+// Verify that there's no Trusted Types violation in chrome://inspect
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInInspect) {
+ CheckTrustedTypesViolation("chrome://inspect");
+}
+
+// Verify that there's no Trusted Types violation in chrome://local-state
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInLocalState) {
+ CheckTrustedTypesViolation("chrome://local-state");
+}
+
+// Verify that there's no Trusted Types violation in chrome://net-export
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInNetExport) {
+ CheckTrustedTypesViolation("chrome://net-export");
+}
+
+// Verify that there's no Trusted Types violation in chrome://policy
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInPolicy) {
+ CheckTrustedTypesViolation("chrome://policy");
+}
+
+// Verify that there's no Trusted Types violation in chrome://predictors
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInPredictors) {
+ CheckTrustedTypesViolation("chrome://predictors");
+}
+
+// Verify that there's no Trusted Types violation in chrome://prefs-internals
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInPrefsInternals) {
+ CheckTrustedTypesViolation("chrome://prefs-internals");
+}
+
+// Verify that there's no Trusted Types violation in chrome://sandbox
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInSandbox) {
+ CheckTrustedTypesViolation("chrome://sandbox");
+}
+
+// Verify that there's no Trusted Types violation in chrome://suggestions
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInSuggestions) {
+ CheckTrustedTypesViolation("chrome://suggestions");
+}
+
+// Verify that there's no Trusted Types violation in chrome://terms
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInTerms) {
+ CheckTrustedTypesViolation("chrome://terms");
+}
+
+// Verify that there's no Trusted Types violation in chrome://user-actions
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInUserActions) {
+ CheckTrustedTypesViolation("chrome://user-actions");
+}
+
+// Verify that there's no Trusted Types violation in chrome://webrtc-logs
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInWebrtcLogs) {
+ CheckTrustedTypesViolation("chrome://webrtc-logs");
+}
+
+// Verify that there's no Trusted Types violation in chrome://autofill-internals
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInAutofillInternals) {
+ CheckTrustedTypesViolation("chrome://autofill-internals");
+}
+
+// Verify that there's no Trusted Types violation in
+// chrome://password-manager-internals
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInPasswordManagerInternals) {
+ CheckTrustedTypesViolation("chrome://password-manager-internals");
+}
+
+// Verify that there's no Trusted Types violation in chrome://media-internals
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInMediaInternals) {
+ CheckTrustedTypesViolation("chrome://media-internals");
+}
+
+// Verify that there's no Trusted Types violation in chrome://histograms
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInHistograms) {
+ CheckTrustedTypesViolation("chrome://histograms");
+}
+
+// Verify that there's no Trusted Types violation in chrome://accessibility
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInAccessibility) {
+ CheckTrustedTypesViolation("chrome://accessibility");
+}
+
+// Verify that there's no Trusted Types violation in chrome://process-internals
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInProcessInternals) {
+ CheckTrustedTypesViolation("chrome://process-internals");
+}
+
+// Verify that there's no Trusted Types violation in chrome://credits
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInCredits) {
+ CheckTrustedTypesViolation("chrome://credits");
+}
+
+// Verify that there's no Trusted Types violation in
+// chrome://bluetooth-internals
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInBluetoothInternals) {
+ CheckTrustedTypesViolation("chrome://bluetooth-internals");
+}
+
+// Verify that there's no Trusted Types violation in chrome://media-engagement
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInMediaEngagement) {
+ CheckTrustedTypesViolation("chrome://media-engagement");
+}
+
+// Verify that there's no Trusted Types violation in chrome://site-engagement
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInSiteEngagement) {
+ CheckTrustedTypesViolation("chrome://site-engagement");
+}
+
+// Verify that there's no Trusted Types violation in
+// chrome://translate-internals
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInTranslateInternals) {
+ CheckTrustedTypesViolation("chrome://translate-internals");
+}
+
+// Verify that there's no Trusted Types violation in chrome://system
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInSystem) {
+ CheckTrustedTypesViolation("chrome://system");
+}
+
+// Verify that there's no Trusted Types violation in chrome://usb-internals
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInUSBInternals) {
+ CheckTrustedTypesViolation("chrome://usb-internals");
+}
+
+// Verify that there's no Trusted Types violation in
+// chrome://interventions-internals
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInInterventionsInternals) {
+ CheckTrustedTypesViolation("chrome://interventions-internals");
+}
+
+// Verify that there's no Trusted Types violation in chrome://version
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInVersion) {
+ CheckTrustedTypesViolation("chrome://version");
+}
+
+// Verify that there's no Trusted Types violation in chrome://quota-internals
+IN_PROC_BROWSER_TEST_F(
+ ChromeURLDataManagerTestWithWebUIReportOnlyTrustedTypesEnabled,
+ NoTrustedTypesViolationInQuotaInternals) {
+ CheckTrustedTypesViolation("chrome://quota-internals");
+}
diff --git a/chromium/chrome/browser/ui/webui/chrome_url_disabled_ui.cc b/chromium/chrome/browser/ui/webui/chrome_url_disabled_ui.cc
index 4f9e4c1a239..2338aa074a6 100644
--- a/chromium/chrome/browser/ui/webui/chrome_url_disabled_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chrome_url_disabled_ui.cc
@@ -5,15 +5,15 @@
#include "chrome/browser/ui/webui/chrome_url_disabled_ui.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/common/webui_url_constants.h"
#include "chrome/grit/browser_resources.h"
#include "components/strings/grit/components_strings.h"
#include "content/public/browser/web_ui_data_source.h"
-ChromeURLDisabledUI::ChromeURLDisabledUI(content::WebUI* web_ui,
- const std::string& host_name)
+ChromeURLDisabledUI::ChromeURLDisabledUI(content::WebUI* web_ui)
: content::WebUIController(web_ui), weak_factory_(this) {
content::WebUIDataSource* html_source =
- content::WebUIDataSource::Create(host_name);
+ content::WebUIDataSource::Create(chrome::kChromeUIAppDisabledHost);
html_source->UseStringsJs();
diff --git a/chromium/chrome/browser/ui/webui/chrome_url_disabled_ui.h b/chromium/chrome/browser/ui/webui/chrome_url_disabled_ui.h
index 96354ee890d..54962c12904 100644
--- a/chromium/chrome/browser/ui/webui/chrome_url_disabled_ui.h
+++ b/chromium/chrome/browser/ui/webui/chrome_url_disabled_ui.h
@@ -11,8 +11,7 @@
// For chrome:://.* error page when disabled by admin policy.
class ChromeURLDisabledUI : public content::WebUIController {
public:
- explicit ChromeURLDisabledUI(content::WebUI* web_ui,
- const std::string& host_name);
+ explicit ChromeURLDisabledUI(content::WebUI* web_ui);
~ChromeURLDisabledUI() override;
private:
diff --git a/chromium/chrome/browser/ui/webui/chrome_web_contents_handler.cc b/chromium/chrome/browser/ui/webui/chrome_web_contents_handler.cc
index 73aa8494ac6..4c25d8ee19f 100644
--- a/chromium/chrome/browser/ui/webui/chrome_web_contents_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chrome_web_contents_handler.cc
@@ -77,6 +77,7 @@ void ChromeWebContentsHandler::AddNewContents(
content::BrowserContext* context,
WebContents* source,
std::unique_ptr<WebContents> new_contents,
+ const GURL& target_url,
WindowOpenDisposition disposition,
const gfx::Rect& initial_rect,
bool user_gesture) {
diff --git a/chromium/chrome/browser/ui/webui/chrome_web_contents_handler.h b/chromium/chrome/browser/ui/webui/chrome_web_contents_handler.h
index 7833ce661b0..fefd9a407de 100644
--- a/chromium/chrome/browser/ui/webui/chrome_web_contents_handler.h
+++ b/chromium/chrome/browser/ui/webui/chrome_web_contents_handler.h
@@ -23,6 +23,7 @@ class ChromeWebContentsHandler
void AddNewContents(content::BrowserContext* context,
content::WebContents* source,
std::unique_ptr<content::WebContents> new_contents,
+ const GURL& target_url,
WindowOpenDisposition disposition,
const gfx::Rect& initial_rect,
bool user_gesture) override;
diff --git a/chromium/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chromium/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
index 7f7d97c607f..525c874c05e 100644
--- a/chromium/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+++ b/chromium/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -18,7 +18,6 @@
#include "chrome/browser/buildflags.h"
#include "chrome/browser/devtools/devtools_ui_bindings.h"
#include "chrome/browser/engagement/site_engagement_service.h"
-#include "chrome/browser/media/feeds/media_feeds_service.h"
#include "chrome/browser/media/history/media_history_keyed_service.h"
#include "chrome/browser/media/media_engagement_service.h"
#include "chrome/browser/profiles/profile.h"
@@ -28,6 +27,7 @@
#include "chrome/browser/ui/webui/autofill_and_password_manager_internals/autofill_internals_ui.h"
#include "chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui.h"
#include "chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.h"
+#include "chrome/browser/ui/webui/chrome_url_disabled_ui.h"
#include "chrome/browser/ui/webui/chromeos/account_manager_error_ui.h"
#include "chrome/browser/ui/webui/chromeos/account_manager_welcome_ui.h"
#include "chrome/browser/ui/webui/chromeos/account_migration_welcome_ui.h"
@@ -119,16 +119,6 @@
#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui.h"
#endif
-#if !defined(OS_ANDROID)
-#include "chrome/browser/media/router/media_router_feature.h"
-#include "chrome/browser/ui/webui/management_ui.h"
-#include "chrome/browser/ui/webui/media_router/media_router_internals_ui.h"
-#include "chrome/browser/ui/webui/web_footer_experiment_ui.h"
-#endif
-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
-#include "chrome/browser/ui/webui/cast/cast_ui.h"
-#endif
-
#if defined(OS_ANDROID)
#include "chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals_ui.h"
#include "chrome/browser/ui/webui/offline/offline_internals_ui.h"
@@ -140,18 +130,23 @@
#include "chrome/browser/ui/webui/feed_internals/feed_internals_ui.h"
#endif // BUILDFLAG(ENABLE_FEED_IN_CHROME)
#else // defined(OS_ANDROID)
+#include "chrome/browser/media/feeds/media_feeds_service.h"
+#include "chrome/browser/media/router/media_router_feature.h"
#include "chrome/browser/ui/webui/bookmarks/bookmarks_ui.h"
#include "chrome/browser/ui/webui/devtools_ui.h"
#include "chrome/browser/ui/webui/downloads/downloads_ui.h"
#include "chrome/browser/ui/webui/history/history_ui.h"
#include "chrome/browser/ui/webui/inspect_ui.h"
#include "chrome/browser/ui/webui/management_ui.h"
+#include "chrome/browser/ui/webui/media_router/media_router_internals_ui.h"
#include "chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.h"
#include "chrome/browser/ui/webui/ntp/new_tab_ui.h"
#include "chrome/browser/ui/webui/page_not_available_for_guest/page_not_available_for_guest_ui.h"
+#include "chrome/browser/ui/webui/signin/inline_login_ui.h"
#include "chrome/browser/ui/webui/signin/sync_confirmation_ui.h"
#include "chrome/browser/ui/webui/sync_file_system_internals/sync_file_system_internals_ui.h"
#include "chrome/browser/ui/webui/system_info_ui.h"
+#include "chrome/browser/ui/webui/web_footer_experiment_ui.h"
#endif // defined(OS_ANDROID)
#if defined(OS_CHROMEOS)
@@ -160,6 +155,8 @@
#include "chrome/browser/chromeos/login/easy_unlock/easy_unlock_service.h"
#include "chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_factory.h"
#include "chrome/browser/chromeos/multidevice_setup/multidevice_setup_service_factory.h"
+#include "chrome/browser/chromeos/printing/print_management/printing_manager.h"
+#include "chrome/browser/chromeos/printing/print_management/printing_manager_factory.h"
#include "chrome/browser/chromeos/secure_channel/secure_channel_client_provider.h"
#include "chrome/browser/chromeos/web_applications/chrome_help_app_ui_delegate.h"
#include "chrome/browser/chromeos/web_applications/chrome_media_app_ui_delegate.h"
@@ -189,7 +186,6 @@
#include "chrome/browser/ui/webui/chromeos/smb_shares/smb_share_dialog.h"
#include "chrome/browser/ui/webui/chromeos/sys_internals/sys_internals_ui.h"
#include "chrome/browser/ui/webui/settings/chromeos/os_settings_ui.h"
-#include "chrome/browser/ui/webui/signin/inline_login_ui.h"
#include "chromeos/components/help_app_ui/help_app_ui.h"
#include "chromeos/components/help_app_ui/url_constants.h"
#include "chromeos/components/media_app_ui/media_app_guest_ui.h"
@@ -198,9 +194,7 @@
#include "chromeos/components/multidevice/debug_webui/proximity_auth_ui.h"
#include "chromeos/components/multidevice/debug_webui/url_constants.h"
#include "chromeos/components/print_management/print_management_ui.h"
-#include "chromeos/components/print_management/scanning_ui.h"
#include "chromeos/components/print_management/url_constants.h"
-#include "chromeos/components/sample_system_web_app_ui/url_constants.h"
#include "chromeos/constants/chromeos_features.h"
#include "chromeos/constants/chromeos_switches.h"
#include "chromeos/services/multidevice_setup/multidevice_setup_service.h"
@@ -211,6 +205,7 @@
#if defined(OS_CHROMEOS) && !defined(OFFICIAL_BUILD)
#include "chrome/browser/ui/webui/chromeos/emulator/device_emulator_ui.h"
#include "chromeos/components/sample_system_web_app_ui/sample_system_web_app_ui.h"
+#include "chromeos/components/sample_system_web_app_ui/url_constants.h"
#endif
#if !defined(OS_CHROMEOS)
@@ -219,8 +214,9 @@
#if !defined(OS_CHROMEOS) && !defined(OS_ANDROID)
#include "chrome/browser/ui/sync/sync_promo_ui.h"
+#include "chrome/browser/ui/ui_features.h"
#include "chrome/browser/ui/webui/browser_switch/browser_switch_ui.h"
-#include "chrome/browser/ui/webui/signin/inline_login_ui.h"
+#include "chrome/browser/ui/webui/signin/profile_picker_ui.h"
#include "chrome/browser/ui/webui/signin/signin_email_confirmation_ui.h"
#include "chrome/browser/ui/webui/signin/signin_error_ui.h"
#include "chrome/browser/ui/webui/signin/user_manager_ui.h"
@@ -318,6 +314,28 @@ WebUIController* NewWebUI<chromeos::MediaAppUI>(WebUI* web_ui,
return new chromeos::MediaAppUI(web_ui, std::move(delegate));
}
+void BindPrintManagement(
+ Profile* profile,
+ mojo::PendingReceiver<
+ chromeos::printing::printing_manager::mojom::PrintingMetadataProvider>
+ receiver) {
+ chromeos::printing::print_management::PrintingManager* handler =
+ chromeos::printing::print_management::PrintingManagerFactory::
+ GetForProfile(profile);
+ if (handler)
+ handler->BindInterface(std::move(receiver));
+}
+
+template <>
+WebUIController*
+NewWebUI<chromeos::printing::printing_manager::PrintManagementUI>(
+ WebUI* web_ui,
+ const GURL& url) {
+ return new chromeos::printing::printing_manager::PrintManagementUI(
+ web_ui,
+ base::BindRepeating(&BindPrintManagement, Profile::FromWebUI(web_ui)));
+}
+
void BindMultiDeviceSetup(
Profile* profile,
mojo::PendingReceiver<chromeos::multidevice_setup::mojom::MultiDeviceSetup>
@@ -343,7 +361,7 @@ WebUIController* NewWebUI<chromeos::multidevice::ProximityAuthUI>(
->GetClient(),
base::BindRepeating(&BindMultiDeviceSetup, Profile::FromWebUI(web_ui)));
}
-#endif
+#endif // defined(OS_CHROMEOS)
#if !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
template <>
@@ -376,10 +394,8 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* web_ui,
const GURL& url) {
// This will get called a lot to check all URLs, so do a quick check of other
// schemes to filter out most URLs.
- if (!url.SchemeIs(content::kChromeDevToolsScheme) &&
- !url.SchemeIs(content::kChromeUIScheme)) {
+ if (!content::HasWebUIScheme(url))
return nullptr;
- }
// Please keep this in alphabetical order. If #ifs or special logics are
// required, add it below in the appropriate section.
@@ -393,6 +409,12 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* web_ui,
return &NewWebUI<AccessibilityUI>;
if (url.host_piece() == chrome::kChromeUIAutofillInternalsHost)
return &NewWebUI<AutofillInternalsUI>;
+
+#if defined(OS_CHROMEOS)
+ if (url.host_piece() == chrome::kChromeUIAppDisabledHost)
+ return &NewWebUI<ChromeURLDisabledUI>;
+#endif // defined(OS_CHROMEOS)
+
if (url.host_piece() == chrome::kChromeUIBluetoothInternalsHost)
return &NewWebUI<BluetoothInternalsUI>;
if (url.host_piece() == chrome::kChromeUIComponentsHost)
@@ -587,11 +609,7 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* web_ui,
if (base::FeatureList::IsEnabled(
chromeos::features::kPrintJobManagementApp) &&
url.host_piece() == chromeos::kChromeUIPrintManagementHost)
- return &NewWebUI<chromeos::PrintManagementUI>;
- if (base::FeatureList::IsEnabled(chromeos::features::kScanningUI) &&
- url.host_piece() == chromeos::kChromeUIScanningHost) {
- return &NewWebUI<chromeos::ScanningUI>;
- }
+ return &NewWebUI<chromeos::printing::printing_manager::PrintManagementUI>;
if (base::FeatureList::IsEnabled(chromeos::features::kMediaApp)) {
if (url.host_piece() == chromeos::kChromeUIMediaAppHost)
return &NewWebUI<chromeos::MediaAppUI>;
@@ -676,6 +694,11 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* web_ui,
}
#endif // defined(OS_ANDROID)
#if !defined(OS_CHROMEOS) && !defined(OS_ANDROID)
+ if (url.host_piece() == chrome::kChromeUIProfilePickerHost &&
+ base::FeatureList::IsEnabled(features::kNewProfilePicker)) {
+ return &NewWebUI<ProfilePickerUI>;
+ }
+
if (url.host_piece() == chrome::kChromeUIMdUserManagerHost)
return &NewWebUI<UserManagerUI>;
if (url.host_piece() == chrome::kChromeUISigninErrorHost &&
@@ -719,8 +742,14 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* web_ui,
#endif
#if BUILDFLAG(ENABLE_PRINT_PREVIEW)
- if (url.host_piece() == chrome::kChromeUIPrintHost &&
- !profile->GetPrefs()->GetBoolean(prefs::kPrintPreviewDisabled)) {
+ if (url.host_piece() == chrome::kChromeUIPrintHost) {
+ if (profile->GetPrefs()->GetBoolean(prefs::kPrintPreviewDisabled))
+ return nullptr;
+ // Filter out iframes that just display the preview PDF. Ideally, this would
+ // filter out anything other than chrome://print/, but that does not work
+ // for PrintPreviewUI tests that inject test_loader.html.
+ if (url.path() == "/pdf/index.html")
+ return nullptr;
return &NewWebUI<printing::PrintPreviewUI>;
}
#endif
@@ -744,12 +773,6 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* web_ui,
return &NewWebUI<media_router::MediaRouterInternalsUI>;
}
#endif
-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
- if (url.host_piece() == chrome::kChromeUICastHost &&
- media_router::MediaRouterEnabled(profile)) {
- return &NewWebUI<CastUI>;
- }
-#endif
#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_ANDROID)
if (url.host_piece() == chrome::kChromeUISandboxHost) {
return &NewWebUI<SandboxInternalsUI>;
@@ -781,10 +804,12 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* web_ui,
return &NewWebUI<MediaEngagementUI>;
}
+#if !defined(OS_ANDROID)
if (media_feeds::MediaFeedsService::IsEnabled() &&
url.host_piece() == chrome::kChromeUIMediaFeedsHost) {
return &NewWebUI<MediaFeedsUI>;
}
+#endif
if (media_history::MediaHistoryKeyedService::IsEnabled() &&
url.host_piece() == chrome::kChromeUIMediaHistoryHost) {
@@ -870,8 +895,8 @@ void ChromeWebUIControllerFactory::GetFaviconForURL(
ui::GetSupportedScaleFactors();
std::vector<gfx::Size> candidate_sizes;
- for (size_t i = 0; i < resource_scale_factors.size(); ++i) {
- float scale = ui::GetScaleForScaleFactor(resource_scale_factors[i]);
+ for (auto scale_factor : resource_scale_factors) {
+ float scale = ui::GetScaleForScaleFactor(scale_factor);
// Assume that GetFaviconResourceBytes() returns favicons which are
// |gfx::kFaviconSize| x |gfx::kFaviconSize| DIP.
int candidate_edge_size =
@@ -882,8 +907,7 @@ void ChromeWebUIControllerFactory::GetFaviconForURL(
std::vector<size_t> selected_indices;
SelectFaviconFrameIndices(candidate_sizes, desired_sizes_in_pixel,
&selected_indices, nullptr);
- for (size_t i = 0; i < selected_indices.size(); ++i) {
- size_t selected_index = selected_indices[i];
+ for (size_t selected_index : selected_indices) {
ui::ScaleFactor selected_resource_scale =
resource_scale_factors[selected_index];
@@ -931,12 +955,14 @@ bool ChromeWebUIControllerFactory::IsWebUIAllowedToMakeNetworkRequests(
// https://crbug.com/831813
origin.host() == chrome::kChromeUIInspectHost ||
// https://crbug.com/859345
- origin.host() == chrome::kChromeUIDownloadsHost;
+ origin.host() == chrome::kChromeUIDownloadsHost ||
+ // TODO(crbug.com/1076506): remove when change to iframed OneGoogleBar.
+ origin.host() == chrome::kChromeUINewTabPageHost;
}
-ChromeWebUIControllerFactory::ChromeWebUIControllerFactory() {}
+ChromeWebUIControllerFactory::ChromeWebUIControllerFactory() = default;
-ChromeWebUIControllerFactory::~ChromeWebUIControllerFactory() {}
+ChromeWebUIControllerFactory::~ChromeWebUIControllerFactory() = default;
base::RefCountedMemory* ChromeWebUIControllerFactory::GetFaviconResourceBytes(
const GURL& page_url,
diff --git a/chromium/chrome/browser/ui/webui/chrome_webui_navigation_browsertest.cc b/chromium/chrome/browser/ui/webui/chrome_webui_navigation_browsertest.cc
index d78bd9681b0..52c3b47241d 100644
--- a/chromium/chrome/browser/ui/webui/chrome_webui_navigation_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/chrome_webui_navigation_browsertest.cc
@@ -9,6 +9,7 @@
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/common/url_constants.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
#include "content/public/test/web_ui_browsertest_util.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/account_manager_welcome_dialog.cc b/chromium/chrome/browser/ui/webui/chromeos/account_manager_welcome_dialog.cc
index 254f9e96092..b17dd07fe5f 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/account_manager_welcome_dialog.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/account_manager_welcome_dialog.cc
@@ -6,11 +6,12 @@
#include <string>
-#include "base/logging.h"
+#include "base/check_op.h"
#include "chrome/browser/lifetime/application_lifetime.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/settings_window_manager_chromeos.h"
+#include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/webui_url_constants.h"
#include "components/prefs/pref_service.h"
@@ -50,8 +51,11 @@ bool AccountManagerWelcomeDialog::ShowIfRequired() {
}
// Check if the dialog should be shown.
+ // It should not be shown in kiosk mode since there are no actual accounts to
+ // manage, but the service account.
if (user_manager::UserManager::Get()
- ->IsCurrentUserCryptohomeDataEphemeral()) {
+ ->IsCurrentUserCryptohomeDataEphemeral() ||
+ user_manager::UserManager::Get()->IsLoggedInAsAnyKioskApp()) {
return false;
}
PrefService* pref_service =
@@ -82,7 +86,8 @@ void AccountManagerWelcomeDialog::OnDialogClosed(
// Opening Settings during shutdown leads to a crash.
if (!chrome::IsAttemptingShutdown()) {
chrome::SettingsWindowManager::GetInstance()->ShowOSSettings(
- ProfileManager::GetActiveUserProfile(), chrome::kAccountManagerSubPage);
+ ProfileManager::GetActiveUserProfile(),
+ chromeos::settings::mojom::kMyAccountsSubpagePath);
}
SystemWebDialogDelegate::OnDialogClosed(json_retval);
diff --git a/chromium/chrome/browser/ui/webui/chromeos/account_migration_welcome_dialog.cc b/chromium/chrome/browser/ui/webui/chromeos/account_migration_welcome_dialog.cc
index d387299dd67..aeb9b5bfaa6 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/account_migration_welcome_dialog.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/account_migration_welcome_dialog.cc
@@ -7,7 +7,6 @@
#include <string>
#include "base/json/json_writer.h"
-#include "base/logging.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/settings_window_manager_chromeos.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/account_migration_welcome_test.js b/chromium/chrome/browser/ui/webui/chromeos/account_migration_welcome_test.js
index b9918313a13..7c8a1f74674 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/account_migration_welcome_test.js
+++ b/chromium/chrome/browser/ui/webui/chromeos/account_migration_welcome_test.js
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+GEN('#include "content/public/test/browser_test.h"');
+
/**
* Test fixture for generated tests.
* @extends {testing.Test}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/account_migration_welcome_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/account_migration_welcome_ui.cc
index 3c486f344a0..12b79aaed4a 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/account_migration_welcome_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/account_migration_welcome_ui.cc
@@ -54,7 +54,9 @@ class MigrationMessageHandler : public content::WebUIMessageHandler {
CHECK(!args->GetList().empty());
const std::string& account_email = args->GetList()[0].GetString();
- InlineLoginHandlerDialogChromeOS::Show(account_email);
+ InlineLoginHandlerDialogChromeOS::Show(
+ account_email, InlineLoginHandlerDialogChromeOS::Source::
+ kAccountManagerMigrationWelcomeScreen);
HandleCloseDialog(args);
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder.cc b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder.cc
index 3681eee93fe..d9412ba6c0d 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder.cc
@@ -4,7 +4,7 @@
#include "chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder.h"
-#include "base/logging.h"
+#include "base/check.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/user_metrics.h"
#include "base/time/default_tick_clock.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder.h b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder.h
index 600f4b87324..540c3141f34 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder.h
@@ -5,6 +5,7 @@
#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_ADD_SUPERVISION_ADD_SUPERVISION_METRICS_RECORDER_H_
#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_ADD_SUPERVISION_ADD_SUPERVISION_METRICS_RECORDER_H_
+#include "base/macros.h"
#include "base/no_destructor.h"
#include "base/time/time.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder_browsertest.cc b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder_browsertest.cc
index a37d2babefa..f40482ce03d 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder_browsertest.cc
@@ -15,6 +15,7 @@
#include "chrome/test/base/in_process_browser_test.h"
#include "chromeos/constants/chromeos_features.h"
#include "components/signin/public/identity_manager/identity_test_environment.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_web_ui.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui_browsertest.cc b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui_browsertest.cc
index 6d23c70d104..7e7fde7f98c 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui_browsertest.cc
@@ -18,6 +18,7 @@
#include "chromeos/constants/chromeos_features.h"
#include "components/signin/public/identity_manager/identity_test_environment.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/network_connection_change_simulator.h"
#include "third_party/cros_system_api/dbus/service_constants.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.cc
index a94dae7c438..d74e24d8ba0 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.cc
@@ -22,7 +22,7 @@
#include "chrome/grit/browser_resources.h"
#include "chromeos/assistant/buildflags.h"
#include "chromeos/services/assistant/public/cpp/assistant_prefs.h"
-#include "chromeos/services/assistant/public/features.h"
+#include "chromeos/services/assistant/public/cpp/features.h"
#include "components/prefs/pref_service.h"
#include "components/session_manager/core/session_manager.h"
#include "content/public/browser/host_zoom_map.h"
@@ -66,11 +66,6 @@ GURL CreateAssistantOptInURL(ash::FlowType type) {
return gurl;
}
-void DisablePolymer2(content::URLDataSource* shared_source) {
- if (shared_source)
- shared_source->DisablePolymer2ForHost(chrome::kChromeUIAssistantOptInHost);
-}
-
} // namespace
AssistantOptInUI::AssistantOptInUI(content::WebUI* web_ui)
@@ -112,10 +107,12 @@ AssistantOptInUI::AssistantOptInUI(content::WebUI* web_ui)
// TODO (https://crbug.com/739611): Remove this exception by migrating to
// Polymer 2.
if (base::FeatureList::IsEnabled(features::kWebUIPolymer2Exceptions)) {
- content::URLDataSource::GetSourceForURL(
+ auto* shared_source = content::URLDataSource::GetSourceForURL(
Profile::FromWebUI(web_ui),
- GURL("chrome://resources/polymer/v1_0/polymer/polymer.html"),
- base::BindOnce(DisablePolymer2));
+ GURL("chrome://resources/polymer/v1_0/polymer/polymer.html"));
+ if (shared_source)
+ shared_source->DisablePolymer2ForHost(
+ chrome::kChromeUIAssistantOptInHost);
}
}
@@ -143,7 +140,7 @@ void AssistantOptInDialog::Show(
// Check Assistant allowed state.
if (::assistant::IsAssistantAllowedForProfile(
ProfileManager::GetActiveUserProfile()) !=
- ash::mojom::AssistantAllowedState::ALLOWED) {
+ chromeos::assistant::AssistantAllowedState::ALLOWED) {
std::move(callback).Run(false);
return;
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc b/chromium/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc
index ca213a49b56..a9d21660ec6 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc
@@ -14,7 +14,7 @@
#include "chrome/grit/generated_resources.h"
#include "chromeos/audio/cras_audio_handler.h"
#include "chromeos/services/assistant/public/cpp/assistant_prefs.h"
-#include "chromeos/services/assistant/public/features.h"
+#include "chromeos/services/assistant/public/cpp/features.h"
#include "components/arc/arc_prefs.h"
#include "components/consent_auditor/consent_auditor.h"
#include "components/prefs/pref_service.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog_browsertest-inl.h b/chromium/chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog_browsertest-inl.h
index 3a39cb5c7ab..cab68374347 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog_browsertest-inl.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog_browsertest-inl.h
@@ -7,6 +7,7 @@
#include "chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog.h"
#include "chrome/test/base/web_ui_browser_test.h"
#include "content/public/browser/web_ui.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "device/bluetooth/bluetooth_adapter_factory.h"
#include "device/bluetooth/test/mock_bluetooth_adapter.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/camera/camera_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/camera/camera_ui.cc
index 7a9dfa6bb52..9906f67c75e 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/camera/camera_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/camera/camera_ui.cc
@@ -9,6 +9,7 @@
#include "base/bind.h"
#include "base/feature_list.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/webui_util.h"
#include "chrome/browser/web_applications/system_web_app_manager.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/browser_resources.h"
@@ -27,33 +28,31 @@ content::WebUIDataSource* CreateCameraUIHTMLSource() {
content::WebUIDataSource::Create(chrome::kChromeUICameraHost);
// Add all settings resources.
- for (size_t i = 0; i < kCameraResourcesSize; ++i) {
- source->AddResourcePath(kCameraResources[i].name,
- kCameraResources[i].value);
- }
-
- // Add WebUI version of the CCA browser proxy.
- source->AddResourcePath("src/js/browser_proxy/browser_proxy.js",
- IDR_CAMERA_WEBUI_BROWSER_PROXY);
-
- // Add mojom-lite files under expected paths.
- source->AddResourcePath("src/js/mojo/camera_intent.mojom-lite.js",
- IDR_CAMERA_CAMERA_INTENT_MOJOM_LITE_JS);
- source->AddResourcePath("src/js/mojo/image_capture.mojom-lite.js",
- IDR_CAMERA_IMAGE_CAPTURE_MOJOM_LITE_JS);
- source->AddResourcePath("src/js/mojo/camera_common.mojom-lite.js",
- IDR_CAMERA_CAMERA_COMMON_MOJOM_LITE_JS);
- source->AddResourcePath("src/js/mojo/camera_metadata.mojom-lite.js",
- IDR_CAMERA_CAMERA_METADATA_MOJOM_LITE_JS);
- source->AddResourcePath("src/js/mojo/camera_metadata_tags.mojom-lite.js",
- IDR_CAMERA_CAMERA_METADATA_TAGS_MOJOM_LITE_JS);
- source->AddResourcePath("src/js/mojo/camera_app.mojom-lite.js",
- IDR_CAMERA_APP_MOJOM_LITE_JS);
- source->AddResourcePath("src/js/mojo/mojo_bindings_lite.js",
- IDR_MOJO_MOJO_BINDINGS_LITE_JS);
-
- // Add System Web App resources.
- source->AddResourcePath("pwa.html", IDR_PWA_HTML);
+ webui::AddResourcePathsBulk(
+ source, base::make_span(kCameraResources, kCameraResourcesSize));
+
+ static constexpr webui::ResourcePath kAdditionalResources[] = {
+ // Add WebUI version of the CCA browser proxy.
+ {"src/js/browser_proxy/browser_proxy.js", IDR_CAMERA_WEBUI_BROWSER_PROXY},
+
+ // Add mojom-lite files under expected paths.
+ {"src/js/mojo/camera_intent.mojom-lite.js",
+ IDR_CAMERA_CAMERA_INTENT_MOJOM_LITE_JS},
+ {"src/js/mojo/image_capture.mojom-lite.js",
+ IDR_CAMERA_IMAGE_CAPTURE_MOJOM_LITE_JS},
+ {"src/js/mojo/camera_common.mojom-lite.js",
+ IDR_CAMERA_CAMERA_COMMON_MOJOM_LITE_JS},
+ {"src/js/mojo/camera_metadata.mojom-lite.js",
+ IDR_CAMERA_CAMERA_METADATA_MOJOM_LITE_JS},
+ {"src/js/mojo/camera_metadata_tags.mojom-lite.js",
+ IDR_CAMERA_CAMERA_METADATA_TAGS_MOJOM_LITE_JS},
+ {"src/js/mojo/camera_app.mojom-lite.js", IDR_CAMERA_APP_MOJOM_LITE_JS},
+ {"src/js/mojo/mojo_bindings_lite.js", IDR_MOJO_MOJO_BINDINGS_LITE_JS},
+
+ // Add System Web App resources.
+ {"pwa.html", IDR_PWA_HTML},
+ };
+ webui::AddResourcePathsBulk(source, kAdditionalResources);
source->UseStringsJs();
diff --git a/chromium/chrome/browser/ui/webui/chromeos/cellular_setup/mobile_setup_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/cellular_setup/mobile_setup_ui.cc
index 4e225777c4f..51af7fb0263 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/cellular_setup/mobile_setup_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/cellular_setup/mobile_setup_ui.cc
@@ -345,15 +345,15 @@ void MobileSetupUIHTMLSource::StartDataRequest(
// webui is used for activation flow.
std::string full_html;
if (network->activation_state() == shill::kActivationStateActivated) {
- static const base::StringPiece html_for_activated(
- ui::ResourceBundle::GetSharedInstance().GetRawDataResource(
+ static const base::NoDestructor<std::string> html_string(
+ ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(
IDR_MOBILE_SETUP_PORTAL_PAGE_HTML));
- full_html = webui::GetI18nTemplateHtml(html_for_activated, &strings);
+ full_html = webui::GetI18nTemplateHtml(*html_string, &strings);
} else {
- static const base::StringPiece html_for_non_activated(
- ui::ResourceBundle::GetSharedInstance().GetRawDataResource(
+ static const base::NoDestructor<std::string> html_string(
+ ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(
IDR_MOBILE_SETUP_PAGE_HTML));
- full_html = webui::GetI18nTemplateHtml(html_for_non_activated, &strings);
+ full_html = webui::GetI18nTemplateHtml(*html_string, &strings);
}
std::move(callback).Run(base::RefCountedString::TakeString(&full_html));
diff --git a/chromium/chrome/browser/ui/webui/chromeos/certificate_manager_dialog_browsertest.js b/chromium/chrome/browser/ui/webui/chromeos/certificate_manager_dialog_browsertest.js
index 42b78858e2c..67ba6d2ff06 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/certificate_manager_dialog_browsertest.js
+++ b/chromium/chrome/browser/ui/webui/chromeos/certificate_manager_dialog_browsertest.js
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+GEN('#include "content/public/test/browser_test.h"');
+
/**
* TestFixture for kiosk certification manager dialog WebUI testing.
* @extends {testing.Test}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/certificate_manager_dialog_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/certificate_manager_dialog_ui.cc
index 4fbfb465921..518c0a27060 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/certificate_manager_dialog_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/certificate_manager_dialog_ui.cc
@@ -8,6 +8,7 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/certificate_manager_localized_strings_provider.h"
+#include "chrome/browser/ui/webui/certificate_provisioning_ui_handler.h"
#include "chrome/browser/ui/webui/certificates_handler.h"
#include "chrome/browser/ui/webui/chromeos/bluetooth_dialog_localized_strings_provider.h"
#include "chrome/common/url_constants.h"
@@ -59,6 +60,9 @@ CertificateManagerDialogUI::CertificateManagerDialogUI(content::WebUI* web_ui)
web_ui->AddMessageHandler(
std::make_unique<certificate_manager::CertificatesHandler>());
+ web_ui->AddMessageHandler(
+ std::make_unique<
+ chromeos::cert_provisioning::CertificateProvisioningUiHandler>());
content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), source);
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer.mojom b/chromium/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer.mojom
index b2e95d941ac..e679865fb55 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer.mojom
+++ b/chromium/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer.mojom
@@ -48,6 +48,10 @@ interface Page {
// finishes.
OnCanceled();
// Used to tell the UI how much disk space is available.
+ // |is_low_space_available| indicates that there is less than the recommended
+ // amount of space available for Crostini (though enough to continue with the
+ // installation).
OnAmountOfFreeDiskSpace(array<crostini.mojom.DiskSliderTick> ticks,
- int8 default_index);
+ int8 default_index,
+ bool is_low_space_available);
};
diff --git a/chromium/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_page_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_page_handler.cc
index a92cd9390f9..0bd746d7079 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_page_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_page_handler.cc
@@ -15,18 +15,13 @@
#include "base/task/post_task.h"
#include "base/task/task_traits.h"
#include "base/task/thread_pool.h"
+#include "chrome/browser/chromeos/crostini/crostini_disk.h"
#include "chrome/browser/chromeos/crostini/crostini_installer_ui_delegate.h"
#include "chrome/browser/chromeos/crostini/crostini_types.mojom.h"
#include "chrome/browser/chromeos/crostini/crostini_util.h"
#include "chromeos/constants/chromeos_features.h"
#include "ui/base/text/bytes_formatting.h"
-namespace {
-std::string FormatBytes(const int64_t value) {
- return base::UTF16ToUTF8(ui::FormatBytes(value));
-}
-} // namespace
-
namespace chromeos {
CrostiniInstallerPageHandler::CrostiniInstallerPageHandler(
@@ -70,7 +65,9 @@ void CrostiniInstallerPageHandler::CancelBeforeStart() {
}
void CrostiniInstallerPageHandler::Close() {
- std::move(close_dialog_callback_).Run();
+ if (close_dialog_callback_) {
+ std::move(close_dialog_callback_).Run();
+ }
}
void CrostiniInstallerPageHandler::OnProgressUpdate(
@@ -98,17 +95,26 @@ void CrostiniInstallerPageHandler::RequestAmountOfFreeDiskSpace() {
}
void CrostiniInstallerPageHandler::OnAmountOfFreeDiskSpace(int64_t free_bytes) {
- std::vector<int64_t> values = crostini::GetTicksForDiskSize(
- crostini::CrostiniInstallerUIDelegate::kMinimumFreeDiskSpace, free_bytes);
-
- std::vector<crostini::mojom::DiskSliderTickPtr> ticks;
- for (const auto& val : values) {
- std::string formatted_val = FormatBytes(val);
- ticks.emplace_back(crostini::mojom::DiskSliderTick::New(val, formatted_val,
- formatted_val));
+ int64_t max_bytes = free_bytes - crostini::disk::kDiskHeadroomBytes;
+
+ if (max_bytes < crostini::disk::kMinimumDiskSizeBytes) {
+ page_->OnAmountOfFreeDiskSpace({}, 0, false);
+ return;
}
- // TODO(crbug/1043837): Pick a better default than always the minimum.
- page_->OnAmountOfFreeDiskSpace(std::move(ticks), 0);
+
+ int64_t default_size = crostini::disk::kRecommendedDiskSizeBytes;
+ if (default_size > max_bytes) {
+ // Let's adjust to the mid-point.
+ default_size = (max_bytes + crostini::disk::kMinimumDiskSizeBytes) / 2;
+ }
+
+ int default_index = 0;
+ std::vector<crostini::mojom::DiskSliderTickPtr> ticks =
+ crostini::disk::GetTicks(crostini::disk::kMinimumDiskSizeBytes,
+ default_size, max_bytes, &default_index);
+ page_->OnAmountOfFreeDiskSpace(
+ std::move(ticks), default_index,
+ max_bytes < crostini::disk::kRecommendedDiskSizeBytes);
}
} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc
index c1d13524b07..47cab7a6f56 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc
@@ -10,6 +10,7 @@
#include "base/bind_helpers.h"
#include "base/strings/string16.h"
#include "base/system/sys_info.h"
+#include "chrome/browser/chromeos/crostini/crostini_disk.h"
#include "chrome/browser/chromeos/crostini/crostini_installer.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_page_handler.h"
@@ -73,7 +74,9 @@ void AddStringResources(content::WebUIDataSource* source) {
{"cancelingMessage", IDS_CROSTINI_INSTALLER_CANCELING},
{"configureMessage", IDS_CROSTINI_INSTALLER_CONFIGURE_MESSAGE},
- {"diskSizeMessage", IDS_CROSTINI_INSTALLER_DISK_SIZE_MESSAGE},
+ {"diskSizeSubtitle", IDS_CROSTINI_INSTALLER_DISK_SIZE_SUBTITLE},
+ {"diskSizeHint", IDS_CROSTINI_INSTALLER_DISK_SIZE_HINT},
+ {"insufficientDiskError", IDS_CROSTINI_INSTALLER_INSUFFICIENT_DISK_ERROR},
{"usernameMessage", IDS_CROSTINI_INSTALLER_USERNAME_MESSAGE},
{"usernameInvalidFirstCharacterError",
IDS_CROSTINI_INSTALLER_USERNAME_INVALID_FIRST_CHARACTER_ERROR},
@@ -89,25 +92,31 @@ void AddStringResources(content::WebUIDataSource* source) {
source->AddString(
"promptTitle",
l10n_util::GetStringFUTF8(IDS_CROSTINI_INSTALLER_TITLE, device_name));
- source->AddString(
- "promptMessage",
- l10n_util::GetStringFUTF8(
- IDS_CROSTINI_INSTALLER_BODY,
- ui::FormatBytesWithUnits(
- crostini::CrostiniInstallerUIDelegate::kDownloadSizeInBytes,
- ui::DATA_UNITS_MEBIBYTE, /*show_units=*/true)));
+ source->AddString("promptMessage",
+ l10n_util::GetStringFUTF8(
+ IDS_CROSTINI_INSTALLER_BODY,
+ ui::FormatBytesWithUnits(
+ crostini::disk::kDownloadSizeBytes,
+ ui::DATA_UNITS_MEBIBYTE, /*show_units=*/true)));
source->AddString("learnMoreUrl",
std::string{chrome::kLinuxAppsLearnMoreURL} +
"&b=" + base::SysInfo::GetLsbReleaseBoard());
source->AddString(
- "insufficientDiskError",
+ "minimumFreeSpaceUnmetError",
+ l10n_util::GetStringFUTF8(
+ IDS_CROSTINI_INSTALLER_MINIMUM_FREE_SPACE_UNMET_ERROR,
+ ui::FormatBytesWithUnits(crostini::disk::kMinimumDiskSizeBytes +
+ crostini::disk::kDiskHeadroomBytes,
+ ui::DATA_UNITS_GIBIBYTE,
+ /*show_units=*/true)));
+ source->AddString(
+ "lowSpaceAvailableWarning",
l10n_util::GetStringFUTF8(
- IDS_CROSTINI_INSTALLER_INSUFFICIENT_DISK,
- ui::FormatBytesWithUnits(
- crostini::CrostiniInstallerUIDelegate::kMinimumFreeDiskSpace,
- ui::DATA_UNITS_GIBIBYTE,
- /*show_units=*/true)));
+ IDS_CROSTINI_INSTALLER_DISK_RESIZE_RECOMMENDED_WARNING,
+ ui::FormatBytesWithUnits(crostini::disk::kRecommendedDiskSizeBytes,
+ ui::DATA_UNITS_GIBIBYTE,
+ /*show_units=*/true)));
source->AddString("offlineError",
l10n_util::GetStringFUTF8(
IDS_CROSTINI_INSTALLER_OFFLINE_ERROR, device_name));
diff --git a/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_dialog.cc b/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_dialog.cc
index e5848706a81..11110bd02dc 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_dialog.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_dialog.cc
@@ -46,7 +46,11 @@ CrostiniUpgraderDialog::CrostiniUpgraderDialog(
only_run_launch_closure_on_restart_(only_run_launch_closure_on_restart),
launch_closure_{std::move(launch_closure)} {}
-CrostiniUpgraderDialog::~CrostiniUpgraderDialog() = default;
+CrostiniUpgraderDialog::~CrostiniUpgraderDialog() {
+ if (deletion_closure_for_testing_) {
+ std::move(deletion_closure_for_testing_).Run();
+ }
+}
void CrostiniUpgraderDialog::GetDialogSize(gfx::Size* size) const {
size->SetSize(::kDialogWidth, ::kDialogHeight);
@@ -65,10 +69,19 @@ void CrostiniUpgraderDialog::AdjustWidgetInitParams(
params->z_order = ui::ZOrderLevel::kNormal;
}
+void CrostiniUpgraderDialog::SetDeletionClosureForTesting(
+ base::OnceClosure deletion_closure_for_testing) {
+ deletion_closure_for_testing_ = std::move(deletion_closure_for_testing);
+}
+
bool CrostiniUpgraderDialog::CanCloseDialog() const {
// TODO(929571): If other WebUI Dialogs also need to let the WebUI control
// closing logic, we should find a more general solution.
+ if (deletion_closure_for_testing_) {
+ // Running in a test.
+ return true;
+ }
// Disallow closing without WebUI consent.
return upgrader_ui_ == nullptr || upgrader_ui_->can_close();
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_dialog.h b/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_dialog.h
index dc94be24912..7f1a2195063 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_dialog.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_dialog.h
@@ -22,6 +22,9 @@ class CrostiniUpgraderDialog : public SystemWebDialogDelegate {
static void Show(base::OnceClosure launch_closure,
bool only_run_launch_closure_on_restart = false);
+ void SetDeletionClosureForTesting(
+ base::OnceClosure deletion_closure_for_testing);
+
private:
explicit CrostiniUpgraderDialog(base::OnceClosure launch_closure,
bool only_run_launch_closure_on_restart);
@@ -37,10 +40,10 @@ class CrostiniUpgraderDialog : public SystemWebDialogDelegate {
void OnCloseContents(content::WebContents* source,
bool* out_close_dialog) override;
- private:
CrostiniUpgraderUI* upgrader_ui_ = nullptr; // Not owned.
const bool only_run_launch_closure_on_restart_;
base::OnceClosure launch_closure_;
+ base::OnceClosure deletion_closure_for_testing_;
};
} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_dialog_browsertest.cc b/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_dialog_browsertest.cc
new file mode 100644
index 00000000000..48239a18d87
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_dialog_browsertest.cc
@@ -0,0 +1,141 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_dialog.h"
+
+#include "base/feature_list.h"
+#include "base/metrics/histogram_base.h"
+#include "base/run_loop.h"
+#include "base/test/metrics/histogram_tester.h"
+#include "build/branding_buildflags.h"
+#include "chrome/browser/chromeos/crostini/crostini_manager.h"
+#include "chrome/browser/chromeos/crostini/crostini_test_helper.h"
+#include "chrome/browser/chromeos/crostini/crostini_util.h"
+#include "chrome/browser/chromeos/guest_os/guest_os_registry_service.h"
+#include "chrome/browser/chromeos/guest_os/guest_os_registry_service_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/views/crostini/crostini_browser_test_util.h"
+#include "chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader.mojom.h"
+#include "chrome/common/webui_url_constants.h"
+#include "chromeos/dbus/cicerone/cicerone_service.pb.h"
+#include "content/public/browser/web_ui.h"
+#include "content/public/test/browser_test.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+#if !BUILDFLAG(GOOGLE_CHROME_BRANDING)
+
+constexpr char kDesktopFileId[] = "test_app";
+constexpr int kDisplayId = 0;
+
+class CrostiniUpgraderDialogBrowserTest : public CrostiniDialogBrowserTest {
+ public:
+ CrostiniUpgraderDialogBrowserTest()
+ : CrostiniDialogBrowserTest(true /*register_termina*/),
+ app_id_(crostini::CrostiniTestHelper::GenerateAppId(kDesktopFileId)) {}
+
+ // DialogBrowserTest:
+ void ShowUi(const std::string& name) override {
+ chromeos::CrostiniUpgraderDialog::Show(base::DoNothing(), false);
+ }
+
+ chromeos::CrostiniUpgraderDialog* GetCrostiniUpgraderDialog() {
+ auto url = GURL{chrome::kChromeUICrostiniUpgraderUrl};
+ return reinterpret_cast<chromeos::CrostiniUpgraderDialog*>(
+ chromeos::SystemWebDialogDelegate::FindInstance(url.spec()));
+ }
+
+ void SafelyCloseDialog() {
+ auto* upgrader_dialog = GetCrostiniUpgraderDialog();
+ // Make sure the WebUI has launches sufficiently. Closing immediately would
+ // miss breakages in the underlying plumbing.
+ auto* web_contents = upgrader_dialog->GetWebUIForTest()->GetWebContents();
+ WaitForLoadFinished(web_contents);
+
+ // Now there should be enough WebUI hooked up to close properly.
+ base::RunLoop run_loop;
+ upgrader_dialog->SetDeletionClosureForTesting(run_loop.QuitClosure());
+ upgrader_dialog->Close();
+ run_loop.Run();
+ }
+
+ void ExpectDialog() {
+ // A new Widget was created in ShowUi() or since the last VerifyUi().
+ EXPECT_TRUE(crostini_manager()->GetCrostiniDialogStatus(
+ crostini::DialogType::UPGRADER));
+
+ EXPECT_NE(nullptr, GetCrostiniUpgraderDialog());
+ }
+
+ void ExpectNoDialog() {
+ // No new Widget was created in ShowUi() or since the last VerifyUi().
+ EXPECT_FALSE(crostini_manager()->GetCrostiniDialogStatus(
+ crostini::DialogType::UPGRADER));
+ // Our dialog has really been deleted.
+ EXPECT_EQ(nullptr, GetCrostiniUpgraderDialog());
+ }
+
+ void RegisterApp() {
+ vm_tools::apps::ApplicationList app_list =
+ crostini::CrostiniTestHelper::BasicAppList(
+ kDesktopFileId, crostini::kCrostiniDefaultVmName,
+ crostini::kCrostiniDefaultContainerName);
+ guest_os::GuestOsRegistryServiceFactory::GetForProfile(browser()->profile())
+ ->UpdateApplicationList(app_list);
+ }
+
+ void DowngradeOSRelease() {
+ vm_tools::cicerone::OsRelease os_release;
+ os_release.set_id("debian");
+ os_release.set_version_id("9");
+ auto container_id = crostini::DefaultContainerId();
+ crostini_manager()->SetContainerOsRelease(
+ container_id.vm_name, container_id.container_name, os_release);
+ }
+
+ const std::string& app_id() const { return app_id_; }
+
+ crostini::CrostiniManager* crostini_manager() {
+ return crostini::CrostiniManager::GetForProfile(browser()->profile());
+ }
+
+ private:
+ std::string app_id_;
+
+ DISALLOW_COPY_AND_ASSIGN(CrostiniUpgraderDialogBrowserTest);
+};
+
+IN_PROC_BROWSER_TEST_F(CrostiniUpgraderDialogBrowserTest,
+ NoDialogOnNormalStartup) {
+ base::HistogramTester histogram_tester;
+ RegisterApp();
+
+ crostini::LaunchCrostiniApp(browser()->profile(), app_id(), kDisplayId);
+ ExpectNoDialog();
+}
+
+IN_PROC_BROWSER_TEST_F(CrostiniUpgraderDialogBrowserTest, ShowsOnAppLaunch) {
+ base::HistogramTester histogram_tester;
+
+ DowngradeOSRelease();
+ RegisterApp();
+
+ crostini::LaunchCrostiniApp(browser()->profile(), app_id(), kDisplayId);
+ ExpectDialog();
+
+ SafelyCloseDialog();
+ ExpectNoDialog();
+
+ // Once only - second time we launch an app, the dialog should not appear.
+ crostini::LaunchCrostiniApp(browser()->profile(), app_id(), kDisplayId);
+ ExpectNoDialog();
+
+ histogram_tester.ExpectUniqueSample(
+ crostini::kUpgradeDialogEventHistogram,
+ static_cast<base::HistogramBase::Sample>(
+ crostini::UpgradeDialogEvent::kDialogShown),
+ 1);
+}
+
+#endif // !BUILDFLAG(GOOGLE_CHROME_BRANDING)
diff --git a/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_page_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_page_handler.cc
index 5610cbf09cf..fd13e73652c 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_page_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_page_handler.cc
@@ -105,7 +105,9 @@ void CrostiniUpgraderPageHandler::Close() {
if (launch_callback_) {
Launch();
}
- std::move(close_dialog_callback_).Run();
+ if (close_dialog_callback_) {
+ std::move(close_dialog_callback_).Run();
+ }
}
void CrostiniUpgraderPageHandler::OnUpgradeProgress(
diff --git a/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc
index fde562c2df6..8d195a25f0e 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc
@@ -53,6 +53,7 @@ void AddStringResources(content::WebUIDataSource* source) {
{"prechecksFailedTitle", IDS_CROSTINI_UPGRADER_PRECHECKS_FAILED_TITLE},
{"upgradingTitle", IDS_CROSTINI_UPGRADER_UPGRADING_TITLE},
{"restoreTitle", IDS_CROSTINI_UPGRADER_RESTORE_TITLE},
+ {"restoreSucceededTitle", IDS_CROSTINI_UPGRADER_RESTORE_SUCCEEDED_TITLE},
{"succeededTitle", IDS_CROSTINI_UPGRADER_SUCCEEDED_TITLE},
{"cancelingTitle", IDS_CROSTINI_UPGRADER_CANCELING_TITLE},
{"errorTitle", IDS_CROSTINI_UPGRADER_ERROR_TITLE},
@@ -69,6 +70,8 @@ void AddStringResources(content::WebUIDataSource* source) {
{"cancelingMessage", IDS_CROSTINI_UPGRADER_CANCELING},
{"offerRestoreMessage", IDS_CROSTINI_UPGRADER_OFFER_RESTORE_MESSAGE},
{"restoreMessage", IDS_CROSTINI_UPGRADER_RESTORE_MESSAGE},
+ {"restoreSucceededMessage",
+ IDS_CROSTINI_UPGRADER_RESTORE_SUCCEEDED_MESSAGE},
{"backupCheckboxMessage", IDS_CROSTINI_UPGRADER_BACKUP_CHECKBOX_MESSAGE},
{"backupChangeLocation", IDS_CROSTINI_UPGRADER_BACKUP_CHANGE_LOCATION},
diff --git a/chromium/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc
index 39b9f40b465..4333fb4d05c 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc
@@ -263,6 +263,10 @@ class DriveInternalsWebUIHandler : public content::WebUIMessageHandler {
base::BindRepeating(&DriveInternalsWebUIHandler::OnPeriodicUpdate,
weak_ptr_factory_.GetWeakPtr()));
web_ui()->RegisterMessageCallback(
+ "restartDrive",
+ base::BindRepeating(&DriveInternalsWebUIHandler::RestartDrive,
+ weak_ptr_factory_.GetWeakPtr()));
+ web_ui()->RegisterMessageCallback(
"resetDriveFileSystem",
base::BindRepeating(&DriveInternalsWebUIHandler::ResetDriveFileSystem,
weak_ptr_factory_.GetWeakPtr()));
@@ -284,7 +288,6 @@ class DriveInternalsWebUIHandler : public content::WebUIMessageHandler {
UpdateDriveRelatedPreferencesSection();
UpdateGCacheContentsSection();
- UpdateLocalStorageUsageSection();
UpdatePathConfigurationsSection();
UpdateConnectionStatusSection();
@@ -295,6 +298,8 @@ class DriveInternalsWebUIHandler : public content::WebUIMessageHandler {
UpdateInFlightOperationsSection();
+ UpdateDriveDebugSection();
+
// When the drive-internals page is reloaded by the reload key, the page
// content is recreated, but this WebUI object is not (instead, OnPageLoaded
// is called again). In that case, we have to forget the last sent ID here,
@@ -402,8 +407,8 @@ class DriveInternalsWebUIHandler : public content::WebUIMessageHandler {
MaybeCallJavascript("updatePathConfigurations", std::move(paths));
}
- void UpdateLocalStorageUsageSection() {
- SetSectionEnabled("local-metadata-section", true);
+ void UpdateDriveDebugSection() {
+ SetSectionEnabled("drive-debug", true);
// Propagate the amount of local free space in bytes.
base::FilePath home_path;
@@ -547,6 +552,17 @@ class DriveInternalsWebUIHandler : public content::WebUIMessageHandler {
std::move(response.second));
}
+ // Called when the "Restart Drive" button on the page is pressed.
+ void RestartDrive(const base::ListValue* args) {
+ AllowJavascript();
+
+ drive::DriveIntegrationService* integration_service =
+ GetIntegrationService();
+ if (integration_service) {
+ integration_service->RestartDrive();
+ }
+ }
+
// Called when the corresponding button on the page is pressed.
void ResetDriveFileSystem(const base::ListValue* args) {
AllowJavascript();
@@ -555,8 +571,8 @@ class DriveInternalsWebUIHandler : public content::WebUIMessageHandler {
GetIntegrationService();
if (integration_service) {
integration_service->ClearCacheAndRemountFileSystem(
- base::Bind(&DriveInternalsWebUIHandler::ResetFinished,
- weak_ptr_factory_.GetWeakPtr()));
+ base::BindOnce(&DriveInternalsWebUIHandler::ResetFinished,
+ weak_ptr_factory_.GetWeakPtr()));
}
}
@@ -632,7 +648,7 @@ class LogsZipper : public download::AllDownloadItemNotifier::Observer {
void ZipLogFiles(const std::vector<base::FilePath>& files) {
(new ZipFileCreator(
- base::BindRepeating(&LogsZipper::OnZipDone, base::Unretained(this)),
+ base::BindOnce(&LogsZipper::OnZipDone, base::Unretained(this)),
logs_directory_, files, zip_path_))
->Start(LaunchFileUtilService());
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.cc b/chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.cc
index 8e0d635e3b8..99f1d0742c2 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.cc
@@ -9,6 +9,7 @@
#include "base/bind.h"
#include "base/callback.h"
#include "base/logging.h"
+#include "base/metrics/histogram_functions.h"
#include "base/values.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part.h"
@@ -17,6 +18,7 @@
#include "chrome/browser/profiles/profile_key.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/signin/identity_manager_factory.h"
+#include "chrome/browser/ui/webui/signin/inline_login_handler_dialog_chromeos.h"
#include "chromeos/components/account_manager/account_manager.h"
#include "chromeos/components/account_manager/account_manager_factory.h"
#include "components/image_fetcher/core/image_fetcher_service.h"
@@ -53,6 +55,12 @@ constexpr net::NetworkTrafficAnnotationTag traffic_annotation =
setting: "This feature cannot be disabled by settings."
policy_exception_justification: "Not implemented."
})");
+constexpr char kFetchParentsListResultHistogram[] =
+ "AccountManager.EduCoexistence.FetchParentsListResult";
+constexpr char kFetchAccessTokenResultHistogram[] =
+ "AccountManager.EduCoexistence.FetchAccessTokenResult";
+constexpr char kCreateRaptResultHistogram[] =
+ "AccountManager.EduCoexistence.CreateRaptResult";
} // namespace
EduAccountLoginHandler::EduAccountLoginHandler(
@@ -96,7 +104,7 @@ void EduAccountLoginHandler::ProfileImageFetcher::FetchProfileImage(
true /* no_silhouette */));
image_fetcher_->FetchImage(
image_url_with_size,
- base::BindRepeating(
+ base::BindOnce(
&EduAccountLoginHandler::ProfileImageFetcher::OnImageFetched,
weak_ptr_factory_.GetWeakPtr(), obfuscated_gaia_id),
std::move(params));
@@ -121,6 +129,11 @@ void EduAccountLoginHandler::RegisterMessages() {
"parentSignin",
base::BindRepeating(&EduAccountLoginHandler::HandleParentSignin,
base::Unretained(this)));
+ web_ui()->RegisterMessageCallback(
+ "updateEduCoexistenceFlowResult",
+ base::BindRepeating(
+ &EduAccountLoginHandler::HandleUpdateEduCoexistenceFlowResult,
+ base::Unretained(this)));
}
void EduAccountLoginHandler::OnJavascriptDisallowed() {
@@ -173,6 +186,20 @@ void EduAccountLoginHandler::HandleParentSignin(const base::ListValue* args) {
FetchAccessToken(obfuscated_gaia_id, password);
}
+void EduAccountLoginHandler::HandleUpdateEduCoexistenceFlowResult(
+ const base::ListValue* args) {
+ AllowJavascript();
+
+ const base::Value::ConstListView& args_list = args->GetList();
+ CHECK_EQ(args_list.size(), 1u);
+ int result = args_list[0].GetInt();
+ DCHECK(result <= static_cast<int>(InlineLoginHandlerDialogChromeOS::
+ EduCoexistenceFlowResult::kMaxValue));
+ InlineLoginHandlerDialogChromeOS::UpdateEduCoexistenceFlowResult(
+ static_cast<InlineLoginHandlerDialogChromeOS::EduCoexistenceFlowResult>(
+ result));
+}
+
void EduAccountLoginHandler::FetchFamilyMembers() {
DCHECK(!family_fetcher_);
Profile* profile = Profile::FromWebUI(web_ui());
@@ -242,6 +269,8 @@ void EduAccountLoginHandler::FetchReAuthProofTokenForParent(
void EduAccountLoginHandler::OnGetFamilyMembersSuccess(
const std::vector<FamilyInfoFetcher::FamilyMember>& members) {
+ base::UmaHistogramEnumeration(kFetchParentsListResultHistogram,
+ FamilyInfoFetcher::ErrorCode::kSuccess);
family_fetcher_.reset();
base::ListValue parents;
std::map<std::string, GURL> profile_image_urls;
@@ -266,6 +295,7 @@ void EduAccountLoginHandler::OnGetFamilyMembersSuccess(
}
void EduAccountLoginHandler::OnFailure(FamilyInfoFetcher::ErrorCode error) {
+ base::UmaHistogramEnumeration(kFetchParentsListResultHistogram, error);
family_fetcher_.reset();
RejectJavascriptCallback(base::Value(get_parents_callback_id_),
base::ListValue());
@@ -305,6 +335,8 @@ void EduAccountLoginHandler::CreateReAuthProofTokenForParent(
const std::string& parent_credential,
GoogleServiceAuthError error,
signin::AccessTokenInfo access_token_info) {
+ base::UmaHistogramEnumeration(kFetchAccessTokenResultHistogram, error.state(),
+ GoogleServiceAuthError::NUM_STATES);
access_token_fetcher_.reset();
if (error.state() != GoogleServiceAuthError::NONE) {
LOG(ERROR)
@@ -323,6 +355,9 @@ void EduAccountLoginHandler::CreateReAuthProofTokenForParent(
void EduAccountLoginHandler::OnReAuthProofTokenSuccess(
const std::string& reauth_proof_token) {
+ base::UmaHistogramEnumeration(
+ kCreateRaptResultHistogram,
+ GaiaAuthConsumer::ReAuthProofTokenStatus::kSuccess);
gaia_auth_fetcher_.reset();
ResolveJavascriptCallback(base::Value(parent_signin_callback_id_),
base::Value(reauth_proof_token));
@@ -331,6 +366,7 @@ void EduAccountLoginHandler::OnReAuthProofTokenSuccess(
void EduAccountLoginHandler::OnReAuthProofTokenFailure(
const GaiaAuthConsumer::ReAuthProofTokenStatus error) {
+ base::UmaHistogramEnumeration(kCreateRaptResultHistogram, error);
LOG(ERROR) << "Failed to fetch ReAuthProofToken for the parent, error="
<< static_cast<int>(error);
gaia_auth_fetcher_.reset();
diff --git a/chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.h b/chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.h
index 88b968d36e5..169004d0b31 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.h
@@ -94,6 +94,7 @@ class EduAccountLoginHandler : public content::WebUIMessageHandler,
void HandleGetParents(const base::ListValue* args);
void HandleCloseDialog(const base::ListValue* args);
void HandleParentSignin(const base::ListValue* args);
+ void HandleUpdateEduCoexistenceFlowResult(const base::ListValue* args);
virtual void FetchFamilyMembers();
virtual void FetchParentImages(
diff --git a/chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_unittest.cc b/chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_unittest.cc
index c8a2beaed80..4fc9f173315 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/edu_account_login_handler_unittest.cc
@@ -230,7 +230,7 @@ TEST_F(EduAccountLoginHandlerTest, HandleGetParentsFailure) {
handler()->HandleGetParents(&list_args);
// Simulate failed fetching of family members.
- handler()->OnFailure(FamilyInfoFetcher::ErrorCode::NETWORK_ERROR);
+ handler()->OnFailure(FamilyInfoFetcher::ErrorCode::kNetworkError);
const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
VerifyJavascriptCallbackResolved(data, callback_id, false /*success*/);
diff --git a/chromium/chrome/browser/ui/webui/chromeos/emulator/device_emulator_message_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/emulator/device_emulator_message_handler.cc
index 3918ffffb79..93318f93336 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/emulator/device_emulator_message_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/emulator/device_emulator_message_handler.cc
@@ -175,7 +175,7 @@ DeviceEmulatorMessageHandler::DeviceEmulatorMessageHandler()
static_cast<bluez::FakeBluetoothDeviceClient*>(
bluez::BluezDBusManager::Get()->GetBluetoothDeviceClient())),
fake_power_manager_client_(chromeos::FakePowerManagerClient::Get()) {
- device::BluetoothAdapterFactory::GetAdapter(
+ device::BluetoothAdapterFactory::Get()->GetAdapter(
base::BindOnce(&DeviceEmulatorMessageHandler::BluetoothDeviceAdapterReady,
weak_ptr_factory_.GetWeakPtr()));
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/first_run/first_run_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/first_run/first_run_handler.cc
index 92020cd21ff..8f67e75b16a 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/first_run/first_run_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/first_run/first_run_handler.cc
@@ -16,7 +16,7 @@
namespace {
bool IsAssistantAllowed() {
- return ash::mojom::AssistantAllowedState::ALLOWED ==
+ return chromeos::assistant::AssistantAllowedState::ALLOWED ==
assistant::IsAssistantAllowedForProfile(
ProfileManager::GetActiveUserProfile());
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/confirm_password_change_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/confirm_password_change_handler.cc
index b95907fe477..0cab506e700 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/confirm_password_change_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/confirm_password_change_handler.cc
@@ -6,7 +6,7 @@
#include <string>
-#include "base/logging.h"
+#include "base/check.h"
#include "base/macros.h"
#include "base/values.h"
#include "chrome/browser/chromeos/login/saml/in_session_password_change_manager.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/urgent_password_expiry_notification_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/urgent_password_expiry_notification_handler.cc
index 627e1577cf9..38b27d06c6b 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/urgent_password_expiry_notification_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/in_session_password_change/urgent_password_expiry_notification_handler.cc
@@ -6,7 +6,6 @@
#include <string>
-#include "base/logging.h"
#include "base/macros.h"
#include "base/values.h"
#include "chrome/browser/chromeos/login/saml/in_session_password_change_manager.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc
index bc8d272106e..a837b01fcdd 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc
@@ -70,8 +70,6 @@ ArcTermsOfServiceScreenHandler::~ArcTermsOfServiceScreenHandler() {
void ArcTermsOfServiceScreenHandler::RegisterMessages() {
BaseScreenHandler::RegisterMessages();
- AddCallback("arcTermsOfServiceSkip",
- &ArcTermsOfServiceScreenHandler::HandleSkip);
AddCallback("arcTermsOfServiceAccept",
&ArcTermsOfServiceScreenHandler::HandleAccept);
}
@@ -201,6 +199,13 @@ void ArcTermsOfServiceScreenHandler::DeclareLocalizedValues(
builder->Add("oobeModalDialogClose", IDS_CHROMEOS_OOBE_CLOSE_DIALOG);
builder->Add("arcOverlayLoading", IDS_ARC_POPUP_HELP_LOADING);
builder->Add("arcLearnMoreText", IDS_ARC_OPT_IN_DIALOG_LEARN_MORE_LINK_TEXT);
+
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kArcTosHostForTests)) {
+ builder->Add("arcTosHostNameForTesting",
+ base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+ switches::kArcTosHostForTests));
+ }
}
void ArcTermsOfServiceScreenHandler::OnMetricsModeChanged(bool enabled,
@@ -323,12 +328,6 @@ void ArcTermsOfServiceScreenHandler::DoShow() {
// ToS then prefs::kArcEnabled is automatically reset in ArcSessionManager.
arc::SetArcPlayStoreEnabledForProfile(profile, true);
- // Hide the Skip button in the ToS screen.
- // TODO(crbug.com/1059048) Remove this when the ToS screen no longer has
- // the skip button altogether. We call it all the time now so we can
- // remove a Chrome OS flag.
- CallJS("login.ArcTermsOfServiceScreen.hideSkipButton");
-
action_taken_ = false;
ShowScreen(kScreenId);
@@ -423,23 +422,6 @@ void ArcTermsOfServiceScreenHandler::RecordConsents(
}
}
-void ArcTermsOfServiceScreenHandler::HandleSkip(
- const std::string& tos_content) {
- DCHECK(!arc::IsArcDemoModeSetupFlow());
-
- if (!NeedDispatchEventOnAction())
- return;
-
- // Record consents as not accepted for consents that are under user control
- // when the user skips ARC setup.
- RecordConsents(tos_content, !arc_managed_, /*tos_accepted=*/false,
- !backup_restore_managed_, /*backup_accepted=*/false,
- !location_services_managed_, /*location_accepted=*/false);
-
- for (auto& observer : observer_list_)
- observer.OnSkip();
-}
-
void ArcTermsOfServiceScreenHandler::HandleAccept(
bool enable_backup_restore,
bool enable_location_services,
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.h
index 02a0cb49692..3d2e0ff9732 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.h
@@ -29,9 +29,6 @@ class ArcTermsOfServiceScreenViewObserver {
public:
virtual ~ArcTermsOfServiceScreenViewObserver() = default;
- // Called when the user skips the PlayStore Terms of Service.
- virtual void OnSkip() = 0;
-
// Called when the user accepts the PlayStore Terms of Service.
virtual void OnAccept(bool review_arc_settings) = 0;
@@ -123,7 +120,6 @@ class ArcTermsOfServiceScreenHandler
// configured for Public Session.
void DoShowForDemoModeSetup();
- void HandleSkip(const std::string& tos_content);
void HandleAccept(bool enable_backup_restore,
bool enable_location_services,
bool review_arc_settings,
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc
index 0875097cdfe..30bfa1f347e 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc
@@ -15,11 +15,11 @@
#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/browser/ui/ash/assistant/assistant_service_connection.h"
#include "chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.h"
#include "chrome/grit/generated_resources.h"
#include "chromeos/services/assistant/public/cpp/assistant_prefs.h"
-#include "chromeos/services/assistant/public/features.h"
+#include "chromeos/services/assistant/public/cpp/assistant_service.h"
+#include "chromeos/services/assistant/public/cpp/features.h"
#include "chromeos/services/assistant/public/proto/settings_ui.pb.h"
#include "components/login/localized_values_builder.h"
#include "components/prefs/pref_service.h"
@@ -54,7 +54,7 @@ AssistantOptInFlowScreenHandler::AssistantOptInFlowScreenHandler(
}
AssistantOptInFlowScreenHandler::~AssistantOptInFlowScreenHandler() {
- if (client_receiver_.is_bound())
+ if (voice_match_enrollment_started_)
StopSpeakerIdEnrollment();
if (ash::AssistantState::Get())
ash::AssistantState::Get()->RemoveObserver(this);
@@ -221,11 +221,11 @@ void AssistantOptInFlowScreenHandler::SetupAssistantConnection() {
// Make sure enable Assistant service since we need it during the flow.
prefs->SetBoolean(chromeos::assistant::prefs::kAssistantEnabled, true);
- if (ash::AssistantState::Get()->assistant_state() ==
- ash::mojom::AssistantState::NOT_READY) {
+ if (ash::AssistantState::Get()->assistant_status() ==
+ chromeos::assistant::AssistantStatus::NOT_READY) {
ash::AssistantState::Get()->AddObserver(this);
} else {
- BindAssistantSettingsManager();
+ SendGetSettingsRequest();
}
}
@@ -239,7 +239,7 @@ void AssistantOptInFlowScreenHandler::OnActivityControlOptInResult(
RecordActivityControlConsent(profile, ui_audit_key_, opted_in);
if (opted_in) {
RecordAssistantOptInStatus(ACTIVITY_CONTROL_ACCEPTED);
- settings_manager_->UpdateSettings(
+ assistant::AssistantSettings::Get()->UpdateSettings(
GetSettingsUiUpdate(consent_token_).SerializeAsString(),
base::BindOnce(
&AssistantOptInFlowScreenHandler::OnUpdateSettingsResponse,
@@ -259,11 +259,14 @@ void AssistantOptInFlowScreenHandler::OnEmailOptInResult(bool opted_in) {
return;
}
+ // TODO(b/159363597): Handle network disconnect when sending email opt-in
+ // result.
RecordAssistantOptInStatus(opted_in ? EMAIL_OPTED_IN : EMAIL_OPTED_OUT);
- settings_manager_->UpdateSettings(
+ assistant::AssistantSettings::Get()->UpdateSettings(
GetEmailOptInUpdate(opted_in).SerializeAsString(),
base::BindOnce(&AssistantOptInFlowScreenHandler::OnUpdateSettingsResponse,
weak_factory_.GetWeakPtr()));
+ HandleFlowFinished();
}
void AssistantOptInFlowScreenHandler::OnDialogClosed() {
@@ -282,31 +285,24 @@ void AssistantOptInFlowScreenHandler::OnAssistantSettingsEnabled(bool enabled) {
}
void AssistantOptInFlowScreenHandler::OnAssistantStatusChanged(
- ash::mojom::AssistantState state) {
- if (state != ash::mojom::AssistantState::NOT_READY) {
- BindAssistantSettingsManager();
+ chromeos::assistant::AssistantStatus status) {
+ if (status != chromeos::assistant::AssistantStatus::NOT_READY) {
+ SendGetSettingsRequest();
ash::AssistantState::Get()->RemoveObserver(this);
}
}
-void AssistantOptInFlowScreenHandler::BindAssistantSettingsManager() {
- if (settings_manager_.is_bound())
+void AssistantOptInFlowScreenHandler::SendGetSettingsRequest() {
+ if (!initialized_)
return;
- // Set up settings mojom.
- AssistantServiceConnection::GetForProfile(
- ProfileManager::GetActiveUserProfile())
- ->service()
- ->BindSettingsManager(settings_manager_.BindNewPipeAndPassReceiver());
-
- if (initialized_) {
- SendGetSettingsRequest();
+ if (ash::AssistantState::Get()->assistant_status() ==
+ chromeos::assistant::AssistantStatus::NOT_READY) {
+ return;
}
-}
-void AssistantOptInFlowScreenHandler::SendGetSettingsRequest() {
assistant::SettingsUiSelector selector = GetSettingsUiSelector();
- settings_manager_->GetSettings(
+ assistant::AssistantSettings::Get()->GetSettings(
selector.SerializeAsString(),
base::BindOnce(&AssistantOptInFlowScreenHandler::OnGetSettingsResponse,
weak_factory_.GetWeakPtr()));
@@ -314,9 +310,9 @@ void AssistantOptInFlowScreenHandler::SendGetSettingsRequest() {
}
void AssistantOptInFlowScreenHandler::StopSpeakerIdEnrollment() {
- settings_manager_->StopSpeakerIdEnrollment(base::DoNothing());
- // Reset the receiver so it can be used again if enrollment is retried.
- client_receiver_.reset();
+ DCHECK(voice_match_enrollment_started_);
+ voice_match_enrollment_started_ = false;
+ assistant::AssistantSettings::Get()->StopSpeakerIdEnrollment();
}
void AssistantOptInFlowScreenHandler::ReloadContent(const base::Value& dict) {
@@ -484,7 +480,6 @@ void AssistantOptInFlowScreenHandler::OnUpdateSettingsResponse(
// TODO(updowndta): Handle email optin update failure.
LOG(ERROR) << "Email OptIn udpate error.";
}
- HandleFlowFinished();
return;
}
@@ -498,11 +493,7 @@ void AssistantOptInFlowScreenHandler::HandleValuePropScreenUserAction(
} else if (action == kNextPressed) {
OnActivityControlOptInResult(true);
} else if (action == kReloadRequested) {
- if (settings_manager_.is_bound()) {
- SendGetSettingsRequest();
- } else {
- LOG(ERROR) << "Settings mojom failed to setup. Check Assistant service.";
- }
+ SendGetSettingsRequest();
}
}
@@ -535,9 +526,11 @@ void AssistantOptInFlowScreenHandler::HandleVoiceMatchScreenUserAction(
prefs->SetBoolean(assistant::prefs::kAssistantHotwordEnabled, true);
}
- settings_manager_->StartSpeakerIdEnrollment(
+ DCHECK(!voice_match_enrollment_started_);
+ voice_match_enrollment_started_ = true;
+ assistant::AssistantSettings::Get()->StartSpeakerIdEnrollment(
flow_type_ == ash::FlowType::kSpeakerIdRetrain,
- client_receiver_.BindNewPipeAndPassRemote());
+ weak_factory_.GetWeakPtr());
}
}
@@ -605,10 +598,8 @@ void AssistantOptInFlowScreenHandler::HandleFlowInitialized(
DCHECK(IsKnownEnumValue(static_cast<ash::FlowType>(flow_type)));
flow_type_ = static_cast<ash::FlowType>(flow_type);
- if (settings_manager_.is_bound() &&
- flow_type_ == ash::FlowType::kConsentFlow) {
+ if (flow_type_ == ash::FlowType::kConsentFlow)
SendGetSettingsRequest();
- }
}
} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.h
index 5a43ecbce36..2839eb2f64b 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.h
@@ -7,12 +7,14 @@
#include <memory>
#include <string>
+#include <utility>
+#include "ash/public/cpp/assistant/assistant_settings.h"
#include "ash/public/cpp/assistant/assistant_setup.h"
#include "ash/public/cpp/assistant/assistant_state.h"
#include "base/macros.h"
#include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h"
-#include "chromeos/services/assistant/public/mojom/settings.mojom.h"
+#include "chromeos/services/assistant/public/cpp/assistant_settings.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
@@ -45,7 +47,7 @@ class AssistantOptInFlowScreenHandler
: public BaseScreenHandler,
public AssistantOptInFlowScreenView,
public ash::AssistantStateObserver,
- assistant::mojom::SpeakerIdEnrollmentClient {
+ public chromeos::assistant::SpeakerIdEnrollmentClient {
public:
using TView = AssistantOptInFlowScreenView;
@@ -72,7 +74,7 @@ class AssistantOptInFlowScreenHandler
void Show() override;
void Hide() override;
- // assistant::mojom::SpeakerIdEnrollmentClient:
+ // assistant::SpeakerIdEnrollmentClient:
void OnListeningHotword() override;
void OnProcessingHotword() override;
void OnSpeakerIdEnrollmentDone() override;
@@ -97,10 +99,8 @@ class AssistantOptInFlowScreenHandler
// ash::AssistantStateObserver:
void OnAssistantSettingsEnabled(bool enabled) override;
- void OnAssistantStatusChanged(ash::mojom::AssistantState state) override;
-
- // Connect to assistant settings manager.
- void BindAssistantSettingsManager();
+ void OnAssistantStatusChanged(
+ chromeos::assistant::AssistantStatus status) override;
// Send GetSettings request for the opt-in UI.
void SendGetSettingsRequest();
@@ -149,6 +149,9 @@ class AssistantOptInFlowScreenHandler
// Whether email optin is needed for user.
bool email_optin_needed_ = false;
+ // Whether the user has started voice match enrollment.
+ bool voice_match_enrollment_started_ = false;
+
// Whether the use has completed voice match enrollment.
bool voice_match_enrollment_done_ = false;
@@ -164,9 +167,6 @@ class AssistantOptInFlowScreenHandler
// Whether the screen has been initialized.
bool initialized_ = false;
- mojo::Receiver<assistant::mojom::SpeakerIdEnrollmentClient> client_receiver_{
- this};
- mojo::Remote<assistant::mojom::AssistantSettingsManager> settings_manager_;
base::WeakPtrFactory<AssistantOptInFlowScreenHandler> weak_factory_{this};
DISALLOW_COPY_AND_ASSIGN(AssistantOptInFlowScreenHandler);
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/base_webui_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/base_webui_handler.cc
index c6c6cf9d57a..cff1e165eaa 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/base_webui_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/base_webui_handler.cc
@@ -6,7 +6,6 @@
#include <memory>
-#include "base/logging.h"
#include "base/values.h"
#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
#include "components/login/localized_values_builder.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
index 95159a1980f..b4a51961a0f 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
@@ -323,6 +323,8 @@ void CoreOobeHandler::SetShelfHeight(int height) {
}
void CoreOobeHandler::HandleInitialized() {
+ // TODO(crbug.com/1082670): Remove excessive logging after investigation.
+ LOG(ERROR) << "CoreOobeHandler::HandleInitialized";
GetOobeUI()->InitializeHandlers();
AllowJavascript();
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/debug/DEPS b/chromium/chrome/browser/ui/webui/chromeos/login/debug/DEPS
new file mode 100644
index 00000000000..7c23f598009
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/debug/DEPS
@@ -0,0 +1,5 @@
+specific_include_rules = {
+ "debug_overlay_handler\.cc": [
+ "+ash/shell.h",
+ ],
+}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/debug/debug_overlay_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/debug/debug_overlay_handler.cc
new file mode 100644
index 00000000000..1520461230b
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/debug/debug_overlay_handler.cc
@@ -0,0 +1,125 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/chromeos/login/debug/debug_overlay_handler.h"
+
+#include "ash/shell.h"
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/command_line.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/path_service.h"
+#include "base/system/sys_info.h"
+#include "base/time/time.h"
+#include "chrome/common/chrome_paths.h"
+#include "chromeos/constants/chromeos_switches.h"
+#include "ui/snapshot/snapshot.h"
+
+namespace chromeos {
+
+namespace {
+
+// A helper function which saves screenshot to the file.
+void StoreScreenshot(const base::FilePath& screenshot_dir,
+ const std::string& screenshot_name,
+ scoped_refptr<base::RefCountedMemory> png_data) {
+ if (!base::CreateDirectory(screenshot_dir)) {
+ LOG(ERROR) << "Failed to create screenshot dir at "
+ << screenshot_dir.value();
+ return;
+ }
+ base::FilePath file_path = screenshot_dir.Append(screenshot_name);
+
+ if (static_cast<size_t>(base::WriteFile(
+ file_path, reinterpret_cast<const char*>(png_data->front()),
+ static_cast<int>(png_data->size()))) != png_data->size()) {
+ LOG(ERROR) << "Failed to save screenshot to " << file_path.value();
+ }
+}
+
+// A helper function which invokes StoreScreenshot on TaskRunner.
+void RunStoreScreenshotOnTaskRunner(
+ const base::FilePath& screenshot_dir,
+ const std::string& screenshot_name,
+ scoped_refptr<base::RefCountedMemory> png_data) {
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE, base::BindOnce(&StoreScreenshot, screenshot_dir,
+ screenshot_name, png_data));
+}
+
+} // namespace
+// DebugOverlayHandler, public: -----------------------------------------------
+
+DebugOverlayHandler::DebugOverlayHandler(JSCallsContainer* js_calls_container)
+ : BaseWebUIHandler(js_calls_container) {
+ // Rules for base directory:
+ // 1) If command-line switch is specified, use the directory
+ // 2) else if chromeos-on-linux case create OOBE_Screenshots in user-data-dir
+ // 3) else (running on real device) create OOBE_Screenshots in /tmp
+ base::FilePath base_dir;
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+ if (command_line->HasSwitch(switches::kOobeScreenshotDirectory)) {
+ base_dir =
+ command_line->GetSwitchValuePath(switches::kOobeScreenshotDirectory);
+ } else {
+ if (base::SysInfo::IsRunningOnChromeOS()) {
+ if (!base::GetTempDir(&base_dir)) {
+ LOG(ERROR) << "Could not get Temp dir";
+ }
+ } else {
+ // use user-data-dir as base directory when running chromeos-on-linux.
+ if (!base::PathService::Get(chrome::DIR_USER_DATA, &base_dir)) {
+ LOG(ERROR) << "User Data Directory not found";
+ }
+ }
+ base_dir = base_dir.Append("OOBE_Screenshots");
+ }
+ base::Time::Exploded now;
+ base::Time::Now().LocalExplode(&now);
+ std::string series_name =
+ base::StringPrintf("%d-%02d-%02d - %02d.%02d.%02d", now.year, now.month,
+ now.day_of_month, now.hour, now.minute, now.second);
+ screenshot_dir_ = base_dir.Append(series_name);
+}
+
+DebugOverlayHandler::~DebugOverlayHandler() = default;
+
+void DebugOverlayHandler::DeclareJSCallbacks() {
+ AddCallback("debug.captureScreenshot",
+ &DebugOverlayHandler::HandleCaptureScreenshot);
+}
+
+void DebugOverlayHandler::DeclareLocalizedValues(
+ ::login::LocalizedValuesBuilder* builder) {}
+
+void DebugOverlayHandler::Initialize() {}
+
+// DebugOverlayHandler, private: ----------------------------------------------
+
+void DebugOverlayHandler::HandleCaptureScreenshot(const std::string& name) {
+ aura::Window::Windows root_windows = ash::Shell::GetAllRootWindows();
+ if (root_windows.size() == 0)
+ return;
+
+ screenshot_index_++;
+ std::string filename_base =
+ base::StringPrintf("%04d - %s", screenshot_index_, name.c_str());
+
+ for (size_t screen = 0; screen < root_windows.size(); ++screen) {
+ aura::Window* root_window = root_windows[screen];
+ gfx::Rect rect = root_window->bounds();
+ std::string filename = filename_base;
+ if (root_windows.size() > 1) {
+ filename.append(base::StringPrintf("- Display %zu", screen));
+ }
+ filename.append(".png");
+ ui::GrabWindowSnapshotAsyncPNG(
+ root_window, rect,
+ base::BindOnce(&RunStoreScreenshotOnTaskRunner, screenshot_dir_,
+ filename));
+ }
+}
+
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/debug/debug_overlay_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/debug/debug_overlay_handler.h
new file mode 100644
index 00000000000..ca704fe34f6
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/debug/debug_overlay_handler.h
@@ -0,0 +1,38 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_DEBUG_DEBUG_OVERLAY_HANDLER_H_
+#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_DEBUG_DEBUG_OVERLAY_HANDLER_H_
+
+#include <string>
+
+#include "base/files/file_path.h"
+#include "chrome/browser/ui/webui/chromeos/login/base_webui_handler.h"
+
+namespace chromeos {
+
+class DebugOverlayHandler : public BaseWebUIHandler {
+ public:
+ explicit DebugOverlayHandler(JSCallsContainer* js_calls_container);
+ ~DebugOverlayHandler() override;
+ DebugOverlayHandler(const DebugOverlayHandler&) = delete;
+ DebugOverlayHandler& operator=(const DebugOverlayHandler&) = delete;
+
+ // BaseWebUIHandler:
+ void DeclareJSCallbacks() override;
+ void DeclareLocalizedValues(
+ ::login::LocalizedValuesBuilder* builder) override;
+ void Initialize() override;
+
+ private:
+ // JS callbacks.
+ void HandleCaptureScreenshot(const std::string& name);
+
+ base::FilePath screenshot_dir_;
+ int screenshot_index_ = 0;
+};
+
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_DEBUG_DEBUG_OVERLAY_HANDLER_H_
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/discover/discover_browser_test.cc b/chromium/chrome/browser/ui/webui/chromeos/login/discover/discover_browser_test.cc
index c4d5e68a85f..80e27a1e5e1 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/discover/discover_browser_test.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/discover/discover_browser_test.cc
@@ -10,7 +10,6 @@
#include "chrome/browser/ui/webui/chromeos/login/discover/discover_ui.h"
#include "chrome/browser/ui/webui/chromeos/login/discover/discover_window_manager.h"
#include "chrome/browser/ui/webui/chromeos/login/discover/discover_window_manager_observer.h"
-#include "chrome/browser/ui/webui/chromeos/login/discover/wait_for_did_start_navigate.h"
#include "content/public/test/browser_test_utils.h"
namespace chromeos {
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/discover/discover_manager.cc b/chromium/chrome/browser/ui/webui/chromeos/login/discover/discover_manager.cc
index 51ffeebd72b..34e9e1679ed 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/discover/discover_manager.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/discover/discover_manager.cc
@@ -6,7 +6,7 @@
#include <algorithm>
-#include "base/logging.h"
+#include "base/check_op.h"
#include "chrome/browser/ui/webui/chromeos/login/discover/discover_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/discover/modules/discover_module_launch_help_app.h"
#include "chrome/browser/ui/webui/chromeos/login/discover/modules/discover_module_pin_setup.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/discover/discover_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/login/discover/discover_ui.cc
index 9074fdcfb1d..a33fda2f638 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/discover/discover_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/discover/discover_ui.cc
@@ -4,7 +4,7 @@
#include "chrome/browser/ui/webui/chromeos/login/discover/discover_ui.h"
-#include "base/logging.h"
+#include "base/check_op.h"
#include "chrome/browser/ui/webui/chromeos/login/discover/discover_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/discover/discover_manager.h"
#include "chrome/browser/ui/webui/chromeos/login/discover/discover_window_manager.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/discover/modules/discover_module_launch_help_app_test.cc b/chromium/chrome/browser/ui/webui/chromeos/login/discover/modules/discover_module_launch_help_app_test.cc
index ae95efbe5a7..314e2496c16 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/discover/modules/discover_module_launch_help_app_test.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/discover/modules/discover_module_launch_help_app_test.cc
@@ -7,6 +7,7 @@
#include "base/test/bind_test_util.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/webui/chromeos/login/discover/discover_browser_test.h"
+#include "content/public/test/browser_test.h"
namespace chromeos {
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/discover/modules/discover_module_redeem_offers_test.cc b/chromium/chrome/browser/ui/webui/chromeos/login/discover/modules/discover_module_redeem_offers_test.cc
index 29c6d73f2ed..acf9bdbd75f 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/discover/modules/discover_module_redeem_offers_test.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/discover/modules/discover_module_redeem_offers_test.cc
@@ -4,8 +4,9 @@
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/webui/chromeos/login/discover/discover_browser_test.h"
-#include "chrome/browser/ui/webui/chromeos/login/discover/wait_for_did_start_navigate.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
+#include "content/public/test/test_navigation_observer.h"
namespace chromeos {
@@ -19,9 +20,10 @@ IN_PROC_BROWSER_TEST_F(DiscoverModuleRedeemOffersTest, RedeemOffers) {
// Wait for the first WebContents to be created.
// We do not expect another one to be created at the same time.
content::WebContents* new_contents = observe_new_contents.GetWebContents();
- test::WaitForDidStartNavigate(
- new_contents, GURL("http://www.google.com/chromebook/offers/"))
- .Wait();
+ content::TestNavigationObserver nav_observer(new_contents, 1);
+ nav_observer.Wait();
+ EXPECT_EQ(GURL("http://www.google.com/chromebook/offers/"),
+ nav_observer.last_navigation_url());
}
} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/discover/modules/discover_module_set_wallpaper_test.cc b/chromium/chrome/browser/ui/webui/chromeos/login/discover/modules/discover_module_set_wallpaper_test.cc
index f6a947b679c..a47e9e34c51 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/discover/modules/discover_module_set_wallpaper_test.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/discover/modules/discover_module_set_wallpaper_test.cc
@@ -6,6 +6,7 @@
#include "chrome/browser/extensions/component_loader.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/webui/chromeos/login/discover/discover_browser_test.h"
+#include "content/public/test/browser_test.h"
#include "extensions/test/extension_test_message_listener.h"
namespace chromeos {
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/discover/modules/discover_module_sync_files_test.cc b/chromium/chrome/browser/ui/webui/chromeos/login/discover/modules/discover_module_sync_files_test.cc
index 6d53748a3ea..cc8210de457 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/discover/modules/discover_module_sync_files_test.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/discover/modules/discover_module_sync_files_test.cc
@@ -4,8 +4,9 @@
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/webui/chromeos/login/discover/discover_browser_test.h"
-#include "chrome/browser/ui/webui/chromeos/login/discover/wait_for_did_start_navigate.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
+#include "content/public/test/test_navigation_observer.h"
namespace chromeos {
@@ -19,9 +20,10 @@ IN_PROC_BROWSER_TEST_F(DiscoverModuleSyncFilesTest, SyncFiles) {
// Wait for the first WebContents to be created.
// We do not expect another one to be created at the same time.
content::WebContents* new_contents = observe_new_contents.GetWebContents();
- test::WaitForDidStartNavigate(
- new_contents, GURL("https://www.google.com/chromebook/switch/"))
- .Wait();
+ content::TestNavigationObserver nav_observer(new_contents, 1);
+ nav_observer.Wait();
+ EXPECT_EQ(GURL("https://www.google.com/chromebook/switch/"),
+ nav_observer.last_navigation_url());
}
} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/discover/wait_for_did_start_navigate.cc b/chromium/chrome/browser/ui/webui/chromeos/login/discover/wait_for_did_start_navigate.cc
deleted file mode 100644
index 3b41c879a73..00000000000
--- a/chromium/chrome/browser/ui/webui/chromeos/login/discover/wait_for_did_start_navigate.cc
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/webui/chromeos/login/discover/wait_for_did_start_navigate.h"
-
-#include "chrome/browser/ui/webui/chromeos/login/discover/discover_window_manager.h"
-#include "content/public/browser/navigation_handle.h"
-#include "content/public/test/browser_test_utils.h"
-
-namespace chromeos {
-
-namespace test {
-
-WaitForDidStartNavigate::WaitForDidStartNavigate(
- content::WebContents* web_contents,
- const GURL& url)
- : content::WebContentsObserver(web_contents), url_(url) {}
-
-void WaitForDidStartNavigate::Wait() {
- // Run() will return immediately if Quit() has been called before.
- run_loop_.Run();
-}
-
-void WaitForDidStartNavigate::DidStartNavigation(
- content::NavigationHandle* navigation_handle) {
- if (navigation_handle->GetURL() == url_)
- run_loop_.Quit();
-}
-
-} // namespace test
-} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/discover/wait_for_did_start_navigate.h b/chromium/chrome/browser/ui/webui/chromeos/login/discover/wait_for_did_start_navigate.h
deleted file mode 100644
index a6d32dd1636..00000000000
--- a/chromium/chrome/browser/ui/webui/chromeos/login/discover/wait_for_did_start_navigate.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_DISCOVER_WAIT_FOR_DID_START_NAVIGATE_H_
-#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_DISCOVER_WAIT_FOR_DID_START_NAVIGATE_H_
-
-#include "base/macros.h"
-#include "base/run_loop.h"
-#include "content/public/browser/web_contents_observer.h"
-#include "url/gurl.h"
-
-namespace chromeos {
-namespace test {
-
-class WaitForDidStartNavigate : public content::WebContentsObserver {
- public:
- WaitForDidStartNavigate(content::WebContents* web_contents, const GURL& url);
- ~WaitForDidStartNavigate() override = default;
-
- // Blocks until DidStartNavigate with expected URL is called.
- void Wait();
-
- private:
- // content::WebContentsObserver
- void DidStartNavigation(
- content::NavigationHandle* navigation_handle) override;
-
- GURL url_;
- base::RunLoop run_loop_;
-
- DISALLOW_COPY_AND_ASSIGN(WaitForDidStartNavigate);
-};
-
-} // namespace test
-} // namespace chromeos
-
-#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_DISCOVER_WAIT_FOR_DID_START_NAVIGATE_H_
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/enable_debugging_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/enable_debugging_screen_handler.cc
index 49edf06dc4d..82683984635 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/enable_debugging_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/enable_debugging_screen_handler.cc
@@ -52,7 +52,7 @@ void EnableDebuggingScreenHandler::ShowWithParams() {
// Wait for cryptohomed before checking debugd. See http://crbug.com/440506.
chromeos::CryptohomeClient* client = chromeos::CryptohomeClient::Get();
- client->WaitForServiceToBeAvailable(base::Bind(
+ client->WaitForServiceToBeAvailable(base::BindOnce(
&EnableDebuggingScreenHandler::OnCryptohomeDaemonAvailabilityChecked,
weak_ptr_factory_.GetWeakPtr()));
}
@@ -158,8 +158,8 @@ void EnableDebuggingScreenHandler::HandleOnRemoveRootFSProtection() {
chromeos::DebugDaemonClient* client =
chromeos::DBusThreadManager::Get()->GetDebugDaemonClient();
client->RemoveRootfsVerification(
- base::Bind(&EnableDebuggingScreenHandler::OnRemoveRootfsVerification,
- weak_ptr_factory_.GetWeakPtr()));
+ base::BindOnce(&EnableDebuggingScreenHandler::OnRemoveRootfsVerification,
+ weak_ptr_factory_.GetWeakPtr()));
}
void EnableDebuggingScreenHandler::HandleOnSetup(
@@ -169,8 +169,8 @@ void EnableDebuggingScreenHandler::HandleOnSetup(
chromeos::DBusThreadManager::Get()->GetDebugDaemonClient();
client->EnableDebuggingFeatures(
password,
- base::Bind(&EnableDebuggingScreenHandler::OnEnableDebuggingFeatures,
- weak_ptr_factory_.GetWeakPtr()));
+ base::BindOnce(&EnableDebuggingScreenHandler::OnEnableDebuggingFeatures,
+ weak_ptr_factory_.GetWeakPtr()));
}
void EnableDebuggingScreenHandler::OnCryptohomeDaemonAvailabilityChecked(
@@ -185,7 +185,7 @@ void EnableDebuggingScreenHandler::OnCryptohomeDaemonAvailabilityChecked(
chromeos::DebugDaemonClient* client =
chromeos::DBusThreadManager::Get()->GetDebugDaemonClient();
- client->WaitForServiceToBeAvailable(base::Bind(
+ client->WaitForServiceToBeAvailable(base::BindOnce(
&EnableDebuggingScreenHandler::OnDebugDaemonServiceAvailabilityChecked,
weak_ptr_factory_.GetWeakPtr()));
}
@@ -204,8 +204,8 @@ void EnableDebuggingScreenHandler::OnDebugDaemonServiceAvailabilityChecked(
chromeos::DebugDaemonClient* client =
chromeos::DBusThreadManager::Get()->GetDebugDaemonClient();
client->QueryDebuggingFeatures(
- base::Bind(&EnableDebuggingScreenHandler::OnQueryDebuggingFeatures,
- weak_ptr_factory_.GetWeakPtr()));
+ base::BindOnce(&EnableDebuggingScreenHandler::OnQueryDebuggingFeatures,
+ weak_ptr_factory_.GetWeakPtr()));
}
// Removes rootfs verification, add flag to start with enable debugging features
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.cc
index bcd552e1741..6a2a7f1e967 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.cc
@@ -610,8 +610,8 @@ void EncryptionMigrationScreenHandler::OnMountExistingVault(
cryptohome::CreateAccountIdentifierFromAccountId(
user_context_.GetAccountId()),
request,
- base::Bind(&EncryptionMigrationScreenHandler::OnMigrationRequested,
- weak_ptr_factory_.GetWeakPtr()));
+ base::BindOnce(&EncryptionMigrationScreenHandler::OnMigrationRequested,
+ weak_ptr_factory_.GetWeakPtr()));
}
device::mojom::WakeLock* EncryptionMigrationScreenHandler::GetWakeLock() {
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
index 90fb5125c55..e5f84a27dd2 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
@@ -412,6 +412,11 @@ void EnrollmentScreenHandler::ShowEnrollmentStatus(
IDS_ENTERPRISE_ENROLLMENT_CONSUMER_ACCOUNT_WITH_PACKAGED_LICENSE,
true);
break;
+ case policy::DM_STATUS_SERVICE_ENTERPRISE_TOS_HAS_NOT_BEEN_ACCEPTED:
+ ShowError(
+ IDS_ENTERPRISE_ENROLLMENT_ENTERPRISE_TOS_HAS_NOT_BEEN_ACCEPTED,
+ true);
+ break;
default:
ShowErrorMessage(
l10n_util::GetStringFUTF8(
@@ -553,8 +558,6 @@ void EnrollmentScreenHandler::DeclareLocalizedValues(
// Do not use AddF for this string as it will be rendered by the JS code.
builder->Add("oauthEnrollAbeSuccessDomain",
IDS_ENTERPRISE_ENROLLMENT_SUCCESS_DOMAIN);
- builder->Add("oauthEnrollAbeSuccessSupport",
- IDS_ENTERPRISE_ENROLLMENT_SUCCESS_ABE_SUPPORT);
/* Active Directory strings */
builder->Add("oauthEnrollAdMachineNameInput", IDS_AD_DEVICE_NAME_INPUT_LABEL);
@@ -703,8 +706,8 @@ void EnrollmentScreenHandler::SetupAndShowOfflineMessage(
if (GetCurrentScreen() != ErrorScreenView::kScreenId) {
error_screen_->SetUIState(NetworkError::UI_STATE_SIGNIN);
error_screen_->SetParentScreen(kScreenId);
- error_screen_->SetHideCallback(base::Bind(&EnrollmentScreenHandler::DoShow,
- weak_ptr_factory_.GetWeakPtr()));
+ error_screen_->SetHideCallback(base::BindOnce(
+ &EnrollmentScreenHandler::DoShow, weak_ptr_factory_.GetWeakPtr()));
error_screen_->Show();
histogram_helper_->OnErrorShow(error_screen_->GetErrorState());
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.cc
index aa87c7a9018..03e3c845076 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.cc
@@ -20,6 +20,7 @@
#include "chrome/common/url_constants.h"
#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
+#include "chromeos/constants/chromeos_switches.h"
#include "components/login/localized_values_builder.h"
#include "components/strings/grit/components_strings.h"
#include "rlz/buildflags/buildflags.h"
@@ -29,8 +30,6 @@ namespace chromeos {
constexpr StaticOobeScreenId EulaView::kScreenId;
-const char* EulaScreenHandler::eula_url_for_testing_ = nullptr;
-
EulaScreenHandler::EulaScreenHandler(JSCallsContainer* js_calls_container,
CoreOobeView* core_oobe_view)
: BaseScreenHandler(kScreenId, js_calls_container),
@@ -67,8 +66,10 @@ void EulaScreenHandler::Unbind() {
}
std::string EulaScreenHandler::GetEulaOnlineUrl() {
- if (EulaScreenHandler::eula_url_for_testing_) {
- return std::string(EulaScreenHandler::eula_url_for_testing_);
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kOobeEulaUrlForTests)) {
+ return base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+ switches::kOobeEulaUrlForTests);
}
return base::StringPrintf(chrome::kOnlineEulaURLPath,
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.h
index bb724d1f659..e4dcb388a24 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.h
@@ -61,10 +61,6 @@ class EulaScreenHandler : public EulaView, public BaseScreenHandler {
void GetAdditionalParameters(base::DictionaryValue* dict) override;
void Initialize() override;
- static void set_eula_url_for_testing(const char* eula_test_url) {
- eula_url_for_testing_ = eula_test_url;
- }
-
private:
// JS messages handlers.
void HandleOnLearnMore();
@@ -73,7 +69,6 @@ class EulaScreenHandler : public EulaView, public BaseScreenHandler {
// Determines the online URL to use.
std::string GetEulaOnlineUrl();
- static const char* eula_url_for_testing_;
std::string GetAdditionalToSUrl();
void UpdateLocalizedValues(::login::SecureModuleUsed secure_module_used);
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
index 69ee8265d9b..64879360d33 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
@@ -6,7 +6,6 @@
#include <memory>
-#include "ash/public/cpp/ash_features.h"
#include "ash/public/cpp/login_screen.h"
#include "base/bind.h"
#include "base/bind_helpers.h"
@@ -38,6 +37,7 @@
#include "chrome/browser/chromeos/login/lock_screen_utils.h"
#include "chrome/browser/chromeos/login/reauth_stats.h"
#include "chrome/browser/chromeos/login/saml/public_saml_url_fetcher.h"
+#include "chrome/browser/chromeos/login/saml/saml_metric_utils.h"
#include "chrome/browser/chromeos/login/screens/network_error.h"
#include "chrome/browser/chromeos/login/signin_partition_manager.h"
#include "chrome/browser/chromeos/login/ui/login_display_host.h"
@@ -442,15 +442,24 @@ void GaiaScreenHandler::LoadGaiaWithPartition(
if (!partition)
return;
+ // Note: The CanonicalCookie created here is not Secure. This is fine because
+ // it's being set into a different StoragePartition than the user's actual
+ // profile. The SetCanonicalCookie call will succeed regardless of the scheme
+ // of |gaia_url| since there are no scheme restrictions since the cookie is
+ // not Secure, and there is no preexisting Secure cookie in the profile that
+ // would preclude updating it insecurely. |gaia_url| is usually secure, and
+ // only insecure in local testing.
+
std::string gaps_cookie_value(kGAPSCookie);
gaps_cookie_value += "=" + context.gaps_cookie;
+ const GURL& gaia_url = GaiaUrls::GetInstance()->gaia_url();
std::unique_ptr<net::CanonicalCookie> cc(net::CanonicalCookie::Create(
- GaiaUrls::GetInstance()->gaia_url(), gaps_cookie_value, base::Time::Now(),
+ gaia_url, gaps_cookie_value, base::Time::Now(),
base::nullopt /* server_time */));
const net::CookieOptions options = net::CookieOptions::MakeAllInclusive();
partition->GetCookieManagerForBrowserProcess()->SetCanonicalCookie(
- *cc.get(), "https", options, std::move(callback));
+ *cc.get(), gaia_url, options, std::move(callback));
}
void GaiaScreenHandler::OnSetCookieForLoadGaiaWithPartition(
@@ -704,6 +713,8 @@ void GaiaScreenHandler::RegisterMessages() {
AddCallback("completeAuthentication",
&GaiaScreenHandler::HandleCompleteAuthentication);
AddCallback("usingSAMLAPI", &GaiaScreenHandler::HandleUsingSAMLAPI);
+ AddCallback("recordSAMLProvider",
+ &GaiaScreenHandler::HandleRecordSAMLProvider);
AddCallback("scrapedPasswordCount",
&GaiaScreenHandler::HandleScrapedPasswordCount);
AddCallback("scrapedPasswordVerificationFailed",
@@ -873,7 +884,7 @@ void GaiaScreenHandler::HandleCompleteAdAuthentication(
if (LoginDisplayHost::default_host())
LoginDisplayHost::default_host()->SetDisplayEmail(username);
- set_populated_email(username);
+ set_populated_account(AccountId::FromUserEmail(username));
DCHECK(authpolicy_login_helper_);
Key key(password);
key.SetLabel(kCryptohomeGaiaKeyLabel);
@@ -1007,6 +1018,11 @@ void GaiaScreenHandler::HandleUsingSAMLAPI(bool is_third_party_idp) {
SetSAMLPrincipalsAPIUsed(is_third_party_idp, /*is_api_used=*/true);
}
+void GaiaScreenHandler::HandleRecordSAMLProvider(
+ const std::string& x509certificate) {
+ metrics::RecordSAMLProvider(x509certificate);
+}
+
void GaiaScreenHandler::HandleScrapedPasswordCount(int password_count) {
// We are handling scraped passwords here so this is SAML flow without
// Chrome Credentials Passing API
@@ -1069,7 +1085,7 @@ void GaiaScreenHandler::HandleShowAddUser(const base::ListValue* args) {
// |args| can be null if it's OOBE.
if (args)
args->GetString(0, &email);
- set_populated_email(email);
+ set_populated_account(AccountId::FromUserEmail(email));
if (!email.empty())
SendReauthReason(AccountId::FromUserEmail(email));
OnShowAddUser();
@@ -1135,7 +1151,7 @@ void GaiaScreenHandler::HandleSecurityTokenPinEntered(
void GaiaScreenHandler::OnShowAddUser() {
signin_screen_handler_->is_account_picker_showing_first_time_ = false;
- lock_screen_utils::EnforcePolicyInputMethods(std::string());
+ lock_screen_utils::EnforceDevicePolicyInputMethods(std::string());
ShowGaiaAsync(EmptyAccountId());
}
@@ -1274,9 +1290,9 @@ void GaiaScreenHandler::SetSAMLPrincipalsAPIUsed(bool is_third_party_idp,
void GaiaScreenHandler::ShowGaiaAsync(const AccountId& account_id) {
if (account_id.is_valid())
- populated_email_ = account_id.GetUserEmail();
+ populated_account_id_ = account_id;
show_when_ready_ = true;
- if (gaia_silent_load_ && populated_email_.empty()) {
+ if (gaia_silent_load_ && !populated_account_id_.is_valid()) {
dns_cleared_ = true;
cookies_cleared_ = true;
ShowGaiaScreenIfReady();
@@ -1388,20 +1404,6 @@ void GaiaScreenHandler::ShowGaiaScreenIfReady() {
gaia_silent_load_ = false;
}
- // Views-based login may reach here while pre-loading the Gaia screen, so
- // update the wallpaper in |LoginDisplayHostMojo::UpdateGaiaDialogVisibility|
- // instead, which controls the actual visibility of the Gaia screen.
- if (!ash::features::IsViewsLoginEnabled()) {
- // Note that LoadAuthExtension clears |populated_email_|.
- if (populated_email_.empty()) {
- LoginDisplayHost::default_host()->LoadSigninWallpaper();
- } else {
- LoginDisplayHost::default_host()->LoadWallpaper(
- user_manager::known_user::GetAccountId(
- populated_email_, std::string() /* id */, AccountType::UNKNOWN));
- }
- }
-
input_method::InputMethodManager* imm =
input_method::InputMethodManager::Get();
@@ -1410,9 +1412,10 @@ void GaiaScreenHandler::ShowGaiaScreenIfReady() {
imm->SetState(gaia_ime_state);
// Set Least Recently Used input method for the user.
- if (!populated_email_.empty()) {
- lock_screen_utils::SetUserInputMethod(populated_email_,
- gaia_ime_state.get());
+ if (populated_account_id_.is_valid()) {
+ lock_screen_utils::SetUserInputMethod(populated_account_id_,
+ gaia_ime_state.get(),
+ true /*honor_device_policy*/);
} else {
std::vector<std::string> input_methods;
if (gaia_ime_state->GetAllowedInputMethods().empty()) {
@@ -1422,7 +1425,7 @@ void GaiaScreenHandler::ShowGaiaScreenIfReady() {
input_methods = gaia_ime_state->GetAllowedInputMethods();
}
const std::string owner_im = lock_screen_utils::GetUserLastInputMethod(
- user_manager::UserManager::Get()->GetOwnerAccountId().GetUserEmail());
+ user_manager::UserManager::Get()->GetOwnerAccountId());
const std::string system_im = g_browser_process->local_state()->GetString(
language_prefs::kPreferredKeyboardLayout);
@@ -1497,7 +1500,7 @@ void GaiaScreenHandler::LoadAuthExtension(bool force, bool offline) {
GaiaContext context;
context.force_reload = force;
context.use_offline = offline;
- context.email = populated_email_;
+ context.email = populated_account_id_.GetUserEmail();
std::string gaia_id;
if (!context.email.empty() &&
@@ -1511,7 +1514,7 @@ void GaiaScreenHandler::LoadAuthExtension(bool force, bool offline) {
AccountId::FromUserEmail(gaia::CanonicalizeEmail(context.email)));
}
- populated_email_.clear();
+ populated_account_id_.clear();
LoadGaia(context);
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h
index ff64497e598..02c0cce7974 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h
@@ -218,6 +218,7 @@ class GaiaScreenHandler : public BaseScreenHandler,
// Handles SAML/GAIA login flow metrics
// is_third_party_idp == false means GAIA-based authentication
void HandleUsingSAMLAPI(bool is_third_party_idp);
+ void HandleRecordSAMLProvider(const std::string& x509certificate);
void HandleScrapedPasswordCount(int password_count);
void HandleScrapedPasswordVerificationFailed();
void HandleSamlChallengeMachineKey(const std::string& callback_id,
@@ -253,9 +254,9 @@ class GaiaScreenHandler : public BaseScreenHandler,
bool using_saml,
const SamlPasswordAttributes& password_attributes);
- // Fill GAIA user name.
- void set_populated_email(const std::string& populated_email) {
- populated_email_ = populated_email;
+ // Fill GAIA account.
+ void set_populated_account(const AccountId& populated_account_id) {
+ populated_account_id_ = populated_account_id;
}
// Kick off cookie / local storage cleanup.
@@ -358,8 +359,8 @@ class GaiaScreenHandler : public BaseScreenHandler,
ActiveDirectoryPasswordChangeScreenHandler*
active_directory_password_change_screen_handler_ = nullptr;
- // Email to pre-populate with.
- std::string populated_email_;
+ // Account to pre-populate with.
+ AccountId populated_account_id_;
// Whether the handler has been initialized.
bool initialized_ = false;
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc
index b75bf1e45c5..a2d5c6d02e0 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc
@@ -26,7 +26,9 @@ constexpr StaticOobeScreenId HIDDetectionView::kScreenId;
HIDDetectionScreenHandler::HIDDetectionScreenHandler(
JSCallsContainer* js_calls_container)
- : BaseScreenHandler(kScreenId, js_calls_container) {}
+ : BaseScreenHandler(kScreenId, js_calls_container) {
+ set_user_acted_method_path("login.HIDDetectionScreen.userActed");
+}
HIDDetectionScreenHandler::~HIDDetectionScreenHandler() {
if (screen_)
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/l10n_util.cc b/chromium/chrome/browser/ui/webui/chromeos/login/l10n_util.cc
index 8fa827a081c..169c7f9e8d4 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/l10n_util.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/l10n_util.cc
@@ -13,10 +13,11 @@
#include <utility>
#include "base/bind.h"
+#include "base/check_op.h"
#include "base/i18n/rtl.h"
#include "base/location.h"
-#include "base/logging.h"
#include "base/memory/ref_counted.h"
+#include "base/notreached.h"
#include "base/sequenced_task_runner.h"
#include "base/stl_util.h"
#include "base/strings/string16.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/network_state_informer.cc b/chromium/chrome/browser/ui/webui/chromeos/login/network_state_informer.cc
index d26b46a9c28..2271d770ff2 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/network_state_informer.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/network_state_informer.cc
@@ -5,7 +5,7 @@
#include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h"
#include "base/bind.h"
-#include "base/logging.h"
+#include "base/notreached.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part.h"
#include "chrome/browser/chromeos/login/screens/network_error.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser_browsertest.cc b/chromium/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser_browsertest.cc
index fe7c41c7f08..5ec23430ca4 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser_browsertest.cc
@@ -9,6 +9,7 @@
#include "chrome/browser/chromeos/login/test/oobe_base_test.h"
#include "chrome/browser/lifetime/application_lifetime.h"
#include "chromeos/constants/chromeos_switches.h"
+#include "content/public/test/browser_test.h"
#include "ui/display/display.h"
#include "ui/display/manager/display_manager.h"
#include "ui/display/manager/managed_display_info.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser_unittest.cc b/chromium/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser_unittest.cc
index 407ca745758..e658206743b 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser_unittest.cc
@@ -70,6 +70,7 @@ class TestCrosDisplayConfig : public ash::mojom::CrosDisplayConfigController {
ash::mojom::DisplayConfigOperation op,
ash::mojom::TouchCalibrationPtr calibration,
TouchCalibrationCallback callback) override {}
+ void HighlightDisplay(int64_t id) override {}
private:
mojo::Receiver<ash::mojom::CrosDisplayConfigController> receiver_{this};
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
index 7ccd1bb578b..a8b92fcbf79 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
@@ -10,8 +10,6 @@
#include <string>
#include <utility>
-#include "ash/public/cpp/ash_features.h"
-#include "ash/public/cpp/ash_switches.h"
#include "ash/public/cpp/network_config_service.h"
#include "ash/public/cpp/resources/grit/ash_public_unscaled_resources.h"
#include "base/bind.h"
@@ -20,6 +18,7 @@
#include "base/macros.h"
#include "base/stl_util.h"
#include "base/strings/stringprintf.h"
+#include "base/system/sys_info.h"
#include "base/values.h"
#include "build/branding_buildflags.h"
#include "chrome/browser/browser_process.h"
@@ -45,6 +44,7 @@
#include "chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/auto_enrollment_check_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h"
+#include "chrome/browser/ui/webui/chromeos/login/debug/debug_overlay_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/device_disabled_screen_handler.h"
@@ -129,6 +129,7 @@ constexpr char kArcPlaystoreLogoPath[] = "playstore.svg";
constexpr char kArcSupervisionIconPath[] = "supervision_icon.png";
constexpr char kCustomElementsHTMLPath[] = "custom_elements.html";
constexpr char kCustomElementsJSPath[] = "custom_elements.js";
+constexpr char kDebuggerJSPath[] = "debug.js";
constexpr char kDiscoverJSPath[] = "discover_app.js";
constexpr char kKeyboardUtilsJSPath[] = "keyboard_utils.js";
constexpr char kLoginJSPath[] = "login.js";
@@ -245,6 +246,20 @@ void AddFingerprintResources(content::WebUIDataSource* source) {
source->AddBoolean("useLottieAnimationForFingerprint", is_lottie_animation);
}
+void AddDebuggerResources(content::WebUIDataSource* source) {
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+ bool enable_debugger =
+ command_line->HasSwitch(::chromeos::switches::kShowOobeDevOverlay);
+ // TODO(crbug.com/1073095): Also enable for ChromeOS test images.
+ // Enable for ChromeOS-on-linux for developers.
+ bool test_mode = !base::SysInfo::IsRunningOnChromeOS();
+ if (enable_debugger && test_mode) {
+ source->AddResourcePath(kDebuggerJSPath, IDR_OOBE_DEBUGGER_JS);
+ } else {
+ source->AddResourcePath(kDebuggerJSPath, IDR_OOBE_DEBUGGER_STUB_JS);
+ }
+}
+
// Default and non-shared resource definition for kOobeDisplay display type.
// chrome://oobe/oobe
void AddOobeDisplayTypeDefaultResources(content::WebUIDataSource* source) {
@@ -307,6 +322,8 @@ content::WebUIDataSource* CreateOobeUIDataSource(
AddGestureNavigationResources(source);
AddMarketingOptInResources(source);
+ AddDebuggerResources(source);
+
source->AddResourcePath(kKeyboardUtilsJSPath, IDR_KEYBOARD_UTILS_JS);
source->OverrideContentSecurityPolicyObjectSrc(
"object-src chrome:;");
@@ -339,11 +356,6 @@ bool IsRemoraRequisitioned() {
return policy_manager && policy_manager->IsRemoraRequisition();
}
-void DisablePolymer2(content::URLDataSource* shared_source) {
- if (shared_source)
- shared_source->DisablePolymer2ForHost(chrome::kChromeUIOobeHost);
-}
-
} // namespace
// static
@@ -534,6 +546,9 @@ void OobeUI::BindInterface(
OobeUI::OobeUI(content::WebUI* web_ui, const GURL& url)
: ui::MojoWebUIController(web_ui, true /* enable_chrome_send */) {
+ // TODO(crbug.com/1082670): Remove excessive logging after investigation.
+ LOG(ERROR) << "Creating new OobeUI";
+
display_type_ = GetDisplayType(url);
js_calls_container_ = std::make_unique<JSCallsContainer>();
@@ -550,6 +565,18 @@ OobeUI::OobeUI(content::WebUI* web_ui, const GURL& url)
AddScreenHandler(
std::make_unique<DiscoverScreenHandler>(js_calls_container_.get()));
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+ bool enable_debugger =
+ command_line->HasSwitch(::chromeos::switches::kShowOobeDevOverlay);
+ // TODO(crbug.com/1073095): Also enable for ChromeOS test images.
+ // Enable for ChromeOS-on-linux for developers.
+ bool test_mode = !base::SysInfo::IsRunningOnChromeOS();
+
+ if (enable_debugger && test_mode) {
+ AddWebUIHandler(
+ std::make_unique<DebugOverlayHandler>(js_calls_container_.get()));
+ }
+
base::DictionaryValue localized_strings;
GetLocalizedStrings(&localized_strings);
@@ -563,10 +590,11 @@ OobeUI::OobeUI(content::WebUI* web_ui, const GURL& url)
// TODO (https://crbug.com/739611): Remove this exception by migrating to
// Polymer 2.
if (base::FeatureList::IsEnabled(features::kWebUIPolymer2Exceptions)) {
- content::URLDataSource::GetSourceForURL(
+ auto* shared_source = content::URLDataSource::GetSourceForURL(
Profile::FromWebUI(web_ui),
- GURL("chrome://resources/polymer/v1_0/polymer/polymer.html"),
- base::BindOnce(DisablePolymer2));
+ GURL("chrome://resources/polymer/v1_0/polymer/polymer.html"));
+ if (shared_source)
+ shared_source->DisablePolymer2ForHost(chrome::kChromeUIOobeHost);
}
}
@@ -601,10 +629,6 @@ void OobeUI::GetLocalizedStrings(base::DictionaryValue* localized_strings) {
localized_strings->SetString("highlightStrength",
keyboard_driven_oobe ? "strong" : "normal");
- localized_strings->SetString(
- "showViewsLock", ash::switches::IsUsingViewsLock() ? "on" : "off");
- localized_strings->SetString(
- "showViewsLogin", ash::features::IsViewsLoginEnabled() ? "on" : "off");
localized_strings->SetBoolean(
"changePictureVideoModeEnabled",
base::FeatureList::IsEnabled(features::kChangePictureVideoMode));
@@ -623,8 +647,14 @@ void OobeUI::AddScreenHandler(std::unique_ptr<BaseScreenHandler> handler) {
}
void OobeUI::InitializeHandlers() {
+ // TODO(crbug.com/1082670): Remove excessive logging after investigation.
+ LOG(ERROR) << "OobeUI::InitializeHandlers";
+
js_calls_container_->ExecuteDeferredJSCalls(web_ui());
+ // TODO(crbug.com/1082670): Remove excessive logging after investigation.
+ LOG(ERROR) << "OobeUI::Marking as ready and executing callbacks";
+
ready_ = true;
for (size_t i = 0; i < ready_callbacks_.size(); ++i)
ready_callbacks_[i].Run();
@@ -655,6 +685,8 @@ bool OobeUI::IsScreenInitialized(OobeScreenId screen) {
}
bool OobeUI::IsJSReady(const base::Closure& display_is_ready_callback) {
+ // TODO(crbug.com/1082670): Remove excessive logging after investigation.
+ LOG(ERROR) << "OobeUI::IsJSReady? = " << ready_;
if (!ready_)
ready_callbacks_.push_back(display_is_ready_callback);
return ready_;
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc
index c88297b01a0..dfd147e9663 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc
@@ -19,7 +19,6 @@
namespace {
constexpr const char kUserActionSkip[] = "recommendAppsSkip";
-constexpr const char kUserActionRetry[] = "recommendAppsRetry";
constexpr const char kUserActionInstall[] = "recommendAppsInstall";
constexpr const int kMaxAppCount = 21;
@@ -91,15 +90,12 @@ void RecommendAppsScreenHandler::DeclareLocalizedValues(
IDS_LOGIN_RECOMMEND_APPS_SCREEN_DESCRIPTION);
builder->Add("recommendAppsSkip", IDS_LOGIN_RECOMMEND_APPS_SKIP);
builder->Add("recommendAppsInstall", IDS_LOGIN_RECOMMEND_APPS_INSTALL);
- builder->Add("recommendAppsRetry", IDS_LOGIN_RECOMMEND_APPS_RETRY);
builder->Add("recommendAppsLoading", IDS_LOGIN_RECOMMEND_APPS_SCREEN_LOADING);
- builder->Add("recommendAppsError", IDS_LOGIN_RECOMMEND_APPS_SCREEN_ERROR);
}
void RecommendAppsScreenHandler::RegisterMessages() {
BaseScreenHandler::RegisterMessages();
AddCallback(kUserActionSkip, &RecommendAppsScreenHandler::OnUserSkip);
- AddCallback(kUserActionRetry, &RecommendAppsScreenHandler::HandleRetry);
AddRawCallback(kUserActionInstall,
&RecommendAppsScreenHandler::HandleInstall);
}
@@ -110,6 +106,10 @@ void RecommendAppsScreenHandler::Bind(RecommendAppsScreen* screen) {
}
void RecommendAppsScreenHandler::Show() {
+ if (!page_is_ready()) {
+ show_on_init_ = true;
+ return;
+ }
ShowScreen(kScreenId);
Profile* profile = ProfileManager::GetActiveUserProfile();
@@ -118,11 +118,6 @@ void RecommendAppsScreenHandler::Show() {
void RecommendAppsScreenHandler::Hide() {}
-void RecommendAppsScreenHandler::OnLoadError() {
- RecordUmaScreenState(RecommendAppsScreenState::ERROR);
- CallJS("login.RecommendAppsScreen.showError");
-}
-
void RecommendAppsScreenHandler::OnLoadSuccess(const base::Value& app_list) {
recommended_app_count_ = static_cast<int>(app_list.GetList().size());
LoadAppListInUI(app_list);
@@ -133,21 +128,20 @@ void RecommendAppsScreenHandler::OnParseResponseError() {
HandleSkip();
}
-void RecommendAppsScreenHandler::Initialize() {}
-
-void RecommendAppsScreenHandler::LoadAppListInUI(const base::Value& app_list) {
- if (!page_is_ready()) {
- RecordUmaScreenState(RecommendAppsScreenState::ERROR);
- CallJS("login.RecommendAppsScreen.showError");
- return;
+void RecommendAppsScreenHandler::Initialize() {
+ if (show_on_init_) {
+ Show();
+ show_on_init_ = false;
}
+}
+void RecommendAppsScreenHandler::LoadAppListInUI(const base::Value& app_list) {
RecordUmaScreenState(RecommendAppsScreenState::SHOW);
const ui::ResourceBundle& resource_bundle =
ui::ResourceBundle::GetSharedInstance();
- base::StringPiece app_list_webview = resource_bundle.GetRawDataResource(
+ std::string app_list_webview = resource_bundle.LoadDataResourceString(
IDR_ARC_SUPPORT_RECOMMEND_APP_LIST_VIEW_HTML);
- CallJS("login.RecommendAppsScreen.setWebview", app_list_webview.as_string());
+ CallJS("login.RecommendAppsScreen.setWebview", app_list_webview);
CallJS("login.RecommendAppsScreen.loadAppList", app_list);
}
@@ -166,12 +160,6 @@ void RecommendAppsScreenHandler::HandleSkip() {
screen_->OnSkip();
}
-void RecommendAppsScreenHandler::HandleRetry() {
- RecordUmaScreenAction(RecommendAppsScreenAction::RETRIED);
- if (screen_)
- screen_->OnRetry();
-}
-
void RecommendAppsScreenHandler::HandleInstall(const base::ListValue* args) {
if (recommended_app_count_ != 0) {
int selected_app_count = static_cast<int>(args->GetSize());
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.h
index 268ad8c8618..de0fd1ed106 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.h
@@ -31,10 +31,6 @@ class RecommendAppsScreenView {
// Hides the contents of the screen.
virtual void Hide() = 0;
- // Called when the download of the recommend app list fails. Show an error
- // message to the user.
- virtual void OnLoadError() = 0;
-
// Called when the download of the recommend app list is successful. Shows the
// downloaded |app_list| to the user.
virtual void OnLoadSuccess(const base::Value& app_list) = 0;
@@ -62,7 +58,6 @@ class RecommendAppsScreenHandler : public BaseScreenHandler,
void Bind(RecommendAppsScreen* screen) override;
void Show() override;
void Hide() override;
- void OnLoadError() override;
void OnLoadSuccess(const base::Value& app_list) override;
void OnParseResponseError() override;
@@ -85,6 +80,9 @@ class RecommendAppsScreenHandler : public BaseScreenHandler,
int recommended_app_count_ = 0;
+ // If true, Initialize() will call Show().
+ bool show_on_init_ = false;
+
DISALLOW_COPY_AND_ASSIGN(RecommendAppsScreenHandler);
};
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/saml_challenge_key_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/saml_challenge_key_handler.cc
index f9c0c9dbf51..499ad8e79e8 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/saml_challenge_key_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/saml_challenge_key_handler.cc
@@ -93,10 +93,9 @@ void SamlChallengeKeyHandler::SetTpmResponseTimeoutForTesting(
void SamlChallengeKeyHandler::BuildResponseForWhitelistedUrl(const GURL& url) {
CrosSettings* settings = CrosSettings::Get();
- CrosSettingsProvider::TrustedStatus status =
- settings->PrepareTrustedValues(base::BindRepeating(
- &SamlChallengeKeyHandler::BuildResponseForWhitelistedUrl,
- weak_factory_.GetWeakPtr(), url));
+ CrosSettingsProvider::TrustedStatus status = settings->PrepareTrustedValues(
+ base::BindOnce(&SamlChallengeKeyHandler::BuildResponseForWhitelistedUrl,
+ weak_factory_.GetWeakPtr(), url));
const base::ListValue* patterns = nullptr;
switch (status) {
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
index be5053b0acd..98622fce340 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
@@ -259,11 +259,6 @@ SigninScreenHandler::SigninScreenHandler(
chromeos::input_method::InputMethodManager::Get()->GetImeKeyboard();
if (keyboard)
keyboard->AddObserver(this);
- allowed_input_methods_subscription_ =
- chromeos::CrosSettings::Get()->AddSettingsObserver(
- chromeos::kDeviceLoginScreenInputMethods,
- base::Bind(&SigninScreenHandler::OnAllowedInputMethodsChanged,
- base::Unretained(this)));
ash::TabletMode* tablet_mode = ash::TabletMode::Get();
tablet_mode->AddObserver(this);
@@ -1133,7 +1128,7 @@ void SigninScreenHandler::HandleOfflineLogin(const base::ListValue* args) {
std::string email;
args->GetString(0, &email);
- gaia_screen_handler_->set_populated_email(email);
+ gaia_screen_handler_->set_populated_account(AccountId::FromUserEmail(email));
gaia_screen_handler_->LoadAuthExtension(true /* force */, true /* offline */);
UpdateUIState(UI_STATE_GAIA_SIGNIN);
}
@@ -1253,7 +1248,6 @@ void SigninScreenHandler::HandleLoginVisible(const std::string& source) {
webui_visible_ = true;
if (preferences_changed_delayed_)
OnPreferencesChanged();
- OnAllowedInputMethodsChanged();
}
void SigninScreenHandler::HandleCancelPasswordChangedFlow(
@@ -1337,8 +1331,11 @@ void SigninScreenHandler::HandleFocusPod(const AccountId& account_id,
if (is_same_pod_focused)
return;
- lock_screen_utils::SetUserInputMethod(account_id.GetUserEmail(),
- ime_state_.get());
+ // TODO(https://crbug.com/1071779): Migrate KioskTest to Views Account picker.
+ // DCHECK_EQ(session_manager::SessionManager::Get()->session_state(),
+ // session_manager::SessionState::LOGIN_SECONDARY);
+ lock_screen_utils::SetUserInputMethod(account_id, ime_state_.get(),
+ false /*honor_device_policy*/);
lock_screen_utils::SetKeyboardSettings(account_id);
bool use_24hour_clock = false;
@@ -1353,7 +1350,6 @@ void SigninScreenHandler::HandleFocusPod(const AccountId& account_id,
void SigninScreenHandler::HandleNoPodFocused() {
focused_pod_account_id_.reset();
- lock_screen_utils::EnforcePolicyInputMethods(std::string());
}
void SigninScreenHandler::HandleGetPublicSessionKeyboardLayouts(
@@ -1473,17 +1469,4 @@ void SigninScreenHandler::OnFeedbackFinished() {
login_feedback_.reset();
}
-void SigninScreenHandler::OnAllowedInputMethodsChanged() {
- if (!webui_visible_)
- return;
-
- if (focused_pod_account_id_) {
- std::string user_input_method = lock_screen_utils::GetUserLastInputMethod(
- focused_pod_account_id_->GetUserEmail());
- lock_screen_utils::EnforcePolicyInputMethods(user_input_method);
- } else {
- lock_screen_utils::EnforcePolicyInputMethods(std::string());
- }
-}
-
} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h
index f2b6b19f830..fd1bcb346e3 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h
@@ -399,9 +399,6 @@ class SigninScreenHandler
// Callback invoked after the feedback is finished.
void OnFeedbackFinished();
- // Called when the cros property controlling allowed input methods changes.
- void OnAllowedInputMethodsChanged();
-
// After proxy auth information has been supplied, this function re-enables
// responding to network state notifications.
void ReenableNetworkStateUpdatesAfterProxyAuth();
@@ -442,9 +439,6 @@ class SigninScreenHandler
content::NotificationRegistrar registrar_;
- std::unique_ptr<CrosSettings::ObserverSubscription>
- allowed_input_methods_subscription_;
-
// Whether we're currently ignoring network state updates because a proxy auth
// UI pending (or we're waiting for a grace period after the proxy auth UI is
// finished for the network to switch into the ONLINE state).
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc
index 8b92640d17c..2e83bfb9b3d 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc
@@ -4,13 +4,15 @@
#include "chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.h"
+#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
+#include "base/values.h"
#include "chrome/browser/chromeos/login/screens/sync_consent_screen.h"
#include "chrome/grit/generated_resources.h"
#include "chromeos/constants/chromeos_features.h"
#include "components/login/localized_values_builder.h"
+#include "components/user_manager/user_manager.h"
#include "ui/base/l10n/l10n_util.h"
-#include "ui/chromeos/devicetype_utils.h"
namespace {
@@ -30,13 +32,7 @@ void GetConsentIDs(const std::unordered_set<int>& known_ids,
// characters, so we must use base::ReplaceSubstrings* rather than
// base::ReplaceChars.
// TODO(alemate): Find a more elegant solution.
- base::string16 raw_string;
- if (id == IDS_LOGIN_OS_SYNC_CONSENT_TOGGLE_NAME) {
- raw_string = ui::SubstituteChromeOSDeviceType(
- IDS_LOGIN_OS_SYNC_CONSENT_TOGGLE_NAME);
- } else {
- raw_string = l10n_util::GetStringUTF16(id);
- }
+ base::string16 raw_string = l10n_util::GetStringUTF16(id);
std::string sanitized_string = base::UTF16ToUTF8(raw_string);
base::ReplaceSubstringsAfterOffset(&sanitized_string, 0,
"\u00A0" /* NBSP */, "&nbsp;");
@@ -99,6 +95,10 @@ void SyncConsentScreenHandler::DeclareLocalizedValues(
"syncConsentScreenPersonalizeGoogleServicesName",
IDS_LOGIN_SYNC_CONSENT_SCREEN_PERSONALIZE_GOOGLE_SERVICES_NAME, builder);
RememberLocalizedValue(
+ "syncConsentScreenPersonalizeGoogleServicesDescriptionSupervisedUser",
+ IDS_LOGIN_SYNC_CONSENT_SCREEN_PERSONALIZE_GOOGLE_SERVICES_DESCRIPTION_SUPERVISED_USER,
+ builder);
+ RememberLocalizedValue(
"syncConsentScreenPersonalizeGoogleServicesDescription",
IDS_LOGIN_SYNC_CONSENT_SCREEN_PERSONALIZE_GOOGLE_SERVICES_DESCRIPTION,
builder);
@@ -110,18 +110,15 @@ void SyncConsentScreenHandler::DeclareLocalizedValues(
IDS_LOGIN_SYNC_CONSENT_SCREEN_ACCEPT_AND_CONTINUE,
builder);
- // SplitSyncConsent strings. The version of the dialog to show is chosen
- // after the WebUI is loaded, so always supply both sets of strings.
- RememberLocalizedValue("osSyncConsentTitle", IDS_LOGIN_OS_SYNC_CONSENT_TITLE,
+ // SplitSettingsSync strings.
+ RememberLocalizedValue("syncConsentScreenOsSyncName",
+ IDS_LOGIN_SYNC_CONSENT_SCREEN_OS_SYNC_NAME, builder);
+ RememberLocalizedValue("syncConsentScreenOsSyncDescription",
+ IDS_LOGIN_SYNC_CONSENT_SCREEN_OS_SYNC_DESCRIPTION,
+ builder);
+ RememberLocalizedValue("syncConsentScreenChromeBrowserSyncName",
+ IDS_LOGIN_SYNC_CONSENT_SCREEN_CHROME_BROWSER_SYNC_NAME,
builder);
- known_string_ids_.insert(IDS_LOGIN_OS_SYNC_CONSENT_TOGGLE_NAME);
- builder->AddF("osSyncConsentToggleName",
- IDS_LOGIN_OS_SYNC_CONSENT_TOGGLE_NAME,
- ui::GetChromeOSDeviceName());
- RememberLocalizedValue("osSyncConsentToggleDescription",
- IDS_LOGIN_OS_SYNC_CONSENT_TOGGLE_DESCRIPTION, builder);
- RememberLocalizedValue("osSyncConsentContinue",
- IDS_LOGIN_OS_SYNC_CONSENT_CONTINUE, builder);
}
void SyncConsentScreenHandler::Bind(SyncConsentScreen* screen) {
@@ -130,7 +127,11 @@ void SyncConsentScreenHandler::Bind(SyncConsentScreen* screen) {
}
void SyncConsentScreenHandler::Show() {
- ShowScreen(kScreenId);
+ bool is_child_account_ =
+ user_manager::UserManager::Get()->IsLoggedInAsChildUser();
+ base::DictionaryValue data;
+ data.SetBoolean("isChildAccount", is_child_account_);
+ ShowScreenWithData(kScreenId, &data);
}
void SyncConsentScreenHandler::Hide() {}
@@ -146,21 +147,21 @@ void SyncConsentScreenHandler::RegisterMessages() {
&SyncConsentScreenHandler::HandleContinueAndReview);
AddCallback("login.SyncConsentScreen.continueWithDefaults",
&SyncConsentScreenHandler::HandleContinueWithDefaults);
- AddCallback("login.SyncConsentScreen.osSyncAcceptAndContinue",
- &SyncConsentScreenHandler::HandleOsSyncAcceptAndContinue);
+ AddCallback("login.SyncConsentScreen.acceptAndContinue",
+ &SyncConsentScreenHandler::HandleAcceptAndContinue);
}
void SyncConsentScreenHandler::GetAdditionalParameters(
base::DictionaryValue* parameters) {
- parameters->SetBoolean("splitSyncConsent",
- chromeos::features::IsSplitSyncConsentEnabled());
+ parameters->SetBoolean("splitSettingsSyncEnabled",
+ chromeos::features::IsSplitSettingsSyncEnabled());
BaseScreenHandler::GetAdditionalParameters(parameters);
}
void SyncConsentScreenHandler::HandleContinueAndReview(
const login::StringList& consent_description,
const std::string& consent_confirmation) {
- DCHECK(!chromeos::features::IsSplitSyncConsentEnabled());
+ DCHECK(!chromeos::features::IsSplitSettingsSyncEnabled());
std::vector<int> consent_description_ids;
int consent_confirmation_id;
GetConsentIDs(known_string_ids_, consent_description, consent_confirmation,
@@ -179,7 +180,7 @@ void SyncConsentScreenHandler::HandleContinueAndReview(
void SyncConsentScreenHandler::HandleContinueWithDefaults(
const login::StringList& consent_description,
const std::string& consent_confirmation) {
- DCHECK(!chromeos::features::IsSplitSyncConsentEnabled());
+ DCHECK(!chromeos::features::IsSplitSettingsSyncEnabled());
std::vector<int> consent_description_ids;
int consent_confirmation_id;
GetConsentIDs(known_string_ids_, consent_description, consent_confirmation,
@@ -195,17 +196,18 @@ void SyncConsentScreenHandler::HandleContinueWithDefaults(
}
}
-void SyncConsentScreenHandler::HandleOsSyncAcceptAndContinue(
+void SyncConsentScreenHandler::HandleAcceptAndContinue(
const login::StringList& consent_description,
const std::string& consent_confirmation,
- bool enable_os_sync) {
- DCHECK(chromeos::features::IsSplitSyncConsentEnabled());
+ bool enable_os_sync,
+ bool enable_browser_sync) {
+ DCHECK(chromeos::features::IsSplitSettingsSyncEnabled());
std::vector<int> consent_description_ids;
int consent_confirmation_id;
GetConsentIDs(known_string_ids_, consent_description, consent_confirmation,
&consent_description_ids, &consent_confirmation_id);
screen_->OnAcceptAndContinue(consent_description_ids, consent_confirmation_id,
- enable_os_sync);
+ enable_os_sync, enable_browser_sync);
SyncConsentScreen::SyncConsentScreenTestDelegate* test_delegate =
screen_->GetDelegateForTesting();
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.h
index 738ebdf385b..af58bff845a 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.h
@@ -67,10 +67,10 @@ class SyncConsentScreenHandler : public BaseScreenHandler,
void HandleContinueWithDefaults(
const ::login::StringList& consent_description,
const std::string& consent_confirmation);
- void HandleOsSyncAcceptAndContinue(
- const ::login::StringList& consent_description,
- const std::string& consent_confirmation,
- bool enable_os_sync);
+ void HandleAcceptAndContinue(const ::login::StringList& consent_description,
+ const std::string& consent_confirmation,
+ bool enable_os_sync,
+ bool enable_browser_sync);
// Adds resource |resource_id| both to |builder| and to |known_string_ids_|.
void RememberLocalizedValue(const std::string& name,
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.cc
index e4b7d641ffc..e11e262c626 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.cc
@@ -94,6 +94,10 @@ void UserBoardScreenHandler::SetAuthType(
static_cast<int>(auth_type), base::Value(initial_value));
}
+void UserBoardScreenHandler::SetTpmLockedState(const AccountId& account_id,
+ bool is_locked,
+ base::TimeDelta time_left) {}
+
void UserBoardScreenHandler::Bind(UserSelectionScreen* screen) {
screen_ = screen;
SetBaseScreen(screen_);
diff --git a/chromium/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.h b/chromium/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.h
index 8aadb916d4d..247a17484b3 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.h
@@ -58,6 +58,10 @@ class UserBoardScreenHandler : public BaseScreenHandler, public UserBoardView {
void SetAuthType(const AccountId& account_id,
proximity_auth::mojom::AuthType auth_type,
const base::string16& initial_value) override;
+ void SetTpmLockedState(const AccountId& account_id,
+ bool is_locked,
+ base::TimeDelta time_left) override;
+
void Bind(UserSelectionScreen* screen) override;
void Unbind() override;
base::WeakPtr<UserBoardView> GetWeakPtr() override;
diff --git a/chromium/chrome/browser/ui/webui/chromeos/machine_learning/machine_learning_internals_page_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/machine_learning/machine_learning_internals_page_handler.cc
index 673d8f6352a..fb01a11f91f 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/machine_learning/machine_learning_internals_page_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/machine_learning/machine_learning_internals_page_handler.cc
@@ -7,7 +7,6 @@
#include <string>
#include <utility>
-#include "base/logging.h"
#include "chromeos/services/machine_learning/public/cpp/service_connection.h"
namespace chromeos {
diff --git a/chromium/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_handler.cc
index 3ccb3286b03..23d4c0c6740 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_handler.cc
@@ -10,6 +10,7 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/settings_window_manager_chromeos.h"
#include "chrome/browser/ui/webui/chromeos/user_image_source.h"
+#include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h"
#include "chrome/common/webui_url_constants.h"
#include "components/user_manager/user.h"
#include "ui/base/webui/web_ui_util.h"
@@ -61,7 +62,8 @@ void MultideviceSetupHandler::HandleOpenMultiDeviceSettings(
const base::ListValue* args) {
DCHECK(args->empty());
chrome::SettingsWindowManager::GetInstance()->ShowOSSettings(
- Profile::FromWebUI(web_ui()), chrome::kConnectedDevicesSubPage);
+ Profile::FromWebUI(web_ui()),
+ chromeos::settings::mojom::kMultiDeviceFeaturesSubpagePath);
}
} // namespace multidevice_setup
diff --git a/chromium/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_localized_strings_provider.cc b/chromium/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_localized_strings_provider.cc
index 113bcca5617..4b08916dcea 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_localized_strings_provider.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_localized_strings_provider.cc
@@ -21,7 +21,6 @@
#include "components/strings/grit/components_strings.h"
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_data_source.h"
-#include "services/service_manager/public/cpp/connector.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/webui/web_ui_util.h"
#include "ui/chromeos/devicetype_utils.h"
diff --git a/chromium/chrome/browser/ui/webui/chromeos/network_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/network_ui.cc
index b0957822cff..da91385d0c7 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/network_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/network_ui.cc
@@ -146,7 +146,7 @@ class NetworkConfigMessageHandler : public content::WebUIMessageHandler {
}
NetworkHandler::Get()->network_configuration_handler()->GetShillProperties(
service_path,
- base::Bind(
+ base::BindOnce(
&NetworkConfigMessageHandler::GetShillNetworkPropertiesSuccess,
weak_ptr_factory_.GetWeakPtr()),
base::Bind(&NetworkConfigMessageHandler::ErrorCallback,
diff --git a/chromium/chrome/browser/ui/webui/chromeos/smb_shares/smb_credentials_dialog_browsertest.cc b/chromium/chrome/browser/ui/webui/chromeos/smb_shares/smb_credentials_dialog_browsertest.cc
index cfe05b16511..91b25ad18f1 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/smb_shares/smb_credentials_dialog_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/smb_shares/smb_credentials_dialog_browsertest.cc
@@ -8,6 +8,7 @@
#include "base/test/bind_test_util.h"
#include "chrome/common/webui_url_constants.h"
#include "chrome/test/base/in_process_browser_test.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
namespace chromeos {
diff --git a/chromium/chrome/browser/ui/webui/chromeos/sync/os_sync_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/sync/os_sync_handler.cc
index 95451db1bb1..e8f91915e0c 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/sync/os_sync_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/sync/os_sync_handler.cc
@@ -6,7 +6,7 @@
#include "base/auto_reset.h"
#include "base/bind.h"
-#include "base/logging.h"
+#include "base/check_op.h"
#include "base/values.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/sync/profile_sync_service_factory.h"
@@ -46,6 +46,10 @@ void OSSyncHandler::RegisterMessages() {
base::BindRepeating(&OSSyncHandler::HandleDidNavigateAwayFromOsSyncPage,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
+ "OsSyncPrefsDispatch",
+ base::BindRepeating(&OSSyncHandler::HandleOsSyncPrefsDispatch,
+ base::Unretained(this)));
+ web_ui()->RegisterMessageCallback(
"SetOsSyncFeatureEnabled",
base::BindRepeating(&OSSyncHandler::HandleSetOsSyncFeatureEnabled,
base::Unretained(this)));
@@ -69,13 +73,16 @@ void OSSyncHandler::OnStateChanged(syncer::SyncService* service) {
}
void OSSyncHandler::HandleDidNavigateToOsSyncPage(const base::ListValue* args) {
+ HandleOsSyncPrefsDispatch(args);
+}
+
+void OSSyncHandler::HandleOsSyncPrefsDispatch(const base::ListValue* args) {
AllowJavascript();
// Cache the feature enabled pref.
SyncService* service = GetSyncService();
if (service)
feature_enabled_ = service->GetUserSettings()->IsOsSyncFeatureEnabled();
-
PushSyncPrefs();
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/sync/os_sync_handler.h b/chromium/chrome/browser/ui/webui/chromeos/sync/os_sync_handler.h
index 73dd52b7d77..33c29e82967 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/sync/os_sync_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/sync/os_sync_handler.h
@@ -40,6 +40,7 @@ class OSSyncHandler : public content::WebUIMessageHandler,
// Callbacks from the page. Visible for testing.
void HandleDidNavigateToOsSyncPage(const base::ListValue* args);
void HandleDidNavigateAwayFromOsSyncPage(const base::ListValue* args);
+ void HandleOsSyncPrefsDispatch(const base::ListValue* args);
void HandleSetOsSyncFeatureEnabled(const base::ListValue* args);
void HandleSetOsSyncDatatypes(const base::ListValue* args);
diff --git a/chromium/chrome/browser/ui/webui/chromeos/sync/os_sync_handler_unittest.cc b/chromium/chrome/browser/ui/webui/chromeos/sync/os_sync_handler_unittest.cc
index 480e2165b9f..8c19e52f962 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/sync/os_sync_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/sync/os_sync_handler_unittest.cc
@@ -49,8 +49,8 @@ DictionaryValue CreateOsSyncPrefs(SyncAllConfig sync_all,
result.SetBoolean("osAppsSynced", types.Has(UserSelectableOsType::kOsApps));
result.SetBoolean("osPreferencesSynced",
types.Has(UserSelectableOsType::kOsPreferences));
- result.SetBoolean("wifiConfigurationsSynced",
- types.Has(UserSelectableOsType::kWifiConfigurations));
+ result.SetBoolean("osWifiConfigurationsSynced",
+ types.Has(UserSelectableOsType::kOsWifiConfigurations));
result.SetBoolean("wallpaperEnabled",
sync_all == SYNC_ALL_OS_TYPES || wallpaper_enabled);
return result;
@@ -78,8 +78,8 @@ void CheckConfigDataTypeArguments(const DictionaryValue* dictionary,
types.Has(UserSelectableOsType::kOsApps));
CheckBool(dictionary, "osPreferencesSynced",
types.Has(UserSelectableOsType::kOsPreferences));
- CheckBool(dictionary, "wifiConfigurationsSynced",
- types.Has(UserSelectableOsType::kWifiConfigurations));
+ CheckBool(dictionary, "osWifiConfigurationsSynced",
+ types.Has(UserSelectableOsType::kOsWifiConfigurations));
CheckBool(dictionary, "wallpaperEnabled",
config == SYNC_ALL_OS_TYPES || wallpaper_enabled);
}
@@ -314,7 +314,7 @@ TEST_F(OsSyncHandlerTest, ShowSetupSyncEverything) {
CheckBool(dictionary, "syncAllOsTypes", true);
CheckBool(dictionary, "osAppsRegistered", true);
CheckBool(dictionary, "osPreferencesRegistered", true);
- CheckBool(dictionary, "wifiConfigurationsRegistered", true);
+ CheckBool(dictionary, "osWifiConfigurationsRegistered", true);
CheckConfigDataTypeArguments(dictionary, SYNC_ALL_OS_TYPES,
UserSelectableOsTypeSet::All(),
/*wallpaper_enabled=*/true);
diff --git a/chromium/chrome/browser/ui/webui/chromeos/system_web_dialog_browsertest.cc b/chromium/chrome/browser/ui/webui/chromeos/system_web_dialog_browsertest.cc
index e90675f52de..f31224e6d29 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/system_web_dialog_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/system_web_dialog_browsertest.cc
@@ -7,7 +7,8 @@
#include "ash/public/cpp/test/shell_test_api.h"
#include "base/test/scoped_feature_list.h"
#include "chrome/browser/chromeos/login/login_manager_test.h"
-#include "chrome/browser/chromeos/login/startup_utils.h"
+#include "chrome/browser/chromeos/login/test/login_manager_mixin.h"
+#include "chrome/browser/chromeos/login/test/oobe_base_test.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/zoom/chrome_zoom_level_prefs.h"
@@ -19,9 +20,8 @@
#include "components/prefs/pref_service.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_ui.h"
-#include "content/public/common/service_manager_connection.h"
#include "content/public/common/web_preferences.h"
-#include "services/service_manager/public/cpp/connector.h"
+#include "content/public/test/browser_test.h"
#include "third_party/blink/public/common/page/page_zoom.h"
#include "ui/aura/client/aura_constants.h"
#include "url/gurl.h"
@@ -30,9 +30,6 @@ namespace chromeos {
namespace {
-constexpr char kTestUser[] = "test-user@gmail.com";
-constexpr char kTestUserGaiaId[] = "1234567890";
-
class MockSystemWebDialog : public SystemWebDialogDelegate {
public:
explicit MockSystemWebDialog(const char* id = nullptr)
@@ -55,29 +52,30 @@ class MockSystemWebDialog : public SystemWebDialogDelegate {
class SystemWebDialogLoginTest : public LoginManagerTest {
public:
- SystemWebDialogLoginTest()
- : LoginManagerTest(false, true /* should_initialize_webui */) {}
+ SystemWebDialogLoginTest() : LoginManagerTest() {
+ login_mixin_.AppendRegularUsers(1);
+ }
~SystemWebDialogLoginTest() override = default;
+ protected:
+ LoginManagerMixin login_mixin_{&mixin_host_};
+
private:
DISALLOW_COPY_AND_ASSIGN(SystemWebDialogLoginTest);
};
+using SystemWebDialogOobeTest = OobeBaseTest;
+
// Verifies that system dialogs are modal before login (e.g. during OOBE).
-IN_PROC_BROWSER_TEST_F(SystemWebDialogLoginTest, ModalTest) {
+IN_PROC_BROWSER_TEST_F(SystemWebDialogOobeTest, ModalTest) {
auto* dialog = new MockSystemWebDialog();
dialog->ShowSystemDialog();
EXPECT_TRUE(ash::ShellTestApi().IsSystemModalWindowOpen());
}
-IN_PROC_BROWSER_TEST_F(SystemWebDialogLoginTest, PRE_NonModalTest) {
- RegisterUser(AccountId::FromUserEmailGaiaId(kTestUser, kTestUserGaiaId));
- StartupUtils::MarkOobeCompleted();
-}
-
// Verifies that system dialogs are not modal and always-on-top after login.
IN_PROC_BROWSER_TEST_F(SystemWebDialogLoginTest, NonModalTest) {
- LoginUser(AccountId::FromUserEmailGaiaId(kTestUser, kTestUserGaiaId));
+ LoginUser(login_mixin_.users()[0].account_id);
auto* dialog = new MockSystemWebDialog();
dialog->ShowSystemDialog();
EXPECT_FALSE(ash::ShellTestApi().IsSystemModalWindowOpen());
diff --git a/chromium/chrome/browser/ui/webui/components/components_handler.cc b/chromium/chrome/browser/ui/webui/components/components_handler.cc
index 1f1381b255f..504d9bbc6c6 100644
--- a/chromium/chrome/browser/ui/webui/components/components_handler.cc
+++ b/chromium/chrome/browser/ui/webui/components/components_handler.cc
@@ -4,7 +4,11 @@
#include "chrome/browser/ui/webui/components/components_handler.h"
+#include <utility>
+#include <vector>
+
#include "base/bind.h"
+#include "base/logging.h"
#include "base/values.h"
#include "chrome/grit/generated_resources.h"
#include "components/update_client/crx_update_item.h"
@@ -97,13 +101,14 @@ base::string16 ComponentsHandler::ComponentEventToString(Events event) {
return l10n_util::GetStringUTF16(IDS_COMPONENTS_EVT_STATUS_UPDATE_ERROR);
case Events::COMPONENT_UPDATE_DOWNLOADING:
return l10n_util::GetStringUTF16(IDS_COMPONENTS_EVT_STATUS_DOWNLOADING);
+ case Events::COMPONENT_UPDATE_UPDATING:
+ return l10n_util::GetStringUTF16(IDS_COMPONENTS_EVT_STATUS_UPDATING);
}
return l10n_util::GetStringUTF16(IDS_COMPONENTS_UNKNOWN);
}
base::string16 ComponentsHandler::ServiceStatusToString(
update_client::ComponentState state) {
- // TODO(sorin): handle kDownloaded. For now, just handle it as kUpdating.
switch (state) {
case update_client::ComponentState::kNew:
return l10n_util::GetStringUTF16(IDS_COMPONENTS_SVC_STATUS_NEW);
diff --git a/chromium/chrome/browser/ui/webui/constrained_web_dialog_delegate_base.cc b/chromium/chrome/browser/ui/webui/constrained_web_dialog_delegate_base.cc
deleted file mode 100644
index 0fd891b5ef1..00000000000
--- a/chromium/chrome/browser/ui/webui/constrained_web_dialog_delegate_base.cc
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/webui/constrained_web_dialog_delegate_base.h"
-
-#include <string>
-#include <utility>
-
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/renderer_preferences_util.h"
-#include "chrome/browser/ui/webui/chrome_web_contents_handler.h"
-#include "components/zoom/zoom_controller.h"
-#include "content/public/browser/render_view_host.h"
-#include "content/public/browser/web_contents.h"
-#include "ipc/ipc_message.h"
-#include "third_party/blink/public/mojom/renderer_preferences.mojom.h"
-#include "ui/web_dialogs/web_dialog_delegate.h"
-#include "ui/web_dialogs/web_dialog_ui.h"
-
-using content::NativeWebKeyboardEvent;
-using content::WebContents;
-using ui::WebDialogDelegate;
-using ui::WebDialogWebContentsDelegate;
-
-ConstrainedWebDialogDelegateBase::ConstrainedWebDialogDelegateBase(
- content::BrowserContext* browser_context,
- std::unique_ptr<WebDialogDelegate> web_dialog_delegate,
- std::unique_ptr<WebDialogWebContentsDelegate> tab_delegate)
- : WebDialogWebContentsDelegate(
- browser_context,
- std::make_unique<ChromeWebContentsHandler>()),
- web_dialog_delegate_(std::move(web_dialog_delegate)),
- closed_via_webui_(false) {
- DCHECK(web_dialog_delegate_);
- web_contents_holder_ =
- WebContents::Create(WebContents::CreateParams(browser_context));
- web_contents_ = web_contents_holder_.get();
- WebContentsObserver::Observe(web_contents_);
- zoom::ZoomController::CreateForWebContents(web_contents_);
- if (tab_delegate) {
- override_tab_delegate_ = std::move(tab_delegate);
- web_contents_->SetDelegate(override_tab_delegate_.get());
- } else {
- web_contents_->SetDelegate(this);
- }
- blink::mojom::RendererPreferences* prefs =
- web_contents_->GetMutableRendererPrefs();
- renderer_preferences_util::UpdateFromSystemSettings(
- prefs, Profile::FromBrowserContext(browser_context));
-
- web_contents_->SyncRendererPrefs();
-
- // Set |this| as a delegate so the ConstrainedWebDialogUI can retrieve it.
- ConstrainedWebDialogUI::SetConstrainedDelegate(web_contents_, this);
-
- web_contents_->GetController().LoadURL(
- web_dialog_delegate_->GetDialogContentURL(), content::Referrer(),
- ui::PAGE_TRANSITION_AUTO_TOPLEVEL, std::string());
-}
-
-ConstrainedWebDialogDelegateBase::~ConstrainedWebDialogDelegateBase() {
- if (web_contents_) {
- // Remove reference to |this| in the WebContent since it will becomes
- // invalid and the lifetime of the WebContent may exceed the one of this
- // object.
- ConstrainedWebDialogUI::ClearConstrainedDelegate(web_contents_);
- }
-}
-
-const WebDialogDelegate*
- ConstrainedWebDialogDelegateBase::GetWebDialogDelegate() const {
- return web_dialog_delegate_.get();
-}
-
-WebDialogDelegate*
- ConstrainedWebDialogDelegateBase::GetWebDialogDelegate() {
- return web_dialog_delegate_.get();
-}
-
-void ConstrainedWebDialogDelegateBase::OnDialogCloseFromWebUI() {
- closed_via_webui_ = true;
- CloseContents(web_contents_);
-}
-
-bool ConstrainedWebDialogDelegateBase::closed_via_webui() const {
- return closed_via_webui_;
-}
-
-std::unique_ptr<content::WebContents>
-ConstrainedWebDialogDelegateBase::ReleaseWebContents() {
- return std::move(web_contents_holder_);
-}
-
-gfx::NativeWindow ConstrainedWebDialogDelegateBase::GetNativeDialog() {
- NOTREACHED();
- return nullptr;
-}
-
-WebContents* ConstrainedWebDialogDelegateBase::GetWebContents() {
- return web_contents_;
-}
-
-bool ConstrainedWebDialogDelegateBase::HandleKeyboardEvent(
- content::WebContents* source,
- const NativeWebKeyboardEvent& event) {
- return false;
-}
-
-gfx::Size ConstrainedWebDialogDelegateBase::GetConstrainedWebDialogMinimumSize()
- const {
- NOTREACHED();
- return gfx::Size();
-}
-
-gfx::Size ConstrainedWebDialogDelegateBase::GetConstrainedWebDialogMaximumSize()
- const {
- NOTREACHED();
- return gfx::Size();
-}
-
-gfx::Size
-ConstrainedWebDialogDelegateBase::GetConstrainedWebDialogPreferredSize() const {
- NOTREACHED();
- return gfx::Size();
-}
-
-void ConstrainedWebDialogDelegateBase::WebContentsDestroyed() {
- web_contents_ = nullptr;
-}
-
-void ConstrainedWebDialogDelegateBase::ResizeToGivenSize(
- const gfx::Size size) {
- NOTREACHED();
-}
diff --git a/chromium/chrome/browser/ui/webui/constrained_web_dialog_delegate_base.h b/chromium/chrome/browser/ui/webui/constrained_web_dialog_delegate_base.h
deleted file mode 100644
index 835bc35a46e..00000000000
--- a/chromium/chrome/browser/ui/webui/constrained_web_dialog_delegate_base.h
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_WEBUI_CONSTRAINED_WEB_DIALOG_DELEGATE_BASE_H_
-#define CHROME_BROWSER_UI_WEBUI_CONSTRAINED_WEB_DIALOG_DELEGATE_BASE_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "chrome/browser/ui/webui/constrained_web_dialog_ui.h"
-#include "content/public/browser/web_contents_observer.h"
-#include "ui/web_dialogs/web_dialog_ui.h"
-#include "ui/web_dialogs/web_dialog_web_contents_delegate.h"
-
-namespace content {
-class BrowserContext;
-}
-
-namespace ui {
-class WebDialogDelegate;
-}
-
-// Platform-agnostic base implementation of ConstrainedWebDialogDelegate.
-class ConstrainedWebDialogDelegateBase
- : public ConstrainedWebDialogDelegate,
- public content::WebContentsObserver,
- public ui::WebDialogWebContentsDelegate {
- public:
- // |browser_context| must outlive |this| instance.
- ConstrainedWebDialogDelegateBase(
- content::BrowserContext* browser_context,
- std::unique_ptr<ui::WebDialogDelegate> web_dialog_delegate,
- std::unique_ptr<WebDialogWebContentsDelegate> tab_delegate);
- ~ConstrainedWebDialogDelegateBase() override;
-
- bool closed_via_webui() const;
-
- // ConstrainedWebDialogDelegate interface.
- const ui::WebDialogDelegate* GetWebDialogDelegate() const override;
- ui::WebDialogDelegate* GetWebDialogDelegate() override;
- void OnDialogCloseFromWebUI() override;
- std::unique_ptr<content::WebContents> ReleaseWebContents() override;
- content::WebContents* GetWebContents() override;
- gfx::NativeWindow GetNativeDialog() override;
- gfx::Size GetConstrainedWebDialogMinimumSize() const override;
- gfx::Size GetConstrainedWebDialogMaximumSize() const override;
- gfx::Size GetConstrainedWebDialogPreferredSize() const override;
-
- // WebContentsObserver interface
- void WebContentsDestroyed() override;
-
- // WebDialogWebContentsDelegate interface.
- bool HandleKeyboardEvent(
- content::WebContents* source,
- const content::NativeWebKeyboardEvent& event) override;
-
- // Resize the dialog to the given size.
- virtual void ResizeToGivenSize(const gfx::Size size);
-
- private:
- std::unique_ptr<ui::WebDialogDelegate> web_dialog_delegate_;
-
- // Holds the HTML to display in the constrained dialog.
- std::unique_ptr<content::WebContents> web_contents_holder_;
-
- // Pointer to the WebContents in |web_contents_holder_| for the lifetime of
- // that object, even if ReleaseWebContents() gets called. If the WebContents
- // gets destroyed, |web_contents_| will be set to a nullptr.
- content::WebContents* web_contents_;
-
- // Was the dialog closed from WebUI (in which case |web_dialog_delegate_|'s
- // OnDialogClosed() method has already been called)?
- bool closed_via_webui_;
-
- std::unique_ptr<WebDialogWebContentsDelegate> override_tab_delegate_;
-
- DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateBase);
-};
-
-#endif // CHROME_BROWSER_UI_WEBUI_CONSTRAINED_WEB_DIALOG_DELEGATE_BASE_H_
diff --git a/chromium/chrome/browser/ui/webui/constrained_web_dialog_ui_browsertest.cc b/chromium/chrome/browser/ui/webui/constrained_web_dialog_ui_browsertest.cc
index 7f2c9911f0f..af48074d1e3 100644
--- a/chromium/chrome/browser/ui/webui/constrained_web_dialog_ui_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/constrained_web_dialog_ui_browsertest.cc
@@ -20,8 +20,10 @@
#include "components/web_modal/web_contents_modal_dialog_manager.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_observer.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
+#include "content/public/test/test_utils.h"
#include "ui/web_dialogs/test/test_web_dialog_delegate.h"
using content::WebContents;
@@ -46,23 +48,6 @@ std::string GetChangeDimensionsScript(int dimension) {
"window.document.body.style.height = %d + 'px';", dimension, dimension);
}
-class ConstrainedWebDialogBrowserTestObserver
- : public content::WebContentsObserver {
- public:
- explicit ConstrainedWebDialogBrowserTestObserver(WebContents* contents)
- : content::WebContentsObserver(contents),
- contents_destroyed_(false) {
- }
- ~ConstrainedWebDialogBrowserTestObserver() override {}
-
- bool contents_destroyed() { return contents_destroyed_; }
-
- private:
- void WebContentsDestroyed() override { contents_destroyed_ = true; }
-
- bool contents_destroyed_;
-};
-
class AutoResizingTestWebDialogDelegate
: public ui::test::TestWebDialogDelegate {
public:
@@ -150,15 +135,15 @@ IN_PROC_BROWSER_TEST_F(ConstrainedWebDialogBrowserTest,
ASSERT_TRUE(dialog_contents);
ASSERT_TRUE(IsShowingWebContentsModalDialog(web_contents));
- ConstrainedWebDialogBrowserTestObserver observer(dialog_contents);
+ content::WebContentsDestroyedWatcher watcher(dialog_contents);
std::unique_ptr<WebContents> dialog_contents_holder =
dialog_delegate->ReleaseWebContents();
dialog_delegate->OnDialogCloseFromWebUI();
- ASSERT_FALSE(observer.contents_destroyed());
+ ASSERT_FALSE(watcher.IsDestroyed());
EXPECT_FALSE(IsShowingWebContentsModalDialog(web_contents));
dialog_contents_holder.reset();
- EXPECT_TRUE(observer.contents_destroyed());
+ EXPECT_TRUE(watcher.IsDestroyed());
}
// Tests that dialog autoresizes based on web contents when autoresizing
diff --git a/chromium/chrome/browser/ui/webui/cookies_tree_model_util.cc b/chromium/chrome/browser/ui/webui/cookies_tree_model_util.cc
index c607734158d..8d98f53e135 100644
--- a/chromium/chrome/browser/ui/webui/cookies_tree_model_util.cc
+++ b/chromium/chrome/browser/ui/webui/cookies_tree_model_util.cc
@@ -176,7 +176,7 @@ bool CookiesTreeModelUtil::GetCookieTreeNodeDictionary(
case CookieTreeNode::DetailedInfo::TYPE_FILE_SYSTEM: {
dict->SetString(kKeyType, "file_system");
- const BrowsingDataFileSystemHelper::FileSystemInfo& file_system_info =
+ const browsing_data::FileSystemHelper::FileSystemInfo& file_system_info =
*node.GetDetailedInfo().file_system_info;
const storage::FileSystemType kPerm = storage::kFileSystemTypePersistent;
const storage::FileSystemType kTemp = storage::kFileSystemTypeTemporary;
@@ -235,7 +235,7 @@ bool CookiesTreeModelUtil::GetCookieTreeNodeDictionary(
case CookieTreeNode::DetailedInfo::TYPE_SHARED_WORKER: {
dict->SetString(kKeyType, "shared_worker");
- const BrowsingDataSharedWorkerHelper::SharedWorkerInfo&
+ const browsing_data::SharedWorkerHelper::SharedWorkerInfo&
shared_worker_info = *node.GetDetailedInfo().shared_worker_info;
dict->SetString(kKeyOrigin, shared_worker_info.worker.spec());
diff --git a/chromium/chrome/browser/ui/webui/devtools_ui_data_source_unittest.cc b/chromium/chrome/browser/ui/webui/devtools_ui_data_source_unittest.cc
index e0228c2f7c8..fe7e72ffe11 100644
--- a/chromium/chrome/browser/ui/webui/devtools_ui_data_source_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/devtools_ui_data_source_unittest.cc
@@ -89,8 +89,8 @@ class DevToolsUIDataSourceTest : public testing::Test {
content::WebContents::Getter wc_getter;
data_source()->StartDataRequest(
GURL("chrome://any-host/" + trimmed_path), std::move(wc_getter),
- base::BindRepeating(&DevToolsUIDataSourceTest::OnDataReceived,
- base::Unretained(this)));
+ base::BindOnce(&DevToolsUIDataSourceTest::OnDataReceived,
+ base::Unretained(this)));
}
private:
diff --git a/chromium/chrome/browser/ui/webui/discards/discards.mojom b/chromium/chrome/browser/ui/webui/discards/discards.mojom
index d4d0abab1bf..aec7bd7dcff 100644
--- a/chromium/chrome/browser/ui/webui/discards/discards.mojom
+++ b/chromium/chrome/browser/ui/webui/discards/discards.mojom
@@ -104,7 +104,12 @@ struct PageInfo {
url.mojom.Url main_frame_url;
- // TODO(siggi): Estimate data.
+ // This field is a dictionary of values, where each value is generated by
+ // a performance_manager::NodeDataDescriber implementation and keyed by the
+ // name it registered with. The intent is for each describer to describe
+ // private node-related or node-attached data in some way, to allow presenting
+ // otherwise hidden state in the chrome://discards/graph view.
+ string description_json;
};
// Represents the momentary state of a Frame node.
@@ -115,6 +120,9 @@ struct FrameInfo {
int64 page_id;
int64 parent_frame_id;
int64 process_id;
+
+ // See PageInfo::description_json.
+ string description_json;
};
// Represents the momentary state of a Process node.
@@ -123,6 +131,9 @@ struct ProcessInfo {
mojo_base.mojom.ProcessId pid;
uint64 private_footprint_kb;
+
+ // See PageInfo::description_json.
+ string description_json;
};
// Represents the momentary state of a Worker node.
@@ -135,6 +146,9 @@ struct WorkerInfo {
array<int64> client_frame_ids;
array<int64> client_worker_ids;
array<int64> child_worker_ids;
+
+ // See PageInfo::description_json.
+ string description_json;
};
// Used to transport favicon data.
@@ -180,4 +194,16 @@ interface GraphChangeStream {
interface GraphDump {
// Subscribes |change_subscriber| to a graph change stream.
SubscribeToChanges(pending_remote<GraphChangeStream> change_subscriber);
+
+ // Requests the node descriptions for the nodes with IDs |node_ids|. If any
+ // ID in |node_ids| is invalid, e.g. is not the ID of an existent node,
+ // the result will omit that node ID. The result will also omit nodes that
+ // have no description.
+ // Each returned description is a dictionary of values, where each value is
+ // generated by a performance_manager::NodeDataDescriber implementation and
+ // keyed by the name it registered with. The intent is for each describer to
+ // describe private node-related or node-attached data in some way, to allow
+ // presenting otherwise hidden state in the chrome://discards/graph view.
+ RequestNodeDescriptions(array<int64> node_ids) =>
+ (map<int64, string> node_descriptions_json);
};
diff --git a/chromium/chrome/browser/ui/webui/discards/discards_ui.cc b/chromium/chrome/browser/ui/webui/discards/discards_ui.cc
index 22843d93c0b..fdbf79d7a00 100644
--- a/chromium/chrome/browser/ui/webui/discards/discards_ui.cc
+++ b/chromium/chrome/browser/ui/webui/discards/discards_ui.cc
@@ -8,8 +8,9 @@
#include <vector>
#include "base/bind.h"
+#include "base/check.h"
#include "base/containers/flat_map.h"
-#include "base/logging.h"
+#include "base/notreached.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
#include "chrome/browser/browser_process.h"
diff --git a/chromium/chrome/browser/ui/webui/discards/graph_dump_impl.cc b/chromium/chrome/browser/ui/webui/discards/graph_dump_impl.cc
index c5033d754e3..2cb540e1ebb 100644
--- a/chromium/chrome/browser/ui/webui/discards/graph_dump_impl.cc
+++ b/chromium/chrome/browser/ui/webui/discards/graph_dump_impl.cc
@@ -9,6 +9,7 @@
#include "base/base64.h"
#include "base/bind.h"
+#include "base/json/json_string_value_serializer.h"
#include "base/macros.h"
#include "base/task/cancelable_task_tracker.h"
#include "base/task/post_task.h"
@@ -19,6 +20,8 @@
#include "components/favicon/core/favicon_service.h"
#include "components/favicon_base/favicon_callback.h"
#include "components/performance_manager/public/graph/graph.h"
+#include "components/performance_manager/public/graph/node_data_describer.h"
+#include "components/performance_manager/public/graph/node_data_describer_registry.h"
#include "components/performance_manager/public/performance_manager.h"
#include "components/performance_manager/public/web_contents_proxy.h"
#include "content/public/browser/browser_task_traits.h"
@@ -31,8 +34,14 @@
namespace {
-int64_t GetSerializationId(const performance_manager::Node* node) {
- return performance_manager::Node::GetSerializationId(node);
+// Best effort convert |value| to a string.
+std::string ToJSON(const base::Value& value) {
+ std::string result;
+ JSONStringValueSerializer serializer(&result);
+ if (serializer.Serialize(value))
+ return result;
+
+ return std::string();
}
} // namespace
@@ -95,8 +104,8 @@ void DiscardsGraphDumpImpl::FaviconRequestHelper::RequestFavicon(
// on deletion of the cancelable task tracker.
favicon_service->GetRawFaviconForPageURL(
page_url, {favicon_base::IconType::kFavicon}, kIconSize, kFallbackToHost,
- base::BindRepeating(&FaviconRequestHelper::FaviconDataAvailable,
- base::Unretained(this), serialization_id),
+ base::BindOnce(&FaviconRequestHelper::FaviconDataAvailable,
+ base::Unretained(this), serialization_id),
cancelable_task_tracker_.get());
}
@@ -141,6 +150,11 @@ void DiscardsGraphDumpImpl::BindWithGraph(
&DiscardsGraphDumpImpl::OnConnectionError, base::Unretained(this)));
}
+int64_t DiscardsGraphDumpImpl::GetNodeIdForTesting(
+ const performance_manager::Node* node) {
+ return GetNodeId(node);
+}
+
namespace {
template <typename FunctionType>
@@ -160,6 +174,24 @@ void DiscardsGraphDumpImpl::SubscribeToChanges(
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
change_subscriber_.Bind(std::move(change_subscriber));
+ // Give all existing nodes an ID.
+ for (const performance_manager::FrameNode* frame_node :
+ graph_->GetAllFrameNodes()) {
+ AddNode(frame_node);
+ }
+ for (const performance_manager::PageNode* page_node :
+ graph_->GetAllPageNodes()) {
+ AddNode(page_node);
+ }
+ for (const performance_manager::ProcessNode* process_node :
+ graph_->GetAllProcessNodes()) {
+ AddNode(process_node);
+ }
+ for (const performance_manager::WorkerNode* worker_node :
+ graph_->GetAllWorkerNodes()) {
+ AddNode(worker_node);
+ }
+
// Send creation notifications for all existing nodes.
for (const performance_manager::ProcessNode* process_node :
graph_->GetAllProcessNodes())
@@ -194,6 +226,25 @@ void DiscardsGraphDumpImpl::SubscribeToChanges(
graph_->AddWorkerNodeObserver(this);
}
+void DiscardsGraphDumpImpl::RequestNodeDescriptions(
+ const std::vector<int64_t>& node_ids,
+ RequestNodeDescriptionsCallback callback) {
+ base::flat_map<int64_t, std::string> descriptions;
+ performance_manager::NodeDataDescriberRegistry* describer_registry =
+ graph_->GetNodeDataDescriberRegistry();
+ for (int64_t node_id : node_ids) {
+ auto it = nodes_by_id_.find(NodeId::FromUnsafeValue(node_id));
+ // The requested node may have been removed by the time the request arrives,
+ // in which case no description is returned for that node ID.
+ if (it != nodes_by_id_.end()) {
+ descriptions[node_id] =
+ ToJSON(describer_registry->DescribeNodeData(it->second));
+ }
+ }
+
+ std::move(callback).Run(descriptions);
+}
+
void DiscardsGraphDumpImpl::OnPassedToGraph(performance_manager::Graph* graph) {
DCHECK(!graph_);
graph_ = graph;
@@ -223,6 +274,7 @@ void DiscardsGraphDumpImpl::OnTakenFromGraph(
void DiscardsGraphDumpImpl::OnFrameNodeAdded(
const performance_manager::FrameNode* frame_node) {
+ AddNode(frame_node);
SendFrameNotification(frame_node, true);
StartFrameFaviconRequest(frame_node);
}
@@ -230,6 +282,7 @@ void DiscardsGraphDumpImpl::OnFrameNodeAdded(
void DiscardsGraphDumpImpl::OnBeforeFrameNodeRemoved(
const performance_manager::FrameNode* frame_node) {
SendDeletionNotification(frame_node);
+ RemoveNode(frame_node);
}
void DiscardsGraphDumpImpl::OnURLChanged(
@@ -241,6 +294,7 @@ void DiscardsGraphDumpImpl::OnURLChanged(
void DiscardsGraphDumpImpl::OnPageNodeAdded(
const performance_manager::PageNode* page_node) {
+ AddNode(page_node);
SendPageNotification(page_node, true);
StartPageFaviconRequest(page_node);
}
@@ -248,6 +302,7 @@ void DiscardsGraphDumpImpl::OnPageNodeAdded(
void DiscardsGraphDumpImpl::OnBeforePageNodeRemoved(
const performance_manager::PageNode* page_node) {
SendDeletionNotification(page_node);
+ RemoveNode(page_node);
}
void DiscardsGraphDumpImpl::OnFaviconUpdated(
@@ -264,6 +319,7 @@ void DiscardsGraphDumpImpl::OnMainFrameUrlChanged(
void DiscardsGraphDumpImpl::OnProcessNodeAdded(
const performance_manager::ProcessNode* process_node) {
+ AddNode(process_node);
SendProcessNotification(process_node, true);
}
@@ -275,16 +331,19 @@ void DiscardsGraphDumpImpl::OnProcessLifetimeChange(
void DiscardsGraphDumpImpl::OnBeforeProcessNodeRemoved(
const performance_manager::ProcessNode* process_node) {
SendDeletionNotification(process_node);
+ RemoveNode(process_node);
}
void DiscardsGraphDumpImpl::OnWorkerNodeAdded(
const performance_manager::WorkerNode* worker_node) {
+ AddNode(worker_node);
SendWorkerNotification(worker_node, true);
}
void DiscardsGraphDumpImpl::OnBeforeWorkerNodeRemoved(
const performance_manager::WorkerNode* worker_node) {
SendDeletionNotification(worker_node);
+ RemoveNode(worker_node);
}
void DiscardsGraphDumpImpl::OnFinalResponseURLDetermined(
@@ -316,6 +375,31 @@ void DiscardsGraphDumpImpl::OnBeforeClientWorkerRemoved(
SendWorkerNotification(worker_node, false);
}
+void DiscardsGraphDumpImpl::AddNode(const performance_manager::Node* node) {
+ DCHECK(node_ids_.find(node) == node_ids_.end());
+ NodeId new_id = node_id_generator_.GenerateNextId();
+ node_ids_.insert(std::make_pair(node, new_id));
+ nodes_by_id_.insert(std::make_pair(new_id, node));
+}
+
+void DiscardsGraphDumpImpl::RemoveNode(const performance_manager::Node* node) {
+ auto it = node_ids_.find(node);
+ DCHECK(it != node_ids_.end());
+ NodeId node_id = it->second;
+ node_ids_.erase(it);
+ size_t erased = nodes_by_id_.erase(node_id);
+ DCHECK_EQ(1u, erased);
+}
+
+int64_t DiscardsGraphDumpImpl::GetNodeId(
+ const performance_manager::Node* node) {
+ if (node == nullptr)
+ return 0;
+
+ DCHECK(node_ids_.find(node) != node_ids_.end());
+ return node_ids_[node].GetUnsafeValue();
+}
+
DiscardsGraphDumpImpl::FaviconRequestHelper*
DiscardsGraphDumpImpl::EnsureFaviconRequestHelper() {
if (!favicon_request_helper_) {
@@ -332,12 +416,12 @@ void DiscardsGraphDumpImpl::StartPageFaviconRequest(
if (!page_node->GetMainFrameUrl().is_valid())
return;
- base::PostTask(FROM_HERE, {content::BrowserThread::UI},
- base::BindOnce(&FaviconRequestHelper::RequestFavicon,
- base::Unretained(EnsureFaviconRequestHelper()),
- page_node->GetMainFrameUrl(),
- page_node->GetContentsProxy(),
- GetSerializationId(page_node)));
+ base::PostTask(
+ FROM_HERE, {content::BrowserThread::UI},
+ base::BindOnce(&FaviconRequestHelper::RequestFavicon,
+ base::Unretained(EnsureFaviconRequestHelper()),
+ page_node->GetMainFrameUrl(),
+ page_node->GetContentsProxy(), GetNodeId(page_node)));
}
void DiscardsGraphDumpImpl::StartFrameFaviconRequest(
@@ -350,7 +434,7 @@ void DiscardsGraphDumpImpl::StartFrameFaviconRequest(
base::Unretained(EnsureFaviconRequestHelper()),
frame_node->GetURL(),
frame_node->GetPageNode()->GetContentsProxy(),
- GetSerializationId(frame_node)));
+ GetNodeId(frame_node)));
}
void DiscardsGraphDumpImpl::SendFrameNotification(
@@ -360,18 +444,20 @@ void DiscardsGraphDumpImpl::SendFrameNotification(
// TODO(https://crbug.com/1028117): Add more frame properties.
discards::mojom::FrameInfoPtr frame_info = discards::mojom::FrameInfo::New();
- frame_info->id = GetSerializationId(frame);
+ frame_info->id = GetNodeId(frame);
auto* parent_frame = frame->GetParentFrameNode();
- frame_info->parent_frame_id = GetSerializationId(parent_frame);
+ frame_info->parent_frame_id = GetNodeId(parent_frame);
auto* process = frame->GetProcessNode();
- frame_info->process_id = GetSerializationId(process);
+ frame_info->process_id = GetNodeId(process);
auto* page = frame->GetPageNode();
- frame_info->page_id = GetSerializationId(page);
+ frame_info->page_id = GetNodeId(page);
frame_info->url = frame->GetURL();
+ frame_info->description_json =
+ ToJSON(graph_->GetNodeDataDescriberRegistry()->DescribeNodeData(frame));
if (created)
change_subscriber_->FrameCreated(std::move(frame_info));
@@ -386,8 +472,11 @@ void DiscardsGraphDumpImpl::SendPageNotification(
// TODO(https://crbug.com/1028117): Add more page_node properties.
discards::mojom::PageInfoPtr page_info = discards::mojom::PageInfo::New();
- page_info->id = GetSerializationId(page_node);
+ page_info->id = GetNodeId(page_node);
page_info->main_frame_url = page_node->GetMainFrameUrl();
+ page_info->description_json = ToJSON(
+ graph_->GetNodeDataDescriberRegistry()->DescribeNodeData(page_node));
+
if (created)
change_subscriber_->PageCreated(std::move(page_info));
else
@@ -401,10 +490,13 @@ void DiscardsGraphDumpImpl::SendProcessNotification(
discards::mojom::ProcessInfoPtr process_info =
discards::mojom::ProcessInfo::New();
- process_info->id = GetSerializationId(process);
+ process_info->id = GetNodeId(process);
process_info->pid = process->GetProcessId();
process_info->private_footprint_kb = process->GetPrivateFootprintKb();
+ process_info->description_json =
+ ToJSON(graph_->GetNodeDataDescriberRegistry()->DescribeNodeData(process));
+
if (created)
change_subscriber_->ProcessCreated(std::move(process_info));
else
@@ -418,23 +510,26 @@ void DiscardsGraphDumpImpl::SendWorkerNotification(
discards::mojom::WorkerInfoPtr worker_info =
discards::mojom::WorkerInfo::New();
- worker_info->id = GetSerializationId(worker);
+ worker_info->id = GetNodeId(worker);
worker_info->url = worker->GetURL();
- worker_info->process_id = GetSerializationId(worker->GetProcessNode());
+ worker_info->process_id = GetNodeId(worker->GetProcessNode());
for (const performance_manager::FrameNode* client_frame :
worker->GetClientFrames()) {
- worker_info->client_frame_ids.push_back(GetSerializationId(client_frame));
+ worker_info->client_frame_ids.push_back(GetNodeId(client_frame));
}
for (const performance_manager::WorkerNode* client_worker :
worker->GetClientWorkers()) {
- worker_info->client_worker_ids.push_back(GetSerializationId(client_worker));
+ worker_info->client_worker_ids.push_back(GetNodeId(client_worker));
}
for (const performance_manager::WorkerNode* child_worker :
worker->GetChildWorkers()) {
- worker_info->child_worker_ids.push_back(GetSerializationId(child_worker));
+ worker_info->child_worker_ids.push_back(GetNodeId(child_worker));
}
+ worker_info->description_json =
+ ToJSON(graph_->GetNodeDataDescriberRegistry()->DescribeNodeData(worker));
+
if (created)
change_subscriber_->WorkerCreated(std::move(worker_info));
else
@@ -444,7 +539,7 @@ void DiscardsGraphDumpImpl::SendWorkerNotification(
void DiscardsGraphDumpImpl::SendDeletionNotification(
const performance_manager::Node* node) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- change_subscriber_->NodeDeleted(GetSerializationId(node));
+ change_subscriber_->NodeDeleted(GetNodeId(node));
}
void DiscardsGraphDumpImpl::SendFaviconNotification(
diff --git a/chromium/chrome/browser/ui/webui/discards/graph_dump_impl.h b/chromium/chrome/browser/ui/webui/discards/graph_dump_impl.h
index d70ccaf1ea0..893d7f3faec 100644
--- a/chromium/chrome/browser/ui/webui/discards/graph_dump_impl.h
+++ b/chromium/chrome/browser/ui/webui/discards/graph_dump_impl.h
@@ -7,9 +7,11 @@
#include <memory>
+#include "base/containers/flat_map.h"
#include "base/memory/ref_counted_memory.h"
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
+#include "base/util/type_safety/id_type.h"
#include "chrome/browser/ui/webui/discards/discards.mojom.h"
#include "components/performance_manager/public/graph/frame_node.h"
#include "components/performance_manager/public/graph/graph.h"
@@ -21,7 +23,6 @@
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
-// TODO(siggi): Add workers to the WebUI graph.
class DiscardsGraphDumpImpl : public discards::mojom::GraphDump,
public performance_manager::GraphOwned,
public performance_manager::FrameNodeObserver,
@@ -43,11 +44,16 @@ class DiscardsGraphDumpImpl : public discards::mojom::GraphDump,
performance_manager::Graph* graph,
mojo::PendingReceiver<discards::mojom::GraphDump> receiver);
+ int64_t GetNodeIdForTesting(const performance_manager::Node* node);
+
protected:
// WebUIGraphDump implementation.
void SubscribeToChanges(
mojo::PendingRemote<discards::mojom::GraphChangeStream> change_subscriber)
override;
+ void RequestNodeDescriptions(
+ const std::vector<int64_t>& node_ids,
+ RequestNodeDescriptionsCallback callback) override;
// GraphOwned implementation.
void OnPassedToGraph(performance_manager::Graph* graph) override;
@@ -92,6 +98,10 @@ class DiscardsGraphDumpImpl : public discards::mojom::GraphDump,
// Ignored.
void OnHadFormInteractionChanged(
const performance_manager::FrameNode* frame_node) override {}
+ // Ignored.
+ void OnFirstContentfulPaint(
+ const performance_manager::FrameNode* frame_node,
+ base::TimeDelta time_since_navigation_start) override {}
// PageNodeObserver implementation:
void OnPageNodeAdded(const performance_manager::PageNode* page_node) override;
@@ -172,6 +182,11 @@ class DiscardsGraphDumpImpl : public discards::mojom::GraphDump,
// The favicon requests happen on the UI thread. This helper class
// maintains the state required to do that.
class FaviconRequestHelper;
+ using NodeId = util::IdType64<class NodeIdTag>;
+
+ void AddNode(const performance_manager::Node* node);
+ void RemoveNode(const performance_manager::Node* node);
+ int64_t GetNodeId(const performance_manager::Node* node);
FaviconRequestHelper* EnsureFaviconRequestHelper();
@@ -201,6 +216,11 @@ class DiscardsGraphDumpImpl : public discards::mojom::GraphDump,
std::unique_ptr<FaviconRequestHelper> favicon_request_helper_;
+ // The live nodes and their IDs.
+ base::flat_map<const performance_manager::Node*, NodeId> node_ids_;
+ base::flat_map<NodeId, const performance_manager::Node*> nodes_by_id_;
+ NodeId::Generator node_id_generator_;
+
// The current change subscriber to this dumper. This instance is subscribed
// to every node in |graph_| save for the system node, so long as there is a
// subscriber.
diff --git a/chromium/chrome/browser/ui/webui/discards/graph_dump_impl_unittest.cc b/chromium/chrome/browser/ui/webui/discards/graph_dump_impl_unittest.cc
index f1b2e7d0945..32c220349fb 100644
--- a/chromium/chrome/browser/ui/webui/discards/graph_dump_impl_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/discards/graph_dump_impl_unittest.cc
@@ -8,11 +8,14 @@
#include <set>
#include <utility>
+#include "base/json/json_reader.h"
#include "base/run_loop.h"
#include "base/stl_util.h"
#include "base/test/bind_test_util.h"
#include "base/time/time.h"
#include "chrome/browser/ui/webui/discards/discards.mojom.h"
+#include "components/performance_manager/public/graph/node_data_describer.h"
+#include "components/performance_manager/public/graph/node_data_describer_registry.h"
#include "components/performance_manager/test_support/graph_impl.h"
#include "components/performance_manager/test_support/mock_graphs.h"
#include "content/public/test/browser_task_environment.h"
@@ -20,13 +23,14 @@
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
+#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
using performance_manager::NodeBase;
-const std::string kHtmlMimeType = "text/html";
+const char kHtmlMimeType[] = "text/html";
class TestChangeStream : public discards::mojom::GraphChangeStream {
public:
@@ -139,6 +143,31 @@ class DiscardsGraphDumpImplTest : public testing::Test {
performance_manager::TestGraphImpl graph_;
};
+class TestNodeDataDescriber : public performance_manager::NodeDataDescriber {
+ public:
+ // NodeDataDescriber implementations:
+ base::Value DescribeFrameNodeData(
+ const performance_manager::FrameNode* node) const override {
+ return base::Value("frame");
+ }
+ base::Value DescribePageNodeData(
+ const performance_manager::PageNode* node) const override {
+ return base::Value("page");
+ }
+ base::Value DescribeProcessNodeData(
+ const performance_manager::ProcessNode* node) const override {
+ return base::Value("process");
+ }
+ base::Value DescribeSystemNodeData(
+ const performance_manager::SystemNode* node) const override {
+ return base::Value("system");
+ }
+ base::Value DescribeWorkerNodeData(
+ const performance_manager::WorkerNode* node) const override {
+ return base::Value("worker");
+ }
+};
+
} // namespace
TEST_F(DiscardsGraphDumpImplTest, ChangeStream) {
@@ -175,6 +204,9 @@ TEST_F(DiscardsGraphDumpImplTest, ChangeStream) {
impl->BindWithGraph(&graph_, graph_dump_remote.BindNewPipeAndPassReceiver());
graph_.PassToGraph(std::move(impl));
+ TestNodeDataDescriber describer;
+ graph_.GetNodeDataDescriberRegistry()->RegisterDescriber(&describer, "test");
+
TestChangeStream change_stream;
graph_dump_remote->SubscribeToChanges(change_stream.GetRemote());
@@ -186,11 +218,22 @@ TEST_F(DiscardsGraphDumpImplTest, ChangeStream) {
EXPECT_EQ(2u, change_stream.process_map().size());
for (const auto& kv : change_stream.process_map()) {
- EXPECT_NE(0u, kv.second->id);
+ const auto* process_info = kv.second.get();
+ EXPECT_NE(0u, process_info->id);
+ EXPECT_EQ(base::JSONReader::Read("{\"test\":\"process\"}"),
+ base::JSONReader::Read(process_info->description_json));
}
EXPECT_EQ(3u, change_stream.frame_map().size());
+ for (const auto& kv : change_stream.frame_map()) {
+ EXPECT_EQ(base::JSONReader::Read("{\"test\":\"frame\"}"),
+ base::JSONReader::Read(kv.second->description_json));
+ }
EXPECT_EQ(1u, change_stream.worker_map().size());
+ for (const auto& kv : change_stream.worker_map()) {
+ EXPECT_EQ(base::JSONReader::Read("{\"test\":\"worker\"}"),
+ base::JSONReader::Read(kv.second->description_json));
+ }
// Count the top-level frames as we go.
size_t top_level_frames = 0;
@@ -203,7 +246,7 @@ TEST_F(DiscardsGraphDumpImplTest, ChangeStream) {
EXPECT_NE(0u, frame->page_id);
// The page's main frame should have an URL.
- if (frame->id == NodeBase::GetSerializationId(main_frame))
+ if (frame->id == impl_raw->GetNodeIdForTesting(main_frame))
EXPECT_EQ(kExampleUrl, frame->url);
}
EXPECT_NE(0u, frame->id);
@@ -218,6 +261,8 @@ TEST_F(DiscardsGraphDumpImplTest, ChangeStream) {
const auto& page = kv.second;
EXPECT_NE(0u, page->id);
EXPECT_EQ(kExampleUrl, page->main_frame_url);
+ EXPECT_EQ(base::JSONReader::Read("{\"test\":\"page\"}"),
+ base::JSONReader::Read(kv.second->description_json));
}
// Test change notifications.
@@ -226,7 +271,7 @@ TEST_F(DiscardsGraphDumpImplTest, ChangeStream) {
false, now, next_navigation_id++, kAnotherURL, kHtmlMimeType);
size_t child_frame_id =
- NodeBase::GetSerializationId(mock_graph.child_frame.get());
+ impl_raw->GetNodeIdForTesting(mock_graph.child_frame.get());
mock_graph.child_frame.reset();
task_environment.RunUntilIdle();
@@ -236,12 +281,59 @@ TEST_F(DiscardsGraphDumpImplTest, ChangeStream) {
EXPECT_FALSE(base::Contains(change_stream.id_set(), child_frame_id));
const auto main_page_it = change_stream.page_map().find(
- NodeBase::GetSerializationId(mock_graph.page.get()));
+ impl_raw->GetNodeIdForTesting(mock_graph.page.get()));
ASSERT_TRUE(main_page_it != change_stream.page_map().end());
EXPECT_EQ(kAnotherURL, main_page_it->second->main_frame_url);
task_environment.RunUntilIdle();
+ // Test RequestNodeDescriptions.
+ std::vector<int64_t> descriptions_requested;
+ for (int64_t node_id : change_stream.id_set()) {
+ descriptions_requested.push_back(node_id);
+ }
+ // Increase the last ID by one. As the entries are in increasing order, this
+ // results in a request for all but one nodes, and one non-existent node id.
+ descriptions_requested.back() += 1;
+
+ {
+ base::RunLoop run_loop;
+ base::RepeatingClosure quit_closure = run_loop.QuitClosure();
+
+ graph_dump_remote->RequestNodeDescriptions(
+ descriptions_requested,
+ base::BindLambdaForTesting(
+ [&descriptions_requested,
+ &quit_closure](const base::flat_map<int64_t, std::string>&
+ node_descriptions_json) {
+ std::vector<int64_t> keys_received;
+ // Check that the descriptions make sense.
+ for (auto kv : node_descriptions_json) {
+ keys_received.push_back(kv.first);
+ base::Optional<base::Value> v =
+ base::JSONReader::Read(kv.second);
+ EXPECT_TRUE(v->is_dict());
+ std::string* str = v->FindStringKey("test");
+ EXPECT_TRUE(str);
+ if (str) {
+ EXPECT_TRUE(*str == "frame" || *str == "page" ||
+ *str == "process" || *str == "worker");
+ }
+ }
+
+ EXPECT_THAT(keys_received,
+ ::testing::UnorderedElementsAreArray(
+ descriptions_requested.data(),
+ descriptions_requested.size() - 1));
+
+ quit_closure.Run();
+ }));
+
+ run_loop.Run();
+ }
+
+ task_environment.RunUntilIdle();
+
// Make sure the Dump impl is torn down when the proxy closes.
graph_dump_remote.reset();
task_environment.RunUntilIdle();
@@ -249,4 +341,6 @@ TEST_F(DiscardsGraphDumpImplTest, ChangeStream) {
EXPECT_EQ(nullptr, graph_.TakeFromGraph(impl_raw));
worker->RemoveClientFrame(mock_graph.frame.get());
+
+ graph_.GetNodeDataDescriberRegistry()->UnregisterDescriber(&describer);
}
diff --git a/chromium/chrome/browser/ui/webui/downloads/downloads_list_tracker.cc b/chromium/chrome/browser/ui/webui/downloads/downloads_list_tracker.cc
index 5fabbe1d591..1bc52afd2e8 100644
--- a/chromium/chrome/browser/ui/webui/downloads/downloads_list_tracker.cc
+++ b/chromium/chrome/browser/ui/webui/downloads/downloads_list_tracker.cc
@@ -44,6 +44,9 @@ using DownloadVector = DownloadManager::DownloadVector;
namespace {
+// Max URL length to be sent to the download page.
+const int kMaxURLLength = 2 * 1024 * 1024;
+
// Returns a string constant to be used as the |danger_type| value in
// CreateDownloadData(). This can be the empty string, if the danger type is not
// relevant for the UI.
@@ -255,8 +258,12 @@ downloads::mojom::DataPtr DownloadsListTracker::CreateDownloadData(
base::string16 file_name =
download_item->GetFileNameToReportUser().LossyDisplayName();
file_name = base::i18n::GetDisplayStringInLTRDirectionality(file_name);
+
file_value->file_name = base::UTF16ToUTF8(file_name);
file_value->url = download_item->GetURL().spec();
+ // If URL is too long, truncate it.
+ if (file_value->url.size() > kMaxURLLength)
+ file_value->url.resize(kMaxURLLength);
file_value->total = static_cast<int>(download_item->GetTotalBytes());
file_value->file_externally_removed =
download_item->GetFileExternallyRemoved();
diff --git a/chromium/chrome/browser/ui/webui/extensions/chromeos/kiosk_apps_handler.cc b/chromium/chrome/browser/ui/webui/extensions/chromeos/kiosk_apps_handler.cc
index 8f200c7beb7..2f9d3d733fd 100644
--- a/chromium/chrome/browser/ui/webui/extensions/chromeos/kiosk_apps_handler.cc
+++ b/chromium/chrome/browser/ui/webui/extensions/chromeos/kiosk_apps_handler.cc
@@ -249,8 +249,8 @@ void KioskAppsHandler::HandleInitializeKioskAppSettings(
AllowJavascript();
KioskAppManager::Get()->GetConsumerKioskAutoLaunchStatus(
- base::Bind(&KioskAppsHandler::OnGetConsumerKioskAutoLaunchStatus,
- weak_ptr_factory_.GetWeakPtr(), callback_id));
+ base::BindOnce(&KioskAppsHandler::OnGetConsumerKioskAutoLaunchStatus,
+ weak_ptr_factory_.GetWeakPtr(), callback_id));
}
void KioskAppsHandler::HandleGetKioskAppSettings(const base::ListValue* args) {
diff --git a/chromium/chrome/browser/ui/webui/extensions/extension_icon_source.cc b/chromium/chrome/browser/ui/webui/extensions/extension_icon_source.cc
index 9d56d83ca97..b16902bcb1a 100644
--- a/chromium/chrome/browser/ui/webui/extensions/extension_icon_source.cc
+++ b/chromium/chrome/browser/ui/webui/extensions/extension_icon_source.cc
@@ -80,12 +80,17 @@ GURL ExtensionIconSource::GetIconURL(const Extension* extension,
int icon_size,
ExtensionIconSet::MatchType match,
bool grayscale) {
- GURL icon_url(base::StringPrintf("%s%s/%d/%d%s",
- chrome::kChromeUIExtensionIconURL,
- extension->id().c_str(),
- icon_size,
- match,
- grayscale ? "?grayscale=true" : ""));
+ return GetIconURL(extension->id(), icon_size, match, grayscale);
+}
+
+// static
+GURL ExtensionIconSource::GetIconURL(const std::string& extension_id,
+ int icon_size,
+ ExtensionIconSet::MatchType match,
+ bool grayscale) {
+ GURL icon_url(base::StringPrintf(
+ "%s%s/%d/%d%s", chrome::kChromeUIExtensionIconURL, extension_id.c_str(),
+ icon_size, match, grayscale ? "?grayscale=true" : ""));
CHECK(icon_url.is_valid());
return icon_url;
}
@@ -224,8 +229,8 @@ void ExtensionIconSource::LoadFaviconImage(int request_id) {
favicon_service->GetRawFaviconForPageURL(
favicon_url, {favicon_base::IconType::kFavicon}, gfx::kFaviconSize,
/*fallback_to_host=*/false,
- base::Bind(&ExtensionIconSource::OnFaviconDataAvailable,
- base::Unretained(this), request_id),
+ base::BindOnce(&ExtensionIconSource::OnFaviconDataAvailable,
+ base::Unretained(this), request_id),
&cancelable_task_tracker_);
}
diff --git a/chromium/chrome/browser/ui/webui/extensions/extension_icon_source.h b/chromium/chrome/browser/ui/webui/extensions/extension_icon_source.h
index 324b27fd39f..4cf142d54ed 100644
--- a/chromium/chrome/browser/ui/webui/extensions/extension_icon_source.h
+++ b/chromium/chrome/browser/ui/webui/extensions/extension_icon_source.h
@@ -62,6 +62,10 @@ class ExtensionIconSource : public content::URLDataSource,
int icon_size,
ExtensionIconSet::MatchType match,
bool grayscale);
+ static GURL GetIconURL(const std::string& extension_id,
+ int icon_size,
+ ExtensionIconSet::MatchType match,
+ bool grayscale);
// A public utility function for accessing the bitmap of the image specified
// by |resource_id|.
diff --git a/chromium/chrome/browser/ui/webui/extensions/extension_settings_browsertest.cc b/chromium/chrome/browser/ui/webui/extensions/extension_settings_browsertest.cc
index 3b391f2bc25..4626558b6af 100644
--- a/chromium/chrome/browser/ui/webui/extensions/extension_settings_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/extensions/extension_settings_browsertest.cc
@@ -26,6 +26,7 @@
#include "components/prefs/pref_service.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_utils.h"
#include "extensions/browser/extension_dialog_auto_confirm.h"
@@ -217,15 +218,8 @@ IN_PROC_BROWSER_TEST_F(ExtensionSettingsUIBrowserTest, ListenerRegistration) {
}
}
-// Flaky on Windows: crbug.com/
-#if defined(OS_WIN)
-#define MAYBE_ActivityLogInactiveWithoutSwitch \
- DISABLED_ActivityLogInactiveWithoutSwitch
-#else
-#define MAYBE_ActivityLogInactiveWithoutSwitch ActivityLogInactiveWithoutSwitch
-#endif // OS_WIN
IN_PROC_BROWSER_TEST_F(ExtensionSettingsUIBrowserTest,
- MAYBE_ActivityLogInactiveWithoutSwitch) {
+ ActivityLogInactiveWithoutSwitch) {
// Navigate to chrome://extensions which is a whitelisted URL for the
// chrome.activityLogPrivate API.
GURL extensions_url("chrome://extensions");
diff --git a/chromium/chrome/browser/ui/webui/extensions/extensions_internals_browsertest.cc b/chromium/chrome/browser/ui/webui/extensions/extensions_internals_browsertest.cc
index 6fda6f115bd..89fe092d3ee 100644
--- a/chromium/chrome/browser/ui/webui/extensions/extensions_internals_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/extensions/extensions_internals_browsertest.cc
@@ -14,6 +14,7 @@
#include "chrome/common/webui_url_constants.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "url/gurl.h"
@@ -39,7 +40,6 @@ IN_PROC_BROWSER_TEST_F(ExtensionsInternalsTest,
ASSERT_TRUE(web_contents);
EXPECT_EQ(navigation_url, web_contents->GetLastCommittedURL());
EXPECT_FALSE(web_contents->IsCrashed());
- EXPECT_FALSE(web_contents->GetInterstitialPage());
// Look for a bit of JSON that has the extension's unique ID.
bool has_text = false;
diff --git a/chromium/chrome/browser/ui/webui/extensions/extensions_ui.cc b/chromium/chrome/browser/ui/webui/extensions/extensions_ui.cc
index e8519afadf8..2f41efa7f34 100644
--- a/chromium/chrome/browser/ui/webui/extensions/extensions_ui.cc
+++ b/chromium/chrome/browser/ui/webui/extensions/extensions_ui.cc
@@ -29,7 +29,6 @@
#include "chrome/grit/extensions_resources.h"
#include "chrome/grit/extensions_resources_map.h"
#include "chrome/grit/generated_resources.h"
-#include "chrome/grit/theme_resources.h"
#include "components/google/core/common/google_util.h"
#include "components/pref_registry/pref_registry_syncable.h"
#include "components/prefs/pref_service.h"
@@ -40,6 +39,7 @@
#include "extensions/browser/extension_prefs.h"
#include "extensions/common/extension_features.h"
#include "extensions/common/extension_urls.h"
+#include "extensions/grit/extensions_browser_resources.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/base/webui/web_ui_util.h"
@@ -171,6 +171,7 @@ content::WebUIDataSource* CreateMdExtensionsSource(Profile* profile,
IDS_EXTENSIONS_ACTIVITY_LOG_STREAM_TAB_HEADING},
{"startActivityStream", IDS_EXTENSIONS_START_ACTIVITY_STREAM},
{"stopActivityStream", IDS_EXTENSIONS_STOP_ACTIVITY_STREAM},
+ {"parentDisabledPermissions", IDS_EXTENSIONS_PERMISSIONS_OFF},
{"emptyStreamStarted", IDS_EXTENSIONS_EMPTY_STREAM_STARTED},
{"emptyStreamStopped", IDS_EXTENSIONS_EMPTY_STREAM_STOPPED},
{"activityArgumentsHeading", IDS_EXTENSIONS_ACTIVITY_ARGUMENTS_HEADING},
diff --git a/chromium/chrome/browser/ui/webui/favicon_source.cc b/chromium/chrome/browser/ui/webui/favicon_source.cc
index 17eca9e53f0..00551a6a3d1 100644
--- a/chromium/chrome/browser/ui/webui/favicon_source.cc
+++ b/chromium/chrome/browser/ui/webui/favicon_source.cc
@@ -15,7 +15,7 @@
#include "chrome/browser/favicon/history_ui_favicon_request_handler_factory.h"
#include "chrome/browser/history/top_sites_factory.h"
#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/search/instant_io_context.h"
+#include "chrome/browser/search/instant_service.h"
#include "chrome/common/url_constants.h"
#include "chrome/common/webui_url_constants.h"
#include "components/favicon/core/history_ui_favicon_request_handler.h"
@@ -184,9 +184,7 @@ void FaviconSource::StartDataRequest(
base::BindOnce(&FaviconSource::OnFaviconDataAvailable,
weak_ptr_factory_.GetWeakPtr(), std::move(callback),
parsed),
- parsed_history_ui_origin,
- /*icon_url_for_uma=*/
- GURL(parsed.icon_url));
+ parsed_history_ui_origin);
}
}
@@ -208,13 +206,13 @@ bool FaviconSource::ShouldReplaceExistingSource() {
bool FaviconSource::ShouldServiceRequest(
const GURL& url,
- content::ResourceContext* resource_context,
+ content::BrowserContext* browser_context,
int render_process_id) {
if (url.SchemeIs(chrome::kChromeSearchScheme)) {
- return InstantIOContext::ShouldServiceRequest(url, resource_context,
- render_process_id);
+ return InstantService::ShouldServiceRequest(url, browser_context,
+ render_process_id);
}
- return URLDataSource::ShouldServiceRequest(url, resource_context,
+ return URLDataSource::ShouldServiceRequest(url, browser_context,
render_process_id);
}
diff --git a/chromium/chrome/browser/ui/webui/favicon_source.h b/chromium/chrome/browser/ui/webui/favicon_source.h
index b46bf394d8d..8c395527cd7 100644
--- a/chromium/chrome/browser/ui/webui/favicon_source.h
+++ b/chromium/chrome/browser/ui/webui/favicon_source.h
@@ -53,7 +53,7 @@ class FaviconSource : public content::URLDataSource {
bool AllowCaching() override;
bool ShouldReplaceExistingSource() override;
bool ShouldServiceRequest(const GURL& url,
- content::ResourceContext* resource_context,
+ content::BrowserContext* browser_context,
int render_process_id) override;
protected:
diff --git a/chromium/chrome/browser/ui/webui/favicon_source_unittest.cc b/chromium/chrome/browser/ui/webui/favicon_source_unittest.cc
index d9755279e48..fa12bd94c3f 100644
--- a/chromium/chrome/browser/ui/webui/favicon_source_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/favicon_source_unittest.cc
@@ -23,6 +23,7 @@
#include "content/public/browser/browser_context.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/browser_task_environment.h"
+#include "content/public/test/test_renderer_host.h"
#include "content/public/test/web_contents_tester.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/common/extension_builder.h"
@@ -53,20 +54,18 @@ class MockHistoryUiFaviconRequestHandler
MockHistoryUiFaviconRequestHandler() = default;
~MockHistoryUiFaviconRequestHandler() override = default;
- MOCK_METHOD5(
+ MOCK_METHOD4(
GetRawFaviconForPageURL,
void(const GURL& page_url,
int desired_size_in_pixel,
favicon_base::FaviconRawBitmapCallback callback,
- favicon::HistoryUiFaviconRequestOrigin request_origin_for_uma,
- const GURL& icon_url_for_uma));
+ favicon::HistoryUiFaviconRequestOrigin request_origin_for_uma));
- MOCK_METHOD4(
+ MOCK_METHOD3(
GetFaviconImageForPageURL,
void(const GURL& page_url,
favicon_base::FaviconImageCallback callback,
- favicon::HistoryUiFaviconRequestOrigin request_origin_for_uma,
- const GURL& icon_url_for_uma));
+ favicon::HistoryUiFaviconRequestOrigin request_origin_for_uma));
};
class TestFaviconSource : public FaviconSource {
@@ -127,9 +126,9 @@ class FaviconSourceTestBase : public testing::Test {
return kDummyTaskId;
});
ON_CALL(*mock_history_ui_favicon_request_handler_,
- GetRawFaviconForPageURL(_, _, _, _, _))
+ GetRawFaviconForPageURL(_, _, _, _))
.WillByDefault([](auto, auto,
- favicon_base::FaviconRawBitmapCallback callback, auto,
+ favicon_base::FaviconRawBitmapCallback callback,
auto) {
std::move(callback).Run(favicon_base::FaviconRawBitmapResult());
});
@@ -146,6 +145,7 @@ class FaviconSourceTestBase : public testing::Test {
protected:
const scoped_refptr<base::RefCountedBytes> kDummyIconBytes;
content::BrowserTaskEnvironment task_environment_;
+ content::RenderViewHostTestEnabler test_render_host_factories_;
ui::TestNativeTheme theme_;
TestingProfile profile_;
MockHistoryUiFaviconRequestHandler* mock_history_ui_favicon_request_handler_;
@@ -171,14 +171,14 @@ TEST_F(FaviconSourceTestWithLegacyFormat, DarkDefault) {
SetDarkMode(true);
EXPECT_CALL(*source(), LoadIconBytes(_, IDR_DEFAULT_FAVICON_DARK));
source()->StartDataRequest(GURL(kDummyPrefix), test_web_contents_getter_,
- base::BindRepeating(&Noop));
+ base::BindOnce(&Noop));
}
TEST_F(FaviconSourceTestWithLegacyFormat, LightDefault) {
SetDarkMode(false);
EXPECT_CALL(*source(), LoadIconBytes(_, IDR_DEFAULT_FAVICON));
source()->StartDataRequest(GURL(kDummyPrefix), test_web_contents_getter_,
- base::BindRepeating(&Noop));
+ base::BindOnce(&Noop));
}
TEST_F(FaviconSourceTestWithLegacyFormat,
@@ -192,7 +192,7 @@ TEST_F(FaviconSourceTestWithLegacyFormat,
source()->StartDataRequest(
GURL(base::StrCat({kDummyPrefix, "size/16@1x/https://www.google.com"})),
- test_web_contents_getter_, base::BindRepeating(&Noop));
+ test_web_contents_getter_, base::BindOnce(&Noop));
}
TEST_F(FaviconSourceTestWithLegacyFormat,
@@ -225,7 +225,7 @@ TEST_F(FaviconSourceTestWithFavicon2Format,
base::HistogramTester tester;
source()->StartDataRequest(
GURL(base::StrCat({kDummyPrefix, "size/16@1x/https://www.google.com"})),
- test_web_contents_getter_, base::BindRepeating(&Noop));
+ test_web_contents_getter_, base::BindOnce(&Noop));
std::unique_ptr<base::HistogramSamples> samples(
tester.GetHistogramSamplesSinceCreation(
"Extensions.FaviconResourceUsed"));
@@ -237,14 +237,14 @@ TEST_F(FaviconSourceTestWithFavicon2Format, DarkDefault) {
SetDarkMode(true);
EXPECT_CALL(*source(), LoadIconBytes(_, IDR_DEFAULT_FAVICON_DARK));
source()->StartDataRequest(GURL(kDummyPrefix), test_web_contents_getter_,
- base::BindRepeating(&Noop));
+ base::BindOnce(&Noop));
}
TEST_F(FaviconSourceTestWithFavicon2Format, LightDefault) {
SetDarkMode(false);
EXPECT_CALL(*source(), LoadIconBytes(_, IDR_DEFAULT_FAVICON));
source()->StartDataRequest(GURL(kDummyPrefix), test_web_contents_getter_,
- base::BindRepeating(&Noop));
+ base::BindOnce(&Noop));
}
TEST_F(FaviconSourceTestWithFavicon2Format,
@@ -261,7 +261,7 @@ TEST_F(FaviconSourceTestWithFavicon2Format,
{kDummyPrefix,
"?size=16&scale_factor=1x&page_url=https%3A%2F%2Fwww.google."
"com&allow_google_server_fallback=0"})),
- test_web_contents_getter_, base::BindRepeating(&Noop));
+ test_web_contents_getter_, base::BindOnce(&Noop));
}
TEST_F(FaviconSourceTestWithFavicon2Format,
@@ -278,7 +278,7 @@ TEST_F(FaviconSourceTestWithFavicon2Format,
{kDummyPrefix,
"?size=16&scale_factor=1x&page_url=https%3A%2F%2Fwww.google."
"com&allow_google_server_fallback=1"})),
- test_web_contents_getter_, base::BindRepeating(&Noop));
+ test_web_contents_getter_, base::BindOnce(&Noop));
}
TEST_F(
@@ -287,9 +287,8 @@ TEST_F(
content::WebContentsTester::For(test_web_contents_.get())
->SetLastCommittedURL(GURL(chrome::kChromeUIHistoryURL));
- EXPECT_CALL(
- *mock_history_ui_favicon_request_handler_,
- GetRawFaviconForPageURL(GURL("https://www.google.com"), _, _, _, _))
+ EXPECT_CALL(*mock_history_ui_favicon_request_handler_,
+ GetRawFaviconForPageURL(GURL("https://www.google.com"), _, _, _))
.Times(1);
source()->StartDataRequest(
@@ -297,5 +296,5 @@ TEST_F(
{kDummyPrefix,
"?size=16&scale_factor=1x&page_url=https%3A%2F%2Fwww.google."
"com&allow_google_server_fallback=1"})),
- test_web_contents_getter_, base::BindRepeating(&Noop));
+ test_web_contents_getter_, base::BindOnce(&Noop));
}
diff --git a/chromium/chrome/browser/ui/webui/feed_internals/BUILD.gn b/chromium/chrome/browser/ui/webui/feed_internals/BUILD.gn
index a4633c35f5a..287781d26eb 100644
--- a/chromium/chrome/browser/ui/webui/feed_internals/BUILD.gn
+++ b/chromium/chrome/browser/ui/webui/feed_internals/BUILD.gn
@@ -7,5 +7,8 @@ import("//mojo/public/tools/bindings/mojom.gni")
mojom("mojo_bindings") {
sources = [ "feed_internals.mojom" ]
- public_deps = [ "//url/mojom:url_mojom_gurl" ]
+ public_deps = [
+ "//mojo/public/mojom/base",
+ "//url/mojom:url_mojom_gurl",
+ ]
}
diff --git a/chromium/chrome/browser/ui/webui/feed_internals/feed_internals.mojom b/chromium/chrome/browser/ui/webui/feed_internals/feed_internals.mojom
index ffac80bf64e..c063ca50407 100644
--- a/chromium/chrome/browser/ui/webui/feed_internals/feed_internals.mojom
+++ b/chromium/chrome/browser/ui/webui/feed_internals/feed_internals.mojom
@@ -4,6 +4,7 @@
module feed_internals.mojom;
+import "mojo/public/mojom/base/time.mojom";
import "url/mojom/url.mojom";
// General properties of Feed suggestions.
@@ -20,6 +21,9 @@ struct Properties {
// Whether prefetching for offline availability is enabled.
bool is_prefetching_enabled;
+ // Last load stream status, human readable.
+ string load_stream_status;
+
// Feed fetch URL.
url.mojom.Url feed_fetch_url;
};
@@ -44,12 +48,12 @@ struct LastFetchProperties {
// Reason for the last fetch.
string last_fetch_trigger;
- // Last fetch time.
- Time? last_fetch_time;
+ // Last fetch time. Zero if there was no last fetch.
+ mojo_base.mojom.TimeDelta last_fetch_time;
- // Time until which the scheduler will stop requesting refreshes, unless there
- // is direct user interaction.
- Time? refresh_suppress_time;
+ // Time until which the scheduler will stop requesting refreshes.
+ // Zero if there is direct user interaction.
+ mojo_base.mojom.TimeDelta refresh_suppress_time;
// For test server authentication.
string last_bless_nonce;
@@ -73,11 +77,6 @@ struct Suggestion {
url.mojom.Url favicon_url;
};
-// Time wrapper to allow for nullable objects.
-struct Time {
- double ms_since_epoch;
-};
-
// Browser interface for the page. Consists of calls for data and hooks for
// interactivity.
interface PageHandler {
@@ -103,12 +102,15 @@ interface PageHandler {
// Get the last known content with metadata.
GetCurrentContent() => (array<Suggestion> suggestions);
- // Internal state dump of the Feed library's process scope.
+ // Internal state dump of the Feed library's process scope. Human-readable.
GetFeedProcessScopeDump() => (string dump);
- // Record all Feed metrics into a log.
+ // Record all Feed metrics into a human-readable log.
GetFeedHistograms() => (string log);
- // Set feed host override. Empty to clear override.
- OverrideFeedHost(string host);
+ // Overrides the scheme, host, and port used to make Feed Query requests.
+ // Other URL components, like the path, are ignored.
+ // Empty to clear override.
+ // This allows for testing the Feed against a development server.
+ OverrideFeedHost(url.mojom.Url host);
};
diff --git a/chromium/chrome/browser/ui/webui/feed_internals/feed_internals_page_handler.cc b/chromium/chrome/browser/ui/webui/feed_internals/feed_internals_page_handler.cc
index e8b0ad925e7..fa276076cd7 100644
--- a/chromium/chrome/browser/ui/webui/feed_internals/feed_internals_page_handler.cc
+++ b/chromium/chrome/browser/ui/webui/feed_internals/feed_internals_page_handler.cc
@@ -25,14 +25,15 @@
#include "components/prefs/pref_service.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver.h"
+#include "url/gurl.h"
namespace {
const char kFeedHistogramPrefix[] = "ContentSuggestions.Feed.";
-feed_internals::mojom::TimePtr ToMojoTime(base::Time time) {
- return time.is_null() ? nullptr
- : feed_internals::mojom::Time::New(time.ToJsTime());
+// Converts |t| to a delta from the JS epoch, or 0 if |t| is null.
+base::TimeDelta ToJsTimeDelta(base::Time t) {
+ return t.is_null() ? base::TimeDelta() : t - base::Time::UnixEpoch();
}
std::string TriggerTypeToString(feed::TriggerType* trigger) {
@@ -103,9 +104,9 @@ void FeedInternalsPageHandler::GetLastFetchProperties(
properties->last_fetch_trigger = TriggerTypeToString(
feed_scheduler_host_->GetLastFetchTriggerTypeForDebugging());
properties->last_fetch_time =
- ToMojoTime(pref_service_->GetTime(feed::prefs::kLastFetchAttemptTime));
- properties->refresh_suppress_time =
- ToMojoTime(feed_scheduler_host_->GetSuppressRefreshesUntilForDebugging());
+ ToJsTimeDelta(pref_service_->GetTime(feed::prefs::kLastFetchAttemptTime));
+ properties->refresh_suppress_time = ToJsTimeDelta(
+ feed_scheduler_host_->GetSuppressRefreshesUntilForDebugging());
properties->last_bless_nonce =
pref_service_->GetString(feed::prefs::kHostOverrideBlessNonce);
@@ -173,6 +174,8 @@ void FeedInternalsPageHandler::GetFeedHistograms(
std::move(callback).Run(log);
}
-void FeedInternalsPageHandler::OverrideFeedHost(const std::string& host) {
- return pref_service_->SetString(feed::prefs::kHostOverrideHost, host);
+void FeedInternalsPageHandler::OverrideFeedHost(const GURL& host) {
+ return pref_service_->SetString(
+ feed::prefs::kHostOverrideHost,
+ host.is_valid() ? host.spec() : std::string());
}
diff --git a/chromium/chrome/browser/ui/webui/feed_internals/feed_internals_page_handler.h b/chromium/chrome/browser/ui/webui/feed_internals/feed_internals_page_handler.h
index 9d9de637437..c854927d11c 100644
--- a/chromium/chrome/browser/ui/webui/feed_internals/feed_internals_page_handler.h
+++ b/chromium/chrome/browser/ui/webui/feed_internals/feed_internals_page_handler.h
@@ -45,7 +45,7 @@ class FeedInternalsPageHandler : public feed_internals::mojom::PageHandler {
void GetCurrentContent(GetCurrentContentCallback) override;
void GetFeedProcessScopeDump(GetFeedProcessScopeDumpCallback) override;
void GetFeedHistograms(GetFeedHistogramsCallback) override;
- void OverrideFeedHost(const std::string& host) override;
+ void OverrideFeedHost(const GURL& host) override;
private:
mojo::Receiver<feed_internals::mojom::PageHandler> receiver_;
diff --git a/chromium/chrome/browser/ui/webui/feed_internals/feed_internals_ui.cc b/chromium/chrome/browser/ui/webui/feed_internals/feed_internals_ui.cc
index dab3013f730..28550b954b3 100644
--- a/chromium/chrome/browser/ui/webui/feed_internals/feed_internals_ui.cc
+++ b/chromium/chrome/browser/ui/webui/feed_internals/feed_internals_ui.cc
@@ -7,12 +7,16 @@
#include <utility>
#include "base/bind.h"
+#include "base/feature_list.h"
#include "chrome/browser/android/feed/feed_host_service_factory.h"
+#include "chrome/browser/android/feed/v2/feed_service_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/feed_internals/feed_internals.mojom.h"
#include "chrome/browser/ui/webui/feed_internals/feed_internals_page_handler.h"
+#include "chrome/browser/ui/webui/feed_internals/feedv2_internals_page_handler.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/dev_ui_browser_resources.h"
+#include "components/feed/feed_feature_list.h"
#include "content/public/browser/web_ui_data_source.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
@@ -36,8 +40,15 @@ FeedInternalsUI::~FeedInternalsUI() = default;
void FeedInternalsUI::BindInterface(
mojo::PendingReceiver<feed_internals::mojom::PageHandler> receiver) {
- page_handler_ = std::make_unique<FeedInternalsPageHandler>(
- std::move(receiver),
- feed::FeedHostServiceFactory::GetForBrowserContext(profile_),
- profile_->GetPrefs());
+ if (!base::FeatureList::IsEnabled(feed::kInterestFeedV2)) {
+ page_handler_ = std::make_unique<FeedInternalsPageHandler>(
+ std::move(receiver),
+ feed::FeedHostServiceFactory::GetForBrowserContext(profile_),
+ profile_->GetPrefs());
+ } else {
+ v2_page_handler_ = std::make_unique<FeedV2InternalsPageHandler>(
+ std::move(receiver),
+ feed::FeedServiceFactory::GetForBrowserContext(profile_),
+ profile_->GetPrefs());
+ }
}
diff --git a/chromium/chrome/browser/ui/webui/feed_internals/feed_internals_ui.h b/chromium/chrome/browser/ui/webui/feed_internals/feed_internals_ui.h
index 01cc6bb45a8..454b67b81d6 100644
--- a/chromium/chrome/browser/ui/webui/feed_internals/feed_internals_ui.h
+++ b/chromium/chrome/browser/ui/webui/feed_internals/feed_internals_ui.h
@@ -14,6 +14,7 @@
#include "ui/webui/mojo_web_ui_controller.h"
class Profile;
+class FeedV2InternalsPageHandler;
// During the interim migration to Feed, this page will be co-located with
// snippets-internals. Once migration is complete, and snippets-internals is
@@ -36,6 +37,7 @@ class FeedInternalsUI : public ui::MojoWebUIController {
Profile* profile_;
std::unique_ptr<FeedInternalsPageHandler> page_handler_;
+ std::unique_ptr<FeedV2InternalsPageHandler> v2_page_handler_;
WEB_UI_CONTROLLER_TYPE_DECL();
diff --git a/chromium/chrome/browser/ui/webui/feed_internals/feedv2_internals_page_handler.cc b/chromium/chrome/browser/ui/webui/feed_internals/feedv2_internals_page_handler.cc
new file mode 100644
index 00000000000..89ea3cbb792
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/feed_internals/feedv2_internals_page_handler.cc
@@ -0,0 +1,138 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/feed_internals/feedv2_internals_page_handler.h"
+
+#include <utility>
+
+#include "base/feature_list.h"
+#include "base/metrics/statistics_recorder.h"
+#include "base/time/time.h"
+#include "chrome/browser/ui/webui/feed_internals/feed_internals.mojom.h"
+#include "components/feed/core/common/pref_names.h"
+#include "components/feed/core/common/user_classifier.h"
+#include "components/feed/core/shared_prefs/pref_names.h"
+#include "components/feed/core/v2/public/feed_service.h"
+#include "components/feed/core/v2/public/feed_stream_api.h"
+#include "components/feed/core/v2/public/types.h"
+#include "components/feed/feed_feature_list.h"
+#include "components/offline_pages/core/prefetch/prefetch_prefs.h"
+#include "components/offline_pages/core/prefetch/suggestions_provider.h"
+#include "components/prefs/pref_service.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "url/gurl.h"
+
+namespace {
+
+const char kFeedHistogramPrefix[] = "ContentSuggestions.Feed.";
+
+// Converts |t| to a delta from the JS epoch, or 0 if |t| is null.
+base::TimeDelta ToJsTimeDelta(base::Time t) {
+ return t.is_null() ? base::TimeDelta() : t - base::Time::UnixEpoch();
+}
+
+} // namespace
+
+FeedV2InternalsPageHandler::FeedV2InternalsPageHandler(
+ mojo::PendingReceiver<feed_internals::mojom::PageHandler> receiver,
+ feed::FeedService* feed_service,
+ PrefService* pref_service)
+ : receiver_(this, std::move(receiver)), pref_service_(pref_service) {
+ feed_stream_ = feed_service->GetStream();
+}
+
+FeedV2InternalsPageHandler::~FeedV2InternalsPageHandler() = default;
+
+void FeedV2InternalsPageHandler::GetGeneralProperties(
+ GetGeneralPropertiesCallback callback) {
+ const feed::DebugStreamData debug_data = feed_stream_->GetDebugStreamData();
+
+ auto properties = feed_internals::mojom::Properties::New();
+
+ properties->is_feed_enabled =
+ base::FeatureList::IsEnabled(feed::kInterestFeedV2);
+
+ properties->is_feed_visible = feed_stream_->IsArticlesListVisible();
+ properties->is_feed_allowed = IsFeedAllowed();
+ properties->is_prefetching_enabled =
+ offline_pages::prefetch_prefs::IsEnabled(pref_service_);
+ if (debug_data.fetch_info) {
+ properties->feed_fetch_url = debug_data.fetch_info->base_request_url;
+ }
+
+ properties->load_stream_status = debug_data.load_stream_status;
+
+ std::move(callback).Run(std::move(properties));
+}
+
+void FeedV2InternalsPageHandler::GetUserClassifierProperties(
+ GetUserClassifierPropertiesCallback callback) {
+ // TODO(crbug.com/1066230): Either implement this or remove it.
+
+ std::move(callback).Run(feed_internals::mojom::UserClassifier::New());
+}
+
+void FeedV2InternalsPageHandler::GetLastFetchProperties(
+ GetLastFetchPropertiesCallback callback) {
+ auto properties = feed_internals::mojom::LastFetchProperties::New();
+ feed::DebugStreamData debug_data = feed_stream_->GetDebugStreamData();
+
+ if (debug_data.fetch_info) {
+ const feed::NetworkResponseInfo& fetch_info = *debug_data.fetch_info;
+ properties->last_fetch_status = fetch_info.status_code;
+ properties->last_fetch_time = ToJsTimeDelta(fetch_info.fetch_time);
+ properties->last_bless_nonce = fetch_info.bless_nonce;
+ }
+
+ std::move(callback).Run(std::move(properties));
+}
+
+void FeedV2InternalsPageHandler::ClearUserClassifierProperties() {
+ // TODO(crbug.com/1066230): Remove or implement this.
+}
+
+void FeedV2InternalsPageHandler::ClearCachedDataAndRefreshFeed() {
+ // TODO(crbug.com/1066230): Not sure we need to clear cache since we don't
+ // retain data on refresh.
+ feed_stream_->ForceRefreshForDebugging();
+}
+
+void FeedV2InternalsPageHandler::RefreshFeed() {
+ feed_stream_->ForceRefreshForDebugging();
+}
+
+void FeedV2InternalsPageHandler::GetCurrentContent(
+ GetCurrentContentCallback callback) {
+ if (!IsFeedAllowed()) {
+ std::move(callback).Run({});
+ return;
+ }
+ // TODO(crbug.com/1066230): Content metadata is (yet?) available. I wasn't
+ // able to get this to work for v1 either, so maybe it's not that important
+ // to implement. We should remove |GetCurrentContent| if it's not needed.
+ std::move(callback).Run({});
+}
+
+void FeedV2InternalsPageHandler::GetFeedProcessScopeDump(
+ GetFeedProcessScopeDumpCallback callback) {
+ std::move(callback).Run(feed_stream_->DumpStateForDebugging());
+}
+
+bool FeedV2InternalsPageHandler::IsFeedAllowed() {
+ return pref_service_->GetBoolean(feed::prefs::kEnableSnippets);
+}
+
+void FeedV2InternalsPageHandler::GetFeedHistograms(
+ GetFeedHistogramsCallback callback) {
+ std::string log;
+ base::StatisticsRecorder::WriteGraph(kFeedHistogramPrefix, &log);
+ std::move(callback).Run(std::move(log));
+}
+
+void FeedV2InternalsPageHandler::OverrideFeedHost(const GURL& host) {
+ return pref_service_->SetString(
+ feed::prefs::kHostOverrideHost,
+ host.is_valid() ? host.spec() : std::string());
+}
diff --git a/chromium/chrome/browser/ui/webui/feed_internals/feedv2_internals_page_handler.h b/chromium/chrome/browser/ui/webui/feed_internals/feedv2_internals_page_handler.h
new file mode 100644
index 00000000000..9e76e5014a4
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/feed_internals/feedv2_internals_page_handler.h
@@ -0,0 +1,61 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_FEED_INTERNALS_FEEDV2_INTERNALS_PAGE_HANDLER_H_
+#define CHROME_BROWSER_UI_WEBUI_FEED_INTERNALS_FEEDV2_INTERNALS_PAGE_HANDLER_H_
+
+#include <string>
+#include <vector>
+
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/ui/webui/feed_internals/feed_internals.mojom.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+
+class PrefService;
+namespace feed {
+class FeedService;
+class FeedStreamApi;
+} // namespace feed
+
+// Concrete implementation of feed_internals::mojom::PageHandler.
+class FeedV2InternalsPageHandler : public feed_internals::mojom::PageHandler {
+ public:
+ FeedV2InternalsPageHandler(
+ mojo::PendingReceiver<feed_internals::mojom::PageHandler> receiver,
+ feed::FeedService* feed_service,
+ PrefService* pref_service);
+ FeedV2InternalsPageHandler(const FeedV2InternalsPageHandler&) = delete;
+ FeedV2InternalsPageHandler& operator=(const FeedV2InternalsPageHandler&) =
+ delete;
+
+ ~FeedV2InternalsPageHandler() override;
+
+ // feed_internals::mojom::PageHandler
+ void GetGeneralProperties(GetGeneralPropertiesCallback) override;
+ void GetUserClassifierProperties(
+ GetUserClassifierPropertiesCallback) override;
+ void ClearUserClassifierProperties() override;
+ void GetLastFetchProperties(GetLastFetchPropertiesCallback) override;
+ void ClearCachedDataAndRefreshFeed() override;
+ void RefreshFeed() override;
+ void GetCurrentContent(GetCurrentContentCallback) override;
+ void GetFeedProcessScopeDump(GetFeedProcessScopeDumpCallback) override;
+ void GetFeedHistograms(GetFeedHistogramsCallback) override;
+ void OverrideFeedHost(const GURL& host) override;
+
+ private:
+ bool IsFeedAllowed();
+
+ mojo::Receiver<feed_internals::mojom::PageHandler> receiver_;
+
+ // Services that provide the data and functionality.
+ feed::FeedStreamApi* feed_stream_;
+ PrefService* pref_service_;
+
+ base::WeakPtrFactory<FeedV2InternalsPageHandler> weak_ptr_factory_{this};
+};
+
+#endif // CHROME_BROWSER_UI_WEBUI_FEED_INTERNALS_FEEDV2_INTERNALS_PAGE_HANDLER_H_
diff --git a/chromium/chrome/browser/ui/webui/flags_ui.cc b/chromium/chrome/browser/ui/webui/flags_ui.cc
index 6754133e497..92050e17926 100644
--- a/chromium/chrome/browser/ui/webui/flags_ui.cc
+++ b/chromium/chrome/browser/ui/webui/flags_ui.cc
@@ -219,9 +219,9 @@ FlagsUIHandler* InitializeHandler(content::WebUI* web_ui,
chromeos::OwnerSettingsServiceChromeOS* service =
chromeos::OwnerSettingsServiceChromeOSFactory::GetForBrowserContext(
original_profile);
- service->IsOwnerAsync(base::Bind(&FinishInitialization<T>,
- weak_factory.GetWeakPtr(),
- original_profile, handler));
+ service->IsOwnerAsync(base::BindOnce(&FinishInitialization<T>,
+ weak_factory.GetWeakPtr(),
+ original_profile, handler));
} else {
FinishInitialization(weak_factory.GetWeakPtr(), original_profile, handler,
false /* current_user_is_owner */);
diff --git a/chromium/chrome/browser/ui/webui/gcm_internals_ui.cc b/chromium/chrome/browser/ui/webui/gcm_internals_ui.cc
index 4449023832d..89a27fb6475 100644
--- a/chromium/chrome/browser/ui/webui/gcm_internals_ui.cc
+++ b/chromium/chrome/browser/ui/webui/gcm_internals_ui.cc
@@ -98,8 +98,9 @@ void GcmInternalsUIMessageHandler::RequestAllInfo(
ReturnResults(profile, NULL, NULL);
} else {
profile_service->driver()->GetGCMStatistics(
- base::Bind(&GcmInternalsUIMessageHandler::RequestGCMStatisticsFinished,
- weak_ptr_factory_.GetWeakPtr()),
+ base::BindOnce(
+ &GcmInternalsUIMessageHandler::RequestGCMStatisticsFinished,
+ weak_ptr_factory_.GetWeakPtr()),
clear_activity_logs);
}
}
diff --git a/chromium/chrome/browser/ui/webui/help/version_updater_chromeos.cc b/chromium/chrome/browser/ui/webui/help/version_updater_chromeos.cc
index 090006fbca0..23166d7d304 100644
--- a/chromium/chrome/browser/ui/webui/help/version_updater_chromeos.cc
+++ b/chromium/chrome/browser/ui/webui/help/version_updater_chromeos.cc
@@ -172,7 +172,7 @@ void VersionUpdaterCros::CheckForUpdate(const StatusCallback& callback,
// Make sure that libcros is loaded and OOBE is complete.
if (!WizardController::default_controller() ||
chromeos::StartupUtils::IsDeviceRegistered()) {
- update_engine_client->RequestUpdateCheck(base::Bind(
+ update_engine_client->RequestUpdateCheck(base::BindOnce(
&VersionUpdaterCros::OnUpdateCheck, weak_ptr_factory_.GetWeakPtr()));
}
}
@@ -200,7 +200,7 @@ void VersionUpdaterCros::SetUpdateOverCellularOneTimePermission(
->GetUpdateEngineClient()
->SetUpdateOverCellularOneTimePermission(
update_version, update_size,
- base::Bind(
+ base::BindOnce(
&VersionUpdaterCros::OnSetUpdateOverCellularOneTimePermission,
weak_ptr_factory_.GetWeakPtr()));
}
@@ -227,8 +227,8 @@ void VersionUpdaterCros::GetChannel(bool get_current_channel,
// Request the channel information. Bind to a weak_ptr bound method rather
// than passing |cb| directly so that |cb| does not outlive |this|.
update_engine_client->GetChannel(
- get_current_channel, base::Bind(&VersionUpdaterCros::OnGetChannel,
- weak_ptr_factory_.GetWeakPtr(), cb));
+ get_current_channel, base::BindOnce(&VersionUpdaterCros::OnGetChannel,
+ weak_ptr_factory_.GetWeakPtr(), cb));
}
void VersionUpdaterCros::OnGetChannel(const ChannelCallback& cb,
diff --git a/chromium/chrome/browser/ui/webui/history/browsing_history_handler.cc b/chromium/chrome/browser/ui/webui/history/browsing_history_handler.cc
index 426bf5301ad..0e6a79e1d3b 100644
--- a/chromium/chrome/browser/ui/webui/history/browsing_history_handler.cc
+++ b/chromium/chrome/browser/ui/webui/history/browsing_history_handler.cc
@@ -10,9 +10,10 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
+#include "base/check_op.h"
#include "base/i18n/rtl.h"
#include "base/i18n/time_formatting.h"
-#include "base/logging.h"
+#include "base/notreached.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "base/time/default_clock.h"
diff --git a/chromium/chrome/browser/ui/webui/history/foreign_session_handler.cc b/chromium/chrome/browser/ui/webui/history/foreign_session_handler.cc
index e570fbeaf2a..cae27f6cabc 100644
--- a/chromium/chrome/browser/ui/webui/history/foreign_session_handler.cc
+++ b/chromium/chrome/browser/ui/webui/history/foreign_session_handler.cc
@@ -135,11 +135,9 @@ base::Value SessionWindowToValue(const ::sessions::SessionWindow& window) {
} // namespace
-ForeignSessionHandler::ForeignSessionHandler() {
- load_attempt_time_ = base::TimeTicks::Now();
-}
+ForeignSessionHandler::ForeignSessionHandler() = default;
-ForeignSessionHandler::~ForeignSessionHandler() {}
+ForeignSessionHandler::~ForeignSessionHandler() = default;
// static
void ForeignSessionHandler::RegisterProfilePrefs(
@@ -301,12 +299,6 @@ base::Value ForeignSessionHandler::GetForeignSessions() {
base::Value session_list(base::Value::Type::LIST);
if (open_tabs && open_tabs->GetAllForeignSessions(&sessions)) {
- if (!load_attempt_time_.is_null()) {
- UMA_HISTOGRAM_TIMES("Sync.SessionsRefreshDelay",
- base::TimeTicks::Now() - load_attempt_time_);
- load_attempt_time_ = base::TimeTicks();
- }
-
// Use a pref to keep track of sessions that were collapsed by the user.
// To prevent the pref from accumulating stale sessions, clear it each time
// and only add back sessions that are still current.
diff --git a/chromium/chrome/browser/ui/webui/history/foreign_session_handler.h b/chromium/chrome/browser/ui/webui/history/foreign_session_handler.h
index efd0a977f29..7e249a63410 100644
--- a/chromium/chrome/browser/ui/webui/history/foreign_session_handler.h
+++ b/chromium/chrome/browser/ui/webui/history/foreign_session_handler.h
@@ -99,10 +99,6 @@ class ForeignSessionHandler : public content::WebUIMessageHandler {
void HandleSetForeignSessionCollapsed(const base::ListValue* args);
- // The time at which this WebUI was created. Used to calculate how long
- // the WebUI was present before the sessions data was visible.
- base::TimeTicks load_attempt_time_;
-
base::Value initial_session_list_;
std::unique_ptr<base::CallbackList<void()>::Subscription>
diff --git a/chromium/chrome/browser/ui/webui/history/navigation_handler.cc b/chromium/chrome/browser/ui/webui/history/navigation_handler.cc
index 036c575e22b..e45b22bf656 100644
--- a/chromium/chrome/browser/ui/webui/history/navigation_handler.cc
+++ b/chromium/chrome/browser/ui/webui/history/navigation_handler.cc
@@ -6,7 +6,7 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
-#include "base/logging.h"
+#include "base/check.h"
#include "base/values.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui.h"
diff --git a/chromium/chrome/browser/ui/webui/identity_internals_ui_browsertest.js b/chromium/chrome/browser/ui/webui/identity_internals_ui_browsertest.js
index 863180e73b6..2297ddd928e 100644
--- a/chromium/chrome/browser/ui/webui/identity_internals_ui_browsertest.js
+++ b/chromium/chrome/browser/ui/webui/identity_internals_ui_browsertest.js
@@ -3,6 +3,7 @@
// found in the LICENSE file.
GEN('#include "chrome/browser/ui/webui/identity_internals_ui_browsertest.h"');
+GEN('#include "content/public/test/browser_test.h"');
/**
* Test C++ fixture for downloads WebUI testing.
diff --git a/chromium/chrome/browser/ui/webui/inspect_ui_browsertest.cc b/chromium/chrome/browser/ui/webui/inspect_ui_browsertest.cc
index 93eed73eeb6..209b6d4cc79 100644
--- a/chromium/chrome/browser/ui/webui/inspect_ui_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/inspect_ui_browsertest.cc
@@ -13,6 +13,7 @@
#include "chrome/test/base/web_ui_browser_test.h"
#include "content/public/browser/navigation_details.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
diff --git a/chromium/chrome/browser/ui/webui/interstitials/interstitial_ui.cc b/chromium/chrome/browser/ui/webui/interstitials/interstitial_ui.cc
index f9e52ca32e9..ec670f5dd01 100644
--- a/chromium/chrome/browser/ui/webui/interstitials/interstitial_ui.cc
+++ b/chromium/chrome/browser/ui/webui/interstitials/interstitial_ui.cc
@@ -25,18 +25,18 @@
#include "chrome/common/url_constants.h"
#include "components/captive_portal/core/buildflags.h"
#include "components/grit/dev_ui_components_resources.h"
-#include "components/lookalikes/lookalike_url_util.h"
+#include "components/lookalikes/core/lookalike_url_util.h"
#include "components/safe_browsing/core/db/database_manager.h"
#include "components/security_interstitials/content/bad_clock_blocking_page.h"
#include "components/security_interstitials/content/blocked_interception_blocking_page.h"
#include "components/security_interstitials/content/legacy_tls_blocking_page.h"
#include "components/security_interstitials/content/mitm_software_blocking_page.h"
#include "components/security_interstitials/content/origin_policy_ui.h"
+#include "components/security_interstitials/content/security_interstitial_page.h"
#include "components/security_interstitials/content/unsafe_resource_util.h"
#include "components/security_interstitials/core/ssl_error_options_mask.h"
#include "components/security_interstitials/core/ssl_error_ui.h"
#include "components/security_interstitials/core/unsafe_resource.h"
-#include "content/public/browser/interstitial_page_delegate.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/url_data_source.h"
@@ -478,7 +478,8 @@ void InterstitialHTMLSource::StartDataRequest(
// the tab is closing. Nothing to do in this case.
return;
}
- std::unique_ptr<content::InterstitialPageDelegate> interstitial_delegate;
+ std::unique_ptr<security_interstitials::SecurityInterstitialPage>
+ interstitial_delegate;
std::string html;
// Using this form of the path so we can do exact matching, while ignoring the
// query (everything after the ? character).
diff --git a/chromium/chrome/browser/ui/webui/interstitials/interstitial_ui_browsertest.cc b/chromium/chrome/browser/ui/webui/interstitials/interstitial_ui_browsertest.cc
index a0829a006b9..a473e4c6acb 100644
--- a/chromium/chrome/browser/ui/webui/interstitials/interstitial_ui_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/interstitials/interstitial_ui_browsertest.cc
@@ -14,6 +14,7 @@
#include "chrome/test/base/ui_test_utils.h"
#include "components/strings/grit/components_strings.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
#include "ui/base/l10n/l10n_util.h"
diff --git a/chromium/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler.cc b/chromium/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler.cc
index f6bce1c0ea4..a956bd2e948 100644
--- a/chromium/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler.cc
+++ b/chromium/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler.cc
@@ -33,7 +33,6 @@ namespace {
// HTML DOM ID used in the JavaScript code. The IDs are generated here so that
// the DOM would have sensible name instead of autogenerated IDs.
const char kPreviewsAllowedHtmlId[] = "previews-allowed-status";
-const char kLitePageRedirectHtmlId[] = "lite-page-redirect-status";
const char kNoScriptPreviewsHtmlId[] = "noscript-preview-status";
const char kResourceLoadingHintsHtmlId[] = "resource-loading-hints-status";
const char kOfflinePreviewsHtmlId[] = "offline-preview-status";
@@ -41,8 +40,6 @@ const char kDeferAllScriptPreviewsHtmlId[] = "defer-all-script-preview-status";
// Descriptions for previews.
const char kPreviewsAllowedDescription[] = "Previews Allowed";
-const char kLitePageRedirectDescription[] =
- "Lite Page Redirect / Server Previews";
const char kNoScriptDescription[] = "NoScript Previews";
const char kResourceLoadingHintsDescription[] = "ResourceLoadingHints Previews";
const char kDeferAllScriptPreviewsDescription[] = "DeferAllScript Previews";
@@ -50,7 +47,6 @@ const char kOfflineDesciption[] = "Offline Previews";
// Flag feature name.
const char kPreviewsAllowedFeatureName[] = "Previews";
-const char kLitePageRedirectFeatureName[] = "LitePageServerPreviews";
const char kNoScriptFeatureName[] = "NoScriptPreviews";
const char kResourceLoadingHintsFeatureName[] = "ResourceLoadingHints";
const char kDeferAllScriptFeatureName[] = "DeferAllScript";
@@ -62,7 +58,6 @@ const char kOfflinePageFeatureName[] = "OfflinePreviews";
// the DOM would have sensible name instead of autogenerated IDs.
const char kPreviewsAllowedFlagHtmlId[] = "previews-flag";
const char kOfflinePageFlagHtmlId[] = "offline-page-flag";
-const char kLitePageRedirectFlagHtmlId[] = "lite-page-redirect-flag";
const char kResourceLoadingHintsFlagHtmlId[] = "resource-loading-hints-flag";
const char kDeferAllScriptFlagHtmlId[] = "defer-all-script-flag";
const char kNoScriptFlagHtmlId[] = "noscript-flag";
@@ -75,8 +70,6 @@ const char kDataSaverAltConfigHtmlId[] =
// TODO(thanhdle): Refactor into vector of structs. crbug.com/787010.
const char kPreviewsAllowedFlagLink[] = "chrome://flags/#allow-previews";
const char kOfflinePageFlagLink[] = "chrome://flags/#enable-offline-previews";
-const char kLitePageRedirectFlagLink[] =
- "chrome://flags/#enable-lite-page-server-previews";
const char kResourceLoadingHintsFlagLink[] =
"chrome://flags/#enable-resource-loading-hints";
const char kDeferAllScriptFlagLink[] =
@@ -238,13 +231,6 @@ void InterventionsInternalsPageHandler::GetPreviewsEnabled(
offline_status->htmlId = kOfflinePreviewsHtmlId;
statuses.push_back(std::move(offline_status));
- auto lite_page_redirect_status = mojom::PreviewsStatus::New();
- lite_page_redirect_status->description = kLitePageRedirectDescription;
- lite_page_redirect_status->enabled =
- previews::params::IsLitePageServerPreviewsEnabled();
- lite_page_redirect_status->htmlId = kLitePageRedirectHtmlId;
- statuses.push_back(std::move(lite_page_redirect_status));
-
auto resource_loading_hints_status = mojom::PreviewsStatus::New();
resource_loading_hints_status->description = kResourceLoadingHintsDescription;
resource_loading_hints_status->enabled =
@@ -295,15 +281,6 @@ void InterventionsInternalsPageHandler::GetPreviewsFlagsDetails(
offline_page_status->htmlId = kOfflinePageFlagHtmlId;
flags.push_back(std::move(offline_page_status));
- auto lite_page_redirect_status = mojom::PreviewsFlag::New();
- lite_page_redirect_status->description =
- flag_descriptions::kEnableLitePageServerPreviewsName;
- lite_page_redirect_status->link = kLitePageRedirectFlagLink;
- lite_page_redirect_status->value =
- GetFeatureFlagStatus(kLitePageRedirectFeatureName);
- lite_page_redirect_status->htmlId = kLitePageRedirectFlagHtmlId;
- flags.push_back(std::move(lite_page_redirect_status));
-
auto resource_loading_hints_status = mojom::PreviewsFlag::New();
resource_loading_hints_status->description =
flag_descriptions::kEnableResourceLoadingHintsName;
diff --git a/chromium/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler_unittest.cc b/chromium/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler_unittest.cc
index ec9be763c15..b5a0ddeb2ff 100644
--- a/chromium/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler_unittest.cc
@@ -54,7 +54,6 @@ namespace {
// The HTML DOM ID used in Javascript.
constexpr char kPreviewsAllowedHtmlId[] = "previews-allowed-status";
constexpr char kOfflinePreviewsHtmlId[] = "offline-preview-status";
-constexpr char kLitePageRedirectHtmlId[] = "lite-page-redirect-status";
constexpr char kResourceLoadingHintsHtmlId[] = "resource-loading-hints-status";
constexpr char kDeferAllScriptPreviewsHtmlId[] =
"defer-all-script-preview-status";
@@ -63,8 +62,6 @@ constexpr char kNoScriptPreviewsHtmlId[] = "noscript-preview-status";
// Descriptions for previews.
constexpr char kPreviewsAllowedDescription[] = "Previews Allowed";
constexpr char kOfflineDesciption[] = "Offline Previews";
-constexpr char kLitePageRedirectDescription[] =
- "Lite Page Redirect / Server Previews";
constexpr char kResourceLoadingHintsDescription[] =
"ResourceLoadingHints Previews";
constexpr char kDeferAllScriptPreviewsDescription[] = "DeferAllScript Previews";
@@ -72,7 +69,6 @@ constexpr char kNoScriptDescription[] = "NoScript Previews";
// The HTML DOM ID used in Javascript.
constexpr char kOfflinePageFlagHtmlId[] = "offline-page-flag";
-constexpr char kLitePageRedirectFlagHtmlId[] = "lite-page-redirect-flag";
constexpr char kResourceLoadingHintsFlagHtmlId[] =
"resource-loading-hints-flag";
constexpr char kDeferAllScriptFlagHtmlId[] = "defer-all-script-flag";
@@ -86,8 +82,6 @@ constexpr char kDataSaverAltConfigHtmlId[] =
// Links to flags in chrome://flags.
constexpr char kOfflinePageFlagLink[] =
"chrome://flags/#enable-offline-previews";
-constexpr char kLitePageRedirectFlagLink[] =
- "chrome://flags/#enable-lite-page-server-previews";
constexpr char kResourceLoadingHintsFlagLink[] =
"chrome://flags/#enable-resource-loading-hints";
constexpr char kDeferAllScriptFlagLink[] =
@@ -102,7 +96,6 @@ constexpr char kDataSaverAltConfigLink[] =
// Flag features names.
constexpr char kOfflinePageFeatureName[] = "OfflinePreviews";
-constexpr char kLitePageRedirectFeatureName[] = "LitePageServerPreviews";
constexpr char kResourceLoadingHintsFeatureName[] = "ResourceLoadingHints";
constexpr char kDeferAllScriptFeatureName[] = "DeferAllScriptPreviews";
constexpr char kNoScriptFeatureName[] = "NoScriptPreviews";
@@ -334,7 +327,7 @@ TEST_F(InterventionsInternalsPageHandlerTest, GetPreviewsEnabledCount) {
page_handler_->GetPreviewsEnabled(
base::BindOnce(&MockGetPreviewsEnabledCallback));
- constexpr size_t expected = 6;
+ constexpr size_t expected = 5;
EXPECT_EQ(expected, passed_in_modes.size());
}
@@ -445,34 +438,6 @@ TEST_F(InterventionsInternalsPageHandlerTest, OfflinePreviewsEnabled) {
EXPECT_TRUE(offline_previews->second->enabled);
}
-TEST_F(InterventionsInternalsPageHandlerTest, LitePageRedirectDisabled) {
- // Init with kLitePageRedirect disabled.
- scoped_feature_list_->InitWithFeatures(
- {}, {previews::features::kLitePageServerPreviews});
-
- page_handler_->GetPreviewsEnabled(
- base::BindOnce(&MockGetPreviewsEnabledCallback));
- auto resource_loading_hints = passed_in_modes.find(kLitePageRedirectHtmlId);
- ASSERT_NE(passed_in_modes.end(), resource_loading_hints);
- EXPECT_EQ(kLitePageRedirectDescription,
- resource_loading_hints->second->description);
- EXPECT_FALSE(resource_loading_hints->second->enabled);
-}
-
-TEST_F(InterventionsInternalsPageHandlerTest, LitePageRedirectEnabled) {
- // Init with kLitePageRedirect enabled.
- scoped_feature_list_->InitWithFeatures(
- {previews::features::kLitePageServerPreviews}, {});
-
- page_handler_->GetPreviewsEnabled(
- base::BindOnce(&MockGetPreviewsEnabledCallback));
- auto resource_loading_hints = passed_in_modes.find(kLitePageRedirectHtmlId);
- ASSERT_NE(passed_in_modes.end(), resource_loading_hints);
- EXPECT_EQ(kLitePageRedirectDescription,
- resource_loading_hints->second->description);
- EXPECT_TRUE(resource_loading_hints->second->enabled);
-}
-
TEST_F(InterventionsInternalsPageHandlerTest, DeferAllScriptPreviewsDisabled) {
// Init with kDeferAllScriptPreviews disabled.
scoped_feature_list_->InitWithFeatures(
@@ -505,7 +470,7 @@ TEST_F(InterventionsInternalsPageHandlerTest, GetFlagsCount) {
page_handler_->GetPreviewsFlagsDetails(
base::BindOnce(&MockGetPreviewsFlagsCallback));
- constexpr size_t expected = 9;
+ constexpr size_t expected = 8;
EXPECT_EQ(expected, passed_in_flags.size());
}
@@ -746,38 +711,6 @@ TEST_F(InterventionsInternalsPageHandlerTest, GetFlagsDeferAllScriptDisabled) {
EXPECT_EQ(kDeferAllScriptFlagLink, defer_all_script_flag->second->link);
}
-TEST_F(InterventionsInternalsPageHandlerTest,
- GetFlagsLitePageRedirectDefaultValue) {
- page_handler_->GetPreviewsFlagsDetails(
- base::BindOnce(&MockGetPreviewsFlagsCallback));
- auto lite_page_redirect_flag =
- passed_in_flags.find(kLitePageRedirectFlagHtmlId);
-
- ASSERT_NE(passed_in_flags.end(), lite_page_redirect_flag);
- EXPECT_EQ(flag_descriptions::kEnableLitePageServerPreviewsName,
- lite_page_redirect_flag->second->description);
- EXPECT_EQ(kDefaultFlagValue, lite_page_redirect_flag->second->value);
- EXPECT_EQ(kLitePageRedirectFlagLink, lite_page_redirect_flag->second->link);
-}
-
-TEST_F(InterventionsInternalsPageHandlerTest, GetFlagsLitePageRedirectEnabled) {
- base::test::ScopedCommandLine scoped_command_line;
- base::CommandLine* command_line = scoped_command_line.GetProcessCommandLine();
- command_line->AppendSwitchASCII(switches::kEnableFeatures,
- kLitePageRedirectFeatureName);
-
- page_handler_->GetPreviewsFlagsDetails(
- base::BindOnce(&MockGetPreviewsFlagsCallback));
- auto lite_page_redirect_flag =
- passed_in_flags.find(kLitePageRedirectFlagHtmlId);
-
- ASSERT_NE(passed_in_flags.end(), lite_page_redirect_flag);
- EXPECT_EQ(flag_descriptions::kEnableLitePageServerPreviewsName,
- lite_page_redirect_flag->second->description);
- EXPECT_EQ(kEnabledFlagValue, lite_page_redirect_flag->second->value);
- EXPECT_EQ(kLitePageRedirectFlagLink, lite_page_redirect_flag->second->link);
-}
-
TEST_F(InterventionsInternalsPageHandlerTest, GetFlagsAltConfigCustomValue) {
base::test::ScopedCommandLine scoped_command_line;
base::CommandLine* command_line = scoped_command_line.GetProcessCommandLine();
@@ -913,7 +846,9 @@ TEST_F(InterventionsInternalsPageHandlerTest, ObserverIsRemovedWhenDestroyed) {
TEST_F(InterventionsInternalsPageHandlerTest, OnNewBlacklistedHostPostToPage) {
const std::string hosts[] = {
- "example_0.com", "example_1.com", "example_2.com",
+ "example_0.com",
+ "example_1.com",
+ "example_2.com",
};
for (auto expected_host : hosts) {
diff --git a/chromium/chrome/browser/ui/webui/local_discovery/local_discovery_ui_browsertest.cc b/chromium/chrome/browser/ui/webui/local_discovery/local_discovery_ui_browsertest.cc
index 711b68fa7c0..69169417236 100644
--- a/chromium/chrome/browser/ui/webui/local_discovery/local_discovery_ui_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/local_discovery/local_discovery_ui_browsertest.cc
@@ -36,6 +36,7 @@
#include "chrome/test/base/ui_test_utils.h"
#include "chrome/test/base/web_ui_browser_test.h"
#include "components/signin/public/identity_manager/identity_test_utils.h"
+#include "content/public/test/browser_test.h"
#include "google_apis/gaia/gaia_urls.h"
#include "net/http/http_status_code.h"
#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
diff --git a/chromium/chrome/browser/ui/webui/local_discovery/local_discovery_ui_handler.cc b/chromium/chrome/browser/ui/webui/local_discovery/local_discovery_ui_handler.cc
index 2197f9a7844..b00f10c75fa 100644
--- a/chromium/chrome/browser/ui/webui/local_discovery/local_discovery_ui_handler.cc
+++ b/chromium/chrome/browser/ui/webui/local_discovery/local_discovery_ui_handler.cc
@@ -234,8 +234,8 @@ void LocalDiscoveryUIHandler::HandleRegisterDevice(
privet_resolution_ = privet_http_factory_->CreatePrivetHTTP(device);
privet_resolution_->Start(
it->second.address,
- base::Bind(&LocalDiscoveryUIHandler::StartRegisterHTTP,
- base::Unretained(this)));
+ base::BindOnce(&LocalDiscoveryUIHandler::StartRegisterHTTP,
+ base::Unretained(this)));
}
void LocalDiscoveryUIHandler::HandleCancelRegistration(
diff --git a/chromium/chrome/browser/ui/webui/log_web_ui_url_browsertest.cc b/chromium/chrome/browser/ui/webui/log_web_ui_url_browsertest.cc
index 9bf7d5207f9..592aa41140e 100644
--- a/chromium/chrome/browser/ui/webui/log_web_ui_url_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/log_web_ui_url_browsertest.cc
@@ -20,6 +20,7 @@
#include "chrome/test/base/ui_test_utils.h"
#include "components/strings/grit/components_strings.h"
#include "content/public/common/url_constants.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "ui/base/l10n/l10n_util.h"
diff --git a/chromium/chrome/browser/ui/webui/management_ui.cc b/chromium/chrome/browser/ui/webui/management_ui.cc
index 6bd451e3c24..4254c9ddf6b 100644
--- a/chromium/chrome/browser/ui/webui/management_ui.cc
+++ b/chromium/chrome/browser/ui/webui/management_ui.cc
@@ -66,6 +66,7 @@ content::WebUIDataSource* CreateManagementUIHtmlSource(Profile* profile) {
{kManagementReportExtensions, IDS_MANAGEMENT_REPORT_EXTENSIONS},
{kManagementReportAndroidApplications,
IDS_MANAGEMENT_REPORT_ANDROID_APPLICATIONS},
+ {kManagementReportProxyServer, IDS_MANAGEMENT_REPORT_PROXY_SERVER},
#endif // defined(OS_CHROMEOS)
{"browserReporting", IDS_MANAGEMENT_BROWSER_REPORTING},
{"browserReportingExplanation",
diff --git a/chromium/chrome/browser/ui/webui/management_ui_browsertest.cc b/chromium/chrome/browser/ui/webui/management_ui_browsertest.cc
index e358945c1b8..961468b5db8 100644
--- a/chromium/chrome/browser/ui/webui/management_ui_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/management_ui_browsertest.cc
@@ -16,6 +16,7 @@
#include "components/policy/core/common/mock_configuration_policy_provider.h"
#include "components/strings/grit/components_strings.h"
#include "content/public/browser/browser_context.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "ui/base/l10n/l10n_util.h"
diff --git a/chromium/chrome/browser/ui/webui/management_ui_handler.cc b/chromium/chrome/browser/ui/webui/management_ui_handler.cc
index d831e5152d9..e8dff0d2dc4 100644
--- a/chromium/chrome/browser/ui/webui/management_ui_handler.cc
+++ b/chromium/chrome/browser/ui/webui/management_ui_handler.cc
@@ -46,11 +46,15 @@
#include "chrome/browser/chromeos/policy/policy_cert_service.h"
#include "chrome/browser/chromeos/policy/policy_cert_service_factory.h"
#include "chrome/browser/chromeos/policy/status_collector/device_status_collector.h"
+#include "chrome/browser/chromeos/policy/status_collector/status_collector.h"
#include "chrome/browser/chromeos/policy/status_uploader.h"
#include "chrome/browser/chromeos/policy/system_log_uploader.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/ui/webui/management_ui_handler_chromeos.h"
#include "chrome/grit/chromium_strings.h"
+#include "chromeos/network/network_state_handler.h"
+#include "chromeos/network/proxy/proxy_config_handler.h"
+#include "chromeos/network/proxy/ui_proxy_config_service.h"
#include "components/prefs/pref_service.h"
#include "components/user_manager/user_manager.h"
#include "ui/chromeos/devicetype_utils.h"
@@ -143,6 +147,7 @@ const char kManagementPrinting[] = "managementPrinting";
const char kManagementCrostini[] = "managementCrostini";
const char kManagementCrostiniContainerConfiguration[] =
"managementCrostiniContainerConfiguration";
+const char kManagementReportProxyServer[] = "managementReportProxyServer";
const char kAccountManagedInfo[] = "accountManagedInfo";
const char kDeviceManagedInfo[] = "deviceManagedInfo";
const char kOverview[] = "overview";
@@ -186,7 +191,8 @@ enum class DeviceReportingType {
kCrostini,
kUsername,
kExtensions,
- kAndroidApplication
+ kAndroidApplication,
+ kProxyServer
};
// Corresponds to DeviceReportingType in management_browser_proxy.js
@@ -214,6 +220,8 @@ std::string ToJSDeviceReportingType(const DeviceReportingType& type) {
return "extension";
case DeviceReportingType::kAndroidApplication:
return "android application";
+ case DeviceReportingType::kProxyServer:
+ return "proxy server";
default:
NOTREACHED() << "Unknown device reporting type";
return "device";
@@ -228,85 +236,6 @@ void AddDeviceReportingElement(base::Value* report_sources,
data.SetKey("reportingType", base::Value(ToJSDeviceReportingType(type)));
report_sources->Append(std::move(data));
}
-
-void AddDeviceReportingInfo(base::Value* report_sources, Profile* profile) {
- policy::BrowserPolicyConnectorChromeOS* connector =
- g_browser_process->platform_part()->browser_policy_connector_chromeos();
-
- // Only check for report status in managed environment.
- if (!connector->IsEnterpriseManaged())
- return;
-
- policy::DeviceCloudPolicyManagerChromeOS* manager =
- connector->GetDeviceCloudPolicyManager();
-
- if (!manager)
- return;
-
- const policy::StatusCollector* collector =
- manager->GetStatusUploader()->status_collector();
-
- // Elements appear on the page in the order they are added.
- if (collector->ShouldReportActivityTimes()) {
- AddDeviceReportingElement(report_sources, kManagementReportActivityTimes,
- DeviceReportingType::kDeviceActivity);
- } else {
- if (collector->ShouldReportUsers()) {
- AddDeviceReportingElement(report_sources, kManagementReportUsers,
- DeviceReportingType::kSupervisedUser);
- }
- }
- if (collector->ShouldReportHardwareStatus()) {
- AddDeviceReportingElement(report_sources, kManagementReportHardwareStatus,
- DeviceReportingType::kDeviceStatistics);
- }
- if (collector->ShouldReportNetworkInterfaces()) {
- AddDeviceReportingElement(report_sources,
- kManagementReportNetworkInterfaces,
- DeviceReportingType::kDevice);
- }
- if (collector->ShouldReportCrashReportInfo()) {
- AddDeviceReportingElement(report_sources, kManagementReportCrashReports,
- DeviceReportingType::kCrashReport);
- }
- if (manager->GetSystemLogUploader()->upload_enabled()) {
- AddDeviceReportingElement(report_sources, kManagementLogUploadEnabled,
- DeviceReportingType::kLogs);
- }
-
- if (profile->GetPrefs()->GetBoolean(
- prefs::kPrintingSendUsernameAndFilenameEnabled)) {
- AddDeviceReportingElement(report_sources, kManagementPrinting,
- DeviceReportingType::kPrint);
- }
-
- if (crostini::CrostiniFeatures::Get()->IsAllowed(profile)) {
- if (!profile->GetPrefs()
- ->GetFilePath(crostini::prefs::kCrostiniAnsiblePlaybookFilePath)
- .empty()) {
- AddDeviceReportingElement(report_sources,
- kManagementCrostiniContainerConfiguration,
- DeviceReportingType::kCrostini);
- } else if (profile->GetPrefs()->GetBoolean(
- crostini::prefs::kReportCrostiniUsageEnabled)) {
- AddDeviceReportingElement(report_sources, kManagementCrostini,
- DeviceReportingType::kCrostini);
- }
- }
-
- if (g_browser_process->local_state()->GetBoolean(
- prefs::kCloudReportingEnabled) &&
- base::FeatureList::IsEnabled(features::kEnterpriseReportingInChromeOS)) {
- AddDeviceReportingElement(report_sources,
- kManagementExtensionReportUsername,
- DeviceReportingType::kUsername);
- AddDeviceReportingElement(report_sources, kManagementReportExtensions,
- DeviceReportingType::kExtensions);
- AddDeviceReportingElement(report_sources,
- kManagementReportAndroidApplications,
- DeviceReportingType::kAndroidApplication);
- }
-}
#endif // defined(OS_CHROMEOS)
std::vector<base::Value> GetPermissionsForExtension(
@@ -566,6 +495,114 @@ void ManagementUIHandler::AddReportingInfo(base::Value* report_sources) {
}
}
+#if defined(OS_CHROMEOS)
+const policy::DeviceCloudPolicyManagerChromeOS*
+ManagementUIHandler::GetDeviceCloudPolicyManager() const {
+ // Only check for report status in managed environment.
+ if (!device_managed_)
+ return nullptr;
+
+ const policy::BrowserPolicyConnectorChromeOS* connector =
+ g_browser_process->platform_part()->browser_policy_connector_chromeos();
+ return connector->GetDeviceCloudPolicyManager();
+}
+
+void ManagementUIHandler::AddDeviceReportingInfo(
+ base::Value* report_sources,
+ const policy::StatusCollector* collector,
+ const policy::SystemLogUploader* uploader,
+ Profile* profile) const {
+ if (!collector || !profile || !uploader)
+ return;
+
+ // Elements appear on the page in the order they are added.
+ if (collector->ShouldReportActivityTimes()) {
+ AddDeviceReportingElement(report_sources, kManagementReportActivityTimes,
+ DeviceReportingType::kDeviceActivity);
+ } else {
+ if (collector->ShouldReportUsers()) {
+ AddDeviceReportingElement(report_sources, kManagementReportUsers,
+ DeviceReportingType::kSupervisedUser);
+ }
+ }
+ if (collector->ShouldReportHardwareStatus()) {
+ AddDeviceReportingElement(report_sources, kManagementReportHardwareStatus,
+ DeviceReportingType::kDeviceStatistics);
+ }
+ if (collector->ShouldReportNetworkInterfaces()) {
+ AddDeviceReportingElement(report_sources,
+ kManagementReportNetworkInterfaces,
+ DeviceReportingType::kDevice);
+ }
+ if (collector->ShouldReportCrashReportInfo()) {
+ AddDeviceReportingElement(report_sources, kManagementReportCrashReports,
+ DeviceReportingType::kCrashReport);
+ }
+ if (uploader->upload_enabled()) {
+ AddDeviceReportingElement(report_sources, kManagementLogUploadEnabled,
+ DeviceReportingType::kLogs);
+ }
+
+ if (profile->GetPrefs()->GetBoolean(
+ prefs::kPrintingSendUsernameAndFilenameEnabled)) {
+ AddDeviceReportingElement(report_sources, kManagementPrinting,
+ DeviceReportingType::kPrint);
+ }
+
+ if (crostini::CrostiniFeatures::Get()->IsAllowed(profile)) {
+ if (!profile->GetPrefs()
+ ->GetFilePath(crostini::prefs::kCrostiniAnsiblePlaybookFilePath)
+ .empty()) {
+ AddDeviceReportingElement(report_sources,
+ kManagementCrostiniContainerConfiguration,
+ DeviceReportingType::kCrostini);
+ } else if (profile->GetPrefs()->GetBoolean(
+ crostini::prefs::kReportCrostiniUsageEnabled)) {
+ AddDeviceReportingElement(report_sources, kManagementCrostini,
+ DeviceReportingType::kCrostini);
+ }
+ }
+
+ if (g_browser_process->local_state()->GetBoolean(
+ prefs::kCloudReportingEnabled) &&
+ base::FeatureList::IsEnabled(features::kEnterpriseReportingInChromeOS)) {
+ AddDeviceReportingElement(report_sources,
+ kManagementExtensionReportUsername,
+ DeviceReportingType::kUsername);
+ AddDeviceReportingElement(report_sources, kManagementReportExtensions,
+ DeviceReportingType::kExtensions);
+ AddDeviceReportingElement(report_sources,
+ kManagementReportAndroidApplications,
+ DeviceReportingType::kAndroidApplication);
+ }
+
+ chromeos::NetworkHandler* network_handler = chromeos::NetworkHandler::Get();
+ base::Value proxy_settings(base::Value::Type::DICTIONARY);
+ // |ui_proxy_config_service| may be missing in tests.
+ if (network_handler->has_ui_proxy_config_service()) {
+ // Check if proxy is enforced by user policy, a forced install extension or
+ // ONC policies. This will only read managed settings.
+ network_handler->ui_proxy_config_service()->MergeEnforcedProxyConfig(
+ network_handler->network_state_handler()->DefaultNetwork()->guid(),
+ &proxy_settings);
+ }
+ if (!proxy_settings.DictEmpty()) {
+ // Proxies can be specified by web server url, via a PAC script or via the
+ // web proxy auto-discovery protocol. Chrome also supports the "direct"
+ // mode, in which no proxy is used.
+ base::Value* proxy_specification_mode = proxy_settings.FindPath(
+ {::onc::network_config::kType, ::onc::kAugmentationActiveSetting});
+ bool use_proxy =
+ proxy_specification_mode &&
+ proxy_specification_mode->GetString() != ::onc::proxy::kDirect;
+ if (use_proxy) {
+ AddDeviceReportingElement(report_sources, kManagementReportProxyServer,
+ DeviceReportingType::kProxyServer);
+ }
+ }
+}
+#endif
+
base::Value ManagementUIHandler::GetContextualManagedData(Profile* profile) {
base::Value response(base::Value::Type::DICTIONARY);
#if defined(OS_CHROMEOS)
@@ -861,7 +898,19 @@ void ManagementUIHandler::HandleGetDeviceReportingInfo(
base::Value report_sources(base::Value::Type::LIST);
AllowJavascript();
- AddDeviceReportingInfo(&report_sources, Profile::FromWebUI(web_ui()));
+ const policy::DeviceCloudPolicyManagerChromeOS* manager =
+ GetDeviceCloudPolicyManager();
+ policy::StatusUploader* uploader = nullptr;
+ policy::SystemLogUploader* syslog_uploader = nullptr;
+ policy::StatusCollector* collector = nullptr;
+ if (manager) {
+ uploader = manager->GetStatusUploader();
+ syslog_uploader = manager->GetSystemLogUploader();
+ if (uploader)
+ collector = uploader->status_collector();
+ }
+ AddDeviceReportingInfo(&report_sources, collector, syslog_uploader,
+ Profile::FromWebUI(web_ui()));
ResolveJavascriptCallback(args->GetList()[0] /* callback_id */,
report_sources);
diff --git a/chromium/chrome/browser/ui/webui/management_ui_handler.h b/chromium/chrome/browser/ui/webui/management_ui_handler.h
index a39859124bf..188d8d417a2 100644
--- a/chromium/chrome/browser/ui/webui/management_ui_handler.h
+++ b/chromium/chrome/browser/ui/webui/management_ui_handler.h
@@ -38,6 +38,7 @@ extern const char kManagementCrostini[];
extern const char kManagementCrostiniContainerConfiguration[];
extern const char kManagementReportExtensions[];
extern const char kManagementReportAndroidApplications[];
+extern const char kManagementReportProxyServer[];
#endif // defined(OS_CHROMEOS)
extern const char kCloudReportingExtensionId[];
@@ -85,7 +86,10 @@ class Extension;
} // namespace extensions
namespace policy {
+class DeviceCloudPolicyManagerChromeOS;
class PolicyService;
+class StatusCollector;
+class SystemLogUploader;
} // namespace policy
class Profile;
@@ -129,6 +133,12 @@ class ManagementUIHandler : public content::WebUIMessageHandler,
#if defined(OS_CHROMEOS)
// Protected for testing.
virtual const std::string GetDeviceDomain() const;
+ virtual const policy::DeviceCloudPolicyManagerChromeOS*
+ GetDeviceCloudPolicyManager() const;
+ void AddDeviceReportingInfo(base::Value* report_sources,
+ const policy::StatusCollector* collector,
+ const policy::SystemLogUploader* uploader,
+ Profile* profile) const;
#endif // defined(OS_CHROMEOS)
private:
void GetManagementStatus(Profile* profile, base::Value* status) const;
diff --git a/chromium/chrome/browser/ui/webui/management_ui_handler_unittest.cc b/chromium/chrome/browser/ui/webui/management_ui_handler_unittest.cc
index c5cf4a2e6f9..5da0346aaec 100644
--- a/chromium/chrome/browser/ui/webui/management_ui_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/management_ui_handler_unittest.cc
@@ -6,11 +6,14 @@
#include <set>
#include <string>
+#include "base/files/file_path.h"
+#include "base/memory/scoped_refptr.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/ui/webui/management_ui_handler.h"
#include "chrome/test/base/testing_profile.h"
-
+#include "components/policy/core/browser/browser_policy_connector.h"
+#include "components/policy/core/common/mock_configuration_policy_provider.h"
#include "components/policy/core/common/mock_policy_service.h"
#include "components/policy/core/common/policy_map.h"
#include "components/policy/core/common/policy_namespace.h"
@@ -22,14 +25,52 @@
#include "extensions/common/extension_builder.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
-
#include "ui/base/l10n/l10n_util.h"
#if defined(OS_CHROMEOS)
+#include "base/test/scoped_feature_list.h"
+#include "base/test/test_simple_task_runner.h"
+#include "chrome/browser/chromeos/crostini/crostini_features.h"
+#include "chrome/browser/chromeos/crostini/crostini_pref_names.h"
+#include "chrome/browser/chromeos/crostini/fake_crostini_features.h"
+#include "chrome/browser/chromeos/policy/device_cloud_policy_initializer.h"
+#include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h"
+#include "chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.h"
+#include "chrome/browser/chromeos/policy/status_collector/device_status_collector.h"
+#include "chrome/browser/chromeos/policy/status_collector/status_collector.h"
+#include "chrome/browser/chromeos/policy/status_uploader.h"
+#include "chrome/browser/chromeos/policy/system_log_uploader.h"
+#include "chrome/browser/chromeos/settings/device_settings_service.h"
+#include "chrome/browser/chromeos/settings/device_settings_test_helper.h"
+#include "chrome/browser/chromeos/settings/scoped_testing_cros_settings.h"
+#include "chrome/browser/prefs/browser_prefs.h"
+#include "chrome/common/chrome_features.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/test/base/testing_browser_process.h"
+#include "chromeos/cryptohome/async_method_caller.h"
+#include "chromeos/dbus/power/power_manager_client.h"
+#include "chromeos/network/network_state_handler.h"
+#include "chromeos/network/proxy/proxy_config_handler.h"
+#include "chromeos/network/proxy/ui_proxy_config_service.h"
+#include "chromeos/system/fake_statistics_provider.h"
+#include "chromeos/tpm/stub_install_attributes.h"
+#include "components/onc/onc_pref_names.h"
+#include "components/policy/core/common/cloud/cloud_external_data_manager.h"
+#include "components/policy/core/common/cloud/mock_cloud_policy_client.h"
+#include "components/policy/core/common/cloud/mock_signing_service.h"
+#include "components/prefs/testing_pref_service.h"
+#include "components/proxy_config/pref_proxy_config_tracker_impl.h"
+#include "components/proxy_config/proxy_config_dictionary.h"
+#include "components/proxy_config/proxy_config_pref_names.h"
+#include "components/sync_preferences/testing_pref_service_syncable.h"
+#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
#include "ui/chromeos/devicetype_utils.h"
#endif // defined(OS_CHROMEOS)
using testing::_;
+using testing::AssertionFailure;
+using testing::AssertionResult;
+using testing::AssertionSuccess;
using testing::Return;
using testing::ReturnRef;
@@ -44,6 +85,65 @@ struct ContextualManagementSourceUpdate {
bool managed;
};
+#if defined(OS_CHROMEOS)
+// This class is just to mock the behaviour of the few flags we need for
+// simulating the behaviour of the policy::DeviceStatusCollector.
+// The expected flags are passed to the constructor.
+class TestDeviceStatusCollector : public policy::DeviceStatusCollector {
+ public:
+ TestDeviceStatusCollector(PrefService* local_state,
+ bool report_activity_times,
+ bool report_nics,
+ bool report_users,
+ bool report_hw_status,
+ bool report_crash_info)
+ : policy::DeviceStatusCollector(local_state, nullptr),
+ report_activity_times_(report_activity_times),
+ report_nics_(report_nics),
+ report_users_(report_users),
+ report_hw_status_(report_hw_status),
+ report_crash_info_(report_crash_info) {}
+ ~TestDeviceStatusCollector() override = default;
+
+ bool ShouldReportActivityTimes() const override {
+ return report_activity_times_;
+ }
+ bool ShouldReportNetworkInterfaces() const override { return report_nics_; }
+ bool ShouldReportUsers() const override { return report_users_; }
+ bool ShouldReportHardwareStatus() const override { return report_hw_status_; }
+ bool ShouldReportCrashReportInfo() const override {
+ return report_crash_info_;
+ }
+
+ // empty methods that need to be implemented but are of no use for this case.
+ void GetStatusAsync(
+ const policy::StatusCollectorCallback& callback) override {}
+ void OnSubmittedSuccessfully() override {}
+
+ private:
+ bool report_activity_times_;
+ bool report_nics_;
+ bool report_users_;
+ bool report_hw_status_;
+ bool report_crash_info_;
+};
+
+class TestDeviceCloudPolicyManagerChromeOS
+ : public policy::DeviceCloudPolicyManagerChromeOS {
+ public:
+ TestDeviceCloudPolicyManagerChromeOS(
+ std::unique_ptr<policy::DeviceCloudPolicyStoreChromeOS> store,
+ policy::ServerBackedStateKeysBroker* state_keys_broker)
+ : DeviceCloudPolicyManagerChromeOS(std::move(store),
+ nullptr,
+ nullptr,
+ state_keys_broker) {
+ set_component_policy_disabled_for_testing(true);
+ }
+ ~TestDeviceCloudPolicyManagerChromeOS() override = default;
+};
+#endif
+
class TestManagementUIHandler : public ManagementUIHandler {
public:
TestManagementUIHandler() = default;
@@ -81,6 +181,21 @@ class TestManagementUIHandler : public ManagementUIHandler {
}
#if defined(OS_CHROMEOS)
+ MOCK_METHOD(policy::DeviceCloudPolicyManagerChromeOS*,
+ GetDeviceCloudPolicyManager,
+ (),
+ (const, override));
+
+ base::Value GetDeviceReportingInfo(
+ const TestDeviceCloudPolicyManagerChromeOS* manager,
+ const TestDeviceStatusCollector* collector,
+ const policy::SystemLogUploader* uploader,
+ Profile* profile) {
+ base::Value report_sources = base::Value(base::Value::Type::LIST);
+ AddDeviceReportingInfo(&report_sources, collector, uploader, profile);
+ return report_sources;
+ }
+
const std::string GetDeviceDomain() const override { return device_domain; }
void SetDeviceDomain(const std::string& domain) { device_domain = domain; }
#endif // defined(OS_CHROMEOS)
@@ -91,14 +206,34 @@ class TestManagementUIHandler : public ManagementUIHandler {
std::string device_domain = "devicedomain.com";
};
-class ManagementUIHandlerTests : public testing::Test {
+// We need to use a different base class for ChromeOS and non ChromeOS case.
+// TODO(marcgrimme): refactor so that ChromeOS and non ChromeOS part is better
+// separated.
+#if defined(OS_CHROMEOS)
+using TestingBaseClass = chromeos::DeviceSettingsTestBase;
+#else
+using TestingBaseClass = testing::Test;
+#endif
+class ManagementUIHandlerTests : public TestingBaseClass {
public:
+#if defined(OS_CHROMEOS)
ManagementUIHandlerTests()
- : handler_(&policy_service_),
- device_domain_(base::UTF8ToUTF16("devicedomain.com")) {
+ : TestingBaseClass(),
+ handler_(&policy_service_),
+ device_domain_(base::UTF8ToUTF16("devicedomain.com")),
+ task_runner_(base::MakeRefCounted<base::TestSimpleTaskRunner>()),
+ state_keys_broker_(&session_manager_client_) {
+ ON_CALL(policy_service_, GetPolicies(_))
+ .WillByDefault(ReturnRef(empty_policy_map_));
+ }
+#else
+ ManagementUIHandlerTests() : TestingBaseClass(), handler_(&policy_service_) {
ON_CALL(policy_service_, GetPolicies(_))
.WillByDefault(ReturnRef(empty_policy_map_));
}
+#endif
+
+ ~ManagementUIHandlerTests() override = default;
base::string16 device_domain() { return device_domain_; }
void EnablePolicy(const char* policy_key, policy::PolicyMap& policies) {
@@ -143,34 +278,128 @@ class ManagementUIHandlerTests : public testing::Test {
extracted_.managed = managed.has_value() && managed.value();
}
- void PrepareProfileAndHandler() {
- PrepareProfileAndHandler(std::string(), false, true, false,
- "devicedomain.com");
+ /* Structure to organize the different configuration settings for each test
+ * into configuration for a test case. */
+ struct TestConfig {
+ bool report_activity_times;
+ bool report_nics;
+ bool report_users;
+ bool report_hw_status;
+ bool report_crash_info;
+ bool upload_enabled;
+ bool printing_send_username_and_filename;
+ bool crostini_report_usage;
+ bool cloud_reporting_enabled;
+ std::string profile_name;
+ bool override_policy_connector_is_managed;
+ bool managed_account;
+ bool managed_device;
+ std::string device_domain;
+ base::FilePath crostini_ansible_playbook_filepath;
+ };
+
+ void ResetTestConfig() { ResetTestConfig(true); }
+
+ void ResetTestConfig(bool default_value) {
+ setup_config_.report_activity_times = default_value;
+ setup_config_.report_nics = default_value;
+ setup_config_.report_users = default_value;
+ setup_config_.report_hw_status = default_value;
+ setup_config_.report_crash_info = default_value;
+ setup_config_.upload_enabled = default_value;
+ setup_config_.printing_send_username_and_filename = default_value;
+ setup_config_.crostini_report_usage = default_value;
+ setup_config_.cloud_reporting_enabled = default_value;
+ setup_config_.profile_name = "";
+ setup_config_.override_policy_connector_is_managed = false;
+ setup_config_.managed_account = true;
+ setup_config_.managed_device = false;
+ setup_config_.device_domain = "devicedomain.com";
+ }
+
+#if defined(OS_CHROMEOS)
+ void SetUp() override {
+ DeviceSettingsTestBase::SetUp();
+ install_attributes_ =
+ std::make_unique<chromeos::ScopedStubInstallAttributes>(
+ chromeos::StubInstallAttributes::CreateUnset());
+ scoped_feature_list_.Init();
+
+ crostini_features_ = std::make_unique<crostini::FakeCrostiniFeatures>();
+ SetUpConnectManager();
+ chromeos::NetworkHandler::Initialize();
+ }
+ void TearDown() override {
+ chromeos::NetworkHandler::Shutdown();
+ TestingBrowserProcess::GetGlobal()->SetLocalState(nullptr);
+ DeviceSettingsTestBase::TearDown();
}
- void PrepareProfileAndHandler(const std::string& profile_name,
- bool override_policy_connector_is_managed,
- bool use_account,
- bool use_device) {
- PrepareProfileAndHandler(profile_name, override_policy_connector_is_managed,
- use_account, use_device, "devicedomain.com");
+ void SetUpConnectManager() {
+ RegisterLocalState(local_state_.registry());
+ std::unique_ptr<policy::DeviceCloudPolicyStoreChromeOS> store =
+ std::make_unique<policy::DeviceCloudPolicyStoreChromeOS>(
+ device_settings_service_.get(), install_attributes_->Get(),
+ base::ThreadTaskRunnerHandle::Get());
+ manager_ = std::make_unique<TestDeviceCloudPolicyManagerChromeOS>(
+ std::move(store), &state_keys_broker_);
+ TestingBrowserProcess::GetGlobal()->SetLocalState(&local_state_);
+ manager_.get()->Initialize(&local_state_);
}
- void PrepareProfileAndHandler(const std::string& profile_name,
- bool override_policy_connector_is_managed,
- bool use_account,
- bool use_device,
- const std::string& device_domain) {
+ base::Value SetUpForReportingInfo() {
+ GetTestConfig().override_policy_connector_is_managed = true;
+ GetTestConfig().managed_device = true;
+ SetUpProfileAndHandler();
+ const TestDeviceStatusCollector* status_collector =
+ new TestDeviceStatusCollector(
+ &local_state_, GetTestConfig().report_activity_times,
+ GetTestConfig().report_nics, GetTestConfig().report_users,
+ GetTestConfig().report_hw_status,
+ GetTestConfig().report_crash_info);
+ settings_.device_settings()->SetTrustedStatus(
+ chromeos::CrosSettingsProvider::TRUSTED);
+ settings_.device_settings()->SetBoolean(chromeos::kSystemLogUploadEnabled,
+ GetTestConfig().upload_enabled);
+ profile_->GetPrefs()->SetBoolean(
+ prefs::kPrintingSendUsernameAndFilenameEnabled,
+ GetTestConfig().printing_send_username_and_filename);
+ profile_->GetPrefs()->SetBoolean(
+ crostini::prefs::kReportCrostiniUsageEnabled,
+ GetTestConfig().crostini_report_usage);
+ local_state_.SetBoolean(prefs::kCloudReportingEnabled,
+ GetTestConfig().cloud_reporting_enabled);
+ scoped_feature_list()->Reset();
+ scoped_feature_list()->InitAndEnableFeature(
+ features::kEnterpriseReportingInChromeOS);
+
+ profile_->GetPrefs()->SetFilePath(
+ crostini::prefs::kCrostiniAnsiblePlaybookFilePath,
+ GetTestConfig().crostini_ansible_playbook_filepath);
+ crostini_features()->set_allowed(true);
+
+ const policy::SystemLogUploader* system_uploader =
+ new policy::SystemLogUploader(/*syslog_delegate=*/nullptr,
+ /*task_runner=*/task_runner_);
+ ON_CALL(testing::Const(handler_), GetDeviceCloudPolicyManager())
+ .WillByDefault(Return(manager_.get()));
+
+ return handler_.GetDeviceReportingInfo(manager_.get(), status_collector,
+ system_uploader, GetProfile());
+ }
+#endif // defined(OS_CHROMEOS)
+
+ void SetUpProfileAndHandler() {
TestingProfile::Builder builder;
- builder.SetProfileName(profile_name);
- if (override_policy_connector_is_managed) {
+ builder.SetProfileName(GetTestConfig().profile_name);
+ if (GetTestConfig().override_policy_connector_is_managed) {
builder.OverridePolicyConnectorIsManagedForTesting(true);
}
profile_ = builder.Build();
- handler_.SetAccountManagedForTesting(use_account);
- handler_.SetDeviceManagedForTesting(use_device);
+ handler_.SetAccountManagedForTesting(GetTestConfig().managed_account);
+ handler_.SetDeviceManagedForTesting(GetTestConfig().managed_device);
#if defined(OS_CHROMEOS)
- handler_.SetDeviceDomain(device_domain);
+ handler_.SetDeviceDomain(GetTestConfig().device_domain);
#endif
base::Value data =
handler_.GetContextualManagedDataForTesting(profile_.get());
@@ -183,10 +412,19 @@ class ManagementUIHandlerTests : public testing::Test {
base::string16 GetManagementOverview() const {
return extracted_.management_overview;
}
+ base::test::ScopedFeatureList* scoped_feature_list() {
+ return &scoped_feature_list_;
+ }
+
+ crostini::FakeCrostiniFeatures* crostini_features() {
+ return crostini_features_.get();
+ }
#else
+
base::string16 GetBrowserManagementNotice() const {
return extracted_.browser_management_notice;
}
+
#endif
base::string16 GetExtensionReportingTitle() const {
@@ -195,37 +433,120 @@ class ManagementUIHandlerTests : public testing::Test {
base::string16 GetPageSubtitle() const { return extracted_.subtitle; }
+ TestingProfile* GetProfile() const { return profile_.get(); }
+
+ TestConfig& GetTestConfig() { return setup_config_; }
+
protected:
+ TestConfig setup_config_;
TestManagementUIHandler handler_;
- content::BrowserTaskEnvironment task_environment_;
policy::MockPolicyService policy_service_;
policy::PolicyMap empty_policy_map_;
base::string16 device_domain_;
ContextualManagementSourceUpdate extracted_;
+#if defined(OS_CHROMEOS)
+ std::unique_ptr<chromeos::ScopedStubInstallAttributes> install_attributes_;
+ std::unique_ptr<crostini::FakeCrostiniFeatures> crostini_features_;
+ TestingPrefServiceSimple local_state_;
+ base::test::ScopedFeatureList scoped_feature_list_;
+ TestingPrefServiceSimple user_prefs_;
+ std::unique_ptr<TestDeviceCloudPolicyManagerChromeOS> manager_;
+ scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
+ policy::ServerBackedStateKeysBroker state_keys_broker_;
+ chromeos::ScopedTestingCrosSettings settings_;
+ chromeos::system::ScopedFakeStatisticsProvider fake_statistics_provider_;
+#else
+ content::BrowserTaskEnvironment task_environment_;
std::unique_ptr<TestingProfile> profile_;
+#endif
};
-void ExpectMessagesToBeEQ(base::Value::ConstListView infolist,
- const std::set<std::string>& expected_messages) {
- ASSERT_EQ(infolist.size(), expected_messages.size());
+AssertionResult MessagesToBeEQ(const char* infolist_expr,
+ const char* expected_infolist_expr,
+ base::Value::ConstListView infolist,
+ const std::set<std::string>& expected_messages) {
+ if (infolist.size() != expected_messages.size()) {
+ return AssertionFailure()
+ << " " << infolist_expr << " and " << expected_infolist_expr
+ << " don't have the same size. (" << infolist.size() << ", "
+ << expected_messages.size() << ")";
+ }
std::set<std::string> tmp_expected(expected_messages);
for (const base::Value& info : infolist) {
const std::string* message_id = info.FindStringKey("messageId");
if (message_id) {
- EXPECT_EQ(1u, tmp_expected.erase(*message_id));
+ if (tmp_expected.erase(*message_id) != 1u) {
+ return AssertionFailure() << " message " << *message_id << " is not in "
+ << expected_infolist_expr;
+ }
}
}
- EXPECT_TRUE(tmp_expected.empty());
+ if (!tmp_expected.empty()) {
+ return AssertionFailure()
+ << " " << infolist_expr << " and " << expected_infolist_expr
+ << " have different contents " << infolist.data();
+ }
+ return AssertionSuccess();
}
+#if defined(OS_CHROMEOS)
+AssertionResult ReportingElementsToBeEQ(
+ const char* elements_expr,
+ const char* expected_elements_expr,
+ base::Value::ConstListView elements,
+ const std::map<std::string, std::string> expected_elements) {
+ if (elements.size() != expected_elements.size()) {
+ return AssertionFailure()
+ << elements_expr << " and " << expected_elements_expr
+ << " don't have the same size. (" << elements.size() << ", "
+ << expected_elements.size() << ")";
+ }
+ std::map<std::string, std::string> tmp_expected(expected_elements);
+ for (const base::Value& element : elements) {
+ const std::string* message_id = element.FindStringKey("messageId");
+ const std::string* js_reporting_type =
+ element.FindStringKey("reportingType");
+ if (message_id && js_reporting_type) {
+ auto tmp_reporting_type = tmp_expected.find(*message_id);
+ if (tmp_reporting_type == tmp_expected.end()) {
+ return AssertionFailure() << " could not find message " << *message_id
+ << " in " << expected_elements_expr;
+ }
+ if (tmp_reporting_type->second != *js_reporting_type) {
+ return AssertionFailure()
+ << " expected reporting element \"" << *js_reporting_type
+ << "\" with key \"" << *message_id << "\" doesn't match \""
+ << tmp_reporting_type->second << "\" in \""
+ << expected_elements_expr << "\"";
+ }
+ tmp_expected.erase(tmp_reporting_type);
+ } else {
+ return AssertionFailure()
+ << " couldn't find key messageId or reportingType in "
+ << elements.data();
+ }
+ }
+ if (!tmp_expected.empty()) {
+ AssertionResult result = AssertionFailure();
+ result
+ << " the following messageId and reportingTypes could not be matched {";
+ for (const auto& element : tmp_expected) {
+ result << " messageId: " << element.first << ", reportingType "
+ << element.second;
+ }
+ result << "}";
+ return result;
+ }
+ return AssertionSuccess();
+}
+#endif
+
#if !defined(OS_CHROMEOS)
TEST_F(ManagementUIHandlerTests,
ManagementContextualSourceUpdateUnmanagedNoDomain) {
- PrepareProfileAndHandler(
- /* profile_name= */ "",
- /* override_policy_connector_is_managed= */ false,
- /* use_account= */ false,
- /* use_device= */ false);
+ ResetTestConfig();
+ GetTestConfig().managed_account = false;
+ SetUpProfileAndHandler();
EXPECT_EQ(GetExtensionReportingTitle(),
l10n_util::GetStringUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED));
@@ -239,7 +560,8 @@ TEST_F(ManagementUIHandlerTests,
TEST_F(ManagementUIHandlerTests,
ManagementContextualSourceUpdateManagedNoDomain) {
- PrepareProfileAndHandler();
+ ResetTestConfig();
+ SetUpProfileAndHandler();
EXPECT_EQ(GetExtensionReportingTitle(),
l10n_util::GetStringUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED));
@@ -254,10 +576,9 @@ TEST_F(ManagementUIHandlerTests,
TEST_F(ManagementUIHandlerTests,
ManagementContextualSourceUpdateManagedConsumerDomain) {
- PrepareProfileAndHandler(
- /* profile_name= */ "managed@gmail.com",
- /* override_policy_connector_is_managed= */ true,
- /* use_account= */ true, /* use_device= */ false);
+ ResetTestConfig();
+ GetTestConfig().override_policy_connector_is_managed = true;
+ SetUpProfileAndHandler();
EXPECT_EQ(GetExtensionReportingTitle(),
l10n_util::GetStringUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED));
@@ -273,10 +594,11 @@ TEST_F(ManagementUIHandlerTests,
TEST_F(ManagementUIHandlerTests,
ManagementContextualSourceUpdateUnmanagedKnownDomain) {
const std::string domain = "manager.com";
- PrepareProfileAndHandler(
- /* profile_name= */ "managed@" + domain,
- /* override_policy_connector_is_managed= */ true,
- /* use_account= */ false, /* use_device= */ false);
+ ResetTestConfig();
+ GetTestConfig().profile_name = "managed@" + domain;
+ GetTestConfig().override_policy_connector_is_managed = true;
+ GetTestConfig().managed_account = false;
+ SetUpProfileAndHandler();
EXPECT_EQ(GetExtensionReportingTitle(),
l10n_util::GetStringFUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED_BY,
@@ -292,10 +614,10 @@ TEST_F(ManagementUIHandlerTests,
TEST_F(ManagementUIHandlerTests,
ManagementContextualSourceUpdateUnmanagedCustomerDomain) {
- PrepareProfileAndHandler(
- /* profile_name= */ "managed@googlemail.com",
- /* override_policy_connector_is_managed= */ false,
- /* use_account= */ false, /* use_device= */ false);
+ ResetTestConfig();
+ GetTestConfig().managed_account = false;
+ SetUpProfileAndHandler();
+
EXPECT_EQ(GetExtensionReportingTitle(),
l10n_util::GetStringUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED));
EXPECT_EQ(GetBrowserManagementNotice(),
@@ -310,10 +632,10 @@ TEST_F(ManagementUIHandlerTests,
TEST_F(ManagementUIHandlerTests,
ManagementContextualSourceUpdateManagedKnownDomain) {
const std::string domain = "gmail.com.manager.com.gmail.com";
- PrepareProfileAndHandler(
- /* profile_name= */ "managed@" + domain,
- /* override_policy_connector_is_managed= */ true,
- /* use_account_for_testing= */ true, /* use_device= */ false);
+ ResetTestConfig();
+ GetTestConfig().profile_name = "managed@" + domain;
+ GetTestConfig().override_policy_connector_is_managed = true;
+ SetUpProfileAndHandler();
EXPECT_EQ(GetExtensionReportingTitle(),
l10n_util::GetStringFUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED_BY,
@@ -334,12 +656,12 @@ TEST_F(ManagementUIHandlerTests,
TEST_F(ManagementUIHandlerTests,
ManagementContextualSourceUpdateManagedAccountKnownDomain) {
const std::string domain = "manager.com";
- PrepareProfileAndHandler(
- /* profile_name= */ "managed@" + domain,
- /* override_policy_connector_is_managed= */ true,
- /* use_account= */ true, /* use_device= */ false,
- /* device_name= */ "");
const auto device_type = ui::GetChromeOSDeviceTypeResourceId();
+ ResetTestConfig();
+ GetTestConfig().profile_name = "managed@" + domain;
+ GetTestConfig().override_policy_connector_is_managed = true;
+ GetTestConfig().device_domain = "";
+ SetUpProfileAndHandler();
EXPECT_EQ(GetExtensionReportingTitle(),
l10n_util::GetStringFUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED_BY,
@@ -356,12 +678,10 @@ TEST_F(ManagementUIHandlerTests,
TEST_F(ManagementUIHandlerTests,
ManagementContextualSourceUpdateManagedAccountUnknownDomain) {
- PrepareProfileAndHandler(
- /* profile_name= */ "",
- /* override_policy_connector_is_managed= */ false,
- /* use_account= */ true, /* use_device= */ false,
- /* device_name= */ "");
const auto device_type = ui::GetChromeOSDeviceTypeResourceId();
+ ResetTestConfig();
+ GetTestConfig().device_domain = "";
+ SetUpProfileAndHandler();
EXPECT_EQ(GetExtensionReportingTitle(),
l10n_util::GetStringUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED));
@@ -374,11 +694,11 @@ TEST_F(ManagementUIHandlerTests,
TEST_F(ManagementUIHandlerTests,
ManagementContextualSourceUpdateManagedDevice) {
- PrepareProfileAndHandler(
- /* profile_name= */ "managed@manager.com",
- /* override_policy_connector_is_managed= */ false,
- /* use_account= */ false, /* use_device= */ true);
const auto device_type = ui::GetChromeOSDeviceTypeResourceId();
+ ResetTestConfig();
+ GetTestConfig().managed_account = false;
+ GetTestConfig().managed_device = true;
+ SetUpProfileAndHandler();
EXPECT_EQ(GetPageSubtitle(),
l10n_util::GetStringFUTF16(IDS_MANAGEMENT_SUBTITLE_MANAGED_BY,
@@ -393,11 +713,11 @@ TEST_F(ManagementUIHandlerTests,
TEST_F(ManagementUIHandlerTests,
ManagementContextualSourceUpdateManagedDeviceAndAccount) {
- PrepareProfileAndHandler(
- /* profile_name= */ "managed@devicedomain.com",
- /* override_policy_connector_is_managed= */ false,
- /* use_account= */ true, /* use_device= */ true);
const auto device_type = ui::GetChromeOSDeviceTypeResourceId();
+ ResetTestConfig();
+ GetTestConfig().profile_name = "managed@devicedomain.com";
+ GetTestConfig().managed_device = true;
+ SetUpProfileAndHandler();
EXPECT_EQ(GetPageSubtitle(),
l10n_util::GetStringFUTF16(IDS_MANAGEMENT_SUBTITLE_MANAGED_BY,
@@ -415,11 +735,12 @@ TEST_F(ManagementUIHandlerTests,
TEST_F(ManagementUIHandlerTests,
ManagementContextualSourceUpdateManagedDeviceAndAccountMultipleDomains) {
const std::string domain = "manager.com";
- PrepareProfileAndHandler(
- /* profile_name= */ "managed@" + domain,
- /* override_policy_connector_is_managed= */ true,
- /* use_account= */ true, /* use_device= */ true);
const auto device_type = ui::GetChromeOSDeviceTypeResourceId();
+ ResetTestConfig();
+ GetTestConfig().profile_name = "managed@" + domain;
+ GetTestConfig().override_policy_connector_is_managed = true;
+ GetTestConfig().managed_device = true;
+ SetUpProfileAndHandler();
EXPECT_EQ(GetPageSubtitle(),
l10n_util::GetStringFUTF16(IDS_MANAGEMENT_SUBTITLE_MANAGED_BY,
@@ -436,12 +757,12 @@ TEST_F(ManagementUIHandlerTests,
}
TEST_F(ManagementUIHandlerTests, ManagementContextualSourceUpdateUnmanaged) {
- PrepareProfileAndHandler(
- /* profile_name= */ "",
- /* override_policy_connector_is_managed= */ false,
- /* use_account= */ false, /* use_device= */ false,
- /* device_domain= */ "");
const auto device_type = ui::GetChromeOSDeviceTypeResourceId();
+ ResetTestConfig();
+ GetTestConfig().profile_name = "";
+ GetTestConfig().managed_account = false;
+ GetTestConfig().device_domain = "";
+ SetUpProfileAndHandler();
EXPECT_EQ(GetPageSubtitle(),
l10n_util::GetStringFUTF16(IDS_MANAGEMENT_NOT_MANAGED_SUBTITLE,
@@ -452,6 +773,120 @@ TEST_F(ManagementUIHandlerTests, ManagementContextualSourceUpdateUnmanaged) {
l10n_util::GetStringUTF16(IDS_MANAGEMENT_DEVICE_NOT_MANAGED));
EXPECT_FALSE(GetManaged());
}
+
+TEST_F(ManagementUIHandlerTests, NoDeviceReportingInfo) {
+ ResetTestConfig();
+ GetTestConfig().override_policy_connector_is_managed = true;
+ GetTestConfig().managed_account = false;
+ SetUpProfileAndHandler();
+
+ base::Value info =
+ handler_.GetDeviceReportingInfo(nullptr, nullptr, nullptr, GetProfile());
+
+ EXPECT_EQ(info.GetList().size(), 0u);
+}
+
+TEST_F(ManagementUIHandlerTests, AllEnabledDeviceReportingInfo) {
+ ResetTestConfig(true);
+ GetTestConfig().report_users = false;
+ const base::Value info = SetUpForReportingInfo();
+ const std::map<std::string, std::string> expected_elements = {
+ {kManagementReportActivityTimes, "device activity"},
+ {kManagementReportHardwareStatus, "device statistics"},
+ {kManagementReportNetworkInterfaces, "device"},
+ {kManagementReportCrashReports, "crash report"},
+ {kManagementLogUploadEnabled, "logs"},
+ {kManagementPrinting, "print"},
+ {kManagementCrostini, "crostini"},
+ {kManagementExtensionReportUsername, "username"},
+ {kManagementReportExtensions, "extension"},
+ {kManagementReportAndroidApplications, "android application"}};
+
+ ASSERT_PRED_FORMAT2(ReportingElementsToBeEQ, info.GetList(),
+ expected_elements);
+}
+
+TEST_F(ManagementUIHandlerTests,
+ AllEnabledCrostiniAnsiblePlaybookDeviceReportingInfo) {
+ ResetTestConfig(true);
+ GetTestConfig().crostini_ansible_playbook_filepath = base::FilePath("/tmp/");
+ const base::Value info = SetUpForReportingInfo();
+ const std::map<std::string, std::string> expected_elements = {
+ {kManagementReportActivityTimes, "device activity"},
+ {kManagementReportHardwareStatus, "device statistics"},
+ {kManagementReportNetworkInterfaces, "device"},
+ {kManagementReportCrashReports, "crash report"},
+ {kManagementLogUploadEnabled, "logs"},
+ {kManagementPrinting, "print"},
+ {kManagementCrostiniContainerConfiguration, "crostini"},
+ {kManagementExtensionReportUsername, "username"},
+ {kManagementReportExtensions, "extension"},
+ {kManagementReportAndroidApplications, "android application"}};
+
+ ASSERT_PRED_FORMAT2(ReportingElementsToBeEQ, info.GetList(),
+ expected_elements);
+}
+
+TEST_F(ManagementUIHandlerTests, OnlyReportUsersDeviceReportingInfo) {
+ ResetTestConfig(false);
+ GetTestConfig().report_users = true;
+ base::Value info = SetUpForReportingInfo();
+ const std::map<std::string, std::string> expected_elements = {
+ {kManagementReportUsers, "supervised user"}};
+
+ ASSERT_PRED_FORMAT2(ReportingElementsToBeEQ, info.GetList(),
+ expected_elements);
+}
+
+TEST_F(ManagementUIHandlerTests, AllDisabledDeviceReportingInfo) {
+ ResetTestConfig(false);
+ const base::Value info = SetUpForReportingInfo();
+ const std::map<std::string, std::string> expected_elements = {};
+
+ ASSERT_PRED_FORMAT2(ReportingElementsToBeEQ, info.GetList(),
+ expected_elements);
+}
+
+TEST_F(ManagementUIHandlerTests, ProxyServerShowReport) {
+ PrefProxyConfigTrackerImpl::RegisterProfilePrefs(user_prefs_.registry());
+ chromeos::NetworkHandler::Get()->InitializePrefServices(&user_prefs_,
+ &local_state_);
+ // Set pref to use a proxy.
+ base::Value policy_prefs_config = ProxyConfigDictionary::CreateAutoDetect();
+ user_prefs_.SetUserPref(
+ proxy_config::prefs::kProxy,
+ base::Value::ToUniquePtrValue(std::move(policy_prefs_config)));
+ base::RunLoop().RunUntilIdle();
+
+ ResetTestConfig(false);
+ const base::Value info = SetUpForReportingInfo();
+
+ const std::map<std::string, std::string> expected_elements = {
+ {kManagementReportProxyServer, "proxy server"}};
+
+ ASSERT_PRED_FORMAT2(ReportingElementsToBeEQ, info.GetList(),
+ expected_elements);
+}
+
+TEST_F(ManagementUIHandlerTests, ProxyServerHideReportForDirectProxy) {
+ PrefProxyConfigTrackerImpl::RegisterProfilePrefs(user_prefs_.registry());
+ chromeos::NetworkHandler::Get()->InitializePrefServices(&user_prefs_,
+ &local_state_);
+ // Set pref not to use proxy.
+ base::Value policy_prefs_config = ProxyConfigDictionary::CreateDirect();
+ user_prefs_.SetUserPref(
+ proxy_config::prefs::kProxy,
+ base::Value::ToUniquePtrValue(std::move(policy_prefs_config)));
+ base::RunLoop().RunUntilIdle();
+
+ ResetTestConfig(false);
+ const base::Value info = SetUpForReportingInfo();
+
+ const std::map<std::string, std::string> expected_elements = {};
+ ASSERT_PRED_FORMAT2(ReportingElementsToBeEQ, info.GetList(),
+ expected_elements);
+}
+
#endif
TEST_F(ManagementUIHandlerTests, ExtensionReportingInfoNoPolicySetNoMessage) {
@@ -470,8 +905,9 @@ TEST_F(ManagementUIHandlerTests,
kManagementExtensionReportExtensionsPlugin,
kManagementExtensionReportSafeBrowsingWarnings};
- ExpectMessagesToBeEQ(handler_.GetExtensionReportingInfo().GetList(),
- expected_messages);
+ ASSERT_PRED_FORMAT2(MessagesToBeEQ,
+ handler_.GetExtensionReportingInfo().GetList(),
+ expected_messages);
}
TEST_F(ManagementUIHandlerTests, CloudReportingPolicy) {
@@ -484,13 +920,14 @@ TEST_F(ManagementUIHandlerTests, CloudReportingPolicy) {
.WillRepeatedly(ReturnRef(chrome_policies));
SetPolicyValue(policy::key::kCloudReportingEnabled, chrome_policies, true);
- std::set<std::string> expected_messages = {
+ const std::set<std::string> expected_messages = {
kManagementExtensionReportMachineName, kManagementExtensionReportUsername,
kManagementExtensionReportVersion,
kManagementExtensionReportExtensionsPlugin};
- ExpectMessagesToBeEQ(handler_.GetExtensionReportingInfo().GetList(),
- expected_messages);
+ ASSERT_PRED_FORMAT2(MessagesToBeEQ,
+ handler_.GetExtensionReportingInfo().GetList(),
+ expected_messages);
}
TEST_F(ManagementUIHandlerTests, ExtensionReportingInfoPoliciesMerge) {
@@ -548,8 +985,9 @@ TEST_F(ManagementUIHandlerTests, ExtensionReportingInfoPoliciesMerge) {
kManagementExtensionReportUserBrowsingData,
kManagementExtensionReportPerfCrash};
- ExpectMessagesToBeEQ(handler_.GetExtensionReportingInfo().GetList(),
- expected_messages);
+ ASSERT_PRED_FORMAT2(MessagesToBeEQ,
+ handler_.GetExtensionReportingInfo().GetList(),
+ expected_messages);
}
TEST_F(ManagementUIHandlerTests, ThreatReportingInfo) {
diff --git a/chromium/chrome/browser/ui/webui/media/media_feeds_ui.cc b/chromium/chrome/browser/ui/webui/media/media_feeds_ui.cc
index c71607dc988..9fe5e0b04b8 100644
--- a/chromium/chrome/browser/ui/webui/media/media_feeds_ui.cc
+++ b/chromium/chrome/browser/ui/webui/media/media_feeds_ui.cc
@@ -8,17 +8,25 @@
#include "base/macros.h"
#include "chrome/browser/browser_process.h"
+#include "chrome/browser/media/feeds/media_feeds_converter.h"
+#include "chrome/browser/media/feeds/media_feeds_fetcher.h"
+#include "chrome/browser/media/feeds/media_feeds_service.h"
+#include "chrome/browser/media/feeds/media_feeds_store.mojom-shared.h"
#include "chrome/browser/media/history/media_history_keyed_service.h"
#include "chrome/browser/media/history/media_history_keyed_service_factory.h"
#include "chrome/browser/media/history/media_history_store.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/dev_ui_browser_resources.h"
+#include "components/prefs/pref_service.h"
#include "content/public/browser/render_view_host.h"
+#include "content/public/browser/storage_partition.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_controller.h"
#include "content/public/browser/web_ui_data_source.h"
+#include "media/base/media_switches.h"
MediaFeedsUI::MediaFeedsUI(content::WebUI* web_ui)
: ui::MojoWebUIController(web_ui) {
@@ -49,7 +57,9 @@ void MediaFeedsUI::BindInterface(
}
void MediaFeedsUI::GetMediaFeeds(GetMediaFeedsCallback callback) {
- GetMediaHistoryService()->GetMediaFeedsForDebug(std::move(callback));
+ GetMediaHistoryService()->GetMediaFeeds(
+ media_history::MediaHistoryKeyedService::GetMediaFeedsRequest(),
+ std::move(callback));
}
void MediaFeedsUI::GetItemsForMediaFeed(int64_t feed_id,
@@ -58,13 +68,49 @@ void MediaFeedsUI::GetItemsForMediaFeed(int64_t feed_id,
std::move(callback));
}
+void MediaFeedsUI::FetchMediaFeed(int64_t feed_id,
+ FetchMediaFeedCallback callback) {
+ GetMediaFeedsService()->FetchMediaFeed(feed_id, std::move(callback));
+}
+
+void MediaFeedsUI::GetDebugInformation(GetDebugInformationCallback callback) {
+ auto info = media_feeds::mojom::DebugInformation::New();
+
+ info->safe_search_feature_enabled =
+ base::FeatureList::IsEnabled(media::kMediaFeedsSafeSearch);
+ info->safe_search_pref_value =
+ GetProfile()->GetPrefs()->GetBoolean(prefs::kMediaFeedsSafeSearchEnabled);
+
+ std::move(callback).Run(std::move(info));
+}
+
+void MediaFeedsUI::SetSafeSearchEnabledPref(
+ bool value,
+ SetSafeSearchEnabledPrefCallback callback) {
+ GetProfile()->GetPrefs()->SetBoolean(prefs::kMediaFeedsSafeSearchEnabled,
+ value);
+
+ std::move(callback).Run();
+}
+
media_history::MediaHistoryKeyedService*
MediaFeedsUI::GetMediaHistoryService() {
- Profile* profile = Profile::FromWebUI(web_ui());
- DCHECK(profile);
-
media_history::MediaHistoryKeyedService* service =
- media_history::MediaHistoryKeyedServiceFactory::GetForProfile(profile);
+ media_history::MediaHistoryKeyedServiceFactory::GetForProfile(
+ GetProfile());
+ DCHECK(service);
+ return service;
+}
+
+media_feeds::MediaFeedsService* MediaFeedsUI::GetMediaFeedsService() {
+ media_feeds::MediaFeedsService* service =
+ media_feeds::MediaFeedsService::Get(GetProfile());
DCHECK(service);
return service;
}
+
+Profile* MediaFeedsUI::GetProfile() {
+ Profile* profile = Profile::FromWebUI(web_ui());
+ DCHECK(profile);
+ return profile;
+}
diff --git a/chromium/chrome/browser/ui/webui/media/media_feeds_ui.h b/chromium/chrome/browser/ui/webui/media/media_feeds_ui.h
index bd8e647ffa2..73de089c839 100644
--- a/chromium/chrome/browser/ui/webui/media/media_feeds_ui.h
+++ b/chromium/chrome/browser/ui/webui/media/media_feeds_ui.h
@@ -5,6 +5,8 @@
#ifndef CHROME_BROWSER_UI_WEBUI_MEDIA_MEDIA_FEEDS_UI_H_
#define CHROME_BROWSER_UI_WEBUI_MEDIA_MEDIA_FEEDS_UI_H_
+#include "chrome/browser/media/feeds/media_feeds_fetcher.h"
+#include "chrome/browser/media/feeds/media_feeds_service.h"
#include "chrome/browser/media/feeds/media_feeds_store.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
@@ -32,10 +34,20 @@ class MediaFeedsUI : public ui::MojoWebUIController,
void GetMediaFeeds(GetMediaFeedsCallback callback) override;
void GetItemsForMediaFeed(int64_t feed_id,
GetItemsForMediaFeedCallback callback) override;
+ void FetchMediaFeed(int64_t feed_id,
+ FetchMediaFeedCallback callback) override;
+ void GetDebugInformation(GetDebugInformationCallback callback) override;
+ void SetSafeSearchEnabledPref(
+ bool value,
+ SetSafeSearchEnabledPrefCallback callback) override;
private:
media_history::MediaHistoryKeyedService* GetMediaHistoryService();
+ media_feeds::MediaFeedsService* GetMediaFeedsService();
+
+ Profile* GetProfile();
+
mojo::ReceiverSet<media_feeds::mojom::MediaFeedsStore> receiver_;
WEB_UI_CONTROLLER_TYPE_DECL();
diff --git a/chromium/chrome/browser/ui/webui/memory_internals_ui.cc b/chromium/chrome/browser/ui/webui/memory_internals_ui.cc
index ab68e4f3788..a8a4beaa73a 100644
--- a/chromium/chrome/browser/ui/webui/memory_internals_ui.cc
+++ b/chromium/chrome/browser/ui/webui/memory_internals_ui.cc
@@ -26,7 +26,7 @@
#include "chrome/common/chrome_switches.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/dev_ui_browser_resources.h"
-#include "components/heap_profiling/supervisor.h"
+#include "components/heap_profiling/multi_process/supervisor.h"
#include "components/services/heap_profiling/public/cpp/settings.h"
#include "content/public/browser/browser_child_process_host_iterator.h"
#include "content/public/browser/browser_task_traits.h"
@@ -149,9 +149,12 @@ class MemoryInternalsDOMHandler : public content::WebUIMessageHandler,
// Hops to the IO thread to enumerate child processes, and back to the UI
// thread to fill in the renderer processes.
static void GetChildProcessesOnIOThread(
- base::WeakPtr<MemoryInternalsDOMHandler> dom_handler);
- void GetProfiledPids(std::vector<base::Value> children);
- void ReturnProcessListOnUIThread(std::vector<base::Value> children,
+ base::WeakPtr<MemoryInternalsDOMHandler> dom_handler,
+ const std::string& callback_id);
+ void GetProfiledPids(const std::string& callback_id,
+ std::vector<base::Value> children);
+ void ReturnProcessListOnUIThread(const std::string& callback_id,
+ std::vector<base::Value> children,
std::vector<base::ProcessId> profiled_pids);
// SelectFileDialog::Listener implementation:
@@ -201,22 +204,26 @@ void MemoryInternalsDOMHandler::RegisterMessages() {
void MemoryInternalsDOMHandler::HandleRequestProcessList(
const base::ListValue* args) {
+ AllowJavascript();
+ std::string callback_id = args->GetList()[0].GetString();
+
// This is called on the UI thread, the child process iterator must run on
// the IO thread, while the render process iterator must run on the UI thread.
base::PostTask(
FROM_HERE, {content::BrowserThread::IO},
base::BindOnce(&MemoryInternalsDOMHandler::GetChildProcessesOnIOThread,
- weak_factory_.GetWeakPtr()));
+ weak_factory_.GetWeakPtr(), std::move(callback_id)));
}
void MemoryInternalsDOMHandler::HandleSaveDump(const base::ListValue* args) {
base::FilePath default_file = base::FilePath().AppendASCII(
base::StringPrintf("trace_with_heap_dump.json.gz"));
+ AllowJavascript();
+
#if defined(OS_ANDROID)
base::Value result("Saving...");
- AllowJavascript();
- CallJavascriptFunction("setSaveDumpMessage", result);
+ FireWebUIListener("save-dump-progress", result);
// On Android write to the user data dir.
// TODO(bug 757115) Does it make sense to show the Android file picker here
@@ -273,7 +280,8 @@ void MemoryInternalsDOMHandler::HandleStartProfiling(
}
void MemoryInternalsDOMHandler::GetChildProcessesOnIOThread(
- base::WeakPtr<MemoryInternalsDOMHandler> dom_handler) {
+ base::WeakPtr<MemoryInternalsDOMHandler> dom_handler,
+ const std::string& callback_id) {
std::vector<base::Value> result;
// The only non-renderer child processes that currently support out-of-process
@@ -291,10 +299,11 @@ void MemoryInternalsDOMHandler::GetChildProcessesOnIOThread(
base::PostTask(FROM_HERE, {content::BrowserThread::UI},
base::BindOnce(&MemoryInternalsDOMHandler::GetProfiledPids,
- dom_handler, std::move(result)));
+ dom_handler, callback_id, std::move(result)));
}
void MemoryInternalsDOMHandler::GetProfiledPids(
+ const std::string& callback_id,
std::vector<base::Value> children) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
heap_profiling::Supervisor* supervisor =
@@ -305,17 +314,18 @@ void MemoryInternalsDOMHandler::GetProfiledPids(
base::PostTask(
FROM_HERE, {content::BrowserThread::UI},
base::BindOnce(&MemoryInternalsDOMHandler::ReturnProcessListOnUIThread,
- weak_factory_.GetWeakPtr(), std::move(children),
- std::vector<base::ProcessId>()));
+ weak_factory_.GetWeakPtr(), callback_id,
+ std::move(children), std::vector<base::ProcessId>()));
return;
}
- supervisor->GetProfiledPids(
- base::BindOnce(&MemoryInternalsDOMHandler::ReturnProcessListOnUIThread,
- weak_factory_.GetWeakPtr(), std::move(children)));
+ supervisor->GetProfiledPids(base::BindOnce(
+ &MemoryInternalsDOMHandler::ReturnProcessListOnUIThread,
+ weak_factory_.GetWeakPtr(), callback_id, std::move(children)));
}
void MemoryInternalsDOMHandler::ReturnProcessListOnUIThread(
+ const std::string& callback_id,
std::vector<base::Value> children,
std::vector<base::ProcessId> profiled_pids) {
// This function will be called with the child processes that are not
@@ -364,16 +374,14 @@ void MemoryInternalsDOMHandler::ReturnProcessListOnUIThread(
result.SetKey("message", base::Value(GetMessageString()));
result.SetKey("processes", base::Value(std::move(process_list)));
- AllowJavascript();
- CallJavascriptFunction("returnProcessList", result);
+ ResolveJavascriptCallback(base::Value(callback_id), result);
}
void MemoryInternalsDOMHandler::FileSelected(const base::FilePath& path,
int index,
void* params) {
base::Value result("Saving...");
- AllowJavascript();
- CallJavascriptFunction("setSaveDumpMessage", result);
+ FireWebUIListener("save-dump-progress", result);
ProfilingProcessHost::GetInstance()->SaveTraceWithHeapDumpToFile(
path,
@@ -389,8 +397,7 @@ void MemoryInternalsDOMHandler::FileSelectionCanceled(void* params) {
void MemoryInternalsDOMHandler::SaveTraceFinished(bool success) {
base::Value result(success ? "Save successful." : "Save failure.");
- AllowJavascript();
- CallJavascriptFunction("setSaveDumpMessage", result);
+ FireWebUIListener("save-dump-progress", result);
}
} // namespace
diff --git a/chromium/chrome/browser/ui/webui/metrics_handler.cc b/chromium/chrome/browser/ui/webui/metrics_handler.cc
index 69117325518..4da57272a30 100644
--- a/chromium/chrome/browser/ui/webui/metrics_handler.cc
+++ b/chromium/chrome/browser/ui/webui/metrics_handler.cc
@@ -6,9 +6,9 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
-#include "base/logging.h"
#include "base/metrics/histogram_macros.h"
#include "base/metrics/user_metrics.h"
+#include "base/notreached.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "build/build_config.h"
diff --git a/chromium/chrome/browser/ui/webui/nacl_ui.cc b/chromium/chrome/browser/ui/webui/nacl_ui.cc
index c911931ff2b..c3f6b40f6eb 100644
--- a/chromium/chrome/browser/ui/webui/nacl_ui.cc
+++ b/chromium/chrome/browser/ui/webui/nacl_ui.cc
@@ -141,7 +141,7 @@ NaClDomHandler::NaClDomHandler()
: has_plugin_info_(false),
pnacl_path_validated_(false),
pnacl_path_exists_(false) {
- PluginService::GetInstance()->GetPlugins(base::Bind(
+ PluginService::GetInstance()->GetPlugins(base::BindOnce(
&NaClDomHandler::OnGotPlugins, weak_ptr_factory_.GetWeakPtr()));
}
diff --git a/chromium/chrome/browser/ui/webui/net_export_ui.cc b/chromium/chrome/browser/ui/webui/net_export_ui.cc
index 93bfc84f49a..f27414c4189 100644
--- a/chromium/chrome/browser/ui/webui/net_export_ui.cc
+++ b/chromium/chrome/browser/ui/webui/net_export_ui.cc
@@ -263,13 +263,13 @@ void NetExportMessageHandler::OnStopNetLog(const base::ListValue* list) {
void NetExportMessageHandler::OnSendNetLog(const base::ListValue* list) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
file_writer_->GetFilePathToCompletedLog(
- base::Bind(&NetExportMessageHandler::SendEmail));
+ base::BindOnce(&NetExportMessageHandler::SendEmail));
}
void NetExportMessageHandler::OnShowFile(const base::ListValue* list) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
file_writer_->GetFilePathToCompletedLog(
- base::Bind(&NetExportMessageHandler::ShowFileInShell, AsWeakPtr()));
+ base::BindOnce(&NetExportMessageHandler::ShowFileInShell, AsWeakPtr()));
}
void NetExportMessageHandler::FileSelected(const base::FilePath& path,
diff --git a/chromium/chrome/browser/ui/webui/net_internals/net_internals_ui.cc b/chromium/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
index 540abb1bce3..434c438bb2b 100644
--- a/chromium/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
+++ b/chromium/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
@@ -44,6 +44,7 @@
#include "chrome/browser/chromeos/file_manager/filesystem_api_util.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/chromeos/system_logs/debug_log_writer.h"
+#include "chrome/browser/chromeos/system_logs/system_logs_writer.h"
#include "chrome/browser/net/nss_context.h"
#include "chrome/common/logging_chrome.h"
#include "chromeos/dbus/dbus_thread_manager.h"
@@ -72,6 +73,28 @@ content::WebUIDataSource* CreateNetInternalsHTMLSource() {
void IgnoreBoolCallback(bool result) {}
+#if defined(OS_CHROMEOS)
+base::FilePath GetDownloadsDirectory(content::WebUI* web_ui) {
+ Profile* profile = Profile::FromWebUI(web_ui);
+ const DownloadPrefs* const prefs = DownloadPrefs::FromBrowserContext(profile);
+ base::FilePath path = prefs->DownloadPath();
+ if (file_manager::util::IsUnderNonNativeLocalPath(profile, path))
+ path = prefs->GetDefaultDownloadDirectoryForProfile();
+ return path;
+}
+
+std::string GetJsonPolicies(content::WebUI* web_ui) {
+ auto client = std::make_unique<policy::ChromePolicyConversionsClient>(
+ web_ui->GetWebContents()->GetBrowserContext());
+ return policy::DictionaryPolicyConversions(std::move(client)).ToJSON();
+}
+
+void WriteTimestampedFile(base::FilePath file_path, std::string contents) {
+ file_path = logging::GenerateTimestampedName(file_path, base::Time::Now());
+ base::WriteFile(file_path, contents.data(), contents.size());
+}
+#endif
+
// This class receives javascript messages from the renderer.
// Note that the WebUI infrastructure runs on the UI thread, therefore all of
// this class's methods are expected to run on the UI thread.
@@ -125,10 +148,10 @@ class NetInternalsMessageHandler
void OnCloseIdleSockets(const base::ListValue* list);
void OnFlushSocketPools(const base::ListValue* list);
#if defined(OS_CHROMEOS)
- void OnDumpPolicyLogsCompleted(const base::FilePath& path,
- bool should_compress,
- bool combined,
- const char* received_event);
+ void OnWritePolicyLogsCompleted(const base::FilePath& path,
+ bool should_compress,
+ bool combined,
+ const char* received_event);
void OnImportONCFile(const base::ListValue* list);
void OnStoreDebugLogs(bool combined,
const char* received_event,
@@ -136,6 +159,11 @@ class NetInternalsMessageHandler
void OnStoreDebugLogsCompleted(const char* received_event,
const base::FilePath& log_path,
bool succeeded);
+ void OnStoreFeedbackSystemLogs(const char* received_event,
+ const base::ListValue* list);
+ void OnStoreFeedbackSystemLogsCompleted(
+ const char* received_event,
+ base::Optional<base::FilePath> system_logs_path);
void OnSetNetworkDebugMode(const base::ListValue* list);
void OnSetNetworkDebugModeCompleted(const std::string& subsystem,
bool succeeded);
@@ -211,6 +239,11 @@ void NetInternalsMessageHandler::RegisterMessages() {
base::Unretained(this), true /* combined */,
"receivedStoreCombinedDebugLogs"));
web_ui()->RegisterMessageCallback(
+ "storeFeedbackSystemLogs",
+ base::BindRepeating(
+ &NetInternalsMessageHandler::OnStoreFeedbackSystemLogs,
+ base::Unretained(this), "receivedStoreFeedbackSystemLogs"));
+ web_ui()->RegisterMessageCallback(
"setNetworkDebugMode",
base::BindRepeating(&NetInternalsMessageHandler::OnSetNetworkDebugMode,
base::Unretained(this)));
@@ -392,8 +425,8 @@ void NetInternalsMessageHandler::ImportONCFileToNSSDB(
error += "Some certificates couldn't be parsed. ";
cert_importer.ImportAllCertificatesUserInitiated(
certs->server_or_authority_certificates(), certs->client_certificates(),
- base::Bind(&NetInternalsMessageHandler::OnCertificatesImported,
- AsWeakPtr(), error /* previous_error */));
+ base::BindOnce(&NetInternalsMessageHandler::OnCertificatesImported,
+ AsWeakPtr(), error /* previous_error */));
}
void NetInternalsMessageHandler::OnCertificatesImported(
@@ -422,38 +455,27 @@ void NetInternalsMessageHandler::OnImportONCFile(
onc_blob, passcode));
}
-void DumpPolicyLogs(base::FilePath file_path, std::string json_policies) {
- file_path = logging::GenerateTimestampedName(file_path, base::Time::Now());
- base::WriteFile(file_path, json_policies.data(), json_policies.size());
-}
-
void NetInternalsMessageHandler::OnStoreDebugLogs(bool combined,
const char* received_event,
const base::ListValue* list) {
DCHECK(list);
SendJavascriptCommand(received_event, base::Value("Creating log file..."));
- Profile* profile = Profile::FromWebUI(web_ui());
- const DownloadPrefs* const prefs = DownloadPrefs::FromBrowserContext(profile);
- base::FilePath path = prefs->DownloadPath();
- if (file_manager::util::IsUnderNonNativeLocalPath(profile, path))
- path = prefs->GetDefaultDownloadDirectoryForProfile();
- base::FilePath policies_path = path.Append("policies.json");
- auto client = std::make_unique<policy::ChromePolicyConversionsClient>(
- web_ui()->GetWebContents()->GetBrowserContext());
- std::string json_policies =
- policy::DictionaryPolicyConversions(std::move(client)).ToJSON();
+
+ base::FilePath path = GetDownloadsDirectory(web_ui());
+ std::string json_policies = GetJsonPolicies(web_ui());
base::ThreadPool::PostTaskAndReply(
FROM_HERE,
{base::MayBlock(), base::TaskPriority::BEST_EFFORT,
base::TaskShutdownBehavior::BLOCK_SHUTDOWN},
- base::BindOnce(DumpPolicyLogs, policies_path, json_policies),
- base::BindOnce(&NetInternalsMessageHandler::OnDumpPolicyLogsCompleted,
+ base::BindOnce(WriteTimestampedFile, path.Append("policies.json"),
+ json_policies),
+ base::BindOnce(&NetInternalsMessageHandler::OnWritePolicyLogsCompleted,
AsWeakPtr(), path, true /* should_compress */, combined,
received_event));
}
-void NetInternalsMessageHandler::OnDumpPolicyLogsCompleted(
+void NetInternalsMessageHandler::OnWritePolicyLogsCompleted(
const base::FilePath& path,
bool should_compress,
bool combined,
@@ -483,18 +505,52 @@ void NetInternalsMessageHandler::OnStoreDebugLogsCompleted(
SendJavascriptCommand(received_event, base::Value(status));
}
+void NetInternalsMessageHandler::OnStoreFeedbackSystemLogs(
+ const char* received_event,
+ const base::ListValue* list) {
+ DCHECK(list);
+ SendJavascriptCommand(received_event,
+ base::Value("Creating system logs file..."));
+
+ base::FilePath downloads_path = GetDownloadsDirectory(web_ui());
+ std::string json_policies = GetJsonPolicies(web_ui());
+
+ // Write the policies file to disk as a blocking task, then call
+ // system_logs_writer::WriteSystemLogs to asynchronously write the system
+ // logs and respond when complete.
+ base::ThreadPool::PostTaskAndReply(
+ FROM_HERE,
+ {base::MayBlock(), base::TaskPriority::BEST_EFFORT,
+ base::TaskShutdownBehavior::BLOCK_SHUTDOWN},
+ base::BindOnce(WriteTimestampedFile,
+ downloads_path.Append("policies.json"), json_policies),
+ base::BindOnce(
+ chromeos::system_logs_writer::WriteSystemLogs, downloads_path,
+ base::BindOnce(
+ &NetInternalsMessageHandler::OnStoreFeedbackSystemLogsCompleted,
+ AsWeakPtr(), received_event)));
+}
+
+void NetInternalsMessageHandler::OnStoreFeedbackSystemLogsCompleted(
+ const char* received_event,
+ base::Optional<base::FilePath> system_logs_path) {
+ std::string status = system_logs_path
+ ? "Created system_logs file: " +
+ system_logs_path->BaseName().AsUTF8Unsafe()
+ : "Failed to create system logs file.";
+ SendJavascriptCommand(received_event, base::Value(status));
+}
+
void NetInternalsMessageHandler::OnSetNetworkDebugMode(
const base::ListValue* list) {
std::string subsystem;
if (list->GetSize() != 1 || !list->GetString(0, &subsystem))
NOTREACHED();
- chromeos::DBusThreadManager::Get()->GetDebugDaemonClient()->
- SetDebugMode(
- subsystem,
- base::Bind(
- &NetInternalsMessageHandler::OnSetNetworkDebugModeCompleted,
- AsWeakPtr(),
- subsystem));
+ chromeos::DBusThreadManager::Get()->GetDebugDaemonClient()->SetDebugMode(
+ subsystem,
+ base::BindOnce(
+ &NetInternalsMessageHandler::OnSetNetworkDebugModeCompleted,
+ AsWeakPtr(), subsystem));
}
void NetInternalsMessageHandler::OnSetNetworkDebugModeCompleted(
diff --git a/chromium/chrome/browser/ui/webui/net_internals/net_internals_ui_browsertest.cc b/chromium/chrome/browser/ui/webui/net_internals/net_internals_ui_browsertest.cc
index a0e63820afe..308a8a899d6 100644
--- a/chromium/chrome/browser/ui/webui/net_internals/net_internals_ui_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/net_internals/net_internals_ui_browsertest.cc
@@ -147,6 +147,11 @@ class NetInternalsTest::MessageHandler : public content::WebUIMessageHandler {
NetInternalsTest* net_internals_test_;
+ // Single NetworkIsolationKey used for all DNS lookups, so repeated lookups
+ // use the same cache key.
+ net::NetworkIsolationKey network_isolation_key_{
+ net::NetworkIsolationKey::CreateTransient()};
+
base::WeakPtrFactory<MessageHandler> weak_factory_{this};
DISALLOW_COPY_AND_ASSIGN(MessageHandler);
@@ -230,8 +235,7 @@ void NetInternalsTest::MessageHandler::DnsLookup(
weak_factory_.GetWeakPtr()));
content::BrowserContext::GetDefaultStoragePartition(browser()->profile())
->GetNetworkContext()
- ->ResolveHost(net::HostPortPair(hostname, 80),
- net::NetworkIsolationKey::CreateTransient(),
+ ->ResolveHost(net::HostPortPair(hostname, 80), network_isolation_key_,
std::move(resolve_host_parameters), std::move(client));
}
diff --git a/chromium/chrome/browser/ui/webui/new_tab_page/BUILD.gn b/chromium/chrome/browser/ui/webui/new_tab_page/BUILD.gn
index e618c3e004d..8b08d4bec1a 100644
--- a/chromium/chrome/browser/ui/webui/new_tab_page/BUILD.gn
+++ b/chromium/chrome/browser/ui/webui/new_tab_page/BUILD.gn
@@ -8,6 +8,7 @@ mojom("mojo_bindings") {
sources = [ "new_tab_page.mojom" ]
public_deps = [
+ "//chrome/common/search:mojo_bindings",
"//mojo/public/mojom/base",
"//skia/public/mojom",
"//url/mojom:url_mojom_gurl",
diff --git a/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom b/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom
index 41bd71a8a6b..a16ed18a086 100644
--- a/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom
+++ b/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom
@@ -4,14 +4,35 @@
module new_tab_page.mojom;
+import "mojo/public/mojom/base/text_direction.mojom";
+import "mojo/public/mojom/base/time.mojom";
import "skia/public/mojom/skcolor.mojom";
import "url/mojom/url.mojom";
-import "mojo/public/mojom/base/text_direction.mojom";
+import "mojo/public/mojom/base/string16.mojom";
+import "chrome/common/search/omnibox.mojom";
+
+struct OneGoogleBarParts {
+ string bar_html;
+ string in_head_script;
+ string in_head_style;
+ string after_bar_script;
+ string end_of_body_html;
+ string end_of_body_script;
+};
struct MostVisitedTile {
string title;
mojo_base.mojom.TextDirection title_direction;
url.mojom.Url url;
+
+ // ======= METRICS =======
+ // Identifier of most visited entry source (e.g. top sites).
+ int32 source;
+ // Identifier of most visited entry title source (e.g. page's title tag).
+ int32 title_source;
+ // Time the most visited entry was generated (e.g. received by a suggestion
+ // server).
+ mojo_base.mojom.Time data_generation_time;
};
struct MostVisitedInfo {
@@ -38,9 +59,14 @@ struct BackgroundCollection {
};
// A background image in a collection.
-struct BackgroundImage {
- // Localized string of extra image info.
- string label;
+struct CollectionImage {
+ // Human readable attributions of the background image.
+ string attribution_1;
+ string attribution_2;
+ // URL associated with the background image. Used for href.
+ url.mojom.Url attribution_url;
+ // URL of image. Can point to untrusted content.
+ url.mojom.Url image_url;
// URL to a preview of the image. Can point to untrusted content.
url.mojom.Url preview_image_url;
};
@@ -79,6 +105,40 @@ union ThemeInfo {
ThirdPartyThemeInfo third_party_theme_info;
};
+// Theme settings for the NTP realbox.
+struct SearchBoxTheme {
+ skia.mojom.SkColor bg;
+ skia.mojom.SkColor icon;
+ skia.mojom.SkColor icon_selected;
+ skia.mojom.SkColor placeholder;
+ skia.mojom.SkColor results_bg;
+ skia.mojom.SkColor results_bg_hovered;
+ skia.mojom.SkColor results_bg_selected;
+ skia.mojom.SkColor results_dim;
+ skia.mojom.SkColor results_dim_selected;
+ skia.mojom.SkColor results_text;
+ skia.mojom.SkColor results_text_selected;
+ skia.mojom.SkColor results_url;
+ skia.mojom.SkColor results_url_selected;
+ skia.mojom.SkColor text;
+};
+
+// The background image URL and styling.
+struct BackgroundImage {
+ // URL to the background image. Can point to untrusted content.
+ url.mojom.Url url;
+ // URL to a higher res background image. Can point to untrusted content.
+ url.mojom.Url? url_2x;
+ // URL to a logo of the theme. Has chrome:// scheme.
+ url.mojom.Url? attribution_url;
+ // CSS styling properties set on the background image.
+ string? size;
+ string? repeat_x;
+ string? repeat_y;
+ string? position_x;
+ string? position_y;
+};
+
// A generic theme.
struct Theme {
// The theme's type (e.g. default or third-party).
@@ -86,12 +146,18 @@ struct Theme {
skia.mojom.SkColor background_color;
skia.mojom.SkColor shortcut_background_color;
skia.mojom.SkColor shortcut_text_color;
+ // True if |shortcut_background_color| is dark.
+ bool shortcut_use_white_add_icon;
+ // True if the shortcuts titles should be wrapped in a pill.
+ bool shortcut_use_title_pill;
// True if the theme is dark (e.g. NTP background color is dark).
bool is_dark;
// Color of Google logo. If not set show the logo multi-colored.
skia.mojom.SkColor? logo_color;
- // URL to the background image. Can point to untrusted content.
- url.mojom.Url? background_image_url;
+ // Selected collection for daily refresh.
+ string? daily_refresh_collection_id;
+ // The background image.
+ BackgroundImage? background_image;
// Human readable attributions of the background image.
string? background_image_attribution_1;
string? background_image_attribution_2;
@@ -102,20 +168,97 @@ struct Theme {
// type. That should be optional since only some themes require it. However,
// making this field optional crashes JS.
ThemeInfo info;
+
+ // Theme settings for the NTP realbox. Matching those of the Omnibox.
+ SearchBoxTheme search_box;
+};
+
+// Specifies look of the doodle share button.
+struct DoodleShareButton {
+ // Position in pixels relative to the doodle's upper left corner.
+ int32 x;
+ int32 y;
+ // Button background color.
+ skia.mojom.SkColor background_color;
+ // Data URL of icon shown on the button.
+ url.mojom.Url icon_url;
+};
+
+// Type of image of an image doodle. Used for metrics logging only.
+enum DoodleImageType {
+ // Animation of an animated doodle.
+ ANIMATION,
+ // Static preview image of an animated doodle.
+ CTA,
+ // Image of a static doodle.
+ STATIC,
+};
+
+// The contents of simple and animated doodles.
+struct ImageDoodleContent {
+ // Doodle image encoded as data URL.
+ url.mojom.Url image_url;
+ // URL opened in new tab when the doodle is clicked.
+ url.mojom.Url on_click_url;
+ // URL pointing to animated content (e.g. gif). Only set for animated doodles.
+ url.mojom.Url? animation_url;
+ // Specification of the share button.
+ DoodleShareButton share_button;
+ // URL displayed to users, which they can use to share the doodle.
+ url.mojom.Url share_url;
+ // URLs to be pinged when an image has been shown.
+ url.mojom.Url image_impression_log_url;
+ url.mojom.Url? animation_impression_log_url;
+};
+
+// The contents of interactive doodles.
+struct InteractiveDoodleContent {
+ // URL pointing to doodle page.
+ url.mojom.Url url;
+ // Initial width and height of the doodle iframe in pixels.
+ uint32 width;
+ uint32 height;
};
// The contents of a doodle.
union DoodleContent {
- // Doodle image encoded as data URL. Set for static and animated doodles.
- string image;
- // URL pointing to doodle page. Set for interactive doodles.
- url.mojom.Url url;
+ // Set for simple and animated doodles.
+ ImageDoodleContent image_doodle;
+ // Set for interactive doodles.
+ InteractiveDoodleContent interactive_doodle;
};
// A doodle. Retrieved from the Google doodle server.
struct Doodle {
// The doodle content.
DoodleContent content;
+ // Localized description of the doodle.
+ string description;
+};
+
+// A channel through which a doodle can be shared.
+enum DoodleShareChannel {
+ FACEBOOK,
+ TWITTER,
+ EMAIL,
+ LINK_COPY,
+};
+
+// Action the user performed while using the customize dialog. Used for metrics
+// logging only. Actions correspond to items in NTPLoggingEventType.
+enum CustomizeDialogAction {
+ CANCEL_CLICKED,
+ DONE_CLICKED,
+ OPEN_CLICKED,
+ BACKGROUNDS_BACK_CLICKED,
+ BACKGROUNDS_NO_BACKGROUND_SELECTED,
+ BACKGROUNDS_COLLECTION_OPENED,
+ BACKGROUNDS_REFRESH_TOGGLE_CLICKED,
+ BACKGROUNDS_IMAGE_SELECTED,
+ BACKGROUNDS_UPLOAD_FROM_DEVICE_CLICKED,
+ SHORTCUTS_CUSTOM_LINKS_CLICKED,
+ SHORTCUTS_MOST_VISITED_CLICKED,
+ SHORTCUTS_VISIBILITY_TOGGLE_CLICKED,
};
// Used by the WebUI page to bootstrap bidirectional communication.
@@ -136,6 +279,14 @@ interface PageHandler {
ReorderMostVisitedTile(url.mojom.Url url, uint8 new_pos);
// Replaces the custom and most-visited tiles with the default tile set.
RestoreMostVisitedDefaults();
+ // Sets the background image and notifies all NTPs of the change.
+ SetBackgroundImage(string attribution_1, string attribution_2,
+ url.mojom.Url attribution_url, url.mojom.Url image_url);
+ // Sets collection id for daily refresh. When |collection_id| is empty, the
+ // daily refresh is turned off.
+ SetDailyRefreshCollectionId(string collection_id);
+ // Clears the background and daily refresh settings.
+ SetNoBackgroundImage();
// Set the visibility and whether custom links are enabled.
SetMostVisitedSettings(bool customLinksEnabled, bool visible);
// Undoes the last action done to the tiles (add, delete, reorder, restore or
@@ -162,13 +313,88 @@ interface PageHandler {
// Returns the collections of background images.
GetBackgroundCollections() => (array<BackgroundCollection> collections);
// Returns the images of a collection identified by |collection_id|.
- GetBackgroundImages(string collection_id) => (array<BackgroundImage> images);
+ GetBackgroundImages(string collection_id) => (array<CollectionImage> images);
// Invisibly focuses the omnibox.
FocusOmnibox();
// Pastes |text| into the omnibox.
PasteIntoOmnibox(string text);
// Gets current doodle if there is one.
GetDoodle() => (Doodle? doodle);
+ // Choose custom background from local file system.
+ ChooseLocalCustomBackground() => (bool success);
+ // Get the OneGoogleBarParts to be inlined in the NTP. Forwards the query
+ // parameters to the endpoint that serves the OneGoogleBar parts with
+ // |query_params|.
+ GetOneGoogleBarParts(string query_params) => (OneGoogleBarParts? parts);
+
+ // ======= METRICS =======
+ // Logs that |tiles| were displayed / updated at |time|. The first instance of
+ // this event is used as a proxy for when the NTP has finished loading.
+ OnMostVisitedTilesRendered(array<MostVisitedTile> tiles, double time);
+ // Logs that the One Google Bar was added to the DOM / loaded in an iframe at
+ // |time|.
+ OnOneGoogleBarRendered(double time);
+ // Logs that the promo iframe was loaded at |time|.
+ OnPromoRendered(double time);
+ // Logs that |tile| at position |index| was triggered to navigate to that
+ // most visited entry.
+ OnMostVisitedTileNavigation(MostVisitedTile tile, uint32 index);
+ // Logs an action performed in the customize dialog.
+ OnCustomizeDialogAction(CustomizeDialogAction action);
+ // Logs that the |type| image of an image doodle has been clicked. If set, the
+ // |log_url| should be pinged for metrics logging.
+ OnDoodleImageClicked(DoodleImageType type, url.mojom.Url? log_url);
+ // Logs that the |type| image of an image doodle has been shown at |time|.
+ // Returns additional params, which are fetched from |image_url|, we use to
+ // perform more doodle logging later. We can't fetch the params in JS because
+ // the NTP renderer process does not have network access.
+ OnDoodleImageRendered(DoodleImageType type,
+ double time,
+ url.mojom.Url log_url)
+ => (string? image_click_params,
+ url.mojom.Url? interaction_log_url,
+ string? share_id);
+ // Logs that the doodle with |doodle_id| has been shared through |channel|.
+ // |share_id| comes from a previous call to |OnDoodleImageRendered|.
+ OnDoodleShared(DoodleShareChannel channel,
+ string doodle_id,
+ string? share_id);
+ // Logs that a link on a promo has been clicked.
+ OnPromoLinkClicked();
+
+ // ======= REALBOX =======
+ // Queries autocomplete matches from the browser.
+ QueryAutocomplete(mojo_base.mojom.String16 input,
+ bool prevent_inline_autocomplete);
+ // Cancels the current autocomplete query. Clears the result set if
+ // |clear_result| is true.
+ StopAutocomplete(bool clear_result);
+ // Handles navigation to an autocomplete match (i.e. an item in the realbox's
+ // list of matches). Note: |url| is passed solely to verify that the browser
+ // and renderer are in sync; don't trust this content or use it for anything
+ // other than verification purposes (i.e. is the URL still the same?).
+ // TODO(crbug.com/1076604): replace |url| with an unguessable token.
+ // |mouse_button| indicates which mouse button was pressed on the match. See
+ // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button
+ OpenAutocompleteMatch(uint8 line,
+ url.mojom.Url url,
+ bool are_matches_showing,
+ mojo_base.mojom.TimeDelta time_elapsed_since_last_focus,
+ uint8 mouse_button,
+ bool alt_key,
+ bool ctrl_key,
+ bool meta_key,
+ bool shift_key);
+ // Deletes the AutocompleteMatch in the current results by |line| number if
+ // it is deletable.
+ DeleteAutocompleteMatch(uint8 line);
+ // Tells the browser to allow suggestions with the given suggestion group ID
+ // to appear in the results if they currently are not allowed to or to prevent
+ // them from appearing in the results if they are currently permitted to.
+ ToggleSuggestionGroupIdVisibility(int32 suggestion_group_id);
+ // Logs the time it took in milliseconds since the first character (in a
+ // series of characters) was typed until Autocomplete results were painted.
+ LogCharTypedToRepaintLatency(mojo_base.mojom.TimeDelta latency);
};
// WebUI-side handler for requests from the browser.
@@ -182,4 +408,14 @@ interface Page {
SetFakeboxFocused(bool focused);
// If |visible| shows the fakebox.
SetFakeboxVisible(bool visible);
+
+ // ======= REALBOX =======
+ // Updates the NTP realbox with the autocomplete results.
+ AutocompleteResultChanged(search.mojom.AutocompleteResult result);
+ // Updates the NTP realbox popup with the image or favicon data URL for the
+ // given |match_index| and |url| where |url| is an AutocompleteMatch image_url
+ // or destination_url for an entity or a navigation suggestion respectively.
+ AutocompleteMatchImageAvailable(uint32 match_index,
+ url.mojom.Url url,
+ string data_url);
};
diff --git a/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc b/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
index a34ea8cc0c2..90498b1ccaa 100644
--- a/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
+++ b/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
@@ -6,27 +6,69 @@
#include "base/base64.h"
#include "base/bind.h"
+#include "base/containers/flat_map.h"
+#include "base/files/file_path.h"
#include "base/i18n/rtl.h"
+#include "base/json/json_reader.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/metrics/histogram_macros.h"
+#include "base/metrics/user_metrics.h"
+#include "base/metrics/user_metrics_action.h"
+#include "base/strings/strcat.h"
+#include "base/strings/string_piece.h"
#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/autocomplete/chrome_autocomplete_provider_client.h"
+#include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h"
+#include "chrome/browser/bitmap_fetcher/bitmap_fetcher_service_factory.h"
+#include "chrome/browser/bookmarks/bookmark_model_factory.h"
+#include "chrome/browser/favicon/favicon_service_factory.h"
+#include "chrome/browser/history/history_service_factory.h"
+#include "chrome/browser/predictors/autocomplete_action_predictor.h"
+#include "chrome/browser/predictors/autocomplete_action_predictor_factory.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_metrics.h"
#include "chrome/browser/search/background/ntp_background_service.h"
#include "chrome/browser/search/background/ntp_background_service_factory.h"
#include "chrome/browser/search/chrome_colors/chrome_colors_factory.h"
#include "chrome/browser/search/chrome_colors/chrome_colors_service.h"
#include "chrome/browser/search/instant_service.h"
#include "chrome/browser/search/instant_service_factory.h"
+#include "chrome/browser/search/one_google_bar/one_google_bar_service_factory.h"
+#include "chrome/browser/search_engines/template_url_service_factory.h"
#include "chrome/browser/search_provider_logos/logo_service_factory.h"
+#include "chrome/browser/ui/bookmarks/bookmark_stats.h"
+#include "chrome/browser/ui/chrome_select_file_policy.h"
+#include "chrome/browser/ui/search/ntp_user_data_logger.h"
+#include "chrome/browser/ui/search/omnibox_mojo_utils.h"
#include "chrome/browser/ui/search/omnibox_utils.h"
#include "chrome/common/search/generated_colors_info.h"
#include "chrome/common/search/instant_types.h"
#include "chrome/common/themes/autogenerated_theme_util.h"
+#include "components/bookmarks/browser/bookmark_model.h"
+#include "components/keyed_service/core/service_access_type.h"
+#include "components/navigation_metrics/navigation_metrics.h"
+#include "components/omnibox/browser/autocomplete_classifier.h"
+#include "components/omnibox/browser/autocomplete_input.h"
+#include "components/omnibox/browser/autocomplete_match.h"
+#include "components/omnibox/browser/autocomplete_match_type.h"
+#include "components/omnibox/browser/omnibox_controller_emitter.h"
+#include "components/omnibox/browser/omnibox_event_global_tracker.h"
+#include "components/omnibox/browser/omnibox_log.h"
+#include "components/omnibox/browser/omnibox_prefs.h"
+#include "components/search_engines/template_url_service.h"
#include "components/search_provider_logos/logo_service.h"
#include "components/search_provider_logos/switches.h"
+#include "components/sessions/content/session_tab_helper.h"
+#include "content/public/browser/storage_partition.h"
+#include "services/network/public/cpp/simple_url_loader.h"
#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/webui/web_ui_util.h"
#include "ui/gfx/color_utils.h"
namespace {
+const int64_t kMaxDownloadBytes = 1024 * 1024;
+
new_tab_page::mojom::ThemePtr MakeTheme(const NtpTheme& ntp_theme) {
auto theme = new_tab_page::mojom::Theme::New();
if (ntp_theme.using_default_theme) {
@@ -58,13 +100,89 @@ new_tab_page::mojom::ThemePtr MakeTheme(const NtpTheme& ntp_theme) {
theme->background_color = ntp_theme.background_color;
theme->shortcut_background_color = ntp_theme.shortcut_color;
theme->shortcut_text_color = ntp_theme.text_color;
+ theme->shortcut_use_white_add_icon =
+ color_utils::IsDark(ntp_theme.shortcut_color);
+ theme->shortcut_use_title_pill = false;
theme->is_dark = !color_utils::IsDark(ntp_theme.text_color);
if (ntp_theme.logo_alternate) {
theme->logo_color = ntp_theme.logo_color;
}
+ auto background_image = new_tab_page::mojom::BackgroundImage::New();
if (!ntp_theme.custom_background_url.is_empty()) {
- theme->background_image_url = ntp_theme.custom_background_url;
+ base::StringPiece url = ntp_theme.custom_background_url.spec();
+ // TODO(crbug.com/1041125): Clean up when chrome-search://local-ntp removed.
+ if (url.starts_with("chrome-search://local-ntp/")) {
+ background_image->url =
+ GURL("chrome-untrusted://new-tab-page/" +
+ url.substr(strlen("chrome-search://local-ntp/")).as_string());
+ } else {
+ background_image->url = ntp_theme.custom_background_url;
+ }
+ } else if (ntp_theme.has_theme_image) {
+ theme->shortcut_use_title_pill = true;
+ background_image->url =
+ GURL(base::StrCat({"chrome-untrusted://theme/IDR_THEME_NTP_BACKGROUND?",
+ ntp_theme.theme_id}));
+ background_image->url_2x = GURL(
+ base::StrCat({"chrome-untrusted://theme/IDR_THEME_NTP_BACKGROUND@2x?",
+ ntp_theme.theme_id}));
+ if (ntp_theme.has_attribution) {
+ background_image->attribution_url = GURL(base::StrCat(
+ {"chrome://theme/IDR_THEME_NTP_ATTRIBUTION?", ntp_theme.theme_id}));
+ }
+ background_image->size = "initial";
+ switch (ntp_theme.image_tiling) {
+ case THEME_BKGRND_IMAGE_NO_REPEAT:
+ background_image->repeat_x = "no-repeat";
+ background_image->repeat_y = "no-repeat";
+ break;
+ case THEME_BKGRND_IMAGE_REPEAT_X:
+ background_image->repeat_x = "repeat";
+ background_image->repeat_y = "no-repeat";
+ break;
+ case THEME_BKGRND_IMAGE_REPEAT_Y:
+ background_image->repeat_x = "no-repeat";
+ background_image->repeat_y = "repeat";
+ break;
+ case THEME_BKGRND_IMAGE_REPEAT:
+ background_image->repeat_x = "repeat";
+ background_image->repeat_y = "repeat";
+ break;
+ }
+ switch (ntp_theme.image_horizontal_alignment) {
+ case THEME_BKGRND_IMAGE_ALIGN_CENTER:
+ background_image->position_x = "center";
+ break;
+ case THEME_BKGRND_IMAGE_ALIGN_LEFT:
+ background_image->position_x = "left";
+ break;
+ case THEME_BKGRND_IMAGE_ALIGN_RIGHT:
+ background_image->position_x = "right";
+ break;
+ case THEME_BKGRND_IMAGE_ALIGN_TOP:
+ case THEME_BKGRND_IMAGE_ALIGN_BOTTOM:
+ // Inconsistent. Ignore.
+ break;
+ }
+ switch (ntp_theme.image_vertical_alignment) {
+ case THEME_BKGRND_IMAGE_ALIGN_CENTER:
+ background_image->position_y = "center";
+ break;
+ case THEME_BKGRND_IMAGE_ALIGN_TOP:
+ background_image->position_y = "top";
+ break;
+ case THEME_BKGRND_IMAGE_ALIGN_BOTTOM:
+ background_image->position_y = "bottom";
+ break;
+ case THEME_BKGRND_IMAGE_ALIGN_LEFT:
+ case THEME_BKGRND_IMAGE_ALIGN_RIGHT:
+ // Inconsistent. Ignore.
+ break;
+ }
+ } else {
+ background_image = nullptr;
}
+ theme->background_image = std::move(background_image);
if (!ntp_theme.custom_background_attribution_line_1.empty()) {
theme->background_image_attribution_1 =
ntp_theme.custom_background_attribution_line_1;
@@ -77,9 +195,46 @@ new_tab_page::mojom::ThemePtr MakeTheme(const NtpTheme& ntp_theme) {
theme->background_image_attribution_url =
ntp_theme.custom_background_attribution_action_url;
}
+ if (!ntp_theme.collection_id.empty()) {
+ theme->daily_refresh_collection_id = ntp_theme.collection_id;
+ }
+
+ auto search_box = new_tab_page::mojom::SearchBoxTheme::New();
+ search_box->bg = ntp_theme.search_box.bg;
+ search_box->icon = ntp_theme.search_box.icon;
+ search_box->icon_selected = ntp_theme.search_box.icon_selected;
+ search_box->placeholder = ntp_theme.search_box.placeholder;
+ search_box->results_bg = ntp_theme.search_box.results_bg;
+ search_box->results_bg_hovered = ntp_theme.search_box.results_bg_hovered;
+ search_box->results_bg_selected = ntp_theme.search_box.results_bg_selected;
+ search_box->results_dim = ntp_theme.search_box.results_dim;
+ search_box->results_dim_selected = ntp_theme.search_box.results_dim_selected;
+ search_box->results_text = ntp_theme.search_box.results_text;
+ search_box->results_text_selected =
+ ntp_theme.search_box.results_text_selected;
+ search_box->results_url = ntp_theme.search_box.results_url;
+ search_box->results_url_selected = ntp_theme.search_box.results_url_selected;
+ search_box->text = ntp_theme.search_box.text;
+ theme->search_box = std::move(search_box);
+
return theme;
}
+ntp_tiles::NTPTileImpression MakeNTPTileImpression(
+ const new_tab_page::mojom::MostVisitedTile& tile,
+ uint32_t index) {
+ return ntp_tiles::NTPTileImpression(
+ /*index=*/index,
+ /*source=*/static_cast<ntp_tiles::TileSource>(tile.source),
+ /*title_source=*/
+ static_cast<ntp_tiles::TileTitleSource>(tile.title_source),
+ /*visual_type=*/
+ ntp_tiles::TileVisualType::ICON_REAL /* unused on desktop */,
+ /*icon_type=*/favicon_base::IconType::kInvalid /* unused on desktop */,
+ /*data_generation_time=*/tile.data_generation_time,
+ /*url_for_rappor=*/GURL() /* unused */);
+}
+
} // namespace
NewTabPageHandler::NewTabPageHandler(
@@ -87,25 +242,45 @@ NewTabPageHandler::NewTabPageHandler(
pending_page_handler,
mojo::PendingRemote<new_tab_page::mojom::Page> pending_page,
Profile* profile,
- content::WebContents* web_contents)
+ content::WebContents* web_contents,
+ const base::Time& ntp_navigation_start_time)
: chrome_colors_service_(
chrome_colors::ChromeColorsFactory::GetForProfile(profile)),
instant_service_(InstantServiceFactory::GetForProfile(profile)),
ntp_background_service_(
NtpBackgroundServiceFactory::GetForProfile(profile)),
logo_service_(LogoServiceFactory::GetForProfile(profile)),
+ one_google_bar_service_(
+ OneGoogleBarServiceFactory::GetForProfile(profile)),
+ profile_(profile),
+ favicon_cache_(FaviconServiceFactory::GetForProfile(
+ profile,
+ ServiceAccessType::EXPLICIT_ACCESS),
+ HistoryServiceFactory::GetForProfile(
+ profile,
+ ServiceAccessType::EXPLICIT_ACCESS)),
+ bitmap_fetcher_service_(
+ BitmapFetcherServiceFactory::GetForBrowserContext(profile)),
+ web_contents_(web_contents),
+ ntp_navigation_start_time_(ntp_navigation_start_time),
+ logger_(NTPUserDataLogger::GetOrCreateFromWebContents(web_contents)),
page_{std::move(pending_page)},
- receiver_{this, std::move(pending_page_handler)},
- web_contents_(web_contents) {
+ receiver_{this, std::move(pending_page_handler)} {
CHECK(instant_service_);
CHECK(ntp_background_service_);
CHECK(logo_service_);
CHECK(web_contents_);
+ CHECK(logger_);
instant_service_->AddObserver(this);
ntp_background_service_->AddObserver(this);
instant_service_->UpdateNtpTheme();
OmniboxTabHelper::CreateForWebContents(web_contents);
OmniboxTabHelper::FromWebContents(web_contents_)->AddObserver(this);
+ // |one_google_bar_service_| is null in incognito, or when the feature is
+ // disabled.
+ if (one_google_bar_service_) {
+ one_google_bar_service_observer_.Add(one_google_bar_service_);
+ }
}
NewTabPageHandler::~NewTabPageHandler() {
@@ -114,6 +289,10 @@ NewTabPageHandler::~NewTabPageHandler() {
if (auto* helper = OmniboxTabHelper::FromWebContents(web_contents_)) {
helper->RemoveObserver(this);
}
+ // Clear pending bitmap requests.
+ for (auto bitmap_request_id : bitmap_request_ids_) {
+ bitmap_fetcher_service_->CancelRequest(bitmap_request_id);
+ }
}
void NewTabPageHandler::AddMostVisitedTile(
@@ -122,11 +301,16 @@ void NewTabPageHandler::AddMostVisitedTile(
AddMostVisitedTileCallback callback) {
bool success = instant_service_->AddCustomLink(url, title);
std::move(callback).Run(success);
+ NTPUserDataLogger::GetOrCreateFromWebContents(web_contents_)
+ ->LogEvent(NTP_CUSTOMIZE_SHORTCUT_ADD, base::TimeDelta() /* unused */);
}
void NewTabPageHandler::DeleteMostVisitedTile(const GURL& url) {
if (instant_service_->IsCustomLinksEnabled()) {
instant_service_->DeleteCustomLink(url);
+ NTPUserDataLogger::GetOrCreateFromWebContents(web_contents_)
+ ->LogEvent(NTP_CUSTOMIZE_SHORTCUT_REMOVE,
+ base::TimeDelta() /* unused */);
} else {
instant_service_->DeleteMostVisitedItem(url);
last_blacklisted_ = url;
@@ -136,6 +320,9 @@ void NewTabPageHandler::DeleteMostVisitedTile(const GURL& url) {
void NewTabPageHandler::RestoreMostVisitedDefaults() {
if (instant_service_->IsCustomLinksEnabled()) {
instant_service_->ResetCustomLinks();
+ NTPUserDataLogger::GetOrCreateFromWebContents(web_contents_)
+ ->LogEvent(NTP_CUSTOMIZE_SHORTCUT_RESTORE_ALL,
+ base::TimeDelta() /* unused */);
} else {
instant_service_->UndoAllMostVisitedDeletions();
}
@@ -160,15 +347,23 @@ void NewTabPageHandler::SetMostVisitedSettings(bool custom_links_enabled,
if (old_visible != visible) {
instant_service_->ToggleShortcutsVisibility(
/* do_notify= */ !toggleCustomLinksEnabled);
+ NTPUserDataLogger::GetOrCreateFromWebContents(web_contents_)
+ ->LogEvent(NTP_CUSTOMIZE_SHORTCUT_TOGGLE_VISIBILITY,
+ base::TimeDelta() /* unused */);
}
if (toggleCustomLinksEnabled) {
instant_service_->ToggleMostVisitedOrCustomLinks();
+ NTPUserDataLogger::GetOrCreateFromWebContents(web_contents_)
+ ->LogEvent(NTP_CUSTOMIZE_SHORTCUT_TOGGLE_TYPE,
+ base::TimeDelta() /* unused */);
}
}
void NewTabPageHandler::UndoMostVisitedTileAction() {
if (instant_service_->IsCustomLinksEnabled()) {
instant_service_->UndoCustomLinkAction();
+ NTPUserDataLogger::GetOrCreateFromWebContents(web_contents_)
+ ->LogEvent(NTP_CUSTOMIZE_SHORTCUT_UNDO, base::TimeDelta() /* unused */);
} else if (last_blacklisted_.is_valid()) {
instant_service_->UndoMostVisitedDeletion(last_blacklisted_);
last_blacklisted_ = GURL();
@@ -220,7 +415,39 @@ void NewTabPageHandler::RevertThemeChanges() {
chrome_colors_service_->RevertThemeChanges();
}
+void NewTabPageHandler::SetBackgroundImage(const std::string& attribution_1,
+ const std::string& attribution_2,
+ const GURL& attribution_url,
+ const GURL& image_url) {
+ // Populating the |collection_id| turns on refresh daily which overrides the
+ // the selected image.
+ instant_service_->SetCustomBackgroundInfo(image_url, attribution_1,
+ attribution_2, attribution_url,
+ /* collection_id= */ "");
+ LogEvent(NTP_BACKGROUND_IMAGE_SET);
+}
+
+void NewTabPageHandler::SetDailyRefreshCollectionId(
+ const std::string& collection_id) {
+ // Populating the |collection_id| turns on refresh daily which overrides the
+ // the selected image.
+ instant_service_->SetCustomBackgroundInfo(
+ /* image_url */ GURL(), /* attribution_1= */ "", /* attribution_2= */ "",
+ /* attribution_url= */ GURL(), collection_id);
+ LogEvent(NTP_BACKGROUND_DAILY_REFRESH_ENABLED);
+}
+
+void NewTabPageHandler::SetNoBackgroundImage() {
+ instant_service_->SetCustomBackgroundInfo(
+ /* image_url */ GURL(), /* attribution_1= */ "", /* attribution_2= */ "",
+ /* attribution_url= */ GURL(), /* collection_id= */ "");
+ LogEvent(NTP_BACKGROUND_IMAGE_RESET);
+}
+
void NewTabPageHandler::UpdateMostVisitedInfo() {
+ // OnNewTabPageOpened refreshes the most visited entries while
+ // UpdateMostVisitedInfo triggers a call to MostVisitedInfoChanged.
+ instant_service_->OnNewTabPageOpened();
instant_service_->UpdateMostVisitedInfo();
}
@@ -232,6 +459,8 @@ void NewTabPageHandler::UpdateMostVisitedTile(
bool success = instant_service_->UpdateCustomLink(
url, new_url != url ? new_url : GURL(), new_title);
std::move(callback).Run(success);
+ NTPUserDataLogger::GetOrCreateFromWebContents(web_contents_)
+ ->LogEvent(NTP_CUSTOMIZE_SHORTCUT_UPDATE, base::TimeDelta() /* unused */);
}
void NewTabPageHandler::GetBackgroundCollections(
@@ -241,6 +470,7 @@ void NewTabPageHandler::GetBackgroundCollections(
std::vector<new_tab_page::mojom::BackgroundCollectionPtr>());
return;
}
+ background_collections_request_start_time_ = base::TimeTicks::Now();
background_collections_callback_ = std::move(callback);
ntp_background_service_->FetchCollectionInfo();
}
@@ -250,14 +480,15 @@ void NewTabPageHandler::GetBackgroundImages(
GetBackgroundImagesCallback callback) {
if (background_images_callback_) {
std::move(background_images_callback_)
- .Run(std::vector<new_tab_page::mojom::BackgroundImagePtr>());
+ .Run(std::vector<new_tab_page::mojom::CollectionImagePtr>());
}
if (!ntp_background_service_) {
std::move(callback).Run(
- std::vector<new_tab_page::mojom::BackgroundImagePtr>());
+ std::vector<new_tab_page::mojom::CollectionImagePtr>());
return;
}
images_request_collection_id_ = collection_id;
+ background_images_request_start_time_ = base::TimeTicks::Now();
background_images_callback_ = std::move(callback);
ntp_background_service_->FetchCollectionImageInfo(collection_id);
}
@@ -291,6 +522,390 @@ void NewTabPageHandler::GetDoodle(GetDoodleCallback callback) {
logo_service_->GetLogo(std::move(callbacks), /*for_webui_ntp=*/true);
}
+void NewTabPageHandler::ChooseLocalCustomBackground(
+ ChooseLocalCustomBackgroundCallback callback) {
+ select_file_dialog_ = ui::SelectFileDialog::Create(
+ this, std::make_unique<ChromeSelectFilePolicy>(web_contents_));
+ ui::SelectFileDialog::FileTypeInfo file_types;
+ file_types.allowed_paths = ui::SelectFileDialog::FileTypeInfo::NATIVE_PATH;
+ file_types.extensions.resize(1);
+ file_types.extensions[0].push_back(FILE_PATH_LITERAL("jpg"));
+ file_types.extensions[0].push_back(FILE_PATH_LITERAL("jpeg"));
+ file_types.extensions[0].push_back(FILE_PATH_LITERAL("png"));
+ file_types.extension_description_overrides.push_back(
+ l10n_util::GetStringUTF16(IDS_UPLOAD_IMAGE_FORMAT));
+ select_file_dialog_->SelectFile(
+ ui::SelectFileDialog::SELECT_OPEN_FILE, base::string16(),
+ profile_->last_selected_directory(), &file_types, 0,
+ base::FilePath::StringType(), web_contents_->GetTopLevelNativeWindow(),
+ nullptr);
+ choose_local_custom_background_callback_ = std::move(callback);
+}
+
+void NewTabPageHandler::GetOneGoogleBarParts(
+ const std::string& query_params,
+ GetOneGoogleBarPartsCallback callback) {
+ if (!one_google_bar_service_) {
+ return;
+ }
+ one_google_bar_parts_callbacks_.push_back(std::move(callback));
+ bool wait_for_refresh =
+ one_google_bar_service_->SetAdditionalQueryParams(query_params);
+ if (one_google_bar_service_->one_google_bar_data().has_value() &&
+ !wait_for_refresh) {
+ OnOneGoogleBarDataUpdated();
+ }
+ one_google_bar_load_start_time_ = base::TimeTicks::Now();
+ one_google_bar_service_->Refresh();
+}
+
+void NewTabPageHandler::OnMostVisitedTilesRendered(
+ std::vector<new_tab_page::mojom::MostVisitedTilePtr> tiles,
+ double time) {
+ for (size_t i = 0; i < tiles.size(); i++) {
+ logger_->LogMostVisitedImpression(MakeNTPTileImpression(*tiles[i], i));
+ }
+ // This call flushes all most visited impression logs to UMA histograms.
+ // Therefore, it must come last.
+ logger_->LogEvent(NTP_ALL_TILES_LOADED,
+ base::Time::FromJsTime(time) - ntp_navigation_start_time_);
+}
+
+void NewTabPageHandler::OnOneGoogleBarRendered(double time) {
+ logger_->LogEvent(NTP_ONE_GOOGLE_BAR_SHOWN,
+ base::Time::FromJsTime(time) - ntp_navigation_start_time_);
+}
+
+void NewTabPageHandler::OnPromoRendered(double time) {
+ logger_->LogEvent(NTP_MIDDLE_SLOT_PROMO_SHOWN,
+ base::Time::FromJsTime(time) - ntp_navigation_start_time_);
+}
+
+void NewTabPageHandler::OnMostVisitedTileNavigation(
+ new_tab_page::mojom::MostVisitedTilePtr tile,
+ uint32_t index) {
+ logger_->LogMostVisitedNavigation(MakeNTPTileImpression(*tile, index));
+}
+
+void NewTabPageHandler::OnCustomizeDialogAction(
+ new_tab_page::mojom::CustomizeDialogAction action) {
+ NTPLoggingEventType event;
+ switch (action) {
+ case new_tab_page::mojom::CustomizeDialogAction::CANCEL_CLICKED:
+ event = NTP_CUSTOMIZATION_MENU_CANCEL;
+ break;
+ case new_tab_page::mojom::CustomizeDialogAction::DONE_CLICKED:
+ event = NTP_CUSTOMIZATION_MENU_DONE;
+ break;
+ case new_tab_page::mojom::CustomizeDialogAction::OPEN_CLICKED:
+ event = NTP_CUSTOMIZATION_MENU_OPENED;
+ break;
+ case new_tab_page::mojom::CustomizeDialogAction::BACKGROUNDS_BACK_CLICKED:
+ event = NTP_BACKGROUND_BACK_CLICK;
+ break;
+ case new_tab_page::mojom::CustomizeDialogAction::
+ BACKGROUNDS_NO_BACKGROUND_SELECTED:
+ event = NTP_BACKGROUND_DEFAULT_SELECTED;
+ break;
+ case new_tab_page::mojom::CustomizeDialogAction::
+ BACKGROUNDS_COLLECTION_OPENED:
+ event = NTP_BACKGROUND_OPEN_COLLECTION;
+ break;
+ case new_tab_page::mojom::CustomizeDialogAction::
+ BACKGROUNDS_REFRESH_TOGGLE_CLICKED:
+ event = NTP_BACKGROUND_REFRESH_TOGGLE_CLICKED;
+ break;
+ case new_tab_page::mojom::CustomizeDialogAction::BACKGROUNDS_IMAGE_SELECTED:
+ event = NTP_BACKGROUND_SELECT_IMAGE;
+ break;
+ case new_tab_page::mojom::CustomizeDialogAction::
+ BACKGROUNDS_UPLOAD_FROM_DEVICE_CLICKED:
+ event = NTP_BACKGROUND_UPLOAD_FROM_DEVICE;
+ break;
+ case new_tab_page::mojom::CustomizeDialogAction::
+ SHORTCUTS_CUSTOM_LINKS_CLICKED:
+ event = NTP_CUSTOMIZE_SHORTCUT_CUSTOM_LINKS_CLICKED;
+ break;
+ case new_tab_page::mojom::CustomizeDialogAction::
+ SHORTCUTS_MOST_VISITED_CLICKED:
+ event = NTP_CUSTOMIZE_SHORTCUT_MOST_VISITED_CLICKED;
+ break;
+ case new_tab_page::mojom::CustomizeDialogAction::
+ SHORTCUTS_VISIBILITY_TOGGLE_CLICKED:
+ event = NTP_CUSTOMIZE_SHORTCUT_VISIBILITY_TOGGLE_CLICKED;
+ break;
+ default:
+ NOTREACHED();
+ }
+ LogEvent(event);
+}
+
+void NewTabPageHandler::OnDoodleImageClicked(
+ new_tab_page::mojom::DoodleImageType type,
+ const base::Optional<::GURL>& log_url) {
+ NTPLoggingEventType event;
+ switch (type) {
+ case new_tab_page::mojom::DoodleImageType::ANIMATION:
+ event = NTP_ANIMATED_LOGO_CLICKED;
+ break;
+ case new_tab_page::mojom::DoodleImageType::CTA:
+ event = NTP_CTA_LOGO_CLICKED;
+ break;
+ case new_tab_page::mojom::DoodleImageType::STATIC:
+ event = NTP_STATIC_LOGO_CLICKED;
+ break;
+ default:
+ NOTREACHED();
+ return;
+ }
+ LogEvent(event);
+
+ if (type == new_tab_page::mojom::DoodleImageType::CTA &&
+ log_url.has_value()) {
+ // We just ping the server to indicate a CTA image has been clicked.
+ Fetch(*log_url, base::BindOnce([](bool, std::unique_ptr<std::string>) {}));
+ }
+}
+
+void NewTabPageHandler::OnDoodleImageRendered(
+ new_tab_page::mojom::DoodleImageType type,
+ double time,
+ const GURL& log_url,
+ OnDoodleImageRenderedCallback callback) {
+ if (type == new_tab_page::mojom::DoodleImageType::CTA ||
+ type == new_tab_page::mojom::DoodleImageType::STATIC) {
+ logger_->LogEvent(
+ type == new_tab_page::mojom::DoodleImageType::CTA
+ ? NTP_CTA_LOGO_SHOWN_FROM_CACHE
+ : NTP_STATIC_LOGO_SHOWN_FROM_CACHE,
+ base::Time::FromJsTime(time) - ntp_navigation_start_time_);
+ }
+ Fetch(log_url,
+ base::BindOnce(&NewTabPageHandler::OnLogFetchResult,
+ weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
+}
+
+void NewTabPageHandler::OnDoodleShared(
+ new_tab_page::mojom::DoodleShareChannel channel,
+ const std::string& doodle_id,
+ const base::Optional<std::string>& share_id) {
+ int channel_id;
+ switch (channel) {
+ case new_tab_page::mojom::DoodleShareChannel::FACEBOOK:
+ channel_id = 2;
+ break;
+ case new_tab_page::mojom::DoodleShareChannel::TWITTER:
+ channel_id = 3;
+ break;
+ case new_tab_page::mojom::DoodleShareChannel::EMAIL:
+ channel_id = 5;
+ break;
+ case new_tab_page::mojom::DoodleShareChannel::LINK_COPY:
+ channel_id = 6;
+ break;
+ default:
+ NOTREACHED();
+ break;
+ }
+ std::string query =
+ base::StringPrintf("gen_204?atype=i&ct=doodle&ntp=2&cad=sh,%d,ct:%s",
+ channel_id, doodle_id.c_str());
+ if (share_id.has_value()) {
+ query += "&ei=" + *share_id;
+ }
+ auto url = GURL(TemplateURLServiceFactory::GetForProfile(profile_)
+ ->search_terms_data()
+ .GoogleBaseURLValue())
+ .Resolve(query);
+ // We just ping the server to indicate a doodle has been shared.
+ Fetch(url, base::BindOnce([](bool s, std::unique_ptr<std::string>) {}));
+}
+
+void NewTabPageHandler::OnPromoLinkClicked() {
+ LogEvent(NTP_MIDDLE_SLOT_PROMO_LINK_CLICKED);
+}
+
+void NewTabPageHandler::QueryAutocomplete(const base::string16& input,
+ bool prevent_inline_autocomplete) {
+ if (!autocomplete_controller_) {
+ autocomplete_controller_ = std::make_unique<AutocompleteController>(
+ std::make_unique<ChromeAutocompleteProviderClient>(profile_),
+ AutocompleteClassifier::DefaultOmniboxProviders());
+ autocomplete_controller_->AddObserver(this);
+
+ OmniboxControllerEmitter* emitter =
+ OmniboxControllerEmitter::GetForBrowserContext(profile_);
+ if (emitter)
+ autocomplete_controller_->AddObserver(emitter);
+ }
+
+ if (time_of_first_autocomplete_query_.is_null() && !input.empty())
+ time_of_first_autocomplete_query_ = base::TimeTicks::Now();
+
+ AutocompleteInput autocomplete_input(
+ input, metrics::OmniboxEventProto::NTP_REALBOX,
+ ChromeAutocompleteSchemeClassifier(profile_));
+ autocomplete_input.set_from_omnibox_focus(input.empty());
+ autocomplete_input.set_prevent_inline_autocomplete(
+ prevent_inline_autocomplete);
+
+ // We do not want keyword matches for the NTP realbox, which has no UI
+ // facilities to support them.
+ autocomplete_input.set_prefer_keyword(false);
+ autocomplete_input.set_allow_exact_keyword_match(false);
+
+ autocomplete_controller_->Start(autocomplete_input);
+}
+
+void NewTabPageHandler::StopAutocomplete(bool clear_result) {
+ if (!autocomplete_controller_)
+ return;
+
+ autocomplete_controller_->Stop(clear_result);
+
+ if (clear_result)
+ time_of_first_autocomplete_query_ = base::TimeTicks();
+}
+
+void NewTabPageHandler::OpenAutocompleteMatch(
+ uint8_t line,
+ const GURL& url,
+ bool are_matches_showing,
+ base::TimeDelta time_elapsed_since_last_focus,
+ uint8_t mouse_button,
+ bool alt_key,
+ bool ctrl_key,
+ bool meta_key,
+ bool shift_key) {
+ if (autocomplete_controller_->result().size() <= line) {
+ return;
+ }
+
+ AutocompleteMatch match(autocomplete_controller_->result().match_at(line));
+ if (match.destination_url != url) {
+ // TODO(https://crbug.com/1020025): this could be malice or staleness.
+ // Either way: don't navigate.
+ return;
+ }
+
+ // TODO(crbug.com/1041129): The following logic for recording Omnibox metrics
+ // is largely copied from SearchTabHelper::OpenAutocompleteMatch(). Make sure
+ // any changes here is reflected there until one code path is obsolete.
+
+ const auto now = base::TimeTicks::Now();
+ base::TimeDelta elapsed_time_since_first_autocomplete_query =
+ now - time_of_first_autocomplete_query_;
+ autocomplete_controller_->UpdateMatchDestinationURLWithQueryFormulationTime(
+ elapsed_time_since_first_autocomplete_query, &match);
+
+ // Note: this is always false for the realbox.
+ UMA_HISTOGRAM_BOOLEAN(
+ "Omnibox.SuggestionUsed.RichEntity",
+ match.type == AutocompleteMatchType::SEARCH_SUGGEST_ENTITY);
+
+ LOCAL_HISTOGRAM_BOOLEAN("Omnibox.EventCount", true);
+
+ UMA_HISTOGRAM_MEDIUM_TIMES("Omnibox.FocusToOpenTimeAnyPopupState3",
+ time_elapsed_since_last_focus);
+
+ if (ui::PageTransitionTypeIncludingQualifiersIs(match.transition,
+ ui::PAGE_TRANSITION_TYPED)) {
+ navigation_metrics::RecordOmniboxURLNavigation(match.destination_url);
+ }
+
+ SuggestionAnswer::LogAnswerUsed(match.answer);
+
+ TemplateURLService* template_url_service =
+ TemplateURLServiceFactory::GetForProfile(profile_);
+ if (template_url_service &&
+ template_url_service->IsSearchResultsPageFromDefaultSearchProvider(
+ match.destination_url)) {
+ // Note: will always be false for the realbox.
+ UMA_HISTOGRAM_BOOLEAN("Omnibox.Search.OffTheRecord",
+ profile_->IsOffTheRecord());
+ base::RecordAction(
+ base::UserMetricsAction("OmniboxDestinationURLIsSearchOnDSP"));
+ }
+
+ AutocompleteMatch::LogSearchEngineUsed(match, template_url_service);
+
+ auto* bookmark_model = BookmarkModelFactory::GetForBrowserContext(profile_);
+ if (bookmark_model->IsBookmarked(match.destination_url)) {
+ RecordBookmarkLaunch(BOOKMARK_LAUNCH_LOCATION_OMNIBOX,
+ ProfileMetrics::GetBrowserProfileType(profile_));
+ }
+
+ const AutocompleteInput& input = autocomplete_controller_->input();
+ WindowOpenDisposition disposition = ui::DispositionFromClick(
+ /*middle_button=*/mouse_button == 1, alt_key, ctrl_key, meta_key,
+ shift_key);
+
+ base::TimeDelta default_time_delta = base::TimeDelta::FromMilliseconds(-1);
+
+ if (time_of_first_autocomplete_query_.is_null())
+ elapsed_time_since_first_autocomplete_query = default_time_delta;
+
+ base::TimeDelta elapsed_time_since_last_change_to_default_match =
+ !autocomplete_controller_->last_time_default_match_changed().is_null()
+ ? now - autocomplete_controller_->last_time_default_match_changed()
+ : default_time_delta;
+
+ OmniboxLog log(
+ /*text=*/input.from_omnibox_focus() ? base::string16() : input.text(),
+ /*just_deleted_text=*/input.prevent_inline_autocomplete(),
+ /*input_type=*/input.type(),
+ /*in_keyword_mode=*/false,
+ /*entry_method=*/metrics::OmniboxEventProto::INVALID,
+ /*is_popup_open=*/are_matches_showing,
+ /*selected_index=*/line,
+ /*disposition=*/disposition,
+ /*is_paste_and_go=*/false,
+ /*tab_id=*/sessions::SessionTabHelper::IdForTab(web_contents_),
+ /*current_page_classification=*/metrics::OmniboxEventProto::NTP_REALBOX,
+ /*elapsed_time_since_user_first_modified_omnibox=*/
+ elapsed_time_since_first_autocomplete_query,
+ /*completed_length=*/match.allowed_to_be_default_match
+ ? match.inline_autocompletion.length()
+ : base::string16::npos,
+ /*elapsed_time_since_last_change_to_default_match=*/
+ elapsed_time_since_last_change_to_default_match,
+ /*result=*/autocomplete_controller_->result());
+ autocomplete_controller_->AddProvidersInfo(&log.providers_info);
+
+ OmniboxEventGlobalTracker::GetInstance()->OnURLOpened(&log);
+
+ predictors::AutocompleteActionPredictorFactory::GetForProfile(profile_)
+ ->OnOmniboxOpenedUrl(log);
+
+ web_contents_->OpenURL(
+ content::OpenURLParams(match.destination_url, content::Referrer(),
+ disposition, ui::PAGE_TRANSITION_LINK, false));
+}
+
+void NewTabPageHandler::DeleteAutocompleteMatch(uint8_t line) {
+ if (autocomplete_controller_->result().size() <= line ||
+ !autocomplete_controller_->result().match_at(line).SupportsDeletion()) {
+ return;
+ }
+
+ const auto& match = autocomplete_controller_->result().match_at(line);
+ if (match.SupportsDeletion()) {
+ autocomplete_controller_->Stop(false);
+ autocomplete_controller_->DeleteMatch(match);
+ }
+}
+
+void NewTabPageHandler::ToggleSuggestionGroupIdVisibility(
+ int32_t suggestion_group_id) {
+ omnibox::ToggleSuggestionGroupIdVisibility(profile_->GetPrefs(),
+ suggestion_group_id);
+}
+
+void NewTabPageHandler::LogCharTypedToRepaintLatency(base::TimeDelta latency) {
+ UMA_HISTOGRAM_TIMES("NewTabPage.Realbox.CharTypedToRepaintLatency.ToPaint",
+ latency);
+}
+
void NewTabPageHandler::NtpThemeChanged(const NtpTheme& ntp_theme) {
page_->SetTheme(MakeTheme(ntp_theme));
}
@@ -310,6 +925,9 @@ void NewTabPageHandler::MostVisitedInfoChanged(
base::i18n::GetFirstStrongCharacterDirection(tile.title);
}
value->url = tile.url;
+ value->source = static_cast<int32_t>(tile.source);
+ value->title_source = static_cast<int32_t>(tile.title_source);
+ value->data_generation_time = tile.data_generation_time;
list.push_back(std::move(value));
}
result->custom_links_enabled = !info.use_most_visited;
@@ -323,6 +941,21 @@ void NewTabPageHandler::OnCollectionInfoAvailable() {
return;
}
+ base::TimeDelta duration =
+ base::TimeTicks::Now() - background_collections_request_start_time_;
+ UMA_HISTOGRAM_MEDIUM_TIMES(
+ "NewTabPage.BackgroundService.Collections.RequestLatency", duration);
+ // Any response where no collections are returned is considered a failure.
+ if (ntp_background_service_->collection_info().empty()) {
+ UMA_HISTOGRAM_MEDIUM_TIMES(
+ "NewTabPage.BackgroundService.Collections.RequestLatency.Failure",
+ duration);
+ } else {
+ UMA_HISTOGRAM_MEDIUM_TIMES(
+ "NewTabPage.BackgroundService.Collections.RequestLatency.Success",
+ duration);
+ }
+
std::vector<new_tab_page::mojom::BackgroundCollectionPtr> collections;
for (const auto& info : ntp_background_service_->collection_info()) {
auto collection = new_tab_page::mojom::BackgroundCollection::New();
@@ -338,7 +971,21 @@ void NewTabPageHandler::OnCollectionImagesAvailable() {
if (!background_images_callback_) {
return;
}
- std::vector<new_tab_page::mojom::BackgroundImagePtr> images;
+
+ base::TimeDelta duration =
+ base::TimeTicks::Now() - background_images_request_start_time_;
+ UMA_HISTOGRAM_MEDIUM_TIMES(
+ "NewTabPage.BackgroundService.Images.RequestLatency", duration);
+ // Any response where no images are returned is considered a failure.
+ if (ntp_background_service_->collection_images().empty()) {
+ UMA_HISTOGRAM_MEDIUM_TIMES(
+ "NewTabPage.BackgroundService.Images.RequestLatency.Failure", duration);
+ } else {
+ UMA_HISTOGRAM_MEDIUM_TIMES(
+ "NewTabPage.BackgroundService.Images.RequestLatency.Success", duration);
+ }
+
+ std::vector<new_tab_page::mojom::CollectionImagePtr> images;
if (ntp_background_service_->collection_images().empty()) {
std::move(background_images_callback_).Run(std::move(images));
}
@@ -346,9 +993,13 @@ void NewTabPageHandler::OnCollectionImagesAvailable() {
ntp_background_service_->collection_images()[0].collection_id;
for (const auto& info : ntp_background_service_->collection_images()) {
DCHECK(info.collection_id == collection_id);
- auto image = new_tab_page::mojom::BackgroundImage::New();
- image->preview_image_url = GURL(info.thumbnail_image_url);
- image->label = !info.attribution.empty() ? info.attribution[0] : "";
+ auto image = new_tab_page::mojom::CollectionImage::New();
+ image->attribution_1 = !info.attribution.empty() ? info.attribution[0] : "";
+ image->attribution_2 =
+ info.attribution.size() > 1 ? info.attribution[1] : "";
+ image->attribution_url = info.attribution_action_url;
+ image->image_url = info.image_url;
+ image->preview_image_url = info.thumbnail_image_url;
images.push_back(std::move(image));
}
std::move(background_images_callback_).Run(std::move(images));
@@ -376,6 +1027,108 @@ void NewTabPageHandler::OnOmniboxFocusChanged(OmniboxFocusState state,
}
}
+void NewTabPageHandler::OnOneGoogleBarDataUpdated() {
+ base::Optional<OneGoogleBarData> data =
+ one_google_bar_service_->one_google_bar_data();
+
+ if (one_google_bar_load_start_time_.has_value()) {
+ NTPUserDataLogger::LogOneGoogleBarFetchDuration(
+ /*success=*/data.has_value(),
+ /*duration=*/base::TimeTicks::Now() - *one_google_bar_load_start_time_);
+ one_google_bar_load_start_time_ = base::nullopt;
+ }
+
+ for (auto& callback : one_google_bar_parts_callbacks_) {
+ if (data.has_value()) {
+ auto parts = new_tab_page::mojom::OneGoogleBarParts::New();
+ parts->bar_html = data->bar_html;
+ parts->in_head_script = data->in_head_script;
+ parts->in_head_style = data->in_head_style;
+ parts->after_bar_script = data->after_bar_script;
+ parts->end_of_body_html = data->end_of_body_html;
+ parts->end_of_body_script = data->end_of_body_script;
+ std::move(callback).Run(std::move(parts));
+ } else {
+ std::move(callback).Run(nullptr);
+ }
+ }
+ one_google_bar_parts_callbacks_.clear();
+}
+
+void NewTabPageHandler::OnOneGoogleBarServiceShuttingDown() {
+ one_google_bar_service_observer_.RemoveAll();
+ one_google_bar_service_ = nullptr;
+}
+
+void NewTabPageHandler::FileSelected(const base::FilePath& path,
+ int index,
+ void* params) {
+ if (instant_service_) {
+ profile_->set_last_selected_directory(path.DirName());
+ instant_service_->SelectLocalBackgroundImage(path);
+ }
+
+ select_file_dialog_ = nullptr;
+ // File selection can happen at any time after NTP load, and is not logged
+ // with the event.
+ LogEvent(NTP_CUSTOMIZE_LOCAL_IMAGE_DONE);
+ LogEvent(NTP_BACKGROUND_UPLOAD_DONE);
+
+ std::move(choose_local_custom_background_callback_).Run(true);
+}
+
+void NewTabPageHandler::FileSelectionCanceled(void* params) {
+ select_file_dialog_ = nullptr;
+ // File selection can happen at any time after NTP load, and is not logged
+ // with the event.
+ LogEvent(NTP_CUSTOMIZE_LOCAL_IMAGE_CANCEL);
+ LogEvent(NTP_BACKGROUND_UPLOAD_CANCEL);
+ std::move(choose_local_custom_background_callback_).Run(false);
+}
+
+void NewTabPageHandler::OnResultChanged(AutocompleteController* controller,
+ bool default_match_changed) {
+ DCHECK(controller == autocomplete_controller_.get());
+
+ page_->AutocompleteResultChanged(omnibox::CreateAutocompleteResult(
+ autocomplete_controller_->input().text(),
+ autocomplete_controller_->result(), profile_->GetPrefs()));
+
+ // Clear pending bitmap requests before requesting new ones.
+ for (auto bitmap_request_id : bitmap_request_ids_) {
+ bitmap_fetcher_service_->CancelRequest(bitmap_request_id);
+ }
+ bitmap_request_ids_.clear();
+
+ int match_index = -1;
+ for (const auto& match : autocomplete_controller_->result()) {
+ match_index++;
+
+ // Request bitmaps for matche images.
+ if (!match.image_url.is_empty()) {
+ bitmap_request_ids_.push_back(bitmap_fetcher_service_->RequestImage(
+ match.image_url,
+ base::BindOnce(&NewTabPageHandler::OnRealboxBitmapFetched,
+ weak_ptr_factory_.GetWeakPtr(), match_index,
+ match.image_url)));
+ }
+
+ // Request favicons for navigational matches.
+ // TODO(crbug.com/1075848): Investigate using chrome://favicon2.
+ if (!AutocompleteMatch::IsSearchType(match.type) &&
+ match.type != AutocompleteMatchType::DOCUMENT_SUGGESTION) {
+ gfx::Image favicon = favicon_cache_.GetLargestFaviconForPageUrl(
+ match.destination_url,
+ base::BindOnce(&NewTabPageHandler::OnRealboxFaviconFetched,
+ weak_ptr_factory_.GetWeakPtr(), match_index,
+ match.destination_url));
+ if (!favicon.IsEmpty()) {
+ OnRealboxFaviconFetched(match_index, match.destination_url, favicon);
+ }
+ }
+ }
+}
+
void NewTabPageHandler::OnLogoAvailable(
GetDoodleCallback callback,
search_provider_logos::LogoCallbackReason type,
@@ -385,27 +1138,175 @@ void NewTabPageHandler::OnLogoAvailable(
return;
}
auto doodle = new_tab_page::mojom::Doodle::New();
- switch (logo->metadata.type) {
- case search_provider_logos::LogoType::SIMPLE:
- case search_provider_logos::LogoType::ANIMATED: {
- if (!logo->encoded_image) {
- std::move(callback).Run(nullptr);
- return;
- }
- std::string base64;
- base::Base64Encode(logo->encoded_image->data(), &base64);
- auto data_url =
- base::StringPrintf("data:%s;base64,%s",
- logo->metadata.mime_type.c_str(), base64.c_str());
- doodle->content = new_tab_page::mojom::DoodleContent::NewImage(data_url);
- } break;
- case search_provider_logos::LogoType::INTERACTIVE:
- doodle->content = new_tab_page::mojom::DoodleContent::NewUrl(
- logo->metadata.full_page_url);
- break;
- default:
+ if (logo->metadata.type == search_provider_logos::LogoType::SIMPLE ||
+ logo->metadata.type == search_provider_logos::LogoType::ANIMATED) {
+ if (!logo->encoded_image) {
+ std::move(callback).Run(nullptr);
+ return;
+ }
+ SkColor doodle_share_button_background_color;
+ if (logo->metadata.share_button_bg.size() != 7 ||
+ logo->metadata.share_button_bg[0] != '#' ||
+ !base::HexStringToUInt(logo->metadata.share_button_bg.substr(1),
+ &doodle_share_button_background_color)) {
std::move(callback).Run(nullptr);
return;
+ }
+ auto image_doodle_content = new_tab_page::mojom::ImageDoodleContent::New();
+ std::string base64;
+ base::Base64Encode(logo->encoded_image->data(), &base64);
+ image_doodle_content->image_url = GURL(base::StringPrintf(
+ "data:%s;base64,%s", logo->metadata.mime_type.c_str(), base64.c_str()));
+ image_doodle_content->on_click_url = logo->metadata.on_click_url;
+ if (logo->metadata.type == search_provider_logos::LogoType::ANIMATED) {
+ image_doodle_content->animation_url = logo->metadata.animated_url;
+ }
+ image_doodle_content->share_button =
+ new_tab_page::mojom::DoodleShareButton::New();
+ image_doodle_content->share_button->x = logo->metadata.share_button_x;
+ image_doodle_content->share_button->y = logo->metadata.share_button_y;
+ image_doodle_content->share_button->icon_url = GURL(base::StringPrintf(
+ "data:image/png;base64,%s", logo->metadata.share_button_icon.c_str()));
+ image_doodle_content->share_button->background_color =
+ SkColorSetA(doodle_share_button_background_color, 255);
+ image_doodle_content->share_url = logo->metadata.short_link;
+ if (logo->metadata.type == search_provider_logos::LogoType::ANIMATED) {
+ image_doodle_content->image_impression_log_url =
+ logo->metadata.cta_log_url;
+ image_doodle_content->animation_impression_log_url =
+ logo->metadata.log_url;
+ } else {
+ image_doodle_content->image_impression_log_url = logo->metadata.log_url;
+ }
+ doodle->content = new_tab_page::mojom::DoodleContent::NewImageDoodle(
+ std::move(image_doodle_content));
+ } else if (logo->metadata.type ==
+ search_provider_logos::LogoType::INTERACTIVE) {
+ auto interactive_doodle_content =
+ new_tab_page::mojom::InteractiveDoodleContent::New();
+ interactive_doodle_content->url = logo->metadata.full_page_url;
+ interactive_doodle_content->width = logo->metadata.iframe_width_px;
+ interactive_doodle_content->height = logo->metadata.iframe_height_px;
+ doodle->content = new_tab_page::mojom::DoodleContent::NewInteractiveDoodle(
+ std::move(interactive_doodle_content));
+ } else {
+ std::move(callback).Run(nullptr);
+ return;
}
+ doodle->description = logo->metadata.alt_text;
std::move(callback).Run(std::move(doodle));
}
+
+void NewTabPageHandler::OnRealboxBitmapFetched(int match_index,
+ const GURL& image_url,
+ const SkBitmap& bitmap) {
+ auto data = gfx::Image::CreateFrom1xBitmap(bitmap).As1xPNGBytes();
+ std::string data_url =
+ webui::GetPngDataUrl(data->front_as<unsigned char>(), data->size());
+
+ page_->AutocompleteMatchImageAvailable(match_index, image_url, data_url);
+}
+
+void NewTabPageHandler::OnRealboxFaviconFetched(int match_index,
+ const GURL& page_url,
+ const gfx::Image& favicon) {
+ DCHECK(!favicon.IsEmpty());
+ auto data = favicon.As1xPNGBytes();
+ std::string data_url =
+ webui::GetPngDataUrl(data->front_as<unsigned char>(), data->size());
+
+ page_->AutocompleteMatchImageAvailable(match_index, page_url, data_url);
+}
+
+void NewTabPageHandler::LogEvent(NTPLoggingEventType event) {
+ logger_->LogEvent(event, base::TimeDelta() /* unused */);
+}
+
+void NewTabPageHandler::Fetch(const GURL& url,
+ OnFetchResultCallback on_result) {
+ auto traffic_annotation =
+ net::DefineNetworkTrafficAnnotation("new_tab_page_handler", R"(
+ semantics {
+ sender: "New Tab Page"
+ description: "Logs impression and interaction with the doodle."
+ trigger:
+ "Showing or clicking on the doodle on the New Tab Page. Desktop "
+ "only."
+ data:
+ "String identifiying todays doodle and token identifying a single "
+ "doodle interaction session. Data does not contain PII."
+ destination: GOOGLE_OWNED_SERVICE
+ }
+ policy {
+ cookies_allowed: NO
+ setting:
+ "Users can control this feature via selecting a non-Google default "
+ "search engine in Chrome settings under 'Search Engine'."
+ chrome_policy {
+ DefaultSearchProviderEnabled {
+ policy_options {mode: MANDATORY}
+ DefaultSearchProviderEnabled: false
+ }
+ }
+ })");
+ auto url_loader_factory =
+ content::BrowserContext::GetDefaultStoragePartition(profile_)
+ ->GetURLLoaderFactoryForBrowserProcess();
+ auto request = std::make_unique<network::ResourceRequest>();
+ request->url = url;
+ auto loader =
+ network::SimpleURLLoader::Create(std::move(request), traffic_annotation);
+ loader->DownloadToString(url_loader_factory.get(),
+ base::BindOnce(&NewTabPageHandler::OnFetchResult,
+ weak_ptr_factory_.GetWeakPtr(),
+ loader.get(), std::move(on_result)),
+ kMaxDownloadBytes);
+ loader_map_.insert({loader.get(), std::move(loader)});
+}
+
+void NewTabPageHandler::OnFetchResult(const network::SimpleURLLoader* loader,
+ OnFetchResultCallback on_result,
+ std::unique_ptr<std::string> body) {
+ bool success = loader->NetError() == net::OK && loader->ResponseInfo() &&
+ loader->ResponseInfo()->headers &&
+ loader->ResponseInfo()->headers->response_code() >= 200 &&
+ loader->ResponseInfo()->headers->response_code() <= 299 &&
+ body;
+ std::move(on_result).Run(success, std::move(body));
+ loader_map_.erase(loader);
+}
+
+void NewTabPageHandler::OnLogFetchResult(OnDoodleImageRenderedCallback callback,
+ bool success,
+ std::unique_ptr<std::string> body) {
+ if (!success || body->size() < 4 || body->substr(0, 4) != ")]}'") {
+ std::move(callback).Run("", base::nullopt, "");
+ return;
+ }
+ auto value = base::JSONReader::Read(body->substr(4));
+ if (!value.has_value()) {
+ std::move(callback).Run("", base::nullopt, "");
+ return;
+ }
+
+ auto* target_url_params_value = value->FindPath("ddllog.target_url_params");
+ auto target_url_params =
+ target_url_params_value && target_url_params_value->is_string()
+ ? target_url_params_value->GetString()
+ : "";
+ auto* interaction_log_url_value =
+ value->FindPath("ddllog.interaction_log_url");
+ auto interaction_log_url =
+ interaction_log_url_value && interaction_log_url_value->is_string()
+ ? base::Optional<GURL>(
+ GURL(TemplateURLServiceFactory::GetForProfile(profile_)
+ ->search_terms_data()
+ .GoogleBaseURLValue())
+ .Resolve(interaction_log_url_value->GetString()))
+ : base::nullopt;
+ auto* encoded_ei_value = value->FindPath("ddllog.encoded_ei");
+ auto encoded_ei = encoded_ei_value && encoded_ei_value->is_string()
+ ? encoded_ei_value->GetString()
+ : "";
+ std::move(callback).Run(target_url_params, interaction_log_url, encoded_ei);
+}
diff --git a/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.h b/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.h
index 38fccc1c1c7..252dda345db 100644
--- a/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.h
+++ b/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.h
@@ -5,24 +5,36 @@
#ifndef CHROME_BROWSER_UI_WEBUI_NEW_TAB_PAGE_NEW_TAB_PAGE_HANDLER_H_
#define CHROME_BROWSER_UI_WEBUI_NEW_TAB_PAGE_NEW_TAB_PAGE_HANDLER_H_
+#include <unordered_map>
+
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
+#include "base/scoped_observer.h"
+#include "base/time/time.h"
+#include "chrome/browser/bitmap_fetcher/bitmap_fetcher_service.h"
#include "chrome/browser/search/background/ntp_background_service_observer.h"
#include "chrome/browser/search/instant_service_observer.h"
+#include "chrome/browser/search/one_google_bar/one_google_bar_service.h"
+#include "chrome/browser/search/one_google_bar/one_google_bar_service_observer.h"
#include "chrome/browser/ui/omnibox/omnibox_tab_helper.h"
#include "chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom.h"
#include "chrome/common/search/instant_types.h"
+#include "chrome/common/search/ntp_logging_events.h"
+#include "components/omnibox/browser/autocomplete_controller.h"
+#include "components/omnibox/browser/favicon_cache.h"
#include "components/search_provider_logos/logo_common.h"
#include "content/public/browser/web_contents_observer.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
+#include "ui/shell_dialogs/select_file_dialog.h"
class GURL;
class InstantService;
class NtpBackgroundService;
class Profile;
+class NTPUserDataLogger;
namespace chrome_colors {
class ChromeColorsService;
@@ -39,13 +51,17 @@ class LogoService;
class NewTabPageHandler : public new_tab_page::mojom::PageHandler,
public InstantServiceObserver,
public NtpBackgroundServiceObserver,
- public OmniboxTabHelper::Observer {
+ public OmniboxTabHelper::Observer,
+ public OneGoogleBarServiceObserver,
+ public ui::SelectFileDialog::Listener,
+ public AutocompleteController::Observer {
public:
NewTabPageHandler(mojo::PendingReceiver<new_tab_page::mojom::PageHandler>
pending_page_handler,
mojo::PendingRemote<new_tab_page::mojom::Page> pending_page,
Profile* profile,
- content::WebContents* web_contents);
+ content::WebContents* web_contents,
+ const base::Time& ntp_navigation_start_time);
~NewTabPageHandler() override;
// new_tab_page::mojom::PageHandler:
@@ -68,6 +84,12 @@ class NewTabPageHandler : public new_tab_page::mojom::PageHandler,
void ConfirmThemeChanges() override;
void GetChromeThemes(GetChromeThemesCallback callback) override;
void RevertThemeChanges() override;
+ void SetBackgroundImage(const std::string& attribution_1,
+ const std::string& attribution_2,
+ const GURL& attribution_url,
+ const GURL& image_url) override;
+ void SetDailyRefreshCollectionId(const std::string& collection_id) override;
+ void SetNoBackgroundImage() override;
void GetBackgroundCollections(
GetBackgroundCollectionsCallback callback) override;
void GetBackgroundImages(const std::string& collection_id,
@@ -75,6 +97,44 @@ class NewTabPageHandler : public new_tab_page::mojom::PageHandler,
void FocusOmnibox() override;
void PasteIntoOmnibox(const std::string& text) override;
void GetDoodle(GetDoodleCallback callback) override;
+ void ChooseLocalCustomBackground(
+ ChooseLocalCustomBackgroundCallback callback) override;
+ void GetOneGoogleBarParts(const std::string& ogdeb_value,
+ GetOneGoogleBarPartsCallback callback) override;
+ void OnMostVisitedTilesRendered(
+ std::vector<new_tab_page::mojom::MostVisitedTilePtr> tiles,
+ double time) override;
+ void OnOneGoogleBarRendered(double time) override;
+ void OnPromoRendered(double time) override;
+ void OnMostVisitedTileNavigation(new_tab_page::mojom::MostVisitedTilePtr tile,
+ uint32_t index) override;
+ void OnCustomizeDialogAction(
+ new_tab_page::mojom::CustomizeDialogAction action) override;
+ void OnDoodleImageClicked(new_tab_page::mojom::DoodleImageType type,
+ const base::Optional<GURL>& log_url) override;
+ void OnDoodleImageRendered(new_tab_page::mojom::DoodleImageType type,
+ double time,
+ const GURL& log_url,
+ OnDoodleImageRenderedCallback callback) override;
+ void OnDoodleShared(new_tab_page::mojom::DoodleShareChannel channel,
+ const std::string& doodle_id,
+ const base::Optional<std::string>& share_id) override;
+ void OnPromoLinkClicked() override;
+ void QueryAutocomplete(const base::string16& input,
+ bool prevent_inline_autocomplete) override;
+ void StopAutocomplete(bool clear_result) override;
+ void OpenAutocompleteMatch(uint8_t line,
+ const GURL& url,
+ bool are_matches_showing,
+ base::TimeDelta time_elapsed_since_last_focus,
+ uint8_t mouse_button,
+ bool alt_key,
+ bool ctrl_key,
+ bool meta_key,
+ bool shift_key) override;
+ void DeleteAutocompleteMatch(uint8_t line) override;
+ void ToggleSuggestionGroupIdVisibility(int32_t suggestion_group_id) override;
+ void LogCharTypedToRepaintLatency(base::TimeDelta latency) override;
private:
// InstantServiceObserver:
@@ -92,22 +152,80 @@ class NewTabPageHandler : public new_tab_page::mojom::PageHandler,
void OnOmniboxFocusChanged(OmniboxFocusState state,
OmniboxFocusChangeReason reason) override;
+ // OneGoogleBarServiceObserver:
+ void OnOneGoogleBarDataUpdated() override;
+ void OnOneGoogleBarServiceShuttingDown() override;
+
+ // SelectFileDialog::Listener:
+ void FileSelected(const base::FilePath& path,
+ int index,
+ void* params) override;
+ void FileSelectionCanceled(void* params) override;
+
+ // AutocompleteController::Observer:
+ void OnResultChanged(AutocompleteController* controller,
+ bool default_match_changed) override;
+
void OnLogoAvailable(
GetDoodleCallback callback,
search_provider_logos::LogoCallbackReason type,
const base::Optional<search_provider_logos::EncodedLogo>& logo);
+ void OnRealboxBitmapFetched(int match_index,
+ const GURL& image_url,
+ const SkBitmap& bitmap);
+ void OnRealboxFaviconFetched(int match_index,
+ const GURL& page_url,
+ const gfx::Image& favicon);
+
+ void LogEvent(NTPLoggingEventType event);
+
+ typedef base::OnceCallback<void(bool success,
+ std::unique_ptr<std::string> body)>
+ OnFetchResultCallback;
+ void Fetch(const GURL& url, OnFetchResultCallback on_result);
+ void OnFetchResult(const network::SimpleURLLoader* loader,
+ OnFetchResultCallback on_result,
+ std::unique_ptr<std::string> body);
+ void OnLogFetchResult(OnDoodleImageRenderedCallback callback,
+ bool success,
+ std::unique_ptr<std::string> body);
+
+ ChooseLocalCustomBackgroundCallback choose_local_custom_background_callback_;
chrome_colors::ChromeColorsService* chrome_colors_service_;
InstantService* instant_service_;
NtpBackgroundService* ntp_background_service_;
search_provider_logos::LogoService* logo_service_;
GURL last_blacklisted_;
GetBackgroundCollectionsCallback background_collections_callback_;
+ base::TimeTicks background_collections_request_start_time_;
std::string images_request_collection_id_;
GetBackgroundImagesCallback background_images_callback_;
+ base::TimeTicks background_images_request_start_time_;
+ std::vector<GetOneGoogleBarPartsCallback> one_google_bar_parts_callbacks_;
+ OneGoogleBarService* one_google_bar_service_;
+ ScopedObserver<OneGoogleBarService, OneGoogleBarServiceObserver>
+ one_google_bar_service_observer_{this};
+ base::Optional<base::TimeTicks> one_google_bar_load_start_time_;
+ Profile* profile_;
+ scoped_refptr<ui::SelectFileDialog> select_file_dialog_;
+ std::unique_ptr<AutocompleteController> autocomplete_controller_;
+ FaviconCache favicon_cache_;
+ BitmapFetcherService* bitmap_fetcher_service_;
+ std::vector<BitmapFetcherService::RequestId> bitmap_request_ids_;
+ base::TimeTicks time_of_first_autocomplete_query_;
+ content::WebContents* web_contents_;
+ base::Time ntp_navigation_start_time_;
+ NTPUserDataLogger* logger_;
+ std::unordered_map<const network::SimpleURLLoader*,
+ std::unique_ptr<network::SimpleURLLoader>>
+ loader_map_;
+
+ // These are located at the end of the list of member variables to ensure the
+ // WebUI page is disconnected before other members are destroyed.
mojo::Remote<new_tab_page::mojom::Page> page_;
mojo::Receiver<new_tab_page::mojom::PageHandler> receiver_;
- content::WebContents* web_contents_;
+
base::WeakPtrFactory<NewTabPageHandler> weak_ptr_factory_{this};
DISALLOW_COPY_AND_ASSIGN(NewTabPageHandler);
diff --git a/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc b/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
index 6007740cd12..a055b15e57b 100644
--- a/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
+++ b/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
@@ -10,22 +10,31 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/search/instant_service.h"
#include "chrome/browser/search/instant_service_factory.h"
+#include "chrome/browser/search/ntp_features.h"
#include "chrome/browser/search_engines/template_url_service_factory.h"
+#include "chrome/browser/ui/search/omnibox_mojo_utils.h"
#include "chrome/browser/ui/webui/favicon_source.h"
#include "chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.h"
#include "chrome/browser/ui/webui/new_tab_page/untrusted_source.h"
+#include "chrome/browser/ui/webui/theme_source.h"
#include "chrome/browser/ui/webui/webui_util.h"
#include "chrome/common/url_constants.h"
+#include "chrome/grit/browser_resources.h"
#include "chrome/grit/generated_resources.h"
#include "chrome/grit/new_tab_page_resources.h"
#include "chrome/grit/new_tab_page_resources_map.h"
#include "components/favicon_base/favicon_url_parser.h"
+#include "components/google/core/common/google_util.h"
+#include "components/omnibox/common/omnibox_features.h"
#include "components/strings/grit/components_strings.h"
+#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/url_data_source.h"
#include "content/public/browser/web_ui_data_source.h"
#include "ui/base/accelerators/accelerator.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/webui/web_ui_util.h"
+#include "ui/resources/grit/webui_resources.h"
+#include "url/url_util.h"
using content::BrowserContext;
using content::WebContents;
@@ -38,8 +47,6 @@ constexpr char kGeneratedPath[] =
content::WebUIDataSource* CreateNewTabPageUiHtmlSource(Profile* profile) {
content::WebUIDataSource* source =
content::WebUIDataSource::Create(chrome::kChromeUINewTabPageHost);
- source->OverrideContentSecurityPolicyChildSrc(base::StringPrintf(
- "frame-src %s;", chrome::kChromeUIUntrustedNewTabPageUrl));
ui::Accelerator undo_accelerator(ui::VKEY_Z, ui::EF_PLATFORM_ACCELERATOR);
source->AddString("undoDescription", l10n_util::GetStringFUTF16(
@@ -51,11 +58,33 @@ content::WebUIDataSource* CreateNewTabPageUiHtmlSource(Profile* profile) {
.GoogleBaseURLValue())
.spec());
+ // Realbox.
+ const bool realbox_enabled =
+ ntp_features::IsRealboxEnabled() &&
+ base::FeatureList::IsEnabled(ntp_features::kWebUIRealbox);
+ source->AddBoolean("realboxEnabled", realbox_enabled);
+ source->AddBoolean("suggestionTransparencyEnabled",
+ base::FeatureList::IsEnabled(
+ omnibox::kOmniboxSuggestionTransparencyOptions));
+ source->AddBoolean(
+ "realboxMatchOmniboxTheme",
+ base::FeatureList::IsEnabled(ntp_features::kRealboxMatchOmniboxTheme));
+ source->AddString(
+ "realboxDefaultIcon",
+ base::FeatureList::IsEnabled(ntp_features::kRealboxUseGoogleGIcon)
+ ? omnibox::kGoogleGIconResourceName
+ : omnibox::kSearchIconResourceName);
+
+ source->AddBoolean(
+ "iframeOneGoogleBarEnabled",
+ base::FeatureList::IsEnabled(ntp_features::kIframeOneGoogleBar));
+
static constexpr webui::LocalizedString kStrings[] = {
+ {"doneButton", IDS_DONE},
{"title", IDS_NEW_TAB_TITLE},
{"undo", IDS_NEW_TAB_UNDO_THUMBNAIL_REMOVE},
- // Custom Links
+ // Custom Links.
{"addLinkTitle", IDS_NTP_CUSTOM_LINKS_ADD_SHORTCUT_TITLE},
{"editLinkTitle", IDS_NTP_CUSTOM_LINKS_EDIT_SHORTCUT},
{"invalidUrl", IDS_NTP_CUSTOM_LINKS_INVALID_URL},
@@ -67,6 +96,7 @@ content::WebUIDataSource* CreateNewTabPageUiHtmlSource(Profile* profile) {
{"linkEditedMsg", IDS_NTP_CONFIRM_MSG_SHORTCUT_EDITED},
{"linkRemove", IDS_NTP_CUSTOM_LINKS_REMOVE},
{"linkRemovedMsg", IDS_NTP_CONFIRM_MSG_SHORTCUT_REMOVED},
+ {"moreActions", IDS_SETTINGS_MORE_ACTIONS},
{"nameField", IDS_NTP_CUSTOM_LINKS_NAME},
{"restoreDefaultLinks", IDS_NTP_CONFIRM_MSG_RESTORE_DEFAULTS},
{"restoreThumbnailsShort", IDS_NEW_TAB_RESTORE_THUMBNAILS_SHORT_LINK},
@@ -77,14 +107,17 @@ content::WebUIDataSource* CreateNewTabPageUiHtmlSource(Profile* profile) {
{"backgroundsMenuItem", IDS_NTP_CUSTOMIZE_MENU_BACKGROUND_LABEL},
{"cancelButton", IDS_CANCEL},
{"colorPickerLabel", IDS_NTP_CUSTOMIZE_COLOR_PICKER_LABEL},
+ {"customBackgroundDisabled",
+ IDS_NTP_CUSTOMIZE_MENU_BACKGROUND_DISABLED_LABEL},
{"customizeButton", IDS_NTP_CUSTOMIZE_BUTTON_LABEL},
{"customizeThisPage", IDS_NTP_CUSTOM_BG_CUSTOMIZE_NTP_LABEL},
{"defaultThemeLabel", IDS_NTP_CUSTOMIZE_DEFAULT_LABEL},
- {"doneButton", IDS_DONE},
{"hideShortcuts", IDS_NTP_CUSTOMIZE_HIDE_SHORTCUTS_LABEL},
{"hideShortcutsDesc", IDS_NTP_CUSTOMIZE_HIDE_SHORTCUTS_DESC},
{"mostVisited", IDS_NTP_CUSTOMIZE_MOST_VISITED_LABEL},
{"myShortcuts", IDS_NTP_CUSTOMIZE_MY_SHORTCUTS_LABEL},
+ {"noBackground", IDS_NTP_CUSTOMIZE_NO_BACKGROUND_LABEL},
+ {"refreshDaily", IDS_NTP_CUSTOM_BG_DAILY_REFRESH},
{"shortcutsCurated", IDS_NTP_CUSTOMIZE_MY_SHORTCUTS_DESC},
{"shortcutsMenuItem", IDS_NTP_CUSTOMIZE_MENU_SHORTCUTS_LABEL},
{"shortcutsOption", IDS_NTP_CUSTOMIZE_MENU_SHORTCUTS_LABEL},
@@ -92,6 +125,7 @@ content::WebUIDataSource* CreateNewTabPageUiHtmlSource(Profile* profile) {
{"themesMenuItem", IDS_NTP_CUSTOMIZE_MENU_COLOR_LABEL},
{"thirdPartyThemeDescription", IDS_NTP_CUSTOMIZE_3PT_THEME_DESC},
{"uninstallThirdPartyThemeButton", IDS_NTP_CUSTOMIZE_3PT_THEME_UNINSTALL},
+ {"uploadFromDevice", IDS_NTP_CUSTOMIZE_UPLOAD_FROM_DEVICE_LABEL},
// Voice search.
{"audioError", IDS_NEW_TAB_VOICE_AUDIO_ERROR},
@@ -110,19 +144,78 @@ content::WebUIDataSource* CreateNewTabPageUiHtmlSource(Profile* profile) {
{"voiceSearchButtonLabel", IDS_TOOLTIP_MIC_SEARCH},
{"waiting", IDS_NEW_TAB_VOICE_WAITING},
- // Search box.
+ // Realbox.
{"searchBoxHint", IDS_GOOGLE_SEARCH_BOX_EMPTY_HINT_MD},
+ {"realboxSeparator", IDS_AUTOCOMPLETE_MATCH_DESCRIPTION_SEPARATOR},
+ {"removeSuggestion", IDS_OMNIBOX_REMOVE_SUGGESTION},
+ {"hideSuggestions", IDS_TOOLTIP_HEADER_HIDE_SUGGESTIONS_BUTTON},
+ {"showSuggestions", IDS_TOOLTIP_HEADER_SHOW_SUGGESTIONS_BUTTON},
+ {"hideSection", IDS_ACC_HEADER_HIDE_SUGGESTIONS_BUTTON},
+ {"showSection", IDS_ACC_HEADER_SHOW_SUGGESTIONS_BUTTON},
+
+ // Logo/doodle.
+ {"copyLink", IDS_NTP_DOODLE_SHARE_DIALOG_COPY_LABEL},
+ {"doodleLink", IDS_NTP_DOODLE_SHARE_DIALOG_LINK_LABEL},
+ {"email", IDS_NTP_DOODLE_SHARE_DIALOG_MAIL_LABEL},
+ {"facebook", IDS_NTP_DOODLE_SHARE_DIALOG_FACEBOOK_LABEL},
+ {"shareDoodle", IDS_NTP_DOODLE_SHARE_LABEL},
+ {"twitter", IDS_NTP_DOODLE_SHARE_DIALOG_TWITTER_LABEL},
+
+ // Theme.
+ {"themeCreatedBy", IDS_NEW_TAB_ATTRIBUTION_INTRO},
};
AddLocalizedStringsBulk(source, kStrings);
+ // Register images that are purposefully not inlined in the HTML and instead
+ // are set in Javascript.
+ static constexpr webui::ResourcePath kImages[] = {
+ {omnibox::kGoogleGIconResourceName, IDR_WEBUI_IMAGES_200_LOGO_GOOGLE_G},
+ {omnibox::kBookmarkIconResourceName, IDR_LOCAL_NTP_ICONS_BOOKMARK},
+ {omnibox::kCalculatorIconResourceName, IDR_LOCAL_NTP_ICONS_CALCULATOR},
+ {omnibox::kClockIconResourceName, IDR_LOCAL_NTP_ICONS_CLOCK},
+ {omnibox::kDriveDocsIconResourceName, IDR_LOCAL_NTP_ICONS_DRIVE_DOCS},
+ {omnibox::kDriveFolderIconResourceName, IDR_LOCAL_NTP_ICONS_DRIVE_FOLDER},
+ {omnibox::kDriveFormIconResourceName, IDR_LOCAL_NTP_ICONS_DRIVE_FORM},
+ {omnibox::kDriveImageIconResourceName, IDR_LOCAL_NTP_ICONS_DRIVE_IMAGE},
+ {omnibox::kDriveLogoIconResourceName, IDR_LOCAL_NTP_ICONS_DRIVE_LOGO},
+ {omnibox::kDrivePdfIconResourceName, IDR_LOCAL_NTP_ICONS_DRIVE_PDF},
+ {omnibox::kDriveSheetsIconResourceName, IDR_LOCAL_NTP_ICONS_DRIVE_SHEETS},
+ {omnibox::kDriveSlidesIconResourceName, IDR_LOCAL_NTP_ICONS_DRIVE_SLIDES},
+ {omnibox::kDriveVideoIconResourceName, IDR_LOCAL_NTP_ICONS_DRIVE_VIDEO},
+ {omnibox::kExtensionAppIconResourceName,
+ IDR_LOCAL_NTP_ICONS_EXTENSION_APP},
+ {omnibox::kPageIconResourceName, IDR_LOCAL_NTP_ICONS_PAGE},
+ {omnibox::kSearchIconResourceName, IDR_WEBUI_IMAGES_ICON_SEARCH}};
+ webui::AddResourcePathsBulk(source, kImages);
+
source->AddResourcePath("skcolor.mojom-lite.js",
IDR_NEW_TAB_PAGE_SKCOLOR_MOJO_LITE_JS);
source->AddResourcePath("new_tab_page.mojom-lite.js",
IDR_NEW_TAB_PAGE_MOJO_LITE_JS);
+ source->AddResourcePath("omnibox.mojom-lite.js",
+ IDR_NEW_TAB_PAGE_OMNIBOX_MOJO_LITE_JS);
+#if BUILDFLAG(OPTIMIZE_WEBUI)
+ source->AddResourcePath("new_tab_page.js", IDR_NEW_TAB_PAGE_NEW_TAB_PAGE_JS);
+#endif // BUILDFLAG(OPTIMIZE_WEBUI)
webui::SetupWebUIDataSource(
source, base::make_span(kNewTabPageResources, kNewTabPageResourcesSize),
kGeneratedPath, IDR_NEW_TAB_PAGE_NEW_TAB_PAGE_HTML);
+ // Allows creating <script> and inlining as well as network requests to
+ // support inlining the OneGoogleBar.
+ // TODO(crbug.com/1076506): remove when changing to iframed OneGoogleBar.
+ // Needs to happen after |webui::SetupWebUIDataSource()| since also overrides
+ // script-src.
+ source->OverrideContentSecurityPolicyScriptSrc(
+ "script-src chrome://resources chrome://test 'self' 'unsafe-inline' "
+ "https:;");
+ // Allow embedding of iframes from the One Google Bar and
+ // chrome-untrusted://new-tab-page for other external content and resources.
+ source->OverrideContentSecurityPolicyChildSrc(
+ base::StringPrintf("child-src https://*.google.com/ %s %s;",
+ google_util::CommandLineGoogleBaseURL().spec().c_str(),
+ chrome::kChromeUIUntrustedNewTabPageUrl));
+
return source;
}
@@ -130,23 +223,33 @@ content::WebUIDataSource* CreateNewTabPageUiHtmlSource(Profile* profile) {
NewTabPageUI::NewTabPageUI(content::WebUI* web_ui)
: ui::MojoWebUIController(web_ui, true),
+ content::WebContentsObserver(web_ui->GetWebContents()),
page_factory_receiver_(this),
profile_(Profile::FromWebUI(web_ui)),
instant_service_(InstantServiceFactory::GetForProfile(profile_)),
- web_contents_(web_ui->GetWebContents()) {
- content::WebUIDataSource::Add(profile_,
- CreateNewTabPageUiHtmlSource(profile_));
+ web_contents_(web_ui->GetWebContents()),
+ // We initialize navigation_start_time_ to a reasonable value to account
+ // for the unlikely case where the NewTabPageHandler is created before we
+ // received the DidStartNavigation event.
+ navigation_start_time_(base::Time::Now()) {
+ auto* source = CreateNewTabPageUiHtmlSource(profile_);
+ source->AddBoolean("customBackgroundDisabledByPolicy",
+ instant_service_->IsCustomBackgroundDisabledByPolicy());
+ content::WebUIDataSource::Add(profile_, source);
content::URLDataSource::Add(
profile_, std::make_unique<FaviconSource>(
profile_, chrome::FaviconUrlFormat::kFavicon2));
content::URLDataSource::Add(profile_,
std::make_unique<UntrustedSource>(profile_));
+ content::URLDataSource::Add(
+ profile_,
+ std::make_unique<ThemeSource>(profile_, /*serve_untrusted=*/true));
web_ui->AddRequestableScheme(content::kChromeUIUntrustedScheme);
- UpdateBackgroundColor(*instant_service_->GetInitializedNtpTheme());
instant_service_->AddObserver(this);
+ instant_service_->UpdateNtpTheme();
}
WEB_UI_CONTROLLER_TYPE_IMPL(NewTabPageUI)
@@ -177,7 +280,7 @@ void NewTabPageUI::CreatePageHandler(
DCHECK(pending_page.is_valid());
page_handler_ = std::make_unique<NewTabPageHandler>(
std::move(pending_page_handler), std::move(pending_page), profile_,
- web_contents_);
+ web_contents_, navigation_start_time_);
}
void NewTabPageUI::NtpThemeChanged(const NtpTheme& theme) {
@@ -188,6 +291,13 @@ void NewTabPageUI::NtpThemeChanged(const NtpTheme& theme) {
void NewTabPageUI::MostVisitedInfoChanged(const InstantMostVisitedInfo& info) {}
+void NewTabPageUI::DidStartNavigation(
+ content::NavigationHandle* navigation_handle) {
+ if (navigation_handle->IsInMainFrame()) {
+ navigation_start_time_ = base::Time::Now();
+ }
+}
+
void NewTabPageUI::UpdateBackgroundColor(const NtpTheme& theme) {
std::unique_ptr<base::DictionaryValue> update(new base::DictionaryValue);
auto background_color = theme.background_color;
@@ -196,6 +306,12 @@ void NewTabPageUI::UpdateBackgroundColor(const NtpTheme& theme) {
base::StringPrintf("#%02X%02X%02X", SkColorGetR(background_color),
SkColorGetG(background_color),
SkColorGetB(background_color)));
+ url::RawCanonOutputT<char> encoded_url;
+ url::EncodeURIComponent(theme.custom_background_url.spec().c_str(),
+ theme.custom_background_url.spec().size(),
+ &encoded_url);
+ update->SetString("backgroundImageUrl",
+ std::string(encoded_url.data(), encoded_url.length()));
content::WebUIDataSource::Update(profile_, chrome::kChromeUINewTabPageHost,
std::move(update));
}
diff --git a/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.h b/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.h
index 89080f2524e..5cbe5038336 100644
--- a/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.h
+++ b/chromium/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.h
@@ -8,12 +8,14 @@
#include "base/macros.h"
#include "chrome/browser/search/instant_service_observer.h"
#include "chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom.h"
+#include "content/public/browser/web_contents_observer.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "ui/webui/mojo_web_ui_controller.h"
namespace content {
+class NavigationHandle;
class WebContents;
class WebUI;
}
@@ -24,7 +26,8 @@ class Profile;
class NewTabPageUI : public ui::MojoWebUIController,
public new_tab_page::mojom::PageHandlerFactory,
- public InstantServiceObserver {
+ public InstantServiceObserver,
+ content::WebContentsObserver {
public:
explicit NewTabPageUI(content::WebUI* web_ui);
~NewTabPageUI() override;
@@ -48,6 +51,10 @@ class NewTabPageUI : public ui::MojoWebUIController,
void NtpThemeChanged(const NtpTheme& theme) override;
void MostVisitedInfoChanged(const InstantMostVisitedInfo& info) override;
+ // content::WebContentsObserver:
+ void DidStartNavigation(
+ content::NavigationHandle* navigation_handle) override;
+
// Updates the load time data with the current theme's background color. That
// way the background color is available as soon as the page loads and we
// prevent a potential white flicker.
@@ -59,6 +66,9 @@ class NewTabPageUI : public ui::MojoWebUIController,
Profile* profile_;
InstantService* instant_service_;
content::WebContents* web_contents_;
+ // Time the NTP started loading. Used for logging the WebUI NTP's load
+ // performance.
+ base::Time navigation_start_time_;
WEB_UI_CONTROLLER_TYPE_DECL();
diff --git a/chromium/chrome/browser/ui/webui/new_tab_page/untrusted_source.cc b/chromium/chrome/browser/ui/webui/new_tab_page/untrusted_source.cc
index af00210d178..07e3f7d95de 100644
--- a/chromium/chrome/browser/ui/webui/new_tab_page/untrusted_source.cc
+++ b/chromium/chrome/browser/ui/webui/new_tab_page/untrusted_source.cc
@@ -7,30 +7,56 @@
#include <string>
#include <utility>
+#include "base/base64.h"
+#include "base/files/file_util.h"
+#include "base/i18n/rtl.h"
#include "base/memory/ref_counted_memory.h"
+#include "base/metrics/histogram_macros.h"
#include "base/optional.h"
#include "base/strings/string_piece.h"
#include "base/strings/stringprintf.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/task/task_traits.h"
+#include "base/task/thread_pool.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/search/one_google_bar/one_google_bar_data.h"
#include "chrome/browser/search/one_google_bar/one_google_bar_service_factory.h"
#include "chrome/browser/search/promos/promo_data.h"
#include "chrome/browser/search/promos/promo_service_factory.h"
+#include "chrome/browser/ui/search/ntp_user_data_logger.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/new_tab_page_resources.h"
#include "content/public/common/url_constants.h"
+#include "net/base/url_util.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/base/template_expressions.h"
+#include "url/url_util.h"
namespace {
+constexpr int kMaxUriDecodeLen = 2048;
+
std::string FormatTemplate(int resource_id,
const ui::TemplateReplacements& replacements) {
ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
base::RefCountedMemory* bytes = bundle.LoadDataResourceBytes(resource_id);
base::StringPiece string_piece(reinterpret_cast<const char*>(bytes->front()),
bytes->size());
- return ui::ReplaceTemplateExpressions(string_piece, replacements);
+ return ui::ReplaceTemplateExpressions(
+ string_piece, replacements,
+ /* skip_unexpected_placeholder_check= */ true);
+}
+
+std::string ReadBackgroundImageData(const base::FilePath& profile_path) {
+ std::string data_string;
+ base::ReadFileToString(profile_path.AppendASCII("background.jpg"),
+ &data_string);
+ return data_string;
+}
+
+void ServeBackgroundImageData(content::URLDataSource::GotDataCallback callback,
+ std::string data_string) {
+ std::move(callback).Run(base::RefCountedString::TakeString(&data_string));
}
} // namespace
@@ -38,6 +64,7 @@ std::string FormatTemplate(int resource_id,
UntrustedSource::UntrustedSource(Profile* profile)
: one_google_bar_service_(
OneGoogleBarServiceFactory::GetForProfile(profile)),
+ profile_(profile),
promo_service_(PromoServiceFactory::GetForProfile(profile)) {
// |promo_service_| is null in incognito, or when the feature is
// disabled.
@@ -73,10 +100,18 @@ void UntrustedSource::StartDataRequest(
const std::string path = url.has_path() ? url.path().substr(1) : "";
GURL url_param = GURL(url.query());
if (path == "one-google-bar" && one_google_bar_service_) {
+ std::string query_params;
+ net::GetValueForKeyInQuery(url, "paramsencoded", &query_params);
+ base::Base64Decode(query_params, &query_params);
+ bool wait_for_refresh =
+ one_google_bar_service_->SetAdditionalQueryParams(query_params);
one_google_bar_callbacks_.push_back(std::move(callback));
- if (one_google_bar_callbacks_.size() == 1) {
- one_google_bar_service_->Refresh();
+ if (one_google_bar_service_->one_google_bar_data().has_value() &&
+ !wait_for_refresh) {
+ OnOneGoogleBarDataUpdated();
}
+ one_google_bar_load_start_time_ = base::TimeTicks::Now();
+ one_google_bar_service_->Refresh();
return;
}
if (path == "one_google_bar.js") {
@@ -87,9 +122,11 @@ void UntrustedSource::StartDataRequest(
}
if (path == "promo" && promo_service_) {
promo_callbacks_.push_back(std::move(callback));
- if (promo_callbacks_.size() == 1) {
- promo_service_->Refresh();
+ if (promo_service_->promo_data().has_value()) {
+ OnPromoDataUpdated();
}
+ promo_load_start_time_ = base::TimeTicks::Now();
+ promo_service_->Refresh();
return;
}
if (path == "promo.js") {
@@ -98,30 +135,73 @@ void UntrustedSource::StartDataRequest(
bundle.LoadDataResourceBytes(IDR_NEW_TAB_PAGE_UNTRUSTED_PROMO_JS));
return;
}
- if (path == "image" && url_param.is_valid() &&
- url_param.SchemeIs(url::kHttpsScheme)) {
+ if ((path == "image" || path == "iframe") && url_param.is_valid() &&
+ (url_param.SchemeIs(url::kHttpsScheme) ||
+ url_param.SchemeIs(content::kChromeUIUntrustedScheme))) {
ui::TemplateReplacements replacements;
replacements["url"] = url_param.spec();
- std::string html =
- FormatTemplate(IDR_NEW_TAB_PAGE_UNTRUSTED_IMAGE_HTML, replacements);
+ int resource_id = path == "image" ? IDR_NEW_TAB_PAGE_UNTRUSTED_IMAGE_HTML
+ : IDR_NEW_TAB_PAGE_UNTRUSTED_IFRAME_HTML;
+ std::string html = FormatTemplate(resource_id, replacements);
std::move(callback).Run(base::RefCountedString::TakeString(&html));
return;
}
- if (path == "iframe" && url_param.is_valid() &&
- url_param.SchemeIs(url::kHttpsScheme)) {
- ui::TemplateReplacements replacements;
- replacements["url"] = url_param.spec();
- std::string html =
- FormatTemplate(IDR_NEW_TAB_PAGE_UNTRUSTED_IFRAME_HTML, replacements);
- std::move(callback).Run(base::RefCountedString::TakeString(&html));
+ if (path == "background_image") {
+ ServeBackgroundImage(url_param, GURL(), "cover", "no-repeat", "no-repeat",
+ "center", "center", std::move(callback));
+ return;
+ }
+ if (path == "custom_background_image") {
+ // Parse all query parameters to hash map and decode values.
+ std::unordered_map<std::string, std::string> params;
+ url::Component query(0, url.query().length());
+ url::Component key, value;
+ while (
+ url::ExtractQueryKeyValue(url.query().c_str(), &query, &key, &value)) {
+ url::RawCanonOutputW<kMaxUriDecodeLen> output;
+ url::DecodeURLEscapeSequences(
+ url.query().c_str() + value.begin, value.len,
+ url::DecodeURLMode::kUTF8OrIsomorphic, &output);
+ params.insert(
+ {url.query().substr(key.begin, key.len),
+ base::UTF16ToUTF8(base::string16(output.data(), output.length()))});
+ }
+ // Extract desired values.
+ ServeBackgroundImage(
+ params.count("url") == 1 ? GURL(params["url"]) : GURL(),
+ params.count("url2x") == 1 ? GURL(params["url2x"]) : GURL(),
+ params.count("size") == 1 ? params["size"] : "cover",
+ params.count("repeatX") == 1 ? params["repeatX"] : "no-repeat",
+ params.count("repeatY") == 1 ? params["repeatY"] : "no-repeat",
+ params.count("positionX") == 1 ? params["positionX"] : "center",
+ params.count("positionY") == 1 ? params["positionY"] : "center",
+ std::move(callback));
+ return;
+ }
+ if (path == "background_image.js") {
+ ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
+ std::move(callback).Run(bundle.LoadDataResourceBytes(
+ IDR_NEW_TAB_PAGE_UNTRUSTED_BACKGROUND_IMAGE_JS));
+ return;
+ }
+ if (path == "background.jpg") {
+ base::ThreadPool::PostTaskAndReplyWithResult(
+ FROM_HERE, {base::TaskPriority::USER_VISIBLE, base::MayBlock()},
+ base::BindOnce(&ReadBackgroundImageData, profile_->GetPath()),
+ base::BindOnce(&ServeBackgroundImageData, std::move(callback)));
return;
}
std::move(callback).Run(base::MakeRefCounted<base::RefCountedString>());
}
std::string UntrustedSource::GetMimeType(const std::string& path) {
- if (base::EndsWith(path, ".js", base::CompareCase::INSENSITIVE_ASCII))
+ const std::string stripped_path = path.substr(0, path.find("?"));
+ if (base::EndsWith(stripped_path, ".js",
+ base::CompareCase::INSENSITIVE_ASCII))
return "application/javascript";
+ if (base::EndsWith(stripped_path, ".jpg",
+ base::CompareCase::INSENSITIVE_ASCII))
+ return "image/jpg";
return "text/html";
}
@@ -141,7 +221,7 @@ bool UntrustedSource::ShouldReplaceExistingSource() {
bool UntrustedSource::ShouldServiceRequest(
const GURL& url,
- content::ResourceContext* resource_context,
+ content::BrowserContext* browser_context,
int render_process_id) {
if (!url.SchemeIs(content::kChromeUIUntrustedScheme) || !url.has_path()) {
return false;
@@ -149,15 +229,26 @@ bool UntrustedSource::ShouldServiceRequest(
const std::string path = url.path().substr(1);
return path == "one-google-bar" || path == "one_google_bar.js" ||
path == "promo" || path == "promo.js" || path == "image" ||
- path == "iframe";
+ path == "background_image" || path == "custom_background_image" ||
+ path == "background_image.js" || path == "iframe" ||
+ path == "background.jpg";
}
void UntrustedSource::OnOneGoogleBarDataUpdated() {
base::Optional<OneGoogleBarData> data =
one_google_bar_service_->one_google_bar_data();
+
+ if (one_google_bar_load_start_time_.has_value()) {
+ NTPUserDataLogger::LogOneGoogleBarFetchDuration(
+ /*success=*/data.has_value(),
+ /*duration=*/base::TimeTicks::Now() - *one_google_bar_load_start_time_);
+ one_google_bar_load_start_time_ = base::nullopt;
+ }
+
std::string html;
if (data.has_value()) {
ui::TemplateReplacements replacements;
+ replacements["textdirection"] = base::i18n::IsRTL() ? "rtl" : "ltr";
replacements["barHtml"] = data->bar_html;
replacements["inHeadScript"] = data->in_head_script;
replacements["inHeadStyle"] = data->in_head_style;
@@ -179,10 +270,32 @@ void UntrustedSource::OnOneGoogleBarServiceShuttingDown() {
}
void UntrustedSource::OnPromoDataUpdated() {
+ if (promo_load_start_time_.has_value()) {
+ base::TimeDelta duration = base::TimeTicks::Now() - *promo_load_start_time_;
+ UMA_HISTOGRAM_MEDIUM_TIMES("NewTabPage.Promos.RequestLatency2", duration);
+ if (promo_service_->promo_status() == PromoService::Status::OK_WITH_PROMO) {
+ UMA_HISTOGRAM_MEDIUM_TIMES(
+ "NewTabPage.Promos.RequestLatency2.SuccessWithPromo", duration);
+ } else if (promo_service_->promo_status() ==
+ PromoService::Status::OK_BUT_BLOCKED) {
+ UMA_HISTOGRAM_MEDIUM_TIMES(
+ "NewTabPage.Promos.RequestLatency2.SuccessButBlocked", duration);
+ } else if (promo_service_->promo_status() ==
+ PromoService::Status::OK_WITHOUT_PROMO) {
+ UMA_HISTOGRAM_MEDIUM_TIMES(
+ "NewTabPage.Promos.RequestLatency2.SuccessWithoutPromo", duration);
+ } else {
+ UMA_HISTOGRAM_MEDIUM_TIMES("NewTabPage.Promos.RequestLatency2.Failure",
+ duration);
+ }
+ promo_load_start_time_ = base::nullopt;
+ }
+
const auto& data = promo_service_->promo_data();
std::string html;
if (data.has_value() && !data->promo_html.empty()) {
ui::TemplateReplacements replacements;
+ replacements["textdirection"] = base::i18n::IsRTL() ? "rtl" : "ltr";
replacements["data"] = data->promo_html;
html = FormatTemplate(IDR_NEW_TAB_PAGE_UNTRUSTED_PROMO_HTML, replacements);
}
@@ -196,3 +309,37 @@ void UntrustedSource::OnPromoServiceShuttingDown() {
promo_service_observer_.RemoveAll();
promo_service_ = nullptr;
}
+
+void UntrustedSource::ServeBackgroundImage(
+ const GURL& url,
+ const GURL& url_2x,
+ const std::string& size,
+ const std::string& repeat_x,
+ const std::string& repeat_y,
+ const std::string& position_x,
+ const std::string& position_y,
+ content::URLDataSource::GotDataCallback callback) {
+ if (!url.is_valid() || !(url.SchemeIs(url::kHttpsScheme) ||
+ url.SchemeIs(content::kChromeUIUntrustedScheme))) {
+ std::move(callback).Run(base::MakeRefCounted<base::RefCountedString>());
+ return;
+ }
+ ui::TemplateReplacements replacements;
+ replacements["url"] = url.spec();
+ if (url_2x.is_valid()) {
+ replacements["backgroundUrl"] =
+ base::StringPrintf("-webkit-image-set(url(%s) 1x, url(%s) 2x)",
+ url.spec().c_str(), url_2x.spec().c_str());
+ } else {
+ replacements["backgroundUrl"] =
+ base::StringPrintf("url(%s)", url.spec().c_str());
+ }
+ replacements["size"] = size;
+ replacements["repeatX"] = repeat_x;
+ replacements["repeatY"] = repeat_y;
+ replacements["positionX"] = position_x;
+ replacements["positionY"] = position_y;
+ std::string html = FormatTemplate(
+ IDR_NEW_TAB_PAGE_UNTRUSTED_BACKGROUND_IMAGE_HTML, replacements);
+ std::move(callback).Run(base::RefCountedString::TakeString(&html));
+}
diff --git a/chromium/chrome/browser/ui/webui/new_tab_page/untrusted_source.h b/chromium/chrome/browser/ui/webui/new_tab_page/untrusted_source.h
index 29edb345439..5a689dbaf25 100644
--- a/chromium/chrome/browser/ui/webui/new_tab_page/untrusted_source.h
+++ b/chromium/chrome/browser/ui/webui/new_tab_page/untrusted_source.h
@@ -21,6 +21,27 @@ class Profile;
// from outside the chromium codebase. The chrome-untrusted://new-tab-page/*
// sources can only be embedded in the chrome://new-tab-page by using an
// <iframe>.
+//
+// Offers the following helpers to embed content into chrome://new-tab-page in a
+// generalized way:
+// * chrome-untrusted://new-tab-page/image?<url>: Behaves like an img element
+// with src set to <url>.
+// * chrome-untrusted://new-tab-page/background_image?<url>: Behaves like an
+// element that has <url> set as the background image, such that the image
+// will cover the entire element.
+// * chrome-untrusted://new-tab-page/custom_background_image?<params>: Similar
+// to background_image but allows for custom styling. <params> are of the
+// form <key>=<value>. The following keys are supported:
+// * url: background image URL.
+// * url2x: (optional) URL to a higher res background image.
+// * size: (optional) CSS background-size property.
+// * repeatX: (optional) CSS background-repeat-x property.
+// * repeatY: (optional) CSS background-repeat-y property.
+// * positionX: (optional) CSS background-position-x property.
+// * positionY: (optional) CSS background-position-y property.
+// * chrome-untrusted://new-tab-page/iframe?<url>: Behaves like an iframe with
+// src set to <url>.
+// Each of those helpers only accept URLs with HTTPS or chrome-untrusted:.
class UntrustedSource : public content::URLDataSource,
public OneGoogleBarServiceObserver,
public PromoServiceObserver {
@@ -43,7 +64,7 @@ class UntrustedSource : public content::URLDataSource,
std::string GetContentSecurityPolicyFrameAncestors() override;
bool ShouldReplaceExistingSource() override;
bool ShouldServiceRequest(const GURL& url,
- content::ResourceContext* resource_context,
+ content::BrowserContext* browser_context,
int render_process_id) override;
private:
@@ -55,15 +76,27 @@ class UntrustedSource : public content::URLDataSource,
void OnPromoDataUpdated() override;
void OnPromoServiceShuttingDown() override;
+ void ServeBackgroundImage(const GURL& url,
+ const GURL& url_2x,
+ const std::string& size,
+ const std::string& repeat_x,
+ const std::string& repeat_y,
+ const std::string& position_x,
+ const std::string& position_y,
+ content::URLDataSource::GotDataCallback callback);
+
std::vector<content::URLDataSource::GotDataCallback>
one_google_bar_callbacks_;
OneGoogleBarService* one_google_bar_service_;
ScopedObserver<OneGoogleBarService, OneGoogleBarServiceObserver>
one_google_bar_service_observer_{this};
+ base::Optional<base::TimeTicks> one_google_bar_load_start_time_;
+ Profile* profile_;
std::vector<content::URLDataSource::GotDataCallback> promo_callbacks_;
PromoService* promo_service_;
ScopedObserver<PromoService, PromoServiceObserver> promo_service_observer_{
this};
+ base::Optional<base::TimeTicks> promo_load_start_time_;
};
#endif // CHROME_BROWSER_UI_WEBUI_NEW_TAB_PAGE_UNTRUSTED_SOURCE_H_
diff --git a/chromium/chrome/browser/ui/webui/ntp/OWNERS b/chromium/chrome/browser/ui/webui/ntp/OWNERS
index 32b85cb193d..c6946162e9c 100644
--- a/chromium/chrome/browser/ui/webui/ntp/OWNERS
+++ b/chromium/chrome/browser/ui/webui/ntp/OWNERS
@@ -1,4 +1,6 @@
estade@chromium.org
+per-file app_launcher_handler.*=dmurph@chromium.org
+
# TEAM: ntp-dev@chromium.org
# COMPONENT: UI>Browser>NewTabPage
diff --git a/chromium/chrome/browser/ui/webui/ntp/app_launcher_handler.cc b/chromium/chrome/browser/ui/webui/ntp/app_launcher_handler.cc
index 93cb95d1973..8b3cd017605 100644
--- a/chromium/chrome/browser/ui/webui/ntp/app_launcher_handler.cc
+++ b/chromium/chrome/browser/ui/webui/ntp/app_launcher_handler.cc
@@ -14,13 +14,20 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/command_line.h"
+#include "base/feature_list.h"
#include "base/i18n/rtl.h"
#include "base/metrics/field_trial.h"
#include "base/metrics/histogram_macros.h"
+#include "base/optional.h"
+#include "base/stl_util.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
-#include "chrome/browser/apps/launch_service/launch_service.h"
+#include "chrome/browser/apps/app_service/app_icon_source.h"
+#include "chrome/browser/apps/app_service/app_launch_params.h"
+#include "chrome/browser/apps/app_service/app_service_proxy.h"
+#include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
+#include "chrome/browser/apps/app_service/browser_app_launcher.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/extensions/crx_installer.h"
@@ -29,6 +36,7 @@
#include "chrome/browser/extensions/extension_util.h"
#include "chrome/browser/extensions/launch_util.h"
#include "chrome/browser/favicon/favicon_service_factory.h"
+#include "chrome/browser/installable/installable_metrics.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/apps/app_info_dialog.h"
#include "chrome/browser/ui/browser_dialogs.h"
@@ -39,14 +47,23 @@
#include "chrome/browser/ui/extensions/app_launch_params.h"
#include "chrome/browser/ui/extensions/extension_enable_flow.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/web_applications/web_app_dialog_manager.h"
+#include "chrome/browser/ui/web_applications/web_app_ui_manager_impl.h"
#include "chrome/browser/ui/webui/extensions/extension_basic_info.h"
#include "chrome/browser/ui/webui/extensions/extension_icon_source.h"
#include "chrome/browser/ui/webui/ntp/new_tab_ui.h"
+#include "chrome/browser/web_applications/components/app_registry_controller.h"
+#include "chrome/browser/web_applications/components/app_shortcut_manager.h"
#include "chrome/browser/web_applications/components/file_handler_manager.h"
+#include "chrome/browser/web_applications/components/install_finalizer.h"
+#include "chrome/browser/web_applications/components/web_app_constants.h"
#include "chrome/browser/web_applications/components/web_app_provider_base.h"
#include "chrome/browser/web_applications/extensions/bookmark_app_finalizer_utils.h"
#include "chrome/browser/web_applications/extensions/bookmark_app_util.h"
+#include "chrome/browser/web_applications/web_app_icon_manager.h"
+#include "chrome/browser/web_applications/web_app_provider.h"
#include "chrome/common/buildflags.h"
+#include "chrome/common/chrome_features.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/extensions/extension_constants.h"
#include "chrome/common/extensions/extension_metrics.h"
@@ -99,26 +116,169 @@ enum {
APPS_PAGE_ID = 2 << kPageIdOffset,
};
+// Keys in the dictionary returned by GetExtensionBasicInfo().
+const char kDescriptionKey[] = "description";
+const char kEnabledKey[] = "enabled";
+const char kInfoIdKey[] = "id";
+const char kInfoNameKey[] = "name";
+const char kKioskEnabledKey[] = "kioskEnabled";
+const char kKioskOnlyKey[] = "kioskOnly";
+const char kOfflineEnabledKey[] = "offlineEnabled";
+const char kPackagedAppKey[] = "packagedApp";
+
+const int kWebAppIconLargeNonDefault = 128;
+const int kWebAppIconSmallNonDefault = 16;
+
+// The Youtube app is incorrectly harded to be a 'bookmark app'. However, it is
+// a platform app. This helper method special cases that, and should be used
+// instead of extension->from_bookmark().
+// TODO(crbug.com/1065748): Remove this hack once the youtube app is fixed.
+bool FromBookmark(const extensions::Extension* extension) {
+ return extension->from_bookmark() &&
+ extension->id() != extension_misc::kYoutubeAppId;
+}
+
+// The Youtube app is incorrectly harded to be a 'bookmark app'. However, it is
+// a platform app.
+// TODO(crbug.com/1065748): Remove this hack once the youtube app is fixed.
+bool IsYoutubeExtension(const std::string& extension_id) {
+ return extension_id == extension_misc::kYoutubeAppId;
+}
+
+void GetWebAppBasicInfo(const web_app::AppId& app_id,
+ const web_app::AppRegistrar& app_registrar,
+ base::DictionaryValue* info) {
+ info->SetString(kInfoIdKey, app_id);
+ info->SetString(kInfoNameKey, app_registrar.GetAppShortName(app_id));
+ info->SetBoolean(kEnabledKey, true);
+ info->SetBoolean(kKioskEnabledKey, false);
+ info->SetBoolean(kKioskOnlyKey, false);
+ info->SetBoolean(kOfflineEnabledKey, true);
+ info->SetString(kDescriptionKey, app_registrar.GetAppDescription(app_id));
+ info->SetBoolean(kPackagedAppKey, false);
+}
+
+bool DesktopPWAsWithoutExtensions() {
+ return base::FeatureList::IsEnabled(features::kDesktopPWAsWithoutExtensions);
+}
+
+bool HasMatchingOrGreaterThanIcon(
+ std::vector<SquareSizePx> downloaded_icon_sizes,
+ int pixels) {
+ for (const SquareSizePx icon_size : downloaded_icon_sizes) {
+ if (icon_size >= pixels)
+ return true;
+ }
+ return false;
+}
+
} // namespace
AppLauncherHandler::AppInstallInfo::AppInstallInfo() {}
-
AppLauncherHandler::AppInstallInfo::~AppInstallInfo() {}
AppLauncherHandler::AppLauncherHandler(
- extensions::ExtensionService* extension_service)
+ extensions::ExtensionService* extension_service,
+ web_app::WebAppProvider* web_app_provider)
: extension_service_(extension_service),
+ web_app_provider_(web_app_provider),
ignore_changes_(false),
- attempted_bookmark_app_install_(false),
has_loaded_apps_(false) {}
AppLauncherHandler::~AppLauncherHandler() {
ExtensionRegistry::Get(Profile::FromWebUI(web_ui()))->RemoveObserver(this);
}
-void AppLauncherHandler::CreateAppInfo(const Extension* extension,
- extensions::ExtensionService* service,
- base::DictionaryValue* value) {
+void AppLauncherHandler::CreateWebAppInfo(const web_app::AppId& app_id,
+ base::DictionaryValue* value) {
+ // The items which are to be written into |value| are also described in
+ // chrome/browser/resources/ntp4/page_list_view.js in @typedef for AppInfo.
+ // Please update it whenever you add or remove any keys here.
+ value->Clear();
+
+ // Communicate the kiosk flag so the apps page can disable showing the
+ // context menu in kiosk mode.
+ value->SetBoolean(
+ "kioskMode",
+ base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kKioskMode));
+
+ auto& registrar = web_app_provider_->registrar();
+
+ base::string16 name = base::UTF8ToUTF16(registrar.GetAppShortName(app_id));
+ NewTabUI::SetUrlTitleAndDirection(value, name,
+ registrar.GetAppLaunchURL(app_id));
+ NewTabUI::SetFullNameAndDirection(name, value);
+
+ GetWebAppBasicInfo(app_id, registrar, value);
+
+ value->SetBoolean("mayDisable", web_app_provider_->install_finalizer()
+ .CanUserUninstallExternalApp(app_id));
+ bool is_locally_installed = registrar.IsLocallyInstalled(app_id);
+ value->SetBoolean("mayChangeLaunchType", is_locally_installed);
+
+ // Any locally installed app can have shortcuts created.
+ value->SetBoolean("mayCreateShortcuts", is_locally_installed);
+ value->SetBoolean("isLocallyInstalled", is_locally_installed);
+
+ base::Optional<std::string> icon_big;
+ base::Optional<std::string> icon_small;
+
+ if (HasMatchingOrGreaterThanIcon(registrar.GetAppDownloadedIconSizes(app_id),
+ kWebAppIconLargeNonDefault)) {
+ icon_big =
+ apps::AppIconSource::GetIconURL(app_id, kWebAppIconLargeNonDefault)
+ .spec();
+ }
+
+ if (HasMatchingOrGreaterThanIcon(registrar.GetAppDownloadedIconSizes(app_id),
+ kWebAppIconSmallNonDefault)) {
+ icon_small =
+ apps::AppIconSource::GetIconURL(app_id, kWebAppIconSmallNonDefault)
+ .spec();
+ }
+
+ value->SetBoolean("icon_big_exists", icon_big.has_value());
+ value->SetString("icon_big", icon_big.value_or(GURL().spec()));
+ value->SetBoolean("icon_small_exists", icon_small.has_value());
+ value->SetString("icon_small", icon_small.value_or(GURL().spec()));
+
+ extensions::LaunchContainerAndType result =
+ extensions::GetLaunchContainerAndTypeFromDisplayMode(
+ registrar.GetAppUserDisplayMode(app_id));
+ value->SetInteger("launch_container",
+ static_cast<int>(result.launch_container));
+ value->SetInteger("launch_type", result.launch_type);
+ value->SetBoolean("is_component", false);
+ value->SetBoolean("is_webstore", false);
+
+ // TODO(https://crbug.com/1061586): Figure out a way to keep the AppSorting
+ // system compatible with web apps.
+ DCHECK_NE(app_id, extensions::kWebStoreAppId);
+ AppSorting* sorting =
+ ExtensionSystem::Get(Profile::FromWebUI(web_ui()))->app_sorting();
+ syncer::StringOrdinal page_ordinal = sorting->GetPageOrdinal(app_id);
+ if (!page_ordinal.IsValid()) {
+ // Make sure every app has a page ordinal (some predate the page ordinal).
+ page_ordinal = sorting->GetNaturalAppPageOrdinal();
+ sorting->SetPageOrdinal(app_id, page_ordinal);
+ }
+ value->SetInteger("page_index",
+ sorting->PageStringOrdinalAsInteger(page_ordinal));
+
+ syncer::StringOrdinal app_launch_ordinal =
+ sorting->GetAppLaunchOrdinal(app_id);
+ if (!app_launch_ordinal.IsValid()) {
+ // Make sure every app has a launch ordinal (some predate the launch
+ // ordinal).
+ app_launch_ordinal = sorting->CreateNextAppLaunchOrdinal(page_ordinal);
+ sorting->SetAppLaunchOrdinal(app_id, app_launch_ordinal);
+ }
+ value->SetString("app_launch_ordinal", app_launch_ordinal.ToInternalValue());
+}
+
+void AppLauncherHandler::CreateExtensionInfo(const Extension* extension,
+ base::DictionaryValue* value) {
+ DCHECK(!FromBookmark(extension));
// The items which are to be written into |value| are also described in
// chrome/browser/resources/ntp4/page_list_view.js in @typedef for AppInfo.
// Please update it whenever you add or remove any keys here.
@@ -143,21 +303,22 @@ void AppLauncherHandler::CreateAppInfo(const Extension* extension,
base::i18n::UnadjustStringForLocaleDirection(&name);
NewTabUI::SetFullNameAndDirection(name, value);
- bool enabled =
- service->IsExtensionEnabled(extension->id()) &&
- !extensions::ExtensionRegistry::Get(service->GetBrowserContext())
- ->terminated_extensions()
- .GetByID(extension->id());
+ bool enabled = extension_service_->IsExtensionEnabled(extension->id()) &&
+ !extensions::ExtensionRegistry::Get(
+ extension_service_->GetBrowserContext())
+ ->terminated_extensions()
+ .GetByID(extension->id());
extensions::GetExtensionBasicInfo(extension, enabled, value);
- value->SetBoolean("mayDisable",
- extensions::ExtensionSystem::Get(service->profile())
- ->management_policy()
- ->UserMayModifySettings(extension, nullptr));
+ value->SetBoolean(
+ "mayDisable",
+ extensions::ExtensionSystem::Get(extension_service_->profile())
+ ->management_policy()
+ ->UserMayModifySettings(extension, nullptr));
bool is_locally_installed =
!extension->is_hosted_app() ||
- BookmarkAppIsLocallyInstalled(service->profile(), extension);
+ BookmarkAppIsLocallyInstalled(extension_service_->profile(), extension);
value->SetBoolean("mayChangeLaunchType",
!extension->is_platform_app() && is_locally_installed);
@@ -188,14 +349,15 @@ void AppLauncherHandler::CreateAppInfo(const Extension* extension,
"launch_container",
static_cast<int>(
extensions::AppLaunchInfo::GetLaunchContainer(extension)));
- ExtensionPrefs* prefs = ExtensionPrefs::Get(service->profile());
+ ExtensionPrefs* prefs = ExtensionPrefs::Get(extension_service_->profile());
value->SetInteger("launch_type", extensions::GetLaunchType(prefs, extension));
value->SetBoolean("is_component",
extension->location() == extensions::Manifest::COMPONENT);
value->SetBoolean("is_webstore",
extension->id() == extensions::kWebStoreAppId);
- AppSorting* sorting = ExtensionSystem::Get(service->profile())->app_sorting();
+ AppSorting* sorting =
+ ExtensionSystem::Get(extension_service_->profile())->app_sorting();
syncer::StringOrdinal page_ordinal = sorting->GetPageOrdinal(extension->id());
if (!page_ordinal.IsValid()) {
// Make sure every app has a page ordinal (some predate the page ordinal).
@@ -304,36 +466,26 @@ void AppLauncherHandler::Observe(int type,
const std::string* id =
content::Details<const std::string>(details).ptr();
if (id) {
- const Extension* extension =
- ExtensionRegistry::Get(extension_service_->profile())
- ->GetInstalledExtension(*id);
- if (!extension) {
- // Extension could still be downloading or installing.
- return;
- }
-
base::DictionaryValue app_info;
- CreateAppInfo(extension,
- extension_service_,
- &app_info);
+ if (web_app_provider_->registrar().IsInstalled(*id)) {
+ CreateWebAppInfo(*id, &app_info);
+ } else {
+ const Extension* extension =
+ ExtensionRegistry::Get(extension_service_->profile())
+ ->GetInstalledExtension(*id);
+ if (!extension) {
+ // Extension could still be downloading or installing.
+ return;
+ }
+
+ CreateExtensionInfo(extension, &app_info);
+ }
web_ui()->CallJavascriptFunctionUnsafe("ntp.appMoved", app_info);
} else {
HandleGetApps(nullptr);
}
break;
}
- case extensions::NOTIFICATION_EXTENSION_INSTALL_ERROR: {
- CrxInstaller* crx_installer = content::Source<CrxInstaller>(source).ptr();
- if (!Profile::FromWebUI(web_ui())->IsSameProfile(
- crx_installer->profile())) {
- return;
- }
- FALLTHROUGH;
- }
- case extensions::NOTIFICATION_EXTENSION_LOAD_ERROR: {
- attempted_bookmark_app_install_ = false;
- break;
- }
default:
NOTREACHED();
}
@@ -344,48 +496,101 @@ void AppLauncherHandler::OnExtensionLoaded(
const Extension* extension) {
if (!ShouldShow(extension))
return;
+ if (FromBookmark(extension))
+ return;
- std::unique_ptr<base::DictionaryValue> app_info(GetAppInfo(extension));
+ std::unique_ptr<base::DictionaryValue> app_info(GetExtensionInfo(extension));
if (!app_info.get())
return;
visible_apps_.insert(extension->id());
- ExtensionPrefs* prefs = ExtensionPrefs::Get(extension_service_->profile());
- base::Value highlight(prefs->IsFromBookmark(extension->id()) &&
- attempted_bookmark_app_install_);
- attempted_bookmark_app_install_ = false;
- web_ui()->CallJavascriptFunctionUnsafe("ntp.appAdded", *app_info, highlight);
+ web_ui()->CallJavascriptFunctionUnsafe("ntp.appAdded", *app_info,
+ /*highlight=*/base::Value(false));
}
void AppLauncherHandler::OnExtensionUnloaded(
content::BrowserContext* browser_context,
const Extension* extension,
extensions::UnloadedExtensionReason reason) {
- AppRemoved(extension, false);
+ // Exclude events from bookmarks apps if BMO is turned on.
+ if (extension->from_bookmark())
+ return;
+ ExtensionRemoved(extension, /*is_uninstall=*/false);
}
void AppLauncherHandler::OnExtensionUninstalled(
content::BrowserContext* browser_context,
const Extension* extension,
extensions::UninstallReason reason) {
- AppRemoved(extension, true);
+ // Exclude events from bookmarks apps if BMO is turned on.
+ if (FromBookmark(extension))
+ return;
+ ExtensionRemoved(extension, /*is_uninstall=*/true);
+}
+
+void AppLauncherHandler::OnWebAppInstalled(const web_app::AppId& app_id) {
+ std::unique_ptr<base::DictionaryValue> app_info(GetWebAppInfo(app_id));
+ if (!app_info.get())
+ return;
+
+ if (attempting_web_app_install_page_ordinal_.has_value()) {
+ AppSorting* sorting =
+ ExtensionSystem::Get(Profile::FromWebUI(web_ui()))->app_sorting();
+ sorting->SetPageOrdinal(app_id,
+ attempting_web_app_install_page_ordinal_.value());
+ }
+
+ visible_apps_.insert(app_id);
+ base::Value highlight(attempting_web_app_install_page_ordinal_.has_value());
+ attempting_web_app_install_page_ordinal_ = base::nullopt;
+ web_ui()->CallJavascriptFunctionUnsafe("ntp.appAdded", *app_info, highlight);
+}
+
+void AppLauncherHandler::OnWebAppUninstalled(const web_app::AppId& app_id) {
+ std::unique_ptr<base::DictionaryValue> app_info =
+ std::make_unique<base::DictionaryValue>();
+ app_info->SetString(kInfoIdKey, app_id);
+ // Since |isUninstaLL| is true below, the only item needed in the app_info
+ // dictionary is the id.
+ web_ui()->CallJavascriptFunctionUnsafe(
+ "ntp.appRemoved", *app_info, /*isUninstall=*/base::Value(true),
+ base::Value(!extension_id_prompting_.empty()));
+}
+
+void AppLauncherHandler::OnAppRegistrarDestroyed() {
+ web_apps_observer_.RemoveAll();
}
void AppLauncherHandler::FillAppDictionary(base::DictionaryValue* dictionary) {
- // CreateAppInfo and ClearOrdinals can change the extension prefs.
+ // CreateExtensionInfo and ClearOrdinals can change the extension prefs.
base::AutoReset<bool> auto_reset(&ignore_changes_, true);
auto installed_extensions = std::make_unique<base::ListValue>();
Profile* profile = Profile::FromWebUI(web_ui());
PrefService* prefs = profile->GetPrefs();
+ std::set<web_app::AppId> web_app_ids;
+ web_app::AppRegistrar& registrar = web_app_provider_->registrar();
+ for (const web_app::AppId& web_app_id : registrar.GetAppIds()) {
+ // The Youtube app is harded to be a 'bookmark app', however it is not, it
+ // is a platform app.
+ // TODO(crbug.com/1065748): Remove this hack once the youtube app is fixed.
+ if (IsYoutubeExtension(web_app_id))
+ continue;
+ installed_extensions->Append(GetWebAppInfo(web_app_id));
+ web_app_ids.insert(web_app_id);
+ }
+
ExtensionRegistry* registry =
ExtensionRegistry::Get(extension_service_->profile());
for (auto it = visible_apps_.begin(); it != visible_apps_.end(); ++it) {
+ if (base::Contains(web_app_ids, *it))
+ continue;
const Extension* extension = registry->GetInstalledExtension(*it);
- if (extension && extensions::ui_util::ShouldDisplayInNewTabPage(
- extension, profile)) {
- installed_extensions->Append(GetAppInfo(extension));
+ if (extension &&
+ extensions::ui_util::ShouldDisplayInNewTabPage(extension, profile)) {
+ DCHECK(!FromBookmark(extension));
+ installed_extensions->Append(GetExtensionInfo(extension));
}
}
@@ -404,12 +609,19 @@ void AppLauncherHandler::FillAppDictionary(base::DictionaryValue* dictionary) {
}
}
-std::unique_ptr<base::DictionaryValue> AppLauncherHandler::GetAppInfo(
+std::unique_ptr<base::DictionaryValue> AppLauncherHandler::GetExtensionInfo(
const Extension* extension) {
std::unique_ptr<base::DictionaryValue> app_info(new base::DictionaryValue());
- // CreateAppInfo can change the extension prefs.
+ // CreateExtensionInfo can change the extension prefs.
base::AutoReset<bool> auto_reset(&ignore_changes_, true);
- CreateAppInfo(extension, extension_service_, app_info.get());
+ CreateExtensionInfo(extension, app_info.get());
+ return app_info;
+}
+
+std::unique_ptr<base::DictionaryValue> AppLauncherHandler::GetWebAppInfo(
+ const web_app::AppId& app_id) {
+ std::unique_ptr<base::DictionaryValue> app_info(new base::DictionaryValue());
+ CreateWebAppInfo(app_id, app_info.get());
return app_info;
}
@@ -433,18 +645,24 @@ void AppLauncherHandler::HandleGetApps(const base::ListValue* args) {
const ExtensionSet& enabled_set = registry->enabled_extensions();
for (extensions::ExtensionSet::const_iterator it = enabled_set.begin();
it != enabled_set.end(); ++it) {
+ if (FromBookmark(it->get()))
+ continue;
visible_apps_.insert((*it)->id());
}
const ExtensionSet& disabled_set = registry->disabled_extensions();
for (ExtensionSet::const_iterator it = disabled_set.begin();
it != disabled_set.end(); ++it) {
+ if (FromBookmark(it->get()))
+ continue;
visible_apps_.insert((*it)->id());
}
const ExtensionSet& terminated_set = registry->terminated_extensions();
for (ExtensionSet::const_iterator it = terminated_set.begin();
it != terminated_set.end(); ++it) {
+ if (FromBookmark(it->get()))
+ continue;
visible_apps_.insert((*it)->id());
}
}
@@ -469,11 +687,7 @@ void AppLauncherHandler::HandleGetApps(const base::ListValue* args) {
registrar_.Add(this, chrome::NOTIFICATION_APP_LAUNCHER_REORDERED,
content::Source<AppSorting>(
ExtensionSystem::Get(profile)->app_sorting()));
- registrar_.Add(this, extensions::NOTIFICATION_EXTENSION_INSTALL_ERROR,
- content::Source<CrxInstaller>(nullptr));
- registrar_.Add(this,
- extensions::NOTIFICATION_EXTENSION_LOAD_ERROR,
- content::Source<Profile>(profile));
+ web_apps_observer_.Add(&web_app_provider_->registrar());
}
has_loaded_apps_ = true;
@@ -494,14 +708,32 @@ void AppLauncherHandler::HandleLaunchApp(const base::ListValue* args) {
Profile* profile = extension_service_->profile();
- const Extension* extension =
- extensions::ExtensionRegistry::Get(profile)->enabled_extensions().GetByID(
- extension_id);
-
- // Prompt the user to re-enable the application if disabled.
- if (!extension) {
- PromptToEnableApp(extension_id);
- return;
+ extensions::Manifest::Type type;
+ GURL full_launch_url;
+ apps::mojom::LaunchContainer launch_container;
+
+ web_app::AppRegistrar& registrar = web_app_provider_->registrar();
+ if (registrar.IsInstalled(extension_id) &&
+ !IsYoutubeExtension(extension_id)) {
+ type = extensions::Manifest::Type::TYPE_HOSTED_APP;
+ full_launch_url = registrar.GetAppLaunchURL(extension_id);
+ launch_container = web_app::ConvertDisplayModeToAppLaunchContainer(
+ registrar.GetAppEffectiveDisplayMode(extension_id));
+ } else {
+ const Extension* extension = extensions::ExtensionRegistry::Get(profile)
+ ->enabled_extensions()
+ .GetByID(extension_id);
+
+ // Prompt the user to re-enable the application if disabled.
+ if (!extension) {
+ PromptToEnableApp(extension_id);
+ return;
+ }
+ DCHECK(!FromBookmark(extension));
+ type = extension->GetType();
+ full_launch_url = extensions::AppLaunchInfo::GetFullLaunchURL(extension);
+ launch_container =
+ extensions::GetLaunchContainer(ExtensionPrefs::Get(profile), extension);
}
WindowOpenDisposition disposition =
@@ -509,7 +741,7 @@ void AppLauncherHandler::HandleLaunchApp(const base::ListValue* args) {
: WindowOpenDisposition::CURRENT_TAB;
if (extension_id != extensions::kWebStoreAppId) {
CHECK_NE(launch_bucket, extension_misc::APP_LAUNCH_BUCKET_INVALID);
- extensions::RecordAppLaunchType(launch_bucket, extension->GetType());
+ extensions::RecordAppLaunchType(launch_bucket, type);
} else {
extensions::RecordWebStoreLaunch();
@@ -518,8 +750,8 @@ void AppLauncherHandler::HandleLaunchApp(const base::ListValue* args) {
CHECK(args->GetString(2, &source_value));
if (!source_value.empty()) {
override_url = net::AppendQueryParameter(
- extensions::AppLaunchInfo::GetFullLaunchURL(extension),
- extension_urls::kWebstoreSourceField, source_value);
+ full_launch_url, extension_urls::kWebstoreSourceField,
+ source_value);
}
}
}
@@ -535,7 +767,9 @@ void AppLauncherHandler::HandleLaunchApp(const base::ListValue* args) {
: apps::mojom::LaunchContainer::kLaunchContainerTab,
disposition, apps::mojom::AppLaunchSource::kSourceNewTabPage);
params.override_url = override_url;
- apps::LaunchService::Get(profile)->OpenApplication(params);
+ apps::AppServiceProxyFactory::GetForProfile(profile)
+ ->BrowserAppLauncher()
+ .LaunchAppWithParams(params);
} else {
// To give a more "launchy" experience when using the NTP launcher, we close
// it automatically.
@@ -545,14 +779,16 @@ void AppLauncherHandler::HandleLaunchApp(const base::ListValue* args) {
if (browser)
old_contents = browser->tab_strip_model()->GetActiveWebContents();
- apps::AppLaunchParams params = CreateAppLaunchParamsUserContainer(
- profile, extension,
+ apps::AppLaunchParams params(
+ extension_id, launch_container,
old_contents ? WindowOpenDisposition::CURRENT_TAB
: WindowOpenDisposition::NEW_FOREGROUND_TAB,
extensions::AppLaunchSource::kSourceNewTabPage);
params.override_url = override_url;
WebContents* new_contents =
- apps::LaunchService::Get(profile)->OpenApplication(params);
+ apps::AppServiceProxyFactory::GetForProfile(profile)
+ ->BrowserAppLauncher()
+ .LaunchAppWithParams(params);
// This will also destroy the handler, so do not perform any actions after.
if (new_contents != old_contents && browser &&
@@ -563,37 +799,102 @@ void AppLauncherHandler::HandleLaunchApp(const base::ListValue* args) {
}
void AppLauncherHandler::HandleSetLaunchType(const base::ListValue* args) {
- std::string extension_id;
- double launch_type;
- CHECK(args->GetString(0, &extension_id));
- CHECK(args->GetDouble(1, &launch_type));
+ std::string app_id;
+ double launch_type_double;
+ CHECK(args->GetString(0, &app_id));
+ CHECK(args->GetDouble(1, &launch_type_double));
+ extensions::LaunchType launch_type =
+ static_cast<extensions::LaunchType>(static_cast<int>(launch_type_double));
+
+ if (web_app_provider_->registrar().IsInstalled(app_id)) {
+ // Don't update the page; it already knows about the launch type change.
+ base::AutoReset<bool> auto_reset(&ignore_changes_, true);
+ web_app::DisplayMode display_mode = web_app::DisplayMode::kBrowser;
+ switch (launch_type) {
+ case extensions::LAUNCH_TYPE_FULLSCREEN:
+ display_mode = web_app::DisplayMode::kFullscreen;
+ break;
+ case extensions::LAUNCH_TYPE_WINDOW:
+ display_mode = web_app::DisplayMode::kStandalone;
+ break;
+ case extensions::LAUNCH_TYPE_PINNED:
+ case extensions::LAUNCH_TYPE_REGULAR:
+ display_mode = web_app::DisplayMode::kBrowser;
+ break;
+ case extensions::LAUNCH_TYPE_INVALID:
+ case extensions::NUM_LAUNCH_TYPES:
+ NOTREACHED();
+ break;
+ }
+
+ web_app_provider_->registry_controller().SetAppUserDisplayMode(
+ app_id, display_mode);
+ return;
+ }
const Extension* extension =
extensions::ExtensionRegistry::Get(extension_service_->profile())
- ->GetExtensionById(extension_id,
+ ->GetExtensionById(app_id,
extensions::ExtensionRegistry::ENABLED |
extensions::ExtensionRegistry::DISABLED |
extensions::ExtensionRegistry::TERMINATED);
if (!extension)
return;
+ DCHECK(!FromBookmark(extension));
// Don't update the page; it already knows about the launch type change.
base::AutoReset<bool> auto_reset(&ignore_changes_, true);
-
- extensions::SetLaunchType(
- Profile::FromWebUI(web_ui()), extension_id,
- static_cast<extensions::LaunchType>(static_cast<int>(launch_type)));
+ extensions::SetLaunchType(Profile::FromWebUI(web_ui()), app_id, launch_type);
}
void AppLauncherHandler::HandleUninstallApp(const base::ListValue* args) {
std::string extension_id;
CHECK(args->GetString(0, &extension_id));
+ if (web_app_provider_->registrar().IsInstalled(extension_id) &&
+ !IsYoutubeExtension(extension_id)) {
+ if (!extension_id_prompting_.empty())
+ return; // Only one prompt at a time.
+ if (!web_app_provider_->install_finalizer().CanUserUninstallExternalApp(
+ extension_id)) {
+ LOG(ERROR) << "Attempt to uninstall a webapp that is non-usermanagable "
+ << "was made. App id : " << extension_id;
+ return;
+ }
+
+ auto uninstall_success_callback = base::BindOnce(
+ [](base::WeakPtr<AppLauncherHandler> app_launcher_handler,
+ bool success) {
+ LOCAL_HISTOGRAM_BOOLEAN("Apps.Launcher.UninstallSuccess", success);
+ if (app_launcher_handler)
+ app_launcher_handler->CleanupAfterUninstall();
+ },
+ weak_ptr_factory_.GetWeakPtr());
+
+ extension_id_prompting_ = extension_id;
+ bool dont_confirm = false;
+ if (args->GetBoolean(1, &dont_confirm) && dont_confirm) {
+ base::AutoReset<bool> auto_reset(&ignore_changes_, true);
+ web_app_provider_->install_finalizer().UninstallExternalAppByUser(
+ extension_id_prompting_, std::move(uninstall_success_callback));
+ } else {
+ Browser* browser =
+ chrome::FindBrowserWithWebContents(web_ui()->GetWebContents());
+ web_app::WebAppUiManagerImpl::Get(Profile::FromWebUI(web_ui()))
+ ->dialog_manager()
+ .UninstallWebApp(
+ extension_id_prompting_,
+ web_app::WebAppDialogManager::UninstallSource::kAppsPage,
+ browser->window(), std::move(uninstall_success_callback));
+ }
+ return;
+ }
const Extension* extension =
ExtensionRegistry::Get(extension_service_->profile())
->GetInstalledExtension(extension_id);
if (!extension)
return;
+ DCHECK(!FromBookmark(extension));
if (!extensions::ExtensionSystem::Get(extension_service_->profile())
->management_policy()
@@ -623,51 +924,63 @@ void AppLauncherHandler::HandleUninstallApp(const base::ListValue* args) {
}
void AppLauncherHandler::HandleCreateAppShortcut(const base::ListValue* args) {
- std::string extension_id;
- CHECK(args->GetString(0, &extension_id));
+ std::string app_id;
+ CHECK(args->GetString(0, &app_id));
+
+ if (web_app_provider_->registrar().IsInstalled(app_id) &&
+ !IsYoutubeExtension(app_id)) {
+ Browser* browser =
+ chrome::FindBrowserWithWebContents(web_ui()->GetWebContents());
+ chrome::ShowCreateChromeAppShortcutsDialog(
+ browser->window()->GetNativeWindow(), browser->profile(), app_id,
+ base::BindRepeating([](bool success) {
+ LOCAL_HISTOGRAM_BOOLEAN(
+ "Apps.AppInfoDialog.CreateWebAppShortcutSuccess", success);
+ }));
+ return;
+ }
const Extension* extension =
extensions::ExtensionRegistry::Get(extension_service_->profile())
- ->GetExtensionById(extension_id,
+ ->GetExtensionById(app_id,
extensions::ExtensionRegistry::ENABLED |
extensions::ExtensionRegistry::DISABLED |
extensions::ExtensionRegistry::TERMINATED);
if (!extension)
return;
+ DCHECK(!FromBookmark(extension));
Browser* browser = chrome::FindBrowserWithWebContents(
web_ui()->GetWebContents());
chrome::ShowCreateChromeAppShortcutsDialog(
browser->window()->GetNativeWindow(), browser->profile(), extension,
- base::Callback<void(bool)>());
+ base::BindRepeating([](bool success) {
+ LOCAL_HISTOGRAM_BOOLEAN(
+ "Apps.AppInfoDialog.CreateExtensionShortcutSuccess", success);
+ }));
}
void AppLauncherHandler::HandleInstallAppLocally(const base::ListValue* args) {
- std::string extension_id;
- CHECK(args->GetString(0, &extension_id));
+ std::string app_id;
+ CHECK(args->GetString(0, &app_id));
- const Extension* extension =
- extensions::ExtensionRegistry::Get(extension_service_->profile())
- ->GetExtensionById(extension_id,
- extensions::ExtensionRegistry::ENABLED |
- extensions::ExtensionRegistry::DISABLED |
- extensions::ExtensionRegistry::TERMINATED);
- if (!extension)
+ if (!web_app_provider_->registrar().IsInstalled(app_id))
return;
- auto* profile = Profile::FromBrowserContext(
- web_ui()->GetWebContents()->GetBrowserContext());
- SetBookmarkAppIsLocallyInstalled(profile, extension, true);
- if (extensions::CanBookmarkAppCreateOsShortcuts()) {
- extensions::BookmarkAppCreateOsShortcuts(
- profile, extension, true /* add_to_desktop */,
- base::BindOnce(&AppLauncherHandler::
- OnExtensionShortcutsCreatedRegisterFileHandlers,
- weak_ptr_factory_.GetWeakPtr(), extension_id));
+ web_app_provider_->registry_controller().SetAppIsLocallyInstalled(app_id,
+ true);
+ web_app::AppShortcutManager& shortcut_manager =
+ web_app_provider_->shortcut_manager();
+ if (shortcut_manager.CanCreateShortcuts()) {
+ shortcut_manager.CreateShortcuts(
+ app_id, /*add_to_desktop=*/true,
+ base::BindOnce(
+ &AppLauncherHandler::OnShortcutsCreatedRegisterOsIntegration,
+ weak_ptr_factory_.GetWeakPtr(), app_id));
}
-
- // Use the appAdded to update the app icon's color to no longer be greyscale.
- std::unique_ptr<base::DictionaryValue> app_info(GetAppInfo(extension));
+ // Use the appAdded to update the app icon's color to no longer be
+ // greyscale.
+ std::unique_ptr<base::DictionaryValue> app_info = GetWebAppInfo(app_id);
if (app_info)
web_ui()->CallJavascriptFunctionUnsafe("ntp.appAdded", *app_info);
}
@@ -676,6 +989,14 @@ void AppLauncherHandler::HandleShowAppInfo(const base::ListValue* args) {
std::string extension_id;
CHECK(args->GetString(0, &extension_id));
+ if (web_app_provider_->registrar().IsInstalled(extension_id) &&
+ !IsYoutubeExtension(extension_id)) {
+ chrome::ShowSiteSettings(
+ chrome::FindBrowserWithWebContents(web_ui()->GetWebContents()),
+ web_app_provider_->registrar().GetAppLaunchURL(extension_id));
+ return;
+ }
+
const Extension* extension =
extensions::ExtensionRegistry::Get(extension_service_->profile())
->GetExtensionById(extension_id,
@@ -684,13 +1005,7 @@ void AppLauncherHandler::HandleShowAppInfo(const base::ListValue* args) {
extensions::ExtensionRegistry::TERMINATED);
if (!extension)
return;
-
- if (extension->is_hosted_app() && extension->from_bookmark()) {
- chrome::ShowSiteSettings(
- chrome::FindBrowserWithWebContents(web_ui()->GetWebContents()),
- extensions::AppLaunchInfo::GetFullLaunchURL(extension));
- return;
- }
+ DCHECK(!FromBookmark(extension));
UMA_HISTOGRAM_ENUMERATION("Apps.AppInfoDialog.Launches",
AppInfoLaunchSource::FROM_APPS_PAGE,
@@ -765,6 +1080,10 @@ void AppLauncherHandler::HandleGenerateAppForLink(const base::ListValue* args) {
CHECK(args->GetString(0, &url));
GURL launch_url(url);
+ // Can only install one app at a time.
+ if (attempting_web_app_install_page_ordinal_.has_value())
+ return;
+
base::string16 title;
CHECK(args->GetString(1, &title));
@@ -792,9 +1111,8 @@ void AppLauncherHandler::HandleGenerateAppForLink(const base::ListValue* args) {
favicon_service->GetFaviconImageForPageURL(
launch_url,
- base::Bind(&AppLauncherHandler::OnFaviconForApp,
- base::Unretained(this),
- base::Passed(&install_info)),
+ base::BindOnce(&AppLauncherHandler::OnFaviconForApp,
+ base::Unretained(this), base::Passed(&install_info)),
&cancelable_task_tracker_);
}
@@ -819,12 +1137,29 @@ void AppLauncherHandler::OnFaviconForApp(
image_result.image.AsBitmap();
}
- scoped_refptr<CrxInstaller> installer(
- CrxInstaller::CreateSilent(extension_service_));
- installer->set_error_on_unsupported_requirements(true);
- installer->set_page_ordinal(install_info->page_ordinal);
- installer->InstallWebApp(*web_app);
- attempted_bookmark_app_install_ = true;
+ attempting_web_app_install_page_ordinal_ = install_info->page_ordinal;
+
+ web_app::InstallManager::OnceInstallCallback install_complete_callback =
+ base::BindOnce(
+ [](base::WeakPtr<AppLauncherHandler> app_launcher_handler,
+ const web_app::AppId& app_id,
+ web_app::InstallResultCode install_result) {
+ LOCAL_HISTOGRAM_ENUMERATION(
+ "Apps.AppInfoDialog.InstallAppLocallyInstallResult",
+ install_result);
+ if (!app_launcher_handler)
+ return;
+ if (install_result !=
+ web_app::InstallResultCode::kSuccessNewInstall) {
+ app_launcher_handler->attempting_web_app_install_page_ordinal_ =
+ base::nullopt;
+ }
+ },
+ weak_ptr_factory_.GetWeakPtr());
+
+ web_app_provider_->install_manager().InstallWebAppFromInfo(
+ std::move(web_app), web_app::ForInstallableSite::kUnknown,
+ WebappInstallSource::SYNC, std::move(install_complete_callback));
}
void AppLauncherHandler::SetAppToBeHighlighted() {
@@ -851,19 +1186,25 @@ void AppLauncherHandler::PromptToEnableApp(const std::string& extension_id) {
if (!extension_id_prompting_.empty())
return; // Only one prompt at a time.
+ if (DesktopPWAsWithoutExtensions() &&
+ web_app_provider_->registrar().IsInstalled(extension_id_prompting_)) {
+ NOTIMPLEMENTED();
+ return;
+ }
+
extension_id_prompting_ = extension_id;
extension_enable_flow_ = std::make_unique<ExtensionEnableFlow>(
Profile::FromWebUI(web_ui()), extension_id, this);
extension_enable_flow_->StartForWebContents(web_ui()->GetWebContents());
}
-void AppLauncherHandler::OnExtensionShortcutsCreatedRegisterFileHandlers(
- const extensions::ExtensionId& extension_id,
- bool /*shortcuts_created*/) {
- auto* provider = web_app::WebAppProviderBase::GetProviderBase(
- extension_service_->profile());
- provider->file_handler_manager().EnableAndRegisterOsFileHandlers(
- extension_id);
+void AppLauncherHandler::OnShortcutsCreatedRegisterOsIntegration(
+ const web_app::AppId& app_id,
+ bool shortcuts_created) {
+ LOCAL_HISTOGRAM_BOOLEAN("Apps.Launcher.InstallLocallyShortcutsCreated",
+ shortcuts_created);
+ web_app_provider_->file_handler_manager().EnableAndRegisterOsFileHandlers(
+ app_id);
}
void AppLauncherHandler::OnExtensionUninstallDialogClosed(
@@ -889,6 +1230,12 @@ void AppLauncherHandler::ExtensionEnableFlowFinished() {
void AppLauncherHandler::ExtensionEnableFlowAborted(bool user_initiated) {
DCHECK_EQ(extension_id_prompting_, extension_enable_flow_->extension_id());
+ if (DesktopPWAsWithoutExtensions() &&
+ web_app_provider_->registrar().IsInstalled(extension_id_prompting_)) {
+ NOTIMPLEMENTED();
+ return;
+ }
+
// We record the histograms here because ExtensionUninstallCanceled is also
// called when the extension uninstall dialog is canceled.
const Extension* extension =
@@ -916,12 +1263,13 @@ AppLauncherHandler::CreateExtensionUninstallDialog() {
return extension_uninstall_dialog_.get();
}
-void AppLauncherHandler::AppRemoved(const Extension* extension,
- bool is_uninstall) {
+void AppLauncherHandler::ExtensionRemoved(const Extension* extension,
+ bool is_uninstall) {
+ DCHECK(!FromBookmark(extension));
if (!ShouldShow(extension))
return;
- std::unique_ptr<base::DictionaryValue> app_info(GetAppInfo(extension));
+ std::unique_ptr<base::DictionaryValue> app_info(GetExtensionInfo(extension));
if (!app_info.get())
return;
diff --git a/chromium/chrome/browser/ui/webui/ntp/app_launcher_handler.h b/chromium/chrome/browser/ui/webui/ntp/app_launcher_handler.h
index 00cf254bf45..c5d99409710 100644
--- a/chromium/chrome/browser/ui/webui/ntp/app_launcher_handler.h
+++ b/chromium/chrome/browser/ui/webui/ntp/app_launcher_handler.h
@@ -10,9 +10,14 @@
#include <string>
#include "base/macros.h"
+#include "base/optional.h"
+#include "base/scoped_observer.h"
#include "base/task/cancelable_task_tracker.h"
#include "chrome/browser/extensions/extension_uninstall_dialog.h"
#include "chrome/browser/ui/extensions/extension_enable_flow_delegate.h"
+#include "chrome/browser/web_applications/components/app_registrar.h"
+#include "chrome/browser/web_applications/components/app_registrar_observer.h"
+#include "chrome/browser/web_applications/components/web_app_id.h"
#include "chrome/common/extensions/extension_constants.h"
#include "components/favicon/core/favicon_service.h"
#include "components/prefs/pref_change_registrar.h"
@@ -29,7 +34,7 @@ class Profile;
namespace extensions {
class ExtensionService;
-}
+} // namespace extensions
namespace favicon_base {
struct FaviconImageResult;
@@ -39,25 +44,32 @@ namespace user_prefs {
class PrefRegistrySyncable;
}
+namespace web_app {
+class WebAppProvider;
+} // namespace web_app
+
// The handler for Javascript messages related to the "apps" view.
class AppLauncherHandler
: public content::WebUIMessageHandler,
public extensions::ExtensionUninstallDialog::Delegate,
public ExtensionEnableFlowDelegate,
public content::NotificationObserver,
+ public web_app::AppRegistrarObserver,
public extensions::ExtensionRegistryObserver {
public:
- explicit AppLauncherHandler(extensions::ExtensionService* extension_service);
+ AppLauncherHandler(extensions::ExtensionService* extension_service,
+ web_app::WebAppProvider* web_app_provider);
~AppLauncherHandler() override;
- // Populate a dictionary with the information from an extension.
- static void CreateAppInfo(const extensions::Extension* extension,
- extensions::ExtensionService* service,
- base::DictionaryValue* value);
+ void CreateWebAppInfo(const web_app::AppId& app_id,
+ base::DictionaryValue* value);
+
+ void CreateExtensionInfo(const extensions::Extension* extension,
+ base::DictionaryValue* value);
// Registers values (strings etc.) for the page.
static void GetLocalizedValues(Profile* profile,
- base::DictionaryValue* values);
+ base::DictionaryValue* values);
// Register per-profile preferences.
static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
@@ -80,14 +92,22 @@ class AppLauncherHandler
const extensions::Extension* extension,
extensions::UninstallReason reason) override;
+ // web_app::AppRegistrarObserver:
+ void OnWebAppInstalled(const web_app::AppId& app_id) override;
+ void OnWebAppUninstalled(const web_app::AppId& app_id) override;
+ void OnAppRegistrarDestroyed() override;
+
// Populate the given dictionary with all installed app info.
void FillAppDictionary(base::DictionaryValue* value);
- // Create a dictionary value for the given extension. May return null, e.g. if
- // the given extension is not an app.
- std::unique_ptr<base::DictionaryValue> GetAppInfo(
+ // Create a dictionary value for the given extension.
+ std::unique_ptr<base::DictionaryValue> GetExtensionInfo(
const extensions::Extension* extension);
+ // Create a dictionary value for the given web app.
+ std::unique_ptr<base::DictionaryValue> GetWebAppInfo(
+ const web_app::AppId& app_id);
+
// Populate the given dictionary with the web store promo content.
void FillPromoDictionary(base::DictionaryValue* value);
@@ -154,11 +174,10 @@ class AppLauncherHandler
// Prompts the user to re-enable the app for |extension_id|.
void PromptToEnableApp(const std::string& extension_id);
- // Registers file handlers for |extension_id|, after shortcuts have been
+ // Registers file handlers for |app_id|, after shortcuts have been
// created.
- void OnExtensionShortcutsCreatedRegisterFileHandlers(
- const extensions::ExtensionId& extension_id,
- bool shortcuts_created);
+ void OnShortcutsCreatedRegisterOsIntegration(const web_app::AppId& app_id,
+ bool shortcuts_created);
// ExtensionUninstallDialog::Delegate:
void OnExtensionUninstallDialogClosed(bool did_start_uninstall,
@@ -181,8 +200,10 @@ class AppLauncherHandler
void OnExtensionPreferenceChanged();
- // Called when an app is removed (unloaded or uninstalled). Updates the UI.
- void AppRemoved(const extensions::Extension* extension, bool is_uninstall);
+ // Called when an extension is removed (unloaded or uninstalled). Updates the
+ // UI.
+ void ExtensionRemoved(const extensions::Extension* extension,
+ bool is_uninstall);
// True if the extension should be displayed.
bool ShouldShow(const extensions::Extension* extension) const;
@@ -191,6 +212,14 @@ class AppLauncherHandler
// outlives us since it's owned by our containing profile.
extensions::ExtensionService* const extension_service_;
+ // The apps are represented in the web apps model, which outlives us since
+ // it's owned by our containing profile. Populated iff
+ // features::kDesktopPWAsWithoutExtensions is enabled.
+ web_app::WebAppProvider* const web_app_provider_;
+
+ ScopedObserver<web_app::AppRegistrar, web_app::AppRegistrarObserver>
+ web_apps_observer_{this};
+
// We monitor changes to the extension system so that we can reload the apps
// when necessary.
content::NotificationRegistrar registrar_;
@@ -219,9 +248,10 @@ class AppLauncherHandler
// refreshing. This is useful when making many batch updates to avoid flicker.
bool ignore_changes_;
- // When true, we have attempted to install a bookmark app, and are still
+ // When populated, we have attempted to install a bookmark app, and are still
// waiting to hear about success or failure from the extensions system.
- bool attempted_bookmark_app_install_;
+ base::Optional<syncer::StringOrdinal>
+ attempting_web_app_install_page_ordinal_;
// True if we have executed HandleGetApps() at least once.
bool has_loaded_apps_;
diff --git a/chromium/chrome/browser/ui/webui/ntp/cookie_controls_handler.cc b/chromium/chrome/browser/ui/webui/ntp/cookie_controls_handler.cc
index 8a7336be70b..41fd80239ea 100644
--- a/chromium/chrome/browser/ui/webui/ntp/cookie_controls_handler.cc
+++ b/chromium/chrome/browser/ui/webui/ntp/cookie_controls_handler.cc
@@ -13,6 +13,7 @@
#include "chrome/browser/ui/cookie_controls/cookie_controls_service.h"
#include "chrome/browser/ui/cookie_controls/cookie_controls_service_factory.h"
#include "chrome/common/chrome_features.h"
+#include "components/content_settings/core/common/cookie_controls_enforcement.h"
namespace {
static const char* kPolicyIcon = "cr20:domain";
diff --git a/chromium/chrome/browser/ui/webui/ntp/cookie_controls_handler.h b/chromium/chrome/browser/ui/webui/ntp/cookie_controls_handler.h
index c23870ee741..f7dbf79d4bd 100644
--- a/chromium/chrome/browser/ui/webui/ntp/cookie_controls_handler.h
+++ b/chromium/chrome/browser/ui/webui/ntp/cookie_controls_handler.h
@@ -9,6 +9,7 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/cookie_controls/cookie_controls_service.h"
+#include "components/content_settings/core/common/cookie_controls_enforcement.h"
#include "content/public/browser/web_ui_message_handler.h"
namespace base {
diff --git a/chromium/chrome/browser/ui/webui/ntp/new_tab_ui_browsertest.cc b/chromium/chrome/browser/ui/webui/ntp/new_tab_ui_browsertest.cc
index 0e019c935b0..89e417686ca 100644
--- a/chromium/chrome/browser/ui/webui/ntp/new_tab_ui_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/ntp/new_tab_ui_browsertest.cc
@@ -16,6 +16,7 @@
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
#include "url/gurl.h"
diff --git a/chromium/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc b/chromium/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc
index 84c088a6617..f796da4afea 100644
--- a/chromium/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc
+++ b/chromium/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc
@@ -41,6 +41,7 @@
#include "chrome/grit/generated_resources.h"
#include "chrome/grit/theme_resources.h"
#include "components/bookmarks/common/bookmark_pref_names.h"
+#include "components/content_settings/core/common/cookie_controls_enforcement.h"
#include "components/content_settings/core/common/features.h"
#include "components/content_settings/core/common/pref_names.h"
#include "components/google/core/common/google_util.h"
@@ -316,10 +317,10 @@ void NTPResourceCache::CreateNewTabIncognitoHTML() {
replacements["cookieControlsDescription"] =
l10n_util::GetStringUTF8(IDS_NEW_TAB_OTR_THIRD_PARTY_COOKIE_SUBLABEL);
// Ensure passing off-the-record profile; |profile_| might not be incognito.
- DCHECK(profile_->HasOffTheRecordProfile());
+ DCHECK(profile_->HasPrimaryOTRProfile());
replacements["cookieControlsToggleChecked"] =
CookieControlsServiceFactory::GetForProfile(
- profile_->GetOffTheRecordProfile())
+ profile_->GetPrimaryOTRProfile())
->GetToggleCheckedValue()
? "checked"
: "";
@@ -539,7 +540,7 @@ void NTPResourceCache::CreateNewTabHTML() {
void NTPResourceCache::CreateNewTabIncognitoCSS() {
const ui::ThemeProvider& tp = ThemeService::GetThemeProviderForProfile(
- profile_->GetOffTheRecordProfile());
+ profile_->GetPrimaryOTRProfile());
// Generate the replacements.
ui::TemplateReplacements substitutions;
diff --git a/chromium/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.cc b/chromium/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.cc
index 42d74ba9f32..9050cdd8f65 100644
--- a/chromium/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.cc
+++ b/chromium/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.cc
@@ -108,8 +108,9 @@ void OfflineInternalsUIMessageHandler::HandleDeleteSelectedPages(
criteria.offline_ids = std::move(offline_ids);
offline_page_model_->DeletePagesWithCriteria(
criteria,
- base::Bind(&OfflineInternalsUIMessageHandler::HandleDeletedPagesCallback,
- weak_ptr_factory_.GetWeakPtr(), callback_id));
+ base::BindOnce(
+ &OfflineInternalsUIMessageHandler::HandleDeletedPagesCallback,
+ weak_ptr_factory_.GetWeakPtr(), callback_id));
}
void OfflineInternalsUIMessageHandler::HandleDeleteSelectedRequests(
@@ -133,7 +134,7 @@ void OfflineInternalsUIMessageHandler::HandleDeleteSelectedRequests(
if (request_coordinator_) {
request_coordinator_->RemoveRequests(
offline_ids,
- base::Bind(
+ base::BindOnce(
&OfflineInternalsUIMessageHandler::HandleDeletedRequestsCallback,
weak_ptr_factory_.GetWeakPtr(), callback_id));
}
@@ -228,9 +229,9 @@ void OfflineInternalsUIMessageHandler::HandleGetStoredPages(
CHECK(args->GetString(0, &callback_id));
if (offline_page_model_) {
- offline_page_model_->GetAllPages(
- base::Bind(&OfflineInternalsUIMessageHandler::HandleStoredPagesCallback,
- weak_ptr_factory_.GetWeakPtr(), callback_id));
+ offline_page_model_->GetAllPages(base::BindOnce(
+ &OfflineInternalsUIMessageHandler::HandleStoredPagesCallback,
+ weak_ptr_factory_.GetWeakPtr(), callback_id));
} else {
base::ListValue results;
ResolveJavascriptCallback(base::Value(callback_id), results);
@@ -540,7 +541,7 @@ void OfflineInternalsUIMessageHandler::HandleAddToRequestQueue(
id_stream.str());
request_coordinator_->SavePageLater(
params,
- base::Bind(
+ base::BindOnce(
&OfflineInternalsUIMessageHandler::HandleSavePageLaterCallback,
weak_ptr_factory_.GetWeakPtr(), callback_id));
} else {
diff --git a/chromium/chrome/browser/ui/webui/omnibox/omnibox_ui.cc b/chromium/chrome/browser/ui/webui/omnibox/omnibox_ui.cc
index a93133375f3..419accaadad 100644
--- a/chromium/chrome/browser/ui/webui/omnibox/omnibox_ui.cc
+++ b/chromium/chrome/browser/ui/webui/omnibox/omnibox_ui.cc
@@ -12,6 +12,7 @@
#include "chrome/browser/ui/webui/omnibox/omnibox_page_handler.h"
#include "chrome/browser/ui/webui/version_handler.h"
#include "chrome/browser/ui/webui/version_ui.h"
+#include "chrome/browser/ui/webui/webui_util.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/omnibox_resources.h"
#include "components/omnibox/common/omnibox_features.h"
@@ -33,19 +34,21 @@ OmniboxUI::OmniboxUI(content::WebUI* web_ui)
VersionUI::AddVersionDetailStrings(source);
source->UseStringsJs();
- source->AddResourcePath("omnibox.css", IDR_OMNIBOX_CSS);
- source->AddResourcePath("omnibox_input.css", IDR_OMNIBOX_INPUT_CSS);
- source->AddResourcePath("output_results_group.css",
- IDR_OUTPUT_RESULTS_GROUP_CSS);
- source->AddResourcePath("omnibox_output_column_widths.css",
- IDR_OMNIBOX_OUTPUT_COLUMN_WIDTHS_CSS);
- source->AddResourcePath("omnibox_element.js", IDR_OMNIBOX_ELEMENT_JS);
- source->AddResourcePath("omnibox_input.js", IDR_OMNIBOX_INPUT_JS);
- source->AddResourcePath("omnibox_output.js", IDR_OMNIBOX_OUTPUT_JS);
- source->AddResourcePath("omnibox.js", IDR_OMNIBOX_JS);
- source->AddResourcePath(
- "chrome/browser/ui/webui/omnibox/omnibox.mojom-lite.js",
- IDR_OMNIBOX_MOJO_JS);
+ static constexpr webui::ResourcePath kResources[] = {
+ {"omnibox.css", IDR_OMNIBOX_CSS},
+ {"omnibox_input.css", IDR_OMNIBOX_INPUT_CSS},
+ {"output_results_group.css", IDR_OUTPUT_RESULTS_GROUP_CSS},
+ {"omnibox_output_column_widths.css",
+ IDR_OMNIBOX_OUTPUT_COLUMN_WIDTHS_CSS},
+ {"omnibox_element.js", IDR_OMNIBOX_ELEMENT_JS},
+ {"omnibox_input.js", IDR_OMNIBOX_INPUT_JS},
+ {"omnibox_output.js", IDR_OMNIBOX_OUTPUT_JS},
+ {"omnibox.js", IDR_OMNIBOX_JS},
+ {"chrome/browser/ui/webui/omnibox/omnibox.mojom-lite.js",
+ IDR_OMNIBOX_MOJO_JS},
+ };
+ webui::AddResourcePathsBulk(source, kResources);
+
source->SetDefaultResource(IDR_OMNIBOX_HTML);
#if !defined(OS_ANDROID)
diff --git a/chromium/chrome/browser/ui/webui/policy_ui.cc b/chromium/chrome/browser/ui/webui/policy_ui.cc
index 7695bbf055d..7509acf1b70 100644
--- a/chromium/chrome/browser/ui/webui/policy_ui.cc
+++ b/chromium/chrome/browser/ui/webui/policy_ui.cc
@@ -24,52 +24,55 @@ content::WebUIDataSource* CreatePolicyUIHtmlSource() {
PolicyUIHandler::AddCommonLocalizedStringsToSource(source);
static constexpr webui::LocalizedString kStrings[] = {
- // Localized strings (alphabetical order).
- {"exportPoliciesJSON", IDS_EXPORT_POLICIES_JSON},
- {"filterPlaceholder", IDS_POLICY_FILTER_PLACEHOLDER},
- {"hideExpandedStatus", IDS_POLICY_HIDE_EXPANDED_STATUS},
- {"isAffiliatedYes", IDS_POLICY_IS_AFFILIATED_YES},
- {"isAffiliatedNo", IDS_POLICY_IS_AFFILIATED_NO},
- {"labelAssetId", IDS_POLICY_LABEL_ASSET_ID},
- {"labelClientId", IDS_POLICY_LABEL_CLIENT_ID},
- {"labelDirectoryApiId", IDS_POLICY_LABEL_DIRECTORY_API_ID},
- {"labelEnterpriseDisplayDomain",
- IDS_POLICY_LABEL_ENTERPRISE_DISPLAY_DOMAIN},
- {"labelEnterpriseEnrollmentDomain",
- IDS_POLICY_LABEL_ENTERPRISE_ENROLLMENT_DOMAIN},
- {"labelGaiaId", IDS_POLICY_LABEL_GAIA_ID},
- {"labelIsAffiliated", IDS_POLICY_LABEL_IS_AFFILIATED},
- {"labelLocation", IDS_POLICY_LABEL_LOCATION},
- {"labelMachineEnrollmentDomain",
- IDS_POLICY_LABEL_MACHINE_ENROLLMENT_DOMAIN},
- {"labelMachineEnrollmentMachineName",
- IDS_POLICY_LABEL_MACHINE_ENROLLMENT_MACHINE_NAME},
- {"labelMachineEnrollmentToken",
- IDS_POLICY_LABEL_MACHINE_ENROLLMENT_TOKEN},
- {"labelMachineEntrollmentDeviceId",
- IDS_POLICY_LABEL_MACHINE_ENROLLMENT_DEVICE_ID},
- {"labelIsOffHoursActive", IDS_POLICY_LABEL_IS_OFFHOURS_ACTIVE},
- {"labelPoliciesPush", IDS_POLICY_LABEL_PUSH_POLICIES},
- {"labelRefreshInterval", IDS_POLICY_LABEL_REFRESH_INTERVAL},
- {"labelStatus", IDS_POLICY_LABEL_STATUS},
- {"labelTimeSinceLastRefresh", IDS_POLICY_LABEL_TIME_SINCE_LAST_REFRESH},
- {"labelUsername", IDS_POLICY_LABEL_USERNAME},
- {"noPoliciesSet", IDS_POLICY_NO_POLICIES_SET},
- {"offHoursActive", IDS_POLICY_OFFHOURS_ACTIVE},
- {"offHoursNotActive", IDS_POLICY_OFFHOURS_NOT_ACTIVE},
- {"policiesPushOff", IDS_POLICY_PUSH_POLICIES_OFF},
- {"policiesPushOn", IDS_POLICY_PUSH_POLICIES_ON},
- {"policyLearnMore", IDS_POLICY_LEARN_MORE},
- {"reloadPolicies", IDS_POLICY_RELOAD_POLICIES},
- {"showExpandedStatus", IDS_POLICY_SHOW_EXPANDED_STATUS},
- {"showLess", IDS_POLICY_SHOW_LESS},
- {"showMore", IDS_POLICY_SHOW_MORE},
- {"showUnset", IDS_POLICY_SHOW_UNSET},
- {"signinProfile", IDS_POLICY_SIGNIN_PROFILE},
- {"status", IDS_POLICY_STATUS},
- {"statusDevice", IDS_POLICY_STATUS_DEVICE},
- {"statusMachine", IDS_POLICY_STATUS_MACHINE},
- {"statusUser", IDS_POLICY_STATUS_USER},
+ // Localized strings (alphabetical order).
+ {"exportPoliciesJSON", IDS_EXPORT_POLICIES_JSON},
+ {"filterPlaceholder", IDS_POLICY_FILTER_PLACEHOLDER},
+ {"hideExpandedStatus", IDS_POLICY_HIDE_EXPANDED_STATUS},
+ {"isAffiliatedYes", IDS_POLICY_IS_AFFILIATED_YES},
+ {"isAffiliatedNo", IDS_POLICY_IS_AFFILIATED_NO},
+ {"labelAssetId", IDS_POLICY_LABEL_ASSET_ID},
+ {"labelClientId", IDS_POLICY_LABEL_CLIENT_ID},
+ {"labelDirectoryApiId", IDS_POLICY_LABEL_DIRECTORY_API_ID},
+ {"labelEnterpriseDisplayDomain",
+ IDS_POLICY_LABEL_ENTERPRISE_DISPLAY_DOMAIN},
+ {"labelEnterpriseEnrollmentDomain",
+ IDS_POLICY_LABEL_ENTERPRISE_ENROLLMENT_DOMAIN},
+ {"labelGaiaId", IDS_POLICY_LABEL_GAIA_ID},
+ {"labelIsAffiliated", IDS_POLICY_LABEL_IS_AFFILIATED},
+ {"labelLocation", IDS_POLICY_LABEL_LOCATION},
+ {"labelMachineEnrollmentDomain",
+ IDS_POLICY_LABEL_MACHINE_ENROLLMENT_DOMAIN},
+ {"labelMachineEnrollmentMachineName",
+ IDS_POLICY_LABEL_MACHINE_ENROLLMENT_MACHINE_NAME},
+ {"labelMachineEnrollmentToken", IDS_POLICY_LABEL_MACHINE_ENROLLMENT_TOKEN},
+ {"labelMachineEntrollmentDeviceId",
+ IDS_POLICY_LABEL_MACHINE_ENROLLMENT_DEVICE_ID},
+ {"labelIsOffHoursActive", IDS_POLICY_LABEL_IS_OFFHOURS_ACTIVE},
+ {"labelPoliciesPush", IDS_POLICY_LABEL_PUSH_POLICIES},
+ {"labelRefreshInterval", IDS_POLICY_LABEL_REFRESH_INTERVAL},
+ {"labelStatus", IDS_POLICY_LABEL_STATUS},
+ {"labelTimeSinceLastRefresh", IDS_POLICY_LABEL_TIME_SINCE_LAST_REFRESH},
+ {"labelUsername", IDS_POLICY_LABEL_USERNAME},
+ {"labelVersion", IDS_POLICY_LABEL_VERSION},
+ {"noPoliciesSet", IDS_POLICY_NO_POLICIES_SET},
+ {"offHoursActive", IDS_POLICY_OFFHOURS_ACTIVE},
+ {"offHoursNotActive", IDS_POLICY_OFFHOURS_NOT_ACTIVE},
+ {"policiesPushOff", IDS_POLICY_PUSH_POLICIES_OFF},
+ {"policiesPushOn", IDS_POLICY_PUSH_POLICIES_ON},
+ {"policyLearnMore", IDS_POLICY_LEARN_MORE},
+ {"reloadPolicies", IDS_POLICY_RELOAD_POLICIES},
+ {"showExpandedStatus", IDS_POLICY_SHOW_EXPANDED_STATUS},
+ {"showLess", IDS_POLICY_SHOW_LESS},
+ {"showMore", IDS_POLICY_SHOW_MORE},
+ {"showUnset", IDS_POLICY_SHOW_UNSET},
+ {"signinProfile", IDS_POLICY_SIGNIN_PROFILE},
+ {"status", IDS_POLICY_STATUS},
+ {"statusDevice", IDS_POLICY_STATUS_DEVICE},
+ {"statusMachine", IDS_POLICY_STATUS_MACHINE},
+#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
+ {"statusUpdater", IDS_POLICY_STATUS_UPDATER},
+#endif
+ {"statusUser", IDS_POLICY_STATUS_USER},
};
AddLocalizedStringsBulk(source, kStrings);
diff --git a/chromium/chrome/browser/ui/webui/policy_ui_browsertest.cc b/chromium/chrome/browser/ui/webui/policy_ui_browsertest.cc
index af6412c0f1b..23e9a1e1353 100644
--- a/chromium/chrome/browser/ui/webui/policy_ui_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/policy_ui_browsertest.cc
@@ -39,6 +39,7 @@
#include "components/policy/policy_constants.h"
#include "components/strings/grit/components_strings.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "extensions/common/extension_builder.h"
#include "extensions/common/features/simple_feature.h"
@@ -665,7 +666,7 @@ IN_PROC_BROWSER_TEST_P(ExtensionPolicyUITest,
const std::string schema_file = "schema.json";
base::FilePath schema_path = temp_dir_.GetPath().AppendASCII(schema_file);
- base::WriteFile(schema_path, json_data.data(), json_data.size());
+ base::WriteFile(schema_path, json_data);
// Build extension that contains the policy schema.
extensions::DictionaryBuilder storage;
diff --git a/chromium/chrome/browser/ui/webui/policy_ui_handler.cc b/chromium/chrome/browser/ui/webui/policy_ui_handler.cc
index d117f23c2de..d649be05f2f 100644
--- a/chromium/chrome/browser/ui/webui/policy_ui_handler.cc
+++ b/chromium/chrome/browser/ui/webui/policy_ui_handler.cc
@@ -11,12 +11,13 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/callback.h"
+#include "base/check.h"
#include "base/compiler_specific.h"
#include "base/files/file_util.h"
#include "base/json/json_writer.h"
-#include "base/logging.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
+#include "base/notreached.h"
#include "base/strings/string16.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
@@ -106,7 +107,11 @@
#endif
#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
+#include <DSRole.h>
+
#include "chrome/browser/google/google_update_policy_fetcher_win.h"
+#include "chrome/install_static/install_util.h"
+#include "components/update_client/updater_state.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#endif // defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
@@ -437,6 +442,23 @@ class DeviceActiveDirectoryPolicyStatusProvider
};
#endif
+#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
+class UpdaterStatusProvider : public PolicyStatusProvider {
+ public:
+ UpdaterStatusProvider();
+ ~UpdaterStatusProvider() override = default;
+ void GetStatus(base::DictionaryValue* dict) override;
+
+ private:
+ static std::string FetchActiveDirectoryDomain();
+ void OnDomainReceived(std::string domain);
+
+ std::string version_;
+ std::string domain_;
+ base::WeakPtrFactory<UpdaterStatusProvider> weak_factory_{this};
+};
+#endif
+
PolicyStatusProvider::PolicyStatusProvider() {}
PolicyStatusProvider::~PolicyStatusProvider() {}
@@ -709,6 +731,51 @@ void DeviceActiveDirectoryPolicyStatusProvider::GetStatus(
#endif // defined(OS_CHROMEOS)
+#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
+UpdaterStatusProvider::UpdaterStatusProvider() {
+ auto state =
+ update_client::UpdaterState::GetState(install_static::IsSystemInstall());
+ const auto& version = state->find("version");
+ if (version != state->end())
+ version_ = version->second;
+
+ base::ThreadPool::PostTaskAndReplyWithResult(
+ FROM_HERE,
+ {base::ThreadPool(), base::MayBlock(),
+ base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
+ base::BindOnce(&UpdaterStatusProvider::FetchActiveDirectoryDomain),
+ base::BindOnce(&UpdaterStatusProvider::OnDomainReceived,
+ weak_factory_.GetWeakPtr()));
+}
+
+void UpdaterStatusProvider::GetStatus(base::DictionaryValue* dict) {
+ if (!version_.empty())
+ dict->SetString("version", version_);
+ if (!domain_.empty())
+ dict->SetString("domain", domain_);
+}
+
+// static
+std::string UpdaterStatusProvider::FetchActiveDirectoryDomain() {
+ std::string domain;
+ ::DSROLE_PRIMARY_DOMAIN_INFO_BASIC* info = nullptr;
+ if (::DsRoleGetPrimaryDomainInformation(nullptr,
+ ::DsRolePrimaryDomainInfoBasic,
+ (PBYTE*)&info) != ERROR_SUCCESS) {
+ return domain;
+ }
+ if (info->DomainNameDns)
+ domain = base::WideToUTF8(info->DomainNameDns);
+ ::DsRoleFreeMemory(info);
+ return domain;
+}
+
+void UpdaterStatusProvider::OnDomainReceived(std::string domain) {
+ domain_ = std::move(domain);
+ NotifyStatusChange();
+}
+#endif
+
PolicyUIHandler::PolicyUIHandler() {}
PolicyUIHandler::~PolicyUIHandler() {
@@ -821,6 +888,7 @@ void PolicyUIHandler::RegisterMessages() {
#endif // defined(OS_CHROMEOS)
#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
+ updater_status_provider_ = std::make_unique<UpdaterStatusProvider>();
base::PostTaskAndReplyWithResult(
base::ThreadPool::CreateCOMSTATaskRunner(
{base::TaskPriority::USER_BLOCKING,
@@ -837,12 +905,15 @@ void PolicyUIHandler::RegisterMessages() {
device_status_provider_ = std::make_unique<PolicyStatusProvider>();
if (!machine_status_provider_.get())
machine_status_provider_ = std::make_unique<PolicyStatusProvider>();
+ if (!updater_status_provider_.get())
+ updater_status_provider_ = std::make_unique<PolicyStatusProvider>();
auto update_callback(base::BindRepeating(&PolicyUIHandler::SendStatus,
base::Unretained(this)));
user_status_provider_->SetStatusChangeCallback(update_callback);
device_status_provider_->SetStatusChangeCallback(update_callback);
machine_status_provider_->SetStatusChangeCallback(update_callback);
+ updater_status_provider_->SetStatusChangeCallback(update_callback);
GetPolicyService()->AddObserver(policy::POLICY_DOMAIN_CHROME, this);
GetPolicyService()->AddObserver(policy::POLICY_DOMAIN_EXTENSIONS, this);
@@ -1032,6 +1103,10 @@ void PolicyUIHandler::SendStatus() {
new base::DictionaryValue);
machine_status_provider_->GetStatus(machine_status.get());
+ std::unique_ptr<base::DictionaryValue> updater_status(
+ new base::DictionaryValue);
+ updater_status_provider_->GetStatus(updater_status.get());
+
base::DictionaryValue status;
if (!device_status->empty())
status.Set("device", std::move(device_status));
@@ -1039,6 +1114,8 @@ void PolicyUIHandler::SendStatus() {
status.Set("machine", std::move(machine_status));
if (!user_status->empty())
status.Set("user", std::move(user_status));
+ if (!updater_status->empty())
+ status.Set("updater", std::move(updater_status));
FireWebUIListener("status-updated", status);
}
@@ -1097,7 +1174,7 @@ void PolicyUIHandler::HandleReloadPolicies(const base::ListValue* args) {
}
}
#endif
- GetPolicyService()->RefreshPolicies(base::Bind(
+ GetPolicyService()->RefreshPolicies(base::BindOnce(
&PolicyUIHandler::OnRefreshPoliciesDone, weak_factory_.GetWeakPtr()));
}
diff --git a/chromium/chrome/browser/ui/webui/policy_ui_handler.h b/chromium/chrome/browser/ui/webui/policy_ui_handler.h
index dcba4d6d7cb..e73ced252f6 100644
--- a/chromium/chrome/browser/ui/webui/policy_ui_handler.h
+++ b/chromium/chrome/browser/ui/webui/policy_ui_handler.h
@@ -122,6 +122,7 @@ class PolicyUIHandler : public content::WebUIMessageHandler,
std::unique_ptr<PolicyStatusProvider> user_status_provider_;
std::unique_ptr<PolicyStatusProvider> device_status_provider_;
std::unique_ptr<PolicyStatusProvider> machine_status_provider_;
+ std::unique_ptr<PolicyStatusProvider> updater_status_provider_;
#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
std::unique_ptr<policy::PolicyMap> updater_policies_;
diff --git a/chromium/chrome/browser/ui/webui/prefs_internals_browsertest.cc b/chromium/chrome/browser/ui/webui/prefs_internals_browsertest.cc
index 0d291bffb1d..593c34394ee 100644
--- a/chromium/chrome/browser/ui/webui/prefs_internals_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/prefs_internals_browsertest.cc
@@ -13,6 +13,7 @@
#include "chrome/test/base/ui_test_utils.h"
#include "components/prefs/pref_service.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "url/gurl.h"
@@ -35,7 +36,6 @@ IN_PROC_BROWSER_TEST_F(PrefsInternalsTest, TestPrefsAreServed) {
ASSERT_TRUE(web_contents);
EXPECT_EQ(kUrl, web_contents->GetLastCommittedURL());
EXPECT_FALSE(web_contents->IsCrashed());
- EXPECT_FALSE(web_contents->GetInterstitialPage());
// It's difficult to test the content of the page without duplicating the
// implementation, but we can at least assert that something is being shown.
diff --git a/chromium/chrome/browser/printing/print_dialog_cloud.cc b/chromium/chrome/browser/ui/webui/print_preview/cloud_print_signin.cc
index af444311aeb..d1fdcaf7032 100644
--- a/chromium/chrome/browser/printing/print_dialog_cloud.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/cloud_print_signin.cc
@@ -1,26 +1,23 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "chrome/browser/printing/print_dialog_cloud.h"
+#include "chrome/browser/ui/webui/print_preview/cloud_print_signin.h"
#include "base/bind.h"
#include "base/macros.h"
#include "base/threading/thread_task_runner_handle.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/signin/account_consistency_mode_manager.h"
#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_window.h"
#include "components/cloud_devices/common/cloud_devices_urls.h"
#include "components/google/core/common/google_util.h"
-#include "components/signin/public/base/signin_metrics.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_observer.h"
-namespace print_dialog_cloud {
+namespace printing {
namespace {
@@ -65,25 +62,15 @@ void CreateCloudPrintSigninTab(Browser* browser,
bool add_account,
base::OnceClosure callback) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
- if (AccountConsistencyModeManager::IsMirrorEnabledForProfile(
- browser->profile())) {
- browser->window()->ShowAvatarBubbleFromAvatarButton(
- add_account ? BrowserWindow::AVATAR_BUBBLE_MODE_ADD_ACCOUNT
- : BrowserWindow::AVATAR_BUBBLE_MODE_SIGNIN,
-
- signin_metrics::AccessPoint::ACCESS_POINT_CLOUD_PRINT, false);
- } else {
- GURL url = add_account ? cloud_devices::GetCloudPrintAddAccountURL()
- : cloud_devices::GetCloudPrintSigninURL();
- content::WebContents* web_contents =
- browser->OpenURL(content::OpenURLParams(
- google_util::AppendGoogleLocaleParam(
- url, g_browser_process->GetApplicationLocale()),
- content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
- ui::PAGE_TRANSITION_AUTO_BOOKMARK, false));
- // This observer will delete itself after destroying the WebContents.
- new SignInObserver(web_contents, std::move(callback));
- }
+ GURL url = add_account ? cloud_devices::GetCloudPrintAddAccountURL()
+ : cloud_devices::GetCloudPrintSigninURL();
+ content::WebContents* web_contents = browser->OpenURL(content::OpenURLParams(
+ google_util::AppendGoogleLocaleParam(
+ url, g_browser_process->GetApplicationLocale()),
+ content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
+ ui::PAGE_TRANSITION_AUTO_BOOKMARK, false));
+ // This observer will delete itself after destroying the WebContents.
+ new SignInObserver(web_contents, std::move(callback));
}
-} // namespace print_dialog_cloud
+} // namespace printing
diff --git a/chromium/chrome/browser/ui/webui/print_preview/cloud_print_signin.h b/chromium/chrome/browser/ui/webui/print_preview/cloud_print_signin.h
new file mode 100644
index 00000000000..70aaeeaa416
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/print_preview/cloud_print_signin.h
@@ -0,0 +1,22 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_PRINT_PREVIEW_CLOUD_PRINT_SIGNIN_H_
+#define CHROME_BROWSER_UI_WEBUI_PRINT_PREVIEW_CLOUD_PRINT_SIGNIN_H_
+
+#include "base/callback_forward.h"
+
+class Browser;
+
+namespace printing {
+
+// Creates a tab with Google 'sign in' or 'add account' page, based on
+// passed |add_account| value.
+void CreateCloudPrintSigninTab(Browser* browser,
+ bool add_account,
+ base::OnceClosure callback);
+
+} // namespace printing
+
+#endif // CHROME_BROWSER_UI_WEBUI_PRINT_PREVIEW_CLOUD_PRINT_SIGNIN_H_
diff --git a/chromium/chrome/browser/ui/webui/print_preview/cloud_printer_handler.cc b/chromium/chrome/browser/ui/webui/print_preview/cloud_printer_handler.cc
deleted file mode 100644
index c8d5070a3d6..00000000000
--- a/chromium/chrome/browser/ui/webui/print_preview/cloud_printer_handler.cc
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/webui/print_preview/cloud_printer_handler.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/values.h"
-
-namespace printing {
-
-CloudPrinterHandler::CloudPrinterHandler() {}
-
-CloudPrinterHandler::~CloudPrinterHandler() {}
-
-void CloudPrinterHandler::Reset() {}
-
-void CloudPrinterHandler::StartGetPrinters(
- AddedPrintersCallback added_printers_callback,
- GetPrintersDoneCallback done_callback) {
- // TODO(https://crbug.com/829414): Actually retrieve the printers
- std::move(done_callback).Run();
-}
-
-void CloudPrinterHandler::StartGetCapability(const std::string& destination_id,
- GetCapabilityCallback callback) {
- // TODO(https://crbug.com/829414): Get capabilities.
- std::move(callback).Run(base::Value());
-}
-
-void CloudPrinterHandler::StartPrint(
- const base::string16& job_title,
- base::Value settings,
- scoped_refptr<base::RefCountedMemory> print_data,
- PrintCallback callback) {
- // TODO(https://crbug.com/829414): Print to cloud print
- NOTIMPLEMENTED();
-}
-
-} // namespace printing
diff --git a/chromium/chrome/browser/ui/webui/print_preview/cloud_printer_handler.h b/chromium/chrome/browser/ui/webui/print_preview/cloud_printer_handler.h
deleted file mode 100644
index 71737d22eeb..00000000000
--- a/chromium/chrome/browser/ui/webui/print_preview/cloud_printer_handler.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_WEBUI_PRINT_PREVIEW_CLOUD_PRINTER_HANDLER_H_
-#define CHROME_BROWSER_UI_WEBUI_PRINT_PREVIEW_CLOUD_PRINTER_HANDLER_H_
-
-#include <memory>
-#include <string>
-
-#include "base/macros.h"
-#include "chrome/browser/ui/webui/print_preview/printer_handler.h"
-
-namespace printing {
-
-// Implementation of PrinterHandler interface
-class CloudPrinterHandler : public PrinterHandler {
- public:
- CloudPrinterHandler();
-
- ~CloudPrinterHandler() override;
-
- // PrinterHandler implementation:
- void Reset() override;
- void StartGetPrinters(AddedPrintersCallback added_printers_callback,
- GetPrintersDoneCallback done_callback) override;
- void StartGetCapability(const std::string& destination_id,
- GetCapabilityCallback callback) override;
- void StartPrint(const base::string16& job_title,
- base::Value settings,
- scoped_refptr<base::RefCountedMemory> print_data,
- PrintCallback callback) override;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(CloudPrinterHandler);
-};
-
-} // namespace printing
-
-#endif // CHROME_BROWSER_UI_WEBUI_PRINT_PREVIEW_CLOUD_PRINTER_HANDLER_H_
diff --git a/chromium/chrome/browser/ui/webui/print_preview/fake_print_render_frame.cc b/chromium/chrome/browser/ui/webui/print_preview/fake_print_render_frame.cc
index 5c9d71fd8e0..1ee0076b9c6 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/fake_print_render_frame.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/fake_print_render_frame.cc
@@ -24,6 +24,9 @@ void FakePrintRenderFrame::PrintRequestedPages() {}
void FakePrintRenderFrame::PrintForSystemDialog() {}
+void FakePrintRenderFrame::SetPrintPreviewUI(
+ mojo::PendingAssociatedRemote<mojom::PrintPreviewUI> preview) {}
+
void FakePrintRenderFrame::InitiatePrintPreview(
mojo::PendingAssociatedRemote<mojom::PrintRenderer> print_renderer,
bool has_selection) {}
diff --git a/chromium/chrome/browser/ui/webui/print_preview/fake_print_render_frame.h b/chromium/chrome/browser/ui/webui/print_preview/fake_print_render_frame.h
index fb66df20dd6..2bd75746885 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/fake_print_render_frame.h
+++ b/chromium/chrome/browser/ui/webui/print_preview/fake_print_render_frame.h
@@ -26,6 +26,8 @@ class FakePrintRenderFrame : public mojom::PrintRenderFrame {
// printing::mojom::PrintRenderFrame:
void PrintRequestedPages() override;
void PrintForSystemDialog() override;
+ void SetPrintPreviewUI(
+ mojo::PendingAssociatedRemote<mojom::PrintPreviewUI> preview) override;
void InitiatePrintPreview(
mojo::PendingAssociatedRemote<mojom::PrintRenderer> print_renderer,
bool has_selection) override;
diff --git a/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc b/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc
index 7fa87252fc3..13b13ff3ae5 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc
@@ -30,6 +30,7 @@
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/debug_daemon/debug_daemon_client.h"
#include "chromeos/printing/printer_configuration.h"
+#include "chromeos/printing/printer_translator.h"
#include "components/prefs/pref_service.h"
#include "components/printing/browser/printer_capabilities.h"
#include "content/public/browser/browser_task_traits.h"
@@ -238,6 +239,22 @@ void LocalPrinterHandlerChromeos::StartGetEulaUrl(
weak_factory_.GetWeakPtr(), std::move(cb)));
}
+void LocalPrinterHandlerChromeos::StartPrinterStatusRequest(
+ const std::string& printer_id,
+ PrinterStatusRequestCallback callback) {
+ printers_manager_->FetchPrinterStatus(
+ printer_id,
+ base::BindOnce(&LocalPrinterHandlerChromeos::OnPrinterStatusUpdated,
+ weak_factory_.GetWeakPtr(), std::move(callback)));
+}
+
+void LocalPrinterHandlerChromeos::OnPrinterStatusUpdated(
+ PrinterStatusRequestCallback callback,
+ const chromeos::CupsPrinterStatus& cups_printers_status) {
+ std::move(callback).Run(
+ CreateCupsPrinterStatusDictionary(cups_printers_status));
+}
+
void LocalPrinterHandlerChromeos::OnPrinterInstalled(
const chromeos::Printer& printer,
GetCapabilityCallback cb,
@@ -245,9 +262,7 @@ void LocalPrinterHandlerChromeos::OnPrinterInstalled(
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
if (result == chromeos::PrinterSetupResult::kSuccess) {
- printers_manager_->PrinterInstalled(
- printer, /*is_automatic=*/true,
- chromeos::PrinterSetupSource::kPrintPreview);
+ printers_manager_->PrinterInstalled(printer, /*is_automatic=*/true);
}
HandlePrinterSetup(printer, std::move(cb), printer.IsUsbProtocol(), result);
diff --git a/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.h b/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.h
index 4f77423b90e..b729f5fd49a 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.h
+++ b/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.h
@@ -54,6 +54,9 @@ class LocalPrinterHandlerChromeos : public PrinterHandler {
PrintCallback callback) override;
void StartGetEulaUrl(const std::string& destination_id,
GetEulaUrlCallback cb) override;
+ void StartPrinterStatusRequest(
+ const std::string& printer_id,
+ PrinterStatusRequestCallback callback) override;
private:
FRIEND_TEST_ALL_PREFIXES(LocalPrinterHandlerChromeosTest,
@@ -83,6 +86,10 @@ class LocalPrinterHandlerChromeos : public PrinterHandler {
bool record_usb_setup_source,
chromeos::PrinterSetupResult result);
+ void OnPrinterStatusUpdated(
+ PrinterStatusRequestCallback callback,
+ const chromeos::CupsPrinterStatus& cups_printers_status);
+
Profile* const profile_;
content::WebContents* const preview_web_contents_;
chromeos::CupsPrintersManager* printers_manager_;
diff --git a/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc b/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc
index 876b308dfd0..89955ca893c 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc
@@ -11,19 +11,23 @@
#include "base/logging.h"
#include "base/memory/ref_counted.h"
#include "base/memory/ref_counted_memory.h"
+#include "base/task/post_task.h"
#include "base/task/task_traits.h"
#include "base/task/thread_pool.h"
-#include "base/threading/scoped_blocking_call.h"
#include "build/build_config.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/ui/webui/print_preview/print_preview_utils.h"
#include "components/printing/browser/printer_capabilities.h"
+#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
-#include "printing/backend/print_backend.h"
#if defined(OS_MACOSX)
-#include "components/printing/browser/features.h"
#include "components/printing/browser/printer_capabilities_mac.h"
+#include "printing/printing_features.h"
+#endif
+
+#if defined(OS_WIN)
+#include "base/threading/thread_restrictions.h"
#endif
namespace printing {
@@ -32,24 +36,37 @@ namespace {
scoped_refptr<base::TaskRunner> CreatePrinterHandlerTaskRunner() {
// USER_VISIBLE because the result is displayed in the print preview dialog.
+#if !defined(OS_WIN)
static constexpr base::TaskTraits kTraits = {
base::MayBlock(), base::TaskPriority::USER_VISIBLE};
+#endif
#if defined(USE_CUPS)
// CUPS is thread safe.
return base::ThreadPool::CreateTaskRunner(kTraits);
#elif defined(OS_WIN)
- // Windows drivers are likely not thread-safe.
- return base::ThreadPool::CreateSingleThreadTaskRunner(kTraits);
+ // Windows drivers are likely not thread-safe and need to be accessed on the
+ // UI thread.
+ return base::CreateSingleThreadTaskRunner({content::BrowserThread::UI,
+ base::MayBlock(),
+ base::TaskPriority::USER_VISIBLE});
#else
// Be conservative on unsupported platforms.
return base::ThreadPool::CreateSingleThreadTaskRunner(kTraits);
#endif
}
-PrinterList EnumeratePrintersAsync(const std::string& locale) {
- base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
- base::BlockingType::MAY_BLOCK);
+} // namespace
+
+// static
+PrinterList LocalPrinterHandlerDefault::EnumeratePrintersAsync(
+ const std::string& locale) {
+#if defined(OS_WIN)
+ // Blocking is needed here because Windows printer drivers are oftentimes
+ // not thread-safe and have to be accessed on the UI thread.
+ base::ScopedAllowBlocking allow_blocking;
+#endif
+
scoped_refptr<PrintBackend> print_backend(
PrintBackend::CreateInstance(nullptr, locale));
@@ -58,16 +75,22 @@ PrinterList EnumeratePrintersAsync(const std::string& locale) {
return printer_list;
}
-base::Value FetchCapabilitiesAsync(const std::string& device_name,
- const std::string& locale) {
+// static
+base::Value LocalPrinterHandlerDefault::FetchCapabilitiesAsync(
+ const std::string& device_name,
+ const std::string& locale) {
PrinterSemanticCapsAndDefaults::Papers user_defined_papers;
#if defined(OS_MACOSX)
if (base::FeatureList::IsEnabled(features::kEnableCustomMacPaperSizes))
user_defined_papers = GetMacCustomPaperSizes();
#endif
- base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
- base::BlockingType::MAY_BLOCK);
+#if defined(OS_WIN)
+ // Blocking is needed here because Windows printer drivers are oftentimes
+ // not thread-safe and have to be accessed on the UI thread.
+ base::ScopedAllowBlocking allow_blocking;
+#endif
+
scoped_refptr<PrintBackend> print_backend(
PrintBackend::CreateInstance(nullptr, locale));
@@ -84,9 +107,15 @@ base::Value FetchCapabilitiesAsync(const std::string& device_name,
/*has_secure_protocol=*/false, print_backend);
}
-std::string GetDefaultPrinterAsync(const std::string& locale) {
- base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
- base::BlockingType::MAY_BLOCK);
+// static
+std::string LocalPrinterHandlerDefault::GetDefaultPrinterAsync(
+ const std::string& locale) {
+#if defined(OS_WIN)
+ // Blocking is needed here because Windows printer drivers are oftentimes
+ // not thread-safe and have to be accessed on the UI thread.
+ base::ScopedAllowBlocking allow_blocking;
+#endif
+
scoped_refptr<PrintBackend> print_backend(
PrintBackend::CreateInstance(nullptr, locale));
@@ -95,8 +124,6 @@ std::string GetDefaultPrinterAsync(const std::string& locale) {
return default_printer;
}
-} // namespace
-
LocalPrinterHandlerDefault::LocalPrinterHandlerDefault(
content::WebContents* preview_web_contents)
: preview_web_contents_(preview_web_contents),
diff --git a/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default.h b/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default.h
index 1f6d48aae7c..cb4a5775110 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default.h
+++ b/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_default.h
@@ -14,6 +14,7 @@
#include "base/strings/string16.h"
#include "base/values.h"
#include "chrome/browser/ui/webui/print_preview/printer_handler.h"
+#include "printing/backend/print_backend.h"
namespace base {
class TaskRunner;
@@ -44,6 +45,11 @@ class LocalPrinterHandlerDefault : public PrinterHandler {
PrintCallback callback) override;
private:
+ static PrinterList EnumeratePrintersAsync(const std::string& locale);
+ static base::Value FetchCapabilitiesAsync(const std::string& device_name,
+ const std::string& locale);
+ static std::string GetDefaultPrinterAsync(const std::string& locale);
+
content::WebContents* const preview_web_contents_;
// TaskRunner for blocking tasks. Threading behavior is platform-specific.
diff --git a/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc b/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc
index 394ce8f6601..c3a1e237fd6 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc
@@ -45,8 +45,8 @@
#include "url/gurl.h"
#if defined(OS_MACOSX)
-#include "components/printing/browser/features.h"
#include "components/printing/browser/printer_capabilities_mac.h"
+#include "printing/printing_features.h"
#endif
namespace printing {
diff --git a/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler_unittest.cc b/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler_unittest.cc
index 628284d278e..c037aa711f0 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler_unittest.cc
@@ -18,9 +18,9 @@
#if defined(OS_MACOSX)
#include "base/test/scoped_feature_list.h"
-#include "components/printing/browser/features.h"
#include "components/printing/browser/printer_capabilities_mac.h"
#include "printing/backend/print_backend.h"
+#include "printing/printing_features.h"
#include "ui/gfx/geometry/size.h"
#endif
diff --git a/chromium/chrome/browser/ui/webui/print_preview/policy_settings.cc b/chromium/chrome/browser/ui/webui/print_preview/policy_settings.cc
index 55818d2dff8..28088a6be76 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/policy_settings.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/policy_settings.cc
@@ -17,15 +17,15 @@ void PolicySettings::RegisterProfilePrefs(
registry->RegisterIntegerPref(prefs::kPrintingAllowedBackgroundGraphicsModes,
0);
registry->RegisterIntegerPref(prefs::kPrintingBackgroundGraphicsDefault, 0);
+ registry->RegisterDictionaryPref(prefs::kPrintingPaperSizeDefault);
#if defined(OS_CHROMEOS)
registry->RegisterIntegerPref(prefs::kPrintingAllowedColorModes, 0);
registry->RegisterIntegerPref(prefs::kPrintingAllowedDuplexModes, 0);
registry->RegisterIntegerPref(prefs::kPrintingAllowedPinModes, 0);
- registry->RegisterListPref(prefs::kPrintingAllowedPageSizes);
registry->RegisterIntegerPref(prefs::kPrintingColorDefault, 0);
registry->RegisterIntegerPref(prefs::kPrintingDuplexDefault, 0);
registry->RegisterIntegerPref(prefs::kPrintingPinDefault, 0);
- registry->RegisterDictionaryPref(prefs::kPrintingSizeDefault);
+ registry->RegisterIntegerPref(prefs::kPrintingMaxSheetsAllowed, -1);
#endif
}
diff --git a/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
index 113d34201f9..deefb421385 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
@@ -16,22 +16,18 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/command_line.h"
-#include "base/containers/flat_set.h"
#include "base/feature_list.h"
#include "base/i18n/number_formatting.h"
#include "base/json/json_reader.h"
#include "base/lazy_instance.h"
#include "base/macros.h"
#include "base/memory/ref_counted_memory.h"
-#include "base/metrics/histogram_functions.h"
-#include "base/metrics/histogram_macros.h"
#include "base/values.h"
#include "build/build_config.h"
#include "chrome/browser/app_mode/app_mode_utils.h"
#include "chrome/browser/bad_message.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/printing/background_printing_manager.h"
-#include "chrome/browser/printing/print_dialog_cloud.h"
#include "chrome/browser/printing/print_error_dialog.h"
#include "chrome/browser/printing/print_job_manager.h"
#include "chrome/browser/printing/print_preview_dialog_controller.h"
@@ -45,12 +41,13 @@
#include "chrome/browser/ui/browser_tabstrip.h"
#include "chrome/browser/ui/chrome_pages.h"
#include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
+#include "chrome/browser/ui/webui/print_preview/cloud_print_signin.h"
#include "chrome/browser/ui/webui/print_preview/pdf_printer_handler.h"
#include "chrome/browser/ui/webui/print_preview/policy_settings.h"
+#include "chrome/browser/ui/webui/print_preview/print_preview_metrics.h"
#include "chrome/browser/ui/webui/print_preview/print_preview_ui.h"
#include "chrome/browser/ui/webui/print_preview/printer_handler.h"
#include "chrome/common/buildflags.h"
-#include "chrome/common/chrome_features.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/cloud_print/cloud_print_constants.h"
#include "chrome/common/crash_keys.h"
@@ -74,8 +71,9 @@
#include "net/base/url_util.h"
#include "printing/backend/print_backend.h"
#include "printing/backend/print_backend_consts.h"
+#include "printing/backend/printing_restrictions.h"
#include "printing/buildflags/buildflags.h"
-#include "printing/print_settings.h"
+#include "printing/printing_utils.h"
#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
#include "third_party/icu/source/i18n/unicode/ulocdata.h"
@@ -84,6 +82,7 @@
#include "chrome/browser/device_identity/device_oauth2_token_service.h"
#include "chrome/browser/device_identity/device_oauth2_token_service_factory.h"
#include "chrome/browser/ui/settings_window_manager_chromeos.h"
+#include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h"
#include "chrome/browser/ui/webui/signin/inline_login_handler_dialog_chromeos.h"
#include "chromeos/printing/printer_configuration.h"
#include "components/signin/public/identity_manager/scope_set.h"
@@ -101,116 +100,29 @@ namespace {
// crbug.com/372240.
constexpr size_t kMaxCloudPrintPdfDataSizeInBytes = 80 * 1024 * 1024 / 2;
-// This enum is used to back an UMA histogram, and should therefore be treated
-// as append only.
-enum UserActionBuckets {
- PRINT_TO_PRINTER,
- PRINT_TO_PDF,
- CANCEL,
- FALLBACK_TO_ADVANCED_SETTINGS_DIALOG,
- PREVIEW_FAILED,
- PREVIEW_STARTED,
- INITIATOR_CRASHED_UNUSED,
- INITIATOR_CLOSED,
- PRINT_WITH_CLOUD_PRINT,
- PRINT_WITH_PRIVET,
- PRINT_WITH_EXTENSION,
- OPEN_IN_MAC_PREVIEW,
- PRINT_TO_GOOGLE_DRIVE,
- USERACTION_BUCKET_BOUNDARY
-};
-
-// This enum is used to back an UMA histogram, and should therefore be treated
-// as append only.
-enum PrintSettingsBuckets {
- LANDSCAPE = 0,
- PORTRAIT,
- COLOR,
- BLACK_AND_WHITE,
- COLLATE,
- SIMPLEX,
- DUPLEX,
- TOTAL,
- HEADERS_AND_FOOTERS,
- CSS_BACKGROUND,
- SELECTION_ONLY,
- EXTERNAL_PDF_PREVIEW_UNUSED,
- PAGE_RANGE,
- DEFAULT_MEDIA,
- NON_DEFAULT_MEDIA,
- COPIES,
- NON_DEFAULT_MARGINS,
- DISTILL_PAGE_UNUSED,
- SCALING,
- PRINT_AS_IMAGE,
- PAGES_PER_SHEET,
- FIT_TO_PAGE,
- DEFAULT_DPI,
- NON_DEFAULT_DPI,
- PIN,
- FIT_TO_PAPER,
- PRINT_SETTINGS_BUCKET_BOUNDARY
-};
-
-// This enum is used to back an UMA histogram, and should therefore be treated
-// as append only.
-enum PrintDocumentTypeBuckets {
- HTML_DOCUMENT = 0,
- PDF_DOCUMENT,
- PRINT_DOCUMENT_TYPE_BUCKET_BOUNDARY
-};
-
-void ReportUserActionHistogram(UserActionBuckets event) {
- UMA_HISTOGRAM_ENUMERATION("PrintPreview.UserAction", event,
- USERACTION_BUCKET_BOUNDARY);
-}
-
-void ReportPrintSettingHistogram(PrintSettingsBuckets setting) {
- UMA_HISTOGRAM_ENUMERATION("PrintPreview.PrintSettings", setting,
- PRINT_SETTINGS_BUCKET_BOUNDARY);
-}
-
-void ReportPrintDocumentTypeAndSizeHistograms(PrintDocumentTypeBuckets doctype,
- size_t average_page_size_in_kb) {
- base::UmaHistogramEnumeration("PrintPreview.PrintDocumentType", doctype,
- PRINT_DOCUMENT_TYPE_BUCKET_BOUNDARY);
- switch (doctype) {
- case HTML_DOCUMENT:
- base::UmaHistogramMemoryKB("PrintPreview.PrintDocumentSize.HTML",
- average_page_size_in_kb);
- break;
- case PDF_DOCUMENT:
- base::UmaHistogramMemoryKB("PrintPreview.PrintDocumentSize.PDF",
- average_page_size_in_kb);
- break;
- default:
- NOTREACHED();
- break;
- }
-}
-
PrinterType GetPrinterTypeForUserAction(UserActionBuckets user_action) {
switch (user_action) {
- case PRINT_WITH_PRIVET:
- return PrinterType::kPrivetPrinter;
- case PRINT_WITH_EXTENSION:
- return PrinterType::kExtensionPrinter;
- case PRINT_TO_PDF:
- return PrinterType::kPdfPrinter;
- case PRINT_TO_PRINTER:
- case FALLBACK_TO_ADVANCED_SETTINGS_DIALOG:
- case OPEN_IN_MAC_PREVIEW:
- return PrinterType::kLocalPrinter;
+ case UserActionBuckets::kPrintWithPrivet:
+ return PrinterType::kPrivet;
+ case UserActionBuckets::kPrintWithExtension:
+ return PrinterType::kExtension;
+ case UserActionBuckets::kPrintToPdf:
+ return PrinterType::kPdf;
+ case UserActionBuckets::kPrintToPrinter:
+ case UserActionBuckets::kFallbackToAdvancedSettingsDialog:
+ case UserActionBuckets::kOpenInMacPreview:
+ return PrinterType::kLocal;
default:
NOTREACHED();
- return PrinterType::kLocalPrinter;
+ return PrinterType::kLocal;
}
}
base::Value GetErrorValue(UserActionBuckets user_action,
base::StringPiece description) {
- return user_action == PRINT_WITH_PRIVET ? base::Value(-1)
- : base::Value(description);
+ return user_action == UserActionBuckets::kPrintWithPrivet
+ ? base::Value(-1)
+ : base::Value(description);
}
// Dictionary Fields for Print Preview initial settings. Keep in sync with
@@ -255,6 +167,15 @@ const char kHeaderFooter[] = "headerFooter";
// Name of a dictionary pref holding the policy value for the background
// graphics checkbox.
const char kCssBackground[] = "cssBackground";
+// Name of a dictionary pref holding the policy value for the paper size
+// setting.
+const char kMediaSize[] = "mediaSize";
+#if defined(OS_CHROMEOS)
+// Name of a dictionary field holding policy value for the setting.
+const char kValue[] = "value";
+// Name of a dictionary pref holding the policy value for the sheets number.
+const char kSheets[] = "sheets";
+#endif // defined(OS_CHROMEOS)
// Name of a dictionary field indicating whether the 'Save to PDF' destination
// is disabled.
const char kPdfPrinterDisabled[] = "pdfPrinterDisabled";
@@ -287,151 +208,28 @@ base::Value GetSettingsDictionary(const std::string& json_str) {
return std::move(*settings);
}
-// Track the popularity of print settings and report the stats.
-void ReportPrintSettingsStats(const base::Value& print_settings,
- const base::Value& preview_settings,
- bool is_pdf) {
- ReportPrintSettingHistogram(TOTAL);
-
- // Print settings can be categorized into 2 groups: settings that are applied
- // via preview generation (page range, selection, headers/footers, background
- // graphics, scaling, layout, page size, pages per sheet, fit to page,
- // margins, rasterize), and settings that are applied at the printer (color,
- // duplex, copies, collate, dpi). The former should be captured from the most
- // recent preview request, as some of them are set to dummy values in the
- // print ticket. Similarly, settings applied at the printer should be pulled
- // from the print ticket, as they may have dummy values in the preview
- // request.
- const base::Value* page_range_array =
- preview_settings.FindKey(kSettingPageRange);
- if (page_range_array && page_range_array->is_list() &&
- !page_range_array->GetList().empty()) {
- ReportPrintSettingHistogram(PAGE_RANGE);
- }
-
- const base::Value* media_size_value =
- preview_settings.FindKey(kSettingMediaSize);
- if (media_size_value && media_size_value->is_dict() &&
- !media_size_value->DictEmpty()) {
- if (media_size_value->FindBoolKey(kSettingMediaSizeIsDefault)
- .value_or(false)) {
- ReportPrintSettingHistogram(DEFAULT_MEDIA);
- } else {
- ReportPrintSettingHistogram(NON_DEFAULT_MEDIA);
- }
- }
-
- base::Optional<bool> landscape_opt =
- preview_settings.FindBoolKey(kSettingLandscape);
- if (landscape_opt)
- ReportPrintSettingHistogram(landscape_opt.value() ? LANDSCAPE : PORTRAIT);
-
- if (print_settings.FindIntKey(kSettingCopies).value_or(1) > 1)
- ReportPrintSettingHistogram(COPIES);
-
- if (preview_settings.FindIntKey(kSettingPagesPerSheet).value_or(1) != 1)
- ReportPrintSettingHistogram(PAGES_PER_SHEET);
-
- if (print_settings.FindBoolKey(kSettingCollate).value_or(false))
- ReportPrintSettingHistogram(COLLATE);
-
- base::Optional<int> duplex_mode_opt =
- print_settings.FindIntKey(kSettingDuplexMode);
- if (duplex_mode_opt)
- ReportPrintSettingHistogram(duplex_mode_opt.value() ? DUPLEX : SIMPLEX);
-
- base::Optional<int> color_mode_opt = print_settings.FindIntKey(kSettingColor);
- if (color_mode_opt.has_value()) {
- bool unknown_color_model = color_mode_opt.value() == UNKNOWN_COLOR_MODEL;
- if (!unknown_color_model) {
- base::Optional<bool> is_color =
- IsColorModelSelected(color_mode_opt.value());
- ReportPrintSettingHistogram(is_color.value() ? COLOR : BLACK_AND_WHITE);
- }
-
- // Record whether the printing backend does not understand the printer's
- // color capabilities. Do this only once per device.
- static base::NoDestructor<base::flat_set<std::string>> seen_devices;
- auto result =
- seen_devices->insert(*print_settings.FindStringKey(kSettingDeviceName));
- bool is_new_device = result.second;
- if (is_new_device) {
- base::UmaHistogramBoolean("Printing.CUPS.UnknownPpdColorModel",
- unknown_color_model);
- }
- }
-
- if (preview_settings.FindIntKey(kSettingMarginsType).value_or(0) != 0)
- ReportPrintSettingHistogram(NON_DEFAULT_MARGINS);
-
- if (preview_settings.FindBoolKey(kSettingHeaderFooterEnabled).value_or(false))
- ReportPrintSettingHistogram(HEADERS_AND_FOOTERS);
-
- if (preview_settings.FindBoolKey(kSettingShouldPrintBackgrounds)
- .value_or(false)) {
- ReportPrintSettingHistogram(CSS_BACKGROUND);
- }
-
- if (preview_settings.FindBoolKey(kSettingShouldPrintSelectionOnly)
- .value_or(false)) {
- ReportPrintSettingHistogram(SELECTION_ONLY);
- }
-
- if (preview_settings.FindBoolKey(kSettingRasterizePdf).value_or(false))
- ReportPrintSettingHistogram(PRINT_AS_IMAGE);
-
- ScalingType scaling_type =
- static_cast<ScalingType>(preview_settings.FindIntKey(kSettingScalingType)
- .value_or(ScalingType::DEFAULT));
- if (scaling_type == ScalingType::CUSTOM) {
- ReportPrintSettingHistogram(SCALING);
- }
-
- if (is_pdf) {
- if (scaling_type == ScalingType::FIT_TO_PAGE)
- ReportPrintSettingHistogram(FIT_TO_PAGE);
- else if (scaling_type == ScalingType::FIT_TO_PAPER)
- ReportPrintSettingHistogram(FIT_TO_PAPER);
- }
-
- if (print_settings.FindIntKey(kSettingDpiHorizontal).value_or(0) > 0 &&
- print_settings.FindIntKey(kSettingDpiVertical).value_or(0) > 0) {
- base::Optional<bool> is_default_opt =
- print_settings.FindBoolKey(kSettingDpiDefault);
- if (is_default_opt) {
- ReportPrintSettingHistogram(is_default_opt.value() ? DEFAULT_DPI
- : NON_DEFAULT_DPI);
- }
- }
-
-#if defined(OS_CHROMEOS)
- if (print_settings.FindStringKey(kSettingPinValue))
- ReportPrintSettingHistogram(PIN);
-#endif // defined(OS_CHROMEOS)
-}
-
UserActionBuckets DetermineUserAction(const base::Value& settings) {
#if defined(OS_MACOSX)
if (settings.FindKey(kSettingOpenPDFInPreview))
- return OPEN_IN_MAC_PREVIEW;
+ return UserActionBuckets::kOpenInMacPreview;
#endif
// This needs to be checked before checking for a cloud print ID, since a
// print ticket for printing to Drive will also contain a cloud print ID.
if (settings.FindBoolKey(kSettingPrintToGoogleDrive).value_or(false))
- return PRINT_TO_GOOGLE_DRIVE;
+ return UserActionBuckets::kPrintToGoogleDrive;
if (settings.FindKey(kSettingCloudPrintId))
- return PRINT_WITH_CLOUD_PRINT;
+ return UserActionBuckets::kPrintWithCloudPrint;
PrinterType type = static_cast<PrinterType>(
settings.FindIntKey(kSettingPrinterType).value());
switch (type) {
- case kPrivetPrinter:
- return PRINT_WITH_PRIVET;
- case kExtensionPrinter:
- return PRINT_WITH_EXTENSION;
- case kPdfPrinter:
- return PRINT_TO_PDF;
- case kLocalPrinter:
+ case PrinterType::kPrivet:
+ return UserActionBuckets::kPrintWithPrivet;
+ case PrinterType::kExtension:
+ return UserActionBuckets::kPrintWithExtension;
+ case PrinterType::kPdf:
+ return UserActionBuckets::kPrintToPdf;
+ case PrinterType::kLocal:
break;
default:
NOTREACHED();
@@ -439,8 +237,24 @@ UserActionBuckets DetermineUserAction(const base::Value& settings) {
}
if (settings.FindBoolKey(kSettingShowSystemDialog).value_or(false))
- return FALLBACK_TO_ADVANCED_SETTINGS_DIALOG;
- return PRINT_TO_PRINTER;
+ return UserActionBuckets::kFallbackToAdvancedSettingsDialog;
+ return UserActionBuckets::kPrintToPrinter;
+}
+
+base::Optional<gfx::Size> ParsePaperSize(const base::Value* paper_size_value) {
+ if (!paper_size_value || paper_size_value->DictEmpty())
+ return base::nullopt;
+
+ const base::Value* custom_size =
+ paper_size_value->FindKey(kPaperSizeCustomSize);
+ if (custom_size) {
+ return gfx::Size(*custom_size->FindIntKey(kPaperSizeWidth),
+ *custom_size->FindIntKey(kPaperSizeHeight));
+ }
+
+ const std::string* name = paper_size_value->FindStringKey(kPaperSizeName);
+ DCHECK(name);
+ return ParsePaper(*name).size_um;
}
base::Value GetPolicies(const PrefService& prefs) {
@@ -473,6 +287,32 @@ base::Value GetPolicies(const PrefService& prefs) {
if (!background_graphics_policy.DictEmpty())
policies.SetKey(kCssBackground, std::move(background_graphics_policy));
+ base::Value paper_size_policy(base::Value::Type::DICTIONARY);
+ if (prefs.HasPrefPath(prefs::kPrintingPaperSizeDefault)) {
+ base::Optional<gfx::Size> default_paper_size =
+ ParsePaperSize(prefs.Get(prefs::kPrintingPaperSizeDefault));
+ if (default_paper_size.has_value()) {
+ base::Value default_paper_size_value(base::Value::Type::DICTIONARY);
+ default_paper_size_value.SetIntKey(kPaperSizeWidth,
+ default_paper_size.value().width());
+ default_paper_size_value.SetIntKey(kPaperSizeHeight,
+ default_paper_size.value().height());
+ paper_size_policy.SetKey(kDefaultMode,
+ std::move(default_paper_size_value));
+ }
+ }
+ if (!paper_size_policy.DictEmpty())
+ policies.SetKey(kMediaSize, std::move(paper_size_policy));
+
+#if defined(OS_CHROMEOS)
+ if (prefs.HasPrefPath(prefs::kPrintingMaxSheetsAllowed)) {
+ base::Value sheets_policy(base::Value::Type::DICTIONARY);
+ sheets_policy.SetIntKey(kValue,
+ prefs.GetInteger(prefs::kPrintingMaxSheetsAllowed));
+ policies.SetKey(kSheets, std::move(sheets_policy));
+ }
+#endif // defined(OS_CHROMEOS)
+
return policies;
}
@@ -522,18 +362,11 @@ class PrintPreviewHandler::AccessTokenService
};
#endif // defined(OS_CHROMEOS)
-PrintPreviewHandler::PrintPreviewHandler()
- : regenerate_preview_request_count_(0),
- manage_printers_dialog_request_count_(0),
- reported_failed_preview_(false),
- has_logged_printers_count_(false),
- identity_manager_(nullptr) {
- ReportUserActionHistogram(PREVIEW_STARTED);
+PrintPreviewHandler::PrintPreviewHandler() {
+ ReportUserActionHistogram(UserActionBuckets::kPreviewStarted);
}
PrintPreviewHandler::~PrintPreviewHandler() {
- base::UmaHistogramCounts1M("PrintPreview.ManagePrinters",
- manage_printers_dialog_request_count_);
UnregisterForGaiaCookieChanges();
}
@@ -596,15 +429,19 @@ void PrintPreviewHandler::RegisterMessages() {
base::BindRepeating(
&PrintPreviewHandler::HandleGrantExtensionPrinterAccess,
base::Unretained(this)));
-#if defined(OS_CHROMEOS)
web_ui()->RegisterMessageCallback(
"openPrinterSettings",
base::BindRepeating(&PrintPreviewHandler::HandleOpenPrinterSettings,
base::Unretained(this)));
-
+#if defined(OS_CHROMEOS)
web_ui()->RegisterMessageCallback(
"getEulaUrl", base::BindRepeating(&PrintPreviewHandler::HandleGetEulaUrl,
base::Unretained(this)));
+ web_ui()->RegisterMessageCallback(
+ "requestPrinterStatus",
+ base::BindRepeating(
+ &PrintPreviewHandler::HandleRequestPrinterStatusUpdate,
+ base::Unretained(this)));
#endif
}
@@ -654,15 +491,15 @@ void PrintPreviewHandler::ReadPrinterTypeDenyListFromPrefs() {
// components/policy/resources/policy_templates.json
const std::string& deny_list_str = deny_list_type.GetString();
if (deny_list_str == "privet")
- printer_type_deny_list_.insert(kPrivetPrinter);
+ printer_type_deny_list_.insert(PrinterType::kPrivet);
else if (deny_list_str == "extension")
- printer_type_deny_list_.insert(kExtensionPrinter);
+ printer_type_deny_list_.insert(PrinterType::kExtension);
else if (deny_list_str == "pdf")
- printer_type_deny_list_.insert(kPdfPrinter);
+ printer_type_deny_list_.insert(PrinterType::kPdf);
else if (deny_list_str == "local")
- printer_type_deny_list_.insert(kLocalPrinter);
+ printer_type_deny_list_.insert(PrinterType::kLocal);
else if (deny_list_str == "cloud")
- printer_type_deny_list_.insert(kCloudPrinter);
+ printer_type_deny_list_.insert(PrinterType::kCloud);
}
}
@@ -739,11 +576,11 @@ void PrintPreviewHandler::HandleGrantExtensionPrinterAccess(
args->GetString(1, &printer_id) && !callback_id.empty();
DCHECK(ok);
- GetPrinterHandler(PrinterType::kExtensionPrinter)
- ->StartGrantPrinterAccess(
- printer_id,
- base::BindOnce(&PrintPreviewHandler::OnGotExtensionPrinterInfo,
- weak_factory_.GetWeakPtr(), callback_id));
+ PrinterHandler* handler = GetPrinterHandler(PrinterType::kExtension);
+ handler->StartGrantPrinterAccess(
+ printer_id,
+ base::BindOnce(&PrintPreviewHandler::OnGotExtensionPrinterInfo,
+ weak_factory_.GetWeakPtr(), callback_id));
}
void PrintPreviewHandler::HandleGetPrinterCapabilities(
@@ -810,7 +647,7 @@ void PrintPreviewHandler::HandleGetPreview(const base::ListValue* args) {
? PrintViewManager::FromWebContents(initiator)->print_preview_rfh()
: nullptr;
if (!rfh) {
- ReportUserActionHistogram(INITIATOR_CLOSED);
+ ReportUserActionHistogram(UserActionBuckets::kInitiatorClosed);
print_preview_ui()->OnClosePrintPreviewDialog();
return;
}
@@ -838,15 +675,16 @@ void PrintPreviewHandler::HandleGetPreview(const base::ListValue* args) {
if (!print_render_frame_.is_bound())
rfh->GetRemoteAssociatedInterfaces()->GetInterface(&print_render_frame_);
+ if (!print_preview_ui()->IsBound()) {
+ print_render_frame_->SetPrintPreviewUI(
+ print_preview_ui()->BindPrintPreviewUI());
+ }
print_render_frame_->PrintPreview(settings.Clone());
last_preview_settings_ = std::move(settings);
}
void PrintPreviewHandler::HandlePrint(const base::ListValue* args) {
- // Record the number of times the user requests to regenerate preview data
- // before printing.
- base::UmaHistogramCounts1M(
- "PrintPreview.RegeneratePreviewRequest.BeforePrint",
+ ReportRegeneratePreviewRequestCountBeforePrint(
regenerate_preview_request_count_);
std::string callback_id;
CHECK(args->GetString(0, &callback_id));
@@ -886,15 +724,17 @@ void PrintPreviewHandler::HandlePrint(const base::ListValue* args) {
if (last_preview_settings_.is_dict())
ReportPrintSettingsStats(settings, last_preview_settings_, is_pdf);
{
- PrintDocumentTypeBuckets doc_type = is_pdf ? PDF_DOCUMENT : HTML_DOCUMENT;
+ PrintDocumentTypeBuckets doc_type =
+ is_pdf ? PrintDocumentTypeBuckets::kPdfDocument
+ : PrintDocumentTypeBuckets::kHtmlDocument;
size_t average_page_size_in_kb = data->size() / page_count;
average_page_size_in_kb /= 1024;
ReportPrintDocumentTypeAndSizeHistograms(doc_type, average_page_size_in_kb);
}
ReportUserActionHistogram(user_action);
- if (user_action == PRINT_WITH_CLOUD_PRINT ||
- user_action == PRINT_TO_GOOGLE_DRIVE) {
+ if (user_action == UserActionBuckets::kPrintWithCloudPrint ||
+ user_action == UserActionBuckets::kPrintToGoogleDrive) {
// Does not send the title like the other printer handler types below,
// because JS already has the document title from the initial settings.
SendCloudPrintJob(callback_id, data.get());
@@ -942,11 +782,11 @@ void PrintPreviewHandler::HandlePrinterSetup(const base::ListValue* args) {
return;
}
- GetPrinterHandler(PrinterType::kLocalPrinter)
- ->StartGetCapability(
- printer_name, base::BindOnce(&PrintPreviewHandler::SendPrinterSetup,
- weak_factory_.GetWeakPtr(), callback_id,
- printer_name));
+ PrinterHandler* handler = GetPrinterHandler(PrinterType::kLocal);
+ handler->StartGetCapability(
+ printer_name,
+ base::BindOnce(&PrintPreviewHandler::SendPrinterSetup,
+ weak_factory_.GetWeakPtr(), callback_id, printer_name));
}
void PrintPreviewHandler::HandleSignin(const base::ListValue* args) {
@@ -962,17 +802,19 @@ void PrintPreviewHandler::HandleSignin(const base::ListValue* args) {
// account management flows will go through native UIs and not through a
// tabbed browser window.
if (add_account) {
- chromeos::InlineLoginHandlerDialogChromeOS::Show();
+ chromeos::InlineLoginHandlerDialogChromeOS::Show(
+ chromeos::InlineLoginHandlerDialogChromeOS::Source::
+ kPrintPreviewDialog);
} else {
chrome::SettingsWindowManager::GetInstance()->ShowOSSettings(
- profile, chrome::kAccountManagerSubPage);
+ profile, chromeos::settings::mojom::kMyAccountsSubpagePath);
}
return;
}
#endif
chrome::ScopedTabbedBrowserDisplayer displayer(profile);
- print_dialog_cloud::CreateCloudPrintSigninTab(
+ CreateCloudPrintSigninTab(
displayer.browser(), add_account,
base::BindOnce(&PrintPreviewHandler::OnSignInTabClosed,
weak_factory_.GetWeakPtr()));
@@ -1005,8 +847,8 @@ void PrintPreviewHandler::HandleGetAccessToken(const base::ListValue* args) {
#if BUILDFLAG(ENABLE_BASIC_PRINT_DIALOG)
void PrintPreviewHandler::HandleShowSystemDialog(
const base::ListValue* /*args*/) {
- manage_printers_dialog_request_count_++;
- ReportUserActionHistogram(FALLBACK_TO_ADVANCED_SETTINGS_DIALOG);
+ ReportUserActionHistogram(
+ UserActionBuckets::kFallbackToAdvancedSettingsDialog);
WebContents* initiator = GetInitiator();
if (!initiator)
@@ -1023,34 +865,35 @@ void PrintPreviewHandler::HandleShowSystemDialog(
void PrintPreviewHandler::HandleClosePreviewDialog(
const base::ListValue* /*args*/) {
- ReportUserActionHistogram(CANCEL);
+ ReportUserActionHistogram(UserActionBuckets::kCancel);
- // Record the number of times the user requests to regenerate preview data
- // before cancelling.
- base::UmaHistogramCounts1M(
- "PrintPreview.RegeneratePreviewRequest.BeforeCancel",
+ ReportRegeneratePreviewRequestCountBeforeCancel(
regenerate_preview_request_count_);
}
-#if defined(OS_CHROMEOS)
void PrintPreviewHandler::HandleOpenPrinterSettings(
const base::ListValue* args) {
+#if defined(OS_CHROMEOS)
chrome::SettingsWindowManager::GetInstance()->ShowOSSettings(
- Profile::FromWebUI(web_ui()), chrome::kNativePrintingSettingsSubPage);
+ Profile::FromWebUI(web_ui()),
+ chromeos::settings::mojom::kPrintingDetailsSubpagePath);
+#else
+ GURL url(chrome::GetSettingsUrl(chrome::kPrintingSettingsSubPage));
+ content::OpenURLParams params(url, content::Referrer(),
+ WindowOpenDisposition::NEW_FOREGROUND_TAB,
+ ui::PAGE_TRANSITION_LINK, false);
+ preview_web_contents()->OpenURL(params);
+#endif
}
+#if defined(OS_CHROMEOS)
void PrintPreviewHandler::HandleGetEulaUrl(const base::ListValue* args) {
CHECK_EQ(2U, args->GetSize());
const std::string& callback_id = args->GetList()[0].GetString();
const std::string& destination_id = args->GetList()[1].GetString();
- PrinterHandler* handler = GetPrinterHandler(kLocalPrinter);
- if (!handler) {
- RejectJavascriptCallback(base::Value(callback_id), base::Value());
- return;
- }
-
+ PrinterHandler* handler = GetPrinterHandler(PrinterType::kLocal);
handler->StartGetEulaUrl(
destination_id, base::BindOnce(&PrintPreviewHandler::SendEulaUrl,
weak_factory_.GetWeakPtr(), callback_id));
@@ -1092,10 +935,10 @@ void PrintPreviewHandler::HandleGetInitialSettings(
AllowJavascript();
- GetPrinterHandler(PrinterType::kLocalPrinter)
- ->GetDefaultPrinter(
- base::BindOnce(&PrintPreviewHandler::SendInitialSettings,
- weak_factory_.GetWeakPtr(), callback_id));
+ PrinterHandler* handler = GetPrinterHandler(PrinterType::kLocal);
+ handler->GetDefaultPrinter(
+ base::BindOnce(&PrintPreviewHandler::SendInitialSettings,
+ weak_factory_.GetWeakPtr(), callback_id));
}
void PrintPreviewHandler::GetUserAccountList(base::Value* settings) {
@@ -1145,15 +988,14 @@ void PrintPreviewHandler::SendInitialSettings(
if (!policies.DictEmpty())
initial_settings.SetKey(kPolicies, std::move(policies));
- if (IsCloudPrintEnabled() &&
- !base::FeatureList::IsEnabled(features::kCloudPrinterHandler)) {
+ if (IsCloudPrintEnabled()) {
initial_settings.SetStringKey(
kCloudPrintURL, GURL(cloud_devices::GetCloudPrintURL()).spec());
}
initial_settings.SetBoolKey(
kPdfPrinterDisabled,
- base::Contains(printer_type_deny_list_, kPdfPrinter));
+ base::Contains(printer_type_deny_list_, PrinterType::kPdf));
const bool destinations_managed =
!printer_type_deny_list_.empty() &&
@@ -1300,7 +1142,7 @@ void PrintPreviewHandler::OnPrintPreviewFailed(int request_id) {
if (!reported_failed_preview_) {
reported_failed_preview_ = true;
- ReportUserActionHistogram(PREVIEW_FAILED);
+ ReportUserActionHistogram(UserActionBuckets::kPreviewFailed);
}
// Keep track of failures.
@@ -1321,13 +1163,13 @@ void PrintPreviewHandler::OnInvalidPrinterSettings(int request_id) {
void PrintPreviewHandler::SendPrintPresetOptions(bool disable_scaling,
int copies,
- int duplex,
+ mojom::DuplexMode duplex,
int request_id) {
if (!ShouldReceiveRendererMessage(request_id))
return;
FireWebUIListener("print-preset-options", base::Value(disable_scaling),
- base::Value(copies), base::Value(duplex));
+ base::Value(copies), base::Value(static_cast<int>(duplex)));
}
void PrintPreviewHandler::SendPageCountReady(int page_count,
@@ -1396,7 +1238,7 @@ void PrintPreviewHandler::ClearInitiatorDetails() {
PrinterHandler* PrintPreviewHandler::GetPrinterHandler(
PrinterType printer_type) {
- if (printer_type == PrinterType::kExtensionPrinter) {
+ if (printer_type == PrinterType::kExtension) {
if (!extension_printer_handler_) {
extension_printer_handler_ = PrinterHandler::CreateForExtensionPrinters(
Profile::FromWebUI(web_ui()));
@@ -1404,7 +1246,7 @@ PrinterHandler* PrintPreviewHandler::GetPrinterHandler(
return extension_printer_handler_.get();
}
#if BUILDFLAG(ENABLE_SERVICE_DISCOVERY)
- if (printer_type == PrinterType::kPrivetPrinter) {
+ if (printer_type == PrinterType::kPrivet) {
if (!privet_printer_handler_) {
privet_printer_handler_ =
PrinterHandler::CreateForPrivetPrinters(Profile::FromWebUI(web_ui()));
@@ -1412,7 +1254,7 @@ PrinterHandler* PrintPreviewHandler::GetPrinterHandler(
return privet_printer_handler_.get();
}
#endif
- if (printer_type == PrinterType::kPdfPrinter) {
+ if (printer_type == PrinterType::kPdf) {
if (!pdf_printer_handler_) {
pdf_printer_handler_ = PrinterHandler::CreateForPdfPrinter(
Profile::FromWebUI(web_ui()), preview_web_contents(),
@@ -1420,42 +1262,32 @@ PrinterHandler* PrintPreviewHandler::GetPrinterHandler(
}
return pdf_printer_handler_.get();
}
- if (printer_type == PrinterType::kLocalPrinter) {
+ if (printer_type == PrinterType::kLocal) {
if (!local_printer_handler_) {
local_printer_handler_ = PrinterHandler::CreateForLocalPrinters(
preview_web_contents(), Profile::FromWebUI(web_ui()));
}
return local_printer_handler_.get();
}
- if (printer_type == PrinterType::kCloudPrinter) {
- // This printer handler is currently experimental. Ensure it is never
- // created unless the flag is enabled.
- CHECK(base::FeatureList::IsEnabled(features::kCloudPrinterHandler));
- if (!cloud_printer_handler_)
- cloud_printer_handler_ = PrinterHandler::CreateForCloudPrinters();
- return cloud_printer_handler_.get();
- }
NOTREACHED();
return nullptr;
}
PdfPrinterHandler* PrintPreviewHandler::GetPdfPrinterHandler() {
- return static_cast<PdfPrinterHandler*>(
- GetPrinterHandler(PrinterType::kPdfPrinter));
+ return static_cast<PdfPrinterHandler*>(GetPrinterHandler(PrinterType::kPdf));
}
void PrintPreviewHandler::OnAddedPrinters(PrinterType printer_type,
const base::ListValue& printers) {
- DCHECK(printer_type == PrinterType::kExtensionPrinter ||
- printer_type == PrinterType::kPrivetPrinter ||
- printer_type == PrinterType::kLocalPrinter);
+ DCHECK(printer_type == PrinterType::kExtension ||
+ printer_type == PrinterType::kPrivet ||
+ printer_type == PrinterType::kLocal);
DCHECK(!printers.empty());
- FireWebUIListener("printers-added", base::Value(printer_type), printers);
+ FireWebUIListener("printers-added",
+ base::Value(static_cast<int>(printer_type)), printers);
- if (printer_type == PrinterType::kLocalPrinter &&
- !has_logged_printers_count_) {
- UMA_HISTOGRAM_COUNTS_1M("PrintPreview.NumberOfPrinters",
- printers.GetSize());
+ if (printer_type == PrinterType::kLocal && !has_logged_printers_count_) {
+ ReportNumberOfPrinters(printers.GetSize());
has_logged_printers_count_ = true;
}
}
@@ -1495,7 +1327,7 @@ void PrintPreviewHandler::OnPrintResult(const std::string& callback_id,
void PrintPreviewHandler::RegisterForGaiaCookieChanges() {
DCHECK(!identity_manager_);
cloud_print_enabled_ =
- !base::Contains(printer_type_deny_list_, kCloudPrinter) &&
+ !base::Contains(printer_type_deny_list_, PrinterType::kCloud) &&
GetPrefs()->GetBoolean(prefs::kCloudPrintSubmitEnabled);
if (!cloud_print_enabled_)
@@ -1550,4 +1382,23 @@ void PrintPreviewHandler::SendManipulateSettingsForTest(
FireWebUIListener("manipulate-settings-for-test", settings);
}
+#if defined(OS_CHROMEOS)
+void PrintPreviewHandler::HandleRequestPrinterStatusUpdate(
+ const base::ListValue* args) {
+ CHECK_EQ(1U, args->GetList().size());
+ PrinterHandler* handler = GetPrinterHandler(PrinterType::kLocal);
+ handler->StartPrinterStatusRequest(
+ args->GetList()[0].GetString(),
+ base::BindOnce(&PrintPreviewHandler::OnPrinterStatusUpdated,
+ weak_factory_.GetWeakPtr()));
+}
+
+void PrintPreviewHandler::OnPrinterStatusUpdated(
+ const base::Value& cups_printer_status) {
+ // "printer-status-update" will also trigger non-PrintPreview UI for
+ // consuming fresh printer statuses.
+ FireWebUIListener("printer-status-update", cups_printer_status);
+}
+#endif
+
} // namespace printing
diff --git a/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.h b/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.h
index ab2dcacf9f9..0250e8bca9b 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.h
+++ b/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.h
@@ -24,6 +24,7 @@
#include "mojo/public/cpp/bindings/associated_remote.h"
#include "printing/backend/print_backend.h"
#include "printing/buildflags/buildflags.h"
+#include "printing/mojom/print.mojom.h"
#include "printing/print_job_constants.h"
namespace base {
@@ -79,7 +80,7 @@ class PrintPreviewHandler : public content::WebUIMessageHandler,
// Send the print preset options from the document.
void SendPrintPresetOptions(bool disable_scaling,
int copies,
- int duplex,
+ mojom::DuplexMode duplex,
int request_id);
// Send the print preview page count and fit to page scaling
@@ -97,10 +98,6 @@ class PrintPreviewHandler : public content::WebUIMessageHandler,
int preview_uid,
int preview_request_id);
- int regenerate_preview_request_count() const {
- return regenerate_preview_request_count_;
- }
-
// Notifies PDF Printer Handler that |path| was selected. Used for tests.
void FileSelectedForTesting(const base::FilePath& path,
int index,
@@ -237,10 +234,11 @@ class PrintPreviewHandler : public content::WebUIMessageHandler,
// preview is displayed.
void HandleGetInitialSettings(const base::ListValue* args);
-#if defined(OS_CHROMEOS)
- // Opens printer settings in the Chrome OS Settings App.
+ // Opens printer settings in the Chrome OS Settings App or the
+ // chrome://settings page.
void HandleOpenPrinterSettings(const base::ListValue* args);
+#if defined(OS_CHROMEOS)
// Gets the EULA URL.
void HandleGetEulaUrl(const base::ListValue* args);
#endif
@@ -269,7 +267,8 @@ class PrintPreviewHandler : public content::WebUIMessageHandler,
const std::string& printer_name,
base::Value settings_info);
- // Send the PDF data to the cloud to print.
+ // Send the PDF data to Print Preview so that it can be sent to the cloud
+ // print server to print.
void SendCloudPrintJob(const std::string& callback_id,
const base::RefCountedMemory* data);
@@ -312,18 +311,23 @@ class PrintPreviewHandler : public content::WebUIMessageHandler,
void OnPrintResult(const std::string& callback_id,
const base::Value& error);
+#if defined(OS_CHROMEOS)
+ // Called to initiate a status request for a printer.
+ void HandleRequestPrinterStatusUpdate(const base::ListValue* args);
+
+ // Invokes Web UI Listener "printer-status-update" with new printer status.
+ void OnPrinterStatusUpdated(const base::Value& cups_printer_status);
+#endif
+
// A count of how many requests received to regenerate preview data.
// Initialized to 0 then incremented and emitted to a histogram.
- int regenerate_preview_request_count_;
-
- // A count of how many requests received to show manage printers dialog.
- int manage_printers_dialog_request_count_;
+ int regenerate_preview_request_count_ = 0;
// Whether we have already logged a failed print preview.
- bool reported_failed_preview_;
+ bool reported_failed_preview_ = false;
// Whether we have already logged the number of printers this session.
- bool has_logged_printers_count_;
+ bool has_logged_printers_count_ = false;
// Whether Google Cloud Print is enabled for the active profile.
bool cloud_print_enabled_ = false;
@@ -338,11 +342,7 @@ class PrintPreviewHandler : public content::WebUIMessageHandler,
// Pointer to the identity manager service so that print preview can listen
// for GAIA cookie changes.
- signin::IdentityManager* identity_manager_;
-
- // Handles requests for cloud printers. Created lazily by calling
- // GetPrinterHandler().
- std::unique_ptr<PrinterHandler> cloud_printer_handler_;
+ signin::IdentityManager* identity_manager_ = nullptr;
// Handles requests for extension printers. Created lazily by calling
// GetPrinterHandler().
diff --git a/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc b/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
index 286ec9b139c..c38d276926e 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
@@ -20,11 +20,13 @@
#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/icu_test_util.h"
+#include "base/test/metrics/histogram_tester.h"
#include "base/values.h"
#include "chrome/browser/printing/print_test_utils.h"
#include "chrome/browser/printing/print_view_manager.h"
#include "chrome/browser/ui/webui/print_preview/fake_print_render_frame.h"
#include "chrome/browser/ui/webui/print_preview/policy_settings.h"
+#include "chrome/browser/ui/webui/print_preview/print_preview_metrics.h"
#include "chrome/browser/ui/webui/print_preview/print_preview_ui.h"
#include "chrome/browser/ui/webui/print_preview/printer_handler.h"
#include "chrome/common/pref_names.h"
@@ -49,16 +51,18 @@ const char kEmptyPrinterName[] = "EmptyPrinter";
const char kTestData[] = "abc";
// Array of all PrinterTypes.
-constexpr PrinterType kAllTypes[] = {kPrivetPrinter, kExtensionPrinter,
- kPdfPrinter, kLocalPrinter, kCloudPrinter};
+constexpr PrinterType kAllTypes[] = {PrinterType::kPrivet,
+ PrinterType::kExtension, PrinterType::kPdf,
+ PrinterType::kLocal, PrinterType::kCloud};
// Array of all PrinterTypes that have working PrinterHandlers.
-constexpr PrinterType kAllSupportedTypes[] = {kPrivetPrinter, kExtensionPrinter,
- kPdfPrinter, kLocalPrinter};
+constexpr PrinterType kAllSupportedTypes[] = {
+ PrinterType::kPrivet, PrinterType::kExtension, PrinterType::kPdf,
+ PrinterType::kLocal};
// All three printer types that implement PrinterHandler::StartGetPrinters().
-constexpr PrinterType kFetchableTypes[] = {kPrivetPrinter, kExtensionPrinter,
- kLocalPrinter};
+constexpr PrinterType kFetchableTypes[] = {
+ PrinterType::kPrivet, PrinterType::kExtension, PrinterType::kLocal};
struct PrinterInfo {
std::string id;
@@ -99,7 +103,7 @@ PrinterInfo GetEmptyPrinterInfo() {
}
base::Value GetPrintPreviewTicket() {
- base::Value print_ticket = GetPrintTicket(kLocalPrinter);
+ base::Value print_ticket = GetPrintTicket(PrinterType::kLocal);
// Make some modifications to match a preview print ticket.
print_ticket.SetKey(kSettingPageRange, base::Value());
@@ -125,6 +129,51 @@ std::unique_ptr<base::ListValue> ConstructPreviewArgs(
return base::ListValue::From(base::Value::ToUniquePtrValue(std::move(args)));
}
+UserActionBuckets GetUserActionForPrinterType(PrinterType type) {
+ switch (type) {
+ case PrinterType::kPrivet:
+ return UserActionBuckets::kPrintWithPrivet;
+ case PrinterType::kExtension:
+ return UserActionBuckets::kPrintWithExtension;
+ case PrinterType::kPdf:
+ return UserActionBuckets::kPrintToPdf;
+ case PrinterType::kLocal:
+ return UserActionBuckets::kPrintToPrinter;
+ case PrinterType::kCloud:
+ return UserActionBuckets::kPrintWithCloudPrint;
+ }
+}
+
+// Checks whether |histograms| was updated correctly by a job with a printer
+// type |type| with arguments generated by GetPrintTicket().
+void CheckHistograms(const base::HistogramTester& histograms,
+ PrinterType type) {
+ static constexpr PrintSettingsBuckets kPopulatedPrintSettingsBuckets[] = {
+ PrintSettingsBuckets::kPortrait, PrintSettingsBuckets::kColor,
+ PrintSettingsBuckets::kCollate, PrintSettingsBuckets::kDuplex,
+ PrintSettingsBuckets::kTotal, PrintSettingsBuckets::kDefaultMedia,
+ };
+
+ for (auto bucket : kPopulatedPrintSettingsBuckets)
+ histograms.ExpectBucketCount("PrintPreview.PrintSettings", bucket, 1);
+
+ // All other PrintPreview.PrintSettings buckets should be empty.
+ histograms.ExpectTotalCount("PrintPreview.PrintSettings",
+ base::size(kPopulatedPrintSettingsBuckets));
+
+ const UserActionBuckets user_action = GetUserActionForPrinterType(type);
+ histograms.ExpectBucketCount("PrintPreview.UserAction", user_action, 1);
+ // Only one PrintPreview.UserAction bucket should have been populated.
+ histograms.ExpectTotalCount("PrintPreview.UserAction", 1);
+
+ histograms.ExpectTotalCount("PrintPreview.PrintDocumentSize.HTML", 1);
+ histograms.ExpectTotalCount("PrintPreview.PrintDocumentSize.PDF", 0);
+ histograms.ExpectBucketCount("PrintPreview.PrintDocumentType",
+ PrintDocumentTypeBuckets::kHtmlDocument, 1);
+ histograms.ExpectBucketCount("PrintPreview.PrintDocumentType",
+ PrintDocumentTypeBuckets::kPdfDocument, 0);
+}
+
class TestPrinterHandler : public PrinterHandler {
public:
explicit TestPrinterHandler(const std::vector<PrinterInfo>& printers) {
@@ -440,11 +489,42 @@ class PrintPreviewHandlerTest : public testing::Test {
settings->FindKeyOfType("syncAvailable", base::Value::Type::BOOLEAN));
}
- // Validates the initial settings policies structure in the response matches
- // the print_preview.Policies type in
+ // Returns |policy_name| entry from initial settings policies.
+ const base::Value* GetInitialSettingsPolicy(const base::Value& settings,
+ const std::string& policy_name) {
+ const base::Value* policies =
+ settings.FindKeyOfType("policies", base::Value::Type::DICTIONARY);
+ if (!policies)
+ return nullptr;
+ return policies->FindKeyOfType(policy_name, base::Value::Type::DICTIONARY);
+ }
+
+ // Validates the initial settings value policies structure in the response
+ // matches the print_preview.Policies type in
+ // chrome/browser/resources/print_preview/native_layer.js.
+ // Assumes "test-callback-id-0" was used as the callback id.
+ void ValidateInitialSettingsValuePolicy(
+ const content::TestWebUI::CallData& data,
+ const std::string& policy_name,
+ base::Optional<base::Value> expected_policy_value) {
+ CheckWebUIResponse(data, "test-callback-id-0", true);
+ const base::Value* settings = data.arg3();
+
+ const base::Value* policy =
+ GetInitialSettingsPolicy(*settings, policy_name);
+ const base::Value* policy_value =
+ policy ? policy->FindKey("value") : nullptr;
+
+ ASSERT_EQ(expected_policy_value.has_value(), !!policy_value);
+ if (expected_policy_value.has_value())
+ EXPECT_EQ(expected_policy_value.value(), *policy_value);
+ }
+
+ // Validates the initial settings allowed/default mode policies structure in
+ // the response matches the print_preview.Policies type in
// chrome/browser/resources/print_preview/native_layer.js.
// Assumes "test-callback-id-0" was used as the callback id.
- void ValidateInitialSettingsPolicy(
+ void ValidateInitialSettingsAllowedDefaultModePolicy(
const content::TestWebUI::CallData& data,
const std::string& policy_name,
base::Optional<base::Value> expected_allowed_mode,
@@ -452,18 +532,12 @@ class PrintPreviewHandlerTest : public testing::Test {
CheckWebUIResponse(data, "test-callback-id-0", true);
const base::Value* settings = data.arg3();
- const base::Value* allowed_mode = nullptr;
- const base::Value* default_mode = nullptr;
- const base::Value* policies =
- settings->FindKeyOfType("policies", base::Value::Type::DICTIONARY);
- if (policies) {
- const base::Value* policy =
- policies->FindKeyOfType(policy_name, base::Value::Type::DICTIONARY);
- if (policy) {
- allowed_mode = policy->FindKey("allowedMode");
- default_mode = policy->FindKey("defaultMode");
- }
- }
+ const base::Value* policy =
+ GetInitialSettingsPolicy(*settings, policy_name);
+ const base::Value* allowed_mode =
+ policy ? policy->FindKey("allowedMode") : nullptr;
+ const base::Value* default_mode =
+ policy ? policy->FindKey("defaultMode") : nullptr;
ASSERT_EQ(expected_allowed_mode.has_value(), !!allowed_mode);
if (expected_allowed_mode.has_value())
@@ -479,7 +553,7 @@ class PrintPreviewHandlerTest : public testing::Test {
void SendGetPrinters(PrinterType type, const std::string& callback_id_in) {
base::Value args(base::Value::Type::LIST);
args.Append(callback_id_in);
- args.Append(type);
+ args.Append(static_cast<int>(type));
handler()->HandleGetPrinters(&base::Value::AsListValue(args));
}
@@ -492,7 +566,7 @@ class PrintPreviewHandlerTest : public testing::Test {
const content::TestWebUI::CallData& add_data =
*web_ui()->call_data()[call_data_size - 2];
AssertWebUIEventFired(add_data, "printers-added");
- const int type = add_data.arg2()->GetInt();
+ const auto type = static_cast<PrinterType>(add_data.arg2()->GetInt());
EXPECT_EQ(expected_type, type);
ASSERT_TRUE(add_data.arg3());
base::Value::ConstListView printer_list = add_data.arg3()->GetList();
@@ -509,7 +583,7 @@ class PrintPreviewHandlerTest : public testing::Test {
base::Value args(base::Value::Type::LIST);
args.Append(callback_id_in);
args.Append(printer_name);
- args.Append(type);
+ args.Append(static_cast<int>(type));
handler()->HandleGetPrinterCapabilities(&base::Value::AsListValue(args));
}
@@ -583,10 +657,16 @@ TEST_F(PrintPreviewHandlerTest, InitialSettingsRuLocale) {
TEST_F(PrintPreviewHandlerTest, InitialSettingsNoPolicies) {
Initialize();
- ValidateInitialSettingsPolicy(*web_ui()->call_data().back(), "headerFooter",
- base::nullopt, base::nullopt);
- ValidateInitialSettingsPolicy(*web_ui()->call_data().back(), "cssBackground",
- base::nullopt, base::nullopt);
+ ValidateInitialSettingsAllowedDefaultModePolicy(*web_ui()->call_data().back(),
+ "headerFooter", base::nullopt,
+ base::nullopt);
+ ValidateInitialSettingsAllowedDefaultModePolicy(*web_ui()->call_data().back(),
+ "cssBackground",
+ base::nullopt, base::nullopt);
+ ValidateInitialSettingsAllowedDefaultModePolicy(
+ *web_ui()->call_data().back(), "mediaSize", base::nullopt, base::nullopt);
+ ValidateInitialSettingsValuePolicy(*web_ui()->call_data().back(), "sheets",
+ base::nullopt);
}
TEST_F(PrintPreviewHandlerTest, InitialSettingsRestrictHeaderFooterEnabled) {
@@ -594,8 +674,9 @@ TEST_F(PrintPreviewHandlerTest, InitialSettingsRestrictHeaderFooterEnabled) {
prefs()->SetManagedPref(prefs::kPrintHeaderFooter,
std::make_unique<base::Value>(true));
Initialize();
- ValidateInitialSettingsPolicy(*web_ui()->call_data().back(), "headerFooter",
- base::Value(true), base::nullopt);
+ ValidateInitialSettingsAllowedDefaultModePolicy(
+ *web_ui()->call_data().back(), "headerFooter", base::Value(true),
+ base::nullopt);
}
TEST_F(PrintPreviewHandlerTest, InitialSettingsRestrictHeaderFooterDisabled) {
@@ -603,24 +684,27 @@ TEST_F(PrintPreviewHandlerTest, InitialSettingsRestrictHeaderFooterDisabled) {
prefs()->SetManagedPref(prefs::kPrintHeaderFooter,
std::make_unique<base::Value>(false));
Initialize();
- ValidateInitialSettingsPolicy(*web_ui()->call_data().back(), "headerFooter",
- base::Value(false), base::nullopt);
+ ValidateInitialSettingsAllowedDefaultModePolicy(
+ *web_ui()->call_data().back(), "headerFooter", base::Value(false),
+ base::nullopt);
}
TEST_F(PrintPreviewHandlerTest, InitialSettingsEnableHeaderFooter) {
// Set a pref that should take priority over StickySettings.
prefs()->SetBoolean(prefs::kPrintHeaderFooter, true);
Initialize();
- ValidateInitialSettingsPolicy(*web_ui()->call_data().back(), "headerFooter",
- base::nullopt, base::Value(true));
+ ValidateInitialSettingsAllowedDefaultModePolicy(*web_ui()->call_data().back(),
+ "headerFooter", base::nullopt,
+ base::Value(true));
}
TEST_F(PrintPreviewHandlerTest, InitialSettingsDisableHeaderFooter) {
// Set a pref that should take priority over StickySettings.
prefs()->SetBoolean(prefs::kPrintHeaderFooter, false);
Initialize();
- ValidateInitialSettingsPolicy(*web_ui()->call_data().back(), "headerFooter",
- base::nullopt, base::Value(false));
+ ValidateInitialSettingsAllowedDefaultModePolicy(*web_ui()->call_data().back(),
+ "headerFooter", base::nullopt,
+ base::Value(false));
}
TEST_F(PrintPreviewHandlerTest,
@@ -628,8 +712,9 @@ TEST_F(PrintPreviewHandlerTest,
// Set a pref with allowed value.
prefs()->SetInteger(prefs::kPrintingAllowedBackgroundGraphicsModes, 1);
Initialize();
- ValidateInitialSettingsPolicy(*web_ui()->call_data().back(), "cssBackground",
- base::Value(1), base::nullopt);
+ ValidateInitialSettingsAllowedDefaultModePolicy(
+ *web_ui()->call_data().back(), "cssBackground", base::Value(1),
+ base::nullopt);
}
TEST_F(PrintPreviewHandlerTest,
@@ -637,26 +722,96 @@ TEST_F(PrintPreviewHandlerTest,
// Set a pref with allowed value.
prefs()->SetInteger(prefs::kPrintingAllowedBackgroundGraphicsModes, 2);
Initialize();
- ValidateInitialSettingsPolicy(*web_ui()->call_data().back(), "cssBackground",
- base::Value(2), base::nullopt);
+ ValidateInitialSettingsAllowedDefaultModePolicy(
+ *web_ui()->call_data().back(), "cssBackground", base::Value(2),
+ base::nullopt);
}
TEST_F(PrintPreviewHandlerTest, InitialSettingsEnableBackgroundGraphics) {
// Set a pref that should take priority over StickySettings.
prefs()->SetInteger(prefs::kPrintingBackgroundGraphicsDefault, 1);
Initialize();
- ValidateInitialSettingsPolicy(*web_ui()->call_data().back(), "cssBackground",
- base::nullopt, base::Value(1));
+ ValidateInitialSettingsAllowedDefaultModePolicy(
+ *web_ui()->call_data().back(), "cssBackground", base::nullopt,
+ base::Value(1));
}
TEST_F(PrintPreviewHandlerTest, InitialSettingsDisableBackgroundGraphics) {
// Set a pref that should take priority over StickySettings.
prefs()->SetInteger(prefs::kPrintingBackgroundGraphicsDefault, 2);
Initialize();
- ValidateInitialSettingsPolicy(*web_ui()->call_data().back(), "cssBackground",
- base::nullopt, base::Value(2));
+ ValidateInitialSettingsAllowedDefaultModePolicy(
+ *web_ui()->call_data().back(), "cssBackground", base::nullopt,
+ base::Value(2));
}
+TEST_F(PrintPreviewHandlerTest, InitialSettingsDefaultPaperSizeName) {
+ const char kPrintingPaperSizeDefaultName[] = R"(
+ {
+ "name": "iso_a5_148x210mm"
+ })";
+ const char kExpectedInitialSettingsPolicy[] = R"(
+ {
+ "width": 148000,
+ "height": 210000
+ })";
+
+ base::Optional<base::Value> default_paper_size =
+ base::JSONReader::Read(kPrintingPaperSizeDefaultName);
+ ASSERT_TRUE(default_paper_size.has_value());
+ // Set a pref that should take priority over StickySettings.
+ prefs()->Set(prefs::kPrintingPaperSizeDefault, default_paper_size.value());
+ Initialize();
+
+ base::Optional<base::Value> expected_initial_settings_policy =
+ base::JSONReader::Read(kExpectedInitialSettingsPolicy);
+ ASSERT_TRUE(expected_initial_settings_policy.has_value());
+
+ ValidateInitialSettingsAllowedDefaultModePolicy(
+ *web_ui()->call_data().back(), "mediaSize", base::nullopt,
+ std::move(expected_initial_settings_policy));
+}
+
+TEST_F(PrintPreviewHandlerTest, InitialSettingsDefaultPaperSizeCustomSize) {
+ const char kPrintingPaperSizeDefaultCustomSize[] = R"(
+ {
+ "name": "custom",
+ "custom_size": {
+ "width": 148000,
+ "height": 210000
+ }
+ })";
+ const char kExpectedInitialSettingsPolicy[] = R"(
+ {
+ "width": 148000,
+ "height": 210000
+ })";
+
+ base::Optional<base::Value> default_paper_size =
+ base::JSONReader::Read(kPrintingPaperSizeDefaultCustomSize);
+ ASSERT_TRUE(default_paper_size.has_value());
+ // Set a pref that should take priority over StickySettings.
+ prefs()->Set(prefs::kPrintingPaperSizeDefault, default_paper_size.value());
+ Initialize();
+
+ base::Optional<base::Value> expected_initial_settings_policy =
+ base::JSONReader::Read(kExpectedInitialSettingsPolicy);
+ ASSERT_TRUE(expected_initial_settings_policy.has_value());
+
+ ValidateInitialSettingsAllowedDefaultModePolicy(
+ *web_ui()->call_data().back(), "mediaSize", base::nullopt,
+ std::move(expected_initial_settings_policy));
+}
+
+#if defined(OS_CHROMEOS)
+TEST_F(PrintPreviewHandlerTest, InitialSettingsMaxSheetsAllowedPolicy) {
+ prefs()->SetInteger(prefs::kPrintingMaxSheetsAllowed, 2);
+ Initialize();
+ ValidateInitialSettingsValuePolicy(*web_ui()->call_data().back(), "sheets",
+ base::Value(2));
+}
+#endif // defined(OS_CHROMEOS)
+
TEST_F(PrintPreviewHandlerTest, GetPrinters) {
Initialize();
@@ -705,7 +860,7 @@ TEST_F(PrintPreviewHandlerTest, GetNoDenyListPrinters) {
// type that isn't on the deny list (one for printers-added, and one for the
// response), and only 1 more for each type on the deny list (just for
// response).
- const bool is_allowed_type = type == kLocalPrinter;
+ const bool is_allowed_type = type == PrinterType::kLocal;
EXPECT_EQ(is_allowed_type, handler()->CalledOnlyForType(type));
expected_callbacks += is_allowed_type ? 2 : 1;
ASSERT_EQ(expected_callbacks, web_ui()->call_data().size());
@@ -787,7 +942,7 @@ TEST_F(PrintPreviewHandlerTest, GetNoDenyListPrinterCapabilities) {
SendGetPrinterCapabilities(type, callback_id_in, kDummyPrinterName);
const bool is_allowed_type =
- type == kPrivetPrinter || type == kExtensionPrinter;
+ type == PrinterType::kPrivet || type == PrinterType::kExtension;
EXPECT_EQ(is_allowed_type, handler()->CalledOnlyForType(type));
// Start with 1 call from initial settings, then add 1 more for each loop
@@ -803,23 +958,37 @@ TEST_F(PrintPreviewHandlerTest, Print) {
// All printer types can print.
for (size_t i = 0; i < base::size(kAllTypes); i++) {
- PrinterType type = kAllTypes[i];
+ base::HistogramTester histograms;
handler()->reset_calls();
- base::Value args(base::Value::Type::LIST);
- std::string callback_id_in =
- "test-callback-id-" + base::NumberToString(i + 1);
- args.Append(callback_id_in);
+
+ // Send print preview request.
+ base::Value preview_ticket = GetPrintPreviewTicket();
+ preview_ticket.SetIntKey(kPreviewRequestID, i);
+ std::string preview_callback_id =
+ "test-callback-id-" + base::NumberToString(2 * i + 1);
+ std::unique_ptr<base::ListValue> preview_list_args =
+ ConstructPreviewArgs(preview_callback_id, preview_ticket);
+ handler()->HandleGetPreview(preview_list_args.get());
+
+ // Send printing request.
+ PrinterType type = kAllTypes[i];
+ base::Value print_args(base::Value::Type::LIST);
+ std::string print_callback_id =
+ "test-callback-id-" + base::NumberToString(2 * (i + 1));
+ print_args.Append(print_callback_id);
base::Value print_ticket = GetPrintTicket(type);
std::string json;
base::JSONWriter::Write(print_ticket, &json);
- args.Append(json);
- std::unique_ptr<base::ListValue> list_args =
- base::ListValue::From(base::Value::ToUniquePtrValue(std::move(args)));
- handler()->HandlePrint(list_args.get());
+ print_args.Append(json);
+ std::unique_ptr<base::ListValue> print_list_args = base::ListValue::From(
+ base::Value::ToUniquePtrValue(std::move(print_args)));
+ handler()->HandlePrint(print_list_args.get());
+
+ CheckHistograms(histograms, type);
// Verify correct PrinterHandler was called or that no handler was requested
// for cloud printers.
- if (type == kCloudPrinter) {
+ if (type == PrinterType::kCloud) {
EXPECT_TRUE(handler()->NotCalled());
} else {
EXPECT_TRUE(handler()->CalledOnlyForType(type));
@@ -827,10 +996,10 @@ TEST_F(PrintPreviewHandlerTest, Print) {
// Verify print promise was resolved successfully.
const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
- CheckWebUIResponse(data, callback_id_in, true);
+ CheckWebUIResponse(data, print_callback_id, true);
// For cloud print, should also get the encoded data back as a string.
- if (type == kCloudPrinter) {
+ if (type == PrinterType::kCloud) {
std::string print_data;
ASSERT_TRUE(data.arg3()->GetAsString(&print_data));
std::string expected_data;
@@ -999,7 +1168,7 @@ TEST_F(PrintPreviewHandlerFailingTest, GetPrinterCapabilities) {
"test-callback-id-" + base::NumberToString(i + 1);
args.Append(callback_id_in);
args.Append(kDummyPrinterName);
- args.Append(type);
+ args.Append(static_cast<int>(type));
std::unique_ptr<base::ListValue> list_args =
base::ListValue::From(base::Value::ToUniquePtrValue(std::move(args)));
handler()->HandleGetPrinterCapabilities(list_args.get());
diff --git a/chromium/chrome/browser/ui/webui/print_preview/print_preview_metrics.cc b/chromium/chrome/browser/ui/webui/print_preview/print_preview_metrics.cc
new file mode 100644
index 00000000000..3056e85451a
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/print_preview/print_preview_metrics.cc
@@ -0,0 +1,192 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/print_preview/print_preview_metrics.h"
+
+#include "base/containers/flat_set.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/metrics/histogram_macros.h"
+#include "base/no_destructor.h"
+#include "base/optional.h"
+#include "base/values.h"
+#include "build/build_config.h"
+#include "printing/print_job_constants.h"
+#include "printing/print_settings.h"
+
+namespace printing {
+
+namespace {
+
+void ReportPrintSettingHistogram(PrintSettingsBuckets setting) {
+ // Use macro because this histogram is called multiple times in succession.
+ UMA_HISTOGRAM_ENUMERATION("PrintPreview.PrintSettings", setting);
+}
+
+} // namespace
+
+void ReportNumberOfPrinters(size_t number) {
+ // Use macro because this histogram is called multiple times in succession.
+ UMA_HISTOGRAM_COUNTS_1M("PrintPreview.NumberOfPrinters", number);
+}
+
+void ReportPrintDocumentTypeAndSizeHistograms(PrintDocumentTypeBuckets doctype,
+ size_t average_page_size_in_kb) {
+ base::UmaHistogramEnumeration("PrintPreview.PrintDocumentType", doctype);
+ switch (doctype) {
+ case PrintDocumentTypeBuckets::kHtmlDocument:
+ base::UmaHistogramMemoryKB("PrintPreview.PrintDocumentSize.HTML",
+ average_page_size_in_kb);
+ return;
+ case PrintDocumentTypeBuckets::kPdfDocument:
+ base::UmaHistogramMemoryKB("PrintPreview.PrintDocumentSize.PDF",
+ average_page_size_in_kb);
+ return;
+ }
+}
+
+void ReportPrintSettingsStats(const base::Value& print_settings,
+ const base::Value& preview_settings,
+ bool is_pdf) {
+ ReportPrintSettingHistogram(PrintSettingsBuckets::kTotal);
+
+ // Print settings can be categorized into 2 groups: settings that are applied
+ // via preview generation (page range, selection, headers/footers, background
+ // graphics, scaling, layout, page size, pages per sheet, fit to page,
+ // margins, rasterize), and settings that are applied at the printer (color,
+ // duplex, copies, collate, dpi). The former should be captured from the most
+ // recent preview request, as some of them are set to dummy values in the
+ // print ticket. Similarly, settings applied at the printer should be pulled
+ // from the print ticket, as they may have dummy values in the preview
+ // request.
+ const base::Value* page_range_array =
+ preview_settings.FindKey(kSettingPageRange);
+ if (page_range_array && page_range_array->is_list() &&
+ !page_range_array->GetList().empty()) {
+ ReportPrintSettingHistogram(PrintSettingsBuckets::kPageRange);
+ }
+
+ const base::Value* media_size_value =
+ preview_settings.FindKey(kSettingMediaSize);
+ if (media_size_value && media_size_value->is_dict() &&
+ !media_size_value->DictEmpty()) {
+ if (media_size_value->FindBoolKey(kSettingMediaSizeIsDefault)
+ .value_or(false)) {
+ ReportPrintSettingHistogram(PrintSettingsBuckets::kDefaultMedia);
+ } else {
+ ReportPrintSettingHistogram(PrintSettingsBuckets::kNonDefaultMedia);
+ }
+ }
+
+ base::Optional<bool> landscape_opt =
+ preview_settings.FindBoolKey(kSettingLandscape);
+ if (landscape_opt)
+ ReportPrintSettingHistogram(landscape_opt.value()
+ ? PrintSettingsBuckets::kLandscape
+ : PrintSettingsBuckets::kPortrait);
+
+ if (print_settings.FindIntKey(kSettingCopies).value_or(1) > 1)
+ ReportPrintSettingHistogram(PrintSettingsBuckets::kCopies);
+
+ if (preview_settings.FindIntKey(kSettingPagesPerSheet).value_or(1) != 1)
+ ReportPrintSettingHistogram(PrintSettingsBuckets::kPagesPerSheet);
+
+ if (print_settings.FindBoolKey(kSettingCollate).value_or(false))
+ ReportPrintSettingHistogram(PrintSettingsBuckets::kCollate);
+
+ base::Optional<int> duplex_mode_opt =
+ print_settings.FindIntKey(kSettingDuplexMode);
+ if (duplex_mode_opt)
+ ReportPrintSettingHistogram(duplex_mode_opt.value()
+ ? PrintSettingsBuckets::kDuplex
+ : PrintSettingsBuckets::kSimplex);
+
+ base::Optional<int> color_mode_opt = print_settings.FindIntKey(kSettingColor);
+ if (color_mode_opt.has_value()) {
+ bool unknown_color_model = color_mode_opt.value() == UNKNOWN_COLOR_MODEL;
+ if (!unknown_color_model) {
+ base::Optional<bool> is_color =
+ IsColorModelSelected(color_mode_opt.value());
+ ReportPrintSettingHistogram(is_color.value()
+ ? PrintSettingsBuckets::kColor
+ : PrintSettingsBuckets::kBlackAndWhite);
+ }
+
+ // Record whether the printing backend does not understand the printer's
+ // color capabilities. Do this only once per device.
+ static base::NoDestructor<base::flat_set<std::string>> seen_devices;
+ auto result =
+ seen_devices->insert(*print_settings.FindStringKey(kSettingDeviceName));
+ bool is_new_device = result.second;
+ if (is_new_device) {
+ base::UmaHistogramBoolean("Printing.CUPS.UnknownPpdColorModel",
+ unknown_color_model);
+ }
+ }
+
+ if (preview_settings.FindIntKey(kSettingMarginsType).value_or(0) != 0)
+ ReportPrintSettingHistogram(PrintSettingsBuckets::kNonDefaultMargins);
+
+ if (preview_settings.FindBoolKey(kSettingHeaderFooterEnabled).value_or(false))
+ ReportPrintSettingHistogram(PrintSettingsBuckets::kHeadersAndFooters);
+
+ if (preview_settings.FindBoolKey(kSettingShouldPrintBackgrounds)
+ .value_or(false)) {
+ ReportPrintSettingHistogram(PrintSettingsBuckets::kCssBackground);
+ }
+
+ if (preview_settings.FindBoolKey(kSettingShouldPrintSelectionOnly)
+ .value_or(false)) {
+ ReportPrintSettingHistogram(PrintSettingsBuckets::kSelectionOnly);
+ }
+
+ if (preview_settings.FindBoolKey(kSettingRasterizePdf).value_or(false))
+ ReportPrintSettingHistogram(PrintSettingsBuckets::kPrintAsImage);
+
+ ScalingType scaling_type =
+ static_cast<ScalingType>(preview_settings.FindIntKey(kSettingScalingType)
+ .value_or(ScalingType::DEFAULT));
+ if (scaling_type == ScalingType::CUSTOM) {
+ ReportPrintSettingHistogram(PrintSettingsBuckets::kScaling);
+ }
+
+ if (is_pdf) {
+ if (scaling_type == ScalingType::FIT_TO_PAGE)
+ ReportPrintSettingHistogram(PrintSettingsBuckets::kFitToPage);
+ else if (scaling_type == ScalingType::FIT_TO_PAPER)
+ ReportPrintSettingHistogram(PrintSettingsBuckets::kFitToPaper);
+ }
+
+ if (print_settings.FindIntKey(kSettingDpiHorizontal).value_or(0) > 0 &&
+ print_settings.FindIntKey(kSettingDpiVertical).value_or(0) > 0) {
+ base::Optional<bool> is_default_opt =
+ print_settings.FindBoolKey(kSettingDpiDefault);
+ if (is_default_opt) {
+ ReportPrintSettingHistogram(is_default_opt.value()
+ ? PrintSettingsBuckets::kDefaultDpi
+ : PrintSettingsBuckets::kNonDefaultDpi);
+ }
+ }
+
+#if defined(OS_CHROMEOS)
+ if (print_settings.FindStringKey(kSettingPinValue))
+ ReportPrintSettingHistogram(PrintSettingsBuckets::kPin);
+#endif // defined(OS_CHROMEOS)
+}
+
+void ReportRegeneratePreviewRequestCountBeforeCancel(size_t count) {
+ base::UmaHistogramCounts1M(
+ "PrintPreview.RegeneratePreviewRequest.BeforeCancel", count);
+}
+
+void ReportRegeneratePreviewRequestCountBeforePrint(size_t count) {
+ base::UmaHistogramCounts1M(
+ "PrintPreview.RegeneratePreviewRequest.BeforePrint", count);
+}
+
+void ReportUserActionHistogram(UserActionBuckets event) {
+ // Use macro because this histogram is called multiple times in succession.
+ UMA_HISTOGRAM_ENUMERATION("PrintPreview.UserAction", event);
+}
+
+} // namespace printing
diff --git a/chromium/chrome/browser/ui/webui/print_preview/print_preview_metrics.h b/chromium/chrome/browser/ui/webui/print_preview/print_preview_metrics.h
new file mode 100644
index 00000000000..d8fe51af5a6
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/print_preview/print_preview_metrics.h
@@ -0,0 +1,98 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_PRINT_PREVIEW_PRINT_PREVIEW_METRICS_H_
+#define CHROME_BROWSER_UI_WEBUI_PRINT_PREVIEW_PRINT_PREVIEW_METRICS_H_
+
+#include <cstddef>
+
+namespace base {
+class Value;
+}
+
+namespace printing {
+
+// This enum is used to back an UMA histogram, and should therefore be treated
+// as append only.
+enum class PrintDocumentTypeBuckets {
+ kHtmlDocument = 0,
+ kPdfDocument = 1,
+ kMaxValue = kPdfDocument
+};
+
+// This enum is used to back an UMA histogram, and should therefore be treated
+// as append only.
+enum class PrintSettingsBuckets {
+ kLandscape = 0,
+ kPortrait = 1,
+ kColor = 2,
+ kBlackAndWhite = 3,
+ kCollate = 4,
+ kSimplex = 5,
+ kDuplex = 6,
+ kTotal = 7,
+ kHeadersAndFooters = 8,
+ kCssBackground = 9,
+ kSelectionOnly = 10,
+ // kExternalPdfPreview = 11, // no longer used
+ kPageRange = 12,
+ kDefaultMedia = 13,
+ kNonDefaultMedia = 14,
+ kCopies = 15,
+ kNonDefaultMargins = 16,
+ // kDistillPage = 17, // no longer used
+ kScaling = 18,
+ kPrintAsImage = 19,
+ kPagesPerSheet = 20,
+ kFitToPage = 21,
+ kDefaultDpi = 22,
+ kNonDefaultDpi = 23,
+ kPin = 24,
+ kFitToPaper = 25,
+ kMaxValue = kFitToPaper
+};
+
+// This enum is used to back an UMA histogram, and should therefore be treated
+// as append only.
+enum class UserActionBuckets {
+ kPrintToPrinter = 0,
+ kPrintToPdf = 1,
+ kCancel = 2,
+ kFallbackToAdvancedSettingsDialog = 3,
+ kPreviewFailed = 4,
+ kPreviewStarted = 5,
+ // kInitiatorCrashed = 6, // no longer used
+ kInitiatorClosed = 7,
+ kPrintWithCloudPrint = 8,
+ kPrintWithPrivet = 9,
+ kPrintWithExtension = 10,
+ kOpenInMacPreview = 11,
+ kPrintToGoogleDrive = 12,
+ kMaxValue = kPrintToGoogleDrive
+};
+
+// Record the number of local printers.
+void ReportNumberOfPrinters(size_t number);
+
+void ReportPrintDocumentTypeAndSizeHistograms(PrintDocumentTypeBuckets doctype,
+ size_t average_page_size_in_kb);
+
+// Track the popularity of print settings and report the stats.
+void ReportPrintSettingsStats(const base::Value& print_settings,
+ const base::Value& preview_settings,
+ bool is_pdf);
+
+// Record the number of times the user requests to regenerate preview data
+// before cancelling.
+void ReportRegeneratePreviewRequestCountBeforeCancel(size_t count);
+
+// Record the number of times the user requests to regenerate preview data
+// before printing.
+void ReportRegeneratePreviewRequestCountBeforePrint(size_t count);
+
+void ReportUserActionHistogram(UserActionBuckets event);
+
+} // namespace printing
+
+#endif // CHROME_BROWSER_UI_WEBUI_PRINT_PREVIEW_PRINT_PREVIEW_METRICS_H_
diff --git a/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.cc b/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
index cf3c71f478d..43cddc1495e 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
@@ -8,33 +8,38 @@
#include <utility>
#include <vector>
+#include "base/base_paths.h"
#include "base/bind.h"
#include "base/containers/flat_map.h"
#include "base/containers/id_map.h"
-#include "base/feature_list.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
#include "base/lazy_instance.h"
#include "base/macros.h"
#include "base/memory/ref_counted_memory.h"
#include "base/metrics/histogram_functions.h"
+#include "base/path_service.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "base/synchronization/lock.h"
+#include "base/task/post_task.h"
#include "base/values.h"
#include "build/build_config.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part.h"
#include "chrome/browser/printing/background_printing_manager.h"
+#include "chrome/browser/printing/print_job_manager.h"
#include "chrome/browser/printing/print_preview_data_service.h"
+#include "chrome/browser/printing/printer_query.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/chrome_pages.h"
#include "chrome/browser/ui/webui/metrics_handler.h"
#include "chrome/browser/ui/webui/print_preview/print_preview_handler.h"
#include "chrome/browser/ui/webui/theme_source.h"
#include "chrome/browser/ui/webui/webui_util.h"
-#include "chrome/common/chrome_features.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/browser_resources.h"
@@ -43,10 +48,13 @@
#include "chrome/grit/generated_resources.h"
#include "chrome/grit/print_preview_resources.h"
#include "chrome/grit/print_preview_resources_map.h"
+#include "chromeos/constants/chromeos_features.h"
#include "components/prefs/pref_service.h"
#include "components/printing/common/print_messages.h"
#include "components/strings/grit/components_strings.h"
#include "components/user_manager/user_manager.h"
+#include "content/public/browser/browser_task_traits.h"
+#include "content/public/browser/browser_thread.h"
#include "content/public/browser/url_data_source.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui_data_source.h"
@@ -54,7 +62,6 @@
#include "printing/page_size_margins.h"
#include "printing/print_job_constants.h"
#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/ui_base_features.h"
#include "ui/base/webui/web_ui_util.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/web_dialogs/web_dialog_delegate.h"
@@ -70,6 +77,7 @@
#include "chrome/browser/ui/webui/managed_ui_handler.h"
#endif
+using content::BrowserThread;
using content::WebContents;
namespace printing {
@@ -90,6 +98,20 @@ constexpr char kGeneratedPath[] =
PrintPreviewUI::TestDelegate* g_test_delegate = nullptr;
+void StopWorker(int document_cookie) {
+ if (document_cookie <= 0)
+ return;
+ scoped_refptr<PrintQueriesQueue> queue =
+ g_browser_process->print_job_manager()->queue();
+ std::unique_ptr<PrinterQuery> printer_query =
+ queue->PopPrinterQuery(document_cookie);
+ if (printer_query) {
+ base::PostTask(
+ FROM_HERE, {BrowserThread::IO},
+ base::BindOnce(&PrinterQuery::StopWorker, std::move(printer_query)));
+ }
+}
+
// Thread-safe wrapper around a base::flat_map to keep track of mappings from
// PrintPreviewUI IDs to most recent print preview request IDs.
class PrintPreviewRequestIdMapWithLock {
@@ -161,6 +183,22 @@ void HandleRequestCallback(const std::string& path,
std::move(callback).Run(data.get());
return;
}
+
+ // May be a test request
+ if (base::EndsWith(path, "/test.pdf", base::CompareCase::SENSITIVE)) {
+ std::string test_pdf_content;
+ base::FilePath test_data_path;
+ CHECK(base::PathService::Get(base::DIR_TEST_DATA, &test_data_path));
+ base::FilePath pdf_path =
+ test_data_path.AppendASCII("pdf/test.pdf").NormalizePathSeparators();
+
+ CHECK(base::ReadFileToString(pdf_path, &test_pdf_content));
+ scoped_refptr<base::RefCountedString> response =
+ base::RefCountedString::TakeString(&test_pdf_content);
+ std::move(callback).Run(response.get());
+ return;
+ }
+
// Invalid request.
auto empty_bytes = base::MakeRefCounted<base::RefCountedBytes>();
std::move(callback).Run(empty_bytes.get());
@@ -293,6 +331,9 @@ void AddPrintPreviewStrings(content::WebUIDataSource* source) {
{"pinErrorMessage", IDS_PRINT_PREVIEW_PIN_ERROR_MESSAGE},
{"pinPlaceholder", IDS_PRINT_PREVIEW_PIN_PLACEHOLDER},
{"printerEulaURL", IDS_PRINT_PREVIEW_EULA_URL},
+ {"sheetsLimitErrorMessage", IDS_PRINT_PREVIEW_SHEETS_LIMIT_ERROR_MESSAGE},
+ {"sheetsLimitLabelSingular", IDS_PRINT_PREVIEW_SHEETS_LIMIT_LABEL_SINGULAR},
+ {"sheetsLimitLabelPlural", IDS_PRINT_PREVIEW_SHEETS_LIMIT_LABEL_PLURAL},
#endif
#if defined(OS_MACOSX)
{"openPdfInPreviewOption", IDS_PRINT_PREVIEW_OPEN_PDF_IN_PREVIEW_APP},
@@ -331,44 +372,31 @@ void AddPrintPreviewFlags(content::WebUIDataSource* source, Profile* profile) {
#endif
source->AddBoolean("isEnterpriseManaged", enterprise_managed);
- bool cloud_printer_handler_enabled =
- base::FeatureList::IsEnabled(features::kCloudPrinterHandler);
- source->AddBoolean("cloudPrinterHandlerEnabled",
- cloud_printer_handler_enabled);
+#if defined(OS_CHROMEOS)
+ source->AddBoolean(
+ "showPrinterStatus",
+ base::FeatureList::IsEnabled(chromeos::features::kPrinterStatus));
+#endif
}
void SetupPrintPreviewPlugin(content::WebUIDataSource* source) {
- static constexpr struct {
- const char* path;
- int id;
- } kPdfResources[] = {
+ static constexpr webui::ResourcePath kPdfResources[] = {
+ {"pdf/bookmark_type.js", IDR_PDF_BOOKMARK_TYPE_JS},
{"pdf/browser_api.js", IDR_PDF_BROWSER_API_JS},
{"pdf/constants.js", IDR_PDF_CONSTANTS_JS},
{"pdf/controller.js", IDR_PDF_CONTROLLER_JS},
{"pdf/elements/icons.js", IDR_PDF_ICONS_JS},
{"pdf/elements/shared-vars.js", IDR_PDF_SHARED_VARS_JS},
- {"pdf/elements/viewer-bookmark.js", IDR_PDF_VIEWER_BOOKMARK_JS},
{"pdf/elements/viewer-error-screen.js", IDR_PDF_VIEWER_ERROR_SCREEN_JS},
-#if defined(OS_CHROMEOS)
- {"pdf/elements/viewer-ink-host.js", IDR_PDF_VIEWER_INK_HOST_JS},
-#endif
- {"pdf/elements/viewer-page-indicator.js", IDR_PDF_VIEWER_PAGE_INDICATOR_JS},
- {"pdf/elements/viewer-page-selector.js", IDR_PDF_VIEWER_PAGE_SELECTOR_JS},
- {"pdf/elements/viewer-password-screen.js",
- IDR_PDF_VIEWER_PASSWORD_SCREEN_JS},
- {"pdf/elements/viewer-pdf-toolbar.js", IDR_PDF_VIEWER_PDF_TOOLBAR_JS},
-#if defined(OS_CHROMEOS)
- {"pdf/elements/viewer-form-warning.js", IDR_PDF_VIEWER_FORM_WARNING_JS},
- {"pdf/elements/viewer-pen-options.js", IDR_PDF_VIEWER_PEN_OPTIONS_JS},
-#endif
- {"pdf/elements/viewer-toolbar-dropdown.js",
- IDR_PDF_VIEWER_TOOLBAR_DROPDOWN_JS},
+ {"pdf/elements/viewer-page-indicator.js",
+ IDR_PRINT_PREVIEW_PDF_VIEWER_PAGE_INDICATOR_JS},
{"pdf/elements/viewer-zoom-button.js", IDR_PDF_VIEWER_ZOOM_BUTTON_JS},
{"pdf/elements/viewer-zoom-toolbar.js", IDR_PDF_VIEWER_ZOOM_SELECTOR_JS},
{"pdf/gesture_detector.js", IDR_PDF_GESTURE_DETECTOR_JS},
{"pdf/index.css", IDR_PDF_INDEX_CSS},
- {"pdf/index.html", IDR_PDF_INDEX_HTML},
- {"pdf/main.js", IDR_PDF_MAIN_JS},
+ {"pdf/index.html", IDR_PRINT_PREVIEW_PDF_INDEX_PP_HTML},
+ {"pdf/main_pp.js", IDR_PRINT_PREVIEW_PDF_MAIN_PP_JS},
+ {"pdf/main_util.js", IDR_PDF_MAIN_UTIL_JS},
{"pdf/metrics.js", IDR_PDF_METRICS_JS},
{"pdf/navigator.js", IDR_PDF_NAVIGATOR_JS},
{"pdf/open_pdf_params_parser.js", IDR_PDF_OPEN_PDF_PARAMS_PARSER_JS},
@@ -379,9 +407,7 @@ void SetupPrintPreviewPlugin(content::WebUIDataSource* source) {
{"pdf/viewport_scroller.js", IDR_PDF_VIEWPORT_SCROLLER_JS},
{"pdf/zoom_manager.js", IDR_PDF_ZOOM_MANAGER_JS},
};
- for (const auto& resource : kPdfResources) {
- source->AddResourcePath(resource.path, resource.id);
- }
+ webui::AddResourcePathsBulk(source, kPdfResources);
source->SetRequestFilter(base::BindRepeating(&ShouldHandleRequestCallback),
base::BindRepeating(&HandleRequestCallback));
@@ -448,6 +474,15 @@ PrintPreviewUI::~PrintPreviewUI() {
ClearPreviewUIId();
}
+mojo::PendingAssociatedRemote<mojom::PrintPreviewUI>
+PrintPreviewUI::BindPrintPreviewUI() {
+ return receiver_.BindNewEndpointAndPassRemote();
+}
+
+bool PrintPreviewUI::IsBound() const {
+ return receiver_.is_bound();
+}
+
void PrintPreviewUI::ClearPreviewUIId() {
if (!id_)
return;
@@ -476,6 +511,9 @@ bool PrintPreviewUI::ParseDataPath(const std::string& path,
int* ui_id,
int* page_index) {
std::string file_path = path.substr(0, path.find_first_of('?'));
+ if (base::EndsWith(file_path, "/test.pdf", base::CompareCase::SENSITIVE))
+ return true;
+
if (!base::EndsWith(file_path, "/print.pdf", base::CompareCase::SENSITIVE))
return false;
@@ -675,9 +713,6 @@ void PrintPreviewUI::OnPreviewDataIsAvailable(
base::UmaHistogramTimes(
"PrintPreview.InitialDisplayTime",
base::TimeTicks::Now() - initial_preview_start_time_);
- base::UmaHistogramCounts1M(
- "PrintPreview.RegeneratePreviewRequest.BeforeFirstData",
- handler_->regenerate_preview_request_count());
initial_preview_start_time_ = base::TimeTicks();
}
@@ -717,6 +752,7 @@ void PrintPreviewUI::OnHidePreviewDialog() {
}
void PrintPreviewUI::OnClosePrintPreviewDialog() {
+ receiver_.reset();
if (dialog_closed_)
return;
dialog_closed_ = true;
@@ -727,11 +763,17 @@ void PrintPreviewUI::OnClosePrintPreviewDialog() {
delegate->OnDialogCloseFromWebUI();
}
-void PrintPreviewUI::OnSetOptionsFromDocument(
- const PrintHostMsg_SetOptionsFromDocument_Params& params,
- int request_id) {
- handler_->SendPrintPresetOptions(params.is_scaling_disabled, params.copies,
- params.duplex, request_id);
+void PrintPreviewUI::SetOptionsFromDocument(
+ const mojom::OptionsFromDocumentParamsPtr params,
+ int32_t request_id) {
+ handler_->SendPrintPresetOptions(params->is_scaling_disabled, params->copies,
+ params->duplex, request_id);
+}
+
+void PrintPreviewUI::PrintPreviewFailed(int32_t document_cookie,
+ int32_t request_id) {
+ StopWorker(document_cookie);
+ OnPrintPreviewFailed(request_id);
}
// static
diff --git a/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.h b/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.h
index 7aca7015dfa..89ade79356c 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.h
+++ b/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.h
@@ -19,13 +19,14 @@
#include "base/optional.h"
#include "base/time/time.h"
#include "chrome/browser/ui/webui/constrained_web_dialog_ui.h"
+#include "components/printing/common/print.mojom.h"
+#include "mojo/public/cpp/bindings/associated_receiver.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
struct PrintHostMsg_DidStartPreview_Params;
struct PrintHostMsg_PreviewIds;
struct PrintHostMsg_RequestPrintPreview_Params;
-struct PrintHostMsg_SetOptionsFromDocument_Params;
namespace base {
class DictionaryValue;
@@ -42,18 +43,28 @@ namespace printing {
class PrintPreviewHandler;
struct PageSizeMargins;
-class PrintPreviewUI : public ConstrainedWebDialogUI {
+class PrintPreviewUI : public ConstrainedWebDialogUI,
+ public mojom::PrintPreviewUI {
public:
explicit PrintPreviewUI(content::WebUI* web_ui);
~PrintPreviewUI() override;
+ mojo::PendingAssociatedRemote<mojom::PrintPreviewUI> BindPrintPreviewUI();
+
// Gets the print preview |data|. |index| is zero-based, and can be
// |COMPLETE_PREVIEW_DOCUMENT_INDEX| to get the entire preview document.
virtual void GetPrintPreviewDataForIndex(
int index,
scoped_refptr<base::RefCountedMemory>* data) const;
+ // printing::mojo::PrintPreviewUI:
+ void SetOptionsFromDocument(const mojom::OptionsFromDocumentParamsPtr params,
+ int32_t request_id) override;
+ void PrintPreviewFailed(int32_t document_cookie, int32_t request_id) override;
+
+ bool IsBound() const;
+
// Setters
void SetInitiatorTitle(const base::string16& initiator_title);
@@ -182,11 +193,6 @@ class PrintPreviewUI : public ConstrainedWebDialogUI {
// Closes the print preview dialog.
virtual void OnClosePrintPreviewDialog();
- // Notifies the WebUI to set print preset options from source PDF.
- void OnSetOptionsFromDocument(
- const PrintHostMsg_SetOptionsFromDocument_Params& params,
- int request_id);
-
// Allows tests to wait until the print preview dialog is loaded.
class TestDelegate {
public:
@@ -296,6 +302,8 @@ class PrintPreviewUI : public ConstrainedWebDialogUI {
// The printable area of the printed document pages.
gfx::Rect printable_area_;
+ mojo::AssociatedReceiver<mojom::PrintPreviewUI> receiver_{this};
+
DISALLOW_COPY_AND_ASSIGN(PrintPreviewUI);
};
diff --git a/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui_browsertest.cc b/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui_browsertest.cc
index 25eb97f2dd1..1664508f9bc 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui_browsertest.cc
@@ -18,6 +18,7 @@
#include "components/prefs/pref_service.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_observer.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
#include "content/public/test/test_utils.h"
diff --git a/chromium/chrome/browser/ui/webui/print_preview/printer_handler.cc b/chromium/chrome/browser/ui/webui/print_preview/printer_handler.cc
index f939659e7d0..2b2a95282ee 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/printer_handler.cc
+++ b/chromium/chrome/browser/ui/webui/print_preview/printer_handler.cc
@@ -5,7 +5,6 @@
#include "chrome/browser/ui/webui/print_preview/printer_handler.h"
#include "build/buildflag.h"
-#include "chrome/browser/ui/webui/print_preview/cloud_printer_handler.h"
#include "chrome/browser/ui/webui/print_preview/extension_printer_handler.h"
#include "chrome/browser/ui/webui/print_preview/pdf_printer_handler.h"
#include "chrome/common/buildflags.h"
@@ -23,11 +22,6 @@
namespace printing {
// static
-std::unique_ptr<PrinterHandler> PrinterHandler::CreateForCloudPrinters() {
- return std::make_unique<CloudPrinterHandler>();
-}
-
-// static
std::unique_ptr<PrinterHandler> PrinterHandler::CreateForExtensionPrinters(
Profile* profile) {
return std::make_unique<ExtensionPrinterHandler>(profile);
@@ -76,6 +70,12 @@ void PrinterHandler::StartGetEulaUrl(const std::string& destination_id,
GetEulaUrlCallback callback) {
NOTREACHED();
}
+
+void PrinterHandler::StartPrinterStatusRequest(
+ const std::string& printer_id,
+ PrinterStatusRequestCallback callback) {
+ NOTREACHED();
+}
#endif
} // namespace printing
diff --git a/chromium/chrome/browser/ui/webui/print_preview/printer_handler.h b/chromium/chrome/browser/ui/webui/print_preview/printer_handler.h
index c30ed7b996a..6fa82c3a521 100644
--- a/chromium/chrome/browser/ui/webui/print_preview/printer_handler.h
+++ b/chromium/chrome/browser/ui/webui/print_preview/printer_handler.h
@@ -52,12 +52,10 @@ class PrinterHandler {
#if defined(OS_CHROMEOS)
using GetEulaUrlCallback =
base::OnceCallback<void(const std::string& license)>;
+ using PrinterStatusRequestCallback =
+ base::OnceCallback<void(const base::Value& cups_printer_status)>;
#endif
- // Creates an instance of a PrinterHandler for cloud printers.
- // Note: Implementation currently empty, see https://crbug.com/829414
- static std::unique_ptr<PrinterHandler> CreateForCloudPrinters();
-
// Creates an instance of a PrinterHandler for extension printers.
static std::unique_ptr<PrinterHandler> CreateForExtensionPrinters(
Profile* profile);
@@ -125,6 +123,12 @@ class PrinterHandler {
// |callback| should be called in response to the request.
virtual void StartGetEulaUrl(const std::string& destination_id,
GetEulaUrlCallback callback);
+
+ // Initiates a status request for specified printer.
+ // |printer_id|: Printer id.
+ // |callback|: should be called in response to the request.
+ virtual void StartPrinterStatusRequest(const std::string& printer_id,
+ PrinterStatusRequestCallback callback);
#endif
};
diff --git a/chromium/chrome/browser/ui/webui/profile_helper_browsertest.cc b/chromium/chrome/browser/ui/webui/profile_helper_browsertest.cc
index 9441a583722..cba68b400d2 100644
--- a/chromium/chrome/browser/ui/webui/profile_helper_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/profile_helper_browsertest.cc
@@ -15,6 +15,7 @@
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/browser/browsing_data_remover.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browsing_data_remover_test_util.h"
#include "content/public/test/test_utils.h"
#include "content/public/test/test_web_ui.h"
diff --git a/chromium/chrome/browser/ui/webui/quota_internals/quota_internals_proxy.cc b/chromium/chrome/browser/ui/webui/quota_internals/quota_internals_proxy.cc
index 100c0a069a6..db85c160a40 100644
--- a/chromium/chrome/browser/ui/webui/quota_internals/quota_internals_proxy.cc
+++ b/chromium/chrome/browser/ui/webui/quota_internals/quota_internals_proxy.cc
@@ -34,34 +34,33 @@ void QuotaInternalsProxy::RequestInfo(
}
quota_manager_ = quota_manager;
- quota_manager_->GetQuotaSettings(base::Bind(
+ quota_manager_->GetQuotaSettings(base::BindOnce(
&QuotaInternalsProxy::DidGetSettings, weak_factory_.GetWeakPtr()));
- quota_manager_->GetStorageCapacity(base::Bind(
+ quota_manager_->GetStorageCapacity(base::BindOnce(
&QuotaInternalsProxy::DidGetCapacity, weak_factory_.GetWeakPtr()));
quota_manager_->GetGlobalUsage(
StorageType::kTemporary,
- base::Bind(&QuotaInternalsProxy::DidGetGlobalUsage,
- weak_factory_.GetWeakPtr(), StorageType::kTemporary));
+ base::BindOnce(&QuotaInternalsProxy::DidGetGlobalUsage,
+ weak_factory_.GetWeakPtr(), StorageType::kTemporary));
quota_manager_->GetGlobalUsage(
StorageType::kPersistent,
- base::Bind(&QuotaInternalsProxy::DidGetGlobalUsage,
- weak_factory_.GetWeakPtr(), StorageType::kPersistent));
+ base::BindOnce(&QuotaInternalsProxy::DidGetGlobalUsage,
+ weak_factory_.GetWeakPtr(), StorageType::kPersistent));
quota_manager_->GetGlobalUsage(
StorageType::kSyncable,
- base::Bind(&QuotaInternalsProxy::DidGetGlobalUsage,
- weak_factory_.GetWeakPtr(), StorageType::kSyncable));
+ base::BindOnce(&QuotaInternalsProxy::DidGetGlobalUsage,
+ weak_factory_.GetWeakPtr(), StorageType::kSyncable));
- quota_manager_->DumpQuotaTable(
- base::Bind(&QuotaInternalsProxy::DidDumpQuotaTable,
- weak_factory_.GetWeakPtr()));
+ quota_manager_->DumpQuotaTable(base::BindOnce(
+ &QuotaInternalsProxy::DidDumpQuotaTable, weak_factory_.GetWeakPtr()));
quota_manager_->DumpOriginInfoTable(
- base::Bind(&QuotaInternalsProxy::DidDumpOriginInfoTable,
- weak_factory_.GetWeakPtr()));
+ base::BindOnce(&QuotaInternalsProxy::DidDumpOriginInfoTable,
+ weak_factory_.GetWeakPtr()));
std::map<std::string, std::string> stats = quota_manager_->GetStatistics();
ReportStatistics(stats);
@@ -218,12 +217,10 @@ void QuotaInternalsProxy::VisitHost(const std::string& host, StorageType type) {
void QuotaInternalsProxy::GetHostUsage(const std::string& host,
StorageType type) {
DCHECK(quota_manager_.get());
- quota_manager_->GetHostUsage(host,
- type,
- base::Bind(&QuotaInternalsProxy::DidGetHostUsage,
- weak_factory_.GetWeakPtr(),
- host,
- type));
+ quota_manager_->GetHostUsage(
+ host, type,
+ base::BindOnce(&QuotaInternalsProxy::DidGetHostUsage,
+ weak_factory_.GetWeakPtr(), host, type));
}
} // namespace quota_internals
diff --git a/chromium/chrome/browser/ui/webui/quota_internals/quota_internals_types.cc b/chromium/chrome/browser/ui/webui/quota_internals/quota_internals_types.cc
index d9bd3120959..ec87f96d4f2 100644
--- a/chromium/chrome/browser/ui/webui/quota_internals/quota_internals_types.cc
+++ b/chromium/chrome/browser/ui/webui/quota_internals/quota_internals_types.cc
@@ -6,7 +6,7 @@
#include <utility>
-#include "base/logging.h"
+#include "base/check.h"
#include "base/values.h"
#include "net/base/url_util.h"
diff --git a/chromium/chrome/browser/ui/webui/sandbox/sandbox_handler.cc b/chromium/chrome/browser/ui/webui/sandbox/sandbox_handler.cc
index 1e11b2d01ec..186ef33a6d4 100644
--- a/chromium/chrome/browser/ui/webui/sandbox/sandbox_handler.cc
+++ b/chromium/chrome/browser/ui/webui/sandbox/sandbox_handler.cc
@@ -30,8 +30,6 @@ namespace {
// This only includes OS_WIN included SandboxType values.
std::string GetSandboxTypeInEnglish(content::SandboxType sandbox_type) {
switch (sandbox_type) {
- case content::SandboxType::kInvalid:
- return "Invalid";
case content::SandboxType::kNoSandbox:
return "Unsandboxed";
case content::SandboxType::kNoSandboxAndElevatedPrivileges:
@@ -54,14 +52,16 @@ std::string GetSandboxTypeInEnglish(content::SandboxType sandbox_type) {
return "Print Compositor";
case content::SandboxType::kAudio:
return "Audio";
- case content::SandboxType::kSoda:
- return "SODA";
+ case content::SandboxType::kSpeechRecognition:
+ return "Speech Recognition";
case content::SandboxType::kProxyResolver:
return "Proxy Resolver";
case content::SandboxType::kPdfConversion:
return "PDF Conversion";
case content::SandboxType::kSharingService:
return "Sharing";
+ case content::SandboxType::kVideoCapture:
+ return "Video Capture";
}
}
@@ -149,8 +149,8 @@ void SandboxHandler::FetchBrowserChildProcessesCompleted(
browser_processes_ = std::move(browser_processes);
service_manager::SandboxWin::GetPolicyDiagnostics(
- base::Bind(&SandboxHandler::FetchSandboxDiagnosticsCompleted,
- weak_ptr_factory_.GetWeakPtr()));
+ base::BindOnce(&SandboxHandler::FetchSandboxDiagnosticsCompleted,
+ weak_ptr_factory_.GetWeakPtr()));
}
// This runs nested inside SandboxWin so we get out quickly.
diff --git a/chromium/chrome/browser/ui/webui/settings/OWNERS b/chromium/chrome/browser/ui/webui/settings/OWNERS
index b19cbb7cc52..b0196fa4aa9 100644
--- a/chromium/chrome/browser/ui/webui/settings/OWNERS
+++ b/chromium/chrome/browser/ui/webui/settings/OWNERS
@@ -2,9 +2,10 @@ file://chrome/browser/resources/settings/OWNERS
per-file people_handler*=tangltom@chromium.org
+per-file *site_settings*=msramek@chromium.org
+per-file *site_settings*=sauski@google.com
per-file safe_browsing_handler*=msramek@chromium.org
per-file safe_browsing_handler*=sauski@google.com
-per-file site_settings_handler*=msramek@chromium.org
-per-file site_settings_handler*=sauski@google.com
+per-file safety_check_handler*=andzaytsev@google.com
# COMPONENT: UI>Settings
diff --git a/chromium/chrome/browser/ui/webui/settings/about_handler.cc b/chromium/chrome/browser/ui/webui/settings/about_handler.cc
index bcc0134af2f..9f615ac73cb 100644
--- a/chromium/chrome/browser/ui/webui/settings/about_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/about_handler.cc
@@ -13,7 +13,6 @@
#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
-#include "base/i18n/message_formatter.h"
#include "base/location.h"
#include "base/macros.h"
#include "base/metrics/user_metrics.h"
@@ -21,8 +20,6 @@
#include "base/strings/string16.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/system/sys_info.h"
#include "base/task/post_task.h"
#include "base/task/thread_pool.h"
#include "base/time/time.h"
@@ -32,13 +29,11 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part.h"
#include "chrome/browser/chrome_content_browser_client.h"
-#include "chrome/browser/obsolete_system/obsolete_system.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/chrome_pages.h"
#include "chrome/browser/upgrade_detector/upgrade_detector.h"
-#include "chrome/common/channel_info.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/chromium_strings.h"
@@ -46,9 +41,7 @@
#include "components/google/core/common/google_util.h"
#include "components/policy/core/common/policy_namespace.h"
#include "components/policy/policy_constants.h"
-#include "components/strings/grit/components_chromium_strings.h"
#include "components/strings/grit/components_strings.h"
-#include "components/version_info/version_info.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui.h"
@@ -105,21 +98,6 @@ struct RegulatoryLabel {
const std::string image_url;
};
-// Returns the link to the safety info for the device (if it exists).
-std::string GetSafetyInfoLink() {
- const std::vector<std::string> board =
- base::SplitString(base::SysInfo::GetLsbReleaseBoard(), "-",
- base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
- if (board[0] == "nocturne") {
- return chrome::kChromeUISafetyPixelSlateURL;
- }
- if (board[0] == "eve" || board[0] == "atlas") {
- return chrome::kChromeUISafetyPixelbookURL;
- }
-
- return std::string();
-}
-
// Returns message that informs user that for update it's better to
// connect to a network of one of the allowed types.
base::string16 GetAllowedConnectionTypesMessage() {
@@ -292,86 +270,6 @@ AboutHandler::~AboutHandler() {
UpgradeDetector::GetInstance()->RemoveObserver(this);
}
-AboutHandler* AboutHandler::Create(content::WebUIDataSource* html_source,
- Profile* profile) {
- html_source->AddString(
- "aboutBrowserVersion",
- l10n_util::GetStringFUTF16(
- IDS_SETTINGS_ABOUT_PAGE_BROWSER_VERSION,
- base::UTF8ToUTF16(version_info::GetVersionNumber()),
- l10n_util::GetStringUTF16(version_info::IsOfficialBuild()
- ? IDS_VERSION_UI_OFFICIAL
- : IDS_VERSION_UI_UNOFFICIAL),
- base::UTF8ToUTF16(chrome::GetChannelName()),
- l10n_util::GetStringUTF16(sizeof(void*) == 8
- ? IDS_VERSION_UI_64BIT
- : IDS_VERSION_UI_32BIT)));
-
- html_source->AddString(
- "aboutProductCopyright",
- base::i18n::MessageFormatter::FormatWithNumberedArgs(
- l10n_util::GetStringUTF16(IDS_ABOUT_VERSION_COPYRIGHT),
- base::Time::Now()));
-
- base::string16 license = l10n_util::GetStringFUTF16(
- IDS_VERSION_UI_LICENSE, base::ASCIIToUTF16(chrome::kChromiumProjectURL),
- base::ASCIIToUTF16(chrome::kChromeUICreditsURL));
- html_source->AddString("aboutProductLicense", license);
-
- html_source->AddBoolean("aboutObsoleteNowOrSoon",
- ObsoleteSystem::IsObsoleteNowOrSoon());
- html_source->AddBoolean("aboutObsoleteEndOfTheLine",
- ObsoleteSystem::IsObsoleteNowOrSoon() &&
- ObsoleteSystem::IsEndOfTheLine());
- html_source->AddString("aboutObsoleteSystem",
- ObsoleteSystem::LocalizedObsoleteString());
- html_source->AddString("aboutObsoleteSystemURL",
- ObsoleteSystem::GetLinkURL());
-
-#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
- base::string16 tos = l10n_util::GetStringFUTF16(
- IDS_ABOUT_TERMS_OF_SERVICE, base::UTF8ToUTF16(chrome::kChromeUITermsURL));
- html_source->AddString("aboutProductTos", tos);
-#endif
-
-#if defined(OS_CHROMEOS)
- std::string safetyInfoLink = GetSafetyInfoLink();
- html_source->AddBoolean("shouldShowSafetyInfo", !safetyInfoLink.empty());
-#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
- html_source->AddString(
- "aboutProductSafety",
- l10n_util::GetStringUTF16(IDS_ABOUT_SAFETY_INFORMATION));
- html_source->AddString("aboutProductSafetyURL",
- base::UTF8ToUTF16(safetyInfoLink));
-#endif
-
- base::string16 os_license = l10n_util::GetStringFUTF16(
- IDS_ABOUT_CROS_VERSION_LICENSE,
- base::ASCIIToUTF16(chrome::kChromeUIOSCreditsURL));
- html_source->AddString("aboutProductOsLicense", os_license);
- base::string16 os_with_linux_license = l10n_util::GetStringFUTF16(
- IDS_ABOUT_CROS_WITH_LINUX_VERSION_LICENSE,
- base::ASCIIToUTF16(chrome::kChromeUIOSCreditsURL),
- base::ASCIIToUTF16(chrome::kChromeUICrostiniCreditsURL));
- html_source->AddString("aboutProductOsWithLinuxLicense",
- os_with_linux_license);
- html_source->AddBoolean("aboutEnterpriseManaged", IsEnterpriseManaged());
- html_source->AddBoolean("aboutIsArcEnabled",
- arc::IsArcPlayStoreEnabledForProfile(profile));
- html_source->AddBoolean("aboutIsDeveloperMode",
- base::CommandLine::ForCurrentProcess()->HasSwitch(
- chromeos::switches::kSystemDevMode));
-
- html_source->AddString("endOfLifeMessage",
- l10n_util::GetStringFUTF16(
- IDS_SETTINGS_ABOUT_PAGE_LAST_UPDATE_MESSAGE,
- ui::GetChromeOSDeviceName(),
- base::ASCIIToUTF16(chrome::kEolNotificationURL)));
-#endif
-
- return new AboutHandler();
-}
-
void AboutHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback(
"aboutPageReady", base::BindRepeating(&AboutHandler::HandlePageReady,
@@ -697,8 +595,8 @@ void AboutHandler::RequestUpdateOverCellular(const std::string& update_version,
void AboutHandler::HandleRefreshTPMFirmwareUpdateStatus(
const base::ListValue* args) {
chromeos::tpm_firmware_update::GetAvailableUpdateModes(
- base::Bind(&AboutHandler::RefreshTPMFirmwareUpdateStatus,
- weak_factory_.GetWeakPtr()),
+ base::BindOnce(&AboutHandler::RefreshTPMFirmwareUpdateStatus,
+ weak_factory_.GetWeakPtr()),
base::TimeDelta());
}
diff --git a/chromium/chrome/browser/ui/webui/settings/about_handler.h b/chromium/chrome/browser/ui/webui/settings/about_handler.h
index e69de9f2d82..4b8bf98b5a3 100644
--- a/chromium/chrome/browser/ui/webui/settings/about_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/about_handler.h
@@ -28,13 +28,7 @@ namespace base {
class DictionaryValue;
class FilePath;
class ListValue;
-}
-
-namespace content {
-class WebUIDataSource;
-}
-
-class Profile;
+} // namespace base
namespace settings {
@@ -45,9 +39,6 @@ class AboutHandler : public settings::SettingsPageUIHandler,
AboutHandler();
~AboutHandler() override;
- static AboutHandler* Create(content::WebUIDataSource* html_source,
- Profile* profile);
-
// WebUIMessageHandler implementation.
void RegisterMessages() override;
void OnJavascriptAllowed() override;
diff --git a/chromium/chrome/browser/ui/webui/settings/accessibility_main_handler.cc b/chromium/chrome/browser/ui/webui/settings/accessibility_main_handler.cc
index b93fe9f7688..7727acbd938 100644
--- a/chromium/chrome/browser/ui/webui/settings/accessibility_main_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/accessibility_main_handler.cc
@@ -21,17 +21,9 @@
namespace settings {
-AccessibilityMainHandler::AccessibilityMainHandler() {
-#if defined(OS_CHROMEOS)
- accessibility_subscription_ =
- chromeos::AccessibilityManager::Get()->RegisterCallback(
- base::BindRepeating(
- &AccessibilityMainHandler::OnAccessibilityStatusChanged,
- base::Unretained(this)));
-#endif // defined(OS_CHROMEOS)
-}
+AccessibilityMainHandler::AccessibilityMainHandler() = default;
-AccessibilityMainHandler::~AccessibilityMainHandler() {}
+AccessibilityMainHandler::~AccessibilityMainHandler() = default;
void AccessibilityMainHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback(
@@ -45,15 +37,26 @@ void AccessibilityMainHandler::RegisterMessages() {
base::Unretained(this)));
}
-void AccessibilityMainHandler::OnAXModeAdded(ui::AXMode mode) {
- HandleGetScreenReaderState(nullptr);
+void AccessibilityMainHandler::OnJavascriptAllowed() {
+#if defined(OS_CHROMEOS)
+ accessibility_subscription_ =
+ chromeos::AccessibilityManager::Get()->RegisterCallback(
+ base::BindRepeating(
+ &AccessibilityMainHandler::OnAccessibilityStatusChanged,
+ base::Unretained(this)));
+#endif // defined(OS_CHROMEOS)
+}
+
+void AccessibilityMainHandler::OnJavascriptDisallowed() {
+#if defined(OS_CHROMEOS)
+ accessibility_subscription_.reset();
+#endif // defined(OS_CHROMEOS)
}
void AccessibilityMainHandler::HandleGetScreenReaderState(
const base::ListValue* args) {
- base::Value result(accessibility_state_utils::IsScreenReaderEnabled());
AllowJavascript();
- FireWebUIListener("screen-reader-state-changed", result);
+ SendScreenReaderStateChanged();
}
void AccessibilityMainHandler::HandleCheckAccessibilityImageLabels(
@@ -71,12 +74,17 @@ void AccessibilityMainHandler::HandleCheckAccessibilityImageLabels(
gfx::Point(rect.CenterPoint().x(), rect.y()), std::move(model));
}
+void AccessibilityMainHandler::SendScreenReaderStateChanged() {
+ base::Value result(accessibility_state_utils::IsScreenReaderEnabled());
+ FireWebUIListener("screen-reader-state-changed", result);
+}
+
#if defined(OS_CHROMEOS)
void AccessibilityMainHandler::OnAccessibilityStatusChanged(
const chromeos::AccessibilityStatusEventDetails& details) {
if (details.notification_type ==
chromeos::ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK) {
- HandleGetScreenReaderState(nullptr);
+ SendScreenReaderStateChanged();
}
}
#endif // defined(OS_CHROMEOS)
diff --git a/chromium/chrome/browser/ui/webui/settings/accessibility_main_handler.h b/chromium/chrome/browser/ui/webui/settings/accessibility_main_handler.h
index 966daba4148..c37f966672f 100644
--- a/chromium/chrome/browser/ui/webui/settings/accessibility_main_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/accessibility_main_handler.h
@@ -7,8 +7,6 @@
#include "base/macros.h"
#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
-#include "ui/accessibility/ax_mode.h"
-#include "ui/accessibility/ax_mode_observer.h"
#if defined(OS_CHROMEOS)
#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
#endif // defined(OS_CHROMEOS)
@@ -21,24 +19,22 @@ namespace settings {
// Settings handler for the main accessibility settings page,
// chrome://settings/accessibility.
-class AccessibilityMainHandler : public ::settings::SettingsPageUIHandler,
- public ui::AXModeObserver {
+class AccessibilityMainHandler : public ::settings::SettingsPageUIHandler {
public:
AccessibilityMainHandler();
~AccessibilityMainHandler() override;
// SettingsPageUIHandler implementation.
void RegisterMessages() override;
- void OnJavascriptAllowed() override {}
- void OnJavascriptDisallowed() override {}
-
- // AXModeObserver implementation.
- void OnAXModeAdded(ui::AXMode mode) override;
+ void OnJavascriptAllowed() override;
+ void OnJavascriptDisallowed() override;
void HandleGetScreenReaderState(const base::ListValue* args);
void HandleCheckAccessibilityImageLabels(const base::ListValue* args);
private:
+ void SendScreenReaderStateChanged();
+
#if defined(OS_CHROMEOS)
void OnAccessibilityStatusChanged(
const chromeos::AccessibilityStatusEventDetails& details);
diff --git a/chromium/chrome/browser/ui/webui/settings/appearance_handler.cc b/chromium/chrome/browser/ui/webui/settings/appearance_handler.cc
index 4fceb887f1c..c4f57a6ee98 100644
--- a/chromium/chrome/browser/ui/webui/settings/appearance_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/appearance_handler.cc
@@ -5,7 +5,7 @@
#include "chrome/browser/ui/webui/settings/appearance_handler.h"
#include "base/bind.h"
-#include "base/logging.h"
+#include "base/notreached.h"
#include "base/values.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/themes/theme_service.h"
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/BUILD.gn b/chromium/chrome/browser/ui/webui/settings/chromeos/BUILD.gn
new file mode 100644
index 00000000000..e920c48a39b
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/BUILD.gn
@@ -0,0 +1,11 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+group("mojom_js") {
+ public_deps = [
+ "constants:mojom_js",
+ "search:mojo_bindings_js",
+ "//chrome/browser/ui/webui/app_management:mojo_bindings_js",
+ ]
+}
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/about_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/about_section.cc
new file mode 100644
index 00000000000..ea9dc60efd8
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/about_section.cc
@@ -0,0 +1,274 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/about_section.h"
+
+#include "base/i18n/message_formatter.h"
+#include "base/no_destructor.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/system/sys_info.h"
+#include "build/branding_buildflags.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/browser_process_platform_part.h"
+#include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
+#include "chrome/browser/obsolete_system/obsolete_system.h"
+#include "chrome/browser/ui/webui/management_ui.h"
+#include "chrome/browser/ui/webui/settings/about_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/channel_info.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/grit/chromium_strings.h"
+#include "chrome/grit/generated_resources.h"
+#include "chromeos/dbus/constants/dbus_switches.h"
+#include "components/strings/grit/components_chromium_strings.h"
+#include "components/strings/grit/components_strings.h"
+#include "components/user_manager/user_manager.h"
+#include "components/version_info/version_info.h"
+#include "components/version_ui/version_ui_constants.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/webui/web_ui_util.h"
+#include "ui/chromeos/devicetype_utils.h"
+
+namespace chromeos {
+namespace settings {
+namespace {
+
+const std::vector<SearchConcept>& GetAboutSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_ABOUT_CHROME_OS_DETAILED_BUILD,
+ mojom::kDetailedBuildInfoSubpagePath,
+ mojom::SearchResultIcon::kChrome,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kDetailedBuildInfo},
+ {IDS_OS_SETTINGS_TAG_ABOUT_CHROME_OS_DETAILED_BUILD_ALT1,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_ABOUT_CHROME_OS,
+ mojom::kAboutChromeOsDetailsSubpagePath,
+ mojom::SearchResultIcon::kChrome,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kAboutChromeOsDetails}},
+ {IDS_OS_SETTINGS_TAG_ABOUT_CHROME_OS_VERSION,
+ mojom::kAboutChromeOsDetailsSubpagePath,
+ mojom::SearchResultIcon::kChrome,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kAboutChromeOsDetails}},
+ {IDS_OS_SETTINGS_TAG_ABOUT_CHROME_OS_CHANNEL,
+ mojom::kDetailedBuildInfoSubpagePath,
+ mojom::SearchResultIcon::kChrome,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kChangeChromeChannel}},
+ });
+ return *tags;
+}
+
+// Returns the link to the safety info for the device (if it exists).
+std::string GetSafetyInfoLink() {
+ const std::vector<std::string> board =
+ base::SplitString(base::SysInfo::GetLsbReleaseBoard(), "-",
+ base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
+ if (board[0] == "nocturne") {
+ return chrome::kChromeUISafetyPixelSlateURL;
+ }
+ if (board[0] == "eve" || board[0] == "atlas") {
+ return chrome::kChromeUISafetyPixelbookURL;
+ }
+
+ return std::string();
+}
+
+// Returns true if the device is enterprise managed, false otherwise.
+bool IsEnterpriseManaged() {
+ policy::BrowserPolicyConnectorChromeOS* connector =
+ g_browser_process->platform_part()->browser_policy_connector_chromeos();
+ return connector->IsEnterpriseManaged();
+}
+
+bool IsDeviceManaged() {
+ policy::BrowserPolicyConnectorChromeOS* connector =
+ g_browser_process->platform_part()->browser_policy_connector_chromeos();
+ return connector->IsEnterpriseManaged();
+}
+
+} // namespace
+
+AboutSection::AboutSection(Profile* profile,
+ SearchTagRegistry* search_tag_registry)
+ : OsSettingsSection(profile, search_tag_registry) {
+ registry()->AddSearchTags(GetAboutSearchConcepts());
+}
+
+AboutSection::~AboutSection() = default;
+
+void AboutSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
+ // Top level About page strings.
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"aboutProductLogoAlt", IDS_SHORT_PRODUCT_LOGO_ALT_TEXT},
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+ {"aboutReportAnIssue", IDS_SETTINGS_ABOUT_PAGE_REPORT_AN_ISSUE},
+#endif
+ {"aboutRelaunch", IDS_SETTINGS_ABOUT_PAGE_RELAUNCH},
+ {"aboutUpgradeCheckStarted", IDS_SETTINGS_ABOUT_UPGRADE_CHECK_STARTED},
+ {"aboutUpgradeRelaunch", IDS_SETTINGS_UPGRADE_SUCCESSFUL_RELAUNCH},
+ {"aboutUpgradeUpdating", IDS_SETTINGS_UPGRADE_UPDATING},
+ {"aboutUpgradeUpdatingPercent", IDS_SETTINGS_UPGRADE_UPDATING_PERCENT},
+ {"aboutGetHelpUsingChrome", IDS_SETTINGS_GET_HELP_USING_CHROME},
+ {"aboutPageTitle", IDS_SETTINGS_ABOUT_PROGRAM},
+ {"aboutProductTitle", IDS_PRODUCT_NAME},
+
+ {"aboutEndOfLifeTitle", IDS_SETTINGS_ABOUT_PAGE_END_OF_LIFE_TITLE},
+ {"aboutRelaunchAndPowerwash",
+ IDS_SETTINGS_ABOUT_PAGE_RELAUNCH_AND_POWERWASH},
+ {"aboutRollbackInProgress", IDS_SETTINGS_UPGRADE_ROLLBACK_IN_PROGRESS},
+ {"aboutRollbackSuccess", IDS_SETTINGS_UPGRADE_ROLLBACK_SUCCESS},
+ {"aboutUpgradeUpdatingChannelSwitch",
+ IDS_SETTINGS_UPGRADE_UPDATING_CHANNEL_SWITCH},
+ {"aboutUpgradeSuccessChannelSwitch",
+ IDS_SETTINGS_UPGRADE_SUCCESSFUL_CHANNEL_SWITCH},
+ {"aboutTPMFirmwareUpdateTitle",
+ IDS_SETTINGS_ABOUT_TPM_FIRMWARE_UPDATE_TITLE},
+ {"aboutTPMFirmwareUpdateDescription",
+ IDS_SETTINGS_ABOUT_TPM_FIRMWARE_UPDATE_DESCRIPTION},
+
+ // About page, channel switcher dialog.
+ {"aboutChangeChannel", IDS_SETTINGS_ABOUT_PAGE_CHANGE_CHANNEL},
+ {"aboutChangeChannelAndPowerwash",
+ IDS_SETTINGS_ABOUT_PAGE_CHANGE_CHANNEL_AND_POWERWASH},
+ {"aboutDelayedWarningMessage",
+ IDS_SETTINGS_ABOUT_PAGE_DELAYED_WARNING_MESSAGE},
+ {"aboutDelayedWarningTitle", IDS_SETTINGS_ABOUT_PAGE_DELAYED_WARNING_TITLE},
+ {"aboutPowerwashWarningMessage",
+ IDS_SETTINGS_ABOUT_PAGE_POWERWASH_WARNING_MESSAGE},
+ {"aboutPowerwashWarningTitle",
+ IDS_SETTINGS_ABOUT_PAGE_POWERWASH_WARNING_TITLE},
+ {"aboutUnstableWarningMessage",
+ IDS_SETTINGS_ABOUT_PAGE_UNSTABLE_WARNING_MESSAGE},
+ {"aboutUnstableWarningTitle",
+ IDS_SETTINGS_ABOUT_PAGE_UNSTABLE_WARNING_TITLE},
+ {"aboutChannelDialogBeta", IDS_SETTINGS_ABOUT_PAGE_DIALOG_CHANNEL_BETA},
+ {"aboutChannelDialogDev", IDS_SETTINGS_ABOUT_PAGE_DIALOG_CHANNEL_DEV},
+ {"aboutChannelDialogStable", IDS_SETTINGS_ABOUT_PAGE_DIALOG_CHANNEL_STABLE},
+
+ // About page, update warning dialog.
+ {"aboutUpdateWarningMessage",
+ IDS_SETTINGS_ABOUT_PAGE_UPDATE_WARNING_MESSAGE},
+ {"aboutUpdateWarningTitle", IDS_SETTINGS_ABOUT_PAGE_UPDATE_WARNING_TITLE},
+
+ // Detailed build information
+ {"aboutBuildDetailsTitle", IDS_OS_SETTINGS_ABOUT_PAGE_BUILD_DETAILS},
+ {"aboutChannelBeta", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL_BETA},
+ {"aboutChannelCanary", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL_CANARY},
+ {"aboutChannelDev", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL_DEV},
+ {"aboutChannelLabel", IDS_SETTINGS_ABOUT_PAGE_CHANNEL},
+ {"aboutChannelStable", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL_STABLE},
+ {"aboutCheckForUpdates", IDS_SETTINGS_ABOUT_PAGE_CHECK_FOR_UPDATES},
+ {"aboutCurrentlyOnChannel", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL},
+ {"aboutDetailedBuildInfo", IDS_SETTINGS_ABOUT_PAGE_DETAILED_BUILD_INFO},
+ {version_ui::kApplicationLabel, IDS_PRODUCT_NAME},
+ {version_ui::kPlatform, IDS_PLATFORM_LABEL},
+ {version_ui::kFirmwareVersion, IDS_VERSION_UI_FIRMWARE_VERSION},
+ {version_ui::kARC, IDS_ARC_LABEL},
+ {"aboutBuildDetailsCopyTooltipLabel",
+ IDS_OS_SETTINGS_ABOUT_PAGE_BUILD_DETAILS_COPY_TOOLTIP_LABEL},
+ {"aboutIsArcStatusTitle", IDS_OS_SETTINGS_ABOUT_ARC_STATUS_TITLE},
+ {"aboutIsDeveloperModeTitle", IDS_OS_SETTINGS_ABOUT_DEVELOPER_MODE},
+ {"isEnterpriseManagedTitle",
+ IDS_OS_SETTINGS_ABOUT_PAGE_ENTERPRISE_ENNROLLED_TITLE},
+ {"aboutOsPageTitle", IDS_SETTINGS_ABOUT_OS},
+ {"aboutGetHelpUsingChromeOs", IDS_SETTINGS_GET_HELP_USING_CHROME_OS},
+ {"aboutOsProductTitle", IDS_PRODUCT_OS_NAME},
+ {"aboutReleaseNotesOffline", IDS_SETTINGS_ABOUT_PAGE_RELEASE_NOTES},
+ {"aboutShowReleaseNotes", IDS_SETTINGS_ABOUT_PAGE_SHOW_RELEASE_NOTES},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ html_source->AddString("aboutTPMFirmwareUpdateLearnMoreURL",
+ chrome::kTPMFirmwareUpdateLearnMoreURL);
+ html_source->AddString(
+ "aboutUpgradeUpToDate",
+ ui::SubstituteChromeOSDeviceType(IDS_SETTINGS_UPGRADE_UP_TO_DATE));
+ html_source->AddString("managementPage",
+ ManagementUI::GetManagementPageSubtitle(profile()));
+
+ if (user_manager::UserManager::IsInitialized()) {
+ user_manager::UserManager* user_manager = user_manager::UserManager::Get();
+ if (!IsDeviceManaged() && !user_manager->IsCurrentUserOwner()) {
+ html_source->AddString("ownerEmail",
+ user_manager->GetOwnerAccountId().GetUserEmail());
+ }
+ }
+
+ html_source->AddString(
+ "aboutBrowserVersion",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_ABOUT_PAGE_BROWSER_VERSION,
+ base::UTF8ToUTF16(version_info::GetVersionNumber()),
+ l10n_util::GetStringUTF16(version_info::IsOfficialBuild()
+ ? IDS_VERSION_UI_OFFICIAL
+ : IDS_VERSION_UI_UNOFFICIAL),
+ base::UTF8ToUTF16(chrome::GetChannelName()),
+ l10n_util::GetStringUTF16(sizeof(void*) == 8
+ ? IDS_VERSION_UI_64BIT
+ : IDS_VERSION_UI_32BIT)));
+ html_source->AddString(
+ "aboutProductCopyright",
+ base::i18n::MessageFormatter::FormatWithNumberedArgs(
+ l10n_util::GetStringUTF16(IDS_ABOUT_VERSION_COPYRIGHT),
+ base::Time::Now()));
+
+ base::string16 license = l10n_util::GetStringFUTF16(
+ IDS_VERSION_UI_LICENSE, base::ASCIIToUTF16(chrome::kChromiumProjectURL),
+ base::ASCIIToUTF16(chrome::kChromeUICreditsURL));
+ html_source->AddString("aboutProductLicense", license);
+
+ base::string16 os_license = l10n_util::GetStringFUTF16(
+ IDS_ABOUT_CROS_VERSION_LICENSE,
+ base::ASCIIToUTF16(chrome::kChromeUIOSCreditsURL));
+ html_source->AddString("aboutProductOsLicense", os_license);
+ base::string16 os_with_linux_license = l10n_util::GetStringFUTF16(
+ IDS_ABOUT_CROS_WITH_LINUX_VERSION_LICENSE,
+ base::ASCIIToUTF16(chrome::kChromeUIOSCreditsURL),
+ base::ASCIIToUTF16(chrome::kChromeUICrostiniCreditsURL));
+ html_source->AddString("aboutProductOsWithLinuxLicense",
+ os_with_linux_license);
+ html_source->AddBoolean("aboutEnterpriseManaged", IsEnterpriseManaged());
+ html_source->AddBoolean("aboutIsArcEnabled",
+ arc::IsArcPlayStoreEnabledForProfile(profile()));
+ html_source->AddBoolean("aboutIsDeveloperMode",
+ base::CommandLine::ForCurrentProcess()->HasSwitch(
+ chromeos::switches::kSystemDevMode));
+
+ html_source->AddString("endOfLifeMessage",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_ABOUT_PAGE_LAST_UPDATE_MESSAGE,
+ ui::GetChromeOSDeviceName(),
+ base::ASCIIToUTF16(chrome::kEolNotificationURL)));
+
+ std::string safetyInfoLink = GetSafetyInfoLink();
+ html_source->AddBoolean("shouldShowSafetyInfo", !safetyInfoLink.empty());
+
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+ html_source->AddString("aboutTermsURL", chrome::kChromeUITermsURL);
+ html_source->AddLocalizedString("aboutProductTos",
+ IDS_ABOUT_TERMS_OF_SERVICE);
+ html_source->AddString(
+ "aboutProductSafety",
+ l10n_util::GetStringUTF16(IDS_ABOUT_SAFETY_INFORMATION));
+ html_source->AddString("aboutProductSafetyURL",
+ base::UTF8ToUTF16(safetyInfoLink));
+#endif
+}
+
+void AboutSection::AddHandlers(content::WebUI* web_ui) {
+ web_ui->AddMessageHandler(std::make_unique<::settings::AboutHandler>());
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/about_section.h b/chromium/chrome/browser/ui/webui/settings/chromeos/about_section.h
new file mode 100644
index 00000000000..0e619e80d91
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/about_section.h
@@ -0,0 +1,34 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_ABOUT_SECTION_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_ABOUT_SECTION_H_
+
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h"
+
+namespace content {
+class WebUIDataSource;
+} // namespace content
+
+namespace chromeos {
+namespace settings {
+
+class SearchTagRegistry;
+
+// Provides UI strings and search tags for the settings "About Chrome OS" page.
+class AboutSection : public OsSettingsSection {
+ public:
+ AboutSection(Profile* profile, SearchTagRegistry* search_tag_registry);
+ ~AboutSection() override;
+
+ private:
+ // OsSettingsSection:
+ void AddLoadTimeData(content::WebUIDataSource* html_source) override;
+ void AddHandlers(content::WebUI* web_ui) override;
+};
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_ABOUT_SECTION_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_handler.cc
index e1d62743ff2..c1e27295f71 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_handler.cc
@@ -29,6 +29,10 @@ void RecordShowShelfNavigationButtonsValueChange(bool enabled) {
enabled);
}
+bool IsTabletModeEnabled() {
+ return ash::TabletMode::Get() && ash::TabletMode::Get()->InTabletMode();
+}
+
} // namespace
AccessibilityHandler::AccessibilityHandler(Profile* profile)
@@ -67,6 +71,16 @@ void AccessibilityHandler::RegisterMessages() {
base::Unretained(this)));
}
+void AccessibilityHandler::OnJavascriptAllowed() {
+ if (ash::TabletMode::Get()) {
+ tablet_mode_observer_.Add(ash::TabletMode::Get());
+ }
+}
+
+void AccessibilityHandler::OnJavascriptDisallowed() {
+ tablet_mode_observer_.RemoveAll();
+}
+
void AccessibilityHandler::HandleShowChromeVoxSettings(
const base::ListValue* args) {
OpenExtensionOptionsPage(extension_misc::kChromeVoxExtensionId);
@@ -100,31 +114,18 @@ void AccessibilityHandler::HandleManageA11yPageReady(
const base::ListValue* args) {
AllowJavascript();
- // When tablet mode is active we can return early since tablet mode
- // is supported.
- if (ash::TabletMode::Get()->InTabletMode()) {
- FireWebUIListener(
- "initial-data-ready",
- base::Value(AccessibilityManager::Get()->GetStartupSoundEnabled()),
- base::Value(true /* tablet_mode_supported */));
- return;
- }
-
- PowerManagerClient::Get()->GetSwitchStates(
- base::BindOnce(&AccessibilityHandler::OnReceivedSwitchStates,
- weak_ptr_factory_.GetWeakPtr()));
-}
-
-void AccessibilityHandler::OnReceivedSwitchStates(
- base::Optional<PowerManagerClient::SwitchStates> switch_states) {
- bool tablet_mode_supported =
- switch_states.has_value() &&
- switch_states->tablet_mode != PowerManagerClient::TabletMode::UNSUPPORTED;
-
FireWebUIListener(
"initial-data-ready",
base::Value(AccessibilityManager::Get()->GetStartupSoundEnabled()),
- base::Value(tablet_mode_supported));
+ base::Value(IsTabletModeEnabled()));
+}
+
+void AccessibilityHandler::OnTabletModeStarted() {
+ FireWebUIListener("tablet-mode-changed", base::Value(IsTabletModeEnabled()));
+}
+
+void AccessibilityHandler::OnTabletModeEnded() {
+ FireWebUIListener("tablet-mode-changed", base::Value(IsTabletModeEnabled()));
}
void AccessibilityHandler::OpenExtensionOptionsPage(const char extension_id[]) {
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_handler.h
index 54290f81dd8..6949f7606c8 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_handler.h
@@ -5,10 +5,12 @@
#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_ACCESSIBILITY_HANDLER_H_
#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_ACCESSIBILITY_HANDLER_H_
+#include "ash/public/cpp/tablet_mode.h"
+#include "ash/public/cpp/tablet_mode_observer.h"
#include "base/macros.h"
+#include "base/scoped_observer.h"
#include "base/timer/timer.h"
#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
-#include "chromeos/dbus/power/power_manager_client.h"
namespace base {
class ListValue;
@@ -19,20 +21,25 @@ class Profile;
namespace chromeos {
namespace settings {
-class AccessibilityHandler : public ::settings::SettingsPageUIHandler {
+class AccessibilityHandler : public ::settings::SettingsPageUIHandler,
+ public ash::TabletModeObserver {
public:
explicit AccessibilityHandler(Profile* profile);
~AccessibilityHandler() override;
// SettingsPageUIHandler implementation.
void RegisterMessages() override;
- void OnJavascriptAllowed() override {}
- void OnJavascriptDisallowed() override {}
+ void OnJavascriptAllowed() override;
+ void OnJavascriptDisallowed() override;
// Callback which updates if startup sound is enabled and if tablet
// mode is supported. Visible for testing.
void HandleManageA11yPageReady(const base::ListValue* args);
+ // ash::TabletModeObserver:
+ void OnTabletModeStarted() override;
+ void OnTabletModeEnded() override;
+
private:
// Callback for the messages to show settings for ChromeVox or
// Select To Speak.
@@ -42,13 +49,11 @@ class AccessibilityHandler : public ::settings::SettingsPageUIHandler {
void HandleRecordSelectedShowShelfNavigationButtonsValue(
const base::ListValue* args);
- // Callback which updates visibility for the shelf navigation buttons
- // accessibility setting, depending on whether tablet mode is supported.
- void OnReceivedSwitchStates(
- base::Optional<chromeos::PowerManagerClient::SwitchStates> switch_states);
-
void OpenExtensionOptionsPage(const char extension_id[]);
+ ScopedObserver<ash::TabletMode, ash::TabletModeObserver>
+ tablet_mode_observer_{this};
+
Profile* profile_; // Weak pointer.
// Timer to record user changed value for the accessibility setting to turn
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_handler_unittest.cc
index 8ee78caacd8..c250285176a 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_handler_unittest.cc
@@ -9,7 +9,6 @@
#include "ash/public/cpp/test/test_tablet_mode.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "chrome/test/base/in_process_browser_test.h"
-#include "chromeos/dbus/power/fake_power_manager_client.h"
#include "content/public/test/test_web_ui.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -35,7 +34,6 @@ class AccessibilityHandlerTest : public ChromeRenderViewHostTestHarness {
void SetUp() override {
ChromeRenderViewHostTestHarness::SetUp();
- PowerManagerClient::InitializeFake();
test_tablet_mode_ = std::make_unique<ash::TestTabletMode>();
handler_ = std::make_unique<TestingAccessibilityHandler>(&web_ui_);
}
@@ -43,7 +41,6 @@ class AccessibilityHandlerTest : public ChromeRenderViewHostTestHarness {
void TearDown() override {
handler_.reset();
test_tablet_mode_.reset();
- PowerManagerClient::Shutdown();
ChromeRenderViewHostTestHarness::TearDown();
}
@@ -52,38 +49,15 @@ class AccessibilityHandlerTest : public ChromeRenderViewHostTestHarness {
std::unique_ptr<TestingAccessibilityHandler> handler_;
};
-// Test that when tablet mode is supported, the correct data is returned by
+// Test that when tablet mode is disabled, the correct data is returned by
// HandleManageA11yPageReady().
-TEST_F(AccessibilityHandlerTest, ManageA11yPageReadyTabletModeSupported) {
- // Set tablet mode as supported.
- chromeos::FakePowerManagerClient::Get()->SetTabletMode(
- chromeos::PowerManagerClient::TabletMode::OFF, base::TimeTicks());
-
+TEST_F(AccessibilityHandlerTest, ManageA11yPageReadyTabletModeDisabled) {
+ test_tablet_mode_->SetEnabledForTest(false);
handler_->HandleManageA11yPageReady(/* args */ nullptr);
- // Wait for the AccessibilityHandler to receive data from PowerManagerClient.
- base::RunLoop().RunUntilIdle();
-
- const content::TestWebUI::CallData& call_data = *web_ui_.call_data().back();
-
- // Ensure tablet mode is returned as supported.
- EXPECT_TRUE(call_data.arg3()->GetBool());
-}
-
-// Test that when tablet mode is unsupported, the correct data is returned by
-// HandleManageA11yPageReady().
-TEST_F(AccessibilityHandlerTest, ManageA11yPageReadyTabletModeUnsupported) {
- // Set tablet mode as unsupported.
- chromeos::FakePowerManagerClient::Get()->SetTabletMode(
- chromeos::PowerManagerClient::TabletMode::UNSUPPORTED, base::TimeTicks());
- handler_->HandleManageA11yPageReady(/* args */ nullptr);
-
- // Wait for the AccessibilityHandler to receive data from PowerManagerClient.
- base::RunLoop().RunUntilIdle();
-
const content::TestWebUI::CallData& call_data = *web_ui_.call_data().back();
- // Ensure tablet mode is returned as unsupported.
+ // Ensure tablet mode is returned as disabled.
EXPECT_FALSE(call_data.arg3()->GetBool());
}
@@ -95,7 +69,7 @@ TEST_F(AccessibilityHandlerTest, ManageA11yPageReadyTabletModeEnabled) {
const content::TestWebUI::CallData& call_data = *web_ui_.call_data().back();
- // Ensure tablet mode is returned as supported.
+ // Ensure tablet mode is returned as enabled.
EXPECT_TRUE(call_data.arg3()->GetBool());
}
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc
new file mode 100644
index 00000000000..1e7b9bf8b08
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc
@@ -0,0 +1,544 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/accessibility_section.h"
+
+#include "ash/public/cpp/ash_features.h"
+#include "ash/public/cpp/ash_pref_names.h"
+#include "base/command_line.h"
+#include "base/feature_list.h"
+#include "base/no_destructor.h"
+#include "chrome/browser/accessibility/accessibility_state_utils.h"
+#include "chrome/browser/ui/webui/settings/accessibility_main_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/accessibility_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
+#include "chrome/browser/ui/webui/settings/font_handler.h"
+#include "chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.h"
+#include "chrome/browser/ui/webui/settings/tts_handler.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/grit/generated_resources.h"
+#include "components/prefs/pref_service.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "content/public/common/content_features.h"
+#include "media/base/media_switches.h"
+#include "ui/accessibility/accessibility_switches.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/webui/web_ui_util.h"
+
+namespace chromeos {
+namespace settings {
+namespace {
+
+const std::vector<SearchConcept>& GetA11ySearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_A11Y_ALWAYS_SHOW_OPTIONS,
+ mojom::kAccessibilitySectionPath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kA11yQuickSettings},
+ {IDS_OS_SETTINGS_TAG_A11Y_ALWAYS_SHOW_OPTIONS_ALT1,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_A11Y_STICKY_KEYS,
+ mojom::kManageAccessibilitySubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kStickyKeys}},
+ {IDS_OS_SETTINGS_TAG_A11Y_LARGE_CURSOR,
+ mojom::kManageAccessibilitySubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kLargeCursor}},
+ {IDS_OS_SETTINGS_TAG_A11Y,
+ mojom::kAccessibilitySectionPath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSection,
+ {.section = mojom::Section::kAccessibility},
+ {IDS_OS_SETTINGS_TAG_A11Y_ALT1, SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_A11Y_DOCKED_MAGNIFIER,
+ mojom::kManageAccessibilitySubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kDockedMagnifier}},
+ {IDS_OS_SETTINGS_TAG_A11y_CHROMEVOX,
+ mojom::kManageAccessibilitySubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kChromeVox},
+ {IDS_OS_SETTINGS_TAG_A11y_CHROMEVOX_ALT1, SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_A11Y_TABLET_NAVIGATION_BUTTONS,
+ mojom::kManageAccessibilitySubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kTabletNavigationButtons}},
+ {IDS_OS_SETTINGS_TAG_A11Y_MONO_AUDIO,
+ mojom::kManageAccessibilitySubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kMonoAudio},
+ {IDS_OS_SETTINGS_TAG_A11Y_MONO_AUDIO_ALT1, SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_A11Y_TEXT_TO_SPEECH,
+ mojom::kManageAccessibilitySubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kManageAccessibility}},
+ {IDS_OS_SETTINGS_TAG_A11Y_CAPTIONS,
+ mojom::kCaptionsSubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kCaptions}},
+ {IDS_OS_SETTINGS_TAG_A11Y_SPEECH_ENGINES,
+ mojom::kTextToSpeechSubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kTextToSpeechEngines}},
+ {IDS_OS_SETTINGS_TAG_A11Y_HIGHLIGHT_CURSOR,
+ mojom::kManageAccessibilitySubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kHighlightCursorWhileMoving}},
+ {IDS_OS_SETTINGS_TAG_A11Y_MANAGE,
+ mojom::kManageAccessibilitySubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kManageAccessibility},
+ {IDS_OS_SETTINGS_TAG_A11Y_MANAGE_ALT1, SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_A11Y_ON_SCREEN_KEYBOARD,
+ mojom::kManageAccessibilitySubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kOnScreenKeyboard}},
+ {IDS_OS_SETTINGS_TAG_A11Y_HIGHLIGHT_TEXT_CARET,
+ mojom::kManageAccessibilitySubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kHighlightTextCaret}},
+ {IDS_OS_SETTINGS_TAG_A11Y_DICTATION,
+ mojom::kManageAccessibilitySubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kDictation},
+ {IDS_OS_SETTINGS_TAG_A11Y_DICTATION_ALT1, SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_A11Y_HIGH_CONTRAST,
+ mojom::kManageAccessibilitySubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kHighContrastMode},
+ {IDS_OS_SETTINGS_TAG_A11Y_HIGH_CONTRAST_ALT1,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_A11Y_HIGHLIGHT_KEYBOARD_FOCUS,
+ mojom::kManageAccessibilitySubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kSpeakToType}},
+ {IDS_OS_SETTINGS_TAG_A11Y_STARTUP_SOUND,
+ mojom::kManageAccessibilitySubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kStartupSound}},
+ {IDS_OS_SETTINGS_TAG_A11Y_AUTOMATICALLY_CLICK,
+ mojom::kManageAccessibilitySubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kAutoClickWhenCursorStops}},
+ {IDS_OS_SETTINGS_TAG_A11Y_SELECT_TO_SPEAK,
+ mojom::kManageAccessibilitySubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kSelectToSpeak}},
+ {IDS_OS_SETTINGS_TAG_A11Y_SPEECH_PITCH,
+ mojom::kTextToSpeechSubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kTextToSpeechPitch}},
+ {IDS_OS_SETTINGS_TAG_A11Y_SPEECH_RATE,
+ mojom::kTextToSpeechSubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kTextToSpeechRate}},
+ {IDS_OS_SETTINGS_TAG_A11Y_SPEECH_VOLUME,
+ mojom::kTextToSpeechSubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kTextToSpeechVolume}},
+ {IDS_OS_SETTINGS_TAG_A11Y_FULLSCREEN_MAGNIFIER,
+ mojom::kManageAccessibilitySubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kFullscreenMagnifier}},
+ {IDS_OS_SETTINGS_TAG_A11Y_SPEECH_VOICE_PREVIEW,
+ mojom::kTextToSpeechSubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kTextToSpeechVoice}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetA11ySwitchAccessSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_A11Y_ENABLE_SWITCH_ACCESS,
+ mojom::kManageAccessibilitySubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kEnableSwitchAccess}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetA11ySwitchAccessOnSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_A11Y_SWITCH_ACCESS_ASSIGNMENT,
+ mojom::kSwitchAccessOptionsSubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kSwitchActionAssignment}},
+ {IDS_OS_SETTINGS_TAG_A11Y_SWITCH_ACCESS,
+ mojom::kSwitchAccessOptionsSubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kSwitchAccessOptions}},
+ {IDS_OS_SETTINGS_TAG_A11Y_SWITCH_ACCESS_AUTO_SCAN,
+ mojom::kSwitchAccessOptionsSubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kSwitchActionAutoScan}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetA11ySwitchAccessKeyboardSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_A11Y_SWITCH_ACCESS_AUTO_SCAN_KEYBOARD,
+ mojom::kSwitchAccessOptionsSubpagePath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kSwitchActionAutoScanKeyboard}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetA11yLabelsSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_A11Y_LABELS_FROM_GOOGLE,
+ mojom::kAccessibilitySectionPath,
+ mojom::SearchResultIcon::kA11y,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kGetImageDescriptionsFromGoogle}},
+ });
+ return *tags;
+}
+
+bool AreExperimentalA11yLabelsAllowed() {
+ return base::FeatureList::IsEnabled(
+ ::features::kExperimentalAccessibilityLabels);
+}
+
+bool IsSwitchAccessAllowed() {
+ return base::CommandLine::ForCurrentProcess()->HasSwitch(
+ ::switches::kEnableExperimentalAccessibilitySwitchAccess);
+}
+
+bool IsSwitchAccessTextAllowed() {
+ return base::CommandLine::ForCurrentProcess()->HasSwitch(
+ ::switches::kEnableExperimentalAccessibilitySwitchAccessText);
+}
+
+} // namespace
+
+AccessibilitySection::AccessibilitySection(
+ Profile* profile,
+ SearchTagRegistry* search_tag_registry,
+ PrefService* pref_service)
+ : OsSettingsSection(profile, search_tag_registry),
+ pref_service_(pref_service) {
+ registry()->AddSearchTags(GetA11ySearchConcepts());
+
+ pref_change_registrar_.Init(pref_service_);
+ pref_change_registrar_.Add(
+ ash::prefs::kAccessibilitySwitchAccessEnabled,
+ base::BindRepeating(&AccessibilitySection::UpdateSearchTags,
+ base::Unretained(this)));
+ pref_change_registrar_.Add(
+ ash::prefs::kAccessibilitySwitchAccessAutoScanEnabled,
+ base::BindRepeating(&AccessibilitySection::UpdateSearchTags,
+ base::Unretained(this)));
+ UpdateSearchTags();
+}
+
+AccessibilitySection::~AccessibilitySection() = default;
+
+void AccessibilitySection::AddLoadTimeData(
+ content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"a11yPageTitle", IDS_SETTINGS_ACCESSIBILITY},
+ {"a11yWebStore", IDS_SETTINGS_ACCESSIBILITY_WEB_STORE},
+ {"moreFeaturesLinkDescription",
+ IDS_SETTINGS_MORE_FEATURES_LINK_DESCRIPTION},
+ {"accessibleImageLabelsTitle",
+ IDS_SETTINGS_ACCESSIBLE_IMAGE_LABELS_TITLE},
+ {"accessibleImageLabelsSubtitle",
+ IDS_SETTINGS_ACCESSIBLE_IMAGE_LABELS_SUBTITLE},
+ {"settingsSliderRoleDescription",
+ IDS_SETTINGS_SLIDER_MIN_MAX_ARIA_ROLE_DESCRIPTION},
+ {"manageAccessibilityFeatures",
+ IDS_SETTINGS_ACCESSIBILITY_MANAGE_ACCESSIBILITY_FEATURES},
+ {"optionsInMenuLabel", IDS_SETTINGS_OPTIONS_IN_MENU_LABEL},
+ {"largeMouseCursorLabel", IDS_SETTINGS_LARGE_MOUSE_CURSOR_LABEL},
+ {"largeMouseCursorSizeLabel", IDS_SETTINGS_LARGE_MOUSE_CURSOR_SIZE_LABEL},
+ {"largeMouseCursorSizeDefaultLabel",
+ IDS_SETTINGS_LARGE_MOUSE_CURSOR_SIZE_DEFAULT_LABEL},
+ {"largeMouseCursorSizeLargeLabel",
+ IDS_SETTINGS_LARGE_MOUSE_CURSOR_SIZE_LARGE_LABEL},
+ {"highContrastLabel", IDS_SETTINGS_HIGH_CONTRAST_LABEL},
+ {"stickyKeysLabel", IDS_SETTINGS_STICKY_KEYS_LABEL},
+ {"chromeVoxLabel", IDS_SETTINGS_CHROMEVOX_LABEL},
+ {"chromeVoxOptionsLabel", IDS_SETTINGS_CHROMEVOX_OPTIONS_LABEL},
+ {"screenMagnifierLabel", IDS_SETTINGS_SCREEN_MAGNIFIER_LABEL},
+ {"screenMagnifierZoomLabel", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_LABEL},
+ {"dockedMagnifierLabel", IDS_SETTINGS_DOCKED_MAGNIFIER_LABEL},
+ {"dockedMagnifierZoomLabel", IDS_SETTINGS_DOCKED_MAGNIFIER_ZOOM_LABEL},
+ {"screenMagnifierZoom2x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_2_X},
+ {"screenMagnifierZoom4x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_4_X},
+ {"screenMagnifierZoom6x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_6_X},
+ {"screenMagnifierZoom8x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_8_X},
+ {"screenMagnifierZoom10x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_10_X},
+ {"screenMagnifierZoom12x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_12_X},
+ {"screenMagnifierZoom14x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_14_X},
+ {"screenMagnifierZoom16x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_16_X},
+ {"screenMagnifierZoom18x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_18_X},
+ {"screenMagnifierZoom20x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_20_X},
+ {"tapDraggingLabel", IDS_SETTINGS_TAP_DRAGGING_LABEL},
+ {"clickOnStopLabel", IDS_SETTINGS_CLICK_ON_STOP_LABEL},
+ {"delayBeforeClickLabel", IDS_SETTINGS_DELAY_BEFORE_CLICK_LABEL},
+ {"delayBeforeClickExtremelyShort",
+ IDS_SETTINGS_DELAY_BEFORE_CLICK_EXTREMELY_SHORT},
+ {"delayBeforeClickVeryShort", IDS_SETTINGS_DELAY_BEFORE_CLICK_VERY_SHORT},
+ {"delayBeforeClickShort", IDS_SETTINGS_DELAY_BEFORE_CLICK_SHORT},
+ {"delayBeforeClickLong", IDS_SETTINGS_DELAY_BEFORE_CLICK_LONG},
+ {"delayBeforeClickVeryLong", IDS_SETTINGS_DELAY_BEFORE_CLICK_VERY_LONG},
+ {"autoclickRevertToLeftClick",
+ IDS_SETTINGS_AUTOCLICK_REVERT_TO_LEFT_CLICK},
+ {"autoclickStabilizeCursorPosition",
+ IDS_SETTINGS_AUTOCLICK_STABILIZE_CURSOR_POSITION},
+ {"autoclickMovementThresholdLabel",
+ IDS_SETTINGS_AUTOCLICK_MOVEMENT_THRESHOLD_LABEL},
+ {"autoclickMovementThresholdExtraSmall",
+ IDS_SETTINGS_AUTOCLICK_MOVEMENT_THRESHOLD_EXTRA_SMALL},
+ {"autoclickMovementThresholdSmall",
+ IDS_SETTINGS_AUTOCLICK_MOVEMENT_THRESHOLD_SMALL},
+ {"autoclickMovementThresholdDefault",
+ IDS_SETTINGS_AUTOCLICK_MOVEMENT_THRESHOLD_DEFAULT},
+ {"autoclickMovementThresholdLarge",
+ IDS_SETTINGS_AUTOCLICK_MOVEMENT_THRESHOLD_LARGE},
+ {"autoclickMovementThresholdExtraLarge",
+ IDS_SETTINGS_AUTOCLICK_MOVEMENT_THRESHOLD_EXTRA_LARGE},
+ {"dictationDescription",
+ IDS_SETTINGS_ACCESSIBILITY_DICTATION_DESCRIPTION},
+ {"dictationLabel", IDS_SETTINGS_ACCESSIBILITY_DICTATION_LABEL},
+ {"onScreenKeyboardLabel", IDS_SETTINGS_ON_SCREEN_KEYBOARD_LABEL},
+ {"monoAudioLabel", IDS_SETTINGS_MONO_AUDIO_LABEL},
+ {"startupSoundLabel", IDS_SETTINGS_STARTUP_SOUND_LABEL},
+ {"a11yExplanation", IDS_SETTINGS_ACCESSIBILITY_EXPLANATION},
+ {"caretHighlightLabel",
+ IDS_SETTINGS_ACCESSIBILITY_CARET_HIGHLIGHT_DESCRIPTION},
+ {"cursorHighlightLabel",
+ IDS_SETTINGS_ACCESSIBILITY_CURSOR_HIGHLIGHT_DESCRIPTION},
+ {"focusHighlightLabel",
+ IDS_SETTINGS_ACCESSIBILITY_FOCUS_HIGHLIGHT_DESCRIPTION},
+ {"selectToSpeakTitle", IDS_SETTINGS_ACCESSIBILITY_SELECT_TO_SPEAK_TITLE},
+ {"selectToSpeakDisabledDescription",
+ IDS_SETTINGS_ACCESSIBILITY_SELECT_TO_SPEAK_DISABLED_DESCRIPTION},
+ {"selectToSpeakDescription",
+ IDS_SETTINGS_ACCESSIBILITY_SELECT_TO_SPEAK_DESCRIPTION},
+ {"selectToSpeakDescriptionWithoutKeyboard",
+ IDS_SETTINGS_ACCESSIBILITY_SELECT_TO_SPEAK_DESCRIPTION_WITHOUT_KEYBOARD},
+ {"selectToSpeakOptionsLabel",
+ IDS_SETTINGS_ACCESSIBILITY_SELECT_TO_SPEAK_OPTIONS_LABEL},
+ {"switchAccessLabel",
+ IDS_SETTINGS_ACCESSIBILITY_SWITCH_ACCESS_DESCRIPTION},
+ {"switchAccessOptionsLabel",
+ IDS_SETTINGS_ACCESSIBILITY_SWITCH_ACCESS_OPTIONS_LABEL},
+ {"manageSwitchAccessSettings",
+ IDS_SETTINGS_MANAGE_SWITCH_ACCESS_SETTINGS},
+ {"switchAssignmentHeading", IDS_SETTINGS_SWITCH_ASSIGNMENT_HEADING},
+ {"switchAssignOptionNone", IDS_SETTINGS_SWITCH_ASSIGN_OPTION_NONE},
+ {"switchAssignOptionSpace", IDS_SETTINGS_SWITCH_ASSIGN_OPTION_SPACE},
+ {"switchAssignOptionEnter", IDS_SETTINGS_SWITCH_ASSIGN_OPTION_ENTER},
+ {"assignSelectSwitchLabel", IDS_SETTINGS_ASSIGN_SELECT_SWITCH_LABEL},
+ {"assignNextSwitchLabel", IDS_SETTINGS_ASSIGN_NEXT_SWITCH_LABEL},
+ {"assignPreviousSwitchLabel", IDS_SETTINGS_ASSIGN_PREVIOUS_SWITCH_LABEL},
+ {"switchAccessAutoScanHeading",
+ IDS_SETTINGS_SWITCH_ACCESS_AUTO_SCAN_HEADING},
+ {"switchAccessAutoScanLabel", IDS_SETTINGS_SWITCH_ACCESS_AUTO_SCAN_LABEL},
+ {"switchAccessAutoScanSpeedLabel",
+ IDS_SETTINGS_SWITCH_ACCESS_AUTO_SCAN_SPEED_LABEL},
+ {"switchAccessAutoScanKeyboardSpeedLabel",
+ IDS_SETTINGS_SWITCH_ACCESS_AUTO_SCAN_KEYBOARD_SPEED_LABEL},
+ {"durationInSeconds", IDS_SETTINGS_DURATION_IN_SECONDS},
+ {"manageAccessibilityFeatures",
+ IDS_SETTINGS_ACCESSIBILITY_MANAGE_ACCESSIBILITY_FEATURES},
+ {"textToSpeechHeading",
+ IDS_SETTINGS_ACCESSIBILITY_TEXT_TO_SPEECH_HEADING},
+ {"displayHeading", IDS_SETTINGS_ACCESSIBILITY_DISPLAY_HEADING},
+ {"displaySettingsTitle",
+ IDS_SETTINGS_ACCESSIBILITY_DISPLAY_SETTINGS_TITLE},
+ {"displaySettingsDescription",
+ IDS_SETTINGS_ACCESSIBILITY_DISPLAY_SETTINGS_DESCRIPTION},
+ {"appearanceSettingsTitle",
+ IDS_SETTINGS_ACCESSIBILITY_APPEARANCE_SETTINGS_TITLE},
+ {"appearanceSettingsDescription",
+ IDS_SETTINGS_ACCESSIBILITY_APPEARANCE_SETTINGS_DESCRIPTION},
+ {"keyboardAndTextInputHeading",
+ IDS_SETTINGS_ACCESSIBILITY_KEYBOARD_AND_TEXT_INPUT_HEADING},
+ {"keyboardSettingsTitle",
+ IDS_SETTINGS_ACCESSIBILITY_KEYBOARD_SETTINGS_TITLE},
+ {"keyboardSettingsDescription",
+ IDS_SETTINGS_ACCESSIBILITY_KEYBOARD_SETTINGS_DESCRIPTION},
+ {"mouseAndTouchpadHeading",
+ IDS_SETTINGS_ACCESSIBILITY_MOUSE_AND_TOUCHPAD_HEADING},
+ {"mouseSettingsTitle", IDS_SETTINGS_ACCESSIBILITY_MOUSE_SETTINGS_TITLE},
+ {"mouseSettingsDescription",
+ IDS_SETTINGS_ACCESSIBILITY_MOUSE_SETTINGS_DESCRIPTION},
+ {"audioAndCaptionsHeading",
+ IDS_SETTINGS_ACCESSIBILITY_AUDIO_AND_CAPTIONS_HEADING},
+ {"additionalFeaturesTitle",
+ IDS_SETTINGS_ACCESSIBILITY_ADDITIONAL_FEATURES_TITLE},
+ {"manageTtsSettings", IDS_SETTINGS_MANAGE_TTS_SETTINGS},
+ {"ttsSettingsLinkDescription", IDS_SETTINGS_TTS_LINK_DESCRIPTION},
+ {"textToSpeechVoices", IDS_SETTINGS_TEXT_TO_SPEECH_VOICES},
+ {"textToSpeechNoVoicesMessage",
+ IDS_SETTINGS_TEXT_TO_SPEECH_NO_VOICES_MESSAGE},
+ {"textToSpeechMoreLanguages", IDS_SETTINGS_TEXT_TO_SPEECH_MORE_LANGUAGES},
+ {"textToSpeechProperties", IDS_SETTINGS_TEXT_TO_SPEECH_PROPERTIES},
+ {"textToSpeechRate", IDS_SETTINGS_TEXT_TO_SPEECH_RATE},
+ {"textToSpeechRateMinimumLabel",
+ IDS_SETTINGS_TEXT_TO_SPEECH_RATE_MINIMUM_LABEL},
+ {"textToSpeechRateMaximumLabel",
+ IDS_SETTINGS_TEXT_TO_SPEECH_RATE_MAXIMUM_LABEL},
+ {"textToSpeechPitch", IDS_SETTINGS_TEXT_TO_SPEECH_PITCH},
+ {"textToSpeechPitchMinimumLabel",
+ IDS_SETTINGS_TEXT_TO_SPEECH_PITCH_MINIMUM_LABEL},
+ {"textToSpeechPitchMaximumLabel",
+ IDS_SETTINGS_TEXT_TO_SPEECH_PITCH_MAXIMUM_LABEL},
+ {"textToSpeechVolume", IDS_SETTINGS_TEXT_TO_SPEECH_VOLUME},
+ {"textToSpeechVolumeMinimumLabel",
+ IDS_SETTINGS_TEXT_TO_SPEECH_VOLUME_MINIMUM_LABEL},
+ {"textToSpeechVolumeMaximumLabel",
+ IDS_SETTINGS_TEXT_TO_SPEECH_VOLUME_MAXIMUM_LABEL},
+ {"percentage", IDS_SETTINGS_PERCENTAGE},
+ {"defaultPercentage", IDS_SETTINGS_DEFAULT_PERCENTAGE},
+ {"textToSpeechPreviewHeading",
+ IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_HEADING},
+ {"textToSpeechPreviewInputLabel",
+ IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_INPUT_LABEL},
+ {"textToSpeechPreviewInput", IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_INPUT},
+ {"textToSpeechPreviewVoice", IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_VOICE},
+ {"textToSpeechPreviewPlay", IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_PLAY},
+ {"textToSpeechEngines", IDS_SETTINGS_TEXT_TO_SPEECH_ENGINES},
+ {"tabletModeShelfNavigationButtonsSettingLabel",
+ IDS_SETTINGS_A11Y_TABLET_MODE_SHELF_BUTTONS_LABEL},
+ {"tabletModeShelfNavigationButtonsSettingDescription",
+ IDS_SETTINGS_A11Y_TABLET_MODE_SHELF_BUTTONS_DESCRIPTION},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ html_source->AddString("a11yLearnMoreUrl",
+ chrome::kChromeAccessibilityHelpURL);
+
+ html_source->AddBoolean("showExperimentalAccessibilitySwitchAccess",
+ IsSwitchAccessAllowed());
+ html_source->AddBoolean(
+ "showExperimentalAccessibilitySwitchAccessImprovedTextInput",
+ IsSwitchAccessTextAllowed());
+
+ html_source->AddBoolean("showExperimentalA11yLabels",
+ AreExperimentalA11yLabelsAllowed());
+
+ html_source->AddBoolean(
+ "showTabletModeShelfNavigationButtonsSettings",
+ ash::features::IsHideShelfControlsInTabletModeEnabled());
+
+ html_source->AddString("tabletModeShelfNavigationButtonsLearnMoreUrl",
+ chrome::kTabletModeGesturesLearnMoreURL);
+
+ html_source->AddBoolean("enableLiveCaption",
+ base::FeatureList::IsEnabled(media::kLiveCaption));
+
+ ::settings::AddCaptionSubpageStrings(html_source);
+}
+
+void AccessibilitySection::AddHandlers(content::WebUI* web_ui) {
+ web_ui->AddMessageHandler(
+ std::make_unique<::settings::AccessibilityMainHandler>());
+ web_ui->AddMessageHandler(std::make_unique<AccessibilityHandler>(profile()));
+ web_ui->AddMessageHandler(std::make_unique<::settings::TtsHandler>());
+ web_ui->AddMessageHandler(
+ std::make_unique<::settings::FontHandler>(profile()));
+}
+
+void AccessibilitySection::UpdateSearchTags() {
+ if (accessibility_state_utils::IsScreenReaderEnabled() &&
+ AreExperimentalA11yLabelsAllowed()) {
+ registry()->AddSearchTags(GetA11yLabelsSearchConcepts());
+ } else {
+ registry()->RemoveSearchTags(GetA11yLabelsSearchConcepts());
+ }
+
+ registry()->RemoveSearchTags(GetA11ySwitchAccessSearchConcepts());
+ registry()->RemoveSearchTags(GetA11ySwitchAccessOnSearchConcepts());
+ registry()->RemoveSearchTags(GetA11ySwitchAccessKeyboardSearchConcepts());
+
+ if (!IsSwitchAccessAllowed())
+ return;
+
+ registry()->AddSearchTags(GetA11ySwitchAccessSearchConcepts());
+
+ if (!pref_service_->GetBoolean(
+ ash::prefs::kAccessibilitySwitchAccessEnabled)) {
+ return;
+ }
+
+ registry()->AddSearchTags(GetA11ySwitchAccessOnSearchConcepts());
+
+ if (pref_service_->GetBoolean(
+ ash::prefs::kAccessibilitySwitchAccessAutoScanEnabled)) {
+ registry()->AddSearchTags(GetA11ySwitchAccessKeyboardSearchConcepts());
+ }
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_section.h b/chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_section.h
new file mode 100644
index 00000000000..546454007b1
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/accessibility_section.h
@@ -0,0 +1,44 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_ACCESSIBILITY_SECTION_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_ACCESSIBILITY_SECTION_H_
+
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h"
+#include "components/prefs/pref_change_registrar.h"
+
+class PrefService;
+
+namespace content {
+class WebUIDataSource;
+} // namespace content
+
+namespace chromeos {
+namespace settings {
+
+class SearchTagRegistry;
+
+// Provides UI strings and search tags for Accessibility settings.
+class AccessibilitySection : public OsSettingsSection {
+ public:
+ AccessibilitySection(Profile* profile,
+ SearchTagRegistry* search_tag_registry,
+ PrefService* pref_service);
+ ~AccessibilitySection() override;
+
+ private:
+ // OsSettingsSection:
+ void AddLoadTimeData(content::WebUIDataSource* html_source) override;
+ void AddHandlers(content::WebUI* web_ui) override;
+
+ void UpdateSearchTags();
+
+ PrefService* pref_service_;
+ PrefChangeRegistrar pref_change_registrar_;
+};
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_ACCESSIBILITY_SECTION_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc
index e6d80c5a757..0d6b946d6c3 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc
@@ -242,8 +242,9 @@ void AccountManagerUIHandler::OnGetAccounts(
DCHECK(user);
base::DictionaryValue gaia_device_account;
- base::ListValue accounts = GetSecondaryGaiaAccounts(
- stored_accounts, user->GetAccountId(), &gaia_device_account);
+ base::ListValue accounts =
+ GetSecondaryGaiaAccounts(stored_accounts, user->GetAccountId(),
+ profile_->IsChild(), &gaia_device_account);
AccountBuilder device_account;
if (user->IsActiveDirectoryUser()) {
@@ -289,6 +290,7 @@ void AccountManagerUIHandler::OnGetAccounts(
base::ListValue AccountManagerUIHandler::GetSecondaryGaiaAccounts(
const std::vector<AccountManager::Account>& stored_accounts,
const AccountId device_account_id,
+ const bool is_child_user,
base::DictionaryValue* device_account) {
base::ListValue accounts;
for (const auto& stored_account : stored_accounts) {
@@ -312,7 +314,10 @@ base::ListValue AccountManagerUIHandler::GetSecondaryGaiaAccounts(
.SetIsDeviceAccount(false)
.SetFullName(maybe_account_info->full_name)
.SetEmail(stored_account.raw_email)
- .SetUnmigrated(account_manager_->HasDummyGaiaToken(account_key))
+ // Secondary accounts in child user session cannot be unmigrated. If
+ // such account has dummy gaia token, it was invalidated.
+ .SetUnmigrated(!is_child_user &&
+ account_manager_->HasDummyGaiaToken(account_key))
.SetIsSignedIn(!identity_manager_
->HasAccountWithRefreshTokenInPersistentErrorState(
maybe_account_info->account_id));
@@ -338,7 +343,8 @@ base::ListValue AccountManagerUIHandler::GetSecondaryGaiaAccounts(
void AccountManagerUIHandler::HandleAddAccount(const base::ListValue* args) {
AllowJavascript();
- InlineLoginHandlerDialogChromeOS::Show();
+ InlineLoginHandlerDialogChromeOS::Show(
+ InlineLoginHandlerDialogChromeOS::Source::kSettingsAddAccountButton);
}
void AccountManagerUIHandler::HandleReauthenticateAccount(
@@ -348,7 +354,9 @@ void AccountManagerUIHandler::HandleReauthenticateAccount(
CHECK(!args->GetList().empty());
const std::string& account_email = args->GetList()[0].GetString();
- InlineLoginHandlerDialogChromeOS::Show(account_email);
+ InlineLoginHandlerDialogChromeOS::Show(
+ account_email,
+ InlineLoginHandlerDialogChromeOS::Source::kSettingsReauthAccountButton);
}
void AccountManagerUIHandler::HandleMigrateAccount(
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.h
index 21e8adf1bc8..1a0e815a15d 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.h
@@ -79,9 +79,13 @@ class AccountManagerUIHandler : public ::settings::SettingsPageUIHandler,
// Returns secondary Gaia accounts from |stored_accounts| list. If the Device
// Account is a Gaia account, populates |device_account| with information
// about that account, otherwise does not modify |device_account|.
+ // If user (device account) is child - |is_child_user| should be set to true,
+ // in this case "unmigrated" property will be always false for secondary
+ // accounts.
base::ListValue GetSecondaryGaiaAccounts(
const std::vector<AccountManager::Account>& stored_accounts,
const AccountId device_account_id,
+ const bool is_child_user,
base::DictionaryValue* device_account);
// Refreshes the UI.
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler_browsertest.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler_browsertest.cc
index addb13bc75b..af9ff41fcf1 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler_browsertest.cc
@@ -13,6 +13,7 @@
#include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/signin/identity_manager_factory.h"
+#include "chrome/browser/supervised_user/supervised_user_constants.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/testing_profile.h"
#include "chromeos/components/account_manager/account_manager.h"
@@ -21,6 +22,7 @@
#include "components/signin/public/identity_manager/identity_test_utils.h"
#include "components/user_manager/scoped_user_manager.h"
#include "components/user_manager/user_type.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_web_ui.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -70,6 +72,17 @@ DeviceAccountInfo GetGaiaDeviceAccountInfo() {
"device-account-token" /*token*/};
}
+DeviceAccountInfo GetChildDeviceAccountInfo() {
+ return {supervised_users::kChildAccountSUID /*id*/,
+ "child@example.com" /*email*/,
+ "child" /*fullName*/,
+ "Family Link" /*organization*/,
+ user_manager::USER_TYPE_CHILD /*user_type*/,
+ chromeos::account_manager::AccountType::
+ ACCOUNT_TYPE_GAIA /*account_type*/,
+ "device-account-token" /*token*/};
+}
+
chromeos::AccountManager::Account GetAccountByKey(
std::vector<chromeos::AccountManager::Account> accounts,
chromeos::AccountManager::AccountKey key) {
@@ -119,6 +132,10 @@ class AccountManagerUIHandlerTest
TestingProfile::Builder profile_builder;
profile_builder.SetPath(temp_dir_.GetPath().AppendASCII("TestProfile"));
profile_builder.SetProfileName(GetDeviceAccountInfo().email);
+ if (GetDeviceAccountInfo().user_type ==
+ user_manager::UserType::USER_TYPE_CHILD) {
+ profile_builder.SetSupervisedUserId(GetDeviceAccountInfo().id);
+ }
profile_ = profile_builder.Build();
const user_manager::User* user;
@@ -129,6 +146,10 @@ class AccountManagerUIHandlerTest
GetDeviceAccountInfo().id),
true, user_manager::UserType::USER_TYPE_ACTIVE_DIRECTORY,
profile_.get());
+ } else if (GetDeviceAccountInfo().user_type ==
+ user_manager::UserType::USER_TYPE_CHILD) {
+ user = GetFakeUserManager()->AddChildUser(AccountId::FromUserEmailGaiaId(
+ GetDeviceAccountInfo().email, GetDeviceAccountInfo().id));
} else {
user = GetFakeUserManager()->AddUserWithAffiliationAndTypeAndProfile(
AccountId::FromUserEmailGaiaId(GetDeviceAccountInfo().email,
@@ -287,8 +308,13 @@ IN_PROC_BROWSER_TEST_P(AccountManagerUIHandlerTest,
GetAccountByKey(account_manager_accounts,
{ValueOrEmpty(account.FindStringKey("id")),
account_manager::AccountType::ACCOUNT_TYPE_GAIA});
- EXPECT_EQ(account_manager()->HasDummyGaiaToken(expected_account.key),
- account.FindBoolKey("unmigrated").value());
+ if (GetDeviceAccountInfo().user_type ==
+ user_manager::UserType::USER_TYPE_CHILD) {
+ EXPECT_FALSE(account.FindBoolKey("unmigrated").value());
+ } else {
+ EXPECT_EQ(account_manager()->HasDummyGaiaToken(expected_account.key),
+ account.FindBoolKey("unmigrated").value());
+ }
EXPECT_EQ(expected_account.key.account_type,
account.FindIntKey("accountType"));
EXPECT_EQ(expected_account.raw_email,
@@ -312,7 +338,8 @@ INSTANTIATE_TEST_SUITE_P(
AccountManagerUIHandlerTestSuite,
AccountManagerUIHandlerTest,
::testing::Values(GetActiveDirectoryDeviceAccountInfo(),
- GetGaiaDeviceAccountInfo()));
+ GetGaiaDeviceAccountInfo(),
+ GetChildDeviceAccountInfo()));
} // namespace settings
} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.cc
index e3c7e6d7645..276327a54c8 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.h"
#include "base/bind.h"
+#include "base/strings/string_number_conversions.h"
#include "base/values.h"
namespace chromeos {
@@ -19,6 +20,16 @@ void AmbientModeHandler::RegisterMessages() {
"onAmbientModePageReady",
base::BindRepeating(&AmbientModeHandler::HandleInitialized,
base::Unretained(this)));
+
+ web_ui()->RegisterMessageCallback(
+ "onTopicSourceSelectedChanged",
+ base::BindRepeating(&AmbientModeHandler::HandleTopicSourceSelectedChanged,
+ base::Unretained(this)));
+}
+
+void AmbientModeHandler::OnJavascriptAllowed() {
+ if (topic_source_.has_value())
+ SendTopicSource();
}
void AmbientModeHandler::HandleInitialized(const base::ListValue* args) {
@@ -26,6 +37,65 @@ void AmbientModeHandler::HandleInitialized(const base::ListValue* args) {
CHECK(args->empty());
AllowJavascript();
+ GetSettings();
+}
+
+void AmbientModeHandler::HandleTopicSourceSelectedChanged(
+ const base::ListValue* args) {
+ CHECK_EQ(args->GetSize(), 1U);
+ int topic_source;
+ CHECK(base::StringToInt(args->GetList()[0].GetString(), &topic_source));
+ // Check the |topic_source| has valid value.
+ CHECK_GE(topic_source,
+ static_cast<int>(ash::AmbientModeTopicSource::kMinValue));
+ CHECK_LE(topic_source,
+ static_cast<int>(ash::AmbientModeTopicSource::kMaxValue));
+
+ UpdateSettings(static_cast<ash::AmbientModeTopicSource>(topic_source));
+}
+
+void AmbientModeHandler::GetSettings() {
+ ash::AmbientBackendController::Get()->GetSettings(base::BindOnce(
+ &AmbientModeHandler::OnGetSettings, weak_factory_.GetWeakPtr()));
+}
+
+void AmbientModeHandler::OnGetSettings(
+ base::Optional<ash::AmbientModeTopicSource> topic_source) {
+ if (!topic_source.has_value()) {
+ // TODO(b/152921891): Retry a small fixed number of times, then only retry
+ // when user confirms in the error message dialog.
+ return;
+ }
+
+ topic_source_ = topic_source;
+ if (!IsJavascriptAllowed())
+ return;
+
+ SendTopicSource();
+}
+
+void AmbientModeHandler::SendTopicSource() {
+ FireWebUIListener("topic-source-changed",
+ base::Value(
+
+ static_cast<int>(topic_source_.value())));
+}
+
+void AmbientModeHandler::UpdateSettings(
+ ash::AmbientModeTopicSource topic_source) {
+ ash::AmbientBackendController::Get()->UpdateSettings(
+ topic_source, base::BindOnce(&AmbientModeHandler::OnUpdateSettings,
+ weak_factory_.GetWeakPtr(), topic_source));
+}
+
+void AmbientModeHandler::OnUpdateSettings(
+ ash::AmbientModeTopicSource topic_source,
+ bool success) {
+ if (success)
+ return;
+
+ // TODO(b/152921891): Retry a small fixed number of times, then only retry
+ // when user confirms in the error message dialog.
}
} // namespace settings
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.h
index a52b109160a..8e26f721b60 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.h
@@ -5,6 +5,11 @@
#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_AMBIENT_MODE_HANDLER_H_
#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_AMBIENT_MODE_HANDLER_H_
+#include <vector>
+
+#include "ash/public/cpp/ambient/ambient_backend_controller.h"
+#include "base/memory/weak_ptr.h"
+#include "base/optional.h"
#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
namespace base {
@@ -25,12 +30,37 @@ class AmbientModeHandler : public ::settings::SettingsPageUIHandler {
// settings::SettingsPageUIHandler:
void RegisterMessages() override;
- void OnJavascriptAllowed() override {}
+ void OnJavascriptAllowed() override;
void OnJavascriptDisallowed() override {}
private:
// WebUI call to signal js side is ready.
void HandleInitialized(const base::ListValue* args);
+
+ // WebUI call to sync topic source with server.
+ void HandleTopicSourceSelectedChanged(const base::ListValue* args);
+
+ // Retrieve the initial settings from server.
+ void GetSettings();
+
+ // Called when the initial settings is retrieved.
+ void OnGetSettings(base::Optional<ash::AmbientModeTopicSource> topic_source);
+
+ // Send the "topic-source-changed" WebUIListener event when the initial
+ // settings is retrieved.
+ void SendTopicSource();
+
+ // Update the selected topic source to server.
+ void UpdateSettings(ash::AmbientModeTopicSource topic_source);
+
+ // Called when the settings is updated.
+ // |topic_source| is the value to retry if the update was failed.
+ void OnUpdateSettings(ash::AmbientModeTopicSource topic_source, bool success);
+
+ // The topic source, i.e. from which category the photos will be displayed.
+ base::Optional<ash::AmbientModeTopicSource> topic_source_;
+
+ base::WeakPtrFactory<AmbientModeHandler> weak_factory_{this};
};
} // namespace settings
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/app_management/app_management_uma.h b/chromium/chrome/browser/ui/webui/settings/chromeos/app_management/app_management_uma.h
index c2da9634ceb..dbb61fe2385 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/app_management/app_management_uma.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/app_management/app_management_uma.h
@@ -20,12 +20,9 @@ enum class AppManagementEntryPoint {
kAppManagementMainViewChromeApp = 7,
kAppManagementMainViewWebApp = 8,
kOsSettingsMainPage = 9,
- kMaxValue = kOsSettingsMainPage,
+ kAppManagementMainViewPluginVm = 10,
+ kDBusServicePluginVm = 11,
+ kMaxValue = kDBusServicePluginVm,
};
-// This histogram is also declared and used at chrome/browser/resources/
-// settings/chrome_os/os_apps_page/app_management_page/constants.js.
-constexpr char kAppManagementEntryPointsHistogramName[] =
- "AppManagement.EntryPoints";
-
#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_APP_MANAGEMENT_APP_MANAGEMENT_UMA_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/apps_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/apps_section.cc
new file mode 100644
index 00000000000..7ae2a6a8724
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/apps_section.cc
@@ -0,0 +1,299 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/apps_section.h"
+
+#include "base/no_destructor.h"
+#include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/plugin_vm/plugin_vm_pref_names.h"
+#include "chrome/browser/chromeos/plugin_vm/plugin_vm_util.h"
+#include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
+#include "chrome/browser/ui/webui/app_management/app_management_page_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/android_apps_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/plugin_vm_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/grit/generated_resources.h"
+#include "chrome/grit/os_settings_resources.h"
+#include "components/arc/arc_prefs.h"
+#include "components/prefs/pref_service.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/webui/web_ui_util.h"
+#include "ui/chromeos/devicetype_utils.h"
+
+namespace chromeos {
+namespace settings {
+namespace {
+
+const std::vector<SearchConcept>& GetAppsSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_APPS,
+ mojom::kAppsSectionPath,
+ mojom::SearchResultIcon::kAppsGrid,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSection,
+ {.section = mojom::Section::kApps}},
+ {IDS_OS_SETTINGS_TAG_APPS_MANAGEMENT,
+ mojom::kAppManagementSubpagePath,
+ mojom::SearchResultIcon::kAppsGrid,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kAppManagement},
+ {IDS_OS_SETTINGS_TAG_APPS_MANAGEMENT_ALT1, SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetAndroidPlayStoreSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_PLAY_STORE,
+ mojom::kGooglePlayStoreSubpagePath,
+ mojom::SearchResultIcon::kGooglePlay,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kGooglePlayStore}},
+ {IDS_OS_SETTINGS_TAG_REMOVE_PLAY_STORE,
+ mojom::kGooglePlayStoreSubpagePath,
+ mojom::SearchResultIcon::kGooglePlay,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kRemovePlayStore},
+ {IDS_OS_SETTINGS_TAG_REMOVE_PLAY_STORE_ALT1, SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetAndroidSettingsSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_ANDROID_SETTINGS_WITH_PLAY_STORE,
+ mojom::kGooglePlayStoreSubpagePath,
+ mojom::SearchResultIcon::kGooglePlay,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kManageAndroidPreferences}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetAndroidNoPlayStoreSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_ANDROID_SETTINGS,
+ mojom::kAppsSectionPath,
+ mojom::SearchResultIcon::kAndroid,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kManageAndroidPreferences}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetAndroidPlayStoreDisabledSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_ANDROID_TURN_ON_PLAY_STORE,
+ mojom::kAppsSectionPath,
+ mojom::SearchResultIcon::kAndroid,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kTurnOnPlayStore},
+ {IDS_OS_SETTINGS_TAG_ANDROID_TURN_ON_PLAY_STORE_ALT1,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+void AddAppManagementStrings(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"appManagementAppInstalledByPolicyLabel",
+ IDS_APP_MANAGEMENT_POLICY_APP_POLICY_STRING},
+ {"appManagementCameraPermissionLabel", IDS_APP_MANAGEMENT_CAMERA},
+ {"appManagementContactsPermissionLabel", IDS_APP_MANAGEMENT_CONTACTS},
+ {"appManagementLocationPermissionLabel", IDS_APP_MANAGEMENT_LOCATION},
+ {"appManagementMicrophonePermissionLabel", IDS_APP_MANAGEMENT_MICROPHONE},
+ {"appManagementMoreSettingsLabel", IDS_APP_MANAGEMENT_MORE_SETTINGS},
+ {"appManagementNoAppsFound", IDS_APP_MANAGEMENT_NO_APPS_FOUND},
+ {"appManagementNoPermissions",
+ IDS_APPLICATION_INFO_APP_NO_PERMISSIONS_TEXT},
+ {"appManagementNotificationsLabel", IDS_APP_MANAGEMENT_NOTIFICATIONS},
+ {"appManagementPermissionsLabel", IDS_APP_MANAGEMENT_PERMISSIONS},
+ {"appManagementPinToShelfLabel", IDS_APP_MANAGEMENT_PIN_TO_SHELF},
+ {"appManagementPrintingPermissionLabel", IDS_APP_MANAGEMENT_PRINTING},
+ {"appManagementSearchPrompt", IDS_APP_MANAGEMENT_SEARCH_PROMPT},
+ {"appManagementStoragePermissionLabel", IDS_APP_MANAGEMENT_STORAGE},
+ {"appManagementUninstallLabel", IDS_APP_MANAGEMENT_UNINSTALL_APP},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+}
+
+bool ShowPluginVm(const Profile* profile, const PrefService& pref_service) {
+ // Even if not allowed, we still want to show Plugin VM if the VM image is on
+ // disk, so that users are still able to delete the image at will.
+ return plugin_vm::IsPluginVmAllowedForProfile(profile) ||
+ pref_service.GetBoolean(plugin_vm::prefs::kPluginVmImageExists);
+}
+
+} // namespace
+
+AppsSection::AppsSection(Profile* profile,
+ SearchTagRegistry* search_tag_registry,
+ PrefService* pref_service,
+ ArcAppListPrefs* arc_app_list_prefs)
+ : OsSettingsSection(profile, search_tag_registry),
+ pref_service_(pref_service),
+ arc_app_list_prefs_(arc_app_list_prefs) {
+ registry()->AddSearchTags(GetAppsSearchConcepts());
+
+ if (arc::IsArcAllowedForProfile(profile)) {
+ pref_change_registrar_.Init(pref_service_);
+ pref_change_registrar_.Add(
+ arc::prefs::kArcEnabled,
+ base::BindRepeating(&AppsSection::UpdateAndroidSearchTags,
+ base::Unretained(this)));
+
+ if (arc_app_list_prefs_)
+ arc_app_list_prefs_->AddObserver(this);
+
+ UpdateAndroidSearchTags();
+ }
+}
+
+AppsSection::~AppsSection() {
+ if (arc::IsArcAllowedForProfile(profile())) {
+ if (arc_app_list_prefs_)
+ arc_app_list_prefs_->RemoveObserver(this);
+ }
+}
+
+void AppsSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"appsPageTitle", IDS_SETTINGS_APPS_TITLE},
+ {"appManagementTitle", IDS_SETTINGS_APPS_LINK_TEXT},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ html_source->AddResourcePath("app-management/app_management.mojom-lite.js",
+ IDR_OS_SETTINGS_APP_MANAGEMENT_MOJO_LITE_JS);
+ html_source->AddResourcePath(
+ "app-management/types.mojom-lite.js",
+ IDR_OS_SETTINGS_APP_MANAGEMENT_TYPES_MOJO_LITE_JS);
+ html_source->AddResourcePath(
+ "app-management/bitmap.mojom-lite.js",
+ IDR_OS_SETTINGS_APP_MANAGEMENT_BITMAP_MOJO_LITE_JS);
+ html_source->AddResourcePath(
+ "app-management/file_path.mojom-lite.js",
+ IDR_OS_SETTINGS_APP_MANAGEMENT_FILE_PATH_MOJO_LITE_JS);
+ html_source->AddResourcePath(
+ "app-management/image.mojom-lite.js",
+ IDR_OS_SETTINGS_APP_MANAGEMENT_IMAGE_MOJO_LITE_JS);
+ html_source->AddResourcePath(
+ "app-management/image_info.mojom-lite.js",
+ IDR_OS_SETTINGS_APP_MANAGEMENT_IMAGE_INFO_MOJO_LITE_JS);
+
+ // We have 2 variants of Android apps settings. Default case, when the Play
+ // Store app exists we show expandable section that allows as to
+ // enable/disable the Play Store and link to Android settings which is
+ // available once settings app is registered in the system.
+ // For AOSP images we don't have the Play Store app. In last case we Android
+ // apps settings consists only from root link to Android settings and only
+ // visible once settings app is registered.
+ html_source->AddBoolean("androidAppsVisible",
+ arc::IsArcAllowedForProfile(profile()));
+ html_source->AddBoolean("havePlayStoreApp", arc::IsPlayStoreAvailable());
+ html_source->AddBoolean(
+ "isSupportedArcVersion",
+ AppManagementPageHandler::IsCurrentArcVersionSupported(profile()));
+
+ AddAppManagementStrings(html_source);
+ AddAndroidAppStrings(html_source);
+ AddPluginVmLoadTimeData(html_source);
+}
+
+void AppsSection::AddHandlers(content::WebUI* web_ui) {
+ web_ui->AddMessageHandler(
+ std::make_unique<chromeos::settings::AndroidAppsHandler>(profile()));
+
+ if (ShowPluginVm(profile(), *pref_service_)) {
+ web_ui->AddMessageHandler(
+ std::make_unique<chromeos::settings::PluginVmHandler>(profile()));
+ }
+}
+
+void AppsSection::OnAppRegistered(const std::string& app_id,
+ const ArcAppListPrefs::AppInfo& app_info) {
+ UpdateAndroidSearchTags();
+}
+
+void AppsSection::AddAndroidAppStrings(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"androidAppsPageLabel", IDS_SETTINGS_ANDROID_APPS_LABEL},
+ {"androidAppsEnable", IDS_SETTINGS_TURN_ON},
+ {"androidAppsManageApps", IDS_SETTINGS_ANDROID_APPS_MANAGE_APPS},
+ {"androidAppsRemove", IDS_SETTINGS_ANDROID_APPS_REMOVE},
+ {"androidAppsRemoveButton", IDS_SETTINGS_ANDROID_APPS_REMOVE_BUTTON},
+ {"androidAppsDisableDialogTitle",
+ IDS_SETTINGS_ANDROID_APPS_DISABLE_DIALOG_TITLE},
+ {"androidAppsDisableDialogMessage",
+ IDS_SETTINGS_ANDROID_APPS_DISABLE_DIALOG_MESSAGE},
+ {"androidAppsDisableDialogRemove",
+ IDS_SETTINGS_ANDROID_APPS_DISABLE_DIALOG_REMOVE},
+ {"androidAppsManageAppLinks", IDS_SETTINGS_ANDROID_APPS_MANAGE_APP_LINKS},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+ html_source->AddLocalizedString("androidAppsPageTitle",
+ arc::IsPlayStoreAvailable()
+ ? IDS_SETTINGS_ANDROID_APPS_TITLE
+ : IDS_SETTINGS_ANDROID_SETTINGS_TITLE);
+ html_source->AddString(
+ "androidAppsSubtext",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_ANDROID_APPS_SUBTEXT, ui::GetChromeOSDeviceName(),
+ GetHelpUrlWithBoard(chrome::kAndroidAppsLearnMoreURL)));
+}
+
+void AppsSection::AddPluginVmLoadTimeData(
+ content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"pluginVmSharedPaths", IDS_SETTINGS_APPS_PLUGIN_VM_SHARED_PATHS},
+ {"pluginVmSharedPathsListHeading",
+ IDS_SETTINGS_APPS_PLUGIN_VM_SHARED_PATHS_LIST_HEADING},
+ {"pluginVmSharedPathsInstructionsAdd",
+ IDS_SETTINGS_APPS_PLUGIN_VM_SHARED_PATHS_INSTRUCTIONS_ADD},
+ {"pluginVmSharedPathsInstructionsRemove",
+ IDS_SETTINGS_APPS_PLUGIN_VM_SHARED_PATHS_INSTRUCTIONS_REMOVE},
+ {"pluginVmSharedPathsRemoveSharing",
+ IDS_SETTINGS_APPS_PLUGIN_VM_SHARED_PATHS_REMOVE_SHARING},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ html_source->AddBoolean("showPluginVm",
+ ShowPluginVm(profile(), *pref_service_));
+}
+
+void AppsSection::UpdateAndroidSearchTags() {
+ registry()->RemoveSearchTags(GetAndroidNoPlayStoreSearchConcepts());
+ registry()->RemoveSearchTags(GetAndroidPlayStoreDisabledSearchConcepts());
+ registry()->RemoveSearchTags(GetAndroidPlayStoreSearchConcepts());
+ registry()->RemoveSearchTags(GetAndroidSettingsSearchConcepts());
+
+ if (!arc::IsPlayStoreAvailable()) {
+ registry()->AddSearchTags(GetAndroidNoPlayStoreSearchConcepts());
+ return;
+ }
+
+ if (!arc::IsArcPlayStoreEnabledForProfile(profile())) {
+ registry()->AddSearchTags(GetAndroidPlayStoreDisabledSearchConcepts());
+ return;
+ }
+
+ registry()->AddSearchTags(GetAndroidPlayStoreSearchConcepts());
+
+ if (arc_app_list_prefs_ &&
+ arc_app_list_prefs_->IsRegistered(arc::kSettingsAppId)) {
+ registry()->AddSearchTags(GetAndroidSettingsSearchConcepts());
+ }
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/apps_section.h b/chromium/chrome/browser/ui/webui/settings/chromeos/apps_section.h
new file mode 100644
index 00000000000..ba926ba1652
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/apps_section.h
@@ -0,0 +1,54 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_APPS_SECTION_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_APPS_SECTION_H_
+
+#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h"
+#include "components/prefs/pref_change_registrar.h"
+
+class PrefService;
+
+namespace content {
+class WebUIDataSource;
+} // namespace content
+
+namespace chromeos {
+namespace settings {
+
+class SearchTagRegistry;
+
+// Provides UI strings and search tags for Apps settings.
+class AppsSection : public OsSettingsSection, public ArcAppListPrefs::Observer {
+ public:
+ AppsSection(Profile* profile,
+ SearchTagRegistry* search_tag_registry,
+ PrefService* pref_service,
+ ArcAppListPrefs* arc_app_list_prefs);
+ ~AppsSection() override;
+
+ private:
+ // OsSettingsSection:
+ void AddLoadTimeData(content::WebUIDataSource* html_source) override;
+ void AddHandlers(content::WebUI* web_ui) override;
+
+ // ArcAppListPrefs::Observer:
+ void OnAppRegistered(const std::string& app_id,
+ const ArcAppListPrefs::AppInfo& app_info) override;
+
+ void AddAndroidAppStrings(content::WebUIDataSource* html_source);
+ void AddPluginVmLoadTimeData(content::WebUIDataSource* html_source);
+
+ void UpdateAndroidSearchTags();
+
+ PrefService* pref_service_;
+ ArcAppListPrefs* arc_app_list_prefs_;
+ PrefChangeRegistrar pref_change_registrar_;
+};
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_APPS_SECTION_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/bluetooth_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/bluetooth_section.cc
new file mode 100644
index 00000000000..9b6fad55c74
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/bluetooth_section.cc
@@ -0,0 +1,203 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/bluetooth_section.h"
+
+#include "base/bind.h"
+#include "base/no_destructor.h"
+#include "chrome/browser/ui/webui/chromeos/bluetooth_dialog_localized_strings_provider.h"
+#include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h"
+#include "chrome/browser/ui/webui/settings/chromeos/constants/setting.mojom.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search.mojom.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_result_icon.mojom.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/webui_url_constants.h"
+#include "chrome/grit/generated_resources.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "device/bluetooth/bluetooth_adapter_factory.h"
+#include "device/bluetooth/dbus/bluez_dbus_manager.h"
+#include "device/bluetooth/strings/grit/bluetooth_strings.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/webui/web_ui_util.h"
+
+namespace chromeos {
+namespace settings {
+namespace {
+
+const std::vector<SearchConcept>& GetBluetoothSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_BLUETOOTH_PAIR,
+ mojom::kBluetoothDevicesSubpagePath,
+ mojom::SearchResultIcon::kBluetooth,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kBluetoothPairDevice}},
+ {IDS_OS_SETTINGS_TAG_BLUETOOTH_CONNECT,
+ mojom::kBluetoothDevicesSubpagePath,
+ mojom::SearchResultIcon::kBluetooth,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kBluetoothConnectToDevice}},
+ {IDS_OS_SETTINGS_TAG_BLUETOOTH,
+ mojom::kBluetoothDevicesSubpagePath,
+ mojom::SearchResultIcon::kBluetooth,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kBluetoothDevices}},
+ {IDS_OS_SETTINGS_TAG_BLUETOOTH_DISCONNECT,
+ mojom::kBluetoothDevicesSubpagePath,
+ mojom::SearchResultIcon::kBluetooth,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kBluetoothDisconnectFromDevice}},
+ {IDS_OS_SETTINGS_TAG_BLUETOOTH_UNPAIR,
+ mojom::kBluetoothDevicesSubpagePath,
+ mojom::SearchResultIcon::kBluetooth,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kBluetoothUnpairDevice},
+ {IDS_OS_SETTINGS_TAG_BLUETOOTH_UNPAIR_ALT1, SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetBluetoothOnSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_BLUETOOTH_TURN_OFF,
+ mojom::kBluetoothDevicesSubpagePath,
+ mojom::SearchResultIcon::kBluetooth,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kBluetoothOnOff},
+ {IDS_OS_SETTINGS_TAG_BLUETOOTH_TURN_OFF_ALT1,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetBluetoothOffSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_BLUETOOTH_TURN_ON,
+ mojom::kBluetoothDevicesSubpagePath,
+ mojom::SearchResultIcon::kBluetooth,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kBluetoothOnOff},
+ {IDS_OS_SETTINGS_TAG_BLUETOOTH_TURN_ON_ALT1, SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+} // namespace
+
+BluetoothSection::BluetoothSection(Profile* profile,
+ SearchTagRegistry* search_tag_registry)
+ : OsSettingsSection(profile, search_tag_registry) {
+ // Note: May be uninitialized in tests.
+ if (bluez::BluezDBusManager::IsInitialized()) {
+ device::BluetoothAdapterFactory::Get()->GetAdapter(
+ base::Bind(&BluetoothSection::OnFetchBluetoothAdapter,
+ weak_ptr_factory_.GetWeakPtr()));
+ }
+}
+
+BluetoothSection::~BluetoothSection() {
+ if (bluetooth_adapter_)
+ bluetooth_adapter_->RemoveObserver(this);
+}
+
+void BluetoothSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"bluetoothConnected", IDS_SETTINGS_BLUETOOTH_CONNECTED},
+ {"bluetoothConnectedWithBattery",
+ IDS_SETTINGS_BLUETOOTH_CONNECTED_WITH_BATTERY},
+ {"bluetoothConnecting", IDS_SETTINGS_BLUETOOTH_CONNECTING},
+ {"bluetoothDeviceListPaired", IDS_SETTINGS_BLUETOOTH_DEVICE_LIST_PAIRED},
+ {"bluetoothDeviceListUnpaired",
+ IDS_SETTINGS_BLUETOOTH_DEVICE_LIST_UNPAIRED},
+ {"bluetoothConnect", IDS_SETTINGS_BLUETOOTH_CONNECT},
+ {"bluetoothDisconnect", IDS_SETTINGS_BLUETOOTH_DISCONNECT},
+ {"bluetoothToggleA11yLabel",
+ IDS_SETTINGS_BLUETOOTH_TOGGLE_ACCESSIBILITY_LABEL},
+ {"bluetoothExpandA11yLabel",
+ IDS_SETTINGS_BLUETOOTH_EXPAND_ACCESSIBILITY_LABEL},
+ {"bluetoothNoDevices", IDS_SETTINGS_BLUETOOTH_NO_DEVICES},
+ {"bluetoothNoDevicesFound", IDS_SETTINGS_BLUETOOTH_NO_DEVICES_FOUND},
+ {"bluetoothNotConnected", IDS_SETTINGS_BLUETOOTH_NOT_CONNECTED},
+ {"bluetoothPageTitle", IDS_SETTINGS_BLUETOOTH},
+ {"bluetoothPairDevicePageTitle",
+ IDS_SETTINGS_BLUETOOTH_PAIR_DEVICE_TITLE},
+ {"bluetoothRemove", IDS_SETTINGS_BLUETOOTH_REMOVE},
+ {"bluetoothPrimaryUserControlled",
+ IDS_SETTINGS_BLUETOOTH_PRIMARY_USER_CONTROLLED},
+ {"bluetoothDeviceType_computer",
+ IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_COMPUTER},
+ {"bluetoothDeviceType_phone",
+ IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_PHONE},
+ {"bluetoothDeviceType_modem",
+ IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_MODEM},
+ {"bluetoothDeviceType_audio",
+ IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_AUDIO},
+ {"bluetoothDeviceType_carAudio",
+ IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_CAR_AUDIO},
+ {"bluetoothDeviceType_video",
+ IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_VIDEO},
+ {"bluetoothDeviceType_peripheral",
+ IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_PERIPHERAL},
+ {"bluetoothDeviceType_joystick",
+ IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_JOYSTICK},
+ {"bluetoothDeviceType_gamepad",
+ IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_GAMEPAD},
+ {"bluetoothDeviceType_keyboard",
+ IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_KEYBOARD},
+ {"bluetoothDeviceType_mouse",
+ IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_MOUSE},
+ {"bluetoothDeviceType_tablet",
+ IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_TABLET},
+ {"bluetoothDeviceType_keyboardMouseCombo",
+ IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_KEYBOARD_MOUSE_COMBO},
+ {"bluetoothDeviceType_unknown",
+ IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_UNKNOWN},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+ chromeos::bluetooth_dialog::AddLocalizedStrings(html_source);
+}
+
+void BluetoothSection::AdapterPresentChanged(device::BluetoothAdapter* adapter,
+ bool present) {
+ UpdateSearchTags();
+}
+
+void BluetoothSection::AdapterPoweredChanged(device::BluetoothAdapter* adapter,
+ bool powered) {
+ UpdateSearchTags();
+}
+
+void BluetoothSection::OnFetchBluetoothAdapter(
+ scoped_refptr<device::BluetoothAdapter> bluetooth_adapter) {
+ bluetooth_adapter_ = bluetooth_adapter;
+ bluetooth_adapter_->AddObserver(this);
+ UpdateSearchTags();
+}
+
+void BluetoothSection::UpdateSearchTags() {
+ // Start with no search tags, then add them below if appropriate.
+ registry()->RemoveSearchTags(GetBluetoothSearchConcepts());
+ registry()->RemoveSearchTags(GetBluetoothOnSearchConcepts());
+ registry()->RemoveSearchTags(GetBluetoothOffSearchConcepts());
+
+ if (!bluetooth_adapter_->IsPresent())
+ return;
+
+ registry()->AddSearchTags(GetBluetoothSearchConcepts());
+
+ if (bluetooth_adapter_->IsPowered())
+ registry()->AddSearchTags(GetBluetoothOnSearchConcepts());
+ else
+ registry()->AddSearchTags(GetBluetoothOffSearchConcepts());
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/bluetooth_section.h b/chromium/chrome/browser/ui/webui/settings/chromeos/bluetooth_section.h
new file mode 100644
index 00000000000..0586828bb1f
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/bluetooth_section.h
@@ -0,0 +1,52 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_BLUETOOTH_SECTION_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_BLUETOOTH_SECTION_H_
+
+#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h"
+#include "device/bluetooth/bluetooth_adapter.h"
+
+namespace content {
+class WebUIDataSource;
+} // namespace content
+
+namespace chromeos {
+namespace settings {
+
+class SearchTagRegistry;
+
+// Provides UI strings and search tags for Bluetooth settings. Different search
+// tags are registered depending on whether the device has a Bluetooth chip and
+// whether it is turned on or off.
+class BluetoothSection : public OsSettingsSection,
+ public device::BluetoothAdapter::Observer {
+ public:
+ BluetoothSection(Profile* profile, SearchTagRegistry* search_tag_registry);
+ ~BluetoothSection() override;
+
+ private:
+ // OsSettingsSection:
+ void AddLoadTimeData(content::WebUIDataSource* html_source) override;
+
+ // device::BluetoothAdapter::Observer:
+ void AdapterPresentChanged(device::BluetoothAdapter* adapter,
+ bool present) override;
+ void AdapterPoweredChanged(device::BluetoothAdapter* adapter,
+ bool powered) override;
+
+ void OnFetchBluetoothAdapter(
+ scoped_refptr<device::BluetoothAdapter> bluetooth_adapter);
+ void UpdateSearchTags();
+
+ scoped_refptr<device::BluetoothAdapter> bluetooth_adapter_;
+ base::WeakPtrFactory<BluetoothSection> weak_ptr_factory_{this};
+};
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_BLUETOOTH_SECTION_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/calculator/size_calculator.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/calculator/size_calculator.cc
index c9cfb838ce3..7c8d870bb91 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/calculator/size_calculator.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/calculator/size_calculator.cc
@@ -10,14 +10,8 @@
#include "base/task/post_task.h"
#include "base/task/thread_pool.h"
#include "base/values.h"
-#include "chrome/browser/browsing_data/browsing_data_appcache_helper.h"
-#include "chrome/browser/browsing_data/browsing_data_cache_storage_helper.h"
-#include "chrome/browser/browsing_data/browsing_data_cookie_helper.h"
-#include "chrome/browser/browsing_data/browsing_data_database_helper.h"
-#include "chrome/browser/browsing_data/browsing_data_file_system_helper.h"
+#include "chrome/browser/browsing_data/browsing_data_file_system_util.h"
#include "chrome/browser/browsing_data/browsing_data_flash_lso_helper.h"
-#include "chrome/browser/browsing_data/browsing_data_indexed_db_helper.h"
-#include "chrome/browser/browsing_data/browsing_data_service_worker_helper.h"
#include "chrome/browser/chromeos/crostini/crostini_features.h"
#include "chrome/browser/chromeos/file_manager/path_util.h"
#include "chrome/browser/profiles/profile.h"
@@ -26,8 +20,15 @@
#include "components/arc/arc_service_manager.h"
#include "components/arc/session/arc_bridge_service.h"
#include "components/arc/storage_manager/arc_storage_manager.h"
+#include "components/browsing_data/content/appcache_helper.h"
+#include "components/browsing_data/content/cache_storage_helper.h"
#include "components/browsing_data/content/conditional_cache_counting_helper.h"
+#include "components/browsing_data/content/cookie_helper.h"
+#include "components/browsing_data/content/database_helper.h"
+#include "components/browsing_data/content/file_system_helper.h"
+#include "components/browsing_data/content/indexed_db_helper.h"
#include "components/browsing_data/content/local_storage_helper.h"
+#include "components/browsing_data/content/service_worker_helper.h"
#include "components/user_manager/user_manager.h"
#include "content/public/browser/storage_partition.h"
@@ -91,11 +92,11 @@ void SizeStatCalculator::PerformCalculation() {
int64_t* available_size = new int64_t(0);
base::ThreadPool::PostTaskAndReply(
FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_VISIBLE},
- base::Bind(&GetSizeStatBlocking, my_files_path, total_size,
- available_size),
- base::Bind(&SizeStatCalculator::OnGetSizeStat,
- weak_ptr_factory_.GetWeakPtr(), base::Owned(total_size),
- base::Owned(available_size)));
+ base::BindOnce(&GetSizeStatBlocking, my_files_path, total_size,
+ available_size),
+ base::BindOnce(&SizeStatCalculator::OnGetSizeStat,
+ weak_ptr_factory_.GetWeakPtr(), base::Owned(total_size),
+ base::Owned(available_size)));
}
void SizeStatCalculator::OnGetSizeStat(int64_t* total_bytes,
@@ -170,22 +171,25 @@ void BrowsingDataSizeCalculator::PerformCalculation() {
content::BrowserContext::GetDefaultStoragePartition(profile_);
site_data_size_collector_ = std::make_unique<SiteDataSizeCollector>(
storage_partition->GetPath(),
- new BrowsingDataCookieHelper(storage_partition),
- new BrowsingDataDatabaseHelper(profile_),
+ new browsing_data::CookieHelper(storage_partition,
+ base::NullCallback()),
+ new browsing_data::DatabaseHelper(profile_),
new browsing_data::LocalStorageHelper(profile_),
- new BrowsingDataAppCacheHelper(storage_partition->GetAppCacheService()),
- new BrowsingDataIndexedDBHelper(storage_partition),
- BrowsingDataFileSystemHelper::Create(
- storage_partition->GetFileSystemContext()),
- new BrowsingDataServiceWorkerHelper(
+ new browsing_data::AppCacheHelper(
+ storage_partition->GetAppCacheService()),
+ new browsing_data::IndexedDBHelper(storage_partition),
+ browsing_data::FileSystemHelper::Create(
+ storage_partition->GetFileSystemContext(),
+ browsing_data_file_system_util::GetAdditionalFileSystemTypes()),
+ new browsing_data::ServiceWorkerHelper(
storage_partition->GetServiceWorkerContext()),
- new BrowsingDataCacheStorageHelper(
+ new browsing_data::CacheStorageHelper(
storage_partition->GetCacheStorageContext()),
BrowsingDataFlashLSOHelper::Create(profile_));
}
site_data_size_collector_->Fetch(
- base::Bind(&BrowsingDataSizeCalculator::OnGetBrowsingDataSize,
- weak_ptr_factory_.GetWeakPtr(), /*is_site_data=*/true));
+ base::BindOnce(&BrowsingDataSizeCalculator::OnGetBrowsingDataSize,
+ weak_ptr_factory_.GetWeakPtr(), /*is_site_data=*/true));
}
void BrowsingDataSizeCalculator::OnGetCacheSize(bool is_upper_limit,
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/constants/BUILD.gn b/chromium/chrome/browser/ui/webui/settings/chromeos/constants/BUILD.gn
new file mode 100644
index 00000000000..a2ed7dabcb8
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/constants/BUILD.gn
@@ -0,0 +1,14 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//mojo/public/tools/bindings/mojom.gni")
+
+assert(is_chromeos)
+
+mojom("mojom") {
+ sources = [
+ "routes.mojom",
+ "setting.mojom",
+ ]
+}
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/constants/OWNERS b/chromium/chrome/browser/ui/webui/settings/chromeos/constants/OWNERS
new file mode 100644
index 00000000000..08850f42120
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/constants/OWNERS
@@ -0,0 +1,2 @@
+per-file *.mojom=set noparent
+per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/constants/constants_util.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/constants/constants_util.cc
new file mode 100644
index 00000000000..d5bdaf20d53
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/constants/constants_util.cc
@@ -0,0 +1,56 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/constants/constants_util.h"
+
+#include "base/no_destructor.h"
+
+namespace chromeos {
+namespace settings {
+namespace constants {
+namespace {
+
+template <typename T>
+std::vector<T> All() {
+ int32_t min_value = static_cast<int32_t>(T::kMinValue);
+ int32_t max_value = static_cast<int32_t>(T::kMaxValue);
+
+ std::vector<T> all;
+ for (int32_t i = min_value; i < max_value; ++i) {
+ T current = static_cast<T>(i);
+
+ // Not every value between the min and max values is valid:
+ // (1) We use a numbering scheme which purposely skips some values for the
+ // Subpage and Setting enums.
+ // (2) Some values are deprecated and removed.
+ if (mojom::IsKnownEnumValue(current))
+ all.push_back(current);
+ }
+
+ return all;
+}
+
+} // namespace
+
+const std::vector<mojom::Section>& AllSections() {
+ static const base::NoDestructor<std::vector<mojom::Section>> all_sections(
+ All<mojom::Section>());
+ return *all_sections;
+}
+
+const std::vector<mojom::Subpage>& AllSubpages() {
+ static const base::NoDestructor<std::vector<mojom::Subpage>> all_subpages(
+ All<mojom::Subpage>());
+ return *all_subpages;
+}
+
+const std::vector<mojom::Setting>& AllSettings() {
+ static const base::NoDestructor<std::vector<mojom::Setting>> all_settings(
+ All<mojom::Setting>());
+ return *all_settings;
+}
+
+} // namespace constants
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/constants/constants_util.h b/chromium/chrome/browser/ui/webui/settings/chromeos/constants/constants_util.h
new file mode 100644
index 00000000000..1c473e0bf04
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/constants/constants_util.h
@@ -0,0 +1,25 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_CONSTANTS_CONSTANTS_UTIL_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_CONSTANTS_CONSTANTS_UTIL_H_
+
+#include <vector>
+
+#include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h"
+#include "chrome/browser/ui/webui/settings/chromeos/constants/setting.mojom.h"
+
+namespace chromeos {
+namespace settings {
+namespace constants {
+
+const std::vector<mojom::Section>& AllSections();
+const std::vector<mojom::Subpage>& AllSubpages();
+const std::vector<mojom::Setting>& AllSettings();
+
+} // namespace constants
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_CONSTANTS_CONSTANTS_UTIL_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom b/chromium/chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom
new file mode 100644
index 00000000000..b1837490f1c
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom
@@ -0,0 +1,231 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module chromeos.settings.mojom;
+
+// Chrome OS Settings sections (i.e., top-level navigation items). Each section
+// has a corresponding path string listed below. Numerical values are used for
+// metrics; do not change or reuse values.
+enum Section {
+ kNetwork = 0,
+ kBluetooth = 1,
+ kMultiDevice = 2,
+ kPeople = 3,
+ kDevice = 4,
+ kPersonalization = 5,
+ kSearchAndAssistant = 6,
+ kApps = 7,
+ kCrostini = 8,
+ // Note: Value 9 was for deprecated Plugin VM section - see
+ // https://crbug.com/1074101. Do not reuse.
+ kDateAndTime = 10,
+ kPrivacyAndSecurity = 11,
+ kLanguagesAndInput = 12,
+ kFiles = 13,
+ kPrinting = 14,
+ kAccessibility = 15,
+ kReset = 16,
+ kAboutChromeOs = 17,
+};
+
+// Chrome OS Settings subpages (i.e., nested pages within a section). Each
+// subpage has a corresponding path string listed below. Numerical values are
+// used for metrics; do not change or reuse values.
+enum Subpage {
+ // Network section.
+ kEthernetDetails = 0,
+ kWifiNetworks = 1,
+ kWifiDetails = 2,
+ kKnownNetworks = 3,
+ kMobileDataNetworks = 4,
+ kCellularDetails = 5,
+ kTetherDetails = 6,
+ kVpnDetails = 7,
+
+ // Bluetooth section.
+ kBluetoothDevices = 100,
+
+ // MultiDevice section.
+ kMultiDeviceFeatures = 200,
+ kSmartLock = 201,
+
+ // People section.
+ kMyAccounts = 300,
+ kSync = 301,
+ kSyncDeprecated = 302, // Used if split-sync flag is off.
+ kSyncDeprecatedAdvanced = 303, // Used if split-sync flag is off.
+ kSecurityAndSignIn = 304,
+ kFingerprint = 305,
+ kManageOtherPeople = 306,
+ kKerberos = 307,
+
+ // Device section.
+ kDevice = 400,
+ kPointers = 401,
+ kKeyboard = 402,
+ kStylus = 403,
+ kDisplay = 404,
+ kStorage = 405,
+ kExternalStorage = 406,
+ kDlc = 407,
+ kPower = 408,
+
+ // Personalization section.
+ kChangePicture = 500,
+ kAmbientMode = 501,
+
+ // Search and Assistant section.
+ kAssistant = 600,
+
+ // Apps section.
+ kAppManagement = 700,
+ kAppDetails = 701,
+ kGooglePlayStore = 702,
+ kPluginVmSharedPaths = 703,
+
+ // Crostini section.
+ kCrostiniDetails = 800,
+ kCrostiniManageSharedFolders = 801,
+ kCrostiniUsbPreferences = 802,
+ kCrostiniBackupAndRestore = 803,
+ kCrostiniDevelopAndroidApps = 804,
+ kCrostiniPortForwarding = 805,
+ kCrostiniDiskResize = 806,
+
+ // Note: Deprecated Plugin VM section has no subpages.
+
+ // Date and Time section.
+ kTimeZone = 1000,
+
+ // Note: Privacy section has no subpages.
+
+ // Languages and Input section.
+ kLanguagesAndInputDetails = 1200,
+ kManageInputMethods = 1201,
+ kSmartInputs = 1202,
+
+ // Files section.
+ kNetworkFileShares = 1300,
+
+ // Printing section.
+ kPrintingDetails = 1400,
+
+ // Accessibility section.
+ kManageAccessibility = 1500,
+ kTextToSpeech = 1502,
+ kSwitchAccessOptions = 1503,
+ kCaptions = 1504,
+
+ // Note: Reset section has no subpages.
+
+ // About Chrome OS section.
+ kAboutChromeOsDetails = 1700,
+ kDetailedBuildInfo = 1701,
+};
+
+// Network section.
+const string kNetworkSectionPath = "internet";
+const string kEthernetDetailsSubpagePath = "networkDetail";
+const string kWifiNetworksSubpagePath = "networks?type=WiFi";
+const string kWifiDetailsSubpagePath = "networkDetail";
+const string kKnownNetworksSubpagePath = "knownNetworks";
+const string kMobileDataNetworksSubpagePath = "networks?type=Tether";
+const string kCellularDetailsSubpagePath = "networkDetail";
+const string kTetherDetailsSubpagePath = "networkDetail";
+const string kVpnDetailsSubpagePath = "networkDetail";
+
+// Bluetooth section.
+const string kBluetoothSectionPath = "bluetooth";
+const string kBluetoothDevicesSubpagePath = "bluetoothDevices";
+
+// MultiDevice section.
+const string kMultiDeviceSectionPath = "multidevice";
+const string kMultiDeviceFeaturesSubpagePath = "multidevice/features";
+const string kSmartLockSubpagePath = "multidevice/features/smartLock";
+
+// People section.
+const string kPeopleSectionPath = "osPeople";
+const string kMyAccountsSubpagePath = "accountManager";
+const string kSyncSubpagePath = "osSync";
+const string kSyncDeprecatedSubpagePath = "syncSetup";
+const string kSyncDeprecatedAdvancedSubpagePath = "syncSetup/advanced";
+const string kSecurityAndSignInSubpagePath = "lockScreen";
+const string kFingerprintSubpathPath = "lockScreen/fingerprint";
+const string kManageOtherPeopleSubpagePath = "accounts";
+const string kKerberosSubpagePath = "kerberosAccounts";
+
+// Device section.
+const string kDeviceSectionPath = "device";
+const string kPointersSubpagePath = "pointer-overlay";
+const string kKeyboardSubpagePath = "keyboard-overlay";
+const string kStylusSubpagePath = "stylus";
+const string kDisplaySubpagePath = "display";
+const string kStorageSubpagePath = "storage";
+const string kExternalStorageSubpagePath = "storage/externalStoragePreferences";
+const string kDlcSubpagePath = "storage/downloadedContent";
+const string kPowerSubpagePath = "power";
+
+// Personalization section.
+const string kPersonalizationSectionPath = "personalization";
+const string kChangePictureSubpagePath = "changePicture";
+const string kAmbientModeSubpagePath = "ambientMode";
+
+// Search and Assistant section.
+const string kSearchAndAssistantSectionPath = "osSearch";
+const string kAssistantSubpagePath = "googleAssistant";
+
+// Apps section.
+const string kAppsSectionPath = "apps";
+const string kAppManagementSubpagePath = "app-management";
+const string kAppDetailsSubpagePath = "app-management/detail";
+const string kGooglePlayStoreSubpagePath = "androidAppsDetails";
+const string kPluginVmSharedPathsSubpagePath =
+ "app-management/pluginVm/sharedPaths";
+
+// Crostini section.
+const string kCrostiniSectionPath = "crostini";
+const string kCrostiniDetailsSubpagePath = "crostini/details";
+const string kCrostiniManageSharedFoldersSubpagePath = "crostini/sharedPaths";
+const string kCrostiniUsbPreferencesSubpagePath = "crostini/sharedUsbDevices";
+const string kCrostiniBackupAndRestoreSubpagePath = "crostini/exportImport";
+const string kCrostiniDevelopAndroidAppsSubpagePath = "crostini/androidAdb";
+const string kCrostiniPortForwardingSubpagePath = "crostini/portForwarding";
+const string kCrostiniDiskResizeSubpagePath = "crostini/diskResize";
+
+// Date and Time section.
+const string kDateAndTimeSectionPath = "dateTime";
+const string kTimeZoneSubpagePath = "dateTime/timeZone";
+
+// Privacy and Security section.
+const string kPrivacyAndSecuritySectionPath = "osPrivacy";
+
+// Languages and Input section.
+const string kLanguagesAndInputSectionPath = "osLanguages";
+const string kLanguagesAndInputDetailsSubpagePath = "osLanguages/details";
+const string kManageInputMethodsSubpagePath = "osLanguages/inputMethods";
+const string kSmartInputsSubagePath = "osLanguages/smartInputs";
+
+// Files section.
+const string kFilesSectionPath = "files";
+const string kNetworkFileSharesSubpagePath = "smbShares";
+
+// Printing section.
+const string kPrintingSectionPath = "osPrinting";
+const string kPrintingDetailsSubpagePath = "cupsPrinters";
+
+// Accessibility section.
+const string kAccessibilitySectionPath = "osAccessibility";
+const string kManageAccessibilitySubpagePath = "manageAccessibility";
+const string kTextToSpeechSubpagePath = "manageAccessibility/tts";
+const string kSwitchAccessOptionsSubpagePath =
+ "manageAccessibility/switchAccess";
+const string kCaptionsSubpagePath = "manageAccessibility/captions";
+
+// Reset section.
+const string kResetSectionPath = "osReset";
+
+// About Chrome OS section.
+const string kAboutChromeOsSectionPath = "help";
+const string kAboutChromeOsDetailsSubpagePath = "help/about";
+const string kDetailedBuildInfoSubpagePath = "help/details";
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/constants/routes_util.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/constants/routes_util.cc
new file mode 100644
index 00000000000..957b28fd7cc
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/constants/routes_util.cc
@@ -0,0 +1,150 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_CONSTANTS_ROUTES_UTIL_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_CONSTANTS_ROUTES_UTIL_H_
+
+#include "chrome/browser/ui/webui/settings/chromeos/constants/routes_util.h"
+
+#include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h"
+
+namespace chromeos {
+namespace settings {
+
+const char kOsSignOutSubPage[] = "osSignOut";
+
+// Any changes here need to be kept in sync with chrome_new_window_client.cc
+// TODO(khorimoto): Instead of listing out every path, use an enum parameter.
+bool IsOSSettingsSubPage(const std::string& sub_page) {
+ static const char* const kPaths[] = {
+ // Network section.
+ chromeos::settings::mojom::kNetworkSectionPath,
+ chromeos::settings::mojom::kEthernetDetailsSubpagePath,
+ chromeos::settings::mojom::kWifiNetworksSubpagePath,
+ chromeos::settings::mojom::kWifiDetailsSubpagePath,
+ chromeos::settings::mojom::kKnownNetworksSubpagePath,
+ chromeos::settings::mojom::kMobileDataNetworksSubpagePath,
+ chromeos::settings::mojom::kCellularDetailsSubpagePath,
+ chromeos::settings::mojom::kTetherDetailsSubpagePath,
+ chromeos::settings::mojom::kVpnDetailsSubpagePath,
+
+ // Bluetooth section.
+ chromeos::settings::mojom::kBluetoothSectionPath,
+ chromeos::settings::mojom::kBluetoothDevicesSubpagePath,
+
+ // MultiDevice section.
+ chromeos::settings::mojom::kMultiDeviceSectionPath,
+ chromeos::settings::mojom::kMultiDeviceFeaturesSubpagePath,
+ chromeos::settings::mojom::kSmartLockSubpagePath,
+
+ // People section.
+ chromeos::settings::mojom::kPeopleSectionPath,
+ chromeos::settings::mojom::kMyAccountsSubpagePath,
+ chromeos::settings::mojom::kSyncSubpagePath,
+ chromeos::settings::mojom::kSecurityAndSignInSubpagePath,
+ chromeos::settings::mojom::kFingerprintSubpathPath,
+ chromeos::settings::mojom::kManageOtherPeopleSubpagePath,
+ chromeos::settings::mojom::kKerberosSubpagePath,
+
+ // Device section.
+ chromeos::settings::mojom::kDeviceSectionPath,
+ chromeos::settings::mojom::kPointersSubpagePath,
+ chromeos::settings::mojom::kKeyboardSubpagePath,
+ chromeos::settings::mojom::kStylusSubpagePath,
+ chromeos::settings::mojom::kDisplaySubpagePath,
+ chromeos::settings::mojom::kStorageSubpagePath,
+ chromeos::settings::mojom::kExternalStorageSubpagePath,
+ chromeos::settings::mojom::kDlcSubpagePath,
+ chromeos::settings::mojom::kPowerSubpagePath,
+
+ // Personalization section.
+ chromeos::settings::mojom::kPersonalizationSectionPath,
+ chromeos::settings::mojom::kChangePictureSubpagePath,
+ chromeos::settings::mojom::kAmbientModeSubpagePath,
+
+ // Search and Assistant section.
+ chromeos::settings::mojom::kSearchAndAssistantSectionPath,
+ chromeos::settings::mojom::kAssistantSubpagePath,
+
+ // Apps section.
+ chromeos::settings::mojom::kAppsSectionPath,
+ chromeos::settings::mojom::kAppManagementSubpagePath,
+ chromeos::settings::mojom::kAppDetailsSubpagePath,
+ chromeos::settings::mojom::kGooglePlayStoreSubpagePath,
+ chromeos::settings::mojom::kPluginVmSharedPathsSubpagePath,
+
+ // Crostini section.
+ chromeos::settings::mojom::kCrostiniSectionPath,
+ chromeos::settings::mojom::kCrostiniDetailsSubpagePath,
+ chromeos::settings::mojom::kCrostiniManageSharedFoldersSubpagePath,
+ chromeos::settings::mojom::kCrostiniUsbPreferencesSubpagePath,
+ chromeos::settings::mojom::kCrostiniBackupAndRestoreSubpagePath,
+ chromeos::settings::mojom::kCrostiniDevelopAndroidAppsSubpagePath,
+ chromeos::settings::mojom::kCrostiniPortForwardingSubpagePath,
+ chromeos::settings::mojom::kCrostiniDiskResizeSubpagePath,
+
+ // Date and Time section.
+ chromeos::settings::mojom::kDateAndTimeSectionPath,
+ chromeos::settings::mojom::kTimeZoneSubpagePath,
+
+ // Privacy and Security section.
+ chromeos::settings::mojom::kPrivacyAndSecuritySectionPath,
+
+ // Languages and Input section.
+ chromeos::settings::mojom::kLanguagesAndInputSectionPath,
+ chromeos::settings::mojom::kLanguagesAndInputDetailsSubpagePath,
+ chromeos::settings::mojom::kManageInputMethodsSubpagePath,
+ chromeos::settings::mojom::kSmartInputsSubagePath,
+
+ // Files section.
+ chromeos::settings::mojom::kFilesSectionPath,
+ chromeos::settings::mojom::kNetworkFileSharesSubpagePath,
+
+ // Printing section.
+ chromeos::settings::mojom::kPrintingSectionPath,
+ chromeos::settings::mojom::kPrintingDetailsSubpagePath,
+
+ // Accessibility section.
+ chromeos::settings::mojom::kAccessibilitySectionPath,
+ chromeos::settings::mojom::kManageAccessibilitySubpagePath,
+ chromeos::settings::mojom::kTextToSpeechSubpagePath,
+ chromeos::settings::mojom::kSwitchAccessOptionsSubpagePath,
+ chromeos::settings::mojom::kCaptionsSubpagePath,
+
+ // Reset section.
+ chromeos::settings::mojom::kResetSectionPath,
+
+ // About Chrome OS section.
+ chromeos::settings::mojom::kAboutChromeOsSectionPath,
+ chromeos::settings::mojom::kAboutChromeOsDetailsSubpagePath,
+ chromeos::settings::mojom::kDetailedBuildInfoSubpagePath,
+ };
+
+ // Sub-pages may have query parameters, e.g. networkDetail?guid=123456.
+ std::string sub_page_without_query = sub_page;
+ std::string::size_type input_index = sub_page.find('?');
+ if (input_index != std::string::npos)
+ sub_page_without_query.resize(input_index);
+
+ for (const char* p : kPaths) {
+ std::string path_without_query = p;
+ std::string::size_type path_index = sub_page.find('?');
+ if (path_index != std::string::npos)
+ path_without_query.resize(path_index);
+
+ if (sub_page_without_query == path_without_query)
+ return true;
+ }
+
+ // Special case - sign-out dialog:
+ if (sub_page_without_query == kOsSignOutSubPage)
+ return true;
+
+ return false;
+}
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_CONSTANTS_ROUTES_UTIL_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/constants/routes_util.h b/chromium/chrome/browser/ui/webui/settings/chromeos/constants/routes_util.h
new file mode 100644
index 00000000000..b8ce73b3a21
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/constants/routes_util.h
@@ -0,0 +1,22 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_CONSTANTS_ROUTES_UTIL_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_CONSTANTS_ROUTES_UTIL_H_
+
+#include <string>
+
+namespace chromeos {
+namespace settings {
+
+// TODO(khorimoto): Remove this path, since it's no longer used.
+extern const char kOsSignOutSubPage[];
+
+// Returns true if the sub-page is one of the above.
+bool IsOSSettingsSubPage(const std::string& sub_page);
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_CONSTANTS_ROUTES_UTIL_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/constants/setting.mojom b/chromium/chrome/browser/ui/webui/settings/chromeos/constants/setting.mojom
new file mode 100644
index 00000000000..634b625b075
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/constants/setting.mojom
@@ -0,0 +1,188 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module chromeos.settings.mojom;
+
+// Enumeration of each setting in the Chrome OS Settings app. Numerical values
+// are used for metrics; do not change or reuse values.
+enum Setting {
+ // Network section.
+ kConfigureEthernet = 0,
+ kEthernetAutoConfigureIp = 1,
+ kEthernetDns = 2,
+ kEthernetProxy = 3,
+ kWifiOnOff = 4,
+ kDisconnectWifiNetwork = 5,
+ kPreferWifiNetwork = 6,
+ kForgetWifiNetwork = 7,
+ kConfigureWifi = 8,
+ kWifiAutoConfigureIp = 9,
+ kWifiDns = 10,
+ kWifiProxy = 11,
+ kWifiAutoConnectToNetwork = 12,
+ kMobileOnOff = 13,
+ kCellularSimLock = 14,
+ kCellularRoaming = 15,
+ kCellularApn = 16,
+ kDisconnectCellularNetwork = 17,
+ kCellularAutoConfigureIp = 18,
+ kCellularDns = 19,
+ kCellularProxy = 20,
+ kCellularAutoConnectToNetwork = 21,
+ kInstantTetheringOnOff = 22,
+ kDisconnectTetherNetwork = 22,
+
+ // Bluetooth section.
+ kBluetoothOnOff = 100,
+ kBluetoothConnectToDevice = 101,
+ kBluetoothDisconnectFromDevice = 102,
+ kBluetoothPairDevice = 103,
+ kBluetoothUnpairDevice = 104,
+
+ // MultiDevice section.
+ kSetUpMultiDevice = 200,
+ kVerifyMultiDeviceSetup = 201,
+ kMultiDeviceOnOff = 202,
+ kSmartLockOnOff = 203,
+ kSmartLockUnlockOrSignIn = 204,
+ kMessagesSetUp = 205,
+ kMessagesOnOff = 206,
+ kForgetPhone = 207,
+
+ // People section.
+ kAddAccount = 300,
+ kRemoveAccount = 301,
+ kSyncOnOff = 302,
+ kLockScreen = 303,
+ kChangeAuthPin = 304,
+ kGuestBrowsing = 305,
+ kShowUsernamesAndPhotosAtSignIn = 306,
+ kRestrictSignIn = 307,
+ kAddToUserWhitelist = 308,
+ kRemoveFromUserWhitelist = 309,
+ kAddKerberosTicket = 310,
+ kRemoveKerberosTicket = 311,
+ kSetActiveKerberosTicket = 312,
+ kAddFingerprint = 313,
+ kRemoveFingerprint = 314,
+ kSetUpParentalControls = 315,
+
+ // Device section.
+ kTouchpadTapToClick = 400,
+ kTouchpadTapDragging = 401,
+ kTouchpadReverseScrolling = 402,
+ kTouchpadAcceleration = 403,
+ kTouchpadScrollAcceleration = 404,
+ kTouchpadSpeed = 405,
+ kMouseSwapPrimaryButtons = 406,
+ kMouseReverseScrolling = 407,
+ kMouseAcceleration = 408,
+ kMouseScrollAcceleration = 409,
+ kMouseSpeed = 410,
+ kKeyboardFunctionKeys = 411,
+ kKeyboardAutoRepeat = 412,
+ kKeyboardShortcuts = 413,
+ kDisplaySize = 414,
+ kNightLight = 415,
+ kStylusToolsInShelf = 416,
+ kStylusNoteTakingApp = 417,
+ kStylusNoteTakingFromLockScreen = 418,
+ kStylusLatestNoteOnLockScreen = 419,
+ kDisplayOrientation = 420,
+ kDisplayArrangement = 421,
+ kPowerIdleBehavior = 422,
+ kPowerSource = 423,
+ kSleepWhenLaptopLidClosed = 424,
+ kDisplayResolution = 425,
+ kDisplayRefreshRate = 426,
+
+ // Personalization section.
+ kOpenWallpaper = 500,
+ kAmbientModeOnOff = 501,
+ kAmbientModeSource = 502,
+
+ // Search and Assistant section.
+ kPreferredSearchEngine = 600,
+ kAssistantOnOff = 601,
+ kAssistantRelatedInfo = 602,
+ kAssistantQuickAnswers = 603,
+ kAssistantOkGoogle = 604,
+ kAssistantNotifications = 605,
+ kAssistantVoiceInput = 606,
+
+ // Apps section.
+ kManageAndroidPreferences = 700,
+ kRemovePlayStore = 701,
+ kTurnOnPlayStore = 702,
+
+ // Crostini section.
+ kSetUpCrostini= 800,
+ kUninstallCrostini = 801,
+ kBackupLinuxAppsAndFiles = 802,
+ kRestoreLinuxAppsAndFiles = 803,
+ kCrostiniAdbDebugging = 804,
+ kCrostiniDiskResize = 805,
+ kCrostiniMicAccess = 806,
+ kCrostiniContainerUpgrade = 807,
+
+ // Note: Plugin VM section is omitted (see https://crbug.com/1074101).
+
+ // Date and Time section.
+ k24HourClock = 1000,
+ kChangeTimeZone = 1001,
+
+ // Privacy section.
+ kVerifiedAccess = 1101,
+ kKeepWifiOnDuringSleep = 1102,
+ kUsageStatsAndCrashReports = 1103,
+
+ // Languages and Input section.
+ kAddLanguage = 1200,
+ kShowInputOptionsInShelf = 1201,
+ kShowPersonalInformationSuggestions = 1202,
+
+ // Files section.
+ kGoogleDriveConnection = 1300,
+
+ // Printing section.
+ kAddPrinter = 1400,
+ kSavedPrinters = 1401,
+ kPrintJobs = 1402,
+
+ // Accessibility section.
+ kA11yQuickSettings = 1500,
+ kChromeVox = 1501,
+ kSelectToSpeak = 1502,
+ kTextToSpeechRate = 1503,
+ kTextToSpeechPitch = 1504,
+ kTextToSpeechVolume = 1505,
+ kTextToSpeechVoice = 1506,
+ kTextToSpeechEngines = 1507,
+ kHighContrastMode = 1508,
+ kFullscreenMagnifier = 1509,
+ kDockedMagnifier = 1510,
+ kStickyKeys = 1511,
+ kOnScreenKeyboard = 1512,
+ kDictation = 1513,
+ kSpeakToType = 1514,
+ kHighlightTextCaret = 1515,
+ kAutoClickWhenCursorStops = 1516,
+ kLargeCursor = 1517,
+ kHighlightCursorWhileMoving = 1518,
+ kTabletNavigationButtons = 1519,
+ kMonoAudio = 1520,
+ kStartupSound = 1521,
+ kEnableSwitchAccess = 1522,
+ kSwitchActionAssignment = 1523,
+ kSwitchActionAutoScan = 1524,
+ kSwitchActionAutoScanKeyboard = 1525,
+ kGetImageDescriptionsFromGoogle = 1526,
+
+ // Reset section.
+ kPowerwash = 1600,
+
+ // About Chrome OS section.
+ kChangeChromeChannel = 1700,
+ kCopyDetailedBuildInfo = 1701,
+};
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/crostini_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/crostini_handler.cc
index 1351b63b654..bf1d6db4c78 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/crostini_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/crostini_handler.cc
@@ -141,26 +141,71 @@ void CrostiniHandler::RegisterMessages() {
"checkCrostiniMicSharingStatus",
base::BindRepeating(&CrostiniHandler::HandleCheckCrostiniMicSharingStatus,
weak_ptr_factory_.GetWeakPtr()));
+ web_ui()->RegisterMessageCallback(
+ "removeCrostiniPortForward",
+ base::BindRepeating(&CrostiniHandler::HandleRemoveCrostiniPortForward,
+ weak_ptr_factory_.GetWeakPtr()));
+ web_ui()->RegisterMessageCallback(
+ "removeAllCrostiniPortForwards",
+ base::BindRepeating(&CrostiniHandler::HandleRemoveAllCrostiniPortForwards,
+ weak_ptr_factory_.GetWeakPtr()));
+ web_ui()->RegisterMessageCallback(
+ "activateCrostiniPortForward",
+ base::BindRepeating(&CrostiniHandler::HandleActivateCrostiniPortForward,
+ weak_ptr_factory_.GetWeakPtr()));
+ web_ui()->RegisterMessageCallback(
+ "deactivateCrostiniPortForward",
+ base::BindRepeating(&CrostiniHandler::HandleDeactivateCrostiniPortForward,
+ weak_ptr_factory_.GetWeakPtr()));
+ web_ui()->RegisterMessageCallback(
+ "getCrostiniActivePorts",
+ base::BindRepeating(&CrostiniHandler::HandleGetCrostiniActivePorts,
+ weak_ptr_factory_.GetWeakPtr()));
+ web_ui()->RegisterMessageCallback(
+ "checkCrostiniIsRunning",
+ base::BindRepeating(&CrostiniHandler::HandleCheckCrostiniIsRunning,
+ weak_ptr_factory_.GetWeakPtr()));
+ web_ui()->RegisterMessageCallback(
+ "shutdownCrostini",
+ base::BindRepeating(&CrostiniHandler::HandleShutdownCrostini,
+ weak_ptr_factory_.GetWeakPtr()));
+ web_ui()->RegisterMessageCallback(
+ "setCrostiniMicSharingEnabled",
+ base::BindRepeating(&CrostiniHandler::HandleSetCrostiniMicSharingEnabled,
+ weak_ptr_factory_.GetWeakPtr()));
+ web_ui()->RegisterMessageCallback(
+ "getCrostiniMicSharingEnabled",
+ base::BindRepeating(&CrostiniHandler::HandleGetCrostiniMicSharingEnabled,
+ weak_ptr_factory_.GetWeakPtr()));
}
void CrostiniHandler::OnJavascriptAllowed() {
auto* crostini_manager = crostini::CrostiniManager::GetForProfile(profile_);
crostini_manager->AddCrostiniDialogStatusObserver(this);
crostini_manager->AddCrostiniContainerPropertiesObserver(this);
+ crostini_manager->AddContainerStartedObserver(this);
+ crostini_manager->AddContainerShutdownObserver(this);
+ crostini_manager->AddCrostiniMicSharingEnabledObserver(this);
if (chromeos::CrosUsbDetector::Get()) {
chromeos::CrosUsbDetector::Get()->AddUsbDeviceObserver(this);
}
crostini::CrostiniExportImport::GetForProfile(profile_)->AddObserver(this);
+ crostini::CrostiniPortForwarder::GetForProfile(profile_)->AddObserver(this);
}
void CrostiniHandler::OnJavascriptDisallowed() {
auto* crostini_manager = crostini::CrostiniManager::GetForProfile(profile_);
crostini_manager->RemoveCrostiniDialogStatusObserver(this);
crostini_manager->RemoveCrostiniContainerPropertiesObserver(this);
+ crostini_manager->RemoveContainerStartedObserver(this);
+ crostini_manager->RemoveContainerShutdownObserver(this);
+ crostini_manager->RemoveCrostiniMicSharingEnabledObserver(this);
if (chromeos::CrosUsbDetector::Get()) {
chromeos::CrosUsbDetector::Get()->RemoveUsbDeviceObserver(this);
}
crostini::CrostiniExportImport::GetForProfile(profile_)->RemoveObserver(this);
+ crostini::CrostiniPortForwarder::GetForProfile(profile_)->RemoveObserver(
+ this);
}
void CrostiniHandler::HandleRequestCrostiniInstallerView(
@@ -243,6 +288,8 @@ base::Value CrostiniDiskInfoToValue(
disk_value.SetBoolKey("succeeded", true);
disk_value.SetBoolKey("canResize", disk_info->can_resize);
disk_value.SetBoolKey("isUserChosenSize", disk_info->is_user_chosen_size);
+ disk_value.SetBoolKey("isLowSpaceAvailable",
+ disk_info->is_low_space_available);
disk_value.SetIntKey("defaultIndex", disk_info->default_index);
base::Value ticks(base::Value::Type::LIST);
for (const auto& tick : disk_info->ticks) {
@@ -451,8 +498,8 @@ void CrostiniHandler::HandleQueryArcAdbRequest(const base::ListValue* args) {
chromeos::SessionManagerClient* client =
chromeos::SessionManagerClient::Get();
- client->QueryAdbSideload(base::Bind(&CrostiniHandler::OnQueryAdbSideload,
- weak_ptr_factory_.GetWeakPtr()));
+ client->QueryAdbSideload(base::BindOnce(&CrostiniHandler::OnQueryAdbSideload,
+ weak_ptr_factory_.GetWeakPtr()));
}
void CrostiniHandler::HandleCrostiniUpgraderDialogStatusRequest(
@@ -472,6 +519,12 @@ void CrostiniHandler::HandleCrostiniContainerUpgradeAvailableRequest(
OnContainerOsReleaseChanged(crostini::DefaultContainerId(), can_upgrade);
}
+void CrostiniHandler::OnActivePortsChanged(const base::ListValue& activePorts) {
+ // Other side listens with cr.addWebUIListener
+ FireWebUIListener("crostini-port-forwarder-active-ports-changed",
+ activePorts);
+}
+
void CrostiniHandler::HandleAddCrostiniPortForward(
const base::ListValue* args) {
CHECK_EQ(6U, args->GetList().size());
@@ -488,6 +541,85 @@ void CrostiniHandler::HandleAddCrostiniPortForward(
port_number,
static_cast<crostini::CrostiniPortForwarder::Protocol>(protocol_type),
std::move(label),
+ base::BindOnce(&CrostiniHandler::OnPortForwardComplete,
+ weak_ptr_factory_.GetWeakPtr(), std::move(callback_id)));
+}
+
+void CrostiniHandler::HandleRemoveCrostiniPortForward(
+ const base::ListValue* args) {
+ CHECK_EQ(5U, args->GetSize());
+ std::string callback_id;
+ CHECK(args->GetString(0, &callback_id));
+ std::string vm_name;
+ CHECK(args->GetString(1, &vm_name));
+ std::string container_name;
+ CHECK(args->GetString(2, &container_name));
+ int port_number;
+ CHECK(args->GetInteger(3, &port_number));
+ int protocol_type;
+ CHECK(args->GetInteger(4, &protocol_type));
+
+ crostini::CrostiniPortForwarder::GetForProfile(profile_)->RemovePort(
+ crostini::ContainerId(std::move(vm_name), std::move(container_name)),
+ port_number,
+ static_cast<crostini::CrostiniPortForwarder::Protocol>(protocol_type),
+ base::Bind(&CrostiniHandler::OnPortForwardComplete,
+ weak_ptr_factory_.GetWeakPtr(), std::move(callback_id)));
+}
+
+void CrostiniHandler::HandleRemoveAllCrostiniPortForwards(
+ const base::ListValue* args) {
+ CHECK_EQ(2U, args->GetSize());
+ const auto& args_list = args->GetList();
+ std::string vm_name = args_list[0].GetString();
+ std::string container_name = args_list[1].GetString();
+
+ crostini::CrostiniPortForwarder::GetForProfile(profile_)->RemoveAllPorts(
+ crostini::ContainerId(std::move(vm_name), std::move(container_name)));
+}
+
+void CrostiniHandler::HandleActivateCrostiniPortForward(
+ const base::ListValue* args) {
+ CHECK_EQ(5U, args->GetSize());
+
+ std::string callback_id;
+ CHECK(args->GetString(0, &callback_id));
+ std::string vm_name;
+ CHECK(args->GetString(1, &vm_name));
+ std::string container_name;
+ CHECK(args->GetString(2, &container_name));
+ int port_number;
+ CHECK(args->GetInteger(3, &port_number));
+ int protocol_type;
+ CHECK(args->GetInteger(4, &protocol_type));
+
+ crostini::CrostiniPortForwarder::GetForProfile(profile_)->ActivatePort(
+ crostini::ContainerId(std::move(vm_name), std::move(container_name)),
+ port_number,
+ static_cast<crostini::CrostiniPortForwarder::Protocol>(protocol_type),
+ base::Bind(&CrostiniHandler::OnPortForwardComplete,
+ weak_ptr_factory_.GetWeakPtr(), std::move(callback_id)));
+}
+
+void CrostiniHandler::HandleDeactivateCrostiniPortForward(
+ const base::ListValue* args) {
+ CHECK_EQ(5U, args->GetSize());
+
+ std::string callback_id;
+ CHECK(args->GetString(0, &callback_id));
+ std::string vm_name;
+ CHECK(args->GetString(1, &vm_name));
+ std::string container_name;
+ CHECK(args->GetString(2, &container_name));
+ int port_number;
+ CHECK(args->GetInteger(3, &port_number));
+ int protocol_type;
+ CHECK(args->GetInteger(4, &protocol_type));
+
+ crostini::CrostiniPortForwarder::GetForProfile(profile_)->DeactivatePort(
+ crostini::ContainerId(std::move(vm_name), std::move(container_name)),
+ port_number,
+ static_cast<crostini::CrostiniPortForwarder::Protocol>(protocol_type),
base::Bind(&CrostiniHandler::OnPortForwardComplete,
weak_ptr_factory_.GetWeakPtr(), std::move(callback_id)));
}
@@ -506,13 +638,14 @@ void CrostiniHandler::ResolveGetCrostiniDiskInfoCallback(
void CrostiniHandler::HandleGetCrostiniDiskInfo(const base::ListValue* args) {
AllowJavascript();
- CHECK_EQ(2U, args->GetList().size());
+ CHECK_EQ(3U, args->GetList().size());
std::string callback_id = args->GetList()[0].GetString();
std::string vm_name = args->GetList()[1].GetString();
+ bool full_info = args->GetList()[2].GetBool();
crostini::disk::GetDiskInfo(
base::BindOnce(&CrostiniHandler::ResolveGetCrostiniDiskInfoCallback,
weak_ptr_factory_.GetWeakPtr(), std::move(callback_id)),
- profile_, std::move(vm_name));
+ profile_, std::move(vm_name), full_info);
}
void CrostiniHandler::HandleResizeCrostiniDisk(const base::ListValue* args) {
@@ -540,12 +673,81 @@ void CrostiniHandler::HandleCheckCrostiniMicSharingStatus(
bool proposed_value = args->GetList()[1].GetBool();
bool requiresRestart =
crostini::IsCrostiniRunning(profile_) &&
- profile_->GetPrefs()->GetBoolean(
- crostini::prefs::kCrostiniMicSharingAtLastLaunch) != proposed_value;
+ crostini::CrostiniManager::GetForProfile(profile_)
+ ->crostini_mic_sharing_enabled() != proposed_value;
ResolveJavascriptCallback(base::Value(std::move(callback_id)),
base::Value(requiresRestart));
}
+void CrostiniHandler::HandleGetCrostiniActivePorts(
+ const base::ListValue* args) {
+ AllowJavascript();
+ CHECK_EQ(1U, args->GetList().size());
+
+ std::string callback_id = args->GetList()[0].GetString();
+
+ ResolveJavascriptCallback(
+ base::Value(callback_id),
+ crostini::CrostiniPortForwarder::GetForProfile(profile_)
+ ->GetActivePorts());
+}
+
+void CrostiniHandler::HandleCheckCrostiniIsRunning(
+ const base::ListValue* args) {
+ AllowJavascript();
+ CHECK_EQ(1U, args->GetList().size());
+
+ std::string callback_id = args->GetList()[0].GetString();
+
+ ResolveJavascriptCallback(base::Value(callback_id),
+ base::Value(crostini::IsCrostiniRunning(profile_)));
+}
+
+void CrostiniHandler::OnContainerStarted(
+ const crostini::ContainerId& container_id) {
+ FireWebUIListener("crostini-status-changed", base::Value(true));
+}
+
+void CrostiniHandler::OnContainerShutdown(
+ const crostini::ContainerId& container_id) {
+ FireWebUIListener("crostini-status-changed", base::Value(false));
+}
+
+void CrostiniHandler::HandleShutdownCrostini(const base::ListValue* args) {
+ CHECK_EQ(0U, args->GetList().size());
+
+ const std::string vm_name = "termina";
+
+ crostini::CrostiniManager::GetForProfile(profile_)->StopVm(
+ std::move(vm_name), std::move(base::DoNothing()));
+}
+
+void CrostiniHandler::OnCrostiniMicSharingEnabledChanged(bool enabled) {
+ FireWebUIListener("crostini-mic-sharing-enabled-changed",
+ base::Value(enabled));
+}
+
+void CrostiniHandler::HandleSetCrostiniMicSharingEnabled(
+ const base::ListValue* args) {
+ CHECK_EQ(1U, args->GetList().size());
+ bool enabled = args->GetList()[0].GetBool();
+
+ crostini::CrostiniManager::GetForProfile(profile_)
+ ->SetCrostiniMicSharingEnabled(enabled);
+}
+
+void CrostiniHandler::HandleGetCrostiniMicSharingEnabled(
+ const base::ListValue* args) {
+ CHECK_EQ(1U, args->GetList().size());
+
+ std::string callback_id = args->GetList()[0].GetString();
+
+ ResolveJavascriptCallback(
+ base::Value(callback_id),
+ base::Value(crostini::CrostiniManager::GetForProfile(profile_)
+ ->crostini_mic_sharing_enabled()));
+}
+
} // namespace settings
} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/crostini_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/crostini_handler.h
index f51fc69e1b7..b1f5b8162bc 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/crostini_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/crostini_handler.h
@@ -10,6 +10,7 @@
#include "base/memory/weak_ptr.h"
#include "chrome/browser/chromeos/crostini/crostini_export_import.h"
#include "chrome/browser/chromeos/crostini/crostini_manager.h"
+#include "chrome/browser/chromeos/crostini/crostini_port_forwarder.h"
#include "chrome/browser/chromeos/usb/cros_usb_detector.h"
#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
#include "chromeos/dbus/session_manager/session_manager_client.h"
@@ -28,6 +29,10 @@ class CrostiniHandler : public ::settings::SettingsPageUIHandler,
public crostini::CrostiniDialogStatusObserver,
public crostini::CrostiniExportImport::Observer,
public crostini::CrostiniContainerPropertiesObserver,
+ public crostini::CrostiniMicSharingEnabledObserver,
+ public crostini::CrostiniPortForwarder::Observer,
+ public crostini::ContainerStartedObserver,
+ public crostini::ContainerShutdownObserver,
public chromeos::CrosUsbDeviceObserver {
public:
explicit CrostiniHandler(Profile* profile);
@@ -98,6 +103,16 @@ class CrostiniHandler : public ::settings::SettingsPageUIHandler,
const base::ListValue* args);
// Handles a request for forwarding a new port.
void HandleAddCrostiniPortForward(const base::ListValue* args);
+ // Handles a request for removing one port.
+ void HandleRemoveCrostiniPortForward(const base::ListValue* args);
+ // Handles a request for removing all ports.
+ void HandleRemoveAllCrostiniPortForwards(const base::ListValue* args);
+ // CrostiniPortForwarder::Observer.
+ void OnActivePortsChanged(const base::ListValue& activePorts) override;
+ // Handles a request for activating an existing port.
+ void HandleActivateCrostiniPortForward(const base::ListValue* args);
+ // Handles a request for deactivating an existing port.
+ void HandleDeactivateCrostiniPortForward(const base::ListValue* args);
// Callback of port forwarding requests.
void OnPortForwardComplete(std::string callback_id, bool success);
// Fetches disk info for a VM, can be slow (seconds).
@@ -111,6 +126,22 @@ class CrostiniHandler : public ::settings::SettingsPageUIHandler,
bool succeeded);
// Checks if a restart is required to update mic sharing settings.
void HandleCheckCrostiniMicSharingStatus(const base::ListValue* args);
+ // Returns a list of currently forwarded ports.
+ void HandleGetCrostiniActivePorts(const base::ListValue* args);
+ // Checks if Crostini is running.
+ void HandleCheckCrostiniIsRunning(const base::ListValue* args);
+ // crostini::ContainerStartedObserver
+ void OnContainerStarted(const crostini::ContainerId& container_id) override;
+ // crostini::ContainerShutdownObserver
+ void OnContainerShutdown(const crostini::ContainerId& container_id) override;
+ // Handles a request to shut down Crostini.
+ void HandleShutdownCrostini(const base::ListValue* args);
+ // crostini::CrostiniMicSharingEnabledObserver
+ void OnCrostiniMicSharingEnabledChanged(bool enabled) override;
+ // Handles a request for setting the permissions for Crostini Mic access.
+ void HandleSetCrostiniMicSharingEnabled(const base::ListValue* args);
+ // Handles a request for getting the permissions for Crostini Mic access.
+ void HandleGetCrostiniMicSharingEnabled(const base::ListValue* args);
Profile* profile_;
// weak_ptr_factory_ should always be last member.
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/crostini_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/crostini_section.cc
new file mode 100644
index 00000000000..f25ce803272
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/crostini_section.cc
@@ -0,0 +1,509 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/crostini_section.h"
+
+#include "base/feature_list.h"
+#include "base/no_destructor.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/browser_process_platform_part.h"
+#include "chrome/browser/chromeos/crostini/crostini_disk.h"
+#include "chrome/browser/chromeos/crostini/crostini_features.h"
+#include "chrome/browser/chromeos/crostini/crostini_pref_names.h"
+#include "chrome/browser/chromeos/crostini/crostini_util.h"
+#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/browser/policy/profile_policy_connector.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/settings/chromeos/crostini_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/grit/generated_resources.h"
+#include "chromeos/constants/chromeos_features.h"
+#include "components/arc/arc_prefs.h"
+#include "components/prefs/pref_service.h"
+#include "content/public/browser/web_ui.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/text/bytes_formatting.h"
+#include "ui/base/webui/web_ui_util.h"
+#include "ui/chromeos/devicetype_utils.h"
+
+namespace chromeos {
+namespace settings {
+namespace {
+
+const std::vector<SearchConcept>& GetCrostiniSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_CROSTINI,
+ mojom::kCrostiniDetailsSubpagePath,
+ mojom::SearchResultIcon::kPenguin,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kCrostiniDetails},
+ {IDS_OS_SETTINGS_TAG_CROSTINI_ALT1, SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetCrostiniOptedInSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_CROSTINI_USB_PREFERENCES,
+ mojom::kCrostiniUsbPreferencesSubpagePath,
+ mojom::SearchResultIcon::kPenguin,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kCrostiniUsbPreferences},
+ {IDS_OS_SETTINGS_TAG_CROSTINI_USB_PREFERENCES_ALT1,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_CROSTINI_REMOVE,
+ mojom::kCrostiniDetailsSubpagePath,
+ mojom::SearchResultIcon::kPenguin,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kUninstallCrostini},
+ {
+ IDS_OS_SETTINGS_TAG_CROSTINI_REMOVE_ALT1,
+ IDS_OS_SETTINGS_TAG_CROSTINI_REMOVE_ALT2,
+ IDS_OS_SETTINGS_TAG_CROSTINI_REMOVE_ALT3,
+ IDS_OS_SETTINGS_TAG_CROSTINI_REMOVE_ALT4,
+ IDS_OS_SETTINGS_TAG_CROSTINI_REMOVE_ALT5,
+ }},
+ {IDS_OS_SETTINGS_TAG_CROSTINI_SHARED_FOLDERS,
+ mojom::kCrostiniManageSharedFoldersSubpagePath,
+ mojom::SearchResultIcon::kPenguin,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kCrostiniManageSharedFolders},
+ {IDS_OS_SETTINGS_TAG_CROSTINI_SHARED_FOLDERS_ALT1,
+ IDS_OS_SETTINGS_TAG_CROSTINI_SHARED_FOLDERS_ALT2,
+ IDS_OS_SETTINGS_TAG_CROSTINI_SHARED_FOLDERS_ALT3,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetCrostiniOptedOutSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_CROSTINI_SETUP,
+ mojom::kCrostiniSectionPath,
+ mojom::SearchResultIcon::kPenguin,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSection,
+ {.section = mojom::Section::kCrostini},
+ {IDS_OS_SETTINGS_TAG_CROSTINI_SETUP_ALT1, SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetCrostiniExportImportSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_CROSTINI_BACKUP_RESTORE,
+ mojom::kCrostiniBackupAndRestoreSubpagePath,
+ mojom::SearchResultIcon::kPenguin,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kCrostiniBackupAndRestore},
+ {IDS_OS_SETTINGS_TAG_CROSTINI_BACKUP_RESTORE_ALT1,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetCrostiniAdbSideloadingSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_CROSTINI_ANDROID_APPS_ADB,
+ mojom::kCrostiniDevelopAndroidAppsSubpagePath,
+ mojom::SearchResultIcon::kPenguin,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kCrostiniAdbDebugging},
+ {IDS_OS_SETTINGS_TAG_CROSTINI_ANDROID_APPS_ADB_ALT1,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_CROSTINI_ANDROID_APPS,
+ mojom::kCrostiniDevelopAndroidAppsSubpagePath,
+ mojom::SearchResultIcon::kPenguin,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kCrostiniDevelopAndroidApps},
+ {IDS_OS_SETTINGS_TAG_CROSTINI_ANDROID_APPS_ALT1,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetCrostiniPortForwardingSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_CROSTINI_PORT_FORWARDING,
+ mojom::kCrostiniPortForwardingSubpagePath,
+ mojom::SearchResultIcon::kPenguin,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kCrostiniPortForwarding},
+ {IDS_OS_SETTINGS_TAG_CROSTINI_PORT_FORWARDING_ALT1,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetCrostiniContainerUpgradeSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_CROSTINI_CONTAINER_UPGRADE,
+ mojom::kCrostiniDetailsSubpagePath,
+ mojom::SearchResultIcon::kPenguin,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kCrostiniContainerUpgrade},
+ {IDS_OS_SETTINGS_TAG_CROSTINI_CONTAINER_UPGRADE_ALT1,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetCrostiniDiskResizingSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_CROSTINI_DISK_RESIZE,
+ mojom::kCrostiniDetailsSubpagePath,
+ mojom::SearchResultIcon::kPenguin,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.setting = mojom::Setting::kCrostiniDiskResize},
+ {IDS_OS_SETTINGS_TAG_CROSTINI_DISK_RESIZE_ALT1,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetCrostiniMicSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_CROSTINI_MIC_ACCESS,
+ mojom::kCrostiniDetailsSubpagePath,
+ mojom::SearchResultIcon::kPenguin,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kCrostiniMicAccess},
+ {IDS_OS_SETTINGS_TAG_CROSTINI_MIC_ACCESS_ALT1,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+bool IsProfileManaged(Profile* profile) {
+ return profile->GetProfilePolicyConnector()->IsManaged();
+}
+
+bool IsDeviceManaged() {
+ policy::BrowserPolicyConnectorChromeOS* connector =
+ g_browser_process->platform_part()->browser_policy_connector_chromeos();
+ return connector->IsEnterpriseManaged();
+}
+
+bool IsAdbSideloadingAllowed() {
+ return base::FeatureList::IsEnabled(features::kArcAdbSideloadingFeature);
+}
+
+bool IsPortForwardingAllowed() {
+ return base::FeatureList::IsEnabled(features::kCrostiniPortForwarding);
+}
+
+bool IsDiskResizingAllowed() {
+ return base::FeatureList::IsEnabled(features::kCrostiniDiskResizing);
+}
+
+bool IsMicSettingAllowed() {
+ return base::FeatureList::IsEnabled(features::kCrostiniShowMicSetting);
+}
+
+} // namespace
+
+CrostiniSection::CrostiniSection(Profile* profile,
+ SearchTagRegistry* search_tag_registry,
+ PrefService* pref_service)
+ : OsSettingsSection(profile, search_tag_registry),
+ pref_service_(pref_service) {
+ pref_change_registrar_.Init(pref_service_);
+ pref_change_registrar_.Add(
+ crostini::prefs::kUserCrostiniAllowedByPolicy,
+ base::BindRepeating(&CrostiniSection::UpdateSearchTags,
+ base::Unretained(this)));
+ pref_change_registrar_.Add(
+ crostini::prefs::kCrostiniEnabled,
+ base::BindRepeating(&CrostiniSection::UpdateSearchTags,
+ base::Unretained(this)));
+ pref_change_registrar_.Add(
+ crostini::prefs::kUserCrostiniExportImportUIAllowedByPolicy,
+ base::BindRepeating(&CrostiniSection::UpdateSearchTags,
+ base::Unretained(this)));
+ pref_change_registrar_.Add(
+ arc::prefs::kArcEnabled,
+ base::BindRepeating(&CrostiniSection::UpdateSearchTags,
+ base::Unretained(this)));
+ UpdateSearchTags();
+}
+
+CrostiniSection::~CrostiniSection() = default;
+
+void CrostiniSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"crostiniPageTitle", IDS_SETTINGS_CROSTINI_TITLE},
+ {"crostiniPageLabel", IDS_SETTINGS_CROSTINI_LABEL},
+ {"crostiniEnable", IDS_SETTINGS_TURN_ON},
+ {"crostiniSharedPaths", IDS_SETTINGS_CROSTINI_SHARED_PATHS},
+ {"crostiniSharedPathsListHeading",
+ IDS_SETTINGS_CROSTINI_SHARED_PATHS_LIST_HEADING},
+ {"crostiniSharedPathsInstructionsAdd",
+ IDS_SETTINGS_CROSTINI_SHARED_PATHS_INSTRUCTIONS_ADD},
+ {"crostiniSharedPathsInstructionsRemove",
+ IDS_SETTINGS_CROSTINI_SHARED_PATHS_INSTRUCTIONS_REMOVE},
+ {"crostiniSharedPathsRemoveSharing",
+ IDS_SETTINGS_CROSTINI_SHARED_PATHS_REMOVE_SHARING},
+ {"crostiniSharedPathsRemoveFailureDialogMessage",
+ IDS_SETTINGS_CROSTINI_SHARED_PATHS_REMOVE_FAILURE_DIALOG_MESSAGE},
+ {"crostiniSharedPathsRemoveFailureDialogTitle",
+ IDS_SETTINGS_CROSTINI_SHARED_PATHS_REMOVE_FAILURE_DIALOG_TITLE},
+ {"crostiniSharedPathsRemoveFailureTryAgain",
+ IDS_SETTINGS_CROSTINI_SHARED_PATHS_REMOVE_FAILURE_TRY_AGAIN},
+ {"crostiniSharedPathsListEmptyMessage",
+ IDS_SETTINGS_CROSTINI_SHARED_PATHS_LIST_EMPTY_MESSAGE},
+ {"crostiniExportImportTitle", IDS_SETTINGS_CROSTINI_EXPORT_IMPORT_TITLE},
+ {"crostiniExport", IDS_SETTINGS_CROSTINI_EXPORT},
+ {"crostiniExportLabel", IDS_SETTINGS_CROSTINI_EXPORT_LABEL},
+ {"crostiniImport", IDS_SETTINGS_CROSTINI_IMPORT},
+ {"crostiniImportLabel", IDS_SETTINGS_CROSTINI_IMPORT_LABEL},
+ {"crostiniImportConfirmationDialogTitle",
+ IDS_SETTINGS_CROSTINI_CONFIRM_IMPORT_DIALOG_WINDOW_TITLE},
+ {"crostiniImportConfirmationDialogMessage",
+ IDS_SETTINGS_CROSTINI_CONFIRM_IMPORT_DIALOG_WINDOW_MESSAGE},
+ {"crostiniImportConfirmationDialogConfirmationButton",
+ IDS_SETTINGS_CROSTINI_IMPORT},
+ {"crostiniRemoveButton", IDS_SETTINGS_CROSTINI_REMOVE_BUTTON},
+ {"crostiniSharedUsbDevicesLabel",
+ IDS_SETTINGS_CROSTINI_SHARED_USB_DEVICES_LABEL},
+ {"crostiniSharedUsbDevicesDescription",
+ IDS_SETTINGS_CROSTINI_SHARED_USB_DEVICES_DESCRIPTION},
+ {"crostiniSharedUsbDevicesExtraDescription",
+ IDS_SETTINGS_CROSTINI_SHARED_USB_DEVICES_EXTRA_DESCRIPTION},
+ {"crostiniSharedUsbDevicesListEmptyMessage",
+ IDS_SETTINGS_CROSTINI_SHARED_USB_DEVICES_LIST_EMPTY_MESSAGE},
+ {"crostiniArcAdbTitle", IDS_SETTINGS_CROSTINI_ARC_ADB_TITLE},
+ {"crostiniArcAdbDescription", IDS_SETTINGS_CROSTINI_ARC_ADB_DESCRIPTION},
+ {"crostiniArcAdbLabel", IDS_SETTINGS_CROSTINI_ARC_ADB_LABEL},
+ {"crostiniArcAdbRestartButton",
+ IDS_SETTINGS_CROSTINI_ARC_ADB_RESTART_BUTTON},
+ {"crostiniArcAdbConfirmationTitleEnable",
+ IDS_SETTINGS_CROSTINI_ARC_ADB_CONFIRMATION_TITLE_ENABLE},
+ {"crostiniArcAdbConfirmationTitleDisable",
+ IDS_SETTINGS_CROSTINI_ARC_ADB_CONFIRMATION_TITLE_DISABLE},
+ {"crostiniContainerUpgrade",
+ IDS_SETTINGS_CROSTINI_CONTAINER_UPGRADE_MESSAGE},
+ {"crostiniContainerUpgradeSubtext",
+ IDS_SETTINGS_CROSTINI_CONTAINER_UPGRADE_SUBTEXT},
+ {"crostiniContainerUpgradeButton",
+ IDS_SETTINGS_CROSTINI_CONTAINER_UPGRADE_BUTTON},
+ {"crostiniPortForwarding", IDS_SETTINGS_CROSTINI_PORT_FORWARDING},
+ {"crostiniPortForwardingDescription",
+ IDS_SETTINGS_CROSTINI_PORT_FORWARDING_DESCRIPTION},
+ {"crostiniPortForwardingNoPorts",
+ IDS_SETTINGS_CROSTINI_PORT_FORWARDING_NO_PORTS},
+ {"crostiniPortForwardingTableTitle",
+ IDS_SETTINGS_CROSTINI_PORT_FORWARDING_TABLE_TITLE},
+ {"crostiniPortForwardingListPortNumber",
+ IDS_SETTINGS_CROSTINI_PORT_FORWARDING_LIST_PORT_NUMBER},
+ {"crostiniPortForwardingListLabel",
+ IDS_SETTINGS_CROSTINI_PORT_FORWARDING_LIST_LABEL},
+ {"crostiniPortForwardingAddPortButton",
+ IDS_SETTINGS_CROSTINI_PORT_FORWARDING_ADD_PORT_BUTTON},
+ {"crostiniPortForwardingAddPortButtonDescription",
+ IDS_SETTINGS_CROSTINI_PORT_FORWARDING_ADD_PORT_BUTTON_DESCRIPTION},
+ {"crostiniPortForwardingAddPortDialogTitle",
+ IDS_SETTINGS_CROSTINI_PORT_FORWARDING_ADD_PORT_DIALOG_TITLE},
+ {"crostiniPortForwardingAddPortDialogLabel",
+ IDS_SETTINGS_CROSTINI_PORT_FORWARDING_ADD_PORT_DIALOG_LABEL},
+ {"crostiniPortForwardingTCP", IDS_SETTINGS_CROSTINI_PORT_FORWARDING_TCP},
+ {"crostiniPortForwardingUDP", IDS_SETTINGS_CROSTINI_PORT_FORWARDING_UDP},
+ {"crostiniPortForwardingAddError",
+ IDS_SETTINGS_CROSTINI_PORT_FORWARDING_ADD_ERROR},
+ {"crostiniPortForwardingRemoveAllPorts",
+ IDS_SETTINGS_CROSTINI_PORT_FORWARDING_REMOVE_ALL_PORTS},
+ {"crostiniPortForwardingRemovePort",
+ IDS_SETTINGS_CROSTINI_PORT_FORWARDING_REMOVE_PORT},
+ {"crostiniPortForwardingToggleAriaLabel",
+ IDS_SETTINGS_CROSTINI_PORT_FORWARDING_TOGGLE_PORT_ARIA_LABEL},
+ {"crostiniPortForwardingRemoveAllPortsAriaLabel",
+ IDS_SETTINGS_CROSTINI_PORT_FORWARDING_REMOVE_ALL_PORTS_ARIA_LABEL},
+ {"crostiniPortForwardingShowMoreActionsAriaLabel",
+ IDS_SETTINGS_CROSTINI_PORT_FORWARDING_SHOW_MORE_ACTIONS_ARIA_LABEL},
+ {"crostiniDiskResizeTitle", IDS_SETTINGS_CROSTINI_DISK_RESIZE_TITLE},
+ {"crostiniDiskResizeShowButton",
+ IDS_SETTINGS_CROSTINI_DISK_RESIZE_SHOW_BUTTON},
+ {"crostiniDiskResizeShowButtonAriaLabel",
+ IDS_SETTINGS_CROSTINI_DISK_RESIZE_SHOW_BUTTON_ARIA_LABEL},
+ {"crostiniDiskSizeCalculating", IDS_SETTINGS_STORAGE_SIZE_CALCULATING},
+ {"crostiniDiskReserveSizeButton",
+ IDS_SETTINGS_CROSTINI_DISK_RESERVE_SIZE_BUTTON},
+ {"crostiniDiskReserveSizeButtonAriaLabel",
+ IDS_SETTINGS_CROSTINI_DISK_RESERVE_SIZE_BUTTON_ARIA_LABEL},
+ {"crostiniDiskResizeLabel", IDS_SETTINGS_CROSTINI_DISK_RESIZE_LABEL},
+ {"crostiniDiskResizeDynamicallyAllocatedSubtext",
+ IDS_SETTINGS_CROSTINI_DISK_RESIZE_DYNAMICALLY_ALLOCATED_SUBTEXT},
+ {"crostiniDiskResizeNotSupportedSubtext",
+ IDS_SETTINGS_CROSTINI_DISK_RESIZE_NOT_SUPPORTED_SUBTEXT},
+ {"crostiniDiskResizeUnsupported",
+ IDS_SETTINGS_CROSTINI_DISK_RESIZE_UNSUPPORTED},
+ {"crostiniDiskResizeLoading", IDS_SETTINGS_CROSTINI_DISK_RESIZE_LOADING},
+ {"crostiniDiskResizeError", IDS_SETTINGS_CROSTINI_DISK_RESIZE_ERROR},
+ {"crostiniDiskResizeErrorRetry",
+ IDS_SETTINGS_CROSTINI_DISK_RESIZE_ERROR_RETRY},
+ {"crostiniDiskResizeCancel", IDS_SETTINGS_CROSTINI_DISK_RESIZE_CANCEL},
+ {"crostiniDiskResizeGoButton",
+ IDS_SETTINGS_CROSTINI_DISK_RESIZE_GO_BUTTON},
+ {"crostiniDiskResizeInProgress",
+ IDS_SETTINGS_CROSTINI_DISK_RESIZE_IN_PROGRESS},
+ {"crostiniDiskResizeResizingError",
+ IDS_SETTINGS_CROSTINI_DISK_RESIZE_RESIZING_ERROR},
+ {"crostiniDiskResizeConfirmationDialogTitle",
+ IDS_SETTINGS_CROSTINI_DISK_RESIZE_CONFIRMATION_DIALOG_TITLE},
+ {"crostiniDiskResizeConfirmationDialogMessage",
+ IDS_SETTINGS_CROSTINI_DISK_RESIZE_CONFIRMATION_DIALOG_MESSAGE},
+ {"crostiniDiskResizeConfirmationDialogButton",
+ IDS_SETTINGS_CROSTINI_DISK_RESIZE_CONFIRMATION_DIALOG_BUTTON},
+ {"crostiniDiskResizeDone", IDS_SETTINGS_CROSTINI_DISK_RESIZE_DONE},
+ {"crostiniMicTitle", IDS_SETTINGS_CROSTINI_MIC_TITLE},
+ {"crostiniMicDialogLabel", IDS_SETTINGS_CROSTINI_MIC_DIALOG_LABEL},
+ {"crostiniMicDialogShutdownButton",
+ IDS_SETTINGS_CROSTINI_MIC_DIALOG_SHUTDOWN_BUTTON},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ html_source->AddBoolean("showCrostini", IsCrostiniAllowed());
+ html_source->AddBoolean(
+ "allowCrostini",
+ crostini::CrostiniFeatures::Get()->IsUIAllowed(profile()));
+
+ html_source->AddString(
+ "crostiniSubtext",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_CROSTINI_SUBTEXT, ui::GetChromeOSDeviceName(),
+ GetHelpUrlWithBoard(chrome::kLinuxAppsLearnMoreURL)));
+ html_source->AddString(
+ "crostiniArcAdbPowerwashRequiredSublabel",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_CROSTINI_ARC_ADB_POWERWASH_REQUIRED_SUBLABEL,
+ base::ASCIIToUTF16(chrome::kArcAdbSideloadingLearnMoreURL)));
+ html_source->AddString("crostiniRemove", l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_CROSTINI_REMOVE,
+ ui::GetChromeOSDeviceName()));
+ html_source->AddString(
+ "crostiniArcAdbConfirmationMessageEnable",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_CROSTINI_ARC_ADB_CONFIRMATION_MESSAGE_ENABLE,
+ ui::GetChromeOSDeviceName()));
+ html_source->AddString(
+ "crostiniArcAdbConfirmationMessageDisable",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_CROSTINI_ARC_ADB_CONFIRMATION_MESSAGE_DISABLE,
+ ui::GetChromeOSDeviceName()));
+ html_source->AddString(
+ "crostiniSharedPathsInstructionsLocate",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_CROSTINI_SHARED_PATHS_INSTRUCTIONS_LOCATE,
+ base::ASCIIToUTF16(
+ crostini::ContainerChromeOSBaseDirectory().value())));
+ html_source->AddString(
+ "crostiniDiskResizeRecommended",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_CROSTINI_DISK_RESIZE_RECOMMENDED,
+ ui::FormatBytes(crostini::disk::kRecommendedDiskSizeBytes)));
+ html_source->AddString(
+ "crostiniDiskResizeRecommendedWarning",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_CROSTINI_DISK_RESIZE_RECOMMENDED_WARNING,
+ ui::FormatBytes(crostini::disk::kRecommendedDiskSizeBytes)));
+
+ html_source->AddBoolean("showCrostiniExportImport", IsExportImportAllowed());
+ html_source->AddBoolean("arcAdbSideloadingSupported",
+ IsAdbSideloadingAllowed());
+ html_source->AddBoolean("showCrostiniPortForwarding",
+ IsPortForwardingAllowed());
+ html_source->AddBoolean("isOwnerProfile",
+ chromeos::ProfileHelper::IsOwnerProfile(profile()));
+ html_source->AddBoolean("isEnterpriseManaged",
+ IsDeviceManaged() || IsProfileManaged(profile()));
+ html_source->AddBoolean(
+ "canChangeAdbSideloading",
+ crostini::CrostiniFeatures::Get()->CanChangeAdbSideloading(profile()));
+ html_source->AddBoolean("showCrostiniContainerUpgrade",
+ IsContainerUpgradeAllowed());
+ html_source->AddBoolean("showCrostiniDiskResize", IsDiskResizingAllowed());
+ html_source->AddBoolean("showCrostiniMic", IsMicSettingAllowed());
+}
+
+void CrostiniSection::AddHandlers(content::WebUI* web_ui) {
+ if (crostini::CrostiniFeatures::Get()->IsUIAllowed(profile(),
+ /*check_policy=*/false)) {
+ web_ui->AddMessageHandler(std::make_unique<CrostiniHandler>(profile()));
+ }
+}
+
+bool CrostiniSection::IsCrostiniAllowed() {
+ return crostini::CrostiniFeatures::Get()->IsUIAllowed(profile(),
+ /*check_policy=*/false);
+}
+
+bool CrostiniSection::IsExportImportAllowed() {
+ return crostini::CrostiniFeatures::Get()->IsExportImportUIAllowed(profile());
+}
+
+bool CrostiniSection::IsContainerUpgradeAllowed() {
+ return crostini::ShouldAllowContainerUpgrade(profile());
+}
+
+void CrostiniSection::UpdateSearchTags() {
+ registry()->RemoveSearchTags(GetCrostiniSearchConcepts());
+ registry()->RemoveSearchTags(GetCrostiniOptedInSearchConcepts());
+ registry()->RemoveSearchTags(GetCrostiniOptedOutSearchConcepts());
+ registry()->RemoveSearchTags(GetCrostiniExportImportSearchConcepts());
+ registry()->RemoveSearchTags(GetCrostiniAdbSideloadingSearchConcepts());
+ registry()->RemoveSearchTags(GetCrostiniPortForwardingSearchConcepts());
+ registry()->RemoveSearchTags(GetCrostiniContainerUpgradeSearchConcepts());
+ registry()->RemoveSearchTags(GetCrostiniDiskResizingSearchConcepts());
+ registry()->RemoveSearchTags(GetCrostiniMicSearchConcepts());
+
+ if (!IsCrostiniAllowed())
+ return;
+
+ registry()->AddSearchTags(GetCrostiniSearchConcepts());
+
+ if (!pref_service_->GetBoolean(crostini::prefs::kCrostiniEnabled)) {
+ registry()->AddSearchTags(GetCrostiniOptedOutSearchConcepts());
+ return;
+ }
+
+ registry()->AddSearchTags(GetCrostiniOptedInSearchConcepts());
+
+ if (IsExportImportAllowed())
+ registry()->AddSearchTags(GetCrostiniExportImportSearchConcepts());
+
+ if (IsAdbSideloadingAllowed() &&
+ pref_service_->GetBoolean(arc::prefs::kArcEnabled)) {
+ registry()->AddSearchTags(GetCrostiniAdbSideloadingSearchConcepts());
+ }
+
+ if (IsPortForwardingAllowed())
+ registry()->AddSearchTags(GetCrostiniPortForwardingSearchConcepts());
+
+ if (IsContainerUpgradeAllowed())
+ registry()->AddSearchTags(GetCrostiniContainerUpgradeSearchConcepts());
+
+ if (IsDiskResizingAllowed())
+ registry()->AddSearchTags(GetCrostiniDiskResizingSearchConcepts());
+
+ if (IsMicSettingAllowed())
+ registry()->AddSearchTags(GetCrostiniMicSearchConcepts());
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/crostini_section.h b/chromium/chrome/browser/ui/webui/settings/chromeos/crostini_section.h
new file mode 100644
index 00000000000..ee51c4be36f
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/crostini_section.h
@@ -0,0 +1,47 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_CROSTINI_SECTION_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_CROSTINI_SECTION_H_
+
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h"
+#include "components/prefs/pref_change_registrar.h"
+
+namespace content {
+class WebUIDataSource;
+} // namespace content
+
+namespace chromeos {
+namespace settings {
+
+class SearchTagRegistry;
+
+// Provides UI strings and search tags for Crostini settings. Search tags are
+// only added if Crostini is available, and subpage search tags are added only
+// when those subpages are available.
+class CrostiniSection : public OsSettingsSection {
+ public:
+ CrostiniSection(Profile* profile,
+ SearchTagRegistry* search_tag_registry,
+ PrefService* pref_service);
+ ~CrostiniSection() override;
+
+ private:
+ // OsSettingsSection:
+ void AddLoadTimeData(content::WebUIDataSource* html_source) override;
+ void AddHandlers(content::WebUI* web_ui) override;
+
+ bool IsCrostiniAllowed();
+ bool IsExportImportAllowed();
+ bool IsContainerUpgradeAllowed();
+ void UpdateSearchTags();
+
+ PrefService* pref_service_;
+ PrefChangeRegistrar pref_change_registrar_;
+};
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_CROSTINI_SECTION_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
index fd6f8acdd11..6031f1951fa 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
@@ -26,7 +26,6 @@
#include "base/values.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/printing/cups_printers_manager.h"
-#include "chrome/browser/chromeos/printing/cups_printers_manager_factory.h"
#include "chrome/browser/chromeos/printing/ppd_provider_factory.h"
#include "chrome/browser/chromeos/printing/printer_configurer.h"
#include "chrome/browser/chromeos/printing/printer_event_tracker.h"
@@ -38,10 +37,12 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_window.h"
+#include "chrome/browser/ui/chrome_pages.h"
#include "chrome/browser/ui/chrome_select_file_policy.h"
#include "chrome/browser/ui/webui/settings/chromeos/server_printer_url_util.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/pref_names.h"
+#include "chromeos/constants/chromeos_features.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/debug_daemon/debug_daemon_client.h"
#include "chromeos/printing/ppd_line_reader.h"
@@ -94,18 +95,6 @@ void RecordIppQueryResult(const PrinterQueryResult& result) {
}
}
-// Returns true if |printer_uri| is an IPP uri.
-bool IsIppUri(base::StringPiece printer_uri) {
- base::StringPiece::size_type separator_location =
- printer_uri.find(url::kStandardSchemeSeparator);
- if (separator_location == base::StringPiece::npos) {
- return false;
- }
-
- base::StringPiece scheme_part = printer_uri.substr(0, separator_location);
- return scheme_part == kIppScheme || scheme_part == kIppsScheme;
-}
-
// Query an IPP printer to check for autoconf support where the printer is
// located at |printer_uri|. Results are reported through |callback|. It is an
// error to attempt this with a non-IPP printer.
@@ -276,6 +265,13 @@ GURL GenerateHttpCupsServerUrl(const GURL& server_url) {
} // namespace
+CupsPrintersHandler::CupsPrintersHandler(Profile* profile,
+ CupsPrintersManager* printers_manager)
+ : CupsPrintersHandler(profile,
+ CreatePpdProvider(profile),
+ PrinterConfigurer::Create(profile),
+ printers_manager) {}
+
CupsPrintersHandler::CupsPrintersHandler(
Profile* profile,
scoped_refptr<PpdProvider> ppd_provider,
@@ -289,19 +285,6 @@ CupsPrintersHandler::CupsPrintersHandler(
printers_manager_observer_(this) {}
// static
-std::unique_ptr<CupsPrintersHandler> CupsPrintersHandler::Create(
- content::WebUI* webui) {
- Profile* profile(Profile::FromWebUI(webui));
- auto ppd_provider = CreatePpdProvider(profile);
- auto printer_configurer = PrinterConfigurer::Create(profile);
- CupsPrintersManager* printers_manager =
- CupsPrintersManagerFactory::GetForBrowserContext(profile);
- // Using 'new' to access non-public constructor.
- return base::WrapUnique(new CupsPrintersHandler(
- profile, ppd_provider, std::move(printer_configurer), printers_manager));
-}
-
-// static
std::unique_ptr<CupsPrintersHandler> CupsPrintersHandler::CreateForTesting(
Profile* profile,
scoped_refptr<PpdProvider> ppd_provider,
@@ -380,6 +363,13 @@ void CupsPrintersHandler::RegisterMessages() {
"queryPrintServer",
base::BindRepeating(&CupsPrintersHandler::HandleQueryPrintServer,
base::Unretained(this)));
+ if (base::FeatureList::IsEnabled(
+ chromeos::features::kPrintJobManagementApp)) {
+ web_ui()->RegisterMessageCallback(
+ "openPrintManagementApp",
+ base::BindRepeating(&CupsPrintersHandler::HandleOpenPrintManagementApp,
+ base::Unretained(this)));
+ }
}
void CupsPrintersHandler::OnJavascriptAllowed() {
@@ -773,8 +763,7 @@ void CupsPrintersHandler::OnAddedOrEditedPrinterCommon(
UMA_HISTOGRAM_ENUMERATION("Printing.CUPS.PrinterAdded",
printer.GetProtocol(), Printer::kProtocolMax);
PRINTER_LOG(USER) << "Performing printer setup";
- printers_manager_->PrinterInstalled(printer, is_automatic,
- PrinterSetupSource::kSettings);
+ printers_manager_->PrinterInstalled(printer, is_automatic);
printers_manager_->SavePrinter(printer);
if (printer.IsUsbProtocol()) {
// Record UMA for USB printer setup source.
@@ -989,7 +978,7 @@ void CupsPrintersHandler::FileSelected(const base::FilePath& path,
void CupsPrintersHandler::VerifyPpdContents(const base::FilePath& path,
const std::string& contents) {
- std::string result = "";
+ std::string result;
if (PpdLineReader::ContainsMagicNumber(contents, kPpdMaxLineLength))
result = path.value();
@@ -1334,5 +1323,13 @@ void CupsPrintersHandler::OnQueryPrintServerCompleted(
ResolveJavascriptCallback(base::Value(callback_id), result_dict);
}
+void CupsPrintersHandler::HandleOpenPrintManagementApp(
+ const base::ListValue* args) {
+ DCHECK(args->empty());
+ DCHECK(
+ base::FeatureList::IsEnabled(chromeos::features::kPrintJobManagementApp));
+ chrome::ShowPrintManagementApp(profile_);
+}
+
} // namespace settings
} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h
index 82de71cf6cc..e899d67a19b 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h
@@ -48,14 +48,13 @@ class CupsPrintersHandler : public ::settings::SettingsPageUIHandler,
public ui::SelectFileDialog::Listener,
public CupsPrintersManager::Observer {
public:
- static std::unique_ptr<CupsPrintersHandler> Create(content::WebUI* webui);
-
static std::unique_ptr<CupsPrintersHandler> CreateForTesting(
Profile* profile,
scoped_refptr<PpdProvider> ppd_provider,
std::unique_ptr<PrinterConfigurer> printer_configurer,
CupsPrintersManager* printers_manager);
+ CupsPrintersHandler(Profile* profile, CupsPrintersManager* printers_manager);
~CupsPrintersHandler() override;
// SettingsPageUIHandler overrides:
@@ -234,6 +233,8 @@ class CupsPrintersHandler : public ::settings::SettingsPageUIHandler,
const GURL& server_url,
std::vector<PrinterDetector::DetectedPrinter>&& returned_printers);
+ void HandleOpenPrintManagementApp(const base::ListValue* args);
+
Profile* profile_;
// Discovery support. discovery_active_ tracks whether or not the UI
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler_unittest.cc
index b9c43dbc0e2..36193fc66fa 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler_unittest.cc
@@ -230,7 +230,7 @@ TEST_F(CupsPrintersHandlerTest, RemoveCorrectPrinter) {
bool expected = true;
client->CupsRemovePrinter(
"testprinter1",
- base::BindRepeating(&RemovedPrinter, run_loop.QuitClosure(), &expected),
+ base::BindOnce(&RemovedPrinter, run_loop.QuitClosure(), &expected),
base::DoNothing());
run_loop.Run();
EXPECT_FALSE(expected);
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/date_time_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/date_time_handler.cc
index 39ceb89c02a..dac0db6e52d 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/date_time_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/date_time_handler.cc
@@ -7,8 +7,8 @@
#include "ash/public/cpp/login_screen.h"
#include "ash/public/cpp/login_types.h"
#include "base/bind.h"
+#include "base/check_op.h"
#include "base/command_line.h"
-#include "base/logging.h"
#include "base/time/time.h"
#include "base/values.h"
#include "chrome/browser/browser_process.h"
@@ -27,7 +27,6 @@
#include "components/user_manager/user_manager.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui.h"
-#include "content/public/browser/web_ui_data_source.h"
namespace chromeos {
namespace settings {
@@ -71,20 +70,6 @@ DateTimeHandler::DateTimeHandler() : scoped_observer_(this) {}
DateTimeHandler::~DateTimeHandler() = default;
-DateTimeHandler* DateTimeHandler::Create(
- content::WebUIDataSource* html_source) {
- // Set the initial time zone to show.
- html_source->AddString("timeZoneName", system::GetCurrentTimezoneName());
- html_source->AddString(
- "timeZoneID",
- system::TimezoneSettings::GetInstance()->GetCurrentTimezoneID());
- html_source->AddBoolean(
- "timeActionsProtectedForChild",
- base::FeatureList::IsEnabled(features::kParentAccessCodeForTimeChange));
-
- return new DateTimeHandler;
-}
-
void DateTimeHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback(
"dateTimePageReady",
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/date_time_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/date_time_handler.h
index 2a3c44a9b29..102fb30eed6 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/date_time_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/date_time_handler.h
@@ -19,10 +19,6 @@ namespace base {
class ListValue;
}
-namespace content {
-class WebUIDataSource;
-}
-
namespace chromeos {
namespace settings {
@@ -30,19 +26,15 @@ namespace settings {
class DateTimeHandler : public ::settings::SettingsPageUIHandler,
public SystemClockClient::Observer {
public:
+ DateTimeHandler();
~DateTimeHandler() override;
- // Adds load-time values to html_source before creating the handler.
- static DateTimeHandler* Create(content::WebUIDataSource* html_source);
-
// SettingsPageUIHandler implementation.
void RegisterMessages() override;
void OnJavascriptAllowed() override;
void OnJavascriptDisallowed() override;
private:
- DateTimeHandler();
-
// SystemClockClient::Observer implementation.
void SystemClockCanSetTimeChanged(bool can_set_time) override;
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/date_time_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/date_time_section.cc
new file mode 100644
index 00000000000..529689f68dc
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/date_time_section.cc
@@ -0,0 +1,137 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/date_time_section.h"
+
+#include "base/feature_list.h"
+#include "base/no_destructor.h"
+#include "base/strings/stringprintf.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/chromeos/system/timezone_util.h"
+#include "chrome/browser/ui/webui/settings/chromeos/date_time_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/chrome_features.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/grit/generated_resources.h"
+#include "chromeos/settings/cros_settings_names.h"
+#include "chromeos/settings/system_settings_provider.h"
+#include "chromeos/settings/timezone_settings.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/webui/web_ui_util.h"
+
+namespace chromeos {
+namespace settings {
+namespace {
+
+const std::vector<SearchConcept>& GetDateTimeSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_DATE_TIME,
+ mojom::kDateAndTimeSectionPath,
+ mojom::SearchResultIcon::kClock,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSection,
+ {.section = mojom::Section::kDateAndTime}},
+ {IDS_OS_SETTINGS_TAG_DATE_TIME_MILITARY_CLOCK,
+ mojom::kDateAndTimeSectionPath,
+ mojom::SearchResultIcon::kClock,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::k24HourClock},
+ {IDS_OS_SETTINGS_TAG_DATE_TIME_MILITARY_CLOCK_ALT1,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetFineGrainedTimeZoneSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_DATE_TIME_ZONE_SUBPAGE,
+ mojom::kTimeZoneSubpagePath,
+ mojom::SearchResultIcon::kClock,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kTimeZone}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetNoFineGrainedTimeZoneSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_DATE_TIME_ZONE,
+ mojom::kDateAndTimeSectionPath,
+ mojom::SearchResultIcon::kClock,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kChangeTimeZone}},
+ });
+ return *tags;
+}
+
+} // namespace
+
+DateTimeSection::DateTimeSection(Profile* profile,
+ SearchTagRegistry* search_tag_registry)
+ : OsSettingsSection(profile, search_tag_registry) {
+ registry()->AddSearchTags(GetDateTimeSearchConcepts());
+
+ SystemSettingsProvider provider;
+ if (provider.Get(chromeos::kFineGrainedTimeZoneResolveEnabled)->GetBool())
+ registry()->AddSearchTags(GetFineGrainedTimeZoneSearchConcepts());
+ else
+ registry()->AddSearchTags(GetNoFineGrainedTimeZoneSearchConcepts());
+}
+
+DateTimeSection::~DateTimeSection() = default;
+
+void DateTimeSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"dateTimePageTitle", IDS_SETTINGS_DATE_TIME},
+ {"timeZone", IDS_SETTINGS_TIME_ZONE},
+ {"selectTimeZoneResolveMethod",
+ IDS_SETTINGS_SELECT_TIME_ZONE_RESOLVE_METHOD},
+ {"timeZoneGeolocation", IDS_SETTINGS_TIME_ZONE_GEOLOCATION},
+ {"timeZoneButton", IDS_SETTINGS_TIME_ZONE_BUTTON},
+ {"timeZoneSubpageTitle", IDS_SETTINGS_TIME_ZONE_SUBPAGE_TITLE},
+ {"setTimeZoneAutomaticallyDisabled",
+ IDS_SETTINGS_TIME_ZONE_DETECTION_MODE_DISABLED},
+ {"setTimeZoneAutomaticallyOn",
+ IDS_SETTINGS_TIME_ZONE_DETECTION_SET_AUTOMATICALLY},
+ {"setTimeZoneAutomaticallyOff",
+ IDS_SETTINGS_TIME_ZONE_DETECTION_CHOOSE_FROM_LIST},
+ {"setTimeZoneAutomaticallyIpOnlyDefault",
+ IDS_SETTINGS_TIME_ZONE_DETECTION_MODE_IP_ONLY_DEFAULT},
+ {"setTimeZoneAutomaticallyWithWiFiAccessPointsData",
+ IDS_SETTINGS_TIME_ZONE_DETECTION_MODE_SEND_WIFI_AP},
+ {"setTimeZoneAutomaticallyWithAllLocationInfo",
+ IDS_SETTINGS_TIME_ZONE_DETECTION_MODE_SEND_ALL_INFO},
+ {"use24HourClock", IDS_SETTINGS_USE_24_HOUR_CLOCK},
+ {"setDateTime", IDS_SETTINGS_SET_DATE_TIME},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ html_source->AddString(
+ "timeZoneSettingsLearnMoreURL",
+ base::ASCIIToUTF16(base::StringPrintf(
+ chrome::kTimeZoneSettingsLearnMoreURL,
+ g_browser_process->GetApplicationLocale().c_str())));
+
+ // Set the initial time zone to show.
+ html_source->AddString("timeZoneName", system::GetCurrentTimezoneName());
+ html_source->AddString(
+ "timeZoneID",
+ system::TimezoneSettings::GetInstance()->GetCurrentTimezoneID());
+ html_source->AddBoolean(
+ "timeActionsProtectedForChild",
+ base::FeatureList::IsEnabled(features::kParentAccessCodeForTimeChange));
+}
+
+void DateTimeSection::AddHandlers(content::WebUI* web_ui) {
+ web_ui->AddMessageHandler(std::make_unique<DateTimeHandler>());
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/date_time_section.h b/chromium/chrome/browser/ui/webui/settings/chromeos/date_time_section.h
new file mode 100644
index 00000000000..2c1d8e0f5c3
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/date_time_section.h
@@ -0,0 +1,34 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_DATE_TIME_SECTION_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_DATE_TIME_SECTION_H_
+
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h"
+
+namespace content {
+class WebUIDataSource;
+} // namespace content
+
+namespace chromeos {
+namespace settings {
+
+class SearchTagRegistry;
+
+// Provides UI strings and search tags for Date and Time settings.
+class DateTimeSection : public OsSettingsSection {
+ public:
+ DateTimeSection(Profile* profile, SearchTagRegistry* search_tag_registry);
+ ~DateTimeSection() override;
+
+ private:
+ // OsSettingsSection:
+ void AddLoadTimeData(content::WebUIDataSource* html_source) override;
+ void AddHandlers(content::WebUI* web_ui) override;
+};
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_DATE_TIME_SECTION_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/device_display_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/device_display_handler.cc
new file mode 100644
index 00000000000..fdfe3d16bd6
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/device_display_handler.cc
@@ -0,0 +1,51 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/device_display_handler.h"
+
+#include "ash/public/ash_interfaces.h"
+#include "base/bind.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/values.h"
+#include "content/public/browser/web_ui.h"
+#include "ui/display/types/display_constants.h"
+
+namespace chromeos {
+namespace settings {
+
+DisplayHandler::DisplayHandler() {
+ ash::BindCrosDisplayConfigController(
+ cros_display_config_.BindNewPipeAndPassReceiver());
+}
+
+DisplayHandler::~DisplayHandler() {
+ cros_display_config_->HighlightDisplay(display::kInvalidDisplayId);
+}
+
+void DisplayHandler::RegisterMessages() {
+ web_ui()->RegisterMessageCallback(
+ "highlightDisplay",
+ base::BindRepeating(
+ &DisplayHandler::HandleHighlightDisplay,
+ base::Unretained(this))); // base::Unretained(this) is acceptable
+ // here as |this| is owned by web_ui().
+}
+
+void DisplayHandler::HandleHighlightDisplay(const base::ListValue* args) {
+ AllowJavascript();
+
+ std::string display_id_str;
+ int64_t display_id;
+
+ if (!args->GetString(0, &display_id_str) ||
+ !base::StringToInt64(display_id_str, &display_id)) {
+ cros_display_config_->HighlightDisplay(display::kInvalidDisplayId);
+ return;
+ }
+
+ cros_display_config_->HighlightDisplay(display_id);
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/device_display_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/device_display_handler.h
new file mode 100644
index 00000000000..62f3f402acb
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/device_display_handler.h
@@ -0,0 +1,42 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_DEVICE_DISPLAY_HANDLER_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_DEVICE_DISPLAY_HANDLER_H_
+
+#include "ash/public/mojom/cros_display_config.mojom.h"
+#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/remote.h"
+
+namespace base {
+class ListValue;
+} // namespace base
+
+namespace chromeos {
+namespace settings {
+
+// Chrome OS "Displays" settings page UI handler.
+class DisplayHandler : public ::settings::SettingsPageUIHandler {
+ public:
+ DisplayHandler();
+ DisplayHandler(const DisplayHandler&) = delete;
+ DisplayHandler& operator=(const DisplayHandler&) = delete;
+ ~DisplayHandler() override;
+
+ // SettingsPageUIHandler:
+ void RegisterMessages() override;
+ void OnJavascriptAllowed() override {}
+ void OnJavascriptDisallowed() override {}
+
+ private:
+ void HandleHighlightDisplay(const base::ListValue* args);
+
+ mojo::Remote<ash::mojom::CrosDisplayConfigController> cros_display_config_;
+};
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_DEVICE_DISPLAY_HANDLER_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/device_dlc_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/device_dlc_handler.cc
new file mode 100644
index 00000000000..38eb1b57fef
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/device_dlc_handler.cc
@@ -0,0 +1,96 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/device_dlc_handler.h"
+#include "base/bind.h"
+#include "base/values.h"
+#include "ui/base/text/bytes_formatting.h"
+
+namespace chromeos {
+namespace settings {
+namespace {
+
+base::ListValue DlcsWithContentToListValue(
+ const dlcservice::DlcsWithContent& dlcs_with_content) {
+ base::ListValue dlc_metadata_list;
+ for (int i = 0; i < dlcs_with_content.dlc_infos_size(); i++) {
+ const auto& dlc_info = dlcs_with_content.dlc_infos(i);
+ base::Value dlc_metadata(base::Value::Type::DICTIONARY);
+ dlc_metadata.SetKey("id", base::Value(dlc_info.id()));
+ dlc_metadata.SetKey("name", base::Value(dlc_info.name()));
+ dlc_metadata.SetKey("description", base::Value(dlc_info.description()));
+ dlc_metadata.SetKey(
+ "diskUsageLabel",
+ base::Value(ui::FormatBytes(dlc_info.used_bytes_on_disk())));
+ dlc_metadata_list.Append(std::move(dlc_metadata));
+ }
+ return dlc_metadata_list;
+}
+
+} // namespace
+
+DlcHandler::DlcHandler() = default;
+
+DlcHandler::~DlcHandler() = default;
+
+void DlcHandler::RegisterMessages() {
+ web_ui()->RegisterMessageCallback(
+ "getDlcList", base::BindRepeating(&DlcHandler::HandleGetDlcList,
+ weak_ptr_factory_.GetWeakPtr()));
+
+ web_ui()->RegisterMessageCallback(
+ "purgeDlc", base::BindRepeating(&DlcHandler::HandlePurgeDlc,
+ weak_ptr_factory_.GetWeakPtr()));
+}
+
+void DlcHandler::OnJavascriptDisallowed() {
+ // Ensure that pending callbacks do not complete and cause JS to be evaluated.
+ weak_ptr_factory_.InvalidateWeakPtrs();
+}
+
+void DlcHandler::HandleGetDlcList(const base::ListValue* args) {
+ AllowJavascript();
+ CHECK_EQ(1U, args->GetSize());
+ const base::Value* callback_id;
+ CHECK(args->Get(0, &callback_id));
+
+ DlcserviceClient::Get()->GetExistingDlcs(
+ base::BindOnce(&DlcHandler::GetDlcListCallback,
+ weak_ptr_factory_.GetWeakPtr(), callback_id->Clone()));
+}
+
+void DlcHandler::HandlePurgeDlc(const base::ListValue* args) {
+ AllowJavascript();
+ CHECK_EQ(2U, args->GetSize());
+ const base::Value* callback_id;
+ CHECK(args->Get(0, &callback_id));
+ std::string dlcId;
+ CHECK(args->GetString(1, &dlcId));
+
+ DlcserviceClient::Get()->Purge(
+ dlcId,
+ base::BindOnce(&DlcHandler::PurgeDlcCallback,
+ weak_ptr_factory_.GetWeakPtr(), callback_id->Clone()));
+}
+
+void DlcHandler::GetDlcListCallback(
+ const base::Value& callback_id,
+ const std::string& err,
+ const dlcservice::DlcsWithContent& dlcs_with_content) {
+ if (err == dlcservice::kErrorNone) {
+ ResolveJavascriptCallback(callback_id,
+ DlcsWithContentToListValue(dlcs_with_content));
+ return;
+ }
+ ResolveJavascriptCallback(callback_id, base::ListValue());
+}
+
+void DlcHandler::PurgeDlcCallback(const base::Value& callback_id,
+ const std::string& err) {
+ ResolveJavascriptCallback(callback_id,
+ base::Value(err == dlcservice::kErrorNone));
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/device_dlc_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/device_dlc_handler.h
new file mode 100644
index 00000000000..27afcaf2de6
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/device_dlc_handler.h
@@ -0,0 +1,51 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_DEVICE_DLC_HANDLER_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_DEVICE_DLC_HANDLER_H_
+
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
+#include "chromeos/dbus/dlcservice/dlcservice_client.h"
+
+namespace base {
+class ListValue;
+} // namespace base
+
+namespace chromeos {
+namespace settings {
+
+// Chrome OS Downloaded Content settings page UI handler.
+class DlcHandler : public ::settings::SettingsPageUIHandler {
+ public:
+ DlcHandler();
+ DlcHandler(const DlcHandler&) = delete;
+ DlcHandler& operator=(const DlcHandler&) = delete;
+ ~DlcHandler() override;
+
+ // SettingsPageUIHandler:
+ void RegisterMessages() override;
+ void OnJavascriptAllowed() override {}
+ void OnJavascriptDisallowed() override;
+
+ private:
+ // Handler to get the latest list of DLCs.
+ void HandleGetDlcList(const base::ListValue* args);
+
+ // Handler to purge a DLC.
+ void HandlePurgeDlc(const base::ListValue* args);
+
+ void GetDlcListCallback(const base::Value& callback_id,
+ const std::string& err,
+ const dlcservice::DlcsWithContent& dlcs_with_content);
+
+ void PurgeDlcCallback(const base::Value& callback_id, const std::string& err);
+
+ base::WeakPtrFactory<DlcHandler> weak_ptr_factory_{this};
+};
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_DEVICE_DLC_HANDLER_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/device_dlc_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/device_dlc_handler_unittest.cc
new file mode 100644
index 00000000000..cb4dbc5dde8
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/device_dlc_handler_unittest.cc
@@ -0,0 +1,172 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+#include "chrome/browser/ui/webui/settings/chromeos/device_dlc_handler.h"
+#include "base/strings/string_number_conversions.h"
+#include "chromeos/dbus/dlcservice/fake_dlcservice_client.h"
+#include "content/public/test/browser_task_environment.h"
+#include "content/public/test/test_web_ui.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace chromeos {
+namespace settings {
+
+namespace {
+
+dlcservice::DlcsWithContent CreateDlcModuleListOfSize(size_t numDlcs) {
+ dlcservice::DlcsWithContent dlc_module_list;
+ dlcservice::DlcsWithContent_DlcInfo* dlc_module_info;
+ for (size_t i = 0; i < numDlcs; i++) {
+ dlc_module_info = dlc_module_list.add_dlc_infos();
+ }
+ return dlc_module_list;
+}
+
+class TestDlcHandler : public DlcHandler {
+ public:
+ TestDlcHandler() = default;
+ ~TestDlcHandler() override = default;
+
+ // Make public for testing.
+ using DlcHandler::AllowJavascript;
+ using DlcHandler::set_web_ui;
+};
+
+class DlcHandlerTest : public testing::Test {
+ public:
+ DlcHandlerTest() = default;
+ ~DlcHandlerTest() override = default;
+ DlcHandlerTest(const DlcHandlerTest&) = delete;
+ DlcHandlerTest& operator=(const DlcHandlerTest&) = delete;
+
+ void SetUp() override {
+ test_web_ui_ = std::make_unique<content::TestWebUI>();
+
+ handler_ = std::make_unique<TestDlcHandler>();
+ handler_->set_web_ui(test_web_ui_.get());
+ handler_->RegisterMessages();
+ handler_->AllowJavascriptForTesting();
+
+ chromeos::DlcserviceClient::InitializeFake();
+ fake_dlcservice_client_ = static_cast<chromeos::FakeDlcserviceClient*>(
+ chromeos::DlcserviceClient::Get());
+ }
+
+ void TearDown() override {
+ handler_.reset();
+ test_web_ui_.reset();
+ chromeos::DlcserviceClient::Shutdown();
+ }
+
+ content::TestWebUI* test_web_ui() { return test_web_ui_.get(); }
+
+ protected:
+ chromeos::FakeDlcserviceClient* fake_dlcservice_client_;
+ std::unique_ptr<TestDlcHandler> handler_;
+ std::unique_ptr<content::TestWebUI> test_web_ui_;
+ content::BrowserTaskEnvironment task_environment_;
+
+ const content::TestWebUI::CallData& CallDataAtIndex(size_t index) {
+ return *test_web_ui_->call_data()[index];
+ }
+
+ base::Value::ConstListView CallGetDlcListAndReturnList() {
+ size_t call_data_count_before_call = test_web_ui()->call_data().size();
+
+ base::ListValue args;
+ args.AppendString("handlerFunctionName");
+ test_web_ui()->HandleReceivedMessage("getDlcList", &args);
+ task_environment_.RunUntilIdle();
+
+ EXPECT_EQ(call_data_count_before_call + 1u,
+ test_web_ui()->call_data().size());
+
+ const content::TestWebUI::CallData& call_data =
+ CallDataAtIndex(call_data_count_before_call);
+ EXPECT_EQ("cr.webUIResponse", call_data.function_name());
+ EXPECT_EQ("handlerFunctionName", call_data.arg1()->GetString());
+ return call_data.arg3()->GetList();
+ }
+
+ bool CallPurgeDlcAndReturnSuccess() {
+ size_t call_data_count_before_call = test_web_ui()->call_data().size();
+
+ base::ListValue args;
+ args.AppendString("handlerFunctionName");
+ args.AppendString("dlcId");
+ test_web_ui()->HandleReceivedMessage("purgeDlc", &args);
+ task_environment_.RunUntilIdle();
+
+ EXPECT_EQ(call_data_count_before_call + 1u,
+ test_web_ui()->call_data().size());
+
+ const content::TestWebUI::CallData& call_data =
+ CallDataAtIndex(call_data_count_before_call);
+ EXPECT_EQ("cr.webUIResponse", call_data.function_name());
+ EXPECT_EQ("handlerFunctionName", call_data.arg1()->GetString());
+ return call_data.arg3()->GetBool();
+ }
+};
+
+TEST_F(DlcHandlerTest, GetDlcList) {
+ fake_dlcservice_client_->set_dlcs_with_content(CreateDlcModuleListOfSize(2u));
+
+ fake_dlcservice_client_->SetGetExistingDlcsError(dlcservice::kErrorInternal);
+ EXPECT_EQ(CallGetDlcListAndReturnList().size(), 0u);
+
+ fake_dlcservice_client_->SetGetExistingDlcsError(
+ dlcservice::kErrorNeedReboot);
+ EXPECT_EQ(CallGetDlcListAndReturnList().size(), 0u);
+
+ fake_dlcservice_client_->SetGetExistingDlcsError(
+ dlcservice::kErrorInvalidDlc);
+ EXPECT_EQ(CallGetDlcListAndReturnList().size(), 0u);
+
+ fake_dlcservice_client_->SetGetExistingDlcsError(
+ dlcservice::kErrorAllocation);
+ EXPECT_EQ(CallGetDlcListAndReturnList().size(), 0u);
+
+ fake_dlcservice_client_->SetGetExistingDlcsError(dlcservice::kErrorNone);
+ EXPECT_EQ(CallGetDlcListAndReturnList().size(), 2u);
+}
+
+TEST_F(DlcHandlerTest, PurgeDlc) {
+ fake_dlcservice_client_->SetPurgeError(dlcservice::kErrorInternal);
+ EXPECT_FALSE(CallPurgeDlcAndReturnSuccess());
+
+ fake_dlcservice_client_->SetPurgeError(dlcservice::kErrorNeedReboot);
+ EXPECT_FALSE(CallPurgeDlcAndReturnSuccess());
+
+ fake_dlcservice_client_->SetPurgeError(dlcservice::kErrorInvalidDlc);
+ EXPECT_FALSE(CallPurgeDlcAndReturnSuccess());
+
+ fake_dlcservice_client_->SetPurgeError(dlcservice::kErrorAllocation);
+ EXPECT_FALSE(CallPurgeDlcAndReturnSuccess());
+
+ fake_dlcservice_client_->SetPurgeError(dlcservice::kErrorNone);
+ EXPECT_TRUE(CallPurgeDlcAndReturnSuccess());
+}
+
+TEST_F(DlcHandlerTest, FormattedCorrectly) {
+ dlcservice::DlcsWithContent dlcs_with_content;
+ auto* dlc_info = dlcs_with_content.add_dlc_infos();
+ dlc_info->set_id("fake id");
+ dlc_info->set_name("fake name");
+ dlc_info->set_description("fake description");
+ dlc_info->set_used_bytes_on_disk(100000);
+
+ fake_dlcservice_client_->set_dlcs_with_content(dlcs_with_content);
+
+ auto result_list = CallGetDlcListAndReturnList();
+ EXPECT_EQ(1UL, result_list.size());
+ EXPECT_EQ("fake id", result_list[0].FindKey("id")->GetString());
+ EXPECT_EQ("fake name", result_list[0].FindKey("name")->GetString());
+ EXPECT_EQ("fake description",
+ result_list[0].FindKey("description")->GetString());
+ EXPECT_EQ("97.7 KB", result_list[0].FindKey("diskUsageLabel")->GetString());
+}
+
+} // namespace
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler.cc
index 7195f59a799..21f56f98ea7 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler.cc
@@ -11,8 +11,6 @@
#include "base/values.h"
#include "chromeos/constants/chromeos_switches.h"
#include "content/public/browser/web_ui.h"
-#include "content/public/common/service_manager_connection.h"
-#include "services/service_manager/public/cpp/connector.h"
#include "ui/chromeos/events/event_rewriter_chromeos.h"
#include "ui/chromeos/events/keyboard_layout_util.h"
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler_unittest.cc
index a558502222a..5bba9dae1c8 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler_unittest.cc
@@ -10,7 +10,6 @@
#include <vector>
#include "base/command_line.h"
-#include "base/logging.h"
#include "base/macros.h"
#include "base/observer_list.h"
#include "chromeos/constants/chromeos_switches.h"
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/device_power_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/device_power_handler.cc
index a5c66d6f18f..39e32c01bdc 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/device_power_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/device_power_handler.cc
@@ -163,7 +163,7 @@ void PowerHandler::RegisterMessages() {
void PowerHandler::OnJavascriptAllowed() {
PowerManagerClient* power_manager_client = PowerManagerClient::Get();
power_manager_client_observer_.Add(power_manager_client);
- power_manager_client->GetSwitchStates(base::Bind(
+ power_manager_client->GetSwitchStates(base::BindOnce(
&PowerHandler::OnGotSwitchStates, weak_ptr_factory_.GetWeakPtr()));
// Observe power management prefs used in the UI.
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/device_power_handler_browsertest.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/device_power_handler_browsertest.cc
index c928ccd2d75..d301f7a917b 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/device_power_handler_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/device_power_handler_browsertest.cc
@@ -20,6 +20,7 @@
#include "components/policy/core/common/mock_configuration_policy_provider.h"
#include "components/policy/policy_constants.h"
#include "components/prefs/pref_service.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_web_ui.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/device_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/device_section.cc
new file mode 100644
index 00000000000..440b8feb397
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/device_section.cc
@@ -0,0 +1,986 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/device_section.h"
+
+#include "ash/public/ash_interfaces.h"
+#include "ash/public/cpp/ash_features.h"
+#include "ash/public/cpp/night_light_controller.h"
+#include "ash/public/cpp/stylus_utils.h"
+#include "base/command_line.h"
+#include "base/feature_list.h"
+#include "base/no_destructor.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/chromeos/login/demo_mode/demo_session.h"
+#include "chrome/browser/ui/webui/settings/chromeos/device_display_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/device_dlc_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/device_pointer_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/device_power_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/chrome_features.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/common/webui_url_constants.h"
+#include "chrome/grit/generated_resources.h"
+#include "chromeos/constants/chromeos_features.h"
+#include "chromeos/constants/chromeos_switches.h"
+#include "content/public/browser/web_ui.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/webui/web_ui_util.h"
+#include "ui/chromeos/events/keyboard_layout_util.h"
+#include "ui/display/display_features.h"
+#include "ui/display/display_switches.h"
+#include "ui/display/manager/touch_device_manager.h"
+#include "ui/events/devices/device_data_manager.h"
+
+namespace chromeos {
+namespace settings {
+namespace {
+
+const std::vector<SearchConcept>& GetDeviceSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_KEYBOARD,
+ mojom::kKeyboardSubpagePath,
+ mojom::SearchResultIcon::kKeyboard,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kKeyboard}},
+ {IDS_OS_SETTINGS_TAG_KEYBOARD_AUTO_REPEAT,
+ mojom::kKeyboardSubpagePath,
+ mojom::SearchResultIcon::kKeyboard,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kKeyboardAutoRepeat},
+ {IDS_OS_SETTINGS_TAG_KEYBOARD_AUTO_REPEAT_ALT1,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_POWER,
+ mojom::kPowerSubpagePath,
+ mojom::SearchResultIcon::kPower,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kPower}},
+ {IDS_OS_SETTINGS_TAG_DISPLAY_SIZE,
+ mojom::kDisplaySubpagePath,
+ mojom::SearchResultIcon::kDisplay,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kDisplaySize},
+ {
+ IDS_OS_SETTINGS_TAG_DISPLAY_SIZE_ALT1,
+ IDS_OS_SETTINGS_TAG_DISPLAY_SIZE_ALT2,
+ IDS_OS_SETTINGS_TAG_DISPLAY_SIZE_ALT3,
+ IDS_OS_SETTINGS_TAG_DISPLAY_SIZE_ALT4,
+ IDS_OS_SETTINGS_TAG_DISPLAY_SIZE_ALT5,
+ }},
+ {IDS_OS_SETTINGS_TAG_STORAGE,
+ mojom::kStorageSubpagePath,
+ mojom::SearchResultIcon::kHardDrive,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kStorage},
+ {IDS_OS_SETTINGS_TAG_STORAGE_ALT1, IDS_OS_SETTINGS_TAG_STORAGE_ALT2,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_DISPLAY_NIGHT_LIGHT,
+ mojom::kDisplaySubpagePath,
+ mojom::SearchResultIcon::kDisplay,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kNightLight},
+ {IDS_OS_SETTINGS_TAG_DISPLAY_NIGHT_LIGHT_ALT1,
+ IDS_OS_SETTINGS_TAG_DISPLAY_NIGHT_LIGHT_ALT2,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_DISPLAY,
+ mojom::kDisplaySubpagePath,
+ mojom::SearchResultIcon::kDisplay,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kDisplay},
+ {IDS_OS_SETTINGS_TAG_DISPLAY_ALT1, IDS_OS_SETTINGS_TAG_DISPLAY_ALT2,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_KEYBOARD_SHORTCUTS,
+ mojom::kKeyboardSubpagePath,
+ mojom::SearchResultIcon::kKeyboard,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kKeyboardShortcuts}},
+ {IDS_OS_SETTINGS_TAG_DEVICE,
+ mojom::kDeviceSectionPath,
+ mojom::SearchResultIcon::kLaptop,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSection,
+ {.section = mojom::Section::kDevice}},
+ {IDS_OS_SETTINGS_TAG_KEYBOARD_FUNCTION_KEYS,
+ mojom::kKeyboardSubpagePath,
+ mojom::SearchResultIcon::kKeyboard,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kKeyboardFunctionKeys}},
+ {IDS_OS_SETTINGS_TAG_POWER_IDLE,
+ mojom::kPowerSubpagePath,
+ mojom::SearchResultIcon::kPower,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kPowerIdleBehavior},
+ {IDS_OS_SETTINGS_TAG_POWER_IDLE_ALT1, SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetTouchpadSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_TOUCHPAD_SPEED,
+ mojom::kPointersSubpagePath,
+ mojom::SearchResultIcon::kLaptop,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kTouchpadSpeed}},
+ {IDS_OS_SETTINGS_TAG_TOUCHPAD_TAP_DRAGGING,
+ mojom::kPointersSubpagePath,
+ mojom::SearchResultIcon::kLaptop,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kTouchpadTapDragging}},
+ {IDS_OS_SETTINGS_TAG_TOUCHPAD_TAP_TO_CLICK,
+ mojom::kPointersSubpagePath,
+ mojom::SearchResultIcon::kLaptop,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kTouchpadTapToClick}},
+ {IDS_OS_SETTINGS_TAG_TOUCHPAD,
+ mojom::kPointersSubpagePath,
+ mojom::SearchResultIcon::kLaptop,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kPointers},
+ {IDS_OS_SETTINGS_TAG_TOUCHPAD_ALT1, SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_TOUCHPAD_SCROLL_ACCELERATION,
+ mojom::kPointersSubpagePath,
+ mojom::SearchResultIcon::kLaptop,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kTouchpadScrollAcceleration}},
+ {IDS_OS_SETTINGS_TAG_TOUCHPAD_REVERSE_SCROLLING,
+ mojom::kPointersSubpagePath,
+ mojom::SearchResultIcon::kLaptop,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kTouchpadReverseScrolling}},
+ {IDS_OS_SETTINGS_TAG_TOUCHPAD_ACCELERATION,
+ mojom::kPointersSubpagePath,
+ mojom::SearchResultIcon::kLaptop,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kTouchpadAcceleration}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetMouseSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_MOUSE_ACCELERATION,
+ mojom::kPointersSubpagePath,
+ mojom::SearchResultIcon::kMouse,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kMouseAcceleration}},
+ {IDS_OS_SETTINGS_TAG_MOUSE_SWAP_BUTTON,
+ mojom::kPointersSubpagePath,
+ mojom::SearchResultIcon::kMouse,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kMouseSwapPrimaryButtons}},
+ {IDS_OS_SETTINGS_TAG_MOUSE_SPEED,
+ mojom::kPointersSubpagePath,
+ mojom::SearchResultIcon::kMouse,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kMouseSpeed}},
+ {IDS_OS_SETTINGS_TAG_MOUSE_REVERSE_SCROLLING,
+ mojom::kPointersSubpagePath,
+ mojom::SearchResultIcon::kMouse,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kMouseReverseScrolling}},
+ {IDS_OS_SETTINGS_TAG_MOUSE,
+ mojom::kPointersSubpagePath,
+ mojom::SearchResultIcon::kMouse,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kPointers}},
+ {IDS_OS_SETTINGS_TAG_MOUSE_SCROLL_ACCELERATION,
+ mojom::kPointersSubpagePath,
+ mojom::SearchResultIcon::kMouse,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kMouseScrollAcceleration}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetStylusSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_STYLUS_NOTE_APP,
+ mojom::kStylusSubpagePath,
+ mojom::SearchResultIcon::kStylus,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kStylusNoteTakingApp},
+ {IDS_OS_SETTINGS_TAG_STYLUS_NOTE_APP_ALT1,
+ IDS_OS_SETTINGS_TAG_STYLUS_NOTE_APP_ALT2, SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_STYLUS_LOCK_SCREEN_LATEST_NOTE,
+ mojom::kStylusSubpagePath,
+ mojom::SearchResultIcon::kStylus,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kStylusLatestNoteOnLockScreen}},
+ {IDS_OS_SETTINGS_TAG_STYLUS_LOCK_SCREEN_NOTES,
+ mojom::kStylusSubpagePath,
+ mojom::SearchResultIcon::kStylus,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kStylusNoteTakingFromLockScreen}},
+ {IDS_OS_SETTINGS_TAG_STYLUS_SHELF_TOOLS,
+ mojom::kStylusSubpagePath,
+ mojom::SearchResultIcon::kStylus,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kStylusToolsInShelf},
+ {IDS_OS_SETTINGS_TAG_STYLUS_SHELF_TOOLS_ALT1,
+ IDS_OS_SETTINGS_TAG_STYLUS_SHELF_TOOLS_ALT2,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_STYLUS,
+ mojom::kStylusSubpagePath,
+ mojom::SearchResultIcon::kStylus,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kStylus}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetDisplayArrangementSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_DISPLAY_ARRANGEMENT,
+ mojom::kDisplaySubpagePath,
+ mojom::SearchResultIcon::kDisplay,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kDisplayArrangement},
+ {IDS_OS_SETTINGS_TAG_DISPLAY_ARRANGEMENT_ALT1,
+ IDS_OS_SETTINGS_TAG_DISPLAY_ARRANGEMENT_ALT2,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetDisplayMirrorSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ // TODO(khorimoto): Add "Display mirror" search concepts.
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetDisplayUnifiedDesktopSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ // TODO(khorimoto): Add "Display with Unified Desktop" search concepts.
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetDisplayMultipleSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ // TODO(khorimoto): Add "Display multiple" search concepts.
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetDisplayExternalSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_DISPLAY_ORIENTATION,
+ mojom::kDisplaySubpagePath,
+ mojom::SearchResultIcon::kDisplay,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kDisplayOrientation},
+ {IDS_OS_SETTINGS_TAG_DISPLAY_ORIENTATION_ALT1,
+ IDS_OS_SETTINGS_TAG_DISPLAY_ORIENTATION_ALT2,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_DISPLAY_RESOLUTION,
+ mojom::kDisplaySubpagePath,
+ mojom::SearchResultIcon::kDisplay,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kDisplayResolution},
+ {IDS_OS_SETTINGS_TAG_DISPLAY_RESOLUTION_ALT1,
+ IDS_OS_SETTINGS_TAG_DISPLAY_RESOLUTION_ALT2,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>&
+GetDisplayExternalWithRefreshSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_DISPLAY_REFRESH_RATE,
+ mojom::kDisplaySubpagePath,
+ mojom::SearchResultIcon::kDisplay,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kDisplayRefreshRate},
+ {IDS_OS_SETTINGS_TAG_DISPLAY_REFRESH_RATE_ALT1,
+ IDS_OS_SETTINGS_TAG_DISPLAY_REFRESH_RATE_ALT2,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetDisplayOrientationSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ // TODO(khorimoto): Add "Display orientation" search concepts.
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetDisplayAmbientSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ // TODO(khorimoto): Add "Display ambient" search concepts.
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetDisplayTouchCalibrationSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ // TODO(khorimoto): Add "Display touch calibration" search concepts.
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetDisplayNightLightOnSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ // TODO(khorimoto): Add "Display Night Light on" search concepts.
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetExternalStorageSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_EXTERNAL_STORAGE,
+ mojom::kExternalStorageSubpagePath,
+ mojom::SearchResultIcon::kHardDrive,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kExternalStorage}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetPowerWithBatterySearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_POWER_SOURCE,
+ mojom::kPowerSubpagePath,
+ mojom::SearchResultIcon::kPower,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kPowerSource},
+ {IDS_OS_SETTINGS_TAG_POWER_SOURCE_ALT1,
+ IDS_OS_SETTINGS_TAG_POWER_SOURCE_ALT2, SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetPowerWithLaptopLidSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_POWER_SLEEP_COVER_CLOSED,
+ mojom::kPowerSubpagePath,
+ mojom::SearchResultIcon::kPower,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kSleepWhenLaptopLidClosed},
+ {IDS_OS_SETTINGS_TAG_POWER_SLEEP_COVER_CLOSED_ALT1,
+ IDS_OS_SETTINGS_TAG_POWER_SLEEP_COVER_CLOSED_ALT2,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+bool IsUnifiedDesktopAvailable() {
+ return base::CommandLine::ForCurrentProcess()->HasSwitch(
+ ::switches::kEnableUnifiedDesktop);
+}
+
+bool DoesDeviceSupportAmbientColor() {
+ return ash::features::IsAllowAmbientEQEnabled();
+}
+
+bool IsTouchCalibrationAvailable() {
+ return base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kEnableTouchCalibrationSetting) &&
+ display::HasExternalTouchscreenDevice();
+}
+
+bool IsListAllDisplayModesEnabled() {
+ return display::features::IsListAllDisplayModesEnabled();
+}
+
+void AddDeviceKeyboardStrings(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString keyboard_strings[] = {
+ {"keyboardTitle", IDS_SETTINGS_KEYBOARD_TITLE},
+ {"keyboardKeyCtrl", IDS_SETTINGS_KEYBOARD_KEY_LEFT_CTRL},
+ {"keyboardKeyAlt", IDS_SETTINGS_KEYBOARD_KEY_LEFT_ALT},
+ {"keyboardKeyCapsLock", IDS_SETTINGS_KEYBOARD_KEY_CAPS_LOCK},
+ {"keyboardKeyCommand", IDS_SETTINGS_KEYBOARD_KEY_COMMAND},
+ {"keyboardKeyDiamond", IDS_SETTINGS_KEYBOARD_KEY_DIAMOND},
+ {"keyboardKeyEscape", IDS_SETTINGS_KEYBOARD_KEY_ESCAPE},
+ {"keyboardKeyBackspace", IDS_SETTINGS_KEYBOARD_KEY_BACKSPACE},
+ {"keyboardKeyAssistant", IDS_SETTINGS_KEYBOARD_KEY_ASSISTANT},
+ {"keyboardKeyDisabled", IDS_SETTINGS_KEYBOARD_KEY_DISABLED},
+ {"keyboardKeyExternalCommand",
+ IDS_SETTINGS_KEYBOARD_KEY_EXTERNAL_COMMAND},
+ {"keyboardKeyExternalMeta", IDS_SETTINGS_KEYBOARD_KEY_EXTERNAL_META},
+ {"keyboardKeyMeta", IDS_SETTINGS_KEYBOARD_KEY_META},
+ {"keyboardSendFunctionKeys", IDS_SETTINGS_KEYBOARD_SEND_FUNCTION_KEYS},
+ {"keyboardEnableAutoRepeat", IDS_SETTINGS_KEYBOARD_AUTO_REPEAT_ENABLE},
+ {"keyRepeatDelay", IDS_SETTINGS_KEYBOARD_AUTO_REPEAT_DELAY},
+ {"keyRepeatDelayLong", IDS_SETTINGS_KEYBOARD_AUTO_REPEAT_DELAY_LONG},
+ {"keyRepeatDelayShort", IDS_SETTINGS_KEYBOARD_AUTO_REPEAT_DELAY_SHORT},
+ {"keyRepeatRate", IDS_SETTINGS_KEYBOARD_AUTO_REPEAT_RATE},
+ {"keyRepeatRateSlow", IDS_SETTINGS_KEYBOARD_AUTO_REPEAT_RATE_SLOW},
+ {"keyRepeatRateFast", IDS_SETTINGS_KEYBOARD_AUTO_REPEAT_FAST},
+ {"showKeyboardShortcutViewer",
+ IDS_SETTINGS_KEYBOARD_SHOW_SHORTCUT_VIEWER},
+ {"keyboardShowLanguageAndInput",
+ IDS_SETTINGS_KEYBOARD_SHOW_LANGUAGE_AND_INPUT},
+ };
+ AddLocalizedStringsBulk(html_source, keyboard_strings);
+
+ html_source->AddLocalizedString("keyboardKeySearch",
+ ui::DeviceUsesKeyboardLayout2()
+ ? IDS_SETTINGS_KEYBOARD_KEY_LAUNCHER
+ : IDS_SETTINGS_KEYBOARD_KEY_SEARCH);
+ html_source->AddLocalizedString(
+ "keyboardSendFunctionKeysDescription",
+ ui::DeviceUsesKeyboardLayout2()
+ ? IDS_SETTINGS_KEYBOARD_SEND_FUNCTION_KEYS_LAYOUT2_DESCRIPTION
+ : IDS_SETTINGS_KEYBOARD_SEND_FUNCTION_KEYS_DESCRIPTION);
+}
+
+void AddDeviceStylusStrings(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kStylusStrings[] = {
+ {"stylusTitle", IDS_SETTINGS_STYLUS_TITLE},
+ {"stylusEnableStylusTools", IDS_SETTINGS_STYLUS_ENABLE_STYLUS_TOOLS},
+ {"stylusAutoOpenStylusTools", IDS_SETTINGS_STYLUS_AUTO_OPEN_STYLUS_TOOLS},
+ {"stylusFindMoreAppsPrimary", IDS_SETTINGS_STYLUS_FIND_MORE_APPS_PRIMARY},
+ {"stylusFindMoreAppsSecondary",
+ IDS_SETTINGS_STYLUS_FIND_MORE_APPS_SECONDARY},
+ {"stylusNoteTakingApp", IDS_SETTINGS_STYLUS_NOTE_TAKING_APP_LABEL},
+ {"stylusNoteTakingAppEnabledOnLockScreen",
+ IDS_SETTINGS_STYLUS_NOTE_TAKING_APP_LOCK_SCREEN_CHECKBOX},
+ {"stylusNoteTakingAppKeepsLastNoteOnLockScreen",
+ IDS_SETTINGS_STYLUS_NOTE_TAKING_APP_KEEP_LATEST_NOTE},
+ {"stylusNoteTakingAppLockScreenSettingsHeader",
+ IDS_SETTINGS_STYLUS_LOCK_SCREEN_NOTES_TITLE},
+ {"stylusNoteTakingAppNoneAvailable",
+ IDS_SETTINGS_STYLUS_NOTE_TAKING_APP_NONE_AVAILABLE},
+ {"stylusNoteTakingAppWaitingForAndroid",
+ IDS_SETTINGS_STYLUS_NOTE_TAKING_APP_WAITING_FOR_ANDROID}};
+ AddLocalizedStringsBulk(html_source, kStylusStrings);
+
+ html_source->AddBoolean("hasInternalStylus",
+ ash::stylus_utils::HasInternalStylus());
+}
+
+void AddDeviceDisplayStrings(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kDisplayStrings[] = {
+ {"displayTitle", IDS_SETTINGS_DISPLAY_TITLE},
+ {"displayArrangementText", IDS_SETTINGS_DISPLAY_ARRANGEMENT_TEXT},
+ {"displayArrangementTitle", IDS_SETTINGS_DISPLAY_ARRANGEMENT_TITLE},
+ {"displayMirror", IDS_SETTINGS_DISPLAY_MIRROR},
+ {"displayMirrorDisplayName", IDS_SETTINGS_DISPLAY_MIRROR_DISPLAY_NAME},
+ {"displayAmbientColorTitle", IDS_SETTINGS_DISPLAY_AMBIENT_COLOR_TITLE},
+ {"displayAmbientColorSubtitle",
+ IDS_SETTINGS_DISPLAY_AMBIENT_COLOR_SUBTITLE},
+ {"displayNightLightLabel", IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_LABEL},
+ {"displayNightLightOnAtSunset",
+ IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_ON_AT_SUNSET},
+ {"displayNightLightOffAtSunrise",
+ IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_OFF_AT_SUNRISE},
+ {"displayNightLightScheduleCustom",
+ IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_SCHEDULE_CUSTOM},
+ {"displayNightLightScheduleLabel",
+ IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_SCHEDULE_LABEL},
+ {"displayNightLightScheduleNever",
+ IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_SCHEDULE_NEVER},
+ {"displayNightLightScheduleSunsetToSunRise",
+ IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_SCHEDULE_SUNSET_TO_SUNRISE},
+ {"displayNightLightStartTime",
+ IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_START_TIME},
+ {"displayNightLightStopTime", IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_STOP_TIME},
+ {"displayNightLightText", IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_TEXT},
+ {"displayNightLightTemperatureLabel",
+ IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_TEMPERATURE_LABEL},
+ {"displayNightLightTempSliderMaxLabel",
+ IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_TEMP_SLIDER_MAX_LABEL},
+ {"displayNightLightTempSliderMinLabel",
+ IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_TEMP_SLIDER_MIN_LABEL},
+ {"displayUnifiedDesktop", IDS_SETTINGS_DISPLAY_UNIFIED_DESKTOP},
+ {"displayUnifiedDesktopOn", IDS_SETTINGS_DISPLAY_UNIFIED_DESKTOP_ON},
+ {"displayUnifiedDesktopOff", IDS_SETTINGS_DISPLAY_UNIFIED_DESKTOP_OFF},
+ {"displayResolutionTitle", IDS_SETTINGS_DISPLAY_RESOLUTION_TITLE},
+ {"displayResolutionText", IDS_SETTINGS_DISPLAY_RESOLUTION_TEXT},
+ {"displayResolutionTextBest", IDS_SETTINGS_DISPLAY_RESOLUTION_TEXT_BEST},
+ {"displayResolutionTextNative",
+ IDS_SETTINGS_DISPLAY_RESOLUTION_TEXT_NATIVE},
+ {"displayResolutionSublabel", IDS_SETTINGS_DISPLAY_RESOLUTION_SUBLABEL},
+ {"displayResolutionMenuItem", IDS_SETTINGS_DISPLAY_RESOLUTION_MENU_ITEM},
+ {"displayResolutionOnlyMenuItem",
+ IDS_SETTINGS_DISPLAY_RESOLUTION_ONLY_MENU_ITEM},
+ {"displayResolutionInterlacedMenuItem",
+ IDS_SETTINGS_DISPLAY_RESOLUTION_INTERLACED_MENU_ITEM},
+ {"displayRefreshRateTitle", IDS_SETTINGS_DISPLAY_REFRESH_RATE_TITLE},
+ {"displayRefreshRateSublabel",
+ IDS_SETTINGS_DISPLAY_REFRESH_RATE_SUBLABEL},
+ {"displayRefreshRateMenuItem",
+ IDS_SETTINGS_DISPLAY_REFRESH_RATE_MENU_ITEM},
+ {"displayRefreshRateInterlacedMenuItem",
+ IDS_SETTINGS_DISPLAY_REFRESH_RATE_INTERLACED_MENU_ITEM},
+ {"displayZoomTitle", IDS_SETTINGS_DISPLAY_ZOOM_TITLE},
+ {"displayZoomSublabel", IDS_SETTINGS_DISPLAY_ZOOM_SUBLABEL},
+ {"displayZoomValue", IDS_SETTINGS_DISPLAY_ZOOM_VALUE},
+ {"displayZoomLogicalResolutionText",
+ IDS_SETTINGS_DISPLAY_ZOOM_LOGICAL_RESOLUTION_TEXT},
+ {"displayZoomNativeLogicalResolutionNativeText",
+ IDS_SETTINGS_DISPLAY_ZOOM_LOGICAL_RESOLUTION_NATIVE_TEXT},
+ {"displayZoomLogicalResolutionDefaultText",
+ IDS_SETTINGS_DISPLAY_ZOOM_LOGICAL_RESOLUTION_DEFAULT_TEXT},
+ {"displaySizeSliderMinLabel", IDS_SETTINGS_DISPLAY_ZOOM_SLIDER_MINIMUM},
+ {"displaySizeSliderMaxLabel", IDS_SETTINGS_DISPLAY_ZOOM_SLIDER_MAXIMUM},
+ {"displayScreenTitle", IDS_SETTINGS_DISPLAY_SCREEN},
+ {"displayScreenExtended", IDS_SETTINGS_DISPLAY_SCREEN_EXTENDED},
+ {"displayScreenPrimary", IDS_SETTINGS_DISPLAY_SCREEN_PRIMARY},
+ {"displayOrientation", IDS_SETTINGS_DISPLAY_ORIENTATION},
+ {"displayOrientationStandard", IDS_SETTINGS_DISPLAY_ORIENTATION_STANDARD},
+ {"displayOrientationAutoRotate",
+ IDS_SETTINGS_DISPLAY_ORIENTATION_AUTO_ROTATE},
+ {"displayOverscanPageText", IDS_SETTINGS_DISPLAY_OVERSCAN_TEXT},
+ {"displayOverscanPageTitle", IDS_SETTINGS_DISPLAY_OVERSCAN_TITLE},
+ {"displayOverscanSubtitle", IDS_SETTINGS_DISPLAY_OVERSCAN_SUBTITLE},
+ {"displayOverscanInstructions",
+ IDS_SETTINGS_DISPLAY_OVERSCAN_INSTRUCTIONS},
+ {"displayOverscanResize", IDS_SETTINGS_DISPLAY_OVERSCAN_RESIZE},
+ {"displayOverscanPosition", IDS_SETTINGS_DISPLAY_OVERSCAN_POSITION},
+ {"displayOverscanReset", IDS_SETTINGS_DISPLAY_OVERSCAN_RESET},
+ {"displayTouchCalibrationTitle",
+ IDS_SETTINGS_DISPLAY_TOUCH_CALIBRATION_TITLE},
+ {"displayTouchCalibrationText",
+ IDS_SETTINGS_DISPLAY_TOUCH_CALIBRATION_TEXT}};
+ AddLocalizedStringsBulk(html_source, kDisplayStrings);
+
+ html_source->AddBoolean("unifiedDesktopAvailable",
+ IsUnifiedDesktopAvailable());
+
+ html_source->AddBoolean("listAllDisplayModes",
+ IsListAllDisplayModesEnabled());
+
+ html_source->AddBoolean("deviceSupportsAmbientColor",
+ DoesDeviceSupportAmbientColor());
+
+ html_source->AddBoolean("enableTouchCalibrationSetting",
+ IsTouchCalibrationAvailable());
+
+ html_source->AddBoolean(
+ "allowDisplayIdentificationApi",
+ base::FeatureList::IsEnabled(ash::features::kDisplayIdentification));
+
+ html_source->AddString("invalidDisplayId",
+ base::NumberToString(display::kInvalidDisplayId));
+}
+
+void AddDeviceStorageStrings(content::WebUIDataSource* html_source,
+ bool is_external_storage_page_available) {
+ static constexpr webui::LocalizedString kStorageStrings[] = {
+ {"storageTitle", IDS_SETTINGS_STORAGE_TITLE},
+ {"storageItemInUse", IDS_SETTINGS_STORAGE_ITEM_IN_USE},
+ {"storageItemAvailable", IDS_SETTINGS_STORAGE_ITEM_AVAILABLE},
+ {"storageItemSystem", IDS_SETTINGS_STORAGE_ITEM_SYSTEM},
+ {"storageItemMyFiles", IDS_SETTINGS_STORAGE_ITEM_MY_FILES},
+ {"storageItemBrowsingData", IDS_SETTINGS_STORAGE_ITEM_BROWSING_DATA},
+ {"storageItemApps", IDS_SETTINGS_STORAGE_ITEM_APPS},
+ {"storageItemCrostini", IDS_SETTINGS_STORAGE_ITEM_CROSTINI},
+ {"storageItemOtherUsers", IDS_SETTINGS_STORAGE_ITEM_OTHER_USERS},
+ {"storageSizeComputing", IDS_SETTINGS_STORAGE_SIZE_CALCULATING},
+ {"storageSizeUnknown", IDS_SETTINGS_STORAGE_SIZE_UNKNOWN},
+ {"storageSpaceLowMessageTitle",
+ IDS_SETTINGS_STORAGE_SPACE_LOW_MESSAGE_TITLE},
+ {"storageSpaceLowMessageLine1",
+ IDS_SETTINGS_STORAGE_SPACE_LOW_MESSAGE_LINE_1},
+ {"storageSpaceLowMessageLine2",
+ IDS_SETTINGS_STORAGE_SPACE_LOW_MESSAGE_LINE_2},
+ {"storageSpaceCriticallyLowMessageTitle",
+ IDS_SETTINGS_STORAGE_SPACE_CRITICALLY_LOW_MESSAGE_TITLE},
+ {"storageSpaceCriticallyLowMessageLine1",
+ IDS_SETTINGS_STORAGE_SPACE_CRITICALLY_LOW_MESSAGE_LINE_1},
+ {"storageSpaceCriticallyLowMessageLine2",
+ IDS_SETTINGS_STORAGE_SPACE_CRITICALLY_LOW_MESSAGE_LINE_2},
+ {"storageExternal", IDS_SETTINGS_STORAGE_EXTERNAL},
+ {"storageExternalStorageEmptyListHeader",
+ IDS_SETTINGS_STORAGE_EXTERNAL_STORAGE_EMPTY_LIST_HEADER},
+ {"storageExternalStorageListHeader",
+ IDS_SETTINGS_STORAGE_EXTERNAL_STORAGE_LIST_HEADER},
+ {"storageManageDownloadedContentRowTitle",
+ IDS_SETTINGS_STORAGE_MANAGE_DOWNLOADED_CONTENT_ROW_TITLE},
+ {"storageOverviewAriaLabel", IDS_SETTINGS_STORAGE_OVERVIEW_ARIA_LABEL},
+ };
+ AddLocalizedStringsBulk(html_source, kStorageStrings);
+
+ html_source->AddBoolean("androidEnabled", is_external_storage_page_available);
+
+ html_source->AddString(
+ "storageAndroidAppsExternalDrivesNote",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_STORAGE_ANDROID_APPS_ACCESS_EXTERNAL_DRIVES_NOTE,
+ base::ASCIIToUTF16(chrome::kArcExternalStorageLearnMoreURL)));
+}
+
+void AddDeviceDlcSubpageStrings(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kDlcSubpageStrings[] = {
+ {"dlcSubpageTitle", IDS_SETTINGS_DLC_SUBPAGE_TITLE},
+ {"dlcSubpageDescription", IDS_SETTINGS_DLC_SUBPAGE_DESCRIPTION},
+ {"removeDlc", IDS_SETTINGS_DLC_REMOVE},
+ };
+ AddLocalizedStringsBulk(html_source, kDlcSubpageStrings);
+
+ html_source->AddBoolean("allowDlcSubpage", features::ShouldShowDlcSettings());
+}
+
+void AddDevicePowerStrings(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kPowerStrings[] = {
+ {"powerTitle", IDS_SETTINGS_POWER_TITLE},
+ {"powerSourceLabel", IDS_SETTINGS_POWER_SOURCE_LABEL},
+ {"powerSourceBattery", IDS_SETTINGS_POWER_SOURCE_BATTERY},
+ {"powerSourceAcAdapter", IDS_SETTINGS_POWER_SOURCE_AC_ADAPTER},
+ {"powerSourceLowPowerCharger",
+ IDS_SETTINGS_POWER_SOURCE_LOW_POWER_CHARGER},
+ {"calculatingPower", IDS_SETTINGS_POWER_SOURCE_CALCULATING},
+ {"powerIdleLabel", IDS_SETTINGS_POWER_IDLE_LABEL},
+ {"powerIdleWhileChargingLabel",
+ IDS_SETTINGS_POWER_IDLE_WHILE_CHARGING_LABEL},
+ {"powerIdleWhileChargingAriaLabel",
+ IDS_SETTINGS_POWER_IDLE_WHILE_CHARGING_ARIA_LABEL},
+ {"powerIdleWhileOnBatteryLabel",
+ IDS_SETTINGS_POWER_IDLE_WHILE_ON_BATTERY_LABEL},
+ {"powerIdleWhileOnBatteryAriaLabel",
+ IDS_SETTINGS_POWER_IDLE_WHILE_ON_BATTERY_ARIA_LABEL},
+ {"powerIdleDisplayOffSleep", IDS_SETTINGS_POWER_IDLE_DISPLAY_OFF_SLEEP},
+ {"powerIdleDisplayOff", IDS_SETTINGS_POWER_IDLE_DISPLAY_OFF},
+ {"powerIdleDisplayOn", IDS_SETTINGS_POWER_IDLE_DISPLAY_ON},
+ {"powerIdleOther", IDS_SETTINGS_POWER_IDLE_OTHER},
+ {"powerLidSleepLabel", IDS_SETTINGS_POWER_LID_CLOSED_SLEEP_LABEL},
+ {"powerLidSignOutLabel", IDS_SETTINGS_POWER_LID_CLOSED_SIGN_OUT_LABEL},
+ {"powerLidShutDownLabel", IDS_SETTINGS_POWER_LID_CLOSED_SHUT_DOWN_LABEL},
+ };
+ AddLocalizedStringsBulk(html_source, kPowerStrings);
+}
+
+} // namespace
+
+DeviceSection::DeviceSection(Profile* profile,
+ SearchTagRegistry* search_tag_registry,
+ PrefService* pref_service)
+ : OsSettingsSection(profile, search_tag_registry),
+ pref_service_(pref_service) {
+ registry()->AddSearchTags(GetDeviceSearchConcepts());
+
+ if (features::ShouldShowExternalStorageSettings(profile))
+ registry()->AddSearchTags(GetExternalStorageSearchConcepts());
+
+ PowerManagerClient* power_manager_client = PowerManagerClient::Get();
+ if (power_manager_client) {
+ power_manager_client->AddObserver(this);
+
+ const base::Optional<power_manager::PowerSupplyProperties>& last_status =
+ power_manager_client->GetLastStatus();
+ if (last_status)
+ PowerChanged(*last_status);
+
+ // Determine whether to show laptop lid power settings.
+ power_manager_client->GetSwitchStates(base::BindOnce(
+ &DeviceSection::OnGotSwitchStates, weak_ptr_factory_.GetWeakPtr()));
+ }
+
+ // Keyboard/mouse search tags are added/removed dynamically.
+ pointer_device_observer_.Init();
+ pointer_device_observer_.AddObserver(this);
+ pointer_device_observer_.CheckDevices();
+
+ // Stylus search tags are added/removed dynamically.
+ ui::DeviceDataManager::GetInstance()->AddObserver(this);
+ UpdateStylusSearchTags();
+
+ // Display search tags are added/removed dynamically.
+ ash::BindCrosDisplayConfigController(
+ cros_display_config_.BindNewPipeAndPassReceiver());
+ mojo::PendingAssociatedRemote<ash::mojom::CrosDisplayConfigObserver> observer;
+ cros_display_config_observer_receiver_.Bind(
+ observer.InitWithNewEndpointAndPassReceiver());
+ cros_display_config_->AddObserver(std::move(observer));
+ OnDisplayConfigChanged();
+
+ // Night Light settings are added/removed dynamically.
+ ash::NightLightController* night_light_controller =
+ ash::NightLightController::GetInstance();
+ if (night_light_controller) {
+ ash::NightLightController::GetInstance()->AddObserver(this);
+ OnNightLightEnabledChanged(
+ ash::NightLightController::GetInstance()->GetEnabled());
+ }
+}
+
+DeviceSection::~DeviceSection() {
+ pointer_device_observer_.RemoveObserver(this);
+ ui::DeviceDataManager::GetInstance()->RemoveObserver(this);
+
+ PowerManagerClient* power_manager_client = PowerManagerClient::Get();
+ if (power_manager_client)
+ power_manager_client->RemoveObserver(this);
+
+ ash::NightLightController* night_light_controller =
+ ash::NightLightController::GetInstance();
+ if (night_light_controller)
+ night_light_controller->RemoveObserver(this);
+}
+
+void DeviceSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kDeviceStrings[] = {
+ {"devicePageTitle", IDS_SETTINGS_DEVICE_TITLE},
+ {"scrollLabel", IDS_SETTINGS_SCROLL_LABEL},
+ {"touchPadScrollLabel", IDS_OS_SETTINGS_TOUCHPAD_REVERSE_SCROLL_LABEL},
+ };
+ AddLocalizedStringsBulk(html_source, kDeviceStrings);
+
+ html_source->AddBoolean("isDemoSession",
+ chromeos::DemoSession::IsDeviceInDemoMode());
+
+ AddDevicePointersStrings(html_source);
+ AddDeviceKeyboardStrings(html_source);
+ AddDeviceStylusStrings(html_source);
+ AddDeviceDisplayStrings(html_source);
+ AddDeviceStorageStrings(
+ html_source, features::ShouldShowExternalStorageSettings(profile()));
+ AddDevicePowerStrings(html_source);
+ AddDeviceDlcSubpageStrings(html_source);
+}
+
+void DeviceSection::AddHandlers(content::WebUI* web_ui) {
+ if (ash::features::IsDisplayIdentificationEnabled()) {
+ web_ui->AddMessageHandler(
+ std::make_unique<chromeos::settings::DisplayHandler>());
+ }
+
+ if (features::ShouldShowDlcSettings()) {
+ web_ui->AddMessageHandler(
+ std::make_unique<chromeos::settings::DlcHandler>());
+ }
+
+ web_ui->AddMessageHandler(
+ std::make_unique<chromeos::settings::KeyboardHandler>());
+ web_ui->AddMessageHandler(
+ std::make_unique<chromeos::settings::PointerHandler>());
+ web_ui->AddMessageHandler(
+ std::make_unique<chromeos::settings::PowerHandler>(pref_service_));
+ web_ui->AddMessageHandler(
+ std::make_unique<chromeos::settings::StylusHandler>());
+}
+
+void DeviceSection::TouchpadExists(bool exists) {
+ if (exists)
+ registry()->AddSearchTags(GetTouchpadSearchConcepts());
+ else
+ registry()->RemoveSearchTags(GetTouchpadSearchConcepts());
+}
+
+void DeviceSection::MouseExists(bool exists) {
+ if (exists)
+ registry()->AddSearchTags(GetMouseSearchConcepts());
+ else
+ registry()->RemoveSearchTags(GetMouseSearchConcepts());
+}
+
+void DeviceSection::OnDeviceListsComplete() {
+ UpdateStylusSearchTags();
+}
+
+void DeviceSection::OnNightLightEnabledChanged(bool enabled) {
+ OnDisplayConfigChanged();
+}
+
+void DeviceSection::OnDisplayConfigChanged() {
+ cros_display_config_->GetDisplayUnitInfoList(
+ /*single_unified=*/true,
+ base::BindOnce(&DeviceSection::OnGetDisplayUnitInfoList,
+ base::Unretained(this)));
+}
+
+void DeviceSection::PowerChanged(
+ const power_manager::PowerSupplyProperties& properties) {
+ if (properties.battery_state() !=
+ power_manager::PowerSupplyProperties_BatteryState_NOT_PRESENT) {
+ registry()->AddSearchTags(GetPowerWithBatterySearchConcepts());
+ }
+}
+
+void DeviceSection::OnGetDisplayUnitInfoList(
+ std::vector<ash::mojom::DisplayUnitInfoPtr> display_unit_info_list) {
+ cros_display_config_->GetDisplayLayoutInfo(base::BindOnce(
+ &DeviceSection::OnGetDisplayLayoutInfo, base::Unretained(this),
+ std::move(display_unit_info_list)));
+}
+
+void DeviceSection::OnGetDisplayLayoutInfo(
+ std::vector<ash::mojom::DisplayUnitInfoPtr> display_unit_info_list,
+ ash::mojom::DisplayLayoutInfoPtr display_layout_info) {
+ bool has_multiple_displays = display_unit_info_list.size() > 1u;
+
+ // Mirroring mode is active if there's at least one display and if there's a
+ // mirror source ID.
+ bool is_mirrored = !display_unit_info_list.empty() &&
+ display_layout_info->mirror_source_id.has_value();
+
+ bool has_internal_display = false;
+ bool has_external_display = false;
+ bool unified_desktop_mode = false;
+ for (const auto& display_unit_info : display_unit_info_list) {
+ has_internal_display |= display_unit_info->is_internal;
+ has_external_display |= !display_unit_info->is_internal;
+
+ unified_desktop_mode |= display_unit_info->is_primary &&
+ display_layout_info->layout_mode ==
+ ash::mojom::DisplayLayoutMode::kUnified;
+ }
+
+ // Arrangement UI.
+ if (has_multiple_displays || is_mirrored)
+ registry()->AddSearchTags(GetDisplayArrangementSearchConcepts());
+ else
+ registry()->RemoveSearchTags(GetDisplayArrangementSearchConcepts());
+
+ // Mirror toggle.
+ if (is_mirrored || (!unified_desktop_mode && has_multiple_displays))
+ registry()->AddSearchTags(GetDisplayMirrorSearchConcepts());
+ else
+ registry()->RemoveSearchTags(GetDisplayMirrorSearchConcepts());
+
+ // Unified Desktop toggle.
+ if (unified_desktop_mode ||
+ (IsUnifiedDesktopAvailable() && has_multiple_displays && !is_mirrored)) {
+ registry()->AddSearchTags(GetDisplayUnifiedDesktopSearchConcepts());
+ } else {
+ registry()->RemoveSearchTags(GetDisplayUnifiedDesktopSearchConcepts());
+ }
+
+ // Multiple displays UI.
+ if (has_multiple_displays)
+ registry()->AddSearchTags(GetDisplayMultipleSearchConcepts());
+ else
+ registry()->RemoveSearchTags(GetDisplayMultipleSearchConcepts());
+
+ // External display settings.
+ if (has_external_display)
+ registry()->AddSearchTags(GetDisplayExternalSearchConcepts());
+ else
+ registry()->RemoveSearchTags(GetDisplayExternalSearchConcepts());
+
+ // Refresh Rate dropdown.
+ if (has_external_display && IsListAllDisplayModesEnabled())
+ registry()->AddSearchTags(GetDisplayExternalWithRefreshSearchConcepts());
+ else
+ registry()->RemoveSearchTags(GetDisplayExternalWithRefreshSearchConcepts());
+
+ // Orientation settings.
+ if (!unified_desktop_mode)
+ registry()->AddSearchTags(GetDisplayOrientationSearchConcepts());
+ else
+ registry()->RemoveSearchTags(GetDisplayOrientationSearchConcepts());
+
+ // Ambient color settings.
+ if (DoesDeviceSupportAmbientColor() && has_internal_display)
+ registry()->AddSearchTags(GetDisplayAmbientSearchConcepts());
+ else
+ registry()->RemoveSearchTags(GetDisplayAmbientSearchConcepts());
+
+ // Touch calibration settings.
+ if (IsTouchCalibrationAvailable())
+ registry()->AddSearchTags(GetDisplayTouchCalibrationSearchConcepts());
+ else
+ registry()->RemoveSearchTags(GetDisplayTouchCalibrationSearchConcepts());
+
+ // Night Light on settings.
+ if (ash::NightLightController::GetInstance()->GetEnabled())
+ registry()->AddSearchTags(GetDisplayNightLightOnSearchConcepts());
+ else
+ registry()->RemoveSearchTags(GetDisplayNightLightOnSearchConcepts());
+}
+
+void DeviceSection::OnGotSwitchStates(
+ base::Optional<PowerManagerClient::SwitchStates> result) {
+ if (result && result->lid_state != PowerManagerClient::LidState::NOT_PRESENT)
+ registry()->AddSearchTags(GetPowerWithLaptopLidSearchConcepts());
+}
+
+void DeviceSection::UpdateStylusSearchTags() {
+ // If not yet complete, wait for OnDeviceListsComplete() callback.
+ if (!ui::DeviceDataManager::GetInstance()->AreDeviceListsComplete())
+ return;
+
+ // TODO(https://crbug.com/1071905): Only show stylus settings if a stylus has
+ // been set up. HasStylusInput() will return true for any stylus-compatible
+ // device, even if it doesn't have a stylus.
+ if (ash::stylus_utils::HasStylusInput())
+ registry()->AddSearchTags(GetStylusSearchConcepts());
+ else
+ registry()->RemoveSearchTags(GetStylusSearchConcepts());
+}
+
+void DeviceSection::AddDevicePointersStrings(
+ content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kPointersStrings[] = {
+ {"mouseTitle", IDS_SETTINGS_MOUSE_TITLE},
+ {"touchpadTitle", IDS_SETTINGS_TOUCHPAD_TITLE},
+ {"mouseAndTouchpadTitle", IDS_SETTINGS_MOUSE_AND_TOUCHPAD_TITLE},
+ {"touchpadTapToClickEnabledLabel",
+ IDS_SETTINGS_TOUCHPAD_TAP_TO_CLICK_ENABLED_LABEL},
+ {"touchpadSpeed", IDS_SETTINGS_TOUCHPAD_SPEED_LABEL},
+ {"pointerSlow", IDS_SETTINGS_POINTER_SPEED_SLOW_LABEL},
+ {"pointerFast", IDS_SETTINGS_POINTER_SPEED_FAST_LABEL},
+ {"mouseScrollSpeed", IDS_SETTINGS_MOUSE_SCROLL_SPEED_LABEL},
+ {"mouseSpeed", IDS_SETTINGS_MOUSE_SPEED_LABEL},
+ {"mouseSwapButtons", IDS_SETTINGS_MOUSE_SWAP_BUTTONS_LABEL},
+ {"mouseReverseScroll", IDS_SETTINGS_MOUSE_REVERSE_SCROLL_LABEL},
+ {"mouseAccelerationLabel", IDS_SETTINGS_MOUSE_ACCELERATION_LABEL},
+ {"mouseScrollAccelerationLabel",
+ IDS_SETTINGS_MOUSE_SCROLL_ACCELERATION_LABEL},
+ {"touchpadAccelerationLabel", IDS_SETTINGS_TOUCHPAD_ACCELERATION_LABEL},
+ {"touchpadScrollAccelerationLabel",
+ IDS_SETTINGS_TOUCHPAD_SCROLL_ACCELERATION_LABEL},
+ {"touchpadScrollSpeed", IDS_SETTINGS_TOUCHPAD_SCROLL_SPEED_LABEL},
+ };
+ AddLocalizedStringsBulk(html_source, kPointersStrings);
+
+ html_source->AddString("naturalScrollLearnMoreLink",
+ GetHelpUrlWithBoard(chrome::kNaturalScrollHelpURL));
+
+ html_source->AddBoolean(
+ "allowDisableMouseAcceleration",
+ base::FeatureList::IsEnabled(::features::kAllowDisableMouseAcceleration));
+ html_source->AddBoolean(
+ "allowScrollSettings",
+ base::FeatureList::IsEnabled(::chromeos::features::kAllowScrollSettings));
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/device_section.h b/chromium/chrome/browser/ui/webui/settings/chromeos/device_section.h
new file mode 100644
index 00000000000..255f63a4963
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/device_section.h
@@ -0,0 +1,90 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_DEVICE_SECTION_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_DEVICE_SECTION_H_
+
+#include <vector>
+
+#include "ash/public/cpp/night_light_controller.h"
+#include "ash/public/mojom/cros_display_config.mojom.h"
+#include "base/memory/weak_ptr.h"
+#include "base/optional.h"
+#include "chrome/browser/chromeos/system/pointer_device_observer.h"
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h"
+#include "chromeos/dbus/power/power_manager_client.h"
+#include "mojo/public/cpp/bindings/associated_receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "ui/events/devices/input_device_event_observer.h"
+
+class PrefService;
+
+namespace content {
+class WebUIDataSource;
+} // namespace content
+
+namespace chromeos {
+namespace settings {
+
+class SearchTagRegistry;
+
+// Provides UI strings and search tags for Device settings.
+class DeviceSection : public OsSettingsSection,
+ public system::PointerDeviceObserver::Observer,
+ public ui::InputDeviceEventObserver,
+ public ash::NightLightController::Observer,
+ public ash::mojom::CrosDisplayConfigObserver,
+ public PowerManagerClient::Observer {
+ public:
+ DeviceSection(Profile* profile,
+ SearchTagRegistry* search_tag_registry,
+ PrefService* pref_service);
+ ~DeviceSection() override;
+
+ private:
+ // OsSettingsSection:
+ void AddLoadTimeData(content::WebUIDataSource* html_source) override;
+ void AddHandlers(content::WebUI* web_ui) override;
+
+ // system::PointerDeviceObserver::Observer:
+ void TouchpadExists(bool exists) override;
+ void MouseExists(bool exists) override;
+
+ // ui::InputDeviceObserver:
+ void OnDeviceListsComplete() override;
+
+ // ash::NightLightController::Observer:
+ void OnNightLightEnabledChanged(bool enabled) override;
+
+ // ash::mojom::CrosDisplayConfigObserver
+ void OnDisplayConfigChanged() override;
+
+ // PowerManagerClient::Observer:
+ void PowerChanged(const power_manager::PowerSupplyProperties& proto) override;
+
+ void OnGotSwitchStates(
+ base::Optional<PowerManagerClient::SwitchStates> result);
+
+ void UpdateStylusSearchTags();
+
+ void OnGetDisplayUnitInfoList(
+ std::vector<ash::mojom::DisplayUnitInfoPtr> display_unit_info_list);
+ void OnGetDisplayLayoutInfo(
+ std::vector<ash::mojom::DisplayUnitInfoPtr> display_unit_info_list,
+ ash::mojom::DisplayLayoutInfoPtr display_layout_info);
+
+ void AddDevicePointersStrings(content::WebUIDataSource* html_source);
+
+ PrefService* pref_service_;
+ system::PointerDeviceObserver pointer_device_observer_;
+ mojo::Remote<ash::mojom::CrosDisplayConfigController> cros_display_config_;
+ mojo::AssociatedReceiver<ash::mojom::CrosDisplayConfigObserver>
+ cros_display_config_observer_receiver_{this};
+ base::WeakPtrFactory<DeviceSection> weak_ptr_factory_{this};
+};
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_DEVICE_SECTION_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.cc
index 128d85cb80b..584226636b8 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.cc
@@ -13,6 +13,7 @@
#include "chrome/browser/chromeos/arc/arc_util.h"
#include "chrome/browser/chromeos/file_manager/path_util.h"
#include "chrome/browser/platform_util.h"
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.h"
#include "chrome/grit/generated_resources.h"
#include "chromeos/disks/disk.h"
#include "components/arc/arc_features.h"
@@ -66,10 +67,10 @@ StorageHandler::StorageHandler(Profile* profile,
source_name_(html_source->GetSource()),
arc_observer_(this),
special_volume_path_pattern_("[a-z]+://.*") {
- html_source->AddBoolean(
- kAndroidEnabled,
- base::FeatureList::IsEnabled(arc::kUsbStorageUIFeature) &&
- arc::IsArcPlayStoreEnabledForProfile(profile));
+ // TODO(khorimoto): Set kAndroidEnabled within DeviceSection, and
+ // updates this value accordingly (see OnArcPlayStoreEnabledChanged()).
+ html_source->AddBoolean(kAndroidEnabled,
+ features::ShouldShowExternalStorageSettings(profile));
}
StorageHandler::~StorageHandler() {
@@ -217,7 +218,9 @@ void StorageHandler::UpdateExternalStorages() {
void StorageHandler::OnArcPlayStoreEnabledChanged(bool enabled) {
auto update = std::make_unique<base::DictionaryValue>();
- update->SetKey(kAndroidEnabled, base::Value(enabled));
+ update->SetKey(
+ kAndroidEnabled,
+ base::Value(features::ShouldShowExternalStorageSettings(profile_)));
content::WebUIDataSource::Update(profile_, source_name_, std::move(update));
}
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/files_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/files_section.cc
new file mode 100644
index 00000000000..3b1788101b1
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/files_section.cc
@@ -0,0 +1,106 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/files_section.h"
+
+#include "base/no_destructor.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/browser/ui/webui/chromeos/smb_shares/smb_handler.h"
+#include "chrome/browser/ui/webui/chromeos/smb_shares/smb_shares_localized_strings_provider.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/grit/generated_resources.h"
+#include "components/user_manager/user.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/webui/web_ui_util.h"
+
+namespace chromeos {
+namespace settings {
+namespace {
+
+const std::vector<SearchConcept>& GetFilesSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_FILES,
+ mojom::kFilesSectionPath,
+ mojom::SearchResultIcon::kFolder,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSection,
+ {.section = mojom::Section::kFiles}},
+ {IDS_OS_SETTINGS_TAG_FILES_DISCONNECT_GOOGLE_DRIVE,
+ mojom::kFilesSectionPath,
+ mojom::SearchResultIcon::kDrive,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kGoogleDriveConnection}},
+ {IDS_OS_SETTINGS_TAG_FILES_NETWORK_FILE_SHARES,
+ mojom::kNetworkFileSharesSubpagePath,
+ mojom::SearchResultIcon::kFolder,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kNetworkFileShares},
+ {IDS_OS_SETTINGS_TAG_FILES_NETWORK_FILE_SHARES_ALT1,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+} // namespace
+
+FilesSection::FilesSection(Profile* profile,
+ SearchTagRegistry* search_tag_registry)
+ : OsSettingsSection(profile, search_tag_registry) {
+ registry()->AddSearchTags(GetFilesSearchConcepts());
+}
+
+FilesSection::~FilesSection() = default;
+
+void FilesSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"disconnectGoogleDriveAccount", IDS_SETTINGS_DISCONNECT_GOOGLE_DRIVE},
+ {"filesPageTitle", IDS_OS_SETTINGS_FILES},
+ {"smbSharesTitle", IDS_SETTINGS_DOWNLOADS_SMB_SHARES},
+ {"smbSharesLearnMoreLabel",
+ IDS_SETTINGS_DOWNLOADS_SMB_SHARES_LEARN_MORE_LABEL},
+ {"addSmbShare", IDS_SETTINGS_DOWNLOADS_SMB_SHARES_ADD_SHARE},
+ {"smbShareAddedSuccessfulMessage",
+ IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_SUCCESS_MESSAGE},
+ {"smbShareAddedErrorMessage",
+ IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_ERROR_MESSAGE},
+ {"smbShareAddedAuthFailedMessage",
+ IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_AUTH_FAILED_MESSAGE},
+ {"smbShareAddedNotFoundMessage",
+ IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_NOT_FOUND_MESSAGE},
+ {"smbShareAddedUnsupportedDeviceMessage",
+ IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_UNSUPPORTED_DEVICE_MESSAGE},
+ {"smbShareAddedMountExistsMessage",
+ IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_MOUNT_EXISTS_MESSAGE},
+ {"smbShareAddedTooManyMountsMessage",
+ IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_TOO_MANY_MOUNTS_MESSAGE},
+ {"smbShareAddedInvalidURLMessage",
+ IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_MOUNT_INVALID_URL_MESSAGE},
+ {"smbShareAddedInvalidSSOURLMessage",
+ IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_MOUNT_INVALID_SSO_URL_MESSAGE},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ chromeos::smb_dialog::AddLocalizedStrings(html_source);
+
+ html_source->AddString("smbSharesLearnMoreURL",
+ GetHelpUrlWithBoard(chrome::kSmbSharesLearnMoreURL));
+
+ const user_manager::User* user =
+ chromeos::ProfileHelper::Get()->GetUserByProfile(profile());
+ html_source->AddBoolean("isActiveDirectoryUser",
+ user && user->IsActiveDirectoryUser());
+}
+
+void FilesSection::AddHandlers(content::WebUI* web_ui) {
+ web_ui->AddMessageHandler(std::make_unique<chromeos::smb_dialog::SmbHandler>(
+ profile(), base::DoNothing()));
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/files_section.h b/chromium/chrome/browser/ui/webui/settings/chromeos/files_section.h
new file mode 100644
index 00000000000..635bcb9abc0
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/files_section.h
@@ -0,0 +1,34 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_FILES_SECTION_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_FILES_SECTION_H_
+
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h"
+
+namespace content {
+class WebUIDataSource;
+} // namespace content
+
+namespace chromeos {
+namespace settings {
+
+class SearchTagRegistry;
+
+// Provides UI strings and search tags for Files settings.
+class FilesSection : public OsSettingsSection {
+ public:
+ FilesSection(Profile* profile, SearchTagRegistry* search_tag_registry);
+ ~FilesSection() override;
+
+ private:
+ // OsSettingsSection:
+ void AddLoadTimeData(content::WebUIDataSource* html_source) override;
+ void AddHandlers(content::WebUI* web_ui) override;
+};
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_FILES_SECTION_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.cc
index 0a90a0e3039..7a93a5a8268 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.cc
@@ -182,8 +182,8 @@ void FingerprintHandler::HandleGetFingerprintsList(
AllowJavascript();
fp_service_->GetRecordsForUser(
- user_id_, base::Bind(&FingerprintHandler::OnGetFingerprintsList,
- weak_ptr_factory_.GetWeakPtr(), callback_id));
+ user_id_, base::BindOnce(&FingerprintHandler::OnGetFingerprintsList,
+ weak_ptr_factory_.GetWeakPtr(), callback_id));
}
void FingerprintHandler::OnGetFingerprintsList(
@@ -249,8 +249,8 @@ void FingerprintHandler::HandleCancelCurrentEnroll(
const base::ListValue* args) {
AllowJavascript();
fp_service_->CancelCurrentEnrollSession(
- base::Bind(&FingerprintHandler::OnCancelCurrentEnrollSession,
- weak_ptr_factory_.GetWeakPtr()));
+ base::BindOnce(&FingerprintHandler::OnCancelCurrentEnrollSession,
+ weak_ptr_factory_.GetWeakPtr()));
}
void FingerprintHandler::OnCancelCurrentEnrollSession(bool success) {
@@ -269,8 +269,8 @@ void FingerprintHandler::HandleGetEnrollmentLabel(const base::ListValue* args) {
AllowJavascript();
fp_service_->RequestRecordLabel(
fingerprints_paths_[index],
- base::Bind(&FingerprintHandler::OnRequestRecordLabel,
- weak_ptr_factory_.GetWeakPtr(), callback_id));
+ base::BindOnce(&FingerprintHandler::OnRequestRecordLabel,
+ weak_ptr_factory_.GetWeakPtr(), callback_id));
}
void FingerprintHandler::OnRequestRecordLabel(const std::string& callback_id,
@@ -289,8 +289,8 @@ void FingerprintHandler::HandleRemoveEnrollment(const base::ListValue* args) {
AllowJavascript();
fp_service_->RemoveRecord(
fingerprints_paths_[index],
- base::Bind(&FingerprintHandler::OnRemoveRecord,
- weak_ptr_factory_.GetWeakPtr(), callback_id));
+ base::BindOnce(&FingerprintHandler::OnRemoveRecord,
+ weak_ptr_factory_.GetWeakPtr(), callback_id));
}
void FingerprintHandler::OnRemoveRecord(const std::string& callback_id,
@@ -314,8 +314,8 @@ void FingerprintHandler::HandleChangeEnrollmentLabel(
AllowJavascript();
fp_service_->SetRecordLabel(
new_label, fingerprints_paths_[index],
- base::Bind(&FingerprintHandler::OnSetRecordLabel,
- weak_ptr_factory_.GetWeakPtr(), callback_id));
+ base::BindOnce(&FingerprintHandler::OnSetRecordLabel,
+ weak_ptr_factory_.GetWeakPtr(), callback_id));
}
void FingerprintHandler::OnSetRecordLabel(const std::string& callback_id,
@@ -335,8 +335,8 @@ void FingerprintHandler::HandleEndCurrentAuthentication(
const base::ListValue* args) {
AllowJavascript();
fp_service_->EndCurrentAuthSession(
- base::Bind(&FingerprintHandler::OnEndCurrentAuthSession,
- weak_ptr_factory_.GetWeakPtr()));
+ base::BindOnce(&FingerprintHandler::OnEndCurrentAuthSession,
+ weak_ptr_factory_.GetWeakPtr()));
}
void FingerprintHandler::OnEndCurrentAuthSession(bool success) {
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.cc
index 1fd74c8d6bc..9ef5ec87581 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.cc
@@ -11,11 +11,10 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/values.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/ash/assistant/assistant_service_connection.h"
#include "chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.h"
#include "chromeos/audio/cras_audio_handler.h"
#include "chromeos/constants/chromeos_features.h"
+#include "chromeos/services/assistant/public/cpp/assistant_service.h"
#include "components/arc/arc_prefs.h"
#include "components/arc/arc_service_manager.h"
#include "content/public/browser/browser_context.h"
@@ -24,8 +23,7 @@
namespace chromeos {
namespace settings {
-GoogleAssistantHandler::GoogleAssistantHandler(Profile* profile)
- : profile_(profile) {
+GoogleAssistantHandler::GoogleAssistantHandler() {
chromeos::CrasAudioHandler::Get()->AddAudioObserver(this);
}
@@ -89,10 +87,8 @@ void GoogleAssistantHandler::HandleRetrainVoiceModel(
void GoogleAssistantHandler::HandleSyncVoiceModelStatus(
const base::ListValue* args) {
CHECK_EQ(0U, args->GetSize());
- if (!settings_manager_.is_bound())
- BindAssistantSettingsManager();
- settings_manager_->SyncSpeakerIdEnrollmentStatus();
+ assistant::AssistantSettings::Get()->SyncSpeakerIdEnrollmentStatus();
}
void GoogleAssistantHandler::HandleInitialized(const base::ListValue* args) {
@@ -100,14 +96,5 @@ void GoogleAssistantHandler::HandleInitialized(const base::ListValue* args) {
AllowJavascript();
}
-void GoogleAssistantHandler::BindAssistantSettingsManager() {
- DCHECK(!settings_manager_.is_bound());
-
- // Set up settings mojom.
- AssistantServiceConnection::GetForProfile(profile_)
- ->service()
- ->BindSettingsManager(settings_manager_.BindNewPipeAndPassReceiver());
-}
-
} // namespace settings
} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.h
index 577296f12d0..5b96d4abf13 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.h
@@ -9,18 +9,15 @@
#include "base/optional.h"
#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
#include "chromeos/audio/cras_audio_handler.h"
-#include "chromeos/services/assistant/public/mojom/settings.mojom.h"
#include "mojo/public/cpp/bindings/remote.h"
-class Profile;
-
namespace chromeos {
namespace settings {
class GoogleAssistantHandler : public ::settings::SettingsPageUIHandler,
chromeos::CrasAudioHandler::AudioObserver {
public:
- explicit GoogleAssistantHandler(Profile* profile);
+ GoogleAssistantHandler();
~GoogleAssistantHandler() override;
void RegisterMessages() override;
@@ -40,13 +37,6 @@ class GoogleAssistantHandler : public ::settings::SettingsPageUIHandler,
// WebUI call to signal js side is ready.
void HandleInitialized(const base::ListValue* args);
- // Bind to assistant settings manager.
- void BindAssistantSettingsManager();
-
- Profile* const profile_;
-
- mojo::Remote<assistant::mojom::AssistantSettingsManager> settings_manager_;
-
bool pending_hotword_update_ = false;
base::WeakPtrFactory<GoogleAssistantHandler> weak_factory_{this};
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/internet_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/internet_section.cc
new file mode 100644
index 00000000000..c21b0002fb8
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/internet_section.cc
@@ -0,0 +1,678 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/internet_section.h"
+
+#include "ash/public/cpp/ash_features.h"
+#include "ash/public/cpp/network_config_service.h"
+#include "base/bind.h"
+#include "base/no_destructor.h"
+#include "chrome/browser/ui/webui/chromeos/network_element_localized_strings_provider.h"
+#include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h"
+#include "chrome/browser/ui/webui/settings/chromeos/internet_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/common/webui_url_constants.h"
+#include "chrome/grit/chromium_strings.h"
+#include "chrome/grit/generated_resources.h"
+#include "chromeos/strings/grit/chromeos_strings.h"
+#include "components/strings/grit/components_strings.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/webui/web_ui_util.h"
+
+namespace chromeos {
+namespace settings {
+namespace {
+
+const std::vector<SearchConcept>& GetNetworkSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_NETWORK_SETTINGS,
+ mojom::kNetworkSectionPath,
+ mojom::SearchResultIcon::kWifi,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSection,
+ {.section = mojom::Section::kNetwork},
+ {IDS_OS_SETTINGS_TAG_NETWORK_SETTINGS_ALT1, SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetEthernetConnectedSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_ETHERNET_CONFIGURE,
+ mojom::kEthernetDetailsSubpagePath,
+ mojom::SearchResultIcon::kEthernet,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kConfigureEthernet}},
+ {IDS_OS_SETTINGS_TAG_ETHERNET,
+ mojom::kEthernetDetailsSubpagePath,
+ mojom::SearchResultIcon::kEthernet,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kEthernetDetails}},
+ {IDS_OS_SETTINGS_TAG_CONFIGURE_IP_AUTOMATICALLY,
+ mojom::kEthernetDetailsSubpagePath,
+ mojom::SearchResultIcon::kEthernet,
+ mojom::SearchResultDefaultRank::kLow,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kEthernetAutoConfigureIp},
+ {IDS_OS_SETTINGS_TAG_CONFIGURE_IP_AUTOMATICALLY_ALT1,
+ IDS_OS_SETTINGS_TAG_CONFIGURE_IP_AUTOMATICALLY_ALT2,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_NAME_SERVERS,
+ mojom::kEthernetDetailsSubpagePath,
+ mojom::SearchResultIcon::kEthernet,
+ mojom::SearchResultDefaultRank::kLow,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kEthernetDns},
+ {IDS_OS_SETTINGS_TAG_NAME_SERVERS_ALT1,
+ IDS_OS_SETTINGS_TAG_NAME_SERVERS_ALT2, SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_PROXY,
+ mojom::kEthernetDetailsSubpagePath,
+ mojom::SearchResultIcon::kEthernet,
+ mojom::SearchResultDefaultRank::kLow,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kEthernetProxy},
+ {IDS_OS_SETTINGS_TAG_PROXY_ALT1, IDS_OS_SETTINGS_TAG_PROXY_ALT2,
+ IDS_OS_SETTINGS_TAG_PROXY_ALT3, IDS_OS_SETTINGS_TAG_PROXY_ALT4,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetWifiSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_WIFI,
+ mojom::kWifiNetworksSubpagePath,
+ mojom::SearchResultIcon::kWifi,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kWifiNetworks},
+ {IDS_OS_SETTINGS_TAG_WIFI_ALT1, IDS_OS_SETTINGS_TAG_WIFI_ALT2,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_KNOWN_NETWORKS,
+ mojom::kKnownNetworksSubpagePath,
+ mojom::SearchResultIcon::kWifi,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kKnownNetworks},
+ {IDS_OS_SETTINGS_TAG_KNOWN_NETWORKS_ALT1,
+ IDS_OS_SETTINGS_TAG_KNOWN_NETWORKS_ALT2, SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetWifiOnSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_WIFI_TURN_OFF,
+ mojom::kWifiNetworksSubpagePath,
+ mojom::SearchResultIcon::kWifi,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kWifiOnOff},
+ {IDS_OS_SETTINGS_TAG_WIFI_TURN_OFF_ALT1, SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetWifiOffSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_WIFI_TURN_ON,
+ mojom::kWifiNetworksSubpagePath,
+ mojom::SearchResultIcon::kWifi,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kWifiOnOff},
+ {IDS_OS_SETTINGS_TAG_WIFI_TURN_ON_ALT1, SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetWifiConnectedSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_DISCONNECT_WIFI,
+ mojom::kWifiDetailsSubpagePath,
+ mojom::SearchResultIcon::kWifi,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kDisconnectWifiNetwork}},
+ {IDS_OS_SETTINGS_TAG_PREFER_WIFI_NETWORK,
+ mojom::kWifiDetailsSubpagePath,
+ mojom::SearchResultIcon::kWifi,
+ mojom::SearchResultDefaultRank::kLow,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kPreferWifiNetwork},
+ {IDS_OS_SETTINGS_TAG_PREFER_WIFI_NETWORK_ALT1,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_WIFI_CONFIGURE,
+ mojom::kWifiDetailsSubpagePath,
+ mojom::SearchResultIcon::kWifi,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kConfigureWifi}},
+ {IDS_OS_SETTINGS_TAG_FORGET_WIFI,
+ mojom::kWifiDetailsSubpagePath,
+ mojom::SearchResultIcon::kWifi,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kForgetWifiNetwork}},
+ {IDS_OS_SETTINGS_TAG_CONFIGURE_IP_AUTOMATICALLY,
+ mojom::kWifiDetailsSubpagePath,
+ mojom::SearchResultIcon::kWifi,
+ mojom::SearchResultDefaultRank::kLow,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kWifiAutoConfigureIp},
+ {IDS_OS_SETTINGS_TAG_CONFIGURE_IP_AUTOMATICALLY_ALT1,
+ IDS_OS_SETTINGS_TAG_CONFIGURE_IP_AUTOMATICALLY_ALT2,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_NAME_SERVERS,
+ mojom::kWifiDetailsSubpagePath,
+ mojom::SearchResultIcon::kWifi,
+ mojom::SearchResultDefaultRank::kLow,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kWifiDns},
+ {IDS_OS_SETTINGS_TAG_NAME_SERVERS_ALT1,
+ IDS_OS_SETTINGS_TAG_NAME_SERVERS_ALT2, SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_PROXY,
+ mojom::kWifiDetailsSubpagePath,
+ mojom::SearchResultIcon::kWifi,
+ mojom::SearchResultDefaultRank::kLow,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kWifiProxy},
+ {IDS_OS_SETTINGS_TAG_PROXY_ALT1, IDS_OS_SETTINGS_TAG_PROXY_ALT2,
+ IDS_OS_SETTINGS_TAG_PROXY_ALT3, IDS_OS_SETTINGS_TAG_PROXY_ALT4,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_AUTO_CONNECT_NETWORK,
+ mojom::kWifiDetailsSubpagePath,
+ mojom::SearchResultIcon::kWifi,
+ mojom::SearchResultDefaultRank::kLow,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kWifiAutoConnectToNetwork},
+ {IDS_OS_SETTINGS_TAG_AUTO_CONNECT_NETWORK_ALT1,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetCellularSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_CELLULAR,
+ mojom::kCellularDetailsSubpagePath,
+ mojom::SearchResultIcon::kCellular,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kCellularDetails},
+ {IDS_OS_SETTINGS_TAG_CELLULAR_ALT1, IDS_OS_SETTINGS_TAG_CELLULAR_ALT2,
+ IDS_OS_SETTINGS_TAG_CELLULAR_ALT3, IDS_OS_SETTINGS_TAG_CELLULAR_ALT4,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetCellularOnSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_CELLULAR_SIM_LOCK,
+ mojom::kCellularDetailsSubpagePath,
+ mojom::SearchResultIcon::kCellular,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kCellularSimLock},
+ {IDS_OS_SETTINGS_TAG_CELLULAR_SIM_LOCK_ALT1, SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_CELLULAR_ROAMING,
+ mojom::kCellularDetailsSubpagePath,
+ mojom::SearchResultIcon::kCellular,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kCellularRoaming}},
+ {IDS_OS_SETTINGS_TAG_CELLULAR_TURN_OFF,
+ mojom::kNetworkSectionPath,
+ mojom::SearchResultIcon::kCellular,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kMobileOnOff},
+ {IDS_OS_SETTINGS_TAG_CELLULAR_TURN_OFF_ALT1, SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_CELLULAR_APN,
+ mojom::kCellularDetailsSubpagePath,
+ mojom::SearchResultIcon::kCellular,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kCellularApn}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetCellularOffSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_CELLULAR_TURN_ON,
+ mojom::kNetworkSectionPath,
+ mojom::SearchResultIcon::kCellular,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kMobileOnOff},
+ {IDS_OS_SETTINGS_TAG_CELLULAR_TURN_ON_ALT1, SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetCellularConnectedSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_CELLULAR_DISCONNECT,
+ mojom::kCellularDetailsSubpagePath,
+ mojom::SearchResultIcon::kCellular,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kDisconnectCellularNetwork}},
+ {IDS_OS_SETTINGS_TAG_CONFIGURE_IP_AUTOMATICALLY,
+ mojom::kCellularDetailsSubpagePath,
+ mojom::SearchResultIcon::kCellular,
+ mojom::SearchResultDefaultRank::kLow,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kCellularAutoConfigureIp},
+ {IDS_OS_SETTINGS_TAG_CONFIGURE_IP_AUTOMATICALLY_ALT1,
+ IDS_OS_SETTINGS_TAG_CONFIGURE_IP_AUTOMATICALLY_ALT2,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_NAME_SERVERS,
+ mojom::kCellularDetailsSubpagePath,
+ mojom::SearchResultIcon::kCellular,
+ mojom::SearchResultDefaultRank::kLow,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kCellularDns},
+ {IDS_OS_SETTINGS_TAG_NAME_SERVERS_ALT1,
+ IDS_OS_SETTINGS_TAG_NAME_SERVERS_ALT2, SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_PROXY,
+ mojom::kCellularDetailsSubpagePath,
+ mojom::SearchResultIcon::kCellular,
+ mojom::SearchResultDefaultRank::kLow,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kCellularProxy},
+ {IDS_OS_SETTINGS_TAG_PROXY_ALT1, IDS_OS_SETTINGS_TAG_PROXY_ALT2,
+ IDS_OS_SETTINGS_TAG_PROXY_ALT3, IDS_OS_SETTINGS_TAG_PROXY_ALT4,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_AUTO_CONNECT_NETWORK,
+ mojom::kCellularDetailsSubpagePath,
+ mojom::SearchResultIcon::kCellular,
+ mojom::SearchResultDefaultRank::kLow,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kCellularAutoConnectToNetwork},
+ {IDS_OS_SETTINGS_TAG_AUTO_CONNECT_NETWORK_ALT1,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetInstantTetheringSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_INSTANT_MOBILE_NETWORKS,
+ mojom::kMobileDataNetworksSubpagePath,
+ mojom::SearchResultIcon::kInstantTethering,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kMobileDataNetworks}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetInstantTetheringOnSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_INSTANT_TETHERING_TURN_OFF,
+ mojom::kMobileDataNetworksSubpagePath,
+ mojom::SearchResultIcon::kInstantTethering,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kInstantTetheringOnOff},
+ {IDS_OS_SETTINGS_TAG_INSTANT_TETHERING_TURN_OFF_ALT1,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetInstantTetheringOffSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_INSTANT_TETHERING_TURN_ON,
+ mojom::kMobileDataNetworksSubpagePath,
+ mojom::SearchResultIcon::kInstantTethering,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kInstantTetheringOnOff},
+ {IDS_OS_SETTINGS_TAG_INSTANT_TETHERING_TURN_ON_ALT1,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetInstantTetheringConnectedSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_INSTANT_TETHERING_DISCONNECT,
+ mojom::kTetherDetailsSubpagePath,
+ mojom::SearchResultIcon::kInstantTethering,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kDisconnectTetherNetwork}},
+ {IDS_OS_SETTINGS_TAG_INSTANT_TETHERING,
+ mojom::kTetherDetailsSubpagePath,
+ mojom::SearchResultIcon::kInstantTethering,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kTetherDetails}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetVpnConnectedSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_VPN,
+ mojom::kVpnDetailsSubpagePath,
+ mojom::SearchResultIcon::kWifi,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kVpnDetails}},
+ });
+ return *tags;
+}
+
+bool IsConnected(network_config::mojom::ConnectionStateType connection_state) {
+ return connection_state ==
+ network_config::mojom::ConnectionStateType::kOnline ||
+ connection_state ==
+ network_config::mojom::ConnectionStateType::kConnected;
+}
+
+} // namespace
+
+InternetSection::InternetSection(Profile* profile,
+ SearchTagRegistry* search_tag_registry)
+ : OsSettingsSection(profile, search_tag_registry) {
+ // General network search tags are always added.
+ registry()->AddSearchTags(GetNetworkSearchConcepts());
+
+ // Receive updates when devices (e.g., Ethernet, Wi-Fi) go on/offline.
+ ash::GetNetworkConfigService(
+ cros_network_config_.BindNewPipeAndPassReceiver());
+ cros_network_config_->AddObserver(receiver_.BindNewPipeAndPassRemote());
+
+ // Fetch initial list of devices and active networks.
+ FetchDeviceList();
+ FetchActiveNetworks();
+}
+
+InternetSection::~InternetSection() = default;
+
+void InternetSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"internetAddConnection", IDS_SETTINGS_INTERNET_ADD_CONNECTION},
+ {"internetAddConnectionExpandA11yLabel",
+ IDS_SETTINGS_INTERNET_ADD_CONNECTION_EXPAND_ACCESSIBILITY_LABEL},
+ {"internetAddConnectionNotAllowed",
+ IDS_SETTINGS_INTERNET_ADD_CONNECTION_NOT_ALLOWED},
+ {"internetAddThirdPartyVPN", IDS_SETTINGS_INTERNET_ADD_THIRD_PARTY_VPN},
+ {"internetAddVPN", IDS_SETTINGS_INTERNET_ADD_VPN},
+ {"internetAddWiFi", IDS_SETTINGS_INTERNET_ADD_WIFI},
+ {"internetConfigName", IDS_SETTINGS_INTERNET_CONFIG_NAME},
+ {"internetDetailPageTitle", IDS_SETTINGS_INTERNET_DETAIL},
+ {"internetDeviceEnabling", IDS_SETTINGS_INTERNET_DEVICE_ENABLING},
+ {"internetDeviceInitializing", IDS_SETTINGS_INTERNET_DEVICE_INITIALIZING},
+ {"internetJoinType", IDS_SETTINGS_INTERNET_JOIN_TYPE},
+ {"internetKnownNetworksPageTitle", IDS_SETTINGS_INTERNET_KNOWN_NETWORKS},
+ {"internetMobileSearching", IDS_SETTINGS_INTERNET_MOBILE_SEARCH},
+ {"internetNoNetworks", IDS_SETTINGS_INTERNET_NO_NETWORKS},
+ {"internetPageTitle", IDS_SETTINGS_INTERNET},
+ {"internetSummaryButtonA11yLabel",
+ IDS_SETTINGS_INTERNET_SUMMARY_BUTTON_ACCESSIBILITY_LABEL},
+ {"internetToggleMobileA11yLabel",
+ IDS_SETTINGS_INTERNET_TOGGLE_MOBILE_ACCESSIBILITY_LABEL},
+ {"internetToggleTetherLabel", IDS_SETTINGS_INTERNET_TOGGLE_TETHER_LABEL},
+ {"internetToggleTetherSubtext",
+ IDS_SETTINGS_INTERNET_TOGGLE_TETHER_SUBTEXT},
+ {"internetToggleWiFiA11yLabel",
+ IDS_SETTINGS_INTERNET_TOGGLE_WIFI_ACCESSIBILITY_LABEL},
+ {"knownNetworksAll", IDS_SETTINGS_INTERNET_KNOWN_NETWORKS_ALL},
+ {"knownNetworksButton", IDS_SETTINGS_INTERNET_KNOWN_NETWORKS_BUTTON},
+ {"knownNetworksMessage", IDS_SETTINGS_INTERNET_KNOWN_NETWORKS_MESSAGE},
+ {"knownNetworksPreferred",
+ IDS_SETTINGS_INTERNET_KNOWN_NETWORKS_PREFFERED},
+ {"knownNetworksMenuAddPreferred",
+ IDS_SETTINGS_INTERNET_KNOWN_NETWORKS_MENU_ADD_PREFERRED},
+ {"knownNetworksMenuRemovePreferred",
+ IDS_SETTINGS_INTERNET_KNOWN_NETWORKS_MENU_REMOVE_PREFERRED},
+ {"knownNetworksMenuForget",
+ IDS_SETTINGS_INTERNET_KNOWN_NETWORKS_MENU_FORGET},
+ {"networkAllowDataRoaming",
+ IDS_SETTINGS_SETTINGS_NETWORK_ALLOW_DATA_ROAMING},
+ {"networkAllowDataRoamingEnabledHome",
+ IDS_SETTINGS_SETTINGS_NETWORK_ALLOW_DATA_ROAMING_ENABLED_HOME},
+ {"networkAllowDataRoamingEnabledRoaming",
+ IDS_SETTINGS_SETTINGS_NETWORK_ALLOW_DATA_ROAMING_ENABLED_ROAMING},
+ {"networkAllowDataRoamingDisabled",
+ IDS_SETTINGS_SETTINGS_NETWORK_ALLOW_DATA_ROAMING_DISABLED},
+ {"networkAlwaysOnVpn", IDS_SETTINGS_INTERNET_NETWORK_ALWAYS_ON_VPN},
+ {"networkAutoConnect", IDS_SETTINGS_INTERNET_NETWORK_AUTO_CONNECT},
+ {"networkAutoConnectCellular",
+ IDS_SETTINGS_INTERNET_NETWORK_AUTO_CONNECT_CELLULAR},
+ {"networkButtonActivate", IDS_SETTINGS_INTERNET_BUTTON_ACTIVATE},
+ {"networkButtonConfigure", IDS_SETTINGS_INTERNET_BUTTON_CONFIGURE},
+ {"networkButtonConnect", IDS_SETTINGS_INTERNET_BUTTON_CONNECT},
+ {"networkButtonDisconnect", IDS_SETTINGS_INTERNET_BUTTON_DISCONNECT},
+ {"networkButtonForget", IDS_SETTINGS_INTERNET_BUTTON_FORGET},
+ {"networkButtonViewAccount", IDS_SETTINGS_INTERNET_BUTTON_VIEW_ACCOUNT},
+ {"networkConnectNotAllowed", IDS_SETTINGS_INTERNET_CONNECT_NOT_ALLOWED},
+ {"networkIPAddress", IDS_SETTINGS_INTERNET_NETWORK_IP_ADDRESS},
+ {"networkIPConfigAuto", IDS_SETTINGS_INTERNET_NETWORK_IP_CONFIG_AUTO},
+ {"networkNameserversLearnMore", IDS_LEARN_MORE},
+ {"networkPrefer", IDS_SETTINGS_INTERNET_NETWORK_PREFER},
+ {"networkPrimaryUserControlled",
+ IDS_SETTINGS_INTERNET_NETWORK_PRIMARY_USER_CONTROLLED},
+ {"networkScanningLabel", IDS_NETWORK_SCANNING_MESSAGE},
+ {"networkSectionAdvanced",
+ IDS_SETTINGS_INTERNET_NETWORK_SECTION_ADVANCED},
+ {"networkSectionAdvancedA11yLabel",
+ IDS_SETTINGS_INTERNET_NETWORK_SECTION_ADVANCED_ACCESSIBILITY_LABEL},
+ {"networkSectionNetwork", IDS_SETTINGS_INTERNET_NETWORK_SECTION_NETWORK},
+ {"networkSectionNetworkExpandA11yLabel",
+ IDS_SETTINGS_INTERNET_NETWORK_SECTION_NETWORK_ACCESSIBILITY_LABEL},
+ {"networkSectionProxy", IDS_SETTINGS_INTERNET_NETWORK_SECTION_PROXY},
+ {"networkSectionProxyExpandA11yLabel",
+ IDS_SETTINGS_INTERNET_NETWORK_SECTION_PROXY_ACCESSIBILITY_LABEL},
+ {"networkShared", IDS_SETTINGS_INTERNET_NETWORK_SHARED},
+ {"networkVpnBuiltin", IDS_NETWORK_TYPE_VPN_BUILTIN},
+ {"networkOutOfRange", IDS_SETTINGS_INTERNET_WIFI_NETWORK_OUT_OF_RANGE},
+ {"cellularContactSpecificCarrier",
+ IDS_SETTINGS_INTERNET_CELLULAR_CONTACT_SPECIFIC_CARRIER},
+ {"cellularContactDefaultCarrier",
+ IDS_SETTINGS_INTERNET_CELLULAR_CONTACT_DEFAULT_CARRIER},
+ {"tetherPhoneOutOfRange",
+ IDS_SETTINGS_INTERNET_TETHER_PHONE_OUT_OF_RANGE},
+ {"gmscoreNotificationsTitle",
+ IDS_SETTINGS_INTERNET_GMSCORE_NOTIFICATIONS_TITLE},
+ {"gmscoreNotificationsOneDeviceSubtitle",
+ IDS_SETTINGS_INTERNET_GMSCORE_NOTIFICATIONS_ONE_DEVICE_SUBTITLE},
+ {"gmscoreNotificationsTwoDevicesSubtitle",
+ IDS_SETTINGS_INTERNET_GMSCORE_NOTIFICATIONS_TWO_DEVICES_SUBTITLE},
+ {"gmscoreNotificationsManyDevicesSubtitle",
+ IDS_SETTINGS_INTERNET_GMSCORE_NOTIFICATIONS_MANY_DEVICES_SUBTITLE},
+ {"gmscoreNotificationsFirstStep",
+ IDS_SETTINGS_INTERNET_GMSCORE_NOTIFICATIONS_FIRST_STEP},
+ {"gmscoreNotificationsSecondStep",
+ IDS_SETTINGS_INTERNET_GMSCORE_NOTIFICATIONS_SECOND_STEP},
+ {"gmscoreNotificationsThirdStep",
+ IDS_SETTINGS_INTERNET_GMSCORE_NOTIFICATIONS_THIRD_STEP},
+ {"gmscoreNotificationsFourthStep",
+ IDS_SETTINGS_INTERNET_GMSCORE_NOTIFICATIONS_FOURTH_STEP},
+ {"tetherConnectionDialogTitle",
+ IDS_SETTINGS_INTERNET_TETHER_CONNECTION_DIALOG_TITLE},
+ {"tetherConnectionAvailableDeviceTitle",
+ IDS_SETTINGS_INTERNET_TETHER_CONNECTION_AVAILABLE_DEVICE_TITLE},
+ {"tetherConnectionBatteryPercentage",
+ IDS_SETTINGS_INTERNET_TETHER_CONNECTION_BATTERY_PERCENTAGE},
+ {"tetherConnectionExplanation",
+ IDS_SETTINGS_INTERNET_TETHER_CONNECTION_EXPLANATION},
+ {"tetherConnectionCarrierWarning",
+ IDS_SETTINGS_INTERNET_TETHER_CONNECTION_CARRIER_WARNING},
+ {"tetherConnectionDescriptionTitle",
+ IDS_SETTINGS_INTERNET_TETHER_CONNECTION_DESCRIPTION_TITLE},
+ {"tetherConnectionDescriptionMobileData",
+ IDS_SETTINGS_INTERNET_TETHER_CONNECTION_DESCRIPTION_MOBILE_DATA},
+ {"tetherConnectionDescriptionBattery",
+ IDS_SETTINGS_INTERNET_TETHER_CONNECTION_DESCRIPTION_BATTERY},
+ {"tetherConnectionDescriptionWiFi",
+ IDS_SETTINGS_INTERNET_TETHER_CONNECTION_DESCRIPTION_WIFI},
+ {"tetherConnectionNotNowButton",
+ IDS_SETTINGS_INTERNET_TETHER_CONNECTION_NOT_NOW_BUTTON},
+ {"tetherConnectionConnectButton",
+ IDS_SETTINGS_INTERNET_TETHER_CONNECTION_CONNECT_BUTTON},
+ {"tetherEnableBluetooth", IDS_ENABLE_BLUETOOTH},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ chromeos::network_element::AddLocalizedStrings(html_source);
+ chromeos::network_element::AddOncLocalizedStrings(html_source);
+ chromeos::network_element::AddDetailsLocalizedStrings(html_source);
+ chromeos::network_element::AddConfigLocalizedStrings(html_source);
+ chromeos::network_element::AddErrorLocalizedStrings(html_source);
+
+ html_source->AddBoolean("showTechnologyBadge",
+ !ash::features::IsSeparateNetworkIconsEnabled());
+
+ html_source->AddString("networkGoogleNameserversLearnMoreUrl",
+ chrome::kGoogleNameserversLearnMoreURL);
+
+ html_source->AddString(
+ "networkSyncedShared",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_INTERNET_NETWORK_SYNCED_SHARED,
+ GetHelpUrlWithBoard(chrome::kWifiSyncLearnMoreURL)));
+ html_source->AddString(
+ "networkSyncedUser",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_INTERNET_NETWORK_SYNCED_USER,
+ GetHelpUrlWithBoard(chrome::kWifiSyncLearnMoreURL)));
+ html_source->AddString(
+ "internetNoNetworksMobileData",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_INTERNET_LOOKING_FOR_MOBILE_NETWORK,
+ GetHelpUrlWithBoard(chrome::kInstantTetheringLearnMoreURL)));
+}
+
+void InternetSection::AddHandlers(content::WebUI* web_ui) {
+ web_ui->AddMessageHandler(std::make_unique<InternetHandler>(profile()));
+}
+
+void InternetSection::OnDeviceStateListChanged() {
+ FetchDeviceList();
+}
+
+void InternetSection::OnActiveNetworksChanged(
+ std::vector<network_config::mojom::NetworkStatePropertiesPtr> networks) {
+ OnActiveNetworks(std::move(networks));
+}
+
+void InternetSection::FetchDeviceList() {
+ cros_network_config_->GetDeviceStateList(
+ base::BindOnce(&InternetSection::OnDeviceList, base::Unretained(this)));
+}
+
+void InternetSection::OnDeviceList(
+ std::vector<network_config::mojom::DeviceStatePropertiesPtr> devices) {
+ using network_config::mojom::DeviceStateType;
+ using network_config::mojom::NetworkType;
+
+ registry()->RemoveSearchTags(GetWifiSearchConcepts());
+ registry()->RemoveSearchTags(GetWifiOnSearchConcepts());
+ registry()->RemoveSearchTags(GetWifiOffSearchConcepts());
+ registry()->RemoveSearchTags(GetCellularSearchConcepts());
+ registry()->RemoveSearchTags(GetCellularOnSearchConcepts());
+ registry()->RemoveSearchTags(GetCellularOffSearchConcepts());
+ registry()->RemoveSearchTags(GetInstantTetheringSearchConcepts());
+ registry()->RemoveSearchTags(GetInstantTetheringOnSearchConcepts());
+ registry()->RemoveSearchTags(GetInstantTetheringOffSearchConcepts());
+
+ for (const auto& device : devices) {
+ switch (device->type) {
+ case NetworkType::kWiFi:
+ registry()->AddSearchTags(GetWifiSearchConcepts());
+ if (device->device_state == DeviceStateType::kEnabled)
+ registry()->AddSearchTags(GetWifiOnSearchConcepts());
+ else if (device->device_state == DeviceStateType::kDisabled)
+ registry()->AddSearchTags(GetWifiOffSearchConcepts());
+ break;
+
+ case NetworkType::kCellular:
+ registry()->AddSearchTags(GetCellularSearchConcepts());
+ if (device->device_state == DeviceStateType::kEnabled)
+ registry()->AddSearchTags(GetCellularOnSearchConcepts());
+ else if (device->device_state == DeviceStateType::kDisabled)
+ registry()->AddSearchTags(GetCellularOffSearchConcepts());
+ break;
+
+ case NetworkType::kTether:
+ registry()->AddSearchTags(GetInstantTetheringSearchConcepts());
+ if (device->device_state == DeviceStateType::kEnabled)
+ registry()->AddSearchTags(GetInstantTetheringOnSearchConcepts());
+ else if (device->device_state == DeviceStateType::kDisabled)
+ registry()->AddSearchTags(GetInstantTetheringOffSearchConcepts());
+ break;
+
+ default:
+ // Note: Ethernet and VPN only show search tags when connected, and
+ // categories such as Mobile/Wireless do not have search tags.
+ break;
+ }
+ }
+}
+
+void InternetSection::FetchActiveNetworks() {
+ cros_network_config_->GetNetworkStateList(
+ network_config::mojom::NetworkFilter::New(
+ network_config::mojom::FilterType::kActive,
+ network_config::mojom::NetworkType::kAll,
+ network_config::mojom::kNoLimit),
+ base::Bind(&InternetSection::OnActiveNetworks, base::Unretained(this)));
+}
+
+void InternetSection::OnActiveNetworks(
+ std::vector<network_config::mojom::NetworkStatePropertiesPtr> networks) {
+ using network_config::mojom::NetworkType;
+
+ registry()->RemoveSearchTags(GetEthernetConnectedSearchConcepts());
+ registry()->RemoveSearchTags(GetWifiConnectedSearchConcepts());
+ registry()->RemoveSearchTags(GetCellularConnectedSearchConcepts());
+ registry()->RemoveSearchTags(GetInstantTetheringConnectedSearchConcepts());
+ registry()->RemoveSearchTags(GetVpnConnectedSearchConcepts());
+
+ for (const auto& network : networks) {
+ if (!IsConnected(network->connection_state))
+ continue;
+
+ switch (network->type) {
+ case NetworkType::kEthernet:
+ registry()->AddSearchTags(GetEthernetConnectedSearchConcepts());
+ break;
+
+ case NetworkType::kWiFi:
+ registry()->AddSearchTags(GetWifiConnectedSearchConcepts());
+ break;
+
+ case NetworkType::kCellular:
+ registry()->AddSearchTags(GetCellularConnectedSearchConcepts());
+ break;
+
+ case NetworkType::kTether:
+ registry()->AddSearchTags(GetInstantTetheringConnectedSearchConcepts());
+ break;
+
+ case NetworkType::kVPN:
+ registry()->AddSearchTags(GetVpnConnectedSearchConcepts());
+ break;
+
+ default:
+ // Note: Category types such as Mobile/Wireless do not have search tags.
+ break;
+ }
+ }
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/internet_strings_provider.h b/chromium/chrome/browser/ui/webui/settings/chromeos/internet_section.h
index 4a0e2a2511e..f467529b810 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/internet_strings_provider.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/internet_section.h
@@ -2,12 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_INTERNET_STRINGS_PROVIDER_H_
-#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_INTERNET_STRINGS_PROVIDER_H_
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_INTERNET_SECTION_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_INTERNET_SECTION_H_
#include <vector>
-#include "chrome/browser/ui/webui/settings/chromeos/os_settings_per_page_strings_provider.h"
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h"
#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
@@ -21,33 +21,40 @@ class WebUIDataSource;
namespace chromeos {
namespace settings {
-class InternetStringsProvider
- : public OsSettingsPerPageStringsProvider,
+class SearchTagRegistry;
+
+class InternetSection
+ : public OsSettingsSection,
public network_config::mojom::CrosNetworkConfigObserver {
public:
- InternetStringsProvider(Profile* profile, Delegate* per_page_delegate);
- ~InternetStringsProvider() override;
+ InternetSection(Profile* profile, SearchTagRegistry* search_tag_registry);
+ ~InternetSection() override;
private:
- // OsSettingsPerPageStringsProvider:
- void AddUiStrings(content::WebUIDataSource* html_source) const override;
+ // OsSettingsSection:
+ void AddLoadTimeData(content::WebUIDataSource* html_source) override;
+ void AddHandlers(content::WebUI* web_ui) override;
// network_config::mojom::CrosNetworkConfigObserver:
void OnActiveNetworksChanged(
std::vector<network_config::mojom::NetworkStatePropertiesPtr> networks)
- override {}
+ override;
+ void OnDeviceStateListChanged() override;
void OnNetworkStateChanged(
chromeos::network_config::mojom::NetworkStatePropertiesPtr network)
override {}
void OnNetworkStateListChanged() override {}
void OnVpnProvidersChanged() override {}
void OnNetworkCertificatesChanged() override {}
- void OnDeviceStateListChanged() override;
void FetchDeviceList();
void OnDeviceList(
std::vector<network_config::mojom::DeviceStatePropertiesPtr> devices);
+ void FetchActiveNetworks();
+ void OnActiveNetworks(
+ std::vector<network_config::mojom::NetworkStatePropertiesPtr> networks);
+
mojo::Receiver<network_config::mojom::CrosNetworkConfigObserver> receiver_{
this};
mojo::Remote<network_config::mojom::CrosNetworkConfig> cros_network_config_;
@@ -56,4 +63,4 @@ class InternetStringsProvider
} // namespace settings
} // namespace chromeos
-#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_INTERNET_STRINGS_PROVIDER_H_
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_INTERNET_SECTION_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/internet_strings_provider.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/internet_strings_provider.cc
deleted file mode 100644
index 90a75cf7418..00000000000
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/internet_strings_provider.cc
+++ /dev/null
@@ -1,252 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/webui/settings/chromeos/internet_strings_provider.h"
-
-#include "ash/public/cpp/network_config_service.h"
-#include "base/bind.h"
-#include "base/no_destructor.h"
-#include "chrome/browser/ui/webui/chromeos/network_element_localized_strings_provider.h"
-#include "chrome/browser/ui/webui/webui_util.h"
-#include "chrome/common/url_constants.h"
-#include "chrome/common/webui_url_constants.h"
-#include "chrome/grit/chromium_strings.h"
-#include "chrome/grit/generated_resources.h"
-#include "chromeos/strings/grit/chromeos_strings.h"
-#include "components/strings/grit/components_strings.h"
-#include "content/public/browser/web_ui_data_source.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/webui/web_ui_util.h"
-
-namespace chromeos {
-namespace settings {
-namespace {
-
-const std::vector<SearchConcept>& GetNetworkSearchConcepts() {
- static const base::NoDestructor<std::vector<SearchConcept>> tags({
- {IDS_SETTINGS_TAG_NETWORK_SETTINGS,
- chrome::kNetworksSubPage,
- mojom::SearchResultIcon::kWifi,
- {IDS_SETTINGS_TAG_NETWORK_SETTINGS_ALT1, SearchConcept::kAltTagEnd}},
- });
- return *tags;
-}
-
-const std::vector<SearchConcept>& GetEthernetSearchConcepts() {
- static const base::NoDestructor<std::vector<SearchConcept>> tags({
- {IDS_SETTINGS_TAG_ETHERNET_SETTINGS,
- chrome::kEthernetSettingsSubPage,
- mojom::SearchResultIcon::kEthernet,
- {IDS_SETTINGS_TAG_ETHERNET_SETTINGS_ALT1, SearchConcept::kAltTagEnd}},
- });
- return *tags;
-}
-
-const std::vector<SearchConcept>& GetWifiSearchConcepts() {
- static const base::NoDestructor<std::vector<SearchConcept>> tags({
- {IDS_SETTINGS_TAG_WIFI_SETTINGS, chrome::kWiFiSettingsSubPage,
- mojom::SearchResultIcon::kWifi},
- {IDS_SETTINGS_TAG_TURN_ON_WIFI,
- chrome::kWiFiSettingsSubPage,
- mojom::SearchResultIcon::kWifi,
- {IDS_SETTINGS_TAG_TURN_ON_WIFI_ALT1, SearchConcept::kAltTagEnd}},
- {IDS_SETTINGS_TAG_TURN_OFF_WIFI,
- chrome::kWiFiSettingsSubPage,
- mojom::SearchResultIcon::kWifi,
- {IDS_SETTINGS_TAG_TURN_OFF_WIFI_ALT1, SearchConcept::kAltTagEnd}},
- {IDS_SETTINGS_TAG_CONNECT_WIFI, chrome::kWiFiSettingsSubPage,
- mojom::SearchResultIcon::kWifi},
- {IDS_SETTINGS_TAG_DISCONNECT_WIFI, chrome::kWiFiSettingsSubPage,
- mojom::SearchResultIcon::kWifi},
- });
- return *tags;
-}
-
-} // namespace
-
-InternetStringsProvider::InternetStringsProvider(Profile* profile,
- Delegate* per_page_delegate)
- : OsSettingsPerPageStringsProvider(profile, per_page_delegate) {
- // General network search tags are always added.
- delegate()->AddSearchTags(GetNetworkSearchConcepts());
-
- // Receive updates when devices (e.g., Ethernet, Wi-Fi) go on/offline.
- ash::GetNetworkConfigService(
- cros_network_config_.BindNewPipeAndPassReceiver());
- cros_network_config_->AddObserver(receiver_.BindNewPipeAndPassRemote());
-
- // Fetch initial list of devices.
- FetchDeviceList();
-}
-
-InternetStringsProvider::~InternetStringsProvider() = default;
-
-void InternetStringsProvider::AddUiStrings(
- content::WebUIDataSource* html_source) const {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"internetAddConnection", IDS_SETTINGS_INTERNET_ADD_CONNECTION},
- {"internetAddConnectionExpandA11yLabel",
- IDS_SETTINGS_INTERNET_ADD_CONNECTION_EXPAND_ACCESSIBILITY_LABEL},
- {"internetAddConnectionNotAllowed",
- IDS_SETTINGS_INTERNET_ADD_CONNECTION_NOT_ALLOWED},
- {"internetAddThirdPartyVPN", IDS_SETTINGS_INTERNET_ADD_THIRD_PARTY_VPN},
- {"internetAddVPN", IDS_SETTINGS_INTERNET_ADD_VPN},
- {"internetAddWiFi", IDS_SETTINGS_INTERNET_ADD_WIFI},
- {"internetConfigName", IDS_SETTINGS_INTERNET_CONFIG_NAME},
- {"internetDetailPageTitle", IDS_SETTINGS_INTERNET_DETAIL},
- {"internetDeviceEnabling", IDS_SETTINGS_INTERNET_DEVICE_ENABLING},
- {"internetDeviceInitializing", IDS_SETTINGS_INTERNET_DEVICE_INITIALIZING},
- {"internetJoinType", IDS_SETTINGS_INTERNET_JOIN_TYPE},
- {"internetKnownNetworksPageTitle", IDS_SETTINGS_INTERNET_KNOWN_NETWORKS},
- {"internetMobileSearching", IDS_SETTINGS_INTERNET_MOBILE_SEARCH},
- {"internetNoNetworks", IDS_SETTINGS_INTERNET_NO_NETWORKS},
- {"internetPageTitle", IDS_SETTINGS_INTERNET},
- {"internetSummaryButtonA11yLabel",
- IDS_SETTINGS_INTERNET_SUMMARY_BUTTON_ACCESSIBILITY_LABEL},
- {"internetToggleMobileA11yLabel",
- IDS_SETTINGS_INTERNET_TOGGLE_MOBILE_ACCESSIBILITY_LABEL},
- {"internetToggleTetherLabel", IDS_SETTINGS_INTERNET_TOGGLE_TETHER_LABEL},
- {"internetToggleTetherSubtext",
- IDS_SETTINGS_INTERNET_TOGGLE_TETHER_SUBTEXT},
- {"internetToggleWiFiA11yLabel",
- IDS_SETTINGS_INTERNET_TOGGLE_WIFI_ACCESSIBILITY_LABEL},
- {"knownNetworksAll", IDS_SETTINGS_INTERNET_KNOWN_NETWORKS_ALL},
- {"knownNetworksButton", IDS_SETTINGS_INTERNET_KNOWN_NETWORKS_BUTTON},
- {"knownNetworksMessage", IDS_SETTINGS_INTERNET_KNOWN_NETWORKS_MESSAGE},
- {"knownNetworksPreferred",
- IDS_SETTINGS_INTERNET_KNOWN_NETWORKS_PREFFERED},
- {"knownNetworksMenuAddPreferred",
- IDS_SETTINGS_INTERNET_KNOWN_NETWORKS_MENU_ADD_PREFERRED},
- {"knownNetworksMenuRemovePreferred",
- IDS_SETTINGS_INTERNET_KNOWN_NETWORKS_MENU_REMOVE_PREFERRED},
- {"knownNetworksMenuForget",
- IDS_SETTINGS_INTERNET_KNOWN_NETWORKS_MENU_FORGET},
- {"networkAllowDataRoaming",
- IDS_SETTINGS_SETTINGS_NETWORK_ALLOW_DATA_ROAMING},
- {"networkAllowDataRoamingEnabledHome",
- IDS_SETTINGS_SETTINGS_NETWORK_ALLOW_DATA_ROAMING_ENABLED_HOME},
- {"networkAllowDataRoamingEnabledRoaming",
- IDS_SETTINGS_SETTINGS_NETWORK_ALLOW_DATA_ROAMING_ENABLED_ROAMING},
- {"networkAllowDataRoamingDisabled",
- IDS_SETTINGS_SETTINGS_NETWORK_ALLOW_DATA_ROAMING_DISABLED},
- {"networkAlwaysOnVpn", IDS_SETTINGS_INTERNET_NETWORK_ALWAYS_ON_VPN},
- {"networkAutoConnect", IDS_SETTINGS_INTERNET_NETWORK_AUTO_CONNECT},
- {"networkAutoConnectCellular",
- IDS_SETTINGS_INTERNET_NETWORK_AUTO_CONNECT_CELLULAR},
- {"networkButtonActivate", IDS_SETTINGS_INTERNET_BUTTON_ACTIVATE},
- {"networkButtonConfigure", IDS_SETTINGS_INTERNET_BUTTON_CONFIGURE},
- {"networkButtonConnect", IDS_SETTINGS_INTERNET_BUTTON_CONNECT},
- {"networkButtonDisconnect", IDS_SETTINGS_INTERNET_BUTTON_DISCONNECT},
- {"networkButtonForget", IDS_SETTINGS_INTERNET_BUTTON_FORGET},
- {"networkButtonViewAccount", IDS_SETTINGS_INTERNET_BUTTON_VIEW_ACCOUNT},
- {"networkConnectNotAllowed", IDS_SETTINGS_INTERNET_CONNECT_NOT_ALLOWED},
- {"networkIPAddress", IDS_SETTINGS_INTERNET_NETWORK_IP_ADDRESS},
- {"networkIPConfigAuto", IDS_SETTINGS_INTERNET_NETWORK_IP_CONFIG_AUTO},
- {"networkNameserversLearnMore", IDS_LEARN_MORE},
- {"networkPrefer", IDS_SETTINGS_INTERNET_NETWORK_PREFER},
- {"networkPrimaryUserControlled",
- IDS_SETTINGS_INTERNET_NETWORK_PRIMARY_USER_CONTROLLED},
- {"networkScanningLabel", IDS_NETWORK_SCANNING_MESSAGE},
- {"networkSectionAdvanced",
- IDS_SETTINGS_INTERNET_NETWORK_SECTION_ADVANCED},
- {"networkSectionAdvancedA11yLabel",
- IDS_SETTINGS_INTERNET_NETWORK_SECTION_ADVANCED_ACCESSIBILITY_LABEL},
- {"networkSectionNetwork", IDS_SETTINGS_INTERNET_NETWORK_SECTION_NETWORK},
- {"networkSectionNetworkExpandA11yLabel",
- IDS_SETTINGS_INTERNET_NETWORK_SECTION_NETWORK_ACCESSIBILITY_LABEL},
- {"networkSectionProxy", IDS_SETTINGS_INTERNET_NETWORK_SECTION_PROXY},
- {"networkSectionProxyExpandA11yLabel",
- IDS_SETTINGS_INTERNET_NETWORK_SECTION_PROXY_ACCESSIBILITY_LABEL},
- {"networkShared", IDS_SETTINGS_INTERNET_NETWORK_SHARED},
- {"networkVpnBuiltin", IDS_NETWORK_TYPE_VPN_BUILTIN},
- {"networkOutOfRange", IDS_SETTINGS_INTERNET_WIFI_NETWORK_OUT_OF_RANGE},
- {"cellularContactSpecificCarrier",
- IDS_SETTINGS_INTERNET_CELLULAR_CONTACT_SPECIFIC_CARRIER},
- {"cellularContactDefaultCarrier",
- IDS_SETTINGS_INTERNET_CELLULAR_CONTACT_DEFAULT_CARRIER},
- {"tetherPhoneOutOfRange",
- IDS_SETTINGS_INTERNET_TETHER_PHONE_OUT_OF_RANGE},
- {"gmscoreNotificationsTitle",
- IDS_SETTINGS_INTERNET_GMSCORE_NOTIFICATIONS_TITLE},
- {"gmscoreNotificationsOneDeviceSubtitle",
- IDS_SETTINGS_INTERNET_GMSCORE_NOTIFICATIONS_ONE_DEVICE_SUBTITLE},
- {"gmscoreNotificationsTwoDevicesSubtitle",
- IDS_SETTINGS_INTERNET_GMSCORE_NOTIFICATIONS_TWO_DEVICES_SUBTITLE},
- {"gmscoreNotificationsManyDevicesSubtitle",
- IDS_SETTINGS_INTERNET_GMSCORE_NOTIFICATIONS_MANY_DEVICES_SUBTITLE},
- {"gmscoreNotificationsFirstStep",
- IDS_SETTINGS_INTERNET_GMSCORE_NOTIFICATIONS_FIRST_STEP},
- {"gmscoreNotificationsSecondStep",
- IDS_SETTINGS_INTERNET_GMSCORE_NOTIFICATIONS_SECOND_STEP},
- {"gmscoreNotificationsThirdStep",
- IDS_SETTINGS_INTERNET_GMSCORE_NOTIFICATIONS_THIRD_STEP},
- {"gmscoreNotificationsFourthStep",
- IDS_SETTINGS_INTERNET_GMSCORE_NOTIFICATIONS_FOURTH_STEP},
- {"tetherConnectionDialogTitle",
- IDS_SETTINGS_INTERNET_TETHER_CONNECTION_DIALOG_TITLE},
- {"tetherConnectionAvailableDeviceTitle",
- IDS_SETTINGS_INTERNET_TETHER_CONNECTION_AVAILABLE_DEVICE_TITLE},
- {"tetherConnectionBatteryPercentage",
- IDS_SETTINGS_INTERNET_TETHER_CONNECTION_BATTERY_PERCENTAGE},
- {"tetherConnectionExplanation",
- IDS_SETTINGS_INTERNET_TETHER_CONNECTION_EXPLANATION},
- {"tetherConnectionCarrierWarning",
- IDS_SETTINGS_INTERNET_TETHER_CONNECTION_CARRIER_WARNING},
- {"tetherConnectionDescriptionTitle",
- IDS_SETTINGS_INTERNET_TETHER_CONNECTION_DESCRIPTION_TITLE},
- {"tetherConnectionDescriptionMobileData",
- IDS_SETTINGS_INTERNET_TETHER_CONNECTION_DESCRIPTION_MOBILE_DATA},
- {"tetherConnectionDescriptionBattery",
- IDS_SETTINGS_INTERNET_TETHER_CONNECTION_DESCRIPTION_BATTERY},
- {"tetherConnectionDescriptionWiFi",
- IDS_SETTINGS_INTERNET_TETHER_CONNECTION_DESCRIPTION_WIFI},
- {"tetherConnectionNotNowButton",
- IDS_SETTINGS_INTERNET_TETHER_CONNECTION_NOT_NOW_BUTTON},
- {"tetherConnectionConnectButton",
- IDS_SETTINGS_INTERNET_TETHER_CONNECTION_CONNECT_BUTTON},
- {"tetherEnableBluetooth", IDS_ENABLE_BLUETOOTH},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-
- chromeos::network_element::AddLocalizedStrings(html_source);
- chromeos::network_element::AddOncLocalizedStrings(html_source);
- chromeos::network_element::AddDetailsLocalizedStrings(html_source);
- chromeos::network_element::AddConfigLocalizedStrings(html_source);
- chromeos::network_element::AddErrorLocalizedStrings(html_source);
-
- html_source->AddString("networkGoogleNameserversLearnMoreUrl",
- chrome::kGoogleNameserversLearnMoreURL);
- html_source->AddString(
- "internetNoNetworksMobileData",
- l10n_util::GetStringFUTF16(
- IDS_SETTINGS_INTERNET_LOOKING_FOR_MOBILE_NETWORK,
- GetHelpUrlWithBoard(chrome::kInstantTetheringLearnMoreURL)));
-}
-
-void InternetStringsProvider::OnDeviceStateListChanged() {
- FetchDeviceList();
-}
-
-void InternetStringsProvider::FetchDeviceList() {
- cros_network_config_->GetDeviceStateList(base::BindOnce(
- &InternetStringsProvider::OnDeviceList, base::Unretained(this)));
-}
-
-void InternetStringsProvider::OnDeviceList(
- std::vector<network_config::mojom::DeviceStatePropertiesPtr> devices) {
- // Start with no search tags.
- delegate()->RemoveSearchTags(GetEthernetSearchConcepts());
- delegate()->RemoveSearchTags(GetWifiSearchConcepts());
-
- // Add a search tag each time we see a device type.
- for (const auto& device : devices) {
- if (device->type == network_config::mojom::NetworkType::kEthernet)
- delegate()->AddSearchTags(GetEthernetSearchConcepts());
- else if (device->type == network_config::mojom::NetworkType::kWiFi)
- delegate()->AddSearchTags(GetWifiSearchConcepts());
- }
-}
-
-} // namespace settings
-} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/languages_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/languages_section.cc
new file mode 100644
index 00000000000..0007f1a6a8b
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/languages_section.cc
@@ -0,0 +1,165 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/languages_section.h"
+
+#include "base/feature_list.h"
+#include "base/no_destructor.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
+#include "chrome/browser/ui/webui/settings/languages_handler.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/grit/generated_resources.h"
+#include "chromeos/constants/chromeos_features.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/webui/web_ui_util.h"
+
+namespace chromeos {
+namespace settings {
+namespace {
+
+const std::vector<SearchConcept>& GetLanguagesSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_LANGUAGES_INPUT,
+ mojom::kLanguagesAndInputDetailsSubpagePath,
+ mojom::SearchResultIcon::kGlobe,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kLanguagesAndInputDetails}},
+ {IDS_OS_SETTINGS_TAG_LANGUAGES_INPUT_METHODS,
+ mojom::kManageInputMethodsSubpagePath,
+ mojom::SearchResultIcon::kGlobe,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kManageInputMethods}},
+ {IDS_OS_SETTINGS_TAG_LANGUAGES_INPUT_ADD_LANGUAGE,
+ mojom::kLanguagesAndInputDetailsSubpagePath,
+ mojom::SearchResultIcon::kGlobe,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kAddLanguage}},
+ {IDS_OS_SETTINGS_TAG_LANGUAGES_INPUT_INPUT_OPTIONS_SHELF,
+ mojom::kLanguagesAndInputDetailsSubpagePath,
+ mojom::SearchResultIcon::kGlobe,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kShowInputOptionsInShelf},
+ {IDS_OS_SETTINGS_TAG_LANGUAGES_INPUT_INPUT_OPTIONS_SHELF_ALT1,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetSmartInputsSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_LANGUAGES_SMART_INPUTS,
+ mojom::kSmartInputsSubagePath,
+ mojom::SearchResultIcon::kGlobe,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kSmartInputs}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetAssistivePersonalInfoSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_LANGUAGES_PERSONAL_INFORMATION_SUGGESTIONS,
+ mojom::kSmartInputsSubagePath,
+ mojom::SearchResultIcon::kGlobe,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kShowPersonalInformationSuggestions}},
+ });
+ return *tags;
+}
+
+bool IsAssistivePersonalInfoAllowed() {
+ return !features::IsGuestModeActive() &&
+ base::FeatureList::IsEnabled(
+ ::chromeos::features::kAssistPersonalInfo);
+}
+
+void AddSmartInputsStrings(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"smartInputsTitle", IDS_SETTINGS_SMART_INPUTS_TITLE},
+ {"personalInfoSuggestionTitle",
+ IDS_SETTINGS_SMART_INPUTS_PERSONAL_INFO_TITLE},
+ {"personalInfoSuggestionDescription",
+ IDS_SETTINGS_SMART_INPUTS_PERSONAL_INFO_DESCRIPTION},
+ {"showPersonalInfoSuggestion",
+ IDS_SETTINGS_SMART_INPUTS_SHOW_PERSONAL_INFO},
+ {"managePersonalInfo", IDS_SETTINGS_SMART_INPUTS_MANAGE_PERSONAL_INFO},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ html_source->AddBoolean("allowAssistivePersonalInfo",
+ IsAssistivePersonalInfoAllowed());
+}
+
+} // namespace
+
+LanguagesSection::LanguagesSection(Profile* profile,
+ SearchTagRegistry* search_tag_registry)
+ : OsSettingsSection(profile, search_tag_registry) {
+ registry()->AddSearchTags(GetLanguagesSearchConcepts());
+
+ if (IsAssistivePersonalInfoAllowed()) {
+ registry()->AddSearchTags(GetSmartInputsSearchConcepts());
+ registry()->AddSearchTags(GetAssistivePersonalInfoSearchConcepts());
+ }
+}
+
+LanguagesSection::~LanguagesSection() = default;
+
+void LanguagesSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"orderLanguagesInstructions",
+ IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_ORDERING_INSTRUCTIONS},
+ {"osLanguagesPageTitle", IDS_OS_SETTINGS_LANGUAGES_AND_INPUT_PAGE_TITLE},
+ {"osLanguagesListTitle", IDS_OS_SETTINGS_LANGUAGES_LIST_TITLE},
+ {"inputMethodsListTitle",
+ IDS_SETTINGS_LANGUAGES_INPUT_METHODS_LIST_TITLE},
+ {"inputMethodEnabled", IDS_SETTINGS_LANGUAGES_INPUT_METHOD_ENABLED},
+ {"inputMethodsExpandA11yLabel",
+ IDS_SETTINGS_LANGUAGES_INPUT_METHODS_EXPAND_ACCESSIBILITY_LABEL},
+ {"inputMethodsManagedbyPolicy",
+ IDS_SETTINGS_LANGUAGES_INPUT_METHODS_MANAGED_BY_POLICY},
+ {"manageInputMethods", IDS_SETTINGS_LANGUAGES_INPUT_METHODS_MANAGE},
+ {"manageInputMethodsPageTitle",
+ IDS_SETTINGS_LANGUAGES_MANAGE_INPUT_METHODS_TITLE},
+ {"showImeMenu", IDS_SETTINGS_LANGUAGES_SHOW_IME_MENU},
+ {"displayLanguageRestart",
+ IDS_SETTINGS_LANGUAGES_RESTART_TO_DISPLAY_LANGUAGE},
+ {"moveDown", IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_MOVE_DOWN},
+ {"displayInThisLanguage",
+ IDS_SETTINGS_LANGUAGES_DISPLAY_IN_THIS_LANGUAGE},
+ {"searchLanguages", IDS_SETTINGS_LANGUAGE_SEARCH},
+ {"addLanguagesDialogTitle",
+ IDS_SETTINGS_LANGUAGES_MANAGE_LANGUAGES_TITLE},
+ {"moveToTop", IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_MOVE_TO_TOP},
+ {"isDisplayedInThisLanguage",
+ IDS_SETTINGS_LANGUAGES_IS_DISPLAYED_IN_THIS_LANGUAGE},
+ {"removeLanguage", IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_REMOVE},
+ {"addLanguages", IDS_SETTINGS_LANGUAGES_LANGUAGES_ADD},
+ {"moveUp", IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_MOVE_UP},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+ AddSmartInputsStrings(html_source);
+
+ html_source->AddString(
+ "languagesLearnMoreURL",
+ base::ASCIIToUTF16(chrome::kLanguageSettingsLearnMoreUrl));
+}
+
+void LanguagesSection::AddHandlers(content::WebUI* web_ui) {
+ web_ui->AddMessageHandler(
+ std::make_unique<::settings::LanguagesHandler>(profile()));
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/languages_section.h b/chromium/chrome/browser/ui/webui/settings/chromeos/languages_section.h
new file mode 100644
index 00000000000..d8a742babc2
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/languages_section.h
@@ -0,0 +1,36 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_LANGUAGES_SECTION_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_LANGUAGES_SECTION_H_
+
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h"
+
+namespace content {
+class WebUIDataSource;
+} // namespace content
+
+namespace chromeos {
+namespace settings {
+
+class SearchTagRegistry;
+
+// Provides UI strings and search tags for Languages & Input settings. Search
+// tags for some input features (e.g., Smart Inputs) are used only when
+// the relevant features are enabled.
+class LanguagesSection : public OsSettingsSection {
+ public:
+ LanguagesSection(Profile* profile, SearchTagRegistry* search_tag_registry);
+ ~LanguagesSection() override;
+
+ private:
+ // OsSettingsSection:
+ void AddLoadTimeData(content::WebUIDataSource* html_source) override;
+ void AddHandlers(content::WebUI* web_ui) override;
+};
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_LANGUAGES_SECTION_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/main_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/main_section.cc
new file mode 100644
index 00000000000..9afd5882393
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/main_section.cc
@@ -0,0 +1,186 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/main_section.h"
+
+#include "ash/public/cpp/resources/grit/ash_public_unscaled_resources.h"
+#include "base/feature_list.h"
+#include "base/no_destructor.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/metrics_handler.h"
+#include "chrome/browser/ui/webui/policy_indicator_localized_strings_provider.h"
+#include "chrome/browser/ui/webui/settings/browser_lifetime_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/browser/web_applications/system_web_app_manager.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/grit/browser_resources.h"
+#include "chrome/grit/chromium_strings.h"
+#include "chrome/grit/generated_resources.h"
+#include "chrome/grit/os_settings_resources.h"
+#include "chromeos/components/web_applications/manifest_request_filter.h"
+#include "chromeos/constants/chromeos_features.h"
+#include "components/strings/grit/components_strings.h"
+#include "components/user_manager/user_manager.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/webui/web_ui_util.h"
+
+namespace chromeos {
+namespace settings {
+namespace {
+
+void AddSearchInSettingsStrings(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"searchPrompt", IDS_SETTINGS_SEARCH_PROMPT},
+ {"searchNoResults", IDS_SEARCH_NO_RESULTS},
+ {"searchResults", IDS_SEARCH_RESULTS},
+ {"searchResultSelected", IDS_OS_SEARCH_RESULT_ROW_A11Y_RESULT_SELECTED},
+ {"searchResultsOne", IDS_OS_SEARCH_BOX_A11Y_ONE_RESULT},
+ {"searchResultsNumber", IDS_OS_SEARCH_BOX_A11Y_RESULT_COUNT},
+ // TODO(dpapad): IDS_DOWNLOAD_CLEAR_SEARCH and IDS_HISTORY_CLEAR_SEARCH
+ // are identical, merge them to one and re-use here.
+ {"clearSearch", IDS_DOWNLOAD_CLEAR_SEARCH},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ html_source->AddString(
+ "searchNoOsResultsHelp",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_SEARCH_NO_RESULTS_HELP,
+ base::ASCIIToUTF16(chrome::kOsSettingsSearchHelpURL)));
+
+ html_source->AddBoolean(
+ "newOsSettingsSearch",
+ base::FeatureList::IsEnabled(::chromeos::features::kNewOsSettingsSearch));
+}
+
+} // namespace
+
+MainSection::MainSection(Profile* profile,
+ SearchTagRegistry* search_tag_registry)
+ : OsSettingsSection(profile, search_tag_registry) {}
+
+MainSection::~MainSection() = default;
+
+void MainSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"add", IDS_ADD},
+ {"advancedPageTitle", IDS_SETTINGS_ADVANCED},
+ {"back", IDS_ACCNAME_BACK},
+ {"basicPageTitle", IDS_SETTINGS_BASIC},
+ {"cancel", IDS_CANCEL},
+ {"clear", IDS_SETTINGS_CLEAR},
+ {"close", IDS_CLOSE},
+ {"confirm", IDS_CONFIRM},
+ {"continue", IDS_SETTINGS_CONTINUE},
+ {"controlledByExtension", IDS_SETTINGS_CONTROLLED_BY_EXTENSION},
+ {"custom", IDS_SETTINGS_CUSTOM},
+ {"delete", IDS_SETTINGS_DELETE},
+ {"deviceOff", IDS_SETTINGS_DEVICE_OFF},
+ {"deviceOn", IDS_SETTINGS_DEVICE_ON},
+ {"disable", IDS_DISABLE},
+ {"done", IDS_DONE},
+ {"edit", IDS_SETTINGS_EDIT},
+ {"extensionsLinkTooltip", IDS_SETTINGS_MENU_EXTENSIONS_LINK_TOOLTIP},
+ {"learnMore", IDS_LEARN_MORE},
+ {"menu", IDS_MENU},
+ {"menuButtonLabel", IDS_SETTINGS_MENU_BUTTON_LABEL},
+ {"moreActions", IDS_SETTINGS_MORE_ACTIONS},
+ {"ok", IDS_OK},
+ {"restart", IDS_SETTINGS_RESTART},
+ {"save", IDS_SAVE},
+ {"searchResultBubbleText", IDS_SEARCH_RESULT_BUBBLE_TEXT},
+ {"searchResultsBubbleText", IDS_SEARCH_RESULTS_BUBBLE_TEXT},
+ {"settings", IDS_SETTINGS_SETTINGS},
+ {"settingsAltPageTitle", IDS_SETTINGS_ALT_PAGE_TITLE},
+ {"subpageArrowRoleDescription", IDS_SETTINGS_SUBPAGE_BUTTON},
+ {"notValidWebAddress", IDS_SETTINGS_NOT_VALID_WEB_ADDRESS},
+ {"notValidWebAddressForContentType",
+ IDS_SETTINGS_NOT_VALID_WEB_ADDRESS_FOR_CONTENT_TYPE},
+
+ // Common font related strings shown in a11y and appearance sections.
+ {"quickBrownFox", IDS_SETTINGS_QUICK_BROWN_FOX},
+ {"verySmall", IDS_SETTINGS_VERY_SMALL_FONT},
+ {"small", IDS_SETTINGS_SMALL_FONT},
+ {"medium", IDS_SETTINGS_MEDIUM_FONT},
+ {"large", IDS_SETTINGS_LARGE_FONT},
+ {"veryLarge", IDS_SETTINGS_VERY_LARGE_FONT},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ // This handler is for chrome://os-settings.
+ html_source->AddBoolean("isOSSettings", true);
+
+ html_source->AddBoolean("isGuest", features::IsGuestModeActive());
+ html_source->AddBoolean(
+ "isKioskModeActive",
+ user_manager::UserManager::Get()->IsLoggedInAsAnyKioskApp());
+ html_source->AddBoolean("isSupervised", profile()->IsSupervised());
+
+ // Add the System Web App resources for Settings.
+ if (web_app::SystemWebAppManager::IsEnabled()) {
+ html_source->AddResourcePath("icon-192.png", IDR_SETTINGS_LOGO_192);
+ html_source->AddResourcePath("pwa.html", IDR_PWA_HTML);
+ web_app::SetManifestRequestFilter(html_source, IDR_OS_SETTINGS_MANIFEST,
+ IDS_SETTINGS_SETTINGS);
+ }
+
+ html_source->AddResourcePath("constants/routes.mojom-lite.js",
+ IDR_OS_SETTINGS_ROUTES_MOJOM_LITE_JS);
+ html_source->AddResourcePath("constants/setting.mojom-lite.js",
+ IDR_OS_SETTINGS_SETTING_MOJOM_LITE_JS);
+
+ html_source->AddResourcePath(
+ "search/user_action_recorder.mojom-lite.js",
+ IDR_OS_SETTINGS_USER_ACTION_RECORDER_MOJOM_LITE_JS);
+ html_source->AddResourcePath(
+ "search/search_result_icon.mojom-lite.js",
+ IDR_OS_SETTINGS_SEARCH_RESULT_ICON_MOJOM_LITE_JS);
+ html_source->AddResourcePath("search/search.mojom-lite.js",
+ IDR_OS_SETTINGS_SEARCH_MOJOM_LITE_JS);
+
+ html_source->AddString("browserSettingsBannerText",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_BROWSER_SETTINGS_BANNER,
+ base::ASCIIToUTF16(chrome::kChromeUISettingsURL)));
+
+ AddSearchInSettingsStrings(html_source);
+ AddChromeOSUserStrings(html_source);
+
+ policy_indicator::AddLocalizedStrings(html_source);
+}
+
+void MainSection::AddHandlers(content::WebUI* web_ui) {
+ // Add the metrics handler to write uma stats.
+ web_ui->AddMessageHandler(std::make_unique<MetricsHandler>());
+
+ web_ui->AddMessageHandler(
+ std::make_unique<::settings::BrowserLifetimeHandler>());
+}
+
+void MainSection::AddChromeOSUserStrings(
+ content::WebUIDataSource* html_source) {
+ const user_manager::User* user =
+ ProfileHelper::Get()->GetUserByProfile(profile());
+ const user_manager::User* primary_user =
+ user_manager::UserManager::Get()->GetPrimaryUser();
+ std::string primary_user_email = primary_user->GetAccountId().GetUserEmail();
+
+ html_source->AddString("primaryUserEmail", primary_user_email);
+ html_source->AddBoolean("isActiveDirectoryUser",
+ user && user->IsActiveDirectoryUser());
+ html_source->AddBoolean(
+ "isSecondaryUser",
+ user && user->GetAccountId() != primary_user->GetAccountId());
+ html_source->AddString(
+ "secondaryUserBannerText",
+ l10n_util::GetStringFUTF16(IDS_SETTINGS_SECONDARY_USER_BANNER,
+ base::ASCIIToUTF16(primary_user_email)));
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/main_section.h b/chromium/chrome/browser/ui/webui/settings/chromeos/main_section.h
new file mode 100644
index 00000000000..7f8d9de7d5c
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/main_section.h
@@ -0,0 +1,36 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_MAIN_SECTION_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_MAIN_SECTION_H_
+
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h"
+
+namespace content {
+class WebUIDataSource;
+} // namespace content
+
+namespace chromeos {
+namespace settings {
+
+// Provides UI strings for the main settings page, including the toolbar, search
+// functionality, and common strings. Note that no search tags are provided,
+// since they only apply to specific pages/settings.
+class MainSection : public OsSettingsSection {
+ public:
+ MainSection(Profile* profile, SearchTagRegistry* search_tag_registry);
+ ~MainSection() override;
+
+ private:
+ // OsSettingsSection:
+ void AddLoadTimeData(content::WebUIDataSource* html_source) override;
+ void AddHandlers(content::WebUI* web_ui) override;
+
+ void AddChromeOSUserStrings(content::WebUIDataSource* html_source);
+};
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_MAIN_SECTION_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/multidevice_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/multidevice_section.cc
new file mode 100644
index 00000000000..7ce85eaf234
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/multidevice_section.cc
@@ -0,0 +1,247 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/multidevice_section.h"
+
+#include "base/no_destructor.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/chromeos/android_sms/android_sms_service.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/settings/chromeos/multidevice_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/common/webui_url_constants.h"
+#include "chrome/grit/generated_resources.h"
+#include "chromeos/services/multidevice_setup/public/cpp/prefs.h"
+#include "chromeos/services/multidevice_setup/public/cpp/url_provider.h"
+#include "chromeos/services/multidevice_setup/public/mojom/multidevice_setup.mojom.h"
+#include "content/public/browser/web_ui.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/webui/web_ui_util.h"
+#include "ui/chromeos/devicetype_utils.h"
+
+namespace chromeos {
+namespace settings {
+namespace {
+
+const std::vector<SearchConcept>& GetMultiDeviceSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_MULTIDEVICE_MESSAGES,
+ mojom::kMultiDeviceFeaturesSubpagePath,
+ mojom::SearchResultIcon::kMessages,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kMessagesOnOff},
+ {IDS_OS_SETTINGS_TAG_MULTIDEVICE_MESSAGES_ALT1,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_MULTIDEVICE,
+ mojom::kMultiDeviceFeaturesSubpagePath,
+ mojom::SearchResultIcon::kPhone,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kMultiDeviceFeatures},
+ {IDS_OS_SETTINGS_TAG_MULTIDEVICE_ALT1,
+ IDS_OS_SETTINGS_TAG_MULTIDEVICE_ALT2,
+ IDS_OS_SETTINGS_TAG_MULTIDEVICE_ALT3, SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_MULTIDEVICE_SMART_LOCK,
+ mojom::kMultiDeviceFeaturesSubpagePath,
+ mojom::SearchResultIcon::kLock,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kSmartLock},
+ {IDS_OS_SETTINGS_TAG_MULTIDEVICE_SMART_LOCK_ALT1,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetMultiDeviceOptedInSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_MULTIDEVICE_SMART_LOCK_OPTIONS,
+ mojom::kSmartLockSubpagePath,
+ mojom::SearchResultIcon::kLock,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kSmartLock},
+ {IDS_OS_SETTINGS_TAG_MULTIDEVICE_SMART_LOCK_OPTIONS_ALT1,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_MULTIDEVICE_FORGET,
+ mojom::kMultiDeviceFeaturesSubpagePath,
+ mojom::SearchResultIcon::kPhone,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kForgetPhone},
+ {IDS_OS_SETTINGS_TAG_MULTIDEVICE_FORGET_ALT1,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetMultiDeviceOptedOutSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_MULTIDEVICE_SET_UP,
+ mojom::kMultiDeviceSectionPath,
+ mojom::SearchResultIcon::kPhone,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kSetUpMultiDevice}},
+ });
+ return *tags;
+}
+
+void AddEasyUnlockStrings(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"easyUnlockSectionTitle", IDS_SETTINGS_EASY_UNLOCK_SECTION_TITLE},
+ {"easyUnlockUnlockDeviceOnly",
+ IDS_SETTINGS_EASY_UNLOCK_UNLOCK_DEVICE_ONLY},
+ {"easyUnlockUnlockDeviceAndAllowSignin",
+ IDS_SETTINGS_EASY_UNLOCK_UNLOCK_DEVICE_AND_ALLOW_SIGNIN},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+}
+
+bool IsOptedIn(multidevice_setup::mojom::HostStatus host_status) {
+ return host_status ==
+ multidevice_setup::mojom::HostStatus::kHostSetButNotYetVerified ||
+ host_status == multidevice_setup::mojom::HostStatus::kHostVerified;
+}
+
+} // namespace
+
+MultiDeviceSection::MultiDeviceSection(
+ Profile* profile,
+ SearchTagRegistry* search_tag_registry,
+ multidevice_setup::MultiDeviceSetupClient* multidevice_setup_client,
+ android_sms::AndroidSmsService* android_sms_service,
+ PrefService* pref_service)
+ : OsSettingsSection(profile, search_tag_registry),
+ multidevice_setup_client_(multidevice_setup_client),
+ android_sms_service_(android_sms_service),
+ pref_service_(pref_service) {
+ // Note: |multidevice_setup_client_| is null when multi-device features are
+ // prohibited by policy.
+ if (!multidevice_setup_client_)
+ return;
+
+ multidevice_setup_client_->AddObserver(this);
+ registry()->AddSearchTags(GetMultiDeviceSearchConcepts());
+ OnHostStatusChanged(multidevice_setup_client_->GetHostStatus());
+}
+
+MultiDeviceSection::~MultiDeviceSection() {
+ if (multidevice_setup_client_)
+ multidevice_setup_client_->RemoveObserver(this);
+}
+
+void MultiDeviceSection::AddLoadTimeData(
+ content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"multidevicePageTitle", IDS_SETTINGS_MULTIDEVICE},
+ {"multideviceSetupButton", IDS_SETTINGS_MULTIDEVICE_SETUP_BUTTON},
+ {"multideviceVerifyButton", IDS_SETTINGS_MULTIDEVICE_VERIFY_BUTTON},
+ {"multideviceSetupItemHeading",
+ IDS_SETTINGS_MULTIDEVICE_SETUP_ITEM_HEADING},
+ {"multideviceEnabled", IDS_SETTINGS_MULTIDEVICE_ENABLED},
+ {"multideviceDisabled", IDS_SETTINGS_MULTIDEVICE_DISABLED},
+ {"multideviceSmartLockItemTitle", IDS_SETTINGS_EASY_UNLOCK_SECTION_TITLE},
+ {"multideviceInstantTetheringItemTitle",
+ IDS_SETTINGS_MULTIDEVICE_INSTANT_TETHERING},
+ {"multideviceInstantTetheringItemSummary",
+ IDS_SETTINGS_MULTIDEVICE_INSTANT_TETHERING_SUMMARY},
+ {"multideviceAndroidMessagesItemTitle",
+ IDS_SETTINGS_MULTIDEVICE_ANDROID_MESSAGES},
+ {"multideviceForgetDevice", IDS_SETTINGS_MULTIDEVICE_FORGET_THIS_DEVICE},
+ {"multideviceSmartLockOptions",
+ IDS_SETTINGS_PEOPLE_LOCK_SCREEN_OPTIONS_LOCK},
+ {"multideviceForgetDeviceDisconnect",
+ IDS_SETTINGS_MULTIDEVICE_FORGET_THIS_DEVICE_DISCONNECT},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ html_source->AddBoolean(
+ "multideviceAllowedByPolicy",
+ chromeos::multidevice_setup::AreAnyMultiDeviceFeaturesAllowed(
+ profile()->GetPrefs()));
+
+ html_source->AddString(
+ "multideviceForgetDeviceSummary",
+ ui::SubstituteChromeOSDeviceType(
+ IDS_SETTINGS_MULTIDEVICE_FORGET_THIS_DEVICE_EXPLANATION));
+ html_source->AddString(
+ "multideviceForgetDeviceDialogMessage",
+ ui::SubstituteChromeOSDeviceType(
+ IDS_SETTINGS_MULTIDEVICE_FORGET_DEVICE_DIALOG_MESSAGE));
+ html_source->AddString(
+ "multideviceVerificationText",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_MULTIDEVICE_VERIFICATION_TEXT,
+ base::UTF8ToUTF16(
+ multidevice_setup::
+ GetBoardSpecificBetterTogetherSuiteLearnMoreUrl()
+ .spec())));
+ html_source->AddString(
+ "multideviceSetupSummary",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_MULTIDEVICE_SETUP_SUMMARY, ui::GetChromeOSDeviceName(),
+ base::UTF8ToUTF16(
+ multidevice_setup::
+ GetBoardSpecificBetterTogetherSuiteLearnMoreUrl()
+ .spec())));
+ html_source->AddString(
+ "multideviceNoHostText",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_MULTIDEVICE_NO_ELIGIBLE_HOSTS,
+ base::UTF8ToUTF16(
+ multidevice_setup::
+ GetBoardSpecificBetterTogetherSuiteLearnMoreUrl()
+ .spec())));
+ html_source->AddString(
+ "multideviceAndroidMessagesItemSummary",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_MULTIDEVICE_ANDROID_MESSAGES_SUMMARY,
+ ui::GetChromeOSDeviceName(),
+ base::UTF8ToUTF16(
+ multidevice_setup::GetBoardSpecificMessagesLearnMoreUrl()
+ .spec())));
+ html_source->AddString(
+ "multideviceSmartLockItemSummary",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_MULTIDEVICE_SMART_LOCK_SUMMARY,
+ ui::GetChromeOSDeviceName(),
+ GetHelpUrlWithBoard(chrome::kEasyUnlockLearnMoreUrl)));
+
+ AddEasyUnlockStrings(html_source);
+}
+
+void MultiDeviceSection::AddHandlers(content::WebUI* web_ui) {
+ // No handlers in guest mode.
+ if (profile()->IsGuestSession())
+ return;
+
+ web_ui->AddMessageHandler(
+ std::make_unique<chromeos::settings::MultideviceHandler>(
+ pref_service_, multidevice_setup_client_,
+ android_sms_service_
+ ? android_sms_service_->android_sms_pairing_state_tracker()
+ : nullptr,
+ android_sms_service_ ? android_sms_service_->android_sms_app_manager()
+ : nullptr));
+}
+
+void MultiDeviceSection::OnHostStatusChanged(
+ const multidevice_setup::MultiDeviceSetupClient::HostStatusWithDevice&
+ host_status_with_device) {
+ if (IsOptedIn(host_status_with_device.first)) {
+ registry()->RemoveSearchTags(GetMultiDeviceOptedOutSearchConcepts());
+ registry()->AddSearchTags(GetMultiDeviceOptedInSearchConcepts());
+ } else {
+ registry()->RemoveSearchTags(GetMultiDeviceOptedInSearchConcepts());
+ registry()->AddSearchTags(GetMultiDeviceOptedOutSearchConcepts());
+ }
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/multidevice_section.h b/chromium/chrome/browser/ui/webui/settings/chromeos/multidevice_section.h
new file mode 100644
index 00000000000..d35711a2c9d
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/multidevice_section.h
@@ -0,0 +1,60 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_MULTIDEVICE_SECTION_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_MULTIDEVICE_SECTION_H_
+
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h"
+#include "chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client.h"
+
+class PrefService;
+
+namespace content {
+class WebUIDataSource;
+} // namespace content
+
+namespace chromeos {
+
+namespace android_sms {
+class AndroidSmsService;
+} // namespace android_sms
+
+namespace settings {
+
+class SearchTagRegistry;
+
+// Provides UI strings and search tags for MultiDevice settings. Different
+// search tags are registered depending on whether MultiDevice features are
+// allowed and whether the user has opted into the suite of features.
+class MultiDeviceSection
+ : public OsSettingsSection,
+ public multidevice_setup::MultiDeviceSetupClient::Observer {
+ public:
+ MultiDeviceSection(
+ Profile* profile,
+ SearchTagRegistry* search_tag_registry,
+ multidevice_setup::MultiDeviceSetupClient* multidevice_setup_client,
+ android_sms::AndroidSmsService* android_sms_service,
+ PrefService* pref_service);
+ ~MultiDeviceSection() override;
+
+ private:
+ // OsSettingsSection:
+ void AddLoadTimeData(content::WebUIDataSource* html_source) override;
+ void AddHandlers(content::WebUI* web_ui) override;
+
+ // multidevice_setup::MultiDeviceSetupClient::Observer:
+ void OnHostStatusChanged(
+ const multidevice_setup::MultiDeviceSetupClient::HostStatusWithDevice&
+ host_status_with_device) override;
+
+ multidevice_setup::MultiDeviceSetupClient* multidevice_setup_client_;
+ android_sms::AndroidSmsService* android_sms_service_;
+ PrefService* pref_service_;
+};
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_MULTIDEVICE_SECTION_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.cc
new file mode 100644
index 00000000000..961505560e9
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.cc
@@ -0,0 +1,57 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.h"
+
+#include "base/feature_list.h"
+#include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/policy/profile_policy_connector.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chromeos/constants/chromeos_features.h"
+#include "components/arc/arc_features.h"
+#include "components/user_manager/user_manager.h"
+
+namespace chromeos {
+namespace settings {
+namespace features {
+
+bool IsGuestModeActive() {
+ return user_manager::UserManager::Get()->IsLoggedInAsGuest() ||
+ user_manager::UserManager::Get()->IsLoggedInAsPublicAccount();
+}
+
+bool ShouldShowParentalControlSettings(const Profile* profile) {
+ if (!chromeos::features::IsParentalControlsSettingsEnabled())
+ return false;
+
+ // Not shown for secondary users.
+ if (profile != ProfileManager::GetPrimaryUserProfile())
+ return false;
+
+ // Also not shown for guest sessions.
+ if (profile->IsGuestSession())
+ return false;
+
+ // Settings are for Family Link, not legacy parental controls
+ if (profile->IsLegacySupervised())
+ return false;
+
+ return profile->IsChild() ||
+ !profile->GetProfilePolicyConnector()->IsManaged();
+}
+
+bool ShouldShowExternalStorageSettings(const Profile* profile) {
+ return base::FeatureList::IsEnabled(arc::kUsbStorageUIFeature) &&
+ arc::IsArcPlayStoreEnabledForProfile(profile);
+}
+
+bool ShouldShowDlcSettings() {
+ return !IsGuestModeActive() &&
+ base::FeatureList::IsEnabled(chromeos::features::kDlcSettingsUi);
+}
+
+} // namespace features
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.h b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.h
new file mode 100644
index 00000000000..33da01f6065
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.h
@@ -0,0 +1,31 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_OS_SETTINGS_FEATURES_UTIL_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_OS_SETTINGS_FEATURES_UTIL_H_
+
+class Profile;
+
+namespace chromeos {
+namespace settings {
+namespace features {
+
+bool IsGuestModeActive();
+
+// Determines whether the Parental Controls section of People settings should be
+// shown for |profile|.
+bool ShouldShowParentalControlSettings(const Profile* profile);
+
+// Determines whether the External Storage section of Device settings should be
+// shown for |profile|.
+bool ShouldShowExternalStorageSettings(const Profile* profile);
+
+// Determines whether the DLC section of Storage settings should be shown.
+bool ShouldShowDlcSettings();
+
+} // namespace features
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_OS_SETTINGS_FEATURES_UTIL_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.cc
deleted file mode 100644
index 653188ccf20..00000000000
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.cc
+++ /dev/null
@@ -1,2136 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.h"
-
-#include "ash/public/cpp/ash_features.h"
-#include "ash/public/mojom/assistant_state_controller.mojom.h"
-#include "base/command_line.h"
-#include "base/feature_list.h"
-#include "base/i18n/number_formatting.h"
-#include "base/no_destructor.h"
-#include "base/strings/strcat.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/system/sys_info.h"
-#include "build/branding_buildflags.h"
-#include "build/build_config.h"
-#include "build/buildflag.h"
-#include "chrome/browser/browser_process.h"
-#include "chrome/browser/browser_process_platform_part.h"
-#include "chrome/browser/chromeos/account_manager/account_manager_util.h"
-#include "chrome/browser/chromeos/arc/arc_util.h"
-#include "chrome/browser/chromeos/assistant/assistant_util.h"
-#include "chrome/browser/chromeos/crostini/crostini_features.h"
-#include "chrome/browser/chromeos/crostini/crostini_util.h"
-#include "chrome/browser/chromeos/kerberos/kerberos_credentials_manager.h"
-#include "chrome/browser/chromeos/login/quick_unlock/quick_unlock_utils.h"
-#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
-#include "chrome/browser/chromeos/profiles/profile_helper.h"
-#include "chrome/browser/policy/profile_policy_connector.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/supervised_user/supervised_user_service.h"
-#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
-#include "chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.h"
-#include "chrome/browser/ui/webui/chromeos/bluetooth_dialog_localized_strings_provider.h"
-#include "chrome/browser/ui/webui/chromeos/network_element_localized_strings_provider.h"
-#include "chrome/browser/ui/webui/chromeos/smb_shares/smb_shares_localized_strings_provider.h"
-#include "chrome/browser/ui/webui/management_ui.h"
-#include "chrome/browser/ui/webui/policy_indicator_localized_strings_provider.h"
-#include "chrome/browser/ui/webui/settings/chromeos/internet_strings_provider.h"
-#include "chrome/browser/ui/webui/settings/chromeos/search/search_concept.h"
-#include "chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.h"
-#include "chrome/browser/ui/webui/webui_util.h"
-#include "chrome/common/chrome_features.h"
-#include "chrome/common/pref_names.h"
-#include "chrome/common/url_constants.h"
-#include "chrome/common/webui_url_constants.h"
-#include "chrome/grit/chromium_strings.h"
-#include "chrome/grit/generated_resources.h"
-#include "chrome/grit/locale_settings.h"
-#include "chrome/services/local_search_service/public/mojom/types.mojom.h"
-#include "chromeos/constants/chromeos_features.h"
-#include "chromeos/constants/chromeos_switches.h"
-#include "chromeos/services/assistant/public/features.h"
-#include "chromeos/services/multidevice_setup/public/cpp/url_provider.h"
-#include "chromeos/strings/grit/chromeos_strings.h"
-#include "components/google/core/common/google_util.h"
-#include "components/prefs/pref_service.h"
-#include "components/strings/grit/components_strings.h"
-#include "components/version_ui/version_ui_constants.h"
-#include "content/public/browser/web_ui_data_source.h"
-#include "content/public/common/content_features.h"
-#include "content/public/common/content_switches.h"
-#include "device/bluetooth/strings/grit/bluetooth_strings.h"
-#include "media/base/media_switches.h"
-#include "ui/accessibility/accessibility_switches.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/webui/web_ui_util.h"
-#include "ui/chromeos/devicetype_utils.h"
-#include "ui/chromeos/events/keyboard_layout_util.h"
-#include "ui/display/display_features.h"
-#include "ui/display/display_switches.h"
-#include "ui/display/manager/touch_device_manager.h"
-
-namespace chromeos {
-namespace settings {
-namespace {
-
-std::vector<local_search_service::mojom::DataPtr> ConceptVectorToDataPtrVector(
- const std::vector<SearchConcept>& tags_group) {
- std::vector<local_search_service::mojom::DataPtr> data_list;
-
- for (const auto& concept : tags_group) {
- std::vector<base::string16> search_tags;
-
- // Add the canonical tag.
- search_tags.push_back(
- l10n_util::GetStringUTF16(concept.canonical_message_id));
-
- // Add all alternate tags.
- for (size_t i = 0; i < SearchConcept::kMaxAltTagsPerConcept; ++i) {
- int curr_alt_tag = concept.alt_tag_ids[i];
- if (curr_alt_tag == SearchConcept::kAltTagEnd)
- break;
- search_tags.push_back(l10n_util::GetStringUTF16(curr_alt_tag));
- }
-
- // Note: A stringified version of the canonical tag message ID is used as
- // the identifier for this search data.
- data_list.push_back(local_search_service::mojom::Data::New(
- base::NumberToString(concept.canonical_message_id), search_tags));
- }
-
- return data_list;
-}
-
-// Generates a Google Help URL which includes a "board type" parameter. Some
-// help pages need to be adjusted depending on the type of CrOS device that is
-// accessing the page.
-base::string16 GetHelpUrlWithBoard(const std::string& original_url) {
- return base::ASCIIToUTF16(original_url +
- "&b=" + base::SysInfo::GetLsbReleaseBoard());
-}
-
-bool IsDeviceManaged() {
- policy::BrowserPolicyConnectorChromeOS* connector =
- g_browser_process->platform_part()->browser_policy_connector_chromeos();
- return connector->IsEnterpriseManaged();
-}
-
-bool IsProfileManaged(Profile* profile) {
- return profile->GetProfilePolicyConnector()->IsManaged();
-}
-
-void AddCommonStrings(content::WebUIDataSource* html_source, Profile* profile) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"add", IDS_ADD},
- {"advancedPageTitle", IDS_SETTINGS_ADVANCED},
- {"back", IDS_ACCNAME_BACK},
- {"basicPageTitle", IDS_SETTINGS_BASIC},
- {"cancel", IDS_CANCEL},
- {"clear", IDS_SETTINGS_CLEAR},
- {"close", IDS_CLOSE},
- {"confirm", IDS_CONFIRM},
- {"continue", IDS_SETTINGS_CONTINUE},
- {"controlledByExtension", IDS_SETTINGS_CONTROLLED_BY_EXTENSION},
- {"custom", IDS_SETTINGS_CUSTOM},
- {"delete", IDS_SETTINGS_DELETE},
- {"deviceOff", IDS_SETTINGS_DEVICE_OFF},
- {"deviceOn", IDS_SETTINGS_DEVICE_ON},
- {"disable", IDS_DISABLE},
- {"done", IDS_DONE},
- {"edit", IDS_SETTINGS_EDIT},
- {"extensionsLinkTooltip", IDS_SETTINGS_MENU_EXTENSIONS_LINK_TOOLTIP},
- {"learnMore", IDS_LEARN_MORE},
- {"menu", IDS_MENU},
- {"menuButtonLabel", IDS_SETTINGS_MENU_BUTTON_LABEL},
- {"moreActions", IDS_SETTINGS_MORE_ACTIONS},
- {"ok", IDS_OK},
- {"restart", IDS_SETTINGS_RESTART},
- {"save", IDS_SAVE},
- {"searchResultBubbleText", IDS_SEARCH_RESULT_BUBBLE_TEXT},
- {"searchResultsBubbleText", IDS_SEARCH_RESULTS_BUBBLE_TEXT},
- {"settings", IDS_SETTINGS_SETTINGS},
- {"settingsAltPageTitle", IDS_SETTINGS_ALT_PAGE_TITLE},
- {"subpageArrowRoleDescription", IDS_SETTINGS_SUBPAGE_BUTTON},
- {"notValidWebAddress", IDS_SETTINGS_NOT_VALID_WEB_ADDRESS},
- {"notValidWebAddressForContentType",
- IDS_SETTINGS_NOT_VALID_WEB_ADDRESS_FOR_CONTENT_TYPE},
-
- // Common font related strings shown in a11y and appearance sections.
- {"quickBrownFox", IDS_SETTINGS_QUICK_BROWN_FOX},
- {"verySmall", IDS_SETTINGS_VERY_SMALL_FONT},
- {"small", IDS_SETTINGS_SMALL_FONT},
- {"medium", IDS_SETTINGS_MEDIUM_FONT},
- {"large", IDS_SETTINGS_LARGE_FONT},
- {"veryLarge", IDS_SETTINGS_VERY_LARGE_FONT},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-
- html_source->AddBoolean(
- "isGuest",
- user_manager::UserManager::Get()->IsLoggedInAsGuest() ||
- user_manager::UserManager::Get()->IsLoggedInAsPublicAccount());
-
- html_source->AddBoolean("isSupervised", profile->IsSupervised());
-}
-
-void AddA11yStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"a11yPageTitle", IDS_SETTINGS_ACCESSIBILITY},
- {"a11yWebStore", IDS_SETTINGS_ACCESSIBILITY_WEB_STORE},
- {"moreFeaturesLinkDescription",
- IDS_SETTINGS_MORE_FEATURES_LINK_DESCRIPTION},
- {"accessibleImageLabelsTitle",
- IDS_SETTINGS_ACCESSIBLE_IMAGE_LABELS_TITLE},
- {"accessibleImageLabelsSubtitle",
- IDS_SETTINGS_ACCESSIBLE_IMAGE_LABELS_SUBTITLE},
- {"settingsSliderRoleDescription",
- IDS_SETTINGS_SLIDER_MIN_MAX_ARIA_ROLE_DESCRIPTION},
- {"manageAccessibilityFeatures",
- IDS_SETTINGS_ACCESSIBILITY_MANAGE_ACCESSIBILITY_FEATURES},
- {"optionsInMenuLabel", IDS_SETTINGS_OPTIONS_IN_MENU_LABEL},
- {"largeMouseCursorLabel", IDS_SETTINGS_LARGE_MOUSE_CURSOR_LABEL},
- {"largeMouseCursorSizeLabel", IDS_SETTINGS_LARGE_MOUSE_CURSOR_SIZE_LABEL},
- {"largeMouseCursorSizeDefaultLabel",
- IDS_SETTINGS_LARGE_MOUSE_CURSOR_SIZE_DEFAULT_LABEL},
- {"largeMouseCursorSizeLargeLabel",
- IDS_SETTINGS_LARGE_MOUSE_CURSOR_SIZE_LARGE_LABEL},
- {"highContrastLabel", IDS_SETTINGS_HIGH_CONTRAST_LABEL},
- {"stickyKeysLabel", IDS_SETTINGS_STICKY_KEYS_LABEL},
- {"chromeVoxLabel", IDS_SETTINGS_CHROMEVOX_LABEL},
- {"chromeVoxOptionsLabel", IDS_SETTINGS_CHROMEVOX_OPTIONS_LABEL},
- {"screenMagnifierLabel", IDS_SETTINGS_SCREEN_MAGNIFIER_LABEL},
- {"screenMagnifierZoomLabel", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_LABEL},
- {"dockedMagnifierLabel", IDS_SETTINGS_DOCKED_MAGNIFIER_LABEL},
- {"dockedMagnifierZoomLabel", IDS_SETTINGS_DOCKED_MAGNIFIER_ZOOM_LABEL},
- {"screenMagnifierZoom2x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_2_X},
- {"screenMagnifierZoom4x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_4_X},
- {"screenMagnifierZoom6x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_6_X},
- {"screenMagnifierZoom8x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_8_X},
- {"screenMagnifierZoom10x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_10_X},
- {"screenMagnifierZoom12x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_12_X},
- {"screenMagnifierZoom14x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_14_X},
- {"screenMagnifierZoom16x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_16_X},
- {"screenMagnifierZoom18x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_18_X},
- {"screenMagnifierZoom20x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_20_X},
- {"tapDraggingLabel", IDS_SETTINGS_TAP_DRAGGING_LABEL},
- {"clickOnStopLabel", IDS_SETTINGS_CLICK_ON_STOP_LABEL},
- {"delayBeforeClickLabel", IDS_SETTINGS_DELAY_BEFORE_CLICK_LABEL},
- {"delayBeforeClickExtremelyShort",
- IDS_SETTINGS_DELAY_BEFORE_CLICK_EXTREMELY_SHORT},
- {"delayBeforeClickVeryShort", IDS_SETTINGS_DELAY_BEFORE_CLICK_VERY_SHORT},
- {"delayBeforeClickShort", IDS_SETTINGS_DELAY_BEFORE_CLICK_SHORT},
- {"delayBeforeClickLong", IDS_SETTINGS_DELAY_BEFORE_CLICK_LONG},
- {"delayBeforeClickVeryLong", IDS_SETTINGS_DELAY_BEFORE_CLICK_VERY_LONG},
- {"autoclickRevertToLeftClick",
- IDS_SETTINGS_AUTOCLICK_REVERT_TO_LEFT_CLICK},
- {"autoclickStabilizeCursorPosition",
- IDS_SETTINGS_AUTOCLICK_STABILIZE_CURSOR_POSITION},
- {"autoclickMovementThresholdLabel",
- IDS_SETTINGS_AUTOCLICK_MOVEMENT_THRESHOLD_LABEL},
- {"autoclickMovementThresholdExtraSmall",
- IDS_SETTINGS_AUTOCLICK_MOVEMENT_THRESHOLD_EXTRA_SMALL},
- {"autoclickMovementThresholdSmall",
- IDS_SETTINGS_AUTOCLICK_MOVEMENT_THRESHOLD_SMALL},
- {"autoclickMovementThresholdDefault",
- IDS_SETTINGS_AUTOCLICK_MOVEMENT_THRESHOLD_DEFAULT},
- {"autoclickMovementThresholdLarge",
- IDS_SETTINGS_AUTOCLICK_MOVEMENT_THRESHOLD_LARGE},
- {"autoclickMovementThresholdExtraLarge",
- IDS_SETTINGS_AUTOCLICK_MOVEMENT_THRESHOLD_EXTRA_LARGE},
- {"dictationDescription",
- IDS_SETTINGS_ACCESSIBILITY_DICTATION_DESCRIPTION},
- {"dictationLabel", IDS_SETTINGS_ACCESSIBILITY_DICTATION_LABEL},
- {"onScreenKeyboardLabel", IDS_SETTINGS_ON_SCREEN_KEYBOARD_LABEL},
- {"monoAudioLabel", IDS_SETTINGS_MONO_AUDIO_LABEL},
- {"startupSoundLabel", IDS_SETTINGS_STARTUP_SOUND_LABEL},
- {"a11yExplanation", IDS_SETTINGS_ACCESSIBILITY_EXPLANATION},
- {"caretHighlightLabel",
- IDS_SETTINGS_ACCESSIBILITY_CARET_HIGHLIGHT_DESCRIPTION},
- {"cursorHighlightLabel",
- IDS_SETTINGS_ACCESSIBILITY_CURSOR_HIGHLIGHT_DESCRIPTION},
- {"focusHighlightLabel",
- IDS_SETTINGS_ACCESSIBILITY_FOCUS_HIGHLIGHT_DESCRIPTION},
- {"selectToSpeakTitle", IDS_SETTINGS_ACCESSIBILITY_SELECT_TO_SPEAK_TITLE},
- {"selectToSpeakDisabledDescription",
- IDS_SETTINGS_ACCESSIBILITY_SELECT_TO_SPEAK_DISABLED_DESCRIPTION},
- {"selectToSpeakDescription",
- IDS_SETTINGS_ACCESSIBILITY_SELECT_TO_SPEAK_DESCRIPTION},
- {"selectToSpeakDescriptionWithoutKeyboard",
- IDS_SETTINGS_ACCESSIBILITY_SELECT_TO_SPEAK_DESCRIPTION_WITHOUT_KEYBOARD},
- {"selectToSpeakOptionsLabel",
- IDS_SETTINGS_ACCESSIBILITY_SELECT_TO_SPEAK_OPTIONS_LABEL},
- {"switchAccessLabel",
- IDS_SETTINGS_ACCESSIBILITY_SWITCH_ACCESS_DESCRIPTION},
- {"switchAccessOptionsLabel",
- IDS_SETTINGS_ACCESSIBILITY_SWITCH_ACCESS_OPTIONS_LABEL},
- {"manageSwitchAccessSettings",
- IDS_SETTINGS_MANAGE_SWITCH_ACCESS_SETTINGS},
- {"switchAssignmentHeading", IDS_SETTINGS_SWITCH_ASSIGNMENT_HEADING},
- {"switchAssignOptionNone", IDS_SETTINGS_SWITCH_ASSIGN_OPTION_NONE},
- {"switchAssignOptionSpace", IDS_SETTINGS_SWITCH_ASSIGN_OPTION_SPACE},
- {"switchAssignOptionEnter", IDS_SETTINGS_SWITCH_ASSIGN_OPTION_ENTER},
- {"assignSelectSwitchLabel", IDS_SETTINGS_ASSIGN_SELECT_SWITCH_LABEL},
- {"assignNextSwitchLabel", IDS_SETTINGS_ASSIGN_NEXT_SWITCH_LABEL},
- {"assignPreviousSwitchLabel", IDS_SETTINGS_ASSIGN_PREVIOUS_SWITCH_LABEL},
- {"switchAccessAutoScanHeading",
- IDS_SETTINGS_SWITCH_ACCESS_AUTO_SCAN_HEADING},
- {"switchAccessAutoScanLabel", IDS_SETTINGS_SWITCH_ACCESS_AUTO_SCAN_LABEL},
- {"switchAccessAutoScanSpeedLabel",
- IDS_SETTINGS_SWITCH_ACCESS_AUTO_SCAN_SPEED_LABEL},
- {"switchAccessAutoScanKeyboardSpeedLabel",
- IDS_SETTINGS_SWITCH_ACCESS_AUTO_SCAN_KEYBOARD_SPEED_LABEL},
- {"durationInSeconds", IDS_SETTINGS_DURATION_IN_SECONDS},
- {"manageAccessibilityFeatures",
- IDS_SETTINGS_ACCESSIBILITY_MANAGE_ACCESSIBILITY_FEATURES},
- {"textToSpeechHeading",
- IDS_SETTINGS_ACCESSIBILITY_TEXT_TO_SPEECH_HEADING},
- {"displayHeading", IDS_SETTINGS_ACCESSIBILITY_DISPLAY_HEADING},
- {"displaySettingsTitle",
- IDS_SETTINGS_ACCESSIBILITY_DISPLAY_SETTINGS_TITLE},
- {"displaySettingsDescription",
- IDS_SETTINGS_ACCESSIBILITY_DISPLAY_SETTINGS_DESCRIPTION},
- {"appearanceSettingsTitle",
- IDS_SETTINGS_ACCESSIBILITY_APPEARANCE_SETTINGS_TITLE},
- {"appearanceSettingsDescription",
- IDS_SETTINGS_ACCESSIBILITY_APPEARANCE_SETTINGS_DESCRIPTION},
- {"keyboardAndTextInputHeading",
- IDS_SETTINGS_ACCESSIBILITY_KEYBOARD_AND_TEXT_INPUT_HEADING},
- {"keyboardSettingsTitle",
- IDS_SETTINGS_ACCESSIBILITY_KEYBOARD_SETTINGS_TITLE},
- {"keyboardSettingsDescription",
- IDS_SETTINGS_ACCESSIBILITY_KEYBOARD_SETTINGS_DESCRIPTION},
- {"mouseAndTouchpadHeading",
- IDS_SETTINGS_ACCESSIBILITY_MOUSE_AND_TOUCHPAD_HEADING},
- {"mouseSettingsTitle", IDS_SETTINGS_ACCESSIBILITY_MOUSE_SETTINGS_TITLE},
- {"mouseSettingsDescription",
- IDS_SETTINGS_ACCESSIBILITY_MOUSE_SETTINGS_DESCRIPTION},
- {"audioAndCaptionsHeading",
- IDS_SETTINGS_ACCESSIBILITY_AUDIO_AND_CAPTIONS_HEADING},
- {"additionalFeaturesTitle",
- IDS_SETTINGS_ACCESSIBILITY_ADDITIONAL_FEATURES_TITLE},
- {"manageTtsSettings", IDS_SETTINGS_MANAGE_TTS_SETTINGS},
- {"ttsSettingsLinkDescription", IDS_SETTINGS_TTS_LINK_DESCRIPTION},
- {"textToSpeechVoices", IDS_SETTINGS_TEXT_TO_SPEECH_VOICES},
- {"textToSpeechNoVoicesMessage",
- IDS_SETTINGS_TEXT_TO_SPEECH_NO_VOICES_MESSAGE},
- {"textToSpeechMoreLanguages", IDS_SETTINGS_TEXT_TO_SPEECH_MORE_LANGUAGES},
- {"textToSpeechProperties", IDS_SETTINGS_TEXT_TO_SPEECH_PROPERTIES},
- {"textToSpeechRate", IDS_SETTINGS_TEXT_TO_SPEECH_RATE},
- {"textToSpeechRateMinimumLabel",
- IDS_SETTINGS_TEXT_TO_SPEECH_RATE_MINIMUM_LABEL},
- {"textToSpeechRateMaximumLabel",
- IDS_SETTINGS_TEXT_TO_SPEECH_RATE_MAXIMUM_LABEL},
- {"textToSpeechPitch", IDS_SETTINGS_TEXT_TO_SPEECH_PITCH},
- {"textToSpeechPitchMinimumLabel",
- IDS_SETTINGS_TEXT_TO_SPEECH_PITCH_MINIMUM_LABEL},
- {"textToSpeechPitchMaximumLabel",
- IDS_SETTINGS_TEXT_TO_SPEECH_PITCH_MAXIMUM_LABEL},
- {"textToSpeechVolume", IDS_SETTINGS_TEXT_TO_SPEECH_VOLUME},
- {"textToSpeechVolumeMinimumLabel",
- IDS_SETTINGS_TEXT_TO_SPEECH_VOLUME_MINIMUM_LABEL},
- {"textToSpeechVolumeMaximumLabel",
- IDS_SETTINGS_TEXT_TO_SPEECH_VOLUME_MAXIMUM_LABEL},
- {"percentage", IDS_SETTINGS_PERCENTAGE},
- {"defaultPercentage", IDS_SETTINGS_DEFAULT_PERCENTAGE},
- {"textToSpeechPreviewHeading",
- IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_HEADING},
- {"textToSpeechPreviewInputLabel",
- IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_INPUT_LABEL},
- {"textToSpeechPreviewInput", IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_INPUT},
- {"textToSpeechPreviewVoice", IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_VOICE},
- {"textToSpeechPreviewPlay", IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_PLAY},
- {"textToSpeechEngines", IDS_SETTINGS_TEXT_TO_SPEECH_ENGINES},
- {"tabletModeShelfNavigationButtonsSettingLabel",
- IDS_SETTINGS_A11Y_TABLET_MODE_SHELF_BUTTONS_LABEL},
- {"tabletModeShelfNavigationButtonsSettingDescription",
- IDS_SETTINGS_A11Y_TABLET_MODE_SHELF_BUTTONS_DESCRIPTION},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-
- html_source->AddString("accountManagerLearnMoreUrl",
- chrome::kAccountManagerLearnMoreURL);
- html_source->AddString("a11yLearnMoreUrl",
- chrome::kChromeAccessibilityHelpURL);
-
- base::CommandLine& cmd = *base::CommandLine::ForCurrentProcess();
- html_source->AddBoolean(
- "showExperimentalAccessibilitySwitchAccess",
- cmd.HasSwitch(::switches::kEnableExperimentalAccessibilitySwitchAccess));
-
- html_source->AddBoolean(
- "showExperimentalAccessibilitySwitchAccessImprovedTextInput",
- cmd.HasSwitch(
- ::switches::kEnableExperimentalAccessibilitySwitchAccessText));
-
- html_source->AddBoolean("showExperimentalA11yLabels",
- base::FeatureList::IsEnabled(
- ::features::kExperimentalAccessibilityLabels));
-
- html_source->AddBoolean(
- "showTabletModeShelfNavigationButtonsSettings",
- ash::features::IsHideShelfControlsInTabletModeEnabled());
-
- html_source->AddString("tabletModeShelfNavigationButtonsLearnMoreUrl",
- chrome::kTabletModeGesturesLearnMoreURL);
-
- html_source->AddBoolean("enableLiveCaption",
- base::FeatureList::IsEnabled(media::kLiveCaption));
-
- ::settings::AddCaptionSubpageStrings(html_source);
-}
-
-void AddLanguagesStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"orderLanguagesInstructions",
- IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_ORDERING_INSTRUCTIONS},
- {"osLanguagesPageTitle", IDS_OS_SETTINGS_LANGUAGES_AND_INPUT_PAGE_TITLE},
- {"osLanguagesListTitle", IDS_OS_SETTINGS_LANGUAGES_LIST_TITLE},
- {"inputMethodsListTitle",
- IDS_SETTINGS_LANGUAGES_INPUT_METHODS_LIST_TITLE},
- {"inputMethodEnabled", IDS_SETTINGS_LANGUAGES_INPUT_METHOD_ENABLED},
- {"inputMethodsExpandA11yLabel",
- IDS_SETTINGS_LANGUAGES_INPUT_METHODS_EXPAND_ACCESSIBILITY_LABEL},
- {"inputMethodsManagedbyPolicy",
- IDS_SETTINGS_LANGUAGES_INPUT_METHODS_MANAGED_BY_POLICY},
- {"manageInputMethods", IDS_SETTINGS_LANGUAGES_INPUT_METHODS_MANAGE},
- {"manageInputMethodsPageTitle",
- IDS_SETTINGS_LANGUAGES_MANAGE_INPUT_METHODS_TITLE},
- {"showImeMenu", IDS_SETTINGS_LANGUAGES_SHOW_IME_MENU},
- {"displayLanguageRestart",
- IDS_SETTINGS_LANGUAGES_RESTART_TO_DISPLAY_LANGUAGE},
- {"moveDown", IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_MOVE_DOWN},
- {"displayInThisLanguage",
- IDS_SETTINGS_LANGUAGES_DISPLAY_IN_THIS_LANGUAGE},
- {"searchLanguages", IDS_SETTINGS_LANGUAGE_SEARCH},
- {"addLanguagesDialogTitle",
- IDS_SETTINGS_LANGUAGES_MANAGE_LANGUAGES_TITLE},
- {"moveToTop", IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_MOVE_TO_TOP},
- {"isDisplayedInThisLanguage",
- IDS_SETTINGS_LANGUAGES_IS_DISPLAYED_IN_THIS_LANGUAGE},
- {"removeLanguage", IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_REMOVE},
- {"addLanguages", IDS_SETTINGS_LANGUAGES_LANGUAGES_ADD},
- {"moveUp", IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_MOVE_UP},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-
- html_source->AddString(
- "languagesLearnMoreURL",
- base::ASCIIToUTF16(chrome::kLanguageSettingsLearnMoreUrl));
-}
-
-void AddPersonalizationStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"ambientModeTitle", IDS_OS_SETTINGS_AMBIENT_MODE_TITLE},
- {"ambientModeEnabled", IDS_OS_SETTINGS_AMBIENT_MODE_ENABLED},
- {"ambientModeDisabled", IDS_OS_SETTINGS_AMBIENT_MODE_DISABLED},
- {"ambientModeOn", IDS_OS_SETTINGS_AMBIENT_MODE_ON},
- {"ambientModeOff", IDS_OS_SETTINGS_AMBIENT_MODE_OFF},
- {"ambientModeTopicSourceTitle",
- IDS_OS_SETTINGS_AMBIENT_MODE_TOPIC_SOURCE_TITLE},
- {"ambientModeTopicSourceGooglePhotos",
- IDS_OS_SETTINGS_AMBIENT_MODE_TOPIC_SOURCE_GOOGLE_PHOTOS},
- {"ambientModeTopicSourceArtGallery",
- IDS_OS_SETTINGS_AMBIENT_MODE_TOPIC_SOURCE_ART_GALLERY},
- {"changePictureTitle", IDS_OS_SETTINGS_CHANGE_PICTURE_TITLE},
- {"openWallpaperApp", IDS_OS_SETTINGS_OPEN_WALLPAPER_APP},
- {"personalizationPageTitle", IDS_OS_SETTINGS_PERSONALIZATION},
- {"setWallpaper", IDS_OS_SETTINGS_SET_WALLPAPER},
- {"takePhoto", IDS_SETTINGS_CHANGE_PICTURE_TAKE_PHOTO},
- {"captureVideo", IDS_SETTINGS_CHANGE_PICTURE_CAPTURE_VIDEO},
- {"discardPhoto", IDS_SETTINGS_CHANGE_PICTURE_DISCARD_PHOTO},
- {"previewAltText", IDS_SETTINGS_CHANGE_PICTURE_PREVIEW_ALT},
- {"switchModeToVideo", IDS_SETTINGS_CHANGE_PICTURE_SWITCH_MODE_TO_VIDEO},
- {"profilePhoto", IDS_SETTINGS_CHANGE_PICTURE_PROFILE_PHOTO},
- {"changePicturePageDescription", IDS_SETTINGS_CHANGE_PICTURE_DIALOG_TEXT},
- {"switchModeToCamera", IDS_SETTINGS_CHANGE_PICTURE_SWITCH_MODE_TO_CAMERA},
- {"chooseFile", IDS_SETTINGS_CHANGE_PICTURE_CHOOSE_FILE},
- {"oldPhoto", IDS_SETTINGS_CHANGE_PICTURE_OLD_PHOTO},
- {"oldVideo", IDS_SETTINGS_CHANGE_PICTURE_OLD_VIDEO},
- {"authorCreditText", IDS_SETTINGS_CHANGE_PICTURE_AUTHOR_CREDIT_TEXT},
- {"photoCaptureAccessibleText",
- IDS_SETTINGS_PHOTO_CAPTURE_ACCESSIBLE_TEXT},
- {"photoDiscardAccessibleText",
- IDS_SETTINGS_PHOTO_DISCARD_ACCESSIBLE_TEXT},
- {"photoModeAccessibleText", IDS_SETTINGS_PHOTO_MODE_ACCESSIBLE_TEXT},
- {"videoModeAccessibleText", IDS_SETTINGS_VIDEO_MODE_ACCESSIBLE_TEXT},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-
- html_source->AddBoolean(
- "changePictureVideoModeEnabled",
- base::FeatureList::IsEnabled(::features::kChangePictureVideoMode));
- html_source->AddBoolean("isAmbientModeEnabled",
- chromeos::features::IsAmbientModeEnabled());
-}
-
-void AddFingerprintListStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"lockScreenAddFingerprint",
- IDS_SETTINGS_PEOPLE_LOCK_SCREEN_ADD_FINGERPRINT_BUTTON},
- {"lockScreenRegisteredFingerprints",
- IDS_SETTINGS_PEOPLE_LOCK_SCREEN_REGISTERED_FINGERPRINTS_LABEL},
- {"lockScreenFingerprintWarning",
- IDS_SETTINGS_PEOPLE_LOCK_SCREEN_FINGERPRINT_LESS_SECURE},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-}
-
-void AddSetupPinDialogStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"configurePinChoosePinTitle",
- IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_CHOOSE_PIN_TITLE},
- {"configurePinConfirmPinTitle",
- IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_CONFIRM_PIN_TITLE},
- {"configurePinMismatched", IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_MISMATCHED},
- {"configurePinTooShort", IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_TOO_SHORT},
- {"configurePinTooLong", IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_TOO_LONG},
- {"configurePinWeakPin", IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_WEAK_PIN},
- {"pinKeyboardPlaceholderPin", IDS_PIN_KEYBOARD_HINT_TEXT_PIN},
- {"pinKeyboardPlaceholderPinPassword",
- IDS_PIN_KEYBOARD_HINT_TEXT_PIN_PASSWORD},
- {"pinKeyboardDeleteAccessibleName",
- IDS_PIN_KEYBOARD_DELETE_ACCESSIBLE_NAME},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-
- // Format numbers to be used on the pin keyboard.
- for (int j = 0; j <= 9; j++) {
- html_source->AddString("pinKeyboard" + base::NumberToString(j),
- base::FormatNumber(int64_t{j}));
- }
-}
-
-void AddSetupFingerprintDialogStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"configureFingerprintTitle", IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_TITLE},
- {"configureFingerprintAddAnotherButton",
- IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_ADD_ANOTHER_BUTTON},
- {"configureFingerprintInstructionReadyStep",
- IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_READY},
- {"configureFingerprintLiftFinger",
- IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_LIFT_FINGER},
- {"configureFingerprintTryAgain",
- IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_TRY_AGAIN},
- {"configureFingerprintImmobile",
- IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_FINGER_IMMOBILE},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-}
-
-void AddFingerprintStrings(content::WebUIDataSource* html_source) {
- int instruction_id, aria_label_id;
- using FingerprintLocation = chromeos::quick_unlock::FingerprintLocation;
- switch (chromeos::quick_unlock::GetFingerprintLocation()) {
- case FingerprintLocation::TABLET_POWER_BUTTON:
- instruction_id =
- IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_POWER_BUTTON;
- aria_label_id =
- IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_POWER_BUTTON_ARIA_LABEL;
- break;
- case FingerprintLocation::KEYBOARD_BOTTOM_LEFT:
- instruction_id =
- IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD;
- aria_label_id =
- IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD_BOTTOM_LEFT_ARIA_LABEL;
- break;
- case FingerprintLocation::KEYBOARD_BOTTOM_RIGHT:
- instruction_id =
- IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD;
- aria_label_id =
- IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD_BOTTOM_RIGHT_ARIA_LABEL;
- break;
- case FingerprintLocation::KEYBOARD_TOP_RIGHT:
- instruction_id =
- IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD;
- aria_label_id =
- IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD_TOP_RIGHT_ARIA_LABEL;
- break;
- }
- html_source->AddLocalizedString(
- "configureFingerprintInstructionLocateScannerStep", instruction_id);
- html_source->AddLocalizedString("configureFingerprintScannerStepAriaLabel",
- aria_label_id);
-}
-
-void AddAccountManagerPageStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"accountManagerDescription", IDS_SETTINGS_ACCOUNT_MANAGER_DESCRIPTION},
- {"accountManagerChildDescription",
- IDS_SETTINGS_ACCOUNT_MANAGER_CHILD_DESCRIPTION},
- {"accountListHeader", IDS_SETTINGS_ACCOUNT_MANAGER_LIST_HEADER},
- {"accountManagerPrimaryAccountTooltip",
- IDS_SETTINGS_ACCOUNT_MANAGER_PRIMARY_ACCOUNT_TOOLTIP},
- {"accountManagerEducationAccountLabel",
- IDS_SETTINGS_ACCOUNT_MANAGER_EDUCATION_ACCOUNT},
- {"removeAccountLabel", IDS_SETTINGS_ACCOUNT_MANAGER_REMOVE_ACCOUNT_LABEL},
- {"addAccountLabel", IDS_SETTINGS_ACCOUNT_MANAGER_ADD_ACCOUNT_LABEL},
- {"addSchoolAccountLabel",
- IDS_SETTINGS_ACCOUNT_MANAGER_ADD_SCHOOL_ACCOUNT_LABEL},
- {"accountManagerSecondaryAccountsDisabledText",
- IDS_SETTINGS_ACCOUNT_MANAGER_SECONDARY_ACCOUNTS_DISABLED_TEXT},
- {"accountManagerSecondaryAccountsDisabledChildText",
- IDS_SETTINGS_ACCOUNT_MANAGER_SECONDARY_ACCOUNTS_DISABLED_CHILD_TEXT},
- {"accountManagerSignedOutAccountName",
- IDS_SETTINGS_ACCOUNT_MANAGER_SIGNED_OUT_ACCOUNT_PLACEHOLDER},
- {"accountManagerUnmigratedAccountName",
- IDS_SETTINGS_ACCOUNT_MANAGER_UNMIGRATED_ACCOUNT_PLACEHOLDER},
- {"accountManagerMigrationLabel",
- IDS_SETTINGS_ACCOUNT_MANAGER_MIGRATION_LABEL},
- {"accountManagerReauthenticationLabel",
- IDS_SETTINGS_ACCOUNT_MANAGER_REAUTHENTICATION_LABEL},
- {"accountManagerMigrationTooltip",
- IDS_SETTINGS_ACCOUNT_MANAGER_MIGRATION_TOOLTIP},
- {"accountManagerReauthenticationTooltip",
- IDS_SETTINGS_ACCOUNT_MANAGER_REAUTHENTICATION_TOOLTIP},
- {"accountManagerMoreActionsTooltip",
- IDS_SETTINGS_ACCOUNT_MANAGER_MORE_ACTIONS_TOOLTIP},
- {"accountManagerManagedLabel",
- IDS_SETTINGS_ACCOUNT_MANAGER_MANAGEMENT_STATUS_MANAGED_ACCOUNT},
- {"accountManagerUnmanagedLabel",
- IDS_SETTINGS_ACCOUNT_MANAGER_MANAGEMENT_STATUS_UNMANAGED_ACCOUNT},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-}
-
-void AddSyncControlsStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"syncEverythingCheckboxLabel",
- IDS_SETTINGS_SYNC_EVERYTHING_CHECKBOX_LABEL},
- {"wallpaperCheckboxLabel", IDS_OS_SETTINGS_WALLPAPER_CHECKBOX_LABEL},
- {"osSyncTurnOff", IDS_OS_SETTINGS_SYNC_TURN_OFF},
- {"osSyncSettingsCheckboxLabel",
- IDS_OS_SETTINGS_SYNC_SETTINGS_CHECKBOX_LABEL},
- {"wifiConfigurationsCheckboxLabel",
- IDS_SETTINGS_WIFI_CONFIGURATIONS_CHECKBOX_LABEL},
- {"osSyncAppsCheckboxLabel", IDS_OS_SETTINGS_SYNC_APPS_CHECKBOX_LABEL},
- {"osSyncTurnOn", IDS_OS_SETTINGS_SYNC_TURN_ON},
- {"osSyncFeatureLabel", IDS_OS_SETTINGS_SYNC_FEATURE_LABEL},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-
- html_source->AddString(
- "browserSettingsSyncSetupUrl",
- base::StrCat({chrome::kChromeUISettingsURL, chrome::kSyncSetupSubPage}));
-}
-
-void AddCrostiniStrings(content::WebUIDataSource* html_source,
- Profile* profile) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"crostiniPageTitle", IDS_SETTINGS_CROSTINI_TITLE},
- {"crostiniPageLabel", IDS_SETTINGS_CROSTINI_LABEL},
- {"crostiniEnable", IDS_SETTINGS_TURN_ON},
- {"crostiniSharedPaths", IDS_SETTINGS_CROSTINI_SHARED_PATHS},
- {"crostiniSharedPathsListHeading",
- IDS_SETTINGS_CROSTINI_SHARED_PATHS_LIST_HEADING},
- {"crostiniSharedPathsInstructionsAdd",
- IDS_SETTINGS_CROSTINI_SHARED_PATHS_INSTRUCTIONS_ADD},
- {"crostiniSharedPathsInstructionsRemove",
- IDS_SETTINGS_CROSTINI_SHARED_PATHS_INSTRUCTIONS_REMOVE},
- {"crostiniSharedPathsRemoveSharing",
- IDS_SETTINGS_CROSTINI_SHARED_PATHS_REMOVE_SHARING},
- {"crostiniSharedPathsRemoveFailureDialogMessage",
- IDS_SETTINGS_CROSTINI_SHARED_PATHS_REMOVE_FAILURE_DIALOG_MESSAGE},
- {"crostiniSharedPathsRemoveFailureDialogTitle",
- IDS_SETTINGS_CROSTINI_SHARED_PATHS_REMOVE_FAILURE_DIALOG_TITLE},
- {"crostiniSharedPathsRemoveFailureTryAgain",
- IDS_SETTINGS_CROSTINI_SHARED_PATHS_REMOVE_FAILURE_TRY_AGAIN},
- {"crostiniSharedPathsListEmptyMessage",
- IDS_SETTINGS_CROSTINI_SHARED_PATHS_LIST_EMPTY_MESSAGE},
- {"crostiniExportImportTitle", IDS_SETTINGS_CROSTINI_EXPORT_IMPORT_TITLE},
- {"crostiniExport", IDS_SETTINGS_CROSTINI_EXPORT},
- {"crostiniExportLabel", IDS_SETTINGS_CROSTINI_EXPORT_LABEL},
- {"crostiniImport", IDS_SETTINGS_CROSTINI_IMPORT},
- {"crostiniImportLabel", IDS_SETTINGS_CROSTINI_IMPORT_LABEL},
- {"crostiniImportConfirmationDialogTitle",
- IDS_SETTINGS_CROSTINI_CONFIRM_IMPORT_DIALOG_WINDOW_TITLE},
- {"crostiniImportConfirmationDialogMessage",
- IDS_SETTINGS_CROSTINI_CONFIRM_IMPORT_DIALOG_WINDOW_MESSAGE},
- {"crostiniImportConfirmationDialogConfirmationButton",
- IDS_SETTINGS_CROSTINI_IMPORT},
- {"crostiniRemoveButton", IDS_SETTINGS_CROSTINI_REMOVE_BUTTON},
- {"crostiniSharedUsbDevicesLabel",
- IDS_SETTINGS_CROSTINI_SHARED_USB_DEVICES_LABEL},
- {"crostiniSharedUsbDevicesDescription",
- IDS_SETTINGS_CROSTINI_SHARED_USB_DEVICES_DESCRIPTION},
- {"crostiniSharedUsbDevicesExtraDescription",
- IDS_SETTINGS_CROSTINI_SHARED_USB_DEVICES_EXTRA_DESCRIPTION},
- {"crostiniSharedUsbDevicesListEmptyMessage",
- IDS_SETTINGS_CROSTINI_SHARED_USB_DEVICES_LIST_EMPTY_MESSAGE},
- {"crostiniArcAdbTitle", IDS_SETTINGS_CROSTINI_ARC_ADB_TITLE},
- {"crostiniArcAdbDescription", IDS_SETTINGS_CROSTINI_ARC_ADB_DESCRIPTION},
- {"crostiniArcAdbLabel", IDS_SETTINGS_CROSTINI_ARC_ADB_LABEL},
- {"crostiniArcAdbRestartButton",
- IDS_SETTINGS_CROSTINI_ARC_ADB_RESTART_BUTTON},
- {"crostiniArcAdbConfirmationTitleEnable",
- IDS_SETTINGS_CROSTINI_ARC_ADB_CONFIRMATION_TITLE_ENABLE},
- {"crostiniArcAdbConfirmationTitleDisable",
- IDS_SETTINGS_CROSTINI_ARC_ADB_CONFIRMATION_TITLE_DISABLE},
- {"crostiniContainerUpgrade",
- IDS_SETTINGS_CROSTINI_CONTAINER_UPGRADE_MESSAGE},
- {"crostiniContainerUpgradeSubtext",
- IDS_SETTINGS_CROSTINI_CONTAINER_UPGRADE_SUBTEXT},
- {"crostiniContainerUpgradeButton",
- IDS_SETTINGS_CROSTINI_CONTAINER_UPGRADE_BUTTON},
- {"crostiniPortForwarding", IDS_SETTINGS_CROSTINI_PORT_FORWARDING},
- {"crostiniPortForwardingDescription",
- IDS_SETTINGS_CROSTINI_PORT_FORWARDING_DESCRIPTION},
- {"crostiniPortForwardingNoPorts",
- IDS_SETTINGS_CROSTINI_PORT_FORWARDING_NO_PORTS},
- {"crostiniPortForwardingTableTitle",
- IDS_SETTINGS_CROSTINI_PORT_FORWARDING_TABLE_TITLE},
- {"crostiniPortForwardingListPortNumber",
- IDS_SETTINGS_CROSTINI_PORT_FORWARDING_LIST_PORT_NUMBER},
- {"crostiniPortForwardingListLabel",
- IDS_SETTINGS_CROSTINI_PORT_FORWARDING_LIST_LABEL},
- {"crostiniPortForwardingAddPortButton",
- IDS_SETTINGS_CROSTINI_PORT_FORWARDING_ADD_PORT_BUTTON},
- {"crostiniPortForwardingAddPortButtonDescription",
- IDS_SETTINGS_CROSTINI_PORT_FORWARDING_ADD_PORT_BUTTON_DESCRIPTION},
- {"crostiniPortForwardingAddPortDialogTitle",
- IDS_SETTINGS_CROSTINI_PORT_FORWARDING_ADD_PORT_DIALOG_TITLE},
- {"crostiniPortForwardingAddPortDialogLabel",
- IDS_SETTINGS_CROSTINI_PORT_FORWARDING_ADD_PORT_DIALOG_LABEL},
- {"crostiniPortForwardingTCP", IDS_SETTINGS_CROSTINI_PORT_FORWARDING_TCP},
- {"crostiniPortForwardingUDP", IDS_SETTINGS_CROSTINI_PORT_FORWARDING_UDP},
- {"crostiniPortForwardingAddError",
- IDS_SETTINGS_CROSTINI_PORT_FORWARDING_ADD_ERROR},
- {"crostiniDiskResizeTitle", IDS_SETTINGS_CROSTINI_DISK_RESIZE_TITLE},
- {"crostiniDiskResizeShowButton",
- IDS_SETTINGS_CROSTINI_DISK_RESIZE_SHOW_BUTTON},
- {"crostiniDiskResizeLabel", IDS_SETTINGS_CROSTINI_DISK_RESIZE_LABEL},
- {"crostiniDiskResizeUnsupported",
- IDS_SETTINGS_CROSTINI_DISK_RESIZE_UNSUPPORTED},
- {"crostiniDiskResizeLoading", IDS_SETTINGS_CROSTINI_DISK_RESIZE_LOADING},
- {"crostiniDiskResizeError", IDS_SETTINGS_CROSTINI_DISK_RESIZE_ERROR},
- {"crostiniDiskResizeErrorRetry",
- IDS_SETTINGS_CROSTINI_DISK_RESIZE_ERROR_RETRY},
- {"crostiniDiskResizeCancel", IDS_SETTINGS_CROSTINI_DISK_RESIZE_CANCEL},
- {"crostiniDiskResizeGoButton",
- IDS_SETTINGS_CROSTINI_DISK_RESIZE_GO_BUTTON},
- {"crostiniDiskResizeInProgress",
- IDS_SETTINGS_CROSTINI_DISK_RESIZE_IN_PROGRESS},
- {"crostiniDiskResizeResizingError",
- IDS_SETTINGS_CROSTINI_DISK_RESIZE_RESIZING_ERROR},
- {"crostiniDiskResizeDone", IDS_SETTINGS_CROSTINI_DISK_RESIZE_DONE},
- {"crostiniMicTitle", IDS_SETTINGS_CROSTINI_MIC_TITLE},
- {"crostiniMicDialogTitle", IDS_SETTINGS_CROSTINI_MIC_DIALOG_TITLE},
- {"crostiniMicDialogLabel", IDS_SETTINGS_CROSTINI_MIC_DIALOG_LABEL},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
- html_source->AddString(
- "crostiniSubtext",
- l10n_util::GetStringFUTF16(
- IDS_SETTINGS_CROSTINI_SUBTEXT, ui::GetChromeOSDeviceName(),
- GetHelpUrlWithBoard(chrome::kLinuxAppsLearnMoreURL)));
- html_source->AddString(
- "crostiniArcAdbPowerwashRequiredSublabel",
- l10n_util::GetStringFUTF16(
- IDS_SETTINGS_CROSTINI_ARC_ADB_POWERWASH_REQUIRED_SUBLABEL,
- base::ASCIIToUTF16(chrome::kArcAdbSideloadingLearnMoreURL)));
- html_source->AddString("crostiniRemove", l10n_util::GetStringFUTF16(
- IDS_SETTINGS_CROSTINI_REMOVE,
- ui::GetChromeOSDeviceName()));
- html_source->AddString(
- "crostiniArcAdbConfirmationMessageEnable",
- l10n_util::GetStringFUTF16(
- IDS_SETTINGS_CROSTINI_ARC_ADB_CONFIRMATION_MESSAGE_ENABLE,
- ui::GetChromeOSDeviceName()));
- html_source->AddString(
- "crostiniArcAdbConfirmationMessageDisable",
- l10n_util::GetStringFUTF16(
- IDS_SETTINGS_CROSTINI_ARC_ADB_CONFIRMATION_MESSAGE_DISABLE,
- ui::GetChromeOSDeviceName()));
- html_source->AddString(
- "crostiniSharedPathsInstructionsLocate",
- l10n_util::GetStringFUTF16(
- IDS_SETTINGS_CROSTINI_SHARED_PATHS_INSTRUCTIONS_LOCATE,
- base::ASCIIToUTF16(
- crostini::ContainerChromeOSBaseDirectory().value())));
- html_source->AddBoolean(
- "showCrostiniExportImport",
- crostini::CrostiniFeatures::Get()->IsExportImportUIAllowed(profile));
- html_source->AddBoolean("arcAdbSideloadingSupported",
- base::FeatureList::IsEnabled(
- chromeos::features::kArcAdbSideloadingFeature));
- html_source->AddBoolean("showCrostiniPortForwarding",
- base::FeatureList::IsEnabled(
- chromeos::features::kCrostiniPortForwarding));
- html_source->AddBoolean("isOwnerProfile",
- chromeos::ProfileHelper::IsOwnerProfile(profile));
- html_source->AddBoolean("isEnterpriseManaged",
- IsDeviceManaged() || IsProfileManaged(profile));
- html_source->AddBoolean(
- "canChangeAdbSideloading",
- crostini::CrostiniFeatures::Get()->CanChangeAdbSideloading(profile));
- html_source->AddBoolean("showCrostiniContainerUpgrade",
- crostini::ShouldAllowContainerUpgrade(profile));
- html_source->AddBoolean(
- "showCrostiniDiskResize",
- base::FeatureList::IsEnabled(chromeos::features::kCrostiniDiskResizing));
- html_source->AddBoolean("showCrostiniMic",
- base::FeatureList::IsEnabled(
- chromeos::features::kCrostiniShowMicSetting));
-}
-
-void AddPluginVmStrings(content::WebUIDataSource* html_source,
- Profile* profile) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"pluginVmPageTitle", IDS_SETTINGS_PLUGIN_VM_PAGE_TITLE},
- {"pluginVmPageLabel", IDS_SETTINGS_PLUGIN_VM_PAGE_LABEL},
- {"pluginVmPageSubtext", IDS_SETTINGS_PLUGIN_VM_PAGE_SUBTEXT},
- {"pluginVmPageEnable", IDS_SETTINGS_TURN_ON},
- {"pluginVmPrinterAccess", IDS_SETTINGS_PLUGIN_VM_PRINTER_ACCESS},
- {"pluginVmSharedPaths", IDS_SETTINGS_PLUGIN_VM_SHARED_PATHS},
- {"pluginVmSharedPathsListHeading",
- IDS_SETTINGS_PLUGIN_VM_SHARED_PATHS_LIST_HEADING},
- {"pluginVmSharedPathsInstructionsAdd",
- IDS_SETTINGS_PLUGIN_VM_SHARED_PATHS_INSTRUCTIONS_ADD},
- {"pluginVmSharedPathsInstructionsRemove",
- IDS_SETTINGS_PLUGIN_VM_SHARED_PATHS_INSTRUCTIONS_REMOVE},
- {"pluginVmSharedPathsRemoveSharing",
- IDS_SETTINGS_PLUGIN_VM_SHARED_PATHS_REMOVE_SHARING},
- {"pluginVmRemove", IDS_SETTINGS_PLUGIN_VM_REMOVE_LABEL},
- {"pluginVmRemoveButton", IDS_SETTINGS_PLUGIN_VM_REMOVE_BUTTON},
- {"pluginVmRemoveConfirmationDialogMessage",
- IDS_SETTINGS_PLUGIN_VM_CONFIRM_REMOVE_DIALOG_BODY},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-}
-
-void AddAndroidAppStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"androidAppsPageLabel", IDS_SETTINGS_ANDROID_APPS_LABEL},
- {"androidAppsEnable", IDS_SETTINGS_TURN_ON},
- {"androidAppsManageApps", IDS_SETTINGS_ANDROID_APPS_MANAGE_APPS},
- {"androidAppsRemove", IDS_SETTINGS_ANDROID_APPS_REMOVE},
- {"androidAppsRemoveButton", IDS_SETTINGS_ANDROID_APPS_REMOVE_BUTTON},
- {"androidAppsDisableDialogTitle",
- IDS_SETTINGS_ANDROID_APPS_DISABLE_DIALOG_TITLE},
- {"androidAppsDisableDialogMessage",
- IDS_SETTINGS_ANDROID_APPS_DISABLE_DIALOG_MESSAGE},
- {"androidAppsDisableDialogRemove",
- IDS_SETTINGS_ANDROID_APPS_DISABLE_DIALOG_REMOVE},
- {"androidAppsManageAppLinks", IDS_SETTINGS_ANDROID_APPS_MANAGE_APP_LINKS},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
- html_source->AddLocalizedString("androidAppsPageTitle",
- arc::IsPlayStoreAvailable()
- ? IDS_SETTINGS_ANDROID_APPS_TITLE
- : IDS_SETTINGS_ANDROID_SETTINGS_TITLE);
- html_source->AddString(
- "androidAppsSubtext",
- l10n_util::GetStringFUTF16(
- IDS_SETTINGS_ANDROID_APPS_SUBTEXT, ui::GetChromeOSDeviceName(),
- GetHelpUrlWithBoard(chrome::kAndroidAppsLearnMoreURL)));
-}
-
-void AddAppsStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"appsPageTitle", IDS_SETTINGS_APPS_TITLE},
- {"appManagementTitle", IDS_SETTINGS_APPS_LINK_TEXT},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-}
-
-void AddAppManagementStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"appManagementAppInstalledByPolicyLabel",
- IDS_APP_MANAGEMENT_POLICY_APP_POLICY_STRING},
- {"appManagementCameraPermissionLabel", IDS_APP_MANAGEMENT_CAMERA},
- {"appManagementContactsPermissionLabel", IDS_APP_MANAGEMENT_CONTACTS},
- {"appManagementLocationPermissionLabel", IDS_APP_MANAGEMENT_LOCATION},
- {"appManagementMicrophonePermissionLabel", IDS_APP_MANAGEMENT_MICROPHONE},
- {"appManagementMoreSettingsLabel", IDS_APP_MANAGEMENT_MORE_SETTINGS},
- {"appManagementNoAppsFound", IDS_APP_MANAGEMENT_NO_APPS_FOUND},
- {"appManagementNoPermissions",
- IDS_APPLICATION_INFO_APP_NO_PERMISSIONS_TEXT},
- {"appManagementNotificationsLabel", IDS_APP_MANAGEMENT_NOTIFICATIONS},
- {"appManagementPermissionsLabel", IDS_APP_MANAGEMENT_PERMISSIONS},
- {"appManagementPinToShelfLabel", IDS_APP_MANAGEMENT_PIN_TO_SHELF},
- {"appManagementSearchPrompt", IDS_APP_MANAGEMENT_SEARCH_PROMPT},
- {"appManagementStoragePermissionLabel", IDS_APP_MANAGEMENT_STORAGE},
- {"appManagementUninstallLabel", IDS_APP_MANAGEMENT_UNINSTALL_APP},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-}
-
-void AddParentalControlStrings(content::WebUIDataSource* html_source,
- Profile* profile) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"parentalControlsPageTitle", IDS_SETTINGS_PARENTAL_CONTROLS_PAGE_TITLE},
- {"parentalControlsPageSetUpLabel",
- IDS_SETTINGS_PARENTAL_CONTROLS_PAGE_SET_UP_LABEL},
- {"parentalControlsPageViewSettingsLabel",
- IDS_SETTINGS_PARENTAL_CONTROLS_PAGE_VIEW_SETTINGS_LABEL},
- {"parentalControlsPageConnectToInternetLabel",
- IDS_SETTINGS_PARENTAL_CONTROLS_PAGE_CONNECT_TO_INTERNET_LABEL},
- {"parentalControlsSetUpButtonLabel",
- IDS_SETTINGS_PARENTAL_CONTROLS_SET_UP_BUTTON_LABEL},
- {"parentalControlsSetUpButtonRole",
- IDS_SETTINGS_PARENTAL_CONTROLS_SET_UP_BUTTON_ROLE},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-
- html_source->AddBoolean(
- "isChild", user_manager::UserManager::Get()->IsLoggedInAsChildUser());
-
- if (user_manager::UserManager::Get()->IsLoggedInAsChildUser()) {
- SupervisedUserService* supervised_user_service =
- SupervisedUserServiceFactory::GetForProfile(profile);
- std::string custodian = supervised_user_service->GetCustodianName();
- std::string second_custodian =
- supervised_user_service->GetSecondCustodianName();
-
- base::string16 child_managed_tooltip;
- if (second_custodian.empty()) {
- child_managed_tooltip = l10n_util::GetStringFUTF16(
- IDS_SETTINGS_ACCOUNT_MANAGER_CHILD_MANAGED_BY_ONE_PARENT_TOOLTIP,
- base::UTF8ToUTF16(custodian));
- } else {
- child_managed_tooltip = l10n_util::GetStringFUTF16(
- IDS_SETTINGS_ACCOUNT_MANAGER_CHILD_MANAGED_BY_TWO_PARENTS_TOOLTIP,
- base::UTF8ToUTF16(custodian), base::UTF8ToUTF16(second_custodian));
- }
- html_source->AddString("accountManagerPrimaryAccountChildManagedTooltip",
- child_managed_tooltip);
- }
-}
-
-void AddBluetoothStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"bluetoothConnected", IDS_SETTINGS_BLUETOOTH_CONNECTED},
- {"bluetoothConnectedWithBattery",
- IDS_SETTINGS_BLUETOOTH_CONNECTED_WITH_BATTERY},
- {"bluetoothConnecting", IDS_SETTINGS_BLUETOOTH_CONNECTING},
- {"bluetoothDeviceListPaired", IDS_SETTINGS_BLUETOOTH_DEVICE_LIST_PAIRED},
- {"bluetoothDeviceListUnpaired",
- IDS_SETTINGS_BLUETOOTH_DEVICE_LIST_UNPAIRED},
- {"bluetoothConnect", IDS_SETTINGS_BLUETOOTH_CONNECT},
- {"bluetoothDisconnect", IDS_SETTINGS_BLUETOOTH_DISCONNECT},
- {"bluetoothToggleA11yLabel",
- IDS_SETTINGS_BLUETOOTH_TOGGLE_ACCESSIBILITY_LABEL},
- {"bluetoothExpandA11yLabel",
- IDS_SETTINGS_BLUETOOTH_EXPAND_ACCESSIBILITY_LABEL},
- {"bluetoothNoDevices", IDS_SETTINGS_BLUETOOTH_NO_DEVICES},
- {"bluetoothNoDevicesFound", IDS_SETTINGS_BLUETOOTH_NO_DEVICES_FOUND},
- {"bluetoothNotConnected", IDS_SETTINGS_BLUETOOTH_NOT_CONNECTED},
- {"bluetoothPageTitle", IDS_SETTINGS_BLUETOOTH},
- {"bluetoothPairDevicePageTitle",
- IDS_SETTINGS_BLUETOOTH_PAIR_DEVICE_TITLE},
- {"bluetoothRemove", IDS_SETTINGS_BLUETOOTH_REMOVE},
- {"bluetoothPrimaryUserControlled",
- IDS_SETTINGS_BLUETOOTH_PRIMARY_USER_CONTROLLED},
- {"bluetoothDeviceType_computer",
- IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_COMPUTER},
- {"bluetoothDeviceType_phone",
- IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_PHONE},
- {"bluetoothDeviceType_modem",
- IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_MODEM},
- {"bluetoothDeviceType_audio",
- IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_AUDIO},
- {"bluetoothDeviceType_carAudio",
- IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_CAR_AUDIO},
- {"bluetoothDeviceType_video",
- IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_VIDEO},
- {"bluetoothDeviceType_peripheral",
- IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_PERIPHERAL},
- {"bluetoothDeviceType_joystick",
- IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_JOYSTICK},
- {"bluetoothDeviceType_gamepad",
- IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_GAMEPAD},
- {"bluetoothDeviceType_keyboard",
- IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_KEYBOARD},
- {"bluetoothDeviceType_mouse",
- IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_MOUSE},
- {"bluetoothDeviceType_tablet",
- IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_TABLET},
- {"bluetoothDeviceType_keyboardMouseCombo",
- IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_KEYBOARD_MOUSE_COMBO},
- {"bluetoothDeviceType_unknown",
- IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_UNKNOWN},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
- chromeos::bluetooth_dialog::AddLocalizedStrings(html_source);
-}
-
-void AddChromeOSUserStrings(content::WebUIDataSource* html_source,
- Profile* profile) {
- user_manager::UserManager* user_manager = user_manager::UserManager::Get();
-
- const user_manager::User* user =
- chromeos::ProfileHelper::Get()->GetUserByProfile(profile);
- const user_manager::User* primary_user = user_manager->GetPrimaryUser();
- std::string primary_user_email = primary_user->GetAccountId().GetUserEmail();
- html_source->AddString("primaryUserEmail", primary_user_email);
- html_source->AddString("browserSettingsBannerText",
- l10n_util::GetStringFUTF16(
- IDS_SETTINGS_BROWSER_SETTINGS_BANNER,
- base::ASCIIToUTF16(chrome::kChromeUISettingsURL)));
- html_source->AddBoolean("isActiveDirectoryUser",
- user && user->IsActiveDirectoryUser());
- html_source->AddBoolean(
- "isSecondaryUser",
- user && user->GetAccountId() != primary_user->GetAccountId());
- html_source->AddString(
- "secondaryUserBannerText",
- l10n_util::GetStringFUTF16(IDS_SETTINGS_SECONDARY_USER_BANNER,
- base::ASCIIToUTF16(primary_user_email)));
-
- if (!IsDeviceManaged() && !user_manager->IsCurrentUserOwner()) {
- html_source->AddString("ownerEmail",
- user_manager->GetOwnerAccountId().GetUserEmail());
- }
-}
-
-void AddDevicePointersStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kPointersStrings[] = {
- {"mouseTitle", IDS_SETTINGS_MOUSE_TITLE},
- {"touchpadTitle", IDS_SETTINGS_TOUCHPAD_TITLE},
- {"mouseAndTouchpadTitle", IDS_SETTINGS_MOUSE_AND_TOUCHPAD_TITLE},
- {"touchpadTapToClickEnabledLabel",
- IDS_SETTINGS_TOUCHPAD_TAP_TO_CLICK_ENABLED_LABEL},
- {"touchpadSpeed", IDS_SETTINGS_TOUCHPAD_SPEED_LABEL},
- {"pointerSlow", IDS_SETTINGS_POINTER_SPEED_SLOW_LABEL},
- {"pointerFast", IDS_SETTINGS_POINTER_SPEED_FAST_LABEL},
- {"mouseScrollSpeed", IDS_SETTINGS_MOUSE_SCROLL_SPEED_LABEL},
- {"mouseSpeed", IDS_SETTINGS_MOUSE_SPEED_LABEL},
- {"mouseSwapButtons", IDS_SETTINGS_MOUSE_SWAP_BUTTONS_LABEL},
- {"mouseReverseScroll", IDS_SETTINGS_MOUSE_REVERSE_SCROLL_LABEL},
- {"mouseAccelerationLabel", IDS_SETTINGS_MOUSE_ACCELERATION_LABEL},
- {"mouseScrollAccelerationLabel",
- IDS_SETTINGS_MOUSE_SCROLL_ACCELERATION_LABEL},
- {"touchpadAccelerationLabel", IDS_SETTINGS_TOUCHPAD_ACCELERATION_LABEL},
- {"touchpadScrollAccelerationLabel",
- IDS_SETTINGS_TOUCHPAD_SCROLL_ACCELERATION_LABEL},
- {"touchpadScrollSpeed", IDS_SETTINGS_TOUCHPAD_SCROLL_SPEED_LABEL},
- };
- AddLocalizedStringsBulk(html_source, kPointersStrings);
-
- html_source->AddString("naturalScrollLearnMoreLink",
- GetHelpUrlWithBoard(chrome::kNaturalScrollHelpURL));
-
- html_source->AddBoolean(
- "allowDisableMouseAcceleration",
- base::FeatureList::IsEnabled(::features::kAllowDisableMouseAcceleration));
- html_source->AddBoolean(
- "allowScrollSettings",
- base::FeatureList::IsEnabled(features::kAllowScrollSettings));
-}
-
-void AddDeviceKeyboardStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString keyboard_strings[] = {
- {"keyboardTitle", IDS_SETTINGS_KEYBOARD_TITLE},
- {"keyboardKeyCtrl", IDS_SETTINGS_KEYBOARD_KEY_LEFT_CTRL},
- {"keyboardKeyAlt", IDS_SETTINGS_KEYBOARD_KEY_LEFT_ALT},
- {"keyboardKeyCapsLock", IDS_SETTINGS_KEYBOARD_KEY_CAPS_LOCK},
- {"keyboardKeyCommand", IDS_SETTINGS_KEYBOARD_KEY_COMMAND},
- {"keyboardKeyDiamond", IDS_SETTINGS_KEYBOARD_KEY_DIAMOND},
- {"keyboardKeyEscape", IDS_SETTINGS_KEYBOARD_KEY_ESCAPE},
- {"keyboardKeyBackspace", IDS_SETTINGS_KEYBOARD_KEY_BACKSPACE},
- {"keyboardKeyAssistant", IDS_SETTINGS_KEYBOARD_KEY_ASSISTANT},
- {"keyboardKeyDisabled", IDS_SETTINGS_KEYBOARD_KEY_DISABLED},
- {"keyboardKeyExternalCommand",
- IDS_SETTINGS_KEYBOARD_KEY_EXTERNAL_COMMAND},
- {"keyboardKeyExternalMeta", IDS_SETTINGS_KEYBOARD_KEY_EXTERNAL_META},
- {"keyboardKeyMeta", IDS_SETTINGS_KEYBOARD_KEY_META},
- {"keyboardSendFunctionKeys", IDS_SETTINGS_KEYBOARD_SEND_FUNCTION_KEYS},
- {"keyboardEnableAutoRepeat", IDS_SETTINGS_KEYBOARD_AUTO_REPEAT_ENABLE},
- {"keyRepeatDelay", IDS_SETTINGS_KEYBOARD_AUTO_REPEAT_DELAY},
- {"keyRepeatDelayLong", IDS_SETTINGS_KEYBOARD_AUTO_REPEAT_DELAY_LONG},
- {"keyRepeatDelayShort", IDS_SETTINGS_KEYBOARD_AUTO_REPEAT_DELAY_SHORT},
- {"keyRepeatRate", IDS_SETTINGS_KEYBOARD_AUTO_REPEAT_RATE},
- {"keyRepeatRateSlow", IDS_SETTINGS_KEYBOARD_AUTO_REPEAT_RATE_SLOW},
- {"keyRepeatRateFast", IDS_SETTINGS_KEYBOARD_AUTO_REPEAT_FAST},
- {"showKeyboardShortcutViewer",
- IDS_SETTINGS_KEYBOARD_SHOW_SHORTCUT_VIEWER},
- {"keyboardShowLanguageAndInput",
- IDS_SETTINGS_KEYBOARD_SHOW_LANGUAGE_AND_INPUT},
- };
- AddLocalizedStringsBulk(html_source, keyboard_strings);
-
- html_source->AddLocalizedString("keyboardKeySearch",
- ui::DeviceUsesKeyboardLayout2()
- ? IDS_SETTINGS_KEYBOARD_KEY_LAUNCHER
- : IDS_SETTINGS_KEYBOARD_KEY_SEARCH);
- html_source->AddLocalizedString(
- "keyboardSendFunctionKeysDescription",
- ui::DeviceUsesKeyboardLayout2()
- ? IDS_SETTINGS_KEYBOARD_SEND_FUNCTION_KEYS_LAYOUT2_DESCRIPTION
- : IDS_SETTINGS_KEYBOARD_SEND_FUNCTION_KEYS_DESCRIPTION);
-}
-
-void AddDeviceStylusStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kStylusStrings[] = {
- {"stylusTitle", IDS_SETTINGS_STYLUS_TITLE},
- {"stylusEnableStylusTools", IDS_SETTINGS_STYLUS_ENABLE_STYLUS_TOOLS},
- {"stylusAutoOpenStylusTools", IDS_SETTINGS_STYLUS_AUTO_OPEN_STYLUS_TOOLS},
- {"stylusFindMoreAppsPrimary", IDS_SETTINGS_STYLUS_FIND_MORE_APPS_PRIMARY},
- {"stylusFindMoreAppsSecondary",
- IDS_SETTINGS_STYLUS_FIND_MORE_APPS_SECONDARY},
- {"stylusNoteTakingApp", IDS_SETTINGS_STYLUS_NOTE_TAKING_APP_LABEL},
- {"stylusNoteTakingAppEnabledOnLockScreen",
- IDS_SETTINGS_STYLUS_NOTE_TAKING_APP_LOCK_SCREEN_CHECKBOX},
- {"stylusNoteTakingAppKeepsLastNoteOnLockScreen",
- IDS_SETTINGS_STYLUS_NOTE_TAKING_APP_KEEP_LATEST_NOTE},
- {"stylusNoteTakingAppLockScreenSettingsHeader",
- IDS_SETTINGS_STYLUS_LOCK_SCREEN_NOTES_TITLE},
- {"stylusNoteTakingAppNoneAvailable",
- IDS_SETTINGS_STYLUS_NOTE_TAKING_APP_NONE_AVAILABLE},
- {"stylusNoteTakingAppWaitingForAndroid",
- IDS_SETTINGS_STYLUS_NOTE_TAKING_APP_WAITING_FOR_ANDROID}};
- AddLocalizedStringsBulk(html_source, kStylusStrings);
-}
-
-void AddDeviceDisplayStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kDisplayStrings[] = {
- {"displayTitle", IDS_SETTINGS_DISPLAY_TITLE},
- {"displayArrangementText", IDS_SETTINGS_DISPLAY_ARRANGEMENT_TEXT},
- {"displayArrangementTitle", IDS_SETTINGS_DISPLAY_ARRANGEMENT_TITLE},
- {"displayMirror", IDS_SETTINGS_DISPLAY_MIRROR},
- {"displayMirrorDisplayName", IDS_SETTINGS_DISPLAY_MIRROR_DISPLAY_NAME},
- {"displayAmbientColorTitle", IDS_SETTINGS_DISPLAY_AMBIENT_COLOR_TITLE},
- {"displayAmbientColorSubtitle",
- IDS_SETTINGS_DISPLAY_AMBIENT_COLOR_SUBTITLE},
- {"displayNightLightLabel", IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_LABEL},
- {"displayNightLightOnAtSunset",
- IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_ON_AT_SUNSET},
- {"displayNightLightOffAtSunrise",
- IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_OFF_AT_SUNRISE},
- {"displayNightLightScheduleCustom",
- IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_SCHEDULE_CUSTOM},
- {"displayNightLightScheduleLabel",
- IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_SCHEDULE_LABEL},
- {"displayNightLightScheduleNever",
- IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_SCHEDULE_NEVER},
- {"displayNightLightScheduleSunsetToSunRise",
- IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_SCHEDULE_SUNSET_TO_SUNRISE},
- {"displayNightLightStartTime",
- IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_START_TIME},
- {"displayNightLightStopTime", IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_STOP_TIME},
- {"displayNightLightText", IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_TEXT},
- {"displayNightLightTemperatureLabel",
- IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_TEMPERATURE_LABEL},
- {"displayNightLightTempSliderMaxLabel",
- IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_TEMP_SLIDER_MAX_LABEL},
- {"displayNightLightTempSliderMinLabel",
- IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_TEMP_SLIDER_MIN_LABEL},
- {"displayUnifiedDesktop", IDS_SETTINGS_DISPLAY_UNIFIED_DESKTOP},
- {"displayUnifiedDesktopOn", IDS_SETTINGS_DISPLAY_UNIFIED_DESKTOP_ON},
- {"displayUnifiedDesktopOff", IDS_SETTINGS_DISPLAY_UNIFIED_DESKTOP_OFF},
- {"displayResolutionTitle", IDS_SETTINGS_DISPLAY_RESOLUTION_TITLE},
- {"displayResolutionText", IDS_SETTINGS_DISPLAY_RESOLUTION_TEXT},
- {"displayResolutionTextBest", IDS_SETTINGS_DISPLAY_RESOLUTION_TEXT_BEST},
- {"displayResolutionTextNative",
- IDS_SETTINGS_DISPLAY_RESOLUTION_TEXT_NATIVE},
- {"displayResolutionSublabel", IDS_SETTINGS_DISPLAY_RESOLUTION_SUBLABEL},
- {"displayResolutionMenuItem", IDS_SETTINGS_DISPLAY_RESOLUTION_MENU_ITEM},
- {"displayResolutionInterlacedMenuItem",
- IDS_SETTINGS_DISPLAY_RESOLUTION_INTERLACED_MENU_ITEM},
- {"displayZoomTitle", IDS_SETTINGS_DISPLAY_ZOOM_TITLE},
- {"displayZoomSublabel", IDS_SETTINGS_DISPLAY_ZOOM_SUBLABEL},
- {"displayZoomValue", IDS_SETTINGS_DISPLAY_ZOOM_VALUE},
- {"displayZoomLogicalResolutionText",
- IDS_SETTINGS_DISPLAY_ZOOM_LOGICAL_RESOLUTION_TEXT},
- {"displayZoomNativeLogicalResolutionNativeText",
- IDS_SETTINGS_DISPLAY_ZOOM_LOGICAL_RESOLUTION_NATIVE_TEXT},
- {"displayZoomLogicalResolutionDefaultText",
- IDS_SETTINGS_DISPLAY_ZOOM_LOGICAL_RESOLUTION_DEFAULT_TEXT},
- {"displaySizeSliderMinLabel", IDS_SETTINGS_DISPLAY_ZOOM_SLIDER_MINIMUM},
- {"displaySizeSliderMaxLabel", IDS_SETTINGS_DISPLAY_ZOOM_SLIDER_MAXIMUM},
- {"displayScreenTitle", IDS_SETTINGS_DISPLAY_SCREEN},
- {"displayScreenExtended", IDS_SETTINGS_DISPLAY_SCREEN_EXTENDED},
- {"displayScreenPrimary", IDS_SETTINGS_DISPLAY_SCREEN_PRIMARY},
- {"displayOrientation", IDS_SETTINGS_DISPLAY_ORIENTATION},
- {"displayOrientationStandard", IDS_SETTINGS_DISPLAY_ORIENTATION_STANDARD},
- {"displayOrientationAutoRotate",
- IDS_SETTINGS_DISPLAY_ORIENTATION_AUTO_ROTATE},
- {"displayOverscanPageText", IDS_SETTINGS_DISPLAY_OVERSCAN_TEXT},
- {"displayOverscanPageTitle", IDS_SETTINGS_DISPLAY_OVERSCAN_TITLE},
- {"displayOverscanSubtitle", IDS_SETTINGS_DISPLAY_OVERSCAN_SUBTITLE},
- {"displayOverscanInstructions",
- IDS_SETTINGS_DISPLAY_OVERSCAN_INSTRUCTIONS},
- {"displayOverscanResize", IDS_SETTINGS_DISPLAY_OVERSCAN_RESIZE},
- {"displayOverscanPosition", IDS_SETTINGS_DISPLAY_OVERSCAN_POSITION},
- {"displayOverscanReset", IDS_SETTINGS_DISPLAY_OVERSCAN_RESET},
- {"displayTouchCalibrationTitle",
- IDS_SETTINGS_DISPLAY_TOUCH_CALIBRATION_TITLE},
- {"displayTouchCalibrationText",
- IDS_SETTINGS_DISPLAY_TOUCH_CALIBRATION_TEXT}};
- AddLocalizedStringsBulk(html_source, kDisplayStrings);
-
- base::CommandLine& cmd = *base::CommandLine::ForCurrentProcess();
- html_source->AddBoolean("unifiedDesktopAvailable",
- cmd.HasSwitch(::switches::kEnableUnifiedDesktop));
-
- html_source->AddBoolean("listAllDisplayModes",
- display::features::IsListAllDisplayModesEnabled());
-
- html_source->AddBoolean("deviceSupportsAmbientColor",
- ash::features::IsAllowAmbientEQEnabled());
-
- html_source->AddBoolean(
- "enableTouchCalibrationSetting",
- cmd.HasSwitch(chromeos::switches::kEnableTouchCalibrationSetting));
-
- html_source->AddBoolean("hasExternalTouchDevice",
- display::HasExternalTouchscreenDevice());
-}
-
-void AddDeviceStorageStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kStorageStrings[] = {
- {"storageTitle", IDS_SETTINGS_STORAGE_TITLE},
- {"storageItemInUse", IDS_SETTINGS_STORAGE_ITEM_IN_USE},
- {"storageItemAvailable", IDS_SETTINGS_STORAGE_ITEM_AVAILABLE},
- {"storageItemSystem", IDS_SETTINGS_STORAGE_ITEM_SYSTEM},
- {"storageItemMyFiles", IDS_SETTINGS_STORAGE_ITEM_MY_FILES},
- {"storageItemBrowsingData", IDS_SETTINGS_STORAGE_ITEM_BROWSING_DATA},
- {"storageItemApps", IDS_SETTINGS_STORAGE_ITEM_APPS},
- {"storageItemCrostini", IDS_SETTINGS_STORAGE_ITEM_CROSTINI},
- {"storageItemOtherUsers", IDS_SETTINGS_STORAGE_ITEM_OTHER_USERS},
- {"storageSizeComputing", IDS_SETTINGS_STORAGE_SIZE_CALCULATING},
- {"storageSizeUnknown", IDS_SETTINGS_STORAGE_SIZE_UNKNOWN},
- {"storageSpaceLowMessageTitle",
- IDS_SETTINGS_STORAGE_SPACE_LOW_MESSAGE_TITLE},
- {"storageSpaceLowMessageLine1",
- IDS_SETTINGS_STORAGE_SPACE_LOW_MESSAGE_LINE_1},
- {"storageSpaceLowMessageLine2",
- IDS_SETTINGS_STORAGE_SPACE_LOW_MESSAGE_LINE_2},
- {"storageSpaceCriticallyLowMessageTitle",
- IDS_SETTINGS_STORAGE_SPACE_CRITICALLY_LOW_MESSAGE_TITLE},
- {"storageSpaceCriticallyLowMessageLine1",
- IDS_SETTINGS_STORAGE_SPACE_CRITICALLY_LOW_MESSAGE_LINE_1},
- {"storageSpaceCriticallyLowMessageLine2",
- IDS_SETTINGS_STORAGE_SPACE_CRITICALLY_LOW_MESSAGE_LINE_2},
- {"storageExternal", IDS_SETTINGS_STORAGE_EXTERNAL},
- {"storageExternalStorageEmptyListHeader",
- IDS_SETTINGS_STORAGE_EXTERNAL_STORAGE_EMPTY_LIST_HEADER},
- {"storageExternalStorageListHeader",
- IDS_SETTINGS_STORAGE_EXTERNAL_STORAGE_LIST_HEADER},
- {"storageOverviewAriaLabel", IDS_SETTINGS_STORAGE_OVERVIEW_ARIA_LABEL}};
- AddLocalizedStringsBulk(html_source, kStorageStrings);
-
- html_source->AddString(
- "storageAndroidAppsExternalDrivesNote",
- l10n_util::GetStringFUTF16(
- IDS_SETTINGS_STORAGE_ANDROID_APPS_ACCESS_EXTERNAL_DRIVES_NOTE,
- base::ASCIIToUTF16(chrome::kArcExternalStorageLearnMoreURL)));
-}
-
-void AddDevicePowerStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kPowerStrings[] = {
- {"powerTitle", IDS_SETTINGS_POWER_TITLE},
- {"powerSourceLabel", IDS_SETTINGS_POWER_SOURCE_LABEL},
- {"powerSourceBattery", IDS_SETTINGS_POWER_SOURCE_BATTERY},
- {"powerSourceAcAdapter", IDS_SETTINGS_POWER_SOURCE_AC_ADAPTER},
- {"powerSourceLowPowerCharger",
- IDS_SETTINGS_POWER_SOURCE_LOW_POWER_CHARGER},
- {"calculatingPower", IDS_SETTINGS_POWER_SOURCE_CALCULATING},
- {"powerIdleLabel", IDS_SETTINGS_POWER_IDLE_LABEL},
- {"powerIdleWhileChargingLabel",
- IDS_SETTINGS_POWER_IDLE_WHILE_CHARGING_LABEL},
- {"powerIdleWhileChargingAriaLabel",
- IDS_SETTINGS_POWER_IDLE_WHILE_CHARGING_ARIA_LABEL},
- {"powerIdleWhileOnBatteryLabel",
- IDS_SETTINGS_POWER_IDLE_WHILE_ON_BATTERY_LABEL},
- {"powerIdleWhileOnBatteryAriaLabel",
- IDS_SETTINGS_POWER_IDLE_WHILE_ON_BATTERY_ARIA_LABEL},
- {"powerIdleDisplayOffSleep", IDS_SETTINGS_POWER_IDLE_DISPLAY_OFF_SLEEP},
- {"powerIdleDisplayOff", IDS_SETTINGS_POWER_IDLE_DISPLAY_OFF},
- {"powerIdleDisplayOn", IDS_SETTINGS_POWER_IDLE_DISPLAY_ON},
- {"powerIdleOther", IDS_SETTINGS_POWER_IDLE_OTHER},
- {"powerLidSleepLabel", IDS_SETTINGS_POWER_LID_CLOSED_SLEEP_LABEL},
- {"powerLidSignOutLabel", IDS_SETTINGS_POWER_LID_CLOSED_SIGN_OUT_LABEL},
- {"powerLidShutDownLabel", IDS_SETTINGS_POWER_LID_CLOSED_SHUT_DOWN_LABEL},
- };
- AddLocalizedStringsBulk(html_source, kPowerStrings);
-}
-
-void AddDeviceStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kDeviceStrings[] = {
- {"devicePageTitle", IDS_SETTINGS_DEVICE_TITLE},
- {"scrollLabel", IDS_SETTINGS_SCROLL_LABEL},
- {"touchPadScrollLabel", IDS_OS_SETTINGS_TOUCHPAD_REVERSE_SCROLL_LABEL},
- };
- AddLocalizedStringsBulk(html_source, kDeviceStrings);
-
- AddDevicePointersStrings(html_source);
- AddDeviceKeyboardStrings(html_source);
- AddDeviceStylusStrings(html_source);
- AddDeviceDisplayStrings(html_source);
- AddDeviceStorageStrings(html_source);
- AddDevicePowerStrings(html_source);
-}
-
-void AddFilesStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"disconnectGoogleDriveAccount", IDS_SETTINGS_DISCONNECT_GOOGLE_DRIVE},
- {"filesPageTitle", IDS_OS_SETTINGS_FILES},
- {"smbSharesTitle", IDS_SETTINGS_DOWNLOADS_SMB_SHARES},
- {"smbSharesLearnMoreLabel",
- IDS_SETTINGS_DOWNLOADS_SMB_SHARES_LEARN_MORE_LABEL},
- {"addSmbShare", IDS_SETTINGS_DOWNLOADS_SMB_SHARES_ADD_SHARE},
- {"smbShareAddedSuccessfulMessage",
- IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_SUCCESS_MESSAGE},
- {"smbShareAddedErrorMessage",
- IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_ERROR_MESSAGE},
- {"smbShareAddedAuthFailedMessage",
- IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_AUTH_FAILED_MESSAGE},
- {"smbShareAddedNotFoundMessage",
- IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_NOT_FOUND_MESSAGE},
- {"smbShareAddedUnsupportedDeviceMessage",
- IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_UNSUPPORTED_DEVICE_MESSAGE},
- {"smbShareAddedMountExistsMessage",
- IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_MOUNT_EXISTS_MESSAGE},
- {"smbShareAddedTooManyMountsMessage",
- IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_TOO_MANY_MOUNTS_MESSAGE},
- {"smbShareAddedInvalidURLMessage",
- IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_MOUNT_INVALID_URL_MESSAGE},
- {"smbShareAddedInvalidSSOURLMessage",
- IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_MOUNT_INVALID_SSO_URL_MESSAGE},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-
- chromeos::smb_dialog::AddLocalizedStrings(html_source);
-
- html_source->AddString("smbSharesLearnMoreURL",
- GetHelpUrlWithBoard(chrome::kSmbSharesLearnMoreURL));
-}
-
-void AddEasyUnlockStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"easyUnlockSectionTitle", IDS_SETTINGS_EASY_UNLOCK_SECTION_TITLE},
- {"easyUnlockUnlockDeviceOnly",
- IDS_SETTINGS_EASY_UNLOCK_UNLOCK_DEVICE_ONLY},
- {"easyUnlockUnlockDeviceAndAllowSignin",
- IDS_SETTINGS_EASY_UNLOCK_UNLOCK_DEVICE_AND_ALLOW_SIGNIN},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-}
-
-void AddMultideviceStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"multidevicePageTitle", IDS_SETTINGS_MULTIDEVICE},
- {"multideviceSetupButton", IDS_SETTINGS_MULTIDEVICE_SETUP_BUTTON},
- {"multideviceVerifyButton", IDS_SETTINGS_MULTIDEVICE_VERIFY_BUTTON},
- {"multideviceSetupItemHeading",
- IDS_SETTINGS_MULTIDEVICE_SETUP_ITEM_HEADING},
- {"multideviceEnabled", IDS_SETTINGS_MULTIDEVICE_ENABLED},
- {"multideviceDisabled", IDS_SETTINGS_MULTIDEVICE_DISABLED},
- {"multideviceSmartLockItemTitle", IDS_SETTINGS_EASY_UNLOCK_SECTION_TITLE},
- {"multideviceInstantTetheringItemTitle",
- IDS_SETTINGS_MULTIDEVICE_INSTANT_TETHERING},
- {"multideviceInstantTetheringItemSummary",
- IDS_SETTINGS_MULTIDEVICE_INSTANT_TETHERING_SUMMARY},
- {"multideviceAndroidMessagesItemTitle",
- IDS_SETTINGS_MULTIDEVICE_ANDROID_MESSAGES},
- {"multideviceForgetDevice", IDS_SETTINGS_MULTIDEVICE_FORGET_THIS_DEVICE},
- {"multideviceSmartLockOptions",
- IDS_SETTINGS_PEOPLE_LOCK_SCREEN_OPTIONS_LOCK},
- {"multideviceForgetDeviceDisconnect",
- IDS_SETTINGS_MULTIDEVICE_FORGET_THIS_DEVICE_DISCONNECT},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-
- html_source->AddString(
- "multideviceForgetDeviceSummary",
- ui::SubstituteChromeOSDeviceType(
- IDS_SETTINGS_MULTIDEVICE_FORGET_THIS_DEVICE_EXPLANATION));
- html_source->AddString(
- "multideviceForgetDeviceDialogMessage",
- ui::SubstituteChromeOSDeviceType(
- IDS_SETTINGS_MULTIDEVICE_FORGET_DEVICE_DIALOG_MESSAGE));
- html_source->AddString(
- "multideviceVerificationText",
- l10n_util::GetStringFUTF16(
- IDS_SETTINGS_MULTIDEVICE_VERIFICATION_TEXT,
- base::UTF8ToUTF16(
- chromeos::multidevice_setup::
- GetBoardSpecificBetterTogetherSuiteLearnMoreUrl()
- .spec())));
- html_source->AddString(
- "multideviceSetupSummary",
- l10n_util::GetStringFUTF16(
- IDS_SETTINGS_MULTIDEVICE_SETUP_SUMMARY, ui::GetChromeOSDeviceName(),
- base::UTF8ToUTF16(
- chromeos::multidevice_setup::
- GetBoardSpecificBetterTogetherSuiteLearnMoreUrl()
- .spec())));
- html_source->AddString(
- "multideviceNoHostText",
- l10n_util::GetStringFUTF16(
- IDS_SETTINGS_MULTIDEVICE_NO_ELIGIBLE_HOSTS,
- base::UTF8ToUTF16(
- chromeos::multidevice_setup::
- GetBoardSpecificBetterTogetherSuiteLearnMoreUrl()
- .spec())));
- html_source->AddString(
- "multideviceAndroidMessagesItemSummary",
- l10n_util::GetStringFUTF16(
- IDS_SETTINGS_MULTIDEVICE_ANDROID_MESSAGES_SUMMARY,
- ui::GetChromeOSDeviceName(),
- base::UTF8ToUTF16(chromeos::multidevice_setup::
- GetBoardSpecificMessagesLearnMoreUrl()
- .spec())));
- html_source->AddString(
- "multideviceSmartLockItemSummary",
- l10n_util::GetStringFUTF16(
- IDS_SETTINGS_MULTIDEVICE_SMART_LOCK_SUMMARY,
- ui::GetChromeOSDeviceName(),
- GetHelpUrlWithBoard(chrome::kEasyUnlockLearnMoreUrl)));
-
- AddEasyUnlockStrings(html_source);
-}
-
-void AddKerberosAccountsPageStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"kerberosAccountsAddAccountLabel",
- IDS_SETTINGS_KERBEROS_ACCOUNTS_ADD_ACCOUNT_LABEL},
- {"kerberosAccountsRefreshNowLabel",
- IDS_SETTINGS_KERBEROS_ACCOUNTS_REFRESH_NOW_LABEL},
- {"kerberosAccountsSetAsActiveAccountLabel",
- IDS_SETTINGS_KERBEROS_ACCOUNTS_SET_AS_ACTIVE_ACCOUNT_LABEL},
- {"kerberosAccountsSignedOut", IDS_SETTINGS_KERBEROS_ACCOUNTS_SIGNED_OUT},
- {"kerberosAccountsListHeader",
- IDS_SETTINGS_KERBEROS_ACCOUNTS_LIST_HEADER},
- {"kerberosAccountsRemoveAccountLabel",
- IDS_SETTINGS_KERBEROS_ACCOUNTS_REMOVE_ACCOUNT_LABEL},
- {"kerberosAccountsReauthenticationLabel",
- IDS_SETTINGS_KERBEROS_ACCOUNTS_REAUTHENTICATION_LABEL},
- {"kerberosAccountsTicketActive",
- IDS_SETTINGS_KERBEROS_ACCOUNTS_TICKET_ACTIVE},
- {"kerberosAccountsAccountRemovedTip",
- IDS_SETTINGS_KERBEROS_ACCOUNTS_ACCOUNT_REMOVED_TIP},
- {"kerberosAccountsAccountRefreshedTip",
- IDS_SETTINGS_KERBEROS_ACCOUNTS_ACCOUNT_REFRESHED_TIP},
- {"kerberosAccountsSignedIn", IDS_SETTINGS_KERBEROS_ACCOUNTS_SIGNED_IN},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-
- PrefService* local_state = g_browser_process->local_state();
-
- // Whether new Kerberos accounts may be added.
- html_source->AddBoolean(
- "kerberosAddAccountsAllowed",
- local_state->GetBoolean(prefs::kKerberosAddAccountsAllowed));
-
- // Kerberos accounts page with "Learn more" link.
- html_source->AddString(
- "kerberosAccountsDescription",
- l10n_util::GetStringFUTF16(
- IDS_SETTINGS_KERBEROS_ACCOUNTS_DESCRIPTION,
- GetHelpUrlWithBoard(chrome::kKerberosAccountsLearnMoreURL)));
-}
-
-void AddKerberosAddAccountDialogStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"kerberosAccountsAdvancedConfigLabel",
- IDS_SETTINGS_KERBEROS_ACCOUNTS_ADVANCED_CONFIG_LABEL},
- {"kerberosAdvancedConfigTitle",
- IDS_SETTINGS_KERBEROS_ADVANCED_CONFIG_TITLE},
- {"kerberosAdvancedConfigDesc",
- IDS_SETTINGS_KERBEROS_ADVANCED_CONFIG_DESC},
- {"addKerberosAccountRememberPassword",
- IDS_SETTINGS_ADD_KERBEROS_ACCOUNT_REMEMBER_PASSWORD},
- {"kerberosPassword", IDS_SETTINGS_KERBEROS_PASSWORD},
- {"kerberosUsername", IDS_SETTINGS_KERBEROS_USERNAME},
- {"addKerberosAccountDescription",
- IDS_SETTINGS_ADD_KERBEROS_ACCOUNT_DESCRIPTION},
- {"kerberosErrorNetworkProblem",
- IDS_SETTINGS_KERBEROS_ERROR_NETWORK_PROBLEM},
- {"kerberosErrorUsernameInvalid",
- IDS_SETTINGS_KERBEROS_ERROR_USERNAME_INVALID},
- {"kerberosErrorUsernameUnknown",
- IDS_SETTINGS_KERBEROS_ERROR_USERNAME_UNKNOWN},
- {"kerberosErrorDuplicatePrincipalName",
- IDS_SETTINGS_KERBEROS_ERROR_DUPLICATE_PRINCIPAL_NAME},
- {"kerberosErrorContactingServer",
- IDS_SETTINGS_KERBEROS_ERROR_CONTACTING_SERVER},
- {"kerberosErrorPasswordInvalid",
- IDS_SETTINGS_KERBEROS_ERROR_PASSWORD_INVALID},
- {"kerberosErrorPasswordExpired",
- IDS_SETTINGS_KERBEROS_ERROR_PASSWORD_EXPIRED},
- {"kerberosErrorKdcEncType", IDS_SETTINGS_KERBEROS_ERROR_KDC_ENC_TYPE},
- {"kerberosErrorGeneral", IDS_SETTINGS_KERBEROS_ERROR_GENERAL},
- {"kerberosConfigErrorSectionNestedInGroup",
- IDS_SETTINGS_KERBEROS_CONFIG_ERROR_SECTION_NESTED_IN_GROUP},
- {"kerberosConfigErrorSectionSyntax",
- IDS_SETTINGS_KERBEROS_CONFIG_ERROR_SECTION_SYNTAX},
- {"kerberosConfigErrorExpectedOpeningCurlyBrace",
- IDS_SETTINGS_KERBEROS_CONFIG_ERROR_EXPECTED_OPENING_CURLY_BRACE},
- {"kerberosConfigErrorExtraCurlyBrace",
- IDS_SETTINGS_KERBEROS_CONFIG_ERROR_EXTRA_CURLY_BRACE},
- {"kerberosConfigErrorRelationSyntax",
- IDS_SETTINGS_KERBEROS_CONFIG_ERROR_RELATION_SYNTAX_ERROR},
- {"kerberosConfigErrorKeyNotSupported",
- IDS_SETTINGS_KERBEROS_CONFIG_ERROR_KEY_NOT_SUPPORTED},
- {"kerberosConfigErrorSectionNotSupported",
- IDS_SETTINGS_KERBEROS_CONFIG_ERROR_SECTION_NOT_SUPPORTED},
- {"kerberosConfigErrorKrb5FailedToParse",
- IDS_SETTINGS_KERBEROS_CONFIG_ERROR_KRB5_FAILED_TO_PARSE},
- {"addKerberosAccountRefreshButtonLabel",
- IDS_SETTINGS_ADD_KERBEROS_ACCOUNT_REFRESH_BUTTON_LABEL},
- {"addKerberosAccount", IDS_SETTINGS_ADD_KERBEROS_ACCOUNT},
- {"refreshKerberosAccount", IDS_SETTINGS_REFRESH_KERBEROS_ACCOUNT},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-
- PrefService* local_state = g_browser_process->local_state();
-
- // Whether the 'Remember password' checkbox is enabled.
- html_source->AddBoolean(
- "kerberosRememberPasswordEnabled",
- local_state->GetBoolean(prefs::kKerberosRememberPasswordEnabled));
-
- // Kerberos default configuration.
- html_source->AddString(
- "defaultKerberosConfig",
- chromeos::KerberosCredentialsManager::GetDefaultKerberosConfig());
-}
-
-void AddLockScreenPageStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"lockScreenNotificationTitle",
- IDS_ASH_SETTINGS_LOCK_SCREEN_NOTIFICATION_TITLE},
- {"lockScreenNotificationHideSensitive",
- IDS_ASH_SETTINGS_LOCK_SCREEN_NOTIFICATION_HIDE_SENSITIVE},
- {"enableScreenlock", IDS_SETTINGS_PEOPLE_ENABLE_SCREENLOCK},
- {"lockScreenNotificationShow",
- IDS_ASH_SETTINGS_LOCK_SCREEN_NOTIFICATION_SHOW},
- {"lockScreenPinOrPassword",
- IDS_SETTINGS_PEOPLE_LOCK_SCREEN_PIN_OR_PASSWORD},
- {"lockScreenSetupFingerprintButton",
- IDS_SETTINGS_PEOPLE_LOCK_SCREEN_FINGERPRINT_SETUP_BUTTON},
- {"lockScreenNotificationHide",
- IDS_ASH_SETTINGS_LOCK_SCREEN_NOTIFICATION_HIDE},
- {"lockScreenEditFingerprints",
- IDS_SETTINGS_PEOPLE_LOCK_SCREEN_EDIT_FINGERPRINTS},
- {"lockScreenPasswordOnly", IDS_SETTINGS_PEOPLE_LOCK_SCREEN_PASSWORD_ONLY},
- {"lockScreenChangePinButton",
- IDS_SETTINGS_PEOPLE_LOCK_SCREEN_CHANGE_PIN_BUTTON},
- {"lockScreenEditFingerprintsDescription",
- IDS_SETTINGS_PEOPLE_LOCK_SCREEN_EDIT_FINGERPRINTS_DESCRIPTION},
- {"lockScreenNumberFingerprints",
- IDS_SETTINGS_PEOPLE_LOCK_SCREEN_NUM_FINGERPRINTS},
- {"lockScreenNone", IDS_SETTINGS_PEOPLE_LOCK_SCREEN_NONE},
- {"lockScreenFingerprintNewName",
- IDS_SETTINGS_PEOPLE_LOCK_SCREEN_NEW_FINGERPRINT_DEFAULT_NAME},
- {"lockScreenDeleteFingerprintLabel",
- IDS_SETTINGS_PEOPLE_LOCK_SCREEN_DELETE_FINGERPRINT_ARIA_LABEL},
- {"lockScreenOptionsLock", IDS_SETTINGS_PEOPLE_LOCK_SCREEN_OPTIONS_LOCK},
- {"lockScreenOptionsLoginLock",
- IDS_SETTINGS_PEOPLE_LOCK_SCREEN_OPTIONS_LOGIN_LOCK},
- {"lockScreenSetupPinButton",
- IDS_SETTINGS_PEOPLE_LOCK_SCREEN_SETUP_PIN_BUTTON},
- {"lockScreenTitleLock", IDS_SETTINGS_PEOPLE_LOCK_SCREEN_TITLE_LOCK},
- {"lockScreenTitleLoginLock",
- IDS_SETTINGS_PEOPLE_LOCK_SCREEN_TITLE_LOGIN_LOCK},
- {"passwordPromptEnterPasswordLock",
- IDS_SETTINGS_PEOPLE_PASSWORD_PROMPT_ENTER_PASSWORD_LOCK},
- {"passwordPromptEnterPasswordLoginLock",
- IDS_SETTINGS_PEOPLE_PASSWORD_PROMPT_ENTER_PASSWORD_LOGIN_LOCK},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-}
-
-void AddUsersStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"usersModifiedByOwnerLabel", IDS_SETTINGS_USERS_MODIFIED_BY_OWNER_LABEL},
- {"guestBrowsingLabel", IDS_SETTINGS_USERS_GUEST_BROWSING_LABEL},
- {"settingsManagedLabel", IDS_SETTINGS_USERS_MANAGED_LABEL},
- {"showOnSigninLabel", IDS_SETTINGS_USERS_SHOW_ON_SIGNIN_LABEL},
- {"restrictSigninLabel", IDS_SETTINGS_USERS_RESTRICT_SIGNIN_LABEL},
- {"deviceOwnerLabel", IDS_SETTINGS_USERS_DEVICE_OWNER_LABEL},
- {"removeUserTooltip", IDS_SETTINGS_USERS_REMOVE_USER_TOOLTIP},
- {"addUsers", IDS_SETTINGS_USERS_ADD_USERS},
- {"addUsersEmail", IDS_SETTINGS_USERS_ADD_USERS_EMAIL},
- {"userExistsError", IDS_SETTINGS_USER_EXISTS_ERROR},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-}
-
-void AddGoogleAssistantStrings(content::WebUIDataSource* html_source,
- Profile* profile) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"googleAssistantPageTitle", IDS_SETTINGS_GOOGLE_ASSISTANT},
- {"googleAssistantEnableContext", IDS_ASSISTANT_SCREEN_CONTEXT_TITLE},
- {"googleAssistantEnableContextDescription",
- IDS_ASSISTANT_SCREEN_CONTEXT_DESC},
- {"googleAssistantEnableHotword",
- IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD},
- {"googleAssistantEnableHotwordDescription",
- IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD_DESCRIPTION},
- {"googleAssistantVoiceSettings",
- IDS_SETTINGS_GOOGLE_ASSISTANT_VOICE_SETTINGS},
- {"googleAssistantVoiceSettingsDescription",
- IDS_ASSISTANT_VOICE_MATCH_RECORDING},
- {"googleAssistantVoiceSettingsRetrainButton",
- IDS_SETTINGS_GOOGLE_ASSISTANT_VOICE_SETTINGS_RETRAIN},
- {"googleAssistantEnableHotwordWithoutDspDescription",
- IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD_WITHOUT_DSP_DESCRIPTION},
- {"googleAssistantEnableHotwordWithoutDspRecommended",
- IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD_WITHOUT_DSP_RECOMMENDED},
- {"googleAssistantEnableHotwordWithoutDspAlwaysOn",
- IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD_WITHOUT_DSP_ALWAYS_ON},
- {"googleAssistantEnableHotwordWithoutDspOff",
- IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD_WITHOUT_DSP_OFF},
- {"googleAssistantEnableNotification",
- IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_NOTIFICATION},
- {"googleAssistantEnableNotificationDescription",
- IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_NOTIFICATION_DESCRIPTION},
- {"googleAssistantLaunchWithMicOpen",
- IDS_SETTINGS_GOOGLE_ASSISTANT_LAUNCH_WITH_MIC_OPEN},
- {"googleAssistantLaunchWithMicOpenDescription",
- IDS_SETTINGS_GOOGLE_ASSISTANT_LAUNCH_WITH_MIC_OPEN_DESCRIPTION},
- {"googleAssistantSettings", IDS_SETTINGS_GOOGLE_ASSISTANT_SETTINGS},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-
- html_source->AddBoolean("hotwordDspAvailable",
- chromeos::IsHotwordDspAvailable());
- html_source->AddBoolean(
- "voiceMatchDisabled",
- chromeos::assistant::features::IsVoiceMatchDisabled());
-}
-
-void AddPrintingStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"printingPageTitle", IDS_SETTINGS_PRINTING},
- {"cupsPrintersTitle", IDS_SETTINGS_PRINTING_CUPS_PRINTERS},
- {"cupsPrintersLearnMoreLabel",
- IDS_SETTINGS_PRINTING_CUPS_PRINTERS_LEARN_MORE_LABEL},
- {"addCupsPrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTERS_ADD_PRINTER},
- {"editPrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTERS_EDIT},
- {"removePrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTERS_REMOVE},
- {"setupPrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTER_SETUP_BUTTON},
- {"setupPrinterAria",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_SETUP_BUTTON_ARIA},
- {"savePrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTER_SAVE_BUTTON},
- {"savePrinterAria", IDS_SETTINGS_PRINTING_CUPS_PRINTER_SAVE_BUTTON_ARIA},
- {"searchLabel", IDS_SETTINGS_PRINTING_CUPS_SEARCH_LABEL},
- {"noSearchResults", IDS_SEARCH_NO_RESULTS},
- {"printerDetailsTitle", IDS_SETTINGS_PRINTING_CUPS_PRINTER_DETAILS_TITLE},
- {"printerName", IDS_SETTINGS_PRINTING_CUPS_PRINTER_DETAILS_NAME},
- {"printerModel", IDS_SETTINGS_PRINTING_CUPS_PRINTER_DETAILS_MODEL},
- {"printerQueue", IDS_SETTINGS_PRINTING_CUPS_PRINTER_DETAILS_QUEUE},
- {"savedPrintersTitle", IDS_SETTINGS_PRINTING_CUPS_SAVED_PRINTERS_TITLE},
- {"savedPrintersCountMany",
- IDS_SETTINGS_PRINTING_CUPS_PRINTERS_SAVED_PRINTERS_COUNT_MANY},
- {"savedPrintersCountOne",
- IDS_SETTINGS_PRINTING_CUPS_PRINTERS_SAVED_PRINTERS_COUNT_ONE},
- {"savedPrintersCountNone",
- IDS_SETTINGS_PRINTING_CUPS_PRINTERS_SAVED_PRINTERS_COUNT_NONE},
- {"showMorePrinters", IDS_SETTINGS_PRINTING_CUPS_SHOW_MORE},
- {"addPrintersNearbyTitle",
- IDS_SETTINGS_PRINTING_CUPS_ADD_PRINTERS_NEARBY_TITLE},
- {"addPrintersManuallyTitle",
- IDS_SETTINGS_PRINTING_CUPS_ADD_PRINTERS_MANUALLY_TITLE},
- {"manufacturerAndModelDialogTitle",
- IDS_SETTINGS_PRINTING_CUPS_SELECT_MANUFACTURER_AND_MODEL_TITLE},
- {"nearbyPrintersListTitle",
- IDS_SETTINGS_PRINTING_CUPS_PRINTERS_AVAILABLE_PRINTERS},
- {"nearbyPrintersCountMany",
- IDS_SETTINGS_PRINTING_CUPS_PRINTERS_AVAILABLE_PRINTERS_COUNT_MANY},
- {"nearbyPrintersCountOne",
- IDS_SETTINGS_PRINTING_CUPS_PRINTERS_AVAILABLE_PRINTER_COUNT_ONE},
- {"nearbyPrintersCountNone",
- IDS_SETTINGS_PRINTING_CUPS_PRINTERS_AVAILABLE_PRINTER_COUNT_NONE},
- {"nearbyPrintersListDescription",
- IDS_SETTINGS_PRINTING_CUPS_PRINTERS_ADD_DETECTED_OR_NEW_PRINTER},
- {"manufacturerAndModelAdditionalInformation",
- IDS_SETTINGS_PRINTING_CUPS_MANUFACTURER_MODEL_ADDITIONAL_INFORMATION},
- {"addPrinterButtonText",
- IDS_SETTINGS_PRINTING_CUPS_ADD_PRINTER_BUTTON_ADD},
- {"printerDetailsAdvanced", IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADVANCED},
- {"printerDetailsA11yLabel",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADVANCED_ACCESSIBILITY_LABEL},
- {"printerAddress", IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADVANCED_ADDRESS},
- {"printerProtocol", IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADVANCED_PROTOCOL},
- {"printerURI", IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADVANCED_URI},
- {"manuallyAddPrinterButtonText",
- IDS_SETTINGS_PRINTING_CUPS_ADD_PRINTER_BUTTON_MANUAL_ADD},
- {"discoverPrintersButtonText",
- IDS_SETTINGS_PRINTING_CUPS_ADD_PRINTER_BUTTON_DISCOVER_PRINTERS},
- {"printerProtocolIpp", IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_IPP},
- {"printerProtocolIpps", IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_IPPS},
- {"printerProtocolHttp", IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_HTTP},
- {"printerProtocolHttps",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_HTTPS},
- {"printerProtocolAppSocket",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_APP_SOCKET},
- {"printerProtocolLpd", IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_LPD},
- {"printerProtocolUsb", IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_USB},
- {"printerProtocolIppUsb",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_IPPUSB},
- {"printerConfiguringMessage",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_CONFIGURING_MESSAGE},
- {"printerManufacturer", IDS_SETTINGS_PRINTING_CUPS_PRINTER_MANUFACTURER},
- {"selectDriver", IDS_SETTINGS_PRINTING_CUPS_PRINTER_SELECT_DRIVER},
- {"selectDriverButtonText",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_BUTTON_SELECT_DRIVER},
- {"selectDriverButtonAriaLabel",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_BUTTON_SELECT_DRIVER_ARIA_LABEL},
- {"selectDriverErrorMessage",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_INVALID_DRIVER},
- {"printerAddedSuccessfulMessage",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_DONE_MESSAGE},
- {"printerEditedSuccessfulMessage",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_EDITED_PRINTER_DONE_MESSAGE},
- {"printerUnavailableMessage",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_UNAVAILABLE_MESSAGE},
- {"noPrinterNearbyMessage",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_NO_PRINTER_NEARBY},
- {"searchingNearbyPrinters",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_SEARCHING_NEARBY_PRINTER},
- {"printerAddedFailedMessage",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_ERROR_MESSAGE},
- {"printerAddedFatalErrorMessage",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_FATAL_ERROR_MESSAGE},
- {"printerAddedUnreachableMessage",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_PRINTER_UNREACHABLE_MESSAGE},
- {"printerAddedPpdTooLargeMessage",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_PPD_TOO_LARGE_MESSAGE},
- {"printerAddedInvalidPpdMessage",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_INVALID_PPD_MESSAGE},
- {"printerAddedPpdNotFoundMessage",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_PPD_NOT_FOUND},
- {"printerAddedPpdUnretrievableMessage",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_PPD_UNRETRIEVABLE},
- {"printerAddedNativePrintersNotAllowedMessage",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_NATIVE_PRINTERS_NOT_ALLOWED_MESSAGE},
- {"editPrinterInvalidPrinterUpdate",
- IDS_SETTINGS_PRINTING_CUPS_EDIT_PRINTER_INVALID_PRINTER_UPDATE},
- {"requireNetworkMessage",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_REQUIRE_INTERNET_MESSAGE},
- {"checkNetworkMessage",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_CHECK_CONNECTION_MESSAGE},
- {"noInternetConnection",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_NO_INTERNET_CONNECTION},
- {"checkNetworkAndTryAgain",
- IDS_SETTINGS_PRINTING_CUPS_PRINTER_CONNECT_TO_NETWORK_SUBTEXT},
- {"editPrinterDialogTitle",
- IDS_SETTINGS_PRINTING_CUPS_EDIT_PRINTER_DIALOG_TITLE},
- {"editPrinterButtonText", IDS_SETTINGS_PRINTING_CUPS_EDIT_PRINTER_BUTTON},
- {"currentPpdMessage",
- IDS_SETTINGS_PRINTING_CUPS_EDIT_PRINTER_CURRENT_PPD_MESSAGE},
- {"printerEulaNotice", IDS_SETTINGS_PRINTING_CUPS_EULA_NOTICE},
- {"ippPrinterUnreachable", IDS_SETTINGS_PRINTING_CUPS_IPP_URI_UNREACHABLE},
- {"generalPrinterDialogError",
- IDS_SETTINGS_PRINTING_CUPS_DIALOG_GENERAL_ERROR},
- {"printServerButtonText", IDS_SETTINGS_PRINTING_CUPS_PRINT_SERVER},
- {"addPrintServerTitle",
- IDS_SETTINGS_PRINTING_CUPS_ADD_PRINT_SERVER_TITLE},
- {"printServerAddress", IDS_SETTINGS_PRINTING_CUPS_PRINT_SERVER_ADDRESS},
- {"printServerFoundZeroPrinters",
- IDS_SETTINGS_PRINTING_CUPS_PRINT_SERVER_FOUND_ZERO_PRINTERS},
- {"printServerFoundOnePrinter",
- IDS_SETTINGS_PRINTING_CUPS_PRINT_SERVER_FOUND_ONE_PRINTER},
- {"printServerFoundManyPrinters",
- IDS_SETTINGS_PRINTING_CUPS_PRINT_SERVER_FOUND_MANY_PRINTERS},
- {"printServerInvalidUrlAddress",
- IDS_SETTINGS_PRINTING_CUPS_PRINT_SERVER_INVALID_URL_ADDRESS},
- {"printServerConnectionError",
- IDS_SETTINGS_PRINTING_CUPS_PRINT_SERVER_CONNECTION_ERROR},
- {"printServerConfigurationErrorMessage",
- IDS_SETTINGS_PRINTING_CUPS_PRINT_SERVER_REACHABLE_BUT_CANNOT_ADD},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-
- html_source->AddString("printingCUPSPrintLearnMoreUrl",
- GetHelpUrlWithBoard(chrome::kCupsPrintLearnMoreURL));
- html_source->AddString(
- "printingCUPSPrintPpdLearnMoreUrl",
- GetHelpUrlWithBoard(chrome::kCupsPrintPPDLearnMoreURL));
- html_source->AddBoolean(
- "consumerPrintServerUiEnabled",
- base::FeatureList::IsEnabled(::features::kPrintServerUi));
-}
-
-void AddSearchInSettingsStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"searchPrompt", IDS_SETTINGS_SEARCH_PROMPT},
- {"searchNoResults", IDS_SEARCH_NO_RESULTS},
- {"searchResults", IDS_SEARCH_RESULTS},
- // TODO(dpapad): IDS_DOWNLOAD_CLEAR_SEARCH and IDS_HISTORY_CLEAR_SEARCH
- // are identical, merge them to one and re-use here.
- {"clearSearch", IDS_DOWNLOAD_CLEAR_SEARCH},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-
- html_source->AddString(
- "searchNoOsResultsHelp",
- l10n_util::GetStringFUTF16(
- IDS_SETTINGS_SEARCH_NO_RESULTS_HELP,
- base::ASCIIToUTF16(chrome::kOsSettingsSearchHelpURL)));
-
- html_source->AddBoolean(
- "newOsSettingsSearch",
- base::FeatureList::IsEnabled(chromeos::features::kNewOsSettingsSearch));
-}
-
-void AddDateTimeStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"dateTimePageTitle", IDS_SETTINGS_DATE_TIME},
- {"timeZone", IDS_SETTINGS_TIME_ZONE},
- {"selectTimeZoneResolveMethod",
- IDS_SETTINGS_SELECT_TIME_ZONE_RESOLVE_METHOD},
- {"timeZoneGeolocation", IDS_SETTINGS_TIME_ZONE_GEOLOCATION},
- {"timeZoneButton", IDS_SETTINGS_TIME_ZONE_BUTTON},
- {"timeZoneSubpageTitle", IDS_SETTINGS_TIME_ZONE_SUBPAGE_TITLE},
- {"setTimeZoneAutomaticallyDisabled",
- IDS_SETTINGS_TIME_ZONE_DETECTION_MODE_DISABLED},
- {"setTimeZoneAutomaticallyOn",
- IDS_SETTINGS_TIME_ZONE_DETECTION_SET_AUTOMATICALLY},
- {"setTimeZoneAutomaticallyOff",
- IDS_SETTINGS_TIME_ZONE_DETECTION_CHOOSE_FROM_LIST},
- {"setTimeZoneAutomaticallyIpOnlyDefault",
- IDS_SETTINGS_TIME_ZONE_DETECTION_MODE_IP_ONLY_DEFAULT},
- {"setTimeZoneAutomaticallyWithWiFiAccessPointsData",
- IDS_SETTINGS_TIME_ZONE_DETECTION_MODE_SEND_WIFI_AP},
- {"setTimeZoneAutomaticallyWithAllLocationInfo",
- IDS_SETTINGS_TIME_ZONE_DETECTION_MODE_SEND_ALL_INFO},
- {"use24HourClock", IDS_SETTINGS_USE_24_HOUR_CLOCK},
- {"setDateTime", IDS_SETTINGS_SET_DATE_TIME},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-
- html_source->AddString(
- "timeZoneSettingsLearnMoreURL",
- base::ASCIIToUTF16(base::StringPrintf(
- chrome::kTimeZoneSettingsLearnMoreURL,
- g_browser_process->GetApplicationLocale().c_str())));
-}
-
-void AddAboutStrings(content::WebUIDataSource* html_source, Profile* profile) {
- // Top level About page strings.
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"aboutProductLogoAlt", IDS_SHORT_PRODUCT_LOGO_ALT_TEXT},
-#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
- {"aboutReportAnIssue", IDS_SETTINGS_ABOUT_PAGE_REPORT_AN_ISSUE},
-#endif
- {"aboutRelaunch", IDS_SETTINGS_ABOUT_PAGE_RELAUNCH},
- {"aboutUpgradeCheckStarted", IDS_SETTINGS_ABOUT_UPGRADE_CHECK_STARTED},
- {"aboutUpgradeRelaunch", IDS_SETTINGS_UPGRADE_SUCCESSFUL_RELAUNCH},
- {"aboutUpgradeUpdating", IDS_SETTINGS_UPGRADE_UPDATING},
- {"aboutUpgradeUpdatingPercent", IDS_SETTINGS_UPGRADE_UPDATING_PERCENT},
- {"aboutGetHelpUsingChrome", IDS_SETTINGS_GET_HELP_USING_CHROME},
- {"aboutPageTitle", IDS_SETTINGS_ABOUT_PROGRAM},
- {"aboutProductTitle", IDS_PRODUCT_NAME},
-
- {"aboutEndOfLifeTitle", IDS_SETTINGS_ABOUT_PAGE_END_OF_LIFE_TITLE},
- {"aboutRelaunchAndPowerwash",
- IDS_SETTINGS_ABOUT_PAGE_RELAUNCH_AND_POWERWASH},
- {"aboutRollbackInProgress", IDS_SETTINGS_UPGRADE_ROLLBACK_IN_PROGRESS},
- {"aboutRollbackSuccess", IDS_SETTINGS_UPGRADE_ROLLBACK_SUCCESS},
- {"aboutUpgradeUpdatingChannelSwitch",
- IDS_SETTINGS_UPGRADE_UPDATING_CHANNEL_SWITCH},
- {"aboutUpgradeSuccessChannelSwitch",
- IDS_SETTINGS_UPGRADE_SUCCESSFUL_CHANNEL_SWITCH},
- {"aboutTPMFirmwareUpdateTitle",
- IDS_SETTINGS_ABOUT_TPM_FIRMWARE_UPDATE_TITLE},
- {"aboutTPMFirmwareUpdateDescription",
- IDS_SETTINGS_ABOUT_TPM_FIRMWARE_UPDATE_DESCRIPTION},
-
- // About page, channel switcher dialog.
- {"aboutChangeChannel", IDS_SETTINGS_ABOUT_PAGE_CHANGE_CHANNEL},
- {"aboutChangeChannelAndPowerwash",
- IDS_SETTINGS_ABOUT_PAGE_CHANGE_CHANNEL_AND_POWERWASH},
- {"aboutDelayedWarningMessage",
- IDS_SETTINGS_ABOUT_PAGE_DELAYED_WARNING_MESSAGE},
- {"aboutDelayedWarningTitle", IDS_SETTINGS_ABOUT_PAGE_DELAYED_WARNING_TITLE},
- {"aboutPowerwashWarningMessage",
- IDS_SETTINGS_ABOUT_PAGE_POWERWASH_WARNING_MESSAGE},
- {"aboutPowerwashWarningTitle",
- IDS_SETTINGS_ABOUT_PAGE_POWERWASH_WARNING_TITLE},
- {"aboutUnstableWarningMessage",
- IDS_SETTINGS_ABOUT_PAGE_UNSTABLE_WARNING_MESSAGE},
- {"aboutUnstableWarningTitle",
- IDS_SETTINGS_ABOUT_PAGE_UNSTABLE_WARNING_TITLE},
- {"aboutChannelDialogBeta", IDS_SETTINGS_ABOUT_PAGE_DIALOG_CHANNEL_BETA},
- {"aboutChannelDialogDev", IDS_SETTINGS_ABOUT_PAGE_DIALOG_CHANNEL_DEV},
- {"aboutChannelDialogStable", IDS_SETTINGS_ABOUT_PAGE_DIALOG_CHANNEL_STABLE},
-
- // About page, update warning dialog.
- {"aboutUpdateWarningMessage",
- IDS_SETTINGS_ABOUT_PAGE_UPDATE_WARNING_MESSAGE},
- {"aboutUpdateWarningTitle", IDS_SETTINGS_ABOUT_PAGE_UPDATE_WARNING_TITLE},
-
- // Detailed build information
- {"aboutBuildDetailsTitle", IDS_OS_SETTINGS_ABOUT_PAGE_BUILD_DETAILS},
- {"aboutChannelBeta", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL_BETA},
- {"aboutChannelCanary", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL_CANARY},
- {"aboutChannelDev", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL_DEV},
- {"aboutChannelLabel", IDS_SETTINGS_ABOUT_PAGE_CHANNEL},
- {"aboutChannelStable", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL_STABLE},
- {"aboutCheckForUpdates", IDS_SETTINGS_ABOUT_PAGE_CHECK_FOR_UPDATES},
- {"aboutCurrentlyOnChannel", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL},
- {"aboutDetailedBuildInfo", IDS_SETTINGS_ABOUT_PAGE_DETAILED_BUILD_INFO},
- {version_ui::kApplicationLabel, IDS_PRODUCT_NAME},
- {version_ui::kPlatform, IDS_PLATFORM_LABEL},
- {version_ui::kFirmwareVersion, IDS_VERSION_UI_FIRMWARE_VERSION},
- {version_ui::kARC, IDS_ARC_LABEL},
- {"aboutBuildDetailsCopyTooltipLabel",
- IDS_OS_SETTINGS_ABOUT_PAGE_BUILD_DETAILS_COPY_TOOLTIP_LABEL},
- {"aboutIsArcStatusTitle", IDS_OS_SETTINGS_ABOUT_ARC_STATUS_TITLE},
- {"aboutIsDeveloperModeTitle", IDS_OS_SETTINGS_ABOUT_DEVELOPER_MODE},
- {"isEnterpriseManagedTitle",
- IDS_OS_SETTINGS_ABOUT_PAGE_ENTERPRISE_ENNROLLED_TITLE},
- {"aboutOsPageTitle", IDS_SETTINGS_ABOUT_OS},
- {"aboutGetHelpUsingChromeOs", IDS_SETTINGS_GET_HELP_USING_CHROME_OS},
- {"aboutOsProductTitle", IDS_PRODUCT_OS_NAME},
- {"aboutReleaseNotesOffline", IDS_SETTINGS_ABOUT_PAGE_RELEASE_NOTES},
- {"aboutShowReleaseNotes", IDS_SETTINGS_ABOUT_PAGE_SHOW_RELEASE_NOTES},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-
- html_source->AddString("aboutTPMFirmwareUpdateLearnMoreURL",
- chrome::kTPMFirmwareUpdateLearnMoreURL);
- html_source->AddString(
- "aboutUpgradeUpToDate",
- ui::SubstituteChromeOSDeviceType(IDS_SETTINGS_UPGRADE_UP_TO_DATE));
- html_source->AddString("managementPage",
- ManagementUI::GetManagementPageSubtitle(profile));
-}
-
-void AddResetStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"resetPageTitle", IDS_SETTINGS_RESET},
- {"powerwashTitle", IDS_SETTINGS_FACTORY_RESET},
- {"powerwashDialogTitle", IDS_SETTINGS_FACTORY_RESET_HEADING},
- {"powerwashDialogButton", IDS_SETTINGS_RESTART},
- {"powerwashButton", IDS_SETTINGS_FACTORY_RESET_BUTTON_LABEL},
- {"powerwashDialogExplanation", IDS_SETTINGS_FACTORY_RESET_WARNING},
- {"powerwashLearnMoreUrl", IDS_FACTORY_RESET_HELP_URL},
- {"powerwashButtonRoleDescription",
- IDS_SETTINGS_FACTORY_RESET_BUTTON_ROLE},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-
- html_source->AddString(
- "powerwashDescription",
- l10n_util::GetStringFUTF16(IDS_SETTINGS_FACTORY_RESET_DESCRIPTION,
- l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)));
-}
-
-void AddSearchStrings(content::WebUIDataSource* html_source, Profile* profile) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"osSearchEngineLabel", IDS_OS_SETTINGS_SEARCH_ENGINE_LABEL},
- {"searchGoogleAssistant", IDS_SETTINGS_SEARCH_GOOGLE_ASSISTANT},
- {"searchGoogleAssistantEnabled",
- IDS_SETTINGS_SEARCH_GOOGLE_ASSISTANT_ENABLED},
- {"searchGoogleAssistantDisabled",
- IDS_SETTINGS_SEARCH_GOOGLE_ASSISTANT_DISABLED},
- {"searchGoogleAssistantOn", IDS_SETTINGS_SEARCH_GOOGLE_ASSISTANT_ON},
- {"searchGoogleAssistantOff", IDS_SETTINGS_SEARCH_GOOGLE_ASSISTANT_OFF},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-
- // NOTE: This will be false when the flag is disabled.
- const bool is_assistant_allowed =
- ::assistant::IsAssistantAllowedForProfile(profile) ==
- ash::mojom::AssistantAllowedState::ALLOWED;
- html_source->AddBoolean("isAssistantAllowed", is_assistant_allowed);
- html_source->AddLocalizedString("osSearchPageTitle",
- is_assistant_allowed
- ? IDS_SETTINGS_SEARCH_AND_ASSISTANT
- : IDS_SETTINGS_SEARCH);
- html_source->AddString("searchExplanation",
- l10n_util::GetStringFUTF16(
- IDS_SETTINGS_SEARCH_EXPLANATION,
- base::ASCIIToUTF16(chrome::kOmniboxLearnMoreURL)));
- html_source->AddString(
- "osSearchEngineTooltip",
- ui::SubstituteChromeOSDeviceType(IDS_OS_SETTINGS_SEARCH_ENGINE_TOOLTIP));
-}
-
-void AddPrivacyStrings(content::WebUIDataSource* html_source) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"privacyPageTitle", IDS_SETTINGS_PRIVACY},
- {"enableLogging", IDS_SETTINGS_ENABLE_LOGGING_PREF},
- {"enableLoggingDesc", IDS_SETTINGS_ENABLE_LOGGING_PREF_DESC},
- {"wakeOnWifi", IDS_SETTINGS_WAKE_ON_WIFI_DESCRIPTION},
- {"enableContentProtectionAttestation",
- IDS_SETTINGS_ENABLE_CONTENT_PROTECTION_ATTESTATION},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-
- html_source->AddString("syncAndGoogleServicesLearnMoreURL",
- chrome::kSyncAndGoogleServicesLearnMoreURL);
- ::settings::AddPersonalizationOptionsStrings(html_source);
-}
-
-void AddPeoplePageStrings(content::WebUIDataSource* html_source,
- Profile* profile) {
- static constexpr webui::LocalizedString kLocalizedStrings[] = {
- {"osPeoplePageTitle", IDS_OS_SETTINGS_PEOPLE},
- {"accountManagerSubMenuLabel",
- IDS_SETTINGS_ACCOUNT_MANAGER_SUBMENU_LABEL},
- {"accountManagerPageTitle", IDS_SETTINGS_ACCOUNT_MANAGER_PAGE_TITLE},
- {"kerberosAccountsSubMenuLabel",
- IDS_SETTINGS_KERBEROS_ACCOUNTS_SUBMENU_LABEL},
- {"accountManagerPageTitle", IDS_SETTINGS_ACCOUNT_MANAGER_PAGE_TITLE},
- {"kerberosAccountsPageTitle", IDS_SETTINGS_KERBEROS_ACCOUNTS_PAGE_TITLE},
- {"lockScreenFingerprintTitle",
- IDS_SETTINGS_PEOPLE_LOCK_SCREEN_FINGERPRINT_SUBPAGE_TITLE},
- {"manageOtherPeople", IDS_SETTINGS_PEOPLE_MANAGE_OTHER_PEOPLE},
- {"osSyncPageTitle", IDS_OS_SETTINGS_SYNC_PAGE_TITLE},
- {"syncAndNonPersonalizedServices",
- IDS_SETTINGS_SYNC_SYNC_AND_NON_PERSONALIZED_SERVICES},
- {"syncDisconnectConfirm", IDS_SETTINGS_SYNC_DISCONNECT_CONFIRM},
- };
- AddLocalizedStringsBulk(html_source, kLocalizedStrings);
-
- // Toggles the Chrome OS Account Manager submenu in the People section.
- html_source->AddBoolean("isAccountManagerEnabled",
- chromeos::IsAccountManagerAvailable(profile));
-
- if (chromeos::features::IsSplitSyncConsentEnabled()) {
- static constexpr webui::LocalizedString kTurnOffStrings[] = {
- {"syncDisconnect", IDS_SETTINGS_PEOPLE_SYNC_TURN_OFF},
- {"syncDisconnectTitle",
- IDS_SETTINGS_TURN_OFF_SYNC_AND_SIGN_OUT_DIALOG_TITLE},
- };
- AddLocalizedStringsBulk(html_source, kTurnOffStrings);
- } else {
- static constexpr webui::LocalizedString kSignOutStrings[] = {
- {"syncDisconnect", IDS_SETTINGS_PEOPLE_SIGN_OUT},
- {"syncDisconnectTitle", IDS_SETTINGS_SYNC_DISCONNECT_TITLE},
- };
- AddLocalizedStringsBulk(html_source, kSignOutStrings);
- }
-
- std::string sync_dashboard_url =
- google_util::AppendGoogleLocaleParam(
- GURL(chrome::kSyncGoogleDashboardURL),
- g_browser_process->GetApplicationLocale())
- .spec();
-
- html_source->AddString(
- "syncDisconnectExplanation",
- l10n_util::GetStringFUTF8(IDS_SETTINGS_SYNC_DISCONNECT_EXPLANATION,
- base::ASCIIToUTF16(sync_dashboard_url)));
-
- AddAccountManagerPageStrings(html_source);
- AddKerberosAccountsPageStrings(html_source);
- AddKerberosAddAccountDialogStrings(html_source);
- AddLockScreenPageStrings(html_source);
- AddFingerprintListStrings(html_source);
- AddFingerprintStrings(html_source);
- AddSetupFingerprintDialogStrings(html_source);
- AddSetupPinDialogStrings(html_source);
- AddSyncControlsStrings(html_source);
-
- ::settings::AddSyncControlsStrings(html_source);
- ::settings::AddSyncAccountControlStrings(html_source);
- ::settings::AddPasswordPromptDialogStrings(html_source);
- ::settings::AddSyncPageStrings(html_source);
-}
-
-void AddPageVisibilityStrings(content::WebUIDataSource* html_source) {
- PrefService* local_state = g_browser_process->local_state();
- // Toggles the Chrome OS Kerberos Accounts submenu in the People section.
- // Note that the handler is also dependent on this pref.
- html_source->AddBoolean("isKerberosEnabled",
- local_state->GetBoolean(prefs::kKerberosEnabled));
-}
-
-} // namespace
-
-OsSettingsLocalizedStringsProvider::OsSettingsLocalizedStringsProvider(
- Profile* profile,
- local_search_service::mojom::LocalSearchService* local_search_service) {
- local_search_service->GetIndex(
- local_search_service::mojom::LocalSearchService::IndexId::CROS_SETTINGS,
- index_remote_.BindNewPipeAndPassReceiver());
-
- // Add per-page string providers.
- // TODO(khorimoto): Add providers for the remaining pages.
- per_page_providers_.push_back(
- std::make_unique<InternetStringsProvider>(profile, /*delegate=*/this));
-}
-
-OsSettingsLocalizedStringsProvider::~OsSettingsLocalizedStringsProvider() =
- default;
-
-void OsSettingsLocalizedStringsProvider::AddOsLocalizedStrings(
- content::WebUIDataSource* html_source,
- Profile* profile) {
- for (const auto& per_page_provider : per_page_providers_)
- per_page_provider->AddUiStrings(html_source);
-
- // TODO(khorimoto): Migrate these to OsSettingsPerPageStringsProvider
- // instances.
- AddAboutStrings(html_source, profile);
- AddA11yStrings(html_source);
- AddAndroidAppStrings(html_source);
- AddAppManagementStrings(html_source);
- AddAppsStrings(html_source);
- AddBluetoothStrings(html_source);
- AddChromeOSUserStrings(html_source, profile);
- AddCommonStrings(html_source, profile);
- AddCrostiniStrings(html_source, profile);
- AddDateTimeStrings(html_source);
- AddDeviceStrings(html_source);
- AddFilesStrings(html_source);
- AddGoogleAssistantStrings(html_source, profile);
- AddLanguagesStrings(html_source);
- AddMultideviceStrings(html_source);
- AddParentalControlStrings(html_source, profile);
- AddPageVisibilityStrings(html_source);
- AddPeoplePageStrings(html_source, profile);
- AddPersonalizationStrings(html_source);
- AddPluginVmStrings(html_source, profile);
- AddPrintingStrings(html_source);
- AddPrivacyStrings(html_source);
- AddResetStrings(html_source);
- AddSearchInSettingsStrings(html_source);
- AddSearchStrings(html_source, profile);
- AddUsersStrings(html_source);
-
- policy_indicator::AddLocalizedStrings(html_source);
-
- html_source->UseStringsJs();
-}
-
-const SearchConcept*
-OsSettingsLocalizedStringsProvider::GetCanonicalTagMetadata(
- int canonical_message_id) const {
- const auto it = canonical_id_to_metadata_map_.find(canonical_message_id);
- if (it == canonical_id_to_metadata_map_.end())
- return nullptr;
- return it->second;
-}
-
-void OsSettingsLocalizedStringsProvider::Shutdown() {
- index_remote_.reset();
-}
-
-void OsSettingsLocalizedStringsProvider::AddSearchTags(
- const std::vector<SearchConcept>& tags_group) {
- index_remote_->AddOrUpdate(ConceptVectorToDataPtrVector(tags_group),
- /*callback=*/base::DoNothing());
-
- // Add each concept to the map. Note that it is safe to take the address of
- // each concept because all concepts are allocated via static
- // base::NoDestructor objects in the Get*SearchConcepts() helper functions.
- for (const auto& concept : tags_group)
- canonical_id_to_metadata_map_[concept.canonical_message_id] = &concept;
-}
-
-void OsSettingsLocalizedStringsProvider::RemoveSearchTags(
- const std::vector<SearchConcept>& tags_group) {
- std::vector<std::string> ids;
- for (const auto& concept : tags_group) {
- canonical_id_to_metadata_map_.erase(concept.canonical_message_id);
- ids.push_back(base::NumberToString(concept.canonical_message_id));
- }
-
- index_remote_->Delete(ids, /*callback=*/base::DoNothing());
-}
-
-} // namespace settings
-} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.h b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.h
deleted file mode 100644
index c0d8c5adcd2..00000000000
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.h
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_OS_SETTINGS_LOCALIZED_STRINGS_PROVIDER_H_
-#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_OS_SETTINGS_LOCALIZED_STRINGS_PROVIDER_H_
-
-#include <memory>
-#include <unordered_map>
-#include <vector>
-
-#include "chrome/browser/ui/webui/settings/chromeos/os_settings_per_page_strings_provider.h"
-#include "chrome/services/local_search_service/public/mojom/local_search_service.mojom.h"
-#include "components/keyed_service/core/keyed_service.h"
-#include "mojo/public/cpp/bindings/remote.h"
-
-class Profile;
-
-namespace content {
-class WebUIDataSource;
-} // namespace content
-
-namespace chromeos {
-namespace settings {
-
-struct SearchConcept;
-
-// Provides two types of localized strings for OS settings:
-//
-// (1) UI strings: Strings displayed in the normal settings UI. This contains
-// strings such as headers, labels, instructional notes, etc. These strings
-// are added directly to the settings app's WebUIDataSource before the app
-// starts up via the static AddOsLocalizedStrings() function and are
-// accessible within settings via loadTimeData.
-//
-// (2) Search tags: Strings used as potential matches for user search queries
-// within settings. These strings don't appear in the normal UI; instead,
-// they specify actions which can be taken in settings. When a user types a
-// search query in settings, we compare the query against these strings to
-// look for potential matches. For each potential search result, there is a
-// "canonical" tag which represents a common phrase, and zero or more
-// alternate phrases (e.g., canonical: "Display settings", alternate:
-// "Monitor settings").
-//
-// Since some of the settings sections may be unavailable (e.g., we don't
-// show Bluetooth settings unless the device has Bluetooth capabilities),
-// these strings are added/removed according to the Add/Remove*SearchTags()
-// instance functions.
-class OsSettingsLocalizedStringsProvider
- : public KeyedService,
- public OsSettingsPerPageStringsProvider::Delegate {
- public:
- OsSettingsLocalizedStringsProvider(
- Profile* profile,
- local_search_service::mojom::LocalSearchService* local_search_service);
- OsSettingsLocalizedStringsProvider(
- const OsSettingsLocalizedStringsProvider& other) = delete;
- OsSettingsLocalizedStringsProvider& operator=(
- const OsSettingsLocalizedStringsProvider& other) = delete;
- ~OsSettingsLocalizedStringsProvider() override;
-
- // Adds the strings needed by the OS settings page to |html_source|
- // This function causes |html_source| to expose a strings.js file from its
- // source which contains a mapping from string's name to its translated value.
- void AddOsLocalizedStrings(content::WebUIDataSource* html_source,
- Profile* profile);
-
- // Returns the tag metadata associated with |canonical_message_id|, which must
- // be one of the canonical IDS_SETTINGS_TAG_* identifiers used for a search
- // tag. If no metadata is available or if |canonical_message_id| instead
- // refers to an alternate tag's ID, null is returned.
- const SearchConcept* GetCanonicalTagMetadata(int canonical_message_id) const;
-
- private:
- // KeyedService:
- void Shutdown() override;
-
- // OsSettingsPerPageStringsProvider::Delegate:
- void AddSearchTags(const std::vector<SearchConcept>& tags_group) override;
- void RemoveSearchTags(const std::vector<SearchConcept>& tags_group) override;
-
- std::vector<std::unique_ptr<OsSettingsPerPageStringsProvider>>
- per_page_providers_;
- mojo::Remote<local_search_service::mojom::Index> index_remote_;
- std::unordered_map<int, const SearchConcept*> canonical_id_to_metadata_map_;
-};
-
-} // namespace settings
-} // namespace chromeos
-
-#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_OS_SETTINGS_LOCALIZED_STRINGS_PROVIDER_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider_factory.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider_factory.cc
deleted file mode 100644
index 8375790e5ca..00000000000
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider_factory.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider_factory.h"
-
-#include "chrome/browser/local_search_service/local_search_service_proxy.h"
-#include "chrome/browser/local_search_service/local_search_service_proxy_factory.h"
-#include "chrome/browser/profiles/incognito_helpers.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.h"
-#include "components/keyed_service/content/browser_context_dependency_manager.h"
-
-namespace chromeos {
-namespace settings {
-
-// static
-OsSettingsLocalizedStringsProvider*
-OsSettingsLocalizedStringsProviderFactory::GetForProfile(Profile* profile) {
- return static_cast<OsSettingsLocalizedStringsProvider*>(
- OsSettingsLocalizedStringsProviderFactory::GetInstance()
- ->GetServiceForBrowserContext(profile, /*create=*/true));
-}
-
-// static
-OsSettingsLocalizedStringsProviderFactory*
-OsSettingsLocalizedStringsProviderFactory::GetInstance() {
- return base::Singleton<OsSettingsLocalizedStringsProviderFactory>::get();
-}
-
-OsSettingsLocalizedStringsProviderFactory::
- OsSettingsLocalizedStringsProviderFactory()
- : BrowserContextKeyedServiceFactory(
- "OsSettingsLocalizedStringsProvider",
- BrowserContextDependencyManager::GetInstance()) {
- DependsOn(
- local_search_service::LocalSearchServiceProxyFactory::GetInstance());
-}
-
-OsSettingsLocalizedStringsProviderFactory::
- ~OsSettingsLocalizedStringsProviderFactory() = default;
-
-KeyedService*
-OsSettingsLocalizedStringsProviderFactory::BuildServiceInstanceFor(
- content::BrowserContext* context) const {
- Profile* profile = Profile::FromBrowserContext(context);
- return new OsSettingsLocalizedStringsProvider(
- profile,
- local_search_service::LocalSearchServiceProxyFactory::GetForProfile(
- Profile::FromBrowserContext(profile))
- ->GetLocalSearchService());
-}
-
-bool OsSettingsLocalizedStringsProviderFactory::ServiceIsNULLWhileTesting()
- const {
- return true;
-}
-
-content::BrowserContext*
-OsSettingsLocalizedStringsProviderFactory::GetBrowserContextToUse(
- content::BrowserContext* context) const {
- return chrome::GetBrowserContextOwnInstanceInIncognito(context);
-}
-
-} // namespace settings
-} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider_factory.h b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider_factory.h
deleted file mode 100644
index d1b7df331e2..00000000000
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider_factory.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_OS_SETTINGS_LOCALIZED_STRINGS_PROVIDER_FACTORY_H_
-#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_OS_SETTINGS_LOCALIZED_STRINGS_PROVIDER_FACTORY_H_
-
-#include "base/memory/singleton.h"
-#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
-
-class Profile;
-
-namespace chromeos {
-namespace settings {
-
-class OsSettingsLocalizedStringsProvider;
-
-class OsSettingsLocalizedStringsProviderFactory
- : public BrowserContextKeyedServiceFactory {
- public:
- static OsSettingsLocalizedStringsProvider* GetForProfile(Profile* profile);
- static OsSettingsLocalizedStringsProviderFactory* GetInstance();
-
- private:
- friend struct base::DefaultSingletonTraits<
- OsSettingsLocalizedStringsProviderFactory>;
-
- OsSettingsLocalizedStringsProviderFactory();
- ~OsSettingsLocalizedStringsProviderFactory() override;
-
- OsSettingsLocalizedStringsProviderFactory(
- const OsSettingsLocalizedStringsProviderFactory&) = delete;
- OsSettingsLocalizedStringsProviderFactory& operator=(
- const OsSettingsLocalizedStringsProviderFactory&) = delete;
-
- // BrowserContextKeyedServiceFactory:
- KeyedService* BuildServiceInstanceFor(
- content::BrowserContext* context) const override;
- bool ServiceIsNULLWhileTesting() const override;
- content::BrowserContext* GetBrowserContextToUse(
- content::BrowserContext* context) const override;
-};
-
-} // namespace settings
-} // namespace chromeos
-
-#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_OS_SETTINGS_LOCALIZED_STRINGS_PROVIDER_FACTORY_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider_unittest.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider_unittest.cc
deleted file mode 100644
index c8eb26b6746..00000000000
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider_unittest.cc
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.h"
-
-#include "base/run_loop.h"
-#include "chrome/browser/ui/webui/settings/chromeos/search/search_concept.h"
-#include "chrome/common/webui_url_constants.h"
-#include "chrome/grit/generated_resources.h"
-#include "chrome/services/local_search_service/local_search_service_impl.h"
-#include "chrome/services/local_search_service/public/mojom/local_search_service.mojom-test-utils.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/network/network_state_test_helper.h"
-#include "chromeos/services/network_config/public/cpp/cros_network_config_test_helper.h"
-#include "content/public/test/browser_task_environment.h"
-#include "mojo/public/cpp/bindings/remote.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
-
-namespace chromeos {
-namespace settings {
-
-class OsSettingsLocalizedStringsProviderTest : public testing::Test {
- protected:
- OsSettingsLocalizedStringsProviderTest()
- : profile_manager_(TestingBrowserProcess::GetGlobal()) {}
- ~OsSettingsLocalizedStringsProviderTest() override = default;
-
- // testing::Test:
- void SetUp() override {
- ASSERT_TRUE(profile_manager_.SetUp());
-
- provider_ = std::make_unique<OsSettingsLocalizedStringsProvider>(
- profile_manager_.CreateTestingProfile("TestingProfile"),
- &local_search_service_);
-
- local_search_service_.GetIndex(
- local_search_service::mojom::LocalSearchService::IndexId::CROS_SETTINGS,
- index_remote_.BindNewPipeAndPassReceiver());
-
- // Allow asynchronous networking code to complete (networking functionality
- // is tested below).
- base::RunLoop().RunUntilIdle();
- }
-
- content::BrowserTaskEnvironment task_environment_;
- TestingProfileManager profile_manager_;
- chromeos::network_config::CrosNetworkConfigTestHelper network_config_helper_;
- mojo::Remote<local_search_service::mojom::Index> index_remote_;
- local_search_service::LocalSearchServiceImpl local_search_service_;
- std::unique_ptr<OsSettingsLocalizedStringsProvider> provider_;
-};
-
-// To prevent this from becoming a change-detector test, this test simply
-// verifies that when the provider starts up, it adds *some* strings without
-// checking the exact number. It also checks one specific canonical tag.
-TEST_F(OsSettingsLocalizedStringsProviderTest, WifiTags) {
- uint64_t initial_num_items = 0;
- local_search_service::mojom::IndexAsyncWaiter(index_remote_.get())
- .GetSize(&initial_num_items);
- EXPECT_GT(initial_num_items, 0u);
-
- const SearchConcept* network_settings_concept =
- provider_->GetCanonicalTagMetadata(IDS_SETTINGS_TAG_NETWORK_SETTINGS);
- ASSERT_TRUE(network_settings_concept);
- EXPECT_EQ(chrome::kNetworksSubPage,
- network_settings_concept->url_path_with_parameters);
- EXPECT_EQ(mojom::SearchResultIcon::kWifi, network_settings_concept->icon);
-
- // Ethernet is not present by default, so no Ethernet concepts have yet been
- // added.
- const SearchConcept* ethernet_settings_concept =
- provider_->GetCanonicalTagMetadata(IDS_SETTINGS_TAG_ETHERNET_SETTINGS);
- ASSERT_FALSE(ethernet_settings_concept);
-
- // Add Ethernet and let asynchronous handlers run. This should cause Ethernet
- // tags to be added.
- network_config_helper_.network_state_helper().device_test()->AddDevice(
- "/device/stub_eth_device", shill::kTypeEthernet, "stub_eth_device");
- base::RunLoop().RunUntilIdle();
-
- uint64_t num_items_after_adding_ethernet = 0;
- local_search_service::mojom::IndexAsyncWaiter(index_remote_.get())
- .GetSize(&num_items_after_adding_ethernet);
- EXPECT_GT(num_items_after_adding_ethernet, initial_num_items);
-
- ethernet_settings_concept =
- provider_->GetCanonicalTagMetadata(IDS_SETTINGS_TAG_ETHERNET_SETTINGS);
- ASSERT_TRUE(ethernet_settings_concept);
- EXPECT_EQ(chrome::kEthernetSettingsSubPage,
- ethernet_settings_concept->url_path_with_parameters);
- EXPECT_EQ(mojom::SearchResultIcon::kEthernet,
- ethernet_settings_concept->icon);
-}
-
-// Note that other tests do not need to be added for different group of tags,
-// since these tests would only be verifying the contents of
-// os_settings_localized_strings_provider.cc.
-
-} // namespace settings
-} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager.cc
new file mode 100644
index 00000000000..ce568062640
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager.cc
@@ -0,0 +1,72 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_manager.h"
+
+#include "base/bind.h"
+#include "base/feature_list.h"
+#include "chrome/browser/chromeos/local_search_service/local_search_service.h"
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_sections.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
+#include "chromeos/constants/chromeos_features.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/base/l10n/l10n_util.h"
+
+namespace chromeos {
+namespace settings {
+
+OsSettingsManager::OsSettingsManager(
+ Profile* profile,
+ local_search_service::LocalSearchService* local_search_service,
+ multidevice_setup::MultiDeviceSetupClient* multidevice_setup_client,
+ syncer::SyncService* sync_service,
+ SupervisedUserService* supervised_user_service,
+ KerberosCredentialsManager* kerberos_credentials_manager,
+ ArcAppListPrefs* arc_app_list_prefs,
+ signin::IdentityManager* identity_manager,
+ android_sms::AndroidSmsService* android_sms_service,
+ CupsPrintersManager* printers_manager)
+ : search_tag_registry_(
+ std::make_unique<SearchTagRegistry>(local_search_service)),
+ sections_(
+ std::make_unique<OsSettingsSections>(profile,
+ search_tag_registry_.get(),
+ multidevice_setup_client,
+ sync_service,
+ supervised_user_service,
+ kerberos_credentials_manager,
+ arc_app_list_prefs,
+ identity_manager,
+ android_sms_service,
+ printers_manager)) {
+ if (base::FeatureList::IsEnabled(features::kNewOsSettingsSearch)) {
+ search_handler_ = std::make_unique<SearchHandler>(
+ search_tag_registry_.get(), local_search_service);
+ }
+}
+
+OsSettingsManager::~OsSettingsManager() = default;
+
+void OsSettingsManager::AddLoadTimeData(content::WebUIDataSource* html_source) {
+ for (const auto& section : sections_->sections())
+ section->AddLoadTimeData(html_source);
+ html_source->UseStringsJs();
+}
+
+void OsSettingsManager::AddHandlers(content::WebUI* web_ui) {
+ for (const auto& section : sections_->sections())
+ section->AddHandlers(web_ui);
+}
+
+void OsSettingsManager::Shutdown() {
+ // Note: These must be deleted in the opposite order of their creation to
+ // prevent against UAF violations.
+ search_handler_.reset();
+ sections_.reset();
+ search_tag_registry_.reset();
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager.h b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager.h
new file mode 100644
index 00000000000..b60dbcbd181
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager.h
@@ -0,0 +1,121 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_OS_SETTINGS_MANAGER_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_OS_SETTINGS_MANAGER_H_
+
+#include <memory>
+
+#include "base/gtest_prod_util.h"
+#include "components/keyed_service/core/keyed_service.h"
+
+class ArcAppListPrefs;
+class Profile;
+class SupervisedUserService;
+
+namespace content {
+class WebUI;
+class WebUIDataSource;
+} // namespace content
+
+namespace local_search_service {
+class LocalSearchService;
+} // namespace local_search_service
+
+namespace signin {
+class IdentityManager;
+} // namespace signin
+
+namespace syncer {
+class SyncService;
+} // namespace syncer
+
+namespace chromeos {
+
+class CupsPrintersManager;
+class KerberosCredentialsManager;
+
+namespace android_sms {
+class AndroidSmsService;
+} // namespace android_sms
+
+namespace multidevice_setup {
+class MultiDeviceSetupClient;
+} // namespace multidevice_setup
+
+namespace settings {
+
+class OsSettingsSections;
+class SearchHandler;
+class SearchTagRegistry;
+
+// Manager for the Chrome OS settings page. This class is implemented as a
+// KeyedService, so one instance of the class is intended to be active for the
+// lifetime of a logged-in user, even if the settings app is not opened.
+//
+// Main responsibilities:
+//
+// (1) Support search queries for settings content. OsSettingsManager is
+// responsible for updating the kCroSettings index of the LocalSearchService
+// with search tags corresponding to all settings which are available.
+//
+// The availability of settings depends on the user's account (e.g.,
+// Personalization settings are not available for guest accounts), the state
+// of the device (e.g., devices without an external monitor hide some
+// display settings), Enterprise settings (e.g., ARC++ is prohibited by some
+// policies), and the state of various flags and switches.
+//
+// Whenever settings becomes available or unavailable, OsSettingsManager
+// updates the search index accordingly.
+//
+// (2) Provide static data to the settings app via the loadTimeData framework.
+// This includes localized strings required by the settings UI as well as
+// flags passed as booleans.
+//
+// (3) Add logic supporting message-passing between the browser process (C++)
+// and the settings app (JS), via SettingsPageUIHandler objects.
+class OsSettingsManager : public KeyedService {
+ public:
+ OsSettingsManager(
+ Profile* profile,
+ local_search_service::LocalSearchService* local_search_service,
+ multidevice_setup::MultiDeviceSetupClient* multidevice_setup_client,
+ syncer::SyncService* sync_service,
+ SupervisedUserService* supervised_user_service,
+ KerberosCredentialsManager* kerberos_credentials_manager,
+ ArcAppListPrefs* arc_app_list_prefs,
+ signin::IdentityManager* identity_manager,
+ android_sms::AndroidSmsService* android_sms_service,
+ CupsPrintersManager* printers_manager);
+ OsSettingsManager(const OsSettingsManager& other) = delete;
+ OsSettingsManager& operator=(const OsSettingsManager& other) = delete;
+ ~OsSettingsManager() override;
+
+ // Provides static data (i.e., localized strings and flag values) to an OS
+ // settings instance. This function causes |html_source| to export a
+ // strings.js file which contains a key-value map of the data added by this
+ // function.
+ void AddLoadTimeData(content::WebUIDataSource* html_source);
+
+ // Adds SettingsPageUIHandlers to an OS settings instance.
+ void AddHandlers(content::WebUI* web_ui);
+
+ // Note: Returns null when the kNewOsSettingsSearch flag is disabled.
+ SearchHandler* search_handler() { return search_handler_.get(); }
+
+ private:
+ FRIEND_TEST_ALL_PREFIXES(OsSettingsManagerTest, Sections);
+
+ // KeyedService:
+ void Shutdown() override;
+
+ std::unique_ptr<SearchTagRegistry> search_tag_registry_;
+ std::unique_ptr<OsSettingsSections> sections_;
+ std::unique_ptr<SearchHandler> search_handler_;
+};
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_OS_SETTINGS_MANAGER_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager_factory.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager_factory.cc
new file mode 100644
index 00000000000..a238deaf5fb
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager_factory.cc
@@ -0,0 +1,79 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_manager_factory.h"
+
+#include "chrome/browser/chromeos/android_sms/android_sms_service_factory.h"
+#include "chrome/browser/chromeos/kerberos/kerberos_credentials_manager_factory.h"
+#include "chrome/browser/chromeos/local_search_service/local_search_service_factory.h"
+#include "chrome/browser/chromeos/multidevice_setup/multidevice_setup_client_factory.h"
+#include "chrome/browser/chromeos/printing/cups_printers_manager_factory.h"
+#include "chrome/browser/profiles/incognito_helpers.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/signin/identity_manager_factory.h"
+#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
+#include "chrome/browser/sync/profile_sync_service_factory.h"
+#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs_factory.h"
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_manager.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+
+namespace chromeos {
+namespace settings {
+
+// static
+OsSettingsManager* OsSettingsManagerFactory::GetForProfile(Profile* profile) {
+ return static_cast<OsSettingsManager*>(
+ OsSettingsManagerFactory::GetInstance()->GetServiceForBrowserContext(
+ profile, /*create=*/true));
+}
+
+// static
+OsSettingsManagerFactory* OsSettingsManagerFactory::GetInstance() {
+ return base::Singleton<OsSettingsManagerFactory>::get();
+}
+
+OsSettingsManagerFactory::OsSettingsManagerFactory()
+ : BrowserContextKeyedServiceFactory(
+ "OsSettingsManager",
+ BrowserContextDependencyManager::GetInstance()) {
+ DependsOn(local_search_service::LocalSearchServiceFactory::GetInstance());
+ DependsOn(multidevice_setup::MultiDeviceSetupClientFactory::GetInstance());
+ DependsOn(ProfileSyncServiceFactory::GetInstance());
+ DependsOn(SupervisedUserServiceFactory::GetInstance());
+ DependsOn(KerberosCredentialsManagerFactory::GetInstance());
+ DependsOn(ArcAppListPrefsFactory::GetInstance());
+ DependsOn(IdentityManagerFactory::GetInstance());
+ DependsOn(android_sms::AndroidSmsServiceFactory::GetInstance());
+ DependsOn(CupsPrintersManagerFactory::GetInstance());
+}
+
+OsSettingsManagerFactory::~OsSettingsManagerFactory() = default;
+
+KeyedService* OsSettingsManagerFactory::BuildServiceInstanceFor(
+ content::BrowserContext* context) const {
+ Profile* profile = Profile::FromBrowserContext(context);
+ return new OsSettingsManager(
+ profile,
+ local_search_service::LocalSearchServiceFactory::GetForProfile(profile),
+ multidevice_setup::MultiDeviceSetupClientFactory::GetForProfile(profile),
+ ProfileSyncServiceFactory::GetForProfile(profile),
+ SupervisedUserServiceFactory::GetForProfile(profile),
+ KerberosCredentialsManagerFactory::Get(profile),
+ ArcAppListPrefsFactory::GetForBrowserContext(profile),
+ IdentityManagerFactory::GetForProfile(profile),
+ android_sms::AndroidSmsServiceFactory::GetForBrowserContext(profile),
+ CupsPrintersManagerFactory::GetForBrowserContext(profile));
+}
+
+bool OsSettingsManagerFactory::ServiceIsNULLWhileTesting() const {
+ return true;
+}
+
+content::BrowserContext* OsSettingsManagerFactory::GetBrowserContextToUse(
+ content::BrowserContext* context) const {
+ return chrome::GetBrowserContextOwnInstanceInIncognito(context);
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager_factory.h b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager_factory.h
new file mode 100644
index 00000000000..33706357f0c
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager_factory.h
@@ -0,0 +1,43 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_OS_SETTINGS_MANAGER_FACTORY_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_OS_SETTINGS_MANAGER_FACTORY_H_
+
+#include "base/memory/singleton.h"
+#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+
+class Profile;
+
+namespace chromeos {
+namespace settings {
+
+class OsSettingsManager;
+
+class OsSettingsManagerFactory : public BrowserContextKeyedServiceFactory {
+ public:
+ static OsSettingsManager* GetForProfile(Profile* profile);
+ static OsSettingsManagerFactory* GetInstance();
+
+ private:
+ friend struct base::DefaultSingletonTraits<OsSettingsManagerFactory>;
+
+ OsSettingsManagerFactory();
+ ~OsSettingsManagerFactory() override;
+
+ OsSettingsManagerFactory(const OsSettingsManagerFactory&) = delete;
+ OsSettingsManagerFactory& operator=(const OsSettingsManagerFactory&) = delete;
+
+ // BrowserContextKeyedServiceFactory:
+ KeyedService* BuildServiceInstanceFor(
+ content::BrowserContext* context) const override;
+ bool ServiceIsNULLWhileTesting() const override;
+ content::BrowserContext* GetBrowserContextToUse(
+ content::BrowserContext* context) const override;
+};
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_OS_SETTINGS_MANAGER_FACTORY_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager_unittest.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager_unittest.cc
new file mode 100644
index 00000000000..ec50ed54481
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_manager_unittest.cc
@@ -0,0 +1,53 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_manager.h"
+
+#include "base/no_destructor.h"
+#include "chrome/browser/ui/webui/settings/chromeos/constants/constants_util.h"
+#include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h"
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_manager_factory.h"
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_sections.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 "content/public/test/browser_task_environment.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace chromeos {
+namespace settings {
+
+// Verifies the OsSettingsManager initialization flow. Behavioral functionality
+// is tested via unit tests on the sub-elements owned by OsSettingsManager.
+class OsSettingsManagerTest : public testing::Test {
+ protected:
+ OsSettingsManagerTest()
+ : profile_manager_(TestingBrowserProcess::GetGlobal()) {}
+ ~OsSettingsManagerTest() override = default;
+
+ // testing::Test:
+ void SetUp() override {
+ ASSERT_TRUE(profile_manager_.SetUp());
+ TestingProfile* profile =
+ profile_manager_.CreateTestingProfile("TestingProfile");
+
+ manager_ = OsSettingsManagerFactory::GetForProfile(profile);
+ }
+
+ content::BrowserTaskEnvironment task_environment_;
+ TestingProfileManager profile_manager_;
+ OsSettingsManager* manager_;
+};
+
+TEST_F(OsSettingsManagerTest, Sections) {
+ // For each mojom::Section value, there should be an associated
+ // OsSettingsSection class registered.
+ for (const auto& section : constants::AllSections()) {
+ EXPECT_TRUE(manager_->sections_->GetSection(section))
+ << "No OsSettingsSection instance created for " << section << ".";
+ }
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_per_page_strings_provider.h b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_per_page_strings_provider.h
deleted file mode 100644
index c2a6771c85b..00000000000
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_per_page_strings_provider.h
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_OS_SETTINGS_PER_PAGE_STRINGS_PROVIDER_H_
-#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_OS_SETTINGS_PER_PAGE_STRINGS_PROVIDER_H_
-
-#include <string>
-#include <vector>
-
-#include "base/strings/string16.h"
-#include "chrome/browser/ui/webui/settings/chromeos/search/search_concept.h"
-
-class Profile;
-
-namespace content {
-class WebUIDataSource;
-} // namespace content
-
-namespace chromeos {
-namespace settings {
-
-// Provides strings for an individual page in OS settings (i.e., each subpage is
-// expected to have its own implementation. Responsible for two types of
-// strings:
-//
-// (1) UI strings: Strings (e.g., headers, labels) displayed in the settings UI.
-// Added to a WebUIDataSource via the pure virtual AddUiStrings() function.
-//
-// (2) Search tags: Strings used as potential matches for user search queries
-// within settings. Added/removed via the {Add|Remove}SearchTagsGroup
-// delegate functions. Tags which are always searchable should be added in
-// the class' constructor; however, tags which apply to content which is
-// dynamically shown/hidden should be added when that content is visible and
-// removed when the content is no longer visible.
-class OsSettingsPerPageStringsProvider {
- public:
- class Delegate {
- public:
- ~Delegate() = default;
- virtual void AddSearchTags(
- const std::vector<SearchConcept>& tags_group) = 0;
- virtual void RemoveSearchTags(
- const std::vector<SearchConcept>& tags_group) = 0;
- };
-
- virtual ~OsSettingsPerPageStringsProvider();
-
- OsSettingsPerPageStringsProvider(
- const OsSettingsPerPageStringsProvider& other) = delete;
- OsSettingsPerPageStringsProvider& operator=(
- const OsSettingsPerPageStringsProvider& other) = delete;
-
- // Adds strings to be displayed in the UI via loadTimeData.
- virtual void AddUiStrings(content::WebUIDataSource* html_source) const = 0;
-
- protected:
- static base::string16 GetHelpUrlWithBoard(const std::string& original_url);
-
- OsSettingsPerPageStringsProvider(Profile* profile, Delegate* delegate);
-
- Profile* profile() { return profile_; }
- Delegate* delegate() { return delegate_; }
-
- private:
- Profile* profile_;
- Delegate* delegate_;
-};
-
-} // namespace settings
-} // namespace chromeos
-
-#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_OS_SETTINGS_PER_PAGE_STRINGS_PROVIDER_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_per_page_strings_provider.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_section.cc
index 26ac31b8cf6..af60b362b5f 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_per_page_strings_provider.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_section.cc
@@ -2,9 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "chrome/browser/ui/webui/settings/chromeos/os_settings_per_page_strings_provider.h"
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h"
-#include "base/logging.h"
+#include "base/check.h"
#include "base/strings/utf_string_conversions.h"
#include "base/system/sys_info.h"
@@ -12,20 +12,19 @@ namespace chromeos {
namespace settings {
// static
-base::string16 OsSettingsPerPageStringsProvider::GetHelpUrlWithBoard(
+base::string16 OsSettingsSection::GetHelpUrlWithBoard(
const std::string& original_url) {
return base::ASCIIToUTF16(original_url +
"&b=" + base::SysInfo::GetLsbReleaseBoard());
}
-OsSettingsPerPageStringsProvider::~OsSettingsPerPageStringsProvider() = default;
+OsSettingsSection::~OsSettingsSection() = default;
-OsSettingsPerPageStringsProvider::OsSettingsPerPageStringsProvider(
- Profile* profile,
- Delegate* delegate)
- : profile_(profile), delegate_(delegate) {
+OsSettingsSection::OsSettingsSection(Profile* profile,
+ SearchTagRegistry* search_tag_registry)
+ : profile_(profile), search_tag_registry_(search_tag_registry) {
DCHECK(profile);
- DCHECK(delegate);
+ DCHECK(search_tag_registry);
}
} // namespace settings
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_section.h b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_section.h
new file mode 100644
index 00000000000..3e8b5b23bcd
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_section.h
@@ -0,0 +1,70 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_OS_SETTINGS_SECTION_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_OS_SETTINGS_SECTION_H_
+
+#include <string>
+#include <vector>
+
+#include "base/strings/string16.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_concept.h"
+
+class Profile;
+
+namespace content {
+class WebUI;
+class WebUIDataSource;
+} // namespace content
+
+namespace chromeos {
+namespace settings {
+
+class SearchTagRegistry;
+
+// Represents one top-level section of the settings app (i.e., one item on the
+// settings UI navigation).
+//
+// When instantiated, an OsSettingsSection should track whether the section and
+// any of its subpages or individual settings should be available to the user
+// based on the current environment (user account details, device capabilities,
+// flags, etc). If a section is available, search tags should be added for that
+// section via AddSearchTags(), and if that section becomes unavailable, search
+// tags should be removed via RemoveSearchTags().
+//
+// When the settings app is initialized, this class is used to add loadTimeData
+// (e.g., localized strings and flag values) as well as SettingsPageUIHandlers
+// (i.e., browser to JS IPC mechanisms) to the page.
+class OsSettingsSection {
+ public:
+ virtual ~OsSettingsSection();
+
+ OsSettingsSection(const OsSettingsSection& other) = delete;
+ OsSettingsSection& operator=(const OsSettingsSection& other) = delete;
+
+ // Provides static data (i.e., localized strings and flag values) to an OS
+ // settings instance.
+ virtual void AddLoadTimeData(content::WebUIDataSource* html_source) = 0;
+
+ // Adds SettingsPageUIHandlers to an OS settings instance. Override if the
+ // derived type requires one or more handlers for this section.
+ virtual void AddHandlers(content::WebUI* web_ui) {}
+
+ protected:
+ static base::string16 GetHelpUrlWithBoard(const std::string& original_url);
+
+ OsSettingsSection(Profile* profile, SearchTagRegistry* search_tag_registry);
+
+ Profile* profile() { return profile_; }
+ SearchTagRegistry* registry() { return search_tag_registry_; }
+
+ private:
+ Profile* profile_;
+ SearchTagRegistry* search_tag_registry_;
+};
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_OS_SETTINGS_SECTION_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_sections.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_sections.cc
new file mode 100644
index 00000000000..6239b2466c5
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_sections.cc
@@ -0,0 +1,141 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_sections.h"
+
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/settings/chromeos/about_section.h"
+#include "chrome/browser/ui/webui/settings/chromeos/accessibility_section.h"
+#include "chrome/browser/ui/webui/settings/chromeos/apps_section.h"
+#include "chrome/browser/ui/webui/settings/chromeos/bluetooth_section.h"
+#include "chrome/browser/ui/webui/settings/chromeos/crostini_section.h"
+#include "chrome/browser/ui/webui/settings/chromeos/date_time_section.h"
+#include "chrome/browser/ui/webui/settings/chromeos/device_section.h"
+#include "chrome/browser/ui/webui/settings/chromeos/files_section.h"
+#include "chrome/browser/ui/webui/settings/chromeos/internet_section.h"
+#include "chrome/browser/ui/webui/settings/chromeos/languages_section.h"
+#include "chrome/browser/ui/webui/settings/chromeos/main_section.h"
+#include "chrome/browser/ui/webui/settings/chromeos/multidevice_section.h"
+#include "chrome/browser/ui/webui/settings/chromeos/people_section.h"
+#include "chrome/browser/ui/webui/settings/chromeos/personalization_section.h"
+#include "chrome/browser/ui/webui/settings/chromeos/printing_section.h"
+#include "chrome/browser/ui/webui/settings/chromeos/privacy_section.h"
+#include "chrome/browser/ui/webui/settings/chromeos/reset_section.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search_section.h"
+
+namespace chromeos {
+namespace settings {
+
+OsSettingsSections::OsSettingsSections(
+ Profile* profile,
+ SearchTagRegistry* search_tag_registry,
+ multidevice_setup::MultiDeviceSetupClient* multidevice_setup_client,
+ syncer::SyncService* sync_service,
+ SupervisedUserService* supervised_user_service,
+ KerberosCredentialsManager* kerberos_credentials_manager,
+ ArcAppListPrefs* arc_app_list_prefs,
+ signin::IdentityManager* identity_manager,
+ android_sms::AndroidSmsService* android_sms_service,
+ CupsPrintersManager* printers_manager) {
+ // Special case: Main section does not have an associated enum value.
+ sections_.push_back(
+ std::make_unique<MainSection>(profile, search_tag_registry));
+
+ auto internet_section =
+ std::make_unique<InternetSection>(profile, search_tag_registry);
+ sections_map_[mojom::Section::kNetwork] = internet_section.get();
+ sections_.push_back(std::move(internet_section));
+
+ auto bluetooth_section =
+ std::make_unique<BluetoothSection>(profile, search_tag_registry);
+ sections_map_[mojom::Section::kBluetooth] = bluetooth_section.get();
+ sections_.push_back(std::move(bluetooth_section));
+
+ auto multidevice_section = std::make_unique<MultiDeviceSection>(
+ profile, search_tag_registry, multidevice_setup_client,
+ android_sms_service, profile->GetPrefs());
+ sections_map_[mojom::Section::kMultiDevice] = multidevice_section.get();
+ sections_.push_back(std::move(multidevice_section));
+
+ auto people_section = std::make_unique<PeopleSection>(
+ profile, search_tag_registry, sync_service, supervised_user_service,
+ kerberos_credentials_manager, identity_manager, profile->GetPrefs());
+ sections_map_[mojom::Section::kPeople] = people_section.get();
+ sections_.push_back(std::move(people_section));
+
+ auto device_section = std::make_unique<DeviceSection>(
+ profile, search_tag_registry, profile->GetPrefs());
+ sections_map_[mojom::Section::kDevice] = device_section.get();
+ sections_.push_back(std::move(device_section));
+
+ auto personalization_section = std::make_unique<PersonalizationSection>(
+ profile, search_tag_registry, profile->GetPrefs());
+ sections_map_[mojom::Section::kPersonalization] =
+ personalization_section.get();
+ sections_.push_back(std::move(personalization_section));
+
+ auto search_section =
+ std::make_unique<SearchSection>(profile, search_tag_registry);
+ sections_map_[mojom::Section::kSearchAndAssistant] = search_section.get();
+ sections_.push_back(std::move(search_section));
+
+ auto apps_section = std::make_unique<AppsSection>(
+ profile, search_tag_registry, profile->GetPrefs(), arc_app_list_prefs);
+ sections_map_[mojom::Section::kApps] = apps_section.get();
+ sections_.push_back(std::move(apps_section));
+
+ auto crostini_section = std::make_unique<CrostiniSection>(
+ profile, search_tag_registry, profile->GetPrefs());
+ sections_map_[mojom::Section::kCrostini] = crostini_section.get();
+ sections_.push_back(std::move(crostini_section));
+
+ auto date_time_section =
+ std::make_unique<DateTimeSection>(profile, search_tag_registry);
+ sections_map_[mojom::Section::kDateAndTime] = date_time_section.get();
+ sections_.push_back(std::move(date_time_section));
+
+ auto privacy_section =
+ std::make_unique<PrivacySection>(profile, search_tag_registry);
+ sections_map_[mojom::Section::kPrivacyAndSecurity] = privacy_section.get();
+ sections_.push_back(std::move(privacy_section));
+
+ auto language_section =
+ std::make_unique<LanguagesSection>(profile, search_tag_registry);
+ sections_map_[mojom::Section::kLanguagesAndInput] = language_section.get();
+ sections_.push_back(std::move(language_section));
+
+ auto files_section =
+ std::make_unique<FilesSection>(profile, search_tag_registry);
+ sections_map_[mojom::Section::kFiles] = files_section.get();
+ sections_.push_back(std::move(files_section));
+
+ auto printing_section = std::make_unique<PrintingSection>(
+ profile, search_tag_registry, printers_manager);
+ sections_map_[mojom::Section::kPrinting] = printing_section.get();
+ sections_.push_back(std::move(printing_section));
+
+ auto accessibility_section = std::make_unique<AccessibilitySection>(
+ profile, search_tag_registry, profile->GetPrefs());
+ sections_map_[mojom::Section::kAccessibility] = accessibility_section.get();
+ sections_.push_back(std::move(accessibility_section));
+
+ auto reset_section =
+ std::make_unique<ResetSection>(profile, search_tag_registry);
+ sections_map_[mojom::Section::kReset] = reset_section.get();
+ sections_.push_back(std::move(reset_section));
+
+ auto about_section =
+ std::make_unique<AboutSection>(profile, search_tag_registry);
+ sections_map_[mojom::Section::kAboutChromeOs] = about_section.get();
+ sections_.push_back(std::move(about_section));
+}
+
+OsSettingsSections::~OsSettingsSections() = default;
+
+OsSettingsSection* OsSettingsSections::GetSection(mojom::Section section) {
+ return sections_map_[section];
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_sections.h b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_sections.h
new file mode 100644
index 00000000000..44ddc68a34d
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_sections.h
@@ -0,0 +1,73 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_OS_SETTINGS_SECTIONS_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_OS_SETTINGS_SECTIONS_H_
+
+#include <unordered_map>
+#include <vector>
+
+#include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h"
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h"
+
+class ArcAppListPrefs;
+class Profile;
+class SupervisedUserService;
+
+namespace signin {
+class IdentityManager;
+} // namespace signin
+
+namespace syncer {
+class SyncService;
+} // namespace syncer
+
+namespace chromeos {
+
+class CupsPrintersManager;
+class KerberosCredentialsManager;
+
+namespace android_sms {
+class AndroidSmsService;
+} // namespace android_sms
+
+namespace multidevice_setup {
+class MultiDeviceSetupClient;
+} // namespace multidevice_setup
+
+namespace settings {
+
+// Collection of all OsSettingsSection implementations.
+class OsSettingsSections {
+ public:
+ OsSettingsSections(
+ Profile* profile,
+ SearchTagRegistry* search_tag_registry,
+ multidevice_setup::MultiDeviceSetupClient* multidevice_setup_client,
+ syncer::SyncService* sync_service,
+ SupervisedUserService* supervised_user_service,
+ KerberosCredentialsManager* kerberos_credentials_manager,
+ ArcAppListPrefs* arc_app_list_prefs,
+ signin::IdentityManager* identity_manager,
+ android_sms::AndroidSmsService* android_sms_service,
+ CupsPrintersManager* printers_manager);
+ OsSettingsSections(const OsSettingsSections& other) = delete;
+ OsSettingsSections& operator=(const OsSettingsSections& other) = delete;
+ ~OsSettingsSections();
+
+ OsSettingsSection* GetSection(mojom::Section section);
+
+ std::vector<std::unique_ptr<OsSettingsSection>>& sections() {
+ return sections_;
+ }
+
+ private:
+ std::unordered_map<mojom::Section, OsSettingsSection*> sections_map_;
+ std::vector<std::unique_ptr<OsSettingsSection>> sections_;
+};
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_OS_SETTINGS_SECTIONS_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc
index dd4edc8807a..97f2eeab8a9 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc
@@ -4,117 +4,37 @@
#include "chrome/browser/ui/webui/settings/chromeos/os_settings_ui.h"
-#include <stddef.h>
-
-#include <memory>
-#include <string>
#include <utility>
-#include <vector>
-#include "ash/public/cpp/ash_features.h"
#include "ash/public/cpp/network_config_service.h"
-#include "ash/public/cpp/resources/grit/ash_public_unscaled_resources.h"
-#include "ash/public/cpp/stylus_utils.h"
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/feature_list.h"
-#include "base/memory/ptr_util.h"
#include "base/metrics/histogram_functions.h"
-#include "build/build_config.h"
-#include "chrome/browser/browser_process.h"
-#include "chrome/browser/browser_process_platform_part.h"
-#include "chrome/browser/chromeos/account_manager/account_manager_util.h"
-#include "chrome/browser/chromeos/arc/arc_util.h"
-#include "chrome/browser/chromeos/crostini/crostini_features.h"
-#include "chrome/browser/chromeos/login/demo_mode/demo_session.h"
-#include "chrome/browser/chromeos/login/quick_unlock/quick_unlock_utils.h"
-#include "chrome/browser/chromeos/multidevice_setup/multidevice_setup_client_factory.h"
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_pref_names.h"
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_util.h"
-#include "chrome/browser/chromeos/profiles/profile_helper.h"
-#include "chrome/browser/signin/identity_manager_factory.h"
-#include "chrome/browser/ui/ui_features.h"
-#include "chrome/browser/ui/webui/app_management/app_management.mojom.h"
-#include "chrome/browser/ui/webui/app_management/app_management_page_handler.h"
-#include "chrome/browser/ui/webui/chromeos/smb_shares/smb_handler.h"
-#include "chrome/browser/ui/webui/chromeos/sync/os_sync_handler.h"
#include "chrome/browser/ui/webui/managed_ui_handler.h"
-#include "chrome/browser/ui/webui/metrics_handler.h"
-#include "chrome/browser/ui/webui/plural_string_handler.h"
-#include "chrome/browser/ui/webui/settings/about_handler.h"
-#include "chrome/browser/ui/webui/settings/accessibility_main_handler.h"
-#include "chrome/browser/ui/webui/settings/browser_lifetime_handler.h"
-#include "chrome/browser/ui/webui/settings/chromeos/accessibility_handler.h"
-#include "chrome/browser/ui/webui/settings/chromeos/account_manager_handler.h"
-#include "chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.h"
-#include "chrome/browser/ui/webui/settings/chromeos/android_apps_handler.h"
-#include "chrome/browser/ui/webui/settings/chromeos/change_picture_handler.h"
-#include "chrome/browser/ui/webui/settings/chromeos/crostini_handler.h"
-#include "chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h"
-#include "chrome/browser/ui/webui/settings/chromeos/date_time_handler.h"
-#include "chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler.h"
-#include "chrome/browser/ui/webui/settings/chromeos/device_pointer_handler.h"
-#include "chrome/browser/ui/webui/settings/chromeos/device_power_handler.h"
#include "chrome/browser/ui/webui/settings/chromeos/device_storage_handler.h"
-#include "chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.h"
-#include "chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.h"
-#include "chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.h"
-#include "chrome/browser/ui/webui/settings/chromeos/internet_handler.h"
-#include "chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.h"
-#include "chrome/browser/ui/webui/settings/chromeos/multidevice_handler.h"
-#include "chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.h"
-#include "chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider_factory.h"
-#include "chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.h"
-#include "chrome/browser/ui/webui/settings/chromeos/plugin_vm_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_manager.h"
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_manager_factory.h"
#include "chrome/browser/ui/webui/settings/chromeos/pref_names.h"
-#include "chrome/browser/ui/webui/settings/chromeos/quick_unlock_handler.h"
#include "chrome/browser/ui/webui/settings/chromeos/search/search_handler.h"
-#include "chrome/browser/ui/webui/settings/chromeos/search/search_handler_factory.h"
#include "chrome/browser/ui/webui/settings/chromeos/search/settings_user_action_tracker.h"
-#include "chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.h"
-#include "chrome/browser/ui/webui/settings/downloads_handler.h"
-#include "chrome/browser/ui/webui/settings/extension_control_handler.h"
-#include "chrome/browser/ui/webui/settings/font_handler.h"
-#include "chrome/browser/ui/webui/settings/languages_handler.h"
-#include "chrome/browser/ui/webui/settings/people_handler.h"
-#include "chrome/browser/ui/webui/settings/profile_info_handler.h"
-#include "chrome/browser/ui/webui/settings/protocol_handlers_handler.h"
-#include "chrome/browser/ui/webui/settings/reset_settings_handler.h"
-#include "chrome/browser/ui/webui/settings/search_engines_handler.h"
-#include "chrome/browser/ui/webui/settings/settings_cookies_view_handler.h"
-#include "chrome/browser/ui/webui/settings/settings_localized_strings_provider.h"
-#include "chrome/browser/ui/webui/settings/settings_media_devices_selection_handler.h"
-#include "chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.h"
-#include "chrome/browser/ui/webui/settings/tts_handler.h"
#include "chrome/browser/ui/webui/webui_util.h"
-#include "chrome/browser/web_applications/system_web_app_manager.h"
-#include "chrome/common/chrome_features.h"
#include "chrome/common/webui_url_constants.h"
-#include "chrome/grit/browser_resources.h"
-#include "chrome/grit/generated_resources.h"
#include "chrome/grit/os_settings_resources.h"
#include "chrome/grit/os_settings_resources_map.h"
-#include "chromeos/components/account_manager/account_manager.h"
-#include "chromeos/components/account_manager/account_manager_factory.h"
-#include "chromeos/components/web_applications/manifest_request_filter.h"
#include "chromeos/constants/chromeos_features.h"
-#include "chromeos/constants/chromeos_pref_names.h"
-#include "chromeos/login/auth/password_visibility_utils.h"
-#include "chromeos/services/multidevice_setup/public/cpp/prefs.h"
-#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h"
-#include "components/password_manager/core/common/password_manager_features.h"
#include "components/pref_registry/pref_registry_syncable.h"
#include "components/prefs/pref_service.h"
#include "content/public/browser/web_ui_data_source.h"
-#include "media/base/media_switches.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
-#include "ui/base/webui/web_ui_util.h"
-#include "ui/chromeos/resources/grit/ui_chromeos_resources.h"
-#include "ui/resources/grit/webui_resources.h"
namespace chromeos {
namespace settings {
+#if !BUILDFLAG(OPTIMIZE_WEBUI)
+namespace {
+const char kOsGeneratedPath[] =
+ "@out_folder@/gen/chrome/browser/resources/settings/";
+}
+#endif
+
// static
void OSSettingsUI::RegisterProfilePrefs(
user_prefs::PrefRegistrySyncable* registry) {
@@ -131,73 +51,15 @@ OSSettingsUI::OSSettingsUI(content::WebUI* web_ui)
content::WebUIDataSource* html_source =
content::WebUIDataSource::Create(chrome::kChromeUIOSSettingsHost);
- InitOSWebUIHandlers(html_source);
-
- // This handler is for chrome://os-settings.
- html_source->AddBoolean("isOSSettings", true);
-
- // Needed for JS code shared between browser and OS settings (for example,
- // page_visibility.js).
- html_source->AddBoolean("showOSSettings", true);
-
- html_source->AddBoolean(
- "showParentalControls",
- chromeos::settings::ShouldShowParentalControls(profile));
- html_source->AddBoolean(
- "syncSetupFriendlySettings",
- base::FeatureList::IsEnabled(::features::kSyncSetupFriendlySettings));
+ OsSettingsManager* manager = OsSettingsManagerFactory::GetForProfile(profile);
+ manager->AddHandlers(web_ui);
+ manager->AddLoadTimeData(html_source);
- AddSettingsPageUIHandler(
- std::make_unique<::settings::AccessibilityMainHandler>());
- AddSettingsPageUIHandler(
- std::make_unique<::settings::BrowserLifetimeHandler>());
- AddSettingsPageUIHandler(std::make_unique<::settings::CookiesViewHandler>());
- AddSettingsPageUIHandler(
- std::make_unique<::settings::DownloadsHandler>(profile));
- AddSettingsPageUIHandler(
- std::make_unique<::settings::ExtensionControlHandler>());
- AddSettingsPageUIHandler(std::make_unique<::settings::FontHandler>(web_ui));
- AddSettingsPageUIHandler(
- std::make_unique<::settings::LanguagesHandler>(web_ui));
- AddSettingsPageUIHandler(
- std::make_unique<::settings::MediaDevicesSelectionHandler>(profile));
- if (chromeos::features::IsSplitSettingsSyncEnabled())
- AddSettingsPageUIHandler(std::make_unique<OSSyncHandler>(profile));
- AddSettingsPageUIHandler(
- std::make_unique<::settings::PeopleHandler>(profile));
- AddSettingsPageUIHandler(
- std::make_unique<::settings::ProfileInfoHandler>(profile));
- AddSettingsPageUIHandler(
- std::make_unique<::settings::ProtocolHandlersHandler>());
- AddSettingsPageUIHandler(
- std::make_unique<::settings::SearchEnginesHandler>(profile));
-
- html_source->AddBoolean("showAppManagement", base::FeatureList::IsEnabled(
- ::features::kAppManagement));
- html_source->AddBoolean("splitSettingsSyncEnabled",
- chromeos::features::IsSplitSettingsSyncEnabled());
- html_source->AddBoolean("splitSyncConsent",
- chromeos::features::IsSplitSyncConsentEnabled());
-
- html_source->AddBoolean(
- "isSupportedArcVersion",
- AppManagementPageHandler::IsCurrentArcVersionSupported(profile));
-
- AddSettingsPageUIHandler(
- base::WrapUnique(::settings::AboutHandler::Create(html_source, profile)));
- AddSettingsPageUIHandler(base::WrapUnique(
- ::settings::ResetSettingsHandler::Create(html_source, profile)));
-
- // Add the metrics handler to write uma stats.
- web_ui->AddMessageHandler(std::make_unique<MetricsHandler>());
-
- // Add the System Web App resources for Settings.
- if (web_app::SystemWebAppManager::IsEnabled()) {
- html_source->AddResourcePath("icon-192.png", IDR_SETTINGS_LOGO_192);
- html_source->AddResourcePath("pwa.html", IDR_PWA_HTML);
- web_app::SetManifestRequestFilter(html_source, IDR_OS_SETTINGS_MANIFEST,
- IDS_SETTINGS_SETTINGS);
- }
+ // TODO(khorimoto): Move to DeviceSection::AddHandler() once |html_source|
+ // parameter is removed.
+ web_ui->AddMessageHandler(
+ std::make_unique<chromeos::settings::StorageHandler>(profile,
+ html_source));
#if BUILDFLAG(OPTIMIZE_WEBUI)
html_source->AddResourcePath("crisper.js", IDR_OS_SETTINGS_CRISPER_JS);
@@ -207,52 +69,12 @@ OSSettingsUI::OSSettingsUI(content::WebUI* web_ui)
IDR_OS_SETTINGS_LAZY_LOAD_VULCANIZED_HTML);
html_source->SetDefaultResource(IDR_OS_SETTINGS_VULCANIZED_HTML);
#else
- // Add all settings resources.
- for (size_t i = 0; i < kOsSettingsResourcesSize; ++i) {
- html_source->AddResourcePath(kOsSettingsResources[i].name,
- kOsSettingsResources[i].value);
- }
- html_source->SetDefaultResource(IDR_OS_SETTINGS_SETTINGS_HTML);
+ webui::SetupWebUIDataSource(
+ html_source,
+ base::make_span(kOsSettingsResources, kOsSettingsResourcesSize),
+ kOsGeneratedPath, IDR_OS_SETTINGS_SETTINGS_HTML);
#endif
- html_source->AddResourcePath("app-management/app_management.mojom-lite.js",
- IDR_OS_SETTINGS_APP_MANAGEMENT_MOJO_LITE_JS);
- html_source->AddResourcePath(
- "app-management/types.mojom-lite.js",
- IDR_OS_SETTINGS_APP_MANAGEMENT_TYPES_MOJO_LITE_JS);
- html_source->AddResourcePath(
- "app-management/bitmap.mojom-lite.js",
- IDR_OS_SETTINGS_APP_MANAGEMENT_BITMAP_MOJO_LITE_JS);
- html_source->AddResourcePath(
- "app-management/file_path.mojom-lite.js",
- IDR_OS_SETTINGS_APP_MANAGEMENT_FILE_PATH_MOJO_LITE_JS);
- html_source->AddResourcePath(
- "app-management/image.mojom-lite.js",
- IDR_OS_SETTINGS_APP_MANAGEMENT_IMAGE_MOJO_LITE_JS);
- html_source->AddResourcePath(
- "app-management/image_info.mojom-lite.js",
- IDR_OS_SETTINGS_APP_MANAGEMENT_IMAGE_INFO_MOJO_LITE_JS);
-
- html_source->AddResourcePath(
- "search/user_action_recorder.mojom-lite.js",
- IDR_OS_SETTINGS_USER_ACTION_RECORDER_MOJOM_LITE_JS);
- html_source->AddResourcePath(
- "search/search_result_icon.mojom-lite.js",
- IDR_OS_SETTINGS_SEARCH_RESULT_ICON_MOJOM_LITE_JS);
- html_source->AddResourcePath("search/search.mojom-lite.js",
- IDR_OS_SETTINGS_SEARCH_MOJOM_LITE_JS);
-
- // AddOsLocalizedStrings must be added after AddBrowserLocalizedStrings
- // as repeated keys used by the OS strings should override the same keys
- // that may be used in the Browser string provider.
- OsSettingsLocalizedStringsProviderFactory::GetForProfile(profile)
- ->AddOsLocalizedStrings(html_source, profile);
-
- auto plural_string_handler = std::make_unique<PluralStringHandler>();
- plural_string_handler->AddLocalizedString("profileLabel",
- IDS_OS_SETTINGS_PROFILE_LABEL);
- web_ui->AddMessageHandler(std::move(plural_string_handler));
-
ManagedUIHandler::Initialize(web_ui, html_source);
content::WebUIDataSource::Add(web_ui->GetWebContents()->GetBrowserContext(),
@@ -268,206 +90,6 @@ OSSettingsUI::~OSSettingsUI() {
/*buckets=*/50);
}
-void OSSettingsUI::InitOSWebUIHandlers(content::WebUIDataSource* html_source) {
- Profile* profile = Profile::FromWebUI(web_ui());
-
- // TODO(jamescook): Sort out how account management is split between Chrome OS
- // and browser settings.
- if (chromeos::IsAccountManagerAvailable(profile)) {
- chromeos::AccountManagerFactory* factory =
- g_browser_process->platform_part()->GetAccountManagerFactory();
- chromeos::AccountManager* account_manager =
- factory->GetAccountManager(profile->GetPath().value());
- DCHECK(account_manager);
-
- web_ui()->AddMessageHandler(
- std::make_unique<chromeos::settings::AccountManagerUIHandler>(
- account_manager, IdentityManagerFactory::GetForProfile(profile)));
- html_source->AddBoolean(
- "secondaryGoogleAccountSigninAllowed",
- profile->GetPrefs()->GetBoolean(
- chromeos::prefs::kSecondaryGoogleAccountSigninAllowed));
- html_source->AddBoolean("isEduCoexistenceEnabled",
- features::IsEduCoexistenceEnabled());
- }
-
- web_ui()->AddMessageHandler(
- std::make_unique<chromeos::settings::ChangePictureHandler>());
-
- web_ui()->AddMessageHandler(
- std::make_unique<chromeos::settings::AccessibilityHandler>(profile));
- web_ui()->AddMessageHandler(
- std::make_unique<chromeos::settings::AndroidAppsHandler>(profile));
- if (crostini::CrostiniFeatures::Get()->IsUIAllowed(profile,
- /*check_policy=*/false)) {
- web_ui()->AddMessageHandler(
- std::make_unique<chromeos::settings::CrostiniHandler>(profile));
- }
- web_ui()->AddMessageHandler(
- chromeos::settings::CupsPrintersHandler::Create(web_ui()));
- web_ui()->AddMessageHandler(base::WrapUnique(
- chromeos::settings::DateTimeHandler::Create(html_source)));
- web_ui()->AddMessageHandler(
- std::make_unique<chromeos::settings::FingerprintHandler>(profile));
- web_ui()->AddMessageHandler(
- std::make_unique<chromeos::settings::GoogleAssistantHandler>(profile));
-
- std::unique_ptr<chromeos::settings::KerberosAccountsHandler>
- kerberos_accounts_handler =
- chromeos::settings::KerberosAccountsHandler::CreateIfKerberosEnabled(
- profile);
- if (kerberos_accounts_handler) {
- // Note that the UI is enabled only if Kerberos is enabled.
- web_ui()->AddMessageHandler(std::move(kerberos_accounts_handler));
- }
-
- web_ui()->AddMessageHandler(
- std::make_unique<chromeos::settings::KeyboardHandler>());
-
- web_ui()->AddMessageHandler(
- std::make_unique<chromeos::settings::WallpaperHandler>(web_ui()));
-
- // If |!allow_plugin_vm| we still want to |show_plugin_vm| if the VM image is
- // on disk, so that users are still able to delete the image at will.
- const bool allow_plugin_vm = plugin_vm::IsPluginVmAllowedForProfile(profile);
- const bool show_plugin_vm =
- allow_plugin_vm ||
- profile->GetPrefs()->GetBoolean(plugin_vm::prefs::kPluginVmImageExists);
-
- if (show_plugin_vm) {
- web_ui()->AddMessageHandler(
- std::make_unique<chromeos::settings::PluginVmHandler>(profile));
- }
- web_ui()->AddMessageHandler(
- std::make_unique<chromeos::settings::PointerHandler>());
- web_ui()->AddMessageHandler(
- std::make_unique<chromeos::settings::QuickUnlockHandler>());
- web_ui()->AddMessageHandler(
- std::make_unique<chromeos::settings::StorageHandler>(profile,
- html_source));
- web_ui()->AddMessageHandler(
- std::make_unique<chromeos::settings::StylusHandler>());
- web_ui()->AddMessageHandler(
- std::make_unique<chromeos::settings::InternetHandler>(profile));
- web_ui()->AddMessageHandler(std::make_unique<::settings::TtsHandler>());
- web_ui()->AddMessageHandler(
- std::make_unique<chromeos::smb_dialog::SmbHandler>(profile,
- base::DoNothing()));
-
- if (!profile->IsGuestSession()) {
- chromeos::android_sms::AndroidSmsService* android_sms_service =
- chromeos::android_sms::AndroidSmsServiceFactory::GetForBrowserContext(
- profile);
- web_ui()->AddMessageHandler(
- std::make_unique<chromeos::settings::MultideviceHandler>(
- profile->GetPrefs(),
- chromeos::multidevice_setup::MultiDeviceSetupClientFactory::
- GetForProfile(profile),
- android_sms_service
- ? android_sms_service->android_sms_pairing_state_tracker()
- : nullptr,
- android_sms_service ? android_sms_service->android_sms_app_manager()
- : nullptr));
- if (chromeos::settings::ShouldShowParentalControls(profile)) {
- web_ui()->AddMessageHandler(
- std::make_unique<chromeos::settings::ParentalControlsHandler>(
- profile));
- }
-
- if (chromeos::features::IsAmbientModeEnabled()) {
- web_ui()->AddMessageHandler(
- std::make_unique<chromeos::settings::AmbientModeHandler>());
- }
- }
-
- html_source->AddBoolean(
- "privacySettingsRedesignEnabled",
- base::FeatureList::IsEnabled(::features::kPrivacySettingsRedesign));
-
- html_source->AddBoolean(
- "multideviceAllowedByPolicy",
- chromeos::multidevice_setup::AreAnyMultiDeviceFeaturesAllowed(
- profile->GetPrefs()));
- html_source->AddBoolean(
- "quickUnlockEnabled",
- chromeos::quick_unlock::IsPinEnabled(profile->GetPrefs()));
- html_source->AddBoolean(
- "quickUnlockDisabledByPolicy",
- chromeos::quick_unlock::IsPinDisabledByPolicy(profile->GetPrefs()));
- html_source->AddBoolean(
- "userCannotManuallyEnterPassword",
- !chromeos::password_visibility::AccountHasUserFacingPassword(
- chromeos::ProfileHelper::Get()
- ->GetUserByProfile(profile)
- ->GetAccountId()));
- const bool fingerprint_unlock_enabled =
- chromeos::quick_unlock::IsFingerprintEnabled(profile);
- html_source->AddBoolean("fingerprintUnlockEnabled",
- fingerprint_unlock_enabled);
- if (fingerprint_unlock_enabled) {
- html_source->AddInteger(
- "fingerprintReaderLocation",
- static_cast<int32_t>(chromeos::quick_unlock::GetFingerprintLocation()));
-
- // To use lottie, the worker-src CSP needs to be updated for the web ui that
- // is using it. Since as of now there are only a couple of webuis using
- // lottie animations, this update has to be performed manually. As the usage
- // increases, set this as the default so manual override is no longer
- // required.
- html_source->OverrideContentSecurityPolicyWorkerSrc(
- "worker-src blob: 'self';");
- html_source->AddResourcePath("finger_print.json",
- IDR_LOGIN_FINGER_PRINT_TABLET_ANIMATION);
- }
- html_source->AddBoolean("lockScreenNotificationsEnabled",
- ash::features::IsLockScreenNotificationsEnabled());
- html_source->AddBoolean(
- "lockScreenHideSensitiveNotificationsSupported",
- ash::features::IsLockScreenHideSensitiveNotificationsSupported());
- html_source->AddBoolean("showTechnologyBadge",
- !ash::features::IsSeparateNetworkIconsEnabled());
- html_source->AddBoolean("hasInternalStylus",
- ash::stylus_utils::HasInternalStylus());
-
- html_source->AddBoolean("showCrostini",
- crostini::CrostiniFeatures::Get()->IsUIAllowed(
- profile, /*check_policy=*/false));
-
- html_source->AddBoolean(
- "allowCrostini", crostini::CrostiniFeatures::Get()->IsUIAllowed(profile));
-
- html_source->AddBoolean("allowPluginVm", allow_plugin_vm);
- html_source->AddBoolean("showPluginVm", show_plugin_vm);
-
- html_source->AddBoolean("isDemoSession",
- chromeos::DemoSession::IsDeviceInDemoMode());
-
- // We have 2 variants of Android apps settings. Default case, when the Play
- // Store app exists we show expandable section that allows as to
- // enable/disable the Play Store and link to Android settings which is
- // available once settings app is registered in the system.
- // For AOSP images we don't have the Play Store app. In last case we Android
- // apps settings consists only from root link to Android settings and only
- // visible once settings app is registered.
- html_source->AddBoolean("androidAppsVisible",
- arc::IsArcAllowedForProfile(profile));
- html_source->AddBoolean("havePlayStoreApp", arc::IsPlayStoreAvailable());
-
- html_source->AddBoolean("enablePowerSettings", true);
- web_ui()->AddMessageHandler(
- std::make_unique<chromeos::settings::PowerHandler>(profile->GetPrefs()));
-
- html_source->AddBoolean(
- "showParentalControlsSettings",
- chromeos::settings::ShouldShowParentalControls(profile));
-}
-
-void OSSettingsUI::AddSettingsPageUIHandler(
- std::unique_ptr<content::WebUIMessageHandler> handler) {
- DCHECK(handler);
- web_ui()->AddMessageHandler(std::move(handler));
-}
-
void OSSettingsUI::BindInterface(
mojo::PendingReceiver<network_config::mojom::CrosNetworkConfig> receiver) {
ash::GetNetworkConfigService(std::move(receiver));
@@ -481,7 +103,11 @@ void OSSettingsUI::BindInterface(
void OSSettingsUI::BindInterface(
mojo::PendingReceiver<mojom::SearchHandler> receiver) {
- SearchHandlerFactory::GetForProfile(Profile::FromWebUI(web_ui()))
+ if (!base::FeatureList::IsEnabled(::chromeos::features::kNewOsSettingsSearch))
+ return;
+
+ OsSettingsManagerFactory::GetForProfile(Profile::FromWebUI(web_ui()))
+ ->search_handler()
->BindInterface(std::move(receiver));
}
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.h b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.h
index c72c6b57c22..2b4e49fd6bb 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.h
@@ -17,11 +17,6 @@
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "ui/webui/mojo_web_ui_controller.h"
-namespace content {
-class WebUIDataSource;
-class WebUIMessageHandler;
-} // namespace content
-
namespace user_prefs {
class PrefRegistrySyncable;
} // namespace user_prefs
@@ -41,9 +36,6 @@ class OSSettingsUI : public ui::MojoWebUIController {
explicit OSSettingsUI(content::WebUI* web_ui);
~OSSettingsUI() override;
- // Initializes the WebUI message handlers for OS-specific settings.
- void InitOSWebUIHandlers(content::WebUIDataSource* html_source);
-
// Instantiates implementor of the mojom::CrosNetworkConfig mojo interface
// passing the pending receiver that will be internally bound.
void BindInterface(
@@ -64,9 +56,6 @@ class OSSettingsUI : public ui::MojoWebUIController {
receiver);
private:
- void AddSettingsPageUIHandler(
- std::unique_ptr<content::WebUIMessageHandler> handler);
-
base::TimeTicks time_when_opened_;
WebuiLoadTimer webui_load_timer_;
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.cc
index 19182163f23..273e9456b69 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.cc
@@ -9,9 +9,7 @@
#include "base/values.h"
#include "chrome/browser/apps/app_service/app_service_proxy.h"
#include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
-#include "chrome/browser/policy/profile_policy_connector.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/chromeos/child_accounts/child_user_service.h"
#include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
#include "chrome/browser/ui/browser_navigator.h"
#include "chrome/browser/ui/browser_navigator_params.h"
@@ -29,13 +27,6 @@
namespace chromeos {
namespace settings {
-const char kFamilyLinkHelperAppPackageName[] =
- "com.google.android.apps.kids.familylinkhelper";
-
-const char kFamilyLinkChildHelperAppPlayStoreURL[] =
- "https://play.google.com/store/apps/"
- "details?id=com.google.android.apps.kids.familylinkhelper";
-
const char kFamilyLinkSiteURL[] = "https://families.google.com/families";
ParentalControlsHandler::ParentalControlsHandler(Profile* profile)
@@ -75,8 +66,8 @@ void ParentalControlsHandler::HandleLaunchFamilyLinkSettings(
apps::AppServiceProxyFactory::GetForProfile(profile_);
apps::AppRegistryCache& registry = proxy->AppRegistryCache();
- const std::string app_id =
- arc::ArcPackageNameToAppId(kFamilyLinkHelperAppPackageName, profile_);
+ const std::string app_id = arc::ArcPackageNameToAppId(
+ chromeos::ChildUserService::kFamilyLinkHelperAppPackageName, profile_);
if (registry.GetAppType(app_id) != apps::mojom::AppType::kUnknown) {
// Launch FLH app since it is available.
proxy->Launch(app_id, ui::EventFlags::EF_NONE,
@@ -87,7 +78,8 @@ void ParentalControlsHandler::HandleLaunchFamilyLinkSettings(
// No FLH app installed, so try to launch Play Store to FLH app install page.
// If there is no Play Store available LaunchPlayStoreWithUrl() will return
// false.
- if (arc::LaunchPlayStoreWithUrl(kFamilyLinkChildHelperAppPlayStoreURL)) {
+ if (arc::LaunchPlayStoreWithUrl(
+ chromeos::ChildUserService::kFamilyLinkHelperAppPlayStoreURL)) {
return;
}
// As a last resort, launch browser to the family link site.
@@ -98,17 +90,5 @@ void ParentalControlsHandler::HandleLaunchFamilyLinkSettings(
Navigate(&params);
}
-bool ShouldShowParentalControls(Profile* profile) {
- // Show Parental controls for regular and child accounts that are the
- // primary profile. Do not show it to any secondary profiles, managed
- // accounts that aren't child accounts (i.e. enterprise and EDU accounts),
- // OTR accounts, or legacy supervised user accounts.
- return chromeos::features::IsParentalControlsSettingsEnabled() &&
- profile == ProfileManager::GetPrimaryUserProfile() &&
- !profile->IsLegacySupervised() && !profile->IsGuestSession() &&
- (profile->IsChild() ||
- !profile->GetProfilePolicyConnector()->IsManaged());
-}
-
} // namespace settings
} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.h
index 517bc1b50fd..cb498d3db33 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.h
@@ -37,9 +37,6 @@ class ParentalControlsHandler : public ::settings::SettingsPageUIHandler {
DISALLOW_COPY_AND_ASSIGN(ParentalControlsHandler);
};
-// Indicates whether parental controls should be shown in the settings UI.
-bool ShouldShowParentalControls(Profile* profile);
-
} // namespace settings
} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/people_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/people_section.cc
new file mode 100644
index 00000000000..45486f9eed4
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/people_section.cc
@@ -0,0 +1,859 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/people_section.h"
+
+#include "ash/public/cpp/ash_features.h"
+#include "base/bind.h"
+#include "base/i18n/number_formatting.h"
+#include "base/no_destructor.h"
+#include "base/strings/strcat.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/browser_process_platform_part.h"
+#include "chrome/browser/chromeos/account_manager/account_manager_util.h"
+#include "chrome/browser/chromeos/login/quick_unlock/quick_unlock_utils.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/supervised_user/supervised_user_service.h"
+#include "chrome/browser/ui/ui_features.h"
+#include "chrome/browser/ui/webui/chromeos/sync/os_sync_handler.h"
+#include "chrome/browser/ui/webui/plural_string_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/account_manager_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.h"
+#include "chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/quick_unlock_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
+#include "chrome/browser/ui/webui/settings/people_handler.h"
+#include "chrome/browser/ui/webui/settings/profile_info_handler.h"
+#include "chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/common/webui_url_constants.h"
+#include "chrome/grit/chromium_strings.h"
+#include "chrome/grit/generated_resources.h"
+#include "chromeos/components/account_manager/account_manager_factory.h"
+#include "chromeos/constants/chromeos_features.h"
+#include "chromeos/constants/chromeos_pref_names.h"
+#include "components/google/core/common/google_util.h"
+#include "components/omnibox/common/omnibox_features.h"
+#include "components/prefs/pref_service.h"
+#include "components/sync/driver/sync_service.h"
+#include "components/sync/driver/sync_user_settings.h"
+#include "components/user_manager/user_manager.h"
+#include "content/public/browser/web_ui.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/webui/web_ui_util.h"
+#include "ui/chromeos/resources/grit/ui_chromeos_resources.h"
+
+namespace chromeos {
+namespace settings {
+namespace {
+
+const std::vector<SearchConcept>& GetPeopleSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_PEOPLE,
+ mojom::kPeopleSectionPath,
+ mojom::SearchResultIcon::kAvatar,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSection,
+ {.section = mojom::Section::kPeople}},
+ {IDS_OS_SETTINGS_TAG_LOCK_SCREEN_PIN_OR_PASSWORD,
+ mojom::kSecurityAndSignInSubpagePath,
+ mojom::SearchResultIcon::kLock,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kChangeAuthPin}},
+ {IDS_OS_SETTINGS_TAG_USERNAMES_AND_PHOTOS,
+ mojom::kManageOtherPeopleSubpagePath,
+ mojom::SearchResultIcon::kAvatar,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kShowUsernamesAndPhotosAtSignIn},
+ {IDS_OS_SETTINGS_TAG_USERNAMES_AND_PHOTOS_ALT1,
+ IDS_OS_SETTINGS_TAG_USERNAMES_AND_PHOTOS_ALT2,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_PEOPLE_ACCOUNTS,
+ mojom::kMyAccountsSubpagePath,
+ mojom::SearchResultIcon::kAvatar,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kMyAccounts}},
+ {IDS_OS_SETTINGS_TAG_PEOPLE_ACCOUNTS_ADD,
+ mojom::kMyAccountsSubpagePath,
+ mojom::SearchResultIcon::kAvatar,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kAddAccount}},
+ {IDS_OS_SETTINGS_TAG_RESTRICT_SIGN_IN_REMOVE,
+ mojom::kManageOtherPeopleSubpagePath,
+ mojom::SearchResultIcon::kAvatar,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kRemoveFromUserWhitelist}},
+ {IDS_OS_SETTINGS_TAG_GUEST_BROWSING,
+ mojom::kManageOtherPeopleSubpagePath,
+ mojom::SearchResultIcon::kAvatar,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kGuestBrowsing}},
+ {IDS_OS_SETTINGS_TAG_LOCK_SCREEN_WHEN_WAKING,
+ mojom::kSecurityAndSignInSubpagePath,
+ mojom::SearchResultIcon::kLock,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kLockScreen},
+ {IDS_OS_SETTINGS_TAG_LOCK_SCREEN_WHEN_WAKING_ALT1,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_SYNC,
+ mojom::kSyncSubpagePath,
+ mojom::SearchResultIcon::kSync,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kSync}},
+ {IDS_OS_SETTINGS_TAG_PEOPLE_ACCOUNTS_REMOVE,
+ mojom::kMyAccountsSubpagePath,
+ mojom::SearchResultIcon::kAvatar,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kRemoveAccount}},
+ {IDS_OS_SETTINGS_TAG_RESTRICT_SIGN_IN,
+ mojom::kManageOtherPeopleSubpagePath,
+ mojom::SearchResultIcon::kAvatar,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kRestrictSignIn},
+ {IDS_OS_SETTINGS_TAG_RESTRICT_SIGN_IN_ALT1, SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_LOCK_SCREEN,
+ mojom::kSecurityAndSignInSubpagePath,
+ mojom::SearchResultIcon::kLock,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kSecurityAndSignIn}},
+ {IDS_OS_SETTINGS_TAG_RESTRICT_SIGN_IN_ADD,
+ mojom::kManageOtherPeopleSubpagePath,
+ mojom::SearchResultIcon::kAvatar,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kAddToUserWhitelist}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetSyncOnSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_SYNC_TURN_OFF,
+ mojom::kSyncSubpagePath,
+ mojom::SearchResultIcon::kSync,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kSyncOnOff},
+ {IDS_OS_SETTINGS_TAG_SYNC_TURN_OFF_ALT1, SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetSyncOffSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_SYNC_TURN_ON,
+ mojom::kSyncSubpagePath,
+ mojom::SearchResultIcon::kSync,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kSyncOnOff},
+ {IDS_OS_SETTINGS_TAG_SYNC_TURN_ON_ALT1, SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetKerberosSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_KERBEROS_ADD,
+ mojom::kKerberosSubpagePath,
+ mojom::SearchResultIcon::kAvatar,
+ mojom::SearchResultDefaultRank::kLow,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kAddKerberosTicket}},
+ {IDS_OS_SETTINGS_TAG_KERBEROS_REMOVE,
+ mojom::kKerberosSubpagePath,
+ mojom::SearchResultIcon::kAvatar,
+ mojom::SearchResultDefaultRank::kLow,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kRemoveKerberosTicket}},
+ {IDS_OS_SETTINGS_TAG_KERBEROS,
+ mojom::kKerberosSubpagePath,
+ mojom::SearchResultIcon::kAvatar,
+ mojom::SearchResultDefaultRank::kLow,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kKerberos}},
+ {IDS_OS_SETTINGS_TAG_KERBEROS_ACTIVE,
+ mojom::kKerberosSubpagePath,
+ mojom::SearchResultIcon::kAvatar,
+ mojom::SearchResultDefaultRank::kLow,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kSetActiveKerberosTicket}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetFingerprintSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_FINGERPRINT_REMOVE,
+ mojom::kFingerprintSubpathPath,
+ mojom::SearchResultIcon::kFingerprint,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kRemoveFingerprint}},
+ {IDS_OS_SETTINGS_TAG_FINGERPRINT_ADD,
+ mojom::kFingerprintSubpathPath,
+ mojom::SearchResultIcon::kFingerprint,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kAddFingerprint}},
+ {IDS_OS_SETTINGS_TAG_FINGERPRINT,
+ mojom::kFingerprintSubpathPath,
+ mojom::SearchResultIcon::kFingerprint,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kFingerprint}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetParentalSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_PARENTAL_CONTROLS,
+ mojom::kPeopleSectionPath,
+ mojom::SearchResultIcon::kAvatar,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kSetUpParentalControls},
+ {IDS_OS_SETTINGS_TAG_PARENTAL_CONTROLS_ALT1,
+ IDS_OS_SETTINGS_TAG_PARENTAL_CONTROLS_ALT2, SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+void AddAccountManagerPageStrings(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"accountManagerDescription", IDS_SETTINGS_ACCOUNT_MANAGER_DESCRIPTION},
+ {"accountManagerChildDescription",
+ IDS_SETTINGS_ACCOUNT_MANAGER_CHILD_DESCRIPTION_2},
+ {"accountListHeader", IDS_SETTINGS_ACCOUNT_MANAGER_LIST_HEADER},
+ {"accountManagerPrimaryAccountTooltip",
+ IDS_SETTINGS_ACCOUNT_MANAGER_PRIMARY_ACCOUNT_TOOLTIP},
+ {"accountManagerEducationAccountLabel",
+ IDS_SETTINGS_ACCOUNT_MANAGER_EDUCATION_ACCOUNT},
+ {"removeAccountLabel", IDS_SETTINGS_ACCOUNT_MANAGER_REMOVE_ACCOUNT_LABEL},
+ {"addAccountLabel", IDS_SETTINGS_ACCOUNT_MANAGER_ADD_ACCOUNT_LABEL},
+ {"addSchoolAccountLabel",
+ IDS_SETTINGS_ACCOUNT_MANAGER_ADD_SCHOOL_ACCOUNT_LABEL},
+ {"accountManagerSecondaryAccountsDisabledText",
+ IDS_SETTINGS_ACCOUNT_MANAGER_SECONDARY_ACCOUNTS_DISABLED_TEXT},
+ {"accountManagerSecondaryAccountsDisabledChildText",
+ IDS_SETTINGS_ACCOUNT_MANAGER_SECONDARY_ACCOUNTS_DISABLED_CHILD_TEXT},
+ {"accountManagerSignedOutAccountName",
+ IDS_SETTINGS_ACCOUNT_MANAGER_SIGNED_OUT_ACCOUNT_PLACEHOLDER},
+ {"accountManagerUnmigratedAccountName",
+ IDS_SETTINGS_ACCOUNT_MANAGER_UNMIGRATED_ACCOUNT_PLACEHOLDER},
+ {"accountManagerMigrationLabel",
+ IDS_SETTINGS_ACCOUNT_MANAGER_MIGRATION_LABEL},
+ {"accountManagerReauthenticationLabel",
+ IDS_SETTINGS_ACCOUNT_MANAGER_REAUTHENTICATION_LABEL},
+ {"accountManagerMigrationTooltip",
+ IDS_SETTINGS_ACCOUNT_MANAGER_MIGRATION_TOOLTIP},
+ {"accountManagerReauthenticationTooltip",
+ IDS_SETTINGS_ACCOUNT_MANAGER_REAUTHENTICATION_TOOLTIP},
+ {"accountManagerMoreActionsTooltip",
+ IDS_SETTINGS_ACCOUNT_MANAGER_MORE_ACTIONS_TOOLTIP},
+ {"accountManagerManagedLabel",
+ IDS_SETTINGS_ACCOUNT_MANAGER_MANAGEMENT_STATUS_MANAGED_ACCOUNT},
+ {"accountManagerUnmanagedLabel",
+ IDS_SETTINGS_ACCOUNT_MANAGER_MANAGEMENT_STATUS_UNMANAGED_ACCOUNT},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ html_source->AddString("accountManagerLearnMoreUrl",
+ chrome::kAccountManagerLearnMoreURL);
+}
+
+void AddKerberosAddAccountDialogStrings(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"kerberosAccountsAdvancedConfigLabel",
+ IDS_SETTINGS_KERBEROS_ACCOUNTS_ADVANCED_CONFIG_LABEL},
+ {"kerberosAdvancedConfigTitle",
+ IDS_SETTINGS_KERBEROS_ADVANCED_CONFIG_TITLE},
+ {"kerberosAdvancedConfigDesc",
+ IDS_SETTINGS_KERBEROS_ADVANCED_CONFIG_DESC},
+ {"addKerberosAccountRememberPassword",
+ IDS_SETTINGS_ADD_KERBEROS_ACCOUNT_REMEMBER_PASSWORD},
+ {"kerberosPassword", IDS_SETTINGS_KERBEROS_PASSWORD},
+ {"kerberosUsername", IDS_SETTINGS_KERBEROS_USERNAME},
+ {"addKerberosAccountDescription",
+ IDS_SETTINGS_ADD_KERBEROS_ACCOUNT_DESCRIPTION},
+ {"kerberosErrorNetworkProblem",
+ IDS_SETTINGS_KERBEROS_ERROR_NETWORK_PROBLEM},
+ {"kerberosErrorUsernameInvalid",
+ IDS_SETTINGS_KERBEROS_ERROR_USERNAME_INVALID},
+ {"kerberosErrorUsernameUnknown",
+ IDS_SETTINGS_KERBEROS_ERROR_USERNAME_UNKNOWN},
+ {"kerberosErrorDuplicatePrincipalName",
+ IDS_SETTINGS_KERBEROS_ERROR_DUPLICATE_PRINCIPAL_NAME},
+ {"kerberosErrorContactingServer",
+ IDS_SETTINGS_KERBEROS_ERROR_CONTACTING_SERVER},
+ {"kerberosErrorPasswordInvalid",
+ IDS_SETTINGS_KERBEROS_ERROR_PASSWORD_INVALID},
+ {"kerberosErrorPasswordExpired",
+ IDS_SETTINGS_KERBEROS_ERROR_PASSWORD_EXPIRED},
+ {"kerberosErrorKdcEncType", IDS_SETTINGS_KERBEROS_ERROR_KDC_ENC_TYPE},
+ {"kerberosErrorGeneral", IDS_SETTINGS_KERBEROS_ERROR_GENERAL},
+ {"kerberosConfigErrorSectionNestedInGroup",
+ IDS_SETTINGS_KERBEROS_CONFIG_ERROR_SECTION_NESTED_IN_GROUP},
+ {"kerberosConfigErrorSectionSyntax",
+ IDS_SETTINGS_KERBEROS_CONFIG_ERROR_SECTION_SYNTAX},
+ {"kerberosConfigErrorExpectedOpeningCurlyBrace",
+ IDS_SETTINGS_KERBEROS_CONFIG_ERROR_EXPECTED_OPENING_CURLY_BRACE},
+ {"kerberosConfigErrorExtraCurlyBrace",
+ IDS_SETTINGS_KERBEROS_CONFIG_ERROR_EXTRA_CURLY_BRACE},
+ {"kerberosConfigErrorRelationSyntax",
+ IDS_SETTINGS_KERBEROS_CONFIG_ERROR_RELATION_SYNTAX_ERROR},
+ {"kerberosConfigErrorKeyNotSupported",
+ IDS_SETTINGS_KERBEROS_CONFIG_ERROR_KEY_NOT_SUPPORTED},
+ {"kerberosConfigErrorSectionNotSupported",
+ IDS_SETTINGS_KERBEROS_CONFIG_ERROR_SECTION_NOT_SUPPORTED},
+ {"kerberosConfigErrorKrb5FailedToParse",
+ IDS_SETTINGS_KERBEROS_CONFIG_ERROR_KRB5_FAILED_TO_PARSE},
+ {"addKerberosAccountRefreshButtonLabel",
+ IDS_SETTINGS_ADD_KERBEROS_ACCOUNT_REFRESH_BUTTON_LABEL},
+ {"addKerberosAccount", IDS_SETTINGS_ADD_KERBEROS_ACCOUNT},
+ {"refreshKerberosAccount", IDS_SETTINGS_REFRESH_KERBEROS_ACCOUNT},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ PrefService* local_state = g_browser_process->local_state();
+
+ // Whether the 'Remember password' checkbox is enabled.
+ html_source->AddBoolean(
+ "kerberosRememberPasswordEnabled",
+ local_state->GetBoolean(::prefs::kKerberosRememberPasswordEnabled));
+
+ // Kerberos default configuration.
+ html_source->AddString(
+ "defaultKerberosConfig",
+ chromeos::KerberosCredentialsManager::GetDefaultKerberosConfig());
+}
+
+void AddLockScreenPageStrings(content::WebUIDataSource* html_source,
+ PrefService* pref_service) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"lockScreenNotificationTitle",
+ IDS_ASH_SETTINGS_LOCK_SCREEN_NOTIFICATION_TITLE},
+ {"lockScreenNotificationHideSensitive",
+ IDS_ASH_SETTINGS_LOCK_SCREEN_NOTIFICATION_HIDE_SENSITIVE},
+ {"enableScreenlock", IDS_SETTINGS_PEOPLE_ENABLE_SCREENLOCK},
+ {"lockScreenNotificationShow",
+ IDS_ASH_SETTINGS_LOCK_SCREEN_NOTIFICATION_SHOW},
+ {"lockScreenPinOrPassword",
+ IDS_SETTINGS_PEOPLE_LOCK_SCREEN_PIN_OR_PASSWORD},
+ {"lockScreenSetupFingerprintButton",
+ IDS_SETTINGS_PEOPLE_LOCK_SCREEN_FINGERPRINT_SETUP_BUTTON},
+ {"lockScreenNotificationHide",
+ IDS_ASH_SETTINGS_LOCK_SCREEN_NOTIFICATION_HIDE},
+ {"lockScreenEditFingerprints",
+ IDS_SETTINGS_PEOPLE_LOCK_SCREEN_EDIT_FINGERPRINTS},
+ {"lockScreenPasswordOnly", IDS_SETTINGS_PEOPLE_LOCK_SCREEN_PASSWORD_ONLY},
+ {"lockScreenChangePinButton",
+ IDS_SETTINGS_PEOPLE_LOCK_SCREEN_CHANGE_PIN_BUTTON},
+ {"lockScreenEditFingerprintsDescription",
+ IDS_SETTINGS_PEOPLE_LOCK_SCREEN_EDIT_FINGERPRINTS_DESCRIPTION},
+ {"lockScreenNumberFingerprints",
+ IDS_SETTINGS_PEOPLE_LOCK_SCREEN_NUM_FINGERPRINTS},
+ {"lockScreenNone", IDS_SETTINGS_PEOPLE_LOCK_SCREEN_NONE},
+ {"lockScreenFingerprintNewName",
+ IDS_SETTINGS_PEOPLE_LOCK_SCREEN_NEW_FINGERPRINT_DEFAULT_NAME},
+ {"lockScreenDeleteFingerprintLabel",
+ IDS_SETTINGS_PEOPLE_LOCK_SCREEN_DELETE_FINGERPRINT_ARIA_LABEL},
+ {"lockScreenOptionsLock", IDS_SETTINGS_PEOPLE_LOCK_SCREEN_OPTIONS_LOCK},
+ {"lockScreenOptionsLoginLock",
+ IDS_SETTINGS_PEOPLE_LOCK_SCREEN_OPTIONS_LOGIN_LOCK},
+ {"lockScreenSetupPinButton",
+ IDS_SETTINGS_PEOPLE_LOCK_SCREEN_SETUP_PIN_BUTTON},
+ {"lockScreenTitleLock", IDS_SETTINGS_PEOPLE_LOCK_SCREEN_TITLE_LOCK},
+ {"lockScreenTitleLoginLock",
+ IDS_SETTINGS_PEOPLE_LOCK_SCREEN_TITLE_LOGIN_LOCK},
+ {"passwordPromptEnterPasswordLock",
+ IDS_SETTINGS_PEOPLE_PASSWORD_PROMPT_ENTER_PASSWORD_LOCK},
+ {"passwordPromptEnterPasswordLoginLock",
+ IDS_SETTINGS_PEOPLE_PASSWORD_PROMPT_ENTER_PASSWORD_LOGIN_LOCK},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ html_source->AddBoolean("quickUnlockEnabled",
+ chromeos::quick_unlock::IsPinEnabled(pref_service));
+ html_source->AddBoolean(
+ "quickUnlockDisabledByPolicy",
+ chromeos::quick_unlock::IsPinDisabledByPolicy(pref_service));
+ html_source->AddBoolean("lockScreenNotificationsEnabled",
+ ash::features::IsLockScreenNotificationsEnabled());
+ html_source->AddBoolean(
+ "lockScreenHideSensitiveNotificationsSupported",
+ ash::features::IsLockScreenHideSensitiveNotificationsSupported());
+}
+
+void AddFingerprintListStrings(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"lockScreenAddFingerprint",
+ IDS_SETTINGS_PEOPLE_LOCK_SCREEN_ADD_FINGERPRINT_BUTTON},
+ {"lockScreenRegisteredFingerprints",
+ IDS_SETTINGS_PEOPLE_LOCK_SCREEN_REGISTERED_FINGERPRINTS_LABEL},
+ {"lockScreenFingerprintWarning",
+ IDS_SETTINGS_PEOPLE_LOCK_SCREEN_FINGERPRINT_LESS_SECURE},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+}
+
+void AddFingerprintStrings(content::WebUIDataSource* html_source,
+ bool are_fingerprint_settings_allowed) {
+ html_source->AddBoolean("fingerprintUnlockEnabled",
+ are_fingerprint_settings_allowed);
+ if (are_fingerprint_settings_allowed) {
+ html_source->AddInteger(
+ "fingerprintReaderLocation",
+ static_cast<int32_t>(chromeos::quick_unlock::GetFingerprintLocation()));
+
+ // To use lottie, the worker-src CSP needs to be updated for the web ui that
+ // is using it. Since as of now there are only a couple of webuis using
+ // lottie animations, this update has to be performed manually. As the usage
+ // increases, set this as the default so manual override is no longer
+ // required.
+ html_source->OverrideContentSecurityPolicyWorkerSrc(
+ "worker-src blob: 'self';");
+ html_source->AddResourcePath("finger_print.json",
+ IDR_LOGIN_FINGER_PRINT_TABLET_ANIMATION);
+ }
+
+ int instruction_id, aria_label_id;
+ using FingerprintLocation = chromeos::quick_unlock::FingerprintLocation;
+ switch (chromeos::quick_unlock::GetFingerprintLocation()) {
+ case FingerprintLocation::TABLET_POWER_BUTTON:
+ instruction_id =
+ IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_POWER_BUTTON;
+ aria_label_id =
+ IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_POWER_BUTTON_ARIA_LABEL;
+ break;
+ case FingerprintLocation::KEYBOARD_BOTTOM_LEFT:
+ instruction_id =
+ IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD;
+ aria_label_id =
+ IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD_BOTTOM_LEFT_ARIA_LABEL;
+ break;
+ case FingerprintLocation::KEYBOARD_BOTTOM_RIGHT:
+ instruction_id =
+ IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD;
+ aria_label_id =
+ IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD_BOTTOM_RIGHT_ARIA_LABEL;
+ break;
+ case FingerprintLocation::KEYBOARD_TOP_RIGHT:
+ instruction_id =
+ IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD;
+ aria_label_id =
+ IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD_TOP_RIGHT_ARIA_LABEL;
+ break;
+ }
+ html_source->AddLocalizedString(
+ "configureFingerprintInstructionLocateScannerStep", instruction_id);
+ html_source->AddLocalizedString("configureFingerprintScannerStepAriaLabel",
+ aria_label_id);
+}
+
+void AddSetupFingerprintDialogStrings(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"configureFingerprintTitle", IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_TITLE},
+ {"configureFingerprintAddAnotherButton",
+ IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_ADD_ANOTHER_BUTTON},
+ {"configureFingerprintInstructionReadyStep",
+ IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_READY},
+ {"configureFingerprintLiftFinger",
+ IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_LIFT_FINGER},
+ {"configureFingerprintTryAgain",
+ IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_TRY_AGAIN},
+ {"configureFingerprintImmobile",
+ IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_FINGER_IMMOBILE},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+}
+
+void AddSetupPinDialogStrings(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"configurePinChoosePinTitle",
+ IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_CHOOSE_PIN_TITLE},
+ {"configurePinConfirmPinTitle",
+ IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_CONFIRM_PIN_TITLE},
+ {"configurePinMismatched", IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_MISMATCHED},
+ {"configurePinTooShort", IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_TOO_SHORT},
+ {"configurePinTooLong", IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_TOO_LONG},
+ {"configurePinWeakPin", IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_WEAK_PIN},
+ {"pinKeyboardPlaceholderPin", IDS_PIN_KEYBOARD_HINT_TEXT_PIN},
+ {"pinKeyboardPlaceholderPinPassword",
+ IDS_PIN_KEYBOARD_HINT_TEXT_PIN_PASSWORD},
+ {"pinKeyboardDeleteAccessibleName",
+ IDS_PIN_KEYBOARD_DELETE_ACCESSIBLE_NAME},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ // Format numbers to be used on the pin keyboard.
+ for (int j = 0; j <= 9; j++) {
+ html_source->AddString("pinKeyboard" + base::NumberToString(j),
+ base::FormatNumber(int64_t{j}));
+ }
+}
+
+void AddSyncControlsStrings(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"syncEverythingCheckboxLabel",
+ IDS_SETTINGS_SYNC_EVERYTHING_CHECKBOX_LABEL},
+ {"wallpaperCheckboxLabel", IDS_OS_SETTINGS_WALLPAPER_CHECKBOX_LABEL},
+ {"osSyncTurnOff", IDS_OS_SETTINGS_SYNC_TURN_OFF},
+ {"osSyncSettingsCheckboxLabel",
+ IDS_OS_SETTINGS_SYNC_SETTINGS_CHECKBOX_LABEL},
+ {"osSyncWifiConfigurationsCheckboxLabel",
+ IDS_OS_SETTINGS_WIFI_CONFIGURATIONS_CHECKBOX_LABEL},
+ {"osSyncAppsCheckboxLabel", IDS_OS_SETTINGS_SYNC_APPS_CHECKBOX_LABEL},
+ {"osSyncTurnOn", IDS_OS_SETTINGS_SYNC_TURN_ON},
+ {"osSyncFeatureLabel", IDS_OS_SETTINGS_SYNC_FEATURE_LABEL},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ html_source->AddBoolean("splitSettingsSyncEnabled",
+ chromeos::features::IsSplitSettingsSyncEnabled());
+ html_source->AddBoolean("splitSyncConsent",
+ chromeos::features::IsSplitSyncConsentEnabled());
+ html_source->AddBoolean(
+ "syncSetupFriendlySettings",
+ base::FeatureList::IsEnabled(::features::kSyncSetupFriendlySettings));
+ html_source->AddString(
+ "browserSettingsSyncSetupUrl",
+ base::StrCat({chrome::kChromeUISettingsURL, chrome::kSyncSetupSubPage}));
+}
+
+void AddUsersStrings(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"usersModifiedByOwnerLabel", IDS_SETTINGS_USERS_MODIFIED_BY_OWNER_LABEL},
+ {"guestBrowsingLabel", IDS_SETTINGS_USERS_GUEST_BROWSING_LABEL},
+ {"settingsManagedLabel", IDS_SETTINGS_USERS_MANAGED_LABEL},
+ {"showOnSigninLabel", IDS_SETTINGS_USERS_SHOW_ON_SIGNIN_LABEL},
+ {"restrictSigninLabel", IDS_SETTINGS_USERS_RESTRICT_SIGNIN_LABEL},
+ {"deviceOwnerLabel", IDS_SETTINGS_USERS_DEVICE_OWNER_LABEL},
+ {"removeUserTooltip", IDS_SETTINGS_USERS_REMOVE_USER_TOOLTIP},
+ {"addUsers", IDS_SETTINGS_USERS_ADD_USERS},
+ {"addUsersEmail", IDS_SETTINGS_USERS_ADD_USERS_EMAIL},
+ {"userExistsError", IDS_SETTINGS_USER_EXISTS_ERROR},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+}
+
+void AddParentalControlStrings(content::WebUIDataSource* html_source,
+ bool are_parental_control_settings_allowed,
+ SupervisedUserService* supervised_user_service) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"parentalControlsPageTitle", IDS_SETTINGS_PARENTAL_CONTROLS_PAGE_TITLE},
+ {"parentalControlsPageSetUpLabel",
+ IDS_SETTINGS_PARENTAL_CONTROLS_PAGE_SET_UP_LABEL},
+ {"parentalControlsPageViewSettingsLabel",
+ IDS_SETTINGS_PARENTAL_CONTROLS_PAGE_VIEW_SETTINGS_LABEL},
+ {"parentalControlsPageConnectToInternetLabel",
+ IDS_SETTINGS_PARENTAL_CONTROLS_PAGE_CONNECT_TO_INTERNET_LABEL},
+ {"parentalControlsSetUpButtonLabel",
+ IDS_SETTINGS_PARENTAL_CONTROLS_SET_UP_BUTTON_LABEL},
+ {"parentalControlsSetUpButtonRole",
+ IDS_SETTINGS_PARENTAL_CONTROLS_SET_UP_BUTTON_ROLE},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ html_source->AddBoolean("showParentalControls",
+ are_parental_control_settings_allowed);
+
+ bool is_child = user_manager::UserManager::Get()->IsLoggedInAsChildUser();
+ html_source->AddBoolean("isChild", is_child);
+
+ if (is_child) {
+ std::string custodian = supervised_user_service->GetCustodianName();
+ std::string second_custodian =
+ supervised_user_service->GetSecondCustodianName();
+
+ base::string16 child_managed_tooltip;
+ if (second_custodian.empty()) {
+ child_managed_tooltip = l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_ACCOUNT_MANAGER_CHILD_MANAGED_BY_ONE_PARENT_TOOLTIP,
+ base::UTF8ToUTF16(custodian));
+ } else {
+ child_managed_tooltip = l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_ACCOUNT_MANAGER_CHILD_MANAGED_BY_TWO_PARENTS_TOOLTIP,
+ base::UTF8ToUTF16(custodian), base::UTF8ToUTF16(second_custodian));
+ }
+ html_source->AddString("accountManagerPrimaryAccountChildManagedTooltip",
+ child_managed_tooltip);
+ }
+}
+
+} // namespace
+
+PeopleSection::PeopleSection(
+ Profile* profile,
+ SearchTagRegistry* search_tag_registry,
+ syncer::SyncService* sync_service,
+ SupervisedUserService* supervised_user_service,
+ KerberosCredentialsManager* kerberos_credentials_manager,
+ signin::IdentityManager* identity_manager,
+ PrefService* pref_service)
+ : OsSettingsSection(profile, search_tag_registry),
+ sync_service_(sync_service),
+ supervised_user_service_(supervised_user_service),
+ kerberos_credentials_manager_(kerberos_credentials_manager),
+ identity_manager_(identity_manager),
+ pref_service_(pref_service) {
+ // No search tags are registered if in guest mode.
+ if (features::IsGuestModeActive())
+ return;
+
+ registry()->AddSearchTags(GetPeopleSearchConcepts());
+
+ if (kerberos_credentials_manager_) {
+ // Kerberos search tags are added/removed dynamically.
+ kerberos_credentials_manager_->AddObserver(this);
+ OnKerberosEnabledStateChanged();
+ }
+
+ if (sync_service_ && chromeos::features::IsSplitSettingsSyncEnabled()) {
+ // Sync search tags are added/removed dynamically.
+ sync_service_->AddObserver(this);
+ OnStateChanged(sync_service_);
+ }
+
+ // Parental control search tags are added if necessary and do not update
+ // dynamically during a user session.
+ if (features::ShouldShowParentalControlSettings(profile))
+ registry()->AddSearchTags(GetParentalSearchConcepts());
+
+ // Fingerprint search tags are added if necessary and do not update
+ // dynamically during a user session.
+ if (AreFingerprintSettingsAllowed())
+ registry()->AddSearchTags(GetFingerprintSearchConcepts());
+}
+
+PeopleSection::~PeopleSection() {
+ if (kerberos_credentials_manager_)
+ kerberos_credentials_manager_->RemoveObserver(this);
+
+ if (sync_service_ && chromeos::features::IsSplitSettingsSyncEnabled())
+ sync_service_->RemoveObserver(this);
+}
+
+void PeopleSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"osPeoplePageTitle", IDS_OS_SETTINGS_PEOPLE},
+ {"accountManagerSubMenuLabel",
+ IDS_SETTINGS_ACCOUNT_MANAGER_SUBMENU_LABEL},
+ {"accountManagerPageTitle", IDS_SETTINGS_ACCOUNT_MANAGER_PAGE_TITLE},
+ {"kerberosAccountsSubMenuLabel",
+ IDS_SETTINGS_KERBEROS_ACCOUNTS_SUBMENU_LABEL},
+ {"accountManagerPageTitle", IDS_SETTINGS_ACCOUNT_MANAGER_PAGE_TITLE},
+ {"kerberosAccountsPageTitle", IDS_SETTINGS_KERBEROS_ACCOUNTS_PAGE_TITLE},
+ {"lockScreenFingerprintTitle",
+ IDS_SETTINGS_PEOPLE_LOCK_SCREEN_FINGERPRINT_SUBPAGE_TITLE},
+ {"manageOtherPeople", IDS_SETTINGS_PEOPLE_MANAGE_OTHER_PEOPLE},
+ {"osSyncPageTitle", IDS_OS_SETTINGS_SYNC_PAGE_TITLE},
+ {"syncAndNonPersonalizedServices",
+ IDS_SETTINGS_SYNC_SYNC_AND_NON_PERSONALIZED_SERVICES},
+ {"syncDisconnectConfirm", IDS_SETTINGS_SYNC_DISCONNECT_CONFIRM},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ // Toggles the Chrome OS Account Manager submenu in the People section.
+ html_source->AddBoolean("isAccountManagerEnabled",
+ chromeos::IsAccountManagerAvailable(profile()));
+
+ if (chromeos::features::IsSplitSyncConsentEnabled()) {
+ static constexpr webui::LocalizedString kTurnOffStrings[] = {
+ {"syncDisconnect", IDS_SETTINGS_PEOPLE_SYNC_TURN_OFF},
+ {"syncDisconnectTitle",
+ IDS_SETTINGS_TURN_OFF_SYNC_AND_SIGN_OUT_DIALOG_TITLE},
+ };
+ AddLocalizedStringsBulk(html_source, kTurnOffStrings);
+ } else {
+ static constexpr webui::LocalizedString kSignOutStrings[] = {
+ {"syncDisconnect", IDS_SETTINGS_PEOPLE_SIGN_OUT},
+ {"syncDisconnectTitle", IDS_SETTINGS_SYNC_DISCONNECT_TITLE},
+ };
+ AddLocalizedStringsBulk(html_source, kSignOutStrings);
+ }
+
+ std::string sync_dashboard_url =
+ google_util::AppendGoogleLocaleParam(
+ GURL(chrome::kSyncGoogleDashboardURL),
+ g_browser_process->GetApplicationLocale())
+ .spec();
+
+ html_source->AddString(
+ "syncDisconnectExplanation",
+ l10n_util::GetStringFUTF8(IDS_SETTINGS_SYNC_DISCONNECT_EXPLANATION,
+ base::ASCIIToUTF16(sync_dashboard_url)));
+
+ html_source->AddBoolean(
+ "secondaryGoogleAccountSigninAllowed",
+ pref_service_->GetBoolean(
+ chromeos::prefs::kSecondaryGoogleAccountSigninAllowed));
+ html_source->AddBoolean("isEduCoexistenceEnabled",
+ ::chromeos::features::IsEduCoexistenceEnabled());
+
+ html_source->AddBoolean(
+ "driveSuggestAvailable",
+ base::FeatureList::IsEnabled(omnibox::kDocumentProvider));
+
+ AddAccountManagerPageStrings(html_source);
+ AddKerberosAccountsPageStrings(html_source);
+ AddKerberosAddAccountDialogStrings(html_source);
+ AddLockScreenPageStrings(html_source, profile()->GetPrefs());
+ AddFingerprintListStrings(html_source);
+ AddFingerprintStrings(html_source, AreFingerprintSettingsAllowed());
+ AddSetupFingerprintDialogStrings(html_source);
+ AddSetupPinDialogStrings(html_source);
+ AddSyncControlsStrings(html_source);
+ AddUsersStrings(html_source);
+ AddParentalControlStrings(
+ html_source, features::ShouldShowParentalControlSettings(profile()),
+ supervised_user_service_);
+
+ ::settings::AddSyncControlsStrings(html_source);
+ ::settings::AddSyncAccountControlStrings(html_source);
+ ::settings::AddPasswordPromptDialogStrings(html_source);
+ ::settings::AddSyncPageStrings(html_source);
+}
+
+void PeopleSection::AddHandlers(content::WebUI* web_ui) {
+ web_ui->AddMessageHandler(
+ std::make_unique<::settings::PeopleHandler>(profile()));
+ web_ui->AddMessageHandler(
+ std::make_unique<::settings::ProfileInfoHandler>(profile()));
+
+ auto plural_string_handler = std::make_unique<PluralStringHandler>();
+ plural_string_handler->AddLocalizedString("profileLabel",
+ IDS_OS_SETTINGS_PROFILE_LABEL);
+ web_ui->AddMessageHandler(std::move(plural_string_handler));
+
+ // TODO(jamescook): Sort out how account management is split between Chrome OS
+ // and browser settings.
+ if (chromeos::IsAccountManagerAvailable(profile())) {
+ chromeos::AccountManagerFactory* factory =
+ g_browser_process->platform_part()->GetAccountManagerFactory();
+ chromeos::AccountManager* account_manager =
+ factory->GetAccountManager(profile()->GetPath().value());
+ DCHECK(account_manager);
+
+ web_ui->AddMessageHandler(
+ std::make_unique<chromeos::settings::AccountManagerUIHandler>(
+ account_manager, identity_manager_));
+ }
+
+ if (chromeos::features::IsSplitSettingsSyncEnabled())
+ web_ui->AddMessageHandler(std::make_unique<OSSyncHandler>(profile()));
+
+ web_ui->AddMessageHandler(
+ std::make_unique<chromeos::settings::QuickUnlockHandler>());
+
+ web_ui->AddMessageHandler(
+ std::make_unique<chromeos::settings::FingerprintHandler>(profile()));
+
+ if (!profile()->IsGuestSession() &&
+ features::ShouldShowParentalControlSettings(profile())) {
+ web_ui->AddMessageHandler(
+ std::make_unique<chromeos::settings::ParentalControlsHandler>(
+ profile()));
+ }
+
+ std::unique_ptr<chromeos::settings::KerberosAccountsHandler>
+ kerberos_accounts_handler =
+ KerberosAccountsHandler::CreateIfKerberosEnabled(profile());
+ if (kerberos_accounts_handler) {
+ // Note that the UI is enabled only if Kerberos is enabled.
+ web_ui->AddMessageHandler(std::move(kerberos_accounts_handler));
+ }
+}
+
+void PeopleSection::OnStateChanged(syncer::SyncService* sync_service) {
+ DCHECK(chromeos::features::IsSplitSettingsSyncEnabled());
+ DCHECK_EQ(sync_service, sync_service_);
+ if (sync_service_->IsEngineInitialized() &&
+ sync_service_->GetUserSettings()->IsOsSyncFeatureEnabled()) {
+ registry()->AddSearchTags(GetSyncOnSearchConcepts());
+ registry()->RemoveSearchTags(GetSyncOffSearchConcepts());
+ } else {
+ registry()->RemoveSearchTags(GetSyncOnSearchConcepts());
+ registry()->AddSearchTags(GetSyncOffSearchConcepts());
+ }
+}
+
+void PeopleSection::OnKerberosEnabledStateChanged() {
+ if (kerberos_credentials_manager_->IsKerberosEnabled())
+ registry()->AddSearchTags(GetKerberosSearchConcepts());
+ else
+ registry()->RemoveSearchTags(GetKerberosSearchConcepts());
+}
+
+void PeopleSection::AddKerberosAccountsPageStrings(
+ content::WebUIDataSource* html_source) const {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"kerberosAccountsAddAccountLabel",
+ IDS_SETTINGS_KERBEROS_ACCOUNTS_ADD_ACCOUNT_LABEL},
+ {"kerberosAccountsRefreshNowLabel",
+ IDS_SETTINGS_KERBEROS_ACCOUNTS_REFRESH_NOW_LABEL},
+ {"kerberosAccountsSetAsActiveAccountLabel",
+ IDS_SETTINGS_KERBEROS_ACCOUNTS_SET_AS_ACTIVE_ACCOUNT_LABEL},
+ {"kerberosAccountsSignedOut", IDS_SETTINGS_KERBEROS_ACCOUNTS_SIGNED_OUT},
+ {"kerberosAccountsListHeader",
+ IDS_SETTINGS_KERBEROS_ACCOUNTS_LIST_HEADER},
+ {"kerberosAccountsRemoveAccountLabel",
+ IDS_SETTINGS_KERBEROS_ACCOUNTS_REMOVE_ACCOUNT_LABEL},
+ {"kerberosAccountsReauthenticationLabel",
+ IDS_SETTINGS_KERBEROS_ACCOUNTS_REAUTHENTICATION_LABEL},
+ {"kerberosAccountsTicketActive",
+ IDS_SETTINGS_KERBEROS_ACCOUNTS_TICKET_ACTIVE},
+ {"kerberosAccountsAccountRemovedTip",
+ IDS_SETTINGS_KERBEROS_ACCOUNTS_ACCOUNT_REMOVED_TIP},
+ {"kerberosAccountsAccountRefreshedTip",
+ IDS_SETTINGS_KERBEROS_ACCOUNTS_ACCOUNT_REFRESHED_TIP},
+ {"kerberosAccountsSignedIn", IDS_SETTINGS_KERBEROS_ACCOUNTS_SIGNED_IN},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ // Toggles the Chrome OS Kerberos Accounts submenu in the People section.
+ // Note that the handler is also dependent on this pref.
+ html_source->AddBoolean("isKerberosEnabled",
+ kerberos_credentials_manager_->IsKerberosEnabled());
+
+ PrefService* local_state = g_browser_process->local_state();
+
+ // Whether new Kerberos accounts may be added.
+ html_source->AddBoolean(
+ "kerberosAddAccountsAllowed",
+ local_state->GetBoolean(::prefs::kKerberosAddAccountsAllowed));
+
+ // Kerberos accounts page with "Learn more" link.
+ html_source->AddString(
+ "kerberosAccountsDescription",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_KERBEROS_ACCOUNTS_DESCRIPTION,
+ GetHelpUrlWithBoard(chrome::kKerberosAccountsLearnMoreURL)));
+}
+
+bool PeopleSection::AreFingerprintSettingsAllowed() {
+ return chromeos::quick_unlock::IsFingerprintEnabled(profile());
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/people_section.h b/chromium/chrome/browser/ui/webui/settings/chromeos/people_section.h
new file mode 100644
index 00000000000..d10c6805d22
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/people_section.h
@@ -0,0 +1,78 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_PEOPLE_SECTION_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_PEOPLE_SECTION_H_
+
+#include "chrome/browser/chromeos/kerberos/kerberos_credentials_manager.h"
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h"
+#include "components/sync/driver/sync_service_observer.h"
+
+class PrefService;
+class Profile;
+class SupervisedUserService;
+
+namespace content {
+class WebUIDataSource;
+} // namespace content
+
+namespace signin {
+class IdentityManager;
+} // namespace signin
+
+namespace syncer {
+class SyncService;
+} // namespace syncer
+
+namespace chromeos {
+
+namespace settings {
+
+class SearchTagRegistry;
+
+// Provides UI strings and search tags for People settings. Search tags are only
+// added for non-guest sessions.
+//
+// Kerberos, Fingerprint, and Parental Controls search tags are only shown if
+// they are allowed by policy/flags. Different sets of Sync tags are shown
+// depending on whether the feature is enabed or disabled.
+class PeopleSection : public OsSettingsSection,
+ public syncer::SyncServiceObserver,
+ public KerberosCredentialsManager::Observer {
+ public:
+ PeopleSection(Profile* profile,
+ SearchTagRegistry* search_tag_registry,
+ syncer::SyncService* sync_service,
+ SupervisedUserService* supervised_user_service,
+ KerberosCredentialsManager* kerberos_credentials_manager,
+ signin::IdentityManager* identity_manager,
+ PrefService* pref_service);
+ ~PeopleSection() override;
+
+ private:
+ // OsSettingsSection:
+ void AddLoadTimeData(content::WebUIDataSource* html_source) override;
+ void AddHandlers(content::WebUI* web_ui) override;
+
+ // syncer::SyncServiceObserver:
+ void OnStateChanged(syncer::SyncService* sync_service) override;
+
+ // KerberosCredentialsManager::Observer:
+ void OnKerberosEnabledStateChanged() override;
+
+ void AddKerberosAccountsPageStrings(
+ content::WebUIDataSource* html_source) const;
+ bool AreFingerprintSettingsAllowed();
+
+ syncer::SyncService* sync_service_;
+ SupervisedUserService* supervised_user_service_;
+ KerberosCredentialsManager* kerberos_credentials_manager_;
+ signin::IdentityManager* identity_manager_;
+ PrefService* pref_service_;
+};
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_PEOPLE_SECTION_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/personalization_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/personalization_section.cc
new file mode 100644
index 00000000000..e7b9d760bc5
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/personalization_section.cc
@@ -0,0 +1,211 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/personalization_section.h"
+
+#include "ash/public/cpp/ambient/ambient_prefs.h"
+#include "base/bind.h"
+#include "base/no_destructor.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/change_picture_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
+#include "chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/chrome_features.h"
+#include "chrome/grit/generated_resources.h"
+#include "chromeos/constants/chromeos_features.h"
+#include "components/prefs/pref_service.h"
+#include "content/public/browser/web_ui.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/webui/web_ui_util.h"
+
+namespace chromeos {
+namespace settings {
+namespace {
+
+const std::vector<SearchConcept>& GetPersonalizationSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_PERSONALIZATION,
+ mojom::kPersonalizationSectionPath,
+ mojom::SearchResultIcon::kPaintbrush,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSection,
+ {.section = mojom::Section::kPersonalization},
+ {IDS_OS_SETTINGS_TAG_PERSONALIZATION_ALT1,
+ IDS_OS_SETTINGS_TAG_PERSONALIZATION_ALT2, SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_CHANGE_WALLPAPER,
+ mojom::kPersonalizationSectionPath,
+ mojom::SearchResultIcon::kWallpaper,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kOpenWallpaper},
+ {IDS_OS_SETTINGS_TAG_CHANGE_WALLPAPER_ALT1,
+ IDS_OS_SETTINGS_TAG_CHANGE_WALLPAPER_ALT2, SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_CHANGE_DEVICE_ACCOUNT_IMAGE,
+ mojom::kChangePictureSubpagePath,
+ mojom::SearchResultIcon::kAvatar,
+ mojom::SearchResultDefaultRank::kLow,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kChangePicture},
+ {IDS_OS_SETTINGS_TAG_CHANGE_DEVICE_ACCOUNT_IMAGE_ALT1,
+ IDS_OS_SETTINGS_TAG_CHANGE_DEVICE_ACCOUNT_IMAGE_ALT2,
+ IDS_OS_SETTINGS_TAG_CHANGE_DEVICE_ACCOUNT_IMAGE_ALT3,
+ IDS_OS_SETTINGS_TAG_CHANGE_DEVICE_ACCOUNT_IMAGE_ALT4,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetAmbientModeSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_AMBIENT_MODE,
+ mojom::kAmbientModeSubpagePath,
+ mojom::SearchResultIcon::kWallpaper,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kAmbientMode}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetAmbientModeOnSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_AMBIENT_MODE_CHOOSE_SOURCE,
+ mojom::kAmbientModeSubpagePath,
+ mojom::SearchResultIcon::kWallpaper,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kAmbientModeSource}},
+ {IDS_OS_SETTINGS_TAG_AMBIENT_MODE_TURN_OFF,
+ mojom::kAmbientModeSubpagePath,
+ mojom::SearchResultIcon::kWallpaper,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kAmbientModeOnOff},
+ {IDS_OS_SETTINGS_TAG_AMBIENT_MODE_TURN_OFF_ALT1,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetAmbientModeOffSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_AMBIENT_MODE_TURN_ON,
+ mojom::kAmbientModeSubpagePath,
+ mojom::SearchResultIcon::kWallpaper,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kAmbientModeOnOff},
+ {IDS_OS_SETTINGS_TAG_AMBIENT_MODE_TURN_ON_ALT1,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+bool IsAmbientModeAllowed() {
+ return chromeos::features::IsAmbientModeEnabled();
+}
+
+} // namespace
+
+PersonalizationSection::PersonalizationSection(
+ Profile* profile,
+ SearchTagRegistry* search_tag_registry,
+ PrefService* pref_service)
+ : OsSettingsSection(profile, search_tag_registry),
+ pref_service_(pref_service) {
+ // Personalization search tags are not added in guest mode.
+ if (features::IsGuestModeActive())
+ return;
+
+ registry()->AddSearchTags(GetPersonalizationSearchConcepts());
+
+ if (IsAmbientModeAllowed()) {
+ registry()->AddSearchTags(GetAmbientModeSearchConcepts());
+
+ pref_change_registrar_.Init(pref_service_);
+ pref_change_registrar_.Add(
+ ash::ambient::prefs::kAmbientModeEnabled,
+ base::BindRepeating(
+ &PersonalizationSection::OnAmbientModeEnabledStateChanged,
+ base::Unretained(this)));
+ OnAmbientModeEnabledStateChanged();
+ }
+}
+
+PersonalizationSection::~PersonalizationSection() = default;
+
+void PersonalizationSection::AddLoadTimeData(
+ content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"ambientModeTitle", IDS_OS_SETTINGS_AMBIENT_MODE_TITLE},
+ {"ambientModeEnabled", IDS_OS_SETTINGS_AMBIENT_MODE_ENABLED},
+ {"ambientModeDisabled", IDS_OS_SETTINGS_AMBIENT_MODE_DISABLED},
+ {"ambientModeOn", IDS_OS_SETTINGS_AMBIENT_MODE_ON},
+ {"ambientModeOff", IDS_OS_SETTINGS_AMBIENT_MODE_OFF},
+ {"ambientModeTopicSourceTitle",
+ IDS_OS_SETTINGS_AMBIENT_MODE_TOPIC_SOURCE_TITLE},
+ {"ambientModeTopicSourceGooglePhotos",
+ IDS_OS_SETTINGS_AMBIENT_MODE_TOPIC_SOURCE_GOOGLE_PHOTOS},
+ {"ambientModeTopicSourceArtGallery",
+ IDS_OS_SETTINGS_AMBIENT_MODE_TOPIC_SOURCE_ART_GALLERY},
+ {"changePictureTitle", IDS_OS_SETTINGS_CHANGE_PICTURE_TITLE},
+ {"openWallpaperApp", IDS_OS_SETTINGS_OPEN_WALLPAPER_APP},
+ {"personalizationPageTitle", IDS_OS_SETTINGS_PERSONALIZATION},
+ {"setWallpaper", IDS_OS_SETTINGS_SET_WALLPAPER},
+ {"takePhoto", IDS_SETTINGS_CHANGE_PICTURE_TAKE_PHOTO},
+ {"captureVideo", IDS_SETTINGS_CHANGE_PICTURE_CAPTURE_VIDEO},
+ {"discardPhoto", IDS_SETTINGS_CHANGE_PICTURE_DISCARD_PHOTO},
+ {"previewAltText", IDS_SETTINGS_CHANGE_PICTURE_PREVIEW_ALT},
+ {"switchModeToVideo", IDS_SETTINGS_CHANGE_PICTURE_SWITCH_MODE_TO_VIDEO},
+ {"profilePhoto", IDS_SETTINGS_CHANGE_PICTURE_PROFILE_PHOTO},
+ {"changePicturePageDescription", IDS_SETTINGS_CHANGE_PICTURE_DIALOG_TEXT},
+ {"switchModeToCamera", IDS_SETTINGS_CHANGE_PICTURE_SWITCH_MODE_TO_CAMERA},
+ {"chooseFile", IDS_SETTINGS_CHANGE_PICTURE_CHOOSE_FILE},
+ {"oldPhoto", IDS_SETTINGS_CHANGE_PICTURE_OLD_PHOTO},
+ {"oldVideo", IDS_SETTINGS_CHANGE_PICTURE_OLD_VIDEO},
+ {"authorCreditText", IDS_SETTINGS_CHANGE_PICTURE_AUTHOR_CREDIT_TEXT},
+ {"photoCaptureAccessibleText",
+ IDS_SETTINGS_PHOTO_CAPTURE_ACCESSIBLE_TEXT},
+ {"photoDiscardAccessibleText",
+ IDS_SETTINGS_PHOTO_DISCARD_ACCESSIBLE_TEXT},
+ {"photoModeAccessibleText", IDS_SETTINGS_PHOTO_MODE_ACCESSIBLE_TEXT},
+ {"videoModeAccessibleText", IDS_SETTINGS_VIDEO_MODE_ACCESSIBLE_TEXT},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ html_source->AddBoolean(
+ "changePictureVideoModeEnabled",
+ base::FeatureList::IsEnabled(::features::kChangePictureVideoMode));
+ html_source->AddBoolean("isAmbientModeEnabled", IsAmbientModeAllowed());
+}
+
+void PersonalizationSection::AddHandlers(content::WebUI* web_ui) {
+ web_ui->AddMessageHandler(
+ std::make_unique<chromeos::settings::WallpaperHandler>());
+ web_ui->AddMessageHandler(
+ std::make_unique<chromeos::settings::ChangePictureHandler>());
+
+ if (!profile()->IsGuestSession() &&
+ chromeos::features::IsAmbientModeEnabled()) {
+ web_ui->AddMessageHandler(
+ std::make_unique<chromeos::settings::AmbientModeHandler>());
+ }
+}
+
+void PersonalizationSection::OnAmbientModeEnabledStateChanged() {
+ if (pref_service_->GetBoolean(ash::ambient::prefs::kAmbientModeEnabled)) {
+ registry()->AddSearchTags(GetAmbientModeOnSearchConcepts());
+ registry()->RemoveSearchTags(GetAmbientModeOffSearchConcepts());
+ } else {
+ registry()->RemoveSearchTags(GetAmbientModeOnSearchConcepts());
+ registry()->AddSearchTags(GetAmbientModeOffSearchConcepts());
+ }
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/personalization_section.h b/chromium/chrome/browser/ui/webui/settings/chromeos/personalization_section.h
new file mode 100644
index 00000000000..b50653c34e6
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/personalization_section.h
@@ -0,0 +1,47 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_PERSONALIZATION_SECTION_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_PERSONALIZATION_SECTION_H_
+
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h"
+#include "components/prefs/pref_change_registrar.h"
+
+class PrefService;
+
+namespace content {
+class WebUIDataSource;
+} // namespace content
+
+namespace chromeos {
+namespace settings {
+
+class SearchTagRegistry;
+
+// Provides UI strings and search tags for Personalization settings. Search tags
+// are only added when not in guest mode, and Ambient mode settings are added
+// depending on whether the feature is allowed and enabled.
+class PersonalizationSection : public OsSettingsSection {
+ public:
+ PersonalizationSection(Profile* profile,
+ SearchTagRegistry* search_tag_registry,
+ PrefService* pref_service);
+ ~PersonalizationSection() override;
+
+ private:
+ // OsSettingsSection:
+ void AddLoadTimeData(content::WebUIDataSource* html_source) override;
+ void AddHandlers(content::WebUI* web_ui) override;
+
+ // ash::AmbientModeService::Observer:
+ void OnAmbientModeEnabledStateChanged();
+
+ PrefService* pref_service_;
+ PrefChangeRegistrar pref_change_registrar_;
+};
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_PERSONALIZATION_SECTION_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/plugin_vm_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/plugin_vm_handler.cc
index db5d9d79e67..715782b0b11 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/plugin_vm_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/plugin_vm_handler.cc
@@ -12,8 +12,6 @@
#include "base/bind_helpers.h"
#include "chrome/browser/chromeos/file_manager/path_util.h"
#include "chrome/browser/chromeos/guest_os/guest_os_share_path.h"
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_manager.h"
-#include "chrome/browser/chromeos/plugin_vm/plugin_vm_util.h"
#include "chrome/browser/profiles/profile.h"
#include "content/public/browser/browser_thread.h"
@@ -34,14 +32,6 @@ void PluginVmHandler::RegisterMessages() {
"removePluginVmSharedPath",
base::BindRepeating(&PluginVmHandler::HandleRemovePluginVmSharedPath,
weak_ptr_factory_.GetWeakPtr()));
- web_ui()->RegisterMessageCallback(
- "removePluginVm",
- base::BindRepeating(&PluginVmHandler::HandleRemovePluginVm,
- weak_ptr_factory_.GetWeakPtr()));
- web_ui()->RegisterMessageCallback(
- "requestPluginVmInstallerView",
- base::BindRepeating(&PluginVmHandler::HandleRequestPluginVmInstallerView,
- weak_ptr_factory_.GetWeakPtr()));
}
void PluginVmHandler::HandleGetPluginVmSharedPathsDisplayText(
@@ -78,28 +68,5 @@ void PluginVmHandler::HandleRemovePluginVmSharedPath(
path));
}
-void PluginVmHandler::HandleRemovePluginVm(const base::ListValue* args) {
- CHECK_EQ(0U, args->GetSize());
-
- auto* manager = plugin_vm::PluginVmManager::GetForProfile(profile_);
- if (!manager) {
- LOG(ERROR) << "removePluginVm called from an invalid profile.";
- return;
- }
- manager->UninstallPluginVm();
-}
-
-void PluginVmHandler::HandleRequestPluginVmInstallerView(
- const base::ListValue* args) {
- CHECK(args->empty());
-
- if (plugin_vm::IsPluginVmEnabled(profile_)) {
- LOG(ERROR) << "requestPluginVmInstallerView called from a profile which "
- "already has Plugin VM installed.";
- return;
- }
- plugin_vm::ShowPluginVmInstallerView(profile_);
-}
-
} // namespace settings
} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/plugin_vm_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/plugin_vm_handler.h
index b003a9e3e11..d57b34da1db 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/plugin_vm_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/plugin_vm_handler.h
@@ -32,10 +32,6 @@ class PluginVmHandler : public ::settings::SettingsPageUIHandler {
void HandleGetPluginVmSharedPathsDisplayText(const base::ListValue* args);
// Remove a specified path from being shared.
void HandleRemovePluginVmSharedPath(const base::ListValue* args);
- // Remove Plugin VM.
- void HandleRemovePluginVm(const base::ListValue* args);
- // Show the Plugin VM installer view if Plugin VM is not currently installed.
- void HandleRequestPluginVmInstallerView(const base::ListValue* args);
Profile* profile_;
// weak_ptr_factory_ should always be last member.
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/printing_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/printing_section.cc
new file mode 100644
index 00000000000..3415a894f61
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/printing_section.cc
@@ -0,0 +1,250 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/printing_section.h"
+
+#include "base/feature_list.h"
+#include "base/no_destructor.h"
+#include "chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/chrome_features.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/grit/generated_resources.h"
+#include "chromeos/constants/chromeos_features.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/webui/web_ui_util.h"
+
+namespace chromeos {
+namespace settings {
+namespace {
+
+const std::vector<SearchConcept>& GetPrintingSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_PRINTING_ADD_PRINTER,
+ mojom::kPrintingDetailsSubpagePath,
+ mojom::SearchResultIcon::kPrinter,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kAddPrinter},
+ {IDS_OS_SETTINGS_TAG_PRINTING_ADD_PRINTER_ALT1,
+ IDS_OS_SETTINGS_TAG_PRINTING_ADD_PRINTER_ALT2,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_PRINTING_SAVED_PRINTERS,
+ mojom::kPrintingDetailsSubpagePath,
+ mojom::SearchResultIcon::kPrinter,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kSavedPrinters}},
+ {IDS_OS_SETTINGS_TAG_PRINTING,
+ mojom::kPrintingDetailsSubpagePath,
+ mojom::SearchResultIcon::kPrinter,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kPrintingDetails},
+ {IDS_OS_SETTINGS_TAG_PRINTING_ALT1, IDS_OS_SETTINGS_TAG_PRINTING_ALT2,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetPrintingManagementSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_PRINT_MANAGEMENT,
+ mojom::kPrintingSectionPath,
+ mojom::SearchResultIcon::kPrinter,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kPrintJobs},
+ {IDS_OS_SETTINGS_TAG_PRINT_MANAGEMENT_ALT1,
+ IDS_OS_SETTINGS_TAG_PRINT_MANAGEMENT_ALT2, SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+bool IsPrintManagementEnabled() {
+ return base::FeatureList::IsEnabled(
+ chromeos::features::kPrintJobManagementApp);
+}
+
+} // namespace
+
+PrintingSection::PrintingSection(Profile* profile,
+ SearchTagRegistry* search_tag_registry,
+ CupsPrintersManager* printers_manager)
+ : OsSettingsSection(profile, search_tag_registry),
+ printers_manager_(printers_manager) {
+ registry()->AddSearchTags(GetPrintingSearchConcepts());
+ if (IsPrintManagementEnabled())
+ registry()->AddSearchTags(GetPrintingManagementSearchConcepts());
+}
+
+PrintingSection::~PrintingSection() = default;
+
+void PrintingSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"printingPageTitle", IDS_SETTINGS_PRINTING},
+ {"cupsPrintersTitle", IDS_SETTINGS_PRINTING_CUPS_PRINTERS},
+ {"cupsPrintersLearnMoreLabel",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTERS_LEARN_MORE_LABEL},
+ {"addCupsPrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTERS_ADD_PRINTER},
+ {"editPrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTERS_EDIT},
+ {"removePrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTERS_REMOVE},
+ {"setupPrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTER_SETUP_BUTTON},
+ {"setupPrinterAria",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_SETUP_BUTTON_ARIA},
+ {"savePrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTER_SAVE_BUTTON},
+ {"savePrinterAria", IDS_SETTINGS_PRINTING_CUPS_PRINTER_SAVE_BUTTON_ARIA},
+ {"searchLabel", IDS_SETTINGS_PRINTING_CUPS_SEARCH_LABEL},
+ {"noSearchResults", IDS_SEARCH_NO_RESULTS},
+ {"printJobsTitle",
+ IDS_SETTINGS_PRINTING_PRINT_JOBS_LAUNCH_APP_TITLE_LABEL},
+ {"printJobsSublabel",
+ IDS_SETTINGS_PRINTING_PRINT_JOBS_LAUNCH_APP_SUBLABEL},
+ {"printerDetailsTitle", IDS_SETTINGS_PRINTING_CUPS_PRINTER_DETAILS_TITLE},
+ {"printerName", IDS_SETTINGS_PRINTING_CUPS_PRINTER_DETAILS_NAME},
+ {"printerModel", IDS_SETTINGS_PRINTING_CUPS_PRINTER_DETAILS_MODEL},
+ {"printerQueue", IDS_SETTINGS_PRINTING_CUPS_PRINTER_DETAILS_QUEUE},
+ {"savedPrintersTitle", IDS_SETTINGS_PRINTING_CUPS_SAVED_PRINTERS_TITLE},
+ {"savedPrintersCountMany",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTERS_SAVED_PRINTERS_COUNT_MANY},
+ {"savedPrintersCountOne",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTERS_SAVED_PRINTERS_COUNT_ONE},
+ {"savedPrintersCountNone",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTERS_SAVED_PRINTERS_COUNT_NONE},
+ {"showMorePrinters", IDS_SETTINGS_PRINTING_CUPS_SHOW_MORE},
+ {"addPrintersNearbyTitle",
+ IDS_SETTINGS_PRINTING_CUPS_ADD_PRINTERS_NEARBY_TITLE},
+ {"addPrintersManuallyTitle",
+ IDS_SETTINGS_PRINTING_CUPS_ADD_PRINTERS_MANUALLY_TITLE},
+ {"manufacturerAndModelDialogTitle",
+ IDS_SETTINGS_PRINTING_CUPS_SELECT_MANUFACTURER_AND_MODEL_TITLE},
+ {"nearbyPrintersListTitle",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTERS_AVAILABLE_PRINTERS},
+ {"nearbyPrintersCountMany",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTERS_AVAILABLE_PRINTERS_COUNT_MANY},
+ {"nearbyPrintersCountOne",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTERS_AVAILABLE_PRINTER_COUNT_ONE},
+ {"nearbyPrintersCountNone",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTERS_AVAILABLE_PRINTER_COUNT_NONE},
+ {"nearbyPrintersListDescription",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTERS_ADD_DETECTED_OR_NEW_PRINTER},
+ {"manufacturerAndModelAdditionalInformation",
+ IDS_SETTINGS_PRINTING_CUPS_MANUFACTURER_MODEL_ADDITIONAL_INFORMATION},
+ {"addPrinterButtonText",
+ IDS_SETTINGS_PRINTING_CUPS_ADD_PRINTER_BUTTON_ADD},
+ {"printerDetailsAdvanced", IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADVANCED},
+ {"printerDetailsA11yLabel",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADVANCED_ACCESSIBILITY_LABEL},
+ {"printerAddress", IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADVANCED_ADDRESS},
+ {"printerProtocol", IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADVANCED_PROTOCOL},
+ {"printerURI", IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADVANCED_URI},
+ {"manuallyAddPrinterButtonText",
+ IDS_SETTINGS_PRINTING_CUPS_ADD_PRINTER_BUTTON_MANUAL_ADD},
+ {"discoverPrintersButtonText",
+ IDS_SETTINGS_PRINTING_CUPS_ADD_PRINTER_BUTTON_DISCOVER_PRINTERS},
+ {"printerProtocolIpp", IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_IPP},
+ {"printerProtocolIpps", IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_IPPS},
+ {"printerProtocolHttp", IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_HTTP},
+ {"printerProtocolHttps",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_HTTPS},
+ {"printerProtocolAppSocket",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_APP_SOCKET},
+ {"printerProtocolLpd", IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_LPD},
+ {"printerProtocolUsb", IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_USB},
+ {"printerProtocolIppUsb",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_IPPUSB},
+ {"printerConfiguringMessage",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_CONFIGURING_MESSAGE},
+ {"printerManufacturer", IDS_SETTINGS_PRINTING_CUPS_PRINTER_MANUFACTURER},
+ {"selectDriver", IDS_SETTINGS_PRINTING_CUPS_PRINTER_SELECT_DRIVER},
+ {"selectDriverButtonText",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_BUTTON_SELECT_DRIVER},
+ {"selectDriverButtonAriaLabel",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_BUTTON_SELECT_DRIVER_ARIA_LABEL},
+ {"selectDriverErrorMessage",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_INVALID_DRIVER},
+ {"printerAddedSuccessfulMessage",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_DONE_MESSAGE},
+ {"printerEditedSuccessfulMessage",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_EDITED_PRINTER_DONE_MESSAGE},
+ {"printerUnavailableMessage",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_UNAVAILABLE_MESSAGE},
+ {"noPrinterNearbyMessage",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_NO_PRINTER_NEARBY},
+ {"searchingNearbyPrinters",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_SEARCHING_NEARBY_PRINTER},
+ {"printerAddedFailedMessage",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_ERROR_MESSAGE},
+ {"printerAddedFatalErrorMessage",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_FATAL_ERROR_MESSAGE},
+ {"printerAddedUnreachableMessage",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_PRINTER_UNREACHABLE_MESSAGE},
+ {"printerAddedPpdTooLargeMessage",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_PPD_TOO_LARGE_MESSAGE},
+ {"printerAddedInvalidPpdMessage",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_INVALID_PPD_MESSAGE},
+ {"printerAddedPpdNotFoundMessage",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_PPD_NOT_FOUND},
+ {"printerAddedPpdUnretrievableMessage",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_PPD_UNRETRIEVABLE},
+ {"printerAddedNativePrintersNotAllowedMessage",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_NATIVE_PRINTERS_NOT_ALLOWED_MESSAGE},
+ {"editPrinterInvalidPrinterUpdate",
+ IDS_SETTINGS_PRINTING_CUPS_EDIT_PRINTER_INVALID_PRINTER_UPDATE},
+ {"requireNetworkMessage",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_REQUIRE_INTERNET_MESSAGE},
+ {"checkNetworkMessage",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_CHECK_CONNECTION_MESSAGE},
+ {"noInternetConnection",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_NO_INTERNET_CONNECTION},
+ {"checkNetworkAndTryAgain",
+ IDS_SETTINGS_PRINTING_CUPS_PRINTER_CONNECT_TO_NETWORK_SUBTEXT},
+ {"editPrinterDialogTitle",
+ IDS_SETTINGS_PRINTING_CUPS_EDIT_PRINTER_DIALOG_TITLE},
+ {"editPrinterButtonText", IDS_SETTINGS_PRINTING_CUPS_EDIT_PRINTER_BUTTON},
+ {"currentPpdMessage",
+ IDS_SETTINGS_PRINTING_CUPS_EDIT_PRINTER_CURRENT_PPD_MESSAGE},
+ {"printerEulaNotice", IDS_SETTINGS_PRINTING_CUPS_EULA_NOTICE},
+ {"ippPrinterUnreachable", IDS_SETTINGS_PRINTING_CUPS_IPP_URI_UNREACHABLE},
+ {"generalPrinterDialogError",
+ IDS_SETTINGS_PRINTING_CUPS_DIALOG_GENERAL_ERROR},
+ {"printServerButtonText", IDS_SETTINGS_PRINTING_CUPS_PRINT_SERVER},
+ {"addPrintServerTitle",
+ IDS_SETTINGS_PRINTING_CUPS_ADD_PRINT_SERVER_TITLE},
+ {"printServerAddress", IDS_SETTINGS_PRINTING_CUPS_PRINT_SERVER_ADDRESS},
+ {"printServerFoundZeroPrinters",
+ IDS_SETTINGS_PRINTING_CUPS_PRINT_SERVER_FOUND_ZERO_PRINTERS},
+ {"printServerFoundOnePrinter",
+ IDS_SETTINGS_PRINTING_CUPS_PRINT_SERVER_FOUND_ONE_PRINTER},
+ {"printServerFoundManyPrinters",
+ IDS_SETTINGS_PRINTING_CUPS_PRINT_SERVER_FOUND_MANY_PRINTERS},
+ {"printServerInvalidUrlAddress",
+ IDS_SETTINGS_PRINTING_CUPS_PRINT_SERVER_INVALID_URL_ADDRESS},
+ {"printServerConnectionError",
+ IDS_SETTINGS_PRINTING_CUPS_PRINT_SERVER_CONNECTION_ERROR},
+ {"printServerConfigurationErrorMessage",
+ IDS_SETTINGS_PRINTING_CUPS_PRINT_SERVER_REACHABLE_BUT_CANNOT_ADD},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ html_source->AddString("printingCUPSPrintLearnMoreUrl",
+ GetHelpUrlWithBoard(chrome::kCupsPrintLearnMoreURL));
+ html_source->AddString(
+ "printingCUPSPrintPpdLearnMoreUrl",
+ GetHelpUrlWithBoard(chrome::kCupsPrintPPDLearnMoreURL));
+ html_source->AddBoolean(
+ "consumerPrintServerUiEnabled",
+ base::FeatureList::IsEnabled(::features::kPrintServerUi));
+ html_source->AddBoolean("printManagementEnabled", IsPrintManagementEnabled());
+}
+
+void PrintingSection::AddHandlers(content::WebUI* web_ui) {
+ web_ui->AddMessageHandler(
+ std::make_unique<CupsPrintersHandler>(profile(), printers_manager_));
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/printing_section.h b/chromium/chrome/browser/ui/webui/settings/chromeos/printing_section.h
new file mode 100644
index 00000000000..b231aeec420
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/printing_section.h
@@ -0,0 +1,41 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_PRINTING_SECTION_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_PRINTING_SECTION_H_
+
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h"
+
+namespace content {
+class WebUIDataSource;
+} // namespace content
+
+namespace chromeos {
+
+class CupsPrintersManager;
+
+namespace settings {
+
+class SearchTagRegistry;
+
+// Provides UI strings and search tags for Printing settings.
+class PrintingSection : public OsSettingsSection {
+ public:
+ PrintingSection(Profile* profile,
+ SearchTagRegistry* search_tag_registry,
+ CupsPrintersManager* printers_manager);
+ ~PrintingSection() override;
+
+ private:
+ // OsSettingsSection:
+ void AddLoadTimeData(content::WebUIDataSource* html_source) override;
+ void AddHandlers(content::WebUI* web_ui) override;
+
+ CupsPrintersManager* printers_manager_;
+};
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_PRINTING_SECTION_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/privacy_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/privacy_section.cc
new file mode 100644
index 00000000000..94e70f481b3
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/privacy_section.cc
@@ -0,0 +1,100 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/privacy_section.h"
+
+#include "base/feature_list.h"
+#include "base/no_destructor.h"
+#include "build/branding_buildflags.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
+#include "chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/chrome_features.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/grit/generated_resources.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/webui/web_ui_util.h"
+
+namespace chromeos {
+namespace settings {
+namespace {
+
+const std::vector<SearchConcept>& GetPrivacySearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_PRIVACY_VERIFIED_ACCESS,
+ mojom::kPrivacyAndSecuritySectionPath,
+ mojom::SearchResultIcon::kShield,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kVerifiedAccess}},
+ {IDS_OS_SETTINGS_TAG_PRIVACY,
+ mojom::kPrivacyAndSecuritySectionPath,
+ mojom::SearchResultIcon::kShield,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSection,
+ {.section = mojom::Section::kPrivacyAndSecurity}},
+ {IDS_OS_SETTINGS_TAG_PRIVACY_WIFI_SLEEP,
+ mojom::kPrivacyAndSecuritySectionPath,
+ mojom::SearchResultIcon::kShield,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kKeepWifiOnDuringSleep},
+ {IDS_OS_SETTINGS_TAG_PRIVACY_WIFI_SLEEP_ALT1,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+const std::vector<SearchConcept>& GetPrivacyGoogleChromeSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_PRIVACY_CRASH_REPORTS,
+ mojom::kPrivacyAndSecuritySectionPath,
+ mojom::SearchResultIcon::kShield,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kUsageStatsAndCrashReports},
+ {IDS_OS_SETTINGS_TAG_PRIVACY_CRASH_REPORTS_ALT1,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING)
+
+} // namespace
+
+PrivacySection::PrivacySection(Profile* profile,
+ SearchTagRegistry* search_tag_registry)
+ : OsSettingsSection(profile, search_tag_registry) {
+ registry()->AddSearchTags(GetPrivacySearchConcepts());
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+ registry()->AddSearchTags(GetPrivacyGoogleChromeSearchConcepts());
+#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING)
+}
+
+PrivacySection::~PrivacySection() = default;
+
+void PrivacySection::AddLoadTimeData(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"privacyPageTitle", IDS_SETTINGS_PRIVACY},
+ {"enableLogging", IDS_SETTINGS_ENABLE_LOGGING_TOGGLE_TITLE},
+ {"enableLoggingDesc", IDS_SETTINGS_ENABLE_LOGGING_TOGGLE_DESC},
+ {"wakeOnWifi", IDS_SETTINGS_WAKE_ON_WIFI_DESCRIPTION},
+ {"enableContentProtectionAttestation",
+ IDS_SETTINGS_ENABLE_CONTENT_PROTECTION_ATTESTATION},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ html_source->AddBoolean(
+ "privacySettingsRedesignEnabled",
+ base::FeatureList::IsEnabled(::features::kPrivacySettingsRedesign));
+
+ html_source->AddString("syncAndGoogleServicesLearnMoreURL",
+ chrome::kSyncAndGoogleServicesLearnMoreURL);
+ ::settings::AddPersonalizationOptionsStrings(html_source);
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/privacy_section.h b/chromium/chrome/browser/ui/webui/settings/chromeos/privacy_section.h
new file mode 100644
index 00000000000..3c5ba842681
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/privacy_section.h
@@ -0,0 +1,34 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_PRIVACY_SECTION_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_PRIVACY_SECTION_H_
+
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h"
+
+namespace content {
+class WebUIDataSource;
+} // namespace content
+
+namespace chromeos {
+namespace settings {
+
+class SearchTagRegistry;
+
+// Provides UI strings and search tags for Privacy settings. Note that some
+// search tags are added only for official Google Chrome OS builds.
+class PrivacySection : public OsSettingsSection {
+ public:
+ PrivacySection(Profile* profile, SearchTagRegistry* search_tag_registry);
+ ~PrivacySection() override;
+
+ private:
+ // OsSettingsSection:
+ void AddLoadTimeData(content::WebUIDataSource* html_source) override;
+};
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_PRIVACY_SECTION_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/reset_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/reset_section.cc
new file mode 100644
index 00000000000..1275fb0e188
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/reset_section.cc
@@ -0,0 +1,98 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/reset_section.h"
+
+#include "base/no_destructor.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/browser_process_platform_part.h"
+#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
+#include "chrome/browser/ui/webui/settings/reset_settings_handler.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/grit/chromium_strings.h"
+#include "chrome/grit/generated_resources.h"
+#include "chrome/grit/locale_settings.h"
+#include "components/user_manager/user_manager.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/webui/web_ui_util.h"
+
+namespace chromeos {
+namespace settings {
+namespace {
+
+const std::vector<SearchConcept>& GetResetSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_RESET,
+ mojom::kResetSectionPath,
+ mojom::SearchResultIcon::kReset,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSection,
+ {.section = mojom::Section::kReset}},
+ {IDS_OS_SETTINGS_TAG_RESET_POWERWASH,
+ mojom::kResetSectionPath,
+ mojom::SearchResultIcon::kReset,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kPowerwash},
+ {IDS_OS_SETTINGS_TAG_RESET_POWERWASH_ALT1, SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+bool IsPowerwashAllowed() {
+ policy::BrowserPolicyConnectorChromeOS* connector =
+ g_browser_process->platform_part()->browser_policy_connector_chromeos();
+ return !connector->IsEnterpriseManaged() &&
+ !user_manager::UserManager::Get()->IsLoggedInAsGuest() &&
+ !user_manager::UserManager::Get()->IsLoggedInAsSupervisedUser() &&
+ !user_manager::UserManager::Get()->IsLoggedInAsChildUser();
+}
+
+} // namespace
+
+ResetSection::ResetSection(Profile* profile,
+ SearchTagRegistry* search_tag_registry)
+ : OsSettingsSection(profile, search_tag_registry) {
+ if (IsPowerwashAllowed())
+ registry()->AddSearchTags(GetResetSearchConcepts());
+}
+
+ResetSection::~ResetSection() = default;
+
+void ResetSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"resetPageTitle", IDS_SETTINGS_RESET},
+ {"powerwashTitle", IDS_SETTINGS_FACTORY_RESET},
+ {"powerwashDialogTitle", IDS_SETTINGS_FACTORY_RESET_HEADING},
+ {"powerwashDialogButton", IDS_SETTINGS_RESTART},
+ {"powerwashButton", IDS_SETTINGS_FACTORY_RESET_BUTTON_LABEL},
+ {"powerwashDialogExplanation", IDS_SETTINGS_FACTORY_RESET_WARNING},
+ {"powerwashLearnMoreUrl", IDS_FACTORY_RESET_HELP_URL},
+ {"powerwashButtonRoleDescription",
+ IDS_SETTINGS_FACTORY_RESET_BUTTON_ROLE},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ html_source->AddBoolean("allowPowerwash", IsPowerwashAllowed());
+
+ html_source->AddBoolean(
+ "showResetProfileBanner",
+ ::settings::ResetSettingsHandler::ShouldShowResetProfileBanner(
+ profile()));
+
+ html_source->AddString(
+ "powerwashDescription",
+ l10n_util::GetStringFUTF16(IDS_SETTINGS_FACTORY_RESET_DESCRIPTION,
+ l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)));
+}
+
+void ResetSection::AddHandlers(content::WebUI* web_ui) {
+ web_ui->AddMessageHandler(
+ std::make_unique<::settings::ResetSettingsHandler>(profile()));
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/reset_section.h b/chromium/chrome/browser/ui/webui/settings/chromeos/reset_section.h
new file mode 100644
index 00000000000..ee99e0554c7
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/reset_section.h
@@ -0,0 +1,36 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_RESET_SECTION_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_RESET_SECTION_H_
+
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h"
+
+namespace content {
+class WebUIDataSource;
+} // namespace content
+
+namespace chromeos {
+namespace settings {
+
+class SearchTagRegistry;
+
+// Provides UI strings and search tags for Reset settings. Note that search tags
+// are only added when powerwashing is allowed, since currently this is the only
+// setting in the Reset section.
+class ResetSection : public OsSettingsSection {
+ public:
+ ResetSection(Profile* profile, SearchTagRegistry* search_tag_registry);
+ ~ResetSection() override;
+
+ private:
+ // OsSettingsSection:
+ void AddLoadTimeData(content::WebUIDataSource* html_source) override;
+ void AddHandlers(content::WebUI* web_ui) override;
+};
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_RESET_SECTION_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/search/BUILD.gn b/chromium/chrome/browser/ui/webui/settings/chromeos/search/BUILD.gn
index b4554acf90b..abbe2fc2715 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/search/BUILD.gn
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/search/BUILD.gn
@@ -13,5 +13,8 @@ mojom("mojo_bindings") {
"user_action_recorder.mojom",
]
- public_deps = [ "//mojo/public/mojom/base" ]
+ public_deps = [
+ "../constants:mojom",
+ "//mojo/public/mojom/base",
+ ]
}
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search.mojom b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search.mojom
index d319e8d1079..4be5d33c332 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search.mojom
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search.mojom
@@ -4,9 +4,40 @@
module chromeos.settings.mojom;
+import "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom";
+import "chrome/browser/ui/webui/settings/chromeos/constants/setting.mojom";
import "chrome/browser/ui/webui/settings/chromeos/search/search_result_icon.mojom";
import "mojo/public/mojom/base/string16.mojom";
+// Describes the type of settings result.
+enum SearchResultType {
+ // Result corresponding to a Section (top-level item in Settings navigation).
+ kSection,
+
+ // Result corresponding to a Subpage (nested full page).
+ kSubpage,
+
+ // Result corresponding to an individual setting.
+ kSetting,
+};
+
+// Default ranking, which is used to break ties when searching for results.
+// Manually set by the settings team to ensure that certain results can be
+// displayed more prominently.
+enum SearchResultDefaultRank {
+ kHigh,
+ kMedium,
+ kLow,
+};
+
+// Identifier for the result; each result describes one section, subpage, or
+// setting.
+union SearchResultIdentifier {
+ Section section;
+ Subpage subpage;
+ Setting setting;
+};
+
// Search result metadata.
struct SearchResult {
// String to be displayed as a result in the UI. Meant to be displayed
@@ -21,6 +52,27 @@ struct SearchResult {
// Icon to display for the search result.
SearchResultIcon icon;
+
+ // Relevance score, in the range [0, 1]. A score of 1 indicates a perfect
+ // string match.
+ double relevance_score;
+
+ // List of names of the sections/subpages for this result, which may contain
+ // names of sections and/or subpages. Names are all localized String16s, ready
+ // to be displayed directly (e.g., as breadcrumbs).
+ //
+ // Example 1 - Wi-Fi subpage: ["Settings", "Network", "Wi-Fi"]
+ // Example 2 - External storage: ["Settings", "Device", "Storage management",
+ // "External storage preferences"]
+ array<mojo_base.mojom.String16> settings_page_hierarchy;
+
+ // Default ranking, which is used to break ties when searching for results.
+ SearchResultDefaultRank default_rank;
+
+ // The type and identifier for this search result. The value of the |type|
+ // field indicates the union member used by |id|.
+ SearchResultType type;
+ SearchResultIdentifier id;
};
// Provides settings search results. Implemented in the browser process;
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_concept.h b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_concept.h
index f6dc3b8c6f6..b3763fb0fd3 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_concept.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_concept.h
@@ -5,6 +5,9 @@
#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SEARCH_SEARCH_CONCEPT_H_
#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SEARCH_SEARCH_CONCEPT_H_
+#include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h"
+#include "chrome/browser/ui/webui/settings/chromeos/constants/setting.mojom.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search.mojom.h"
#include "chrome/browser/ui/webui/settings/chromeos/search/search_result_icon.mojom.h"
namespace chromeos {
@@ -18,9 +21,17 @@ namespace settings {
// Each concept has a canonical description search tag as well as up to
// |kMaxAltTagsPerConcept| alternate descriptions search tags.
struct SearchConcept {
- static constexpr size_t kMaxAltTagsPerConcept = 4;
+ static constexpr size_t kMaxAltTagsPerConcept = 5;
static constexpr int kAltTagEnd = 0;
+ // Identifier for the concept; each concept describes one section, subpage, or
+ // setting.
+ union Identifier {
+ mojom::Section section;
+ mojom::Subpage subpage;
+ mojom::Setting setting;
+ };
+
SearchConcept(const SearchConcept& other) = default;
SearchConcept& operator=(const SearchConcept& other) = default;
@@ -41,6 +52,14 @@ struct SearchConcept {
// Icon to display for search results associated with this concept.
mojom::SearchResultIcon icon;
+ // Default ranking, which is used to break ties when searching for results.
+ mojom::SearchResultDefaultRank default_rank;
+
+ // The type and identifier for this search result. The value of the |type|
+ // field indicates the union member used by |id|.
+ mojom::SearchResultType type;
+ Identifier id;
+
// Alternate message IDs (from os_settings_search_tag_strings.grdp)
// corresponding to this concept. These IDs refer to messages which represent
// an alternate way of describing the same concept (e.g., "Monitor settings"
@@ -50,9 +69,9 @@ struct SearchConcept {
// all concepts will require this many. A value of kAltTagEnd is used to
// indicate that there are no further tags.
//
- // Example 1 - Four alternate tags: [1234, 1235, 1236, 1237]
- // Example 2 - Two alternate tags: [1234, 1235, kAltTagEnd, _]
- // Example 3 - Zero alternate tags: [kAltTagEnd, _, _, _]
+ // Example 1 - Five alternate tags: [1234, 1235, 1236, 1237, 1238]
+ // Example 2 - Two alternate tags: [1234, 1235, kAltTagEnd, _, _]
+ // Example 3 - Zero alternate tags: [kAltTagEnd, _, _, _, _]
int alt_tag_ids[kMaxAltTagsPerConcept] = {kAltTagEnd};
};
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler.cc
index a94db926427..47c0052bbf0 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler.cc
@@ -5,11 +5,12 @@
#include "chrome/browser/ui/webui/settings/chromeos/search/search_handler.h"
#include "base/strings/string_number_conversions.h"
-#include "chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/chromeos/local_search_service/local_search_service.h"
#include "chrome/browser/ui/webui/settings/chromeos/search/search_concept.h"
#include "chrome/browser/ui/webui/settings/chromeos/search/search_result_icon.mojom.h"
-#include "chrome/services/local_search_service/local_search_service_impl.h"
-#include "chrome/services/local_search_service/public/mojom/types.mojom.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
+#include "chrome/grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"
namespace chromeos {
@@ -18,16 +19,25 @@ namespace {
const int32_t kLocalSearchServiceMaxResults = 10;
+// TODO(https://crbug.com/1071700): Delete this function.
+std::vector<base::string16> GenerateDummySettingsHierarchy(
+ const char* url_path_with_parameters) {
+ std::vector<base::string16> hierarchy;
+ hierarchy.push_back(l10n_util::GetStringUTF16(IDS_INTERNAL_APP_SETTINGS));
+ hierarchy.push_back(base::ASCIIToUTF16(url_path_with_parameters));
+ return hierarchy;
+}
+
} // namespace
// static
const size_t SearchHandler::kNumMaxResults = 5;
SearchHandler::SearchHandler(
- OsSettingsLocalizedStringsProvider* strings_provider,
- local_search_service::LocalSearchServiceImpl* local_search_service)
- : strings_provider_(strings_provider),
- index_(local_search_service->GetIndexImpl(
+ SearchTagRegistry* search_tag_registry,
+ local_search_service::LocalSearchService* local_search_service)
+ : search_tag_registry_(search_tag_registry),
+ index_(local_search_service->GetIndex(
local_search_service::IndexId::kCrosSettings)) {}
SearchHandler::~SearchHandler() = default;
@@ -84,7 +94,7 @@ mojom::SearchResultPtr SearchHandler::ResultToSearchResult(
return nullptr;
const SearchConcept* concept =
- strings_provider_->GetCanonicalTagMetadata(message_id);
+ search_tag_registry_->GetCanonicalTagMetadata(message_id);
// If the concept was not registered, no metadata is available. This can occur
// if the search tag was dynamically unregistered during the asynchronous
@@ -92,15 +102,29 @@ mojom::SearchResultPtr SearchHandler::ResultToSearchResult(
if (!concept)
return nullptr;
- return mojom::SearchResult::New(l10n_util::GetStringUTF16(message_id),
- concept->url_path_with_parameters,
- concept->icon);
-}
+ mojom::SearchResultIdentifierPtr result_id;
+ switch (concept->type) {
+ case mojom::SearchResultType::kSection:
+ result_id =
+ mojom::SearchResultIdentifier::NewSection(concept->id.section);
+ break;
+ case mojom::SearchResultType::kSubpage:
+ result_id =
+ mojom::SearchResultIdentifier::NewSubpage(concept->id.subpage);
+ break;
+ case mojom::SearchResultType::kSetting:
+ result_id =
+ mojom::SearchResultIdentifier::NewSetting(concept->id.setting);
+ break;
+ }
-void SearchHandler::Shutdown() {
- strings_provider_ = nullptr;
- index_ = nullptr;
- receivers_.Clear();
+ // TODO(https://crbug.com/1071700): Generate real hierarchy instead of using
+ // GenerateDummySettingsHierarchy().
+ return mojom::SearchResult::New(
+ l10n_util::GetStringUTF16(message_id), concept->url_path_with_parameters,
+ concept->icon, result.score,
+ GenerateDummySettingsHierarchy(concept->url_path_with_parameters),
+ concept->default_rank, concept->type, std::move(result_id));
}
} // namespace settings
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler.h
index 36df7ed4bb2..8247cccaa9d 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler.h
@@ -8,38 +8,36 @@
#include <vector>
#include "base/optional.h"
+#include "chrome/browser/chromeos/local_search_service/index.h"
#include "chrome/browser/ui/webui/settings/chromeos/search/search.mojom.h"
-#include "chrome/services/local_search_service/index_impl.h"
-#include "components/keyed_service/core/keyed_service.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/remote.h"
namespace local_search_service {
-class LocalSearchServiceImpl;
+class LocalSearchService;
} // namespace local_search_service
namespace chromeos {
namespace settings {
-class OsSettingsLocalizedStringsProvider;
+class SearchTagRegistry;
// Handles search queries for Chrome OS settings. Search() is expected to be
// invoked by the settings UI as well as the the Launcher search UI. Search
// results are obtained by matching the provided query against search tags
// indexed in the LocalSearchService and cross-referencing results with
-// OsSettingsLocalizedStringsProvider.
+// SearchTagRegistry.
//
// SearchHandler returns at most |kNumMaxResults| results; searches which do not
// provide any matches result in an empty results array.
-class SearchHandler : public mojom::SearchHandler, public KeyedService {
+class SearchHandler : public mojom::SearchHandler {
public:
// Maximum number of results returned by a Search() call.
static const size_t kNumMaxResults;
- SearchHandler(
- OsSettingsLocalizedStringsProvider* strings_provider,
- local_search_service::LocalSearchServiceImpl* local_search_service);
+ SearchHandler(SearchTagRegistry* search_tag_registry,
+ local_search_service::LocalSearchService* local_search_service);
~SearchHandler() override;
SearchHandler(const SearchHandler& other) = delete;
@@ -55,17 +53,14 @@ class SearchHandler : public mojom::SearchHandler, public KeyedService {
void Search(const base::string16& query, SearchCallback callback) override;
private:
- // KeyedService:
- void Shutdown() override;
-
std::vector<mojom::SearchResultPtr> GenerateSearchResultsArray(
const std::vector<local_search_service::Result>&
local_search_service_results);
mojom::SearchResultPtr ResultToSearchResult(
const local_search_service::Result& result);
- OsSettingsLocalizedStringsProvider* strings_provider_;
- local_search_service::IndexImpl* index_;
+ SearchTagRegistry* search_tag_registry_;
+ local_search_service::Index* index_;
// Note: Expected to have multiple clients, so a ReceiverSet is used.
mojo::ReceiverSet<mojom::SearchHandler> receivers_;
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler_factory.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler_factory.cc
deleted file mode 100644
index fba87783738..00000000000
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler_factory.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/webui/settings/chromeos/search/search_handler_factory.h"
-
-#include "chrome/browser/local_search_service/local_search_service_proxy.h"
-#include "chrome/browser/local_search_service/local_search_service_proxy_factory.h"
-#include "chrome/browser/profiles/incognito_helpers.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider_factory.h"
-#include "chrome/browser/ui/webui/settings/chromeos/search/search_handler.h"
-#include "components/keyed_service/content/browser_context_dependency_manager.h"
-
-namespace chromeos {
-namespace settings {
-
-// static
-SearchHandler* SearchHandlerFactory::GetForProfile(Profile* profile) {
- return static_cast<SearchHandler*>(
- SearchHandlerFactory::GetInstance()->GetServiceForBrowserContext(
- profile, /*create=*/true));
-}
-
-// static
-SearchHandlerFactory* SearchHandlerFactory::GetInstance() {
- return base::Singleton<SearchHandlerFactory>::get();
-}
-
-SearchHandlerFactory::SearchHandlerFactory()
- : BrowserContextKeyedServiceFactory(
- "SearchHandler",
- BrowserContextDependencyManager::GetInstance()) {
- DependsOn(
- local_search_service::LocalSearchServiceProxyFactory::GetInstance());
- DependsOn(OsSettingsLocalizedStringsProviderFactory::GetInstance());
-}
-
-SearchHandlerFactory::~SearchHandlerFactory() = default;
-
-KeyedService* SearchHandlerFactory::BuildServiceInstanceFor(
- content::BrowserContext* context) const {
- Profile* profile = Profile::FromBrowserContext(context);
- return new SearchHandler(
- OsSettingsLocalizedStringsProviderFactory::GetForProfile(profile),
- local_search_service::LocalSearchServiceProxyFactory::GetForProfile(
- Profile::FromBrowserContext(profile))
- ->GetLocalSearchServiceImpl());
-}
-
-bool SearchHandlerFactory::ServiceIsNULLWhileTesting() const {
- return true;
-}
-
-content::BrowserContext* SearchHandlerFactory::GetBrowserContextToUse(
- content::BrowserContext* context) const {
- return chrome::GetBrowserContextOwnInstanceInIncognito(context);
-}
-
-} // namespace settings
-} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler_factory.h b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler_factory.h
deleted file mode 100644
index 9b69e5f161c..00000000000
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler_factory.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SEARCH_SEARCH_HANDLER_FACTORY_H_
-#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SEARCH_SEARCH_HANDLER_FACTORY_H_
-
-#include "base/memory/singleton.h"
-#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
-
-class Profile;
-
-namespace chromeos {
-namespace settings {
-
-class SearchHandler;
-
-// Factory for SearchHandler; available for incognito and multi-profile cases to
-// support settings search in those contexts.
-class SearchHandlerFactory : public BrowserContextKeyedServiceFactory {
- public:
- static SearchHandler* GetForProfile(Profile* profile);
- static SearchHandlerFactory* GetInstance();
-
- private:
- friend struct base::DefaultSingletonTraits<SearchHandlerFactory>;
-
- SearchHandlerFactory();
- ~SearchHandlerFactory() override;
-
- SearchHandlerFactory(const SearchHandlerFactory&) = delete;
- SearchHandlerFactory& operator=(const SearchHandlerFactory&) = delete;
-
- // BrowserContextKeyedServiceFactory:
- KeyedService* BuildServiceInstanceFor(
- content::BrowserContext* context) const override;
- bool ServiceIsNULLWhileTesting() const override;
- content::BrowserContext* GetBrowserContextToUse(
- content::BrowserContext* context) const override;
-};
-
-} // namespace settings
-} // namespace chromeos
-
-#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SEARCH_SEARCH_HANDLER_FACTORY_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler_unittest.cc
index cc04fb87193..f2c9d42af8d 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_handler_unittest.cc
@@ -4,74 +4,99 @@
#include "chrome/browser/ui/webui/settings/chromeos/search/search_handler.h"
-#include "base/run_loop.h"
+#include "base/no_destructor.h"
#include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.h"
+#include "base/test/scoped_feature_list.h"
+#include "base/test/task_environment.h"
+#include "chrome/browser/chromeos/local_search_service/local_search_service.h"
+#include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h"
#include "chrome/browser/ui/webui/settings/chromeos/search/search.mojom-test-utils.h"
-#include "chrome/common/webui_url_constants.h"
-#include "chrome/services/local_search_service/local_search_service_impl.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/services/network_config/public/cpp/cros_network_config_test_helper.h"
-#include "content/public/test/browser_task_environment.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
+#include "chrome/grit/generated_resources.h"
+#include "chromeos/constants/chromeos_features.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace chromeos {
namespace settings {
+namespace {
+
+// Note: Copied from printing_section.cc but does not need to stay in sync with
+// it.
+const std::vector<SearchConcept>& GetPrintingSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_PRINTING_ADD_PRINTER,
+ mojom::kPrintingDetailsSubpagePath,
+ mojom::SearchResultIcon::kPrinter,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kAddPrinter},
+ {IDS_OS_SETTINGS_TAG_PRINTING_ADD_PRINTER_ALT1,
+ IDS_OS_SETTINGS_TAG_PRINTING_ADD_PRINTER_ALT2,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_PRINTING_SAVED_PRINTERS,
+ mojom::kPrintingDetailsSubpagePath,
+ mojom::SearchResultIcon::kPrinter,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kSavedPrinters}},
+ {IDS_OS_SETTINGS_TAG_PRINTING,
+ mojom::kPrintingDetailsSubpagePath,
+ mojom::SearchResultIcon::kPrinter,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kPrintingDetails},
+ {IDS_OS_SETTINGS_TAG_PRINTING_ALT1, IDS_OS_SETTINGS_TAG_PRINTING_ALT2,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+} // namespace
class SearchHandlerTest : public testing::Test {
protected:
- SearchHandlerTest() : profile_manager_(TestingBrowserProcess::GetGlobal()) {}
+ SearchHandlerTest()
+ : search_tag_registry_(&local_search_service_),
+ handler_(&search_tag_registry_, &local_search_service_) {}
~SearchHandlerTest() override = default;
// testing::Test:
void SetUp() override {
- ASSERT_TRUE(profile_manager_.SetUp());
-
- provider_ = std::make_unique<OsSettingsLocalizedStringsProvider>(
- profile_manager_.CreateTestingProfile("TestingProfile"),
- &local_search_service_);
-
- handler_ = std::make_unique<SearchHandler>(provider_.get(),
- &local_search_service_);
- handler_->BindInterface(handler_remote_.BindNewPipeAndPassReceiver());
-
- // Allow asynchronous networking code to complete; specifically, let code
- // which adds Wi-Fi to the system run so that Wi-Fi search tags can be
- // queried below.
- base::RunLoop().RunUntilIdle();
+ scoped_feature_list_.InitAndEnableFeature(
+ chromeos::features::kNewOsSettingsSearch);
+ handler_.BindInterface(handler_remote_.BindNewPipeAndPassReceiver());
}
- content::BrowserTaskEnvironment task_environment_;
- TestingProfileManager profile_manager_;
- chromeos::network_config::CrosNetworkConfigTestHelper network_config_helper_;
+ base::test::TaskEnvironment task_environment_;
+ base::test::ScopedFeatureList scoped_feature_list_;
+ local_search_service::LocalSearchService local_search_service_;
+ SearchTagRegistry search_tag_registry_;
+ SearchHandler handler_;
mojo::Remote<mojom::SearchHandler> handler_remote_;
- local_search_service::LocalSearchServiceImpl local_search_service_;
- std::unique_ptr<OsSettingsLocalizedStringsProvider> provider_;
- std::unique_ptr<SearchHandler> handler_;
};
-TEST_F(SearchHandlerTest, Success) {
- // Search for "Wi-Fi".
+TEST_F(SearchHandlerTest, AddAndRemove) {
+ // Add printing search tags to registry and search for "Printing".
+ search_tag_registry_.AddSearchTags(GetPrintingSearchConcepts());
std::vector<mojom::SearchResultPtr> search_results;
mojom::SearchHandlerAsyncWaiter(handler_remote_.get())
- .Search(base::ASCIIToUTF16("Wi-Fi"), &search_results);
+ .Search(base::ASCIIToUTF16("Printing"), &search_results);
- // Multiple results should be available, and they should have Wi-Fi metadata.
+ // Multiple results should be available.
EXPECT_GT(search_results.size(), 0u);
- for (const auto& result : search_results) {
- EXPECT_EQ(chrome::kWiFiSettingsSubPage, result->url_path_with_parameters);
- EXPECT_EQ(mojom::SearchResultIcon::kWifi, result->icon);
- }
-}
-TEST_F(SearchHandlerTest, NoResults) {
- std::vector<mojom::SearchResultPtr> search_results;
+ // Search for a query which should return no results.
mojom::SearchHandlerAsyncWaiter(handler_remote_.get())
.Search(base::ASCIIToUTF16("QueryWithNoResults"), &search_results);
EXPECT_TRUE(search_results.empty());
+
+ // Remove printing search tags to registry and verify that no results are
+ // returned for "Printing".
+ search_tag_registry_.RemoveSearchTags(GetPrintingSearchConcepts());
+ mojom::SearchHandlerAsyncWaiter(handler_remote_.get())
+ .Search(base::ASCIIToUTF16("Printing"), &search_results);
+ EXPECT_TRUE(search_results.empty());
}
} // namespace settings
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_result_icon.mojom b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_result_icon.mojom
index ea4605ed09f..5f5b099b176 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_result_icon.mojom
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_result_icon.mojom
@@ -6,9 +6,40 @@ module chromeos.settings.mojom;
// Icon types associated with a settings search result.
enum SearchResultIcon {
+ kA11y,
+ kAndroid,
+ kAppsGrid,
+ kAssistant,
+ kAvatar,
+ kBluetooth,
kCellular,
+ kChrome,
+ kClock,
+ kDisplay,
+ kDrive,
kEthernet,
- // Note: Wi-Fi icon is used by default for networking tasks which may not be
- // specifically tied to Wi-Fi.
+ kFingerprint,
+ kFolder,
+ kGlobe,
+ kGooglePlay,
+ kHardDrive,
+ kInstantTethering,
+ kKeyboard,
+ kLaptop,
+ kLock,
+ kMagnifyingGlass,
+ kMessages,
+ kMouse,
+ kPaintbrush,
+ kPenguin,
+ kPhone,
+ kPluginVm,
+ kPower,
+ kPrinter,
+ kReset,
+ kShield,
+ kStylus,
+ kSync,
+ kWallpaper,
kWifi
-}; \ No newline at end of file
+};
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.cc
new file mode 100644
index 00000000000..e3b1b3a7b24
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.cc
@@ -0,0 +1,93 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
+
+#include "base/feature_list.h"
+#include "base/strings/string_number_conversions.h"
+#include "chrome/browser/chromeos/local_search_service/index.h"
+#include "chrome/browser/chromeos/local_search_service/local_search_service.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_concept.h"
+#include "chromeos/constants/chromeos_features.h"
+#include "ui/base/l10n/l10n_util.h"
+
+namespace chromeos {
+namespace settings {
+namespace {
+
+std::vector<local_search_service::Data> ConceptVectorToDataVector(
+ const std::vector<SearchConcept>& search_tags) {
+ std::vector<local_search_service::Data> data_list;
+
+ for (const auto& concept : search_tags) {
+ std::vector<base::string16> search_tags;
+
+ // Add the canonical tag.
+ search_tags.push_back(
+ l10n_util::GetStringUTF16(concept.canonical_message_id));
+
+ // Add all alternate tags.
+ for (size_t i = 0; i < SearchConcept::kMaxAltTagsPerConcept; ++i) {
+ int curr_alt_tag = concept.alt_tag_ids[i];
+ if (curr_alt_tag == SearchConcept::kAltTagEnd)
+ break;
+ search_tags.push_back(l10n_util::GetStringUTF16(curr_alt_tag));
+ }
+
+ // Note: A stringified version of the canonical tag message ID is used as
+ // the identifier for this search data.
+ data_list.emplace_back(base::NumberToString(concept.canonical_message_id),
+ search_tags);
+ }
+
+ return data_list;
+}
+
+} // namespace
+
+SearchTagRegistry::SearchTagRegistry(
+ local_search_service::LocalSearchService* local_search_service)
+ : index_(local_search_service->GetIndex(
+ local_search_service::IndexId::kCrosSettings)) {}
+
+SearchTagRegistry::~SearchTagRegistry() = default;
+
+void SearchTagRegistry::AddSearchTags(
+ const std::vector<SearchConcept>& search_tags) {
+ if (!base::FeatureList::IsEnabled(features::kNewOsSettingsSearch))
+ return;
+
+ index_->AddOrUpdate(ConceptVectorToDataVector(search_tags));
+
+ // Add each concept to the map. Note that it is safe to take the address of
+ // each concept because all concepts are allocated via static
+ // base::NoDestructor objects in the Get*SearchConcepts() helper functions.
+ for (const auto& concept : search_tags)
+ canonical_id_to_metadata_map_[concept.canonical_message_id] = &concept;
+}
+
+void SearchTagRegistry::RemoveSearchTags(
+ const std::vector<SearchConcept>& search_tags) {
+ if (!base::FeatureList::IsEnabled(features::kNewOsSettingsSearch))
+ return;
+
+ std::vector<std::string> ids;
+ for (const auto& concept : search_tags) {
+ canonical_id_to_metadata_map_.erase(concept.canonical_message_id);
+ ids.push_back(base::NumberToString(concept.canonical_message_id));
+ }
+
+ index_->Delete(ids);
+}
+
+const SearchConcept* SearchTagRegistry::GetCanonicalTagMetadata(
+ int canonical_message_id) const {
+ const auto it = canonical_id_to_metadata_map_.find(canonical_message_id);
+ if (it == canonical_id_to_metadata_map_.end())
+ return nullptr;
+ return it->second;
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h
new file mode 100644
index 00000000000..c1c7a947f87
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h
@@ -0,0 +1,50 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SEARCH_SEARCH_TAG_REGISTRY_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SEARCH_SEARCH_TAG_REGISTRY_H_
+
+#include <unordered_map>
+#include <vector>
+
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h"
+
+namespace local_search_service {
+class Index;
+class LocalSearchService;
+} // namespace local_search_service
+
+namespace chromeos {
+namespace settings {
+
+struct SearchConcept;
+
+// Processes all registered search tags by adding/removing them from
+// LocalSearchService and providing metadata via GetCanonicalTagMetadata().
+class SearchTagRegistry {
+ public:
+ SearchTagRegistry(
+ local_search_service::LocalSearchService* local_search_service);
+ SearchTagRegistry(const SearchTagRegistry& other) = delete;
+ SearchTagRegistry& operator=(const SearchTagRegistry& other) = delete;
+ virtual ~SearchTagRegistry();
+
+ void AddSearchTags(const std::vector<SearchConcept>& search_tags);
+ void RemoveSearchTags(const std::vector<SearchConcept>& search_tags);
+
+ // Returns the tag metadata associated with |canonical_message_id|, which must
+ // be one of the canonical IDS_OS_SETTINGS_TAG_* identifiers used for a search
+ // tag. If no metadata is available or if |canonical_message_id| instead
+ // refers to an alternate tag's ID, null is returned.
+ const SearchConcept* GetCanonicalTagMetadata(int canonical_message_id) const;
+
+ private:
+ local_search_service::Index* index_;
+ std::unordered_map<int, const SearchConcept*> canonical_id_to_metadata_map_;
+};
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SEARCH_SEARCH_TAG_REGISTRY_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry_unittest.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry_unittest.cc
new file mode 100644
index 00000000000..6eff74b2583
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry_unittest.cc
@@ -0,0 +1,96 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
+
+#include "base/no_destructor.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/chromeos/local_search_service/index.h"
+#include "chrome/browser/chromeos/local_search_service/local_search_service.h"
+#include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_concept.h"
+#include "chrome/grit/generated_resources.h"
+#include "chromeos/constants/chromeos_features.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace chromeos {
+namespace settings {
+namespace {
+
+// Note: Copied from printing_section.cc but does not need to stay in sync with
+// it.
+const std::vector<SearchConcept>& GetPrintingSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_PRINTING_ADD_PRINTER,
+ mojom::kPrintingDetailsSubpagePath,
+ mojom::SearchResultIcon::kPrinter,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kAddPrinter},
+ {IDS_OS_SETTINGS_TAG_PRINTING_ADD_PRINTER_ALT1,
+ IDS_OS_SETTINGS_TAG_PRINTING_ADD_PRINTER_ALT2,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_PRINTING_SAVED_PRINTERS,
+ mojom::kPrintingDetailsSubpagePath,
+ mojom::SearchResultIcon::kPrinter,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kSavedPrinters}},
+ {IDS_OS_SETTINGS_TAG_PRINTING,
+ mojom::kPrintingDetailsSubpagePath,
+ mojom::SearchResultIcon::kPrinter,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kPrintingDetails},
+ {IDS_OS_SETTINGS_TAG_PRINTING_ALT1, IDS_OS_SETTINGS_TAG_PRINTING_ALT2,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+} // namespace
+
+class SearchTagRegistryTest : public testing::Test {
+ protected:
+ SearchTagRegistryTest() : search_tag_registry_(&local_search_service_) {}
+ ~SearchTagRegistryTest() override = default;
+
+ // testing::Test:
+ void SetUp() override {
+ scoped_feature_list_.InitAndEnableFeature(
+ chromeos::features::kNewOsSettingsSearch);
+ index_ = local_search_service_.GetIndex(
+ local_search_service::IndexId::kCrosSettings);
+ }
+
+ base::test::ScopedFeatureList scoped_feature_list_;
+ local_search_service::LocalSearchService local_search_service_;
+ SearchTagRegistry search_tag_registry_;
+ local_search_service::Index* index_;
+};
+
+TEST_F(SearchTagRegistryTest, AddAndRemove) {
+ // Add search tags; size of the index should increase.
+ search_tag_registry_.AddSearchTags(GetPrintingSearchConcepts());
+ EXPECT_EQ(3u, index_->GetSize());
+
+ // Tags added should be available via GetCanonicalTagMetadata().
+ const SearchConcept* add_printer_concept =
+ search_tag_registry_.GetCanonicalTagMetadata(
+ IDS_OS_SETTINGS_TAG_PRINTING_ADD_PRINTER);
+ ASSERT_TRUE(add_printer_concept);
+ EXPECT_EQ(mojom::Setting::kAddPrinter, add_printer_concept->id.setting);
+
+ // Remove search tag; size should go back to 0.
+ search_tag_registry_.RemoveSearchTags(GetPrintingSearchConcepts());
+ EXPECT_EQ(0u, index_->GetSize());
+
+ // The tag should no longer be accessible via GetCanonicalTagMetadata().
+ add_printer_concept = search_tag_registry_.GetCanonicalTagMetadata(
+ IDS_OS_SETTINGS_TAG_PRINTING_ADD_PRINTER);
+ ASSERT_FALSE(add_printer_concept);
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/search_section.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/search_section.cc
new file mode 100644
index 00000000000..958071d8716
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/search_section.cc
@@ -0,0 +1,311 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/search_section.h"
+
+#include <memory>
+#include <vector>
+
+#include "ash/public/cpp/assistant/assistant_state.h"
+#include "base/no_destructor.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/chromeos/assistant/assistant_util.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.h"
+#include "chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
+#include "chrome/browser/ui/webui/settings/search_engines_handler.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/grit/generated_resources.h"
+#include "chromeos/constants/chromeos_features.h"
+#include "chromeos/services/assistant/public/cpp/assistant_prefs.h"
+#include "chromeos/services/assistant/public/cpp/features.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/webui/web_ui_util.h"
+#include "ui/chromeos/devicetype_utils.h"
+
+namespace chromeos {
+namespace settings {
+namespace {
+
+const std::vector<SearchConcept>& GetSearchPageSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_PREFERRED_SEARCH_ENGINE,
+ mojom::kSearchAndAssistantSectionPath,
+ mojom::SearchResultIcon::kMagnifyingGlass,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kPreferredSearchEngine}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetAssistantSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_ASSISTANT,
+ mojom::kAssistantSubpagePath,
+ mojom::SearchResultIcon::kAssistant,
+ mojom::SearchResultDefaultRank::kHigh,
+ mojom::SearchResultType::kSubpage,
+ {.subpage = mojom::Subpage::kAssistant}},
+ {IDS_OS_SETTINGS_TAG_ASSISTANT_QUICK_ANSWERS,
+ mojom::kAssistantSubpagePath,
+ mojom::SearchResultIcon::kAssistant,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kAssistantQuickAnswers}},
+ {IDS_OS_SETTINGS_TAG_ASSISTANT_PREFERRED_INPUT,
+ mojom::kAssistantSubpagePath,
+ mojom::SearchResultIcon::kAssistant,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kAssistantVoiceInput}},
+ {IDS_OS_SETTINGS_TAG_ASSISTANT_OK_GOOGLE,
+ mojom::kAssistantSubpagePath,
+ mojom::SearchResultIcon::kAssistant,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kAssistantOkGoogle},
+ {IDS_OS_SETTINGS_TAG_ASSISTANT_OK_GOOGLE_ALT1,
+ IDS_OS_SETTINGS_TAG_ASSISTANT_OK_GOOGLE_ALT2,
+ SearchConcept::kAltTagEnd}},
+ {IDS_OS_SETTINGS_TAG_ASSISTANT_NOTIFICATIONS,
+ mojom::kAssistantSubpagePath,
+ mojom::SearchResultIcon::kAssistant,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kAssistantNotifications}},
+ {IDS_OS_SETTINGS_TAG_ASSISTANT_RELATED_INFO,
+ mojom::kAssistantSubpagePath,
+ mojom::SearchResultIcon::kAssistant,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kAssistantRelatedInfo}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetAssistantOnSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_ASSISTANT_TURN_OFF,
+ mojom::kAssistantSubpagePath,
+ mojom::SearchResultIcon::kAssistant,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kAssistantOnOff},
+ {IDS_OS_SETTINGS_TAG_ASSISTANT_TURN_OFF_ALT1,
+ SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetAssistantOffSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ {IDS_OS_SETTINGS_TAG_ASSISTANT_TURN_ON,
+ mojom::kAssistantSubpagePath,
+ mojom::SearchResultIcon::kAssistant,
+ mojom::SearchResultDefaultRank::kMedium,
+ mojom::SearchResultType::kSetting,
+ {.setting = mojom::Setting::kAssistantOnOff},
+ {IDS_OS_SETTINGS_TAG_ASSISTANT_TURN_ON_ALT1, SearchConcept::kAltTagEnd}},
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetAssistantQuickAnswersSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ // TODO(khorimoto): Add "Assistant Quick Answers" search concepts.
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetAssistantHotwordDspSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ // TODO(khorimoto): Add "Assistant hotword DSP" search concepts.
+ });
+ return *tags;
+}
+
+const std::vector<SearchConcept>& GetAssistantVoiceMatchSearchConcepts() {
+ static const base::NoDestructor<std::vector<SearchConcept>> tags({
+ // TODO(khorimoto): Add "Assistant hotword DSP" search concepts.
+ });
+ return *tags;
+}
+
+bool IsVoiceMatchAllowed() {
+ return !assistant::features::IsVoiceMatchDisabled();
+}
+
+bool AreQuickAnswersAllowed() {
+ return features::IsQuickAnswersSettingToggleEnabled();
+}
+
+void AddGoogleAssistantStrings(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"googleAssistantPageTitle", IDS_SETTINGS_GOOGLE_ASSISTANT},
+ {"googleAssistantEnableContext", IDS_ASSISTANT_SCREEN_CONTEXT_TITLE},
+ {"googleAssistantEnableContextDescription",
+ IDS_ASSISTANT_SCREEN_CONTEXT_DESC},
+ {"googleAssistantEnableQuickAnswers",
+ IDS_ASSISTANT_QUICK_ANSWERS_SETTING_TITLE},
+ {"googleAssistantEnableQuickAnswersDescription",
+ IDS_ASSISTANT_QUICK_ANSWERS_SETTING_DESC},
+ {"googleAssistantEnableHotword",
+ IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD},
+ {"googleAssistantEnableHotwordDescription",
+ IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD_DESCRIPTION},
+ {"googleAssistantVoiceSettings",
+ IDS_SETTINGS_GOOGLE_ASSISTANT_VOICE_SETTINGS},
+ {"googleAssistantVoiceSettingsDescription",
+ IDS_ASSISTANT_VOICE_MATCH_RECORDING},
+ {"googleAssistantVoiceSettingsRetrainButton",
+ IDS_SETTINGS_GOOGLE_ASSISTANT_VOICE_SETTINGS_RETRAIN},
+ {"googleAssistantEnableHotwordWithoutDspDescription",
+ IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD_WITHOUT_DSP_DESCRIPTION},
+ {"googleAssistantEnableHotwordWithoutDspRecommended",
+ IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD_WITHOUT_DSP_RECOMMENDED},
+ {"googleAssistantEnableHotwordWithoutDspAlwaysOn",
+ IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD_WITHOUT_DSP_ALWAYS_ON},
+ {"googleAssistantEnableHotwordWithoutDspOff",
+ IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD_WITHOUT_DSP_OFF},
+ {"googleAssistantEnableNotification",
+ IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_NOTIFICATION},
+ {"googleAssistantEnableNotificationDescription",
+ IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_NOTIFICATION_DESCRIPTION},
+ {"googleAssistantLaunchWithMicOpen",
+ IDS_SETTINGS_GOOGLE_ASSISTANT_LAUNCH_WITH_MIC_OPEN},
+ {"googleAssistantLaunchWithMicOpenDescription",
+ IDS_SETTINGS_GOOGLE_ASSISTANT_LAUNCH_WITH_MIC_OPEN_DESCRIPTION},
+ {"googleAssistantSettings", IDS_SETTINGS_GOOGLE_ASSISTANT_SETTINGS},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ html_source->AddBoolean("hotwordDspAvailable", IsHotwordDspAvailable());
+ html_source->AddBoolean("voiceMatchDisabled", !IsVoiceMatchAllowed());
+ html_source->AddBoolean("quickAnswersAvailable", AreQuickAnswersAllowed());
+}
+
+} // namespace
+
+SearchSection::SearchSection(Profile* profile,
+ SearchTagRegistry* search_tag_registry)
+ : OsSettingsSection(profile, search_tag_registry) {
+ registry()->AddSearchTags(GetSearchPageSearchConcepts());
+
+ ash::AssistantState* assistant_state = ash::AssistantState::Get();
+ if (IsAssistantAllowed() && assistant_state) {
+ registry()->AddSearchTags(GetAssistantSearchConcepts());
+
+ assistant_state->AddObserver(this);
+ UpdateAssistantSearchTags();
+ }
+}
+
+SearchSection::~SearchSection() {
+ ash::AssistantState* assistant_state = ash::AssistantState::Get();
+ if (IsAssistantAllowed() && assistant_state)
+ assistant_state->RemoveObserver(this);
+}
+
+void SearchSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
+ static constexpr webui::LocalizedString kLocalizedStrings[] = {
+ {"osSearchEngineLabel", IDS_OS_SETTINGS_SEARCH_ENGINE_LABEL},
+ {"searchGoogleAssistant", IDS_SETTINGS_SEARCH_GOOGLE_ASSISTANT},
+ {"searchGoogleAssistantEnabled",
+ IDS_SETTINGS_SEARCH_GOOGLE_ASSISTANT_ENABLED},
+ {"searchGoogleAssistantDisabled",
+ IDS_SETTINGS_SEARCH_GOOGLE_ASSISTANT_DISABLED},
+ {"searchGoogleAssistantOn", IDS_SETTINGS_SEARCH_GOOGLE_ASSISTANT_ON},
+ {"searchGoogleAssistantOff", IDS_SETTINGS_SEARCH_GOOGLE_ASSISTANT_OFF},
+ };
+ AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+ const bool is_assistant_allowed = IsAssistantAllowed();
+ html_source->AddBoolean("isAssistantAllowed", is_assistant_allowed);
+ html_source->AddLocalizedString("osSearchPageTitle",
+ is_assistant_allowed
+ ? IDS_SETTINGS_SEARCH_AND_ASSISTANT
+ : IDS_SETTINGS_SEARCH);
+ html_source->AddString("searchExplanation",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_SEARCH_EXPLANATION,
+ base::ASCIIToUTF16(chrome::kOmniboxLearnMoreURL)));
+ html_source->AddString(
+ "osSearchEngineTooltip",
+ ui::SubstituteChromeOSDeviceType(IDS_OS_SETTINGS_SEARCH_ENGINE_TOOLTIP));
+
+ AddGoogleAssistantStrings(html_source);
+}
+
+void SearchSection::AddHandlers(content::WebUI* web_ui) {
+ web_ui->AddMessageHandler(
+ std::make_unique<::settings::SearchEnginesHandler>(profile()));
+ web_ui->AddMessageHandler(
+ std::make_unique<chromeos::settings::GoogleAssistantHandler>());
+}
+
+void SearchSection::OnAssistantConsentStatusChanged(int consent_status) {
+ UpdateAssistantSearchTags();
+}
+
+void SearchSection::OnAssistantContextEnabled(bool enabled) {
+ UpdateAssistantSearchTags();
+}
+
+void SearchSection::OnAssistantSettingsEnabled(bool enabled) {
+ UpdateAssistantSearchTags();
+}
+
+void SearchSection::OnAssistantHotwordEnabled(bool enabled) {
+ UpdateAssistantSearchTags();
+}
+
+bool SearchSection::IsAssistantAllowed() {
+ // NOTE: This will be false when the flag is disabled.
+ return ::assistant::IsAssistantAllowedForProfile(profile()) ==
+ chromeos::assistant::AssistantAllowedState::ALLOWED;
+}
+
+void SearchSection::UpdateAssistantSearchTags() {
+ // Start without any Assistant search concepts, then add if needed below.
+ registry()->RemoveSearchTags(GetAssistantOnSearchConcepts());
+ registry()->RemoveSearchTags(GetAssistantOffSearchConcepts());
+ registry()->RemoveSearchTags(GetAssistantQuickAnswersSearchConcepts());
+ registry()->RemoveSearchTags(GetAssistantHotwordDspSearchConcepts());
+ registry()->RemoveSearchTags(GetAssistantVoiceMatchSearchConcepts());
+
+ ash::AssistantState* assistant_state = ash::AssistantState::Get();
+
+ // The setting_enabled() function is the top-level enabled state. If this is
+ // off, none of the sub-features are enabled.
+ if (!assistant_state->settings_enabled() ||
+ !assistant_state->settings_enabled().value()) {
+ registry()->AddSearchTags(GetAssistantOffSearchConcepts());
+ return;
+ }
+
+ registry()->AddSearchTags(GetAssistantOnSearchConcepts());
+
+ if (AreQuickAnswersAllowed() && assistant_state->context_enabled() &&
+ assistant_state->context_enabled().value()) {
+ registry()->AddSearchTags(GetAssistantQuickAnswersSearchConcepts());
+ }
+
+ if (IsHotwordDspAvailable())
+ registry()->AddSearchTags(GetAssistantHotwordDspSearchConcepts());
+
+ if (IsVoiceMatchAllowed() && assistant_state->hotword_enabled() &&
+ assistant_state->hotword_enabled().value() &&
+ assistant_state->consent_status() &&
+ assistant_state->consent_status().value() ==
+ assistant::prefs::ConsentStatus::kActivityControlAccepted) {
+ registry()->AddSearchTags(GetAssistantVoiceMatchSearchConcepts());
+ }
+}
+
+} // namespace settings
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/search_section.h b/chromium/chrome/browser/ui/webui/settings/chromeos/search_section.h
new file mode 100644
index 00000000000..d53c8d0e1ff
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/search_section.h
@@ -0,0 +1,47 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SEARCH_SECTION_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SEARCH_SECTION_H_
+
+#include "ash/public/cpp/assistant/assistant_state_base.h"
+#include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h"
+
+namespace content {
+class WebUIDataSource;
+} // namespace content
+
+namespace chromeos {
+namespace settings {
+
+class SearchTagRegistry;
+
+// Provides UI strings and search tags for Search & Assistant settings. Search
+// tags for Assistant settings are added/removed depending on whether the
+// feature and relevant flags are enabled/disabled.
+class SearchSection : public OsSettingsSection,
+ public ash::AssistantStateObserver {
+ public:
+ SearchSection(Profile* profile, SearchTagRegistry* search_tag_registry);
+ ~SearchSection() override;
+
+ private:
+ // OsSettingsSection:
+ void AddLoadTimeData(content::WebUIDataSource* html_source) override;
+ void AddHandlers(content::WebUI* web_ui) override;
+
+ // ash::AssistantStateObserver:
+ void OnAssistantConsentStatusChanged(int consent_status) override;
+ void OnAssistantContextEnabled(bool enabled) override;
+ void OnAssistantSettingsEnabled(bool enabled) override;
+ void OnAssistantHotwordEnabled(bool enabled) override;
+
+ bool IsAssistantAllowed();
+ void UpdateAssistantSearchTags();
+};
+
+} // namespace settings
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SEARCH_SECTION_H_
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.cc
index 5f169f010f8..60153b07908 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.cc
@@ -5,15 +5,13 @@
#include "chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.h"
#include "base/bind.h"
-#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/ash/wallpaper_controller_client.h"
#include "content/public/browser/web_ui.h"
namespace chromeos {
namespace settings {
-WallpaperHandler::WallpaperHandler(content::WebUI* webui)
- : profile_(Profile::FromWebUI(webui)) {}
+WallpaperHandler::WallpaperHandler() = default;
WallpaperHandler::~WallpaperHandler() = default;
diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.h
index 6e0c811b9e0..90fa8c6c218 100644
--- a/chromium/chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.h
@@ -12,19 +12,13 @@ namespace base {
class ListValue;
}
-namespace content {
-class WebUI;
-}
-
-class Profile;
-
namespace chromeos {
namespace settings {
// Chrome "Personalization" settings page UI handler.
class WallpaperHandler : public ::settings::SettingsPageUIHandler {
public:
- explicit WallpaperHandler(content::WebUI* webui);
+ WallpaperHandler();
~WallpaperHandler() override;
// SettingsPageUIHandler implementation.
@@ -45,8 +39,6 @@ class WallpaperHandler : public ::settings::SettingsPageUIHandler {
// Helper function to resolve the Javascript callback.
void ResolveCallback(const base::Value& callback_id, bool result);
- Profile* const profile_;
-
DISALLOW_COPY_AND_ASSIGN(WallpaperHandler);
};
diff --git a/chromium/chrome/browser/ui/webui/settings/custom_home_pages_table_model.cc b/chromium/chrome/browser/ui/webui/settings/custom_home_pages_table_model.cc
index 22143e9bfe1..e2f4c5719c7 100644
--- a/chromium/chrome/browser/ui/webui/settings/custom_home_pages_table_model.cc
+++ b/chromium/chrome/browser/ui/webui/settings/custom_home_pages_table_model.cc
@@ -245,11 +245,9 @@ void CustomHomePagesTableModel::LoadAllTitles() {
for (Entry& entry : entries_) {
if (history_service) {
entry.task_id = history_service->QueryURL(
- entry.url,
- false,
- base::Bind(&CustomHomePagesTableModel::OnGotOneOfManyTitles,
- base::Unretained(this),
- entry.url),
+ entry.url, false,
+ base::BindOnce(&CustomHomePagesTableModel::OnGotOneOfManyTitles,
+ base::Unretained(this), entry.url),
&task_tracker_);
}
}
diff --git a/chromium/chrome/browser/ui/webui/settings/downloads_handler.cc b/chromium/chrome/browser/ui/webui/settings/downloads_handler.cc
index 1839de5c2ab..782935e766d 100644
--- a/chromium/chrome/browser/ui/webui/settings/downloads_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/downloads_handler.cc
@@ -78,7 +78,7 @@ void DownloadsHandler::SendAutoOpenDownloadsToJavascript() {
content::DownloadManager* manager =
content::BrowserContext::GetDownloadManager(profile_);
bool auto_open_downloads =
- DownloadPrefs::FromDownloadManager(manager)->IsAutoOpenUsed();
+ DownloadPrefs::FromDownloadManager(manager)->IsAutoOpenByUserUsed();
FireWebUIListener("auto-open-downloads-changed",
base::Value(auto_open_downloads));
}
@@ -88,7 +88,7 @@ void DownloadsHandler::HandleResetAutoOpenFileTypes(
base::RecordAction(UserMetricsAction("Options_ResetAutoOpenFiles"));
content::DownloadManager* manager =
content::BrowserContext::GetDownloadManager(profile_);
- DownloadPrefs::FromDownloadManager(manager)->ResetAutoOpen();
+ DownloadPrefs::FromDownloadManager(manager)->ResetAutoOpenByUser();
}
void DownloadsHandler::HandleSelectDownloadLocation(
diff --git a/chromium/chrome/browser/ui/webui/settings/extension_control_handler.cc b/chromium/chrome/browser/ui/webui/settings/extension_control_handler.cc
index ad36ee33086..9adcb69b908 100644
--- a/chromium/chrome/browser/ui/webui/settings/extension_control_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/extension_control_handler.cc
@@ -6,7 +6,7 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
-#include "base/logging.h"
+#include "base/check.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/profiles/profile.h"
#include "content/public/browser/web_ui.h"
diff --git a/chromium/chrome/browser/ui/webui/settings/font_handler.cc b/chromium/chrome/browser/ui/webui/settings/font_handler.cc
index 8fac7613e07..2597d8c3154 100644
--- a/chromium/chrome/browser/ui/webui/settings/font_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/font_handler.cc
@@ -26,11 +26,10 @@
namespace settings {
-FontHandler::FontHandler(content::WebUI* webui)
- : profile_(Profile::FromWebUI(webui)) {
+FontHandler::FontHandler(Profile* profile) {
#if defined(OS_MACOSX)
// Perform validation for saved fonts.
- settings_utils::ValidateSavedFonts(profile_->GetPrefs());
+ settings_utils::ValidateSavedFonts(profile->GetPrefs());
#endif
}
@@ -52,9 +51,9 @@ void FontHandler::HandleFetchFontsData(const base::ListValue* args) {
CHECK(args->GetString(0, &callback_id));
AllowJavascript();
- content::GetFontListAsync(base::Bind(&FontHandler::FontListHasLoaded,
- weak_ptr_factory_.GetWeakPtr(),
- callback_id));
+ content::GetFontListAsync(base::BindOnce(&FontHandler::FontListHasLoaded,
+ weak_ptr_factory_.GetWeakPtr(),
+ callback_id));
}
void FontHandler::FontListHasLoaded(std::string callback_id,
diff --git a/chromium/chrome/browser/ui/webui/settings/font_handler.h b/chromium/chrome/browser/ui/webui/settings/font_handler.h
index 6864cb5381c..18892313860 100644
--- a/chromium/chrome/browser/ui/webui/settings/font_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/font_handler.h
@@ -13,22 +13,18 @@
#include "base/scoped_observer.h"
#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
+class Profile;
+
namespace base {
class ListValue;
-}
-
-namespace content {
-class WebUI;
-}
-
-class Profile;
+} // namespace base
namespace settings {
// Handle OS font list and font preference settings.
class FontHandler : public SettingsPageUIHandler {
public:
- explicit FontHandler(content::WebUI* webui);
+ explicit FontHandler(Profile* profile);
~FontHandler() override;
// SettingsPageUIHandler implementation.
@@ -44,8 +40,6 @@ class FontHandler : public SettingsPageUIHandler {
void FontListHasLoaded(std::string callback_id,
std::unique_ptr<base::ListValue> list);
- Profile* profile_; // Weak pointer.
-
base::WeakPtrFactory<FontHandler> weak_ptr_factory_{this};
DISALLOW_COPY_AND_ASSIGN(FontHandler);
diff --git a/chromium/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc b/chromium/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc
index c3a7e90c080..402e761e565 100644
--- a/chromium/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc
+++ b/chromium/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc
@@ -9,7 +9,7 @@
#include <vector>
#include "base/bind.h"
-#include "base/logging.h"
+#include "base/check_op.h"
#include "base/metrics/histogram_macros.h"
#include "base/metrics/user_metrics.h"
#include "base/strings/utf_string_conversions.h"
diff --git a/chromium/chrome/browser/ui/webui/settings/languages_handler.cc b/chromium/chrome/browser/ui/webui/settings/languages_handler.cc
index 68aa52886fa..aeb49ddd718 100644
--- a/chromium/chrome/browser/ui/webui/settings/languages_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/languages_handler.cc
@@ -8,7 +8,6 @@
#include "base/values.h"
#include "build/build_config.h"
#include "chrome/browser/browser_process.h"
-#include "chrome/browser/profiles/profile.h"
#include "chrome/common/pref_names.h"
#include "components/language/core/browser/pref_names.h"
#include "components/prefs/pref_service.h"
@@ -17,18 +16,20 @@
#if defined(OS_CHROMEOS)
#include "chrome/browser/chromeos/base/locale_util.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/browser/profiles/profile.h"
#include "components/user_manager/user_manager.h"
#include "components/user_manager/user_type.h"
#endif
namespace settings {
-LanguagesHandler::LanguagesHandler(content::WebUI* webui)
- : profile_(Profile::FromWebUI(webui)) {
-}
+#if defined(OS_CHROMEOS)
+LanguagesHandler::LanguagesHandler(Profile* profile) : profile_(profile) {}
+#else
+LanguagesHandler::LanguagesHandler() = default;
+#endif
-LanguagesHandler::~LanguagesHandler() {
-}
+LanguagesHandler::~LanguagesHandler() = default;
void LanguagesHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback(
diff --git a/chromium/chrome/browser/ui/webui/settings/languages_handler.h b/chromium/chrome/browser/ui/webui/settings/languages_handler.h
index e1cfd55e98f..b150e0e58ba 100644
--- a/chromium/chrome/browser/ui/webui/settings/languages_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/languages_handler.h
@@ -8,22 +8,24 @@
#include "base/macros.h"
#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
+#if defined(OS_CHROMEOS)
+class Profile;
+#endif
+
namespace base {
class ListValue;
-}
-
-namespace content {
-class WebUI;
-}
-
-class Profile;
+} // namespace base
namespace settings {
// Chrome "Languages" settings page UI handler.
class LanguagesHandler : public SettingsPageUIHandler {
public:
- explicit LanguagesHandler(content::WebUI* webui);
+#if defined(OS_CHROMEOS)
+ explicit LanguagesHandler(Profile* profile);
+#else
+ LanguagesHandler();
+#endif
~LanguagesHandler() override;
// SettingsPageUIHandler implementation.
@@ -41,7 +43,9 @@ class LanguagesHandler : public SettingsPageUIHandler {
// The actual UI language will not change until the next restart.
void HandleSetProspectiveUILanguage(const base::ListValue* args);
+#if defined(OS_CHROMEOS)
Profile* profile_; // Weak pointer.
+#endif
DISALLOW_COPY_AND_ASSIGN(LanguagesHandler);
};
diff --git a/chromium/chrome/browser/ui/webui/settings/on_startup_handler.cc b/chromium/chrome/browser/ui/webui/settings/on_startup_handler.cc
index 48ae4623565..069fb8862ca 100644
--- a/chromium/chrome/browser/ui/webui/settings/on_startup_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/on_startup_handler.cc
@@ -8,7 +8,7 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
-#include "base/logging.h"
+#include "base/check_op.h"
#include "chrome/browser/extensions/settings_api_helpers.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/settings_utils.h"
diff --git a/chromium/chrome/browser/ui/webui/settings/people_handler.cc b/chromium/chrome/browser/ui/webui/settings/people_handler.cc
index 57cd1e34ebb..7e3a8677080 100644
--- a/chromium/chrome/browser/ui/webui/settings/people_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/people_handler.cc
@@ -30,6 +30,7 @@
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/chrome_pages.h"
+#include "chrome/browser/ui/signin_view_controller.h"
#include "chrome/browser/ui/singleton_tabs.h"
#include "chrome/browser/ui/webui/signin/login_ui_service.h"
#include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
@@ -696,16 +697,23 @@ void PeopleHandler::HandleSignout(const base::ListValue* args) {
delete_profile ? signin_metrics::SignoutDelete::DELETED
: signin_metrics::SignoutDelete::KEEPING;
+ // Do not remove the accounts: the Gaia logout tab will remove them in a
+ // better way (see http://crbug.com/1068978).
identity_manager->GetPrimaryAccountMutator()->ClearPrimaryAccount(
- signin::PrimaryAccountMutator::ClearAccountsAction::kRemoveAll,
+ signin::PrimaryAccountMutator::ClearAccountsAction::kKeepAll,
signin_metrics::USER_CLICKED_SIGNOUT_SETTINGS, delete_metric);
} else {
DCHECK(!delete_profile)
<< "Deleting the profile should only be offered the user is syncing.";
-
- identity_manager->GetAccountsMutator()->RemoveAllAccounts(
- signin_metrics::SourceForRefreshTokenOperation::kSettings_Signout);
}
+
+ Browser* browser =
+ chrome::FindBrowserWithWebContents(web_ui()->GetWebContents());
+ if (!browser)
+ return;
+
+ browser->signin_view_controller()->ShowGaiaLogoutTab(
+ signin_metrics::SourceForRefreshTokenOperation::kSettings_Signout);
}
if (delete_profile) {
@@ -731,7 +739,8 @@ void PeopleHandler::HandleStartKeyRetrieval(const base::ListValue* args) {
if (!browser)
return;
- sync_ui_util::OpenTabForSyncKeyRetrieval(browser);
+ sync_ui_util::OpenTabForSyncKeyRetrieval(
+ browser, syncer::KeyRetrievalTriggerForUMA::kSettings);
}
void PeopleHandler::HandleGetSyncStatus(const base::ListValue* args) {
diff --git a/chromium/chrome/browser/ui/webui/settings/people_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/people_handler_unittest.cc
index f2ecedd6377..e35907dc4dd 100644
--- a/chromium/chrome/browser/ui/webui/settings/people_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/people_handler_unittest.cc
@@ -114,6 +114,8 @@ std::string GetConfiguration(const base::DictionaryValue* extra_values,
types.Has(syncer::UserSelectableType::kThemes));
result.SetBoolean("typedUrlsSynced",
types.Has(syncer::UserSelectableType::kHistory));
+ result.SetBoolean("wifiConfigurationsSynced",
+ types.Has(syncer::UserSelectableType::kWifiConfigurations));
result.SetBoolean("paymentsIntegrationEnabled", false);
// Reading list doesn't really have a UI and is supported on ios only.
@@ -175,6 +177,8 @@ void CheckConfigDataTypeArguments(const base::DictionaryValue* dictionary,
types.Has(syncer::UserSelectableType::kThemes));
CheckBool(dictionary, "typedUrlsSynced",
types.Has(syncer::UserSelectableType::kHistory));
+ CheckBool(dictionary, "wifiConfigurationsSynced",
+ types.Has(syncer::UserSelectableType::kWifiConfigurations));
}
std::unique_ptr<KeyedService> BuildMockSyncService(
diff --git a/chromium/chrome/browser/ui/webui/recent_site_settings_helper.cc b/chromium/chrome/browser/ui/webui/settings/recent_site_settings_helper.cc
index 00a93c28ebd..2667968a032 100644
--- a/chromium/chrome/browser/ui/webui/recent_site_settings_helper.cc
+++ b/chromium/chrome/browser/ui/webui/settings/recent_site_settings_helper.cc
@@ -2,12 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "chrome/browser/ui/webui/recent_site_settings_helper.h"
+#include "chrome/browser/ui/webui/settings/recent_site_settings_helper.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
#include "chrome/browser/permissions/permission_decision_auto_blocker_factory.h"
#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/webui/site_settings_helper.h"
+#include "chrome/browser/ui/webui/settings/site_settings_helper.h"
#include "components/content_settings/core/common/content_settings_utils.h"
#include "components/permissions/permission_decision_auto_blocker.h"
@@ -145,9 +145,9 @@ std::vector<RecentSitePermissions> GetRecentSitePermissions(
GetAllSettingsForProfile(profile, content_types);
std::map<GURL, std::vector<TimestampedSetting>> incognito_settings;
- if (profile->HasOffTheRecordProfile()) {
+ if (profile->HasPrimaryOTRProfile()) {
incognito_settings = GetAllSettingsForProfile(
- profile->GetOffTheRecordProfile(), content_types);
+ profile->GetPrimaryOTRProfile(), content_types);
// Remove all permission entries in the incognito map which also have
// an entry in the regular settings. This may result in an empty setting
diff --git a/chromium/chrome/browser/ui/webui/recent_site_settings_helper.h b/chromium/chrome/browser/ui/webui/settings/recent_site_settings_helper.h
index 92b680ba0e6..65ec8a03544 100644
--- a/chromium/chrome/browser/ui/webui/recent_site_settings_helper.h
+++ b/chromium/chrome/browser/ui/webui/settings/recent_site_settings_helper.h
@@ -2,13 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef CHROME_BROWSER_UI_WEBUI_RECENT_SITE_SETTINGS_HELPER_H_
-#define CHROME_BROWSER_UI_WEBUI_RECENT_SITE_SETTINGS_HELPER_H_
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_RECENT_SITE_SETTINGS_HELPER_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_RECENT_SITE_SETTINGS_HELPER_H_
#include <vector>
#include "base/time/time.h"
-#include "chrome/browser/ui/webui/site_settings_helper.h"
+#include "chrome/browser/ui/webui/settings/site_settings_helper.h"
#include "components/content_settings/core/common/content_settings.h"
#include "components/content_settings/core/common/content_settings_types.h"
#include "url/gurl.h"
@@ -62,4 +62,4 @@ std::vector<RecentSitePermissions> GetRecentSitePermissions(
} // namespace site_settings
-#endif // CHROME_BROWSER_UI_WEBUI_RECENT_SITE_SETTINGS_HELPER_H_
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_RECENT_SITE_SETTINGS_HELPER_H_
diff --git a/chromium/chrome/browser/ui/webui/recent_site_settings_helper_unittest.cc b/chromium/chrome/browser/ui/webui/settings/recent_site_settings_helper_unittest.cc
index 870ef2d0012..7984c581713 100644
--- a/chromium/chrome/browser/ui/webui/recent_site_settings_helper_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/recent_site_settings_helper_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/ui/webui/recent_site_settings_helper.h"
+#include "chrome/browser/ui/webui/settings/recent_site_settings_helper.h"
#include "base/test/simple_test_clock.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
diff --git a/chromium/chrome/browser/ui/webui/settings/reset_settings_handler.cc b/chromium/chrome/browser/ui/webui/settings/reset_settings_handler.cc
index 7dae9628108..f689a4343bb 100644
--- a/chromium/chrome/browser/ui/webui/settings/reset_settings_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/reset_settings_handler.cc
@@ -32,12 +32,8 @@
#include "ui/base/l10n/l10n_util.h"
#if defined(OS_CHROMEOS)
-#include "chrome/browser/browser_process.h"
-#include "chrome/browser/browser_process_platform_part.h"
-#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
#include "chrome/browser/chromeos/reset/metrics.h"
#include "chrome/common/pref_names.h"
-#include "components/user_manager/user_manager.h"
#endif // defined(OS_CHROMEOS)
#if defined(OS_WIN)
@@ -70,8 +66,25 @@ ResetRequestOriginFromString(const std::string& request_origin) {
} // namespace
+// static
const char ResetSettingsHandler::kCctResetSettingsHash[] = "cct";
+// static
+bool ResetSettingsHandler::ShouldShowResetProfileBanner(Profile* profile) {
+ const base::Time reset_time = chrome_prefs::GetResetTime(profile);
+
+ // If there is no reset time, do not show the banner.
+ if (reset_time.is_null())
+ return false;
+
+ // Otherwise, only show the banner if it has been less than |kBannerShowTime|
+ // since reset.
+ static constexpr base::TimeDelta kBannerShowTime =
+ base::TimeDelta::FromDays(5);
+ const base::TimeDelta since_reset = base::Time::Now() - reset_time;
+ return since_reset < kBannerShowTime;
+}
+
ResetSettingsHandler::ResetSettingsHandler(Profile* profile)
: profile_(profile) {
google_brand::GetBrand(&brandcode_);
@@ -79,33 +92,6 @@ ResetSettingsHandler::ResetSettingsHandler(Profile* profile)
ResetSettingsHandler::~ResetSettingsHandler() {}
-ResetSettingsHandler* ResetSettingsHandler::Create(
- content::WebUIDataSource* html_source, Profile* profile) {
-#if defined(OS_CHROMEOS)
- // TODO(crbug.com/891905): Centralize powerwash restriction checks.
- bool allow_powerwash = false;
- policy::BrowserPolicyConnectorChromeOS* connector =
- g_browser_process->platform_part()->browser_policy_connector_chromeos();
- allow_powerwash =
- !connector->IsEnterpriseManaged() &&
- !user_manager::UserManager::Get()->IsLoggedInAsGuest() &&
- !user_manager::UserManager::Get()->IsLoggedInAsSupervisedUser() &&
- !user_manager::UserManager::Get()->IsLoggedInAsChildUser();
- html_source->AddBoolean("allowPowerwash", allow_powerwash);
-#endif // defined(OS_CHROMEOS)
-
- bool show_reset_profile_banner = false;
- static const int kBannerShowTimeInDays = 5;
- const base::Time then = chrome_prefs::GetResetTime(profile);
- if (!then.is_null()) {
- show_reset_profile_banner =
- (base::Time::Now() - then).InDays() < kBannerShowTimeInDays;
- }
- html_source->AddBoolean("showResetProfileBanner", show_reset_profile_banner);
-
- return new ResetSettingsHandler(profile);
-}
-
void ResetSettingsHandler::OnJavascriptDisallowed() {
callback_weak_ptr_factory_.InvalidateWeakPtrs();
}
diff --git a/chromium/chrome/browser/ui/webui/settings/reset_settings_handler.h b/chromium/chrome/browser/ui/webui/settings/reset_settings_handler.h
index db6f082298e..c3b0ef8a100 100644
--- a/chromium/chrome/browser/ui/webui/settings/reset_settings_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/reset_settings_handler.h
@@ -19,10 +19,6 @@ namespace base {
class ListValue;
} // namespace base
-namespace content {
-class WebUIDataSource;
-}
-
class BrandcodeConfigFetcher;
class Profile;
class ProfileResetter;
@@ -39,10 +35,10 @@ class ResetSettingsHandler : public SettingsPageUIHandler {
// profile settings URL.
static const char kCctResetSettingsHash[];
- ~ResetSettingsHandler() override;
+ static bool ShouldShowResetProfileBanner(Profile* profile);
- static ResetSettingsHandler* Create(
- content::WebUIDataSource* html_source, Profile* profile);
+ explicit ResetSettingsHandler(Profile* profile);
+ ~ResetSettingsHandler() override;
// WebUIMessageHandler implementation.
void RegisterMessages() override;
@@ -50,8 +46,6 @@ class ResetSettingsHandler : public SettingsPageUIHandler {
void OnJavascriptDisallowed() override;
protected:
- explicit ResetSettingsHandler(Profile* profile);
-
// Overriden in tests to substitute with a test version of ProfileResetter.
virtual ProfileResetter* GetResetter();
diff --git a/chromium/chrome/browser/ui/webui/settings/safe_browsing_handler.h b/chromium/chrome/browser/ui/webui/settings/safe_browsing_handler.h
index 4c27dae0c27..a92e70ad9ab 100644
--- a/chromium/chrome/browser/ui/webui/settings/safe_browsing_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/safe_browsing_handler.h
@@ -6,7 +6,7 @@
#define CHROME_BROWSER_UI_WEBUI_SETTINGS_SAFE_BROWSING_HANDLER_H_
#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
-#include "chrome/browser/ui/webui/site_settings_helper.h"
+#include "chrome/browser/ui/webui/settings/site_settings_helper.h"
#include "chrome/browser/profiles/profile.h"
diff --git a/chromium/chrome/browser/ui/webui/settings/safety_check_handler.cc b/chromium/chrome/browser/ui/webui/settings/safety_check_handler.cc
index 8e954398304..fabe2039537 100644
--- a/chromium/chrome/browser/ui/webui/settings/safety_check_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/safety_check_handler.cc
@@ -23,6 +23,8 @@
#include "components/safe_browsing/core/common/safe_browsing_prefs.h"
#include "components/strings/grit/components_strings.h"
#include "components/version_info/version_info.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/storage_partition.h"
#include "extensions/browser/extension_prefs_factory.h"
#include "extensions/browser/extension_system.h"
#include "extensions/common/extension_id.h"
@@ -35,6 +37,7 @@
namespace {
// Constants for communication with JS.
+constexpr char kParentEvent[] = "safety-check-parent-status-changed";
constexpr char kUpdatesEvent[] = "safety-check-updates-status-changed";
constexpr char kPasswordsEvent[] = "safety-check-passwords-status-changed";
constexpr char kSafeBrowsingEvent[] =
@@ -44,7 +47,6 @@ constexpr char kPerformSafetyCheck[] = "performSafetyCheck";
constexpr char kGetParentRanDisplayString[] = "getSafetyCheckRanDisplayString";
constexpr char kNewState[] = "newState";
constexpr char kDisplayString[] = "displayString";
-constexpr char kButtonString[] = "buttonString";
constexpr char kPasswordsCompromised[] = "passwordsCompromised";
constexpr char kExtensionsReenabledByUser[] = "extensionsReenabledByUser";
constexpr char kExtensionsReenabledByAdmin[] = "extensionsReenabledByAdmin";
@@ -84,17 +86,61 @@ SafetyCheckHandler::SafetyCheckHandler() = default;
SafetyCheckHandler::~SafetyCheckHandler() = default;
-void SafetyCheckHandler::PerformSafetyCheck() {
+void SafetyCheckHandler::SendSafetyCheckStartedWebUiUpdates() {
AllowJavascript();
+ // Reset status of parent and children, which might have been set from a
+ // previous run of safety check.
+ parent_status_ = ParentStatus::kChecking;
+ update_status_ = UpdateStatus::kChecking;
+ passwords_status_ = PasswordsStatus::kChecking;
+ safe_browsing_status_ = SafeBrowsingStatus::kChecking;
+ extensions_status_ = ExtensionsStatus::kChecking;
+
+ // Update WebUi.
+ FireBasicSafetyCheckWebUiListener(kParentEvent,
+ static_cast<int>(parent_status_),
+ GetStringForParent(parent_status_));
+ FireBasicSafetyCheckWebUiListener(kUpdatesEvent,
+ static_cast<int>(update_status_),
+ GetStringForUpdates(update_status_));
+ FireBasicSafetyCheckWebUiListener(
+ kPasswordsEvent, static_cast<int>(passwords_status_),
+ GetStringForPasswords(passwords_status_, Compromised(0), Done(0),
+ Total(0)));
+ FireBasicSafetyCheckWebUiListener(
+ kSafeBrowsingEvent, static_cast<int>(safe_browsing_status_),
+ GetStringForSafeBrowsing(safe_browsing_status_));
+ FireBasicSafetyCheckWebUiListener(
+ kExtensionsEvent, static_cast<int>(extensions_status_),
+ GetStringForExtensions(extensions_status_, Blocklisted(0),
+ ReenabledUser(0), ReenabledAdmin(0)));
+}
+
+void SafetyCheckHandler::PerformSafetyCheck() {
+ // If the user refreshes the Settings tab in the delay between starting safety
+ // check and now, then the check should no longer be run.
+ if (!IsJavascriptAllowed())
+ return;
+
+ // Checks common to desktop, Android, and iOS are handled by
+ // safety_check::SafetyCheck.
+ safety_check_.reset(new safety_check::SafetyCheck(this));
+ safety_check_->CheckSafeBrowsing(Profile::FromWebUI(web_ui())->GetPrefs());
+
if (!version_updater_) {
version_updater_.reset(VersionUpdater::Create(web_ui()->GetWebContents()));
}
DCHECK(version_updater_);
+ if (!update_helper_) {
+ update_helper_.reset(new safety_check::UpdateCheckHelper(
+ content::BrowserContext::GetDefaultStoragePartition(
+ Profile::FromWebUI(web_ui()))
+ ->GetURLLoaderFactoryForBrowserProcess()));
+ }
+ DCHECK(update_helper_);
CheckUpdates();
- CheckSafeBrowsing();
-
if (!leak_service_) {
leak_service_ = BulkLeakCheckServiceFactory::GetForProfile(
Profile::FromWebUI(web_ui()));
@@ -123,57 +169,50 @@ void SafetyCheckHandler::PerformSafetyCheck() {
}
SafetyCheckHandler::SafetyCheckHandler(
+ std::unique_ptr<safety_check::UpdateCheckHelper> update_helper,
std::unique_ptr<VersionUpdater> version_updater,
password_manager::BulkLeakCheckService* leak_service,
extensions::PasswordsPrivateDelegate* passwords_delegate,
extensions::ExtensionPrefs* extension_prefs,
extensions::ExtensionServiceInterface* extension_service)
- : version_updater_(std::move(version_updater)),
+ : update_helper_(std::move(update_helper)),
+ version_updater_(std::move(version_updater)),
leak_service_(leak_service),
passwords_delegate_(passwords_delegate),
extension_prefs_(extension_prefs),
extension_service_(extension_service) {}
void SafetyCheckHandler::HandlePerformSafetyCheck(const base::ListValue* args) {
- PerformSafetyCheck();
+ SendSafetyCheckStartedWebUiUpdates();
+
+ // Run safety check after a delay. This ensures that the "running" state is
+ // visible to users for each safety check child, even if a child would
+ // otherwise complete in an instant.
+ base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
+ FROM_HERE,
+ base::BindOnce(&SafetyCheckHandler::PerformSafetyCheck,
+ weak_ptr_factory_.GetWeakPtr()),
+ base::TimeDelta::FromSeconds(1));
}
void SafetyCheckHandler::HandleGetParentRanDisplayString(
const base::ListValue* args) {
const base::Value* callback_id;
- double timestampRanDouble;
CHECK(args->Get(0, &callback_id));
- CHECK(args->GetDouble(1, &timestampRanDouble));
ResolveJavascriptCallback(
- *callback_id, base::Value(GetStringForParentRan(timestampRanDouble)));
+ *callback_id,
+ base::Value(GetStringForParentRan(safety_check_completion_time_)));
}
void SafetyCheckHandler::CheckUpdates() {
// Usage of base::Unretained(this) is safe, because we own `version_updater_`.
version_updater_->CheckForUpdate(
- base::Bind(&SafetyCheckHandler::OnUpdateCheckResult,
+ base::Bind(&SafetyCheckHandler::OnVersionUpdaterResult,
base::Unretained(this)),
VersionUpdater::PromoteCallback());
}
-void SafetyCheckHandler::CheckSafeBrowsing() {
- PrefService* pref_service = Profile::FromWebUI(web_ui())->GetPrefs();
- const PrefService::Preference* pref =
- pref_service->FindPreference(prefs::kSafeBrowsingEnabled);
- SafeBrowsingStatus status;
- if (pref_service->GetBoolean(prefs::kSafeBrowsingEnabled)) {
- status = SafeBrowsingStatus::kEnabled;
- } else if (pref->IsManaged()) {
- status = SafeBrowsingStatus::kDisabledByAdmin;
- } else if (pref->IsExtensionControlled()) {
- status = SafeBrowsingStatus::kDisabledByExtension;
- } else {
- status = SafeBrowsingStatus::kDisabled;
- }
- OnSafeBrowsingCheckResult(status);
-}
-
void SafetyCheckHandler::CheckPasswords() {
// Remove |this| as an existing observer for BulkLeakCheck if it is
// registered. This takes care of an edge case when safety check starts twice
@@ -239,36 +278,21 @@ void SafetyCheckHandler::CheckExtensions() {
}
}
-void SafetyCheckHandler::OnUpdateCheckResult(VersionUpdater::Status status,
- int progress,
- bool rollback,
- const std::string& version,
- int64_t update_size,
- const base::string16& message) {
- UpdateStatus update_status = ConvertToUpdateStatus(status);
- base::DictionaryValue event;
- event.SetIntKey(kNewState,
- static_cast<int>(update_status != UpdateStatus::kUnknown
- ? update_status
- : UpdateStatus::kFailedOffline));
- event.SetStringKey(kDisplayString, GetStringForUpdates(update_status));
- FireWebUIListener(kUpdatesEvent, event);
- if (update_status != UpdateStatus::kChecking) {
+void SafetyCheckHandler::OnUpdateCheckResult(UpdateStatus status) {
+ update_status_ = status;
+ if (update_status_ != UpdateStatus::kChecking) {
base::UmaHistogramEnumeration("Settings.SafetyCheck.UpdatesResult",
- update_status);
- }
-}
-
-void SafetyCheckHandler::OnSafeBrowsingCheckResult(
- SafetyCheckHandler::SafeBrowsingStatus status) {
- base::DictionaryValue event;
- event.SetIntKey(kNewState, static_cast<int>(status));
- event.SetStringKey(kDisplayString, GetStringForSafeBrowsing(status));
- FireWebUIListener(kSafeBrowsingEvent, event);
- if (status != SafeBrowsingStatus::kChecking) {
- base::UmaHistogramEnumeration("Settings.SafetyCheck.SafeBrowsingResult",
- status);
+ update_status_);
}
+ // TODO(crbug/1072432): Since the UNKNOWN state is not present in JS in M83,
+ // use FAILED_OFFLINE, which uses the same icon.
+ FireBasicSafetyCheckWebUiListener(
+ kUpdatesEvent,
+ static_cast<int>(update_status_ != UpdateStatus::kUnknown
+ ? update_status_
+ : UpdateStatus::kFailedOffline),
+ GetStringForUpdates(update_status_));
+ CompleteParentIfChildrenCompleted();
}
void SafetyCheckHandler::OnPasswordsCheckResult(PasswordsStatus status,
@@ -279,10 +303,6 @@ void SafetyCheckHandler::OnPasswordsCheckResult(PasswordsStatus status,
event.SetIntKey(kNewState, static_cast<int>(status));
if (status == PasswordsStatus::kCompromisedExist) {
event.SetIntKey(kPasswordsCompromised, compromised.value());
- event.SetStringKey(
- kButtonString,
- l10n_util::GetPluralStringFUTF16(
- IDS_SETTINGS_SAFETY_CHECK_PASSWORDS_BUTTON, compromised.value()));
}
event.SetStringKey(kDisplayString,
GetStringForPasswords(status, compromised, done, total));
@@ -291,6 +311,8 @@ void SafetyCheckHandler::OnPasswordsCheckResult(PasswordsStatus status,
base::UmaHistogramEnumeration("Settings.SafetyCheck.PasswordsResult",
status);
}
+ passwords_status_ = status;
+ CompleteParentIfChildrenCompleted();
}
void SafetyCheckHandler::OnExtensionsCheckResult(
@@ -316,12 +338,27 @@ void SafetyCheckHandler::OnExtensionsCheckResult(
base::UmaHistogramEnumeration("Settings.SafetyCheck.ExtensionsResult",
status);
}
+ extensions_status_ = status;
+ CompleteParentIfChildrenCompleted();
+}
+
+base::string16 SafetyCheckHandler::GetStringForParent(ParentStatus status) {
+ switch (status) {
+ case ParentStatus::kBefore:
+ return l10n_util::GetStringUTF16(
+ IDS_SETTINGS_SAFETY_CHECK_PARENT_PRIMARY_LABEL_BEFORE);
+ case ParentStatus::kChecking:
+ return l10n_util::GetStringUTF16(IDS_SETTINGS_SAFETY_CHECK_RUNNING);
+ case ParentStatus::kAfter:
+ return l10n_util::GetStringUTF16(
+ IDS_SETTINGS_SAFETY_CHECK_PARENT_PRIMARY_LABEL_AFTER);
+ }
}
base::string16 SafetyCheckHandler::GetStringForUpdates(UpdateStatus status) {
switch (status) {
case UpdateStatus::kChecking:
- return l10n_util::GetStringUTF16(IDS_SETTINGS_SAFETY_CHECK_RUNNING);
+ return base::UTF8ToUTF16("");
case UpdateStatus::kUpdated:
#if defined(OS_CHROMEOS)
return ui::SubstituteChromeOSDeviceType(IDS_SETTINGS_UPGRADE_UP_TO_DATE);
@@ -361,10 +398,14 @@ base::string16 SafetyCheckHandler::GetStringForSafeBrowsing(
SafeBrowsingStatus status) {
switch (status) {
case SafeBrowsingStatus::kChecking:
- return l10n_util::GetStringUTF16(IDS_SETTINGS_SAFETY_CHECK_RUNNING);
+ return base::UTF8ToUTF16("");
case SafeBrowsingStatus::kEnabled:
+ case SafeBrowsingStatus::kEnabledStandard:
return l10n_util::GetStringUTF16(
- IDS_SETTINGS_SAFETY_CHECK_SAFE_BROWSING_ENABLED);
+ IDS_SETTINGS_SAFETY_CHECK_SAFE_BROWSING_ENABLED_STANDARD);
+ case SafeBrowsingStatus::kEnabledEnhanced:
+ return l10n_util::GetStringUTF16(
+ IDS_SETTINGS_SAFETY_CHECK_SAFE_BROWSING_ENABLED_ENHANCED);
case SafeBrowsingStatus::kDisabled:
return l10n_util::GetStringUTF16(
IDS_SETTINGS_SAFETY_CHECK_SAFE_BROWSING_DISABLED);
@@ -383,13 +424,11 @@ base::string16 SafetyCheckHandler::GetStringForPasswords(
Compromised compromised,
Done done,
Total total) {
- const base::string16 short_product_name =
- l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME);
switch (status) {
case PasswordsStatus::kChecking: {
// Unable to get progress for some reason.
if (total.value() == 0) {
- return l10n_util::GetStringUTF16(IDS_SETTINGS_SAFETY_CHECK_RUNNING);
+ return base::UTF8ToUTF16("");
}
return l10n_util::GetStringFUTF16(IDS_SETTINGS_CHECK_PASSWORDS_PROGRESS,
base::FormatNumber(done.value()),
@@ -402,20 +441,20 @@ base::string16 SafetyCheckHandler::GetStringForPasswords(
return l10n_util::GetPluralStringFUTF16(
IDS_SETTINGS_COMPROMISED_PASSWORDS_COUNT, compromised.value());
case PasswordsStatus::kOffline:
- return l10n_util::GetStringFUTF16(
- IDS_SETTINGS_CHECK_PASSWORDS_ERROR_OFFLINE, short_product_name);
+ return l10n_util::GetStringUTF16(
+ IDS_SETTINGS_CHECK_PASSWORDS_ERROR_OFFLINE);
case PasswordsStatus::kNoPasswords:
- return l10n_util::GetStringFUTF16(
- IDS_SETTINGS_CHECK_PASSWORDS_ERROR_NO_PASSWORDS, short_product_name);
+ return l10n_util::GetStringUTF16(
+ IDS_SETTINGS_CHECK_PASSWORDS_ERROR_NO_PASSWORDS);
case PasswordsStatus::kSignedOut:
return l10n_util::GetStringUTF16(
IDS_SETTINGS_SAFETY_CHECK_PASSWORDS_SIGNED_OUT);
case PasswordsStatus::kQuotaLimit:
- return l10n_util::GetStringFUTF16(
- IDS_SETTINGS_CHECK_PASSWORDS_ERROR_QUOTA_LIMIT, short_product_name);
+ return l10n_util::GetStringUTF16(
+ IDS_SETTINGS_CHECK_PASSWORDS_ERROR_QUOTA_LIMIT);
case PasswordsStatus::kError:
- return l10n_util::GetStringFUTF16(
- IDS_SETTINGS_CHECK_PASSWORDS_ERROR_GENERIC, short_product_name);
+ return l10n_util::GetStringUTF16(
+ IDS_SETTINGS_CHECK_PASSWORDS_ERROR_GENERIC);
}
}
@@ -426,7 +465,7 @@ base::string16 SafetyCheckHandler::GetStringForExtensions(
ReenabledAdmin reenabled_admin) {
switch (status) {
case ExtensionsStatus::kChecking:
- return l10n_util::GetStringUTF16(IDS_SETTINGS_SAFETY_CHECK_RUNNING);
+ return base::UTF8ToUTF16("");
case ExtensionsStatus::kError:
return l10n_util::GetStringUTF16(
IDS_SETTINGS_SAFETY_CHECK_EXTENSIONS_ERROR);
@@ -459,47 +498,48 @@ base::string16 SafetyCheckHandler::GetStringForExtensions(
}
}
-base::string16 SafetyCheckHandler::GetStringForParentRan(double timestamp_ran) {
- return SafetyCheckHandler::GetStringForParentRan(timestamp_ran,
+base::string16 SafetyCheckHandler::GetStringForParentRan(
+ base::Time safety_check_completion_time) {
+ return SafetyCheckHandler::GetStringForParentRan(safety_check_completion_time,
base::Time::Now());
}
base::string16 SafetyCheckHandler::GetStringForParentRan(
- double timestamp_ran,
+ base::Time safety_check_completion_time,
base::Time system_time) {
- const base::Time timeRan = base::Time::FromJsTime(timestamp_ran);
- base::Time::Exploded timeRanExploded;
- timeRan.LocalExplode(&timeRanExploded);
+ base::Time::Exploded completion_time_exploded;
+ safety_check_completion_time.LocalExplode(&completion_time_exploded);
- base::Time::Exploded systemTimeExploded;
- system_time.LocalExplode(&systemTimeExploded);
+ base::Time::Exploded system_time_exploded;
+ system_time.LocalExplode(&system_time_exploded);
- const base::Time timeYesterday = system_time - base::TimeDelta::FromDays(1);
- base::Time::Exploded timeYesterdayExploded;
- timeYesterday.LocalExplode(&timeYesterdayExploded);
+ const base::Time time_yesterday = system_time - base::TimeDelta::FromDays(1);
+ base::Time::Exploded time_yesterday_exploded;
+ time_yesterday.LocalExplode(&time_yesterday_exploded);
- const auto timeDiff = system_time - timeRan;
- if (timeRanExploded.year == systemTimeExploded.year &&
- timeRanExploded.month == systemTimeExploded.month &&
- timeRanExploded.day_of_month == systemTimeExploded.day_of_month) {
+ const auto time_diff = system_time - safety_check_completion_time;
+ if (completion_time_exploded.year == system_time_exploded.year &&
+ completion_time_exploded.month == system_time_exploded.month &&
+ completion_time_exploded.day_of_month ==
+ system_time_exploded.day_of_month) {
// Safety check ran today.
- const int timeDiffInMinutes = timeDiff.InMinutes();
- if (timeDiffInMinutes == 0) {
+ const int time_diff_in_mins = time_diff.InMinutes();
+ if (time_diff_in_mins == 0) {
return l10n_util::GetStringUTF16(
IDS_SETTINGS_SAFETY_CHECK_PARENT_PRIMARY_LABEL_AFTER);
- } else if (timeDiffInMinutes < 60) {
+ } else if (time_diff_in_mins < 60) {
return l10n_util::GetPluralStringFUTF16(
IDS_SETTINGS_SAFETY_CHECK_PARENT_PRIMARY_LABEL_AFTER_MINS,
- timeDiffInMinutes);
+ time_diff_in_mins);
} else {
return l10n_util::GetPluralStringFUTF16(
IDS_SETTINGS_SAFETY_CHECK_PARENT_PRIMARY_LABEL_AFTER_HOURS,
- timeDiffInMinutes / 60);
+ time_diff_in_mins / 60);
}
- } else if (timeRanExploded.year == timeYesterdayExploded.year &&
- timeRanExploded.month == timeYesterdayExploded.month &&
- timeRanExploded.day_of_month ==
- timeYesterdayExploded.day_of_month) {
+ } else if (completion_time_exploded.year == time_yesterday_exploded.year &&
+ completion_time_exploded.month == time_yesterday_exploded.month &&
+ completion_time_exploded.day_of_month ==
+ time_yesterday_exploded.day_of_month) {
// Safety check ran yesterday.
return l10n_util::GetStringUTF16(
IDS_SETTINGS_SAFETY_CHECK_PARENT_PRIMARY_LABEL_AFTER_YESTERDAY);
@@ -508,13 +548,18 @@ base::string16 SafetyCheckHandler::GetStringForParentRan(
// TODO(crbug.com/1015841): While a minor issue, this is not be the ideal
// way to calculate the days passed since safety check ran. For example,
// <48 h might still be 2 days ago.
- const int timeDiffInDays = timeDiff.InDays();
+ const int time_diff_in_days = time_diff.InDays();
return l10n_util::GetPluralStringFUTF16(
IDS_SETTINGS_SAFETY_CHECK_PARENT_PRIMARY_LABEL_AFTER_DAYS,
- timeDiffInDays);
+ time_diff_in_days);
}
}
+void SafetyCheckHandler::DetermineIfOfflineOrError(bool connected) {
+ OnUpdateCheckResult(connected ? UpdateStatus::kFailed
+ : UpdateStatus::kFailedOffline);
+}
+
void SafetyCheckHandler::DetermineIfNoPasswordsOrSafe(
const std::vector<extensions::api::passwords_private::PasswordUiEntry>&
passwords) {
@@ -523,6 +568,34 @@ void SafetyCheckHandler::DetermineIfNoPasswordsOrSafe(
Compromised(0), Done(0), Total(0));
}
+void SafetyCheckHandler::OnVersionUpdaterResult(VersionUpdater::Status status,
+ int progress,
+ bool rollback,
+ const std::string& version,
+ int64_t update_size,
+ const base::string16& message) {
+ if (status == VersionUpdater::FAILED) {
+ update_helper_->CheckConnectivity(
+ base::BindOnce(&SafetyCheckHandler::DetermineIfOfflineOrError,
+ base::Unretained(this)));
+ return;
+ }
+ OnUpdateCheckResult(ConvertToUpdateStatus(status));
+}
+
+void SafetyCheckHandler::OnSafeBrowsingCheckResult(
+ SafetyCheckHandler::SafeBrowsingStatus status) {
+ safe_browsing_status_ = status;
+ if (safe_browsing_status_ != SafeBrowsingStatus::kChecking) {
+ base::UmaHistogramEnumeration("Settings.SafetyCheck.SafeBrowsingResult",
+ safe_browsing_status_);
+ }
+ FireBasicSafetyCheckWebUiListener(
+ kSafeBrowsingEvent, static_cast<int>(safe_browsing_status_),
+ GetStringForSafeBrowsing(safe_browsing_status_));
+ CompleteParentIfChildrenCompleted();
+}
+
void SafetyCheckHandler::OnStateChanged(
password_manager::BulkLeakCheckService::State state) {
using password_manager::BulkLeakCheckService;
@@ -598,6 +671,8 @@ void SafetyCheckHandler::OnJavascriptDisallowed() {
// Destroy the version updater to prevent getting a callback and firing a
// WebUI event, which would cause a crash.
version_updater_.reset();
+ // Stop observing safety check events.
+ safety_check_.reset(nullptr);
}
void SafetyCheckHandler::RegisterMessages() {
@@ -612,3 +687,28 @@ void SafetyCheckHandler::RegisterMessages() {
base::BindRepeating(&SafetyCheckHandler::HandleGetParentRanDisplayString,
base::Unretained(this)));
}
+
+void SafetyCheckHandler::CompleteParentIfChildrenCompleted() {
+ if (update_status_ != UpdateStatus::kChecking &&
+ passwords_status_ != PasswordsStatus::kChecking &&
+ safe_browsing_status_ != SafeBrowsingStatus::kChecking &&
+ extensions_status_ != ExtensionsStatus::kChecking) {
+ parent_status_ = ParentStatus::kAfter;
+ // Remember when safety check completed.
+ safety_check_completion_time_ = base::Time::Now();
+ // Update UI.
+ FireBasicSafetyCheckWebUiListener(kParentEvent,
+ static_cast<int>(parent_status_),
+ GetStringForParent(parent_status_));
+ }
+}
+
+void SafetyCheckHandler::FireBasicSafetyCheckWebUiListener(
+ const std::string& event_name,
+ int new_state,
+ const base::string16& display_string) {
+ base::DictionaryValue event;
+ event.SetIntKey(kNewState, new_state);
+ event.SetStringKey(kDisplayString, display_string);
+ FireWebUIListener(event_name, event);
+}
diff --git a/chromium/chrome/browser/ui/webui/settings/safety_check_handler.h b/chromium/chrome/browser/ui/webui/settings/safety_check_handler.h
index 0680927e4c8..0c73407ae34 100644
--- a/chromium/chrome/browser/ui/webui/settings/safety_check_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/safety_check_handler.h
@@ -20,6 +20,8 @@
#include "chrome/browser/ui/webui/help/version_updater.h"
#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
#include "components/password_manager/core/browser/bulk_leak_check_service.h"
+#include "components/safety_check/safety_check.h"
+#include "components/safety_check/update_check_helper.h"
#include "extensions/browser/extension_prefs.h"
#include "extensions/browser/extension_registry.h"
@@ -28,12 +30,23 @@
// software.
class SafetyCheckHandler
: public settings::SettingsPageUIHandler,
- public password_manager::BulkLeakCheckService::Observer {
+ public password_manager::BulkLeakCheckService::Observer,
+ public safety_check::SafetyCheck::SafetyCheckHandlerInterface {
public:
+ // The following enum represent the state of the safety check parent
+ // component and should be kept in sync with the JS frontend
+ // (safety_check_browser_proxy.js).
+ enum class ParentStatus {
+ kBefore = 0,
+ kChecking = 1,
+ kAfter = 2,
+ };
+
// The following enums represent the state of each component of the safety
// check and should be kept in sync with the JS frontend
// (safety_check_browser_proxy.js) and |SafetyCheck*| metrics enums in
// enums.xml.
+ using SafeBrowsingStatus = safety_check::SafetyCheck::SafeBrowsingStatus;
enum class UpdateStatus {
kChecking = 0,
kUpdated = 1,
@@ -48,15 +61,6 @@ class SafetyCheckHandler
// New enum values must go above here.
kMaxValue = kUnknown,
};
- enum class SafeBrowsingStatus {
- kChecking = 0,
- kEnabled = 1,
- kDisabled = 2,
- kDisabledByAdmin = 3,
- kDisabledByExtension = 4,
- // New enum values must go above here.
- kMaxValue = kDisabledByExtension,
- };
enum class PasswordsStatus {
kChecking = 0,
kSafe = 1,
@@ -85,23 +89,30 @@ class SafetyCheckHandler
SafetyCheckHandler();
~SafetyCheckHandler() override;
- // Triggers all four of the browser safety checks.
+ // Triggers WebUI updates about safety check now running.
+ // Note: since the checks deal with sensitive user information, this method
+ // should only be called as a result of an explicit user action.
+ void SendSafetyCheckStartedWebUiUpdates();
+
+ // Triggers all safety check child checks.
// Note: since the checks deal with sensitive user information, this method
// should only be called as a result of an explicit user action.
void PerformSafetyCheck();
// Constructs the 'safety check ran' display string by how long ago safety
// check ran.
- base::string16 GetStringForParentRan(double timestamp_ran);
- base::string16 GetStringForParentRan(double timestamp_ran,
- base::Time systemTime);
+ base::string16 GetStringForParentRan(base::Time safety_check_completion_time);
+ base::string16 GetStringForParentRan(base::Time safety_check_completion_time,
+ base::Time system_time);
protected:
- SafetyCheckHandler(std::unique_ptr<VersionUpdater> version_updater,
- password_manager::BulkLeakCheckService* leak_service,
- extensions::PasswordsPrivateDelegate* passwords_delegate,
- extensions::ExtensionPrefs* extension_prefs,
- extensions::ExtensionServiceInterface* extension_service);
+ SafetyCheckHandler(
+ std::unique_ptr<safety_check::UpdateCheckHelper> update_helper,
+ std::unique_ptr<VersionUpdater> version_updater,
+ password_manager::BulkLeakCheckService* leak_service,
+ extensions::PasswordsPrivateDelegate* passwords_delegate,
+ extensions::ExtensionPrefs* extension_prefs,
+ extensions::ExtensionServiceInterface* extension_service);
void SetVersionUpdaterForTesting(
std::unique_ptr<VersionUpdater> version_updater) {
@@ -130,10 +141,6 @@ class SafetyCheckHandler
// are available.
void CheckUpdates();
- // Gets the status of Safe Browsing from the PrefService and invokes
- // OnSafeBrowsingCheckResult with results.
- void CheckSafeBrowsing();
-
// Triggers a bulk password leak check and invokes OnPasswordsCheckResult once
// results are available.
void CheckPasswords();
@@ -143,13 +150,7 @@ class SafetyCheckHandler
void CheckExtensions();
// Callbacks that get triggered when each check completes.
- void OnUpdateCheckResult(VersionUpdater::Status status,
- int progress,
- bool rollback,
- const std::string& version,
- int64_t update_size,
- const base::string16& message);
- void OnSafeBrowsingCheckResult(SafeBrowsingStatus status);
+ void OnUpdateCheckResult(UpdateStatus status);
void OnPasswordsCheckResult(PasswordsStatus status,
Compromised compromised,
Done done,
@@ -161,6 +162,7 @@ class SafetyCheckHandler
// Methods for building user-visible strings based on the safety check
// state.
+ base::string16 GetStringForParent(ParentStatus status);
base::string16 GetStringForUpdates(UpdateStatus status);
base::string16 GetStringForSafeBrowsing(SafeBrowsingStatus status);
base::string16 GetStringForPasswords(PasswordsStatus status,
@@ -172,6 +174,10 @@ class SafetyCheckHandler
ReenabledUser reenabled_user,
ReenabledAdmin reenabled_admin);
+ // A generic error state often includes the offline state. This method is used
+ // as a callback for |UpdateCheckHelper| to check connectivity.
+ void DetermineIfOfflineOrError(bool connected);
+
// Since the password check API does not distinguish between the cases of
// having no compromised passwords and not having any passwords at all, it is
// necessary to use this method as a callback for
@@ -181,6 +187,18 @@ class SafetyCheckHandler
const std::vector<extensions::api::passwords_private::PasswordUiEntry>&
passwords);
+ // A callback passed to |VersionUpdater::CheckForUpdate| to receive the update
+ // state.
+ void OnVersionUpdaterResult(VersionUpdater::Status status,
+ int progress,
+ bool rollback,
+ const std::string& version,
+ int64_t update_size,
+ const base::string16& message);
+
+ // SafetyCheck::SafetyCheckHandlerInterface implementation.
+ void OnSafeBrowsingCheckResult(SafeBrowsingStatus status) override;
+
// BulkLeakCheckService::Observer implementation.
void OnStateChanged(
password_manager::BulkLeakCheckService::State state) override;
@@ -194,6 +212,28 @@ class SafetyCheckHandler
// WebUIMessageHandler implementation.
void RegisterMessages() override;
+ // Updates the parent status from the children statuses.
+ void CompleteParentIfChildrenCompleted();
+
+ // Fire a safety check element WebUI update with a state and string.
+ void FireBasicSafetyCheckWebUiListener(const std::string& event_name,
+ int new_state,
+ const base::string16& display_string);
+
+ // The current status of the safety check elements. Before safety
+ // check is started, the parent is in the 'before' state.
+ ParentStatus parent_status_ = ParentStatus::kBefore;
+ UpdateStatus update_status_ = UpdateStatus::kChecking;
+ PasswordsStatus passwords_status_ = PasswordsStatus::kChecking;
+ SafeBrowsingStatus safe_browsing_status_ = SafeBrowsingStatus::kChecking;
+ ExtensionsStatus extensions_status_ = ExtensionsStatus::kChecking;
+
+ // System time when safety check completed.
+ base::Time safety_check_completion_time_;
+
+ std::unique_ptr<safety_check::SafetyCheck> safety_check_;
+ std::unique_ptr<safety_check::UpdateCheckHelper> update_helper_;
+
std::unique_ptr<VersionUpdater> version_updater_;
password_manager::BulkLeakCheckService* leak_service_ = nullptr;
extensions::PasswordsPrivateDelegate* passwords_delegate_ = nullptr;
diff --git a/chromium/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc
index cefb6e359d7..c6e18dd2c36 100644
--- a/chromium/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc
@@ -29,6 +29,7 @@
#include "components/password_manager/core/browser/leak_detection/bulk_leak_check.h"
#include "components/prefs/pref_service.h"
#include "components/safe_browsing/core/common/safe_browsing_prefs.h"
+#include "components/safety_check/test_update_check_helper.h"
#include "components/sync_preferences/testing_pref_service_syncable.h"
#include "components/version_info/version_info.h"
#include "content/public/test/test_web_ui.h"
@@ -43,6 +44,7 @@
#endif
// Components for building event strings.
+constexpr char kParent[] = "parent";
constexpr char kUpdates[] = "updates";
constexpr char kPasswords[] = "passwords";
constexpr char kSafeBrowsing[] = "safe-browsing";
@@ -60,12 +62,14 @@ class TestingSafetyCheckHandler : public SafetyCheckHandler {
using SafetyCheckHandler::SetVersionUpdaterForTesting;
TestingSafetyCheckHandler(
+ std::unique_ptr<safety_check::UpdateCheckHelper> update_helper,
std::unique_ptr<VersionUpdater> version_updater,
password_manager::BulkLeakCheckService* leak_service,
extensions::PasswordsPrivateDelegate* passwords_delegate,
extensions::ExtensionPrefs* extension_prefs,
extensions::ExtensionServiceInterface* extension_service)
- : SafetyCheckHandler(std::move(version_updater),
+ : SafetyCheckHandler(std::move(update_helper),
+ std::move(version_updater),
leak_service,
passwords_delegate,
extension_prefs,
@@ -192,12 +196,9 @@ class SafetyCheckHandlerTest : public ChromeRenderViewHostTestHarness {
const base::string16& expected);
void VerifyDisplayString(const base::DictionaryValue* event,
const std::string& expected);
- void VerifyButtonString(const base::DictionaryValue* event,
- const base::string16& expected);
- void VerifyButtonString(const base::DictionaryValue* event,
- const std::string& expected);
protected:
+ safety_check::TestUpdateCheckHelper* update_helper_ = nullptr;
TestVersionUpdater* version_updater_ = nullptr;
std::unique_ptr<password_manager::BulkLeakCheckService> test_leak_service_;
TestPasswordsDelegate test_passwords_delegate_;
@@ -220,17 +221,19 @@ void SafetyCheckHandlerTest::SetUp() {
// The unique pointer to a TestVersionUpdater gets moved to
// SafetyCheckHandler, but a raw pointer is retained here to change its
// state.
+ auto update_helper = std::make_unique<safety_check::TestUpdateCheckHelper>();
+ update_helper_ = update_helper.get();
auto version_updater = std::make_unique<TestVersionUpdater>();
+ version_updater_ = version_updater.get();
test_leak_service_ = std::make_unique<password_manager::BulkLeakCheckService>(
nullptr, nullptr);
test_passwords_delegate_.SetBulkLeakCheckService(test_leak_service_.get());
- version_updater_ = version_updater.get();
test_web_ui_.set_web_contents(web_contents());
test_extension_prefs_ = extensions::ExtensionPrefs::Get(profile());
safety_check_ = std::make_unique<TestingSafetyCheckHandler>(
- std::move(version_updater), test_leak_service_.get(),
- &test_passwords_delegate_, test_extension_prefs_,
- &test_extension_service_);
+ std::move(update_helper), std::move(version_updater),
+ test_leak_service_.get(), &test_passwords_delegate_,
+ test_extension_prefs_, &test_extension_service_);
test_web_ui_.ClearTrackedCalls();
safety_check_->set_web_ui(&test_web_ui_);
safety_check_->AllowJavascript();
@@ -290,20 +293,6 @@ void SafetyCheckHandlerTest::VerifyDisplayString(
VerifyDisplayString(event, base::ASCIIToUTF16(expected));
}
-void SafetyCheckHandlerTest::VerifyButtonString(
- const base::DictionaryValue* event,
- const base::string16& expected) {
- base::string16 button;
- ASSERT_TRUE(event->GetString("buttonString", &button));
- EXPECT_EQ(expected, button);
-}
-
-void SafetyCheckHandlerTest::VerifyButtonString(
- const base::DictionaryValue* event,
- const std::string& expected) {
- VerifyButtonString(event, base::ASCIIToUTF16(expected));
-}
-
void SafetyCheckHandlerTest::ReplaceBrowserName(base::string16* s) {
base::ReplaceSubstringsAfterOffset(s, 0, base::ASCIIToUTF16("Google Chrome"),
base::ASCIIToUTF16("Browser"));
@@ -321,7 +310,7 @@ TEST_F(SafetyCheckHandlerTest, CheckUpdates_Checking) {
kUpdates,
static_cast<int>(SafetyCheckHandler::UpdateStatus::kChecking));
ASSERT_TRUE(event);
- VerifyDisplayString(event, base::UTF8ToUTF16("Running…"));
+ VerifyDisplayString(event, base::UTF8ToUTF16(""));
// Checking state should not get recorded.
histogram_tester_.ExpectTotalCount("Settings.SafetyCheck.UpdatesResult", 0);
}
@@ -442,7 +431,8 @@ TEST_F(SafetyCheckHandlerTest, CheckUpdates_FailedOffline) {
SafetyCheckHandler::UpdateStatus::kFailedOffline, 1);
}
-TEST_F(SafetyCheckHandlerTest, CheckUpdates_Failed) {
+TEST_F(SafetyCheckHandlerTest, CheckUpdates_Failed_ConnectivityOnline) {
+ update_helper_->SetConnectivity(true);
version_updater_->SetReturnedStatus(VersionUpdater::Status::FAILED);
safety_check_->PerformSafetyCheck();
const base::DictionaryValue* event =
@@ -460,6 +450,23 @@ TEST_F(SafetyCheckHandlerTest, CheckUpdates_Failed) {
1);
}
+TEST_F(SafetyCheckHandlerTest, CheckUpdates_Failed_ConnectivityOffline) {
+ update_helper_->SetConnectivity(false);
+ version_updater_->SetReturnedStatus(VersionUpdater::Status::FAILED);
+ safety_check_->PerformSafetyCheck();
+ const base::DictionaryValue* event =
+ GetSafetyCheckStatusChangedWithDataIfExists(
+ kUpdates,
+ static_cast<int>(SafetyCheckHandler::UpdateStatus::kFailedOffline));
+ ASSERT_TRUE(event);
+ VerifyDisplayString(event,
+ "Browser can't check for updates. Try checking your "
+ "internet connection.");
+ histogram_tester_.ExpectBucketCount(
+ "Settings.SafetyCheck.UpdatesResult",
+ SafetyCheckHandler::UpdateStatus::kFailedOffline, 1);
+}
+
TEST_F(SafetyCheckHandlerTest, CheckUpdates_DestroyedOnJavascriptDisallowed) {
EXPECT_FALSE(TestDestructionVersionUpdater::GetDestructorInvoked());
safety_check_->SetVersionUpdaterForTesting(
@@ -469,22 +476,66 @@ TEST_F(SafetyCheckHandlerTest, CheckUpdates_DestroyedOnJavascriptDisallowed) {
EXPECT_TRUE(TestDestructionVersionUpdater::GetDestructorInvoked());
}
-TEST_F(SafetyCheckHandlerTest, CheckSafeBrowsing_Enabled) {
+TEST_F(SafetyCheckHandlerTest, CheckSafeBrowsing_EnabledStandard) {
Profile::FromWebUI(&test_web_ui_)
->GetPrefs()
->SetBoolean(prefs::kSafeBrowsingEnabled, true);
+ Profile::FromWebUI(&test_web_ui_)
+ ->GetPrefs()
+ ->SetBoolean(prefs::kSafeBrowsingEnhanced, false);
safety_check_->PerformSafetyCheck();
const base::DictionaryValue* event =
GetSafetyCheckStatusChangedWithDataIfExists(
kSafeBrowsing,
- static_cast<int>(SafetyCheckHandler::SafeBrowsingStatus::kEnabled));
+ static_cast<int>(
+ SafetyCheckHandler::SafeBrowsingStatus::kEnabledStandard));
ASSERT_TRUE(event);
- VerifyDisplayString(event,
- "Safe Browsing is on and protecting you from harmful "
- "sites and downloads");
+ VerifyDisplayString(event, "Standard Protection is on");
+ histogram_tester_.ExpectBucketCount(
+ "Settings.SafetyCheck.SafeBrowsingResult",
+ SafetyCheckHandler::SafeBrowsingStatus::kEnabledStandard, 1);
+}
+
+TEST_F(SafetyCheckHandlerTest, CheckSafeBrowsing_EnabledEnhanced) {
+ Profile::FromWebUI(&test_web_ui_)
+ ->GetPrefs()
+ ->SetBoolean(prefs::kSafeBrowsingEnabled, true);
+ Profile::FromWebUI(&test_web_ui_)
+ ->GetPrefs()
+ ->SetBoolean(prefs::kSafeBrowsingEnhanced, true);
+ safety_check_->PerformSafetyCheck();
+ const base::DictionaryValue* event =
+ GetSafetyCheckStatusChangedWithDataIfExists(
+ kSafeBrowsing,
+ static_cast<int>(
+ SafetyCheckHandler::SafeBrowsingStatus::kEnabledEnhanced));
+ ASSERT_TRUE(event);
+ VerifyDisplayString(event, "Enhanced Protection is on");
histogram_tester_.ExpectBucketCount(
"Settings.SafetyCheck.SafeBrowsingResult",
- SafetyCheckHandler::SafeBrowsingStatus::kEnabled, 1);
+ SafetyCheckHandler::SafeBrowsingStatus::kEnabledEnhanced, 1);
+}
+
+TEST_F(SafetyCheckHandlerTest, CheckSafeBrowsing_InconsistentEnhanced) {
+ // Tests the corner case of SafeBrowsingEnhanced pref being on, while
+ // SafeBrowsing enabled is off. This should be treated as SB off.
+ Profile::FromWebUI(&test_web_ui_)
+ ->GetPrefs()
+ ->SetBoolean(prefs::kSafeBrowsingEnabled, false);
+ Profile::FromWebUI(&test_web_ui_)
+ ->GetPrefs()
+ ->SetBoolean(prefs::kSafeBrowsingEnhanced, true);
+ safety_check_->PerformSafetyCheck();
+ const base::DictionaryValue* event =
+ GetSafetyCheckStatusChangedWithDataIfExists(
+ kSafeBrowsing,
+ static_cast<int>(SafetyCheckHandler::SafeBrowsingStatus::kDisabled));
+ ASSERT_TRUE(event);
+ VerifyDisplayString(
+ event, "Safe Browsing is off. Browser recommends turning it on.");
+ histogram_tester_.ExpectBucketCount(
+ "Settings.SafetyCheck.SafeBrowsingResult",
+ SafetyCheckHandler::SafeBrowsingStatus::kDisabled, 1);
}
TEST_F(SafetyCheckHandlerTest, CheckSafeBrowsing_Disabled) {
@@ -556,7 +607,7 @@ TEST_F(SafetyCheckHandlerTest, CheckPasswords_ObserverRemovedAfterError) {
kPasswords,
static_cast<int>(SafetyCheckHandler::PasswordsStatus::kChecking));
ASSERT_TRUE(event);
- VerifyDisplayString(event, base::UTF8ToUTF16("Running…"));
+ VerifyDisplayString(event, base::UTF8ToUTF16(""));
histogram_tester_.ExpectTotalCount("Settings.SafetyCheck.PasswordsResult", 0);
// Second, an "offline" state.
test_leak_service_->set_state_and_notify(
@@ -596,7 +647,7 @@ TEST_F(SafetyCheckHandlerTest, CheckPasswords_InterruptedAndRefreshed) {
kPasswords,
static_cast<int>(SafetyCheckHandler::PasswordsStatus::kChecking));
ASSERT_TRUE(event);
- VerifyDisplayString(event, base::UTF8ToUTF16("Running…"));
+ VerifyDisplayString(event, base::UTF8ToUTF16(""));
// The check gets interrupted and the page is refreshed.
safety_check_->DisallowJavascript();
safety_check_->AllowJavascript();
@@ -717,7 +768,6 @@ TEST_F(SafetyCheckHandlerTest, CheckPasswords_CompromisedExist) {
ASSERT_TRUE(event2);
VerifyDisplayString(
event2, base::NumberToString(kCompromised) + " compromised passwords");
- VerifyButtonString(event2, "Change passwords");
histogram_tester_.ExpectBucketCount(
"Settings.SafetyCheck.PasswordsResult",
SafetyCheckHandler::PasswordsStatus::kCompromisedExist, 1);
@@ -757,7 +807,6 @@ TEST_F(SafetyCheckHandlerTest, CheckPasswords_RunningOneCompromised) {
SafetyCheckHandler::PasswordsStatus::kCompromisedExist));
ASSERT_TRUE(event);
VerifyDisplayString(event, "1 compromised password");
- VerifyButtonString(event, "Change password");
histogram_tester_.ExpectBucketCount(
"Settings.SafetyCheck.PasswordsResult",
SafetyCheckHandler::PasswordsStatus::kCompromisedExist, 1);
@@ -1013,9 +1062,12 @@ TEST_F(SafetyCheckHandlerTest, CheckExtensions_Error) {
}
TEST_F(SafetyCheckHandlerTest, CheckParentRanDisplayString) {
- // 1 second before midnight, so that -(24h-1s) is still on the same day.
- const base::Time systemTime =
- base::Time::Now().LocalMidnight() - base::TimeDelta::FromSeconds(1);
+ // 1 second before midnight Dec 31st 2020, so that -(24h-1s) is still on the
+ // same day. This test time is hard coded to prevent DST flakiness, see
+ // crbug.com/1066576.
+ const base::Time system_time =
+ base::Time::FromDoubleT(1609459199).LocalMidnight() -
+ base::TimeDelta::FromSeconds(1);
// Display strings for given time deltas in seconds.
std::vector<std::tuple<std::string, int>> tuples{
std::make_tuple("Safety check ran a moment ago", 1),
@@ -1035,9 +1087,63 @@ TEST_F(SafetyCheckHandlerTest, CheckParentRanDisplayString) {
// Test that above time deltas produce the corresponding display strings.
for (auto tuple : tuples) {
const base::Time time =
- systemTime - base::TimeDelta::FromSeconds(std::get<1>(tuple));
- const base::string16 displayString = safety_check_->GetStringForParentRan(
- time.ToJsTimeIgnoringNull(), systemTime);
- EXPECT_EQ(base::UTF8ToUTF16(std::get<0>(tuple)), displayString);
+ system_time - base::TimeDelta::FromSeconds(std::get<1>(tuple));
+ const base::string16 display_string =
+ safety_check_->GetStringForParentRan(time, system_time);
+ EXPECT_EQ(base::UTF8ToUTF16(std::get<0>(tuple)), display_string);
}
}
+
+TEST_F(SafetyCheckHandlerTest, CheckSafetyCheckStartedWebUiEvents) {
+ safety_check_->SendSafetyCheckStartedWebUiUpdates();
+
+ // Check that all initial updates ("running" states) are sent.
+ const base::DictionaryValue* event_parent =
+ GetSafetyCheckStatusChangedWithDataIfExists(
+ kParent,
+ static_cast<int>(SafetyCheckHandler::ParentStatus::kChecking));
+ ASSERT_TRUE(event_parent);
+ VerifyDisplayString(event_parent, base::UTF8ToUTF16("Running…"));
+ const base::DictionaryValue* event_updates =
+ GetSafetyCheckStatusChangedWithDataIfExists(
+ kUpdates,
+ static_cast<int>(SafetyCheckHandler::UpdateStatus::kChecking));
+ ASSERT_TRUE(event_updates);
+ VerifyDisplayString(event_updates, base::UTF8ToUTF16(""));
+ const base::DictionaryValue* event_pws =
+ GetSafetyCheckStatusChangedWithDataIfExists(
+ kPasswords,
+ static_cast<int>(SafetyCheckHandler::PasswordsStatus::kChecking));
+ ASSERT_TRUE(event_pws);
+ VerifyDisplayString(event_pws, base::UTF8ToUTF16(""));
+ const base::DictionaryValue* event_sb =
+ GetSafetyCheckStatusChangedWithDataIfExists(
+ kSafeBrowsing,
+ static_cast<int>(SafetyCheckHandler::SafeBrowsingStatus::kChecking));
+ ASSERT_TRUE(event_sb);
+ VerifyDisplayString(event_sb, base::UTF8ToUTF16(""));
+ const base::DictionaryValue* event_extensions =
+ GetSafetyCheckStatusChangedWithDataIfExists(
+ kExtensions,
+ static_cast<int>(SafetyCheckHandler::ExtensionsStatus::kChecking));
+ ASSERT_TRUE(event_extensions);
+ VerifyDisplayString(event_extensions, base::UTF8ToUTF16(""));
+}
+
+TEST_F(SafetyCheckHandlerTest, CheckSafetyCheckCompletedWebUiEvents) {
+ // Mock safety check invocation.
+ safety_check_->PerformSafetyCheck();
+
+ // Password mocks need to be triggered with a non-checking state to fire.
+ // All other mocks fire automatically when invoked.
+ test_leak_service_->set_state_and_notify(
+ password_manager::BulkLeakCheckService::State::kSignedOut);
+
+ // Check that the parent update is sent after all children checks completed.
+ const base::DictionaryValue* event_parent =
+ GetSafetyCheckStatusChangedWithDataIfExists(
+ kParent, static_cast<int>(SafetyCheckHandler::ParentStatus::kAfter));
+ ASSERT_TRUE(event_parent);
+ VerifyDisplayString(event_parent,
+ base::UTF8ToUTF16("Safety check ran a moment ago"));
+}
diff --git a/chromium/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc b/chromium/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc
index 7c2416bd30a..8335deec5b6 100644
--- a/chromium/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc
@@ -13,7 +13,6 @@
#include "base/metrics/histogram_macros.h"
#include "base/stl_util.h"
#include "base/values.h"
-#include "chrome/browser/browsing_data/browsing_data_helper.h"
#include "chrome/browser/browsing_data/browsing_data_important_sites_util.h"
#include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h"
#include "chrome/browser/browsing_data/counters/browsing_data_counter_factory.h"
@@ -27,6 +26,7 @@
#include "chrome/common/channel_info.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/pref_names.h"
+#include "components/browsing_data/content/browsing_data_helper.h"
#include "components/browsing_data/core/browsing_data_utils.h"
#include "components/browsing_data/core/history_notice_utils.h"
#include "components/browsing_data/core/pref_names.h"
diff --git a/chromium/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chromium/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
index 90189cf77f1..eff2694ecfd 100644
--- a/chromium/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chromium/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -8,6 +8,7 @@
#include "base/command_line.h"
#include "base/feature_list.h"
+#include "base/i18n/message_formatter.h"
#include "base/i18n/number_formatting.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
@@ -20,6 +21,7 @@
#include "chrome/browser/browser_process_platform_part.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "chrome/browser/obsolete_system/obsolete_system.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_shortcut_manager.h"
#include "chrome/browser/signin/account_consistency_mode_manager.h"
@@ -27,8 +29,10 @@
#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h"
#include "chrome/browser/ui/webui/management_ui.h"
#include "chrome/browser/ui/webui/policy_indicator_localized_strings_provider.h"
+#include "chrome/browser/ui/webui/settings/reset_settings_handler.h"
#include "chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.h"
#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/channel_info.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/url_constants.h"
@@ -57,11 +61,13 @@
#include "components/password_manager/core/common/password_manager_features.h"
#include "components/safe_browsing/core/common/safe_browsing_prefs.h"
#include "components/signin/public/base/signin_buildflags.h"
+#include "components/strings/grit/components_chromium_strings.h"
#include "components/strings/grit/components_strings.h"
#include "components/subresource_filter/core/browser/subresource_filter_features.h"
#include "components/sync/driver/sync_service.h"
#include "components/sync/driver/sync_service_utils.h"
#include "components/sync/driver/sync_user_settings.h"
+#include "components/version_info/version_info.h"
#include "components/zoom/page_zoom_constants.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui_data_source.h"
@@ -80,7 +86,6 @@
#if defined(OS_CHROMEOS)
#include "ash/public/cpp/ash_switches.h"
-#include "base/system/sys_info.h"
#include "chrome/browser/chromeos/account_manager/account_manager_util.h"
#include "chrome/browser/chromeos/assistant/assistant_util.h"
#include "chrome/browser/chromeos/kerberos/kerberos_credentials_manager.h"
@@ -116,16 +121,6 @@
namespace settings {
namespace {
-#if defined(OS_CHROMEOS)
-// Generates a Google Help URL which includes a "board type" parameter. Some
-// help pages need to be adjusted depending on the type of CrOS device that is
-// accessing the page.
-base::string16 GetHelpUrlWithBoard(const std::string& original_url) {
- return base::ASCIIToUTF16(original_url +
- "&b=" + base::SysInfo::GetLsbReleaseBoard());
-}
-#endif
-
void AddCommonStrings(content::WebUIDataSource* html_source, Profile* profile) {
static constexpr webui::LocalizedString kLocalizedStrings[] = {
{"add", IDS_ADD},
@@ -257,6 +252,45 @@ void AddAboutStrings(content::WebUIDataSource* html_source, Profile* profile) {
#else
l10n_util::GetStringUTF16(IDS_SETTINGS_UPGRADE_UP_TO_DATE));
#endif
+
+ html_source->AddString(
+ "aboutBrowserVersion",
+ l10n_util::GetStringFUTF16(
+ IDS_SETTINGS_ABOUT_PAGE_BROWSER_VERSION,
+ base::UTF8ToUTF16(version_info::GetVersionNumber()),
+ l10n_util::GetStringUTF16(version_info::IsOfficialBuild()
+ ? IDS_VERSION_UI_OFFICIAL
+ : IDS_VERSION_UI_UNOFFICIAL),
+ base::UTF8ToUTF16(chrome::GetChannelName()),
+ l10n_util::GetStringUTF16(sizeof(void*) == 8
+ ? IDS_VERSION_UI_64BIT
+ : IDS_VERSION_UI_32BIT)));
+ html_source->AddString(
+ "aboutProductCopyright",
+ base::i18n::MessageFormatter::FormatWithNumberedArgs(
+ l10n_util::GetStringUTF16(IDS_ABOUT_VERSION_COPYRIGHT),
+ base::Time::Now()));
+
+ base::string16 license = l10n_util::GetStringFUTF16(
+ IDS_VERSION_UI_LICENSE, base::ASCIIToUTF16(chrome::kChromiumProjectURL),
+ base::ASCIIToUTF16(chrome::kChromeUICreditsURL));
+ html_source->AddString("aboutProductLicense", license);
+
+ html_source->AddBoolean("aboutObsoleteNowOrSoon",
+ ObsoleteSystem::IsObsoleteNowOrSoon());
+ html_source->AddBoolean("aboutObsoleteEndOfTheLine",
+ ObsoleteSystem::IsObsoleteNowOrSoon() &&
+ ObsoleteSystem::IsEndOfTheLine());
+ html_source->AddString("aboutObsoleteSystem",
+ ObsoleteSystem::LocalizedObsoleteString());
+ html_source->AddString("aboutObsoleteSystemURL",
+ ObsoleteSystem::GetLinkURL());
+
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+ html_source->AddString("aboutTermsURL", chrome::kChromeUITermsURL);
+ html_source->AddLocalizedString("aboutProductTos",
+ IDS_ABOUT_TERMS_OF_SERVICE);
+#endif
}
void AddAppearanceStrings(content::WebUIDataSource* html_source,
@@ -473,11 +507,11 @@ void AddChromeCleanupStrings(content::WebUIDataSource* html_source) {
// partner. The logo is added directly to the DOM, rather than as an <img>
// src, to make sure that screen readers can find accessibility tags inside
// the SVG.
- const std::string powered_by_element =
- base::StrCat({"<span id='powered-by-logo'>",
- ui::ResourceBundle::GetSharedInstance().GetRawDataResource(
- IDR_CHROME_CLEANUP_PARTNER),
- "</span>"});
+ const std::string powered_by_element = base::StrCat(
+ {"<span id='powered-by-logo'>",
+ ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(
+ IDR_CHROME_CLEANUP_PARTNER),
+ "</span>"});
const base::string16 powered_by_html =
l10n_util::GetStringFUTF16(IDS_SETTINGS_RESET_CLEANUP_FOOTER_POWERED_BY,
base::UTF8ToUTF16(powered_by_element));
@@ -524,7 +558,7 @@ void AddIncompatibleApplicationsStrings(content::WebUIDataSource* html_source) {
}
#endif // defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
-void AddResetStrings(content::WebUIDataSource* html_source) {
+void AddResetStrings(content::WebUIDataSource* html_source, Profile* profile) {
static constexpr webui::LocalizedString kLocalizedStrings[] = {
#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
{"resetPageTitle", IDS_SETTINGS_RESET_AND_CLEANUP},
@@ -550,6 +584,10 @@ void AddResetStrings(content::WebUIDataSource* html_source) {
};
AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+ html_source->AddBoolean(
+ "showResetProfileBanner",
+ ResetSettingsHandler::ShouldShowResetProfileBanner(profile));
+
html_source->AddString("resetPageLearnMoreUrl",
chrome::kResetProfileSettingsLearnMoreURL);
html_source->AddString("resetProfileBannerLearnMoreUrl",
@@ -735,6 +773,18 @@ void AddAutofillStrings(content::WebUIDataSource* html_source,
{"checkPasswordsCanceled", IDS_SETTINGS_CHECK_PASSWORDS_CANCELED},
{"checkedPasswords", IDS_SETTINGS_CHECKED_PASSWORDS},
{"checkPasswordsDescription", IDS_SETTINGS_CHECK_PASSWORDS_DESCRIPTION},
+ {"checkPasswordsErrorOffline",
+ IDS_SETTINGS_CHECK_PASSWORDS_ERROR_OFFLINE},
+ {"checkPasswordsErrorSignedOut",
+ IDS_SETTINGS_CHECK_PASSWORDS_ERROR_SIGNED_OUT},
+ {"checkPasswordsErrorNoPasswords",
+ IDS_SETTINGS_CHECK_PASSWORDS_ERROR_NO_PASSWORDS},
+ {"checkPasswordsErrorQuota",
+ IDS_SETTINGS_CHECK_PASSWORDS_ERROR_QUOTA_LIMIT},
+ {"checkPasswordsErrorGeneric",
+ IDS_SETTINGS_CHECK_PASSWORDS_ERROR_GENERIC},
+ {"noCompromisedCredentials",
+ IDS_SETTINGS_NO_COMPROMISED_CREDENTIALS_LABEL},
{"checkPasswordsAgain", IDS_SETTINGS_CHECK_PASSWORDS_AGAIN},
{"checkPasswordsAgainAfterError",
IDS_SETTINGS_CHECK_PASSWORDS_AGAIN_AFTER_ERROR},
@@ -765,6 +815,12 @@ void AddAutofillStrings(content::WebUIDataSource* html_source,
IDS_SETTINGS_COMPROMISED_EDIT_PASSWORD_SITE},
{"editCompromisedPasswordApp",
IDS_SETTINGS_COMPROMISED_EDIT_PASSWORD_APP},
+ {"alreadyChangedPasswordLink",
+ IDS_SETTINGS_COMPROMISED_ALREADY_CHANGED_PASSWORD},
+ {"editDisclaimerTitle",
+ IDS_SETTINGS_COMPROMISED_EDIT_DISCLAIMER_TITLE},
+ {"editDisclaimerDescription",
+ IDS_SETTINGS_COMPROMISED_EDIT_DISCLAIMER_DESCRIPTION},
{"creditCards", IDS_AUTOFILL_PAYMENT_METHODS},
{"noPaymentMethodsFound", IDS_SETTINGS_PAYMENT_METHODS_NONE},
{"googlePayments", IDS_SETTINGS_GOOGLE_PAYMENTS},
@@ -840,6 +896,10 @@ void AddAutofillStrings(content::WebUIDataSource* html_source,
IDS_SETTINGS_PASSWORDS_OPT_OUT_ACCOUNT_STORAGE_LABEL},
{"undoRemovePassword", IDS_SETTINGS_PASSWORD_UNDO},
{"passwordDeleted", IDS_SETTINGS_PASSWORD_DELETED_PASSWORD},
+ {"passwordDeletedFromDevice",
+ IDS_SETTINGS_PASSWORD_DELETED_PASSWORD_FROM_DEVICE},
+ {"passwordDeletedFromAccount",
+ IDS_SETTINGS_PASSWORD_DELETED_PASSWORD_FROM_ACCOUNT},
{"passwordRowMoreActionsButton", IDS_SETTINGS_PASSWORD_ROW_MORE_ACTIONS},
{"passwordRowFederatedMoreActionsButton",
IDS_SETTINGS_PASSWORD_ROW_FEDERATED_MORE_ACTIONS},
@@ -859,33 +919,6 @@ void AddAutofillStrings(content::WebUIDataSource* html_source,
{"savedToThisDeviceOnly",
IDS_SETTINGS_PAYMENTS_SAVED_TO_THIS_DEVICE_ONLY}};
- const base::string16 short_product_name =
- l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME);
- html_source->AddString(
- "checkPasswordsErrorOffline",
- l10n_util::GetStringFUTF16(IDS_SETTINGS_CHECK_PASSWORDS_ERROR_OFFLINE,
- short_product_name));
- html_source->AddString(
- "checkPasswordsErrorSignedOut",
- l10n_util::GetStringFUTF16(IDS_SETTINGS_CHECK_PASSWORDS_ERROR_SIGNED_OUT,
- short_product_name));
- html_source->AddString(
- "checkPasswordsErrorNoPasswords",
- l10n_util::GetStringFUTF16(
- IDS_SETTINGS_CHECK_PASSWORDS_ERROR_NO_PASSWORDS, short_product_name));
- html_source->AddString(
- "checkPasswordsErrorQuota",
- l10n_util::GetStringFUTF16(IDS_SETTINGS_CHECK_PASSWORDS_ERROR_QUOTA_LIMIT,
- short_product_name));
- html_source->AddString(
- "checkPasswordsErrorGeneric",
- l10n_util::GetStringFUTF16(IDS_SETTINGS_CHECK_PASSWORDS_ERROR_GENERIC,
- short_product_name));
- html_source->AddString(
- "noCompromisedCredentials",
- l10n_util::GetStringFUTF16(IDS_SETTINGS_NO_COMPROMISED_CREDENTIALS_LABEL,
- short_product_name));
-
GURL google_password_manager_url = GetGooglePasswordManagerURL(
password_manager::ManagePasswordsReferrer::kChromeSettings);
@@ -898,7 +931,6 @@ void AddAutofillStrings(content::WebUIDataSource* html_source,
"checkPasswordsErrorQuotaGoogleAccount",
l10n_util::GetStringFUTF16(
IDS_SETTINGS_CHECK_PASSWORDS_ERROR_QUOTA_LIMIT_GOOGLE_ACCOUNT,
- short_product_name,
base::UTF8ToUTF16(
password_manager::GetPasswordCheckupURL(
password_manager::PasswordCheckupReferrer::kPasswordCheck)
@@ -1042,6 +1074,7 @@ void AddPeopleStrings(content::WebUIDataSource* html_source, Profile* profile) {
// Manage profile strings:
#if !defined(OS_CHROMEOS)
{"showShortcutLabel", IDS_SETTINGS_PROFILE_SHORTCUT_TOGGLE_LABEL},
+ {"nameInputLabel", IDS_SETTINGS_PROFILE_NAME_INPUT_LABEL},
#endif
{"deleteProfileWarningExpandA11yLabel",
IDS_SETTINGS_SYNC_DISCONNECT_EXPAND_ACCESSIBILITY_LABEL},
@@ -1110,8 +1143,6 @@ void AddPrivacyStrings(content::WebUIDataSource* html_source,
{"permissionsPageDescription", IDS_SETTINGS_PERMISSIONS_DESCRIPTION},
{"securityPageTitle", IDS_SETTINGS_SECURITY},
{"securityPageDescription", IDS_SETTINGS_SECURITY_DESCRIPTION},
- {"securityPageAdvancedSectionLabel",
- IDS_SETTINGS_SECURITY_ADVANCED_SECTION_LABEL},
{"advancedProtectionProgramTitle",
IDS_SETTINGS_ADVANCED_PROTECTION_PROGRAM},
{"advancedProtectionProgramDesc",
@@ -1180,7 +1211,7 @@ void AddPrivacyStrings(content::WebUIDataSource* html_source,
IDS_SETTINGS_SAFEBROWSING_DISABLE_DIALOG_TITLE},
{"safeBrowsingDisableDialogDesc",
IDS_SETTINGS_SAFEBROWSING_DISABLE_DIALOG_DESC},
- {"safeBrowsingDisableDialogConfrim",
+ {"safeBrowsingDisableDialogConfirm",
IDS_SETTINGS_SAFEBROWSING_DISABLE_DIALOG_CONFIRM},
{"safeBrowsingEnableProtection",
IDS_SETTINGS_SAFEBROWSING_ENABLEPROTECTION},
@@ -1237,6 +1268,8 @@ void AddPrivacyStrings(content::WebUIDataSource* html_source,
{"safetyCheckParentButton", IDS_SETTINGS_SAFETY_CHECK_PARENT_BUTTON},
{"safetyCheckParentButtonAriaLabel",
IDS_SETTINGS_SAFETY_CHECK_PARENT_BUTTON_ARIA_LABEL},
+ {"safetyCheckParentButtonAriaLabelReload",
+ IDS_SETTINGS_CHECK_PASSWORDS_AGAIN},
{"safetyCheckIconRunningAriaLabel",
IDS_SETTINGS_SAFETY_CHECK_ICON_RUNNING_ARIA_LABEL},
{"safetyCheckIconSafeAriaLabel",
@@ -1245,20 +1278,19 @@ void AddPrivacyStrings(content::WebUIDataSource* html_source,
IDS_SETTINGS_SAFETY_CHECK_ICON_INFO_ARIA_LABEL},
{"safetyCheckIconWarningAriaLabel",
IDS_SETTINGS_SAFETY_CHECK_ICON_WARNING_ARIA_LABEL},
+ {"safetyCheckReview", IDS_SETTINGS_SAFETY_CHECK_REVIEW},
{"safetyCheckUpdatesPrimaryLabel",
IDS_SETTINGS_SAFETY_CHECK_UPDATES_PRIMARY_LABEL},
{"safetyCheckUpdatesButtonAriaLabel",
IDS_UPDATE_RECOMMENDED_DIALOG_TITLE},
- {"safetyCheckPasswordsButton",
- IDS_SETTINGS_SAFETY_CHECK_PASSWORDS_BUTTON},
+ {"safetyCheckPasswordsButtonAriaLabel",
+ IDS_SETTINGS_SAFETY_CHECK_PASSWORDS_BUTTON_ARIA_LABEL},
{"safetyCheckSafeBrowsingButton",
IDS_SETTINGS_SAFETY_CHECK_SAFE_BROWSING_BUTTON},
{"safetyCheckSafeBrowsingButtonAriaLabel",
IDS_SETTINGS_SAFETY_CHECK_SAFE_BROWSING_BUTTON_ARIA_LABEL},
{"safetyCheckExtensionsPrimaryLabel",
IDS_SETTINGS_SAFETY_CHECK_EXTENSIONS_PRIMARY_LABEL},
- {"safetyCheckExtensionsButton",
- IDS_SETTINGS_SAFETY_CHECK_EXTENSIONS_BUTTON},
{"safetyCheckExtensionsButtonAriaLabel",
IDS_SETTINGS_SAFETY_CHECK_EXTENSIONS_BUTTON_ARIA_LABEL},
};
@@ -1277,17 +1309,13 @@ void AddPrivacyStrings(content::WebUIDataSource* html_source,
"doNotTrackDialogMessage",
l10n_util::GetStringFUTF16(
IDS_SETTINGS_ENABLE_DO_NOT_TRACK_DIALOG_TEXT,
-#if defined(OS_CHROMEOS)
- GetHelpUrlWithBoard(chrome::kDoNotTrackLearnMoreURL)));
-#else
base::ASCIIToUTF16(chrome::kDoNotTrackLearnMoreURL)));
-#endif
html_source->AddString(
"exceptionsLearnMoreURL",
base::ASCIIToUTF16(chrome::kContentSettingsExceptionsLearnMoreURL));
html_source->AddBoolean(
"installedAppsInCbd",
- base::FeatureList::IsEnabled(features::kStoragePressureUI));
+ base::FeatureList::IsEnabled(features::kInstalledAppsInCbd));
html_source->AddBoolean(
"driveSuggestAvailable",
base::FeatureList::IsEnabled(omnibox::kDocumentProvider));
@@ -1821,6 +1849,12 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source,
{"siteSettingsVrAskRecommended",
IDS_SETTINGS_SITE_SETTINGS_VR_ASK_RECOMMENDED},
{"siteSettingsVrBlock", IDS_SETTINGS_SITE_SETTINGS_VR_BLOCK},
+ {"siteSettingsWindowPlacement",
+ IDS_SETTINGS_SITE_SETTINGS_WINDOW_PLACEMENT},
+ {"siteSettingsWindowPlacementAsk",
+ IDS_SETTINGS_SITE_SETTINGS_WINDOW_PLACEMENT_ASK},
+ {"siteSettingsWindowPlacementBlock",
+ IDS_SETTINGS_SITE_SETTINGS_WINDOW_PLACEMENT_BLOCK},
};
AddLocalizedStringsBulk(html_source, kLocalizedStrings);
@@ -2045,9 +2079,9 @@ void AddSecurityKeysStrings(content::WebUIDataSource* html_source) {
} // namespace
-void AddBrowserLocalizedStrings(content::WebUIDataSource* html_source,
- Profile* profile,
- content::WebContents* web_contents) {
+void AddLocalizedStrings(content::WebUIDataSource* html_source,
+ Profile* profile,
+ content::WebContents* web_contents) {
AddA11yStrings(html_source);
AddAboutStrings(html_source, profile);
AddAutofillStrings(html_source, profile, web_contents);
@@ -2066,7 +2100,7 @@ void AddBrowserLocalizedStrings(content::WebUIDataSource* html_source,
AddPeopleStrings(html_source, profile);
AddPrintingStrings(html_source);
AddPrivacyStrings(html_source, profile);
- AddResetStrings(html_source);
+ AddResetStrings(html_source, profile);
AddSearchEnginesStrings(html_source);
AddSearchInSettingsStrings(html_source);
AddSearchStrings(html_source);
diff --git a/chromium/chrome/browser/ui/webui/settings/settings_localized_strings_provider.h b/chromium/chrome/browser/ui/webui/settings/settings_localized_strings_provider.h
index 0940dc5a24e..6031ec9e22d 100644
--- a/chromium/chrome/browser/ui/webui/settings/settings_localized_strings_provider.h
+++ b/chromium/chrome/browser/ui/webui/settings/settings_localized_strings_provider.h
@@ -17,11 +17,9 @@ namespace settings {
// Adds the strings needed by the browser settings page to |html_source|
// This function causes |html_source| to expose a strings.js file from its
// source which contains a mapping from string's name to its translated value.
-// TODO(crbug/967888): This still contains OS Settings strings. Strings specific
-// to OS settings should be moved to os_settings_localized_strings_provider.cc.
-void AddBrowserLocalizedStrings(content::WebUIDataSource* html_source,
- Profile* profile,
- content::WebContents* web_contents);
+void AddLocalizedStrings(content::WebUIDataSource* html_source,
+ Profile* profile,
+ content::WebContents* web_contents);
} // namespace settings
diff --git a/chromium/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc b/chromium/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc
index 0ba238f7959..b0818ee920f 100644
--- a/chromium/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc
@@ -11,7 +11,8 @@
#include "base/metrics/histogram_macros.h"
#include "base/rand_util.h"
#include "chrome/browser/browser_process.h"
-#include "chrome/browser/net/dns_util.h"
+#include "chrome/browser/net/secure_dns_config.h"
+#include "chrome/browser/net/secure_dns_util.h"
#include "chrome/browser/net/stub_resolver_config_reader.h"
#include "chrome/browser/net/system_network_context_manager.h"
#include "chrome/common/chrome_features.h"
@@ -31,52 +32,35 @@ namespace settings {
namespace {
-const char kProbeHostname[] = "google.com";
-
std::unique_ptr<base::DictionaryValue> CreateSecureDnsSettingDict() {
// Fetch the current host resolver configuration. It is not sufficient to read
// the secure DNS prefs directly since the host resolver configuration takes
// other factors into account such as whether a managed environment or
// parental controls have been detected.
- bool insecure_stub_resolver_enabled = false;
- net::DnsConfig::SecureDnsMode secure_dns_mode;
- std::vector<net::DnsOverHttpsServerConfig> dns_over_https_servers;
- chrome_browser_net::SecureDnsUiManagementMode management_mode;
- SystemNetworkContextManager::GetStubResolverConfigReader()->GetConfiguration(
- true /* force_check_parental_controls_for_automatic_mode */,
- &insecure_stub_resolver_enabled, &secure_dns_mode,
- &dns_over_https_servers, &management_mode);
-
- std::string secure_dns_mode_str;
- switch (secure_dns_mode) {
- case net::DnsConfig::SecureDnsMode::SECURE:
- secure_dns_mode_str = chrome_browser_net::kDnsOverHttpsModeSecure;
- break;
- case net::DnsConfig::SecureDnsMode::AUTOMATIC:
- secure_dns_mode_str = chrome_browser_net::kDnsOverHttpsModeAutomatic;
- break;
- case net::DnsConfig::SecureDnsMode::OFF:
- secure_dns_mode_str = chrome_browser_net::kDnsOverHttpsModeOff;
- break;
- default:
- NOTREACHED();
- }
+ SecureDnsConfig config =
+ SystemNetworkContextManager::GetStubResolverConfigReader()
+ ->GetSecureDnsConfiguration(
+ true /* force_check_parental_controls_for_automatic_mode */);
auto secure_dns_templates = std::make_unique<base::ListValue>();
- for (const auto& doh_server : dns_over_https_servers) {
+ for (const auto& doh_server : config.servers()) {
secure_dns_templates->Append(doh_server.server_template);
}
auto dict = std::make_unique<base::DictionaryValue>();
- dict->SetString("mode", secure_dns_mode_str);
+ dict->SetString("mode", SecureDnsConfig::ModeToString(config.mode()));
dict->SetList("templates", std::move(secure_dns_templates));
- dict->SetInteger("managementMode", static_cast<int>(management_mode));
+ dict->SetInteger("managementMode",
+ static_cast<int>(config.management_mode()));
return dict;
}
} // namespace
-SecureDnsHandler::SecureDnsHandler() = default;
+SecureDnsHandler::SecureDnsHandler()
+ : network_context_getter_(
+ base::BindRepeating(&SecureDnsHandler::GetNetworkContext,
+ base::Unretained(this))) {}
SecureDnsHandler::~SecureDnsHandler() = default;
@@ -92,8 +76,8 @@ void SecureDnsHandler::RegisterMessages() {
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
- "validateCustomDnsEntry",
- base::BindRepeating(&SecureDnsHandler::HandleValidateCustomDnsEntry,
+ "parseCustomDnsEntry",
+ base::BindRepeating(&SecureDnsHandler::HandleParseCustomDnsEntry,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
@@ -179,7 +163,17 @@ base::Value SecureDnsHandler::GetSecureDnsResolverListForCountry(
void SecureDnsHandler::SetNetworkContextForTesting(
network::mojom::NetworkContext* network_context) {
- network_context_for_testing_ = network_context;
+ network_context_getter_ = base::BindRepeating(
+ [](network::mojom::NetworkContext* network_context) {
+ return network_context;
+ },
+ network_context);
+}
+
+network::mojom::NetworkContext* SecureDnsHandler::GetNetworkContext() {
+ return content::BrowserContext::GetDefaultStoragePartition(
+ web_ui()->GetWebContents()->GetBrowserContext())
+ ->GetNetworkContext();
}
void SecureDnsHandler::HandleGetSecureDnsResolverList(
@@ -200,31 +194,38 @@ void SecureDnsHandler::HandleGetSecureDnsSetting(const base::ListValue* args) {
ResolveJavascriptCallback(callback_id, *CreateSecureDnsSettingDict());
}
-void SecureDnsHandler::HandleValidateCustomDnsEntry(
- const base::ListValue* args) {
+void SecureDnsHandler::HandleParseCustomDnsEntry(const base::ListValue* args) {
AllowJavascript();
const base::Value* callback_id;
std::string custom_entry;
CHECK(args->Get(0, &callback_id));
CHECK(args->GetString(1, &custom_entry));
- // Return the first template, or none if the entry is invalid.
- std::string first_template;
- bool valid = !custom_entry.empty() &&
- chrome_browser_net::IsValidDohTemplateGroup(custom_entry);
- if (valid) {
- first_template =
- std::string(chrome_browser_net::SplitDohTemplateGroup(custom_entry)[0]);
+ // Return all templates in the entry, or none if they are not all valid.
+ base::Value templates(base::Value::Type::LIST);
+ if (chrome_browser_net::secure_dns::IsValidGroup(custom_entry)) {
+ for (base::StringPiece t :
+ chrome_browser_net::secure_dns::SplitGroup(custom_entry)) {
+ templates.Append(t);
+ }
}
- UMA_HISTOGRAM_BOOLEAN("Net.DNS.UI.ValidationAttemptSuccess", valid);
- ResolveJavascriptCallback(*callback_id, base::Value(first_template));
+ UMA_HISTOGRAM_BOOLEAN("Net.DNS.UI.ValidationAttemptSuccess",
+ !templates.GetList().empty());
+ ResolveJavascriptCallback(*callback_id, templates);
}
void SecureDnsHandler::HandleProbeCustomDnsTemplate(
const base::ListValue* args) {
AllowJavascript();
- receiver_.reset();
- host_resolver_.reset();
+
+ if (!probe_callback_id_.empty()) {
+ // Cancel the pending probe by destroying the probe runner (which does not
+ // call the callback), and report a non-error response to avoid leaking the
+ // callback.
+ runner_.reset();
+ ResolveJavascriptCallback(base::Value(probe_callback_id_),
+ base::Value(true));
+ }
std::string server_template;
CHECK(args->GetString(0, &probe_callback_id_));
@@ -235,33 +236,12 @@ void SecureDnsHandler::HandleProbeCustomDnsTemplate(
overrides.attempts = 1;
overrides.randomize_ports = false;
overrides.secure_dns_mode = net::DnsConfig::SecureDnsMode::SECURE;
- std::string server_method;
- // We only send probe queries to templates that have already passed a format
- // validation check.
- CHECK(net::dns_util::IsValidDohTemplate(server_template, &server_method));
- overrides.dns_over_https_servers.emplace({net::DnsOverHttpsServerConfig(
- server_template, server_method == "POST")});
- auto* network_context =
- network_context_for_testing_
- ? network_context_for_testing_
- : content::BrowserContext::GetDefaultStoragePartition(
- web_ui()->GetWebContents()->GetBrowserContext())
- ->GetNetworkContext();
- network_context->CreateHostResolver(
- overrides, host_resolver_.BindNewPipeAndPassReceiver());
-
- network::mojom::ResolveHostParametersPtr parameters =
- network::mojom::ResolveHostParameters::New();
- parameters->dns_query_type = net::DnsQueryType::A;
- parameters->source = net::HostResolverSource::DNS;
- parameters->cache_usage =
- network::mojom::ResolveHostParameters::CacheUsage::DISALLOWED;
- host_resolver_->ResolveHost(net::HostPortPair(kProbeHostname, 80),
- net::NetworkIsolationKey::CreateTransient(),
- std::move(parameters),
- receiver_.BindNewPipeAndPassRemote());
- receiver_.set_disconnect_handler(base::BindOnce(
- &SecureDnsHandler::OnMojoConnectionError, base::Unretained(this)));
+ chrome_browser_net::secure_dns::ApplyTemplate(&overrides, server_template);
+ DCHECK(!runner_);
+ runner_ = std::make_unique<chrome_browser_net::DnsProbeRunner>(
+ overrides, network_context_getter_);
+ runner_->RunProbe(base::BindOnce(&SecureDnsHandler::OnProbeComplete,
+ base::Unretained(this)));
}
void SecureDnsHandler::HandleRecordUserDropdownInteraction(
@@ -289,21 +269,14 @@ void SecureDnsHandler::HandleRecordUserDropdownInteraction(
}
}
-// network::ResolveHostClientBase impl:
-void SecureDnsHandler::OnComplete(
- int result,
- const net::ResolveErrorInfo& resolve_error_info,
- const base::Optional<net::AddressList>& resolved_addresses) {
- receiver_.reset();
- host_resolver_.reset();
- UMA_HISTOGRAM_BOOLEAN("Net.DNS.UI.ProbeAttemptSuccess", (result == 0));
+void SecureDnsHandler::OnProbeComplete() {
+ bool success =
+ runner_->result() == chrome_browser_net::DnsProbeRunner::CORRECT;
+ runner_.reset();
+ UMA_HISTOGRAM_BOOLEAN("Net.DNS.UI.ProbeAttemptSuccess", success);
ResolveJavascriptCallback(base::Value(probe_callback_id_),
- base::Value(result == 0));
-}
-
-void SecureDnsHandler::OnMojoConnectionError() {
- OnComplete(net::ERR_NAME_NOT_RESOLVED, net::ResolveErrorInfo(net::ERR_FAILED),
- base::nullopt);
+ base::Value(success));
+ probe_callback_id_.clear();
}
void SecureDnsHandler::SendSecureDnsSettingUpdatesToJavascript() {
diff --git a/chromium/chrome/browser/ui/webui/settings/settings_secure_dns_handler.h b/chromium/chrome/browser/ui/webui/settings/settings_secure_dns_handler.h
index ed68ee5b664..9f7622ae20d 100644
--- a/chromium/chrome/browser/ui/webui/settings/settings_secure_dns_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/settings_secure_dns_handler.h
@@ -11,20 +11,17 @@
#include "base/macros.h"
#include "base/values.h"
+#include "chrome/browser/net/dns_probe_runner.h"
#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
#include "components/prefs/pref_change_registrar.h"
-#include "mojo/public/cpp/bindings/receiver.h"
-#include "mojo/public/cpp/bindings/remote.h"
#include "net/dns/public/doh_provider_list.h"
#include "services/network/public/cpp/resolve_host_client_base.h"
-#include "services/network/public/mojom/host_resolver.mojom.h"
#include "services/network/public/mojom/network_context.mojom.h"
namespace settings {
// Handler for the Secure DNS setting.
-class SecureDnsHandler : public SettingsPageUIHandler,
- network::ResolveHostClientBase {
+class SecureDnsHandler : public SettingsPageUIHandler {
public:
SecureDnsHandler();
~SecureDnsHandler() override;
@@ -52,8 +49,8 @@ class SecureDnsHandler : public SettingsPageUIHandler,
// Intended to be called once upon creation of the secure DNS setting.
void HandleGetSecureDnsSetting(const base::ListValue* args);
- // Returns the first template if a custom entry is valid.
- void HandleValidateCustomDnsEntry(const base::ListValue* args);
+ // Parses a custom entry into templates, if they are all valid.
+ void HandleParseCustomDnsEntry(const base::ListValue* args);
// Returns whether or not a test query to the resolver succeeds.
void HandleProbeCustomDnsTemplate(const base::ListValue* args);
@@ -66,18 +63,15 @@ class SecureDnsHandler : public SettingsPageUIHandler,
void SendSecureDnsSettingUpdatesToJavascript();
private:
- // network::ResolveHostClientBase impl:
- void OnComplete(
- int result,
- const net::ResolveErrorInfo& resolve_error_info,
- const base::Optional<net::AddressList>& resolved_addresses) override;
-
- void OnMojoConnectionError();
+ network::mojom::NetworkContext* GetNetworkContext();
+ void OnProbeComplete();
std::map<std::string, net::DohProviderIdForHistogram> resolver_histogram_map_;
- network::mojom::NetworkContext* network_context_for_testing_ = nullptr;
- mojo::Receiver<network::mojom::ResolveHostClient> receiver_{this};
- mojo::Remote<network::mojom::HostResolver> host_resolver_;
+ std::unique_ptr<chrome_browser_net::DnsProbeRunner> runner_;
+ chrome_browser_net::DnsProbeRunner::NetworkContextGetter
+ network_context_getter_;
+ // ID of the Javascript callback for the current pending probe, or "" if
+ // there is no probe currently in progress.
std::string probe_callback_id_;
PrefChangeRegistrar pref_registrar_;
diff --git a/chromium/chrome/browser/ui/webui/settings/settings_secure_dns_handler_browsertest.cc b/chromium/chrome/browser/ui/webui/settings/settings_secure_dns_handler_browsertest.cc
index c57dde40d12..3ece9212741 100644
--- a/chromium/chrome/browser/ui/webui/settings/settings_secure_dns_handler_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/settings_secure_dns_handler_browsertest.cc
@@ -8,7 +8,7 @@
#include "build/build_config.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/net/dns_probe_test_util.h"
-#include "chrome/browser/net/dns_util.h"
+#include "chrome/browser/net/secure_dns_config.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/in_process_browser_test.h"
@@ -17,6 +17,7 @@
#include "components/policy/core/common/mock_configuration_policy_provider.h"
#include "components/policy/policy_constants.h"
#include "components/prefs/pref_service.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/test_web_ui.h"
#include "net/dns/public/resolve_error_info.h"
#include "testing/gmock/include/gmock/gmock.h"
@@ -28,6 +29,7 @@
using net::DohProviderEntry;
using testing::_;
+using testing::IsEmpty;
using testing::Return;
namespace settings {
@@ -35,7 +37,7 @@ namespace settings {
namespace {
constexpr char kGetSecureDnsResolverList[] = "getSecureDnsResolverList";
-constexpr char kValidateCustomDnsEntry[] = "validateCustomDnsEntry";
+constexpr char kParseCustomDnsEntry[] = "parseCustomDnsEntry";
constexpr char kProbeCustomDnsTemplate[] = "probeCustomDnsTemplate";
constexpr char kRecordUserDropdownInteraction[] =
"recordUserDropdownInteraction";
@@ -208,75 +210,71 @@ IN_PROC_BROWSER_TEST_F(SecureDnsHandlerTest, SecureDnsModes) {
std::vector<std::string> secure_dns_templates;
int management_mode;
- local_state->SetString(prefs::kDnsOverHttpsMode,
- chrome_browser_net::kDnsOverHttpsModeOff);
+ local_state->SetString(prefs::kDnsOverHttpsMode, SecureDnsConfig::kModeOff);
EXPECT_TRUE(GetLastSettingsChangedMessage(
&secure_dns_mode, &secure_dns_templates, &management_mode));
- EXPECT_EQ(chrome_browser_net::kDnsOverHttpsModeOff, secure_dns_mode);
+ EXPECT_EQ(SecureDnsConfig::kModeOff, secure_dns_mode);
local_state->SetString(prefs::kDnsOverHttpsMode,
- chrome_browser_net::kDnsOverHttpsModeAutomatic);
+ SecureDnsConfig::kModeAutomatic);
EXPECT_TRUE(GetLastSettingsChangedMessage(
&secure_dns_mode, &secure_dns_templates, &management_mode));
- EXPECT_EQ(chrome_browser_net::kDnsOverHttpsModeAutomatic, secure_dns_mode);
+ EXPECT_EQ(SecureDnsConfig::kModeAutomatic, secure_dns_mode);
local_state->SetString(prefs::kDnsOverHttpsMode,
- chrome_browser_net::kDnsOverHttpsModeSecure);
+ SecureDnsConfig::kModeSecure);
EXPECT_TRUE(GetLastSettingsChangedMessage(
&secure_dns_mode, &secure_dns_templates, &management_mode));
- EXPECT_EQ(chrome_browser_net::kDnsOverHttpsModeSecure, secure_dns_mode);
+ EXPECT_EQ(SecureDnsConfig::kModeSecure, secure_dns_mode);
local_state->SetString(prefs::kDnsOverHttpsMode, "unknown");
EXPECT_TRUE(GetLastSettingsChangedMessage(
&secure_dns_mode, &secure_dns_templates, &management_mode));
- EXPECT_EQ(chrome_browser_net::kDnsOverHttpsModeOff, secure_dns_mode);
+ EXPECT_EQ(SecureDnsConfig::kModeOff, secure_dns_mode);
}
IN_PROC_BROWSER_TEST_F(SecureDnsHandlerTest, SecureDnsPolicy) {
policy::PolicyMap policy_map;
- SetPolicyForPolicyKey(&policy_map, policy::key::kDnsOverHttpsMode,
- std::make_unique<base::Value>(
- chrome_browser_net::kDnsOverHttpsModeAutomatic));
+ SetPolicyForPolicyKey(
+ &policy_map, policy::key::kDnsOverHttpsMode,
+ std::make_unique<base::Value>(SecureDnsConfig::kModeAutomatic));
PrefService* local_state = g_browser_process->local_state();
local_state->SetString(prefs::kDnsOverHttpsMode,
- chrome_browser_net::kDnsOverHttpsModeSecure);
+ SecureDnsConfig::kModeSecure);
std::string secure_dns_mode;
std::vector<std::string> secure_dns_templates;
int management_mode;
EXPECT_TRUE(GetLastSettingsChangedMessage(
&secure_dns_mode, &secure_dns_templates, &management_mode));
- EXPECT_EQ(chrome_browser_net::kDnsOverHttpsModeAutomatic, secure_dns_mode);
- EXPECT_EQ(static_cast<int>(
- chrome_browser_net::SecureDnsUiManagementMode::kNoOverride),
+ EXPECT_EQ(SecureDnsConfig::kModeAutomatic, secure_dns_mode);
+ EXPECT_EQ(static_cast<int>(SecureDnsConfig::ManagementMode::kNoOverride),
management_mode);
}
IN_PROC_BROWSER_TEST_F(SecureDnsHandlerTest, SecureDnsPolicyChange) {
policy::PolicyMap policy_map;
- SetPolicyForPolicyKey(&policy_map, policy::key::kDnsOverHttpsMode,
- std::make_unique<base::Value>(
- chrome_browser_net::kDnsOverHttpsModeAutomatic));
+ SetPolicyForPolicyKey(
+ &policy_map, policy::key::kDnsOverHttpsMode,
+ std::make_unique<base::Value>(SecureDnsConfig::kModeAutomatic));
std::string secure_dns_mode;
std::vector<std::string> secure_dns_templates;
int management_mode;
EXPECT_TRUE(GetLastSettingsChangedMessage(
&secure_dns_mode, &secure_dns_templates, &management_mode));
- EXPECT_EQ(chrome_browser_net::kDnsOverHttpsModeAutomatic, secure_dns_mode);
- EXPECT_EQ(static_cast<int>(
- chrome_browser_net::SecureDnsUiManagementMode::kNoOverride),
+ EXPECT_EQ(SecureDnsConfig::kModeAutomatic, secure_dns_mode);
+ EXPECT_EQ(static_cast<int>(SecureDnsConfig::ManagementMode::kNoOverride),
management_mode);
SetPolicyForPolicyKey(
&policy_map, policy::key::kDnsOverHttpsMode,
- std::make_unique<base::Value>(chrome_browser_net::kDnsOverHttpsModeOff));
+ std::make_unique<base::Value>(SecureDnsConfig::kModeOff));
EXPECT_TRUE(GetLastSettingsChangedMessage(
&secure_dns_mode, &secure_dns_templates, &management_mode));
- EXPECT_EQ(chrome_browser_net::kDnsOverHttpsModeOff, secure_dns_mode);
- EXPECT_EQ(static_cast<int>(
- chrome_browser_net::SecureDnsUiManagementMode::kNoOverride),
+ EXPECT_EQ(SecureDnsConfig::kModeOff, secure_dns_mode);
+ EXPECT_EQ(static_cast<int>(SecureDnsConfig::ManagementMode::kNoOverride),
management_mode);
}
@@ -290,18 +288,16 @@ IN_PROC_BROWSER_TEST_F(SecureDnsHandlerTest, OtherPoliciesSet) {
PrefService* local_state = g_browser_process->local_state();
local_state->SetString(prefs::kDnsOverHttpsMode,
- chrome_browser_net::kDnsOverHttpsModeSecure);
+ SecureDnsConfig::kModeSecure);
std::string secure_dns_mode;
std::vector<std::string> secure_dns_templates;
int management_mode;
EXPECT_TRUE(GetLastSettingsChangedMessage(
&secure_dns_mode, &secure_dns_templates, &management_mode));
- EXPECT_EQ(chrome_browser_net::kDnsOverHttpsModeOff, secure_dns_mode);
- EXPECT_EQ(
- static_cast<int>(
- chrome_browser_net::SecureDnsUiManagementMode::kDisabledManaged),
- management_mode);
+ EXPECT_EQ(SecureDnsConfig::kModeOff, secure_dns_mode);
+ EXPECT_EQ(static_cast<int>(SecureDnsConfig::ManagementMode::kDisabledManaged),
+ management_mode);
}
#endif
@@ -479,15 +475,16 @@ IN_PROC_BROWSER_TEST_F(SecureDnsHandlerTest, TemplateValid) {
args.AppendString("https://example.template/dns-query");
base::HistogramTester histograms;
- web_ui_.HandleReceivedMessage(kValidateCustomDnsEntry, &args);
+ web_ui_.HandleReceivedMessage(kParseCustomDnsEntry, &args);
const content::TestWebUI::CallData& call_data = *web_ui_.call_data().back();
EXPECT_EQ("cr.webUIResponse", call_data.function_name());
EXPECT_EQ(kWebUiFunctionName, call_data.arg1()->GetString());
// The request should be successful.
ASSERT_TRUE(call_data.arg2()->GetBool());
// The template should be valid.
- ASSERT_EQ("https://example.template/dns-query",
- call_data.arg3()->GetString());
+ auto result = call_data.arg3()->GetList();
+ ASSERT_EQ(1u, result.size());
+ EXPECT_EQ(result[0].GetString(), "https://example.template/dns-query");
histograms.ExpectBucketCount("Net.DNS.UI.ValidationAttemptSuccess", false, 0);
histograms.ExpectBucketCount("Net.DNS.UI.ValidationAttemptSuccess", true, 1);
}
@@ -498,14 +495,14 @@ IN_PROC_BROWSER_TEST_F(SecureDnsHandlerTest, TemplateInvalid) {
args.AppendString("invalid_template");
base::HistogramTester histograms;
- web_ui_.HandleReceivedMessage(kValidateCustomDnsEntry, &args);
+ web_ui_.HandleReceivedMessage(kParseCustomDnsEntry, &args);
const content::TestWebUI::CallData& call_data = *web_ui_.call_data().back();
EXPECT_EQ("cr.webUIResponse", call_data.function_name());
EXPECT_EQ(kWebUiFunctionName, call_data.arg1()->GetString());
// The request should be successful.
ASSERT_TRUE(call_data.arg2()->GetBool());
// The template should be invalid.
- ASSERT_EQ(std::string(), call_data.arg3()->GetString());
+ EXPECT_THAT(call_data.arg3()->GetList(), IsEmpty());
histograms.ExpectBucketCount("Net.DNS.UI.ValidationAttemptSuccess", false, 1);
histograms.ExpectBucketCount("Net.DNS.UI.ValidationAttemptSuccess", true, 0);
}
@@ -516,23 +513,25 @@ IN_PROC_BROWSER_TEST_F(SecureDnsHandlerTest, MultipleTemplates) {
args_valid.AppendString(kWebUiFunctionName);
args_valid.AppendString(
"https://example1.template/dns https://example2.template/dns-query");
- web_ui_.HandleReceivedMessage(kValidateCustomDnsEntry, &args_valid);
+ web_ui_.HandleReceivedMessage(kParseCustomDnsEntry, &args_valid);
const content::TestWebUI::CallData& call_data_valid =
*web_ui_.call_data().back();
EXPECT_EQ("cr.webUIResponse", call_data_valid.function_name());
EXPECT_EQ(kWebUiFunctionName, call_data_valid.arg1()->GetString());
// The request should be successful.
ASSERT_TRUE(call_data_valid.arg2()->GetBool());
- // Both templates are valid, so validate returns the first.
- ASSERT_EQ("https://example1.template/dns",
- call_data_valid.arg3()->GetString());
+ // Both templates should be valid.
+ auto result = call_data_valid.arg3()->GetList();
+ ASSERT_EQ(2u, result.size());
+ EXPECT_EQ(result[0].GetString(), "https://example1.template/dns");
+ EXPECT_EQ(result[1].GetString(), "https://example2.template/dns-query");
histograms.ExpectBucketCount("Net.DNS.UI.ValidationAttemptSuccess", false, 0);
histograms.ExpectBucketCount("Net.DNS.UI.ValidationAttemptSuccess", true, 1);
base::ListValue args_invalid;
args_invalid.AppendString(kWebUiFunctionName);
args_invalid.AppendString("invalid_template https://example.template/dns");
- web_ui_.HandleReceivedMessage(kValidateCustomDnsEntry, &args_invalid);
+ web_ui_.HandleReceivedMessage(kParseCustomDnsEntry, &args_invalid);
const content::TestWebUI::CallData& call_data_invalid =
*web_ui_.call_data().back();
EXPECT_EQ("cr.webUIResponse", call_data_invalid.function_name());
@@ -540,7 +539,7 @@ IN_PROC_BROWSER_TEST_F(SecureDnsHandlerTest, MultipleTemplates) {
// The request should be successful.
ASSERT_TRUE(call_data_invalid.arg2()->GetBool());
// The entry should be invalid.
- ASSERT_EQ(std::string(), call_data_invalid.arg3()->GetString());
+ EXPECT_THAT(call_data_invalid.arg3()->GetList(), IsEmpty());
histograms.ExpectBucketCount("Net.DNS.UI.ValidationAttemptSuccess", false, 1);
histograms.ExpectBucketCount("Net.DNS.UI.ValidationAttemptSuccess", true, 1);
}
@@ -606,4 +605,57 @@ IN_PROC_BROWSER_TEST_F(SecureDnsHandlerTest, TemplateProbeFailure) {
histograms.ExpectBucketCount("Net.DNS.UI.ProbeAttemptSuccess", true, 0);
}
+IN_PROC_BROWSER_TEST_F(SecureDnsHandlerTest, TemplateProbeDebounce) {
+ auto network_context_hang =
+ std::make_unique<chrome_browser_net::HangingHostResolverNetworkContext>();
+ auto network_context_fail =
+ std::make_unique<chrome_browser_net::FakeHostResolverNetworkContext>(
+ std::vector<chrome_browser_net::FakeHostResolver::SingleResult>(
+ {chrome_browser_net::FakeHostResolver::SingleResult(
+ net::ERR_NAME_NOT_RESOLVED,
+ net::ResolveErrorInfo(net::ERR_DNS_MALFORMED_RESPONSE),
+ chrome_browser_net::FakeHostResolver::
+ kNoResponse)}) /* current_config_result_list */,
+ std::vector<chrome_browser_net::FakeHostResolver::
+ SingleResult>() /* google_config_result_list */);
+ base::HistogramTester histograms;
+ base::ListValue args_valid;
+ args_valid.AppendString(kWebUiFunctionName);
+ args_valid.AppendString("https://example.template/dns-query");
+ // Request a probe that will hang.
+ handler_->SetNetworkContextForTesting(network_context_hang.get());
+ web_ui_.HandleReceivedMessage(kProbeCustomDnsTemplate, &args_valid);
+ size_t responses = web_ui_.call_data().size();
+ base::RunLoop().RunUntilIdle();
+ // No response yet from the hanging probe.
+ EXPECT_EQ(responses, web_ui_.call_data().size());
+
+ // Request a probe that will fail.
+ handler_->SetNetworkContextForTesting(network_context_fail.get());
+ web_ui_.HandleReceivedMessage(kProbeCustomDnsTemplate, &args_valid);
+ // The hanging response should now have arrived.
+ EXPECT_EQ(responses + 1, web_ui_.call_data().size());
+ const content::TestWebUI::CallData& first_response =
+ *web_ui_.call_data().back();
+ ASSERT_EQ("cr.webUIResponse", first_response.function_name());
+ ASSERT_EQ(kWebUiFunctionName, first_response.arg1()->GetString());
+ // The cancelled probe should indicate no error.
+ ASSERT_TRUE(first_response.arg2()->GetBool());
+ EXPECT_TRUE(first_response.arg3()->GetBool());
+
+ // Wait for the second response.
+ base::RunLoop().RunUntilIdle();
+ EXPECT_EQ(responses + 2, web_ui_.call_data().size());
+ const content::TestWebUI::CallData& second_response =
+ *web_ui_.call_data().back();
+ ASSERT_EQ("cr.webUIResponse", second_response.function_name());
+ ASSERT_EQ(kWebUiFunctionName, second_response.arg1()->GetString());
+ // The second request should have resolved with a failure indication.
+ ASSERT_TRUE(second_response.arg2()->GetBool());
+ EXPECT_FALSE(second_response.arg3()->GetBool());
+ // Only the second response should be counted in the histograms.
+ histograms.ExpectBucketCount("Net.DNS.UI.ProbeAttemptSuccess", false, 1);
+ histograms.ExpectBucketCount("Net.DNS.UI.ProbeAttemptSuccess", true, 0);
+}
+
} // namespace settings
diff --git a/chromium/chrome/browser/ui/webui/settings/settings_security_key_handler.cc b/chromium/chrome/browser/ui/webui/settings/settings_security_key_handler.cc
index 112a3e1dc4b..f26b210b3d2 100644
--- a/chromium/chrome/browser/ui/webui/settings/settings_security_key_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/settings_security_key_handler.cc
@@ -16,7 +16,6 @@
#include "chrome/grit/generated_resources.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/web_ui.h"
-#include "content/public/common/service_manager_connection.h"
#include "device/fido/bio/enrollment_handler.h"
#include "device/fido/credential_management.h"
#include "device/fido/credential_management_handler.h"
@@ -734,6 +733,7 @@ void SecurityKeysBioEnrollmentHandler::OnEnrollmentFinished(
DCHECK_EQ(state_, State::kEnrolling);
DCHECK(!callback_id_.empty());
if (code == device::CtapDeviceResponseCode::kCtap2ErrKeepAliveCancel) {
+ state_ = State::kReady;
base::DictionaryValue d;
d.SetIntKey("code", static_cast<int>(code));
d.SetIntKey("remaining", 0);
diff --git a/chromium/chrome/browser/ui/webui/settings/settings_ui.cc b/chromium/chrome/browser/ui/webui/settings/settings_ui.cc
index 84d467e2229..0462890255d 100644
--- a/chromium/chrome/browser/ui/webui/settings/settings_ui.cc
+++ b/chromium/chrome/browser/ui/webui/settings/settings_ui.cc
@@ -103,6 +103,7 @@
#include "chrome/browser/chromeos/android_sms/android_sms_service_factory.h"
#include "chrome/browser/chromeos/multidevice_setup/multidevice_setup_client_factory.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/browser/ui/webui/certificate_provisioning_ui_handler.h"
#include "chrome/browser/ui/webui/settings/chromeos/account_manager_handler.h"
#include "chrome/browser/ui/webui/settings/chromeos/android_apps_handler.h"
#include "chrome/browser/ui/webui/settings/chromeos/multidevice_handler.h"
@@ -162,18 +163,6 @@ SettingsUI::SettingsUI(content::WebUI* web_ui)
content::WebUIDataSource* html_source =
content::WebUIDataSource::Create(chrome::kChromeUISettingsHost);
- // TODO(dpapad): Replace the following calls with
- // SetupBundledWebUIDataSource() when Settings is migrated to Polymer3.
- // Currently only used for testing the Polymer 3 version of
- // certificate-manager.
-#if BUILDFLAG(OPTIMIZE_WEBUI)
- html_source->EnableReplaceI18nInJS();
- html_source->OverrideContentSecurityPolicyScriptSrc(
- "script-src chrome://resources chrome://test 'self';");
- html_source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER);
- html_source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER);
-#endif
-
AddSettingsPageUIHandler(std::make_unique<AppearanceHandler>(web_ui));
#if defined(USE_NSS_CERTS)
@@ -182,6 +171,11 @@ SettingsUI::SettingsUI(content::WebUI* web_ui)
#elif defined(OS_WIN) || defined(OS_MACOSX)
AddSettingsPageUIHandler(std::make_unique<NativeCertificatesHandler>());
#endif // defined(USE_NSS_CERTS)
+#if defined(OS_CHROMEOS)
+ AddSettingsPageUIHandler(
+ std::make_unique<
+ chromeos::cert_provisioning::CertificateProvisioningUiHandler>());
+#endif
AddSettingsPageUIHandler(std::make_unique<AccessibilityMainHandler>());
AddSettingsPageUIHandler(std::make_unique<BrowserLifetimeHandler>());
@@ -191,13 +185,16 @@ SettingsUI::SettingsUI(content::WebUI* web_ui)
AddSettingsPageUIHandler(std::make_unique<CookiesViewHandler>());
AddSettingsPageUIHandler(std::make_unique<DownloadsHandler>(profile));
AddSettingsPageUIHandler(std::make_unique<ExtensionControlHandler>());
- AddSettingsPageUIHandler(std::make_unique<FontHandler>(web_ui));
+ AddSettingsPageUIHandler(std::make_unique<FontHandler>(profile));
AddSettingsPageUIHandler(std::make_unique<ImportDataHandler>());
AddSettingsPageUIHandler(std::make_unique<HatsHandler>());
-#if defined(OS_WIN) || defined(OS_CHROMEOS)
- AddSettingsPageUIHandler(std::make_unique<LanguagesHandler>(web_ui));
-#endif // defined(OS_WIN) || defined(OS_CHROMEOS)
+#if defined(OS_WIN)
+ AddSettingsPageUIHandler(std::make_unique<LanguagesHandler>());
+#endif // defined(OS_WIN)
+#if defined(OS_CHROMEOS)
+ AddSettingsPageUIHandler(std::make_unique<LanguagesHandler>(profile));
+#endif // defined(OS_CHROMEOS)
AddSettingsPageUIHandler(
std::make_unique<MediaDevicesSelectionHandler>(profile));
@@ -306,13 +303,8 @@ SettingsUI::SettingsUI(content::WebUI* web_ui)
// This is the browser settings page.
html_source->AddBoolean("isOSSettings", false);
#endif
- // TODO(crbug.com/1026455): Delete this as part of the SplitSettings cleanup.
- html_source->AddBoolean("showOSSettings", false);
-
- AddSettingsPageUIHandler(
- base::WrapUnique(AboutHandler::Create(html_source, profile)));
- AddSettingsPageUIHandler(
- base::WrapUnique(ResetSettingsHandler::Create(html_source, profile)));
+ AddSettingsPageUIHandler(std::make_unique<AboutHandler>());
+ AddSettingsPageUIHandler(std::make_unique<ResetSettingsHandler>(profile));
// Add a handler to provide pluralized strings.
auto plural_string_handler = std::make_unique<PluralStringHandler>();
@@ -324,58 +316,48 @@ SettingsUI::SettingsUI(content::WebUI* web_ui)
web_ui->AddMessageHandler(std::make_unique<MetricsHandler>());
#if BUILDFLAG(OPTIMIZE_WEBUI)
- html_source->AddResourcePath("crisper.js", IDR_SETTINGS_CRISPER_JS);
- html_source->AddResourcePath("lazy_load.crisper.js",
- IDR_SETTINGS_LAZY_LOAD_CRISPER_JS);
- html_source->AddResourcePath("lazy_load.html",
- IDR_SETTINGS_LAZY_LOAD_VULCANIZED_HTML);
- html_source->SetDefaultResource(IDR_SETTINGS_VULCANIZED_HTML);
-
- // Register SVG images that are purposefully not inlined in the HTML bundle
- // above.
- html_source->AddResourcePath("images/cookies_banner.svg",
- IDR_SETTINGS_IMAGES_COOKIES_BANNER_SVG);
- html_source->AddResourcePath("images/cookies_banner_dark.svg",
- IDR_SETTINGS_IMAGES_COOKIES_BANNER_DARK_SVG);
- html_source->AddResourcePath("images/permissions_banner.svg",
- IDR_SETTINGS_IMAGES_PERMISSIONS_BANNER_SVG);
- html_source->AddResourcePath("images/permissions_banner_dark.svg",
- IDR_SETTINGS_IMAGES_PERMISSIONS_BANNER_DARK_SVG);
- html_source->AddResourcePath("images/safe_browsing_banner.svg",
- IDR_SETTINGS_IMAGES_SAFE_BROWSING_BANNER_SVG);
- html_source->AddResourcePath(
- "images/safe_browsing_banner_dark.svg",
- IDR_SETTINGS_IMAGES_SAFE_BROWSING_BANNER_DARK_SVG);
- html_source->AddResourcePath("images/sync_banner.svg",
- IDR_SETTINGS_IMAGES_SYNC_BANNER_SVG);
- html_source->AddResourcePath("images/sync_banner_dark.svg",
- IDR_SETTINGS_IMAGES_SYNC_BANNER_DARK_SVG);
- html_source->AddResourcePath("images/password_check_neutral.svg",
- IDR_SETTINGS_IMAGES_PASSWORD_CHECK_NEUTRAL_SVG);
- html_source->AddResourcePath(
- "images/password_check_neutral_dark.svg",
- IDR_SETTINGS_IMAGES_PASSWORD_CHECK_NEUTRAL_DARK_SVG);
- html_source->AddResourcePath("images/password_check_positive.svg",
- IDR_SETTINGS_IMAGES_PASSWORD_CHECK_POSITIVE_SVG);
- html_source->AddResourcePath(
- "images/password_check_positive_dark.svg",
- IDR_SETTINGS_IMAGES_PASSWORD_CHECK_POSITIVE_DARK_SVG);
-
- // Only used in Polymer 3, see https://crbug.com/1026426.
- html_source->AddResourcePath("settings.js", IDR_SETTINGS_SETTINGS_ROLLUP_JS);
+ webui::SetupBundledWebUIDataSource(html_source, "settings.js",
+ IDR_SETTINGS_SETTINGS_ROLLUP_JS,
+ IDR_SETTINGS_SETTINGS_V3_HTML);
html_source->AddResourcePath("shared.rollup.js",
IDR_SETTINGS_SHARED_ROLLUP_JS);
html_source->AddResourcePath("lazy_load.js",
IDR_SETTINGS_LAZY_LOAD_ROLLUP_JS);
- html_source->AddResourcePath("settings_v3.html",
- IDR_SETTINGS_SETTINGS_V3_HTML);
+
+ // Register SVG images that are purposefully not inlined in the HTML bundle
+ // above.
+ static constexpr webui::ResourcePath kSvgResources[] = {
+ {"images/cookies_banner.svg", IDR_SETTINGS_IMAGES_COOKIES_BANNER_SVG},
+ {"images/cookies_banner_dark.svg",
+ IDR_SETTINGS_IMAGES_COOKIES_BANNER_DARK_SVG},
+ {"images/permissions_banner.svg",
+ IDR_SETTINGS_IMAGES_PERMISSIONS_BANNER_SVG},
+ {"images/permissions_banner_dark.svg",
+ IDR_SETTINGS_IMAGES_PERMISSIONS_BANNER_DARK_SVG},
+ {"images/safe_browsing_banner.svg",
+ IDR_SETTINGS_IMAGES_SAFE_BROWSING_BANNER_SVG},
+ {"images/safe_browsing_banner_dark.svg",
+ IDR_SETTINGS_IMAGES_SAFE_BROWSING_BANNER_DARK_SVG},
+ {"images/sync_banner.svg", IDR_SETTINGS_IMAGES_SYNC_BANNER_SVG},
+ {"images/sync_banner_dark.svg", IDR_SETTINGS_IMAGES_SYNC_BANNER_DARK_SVG},
+ {"images/password_check_neutral.svg",
+ IDR_SETTINGS_IMAGES_PASSWORD_CHECK_NEUTRAL_SVG},
+ {"images/password_check_neutral_dark.svg",
+ IDR_SETTINGS_IMAGES_PASSWORD_CHECK_NEUTRAL_DARK_SVG},
+ {"images/password_check_positive.svg",
+ IDR_SETTINGS_IMAGES_PASSWORD_CHECK_POSITIVE_SVG},
+ {"images/password_check_positive_dark.svg",
+ IDR_SETTINGS_IMAGES_PASSWORD_CHECK_POSITIVE_DARK_SVG},
+ };
+ webui::AddResourcePathsBulk(html_source, kSvgResources);
+
#else
webui::SetupWebUIDataSource(
html_source, base::make_span(kSettingsResources, kSettingsResourcesSize),
- kGeneratedPath, IDR_SETTINGS_SETTINGS_HTML);
+ kGeneratedPath, IDR_SETTINGS_SETTINGS_V3_HTML);
#endif
- AddBrowserLocalizedStrings(html_source, profile, web_ui->GetWebContents());
+ AddLocalizedStrings(html_source, profile, web_ui->GetWebContents());
ManagedUIHandler::Initialize(web_ui, html_source);
diff --git a/chromium/chrome/browser/ui/webui/settings/settings_ui_browsertest.cc b/chromium/chrome/browser/ui/webui/settings/settings_ui_browsertest.cc
index c19638cf1bc..fea44d1b3ba 100644
--- a/chromium/chrome/browser/ui/webui/settings/settings_ui_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/settings_ui_browsertest.cc
@@ -16,6 +16,7 @@
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_message_handler.h"
#include "content/public/common/url_constants.h"
+#include "content/public/test/browser_test.h"
#include "url/gurl.h"
typedef InProcessBrowserTest SettingsUITest;
diff --git a/chromium/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.cc b/chromium/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.cc
index 9a461686fd3..20abed8007e 100644
--- a/chromium/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.cc
+++ b/chromium/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.cc
@@ -112,6 +112,8 @@ void AddSyncControlsStrings(content::WebUIDataSource* html_source) {
{"historyCheckboxLabel", IDS_SETTINGS_HISTORY_CHECKBOX_LABEL},
{"extensionsCheckboxLabel", IDS_SETTINGS_EXTENSIONS_CHECKBOX_LABEL},
{"openTabsCheckboxLabel", IDS_SETTINGS_OPEN_TABS_CHECKBOX_LABEL},
+ {"wifiConfigurationsCheckboxLabel",
+ IDS_SETTINGS_WIFI_CONFIGURATIONS_CHECKBOX_LABEL},
{"syncEverythingCheckboxLabel",
IDS_SETTINGS_SYNC_EVERYTHING_CHECKBOX_LABEL},
{"appCheckboxLabel", IDS_SETTINGS_APPS_CHECKBOX_LABEL},
diff --git a/chromium/chrome/browser/ui/webui/settings/site_settings_handler.cc b/chromium/chrome/browser/ui/webui/settings/site_settings_handler.cc
index b53e4f98315..e195fcbd936 100644
--- a/chromium/chrome/browser/ui/webui/settings/site_settings_handler.cc
+++ b/chromium/chrome/browser/ui/webui/settings/site_settings_handler.cc
@@ -34,8 +34,8 @@
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/page_info/page_info_infobar_delegate.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/ui/webui/recent_site_settings_helper.h"
-#include "chrome/browser/ui/webui/site_settings_helper.h"
+#include "chrome/browser/ui/webui/settings/recent_site_settings_helper.h"
+#include "chrome/browser/ui/webui/settings/site_settings_helper.h"
#include "chrome/browser/usb/usb_chooser_context.h"
#include "chrome/browser/usb/usb_chooser_context_factory.h"
#include "chrome/browser/web_applications/web_app_provider.h"
@@ -511,8 +511,8 @@ void SiteSettingsHandler::RegisterMessages() {
void SiteSettingsHandler::OnJavascriptAllowed() {
ObserveSourcesForProfile(profile_);
- if (profile_->HasOffTheRecordProfile())
- ObserveSourcesForProfile(profile_->GetOffTheRecordProfile());
+ if (profile_->HasPrimaryOTRProfile())
+ ObserveSourcesForProfile(profile_->GetPrimaryOTRProfile());
// Here we only subscribe to the HostZoomMap for the default storage partition
// since we don't allow the user to manage the zoom levels for apps.
@@ -568,8 +568,8 @@ void SiteSettingsHandler::OnGetUsageInfo() {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
// Site Details Page does not display the number of cookies for the origin.
const CookieTreeNode* root = cookies_tree_model_->GetRoot();
- std::string usage_string = "";
- std::string cookie_string = "";
+ std::string usage_string;
+ std::string cookie_string;
for (const auto& site : root->children()) {
std::string title = base::UTF16ToUTF8(site->GetTitle());
if (title != usage_host_)
@@ -767,9 +767,9 @@ void SiteSettingsHandler::HandleGetAllSites(const base::ListValue* args) {
// Incognito contains incognito content settings plus non-incognito content
// settings. Thus if it exists, just get exceptions for the incognito profile.
Profile* profile = profile_;
- if (profile_->HasOffTheRecordProfile() &&
- profile_->GetOffTheRecordProfile() != profile_) {
- profile = profile_->GetOffTheRecordProfile();
+ if (profile_->HasPrimaryOTRProfile() &&
+ profile_->GetPrimaryOTRProfile() != profile_) {
+ profile = profile_->GetPrimaryOTRProfile();
}
DCHECK(profile);
HostContentSettingsMap* map =
@@ -977,26 +977,23 @@ void SiteSettingsHandler::HandleGetExceptionList(const base::ListValue* args) {
std::unique_ptr<base::ListValue> exceptions(new base::ListValue);
- HostContentSettingsMap* map =
- HostContentSettingsMapFactory::GetForProfile(profile_);
const auto* extension_registry = extensions::ExtensionRegistry::Get(profile_);
AddExceptionsGrantedByHostedApps(profile_, APIPermissionFromGroupName(type),
exceptions.get());
- site_settings::GetExceptionsFromHostContentSettingsMap(
- map, content_type, extension_registry, web_ui(), /*incognito=*/false,
- /*filter=*/nullptr, exceptions.get());
+ site_settings::GetExceptionsForContentType(
+ content_type, profile_, extension_registry, web_ui(), /*incognito=*/false,
+ exceptions.get());
- Profile* incognito = profile_->HasOffTheRecordProfile()
- ? profile_->GetOffTheRecordProfile()
+ Profile* incognito = profile_->HasPrimaryOTRProfile()
+ ? profile_->GetPrimaryOTRProfile()
: nullptr;
// On Chrome OS in Guest mode the incognito profile is the primary profile,
// so do not fetch an extra copy of the same exceptions.
if (incognito && incognito != profile_) {
- map = HostContentSettingsMapFactory::GetForProfile(incognito);
extension_registry = extensions::ExtensionRegistry::Get(incognito);
- site_settings::GetExceptionsFromHostContentSettingsMap(
- map, content_type, extension_registry, web_ui(), /*incognito=*/true,
- /*filter=*/nullptr, exceptions.get());
+ site_settings::GetExceptionsForContentType(
+ content_type, incognito, extension_registry, web_ui(),
+ /*incognito=*/true, exceptions.get());
}
ResolveJavascriptCallback(*callback_id, *exceptions.get());
@@ -1100,7 +1097,7 @@ void SiteSettingsHandler::HandleSetOriginPermissions(
// Clear any existing embargo status if the new setting isn't block.
if (setting != CONTENT_SETTING_BLOCK) {
PermissionDecisionAutoBlockerFactory::GetForProfile(profile_)
- ->RemoveEmbargoByUrl(origin, content_type);
+ ->RemoveEmbargoAndResetCounts(origin, content_type);
}
map->SetContentSettingDefaultScope(origin, origin, content_type,
std::string(), setting);
@@ -1167,9 +1164,9 @@ void SiteSettingsHandler::HandleResetCategoryPermissionForPattern(
Profile* profile = nullptr;
if (incognito) {
- if (!profile_->HasOffTheRecordProfile())
+ if (!profile_->HasPrimaryOTRProfile())
return;
- profile = profile_->GetOffTheRecordProfile();
+ profile = profile_->GetPrimaryOTRProfile();
} else {
profile = profile_;
}
@@ -1202,6 +1199,11 @@ void SiteSettingsHandler::HandleResetCategoryPermissionForPattern(
"SoundContentSetting.UnmuteBy.PatternException"));
}
}
+
+ // End embargo if currently active.
+ PermissionDecisionAutoBlockerFactory::GetForProfile(profile)
+ ->RemoveEmbargoAndResetCounts(GURL(primary_pattern_string), content_type);
+
content_settings::LogWebSiteSettingsPermissionChange(
content_type, ContentSetting::CONTENT_SETTING_DEFAULT);
}
@@ -1227,9 +1229,9 @@ void SiteSettingsHandler::HandleSetCategoryPermissionForPattern(
Profile* profile = nullptr;
if (incognito) {
- if (!profile_->HasOffTheRecordProfile())
+ if (!profile_->HasPrimaryOTRProfile())
return;
- profile = profile_->GetOffTheRecordProfile();
+ profile = profile_->GetPrimaryOTRProfile();
} else {
profile = profile_;
}
@@ -1319,7 +1321,7 @@ void SiteSettingsHandler::HandleIsPatternValidForType(
std::string type;
CHECK(args->GetString(2, &type));
- std::string reason = "";
+ std::string reason;
bool is_valid =
IsPatternValidForType(pattern_string, type, profile_, &reason);
@@ -1333,7 +1335,7 @@ void SiteSettingsHandler::HandleUpdateIncognitoStatus(
const base::ListValue* args) {
AllowJavascript();
FireWebUIListener("onIncognitoStatusChanged",
- base::Value(profile_->HasOffTheRecordProfile()));
+ base::Value(profile_->HasPrimaryOTRProfile()));
}
void SiteSettingsHandler::HandleFetchZoomLevels(const base::ListValue* args) {
diff --git a/chromium/chrome/browser/ui/webui/settings/site_settings_handler.h b/chromium/chrome/browser/ui/webui/settings/site_settings_handler.h
index 575661dc87e..0b34a324727 100644
--- a/chromium/chrome/browser/ui/webui/settings/site_settings_handler.h
+++ b/chromium/chrome/browser/ui/webui/settings/site_settings_handler.h
@@ -118,6 +118,9 @@ class SiteSettingsHandler
FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, GetAndSetForInvalidURLs);
FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, GetAndSetOriginPermissions);
FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, Incognito);
+ FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, IncognitoExceptions);
+ FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest,
+ ResetCategoryPermissionForEmbargoedOrigins);
FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, Origins);
FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, Patterns);
FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, PatternsAndContentType);
diff --git a/chromium/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
index 0fd6541604d..ee654373208 100644
--- a/chromium/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
@@ -20,8 +20,6 @@
#include "base/values.h"
#include "build/build_config.h"
#include "chrome/browser/browsing_data/browsing_data_flash_lso_helper.h"
-#include "chrome/browser/browsing_data/mock_browsing_data_cookie_helper.h"
-#include "chrome/browser/browsing_data/mock_browsing_data_local_storage_helper.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/test_extension_system.h"
@@ -30,7 +28,7 @@
#include "chrome/browser/permissions/permission_decision_auto_blocker_factory.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/ui/webui/site_settings_helper.h"
+#include "chrome/browser/ui/webui/settings/site_settings_helper.h"
#include "chrome/browser/usb/usb_chooser_context.h"
#include "chrome/browser/usb/usb_chooser_context_factory.h"
#include "chrome/browser/web_applications/components/web_app_helpers.h"
@@ -39,6 +37,8 @@
#include "chrome/grit/generated_resources.h"
#include "chrome/test/base/browser_with_test_window_test.h"
#include "chrome/test/base/testing_profile.h"
+#include "components/browsing_data/content/mock_cookie_helper.h"
+#include "components/browsing_data/content/mock_local_storage_helper.h"
#include "components/content_settings/core/browser/cookie_settings.h"
#include "components/content_settings/core/browser/host_content_settings_map.h"
#include "components/content_settings/core/common/content_settings.h"
@@ -432,15 +432,15 @@ class SiteSettingsHandlerTest : public testing::Test {
// TODO(https://crbug.com/835712): Currently only set up the cookies and local
// storage nodes, will update all other nodes in the future.
void SetUpCookiesTreeModel() {
- scoped_refptr<MockBrowsingDataCookieHelper>
+ scoped_refptr<browsing_data::MockCookieHelper>
mock_browsing_data_cookie_helper;
- scoped_refptr<MockBrowsingDataLocalStorageHelper>
+ scoped_refptr<browsing_data::MockLocalStorageHelper>
mock_browsing_data_local_storage_helper;
mock_browsing_data_cookie_helper =
- new MockBrowsingDataCookieHelper(profile());
+ new browsing_data::MockCookieHelper(profile());
mock_browsing_data_local_storage_helper =
- new MockBrowsingDataLocalStorageHelper(profile());
+ new browsing_data::MockLocalStorageHelper(profile());
auto container = std::make_unique<LocalDataContainer>(
mock_browsing_data_cookie_helper,
@@ -499,6 +499,9 @@ class SiteSettingsHandlerTest : public testing::Test {
const std::string kCookies;
const std::string kFlash;
+ const ContentSettingsType kPermissionNotifications =
+ ContentSettingsType::NOTIFICATIONS;
+
// The number of listeners that are expected to fire when any content setting
// is changed.
const size_t kNumberContentSettingListeners = 2;
@@ -997,6 +1000,157 @@ TEST_F(SiteSettingsHandlerTest, InstalledApps) {
EXPECT_FALSE(origin_info->FindKey("isInstalled")->GetBool());
}
+TEST_F(SiteSettingsHandlerTest, IncognitoExceptions) {
+ constexpr char kOriginToBlock[] = "https://www.blocked.com:443";
+
+ CreateIncognitoProfile();
+
+ {
+ base::ListValue set_args;
+ set_args.AppendString(kOriginToBlock); // Primary pattern.
+ set_args.AppendString(kOriginToBlock); // Secondary pattern.
+ set_args.AppendString(kNotifications);
+ set_args.AppendString(
+ content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK));
+ set_args.AppendBoolean(true); // Incognito.
+
+ handler()->HandleSetCategoryPermissionForPattern(&set_args);
+
+ base::ListValue get_exception_list_args;
+ get_exception_list_args.AppendString(kCallbackId);
+ get_exception_list_args.AppendString(kNotifications);
+ handler()->HandleGetExceptionList(&get_exception_list_args);
+
+ const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
+ const base::ListValue* exceptions;
+ ASSERT_TRUE(data.arg3()->GetAsList(&exceptions));
+ ASSERT_EQ(1U, exceptions->GetSize());
+
+ const base::DictionaryValue* exception;
+ ASSERT_TRUE(exceptions->GetDictionary(0, &exception));
+ std::string origin;
+ ASSERT_TRUE(exception->GetString(site_settings::kOrigin, &origin));
+ EXPECT_EQ(kOriginToBlock, origin);
+ }
+
+ {
+ base::ListValue set_args;
+ set_args.AppendString(kOriginToBlock); // Primary pattern.
+ set_args.AppendString(kOriginToBlock); // Secondary pattern.
+ set_args.AppendString(kNotifications);
+ set_args.AppendString(
+ content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK));
+ set_args.AppendBoolean(false); // Incognito.
+
+ handler()->HandleSetCategoryPermissionForPattern(&set_args);
+
+ base::ListValue get_exception_list_args;
+ get_exception_list_args.AppendString(kCallbackId);
+ get_exception_list_args.AppendString(kNotifications);
+ handler()->HandleGetExceptionList(&get_exception_list_args);
+
+ const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
+ const base::ListValue* exceptions;
+ ASSERT_TRUE(data.arg3()->GetAsList(&exceptions));
+ ASSERT_EQ(2U, exceptions->GetSize());
+
+ const base::DictionaryValue* exception;
+ ASSERT_TRUE(exceptions->GetDictionary(0, &exception));
+ std::string origin;
+ ASSERT_TRUE(exception->GetString(site_settings::kOrigin, &origin));
+ ASSERT_EQ(kOriginToBlock, origin);
+
+ ASSERT_TRUE(exceptions->GetDictionary(1, &exception));
+ ASSERT_TRUE(exception->GetString(site_settings::kOrigin, &origin));
+ EXPECT_EQ(kOriginToBlock, origin);
+ }
+
+ DestroyIncognitoProfile();
+}
+
+TEST_F(SiteSettingsHandlerTest, ResetCategoryPermissionForEmbargoedOrigins) {
+ constexpr char kOriginToBlock[] = "https://www.blocked.com:443";
+ constexpr char kOriginToEmbargo[] = "https://embargoed.co.uk";
+
+ // Add and test 1 blocked origin
+ {
+ base::ListValue set_args;
+ set_args.AppendString(kOriginToBlock); // Primary pattern.
+ set_args.AppendString(kOriginToBlock); // Secondary pattern.
+ set_args.AppendString(kNotifications);
+ set_args.AppendString(
+ content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK));
+ set_args.AppendBoolean(false); // Incognito.
+
+ handler()->HandleSetCategoryPermissionForPattern(&set_args);
+ ASSERT_EQ(1U, web_ui()->call_data().size());
+ }
+
+ // Add and test 1 embargoed origin.
+ {
+ auto* auto_blocker =
+ PermissionDecisionAutoBlockerFactory::GetForProfile(profile());
+ for (size_t i = 0; i < 3; ++i) {
+ auto_blocker->RecordDismissAndEmbargo(GURL(kOriginToEmbargo),
+ kPermissionNotifications, false);
+ }
+ // Check that origin is under embargo.
+ EXPECT_EQ(
+ CONTENT_SETTING_BLOCK,
+ auto_blocker
+ ->GetEmbargoResult(GURL(kOriginToEmbargo), kPermissionNotifications)
+ .content_setting);
+ }
+
+ // Check there are 2 blocked origins.
+ {
+ base::ListValue exceptions;
+ site_settings::GetExceptionsForContentType(
+ kPermissionNotifications, profile(), /*extension_registry=*/nullptr,
+ web_ui(),
+ /*incognito=*/false, &exceptions);
+
+ // The size should be 2, 1st is blocked origin, 2nd is embargoed origin.
+ ASSERT_EQ(2U, exceptions.GetSize());
+ }
+
+ {
+ // Reset blocked origin.
+ base::ListValue reset_args;
+ reset_args.AppendString(kOriginToBlock);
+ reset_args.AppendString(kOriginToBlock);
+ reset_args.AppendString(kNotifications);
+ reset_args.AppendBoolean(false); // Incognito.
+ handler()->HandleResetCategoryPermissionForPattern(&reset_args);
+
+ // Check there is 1 blocked origin.
+ base::ListValue exceptions;
+ site_settings::GetExceptionsForContentType(
+ kPermissionNotifications, profile(), /*extension_registry=*/nullptr,
+ web_ui(),
+ /*incognito=*/false, &exceptions);
+ ASSERT_EQ(1U, exceptions.GetSize());
+ }
+
+ {
+ // Reset embargoed origin.
+ base::ListValue reset_args;
+ reset_args.AppendString(kOriginToEmbargo);
+ reset_args.AppendString(kOriginToEmbargo);
+ reset_args.AppendString(kNotifications);
+ reset_args.AppendBoolean(false); // Incognito.
+ handler()->HandleResetCategoryPermissionForPattern(&reset_args);
+
+ // Check that there are no blocked or embargoed origins.
+ base::ListValue exceptions;
+ site_settings::GetExceptionsForContentType(
+ kPermissionNotifications, profile(), /*extension_registry=*/nullptr,
+ web_ui(),
+ /*incognito=*/false, &exceptions);
+ ASSERT_EQ(0U, exceptions.GetSize());
+ }
+}
+
TEST_F(SiteSettingsHandlerTest, Origins) {
const std::string google("https://www.google.com:443");
const std::string uma_base("WebsiteSettings.Menu.PermissionChanged");
@@ -1101,11 +1255,18 @@ TEST_F(SiteSettingsHandlerTest, NotificationPermissionRevokeUkm) {
static_cast<int64_t>(permissions::PermissionAction::REVOKED));
}
-TEST_F(SiteSettingsHandlerTest, DefaultSettingSource) {
+// TODO(crbug.com/1076294): Test flakes on TSAN and ASAN.
+#if defined(THREAD_SANITIZER) || defined(ADDRESS_SANITIZER)
+#define MAYBE_DefaultSettingSource DISABLED_DefaultSettingSource
+#else
+#define MAYBE_DefaultSettingSource DefaultSettingSource
+#endif
+TEST_F(SiteSettingsHandlerTest, MAYBE_DefaultSettingSource) {
ASSERT_TRUE(profile()->CreateHistoryService(/* delete_file= */ true,
/* no_db= */ false));
- // Use a non-default port to verify the display name does not strip this off.
+ // Use a non-default port to verify the display name does not strip this
+ // off.
const std::string google("https://www.google.com:183");
const std::string expected_display_name("www.google.com:183");
diff --git a/chromium/chrome/browser/ui/webui/site_settings_helper.cc b/chromium/chrome/browser/ui/webui/settings/site_settings_helper.cc
index 9de4ee74b87..5dfef5ee030 100644
--- a/chromium/chrome/browser/ui/webui/site_settings_helper.cc
+++ b/chromium/chrome/browser/ui/webui/settings/site_settings_helper.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/ui/webui/site_settings_helper.h"
+#include "chrome/browser/ui/webui/settings/site_settings_helper.h"
#include <algorithm>
#include <functional>
@@ -33,8 +33,11 @@
#include "components/content_settings/core/common/content_settings_utils.h"
#include "components/content_settings/core/common/pref_names.h"
#include "components/permissions/chooser_context_base.h"
+#include "components/permissions/permission_decision_auto_blocker.h"
#include "components/permissions/permission_manager.h"
#include "components/permissions/permission_result.h"
+#include "components/permissions/permission_util.h"
+#include "components/permissions/permissions_client.h"
#include "components/prefs/pref_service.h"
#include "components/subresource_filter/core/browser/subresource_filter_features.h"
#include "components/url_formatter/url_formatter.h"
@@ -108,6 +111,7 @@ const ContentSettingsTypeNameEntry kContentSettingsTypeGroupNames[] = {
{ContentSettingsType::BLUETOOTH_GUARD, "bluetooth-devices"},
{ContentSettingsType::BLUETOOTH_CHOOSER_DATA,
kBluetoothChooserDataGroupType},
+ {ContentSettingsType::WINDOW_PLACEMENT, "window-placement"},
// Add new content settings here if a corresponding Javascript string
// representation for it is not required. Note some exceptions do have UI in
@@ -140,6 +144,7 @@ const ContentSettingsTypeNameEntry kContentSettingsTypeGroupNames[] = {
{ContentSettingsType::SAFE_BROWSING_URL_CHECK_DATA, nullptr},
{ContentSettingsType::NATIVE_FILE_SYSTEM_READ_GUARD, nullptr},
{ContentSettingsType::STORAGE_ACCESS, nullptr},
+ {ContentSettingsType::CAMERA_PAN_TILT_ZOOM, nullptr},
};
static_assert(base::size(kContentSettingsTypeGroupNames) ==
// ContentSettingsType starts at -1, so add 1 here.
@@ -349,7 +354,7 @@ PolicyIndicatorType GetPolicyIndicatorFromSettingSource(
case content_settings::SETTING_SOURCE_EXTENSION:
return PolicyIndicatorType::kExtension;
case content_settings::SETTING_SOURCE_USER:
- case content_settings::SETTING_SOURCE_WHITELIST:
+ case content_settings::SETTING_SOURCE_ALLOWLIST:
case content_settings::SETTING_SOURCE_NONE:
return PolicyIndicatorType::kNone;
case content_settings::SETTING_SOURCE_INSTALLED_WEBAPP:
@@ -521,38 +526,66 @@ std::string GetDisplayNameForPattern(
return pattern.ToString();
}
-void GetExceptionsFromHostContentSettingsMap(
- const HostContentSettingsMap* map,
+void GetExceptionsForContentType(
ContentSettingsType type,
+ Profile* profile,
const extensions::ExtensionRegistry* extension_registry,
content::WebUI* web_ui,
bool incognito,
- const std::string* filter,
base::ListValue* exceptions) {
- ContentSettingsForOneType entries;
- map->GetSettingsForOneType(type, std::string(), &entries);
+ ContentSettingsForOneType all_settings;
+ HostContentSettingsMap* map =
+ HostContentSettingsMapFactory::GetForProfile(profile);
+
+ map->GetSettingsForOneType(type, std::string(), &all_settings);
+
// Group settings by primary_pattern.
AllPatternsSettings all_patterns_settings;
- for (auto i = entries.begin(); i != entries.end(); ++i) {
+ for (const auto& setting : all_settings) {
// Don't add default settings.
- if (i->primary_pattern == ContentSettingsPattern::Wildcard() &&
- i->secondary_pattern == ContentSettingsPattern::Wildcard() &&
- i->source !=
+ if (setting.primary_pattern == ContentSettingsPattern::Wildcard() &&
+ setting.secondary_pattern == ContentSettingsPattern::Wildcard() &&
+ setting.source !=
SiteSettingSourceToString(SiteSettingSource::kPreference)) {
continue;
}
// Off-the-record HostContentSettingsMap contains incognito content settings
- // as well as normal content settings. Here, we use the incongnito settings
+ // as well as normal content settings. Here, we use the incognito settings
// only.
- if (map->IsOffTheRecord() && !i->incognito)
+ if (map->IsOffTheRecord() && !setting.incognito)
continue;
- if (filter && i->primary_pattern.ToString() != *filter)
+ all_patterns_settings[std::make_pair(
+ setting.primary_pattern, setting.source)][setting.secondary_pattern] =
+ setting.GetContentSetting();
+ }
+
+ ContentSettingsForOneType embargo_settings;
+ map->GetSettingsForOneType(ContentSettingsType::PERMISSION_AUTOBLOCKER_DATA,
+ std::string(), &embargo_settings);
+
+ permissions::PermissionDecisionAutoBlocker* auto_blocker =
+ permissions::PermissionsClient::Get()->GetPermissionDecisionAutoBlocker(
+ profile);
+
+ for (const auto& setting : embargo_settings) {
+ // Off-the-record HostContentSettingsMap contains incognito content
+ // settings as well as normal content settings. Here, we use the
+ // incognito settings only.
+ if (map->IsOffTheRecord() && !setting.incognito)
continue;
- all_patterns_settings[std::make_pair(i->primary_pattern, i->source)]
- [i->secondary_pattern] = i->GetContentSetting();
+ if (!permissions::PermissionUtil::IsPermission(type))
+ continue;
+
+ if (auto_blocker
+ ->GetEmbargoResult(GURL(setting.primary_pattern.ToString()), type)
+ .content_setting == CONTENT_SETTING_BLOCK) {
+ all_patterns_settings[std::make_pair(
+ setting.primary_pattern, setting.source)][setting.secondary_pattern] =
+ CONTENT_SETTING_BLOCK;
+ }
}
// Keep the exceptions sorted by provider so they will be displayed in
@@ -814,8 +847,8 @@ base::Value GetChooserExceptionListFromProfile(
std::vector<std::unique_ptr<permissions::ChooserContextBase::Object>>
objects = chooser_context->GetAllGrantedObjects();
- if (profile->HasOffTheRecordProfile()) {
- Profile* incognito_profile = profile->GetOffTheRecordProfile();
+ if (profile->HasPrimaryOTRProfile()) {
+ Profile* incognito_profile = profile->GetPrimaryOTRProfile();
permissions::ChooserContextBase* incognito_chooser_context =
chooser_type.get_context(incognito_profile);
std::vector<std::unique_ptr<permissions::ChooserContextBase::Object>>
@@ -894,10 +927,9 @@ CookieControlsManagedState GetCookieControlsManagedState(Profile* profile) {
// kCookieControlsMode == kOn should imply block_third_party is on.
auto control_mode = static_cast<content_settings::CookieControlsMode>(
profile->GetPrefs()->GetInteger(prefs::kCookieControlsMode));
- DCHECK(control_mode != content_settings::CookieControlsMode::kOn ||
- block_third_party_on)
- << "kCookieControlsMode == kOn should imply "
- << "kBlockThirdPartyCookies is true";
+ DCHECK(control_mode !=
+ content_settings::CookieControlsMode::kBlockThirdParty ||
+ block_third_party_on);
// Get indicators representing each settings source. These may or may not
// be used depending on the determined managed state.
diff --git a/chromium/chrome/browser/ui/webui/site_settings_helper.h b/chromium/chrome/browser/ui/webui/settings/site_settings_helper.h
index 07c890235a9..b018f7c63a3 100644
--- a/chromium/chrome/browser/ui/webui/site_settings_helper.h
+++ b/chromium/chrome/browser/ui/webui/settings/site_settings_helper.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_UI_WEBUI_SITE_SETTINGS_HELPER_H_
-#define CHROME_BROWSER_UI_WEBUI_SITE_SETTINGS_HELPER_H_
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_SITE_SETTINGS_HELPER_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_SITE_SETTINGS_HELPER_H_
#include <map>
#include <memory>
@@ -148,16 +148,13 @@ void AddExceptionForHostedApp(const std::string& url_pattern,
const extensions::Extension& app,
base::ListValue* exceptions);
-// Fills in |exceptions| with Values for the given |type| from |map|.
-// If |filter| is not null then only exceptions with matching primary patterns
-// will be returned.
-void GetExceptionsFromHostContentSettingsMap(
- const HostContentSettingsMap* map,
+// Fills in |exceptions| with Values for the given |type| from |profile|.
+void GetExceptionsForContentType(
ContentSettingsType type,
+ Profile* profile,
const extensions::ExtensionRegistry* extension_registry,
content::WebUI* web_ui,
bool incognito,
- const std::string* filter,
base::ListValue* exceptions);
// Fills in object saying what the current settings is for the category (such as
@@ -240,4 +237,4 @@ PolicyIndicatorType GetPolicyIndicatorFromPref(
} // namespace site_settings
-#endif // CHROME_BROWSER_UI_WEBUI_SITE_SETTINGS_HELPER_H_
+#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_SITE_SETTINGS_HELPER_H_
diff --git a/chromium/chrome/browser/ui/webui/site_settings_helper_unittest.cc b/chromium/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc
index c53099d4123..2a08d0797ee 100644
--- a/chromium/chrome/browser/ui/webui/site_settings_helper_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc
@@ -2,13 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "chrome/browser/ui/webui/site_settings_helper.h"
+#include "chrome/browser/ui/webui/settings/site_settings_helper.h"
#include "base/bind_helpers.h"
#include "base/guid.h"
#include "base/json/json_reader.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "chrome/browser/permissions/permission_decision_auto_blocker_factory.h"
#include "chrome/browser/usb/usb_chooser_context.h"
#include "chrome/browser/usb/usb_chooser_context_factory.h"
#include "chrome/common/pref_names.h"
@@ -20,6 +21,7 @@
#include "components/content_settings/core/test/content_settings_mock_provider.h"
#include "components/content_settings/core/test/content_settings_test_utils.h"
#include "components/permissions/chooser_context_base.h"
+#include "components/permissions/permission_decision_auto_blocker.h"
#include "components/prefs/pref_service.h"
#include "components/sync_preferences/testing_pref_service_syncable.h"
#include "content/public/test/browser_task_environment.h"
@@ -33,6 +35,10 @@ namespace site_settings {
namespace {
constexpr ContentSettingsType kContentType = ContentSettingsType::GEOLOCATION;
+constexpr ContentSettingsType kContentTypeNotifications =
+ ContentSettingsType::NOTIFICATIONS;
+constexpr ContentSettingsType kContentTypeCookies =
+ ContentSettingsType::COOKIES;
}
class SiteSettingsHelperTest : public testing::Test {
@@ -69,6 +75,191 @@ class SiteSettingsHelperTest : public testing::Test {
content::BrowserTaskEnvironment task_environment_;
};
+TEST_F(SiteSettingsHelperTest, ExceptionListShowsIncognitoEmbargoed) {
+ TestingProfile profile;
+ constexpr char kOriginToBlock[] = "https://www.blocked.com:443";
+ constexpr char kOriginToEmbargo[] = "https://embargoed.co.uk:443";
+ constexpr char kOriginToEmbargoIncognito[] =
+ "https://embargoed.incognito.co.uk:443";
+
+ // Add an origin under embargo for non incognito profile.
+ {
+ auto* auto_blocker =
+ PermissionDecisionAutoBlockerFactory::GetForProfile(&profile);
+ for (size_t i = 0; i < 3; ++i) {
+ auto_blocker->RecordDismissAndEmbargo(GURL(kOriginToEmbargo),
+ kContentTypeNotifications, false);
+ }
+
+ // Check that origin is under embargo.
+ ASSERT_EQ(CONTENT_SETTING_BLOCK,
+ auto_blocker
+ ->GetEmbargoResult(GURL(kOriginToEmbargo),
+ kContentTypeNotifications)
+ .content_setting);
+ }
+
+ // Check there is 1 embargoed origin for a non-incognito profile.
+ {
+ base::ListValue exceptions;
+ site_settings::GetExceptionsForContentType(
+ kContentTypeNotifications, &profile, /*extension_registry=*/nullptr,
+ /*web_ui=*/nullptr,
+ /*incognito=*/false, &exceptions);
+ ASSERT_EQ(1U, exceptions.GetSize());
+ }
+
+ TestingProfile* incognito_profile =
+ TestingProfile::Builder().BuildIncognito(&profile);
+
+ // Check there are no blocked origins for an incognito profile.
+ {
+ base::ListValue exceptions;
+ site_settings::GetExceptionsForContentType(kContentTypeNotifications,
+ incognito_profile,
+ /*extension_registry=*/nullptr,
+ /*web_ui=*/nullptr,
+ /*incognito=*/true, &exceptions);
+ ASSERT_EQ(0U, exceptions.GetSize());
+ }
+
+ {
+ auto* incognito_map =
+ HostContentSettingsMapFactory::GetForProfile(incognito_profile);
+ incognito_map->SetContentSettingDefaultScope(
+ GURL(kOriginToBlock), GURL(kOriginToBlock), kContentTypeNotifications,
+ std::string(), CONTENT_SETTING_BLOCK);
+ }
+
+ // Check there is only 1 blocked origin for an incognito profile.
+ {
+ base::ListValue exceptions;
+ site_settings::GetExceptionsForContentType(kContentTypeNotifications,
+ incognito_profile,
+ /*extension_registry=*/nullptr,
+ /*web_ui=*/nullptr,
+ /*incognito=*/true, &exceptions);
+ // The exceptions size should be 1 because previously embargoed origin
+ // was for a non-incognito profile.
+ ASSERT_EQ(1U, exceptions.GetSize());
+ }
+
+ // Add an origin under embargo for incognito profile.
+ {
+ auto* incognito_auto_blocker =
+ PermissionDecisionAutoBlockerFactory::GetForProfile(incognito_profile);
+ for (size_t i = 0; i < 3; ++i) {
+ incognito_auto_blocker->RecordDismissAndEmbargo(
+ GURL(kOriginToEmbargoIncognito), kContentTypeNotifications, false);
+ }
+ EXPECT_EQ(CONTENT_SETTING_BLOCK,
+ incognito_auto_blocker
+ ->GetEmbargoResult(GURL(kOriginToEmbargoIncognito),
+ kContentTypeNotifications)
+ .content_setting);
+ }
+
+ // Check there are 2 blocked or embargoed origins for an incognito profile.
+ {
+ base::ListValue exceptions;
+ site_settings::GetExceptionsForContentType(kContentTypeNotifications,
+ incognito_profile,
+ /*extension_registry=*/nullptr,
+ /*web_ui=*/nullptr,
+ /*incognito=*/true, &exceptions);
+ ASSERT_EQ(2U, exceptions.GetSize());
+ }
+}
+
+TEST_F(SiteSettingsHelperTest, ExceptionListShowsEmbargoed) {
+ TestingProfile profile;
+ constexpr char kOriginToBlock[] = "https://www.blocked.com:443";
+ constexpr char kOriginToEmbargo[] = "https://embargoed.co.uk:443";
+
+ // Check there is no blocked origins.
+ {
+ base::ListValue exceptions;
+ site_settings::GetExceptionsForContentType(
+ kContentTypeNotifications, &profile, /*extension_registry=*/nullptr,
+ /*web_ui=*/nullptr,
+ /*incognito=*/false, &exceptions);
+ ASSERT_EQ(0U, exceptions.GetSize());
+ }
+
+ auto* map = HostContentSettingsMapFactory::GetForProfile(&profile);
+ map->SetContentSettingDefaultScope(GURL(kOriginToBlock), GURL(kOriginToBlock),
+ kContentTypeNotifications, std::string(),
+ CONTENT_SETTING_BLOCK);
+ {
+ // Check there is 1 blocked origin.
+ base::ListValue exceptions;
+ site_settings::GetExceptionsForContentType(
+ kContentTypeNotifications, &profile, /*extension_registry=*/nullptr,
+ /*web_ui=*/nullptr,
+ /*incognito=*/false, &exceptions);
+ ASSERT_EQ(1U, exceptions.GetSize());
+ }
+
+ // Add an origin under embargo.
+ auto* auto_blocker =
+ PermissionDecisionAutoBlockerFactory::GetForProfile(&profile);
+ const GURL origin_to_embargo(kOriginToEmbargo);
+ for (size_t i = 0; i < 3; ++i) {
+ auto_blocker->RecordDismissAndEmbargo(origin_to_embargo,
+ kContentTypeNotifications, false);
+ }
+
+ // Check that origin is under embargo.
+ EXPECT_EQ(CONTENT_SETTING_BLOCK,
+ auto_blocker
+ ->GetEmbargoResult(origin_to_embargo, kContentTypeNotifications)
+ .content_setting);
+
+ // Check there are 2 blocked origins.
+ {
+ base::ListValue exceptions;
+ site_settings::GetExceptionsForContentType(
+ kContentTypeNotifications, &profile, /*extension_registry=*/nullptr,
+ /*web_ui=*/nullptr,
+ /*incognito=*/false, &exceptions);
+ // The size should be 2, 1st is blocked origin, 2nd is embargoed origin.
+ ASSERT_EQ(2U, exceptions.GetSize());
+
+ // Fetch and check the first origin.
+ const base::DictionaryValue* dictionary;
+ std::string primary_pattern, display_name;
+ ASSERT_TRUE(exceptions.GetDictionary(0, &dictionary));
+ ASSERT_TRUE(
+ dictionary->GetString(site_settings::kOrigin, &primary_pattern));
+ ASSERT_TRUE(
+ dictionary->GetString(site_settings::kDisplayName, &display_name));
+
+ EXPECT_EQ(kOriginToBlock, primary_pattern);
+ EXPECT_EQ(kOriginToBlock, display_name);
+
+ // Fetch and check the second origin.
+ ASSERT_TRUE(exceptions.GetDictionary(1, &dictionary));
+ ASSERT_TRUE(
+ dictionary->GetString(site_settings::kOrigin, &primary_pattern));
+ ASSERT_TRUE(
+ dictionary->GetString(site_settings::kDisplayName, &display_name));
+
+ EXPECT_EQ(kOriginToEmbargo, primary_pattern);
+ EXPECT_EQ(kOriginToEmbargo, display_name);
+ }
+
+ {
+ // Non-permission types should not DCHECK when there is autoblocker data
+ // present.
+ base::ListValue exceptions;
+ site_settings::GetExceptionsForContentType(
+ kContentTypeCookies, &profile, /*extension_registry=*/nullptr,
+ /*web_ui=*/nullptr,
+ /*incognito=*/false, &exceptions);
+ ASSERT_EQ(0U, exceptions.GetSize());
+ }
+}
+
TEST_F(SiteSettingsHelperTest, CheckExceptionOrder) {
TestingProfile profile;
HostContentSettingsMap* map =
@@ -76,9 +267,10 @@ TEST_F(SiteSettingsHelperTest, CheckExceptionOrder) {
base::ListValue exceptions;
// Check that the initial state of the map is empty.
- GetExceptionsFromHostContentSettingsMap(
- map, kContentType, /*extension_registry=*/nullptr, /*web_ui=*/nullptr,
- /*incognito=*/false, /*filter=*/nullptr, &exceptions);
+ GetExceptionsForContentType(kContentType, &profile,
+ /*extension_registry=*/nullptr,
+ /*web_ui=*/nullptr,
+ /*incognito=*/false, &exceptions);
EXPECT_EQ(0u, exceptions.GetSize());
map->SetDefaultContentSetting(kContentType, CONTENT_SETTING_ALLOW);
@@ -114,9 +306,10 @@ TEST_F(SiteSettingsHelperTest, CheckExceptionOrder) {
HostContentSettingsMap::CUSTOM_EXTENSION_PROVIDER);
exceptions.Clear();
- GetExceptionsFromHostContentSettingsMap(
- map, kContentType, /*extension_registry=*/nullptr, /*web_ui=*/nullptr,
- /*incognito=*/false, /*filter=*/nullptr, &exceptions);
+ GetExceptionsForContentType(kContentType, &profile,
+ /*extension_registry=*/nullptr,
+ /*web_ui=*/nullptr,
+ /*incognito=*/false, &exceptions);
EXPECT_EQ(5u, exceptions.GetSize());
diff --git a/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc b/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc
index 5db2926d98f..948ce452f56 100644
--- a/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc
+++ b/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc
@@ -16,6 +16,7 @@
#include "base/no_destructor.h"
#include "base/observer_list.h"
#include "base/strings/utf_string_conversions.h"
+#include "base/supports_user_data.h"
#include "base/threading/sequenced_task_runner_handle.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/policy/chrome_policy_conversions_client.h"
@@ -49,6 +50,9 @@
namespace {
+const void* const kCurrentDiceTurnSyncOnHelperKey =
+ &kCurrentDiceTurnSyncOnHelperKey;
+
// A helper class to watch profile lifetime.
class DiceTurnSyncOnHelperShutdownNotifierFactory
: public BrowserContextKeyedServiceShutdownNotifierFactory {
@@ -134,6 +138,38 @@ class TokensLoadedCallbackRunner : public signin::IdentityManager::Observer {
DISALLOW_COPY_AND_ASSIGN(TokensLoadedCallbackRunner);
};
+struct CurrentDiceTurnSyncOnHelperUserData
+ : public base::SupportsUserData::Data {
+ DiceTurnSyncOnHelper* current_helper = nullptr;
+};
+
+DiceTurnSyncOnHelper* GetCurrentDiceTurnSyncOnHelper(Profile* profile) {
+ base::SupportsUserData::Data* data =
+ profile->GetUserData(kCurrentDiceTurnSyncOnHelperKey);
+ if (!data)
+ return nullptr;
+ CurrentDiceTurnSyncOnHelperUserData* wrapper =
+ static_cast<CurrentDiceTurnSyncOnHelperUserData*>(data);
+ DiceTurnSyncOnHelper* helper = wrapper->current_helper;
+ DCHECK(helper);
+ return helper;
+}
+
+void SetCurrentDiceTurnSyncOnHelper(Profile* profile,
+ DiceTurnSyncOnHelper* helper) {
+ if (!helper) {
+ DCHECK(profile->GetUserData(kCurrentDiceTurnSyncOnHelperKey));
+ profile->RemoveUserData(kCurrentDiceTurnSyncOnHelperKey);
+ return;
+ }
+
+ DCHECK(!profile->GetUserData(kCurrentDiceTurnSyncOnHelperKey));
+ std::unique_ptr<CurrentDiceTurnSyncOnHelperUserData> wrapper =
+ std::make_unique<CurrentDiceTurnSyncOnHelperUserData>();
+ wrapper->current_helper = helper;
+ profile->SetUserData(kCurrentDiceTurnSyncOnHelperKey, std::move(wrapper));
+}
+
} // namespace
DiceTurnSyncOnHelper::DiceTurnSyncOnHelper(
@@ -164,6 +200,9 @@ DiceTurnSyncOnHelper::DiceTurnSyncOnHelper(
// Should not start syncing if the profile is already authenticated
DCHECK(!identity_manager_->HasPrimaryAccount());
+ // Cancel any existing helper.
+ AttachToProfile();
+
if (account_info_.gaia.empty() || account_info_.email.empty()) {
LOG(ERROR) << "Cannot turn Sync On for invalid account.";
base::SequencedTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this);
@@ -217,6 +256,8 @@ DiceTurnSyncOnHelper::DiceTurnSyncOnHelper(
base::OnceClosure()) {}
DiceTurnSyncOnHelper::~DiceTurnSyncOnHelper() {
+ DCHECK_EQ(this, GetCurrentDiceTurnSyncOnHelper(profile_));
+ SetCurrentDiceTurnSyncOnHelper(profile_, nullptr);
}
bool DiceTurnSyncOnHelper::HasCanOfferSigninError() {
@@ -540,7 +581,13 @@ void DiceTurnSyncOnHelper::FinishSyncSetupAndDelete(
void DiceTurnSyncOnHelper::SwitchToProfile(Profile* new_profile) {
DCHECK(!sync_blocker_);
DCHECK(!sync_startup_tracker_);
+
+ policy::UserPolicySigninServiceFactory::GetForProfile(profile_)
+ ->ShutdownUserCloudPolicyManager();
+ SetCurrentDiceTurnSyncOnHelper(profile_, nullptr); // Detach from old profile
profile_ = new_profile;
+ AttachToProfile();
+
identity_manager_ = IdentityManagerFactory::GetForProfile(profile_);
shutdown_subscription_ =
DiceTurnSyncOnHelperShutdownNotifierFactory::GetInstance()
@@ -553,7 +600,25 @@ void DiceTurnSyncOnHelper::SwitchToProfile(Profile* new_profile) {
signin_aborted_mode_ = SigninAbortedMode::REMOVE_ACCOUNT;
}
+void DiceTurnSyncOnHelper::AttachToProfile() {
+ // Delete any current helper.
+ DiceTurnSyncOnHelper* current_helper =
+ GetCurrentDiceTurnSyncOnHelper(profile_);
+ if (current_helper) {
+ // If the existing flow was using the same account, keep the account.
+ if (current_helper->account_info_.account_id == account_info_.account_id)
+ current_helper->signin_aborted_mode_ = SigninAbortedMode::KEEP_ACCOUNT;
+ current_helper->AbortAndDelete();
+ }
+ DCHECK(!GetCurrentDiceTurnSyncOnHelper(profile_));
+
+ // Set this as the current helper.
+ SetCurrentDiceTurnSyncOnHelper(profile_, this);
+}
+
void DiceTurnSyncOnHelper::AbortAndDelete() {
+ policy::UserPolicySigninServiceFactory::GetForProfile(profile_)
+ ->ShutdownUserCloudPolicyManager();
if (signin_aborted_mode_ == SigninAbortedMode::REMOVE_ACCOUNT) {
// Revoke the token, and the AccountReconcilor and/or the Gaia server will
// take care of invalidating the cookies.
@@ -563,5 +628,6 @@ void DiceTurnSyncOnHelper::AbortAndDelete() {
signin_metrics::SourceForRefreshTokenOperation::
kDiceTurnOnSyncHelper_Abort);
}
+
delete this;
}
diff --git a/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h b/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h
index 66f5dce0a9e..58c0074683d 100644
--- a/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h
+++ b/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h
@@ -198,6 +198,10 @@ class DiceTurnSyncOnHelper
// Switch to a new profile after exporting the token.
void SwitchToProfile(Profile* new_profile);
+ // Only one DiceTurnSyncOnHelper can be attached per profile. This deletes
+ // any other helper attached to the profile.
+ void AttachToProfile();
+
// Aborts the flow and deletes this object.
void AbortAndDelete();
diff --git a/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_delegate_impl.cc b/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_delegate_impl.cc
index 9b652b7adea..25040e2f8dd 100644
--- a/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_delegate_impl.cc
+++ b/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_delegate_impl.cc
@@ -5,9 +5,10 @@
#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_delegate_impl.h"
#include "base/bind.h"
-#include "base/logging.h"
+#include "base/check.h"
#include "base/metrics/user_metrics.h"
#include "base/metrics/user_metrics_action.h"
+#include "base/notreached.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/profiles/profile_window.h"
#include "chrome/browser/ui/browser.h"
diff --git a/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc b/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
index 6149a51ee80..0a6f462ee69 100644
--- a/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
@@ -141,6 +141,7 @@ class FakeUserPolicySigninService : public policy::UserPolicySigninService {
account_id_ = account_id;
email_ = email;
}
+ void set_is_hanging(bool is_hanging) { is_hanging_ = is_hanging; }
// policy::UserPolicySigninService:
void RegisterForPolicyWithAccountId(
@@ -149,7 +150,8 @@ class FakeUserPolicySigninService : public policy::UserPolicySigninService {
PolicyRegistrationCallback callback) override {
EXPECT_EQ(email_, username);
EXPECT_EQ(account_id_, account_id);
- std::move(callback).Run(dm_token_, client_id_);
+ if (!is_hanging_)
+ std::move(callback).Run(dm_token_, client_id_);
}
// policy::UserPolicySigninServiceBase:
@@ -159,7 +161,8 @@ class FakeUserPolicySigninService : public policy::UserPolicySigninService {
const std::string& client_id,
scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory,
PolicyFetchCallback callback) override {
- std::move(callback).Run(true);
+ if (!is_hanging_)
+ std::move(callback).Run(true);
}
private:
@@ -167,6 +170,7 @@ class FakeUserPolicySigninService : public policy::UserPolicySigninService {
std::string client_id_;
CoreAccountId account_id_;
std::string email_;
+ bool is_hanging_ = false;
};
std::unique_ptr<KeyedService> BuildMockSyncService(
@@ -220,7 +224,7 @@ class DiceTurnSyncOnHelperTest : public testing::Test {
}
~DiceTurnSyncOnHelperTest() override {
- DCHECK(delegate_destroyed_);
+ DCHECK_GT(delegate_destroyed_, 0);
// Destroy extra profiles.
TestingBrowserProcess::GetGlobal()->SetProfileManager(nullptr);
base::RunLoop().RunUntilIdle();
@@ -239,7 +243,7 @@ class DiceTurnSyncOnHelperTest : public testing::Test {
return user_policy_signin_service_;
}
const std::string initial_device_id() { return initial_device_id_; }
- bool delegate_destroyed() const { return delegate_destroyed_; }
+ int delegate_destroyed() const { return delegate_destroyed_; }
std::string enterprise_confirmation_email() const {
return enterprise_confirmation_email_;
}
@@ -379,7 +383,7 @@ class DiceTurnSyncOnHelperTest : public testing::Test {
switched_to_new_profile_ = true;
}
- void OnDelegateDestroyed() { delegate_destroyed_ = true; }
+ void OnDelegateDestroyed() { ++delegate_destroyed_; }
protected:
// Delegate behavior.
@@ -414,7 +418,7 @@ class DiceTurnSyncOnHelperTest : public testing::Test {
testing::NiceMock<syncer::SyncUserSettingsMock> mock_sync_settings_;
// State of the delegate calls.
- bool delegate_destroyed_ = false;
+ int delegate_destroyed_ = 0;
std::string login_error_email_;
std::string login_error_message_;
std::string enterprise_confirmation_email_;
@@ -816,5 +820,33 @@ TEST_F(DiceTurnSyncOnHelperTest, ProfileDeletion) {
ClearProfile();
// DiceTurnSyncOnHelper was destroyed.
- EXPECT_TRUE(delegate_destroyed());
+ EXPECT_EQ(1, delegate_destroyed());
+}
+
+// Checks that an existing instance is deleted when a new one is created.
+TEST_F(DiceTurnSyncOnHelperTest, AbortExisting) {
+ // Create a first instance, stuck on policy requests.
+ user_policy_signin_service()->set_is_hanging(true);
+ CreateDiceTurnOnSyncHelper(
+ DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+ // Check that it did not complete.
+ EXPECT_FALSE(identity_manager()->HasPrimaryAccount());
+ EXPECT_TRUE(identity_manager()->HasAccountWithRefreshToken(account_id()));
+ CheckDelegateCalls();
+
+ // Create a new helper and let it complete.
+ user_policy_signin_service()->set_is_hanging(false);
+ expected_sync_confirmation_shown_ = true;
+ sync_confirmation_result_ = LoginUIService::SyncConfirmationUIClosedResult::
+ SYNC_WITH_DEFAULT_SETTINGS;
+ SetExpectationsForSyncStartupCompleted();
+ CreateDiceTurnOnSyncHelper(
+ DiceTurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT);
+ // Check that it completed.
+ CheckDelegateCalls();
+ EXPECT_TRUE(identity_manager()->HasPrimaryAccount());
+ // The token is still there, even though the first helper had REMOVE_ACCOUNT.
+ EXPECT_TRUE(identity_manager()->HasAccountWithRefreshToken(account_id()));
+ // Both delegates were destroyed.
+ EXPECT_EQ(2, delegate_destroyed());
}
diff --git a/chromium/chrome/browser/ui/webui/signin/inline_login_handler.cc b/chromium/chrome/browser/ui/webui/signin/inline_login_handler.cc
index 344c6adf263..4d138271eb6 100644
--- a/chromium/chrome/browser/ui/webui/signin/inline_login_handler.cc
+++ b/chromium/chrome/browser/ui/webui/signin/inline_login_handler.cc
@@ -86,12 +86,10 @@ void InlineLoginHandler::HandleInitializeMessage(const base::ListValue* args) {
value == "0") {
partition->ClearData(
content::StoragePartition::REMOVE_DATA_MASK_ALL,
- content::StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL,
- GURL(),
- base::Time(),
- base::Time::Max(),
- base::Bind(&InlineLoginHandler::ContinueHandleInitializeMessage,
- weak_ptr_factory_.GetWeakPtr()));
+ content::StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL, GURL(),
+ base::Time(), base::Time::Max(),
+ base::BindOnce(&InlineLoginHandler::ContinueHandleInitializeMessage,
+ weak_ptr_factory_.GetWeakPtr()));
} else {
ContinueHandleInitializeMessage();
}
diff --git a/chromium/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc b/chromium/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc
index 5033bff5a8d..1eee7735f97 100644
--- a/chromium/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc
+++ b/chromium/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc
@@ -15,12 +15,13 @@
#include "base/values.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part.h"
+#include "chrome/browser/chromeos/child_accounts/secondary_account_consent_logger.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/signin/chrome_device_id_helper.h"
#include "chrome/browser/signin/identity_manager_factory.h"
-#include "chrome/browser/supervised_user/child_accounts/secondary_account_consent_logger.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/webui/signin/inline_login_handler.h"
+#include "chrome/browser/ui/webui/signin/inline_login_handler_dialog_chromeos.h"
#include "chromeos/components/account_manager/account_manager.h"
#include "chromeos/components/account_manager/account_manager_factory.h"
#include "chromeos/constants/chromeos_features.h"
@@ -318,6 +319,9 @@ void InlineLoginHandlerChromeOS::CompleteLogin(const std::string& email,
const std::string* parentId =
edu_login_params.FindStringKey("parentObfuscatedGaiaId");
CHECK(parentId);
+ InlineLoginHandlerDialogChromeOS::UpdateEduCoexistenceFlowResult(
+ InlineLoginHandlerDialogChromeOS::EduCoexistenceFlowResult::
+ kFlowCompleted);
// ChildSigninHelper deletes itself after its work is done.
new ChildSigninHelper(
account_manager, close_dialog_closure_,
diff --git a/chromium/chrome/browser/ui/webui/signin/inline_login_handler_dialog_chromeos.cc b/chromium/chrome/browser/ui/webui/signin/inline_login_handler_dialog_chromeos.cc
index f848bc57ffe..58d3c73da50 100644
--- a/chromium/chrome/browser/ui/webui/signin/inline_login_handler_dialog_chromeos.cc
+++ b/chromium/chrome/browser/ui/webui/signin/inline_login_handler_dialog_chromeos.cc
@@ -9,9 +9,10 @@
#include "ash/public/cpp/window_backdrop.h"
#include "ash/public/cpp/window_properties.h"
+#include "base/check_op.h"
#include "base/json/json_writer.h"
-#include "base/logging.h"
#include "base/macros.h"
+#include "base/metrics/histogram_functions.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h"
@@ -21,6 +22,7 @@
#include "components/prefs/pref_service.h"
#include "components/session_manager/core/session_manager.h"
#include "components/web_modal/web_contents_modal_dialog_manager.h"
+#include "content/public/browser/browser_thread.h"
#include "content/public/browser/web_ui.h"
#include "google_apis/gaia/gaia_auth_util.h"
#include "net/base/url_util.h"
@@ -38,6 +40,9 @@ InlineLoginHandlerDialogChromeOS* dialog = nullptr;
constexpr int kSigninDialogWidth = 768;
constexpr int kSigninDialogHeight = 640;
+constexpr char kAccountAdditionSource[] =
+ "AccountManager.AccountAdditionSource";
+
// Keep in sync with resources/chromeos/account_manager_error.js
enum class AccountManagerErrorType {
kSecondaryAccountsDisabled = 0,
@@ -60,7 +65,8 @@ GURL GetUrlWithEmailParam(base::StringPiece url_string,
return url;
}
-GURL GetInlineLoginUrl(const std::string& email) {
+GURL GetInlineLoginUrl(const std::string& email,
+ const InlineLoginHandlerDialogChromeOS::Source& source) {
if (IsDeviceAccountEmail(email)) {
// It's a device account re-auth.
return GetUrlWithEmailParam(chrome::kChromeUIChromeSigninURL, email);
@@ -76,7 +82,8 @@ GURL GetInlineLoginUrl(const std::string& email) {
return GetUrlWithEmailParam(chrome::kChromeUIChromeSigninURL, email);
}
// User type is Child.
- if (!features::IsEduCoexistenceEnabled()) {
+ if (!features::IsEduCoexistenceEnabled() ||
+ source == InlineLoginHandlerDialogChromeOS::Source::kArc) {
return GURL(chrome::kChromeUIAccountManagerErrorURL);
}
DCHECK_EQ(std::string(chrome::kChromeUIChromeSigninURL).back(), '/');
@@ -91,6 +98,7 @@ GURL GetInlineLoginUrl(const std::string& email) {
// static
void InlineLoginHandlerDialogChromeOS::Show(const std::string& email,
const Source& source) {
+ base::UmaHistogramEnumeration(kAccountAdditionSource, source);
// If the dialog was triggered as a response to background request, it could
// get displayed on the lock screen. In this case it is safe to ignore it,
// since in this case user will get it again after a request to Google
@@ -104,8 +112,8 @@ void InlineLoginHandlerDialogChromeOS::Show(const std::string& email,
}
// Will be deleted by |SystemWebDialogDelegate::OnDialogClosed|.
- dialog =
- new InlineLoginHandlerDialogChromeOS(GetInlineLoginUrl(email), source);
+ dialog = new InlineLoginHandlerDialogChromeOS(
+ GetInlineLoginUrl(email, source), source);
dialog->ShowSystemDialog();
// TODO(crbug.com/1016828): Remove/update this after the dialog behavior on
@@ -114,6 +122,18 @@ void InlineLoginHandlerDialogChromeOS::Show(const std::string& email,
->SetBackdropType(ash::WindowBackdrop::BackdropType::kSemiOpaque);
}
+void InlineLoginHandlerDialogChromeOS::Show(const Source& source) {
+ Show(/* email= */ std::string(), source);
+}
+
+// static
+void InlineLoginHandlerDialogChromeOS::UpdateEduCoexistenceFlowResult(
+ EduCoexistenceFlowResult result) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ if (dialog)
+ dialog->SetEduCoexistenceFlowResult(result);
+}
+
void InlineLoginHandlerDialogChromeOS::AdjustWidgetInitParams(
views::Widget::InitParams* params) {
params->z_order = ui::ZOrderLevel::kNormal;
@@ -143,6 +163,11 @@ void InlineLoginHandlerDialogChromeOS::AddObserver(
void InlineLoginHandlerDialogChromeOS::RemoveObserver(
web_modal::ModalDialogHostObserver* observer) {}
+void InlineLoginHandlerDialogChromeOS::SetEduCoexistenceFlowResult(
+ EduCoexistenceFlowResult result) {
+ edu_coexistence_flow_result_ = result;
+}
+
InlineLoginHandlerDialogChromeOS::InlineLoginHandlerDialogChromeOS(
const GURL& url,
const Source& source)
@@ -199,4 +224,14 @@ void InlineLoginHandlerDialogChromeOS::OnDialogShown(content::WebUI* webui) {
->SetDelegate(&delegate_);
}
+void InlineLoginHandlerDialogChromeOS::OnDialogClosed(
+ const std::string& json_retval) {
+ if (ProfileManager::GetActiveUserProfile()->IsChild()) {
+ DCHECK(edu_coexistence_flow_result_.has_value());
+ base::UmaHistogramEnumeration("AccountManager.EduCoexistence.FlowResult",
+ edu_coexistence_flow_result_.value());
+ }
+ SystemWebDialogDelegate::OnDialogClosed(json_retval);
+}
+
} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/signin/inline_login_handler_dialog_chromeos.h b/chromium/chrome/browser/ui/webui/signin/inline_login_handler_dialog_chromeos.h
index 5d71fa7379d..3f1eed30662 100644
--- a/chromium/chrome/browser/ui/webui/signin/inline_login_handler_dialog_chromeos.h
+++ b/chromium/chrome/browser/ui/webui/signin/inline_login_handler_dialog_chromeos.h
@@ -8,6 +8,7 @@
#include <string>
#include "base/macros.h"
+#include "base/optional.h"
#include "chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h"
#include "chrome/browser/ui/webui/signin/inline_login_handler_modal_delegate.h"
#include "components/web_modal/web_contents_modal_dialog_host.h"
@@ -23,13 +24,57 @@ class InlineLoginHandlerDialogChromeOS
: public SystemWebDialogDelegate,
public web_modal::WebContentsModalDialogHost {
public:
- enum class Source { kChrome = 0, kArc };
+ // The source UX surface used for launching the account addition /
+ // re-authentication dialog. This should be as specific as possible.
+ // These values are persisted to logs. Entries should not be renumbered and
+ // numeric values should never be reused.
+ // Note: Please update |AccountManagerAccountAdditionSource| in enums.xml
+ // after adding new values.
+ enum class Source : int {
+ // Settings > Add account button.
+ kSettingsAddAccountButton = 0,
+ // Settings > Sign in again button.
+ kSettingsReauthAccountButton = 1,
+ // Launched from an ARC application.
+ kArc = 2,
+ // Launched automatically from Chrome content area. As of now, this is
+ // possible only when an account requires re-authentication.
+ kContentArea = 3,
+ // Print Preview dialog.
+ kPrintPreviewDialog = 4,
+ // Account Manager migration welcome screen.
+ kAccountManagerMigrationWelcomeScreen = 5,
- // Displays the dialog. |email| is an optional parameter that if provided,
- // pre-fills the account email field in the sign-in dialog - useful for
- // account re-authentication.
- static void Show(const std::string& email = std::string(),
- const Source& source = Source::kChrome);
+ kMaxValue = kAccountManagerMigrationWelcomeScreen
+ };
+
+ // Represents the last reached step in the flow.
+ // Keep in sync with
+ // chrome/browser/resources/chromeos/edu_login/edu_login_util.js
+ // Used in UMA, do not delete or reorder values.
+ // Note: Please update enums.xml after adding new values.
+ enum class EduCoexistenceFlowResult : int {
+ kParentsListScreen = 0,
+ kParentPasswordScreen = 1,
+ kParentInfoScreen1 = 2,
+ kParentInfoScreen2 = 3,
+ kEduAccountLoginScreen = 4,
+ kFlowCompleted = 5,
+ kMaxValue = kFlowCompleted
+ };
+
+ // Displays the dialog. |email| pre-fills the account email field in the
+ // sign-in dialog - useful for account re-authentication. |source| specifies
+ // the source UX surface used for launching the dialog.
+ static void Show(const std::string& email, const Source& source);
+
+ // Displays the dialog for account addition. |source| specifies the source UX
+ // surface used for launching the dialog.
+ static void Show(const Source& source);
+
+ // Updates the value of the last reached step in 'Add Account' flow for child
+ // users. Before the dialog will close, this value will be reported to UMA.
+ static void UpdateEduCoexistenceFlowResult(EduCoexistenceFlowResult result);
// ui::SystemWebDialogDelegate overrides.
void AdjustWidgetInitParams(views::Widget::InitParams* params) override;
@@ -40,6 +85,7 @@ class InlineLoginHandlerDialogChromeOS
gfx::Point GetDialogPosition(const gfx::Size& size) override;
void AddObserver(web_modal::ModalDialogHostObserver* observer) override;
void RemoveObserver(web_modal::ModalDialogHostObserver* observer) override;
+ void SetEduCoexistenceFlowResult(EduCoexistenceFlowResult result);
protected:
InlineLoginHandlerDialogChromeOS(const GURL& url, const Source& source);
@@ -50,11 +96,13 @@ class InlineLoginHandlerDialogChromeOS
std::string GetDialogArgs() const override;
bool ShouldShowDialogTitle() const override;
void OnDialogShown(content::WebUI* webui) override;
+ void OnDialogClosed(const std::string& json_retval) override;
private:
InlineLoginHandlerModalDelegate delegate_;
const Source source_;
const GURL url_;
+ base::Optional<EduCoexistenceFlowResult> edu_coexistence_flow_result_;
DISALLOW_COPY_AND_ASSIGN(InlineLoginHandlerDialogChromeOS);
};
diff --git a/chromium/chrome/browser/ui/webui/signin/inline_login_handler_modal_delegate.cc b/chromium/chrome/browser/ui/webui/signin/inline_login_handler_modal_delegate.cc
index c231c7b408f..8acfb720159 100644
--- a/chromium/chrome/browser/ui/webui/signin/inline_login_handler_modal_delegate.cc
+++ b/chromium/chrome/browser/ui/webui/signin/inline_login_handler_modal_delegate.cc
@@ -4,7 +4,6 @@
#include "chrome/browser/ui/webui/signin/inline_login_handler_modal_delegate.h"
-#include "base/logging.h"
#include "content/public/browser/web_contents.h"
namespace chromeos {
diff --git a/chromium/chrome/browser/ui/webui/signin/inline_login_ui.cc b/chromium/chrome/browser/ui/webui/signin/inline_login_ui.cc
index 7669b6ad3ec..1e0b5bff4ad 100644
--- a/chromium/chrome/browser/ui/webui/signin/inline_login_ui.cc
+++ b/chromium/chrome/browser/ui/webui/signin/inline_login_ui.cc
@@ -17,6 +17,7 @@
#include "chrome/browser/signin/signin_promo.h"
#include "chrome/browser/ui/webui/metrics_handler.h"
#include "chrome/browser/ui/webui/test_files_request_filter.h"
+#include "chrome/browser/ui/webui/webui_util.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/browser_resources.h"
@@ -30,7 +31,6 @@
#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.h"
#include "chrome/browser/ui/webui/signin/inline_login_handler_chromeos.h"
-#include "chrome/browser/ui/webui/webui_util.h"
#include "chrome/grit/gaia_auth_host_resources.h"
#include "chrome/grit/gaia_auth_host_resources_map.h"
#include "ui/base/l10n/l10n_util.h"
@@ -52,17 +52,9 @@ void AddEduStrings(content::WebUIDataSource* source,
source->AddLocalizedString("backButton", IDS_EDU_LOGIN_BACK);
source->AddLocalizedString("nextButton", IDS_EDU_LOGIN_NEXT);
- source->AddLocalizedString("welcomeTitle", IDS_EDU_LOGIN_WELCOME_TITLE);
- source->AddLocalizedString("welcomeBody", IDS_EDU_LOGIN_WELCOME_BODY);
- source->AddLocalizedString("welcomeReauthTitle",
- IDS_EDU_LOGIN_WELCOME_REAUTH_TITLE);
- source->AddLocalizedString("welcomeReauthBody",
- IDS_EDU_LOGIN_WELCOME_REAUTH_BODY);
- source->AddLocalizedString("parentsListTitle",
- IDS_EDU_LOGIN_PARENTS_LIST_TITLE);
- source->AddLocalizedString("parentsListBody",
- IDS_EDU_LOGIN_PARENTS_LIST_BODY);
-
+ source->AddLocalizedString("parentsListTitle", IDS_EDU_LOGIN_WELCOME_TITLE_2);
+ source->AddLocalizedString("parentsListBody", IDS_EDU_LOGIN_WELCOME_BODY_2);
+ source->AddLocalizedString("reauthBody", IDS_EDU_LOGIN_WELCOME_REAUTH_BODY);
source->AddLocalizedString("parentSigninTitle",
IDS_EDU_LOGIN_PARENT_SIGNIN_TITLE);
source->AddString(
@@ -98,6 +90,9 @@ void AddEduStrings(content::WebUIDataSource* source,
base::ASCIIToUTF16(chrome::kClassroomSigninLearnMoreURL)));
source->AddLocalizedString("parentInfoResourcesAvailabilityText",
IDS_EDU_LOGIN_INFO_RESOURCES_AVAILABILITY);
+ source->AddLocalizedString("coexistenceTitle",
+ IDS_EDU_LOGIN_COEXISTENCE_TITLE);
+ source->AddLocalizedString("coexistenceBody", IDS_EDU_LOGIN_COEXISTENCE_BODY);
}
#endif // defined(OS_CHROMEOS)
@@ -118,44 +113,38 @@ content::WebUIDataSource* CreateWebUIDataSource() {
test::GetTestFilesRequestFilter());
}
- source->AddResourcePath("inline_login.css", IDR_INLINE_LOGIN_CSS);
- source->AddResourcePath("inline_login.js", IDR_INLINE_LOGIN_JS);
- source->AddResourcePath("gaia_auth_host.js", IDR_GAIA_AUTH_AUTHENTICATOR_JS);
-
+ static constexpr webui::ResourcePath kResources[] = {
+ {"inline_login.css", IDR_INLINE_LOGIN_CSS},
+ {"inline_login.js", IDR_INLINE_LOGIN_JS},
+ {"gaia_auth_host.js", IDR_GAIA_AUTH_AUTHENTICATOR_JS},
#if defined(OS_CHROMEOS)
- source->OverrideContentSecurityPolicyScriptSrc(
- "script-src chrome://resources chrome://test 'self';");
-
- source->AddResourcePath("edu", IDR_EDU_LOGIN_EDU_LOGIN_HTML);
- source->AddResourcePath("app.js", IDR_EDU_LOGIN_EDU_LOGIN_JS);
- source->AddResourcePath("edu_login_button.js",
- IDR_EDU_LOGIN_EDU_LOGIN_BUTTON_JS);
- source->AddResourcePath("edu_login_template.js",
- IDR_EDU_LOGIN_EDU_LOGIN_TEMPLATE_JS);
- source->AddResourcePath("edu_login_css.js", IDR_EDU_LOGIN_EDU_LOGIN_CSS_JS);
- source->AddResourcePath("icons.js", IDR_EDU_LOGIN_ICONS_JS);
- source->AddResourcePath("browser_proxy.js", IDR_EDU_LOGIN_BROWSER_PROXY_JS);
- source->AddResourcePath("edu_login_util.js", IDR_EDU_LOGIN_EDU_LOGIN_UTIL_JS);
- source->AddResourcePath("edu_login_welcome.js",
- IDR_EDU_LOGIN_EDU_LOGIN_WELCOME_JS);
- source->AddResourcePath("edu_login_parents.js",
- IDR_EDU_LOGIN_EDU_LOGIN_PARENTS_JS);
- source->AddResourcePath("edu_login_parent_signin.js",
- IDR_EDU_LOGIN_EDU_LOGIN_PARENT_SIGNIN_JS);
- source->AddResourcePath("edu_login_parent_info.js",
- IDR_EDU_LOGIN_EDU_LOGIN_PARENT_INFO_JS);
- source->AddResourcePath("edu_login_signin.js",
- IDR_EDU_LOGIN_EDU_LOGIN_SIGNIN_JS);
-
- source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER);
- source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER);
-
+ {"edu", IDR_EDU_LOGIN_EDU_LOGIN_HTML},
+ {"app.js", IDR_EDU_LOGIN_EDU_LOGIN_JS},
+ {"edu_login_button.js", IDR_EDU_LOGIN_EDU_LOGIN_BUTTON_JS},
+ {"edu_login_template.js", IDR_EDU_LOGIN_EDU_LOGIN_TEMPLATE_JS},
+ {"edu_login_css.js", IDR_EDU_LOGIN_EDU_LOGIN_CSS_JS},
+ {"icons.js", IDR_EDU_LOGIN_ICONS_JS},
+ {"browser_proxy.js", IDR_EDU_LOGIN_BROWSER_PROXY_JS},
+ {"edu_login_util.js", IDR_EDU_LOGIN_EDU_LOGIN_UTIL_JS},
+ {"edu_login_coexistence_info.js",
+ IDR_EDU_LOGIN_EDU_LOGIN_COEXISTENCE_INFO_JS},
+ {"edu_login_parents.js", IDR_EDU_LOGIN_EDU_LOGIN_PARENTS_JS},
+ {"edu_login_parent_signin.js", IDR_EDU_LOGIN_EDU_LOGIN_PARENT_SIGNIN_JS},
+ {"edu_login_parent_info.js", IDR_EDU_LOGIN_EDU_LOGIN_PARENT_INFO_JS},
+ {"edu_login_signin.js", IDR_EDU_LOGIN_EDU_LOGIN_SIGNIN_JS},
+ {"test_loader.js", IDR_WEBUI_JS_TEST_LOADER},
+ {"test_loader.html", IDR_WEBUI_HTML_TEST_LOADER},
#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
- source->AddResourcePath("googleg.svg",
- IDR_ACCOUNT_MANAGER_WELCOME_GOOGLE_LOGO_SVG);
+ {"googleg.svg", IDR_ACCOUNT_MANAGER_WELCOME_GOOGLE_LOGO_SVG},
#endif
- source->AddResourcePath("family_link_logo.svg", IDR_FAMILY_LINK_LOGO_SVG);
+ {"family_link_logo.svg", IDR_FAMILY_LINK_LOGO_SVG},
+#endif // defined(OS_CHROMEOS)
+ };
+ webui::AddResourcePathsBulk(source, kResources);
+#if defined(OS_CHROMEOS)
+ source->OverrideContentSecurityPolicyScriptSrc(
+ "script-src chrome://resources chrome://test 'self';");
webui::SetupWebUIDataSource(
source,
base::make_span(kGaiaAuthHostResources, kGaiaAuthHostResourcesSize),
diff --git a/chromium/chrome/browser/ui/webui/signin/login_ui_service_unittest.cc b/chromium/chrome/browser/ui/webui/signin/login_ui_service_unittest.cc
index d5a7a11066e..d4505a9c1e3 100644
--- a/chromium/chrome/browser/ui/webui/signin/login_ui_service_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/signin/login_ui_service_unittest.cc
@@ -5,7 +5,6 @@
#include "chrome/browser/ui/webui/signin/login_ui_service.h"
#include "base/compiler_specific.h"
-#include "base/logging.h"
#include "base/macros.h"
#include "base/strings/string_util.h"
#include "build/build_config.h"
diff --git a/chromium/chrome/browser/ui/webui/signin/login_ui_test_utils.cc b/chromium/chrome/browser/ui/webui/signin/login_ui_test_utils.cc
index a434306458f..fcfe998400d 100644
--- a/chromium/chrome/browser/ui/webui/signin/login_ui_test_utils.cc
+++ b/chromium/chrome/browser/ui/webui/signin/login_ui_test_utils.cc
@@ -63,9 +63,9 @@ class SignInObserver : public signin::IdentityManager::Observer {
return;
base::OneShotTimer timer;
- timer.Start(FROM_HERE, base::TimeDelta::FromSeconds(30),
- base::BindRepeating(&SignInObserver::OnTimeout,
- base::Unretained(this)));
+ timer.Start(
+ FROM_HERE, base::TimeDelta::FromSeconds(30),
+ base::BindOnce(&SignInObserver::OnTimeout, base::Unretained(this)));
running_ = true;
message_loop_runner_ = new MessageLoopRunner;
message_loop_runner_->Run();
diff --git a/chromium/chrome/browser/ui/webui/signin/profile_picker_ui.cc b/chromium/chrome/browser/ui/webui/signin/profile_picker_ui.cc
new file mode 100644
index 00000000000..1971b138752
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/signin/profile_picker_ui.cc
@@ -0,0 +1,30 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/signin/profile_picker_ui.h"
+
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/webui_url_constants.h"
+#include "chrome/grit/profile_picker_resources.h"
+#include "chrome/grit/profile_picker_resources_map.h"
+#include "content/public/browser/web_ui_data_source.h"
+
+ProfilePickerUI::ProfilePickerUI(content::WebUI* web_ui)
+ : content::WebUIController(web_ui) {
+ Profile* profile = Profile::FromWebUI(web_ui);
+ content::WebUIDataSource* html_source =
+ content::WebUIDataSource::Create(chrome::kChromeUIProfilePickerHost);
+
+ std::string generated_path =
+ "@out_folder@/gen/chrome/browser/resources/signin/profile_picker/";
+ webui::SetupWebUIDataSource(
+ html_source,
+ base::make_span(kProfilePickerResources, kProfilePickerResourcesSize),
+ generated_path, IDR_PROFILE_PICKER_PROFILE_PICKER_HTML);
+
+ content::WebUIDataSource::Add(profile, html_source);
+}
+
+ProfilePickerUI::~ProfilePickerUI() = default;
diff --git a/chromium/chrome/browser/ui/webui/signin/profile_picker_ui.h b/chromium/chrome/browser/ui/webui/signin/profile_picker_ui.h
new file mode 100644
index 00000000000..68feea31425
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/signin/profile_picker_ui.h
@@ -0,0 +1,20 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_PROFILE_PICKER_UI_H_
+#define CHROME_BROWSER_UI_WEBUI_SIGNIN_PROFILE_PICKER_UI_H_
+
+#include "content/public/browser/web_ui_controller.h"
+
+// The WebUI controller for chrome://profile-picker/.
+class ProfilePickerUI : public content::WebUIController {
+ public:
+ explicit ProfilePickerUI(content::WebUI* web_ui);
+ ~ProfilePickerUI() override;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(ProfilePickerUI);
+};
+
+#endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_PROFILE_PICKER_UI_H_
diff --git a/chromium/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.cc b/chromium/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.cc
index 47b62389943..025f5941b5c 100644
--- a/chromium/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.cc
+++ b/chromium/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.cc
@@ -6,13 +6,13 @@
#include <vector>
+#include "base/check.h"
#include "base/json/json_reader.h"
#include "base/json/json_writer.h"
-#include "base/logging.h"
#include "base/memory/ptr_util.h"
#include "base/metrics/user_metrics.h"
+#include "base/notreached.h"
#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/signin_view_controller.h"
#include "chrome/browser/ui/webui/signin/signin_email_confirmation_ui.h"
#include "chrome/common/url_constants.h"
#include "content/public/browser/host_zoom_map.h"
@@ -64,14 +64,12 @@ class SigninEmailConfirmationDialog::DialogWebContentsObserver
};
SigninEmailConfirmationDialog::SigninEmailConfirmationDialog(
- SigninViewController* signin_view_controller,
content::WebContents* contents,
Profile* profile,
const std::string& last_email,
const std::string& new_email,
Callback callback)
- : signin_view_controller_(signin_view_controller),
- web_contents_(contents),
+ : web_contents_(contents),
profile_(profile),
last_email_(last_email),
new_email_(new_email),
@@ -82,7 +80,6 @@ SigninEmailConfirmationDialog::~SigninEmailConfirmationDialog() {}
// static
SigninEmailConfirmationDialog*
SigninEmailConfirmationDialog::AskForConfirmation(
- SigninViewController* signin_view_controller,
content::WebContents* contents,
Profile* profile,
const std::string& last_email,
@@ -91,8 +88,7 @@ SigninEmailConfirmationDialog::AskForConfirmation(
base::RecordAction(base::UserMetricsAction("Signin_Show_ImportDataPrompt"));
// ShowDialog() will take care of ownership.
SigninEmailConfirmationDialog* dialog = new SigninEmailConfirmationDialog(
- signin_view_controller, contents, profile, last_email, email,
- std::move(callback));
+ contents, profile, last_email, email, std::move(callback));
dialog->ShowDialog();
return dialog;
}
@@ -204,10 +200,7 @@ void SigninEmailConfirmationDialog::OnDialogClosed(
action = CLOSE;
}
- if (signin_view_controller_) {
- signin_view_controller_->ResetModalSigninDelegate();
- signin_view_controller_ = nullptr;
- }
+ NotifyModalSigninClosed();
if (callback_)
std::move(callback_).Run(action);
diff --git a/chromium/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.h b/chromium/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.h
index ec51957390e..587587a9b95 100644
--- a/chromium/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.h
+++ b/chromium/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.h
@@ -17,7 +17,6 @@
#include "ui/web_dialogs/web_dialog_ui.h"
class Profile;
-class SigninViewController;
namespace content {
class WebContents;
@@ -47,7 +46,6 @@ class SigninEmailConfirmationDialog : public ui::WebDialogDelegate,
// Create and show the dialog, which owns itself.
// Ask the user for confirmation before starting to sync.
static SigninEmailConfirmationDialog* AskForConfirmation(
- SigninViewController* signin_view_controller,
content::WebContents* contents,
Profile* profile,
const std::string& last_email,
@@ -59,8 +57,7 @@ class SigninEmailConfirmationDialog : public ui::WebDialogDelegate,
private:
class DialogWebContentsObserver;
- SigninEmailConfirmationDialog(SigninViewController* signin_view_controller,
- content::WebContents* contents,
+ SigninEmailConfirmationDialog(content::WebContents* contents,
Profile* profile,
const std::string& last_email,
const std::string& new_email,
@@ -98,8 +95,6 @@ class SigninEmailConfirmationDialog : public ui::WebDialogDelegate,
// Returns nullptr if there is no dialog.
content::WebContents* GetDialogWebContents() const;
- SigninViewController* signin_view_controller_;
-
// Web contents from which the "Learn more" link should be opened.
content::WebContents* const web_contents_;
Profile* const profile_;
diff --git a/chromium/chrome/browser/ui/webui/signin/signin_error_ui.cc b/chromium/chrome/browser/ui/webui/signin/signin_error_ui.cc
index 39f01b21d74..48d6356f7b2 100644
--- a/chromium/chrome/browser/ui/webui/signin/signin_error_ui.cc
+++ b/chromium/chrome/browser/ui/webui/signin/signin_error_ui.cc
@@ -67,12 +67,11 @@ void SigninErrorUI::Initialize(Browser* browser, bool is_system_profile) {
content::WebUIDataSource* source =
content::WebUIDataSource::Create(chrome::kChromeUISigninErrorHost);
source->UseStringsJs();
+ source->EnableReplaceI18nInJS();
source->SetDefaultResource(IDR_SIGNIN_ERROR_HTML);
- source->AddResourcePath("signin_error_app.html", IDR_SIGNIN_ERROR_APP_HTML);
source->AddResourcePath("signin_error_app.js", IDR_SIGNIN_ERROR_APP_JS);
source->AddResourcePath("signin_error.js", IDR_SIGNIN_ERROR_JS);
- source->AddResourcePath("signin_shared_old_css.html",
- IDR_SIGNIN_SHARED_OLD_CSS_HTML);
+ source->AddResourcePath("signin_shared_css.js", IDR_SIGNIN_SHARED_CSS_JS);
source->AddBoolean("isSystemProfile", is_system_profile);
// Retrieve the last signin error message and email used.
diff --git a/chromium/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc b/chromium/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc
index 39ca8f0c887..2dea17c899c 100644
--- a/chromium/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc
+++ b/chromium/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc
@@ -513,8 +513,8 @@ void UserManagerScreenHandler::HandleRemoveUserWarningLoadStats(
} else {
g_browser_process->profile_manager()->LoadProfileByPath(
profile_path, false,
- base::Bind(&UserManagerScreenHandler::GatherStatistics,
- weak_ptr_factory_.GetWeakPtr(), start_time));
+ base::BindOnce(&UserManagerScreenHandler::GatherStatistics,
+ weak_ptr_factory_.GetWeakPtr(), start_time));
}
}
diff --git a/chromium/chrome/browser/ui/webui/signin/user_manager_ui.cc b/chromium/chrome/browser/ui/webui/signin/user_manager_ui.cc
index 628865ae71b..1e3dd27c7b9 100644
--- a/chromium/chrome/browser/ui/webui/signin/user_manager_ui.cc
+++ b/chromium/chrome/browser/ui/webui/signin/user_manager_ui.cc
@@ -18,6 +18,7 @@
#include "chrome/browser/ui/webui/signin/signin_utils.h"
#include "chrome/browser/ui/webui/signin/user_manager_screen_handler.h"
#include "chrome/browser/ui/webui/theme_source.h"
+#include "chrome/browser/ui/webui/webui_util.h"
#include "chrome/common/buildflags.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/url_constants.h"
@@ -63,27 +64,24 @@ content::WebUIDataSource* UserManagerUI::CreateUIDataSource(
source->UseStringsJs();
- source->AddResourcePath("control_bar.html", IDR_CONTROL_BAR_HTML);
- source->AddResourcePath("control_bar.js", IDR_CONTROL_BAR_JS);
- source->AddResourcePath("create_profile.html", IDR_CREATE_PROFILE_HTML);
- source->AddResourcePath("create_profile.js", IDR_CREATE_PROFILE_JS);
- source->AddResourcePath("error_dialog.html", IDR_ERROR_DIALOG_HTML);
- source->AddResourcePath("error_dialog.js", IDR_ERROR_DIALOG_JS);
- source->AddResourcePath("profile_browser_proxy.html",
- IDR_PROFILE_BROWSER_PROXY_HTML);
- source->AddResourcePath("profile_browser_proxy.js",
- IDR_PROFILE_BROWSER_PROXY_JS);
- source->AddResourcePath("shared_styles.html",
- IDR_USER_MANAGER_SHARED_STYLES_HTML);
- source->AddResourcePath("strings.html", IDR_USER_MANAGER_STRINGS_HTML);
- source->AddResourcePath("user_manager.js", IDR_USER_MANAGER_JS);
- source->AddResourcePath("user_manager_pages.html",
- IDR_USER_MANAGER_PAGES_HTML);
- source->AddResourcePath("user_manager_pages.js", IDR_USER_MANAGER_PAGES_JS);
- source->AddResourcePath("user_manager_tutorial.html",
- IDR_USER_MANAGER_TUTORIAL_HTML);
- source->AddResourcePath("user_manager_tutorial.js",
- IDR_USER_MANAGER_TUTORIAL_JS);
+ static constexpr webui::ResourcePath kResources[] = {
+ {"control_bar.html", IDR_CONTROL_BAR_HTML},
+ {"control_bar.js", IDR_CONTROL_BAR_JS},
+ {"create_profile.html", IDR_CREATE_PROFILE_HTML},
+ {"create_profile.js", IDR_CREATE_PROFILE_JS},
+ {"error_dialog.html", IDR_ERROR_DIALOG_HTML},
+ {"error_dialog.js", IDR_ERROR_DIALOG_JS},
+ {"profile_browser_proxy.html", IDR_PROFILE_BROWSER_PROXY_HTML},
+ {"profile_browser_proxy.js", IDR_PROFILE_BROWSER_PROXY_JS},
+ {"shared_styles.html", IDR_USER_MANAGER_SHARED_STYLES_HTML},
+ {"strings.html", IDR_USER_MANAGER_STRINGS_HTML},
+ {"user_manager.js", IDR_USER_MANAGER_JS},
+ {"user_manager_pages.html", IDR_USER_MANAGER_PAGES_HTML},
+ {"user_manager_pages.js", IDR_USER_MANAGER_PAGES_JS},
+ {"user_manager_tutorial.html", IDR_USER_MANAGER_TUTORIAL_HTML},
+ {"user_manager_tutorial.js", IDR_USER_MANAGER_TUTORIAL_JS},
+ };
+ webui::AddResourcePathsBulk(source, kResources);
source->SetDefaultResource(IDR_USER_MANAGER_HTML);
diff --git a/chromium/chrome/browser/ui/webui/signin/user_manager_ui_browsertest.cc b/chromium/chrome/browser/ui/webui/signin/user_manager_ui_browsertest.cc
index 9e08935bda3..47070460d08 100644
--- a/chromium/chrome/browser/ui/webui/signin/user_manager_ui_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/signin/user_manager_ui_browsertest.cc
@@ -25,6 +25,7 @@
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
diff --git a/chromium/chrome/browser/ui/webui/snippets_internals/snippets_internals_page_handler.cc b/chromium/chrome/browser/ui/webui/snippets_internals/snippets_internals_page_handler.cc
index 46a0bbcd778..948043078e4 100644
--- a/chromium/chrome/browser/ui/webui/snippets_internals/snippets_internals_page_handler.cc
+++ b/chromium/chrome/browser/ui/webui/snippets_internals/snippets_internals_page_handler.cc
@@ -13,6 +13,7 @@
#include "base/feature_list.h"
#include "base/i18n/time_formatting.h"
#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/ui/webui/snippets_internals/snippets_internals.mojom.h"
@@ -253,7 +254,7 @@ void SnippetsInternalsPageHandler::FetchSuggestionsInBackground(
DCHECK(delaySeconds >= 0);
suggestion_fetch_timer_.Start(
FROM_HERE, base::TimeDelta::FromSeconds(delaySeconds),
- base::BindRepeating(
+ base::BindOnce(
&SnippetsInternalsPageHandler::FetchSuggestionsInBackgroundImpl,
weak_ptr_factory_.GetWeakPtr(), base::Passed(std::move(callback))));
}
@@ -267,7 +268,7 @@ void SnippetsInternalsPageHandler::FetchSuggestionsInBackgroundImpl(
}
void SnippetsInternalsPageHandler::GetLastJson(GetLastJsonCallback callback) {
- std::string json = "";
+ std::string json;
if (remote_suggestions_provider_) {
const ntp_snippets::RemoteSuggestionsFetcher* fetcher =
remote_suggestions_provider_->suggestions_fetcher_for_debugging();
@@ -349,7 +350,7 @@ void SnippetsInternalsPageHandler::CollectDismissedSuggestions(
if (last_index + 1 >= 0 && (size_t)last_index + 1 == i) {
content_suggestions_service_->GetDismissedSuggestionsForDebugging(
categories[i],
- base::BindRepeating(
+ base::BindOnce(
&SnippetsInternalsPageHandler::CollectDismissedSuggestions,
weak_ptr_factory_.GetWeakPtr(), i,
base::Passed(std::move(callback))));
diff --git a/chromium/chrome/browser/ui/webui/supervised_user_internals_message_handler.cc b/chromium/chrome/browser/ui/webui/supervised_user_internals_message_handler.cc
index b4184f993e1..0811f8b6987 100644
--- a/chromium/chrome/browser/ui/webui/supervised_user_internals_message_handler.cc
+++ b/chromium/chrome/browser/ui/webui/supervised_user_internals_message_handler.cc
@@ -184,8 +184,9 @@ void SupervisedUserInternalsMessageHandler::HandleTryURL(
std::map<std::string, base::string16> whitelists =
filter->GetMatchingWhitelistTitles(url);
filter->GetFilteringBehaviorForURLWithAsyncChecks(
- url, base::Bind(&SupervisedUserInternalsMessageHandler::OnTryURLResult,
- weak_factory_.GetWeakPtr(), whitelists));
+ url,
+ base::BindOnce(&SupervisedUserInternalsMessageHandler::OnTryURLResult,
+ weak_factory_.GetWeakPtr(), whitelists));
}
void SupervisedUserInternalsMessageHandler::SendBasicInfo() {
diff --git a/chromium/chrome/browser/ui/webui/sync_internals_browsertest.js b/chromium/chrome/browser/ui/webui/sync_internals_browsertest.js
index 6bde6774f1a..a2abe32d002 100644
--- a/chromium/chrome/browser/ui/webui/sync_internals_browsertest.js
+++ b/chromium/chrome/browser/ui/webui/sync_internals_browsertest.js
@@ -3,6 +3,7 @@
// found in the LICENSE file.
GEN('#include "components/sync/driver/sync_driver_switches.h"');
+GEN('#include "content/public/test/browser_test.h"');
/**
* Test fixture for sync internals WebUI testing.
diff --git a/chromium/chrome/browser/ui/webui/sync_internals_message_handler.cc b/chromium/chrome/browser/ui/webui/sync_internals_message_handler.cc
index 40880e73df6..2c6677979ff 100644
--- a/chromium/chrome/browser/ui/webui/sync_internals_message_handler.cc
+++ b/chromium/chrome/browser/ui/webui/sync_internals_message_handler.cc
@@ -252,8 +252,8 @@ void SyncInternalsMessageHandler::HandleGetAllNodes(const ListValue* args) {
// the javascript side. We guard against this by invalidating this weak ptr
// should javascript become disallowed.
service->GetAllNodesForDebugging(
- base::Bind(&SyncInternalsMessageHandler::OnReceivedAllNodes,
- weak_ptr_factory_.GetWeakPtr(), request_id));
+ base::BindOnce(&SyncInternalsMessageHandler::OnReceivedAllNodes,
+ weak_ptr_factory_.GetWeakPtr(), request_id));
}
}
diff --git a/chromium/chrome/browser/ui/webui/sync_internals_ui.cc b/chromium/chrome/browser/ui/webui/sync_internals_ui.cc
index ed5f6af5ed0..89dd520d430 100644
--- a/chromium/chrome/browser/ui/webui/sync_internals_ui.cc
+++ b/chromium/chrome/browser/ui/webui/sync_internals_ui.cc
@@ -8,6 +8,7 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/sync_internals_message_handler.h"
+#include "chrome/browser/ui/webui/webui_util.h"
#include "chrome/common/url_constants.h"
#include "components/grit/sync_driver_resources.h"
#include "components/sync/driver/about_sync_util.h"
@@ -23,30 +24,32 @@ content::WebUIDataSource* CreateSyncInternalsHTMLSource() {
"script-src chrome://resources 'self' 'unsafe-eval';");
source->UseStringsJs();
- source->AddResourcePath(syncer::sync_ui_util::kSyncIndexJS,
- IDR_SYNC_DRIVER_SYNC_INTERNALS_INDEX_JS);
- source->AddResourcePath(syncer::sync_ui_util::kChromeSyncJS,
- IDR_SYNC_DRIVER_SYNC_INTERNALS_CHROME_SYNC_JS);
- source->AddResourcePath(syncer::sync_ui_util::kTypesJS,
- IDR_SYNC_DRIVER_SYNC_INTERNALS_TYPES_JS);
- source->AddResourcePath(syncer::sync_ui_util::kSyncLogJS,
- IDR_SYNC_DRIVER_SYNC_INTERNALS_SYNC_LOG_JS);
- source->AddResourcePath(syncer::sync_ui_util::kSyncNodeBrowserJS,
- IDR_SYNC_DRIVER_SYNC_INTERNALS_SYNC_NODE_BROWSER_JS);
- source->AddResourcePath(syncer::sync_ui_util::kSyncSearchJS,
- IDR_SYNC_DRIVER_SYNC_INTERNALS_SYNC_SEARCH_JS);
- source->AddResourcePath(syncer::sync_ui_util::kAboutJS,
- IDR_SYNC_DRIVER_SYNC_INTERNALS_ABOUT_JS);
- source->AddResourcePath(syncer::sync_ui_util::kDataJS,
- IDR_SYNC_DRIVER_SYNC_INTERNALS_DATA_JS);
- source->AddResourcePath(syncer::sync_ui_util::kEventsJS,
- IDR_SYNC_DRIVER_SYNC_INTERNALS_EVENTS_JS);
- source->AddResourcePath(syncer::sync_ui_util::kSearchJS,
- IDR_SYNC_DRIVER_SYNC_INTERNALS_SEARCH_JS);
- source->AddResourcePath(syncer::sync_ui_util::kUserEventsJS,
- IDR_SYNC_DRIVER_SYNC_INTERNALS_USER_EVENTS_JS);
- source->AddResourcePath(syncer::sync_ui_util::kTrafficLogJS,
- IDR_SYNC_DRIVER_SYNC_INTERNALS_TRAFFIC_LOG_JS);
+
+ static constexpr webui::ResourcePath kResources[] = {
+ {syncer::sync_ui_util::kSyncIndexJS,
+ IDR_SYNC_DRIVER_SYNC_INTERNALS_INDEX_JS},
+ {syncer::sync_ui_util::kChromeSyncJS,
+ IDR_SYNC_DRIVER_SYNC_INTERNALS_CHROME_SYNC_JS},
+ {syncer::sync_ui_util::kTypesJS, IDR_SYNC_DRIVER_SYNC_INTERNALS_TYPES_JS},
+ {syncer::sync_ui_util::kSyncLogJS,
+ IDR_SYNC_DRIVER_SYNC_INTERNALS_SYNC_LOG_JS},
+ {syncer::sync_ui_util::kSyncNodeBrowserJS,
+ IDR_SYNC_DRIVER_SYNC_INTERNALS_SYNC_NODE_BROWSER_JS},
+ {syncer::sync_ui_util::kSyncSearchJS,
+ IDR_SYNC_DRIVER_SYNC_INTERNALS_SYNC_SEARCH_JS},
+ {syncer::sync_ui_util::kAboutJS, IDR_SYNC_DRIVER_SYNC_INTERNALS_ABOUT_JS},
+ {syncer::sync_ui_util::kDataJS, IDR_SYNC_DRIVER_SYNC_INTERNALS_DATA_JS},
+ {syncer::sync_ui_util::kEventsJS,
+ IDR_SYNC_DRIVER_SYNC_INTERNALS_EVENTS_JS},
+ {syncer::sync_ui_util::kSearchJS,
+ IDR_SYNC_DRIVER_SYNC_INTERNALS_SEARCH_JS},
+ {syncer::sync_ui_util::kUserEventsJS,
+ IDR_SYNC_DRIVER_SYNC_INTERNALS_USER_EVENTS_JS},
+ {syncer::sync_ui_util::kTrafficLogJS,
+ IDR_SYNC_DRIVER_SYNC_INTERNALS_TRAFFIC_LOG_JS},
+ };
+ webui::AddResourcePathsBulk(source, kResources);
+
source->SetDefaultResource(IDR_SYNC_DRIVER_SYNC_INTERNALS_INDEX_HTML);
return source;
}
diff --git a/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.cc b/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.cc
index 3a0837ac868..6c8774f3bb4 100644
--- a/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.cc
+++ b/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.cc
@@ -42,6 +42,35 @@
namespace {
+std::string ConvertAlertStateToString(TabAlertState alert_state) {
+ switch (alert_state) {
+ case TabAlertState::MEDIA_RECORDING:
+ return "media-recording";
+ case TabAlertState::TAB_CAPTURING:
+ return "tab-capturing";
+ case TabAlertState::AUDIO_PLAYING:
+ return "audio-playing";
+ case TabAlertState::AUDIO_MUTING:
+ return "audio-muting";
+ case TabAlertState::BLUETOOTH_CONNECTED:
+ return "bluetooth-connected";
+ case TabAlertState::USB_CONNECTED:
+ return "usb-connected";
+ case TabAlertState::HID_CONNECTED:
+ return "hid-connected";
+ case TabAlertState::SERIAL_CONNECTED:
+ return "serial-connected";
+ case TabAlertState::PIP_PLAYING:
+ return "pip-playing";
+ case TabAlertState::DESKTOP_CAPTURING:
+ return "desktop-capturing";
+ case TabAlertState::VR_PRESENTING_IN_HEADSET:
+ return "vr-presenting";
+ default:
+ NOTREACHED();
+ }
+}
+
// Writes bytes to a std::vector that can be fetched. This is used to record the
// output of skia image encoding.
class BufferWStream : public SkWStream {
@@ -459,7 +488,7 @@ base::DictionaryValue TabStripUIHandler::GetTabData(
auto alert_states = std::make_unique<base::ListValue>();
for (const auto alert_state :
chrome::GetTabAlertStatesForContents(contents)) {
- alert_states->Append(static_cast<int>(alert_state));
+ alert_states->Append(ConvertAlertStateToString(alert_state));
}
tab_data.SetList("alertStates", std::move(alert_states));
diff --git a/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.cc b/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.cc
index ed5f54ce4f2..1f4b5460dbb 100644
--- a/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.cc
+++ b/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.cc
@@ -4,12 +4,24 @@
#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.h"
+#include <memory>
+#include <string>
+#include <utility>
+
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_list.h"
+#include "chrome/browser/ui/tabs/tab_group.h"
#include "chrome/browser/ui/tabs/tab_group_model.h"
+#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui.h"
#include "components/tab_groups/tab_group_id.h"
#include "content/public/browser/web_contents.h"
+#include "ui/base/clipboard/clipboard_format_type.h"
+#include "ui/base/clipboard/custom_data_helper.h"
+#include "ui/base/dragdrop/os_exchange_data.h"
namespace tab_strip_ui {
@@ -65,4 +77,101 @@ void MoveTabAcrossWindows(Browser* source_browser,
to_index, std::move(detached_contents), add_types, to_group_id);
}
+bool IsDraggedTab(const ui::OSExchangeData& drop_data) {
+ base::Pickle pickle;
+ drop_data.GetPickledData(ui::ClipboardFormatType::GetWebCustomDataType(),
+ &pickle);
+ base::PickleIterator iter(pickle);
+
+ uint32_t entry_count = 0;
+ if (!iter.ReadUInt32(&entry_count))
+ return false;
+
+ for (uint32_t i = 0; i < entry_count; ++i) {
+ base::StringPiece16 type;
+ base::StringPiece16 data;
+ if (!iter.ReadStringPiece16(&type) || !iter.ReadStringPiece16(&data))
+ return false;
+
+ if (type == base::ASCIIToUTF16(kWebUITabIdDataType) ||
+ type == base::ASCIIToUTF16(kWebUITabGroupIdDataType))
+ return true;
+ }
+
+ return false;
+}
+
+bool DropTabsInNewBrowser(Browser* new_browser,
+ const ui::OSExchangeData& drop_data) {
+ base::Pickle pickle;
+ drop_data.GetPickledData(ui::ClipboardFormatType::GetWebCustomDataType(),
+ &pickle);
+
+ base::string16 tab_id_str;
+ base::string16 group_id_str;
+ ui::ReadCustomDataForType(pickle.data(), pickle.size(),
+ base::ASCIIToUTF16(kWebUITabIdDataType),
+ &tab_id_str);
+ if (tab_id_str.empty()) {
+ ui::ReadCustomDataForType(pickle.data(), pickle.size(),
+ base::ASCIIToUTF16(kWebUITabGroupIdDataType),
+ &group_id_str);
+ }
+
+ if (tab_id_str.empty() && group_id_str.empty())
+ return false;
+
+ Browser* source_browser = nullptr;
+ std::vector<int> tab_indices_to_move;
+ base::Optional<tab_groups::TabGroupId> target_group_id;
+
+ // TODO(https://crbug.com/1069869): de-duplicate with
+ // TabStripUIHandler::HandleMoveTab and
+ // TabStripUIHandler::HandleMoveGroup.
+
+ if (!tab_id_str.empty()) {
+ int tab_id = -1;
+ if (!base::StringToInt(tab_id_str, &tab_id))
+ return false;
+
+ int source_index = -1;
+ if (!extensions::ExtensionTabUtil::GetTabById(
+ tab_id, new_browser->profile(), /* include_incognito = */ false,
+ &source_browser, /* tab_strip = */ nullptr,
+ /* contents = */ nullptr, &source_index)) {
+ return false;
+ }
+ tab_indices_to_move.push_back(source_index);
+ } else {
+ std::string group_id_utf8 = base::UTF16ToUTF8(group_id_str);
+ source_browser =
+ GetBrowserWithGroupId(new_browser->profile(), group_id_utf8);
+ if (!source_browser)
+ return false;
+ base::Optional<tab_groups::TabGroupId> source_group_id =
+ GetTabGroupIdFromString(
+ source_browser->tab_strip_model()->group_model(), group_id_utf8);
+ if (!source_group_id)
+ return false;
+
+ TabGroup* source_group =
+ source_browser->tab_strip_model()->group_model()->GetTabGroup(
+ *source_group_id);
+ tab_indices_to_move = source_group->ListTabs();
+
+ // Create a new group with the same visuals.
+ target_group_id = tab_groups::TabGroupId::GenerateNew();
+ new_browser->tab_strip_model()->group_model()->AddTabGroup(
+ *target_group_id, *source_group->visual_data());
+ }
+
+ for (size_t i = 0; i < tab_indices_to_move.size(); ++i) {
+ int source_index = tab_indices_to_move[i] - i;
+ MoveTabAcrossWindows(source_browser, source_index, new_browser, i,
+ target_group_id);
+ }
+ new_browser->tab_strip_model()->ActivateTabAt(0);
+ return true;
+}
+
} // namespace tab_strip_ui
diff --git a/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.h b/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.h
index 5d5c67fd6b9..fcffd488b10 100644
--- a/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.h
+++ b/chromium/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.h
@@ -5,6 +5,8 @@
#ifndef CHROME_BROWSER_UI_WEBUI_TAB_STRIP_TAB_STRIP_UI_UTIL_H_
#define CHROME_BROWSER_UI_WEBUI_TAB_STRIP_TAB_STRIP_UI_UTIL_H_
+#include <string>
+
#include "base/optional.h"
#include "components/tab_groups/tab_group_id.h"
@@ -12,6 +14,10 @@ class Browser;
class Profile;
class TabGroupModel;
+namespace ui {
+class OSExchangeData;
+}
+
namespace tab_strip_ui {
base::Optional<tab_groups::TabGroupId> GetTabGroupIdFromString(
@@ -27,6 +33,19 @@ void MoveTabAcrossWindows(
int to_index,
base::Optional<tab_groups::TabGroupId> to_group_id = base::nullopt);
+// Returns whether |drop_data| is a tab drag originating from a WebUI
+// tab strip.
+bool IsDraggedTab(const ui::OSExchangeData& drop_data);
+
+// Handles dropping tabs not destined for an existing tab strip.
+// |new_browser| should be the newly created Browser with no tabs, and
+// must have the same profile as the drag source. |drop_data| must have
+// originated from a drag in a WebUI tab strip. If successful, the tabs
+// reflected in |drop_data| will be moved from the source browser to
+// |new_browser|.
+bool DropTabsInNewBrowser(Browser* new_browser,
+ const ui::OSExchangeData& drop_data);
+
} // namespace tab_strip_ui
#endif // CHROME_BROWSER_UI_WEBUI_TAB_STRIP_TAB_STRIP_UI_UTIL_H_
diff --git a/chromium/chrome/browser/ui/webui/tab_strip/thumbnail_tracker_unittest.cc b/chromium/chrome/browser/ui/webui/tab_strip/thumbnail_tracker_unittest.cc
index a604c2f7980..f5668777afb 100644
--- a/chromium/chrome/browser/ui/webui/tab_strip/thumbnail_tracker_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/tab_strip/thumbnail_tracker_unittest.cc
@@ -15,6 +15,7 @@
#include "chrome/browser/ui/thumbnails/thumbnail_image.h"
#include "chrome/test/base/testing_profile.h"
#include "content/public/test/browser_task_environment.h"
+#include "content/public/test/test_renderer_host.h"
#include "content/public/test/web_contents_tester.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -70,6 +71,7 @@ class ThumbnailTrackerTest : public ::testing::Test,
void ThumbnailImageBeingObservedChanged(bool is_being_observed) override {}
content::BrowserTaskEnvironment task_environment_;
+ content::RenderViewHostTestEnabler test_render_host_factories_;
TestingProfile profile_;
base::MockCallback<ThumbnailTracker::ThumbnailUpdatedCallback>
diff --git a/chromium/chrome/browser/ui/webui/test_data_source.cc b/chromium/chrome/browser/ui/webui/test_data_source.cc
index 43d7f409c50..35e02e89a23 100644
--- a/chromium/chrome/browser/ui/webui/test_data_source.cc
+++ b/chromium/chrome/browser/ui/webui/test_data_source.cc
@@ -80,6 +80,10 @@ std::string TestDataSource::GetContentSecurityPolicyScriptSrc() {
return "script-src chrome://* 'self';";
}
+std::string TestDataSource::GetContentSecurityPolicyWorkerSrc() {
+ return "worker-src blob: 'self';";
+}
+
GURL TestDataSource::GetURLForPath(const std::string& path) {
return GURL(std::string(content::kChromeUIScheme) + "://" + GetSource() +
"/" + path);
diff --git a/chromium/chrome/browser/ui/webui/test_data_source.h b/chromium/chrome/browser/ui/webui/test_data_source.h
index f65809dd9c0..33990d62b4d 100644
--- a/chromium/chrome/browser/ui/webui/test_data_source.h
+++ b/chromium/chrome/browser/ui/webui/test_data_source.h
@@ -34,6 +34,8 @@ class TestDataSource : public content::URLDataSource {
std::string GetContentSecurityPolicyScriptSrc() override;
+ std::string GetContentSecurityPolicyWorkerSrc() override;
+
GURL GetURLForPath(const std::string& path);
void ReadFile(const std::string& path,
diff --git a/chromium/chrome/browser/ui/webui/theme_source.cc b/chromium/chrome/browser/ui/webui/theme_source.cc
index 2ace3bf2c47..060ba3f5a3a 100644
--- a/chromium/chrome/browser/ui/webui/theme_source.cc
+++ b/chromium/chrome/browser/ui/webui/theme_source.cc
@@ -12,7 +12,7 @@
#include "build/branding_buildflags.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/resources_util.h"
-#include "chrome/browser/search/instant_io_context.h"
+#include "chrome/browser/search/instant_service.h"
#include "chrome/browser/themes/browser_theme_pack.h"
#include "chrome/browser/themes/theme_properties.h"
#include "chrome/browser/themes/theme_service.h"
@@ -72,12 +72,17 @@ void ProcessResourceOnUiThread(int resource_id,
////////////////////////////////////////////////////////////////////////////////
// ThemeSource, public:
-ThemeSource::ThemeSource(Profile* profile) : profile_(profile) {}
+ThemeSource::ThemeSource(Profile* profile)
+ : profile_(profile), serve_untrusted_(false) {}
+
+ThemeSource::ThemeSource(Profile* profile, bool serve_untrusted)
+ : profile_(profile), serve_untrusted_(serve_untrusted) {}
ThemeSource::~ThemeSource() = default;
std::string ThemeSource::GetSource() {
- return chrome::kChromeUIThemeHost;
+ return serve_untrusted_ ? chrome::kChromeUIUntrustedThemeURL
+ : chrome::kChromeUIThemeHost;
}
void ThemeSource::StartDataRequest(
@@ -168,36 +173,17 @@ std::string ThemeSource::GetMimeType(const std::string& path) {
return IsNewTabCssPath(parsed_path) ? "text/css" : "image/png";
}
-scoped_refptr<base::SingleThreadTaskRunner>
-ThemeSource::TaskRunnerForRequestPath(const std::string& path) {
- std::string parsed_path;
- webui::ParsePathAndScale(GetThemeUrl(path), &parsed_path, nullptr);
-
- if (IsNewTabCssPath(parsed_path)) {
- // We'll get this data from the NTPResourceCache, which must be accessed on
- // the UI thread.
- return content::URLDataSource::TaskRunnerForRequestPath(path);
- }
-
- // If it's not a themeable image, we don't need to go to the UI thread.
- int resource_id = ResourcesUtil::GetThemeResourceId(parsed_path);
- return BrowserThemePack::IsPersistentImageID(resource_id)
- ? content::URLDataSource::TaskRunnerForRequestPath(path)
- : nullptr;
-}
-
bool ThemeSource::AllowCaching() {
return false;
}
-bool ThemeSource::ShouldServiceRequest(
- const GURL& url,
- content::ResourceContext* resource_context,
- int render_process_id) {
+bool ThemeSource::ShouldServiceRequest(const GURL& url,
+ content::BrowserContext* browser_context,
+ int render_process_id) {
return url.SchemeIs(chrome::kChromeSearchScheme)
- ? InstantIOContext::ShouldServiceRequest(url, resource_context,
- render_process_id)
- : URLDataSource::ShouldServiceRequest(url, resource_context,
+ ? InstantService::ShouldServiceRequest(url, browser_context,
+ render_process_id)
+ : URLDataSource::ShouldServiceRequest(url, browser_context,
render_process_id);
}
@@ -210,13 +196,11 @@ void ThemeSource::SendThemeBitmap(
float scale) {
ui::ScaleFactor scale_factor = ui::GetSupportedScaleFactor(scale);
if (BrowserThemePack::IsPersistentImageID(resource_id)) {
- DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
scoped_refptr<base::RefCountedMemory> image_data(
ThemeService::GetThemeProviderForProfile(profile_->GetOriginalProfile())
.GetRawData(resource_id, scale_factor));
std::move(callback).Run(image_data.get());
} else {
- DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
const ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
std::move(callback).Run(
rb.LoadDataResourceBytesForScale(resource_id, scale_factor));
diff --git a/chromium/chrome/browser/ui/webui/theme_source.h b/chromium/chrome/browser/ui/webui/theme_source.h
index 33849c5cd8a..aaf58a12cce 100644
--- a/chromium/chrome/browser/ui/webui/theme_source.h
+++ b/chromium/chrome/browser/ui/webui/theme_source.h
@@ -18,6 +18,7 @@ class Profile;
class ThemeSource : public content::URLDataSource {
public:
explicit ThemeSource(Profile* profile);
+ ThemeSource(Profile* profile, bool serve_untrusted);
~ThemeSource() override;
// content::URLDataSource implementation.
@@ -27,11 +28,9 @@ class ThemeSource : public content::URLDataSource {
const content::WebContents::Getter& wc_getter,
content::URLDataSource::GotDataCallback callback) override;
std::string GetMimeType(const std::string& path) override;
- scoped_refptr<base::SingleThreadTaskRunner> TaskRunnerForRequestPath(
- const std::string& path) override;
bool AllowCaching() override;
bool ShouldServiceRequest(const GURL& url,
- content::ResourceContext* resource_context,
+ content::BrowserContext* browser_context,
int render_process_id) override;
std::string GetAccessControlAllowOriginForOrigin(
const std::string& origin) override;
@@ -52,6 +51,9 @@ class ThemeSource : public content::URLDataSource {
// The profile this object was initialized with.
Profile* profile_;
+ // Whether this source services chrome-unstrusted://theme.
+ bool serve_untrusted_;
+
DISALLOW_COPY_AND_ASSIGN(ThemeSource);
};
diff --git a/chromium/chrome/browser/ui/webui/version_handler.cc b/chromium/chrome/browser/ui/webui/version_handler.cc
index 70058412fa0..936e8845a18 100644
--- a/chromium/chrome/browser/ui/webui/version_handler.cc
+++ b/chromium/chrome/browser/ui/webui/version_handler.cc
@@ -125,8 +125,8 @@ void VersionHandler::HandleRequestPluginInfo(const base::ListValue* args) {
// The Flash version information is needed in the response, so make sure
// the plugins are loaded.
content::PluginService::GetInstance()->GetPlugins(
- base::Bind(&VersionHandler::OnGotPlugins, weak_ptr_factory_.GetWeakPtr(),
- callback_id));
+ base::BindOnce(&VersionHandler::OnGotPlugins,
+ weak_ptr_factory_.GetWeakPtr(), callback_id));
#else
RejectJavascriptCallback(base::Value(callback_id), base::Value());
#endif
diff --git a/chromium/chrome/browser/ui/webui/web_dialog_web_contents_delegate_unittest.cc b/chromium/chrome/browser/ui/webui/web_dialog_web_contents_delegate_unittest.cc
index 5129302a8c1..09e80f92cd5 100644
--- a/chromium/chrome/browser/ui/webui/web_dialog_web_contents_delegate_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/web_dialog_web_contents_delegate_unittest.cc
@@ -7,7 +7,6 @@
#include <memory>
#include <vector>
-#include "base/logging.h"
#include "base/macros.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
@@ -93,8 +92,8 @@ TEST_F(WebDialogWebContentsDelegateTest, AddNewContentsForegroundTabTest) {
std::unique_ptr<WebContents> contents =
WebContentsTester::CreateTestWebContents(profile(), nullptr);
test_web_contents_delegate_->AddNewContents(
- nullptr, std::move(contents), WindowOpenDisposition::NEW_FOREGROUND_TAB,
- gfx::Rect(), false, nullptr);
+ nullptr, std::move(contents), GURL(),
+ WindowOpenDisposition::NEW_FOREGROUND_TAB, gfx::Rect(), false, nullptr);
// This should create a new foreground tab in the existing browser.
EXPECT_EQ(1, browser()->tab_strip_model()->count());
EXPECT_EQ(1U, chrome::GetTotalBrowserCount());
@@ -105,13 +104,14 @@ TEST_F(WebDialogWebContentsDelegateTest, DetachTest) {
test_web_contents_delegate_->Detach();
EXPECT_EQ(nullptr, test_web_contents_delegate_->browser_context());
// Now, none of the following calls should do anything.
+ GURL url(url::kAboutBlankURL);
test_web_contents_delegate_->OpenURLFromTab(
- nullptr, OpenURLParams(GURL(url::kAboutBlankURL), Referrer(),
- WindowOpenDisposition::NEW_FOREGROUND_TAB,
- ui::PAGE_TRANSITION_LINK, false));
+ nullptr,
+ OpenURLParams(url, Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
+ ui::PAGE_TRANSITION_LINK, false));
test_web_contents_delegate_->AddNewContents(
- nullptr, nullptr, WindowOpenDisposition::NEW_FOREGROUND_TAB, gfx::Rect(),
- false, nullptr);
+ nullptr, nullptr, url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
+ gfx::Rect(), false, nullptr);
EXPECT_EQ(0, browser()->tab_strip_model()->count());
EXPECT_EQ(1U, chrome::GetTotalBrowserCount());
}
diff --git a/chromium/chrome/browser/ui/webui/web_footer_experiment_ui.cc b/chromium/chrome/browser/ui/webui/web_footer_experiment_ui.cc
index 396b82eaa37..8c6bc415f02 100644
--- a/chromium/chrome/browser/ui/webui/web_footer_experiment_ui.cc
+++ b/chromium/chrome/browser/ui/webui/web_footer_experiment_ui.cc
@@ -4,7 +4,6 @@
#include "chrome/browser/ui/webui/web_footer_experiment_ui.h"
-#include "base/logging.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/managed_ui_handler.h"
#include "chrome/browser/ui/webui/theme_source.h"
diff --git a/chromium/chrome/browser/ui/webui/webui_allowlist_provider_unittest.cc b/chromium/chrome/browser/ui/webui/webui_allowlist_provider_unittest.cc
new file mode 100644
index 00000000000..bc0beca5601
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/webui_allowlist_provider_unittest.cc
@@ -0,0 +1,226 @@
+// Copyright (c) 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/webui/webui_allowlist_provider.h"
+#include "components/content_settings/core/browser/content_settings_observer.h"
+#include "ui/webui/webui_allowlist.h"
+
+#include <map>
+#include <memory>
+
+#include "base/macros.h"
+#include "base/test/gtest_util.h"
+#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "chrome/test/base/chrome_render_view_host_test_harness.h"
+#include "chrome/test/base/testing_browser_process.h"
+#include "chrome/test/base/testing_profile_manager.h"
+#include "components/content_settings/core/browser/host_content_settings_map.h"
+#include "components/content_settings/core/common/content_settings.h"
+
+class WebUIAllowlistProviderTest : public ChromeRenderViewHostTestHarness {
+ public:
+ HostContentSettingsMap* GetHostContentSettingsMap(Profile* profile) {
+ return HostContentSettingsMapFactory::GetForProfile(profile);
+ }
+};
+
+TEST_F(WebUIAllowlistProviderTest, RegisterChrome) {
+ auto* map = GetHostContentSettingsMap(profile());
+ map->SetDefaultContentSetting(ContentSettingsType::BLUETOOTH_GUARD,
+ CONTENT_SETTING_BLOCK);
+ map->SetDefaultContentSetting(ContentSettingsType::NOTIFICATIONS,
+ CONTENT_SETTING_BLOCK);
+ map->SetDefaultContentSetting(ContentSettingsType::GEOLOCATION,
+ CONTENT_SETTING_BLOCK);
+
+ // Check |url_allowed| is not affected by whitelisted_schemes. This mechanism
+ // take precedence over allowlist provider.
+ const GURL url_allowed = GURL("chrome://test/");
+ ASSERT_EQ(CONTENT_SETTING_BLOCK,
+ map->GetContentSetting(url_allowed, url_allowed,
+ ContentSettingsType::BLUETOOTH_GUARD,
+ std::string()));
+
+ const GURL url_ordinary = GURL("https://example.com");
+ ASSERT_EQ(CONTENT_SETTING_BLOCK,
+ map->GetContentSetting(url_ordinary, url_ordinary,
+ ContentSettingsType::BLUETOOTH_GUARD,
+ std::string()));
+ ASSERT_EQ(CONTENT_SETTING_BLOCK,
+ map->GetContentSetting(url_ordinary, url_ordinary,
+ ContentSettingsType::NOTIFICATIONS,
+ std::string()));
+
+ auto* allowlist = WebUIAllowlist::GetOrCreate(profile());
+ allowlist->RegisterAutoGrantedPermission(
+ url::Origin::Create(url_allowed), ContentSettingsType::BLUETOOTH_GUARD);
+
+ EXPECT_EQ(CONTENT_SETTING_ALLOW,
+ map->GetContentSetting(url_allowed, url_allowed,
+ ContentSettingsType::BLUETOOTH_GUARD,
+ std::string()));
+ EXPECT_EQ(CONTENT_SETTING_BLOCK,
+ map->GetContentSetting(url_ordinary, url_ordinary,
+ ContentSettingsType::BLUETOOTH_GUARD,
+ std::string()));
+
+ const GURL url_no_permission_webui = GURL("chrome://no-perm");
+ EXPECT_EQ(CONTENT_SETTING_BLOCK,
+ map->GetContentSetting(
+ url_no_permission_webui, url_no_permission_webui,
+ ContentSettingsType::BLUETOOTH_GUARD, std::string()));
+}
+
+TEST_F(WebUIAllowlistProviderTest, RegisterChromeUntrusted) {
+ auto* map = GetHostContentSettingsMap(profile());
+ map->SetDefaultContentSetting(ContentSettingsType::BLUETOOTH_GUARD,
+ CONTENT_SETTING_BLOCK);
+ map->SetDefaultContentSetting(ContentSettingsType::NOTIFICATIONS,
+ CONTENT_SETTING_BLOCK);
+ map->SetDefaultContentSetting(ContentSettingsType::GEOLOCATION,
+ CONTENT_SETTING_BLOCK);
+
+ // Check |url_allowed| is not affected by whitelisted_schemes. This mechanism
+ // take precedence over allowlist provider.
+ const GURL url_allowed = GURL("chrome-untrusted://test/");
+ ASSERT_EQ(CONTENT_SETTING_BLOCK,
+ map->GetContentSetting(url_allowed, url_allowed,
+ ContentSettingsType::BLUETOOTH_GUARD,
+ std::string()));
+
+ auto* allowlist = WebUIAllowlist::GetOrCreate(profile());
+ allowlist->RegisterAutoGrantedPermission(
+ url::Origin::Create(url_allowed), ContentSettingsType::BLUETOOTH_GUARD);
+
+ EXPECT_EQ(CONTENT_SETTING_ALLOW,
+ map->GetContentSetting(url_allowed, url_allowed,
+ ContentSettingsType::BLUETOOTH_GUARD,
+ std::string()));
+
+ const GURL url_no_permission_webui = GURL("chrome-untrusted://no-perm");
+ EXPECT_EQ(CONTENT_SETTING_BLOCK,
+ map->GetContentSetting(
+ url_no_permission_webui, url_no_permission_webui,
+ ContentSettingsType::BLUETOOTH_GUARD, std::string()));
+}
+
+#if DCHECK_IS_ON()
+#define MAYBE_UnsupportedSchemes UnsupportedSchemes
+#else
+#define MAYBE_UnsupportedSchemes DISABLED_UnsupportedSchemes
+#endif
+TEST_F(WebUIAllowlistProviderTest, MAYBE_UnsupportedSchemes) {
+ auto* allowlist = WebUIAllowlist::GetOrCreate(profile());
+
+ std::string unsupported_urls[] = {
+ "http://example.com",
+ "https://example.com",
+ "file:///file",
+ };
+
+ for (const auto& url : unsupported_urls) {
+ EXPECT_DEATH_IF_SUPPORTED(allowlist->RegisterAutoGrantedPermission(
+ url::Origin::Create(GURL(url)),
+ ContentSettingsType::BLUETOOTH_GUARD),
+ std::string());
+ }
+}
+
+#if DCHECK_IS_ON()
+#define MAYBE_InvalidContentSetting InvalidContentSetting
+#else
+#define MAYBE_InvalidContentSetting DISABLED_InvalidContentSetting
+#endif
+TEST_F(WebUIAllowlistProviderTest, MAYBE_InvalidContentSetting) {
+ auto* allowlist = WebUIAllowlist::GetOrCreate(profile());
+
+ EXPECT_DEATH_IF_SUPPORTED(
+ allowlist->RegisterAutoGrantedPermission(
+ url::Origin::Create(GURL("chrome://test/")),
+ ContentSettingsType::BLUETOOTH_GUARD, CONTENT_SETTING_DEFAULT),
+ std::string());
+}
+
+TEST_F(WebUIAllowlistProviderTest, AutoGrantPermissionIsPerProfile) {
+ TestingProfileManager profile_manager(TestingBrowserProcess::GetGlobal());
+ ASSERT_TRUE(profile_manager.SetUp());
+
+ // Create two profiles.
+ Profile* profile1 = profile_manager.CreateTestingProfile("1");
+ auto* map1 = GetHostContentSettingsMap(profile1);
+ map1->SetDefaultContentSetting(ContentSettingsType::GEOLOCATION,
+ CONTENT_SETTING_BLOCK);
+ Profile* profile2 = profile_manager.CreateTestingProfile("2");
+ auto* map2 = GetHostContentSettingsMap(profile2);
+ map2->SetDefaultContentSetting(ContentSettingsType::GEOLOCATION,
+ CONTENT_SETTING_BLOCK);
+
+ GURL url = GURL("chrome://test");
+
+ // Register GEOLOCATION with |profile1|.
+ WebUIAllowlist::GetOrCreate(profile1)->RegisterAutoGrantedPermission(
+ url::Origin::Create(url), ContentSettingsType::GEOLOCATION);
+
+ // Check permissions are granted to the correct profile.
+ EXPECT_EQ(CONTENT_SETTING_ALLOW,
+ map1->GetContentSetting(url, url, ContentSettingsType::GEOLOCATION,
+ std::string()));
+ EXPECT_EQ(CONTENT_SETTING_BLOCK,
+ map2->GetContentSetting(url, url, ContentSettingsType::GEOLOCATION,
+ std::string()));
+}
+
+class ContentSettingsChangeObserver : public content_settings::Observer {
+ public:
+ ContentSettingsChangeObserver() = default;
+ ContentSettingsChangeObserver(const ContentSettingsChangeObserver&) = delete;
+ void operator=(const ContentSettingsChangeObserver&) = delete;
+ ~ContentSettingsChangeObserver() override = default;
+
+ size_t change_counter() { return change_counter_; }
+
+ // content_settings::Observer:
+ void OnContentSettingChanged(
+ const ContentSettingsPattern& primary_pattern,
+ const ContentSettingsPattern& secondary_pattern,
+ ContentSettingsType content_type,
+ const std::string& resource_identifier) override {
+ change_counter_++;
+ }
+
+ private:
+ size_t change_counter_ = 0;
+};
+
+TEST_F(WebUIAllowlistProviderTest, OnlyNotifyOnChange) {
+ auto* map = GetHostContentSettingsMap(profile());
+ map->SetDefaultContentSetting(ContentSettingsType::BLUETOOTH_GUARD,
+ CONTENT_SETTING_BLOCK);
+
+ ContentSettingsChangeObserver change_observer;
+ map->AddObserver(&change_observer);
+
+ const url::Origin origin1 = url::Origin::Create(GURL("chrome://test"));
+
+ auto* allowlist = WebUIAllowlist::GetOrCreate(profile());
+ allowlist->RegisterAutoGrantedPermission(
+ origin1, ContentSettingsType::BLUETOOTH_GUARD);
+ EXPECT_EQ(1U, change_observer.change_counter());
+
+ // Registering the same permission should not trigger OnContentSettingChanged.
+ allowlist->RegisterAutoGrantedPermission(
+ origin1, ContentSettingsType::BLUETOOTH_GUARD);
+ EXPECT_EQ(1U, change_observer.change_counter());
+
+ // Registering a different permission should trigger OnContentSettingChanged.
+ allowlist->RegisterAutoGrantedPermission(origin1,
+ ContentSettingsType::GEOLOCATION);
+ EXPECT_EQ(2U, change_observer.change_counter());
+
+ // Registering a different origin should trigger OnContentSettingChanged.
+ const url::Origin origin2 = url::Origin::Create(GURL("chrome://test2"));
+ allowlist->RegisterAutoGrantedPermission(origin2,
+ ContentSettingsType::GEOLOCATION);
+ EXPECT_EQ(3U, change_observer.change_counter());
+}
diff --git a/chromium/chrome/browser/ui/webui/webui_load_timer_browsertest.cc b/chromium/chrome/browser/ui/webui/webui_load_timer_browsertest.cc
index 2e9bb955b99..c10da63374f 100644
--- a/chromium/chrome/browser/ui/webui/webui_load_timer_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/webui_load_timer_browsertest.cc
@@ -10,6 +10,7 @@
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
diff --git a/chromium/chrome/browser/ui/webui/webui_util.cc b/chromium/chrome/browser/ui/webui/webui_util.cc
index 26c0fe8748c..2398fea5171 100644
--- a/chromium/chrome/browser/ui/webui/webui_util.cc
+++ b/chromium/chrome/browser/ui/webui/webui_util.cc
@@ -38,7 +38,7 @@ void SetupWebUIDataSource(content::WebUIDataSource* source,
source->AddResourcePath(path, resource.value);
}
- source->SetDefaultResource(default_resource);
+ source->AddResourcePath("", default_resource);
}
#if BUILDFLAG(OPTIMIZE_WEBUI)
@@ -48,7 +48,7 @@ void SetupBundledWebUIDataSource(content::WebUIDataSource* source,
int default_resource) {
SetupPolymer3Defaults(source);
source->AddResourcePath(bundled_path, bundle);
- source->SetDefaultResource(default_resource);
+ source->AddResourcePath("", default_resource);
}
#endif
@@ -64,4 +64,10 @@ void AddResourcePathsBulk(content::WebUIDataSource* source,
source->AddResourcePath(path.path, path.id);
}
+void AddResourcePathsBulk(content::WebUIDataSource* source,
+ base::span<const GritResourceMap> resources) {
+ for (const auto& resource : resources)
+ source->AddResourcePath(resource.name, resource.value);
+}
+
} // namespace webui
diff --git a/chromium/chrome/browser/ui/webui/webui_util.h b/chromium/chrome/browser/ui/webui/webui_util.h
index 728da9d8642..bf7c5d65d4f 100644
--- a/chromium/chrome/browser/ui/webui/webui_util.h
+++ b/chromium/chrome/browser/ui/webui/webui_util.h
@@ -11,13 +11,14 @@
#include "base/strings/string_piece.h"
#include "chrome/common/buildflags.h"
+struct GritResourceMap;
+
namespace content {
class WebUIDataSource;
}
-struct GritResourceMap;
-
namespace webui {
+
struct LocalizedString;
struct ResourcePath {
@@ -53,6 +54,11 @@ void AddLocalizedStringsBulk(content::WebUIDataSource* html_source,
void AddResourcePathsBulk(content::WebUIDataSource* source,
base::span<const ResourcePath> paths);
+// AddResourcePathsBulk() variant that works with GritResourceMap.
+// Use base::make_span(kResourceMap, kResourceMapSize).
+void AddResourcePathsBulk(content::WebUIDataSource* source,
+ base::span<const GritResourceMap> resources);
+
} // namespace webui
#endif // CHROME_BROWSER_UI_WEBUI_WEBUI_UTIL_H_
diff --git a/chromium/chrome/browser/ui/webui/webui_webview_browsertest.cc b/chromium/chrome/browser/ui/webui/webui_webview_browsertest.cc
index 1d6c0e12f3c..76c283a433a 100644
--- a/chromium/chrome/browser/ui/webui/webui_webview_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/webui_webview_browsertest.cc
@@ -21,6 +21,7 @@
#include "content/public/browser/render_widget_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/drop_data.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "extensions/test/extension_test_message_listener.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
diff --git a/chromium/chrome/browser/ui/webui/welcome/helpers.cc b/chromium/chrome/browser/ui/webui/welcome/helpers.cc
index 7800809ecf0..0bf455d39d3 100644
--- a/chromium/chrome/browser/ui/webui/welcome/helpers.cc
+++ b/chromium/chrome/browser/ui/webui/welcome/helpers.cc
@@ -12,6 +12,7 @@
#include "base/metrics/field_trial_params.h"
#include "base/strings/string_split.h"
#include "base/strings/string_tokenizer.h"
+#include "base/strings/string_util.h"
#include "base/values.h"
#include "build/branding_buildflags.h"
#include "chrome/browser/browser_process.h"
diff --git a/chromium/chrome/browser/ui/webui/welcome/welcome_ui.cc b/chromium/chrome/browser/ui/webui/welcome/welcome_ui.cc
index 659d9d617da..12cb92c2c64 100644
--- a/chromium/chrome/browser/ui/webui/welcome/welcome_ui.cc
+++ b/chromium/chrome/browser/ui/webui/welcome/welcome_ui.cc
@@ -6,6 +6,7 @@
#include "base/bind.h"
#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_util.h"
#include "build/branding_buildflags.h"
#include "chrome/browser/signin/account_consistency_mode_manager.h"
#include "chrome/browser/ui/webui/webui_util.h"
diff --git a/chromium/chrome/browser/upboarding/BUILD.gn b/chromium/chrome/browser/upboarding/BUILD.gn
deleted file mode 100644
index e6d975a350a..00000000000
--- a/chromium/chrome/browser/upboarding/BUILD.gn
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright 2020 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-if (is_android) {
- import("//build/config/android/config.gni")
- import("//build/config/android/rules.gni")
-}
-
-group("upboarding") {
- deps = [ "//chrome/browser/upboarding/query_tiles" ]
-}
-
-group("unit_tests") {
- testonly = true
- deps = [ "//chrome/browser/upboarding/query_tiles:unit_tests" ]
-}
-
-if (is_android) {
- java_group("java") {
- deps = [ "query_tiles:query_tiles_java" ]
- }
-}
diff --git a/chromium/chrome/browser/upboarding/query_tiles/BUILD.gn b/chromium/chrome/browser/upboarding/query_tiles/BUILD.gn
deleted file mode 100644
index 26d7d6f6f40..00000000000
--- a/chromium/chrome/browser/upboarding/query_tiles/BUILD.gn
+++ /dev/null
@@ -1,129 +0,0 @@
-# Copyright 2020 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-if (is_android) {
- import("//build/config/android/config.gni")
- import("//build/config/android/rules.gni")
-}
-
-if (is_android) {
- java_group("query_tiles_java") {
- deps = [ ":public_java" ]
- }
-}
-
-group("query_tiles") {
- public_deps = [
- ":factory",
- ":public",
- ]
-
- deps = [ "internal" ]
-}
-
-source_set("public") {
- sources = [
- "query_tile_entry.cc",
- "query_tile_entry.h",
- "tile_service.h",
- ]
-
- deps = [ "//ui/gfx" ]
-
- public_deps = [
- "//base",
- "//components/keyed_service/core",
- ]
-
- if (is_android) {
- sources += [
- "android/tile_provider_bridge.cc",
- "android/tile_provider_bridge.h",
- ]
-
- deps += [ ":jni_headers" ]
- }
-}
-
-source_set("factory") {
- sources = [
- "tile_service_factory_helper.cc",
- "tile_service_factory_helper.h",
- ]
-
- deps = [
- ":public",
- "internal:internal",
- ]
-}
-
-if (is_android) {
- android_library("public_java") {
- sources = [
- "android/java/src/org/chromium/chrome/browser/query_tiles/QueryTileCoordinator.java",
- "android/java/src/org/chromium/chrome/browser/query_tiles/QueryTileCoordinatorFactory.java",
- "android/java/src/org/chromium/chrome/browser/query_tiles/Tile.java",
- "android/java/src/org/chromium/chrome/browser/query_tiles/TileProvider.java",
- "android/java/src/org/chromium/chrome/browser/query_tiles/bridges/TileProviderBridge.java",
- "android/java/src/org/chromium/chrome/browser/query_tiles/list/QueryTileCoordinatorImpl.java",
- "android/java/src/org/chromium/chrome/browser/query_tiles/list/TileListModel.java",
- "android/java/src/org/chromium/chrome/browser/query_tiles/list/TileListProperties.java",
- "android/java/src/org/chromium/chrome/browser/query_tiles/list/TileListPropertyViewBinder.java",
- "android/java/src/org/chromium/chrome/browser/query_tiles/list/TileListView.java",
- "android/java/src/org/chromium/chrome/browser/query_tiles/list/TileViewHolder.java",
- ]
-
- deps = [
- ":chrome_upboarding_query_tiles_java_resources",
- "//base:base_java",
- "//base:jni_java",
- "//third_party/android_deps:androidx_recyclerview_recyclerview_java",
- "//ui/android:ui_java",
- ]
-
- annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
- }
-
- generate_jni("jni_headers") {
- visibility = [ ":*" ]
-
- sources = [ "android/java/src/org/chromium/chrome/browser/query_tiles/bridges/TileProviderBridge.java" ]
- }
-
- android_resources("chrome_upboarding_query_tiles_java_resources") {
- sources = [ "android/java/res/layout/query_tile_view.xml" ]
- custom_package = "org.chromium.chrome.query_tiles"
- }
-
- android_library("query_tiles_javatests") {
- testonly = true
-
- sources = [ "android/javatests/src/org/chromium/chrome/browser/query_tiles/QueryTileSectionTest.java" ]
-
- deps = [
- ":public_java",
- "//base:base_java",
- "//base:base_java_test_support",
- "//chrome/android:chrome_java",
- "//chrome/android:chrome_test_util_java",
- "//chrome/test/android:chrome_java_test_support",
- "//third_party/espresso:espresso_all_java",
- "//third_party/hamcrest:hamcrest_java",
- "//third_party/junit",
- "//third_party/mockito:mockito_java",
- ]
- }
-}
-
-source_set("unit_tests") {
- testonly = true
- sources = [ "query_tile_entry_unittest.cc" ]
- visibility = [ "//chrome/browser/upboarding:unit_tests" ]
- deps = [
- ":public",
- "//chrome/browser/upboarding/query_tiles/internal:unit_tests",
- "//testing/gtest",
- "//url",
- ]
-}
diff --git a/chromium/chrome/browser/upboarding/query_tiles/internal/BUILD.gn b/chromium/chrome/browser/upboarding/query_tiles/internal/BUILD.gn
deleted file mode 100644
index d71ae15c155..00000000000
--- a/chromium/chrome/browser/upboarding/query_tiles/internal/BUILD.gn
+++ /dev/null
@@ -1,78 +0,0 @@
-# Copyright 2020 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-if (is_android) {
- import("//build/config/android/config.gni")
- import("//build/config/android/rules.gni")
-}
-
-source_set("internal") {
- sources = [
- "cached_image_loader.cc",
- "cached_image_loader.h",
- "config.cc",
- "config.h",
- "image_data_store.cc",
- "image_data_store.h",
- "image_decoder.cc",
- "image_decoder.h",
- "image_info_store.cc",
- "image_info_store.h",
- "image_loader.h",
- "proto_conversion.cc",
- "proto_conversion.h",
- "query_tile_store.cc",
- "query_tile_store.h",
- "query_tile_types.h",
- "store.h",
- "tile_info_fetcher.cc",
- "tile_info_fetcher.h",
- "tile_service_impl.cc",
- "tile_service_impl.h",
- ]
-
- deps = [
- "//base",
- "//chrome/browser/upboarding/query_tiles:public",
- "//chrome/browser/upboarding/query_tiles/proto",
- "//components/image_fetcher/core",
- "//components/leveldb_proto",
- "//net",
- "//services/data_decoder/public/cpp",
- "//services/network/public/cpp",
- "//skia",
- "//url",
- ]
-}
-
-source_set("unit_tests") {
- testonly = true
- visibility = [ "//chrome/browser/upboarding/query_tiles:unit_tests" ]
-
- sources = [
- "cached_image_loader_unittest.cc",
- "image_decoder_unittest.cc",
- "proto_conversion_unittest.cc",
- "query_tile_store_unittest.cc",
- "tile_info_fetcher_unittest.cc",
- ]
-
- deps = [
- ":internal",
- "//base",
- "//base/test:test_support",
- "//chrome/browser/upboarding/query_tiles:public",
- "//chrome/browser/upboarding/query_tiles/internal",
- "//chrome/browser/upboarding/query_tiles/proto",
- "//chrome/browser/upboarding/query_tiles/test:test_lib",
- "//components/image_fetcher/core:test_support",
- "//components/leveldb_proto",
- "//components/leveldb_proto:test_support",
- "//services/data_decoder/public/cpp:test_support",
- "//skia",
- "//testing/gmock",
- "//testing/gtest",
- "//url",
- ]
-}
diff --git a/chromium/chrome/browser/upboarding/query_tiles/test/BUILD.gn b/chromium/chrome/browser/upboarding/query_tiles/test/BUILD.gn
deleted file mode 100644
index c18e50ce33c..00000000000
--- a/chromium/chrome/browser/upboarding/query_tiles/test/BUILD.gn
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright 2020 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("test_lib") {
- testonly = true
-
- visibility = [
- "//chrome/browser/upboarding/query_tiles/internal:unit_tests",
- "//chrome/browser/upboarding/query_tiles:unit_tests",
- ]
-
- sources = [
- "test_utils.cc",
- "test_utils.h",
- ]
-
- deps = [
- "//chrome/browser/upboarding/query_tiles:public",
- "//chrome/browser/upboarding/query_tiles/internal",
- "//testing/gmock",
- "//testing/gtest",
- ]
-}
diff --git a/chromium/chrome/browser/util/BUILD.gn b/chromium/chrome/browser/util/BUILD.gn
index 5c406d1c5c2..d68f29b0853 100644
--- a/chromium/chrome/browser/util/BUILD.gn
+++ b/chromium/chrome/browser/util/BUILD.gn
@@ -9,9 +9,7 @@ android_library("java") {
"android/java/src/org/chromium/chrome/browser/util/AccessibilityUtil.java",
"android/java/src/org/chromium/chrome/browser/util/AndroidTaskUtils.java",
"android/java/src/org/chromium/chrome/browser/util/BitmapCache.java",
- "android/java/src/org/chromium/chrome/browser/util/ChromeContextUtil.java",
"android/java/src/org/chromium/chrome/browser/util/ChromeFileProvider.java",
- "android/java/src/org/chromium/chrome/browser/util/ConversionUtils.java",
"android/java/src/org/chromium/chrome/browser/util/FileSizeUtil.java",
"android/java/src/org/chromium/chrome/browser/util/HashUtil.java",
"android/java/src/org/chromium/chrome/browser/util/KeyNavigationUtil.java",
@@ -21,6 +19,7 @@ android_library("java") {
deps = [
"//base:base_java",
"//base:jni_java",
+ "//components/browser_ui/util/android:java",
"//components/embedder_support/android:util_java",
"//content/public/android:content_java",
"//third_party/android_deps:androidx_collection_collection_java",
@@ -32,10 +31,8 @@ android_library("java") {
}
generate_jni("jni_headers") {
- sources = [
- "android/java/src/org/chromium/chrome/browser/util/ChromeContextUtil.java",
- "android/java/src/org/chromium/chrome/browser/util/PlatformUtil.java",
- ]
+ sources =
+ [ "android/java/src/org/chromium/chrome/browser/util/PlatformUtil.java" ]
}
android_library("javatests") {
diff --git a/chromium/chrome/browser/vr/BUILD.gn b/chromium/chrome/browser/vr/BUILD.gn
index e3ef3aaeff5..21a50e49892 100644
--- a/chromium/chrome/browser/vr/BUILD.gn
+++ b/chromium/chrome/browser/vr/BUILD.gn
@@ -247,14 +247,11 @@ component("vr_common") {
"platform_controller.h",
"scheduler_browser_renderer_interface.h",
"scheduler_delegate.h",
- "service/xr_device_service.cc",
- "service/xr_device_service.h",
"sounds_manager_audio_delegate.cc",
"sounds_manager_audio_delegate.h",
"vr_export.h",
"vr_web_contents_observer.cc",
"vr_web_contents_observer.h",
- "xr_test_utils.h",
]
sources += [
@@ -346,13 +343,6 @@ component("vr_base") {
"metrics/consent_flow_metrics_helper.h",
"metrics/metrics_helper.cc",
"metrics/metrics_helper.h",
- "metrics/session_metrics_helper.cc",
- "metrics/session_metrics_helper.h",
- "metrics/session_timer.cc",
- "metrics/session_timer.h",
- "metrics/session_tracker.h",
- "metrics/webxr_session_tracker.cc",
- "metrics/webxr_session_tracker.h",
"mode.h",
"model/assets.cc",
"model/assets.h",
@@ -412,6 +402,7 @@ component("vr_base") {
"//components/omnibox/browser",
"//components/strings:components_strings_grit",
"//content/public/common",
+ "//device/vr/public/cpp",
"//ui/base",
]
@@ -477,7 +468,6 @@ test("vr_common_unittests") {
"gesture_detector_unittest.cc",
"model/text_input_info_unittest.cc",
"platform_ui_input_delegate_unittest.cc",
- "service/xr_runtime_manager_unittest.cc",
"speech_recognizer_unittest.cc",
"test/paths.cc",
"test/paths.h",
@@ -674,6 +664,7 @@ if (!is_android) {
"//chrome/test:xr_browser_tests_common",
"//device/vr:vr",
"//device/vr/buildflags:buildflags",
+ "//device/vr/orientation",
"//device/vr/public/mojom",
"//device/vr/public/mojom:test_mojom",
]
diff --git a/chromium/chrome/browser/web_applications/BUILD.gn b/chromium/chrome/browser/web_applications/BUILD.gn
index fcfdc3d5883..6181b1a742a 100644
--- a/chromium/chrome/browser/web_applications/BUILD.gn
+++ b/chromium/chrome/browser/web_applications/BUILD.gn
@@ -16,6 +16,8 @@ group("web_app_test_group") {
# Extension codepaths have been removed.
source_set("common") {
sources = [
+ "daily_metrics_helper.cc",
+ "daily_metrics_helper.h",
"manifest_update_manager.cc",
"manifest_update_manager.h",
"manifest_update_task.cc",
@@ -34,6 +36,7 @@ source_set("common") {
"//components/content_settings/core/browser",
"//components/pref_registry",
"//content/public/browser",
+ "//services/metrics/public/cpp:ukm_builders",
"//skia",
]
@@ -122,6 +125,8 @@ source_set("web_applications_test_support") {
"test/service_worker_registration_waiter.h",
"test/test_app_registrar.cc",
"test/test_app_registrar.h",
+ "test/test_app_registry_controller.cc",
+ "test/test_app_registry_controller.h",
"test/test_app_shortcut_manager.cc",
"test/test_app_shortcut_manager.h",
"test/test_data_retriever.cc",
@@ -177,6 +182,7 @@ source_set("web_applications_unit_tests") {
testonly = true
sources = [
+ "daily_metrics_helper_unittest.cc",
"external_web_app_manager_unittest.cc",
"pending_app_manager_impl_unittest.cc",
"web_app_database_unittest.cc",
@@ -201,7 +207,9 @@ source_set("web_applications_unit_tests") {
"//chrome/test:test_support",
"//content/public/browser",
"//content/test:test_support",
+ "//services/metrics/public/cpp:ukm_builders",
"//skia",
+ "//testing/gmock",
"//testing/gtest",
]
@@ -250,7 +258,10 @@ source_set("web_applications_browser_tests") {
]
if (is_chromeos) {
- deps += [ "//chrome/browser/ui" ]
+ deps += [
+ "//chrome/browser/chromeos",
+ "//chrome/browser/ui",
+ ]
}
}
@@ -303,6 +314,7 @@ source_set("web_applications_on_extensions_test_support") {
"//chrome/browser",
"//chrome/browser/web_applications/components",
"//components/keyed_service/content",
+ "//ui/webui",
]
}
diff --git a/chromium/chrome/browser/web_applications/chrome_pwa_launcher/BUILD.gn b/chromium/chrome/browser/web_applications/chrome_pwa_launcher/BUILD.gn
index 84503d8b700..be39c62e864 100644
--- a/chromium/chrome/browser/web_applications/chrome_pwa_launcher/BUILD.gn
+++ b/chromium/chrome/browser/web_applications/chrome_pwa_launcher/BUILD.gn
@@ -21,6 +21,7 @@ executable("chrome_pwa_launcher") {
":chrome_pwa_launcher_version",
":util",
"//base",
+ "//build:branding_buildflags",
"//chrome/common:non_code_constants",
"//chrome/install_static:install_static_util",
"//components/version_info:generate_version_info",
@@ -39,6 +40,7 @@ source_set("util") {
public = [
"chrome_pwa_launcher_util.h",
"last_browser_file_util.h",
+ "launcher_log_reporter.h",
"launcher_update.h",
]
@@ -47,6 +49,9 @@ source_set("util") {
"last_browser_file_util.cc",
"launcher_log.cc",
"launcher_log.h",
+ "launcher_log_reporter.cc",
+ "launcher_log_util.cc",
+ "launcher_log_util.h",
"launcher_update.cc",
]
diff --git a/chromium/chrome/browser/web_applications/components/BUILD.gn b/chromium/chrome/browser/web_applications/components/BUILD.gn
index 30b26f88b3b..1ef11da4744 100644
--- a/chromium/chrome/browser/web_applications/components/BUILD.gn
+++ b/chromium/chrome/browser/web_applications/components/BUILD.gn
@@ -12,7 +12,6 @@ source_set("components") {
"app_registry_controller.h",
"app_shortcut_manager.cc",
"app_shortcut_manager.h",
- "app_shortcut_observer.h",
"external_install_options.cc",
"external_install_options.h",
"externally_installed_web_app_prefs.cc",
@@ -33,6 +32,8 @@ source_set("components") {
"policy/web_app_policy_manager.h",
"web_app_audio_focus_id_map.cc",
"web_app_audio_focus_id_map.h",
+ "web_app_chromeos_data.cc",
+ "web_app_chromeos_data.h",
"web_app_constants.cc",
"web_app_constants.h",
"web_app_data_retriever.cc",
@@ -54,6 +55,8 @@ source_set("components") {
"web_app_provider_base_factory.h",
"web_app_shortcut.cc",
"web_app_shortcut.h",
+ "web_app_shortcuts_menu.cc",
+ "web_app_shortcuts_menu.h",
"web_app_tab_helper_base.cc",
"web_app_tab_helper_base.h",
"web_app_ui_manager.h",
@@ -103,6 +106,8 @@ source_set("components") {
"web_app_file_handler_registration_win.h",
"web_app_shortcut_win.cc",
"web_app_shortcut_win.h",
+ "web_app_shortcuts_menu_win.cc",
+ "web_app_shortcuts_menu_win.h",
]
}
@@ -143,8 +148,8 @@ source_set("unit_tests") {
testonly = true
sources = [
- "app_shortcut_manager_unittest.cc",
"file_handler_manager_unittest.cc",
+ "install_finalizer_unittest.cc",
"pending_app_manager_unittest.cc",
"web_app_constants_unittest.cc",
"web_app_data_retriever_unittest.cc",
@@ -180,7 +185,9 @@ source_set("unit_tests") {
"//base/test:test_support",
"//chrome/app/theme:theme_resources",
"//chrome/browser/web_applications:web_app_test_group",
+ "//chrome/browser/web_applications:web_applications",
"//chrome/browser/web_applications:web_applications_test_support",
+ "//chrome/browser/web_applications/extensions:extensions",
"//chrome/test:test_support",
"//content/public/browser",
"//skia",
diff --git a/chromium/chrome/browser/win/conflicts/BUILD.gn b/chromium/chrome/browser/win/conflicts/BUILD.gn
index b09240ddb6f..9e49b7be28b 100644
--- a/chromium/chrome/browser/win/conflicts/BUILD.gn
+++ b/chromium/chrome/browser/win/conflicts/BUILD.gn
@@ -100,6 +100,7 @@ if (is_chrome_branded) {
"//chrome/chrome_elf:third_party_shared_defines",
"//chrome/test:test_support_ui",
"//components/services/quarantine/public/cpp:features",
+ "//content/test:test_support",
"//testing/gtest",
]
}
diff --git a/chromium/chrome/browser/xsurface/BUILD.gn b/chromium/chrome/browser/xsurface/BUILD.gn
index ee438487823..7cce4e16c59 100644
--- a/chromium/chrome/browser/xsurface/BUILD.gn
+++ b/chromium/chrome/browser/xsurface/BUILD.gn
@@ -1,5 +1,5 @@
-# Copyright 2020 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
+# Copyright 2020 The Chromium Authors.All rights reserved.
+# Use of this source code is governed by a BSD - style license that can be
# found in the LICENSE file.
import("//build/config/android/rules.gni")
@@ -10,9 +10,11 @@ android_library("java") {
"android/java/src/org/chromium/chrome/browser/xsurface/HybridListRenderer.java",
"android/java/src/org/chromium/chrome/browser/xsurface/ListContentManager.java",
"android/java/src/org/chromium/chrome/browser/xsurface/ListContentManagerObserver.java",
+ "android/java/src/org/chromium/chrome/browser/xsurface/ProcessScope.java",
"android/java/src/org/chromium/chrome/browser/xsurface/SurfaceActionsHandler.java",
"android/java/src/org/chromium/chrome/browser/xsurface/SurfaceDependencyProvider.java",
"android/java/src/org/chromium/chrome/browser/xsurface/SurfaceRenderer.java",
+ "android/java/src/org/chromium/chrome/browser/xsurface/SurfaceScope.java",
]
- deps = []
+ deps = [ "//third_party/android_deps:androidx_annotation_annotation_java" ]
}