From e733310db58160074f574c429d48f8308c0afe17 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Wed, 8 Mar 2017 10:28:10 +0100 Subject: BASELINE: Update Chromium to 56.0.2924.122 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I4e04de8f47e47e501c46ed934c76a431c6337ced Reviewed-by: Michael BrĂ¼ning --- chromium/chrome/browser/BUILD.gn | 232 +++++++--- chromium/chrome/browser/android/vr_shell/BUILD.gn | 146 +++--- chromium/chrome/browser/browser_resources.grd | 49 +- .../chrome_content_browser_manifest_overlay.json | 84 +++- .../chrome_content_gpu_manifest_overlay.json | 17 +- .../chrome_content_plugin_manifest_overlay.json | 12 + .../chrome_content_renderer_manifest_overlay.json | 23 + .../chrome_content_utility_manifest_overlay.json | 22 +- .../chrome/browser/chrome_notification_types.h | 18 +- chromium/chrome/browser/chromeos/BUILD.gn | 169 ++++--- chromium/chrome/browser/devtools/BUILD.gn | 8 +- chromium/chrome/browser/extensions/BUILD.gn | 23 +- .../extensions/api/activity_log_private/OWNERS | 2 +- .../activity_log_private_apitest.cc | 1 - .../autofill_private/autofill_private_apitest.cc | 28 +- .../api/autofill_private/autofill_util.cc | 7 +- .../automation_action_adapter.h | 26 +- .../automation_internal/automation_internal_api.cc | 59 +-- .../api/autotest_private/autotest_private_api.cc | 4 +- .../bookmark_manager_private_api.cc | 24 +- .../bookmark_manager_private_api.h | 11 +- .../braille_display_private/braille_controller.h | 4 +- .../braille_controller_brlapi.cc | 43 +- .../braille_controller_brlapi.h | 4 +- .../braille_display_private_api.cc | 6 +- .../braille_display_private_apitest.cc | 52 ++- .../braille_display_private/brlapi_connection.cc | 27 +- .../braille_display_private/brlapi_connection.h | 14 +- .../braille_display_private/brlapi_keycode_map.cc | 10 +- .../mock_braille_controller.cc | 6 +- .../stub_braille_controller.cc | 5 +- .../stub_braille_controller.h | 4 +- .../cast_devices_private_api.cc | 108 ----- .../cast_devices_private_api.h | 72 --- .../api/cast_streaming/cast_streaming_apitest.cc | 2 +- .../api/cast_streaming/performance_test.cc | 2 +- .../certificate_provider_apitest.cc | 11 +- .../extensions/api/chrome_extensions_api_client.cc | 17 +- .../cloud_print_private/cloud_print_private_api.cc | 7 +- .../extensions/api/commands/command_service.cc | 15 +- .../api/content_settings/content_settings_store.cc | 26 +- .../content_settings_store_unittest.cc | 76 +++ .../api/context_menus/context_menus_api_helpers.h | 4 +- .../declarative_content_apitest.cc | 8 - .../webrequest_action_unittest.cc | 3 +- .../api/desktop_capture/desktop_capture_api.cc | 7 +- .../api/desktop_capture/desktop_capture_api.h | 4 + .../api/desktop_capture/desktop_capture_base.cc | 42 +- .../api/desktop_capture/desktop_capture_base.h | 8 + .../api/device_permissions_manager_unittest.cc | 2 +- .../browser/extensions/api/dial/dial_service.cc | 18 +- .../browser/extensions/api/dial/dial_service.h | 2 +- .../api/downloads/downloads_api_browsertest.cc | 21 +- .../easy_unlock_private_api_chromeos_unittest.cc | 16 +- .../enterprise_device_attributes_apitest.cc | 3 +- .../enterprise_platform_keys_api_unittest.cc | 10 +- .../enterprise_platform_keys_apitest_nss.cc | 1 - ...nterprise_platform_keys_private_api_unittest.cc | 10 +- .../api/extension_action/browser_action_apitest.cc | 27 ++ .../browser_action_interactive_test.cc | 2 + .../api/extension_action/extension_action_api.cc | 131 +++--- .../api/extension_action/extension_action_api.h | 31 +- .../api/font_settings/font_settings_api.cc | 25 +- .../extensions/api/gcd_private/gcd_private_api.cc | 7 +- .../api/hotword_private/hotword_private_apitest.cc | 7 +- .../extensions/api/identity/identity_api.cc | 3 +- .../extensions/api/identity/identity_apitest.cc | 3 +- .../extensions/api/identity/web_auth_flow.h | 2 - .../api/image_writer_private/operation.h | 3 +- .../api/image_writer_private/operation_manager.h | 3 +- .../api/input_ime/input_ime_api_chromeos.cc | 2 +- .../api/log_private/log_private_api_chromeos.cc | 7 +- .../browser/extensions/api/mdns/dns_sd_registry.cc | 18 +- .../browser/extensions/api/mdns/dns_sd_registry.h | 7 +- .../api/media_galleries/media_galleries_apitest.cc | 7 + .../extensions/api/messaging/message_service.h | 4 +- .../api/messaging/native_message_host_chromeos.cc | 21 +- .../api/metrics_private/metrics_private_api.cc | 215 --------- .../api/metrics_private/metrics_private_api.h | 197 -------- .../api/networking_private/crypto_verify_impl.cc | 2 +- .../networking_private_chromeos_apitest.cc | 7 +- .../networking_private_credentials_getter_mac.cc | 2 +- .../networking_private_credentials_getter_win.cc | 2 +- .../networking_private_crypto.cc | 187 ++++++++ .../networking_private/networking_private_crypto.h | 61 +++ .../networking_private_crypto_unittest.cc | 231 ++++++++++ .../networking_private_ui_delegate_chromeos.cc | 17 +- .../api/passwords_private/passwords_private_api.cc | 45 +- .../api/passwords_private/passwords_private_api.h | 6 + .../passwords_private/passwords_private_apitest.cc | 11 +- .../passwords_private/passwords_private_delegate.h | 11 +- .../passwords_private_delegate_impl.cc | 51 +- .../passwords_private_delegate_impl.h | 21 +- .../passwords_private_delegate_impl_unittest.cc | 84 ++++ .../extensions/api/permissions/permissions_api.cc | 49 +- .../extensions/api/permissions/permissions_api.h | 12 +- .../api/platform_keys/platform_keys_apitest_nss.cc | 8 +- .../api/platform_keys/verify_trust_api.cc | 8 +- .../extensions/api/preference/preference_api.cc | 145 +++--- .../extensions/api/preference/preference_api.h | 17 +- .../screenlock_private/screenlock_private_api.cc | 5 +- .../screenlock_private/screenlock_private_api.h | 4 +- .../extensions/api/sessions/sessions_api.cc | 178 ++++--- .../browser/extensions/api/sessions/sessions_api.h | 26 +- .../extensions/api/sessions/sessions_apitest.cc | 13 +- .../browser/extensions/api/settings_private/OWNERS | 1 + .../extensions/api/settings_private/prefs_util.cc | 397 ++++++++-------- .../extensions/api/settings_private/prefs_util.h | 5 + .../api/settings_private/settings_private_api.cc | 25 +- .../api/settings_private/settings_private_api.h | 28 +- .../settings_private/settings_private_delegate.cc | 10 +- .../settings_private/settings_private_delegate.h | 4 +- .../settings_private_delegate_factory.cc | 9 + .../settings_private_delegate_factory.h | 2 + .../settings_private_event_router.cc | 8 +- .../settings_private_event_router.h | 8 +- .../api/signed_in_devices/signed_in_devices_api.cc | 13 +- .../api/signed_in_devices/signed_in_devices_api.h | 4 +- .../api/socket/combined_socket_unittest.cc | 4 +- .../extensions/api/socket/tcp_socket_unittest.cc | 9 +- .../extensions/api/socket/tls_socket_unittest.cc | 8 +- .../extensions/api/socket/udp_socket_unittest.cc | 4 +- .../api/storage/managed_value_store_cache.cc | 92 ++-- .../api/storage/managed_value_store_cache.h | 15 +- .../extensions/api/storage/setting_sync_data.cc | 2 +- .../extensions/api/storage/setting_sync_data.h | 2 +- .../extensions/api/storage/settings_apitest.cc | 14 +- .../api/storage/settings_sync_processor.cc | 4 +- .../api/storage/settings_sync_processor.h | 2 +- .../api/storage/settings_sync_unittest.cc | 8 +- .../extensions/api/storage/settings_sync_util.h | 4 +- .../extensions/api/storage/sync_storage_backend.cc | 20 +- .../extensions/api/storage/sync_storage_backend.h | 7 +- .../api/storage/sync_value_store_cache.h | 2 +- .../api/storage/syncable_settings_storage.cc | 2 +- .../api/storage/syncable_settings_storage.h | 4 +- .../api/streams_private/streams_private_api.cc | 2 +- .../api/streams_private/streams_private_api.h | 6 +- .../api/sync_file_system/sync_file_system_api.cc | 35 +- .../api/sync_file_system/sync_file_system_api.h | 12 +- .../extensions/api/tab_capture/tab_capture_api.cc | 42 +- .../extensions/api/tab_capture/tab_capture_api.h | 8 +- .../extensions/api/tabs/ash_panel_contents.h | 8 - .../chrome/browser/extensions/api/tabs/tabs_api.cc | 7 +- .../browser/extensions/api/tabs/tabs_constants.cc | 1 - .../browser/extensions/api/tabs/tabs_constants.h | 1 - .../extensions/api/tabs/tabs_interactive_test.cc | 35 +- .../browser/extensions/api/tabs/tabs_test.cc | 31 ++ .../api/web_navigation/frame_navigation_state.cc | 2 +- .../api/web_navigation/frame_navigation_state.h | 1 - .../api/web_navigation/web_navigation_api.cc | 50 +- .../api/web_navigation/web_navigation_api.h | 8 +- .../api/web_navigation/web_navigation_apitest.cc | 29 +- ..._extension_web_request_event_router_delegate.cc | 5 + .../api/web_request/web_request_api_unittest.cc | 81 ++-- .../api/web_request/web_request_apitest.cc | 81 +++- .../web_request_event_details_unittest.cc | 67 +++ .../web_request_permissions_unittest.cc | 95 +++- .../webrtc_audio_private_browsertest.cc | 5 +- .../webrtc_logging_private_api.cc | 50 +- .../api/webstore_private/webstore_private_api.cc | 32 +- .../webstore_private/webstore_private_apitest.cc | 43 ++ .../browser/media/router/mojo/media_router.mojom | 2 +- chromium/chrome/browser/ntp_snippets/BUILD.gn | 13 + .../printing/background_printing_manager.cc | 17 +- .../browser/printing/background_printing_manager.h | 5 +- .../cloud_print_proxy_service_unittest.cc | 22 +- .../printing/cloud_print/gcd_api_flow_impl.cc | 3 + .../browser/printing/cloud_print/privet_http.h | 1 - .../printing/cloud_print/privet_http_impl.cc | 9 +- .../printing/cloud_print/privet_http_impl.h | 3 +- .../printing/cloud_print/privet_http_unittest.cc | 7 +- .../printing/cloud_print/privet_notifications.cc | 39 +- .../printing/cloud_print/privet_notifications.h | 25 +- .../cloud_print/privet_notifications_unittest.cc | 140 +++++- .../cloud_print/privet_traffic_detector.cc | 4 +- .../printing/cloud_print/privet_url_fetcher.cc | 4 + .../chrome/browser/printing/pdf_to_emf_converter.h | 6 +- .../chrome/browser/printing/print_job_manager.cc | 7 +- .../chrome/browser/printing/print_job_manager.h | 2 +- .../chrome/browser/printing/print_job_worker.cc | 25 +- .../chrome/browser/printing/print_job_worker.h | 4 +- .../print_preview_dialog_controller_browsertest.cc | 3 +- .../print_preview_dialog_controller_unittest.cc | 28 +- .../printing/print_preview_message_handler.cc | 19 +- .../printing/print_preview_message_handler.h | 5 +- .../print_preview_pdf_generated_browsertest.cc | 41 +- .../chrome/browser/printing/print_view_manager.cc | 100 ++-- .../chrome/browser/printing/print_view_manager.h | 32 +- .../browser/printing/print_view_manager_base.cc | 127 +++-- .../browser/printing/print_view_manager_base.h | 32 +- .../browser/printing/print_view_manager_common.cc | 75 ++- .../browser/printing/print_view_manager_common.h | 11 +- chromium/chrome/browser/printing/printer_query.cc | 4 +- chromium/chrome/browser/printing/printer_query.h | 2 +- .../browser/printing/printing_message_filter.cc | 64 ++- .../browser/printing/printing_message_filter.h | 39 +- .../browser/printing/pwg_raster_converter.cc | 93 ++-- .../chrome/browser/printing/pwg_raster_converter.h | 9 +- .../pepper/chrome_browser_pepper_host_factory.cc | 2 - .../pepper/pepper_flash_browser_host.cc | 32 +- .../pepper/pepper_flash_browser_host.h | 12 + .../pepper_isolated_file_system_message_filter.cc | 18 +- .../pepper_platform_verification_message_filter.cc | 49 +- .../pepper_platform_verification_message_filter.h | 10 +- chromium/chrome/browser/resources/BUILD.gn | 5 + .../bluetooth_internals/adapter_broker.js | 147 ++++++ .../bluetooth_internals/bluetooth_internals.css | 78 +++- .../bluetooth_internals/bluetooth_internals.html | 30 +- .../bluetooth_internals/bluetooth_internals.js | 118 ++--- .../bluetooth_internals/device_collection.js | 85 ++++ .../resources/bluetooth_internals/device_table.js | 143 ++++++ .../resources/bluetooth_internals/interfaces.js | 33 ++ .../bookmark_manager/js/bmm/bookmark_list.js | 9 + .../browser/resources/chromeos/chromevox/BUILD.gn | 5 +- .../chromevox/background/keymaps/next_keymap.json | 37 +- .../resources/chromeos/chromevox/run_jsbundler.gni | 2 +- .../resources/chromeos/chromevox/strings/BUILD.gn | 2 + .../chromevox/strings/chromevox_strings.grd | 138 +++++- .../chromeos/login/compiled_resources2.gyp | 14 + .../resources/component_extension_resources.grd | 5 +- .../chrome/browser/resources/cryptotoken/appid.js | 31 +- .../resources/cryptotoken/devicestatuscodes.js | 2 +- .../browser/resources/cryptotoken/enroller.js | 7 +- .../browser/resources/cryptotoken/gnubbies.js | 10 + .../chrome/browser/resources/cryptotoken/gnubby.js | 27 +- .../browser/resources/cryptotoken/gnubbydevice.js | 9 + .../resources/cryptotoken/hidgnubbydevice.js | 59 ++- .../browser/resources/cryptotoken/manifest.json | 2 +- .../chrome/browser/resources/cryptotoken/signer.js | 4 +- .../browser/resources/cryptotoken/singlesigner.js | 13 +- .../resources/cryptotoken/usbgnubbydevice.js | 79 +++- .../resources/cryptotoken/usbsignhandler.js | 3 +- .../resources/cryptotoken/webrequestsender.js | 2 +- .../resources/gaia_auth_host/gaia_auth_host.js | 8 +- .../resources/hangout_services/manifest.json | 2 +- .../browser/resources/hangout_services/thunk.js | 22 +- .../browser/resources/history/other_devices.js | 2 - .../browser/resources/inline_login/inline_login.js | 9 +- chromium/chrome/browser/resources/inspect/OWNERS | 1 + .../chrome/browser/resources/inspect/inspect.css | 4 +- .../resources/local_ntp/most_visited_single.js | 10 - .../resources/local_ntp/most_visited_thumbnail.js | 25 +- .../resources/local_ntp/most_visited_title.js | 8 +- .../resources/local_ntp/most_visited_util.js | 53 +-- .../chrome/browser/resources/md_bookmarks/OWNERS | 3 + .../browser/resources/md_bookmarks/bookmarks.html | 13 + .../resources/md_downloads/compiled_resources2.gyp | 1 + .../browser/resources/md_downloads/crisper.js | 19 +- .../browser/resources/md_downloads/item.html | 15 +- .../chrome/browser/resources/md_downloads/item.js | 25 +- .../browser/resources/md_downloads/manager.html | 5 +- .../browser/resources/md_downloads/manager.js | 36 +- .../browser/resources/md_downloads/toolbar.html | 2 +- .../browser/resources/md_downloads/vulcanized.html | 318 ++----------- .../resources/md_extensions/code_section.html | 57 +++ .../resources/md_extensions/code_section.js | 60 +++ .../md_extensions/compiled_resources2.gyp | 20 + .../resources/md_extensions/error_page.html | 87 ++++ .../browser/resources/md_extensions/error_page.js | 145 ++++++ .../md_extensions/error_severity_fatal.png | Bin 0 -> 218 bytes .../md_extensions/error_severity_info.png | Bin 0 -> 304 bytes .../md_extensions/error_severity_warning.png | Bin 0 -> 242 bytes .../browser/resources/md_extensions/item.html | 4 + .../chrome/browser/resources/md_extensions/item.js | 16 +- .../browser/resources/md_extensions/item_list.js | 4 +- .../browser/resources/md_extensions/manager.html | 3 + .../browser/resources/md_extensions/manager.js | 32 +- .../browser/resources/md_extensions/service.js | 20 + .../resources/md_feedback/compiled_resources2.gyp | 22 + .../browser/resources/md_feedback/feedback.js | 4 +- .../resources/md_feedback/feedback_container.html | 4 +- .../browser/resources/md_history/app.crisper.js | 25 +- .../chrome/browser/resources/md_history/app.html | 13 +- .../chrome/browser/resources/md_history/app.js | 91 +++- .../resources/md_history/app.vulcanized.html | 513 +++++++-------------- .../resources/md_history/compiled_resources2.gyp | 2 - .../browser/resources/md_history/history_item.html | 12 +- .../browser/resources/md_history/history_item.js | 32 +- .../browser/resources/md_history/history_list.html | 2 +- .../resources/md_history/history_toolbar.html | 5 +- .../resources/md_history/history_toolbar.js | 12 +- .../resources/md_history/lazy_load.crisper.js | 2 +- .../browser/resources/md_history/lazy_load.html | 1 - .../resources/md_history/lazy_load.vulcanized.html | 181 +------- .../resources/md_history/list_container.html | 1 + .../browser/resources/md_history/list_container.js | 9 +- .../browser/resources/md_history/side_bar.html | 32 +- .../resources/md_history/synced_device_card.html | 1 + .../resources/md_user_manager/create_profile.html | 10 +- .../resources/md_user_manager/create_profile.js | 34 +- .../md_user_manager/profile_browser_proxy.js | 12 +- .../media_router_container.css | 1 + .../elements/route_details/route_details.css | 2 +- .../resources/net_internals/log_view_painter.js | 9 +- .../chrome/browser/resources/ntp4/apps_page.js | 13 +- .../browser/resources/ntp4/new_tab_theme.css | 5 - .../chrome/browser/resources/omnibox/omnibox.js | 13 - .../browser/resources/options/browser_options.html | 24 +- .../browser/resources/options/browser_options.js | 89 +++- .../resources/options/content_settings.html | 24 - .../options/content_settings_exceptions_area.html | 16 - .../options/content_settings_exceptions_area.js | 13 +- .../browser/resources/options/cookies_list.js | 8 + .../chrome/browser/resources/options/options.html | 3 - .../browser/resources/options/password_manager.js | 79 +--- .../resources/options/password_manager_list.css | 22 + .../resources/options/password_manager_list.js | 3 +- .../browser/resources/options/sync_section.html | 1 + .../resources/options/sync_setup_overlay.js | 2 +- .../viewer-page-indicator/viewer-page-indicator.js | 8 + .../browser/resources/pdf/gesture_detector.js | 164 +++++++ chromium/chrome/browser/resources/pdf/index.html | 1 + chromium/chrome/browser/resources/pdf/pdf.js | 62 ++- chromium/chrome/browser/resources/pdf/viewport.js | 192 ++++++++ .../resources/plugin_metadata/plugins_linux.json | 6 +- .../resources/plugin_metadata/plugins_mac.json | 6 +- .../resources/plugin_metadata/plugins_win.json | 6 +- chromium/chrome/browser/resources/plugins.css | 4 - chromium/chrome/browser/resources/plugins.html | 32 -- chromium/chrome/browser/resources/plugins.js | 15 +- .../browser/resources/popular_sites_internals.css | 48 -- .../browser/resources/popular_sites_internals.html | 80 ---- .../browser/resources/popular_sites_internals.js | 62 --- .../resources/print_preview/data/app_state.js | 4 + .../print_preview/data/destination_store.js | 307 ++++++++++-- .../print_preview/data/print_ticket_store.js | 18 + .../print_preview/data/ticket_items/scaling.js | 101 ++++ .../resources/print_preview/native_layer.js | 9 +- .../resources/print_preview/preview_generator.js | 10 + .../print_preview/previewarea/preview_area.js | 4 + .../resources/print_preview/print_preview.html | 2 + .../resources/print_preview/print_preview.js | 77 +++- .../print_preview/settings/copies_settings.css | 55 +-- .../print_preview/settings/copies_settings.html | 20 +- .../print_preview/settings/copies_settings.js | 97 ++-- .../print_preview/settings/scaling_settings.html | 13 + .../print_preview/settings/scaling_settings.js | 289 ++++++++++++ .../print_preview/settings/settings_box.css | 8 + .../safe_browsing/download_file_types.asciipb | 7 +- .../resources/safe_browsing/gen_file_type_proto.py | 17 +- .../resources/settings/a11y_page/a11y_page.html | 3 +- .../settings/a11y_page/manage_a11y_page.html | 6 +- .../settings/a11y_page/manage_a11y_page.js | 3 + .../resources/settings/about_page/about_page.html | 13 +- .../resources/settings/about_page/about_page.js | 15 +- .../settings/advanced_page/advanced_page.html | 2 - .../appearance_page/appearance_browser_proxy.html | 1 + .../appearance_page/appearance_browser_proxy.js | 46 +- .../settings/appearance_page/appearance_page.html | 71 ++- .../settings/appearance_page/appearance_page.js | 226 +++++---- .../appearance_page/compiled_resources2.gyp | 4 +- .../appearance_page/fonts_browser_proxy.js | 5 +- .../resources/settings/basic_page/basic_page.html | 2 +- .../bluetooth_page/bluetooth_device_dialog.html | 2 - .../bluetooth_page/bluetooth_device_list_item.html | 29 +- .../bluetooth_page/bluetooth_device_list_item.js | 37 +- .../bluetooth_page/compiled_resources2.gyp | 2 + .../certificate_entry.html | 1 - .../certificate_subentry.html | 60 +-- .../certificate_subentry.js | 9 +- .../compiled_resources2.gyp | 4 +- .../clear_browsing_data_dialog.html | 2 +- .../resources/settings/compiled_resources2.gyp | 78 ++-- .../settings/controls/compiled_resources2.gyp | 29 +- .../settings/controls/controlled_button.js | 2 +- .../settings/controls/controlled_radio_button.html | 4 +- .../settings/controls/controlled_radio_button.js | 9 + .../controls/extension_controlled_indicator.html | 37 ++ .../controls/extension_controlled_indicator.js | 36 ++ .../settings_boolean_control_behavior.html | 5 + .../controls/settings_boolean_control_behavior.js | 125 +++++ .../settings/controls/settings_checkbox.html | 12 +- .../settings/controls/settings_checkbox.js | 93 +--- .../settings/controls/settings_dropdown_menu.html | 17 +- .../settings/controls/settings_dropdown_menu.js | 35 +- .../settings/controls/settings_input.html | 6 +- .../resources/settings/controls/settings_input.js | 12 + .../settings/controls/settings_toggle_button.html | 42 ++ .../settings/controls/settings_toggle_button.js | 13 + .../date_time_page/compiled_resources2.gyp | 4 +- .../settings/date_time_page/date_time_page.html | 52 ++- .../settings/date_time_page/date_time_page.js | 241 ++++++---- .../settings/device_page/compiled_resources2.gyp | 3 +- .../settings/device_page/device_page.html | 16 +- .../resources/settings/device_page/display.html | 115 +++-- .../resources/settings/device_page/display.js | 69 ++- .../settings/device_page/display_layout.html | 29 +- .../settings/device_page/display_layout.js | 15 +- .../resources/settings/device_page/keyboard.html | 18 +- .../resources/settings/device_page/keyboard.js | 66 +-- .../resources/settings/device_page/storage.html | 79 ++-- .../resources/settings/device_page/stylus.html | 1 + .../settings/downloads_page/downloads_page.html | 1 - .../settings/extension_control_browser_proxy.html | 3 + .../settings/extension_control_browser_proxy.js | 42 ++ .../settings/global_scroll_target_behavior.html | 2 + .../settings/global_scroll_target_behavior.js | 45 ++ .../chrome/browser/resources/settings/icons.html | 6 +- .../resources/settings/images/arrow_down.svg | 1 - .../resources/settings/images/help_outline.svg | 4 + .../settings/internet_page/compiled_resources2.gyp | 4 + .../internet_page/internet_detail_page.html | 6 +- .../settings/internet_page/internet_detail_page.js | 6 + .../settings/internet_page/internet_page.html | 3 +- .../settings/internet_page/internet_page.js | 6 + .../settings/internet_page/network_apnlist.html | 22 +- .../settings/internet_page/network_apnlist.js | 16 +- .../internet_page/network_nameservers.html | 23 +- .../settings/internet_page/network_nameservers.js | 12 +- .../internet_page/network_property_list.html | 3 +- .../internet_page/network_property_list.js | 9 + .../settings/internet_page/network_proxy.html | 122 +++-- .../settings/internet_page/network_proxy.js | 206 +++++++-- .../internet_page/network_proxy_exclusions.html | 2 +- .../internet_page/network_proxy_exclusions.js | 6 + .../internet_page/network_proxy_input.html | 5 +- .../settings/internet_page/network_siminfo.html | 1 - .../internet_page/network_summary_item.html | 4 +- .../languages_page/compiled_resources2.gyp | 2 +- .../languages_page/edit_dictionary_page.html | 27 +- .../resources/settings/languages_page/languages.js | 8 - .../settings/languages_page/languages_page.html | 27 +- .../settings/languages_page/languages_page.js | 26 +- .../browser/resources/settings/md_select_css.html | 49 -- .../on_startup_page/compiled_resources2.gyp | 13 + .../on_startup_page/on_startup_browser_proxy.html | 3 + .../on_startup_page/on_startup_browser_proxy.js | 35 ++ .../settings/on_startup_page/on_startup_page.html | 11 + .../settings/on_startup_page/on_startup_page.js | 31 +- .../on_startup_page/startup_url_dialog.html | 2 +- .../on_startup_page/startup_url_entry.html | 30 +- .../settings/on_startup_page/startup_url_entry.js | 11 +- .../on_startup_page/startup_urls_page.html | 4 +- .../settings/on_startup_page/startup_urls_page.js | 27 +- .../address_edit_dialog.html | 3 +- .../passwords_and_forms_page/autofill_section.html | 40 +- .../passwords_and_forms_page/autofill_section.js | 116 ++--- .../compiled_resources2.gyp | 6 +- .../credit_card_edit_dialog.html | 16 +- .../credit_card_edit_dialog.js | 24 +- .../passwords_and_forms_page.html | 8 +- .../passwords_and_forms_page.js | 14 +- .../passwords_section.html | 25 +- .../passwords_and_forms_page/passwords_section.js | 57 +-- .../passwords_shared_css.html | 9 - .../settings/people_page/change_picture.html | 15 +- .../settings/people_page/compiled_resources2.gyp | 18 + .../people_page/import_data_browser_proxy.html | 1 + .../people_page/import_data_browser_proxy.js | 91 ++++ .../settings/people_page/import_data_dialog.html | 124 +++++ .../settings/people_page/import_data_dialog.js | 139 ++++++ .../settings/people_page/manage_profile.html | 11 + .../settings/people_page/manage_profile.js | 40 +- .../people_page/manage_profile_browser_proxy.js | 31 ++ .../people_page/password_prompt_dialog.html | 3 +- .../settings/people_page/people_page.html | 126 ++--- .../resources/settings/people_page/people_page.js | 117 ++++- .../settings/people_page/setup_pin_dialog.html | 4 +- .../settings/people_page/setup_pin_dialog.js | 32 +- .../settings/people_page/sync_browser_proxy.js | 37 +- .../resources/settings/people_page/sync_page.html | 67 ++- .../resources/settings/people_page/sync_page.js | 80 ++-- .../resources/settings/people_page/user_list.html | 53 ++- .../resources/settings/people_page/user_list.js | 40 +- .../people_page/users_add_user_dialog.html | 10 +- .../resources/settings/people_page/users_page.html | 37 +- .../resources/settings/people_page/users_page.js | 10 - .../browser/resources/settings/prefs/prefs.js | 13 +- .../resources/settings/prefs/prefs_behavior.js | 8 + .../settings/printing_page/compiled_resources2.gyp | 3 + .../printing_page/cups_add_printer_dialog.html | 54 +-- .../printing_page/cups_add_printer_dialog.js | 56 ++- .../cups_add_printer_dialog_util.html | 8 +- .../settings/printing_page/cups_printers.html | 18 +- .../settings/printing_page/cups_printers.js | 47 ++ .../printing_page/cups_printers_browser_proxy.js | 37 ++ .../settings/printing_page/cups_printers_list.html | 31 +- .../settings/printing_page/cups_printers_list.js | 37 +- .../settings/printing_page/printing_page.html | 14 +- .../settings/privacy_page/compiled_resources2.gyp | 2 + .../settings/privacy_page/privacy_page.html | 155 +++++-- .../settings/privacy_page/privacy_page.js | 92 +++- .../privacy_page/privacy_page_browser_proxy.js | 16 + .../settings/reset_page/powerwash_dialog.html | 1 - .../settings/reset_page/reset_browser_proxy.js | 20 +- .../resources/settings/reset_page/reset_page.html | 6 +- .../resources/settings/reset_page/reset_page.js | 23 +- .../settings/reset_page/reset_profile_banner.html | 4 +- .../settings/reset_page/reset_profile_banner.js | 11 +- .../settings/reset_page/reset_profile_dialog.html | 8 +- .../settings/reset_page/reset_profile_dialog.js | 71 ++- .../chrome/browser/resources/settings/route.js | 55 ++- .../search_engines_page/compiled_resources2.gyp | 16 +- .../omnibox_extension_entry.html | 35 +- .../search_engines_page/omnibox_extension_entry.js | 14 +- .../search_engines_page/search_engine_entry.css | 26 -- .../search_engines_page/search_engine_entry.html | 38 +- .../search_engines_page/search_engine_entry.js | 10 +- .../search_engine_entry_css.html | 24 + .../search_engines_browser_proxy.js | 16 - .../search_engines_page/search_engines_list.html | 6 +- .../search_engines_page/search_engines_list.js | 15 +- .../search_engines_page/search_engines_page.html | 2 - .../settings/search_page/search_page.html | 7 +- .../browser/resources/settings/search_settings.js | 8 +- .../settings/settings_main/settings_main.html | 11 +- .../settings/settings_main/settings_main.js | 49 +- .../settings/settings_menu/settings_menu.html | 10 +- .../settings/settings_menu/settings_menu.js | 41 +- .../settings/settings_page/main_page_behavior.js | 35 +- .../settings/settings_page/settings_section.html | 2 +- .../settings/settings_page/settings_subpage.html | 7 +- .../resources/settings/settings_resources.grd | 76 ++- .../resources/settings/settings_shared_css.html | 95 ++-- .../settings/settings_ui/compiled_resources2.gyp | 4 + .../settings/settings_ui/settings_ui.html | 23 +- .../resources/settings/settings_ui/settings_ui.js | 76 ++- .../resources/settings/settings_vars_css.html | 28 +- .../settings/site_settings/add_site_dialog.js | 25 +- .../settings/site_settings/compiled_resources2.gyp | 36 +- .../resources/settings/site_settings/constants.js | 109 +++-- .../settings/site_settings/cookie_info.js | 44 ++ .../site_settings/cookie_tree_behavior.html | 3 + .../settings/site_settings/cookie_tree_behavior.js | 99 ++++ .../settings/site_settings/cookie_tree_node.js | 77 ++-- .../settings/site_settings/media_picker.html | 3 +- .../settings/site_settings/pdf_documents.html | 23 + .../settings/site_settings/pdf_documents.js | 20 + .../settings/site_settings/protocol_handlers.html | 41 +- .../settings/site_settings/protocol_handlers.js | 64 ++- .../settings/site_settings/site_data.html | 77 ++-- .../resources/settings/site_settings/site_data.js | 131 ++---- .../site_settings/site_data_details_dialog.html | 59 --- .../site_settings/site_data_details_dialog.js | 203 -------- .../site_settings/site_data_details_subpage.html | 49 ++ .../site_settings/site_data_details_subpage.js | 139 ++++++ .../settings/site_settings/site_details.html | 84 ++-- .../settings/site_settings/site_details.js | 43 +- .../site_settings/site_details_permission.html | 9 +- .../settings/site_settings/site_list.html | 95 ++-- .../resources/settings/site_settings/site_list.js | 186 +++----- .../site_settings/site_settings_behavior.js | 208 +-------- .../site_settings/site_settings_category.html | 53 +-- .../site_settings/site_settings_category.js | 9 +- .../site_settings_prefs_browser_proxy.js | 28 +- .../settings/site_settings/usb_devices.html | 29 +- .../settings/site_settings/usb_devices.js | 33 +- .../site_settings_page/site_settings_page.html | 203 ++++---- .../site_settings_page/site_settings_page.js | 21 +- .../settings/system_page/system_page.html | 33 +- .../resources/settings/system_page/system_page.js | 10 + .../resources/signin/signin_error/signin_error.js | 6 +- .../resources/signin/signin_shared_css.html | 2 +- .../signin/sync_confirmation/sync_confirmation.css | 7 + .../sync_confirmation/sync_confirmation.html | 5 +- .../signin/sync_confirmation/sync_confirmation.js | 23 +- .../browser/resources/snippets_internals.html | 7 +- .../resources/task_scheduler_internals/index.css | 15 + .../resources/task_scheduler_internals/index.html | 9 +- .../resources/task_scheduler_internals/index.js | 74 +++ .../task_scheduler_internals/resources.grd | 6 + .../translate_internals/translate_internals.css | 4 + .../resources/usb_internals/usb_internals.js | 13 - .../browser/resources/user_manager/control_bar.css | 87 ---- .../resources/user_manager/control_bar.html | 11 - .../browser/resources/user_manager/control_bar.js | 183 -------- .../resources/user_manager/user_manager.css | 211 --------- .../resources/user_manager/user_manager.html | 62 --- .../browser/resources/user_manager/user_manager.js | 170 ------- .../user_manager/user_manager_tutorial.css | 185 -------- .../user_manager/user_manager_tutorial.html | 58 --- .../user_manager/user_manager_tutorial.js | 136 ------ .../browser/resources/vr_shell/vr_shell_ui.css | 143 +++++- .../browser/resources/vr_shell/vr_shell_ui.html | 50 +- .../browser/resources/vr_shell/vr_shell_ui.js | 469 ++++++++++++++++--- .../browser/resources/vr_shell/vr_shell_ui_api.js | 39 ++ .../browser/resources/welcome/win10/README.md | 7 + .../browser/resources/welcome/win10/inline.css | 239 ++++++++++ .../browser/resources/welcome/win10/inline.html | 86 ++++ .../browser/resources/welcome/win10/inline.js | 72 +++ .../browser/resources/welcome/win10/sectioned.css | 296 ++++++++++++ .../browser/resources/welcome/win10/sectioned.html | 88 ++++ .../browser/resources/welcome/win10/sectioned.js | 79 ++++ .../spellchecker/spellcheck_custom_dictionary.cc | 12 +- .../spellchecker/spellcheck_custom_dictionary.h | 8 +- .../spellcheck_custom_dictionary_unittest.cc | 10 +- .../spellchecker/spellcheck_hunspell_dictionary.cc | 21 +- .../spellchecker/spellcheck_message_filter.cc | 7 +- .../spellchecker/spellcheck_message_filter.h | 3 +- .../spellcheck_message_filter_unittest.cc | 7 +- .../browser/spellchecker/spellcheck_service.cc | 5 +- chromium/chrome/browser/ui/BUILD.gn | 206 ++++++--- .../chrome/browser/ui/cocoa/notifications/BUILD.gn | 2 + chromium/chrome/browser/ui/libgtk2ui/BUILD.gn | 134 ------ chromium/chrome/browser/ui/libgtkui/BUILD.gn | 150 ++++++ chromium/chrome/browser/ui/views/BUILD.gn | 1 + .../chrome/browser/ui/webui/engagement/BUILD.gn | 2 - chromium/chrome/browser/ui/webui/omnibox/BUILD.gn | 2 - chromium/chrome/browser/ui/webui/plugins/BUILD.gn | 2 - 600 files changed, 13897 insertions(+), 8661 deletions(-) create mode 100644 chromium/chrome/browser/chrome_content_plugin_manifest_overlay.json create mode 100644 chromium/chrome/browser/chrome_content_renderer_manifest_overlay.json delete mode 100644 chromium/chrome/browser/extensions/api/cast_devices_private/cast_devices_private_api.cc delete mode 100644 chromium/chrome/browser/extensions/api/cast_devices_private/cast_devices_private_api.h delete mode 100644 chromium/chrome/browser/extensions/api/metrics_private/metrics_private_api.cc delete mode 100644 chromium/chrome/browser/extensions/api/metrics_private/metrics_private_api.h create mode 100644 chromium/chrome/browser/extensions/api/networking_private/networking_private_crypto.cc create mode 100644 chromium/chrome/browser/extensions/api/networking_private/networking_private_crypto.h create mode 100644 chromium/chrome/browser/extensions/api/networking_private/networking_private_crypto_unittest.cc create mode 100644 chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc create mode 100644 chromium/chrome/browser/extensions/api/web_request/web_request_event_details_unittest.cc create mode 100644 chromium/chrome/browser/ntp_snippets/BUILD.gn create mode 100644 chromium/chrome/browser/resources/bluetooth_internals/adapter_broker.js create mode 100644 chromium/chrome/browser/resources/bluetooth_internals/device_collection.js create mode 100644 chromium/chrome/browser/resources/bluetooth_internals/device_table.js create mode 100644 chromium/chrome/browser/resources/bluetooth_internals/interfaces.js create mode 100644 chromium/chrome/browser/resources/chromeos/login/compiled_resources2.gyp create mode 100644 chromium/chrome/browser/resources/md_bookmarks/OWNERS create mode 100644 chromium/chrome/browser/resources/md_bookmarks/bookmarks.html create mode 100644 chromium/chrome/browser/resources/md_extensions/code_section.html create mode 100644 chromium/chrome/browser/resources/md_extensions/code_section.js create mode 100644 chromium/chrome/browser/resources/md_extensions/error_page.html create mode 100644 chromium/chrome/browser/resources/md_extensions/error_page.js create mode 100644 chromium/chrome/browser/resources/md_extensions/error_severity_fatal.png create mode 100644 chromium/chrome/browser/resources/md_extensions/error_severity_info.png create mode 100644 chromium/chrome/browser/resources/md_extensions/error_severity_warning.png create mode 100644 chromium/chrome/browser/resources/md_feedback/compiled_resources2.gyp create mode 100644 chromium/chrome/browser/resources/pdf/gesture_detector.js delete mode 100644 chromium/chrome/browser/resources/popular_sites_internals.css delete mode 100644 chromium/chrome/browser/resources/popular_sites_internals.html delete mode 100644 chromium/chrome/browser/resources/popular_sites_internals.js create mode 100644 chromium/chrome/browser/resources/print_preview/data/ticket_items/scaling.js create mode 100644 chromium/chrome/browser/resources/print_preview/settings/scaling_settings.html create mode 100644 chromium/chrome/browser/resources/print_preview/settings/scaling_settings.js create mode 100644 chromium/chrome/browser/resources/print_preview/settings/settings_box.css create mode 100644 chromium/chrome/browser/resources/settings/controls/extension_controlled_indicator.html create mode 100644 chromium/chrome/browser/resources/settings/controls/extension_controlled_indicator.js create mode 100644 chromium/chrome/browser/resources/settings/controls/settings_boolean_control_behavior.html create mode 100644 chromium/chrome/browser/resources/settings/controls/settings_boolean_control_behavior.js create mode 100644 chromium/chrome/browser/resources/settings/controls/settings_toggle_button.html create mode 100644 chromium/chrome/browser/resources/settings/controls/settings_toggle_button.js create mode 100644 chromium/chrome/browser/resources/settings/extension_control_browser_proxy.html create mode 100644 chromium/chrome/browser/resources/settings/extension_control_browser_proxy.js create mode 100644 chromium/chrome/browser/resources/settings/global_scroll_target_behavior.html create mode 100644 chromium/chrome/browser/resources/settings/global_scroll_target_behavior.js delete mode 100644 chromium/chrome/browser/resources/settings/images/arrow_down.svg create mode 100644 chromium/chrome/browser/resources/settings/images/help_outline.svg delete mode 100644 chromium/chrome/browser/resources/settings/md_select_css.html create mode 100644 chromium/chrome/browser/resources/settings/on_startup_page/on_startup_browser_proxy.html create mode 100644 chromium/chrome/browser/resources/settings/on_startup_page/on_startup_browser_proxy.js create mode 100644 chromium/chrome/browser/resources/settings/people_page/import_data_browser_proxy.html create mode 100644 chromium/chrome/browser/resources/settings/people_page/import_data_browser_proxy.js create mode 100644 chromium/chrome/browser/resources/settings/people_page/import_data_dialog.html create mode 100644 chromium/chrome/browser/resources/settings/people_page/import_data_dialog.js delete mode 100644 chromium/chrome/browser/resources/settings/search_engines_page/search_engine_entry.css create mode 100644 chromium/chrome/browser/resources/settings/search_engines_page/search_engine_entry_css.html create mode 100644 chromium/chrome/browser/resources/settings/site_settings/cookie_tree_behavior.html create mode 100644 chromium/chrome/browser/resources/settings/site_settings/cookie_tree_behavior.js create mode 100644 chromium/chrome/browser/resources/settings/site_settings/pdf_documents.html create mode 100644 chromium/chrome/browser/resources/settings/site_settings/pdf_documents.js delete mode 100644 chromium/chrome/browser/resources/settings/site_settings/site_data_details_dialog.html delete mode 100644 chromium/chrome/browser/resources/settings/site_settings/site_data_details_dialog.js create mode 100644 chromium/chrome/browser/resources/settings/site_settings/site_data_details_subpage.html create mode 100644 chromium/chrome/browser/resources/settings/site_settings/site_data_details_subpage.js create mode 100644 chromium/chrome/browser/resources/task_scheduler_internals/index.css create mode 100644 chromium/chrome/browser/resources/task_scheduler_internals/index.js delete mode 100644 chromium/chrome/browser/resources/user_manager/control_bar.css delete mode 100644 chromium/chrome/browser/resources/user_manager/control_bar.html delete mode 100644 chromium/chrome/browser/resources/user_manager/control_bar.js delete mode 100644 chromium/chrome/browser/resources/user_manager/user_manager.css delete mode 100644 chromium/chrome/browser/resources/user_manager/user_manager.html delete mode 100644 chromium/chrome/browser/resources/user_manager/user_manager.js delete mode 100644 chromium/chrome/browser/resources/user_manager/user_manager_tutorial.css delete mode 100644 chromium/chrome/browser/resources/user_manager/user_manager_tutorial.html delete mode 100644 chromium/chrome/browser/resources/user_manager/user_manager_tutorial.js create mode 100644 chromium/chrome/browser/resources/welcome/win10/README.md create mode 100644 chromium/chrome/browser/resources/welcome/win10/inline.css create mode 100644 chromium/chrome/browser/resources/welcome/win10/inline.html create mode 100644 chromium/chrome/browser/resources/welcome/win10/inline.js create mode 100644 chromium/chrome/browser/resources/welcome/win10/sectioned.css create mode 100644 chromium/chrome/browser/resources/welcome/win10/sectioned.html create mode 100644 chromium/chrome/browser/resources/welcome/win10/sectioned.js delete mode 100644 chromium/chrome/browser/ui/libgtk2ui/BUILD.gn create mode 100644 chromium/chrome/browser/ui/libgtkui/BUILD.gn (limited to 'chromium/chrome/browser') diff --git a/chromium/chrome/browser/BUILD.gn b/chromium/chrome/browser/BUILD.gn index 87409e5e5df..c727f67c8f7 100644 --- a/chromium/chrome/browser/BUILD.gn +++ b/chromium/chrome/browser/BUILD.gn @@ -9,7 +9,12 @@ import("//build/config/ui.gni") import("//build/split_static_library.gni") import("//chrome/common/features.gni") import("//components/os_crypt/features.gni") +import("//components/spellcheck/spellcheck_build_features.gni") +import("//extensions/features/features.gni") import("//media/media_options.gni") +import("//net/features.gni") +import("//ppapi/features/features.gni") +import("//printing/features/features.gni") import("//third_party/protobuf/proto_library.gni") # //build/config/android/rules.gni imports //tools/grit/grit_rule.gni, which @@ -152,6 +157,8 @@ split_static_library("browser") { "browsing_data/browsing_data_indexed_db_helper.h", "browsing_data/browsing_data_local_storage_helper.cc", "browsing_data/browsing_data_local_storage_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", @@ -552,6 +559,8 @@ split_static_library("browser") { "media/webrtc/window_icon_util_chromeos.cc", "media/webrtc/window_icon_util_mac.mm", "media/webrtc/window_icon_util_win.cc", + "memory/chrome_memory_coordinator_delegate.cc", + "memory/chrome_memory_coordinator_delegate.h", "memory_details.cc", "memory_details.h", "memory_details_android.cc", @@ -599,8 +608,6 @@ split_static_library("browser") { "metrics/time_ticks_experiment_win.h", "metrics/variations/chrome_variations_service_client.cc", "metrics/variations/chrome_variations_service_client.h", - "metrics/variations/variations_registry_syncer_win.cc", - "metrics/variations/variations_registry_syncer_win.h", "mod_pagespeed/mod_pagespeed_metrics.cc", "mod_pagespeed/mod_pagespeed_metrics.h", "native_window_notification_source.h", @@ -680,6 +687,8 @@ split_static_library("browser") { "ntp_snippets/bookmark_last_visit_updater.h", "ntp_snippets/content_suggestions_service_factory.cc", "ntp_snippets/content_suggestions_service_factory.h", + "ntp_snippets/download_suggestions_provider.cc", + "ntp_snippets/download_suggestions_provider.h", "page_load_metrics/browser_page_track_decider.cc", "page_load_metrics/browser_page_track_decider.h", "page_load_metrics/metrics_navigation_throttle.cc", @@ -710,14 +719,19 @@ split_static_library("browser") { "page_load_metrics/observers/no_state_prefetch_page_load_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/protocol_page_load_metrics_observer.cc", + "page_load_metrics/observers/protocol_page_load_metrics_observer.h", "page_load_metrics/observers/service_worker_page_load_metrics_observer.cc", "page_load_metrics/observers/service_worker_page_load_metrics_observer.h", + "page_load_metrics/page_load_metrics_embedder_interface.h", "page_load_metrics/page_load_metrics_initialize.cc", "page_load_metrics/page_load_metrics_initialize.h", "page_load_metrics/page_load_metrics_observer.cc", "page_load_metrics/page_load_metrics_observer.h", "page_load_metrics/page_load_metrics_util.cc", "page_load_metrics/page_load_metrics_util.h", + "page_load_metrics/page_load_tracker.cc", + "page_load_metrics/page_load_tracker.h", "password_manager/chrome_password_manager_client.cc", "password_manager/chrome_password_manager_client.h", "password_manager/password_manager_setting_migrator_service_factory.cc", @@ -749,8 +763,6 @@ split_static_library("browser") { "permissions/permission_context_base.h", "permissions/permission_decision_auto_blocker.cc", "permissions/permission_decision_auto_blocker.h", - "permissions/permission_infobar_delegate.cc", - "permissions/permission_infobar_delegate.h", "permissions/permission_manager.cc", "permissions/permission_manager.h", "permissions/permission_manager_factory.cc", @@ -759,6 +771,8 @@ split_static_library("browser") { "permissions/permission_request.h", "permissions/permission_request_id.cc", "permissions/permission_request_id.h", + "permissions/permission_request_impl.cc", + "permissions/permission_request_impl.h", "permissions/permission_request_manager.cc", "permissions/permission_request_manager.h", "permissions/permission_uma_util.cc", @@ -836,12 +850,12 @@ split_static_library("browser") { "predictors/resource_prefetcher_manager.h", "prefs/browser_prefs.cc", "prefs/browser_prefs.h", + "prefs/chrome_command_line_pref_store.cc", + "prefs/chrome_command_line_pref_store.h", "prefs/chrome_pref_model_associator_client.cc", "prefs/chrome_pref_model_associator_client.h", "prefs/chrome_pref_service_factory.cc", "prefs/chrome_pref_service_factory.h", - "prefs/command_line_pref_store.cc", - "prefs/command_line_pref_store.h", "prefs/incognito_mode_prefs.cc", "prefs/incognito_mode_prefs.h", "prefs/origin_trial_prefs.cc", @@ -995,6 +1009,8 @@ split_static_library("browser") { "safe_browsing/srt_field_trial_win.h", "safe_browsing/srt_global_error_win.cc", "safe_browsing/srt_global_error_win.h", + "safe_search_api/safe_search_url_checker.cc", + "safe_search_api/safe_search_url_checker.h", "search/iframe_source.cc", "search/iframe_source.h", "search/instant_io_context.cc", @@ -1113,14 +1129,14 @@ split_static_library("browser") { "ssl/cert_report_helper.h", "ssl/chrome_expect_ct_reporter.cc", "ssl/chrome_expect_ct_reporter.h", - "ssl/chrome_security_state_model_client.cc", - "ssl/chrome_security_state_model_client.h", "ssl/chrome_ssl_host_state_delegate.cc", "ssl/chrome_ssl_host_state_delegate.h", "ssl/chrome_ssl_host_state_delegate_factory.cc", "ssl/chrome_ssl_host_state_delegate_factory.h", "ssl/common_name_mismatch_handler.cc", "ssl/common_name_mismatch_handler.h", + "ssl/security_state_tab_helper.cc", + "ssl/security_state_tab_helper.h", "ssl/ssl_blocking_page.cc", "ssl/ssl_blocking_page.h", "ssl/ssl_cert_reporter.h", @@ -1235,12 +1251,13 @@ split_static_library("browser") { "win/jumplist_updater.h", "win/settings_app_monitor.cc", "win/settings_app_monitor.h", + "win/titlebar_config.cc", + "win/titlebar_config.h", ] configs += [ "//build/config/compiler:wexit_time_destructors", "//build/config:precompiled_headers", - "//third_party/WebKit/public:debug_devtools", ] defines = [] libs = [] @@ -1253,6 +1270,7 @@ split_static_library("browser") { public_deps = [ "//chrome/common", "//components/autofill/core/browser", + "//components/payments:payment_validation", "//components/sync", "//content/public/browser", "//sql", @@ -1265,11 +1283,9 @@ split_static_library("browser") { "//chrome:strings", "//chrome/app/resources:platform_locale_settings", "//chrome/app/theme:theme_resources", - "//chrome/app/theme:theme_resources", "//chrome/browser/budget_service:budget_proto", "//chrome/browser/devtools", "//chrome/browser/metrics/variations:chrome_ui_string_overrider_factory", - "//chrome/browser/metrics/variations:chrome_ui_string_overrider_factory", "//chrome/browser/net:probe_message_proto", "//chrome/browser/resources:component_extension_resources", "//chrome/browser/ui", @@ -1298,7 +1314,7 @@ split_static_library("browser") { "//components/data_reduction_proxy/core/browser", "//components/data_usage/core", "//components/data_use_measurement/content", - "//components/data_use_measurement/core", + "//components/data_use_measurement/core:ascriber", "//components/device_event_log", "//components/dom_distiller/content/browser", "//components/domain_reliability", @@ -1348,12 +1364,13 @@ split_static_library("browser") { "//components/policy:generated", "//components/policy/core/browser", "//components/policy/proto", + "//components/prefs:prefs", "//components/previews/core", "//components/profile_metrics", "//components/proxy_config", - "//components/proxy_config", "//components/query_parser", "//components/rappor", + "//components/rappor:rappor_recorder", "//components/renderer_context_menu", "//components/resources", "//components/safe_browsing_db", @@ -1362,9 +1379,11 @@ split_static_library("browser") { "//components/search_engines", "//components/search_provider_logos", "//components/security_interstitials/core", - "//components/security_state", + "//components/security_state/content", + "//components/security_state/core", "//components/sessions", "//components/signin/core/browser", + "//components/spellcheck:build_features", "//components/ssl_config", "//components/ssl_errors", "//components/startup_metric_utils/browser:host", @@ -1377,8 +1396,9 @@ split_static_library("browser") { "//components/supervised_user_error_page", "//components/sync", "//components/sync_bookmarks", + "//components/sync_preferences", "//components/sync_sessions", - "//components/syncable_prefs", + "//components/task_scheduler_util", "//components/tracing:startup_tracing", "//components/translate/content/browser", "//components/translate/core/browser", @@ -1391,6 +1411,7 @@ split_static_library("browser") { "//components/user_prefs", "//components/user_prefs/tracked:user_prefs_tracked", "//components/variations", + "//components/variations/field_trial_config", "//components/variations/net", "//components/variations/service", "//components/visitedlink/browser", @@ -1405,13 +1426,16 @@ split_static_library("browser") { "//content/public/common", "//content/public/common:feature_h264_with_openh264_ffmpeg", "//content/public/common:features", + "//content/public/common:service_names", "//courgette:courgette_lib", "//crypto", "//crypto:platform", + "//device/base", "//device/bluetooth:mojo", - "//device/core", + "//device/power_save_blocker", "//device/usb/mojo", "//device/usb/public/interfaces", + "//extensions/features", "//google_apis", "//gpu/config", "//media", @@ -1422,11 +1446,14 @@ split_static_library("browser") { "//mojo/public/js", "//net:extras", "//net:net_with_v8", - "//services/shell/public/cpp", + "//printing/features", + "//services/image_decoder/public/cpp", + "//services/service_manager/public/cpp", "//skia", "//sql", "//storage/browser", "//storage/common", + "//third_party/WebKit/public:features", "//third_party/WebKit/public:image_resources", "//third_party/WebKit/public:resources", "//third_party/cacheinvalidation", @@ -1440,7 +1467,7 @@ split_static_library("browser") { "//third_party/re2", "//third_party/smhasher:cityhash", "//third_party/webrtc/modules/desktop_capture", - "//third_party/widevine/cdm:version_h", + "//third_party/widevine/cdm:headers", "//third_party/zlib", "//third_party/zlib:compression_utils", "//third_party/zlib:minizip", @@ -1455,7 +1482,6 @@ split_static_library("browser") { "//ui/gl:gl_features", "//ui/message_center", "//ui/resources", - "//ui/resources", "//ui/shell_dialogs", "//ui/strings", "//ui/surface", @@ -1873,6 +1899,10 @@ split_static_library("browser") { "plugins/flash_download_interception.h", "plugins/flash_permission_context.cc", "plugins/flash_permission_context.h", + "plugins/flash_temporary_permission_tracker.cc", + "plugins/flash_temporary_permission_tracker.h", + "plugins/flash_temporary_permission_tracker_factory.cc", + "plugins/flash_temporary_permission_tracker_factory.h", "plugins/plugin_data_remover_helper.cc", "plugins/plugin_data_remover_helper.h", "plugins/plugin_finder.cc", @@ -1885,6 +1915,8 @@ split_static_library("browser") { "plugins/plugin_metadata.h", "plugins/plugin_observer.cc", "plugins/plugin_observer.h", + "plugins/plugin_policy_handler.cc", + "plugins/plugin_policy_handler.h", "plugins/plugin_prefs.cc", "plugins/plugin_prefs.h", "plugins/plugin_prefs_factory.cc", @@ -1913,9 +1945,12 @@ split_static_library("browser") { "renderer_host/pepper/pepper_isolated_file_system_message_filter.h", "renderer_host/pepper/pepper_output_protection_message_filter.cc", "renderer_host/pepper/pepper_output_protection_message_filter.h", + "renderer_host/pepper/pepper_platform_verification_message_filter.cc", + "renderer_host/pepper/pepper_platform_verification_message_filter.h", ] deps += [ "//components/pdf/browser", + "//ppapi/features", "//ppapi/proxy:ipc", "//third_party/adobe/flash:flapper_version_h", ] @@ -1926,8 +1961,6 @@ split_static_library("browser") { sources += [ "loader/data_reduction_proxy_resource_throttle_android.cc", "loader/data_reduction_proxy_resource_throttle_android.h", - "safe_browsing/mock_permission_report_sender.cc", - "safe_browsing/mock_permission_report_sender.h", "safe_browsing/permission_reporter.cc", "safe_browsing/permission_reporter.h", "safe_browsing/ping_manager.cc", @@ -1936,6 +1969,10 @@ split_static_library("browser") { "safe_browsing/protocol_manager_helper.h", "safe_browsing/safe_browsing_blocking_page.cc", "safe_browsing/safe_browsing_blocking_page.h", + "safe_browsing/safe_browsing_navigation_observer.cc", + "safe_browsing/safe_browsing_navigation_observer.h", + "safe_browsing/safe_browsing_navigation_observer_manager.cc", + "safe_browsing/safe_browsing_navigation_observer_manager.h", "safe_browsing/safe_browsing_service.cc", "safe_browsing/safe_browsing_service.h", "safe_browsing/services_delegate.h", @@ -2133,11 +2170,6 @@ split_static_library("browser") { "metrics/perf/windowed_incognito_observer.h", "policy/default_geolocation_policy_handler.cc", "policy/default_geolocation_policy_handler.h", - - # This is technically also dependent on enable_plugins but we don"t - # support ChromeOS with enable_plugins==0. - "renderer_host/pepper/pepper_platform_verification_message_filter.cc", - "renderer_host/pepper/pepper_platform_verification_message_filter.h", ] deps += [ "//chrome/browser/chromeos" ] public_deps += [ @@ -2187,6 +2219,7 @@ split_static_library("browser") { "//services/ui/public/cpp/input_devices", "//ui/aura", "//ui/compositor", + "//ui/snapshot", "//ui/views/mus", ] } @@ -2222,8 +2255,11 @@ split_static_library("browser") { ] } if (use_aura && !use_ozone && is_desktop_linux) { - deps += [ "//chrome/browser/ui/libgtk2ui" ] - allow_circular_includes_from += [ "//chrome/browser/ui/libgtk2ui" ] + if (use_gtk3) { + deps += [ "//chrome/browser/ui/libgtkui:libgtk3ui" ] + } else { + deps += [ "//chrome/browser/ui/libgtkui:libgtk2ui" ] + } } if (is_posix && !is_mac) { sources += [ @@ -2349,7 +2385,6 @@ split_static_library("browser") { "themes/custom_theme_supplier.cc", "themes/custom_theme_supplier.h", "themes/theme_properties.cc", - "themes/theme_properties.h", "themes/theme_service.cc", "themes/theme_service.h", "themes/theme_service_factory.cc", @@ -2358,6 +2393,7 @@ split_static_library("browser") { "themes/theme_syncable_service.cc", "themes/theme_syncable_service.h", ] + deps += [ ":theme_properties" ] } if (enable_basic_printing || enable_print_preview) { @@ -2533,6 +2569,7 @@ split_static_library("browser") { ] deps += [ "//components/cdm/browser", + "//components/payments/android:payments_jni", "//components/resources:components_resources", "//third_party/android_opengl/etc1", "//third_party/android_tools:cpu_features", @@ -2763,10 +2800,10 @@ split_static_library("browser") { "obsolete_system/obsolete_system_win.cc", "pdf/pdf_extension_util.cc", "pdf/pdf_extension_util.h", - "permissions/permission_request_impl.cc", - "permissions/permission_request_impl.h", "power/process_power_collector.cc", "power/process_power_collector.h", + "power_usage_monitor/power_usage_monitor.cc", + "power_usage_monitor/power_usage_monitor.h", "process_singleton_modal_dialog_lock.cc", "process_singleton_modal_dialog_lock.h", "process_singleton_posix.cc", @@ -2815,8 +2852,6 @@ split_static_library("browser") { "signin/signin_ui_util.h", "speech/extension_api/tts_extension_api_constants.cc", # Should be moved to extensions section? "speech/extension_api/tts_extension_api_constants.h", - "ssl/ssl_add_certificate.cc", - "ssl/ssl_add_certificate.h", "ssl/ssl_client_auth_observer.cc", "ssl/ssl_client_auth_observer.h", "status_icons/desktop_notification_balloon.cc", @@ -2842,6 +2877,7 @@ split_static_library("browser") { "//chrome/browser/profile_resetter:profile_reset_report_proto", "//components/feedback", "//components/web_modal", + "//device/battery", "//net:net_browser_services", ] } @@ -2898,6 +2934,9 @@ split_static_library("browser") { "android/browsing_data/url_filter_bridge.h", "android/chrome_application.cc", "android/chrome_application.h", + "android/chrome_backup_agent.cc", + "android/chrome_backup_agent.h", + "android/chrome_backup_watcher.cc", "android/chrome_feature_list.cc", "android/chrome_feature_list.h", "android/chrome_jni_registrar.cc", @@ -2988,12 +3027,12 @@ split_static_library("browser") { "android/document/document_web_contents_delegate.cc", "android/dom_distiller/distiller_ui_handle_android.cc", "android/dom_distiller/distiller_ui_handle_android.h", - "android/download/android_download_manager_overwrite_infobar_delegate.cc", - "android/download/android_download_manager_overwrite_infobar_delegate.h", + "android/download/android_download_manager_duplicate_infobar_delegate.cc", + "android/download/android_download_manager_duplicate_infobar_delegate.h", "android/download/chrome_download_delegate.cc", "android/download/chrome_download_delegate.h", - "android/download/chrome_download_manager_overwrite_infobar_delegate.cc", - "android/download/chrome_download_manager_overwrite_infobar_delegate.h", + "android/download/chrome_duplicate_download_infobar_delegate.cc", + "android/download/chrome_duplicate_download_infobar_delegate.h", "android/download/dangerous_download_infobar_delegate.cc", "android/download/dangerous_download_infobar_delegate.h", "android/download/download_controller.cc", @@ -3002,8 +3041,8 @@ split_static_library("browser") { "android/download/download_controller_base.h", "android/download/download_manager_service.cc", "android/download/download_manager_service.h", - "android/download/download_overwrite_infobar_delegate.cc", - "android/download/download_overwrite_infobar_delegate.h", + "android/download/duplicate_download_infobar_delegate.cc", + "android/download/duplicate_download_infobar_delegate.h", "android/download/mock_download_controller.cc", "android/download/mock_download_controller.h", "android/download/ui/thumbnail_provider.cc", @@ -3144,6 +3183,10 @@ split_static_library("browser") { "android/precache/precache_launcher.h", "android/preferences/autofill/autofill_profile_bridge.cc", "android/preferences/autofill/autofill_profile_bridge.h", + "android/preferences/browser_prefs_android.cc", + "android/preferences/browser_prefs_android.h", + "android/preferences/command_line_pref_store_android.cc", + "android/preferences/command_line_pref_store_android.h", "android/preferences/pref_service_bridge.cc", "android/preferences/pref_service_bridge.h", "android/preferences/website_preference_bridge.cc", @@ -3168,6 +3211,10 @@ split_static_library("browser") { "android/rlz/revenue_stats.h", "android/safe_browsing/safe_browsing_api_handler_bridge.cc", "android/safe_browsing/safe_browsing_api_handler_bridge.h", + "android/search_geolocation_disclosure_infobar_delegate.cc", + "android/search_geolocation_disclosure_infobar_delegate.h", + "android/search_geolocation_disclosure_tab_helper.cc", + "android/search_geolocation_disclosure_tab_helper.h", "android/seccomp_support_detector.cc", "android/seccomp_support_detector.h", "android/service_tab_launcher.cc", @@ -3298,6 +3345,12 @@ split_static_library("browser") { "password_manager/update_password_infobar_delegate_android.h", "permissions/grouped_permission_infobar_delegate_android.cc", "permissions/grouped_permission_infobar_delegate_android.h", + "permissions/permission_dialog_delegate.cc", + "permissions/permission_dialog_delegate.h", + "permissions/permission_infobar_delegate.cc", + "permissions/permission_infobar_delegate.h", + "permissions/permission_prompt_android.cc", + "permissions/permission_prompt_android.h", "permissions/permission_queue_controller.cc", "permissions/permission_queue_controller.h", "permissions/permission_update_infobar_delegate_android.cc", @@ -3319,7 +3372,6 @@ split_static_library("browser") { "signin/oauth2_token_service_delegate_android.h", "ssl/security_state_model_android.cc", "ssl/security_state_model_android.h", - "ssl/ssl_add_certificate_android.cc", "sync/glue/synced_tab_delegate_android.cc", "sync/glue/synced_tab_delegate_android.h", "sync/glue/synced_window_delegate_android.cc", @@ -3336,6 +3388,7 @@ split_static_library("browser") { ":delta_file_proto", ":jni_headers", "//blimp/client/public", + "//blimp/client/support/resources", "//chrome/browser/android/webapk:proto", "//components/data_usage/android", "//components/precache/content", @@ -3353,11 +3406,24 @@ split_static_library("browser") { "supervised_user/child_accounts/child_account_service_android.h", ] } + + # Used for testing only, should not be shipped to end users. + if (!is_official_build) { + sources += [ + "android/offline_pages/evaluation/evaluation_test_scheduler.cc", + "android/offline_pages/evaluation/evaluation_test_scheduler.h", + "android/offline_pages/evaluation/offline_page_evaluation_bridge.cc", + "android/offline_pages/evaluation/offline_page_evaluation_bridge.h", + ] + } } - if (enable_vr_shell && android_java_ui) { - defines += [ "ENABLE_VR_SHELL" ] - deps += [ "android/vr_shell:vr_shell" ] + if (enable_vr_shell || enable_webvr) { + if (enable_vr_shell) { + defines += [ "ENABLE_VR_SHELL" ] + } + + deps += [ "android/vr_shell:vr_common" ] configs += [ "//third_party/gvr-android-sdk:libgvr_config" ] } @@ -3365,6 +3431,7 @@ split_static_library("browser") { deps += [ "//chrome/app_shim", "//chrome/browser/apps/app_shim", + "//third_party/crashpad/crashpad/client:client", "//third_party/google_toolbox_for_mac", "//third_party/mozilla", ] @@ -3409,6 +3476,7 @@ split_static_library("browser") { "//components/browser_watcher", "//components/browser_watcher:browser_watcher_client", "//google_update", + "//third_party/crashpad/crashpad/client:client", "//third_party/iaccessible2", "//third_party/isimpledom", "//third_party/wtl", @@ -3465,20 +3533,33 @@ split_static_library("browser") { "first_run/upgrade_util.cc", "first_run/upgrade_util_linux.cc", "first_run/upgrade_util_linux.h", - "fullscreen_aurax11.cc", "icon_loader_auralinux.cc", - "media/webrtc/window_icon_util_x11.cc", "password_manager/native_backend_kwallet_x.cc", "password_manager/native_backend_kwallet_x.h", "platform_util_linux.cc", "shell_integration_linux.cc", "shell_integration_linux.h", "speech/tts_linux.cc", - "themes/theme_service_aurax11.cc", - "themes/theme_service_aurax11.h", "web_applications/web_app_linux.cc", ] - if (!use_ozone) { + + if (use_x11) { + sources += [ + "fullscreen_aurax11.cc", + "media/webrtc/window_icon_util_x11.cc", + + # ThemeServiceAuraX11 does not depend on X11, although its + # instantiation/inclusion in theme_service_factory.cc is conditioned + # by USE_X11. + # TODO(tonikitoo): Check if non-x11 could benefit from it. If so, + # rename and use it. + "themes/theme_service_aurax11.cc", + "themes/theme_service_aurax11.h", + ] + } + + # libsecret hard depends on GLib. + if (use_glib) { sources += [ "password_manager/native_backend_libsecret.cc", "password_manager/native_backend_libsecret.h", @@ -3486,6 +3567,13 @@ split_static_library("browser") { defines += [ "USE_LIBSECRET" ] deps += [ "//third_party/libsecret" ] } + + if (use_ozone) { + sources += [ + "fullscreen_ozone.cc", + "media/webrtc/window_icon_util_ozone.cc", + ] + } } if (android_java_ui) { @@ -3521,8 +3609,6 @@ split_static_library("browser") { "supervised_user/child_accounts/permission_request_creator_apiary.h", "supervised_user/experimental/safe_search_url_reporter.cc", "supervised_user/experimental/safe_search_url_reporter.h", - "supervised_user/experimental/supervised_user_async_url_checker.cc", - "supervised_user/experimental/supervised_user_async_url_checker.h", "supervised_user/experimental/supervised_user_blacklist.cc", "supervised_user/experimental/supervised_user_blacklist.h", "supervised_user/experimental/supervised_user_filtering_switches.cc", @@ -3734,6 +3820,8 @@ if (android_java_ui) { "../android/java/src/org/chromium/chrome/browser/BackgroundSyncLauncher.java", "../android/java/src/org/chromium/chrome/browser/BluetoothChooserDialog.java", "../android/java/src/org/chromium/chrome/browser/ChromeApplication.java", + "../android/java/src/org/chromium/chrome/browser/ChromeBackupAgent.java", + "../android/java/src/org/chromium/chrome/browser/ChromeBackupWatcher.java", "../android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java", "../android/java/src/org/chromium/chrome/browser/ChromeHttpAuthHandler.java", "../android/java/src/org/chromium/chrome/browser/DevToolsServer.java", @@ -3807,7 +3895,7 @@ if (android_java_ui) { "../android/java/src/org/chromium/chrome/browser/infobar/AutofillSaveCardInfoBar.java", "../android/java/src/org/chromium/chrome/browser/infobar/ConfirmInfoBar.java", "../android/java/src/org/chromium/chrome/browser/infobar/DataReductionPromoInfoBarDelegate.java", - "../android/java/src/org/chromium/chrome/browser/infobar/DownloadOverwriteInfoBar.java", + "../android/java/src/org/chromium/chrome/browser/infobar/DuplicateDownloadInfoBar.java", "../android/java/src/org/chromium/chrome/browser/infobar/GeneratedPasswordSavedInfoBarDelegate.java", "../android/java/src/org/chromium/chrome/browser/infobar/GroupedPermissionInfoBar.java", "../android/java/src/org/chromium/chrome/browser/infobar/InfoBar.java", @@ -3816,7 +3904,7 @@ if (android_java_ui) { "../android/java/src/org/chromium/chrome/browser/infobar/InstantAppsInfoBarDelegate.java", "../android/java/src/org/chromium/chrome/browser/infobar/PermissionInfoBar.java", "../android/java/src/org/chromium/chrome/browser/infobar/PermissionUpdateInfoBarDelegate.java", - "../android/java/src/org/chromium/chrome/browser/infobar/SavePasswordInfoBar.java", + "../android/java/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBar.java", "../android/java/src/org/chromium/chrome/browser/infobar/SimpleConfirmInfoBarBuilder.java", "../android/java/src/org/chromium/chrome/browser/infobar/SubresourceFilterInfoBar.java", "../android/java/src/org/chromium/chrome/browser/infobar/TranslateInfoBar.java", @@ -3837,6 +3925,7 @@ if (android_java_ui) { "../android/java/src/org/chromium/chrome/browser/mojo/ChromeInterfaceRegistrar.java", "../android/java/src/org/chromium/chrome/browser/net/qualityprovider/ExternalEstimateProviderAndroid.java", "../android/java/src/org/chromium/chrome/browser/net/spdyproxy/DataReductionProxySettings.java", + "../android/java/src/org/chromium/chrome/browser/notifications/ActionInfo.java", "../android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java", "../android/java/src/org/chromium/chrome/browser/ntp/ForeignSessionHelper.java", "../android/java/src/org/chromium/chrome/browser/ntp/LogoBridge.java", @@ -3854,6 +3943,7 @@ if (android_java_ui) { "../android/java/src/org/chromium/chrome/browser/omnibox/OmniboxPrerender.java", "../android/java/src/org/chromium/chrome/browser/omnibox/OmniboxUrlEmphasizer.java", "../android/java/src/org/chromium/chrome/browser/omnibox/OmniboxViewUtil.java", + "../android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java", "../android/java/src/org/chromium/chrome/browser/pageinfo/CertificateViewer.java", "../android/java/src/org/chromium/chrome/browser/pageinfo/ConnectionInfoPopup.java", "../android/java/src/org/chromium/chrome/browser/pageinfo/WebsiteSettingsPopup.java", @@ -3861,6 +3951,10 @@ if (android_java_ui) { "../android/java/src/org/chromium/chrome/browser/password_manager/AccountChooserDialog.java", "../android/java/src/org/chromium/chrome/browser/password_manager/AutoSigninFirstRunDialog.java", "../android/java/src/org/chromium/chrome/browser/password_manager/Credential.java", + "../android/java/src/org/chromium/chrome/browser/payments/PaymentValidator.java", + "../android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogController.java", + "../android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogDelegate.java", + "../android/java/src/org/chromium/chrome/browser/physicalweb/UrlManager.java", "../android/java/src/org/chromium/chrome/browser/policy/PolicyAuditor.java", "../android/java/src/org/chromium/chrome/browser/precache/PrecacheLauncher.java", "../android/java/src/org/chromium/chrome/browser/preferences/LocationSettings.java", @@ -3906,6 +4000,11 @@ if (android_java_ui) { "../android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java", "../android/java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java", ] + + # Used for testing only, should not be shipped to end users. + if (!is_official_build) { + sources += [ "../android/java/src/org/chromium/chrome/browser/offlinepages/evaluation/OfflinePageEvaluationBridge.java" ] + } jni_package = "chrome" } @@ -3938,6 +4037,12 @@ if (is_win) { } } +source_set("theme_properties") { + sources = [ + "themes/theme_properties.h", + ] +} + proto_library("resource_prefetch_predictor_proto") { sources = [ "predictors/resource_prefetch_predictor.proto", @@ -3947,7 +4052,12 @@ proto_library("resource_prefetch_predictor_proto") { grit("resources") { source = "browser_resources.grd" use_qualified_include = true + defines = chrome_grit_defines + if (enable_hangout_services_extension) { + defines += [ "enable_hangout_services_extension" ] + } + output_dir = "$root_gen_dir/chrome" outputs = [ "grit/browser_resources.h", @@ -3967,6 +4077,7 @@ grit("resources") { # Depend only on the generated mojo bindings since we read the .mojom.js # file, rather than the whole mojo target which will link the C++ bindings. + "//chrome/app:chrome_content_browser_manifest_overlay", "//chrome/browser/ui/webui/engagement:mojo_bindings__generator", "//chrome/browser/ui/webui/omnibox:mojo_bindings__generator", "//chrome/browser/ui/webui/plugins:mojo_bindings__generator", @@ -4027,12 +4138,16 @@ static_library("test_support") { "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", "download/download_test_file_activity_observer.cc", "download/download_test_file_activity_observer.h", + "history/history_test_utils.cc", + "history/history_test_utils.h", "media/webrtc/fake_desktop_media_list.cc", "media/webrtc/fake_desktop_media_list.h", "net/dns_probe_test_util.cc", @@ -4061,6 +4176,15 @@ static_library("test_support") { "sync/profile_sync_test_util.h", ] + if (safe_browsing_mode != 0) { + # "Safe Browsing Basic" files used for safe browsing in full mode + # (safe_browsing=1) and mobile (=2) + sources += [ + "safe_browsing/mock_permission_report_sender.cc", + "safe_browsing/mock_permission_report_sender.h", + ] + } + configs += [ "//build/config:precompiled_headers" ] public_deps = [ @@ -4081,7 +4205,7 @@ static_library("test_support") { "//components/sessions:test_support", "//components/subresource_filter/core/browser:test_support", "//components/subresource_filter/core/common:test_support", - "//components/syncable_prefs:test_support", + "//components/sync_preferences:test_support", "//components/user_prefs/tracked:user_prefs_tracked_test_support", "//content/test:test_support", "//google_apis:test_support", @@ -4259,7 +4383,7 @@ static_library("test_support_ui") { deps = [ "//components/metrics:test_support", - "//components/password_manager/content/public/interfaces", + "//components/password_manager/content/common:mojo_interfaces", "//components/password_manager/core/browser:test_support", "//components/translate/content/common", "//skia", diff --git a/chromium/chrome/browser/android/vr_shell/BUILD.gn b/chromium/chrome/browser/android/vr_shell/BUILD.gn index f2e1f803d8a..2a495d5e3d3 100644 --- a/chromium/chrome/browser/android/vr_shell/BUILD.gn +++ b/chromium/chrome/browser/android/vr_shell/BUILD.gn @@ -6,73 +6,95 @@ import("//build/config/android/rules.gni") import("//chrome/common/features.gni") import("//testing/test.gni") -assert(enable_vr_shell && android_java_ui) +assert(enable_vr_shell || enable_webvr) -static_library("vr_shell") { - sources = [ - "animation.cc", - "animation.h", - "easing.cc", - "easing.h", - "ui_elements.cc", - "ui_elements.h", - "ui_scene.cc", - "ui_scene.h", - "vr_compositor.cc", - "vr_compositor.h", - "vr_controller.cc", - "vr_controller.h", - "vr_gesture.h", - "vr_gl_util.cc", - "vr_gl_util.h", - "vr_input_manager.cc", - "vr_input_manager.h", - "vr_math.cc", - "vr_math.h", - "vr_shell.cc", - "vr_shell.h", - "vr_shell_delegate.cc", - "vr_shell_delegate.h", - "vr_shell_renderer.cc", - "vr_shell_renderer.h", - ] +if (current_cpu == "arm" || current_cpu == "arm64") { + static_library("vr_common") { + defines = [] - deps = [ - ":vr_shell_jni_headers", - "//base", - "//cc", - "//content/public/browser", - "//content/public/common", - "//device/vr", - "//third_party/gvr-android-sdk:libgvr", - "//ui/android", - "//ui/base", - "//ui/gl", - "//ui/gl/init", - ] + sources = [ + "animation.cc", + "animation.h", + "easing.cc", + "easing.h", + "ui_elements.cc", + "ui_elements.h", + "ui_interface.cc", + "ui_interface.h", + "ui_scene.cc", + "ui_scene.h", + "vr_compositor.cc", + "vr_compositor.h", + "vr_controller.cc", + "vr_controller.h", + "vr_gesture.h", + "vr_gl_util.cc", + "vr_gl_util.h", + "vr_input_manager.cc", + "vr_input_manager.h", + "vr_math.cc", + "vr_math.h", + "vr_shell.cc", + "vr_shell.h", + "vr_shell_delegate.cc", + "vr_shell_delegate.h", + "vr_shell_renderer.cc", + "vr_shell_renderer.h", + "vr_usage_monitor.cc", + "vr_usage_monitor.h", + "vr_web_contents_observer.cc", + "vr_web_contents_observer.h", + ] - configs += [ "//third_party/gvr-android-sdk:libgvr_config" ] -} + if (enable_vr_shell) { + defines += [ "ENABLE_VR_SHELL" ] + } + if (enable_vr_shell_ui_dev) { + assert(enable_vr_shell) + defines += [ "ENABLE_VR_SHELL_UI_DEV" ] + } + + deps = [ + ":vr_shell_jni_headers", + "//base", + "//cc", + "//content/public/browser", + "//content/public/common", + "//device/vr", + "//ui/android", + "//ui/base", + "//ui/display", + "//ui/gl", + "//ui/gl/init", + ] + + libs = + [ "//third_party/gvr-android-sdk/libgvr_shim_static_${current_cpu}.a" ] + configs += [ "//third_party/gvr-android-sdk:libgvr_config" ] + } -generate_jni("vr_shell_jni_headers") { - sources = [ - "//chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java", - "//chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java", - ] - jni_package = "vr_shell" + generate_jni("vr_shell_jni_headers") { + sources = [ + "//chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java", + "//chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java", + ] + jni_package = "vr_shell" + } } -test("vr_shell_unittests") { - sources = [ - "ui_elements_unittest.cc", - "ui_scene_unittest.cc", - ] +if (enable_vr_shell) { + test("vr_shell_unittests") { + sources = [ + "ui_elements_unittest.cc", + "ui_scene_unittest.cc", + ] - deps = [ - ":vr_shell", - "//base/test:run_all_unittests", - "//base/test:test_support", - "//testing/gtest", - "//ui/gfx/geometry", - ] + deps = [ + ":vr_common", + "//base/test:run_all_unittests", + "//base/test:test_support", + "//testing/gtest", + "//ui/gfx/geometry", + ] + } } diff --git a/chromium/chrome/browser/browser_resources.grd b/chromium/chrome/browser/browser_resources.grd index d9563006385..bd05bf6fd69 100644 --- a/chromium/chrome/browser/browser_resources.grd +++ b/chromium/chrome/browser/browser_resources.grd @@ -72,6 +72,19 @@ + + + + + + + + + + + + + @@ -91,10 +104,15 @@ + + + + + + - @@ -153,10 +171,14 @@ + + + + @@ -192,14 +214,10 @@ - - - - - + @@ -210,7 +228,7 @@ - + @@ -228,6 +246,10 @@ + + + + @@ -453,11 +475,6 @@ - - - - - @@ -467,10 +484,6 @@ - - - - @@ -593,8 +606,10 @@ - + + + diff --git a/chromium/chrome/browser/chrome_content_browser_manifest_overlay.json b/chromium/chrome/browser/chrome_content_browser_manifest_overlay.json index 3d6190b0822..f1004cbf6de 100644 --- a/chromium/chrome/browser/chrome_content_browser_manifest_overlay.json +++ b/chromium/chrome/browser/chrome_content_browser_manifest_overlay.json @@ -1,22 +1,70 @@ { - "name": "service:content_browser", - "capabilities": { - "provided": { - "renderer": [ - "autofill::mojom::AutofillDriver", - "autofill::mojom::PasswordManagerDriver", - "extensions::StashService", - "metrics::mojom::LeakDetector", - "startup_metric_utils::mojom::StartupMetricHost", - "translate::mojom::ContentTranslateDriver" - ], - "gpu": [ - "metrics::mojom::CallStackProfileCollector" - ], - "ash": [ - "ash::mojom::SystemTray", - "ash::mojom::SystemTrayClient" - ] + "name": "content_browser", + "display_name": "Chrome", + "interface_provider_specs": { + "service_manager:connector": { + "provides": { + "renderer": [ + "autofill::mojom::AutofillDriver", + "autofill::mojom::PasswordManagerDriver", + "extensions::StashService", + "metrics::mojom::LeakDetector", + "rappor::mojom::RapporRecorder", + "startup_metric_utils::mojom::StartupMetricHost", + "translate::mojom::ContentTranslateDriver" + ], + "gpu": [ + "metrics::mojom::CallStackProfileCollector" + ], + "ash": [ + // Under classic ash the browser provides some of the ash interfaces + // to itself. + "ash::mojom::LocaleNotificationController", + "ash::mojom::NewWindowClient", + "ash::mojom::ShelfController", + "ash::mojom::ShutdownController", + "ash::mojom::SystemTray", + "ash::mojom::SystemTrayClient", + "ash::mojom::WallpaperController", + "ash::mojom::WallpaperManager", + "ash::mojom::VolumeController", + "keyboard::mojom::Keyboard" + ], + "mash:launchable": [ + "mash::mojom::Launchable" + ] + }, + "requires": { + "ash": [ "ash" ], + "image_decoder": [ "decode" ] + } + }, + "navigation:frame": { + "provides": { + "renderer": [ + "autofill::mojom::AutofillDriver", + "autofill::mojom::PasswordManagerDriver", + "blink::mojom::ShareService", + "bluetooth::mojom::AdapterFactory", + "device::usb::ChooserService", + "device::usb::DeviceManager", + "contextual_search::mojom::ContextualSearchJsApiService", + "dom_distiller::mojom::DistillabilityService", + "dom_distiller::mojom::DistillerJavaScriptService", + "extensions::KeepAlive", + "extensions::mime_handler::MimeHandlerService", + "media_router::mojom::MediaRouter", + "mojom::OmniboxPageHandler", + "password_manager::mojom::CredentialManager", + "translate::mojom::ContentTranslateDriver", + + // TODO(beng): These should be moved to a separate capability. + "mojom::OmniboxPageHandler", + "mojom::PluginsPageHandler", + "mojom::SiteEngagementUIHandler", + "mojom::UsbInternalsPageHandler" + ] + } } } } diff --git a/chromium/chrome/browser/chrome_content_gpu_manifest_overlay.json b/chromium/chrome/browser/chrome_content_gpu_manifest_overlay.json index 60670f28a4b..1a1a45378b3 100644 --- a/chromium/chrome/browser/chrome_content_gpu_manifest_overlay.json +++ b/chromium/chrome/browser/chrome_content_gpu_manifest_overlay.json @@ -1,11 +1,14 @@ { - "name": "service:content_gpu", - "capabilities": { - "provided": { - "browser": [ - "arc::mojom::VideoAcceleratorService", - "arc::mojom::VideoAcceleratorServiceClient" - ] + "name": "content_gpu", + "interface_provider_specs": { + "service_manager:connector": { + "provides": { + "browser": [ + "arc::mojom::VideoAcceleratorService", + "arc::mojom::VideoAcceleratorServiceClient", + "mojom::ResourceUsageReporter" + ] + } } } } diff --git a/chromium/chrome/browser/chrome_content_plugin_manifest_overlay.json b/chromium/chrome/browser/chrome_content_plugin_manifest_overlay.json new file mode 100644 index 00000000000..d608eacfc13 --- /dev/null +++ b/chromium/chrome/browser/chrome_content_plugin_manifest_overlay.json @@ -0,0 +1,12 @@ +{ + "name": "content_plugin", + "interface_provider_specs": { + "service_manager:connector": { + "provides": { + "browser": [ + "mojom::ResourceUsageReporter" + ] + } + } + } +} diff --git a/chromium/chrome/browser/chrome_content_renderer_manifest_overlay.json b/chromium/chrome/browser/chrome_content_renderer_manifest_overlay.json new file mode 100644 index 00000000000..3a81d7febab --- /dev/null +++ b/chromium/chrome/browser/chrome_content_renderer_manifest_overlay.json @@ -0,0 +1,23 @@ +{ + "display_name": "Chrome Render Process", + "interface_provider_specs": { + "service_manager:connector": { + "provides": { + "browser": [ + "mojom::ResourceUsageReporter" + ] + } + }, + "navigation:frame": { + "provides": { + "browser": [ + "autofill::mojom::AutofillAgent", + "autofill::mojom::PasswordAutofillAgent", + "autofill::mojom::PasswordGenerationAgent", + "contextual_search::mojom::OverlayPageNotifierService", + "dom_distiller::mojom::DistillerPageNotifierService" + ] + } + } + } +} diff --git a/chromium/chrome/browser/chrome_content_utility_manifest_overlay.json b/chromium/chrome/browser/chrome_content_utility_manifest_overlay.json index 256153c8677..5577edf485a 100644 --- a/chromium/chrome/browser/chrome_content_utility_manifest_overlay.json +++ b/chromium/chrome/browser/chrome_content_utility_manifest_overlay.json @@ -1,14 +1,16 @@ { - "name": "service:content_utility", - "capabilities": { - "provided": { - "browser": [ - "mojom::ImageDecoder", - "mojom::ResourceUsageReporter", - "mojom::ShellHandler", - "net::interfaces::ProxyResolverFactory", - "safe_json::mojom::SafeJsonParser" - ] + "name": "content_utility", + "interface_provider_specs": { + "service_manager:connector": { + "provides": { + "browser": [ + "mojom::ImageDecoder", + "mojom::ResourceUsageReporter", + "mojom::ShellHandler", + "net::interfaces::ProxyResolverFactory", + "safe_json::mojom::SafeJsonParser" + ] + } } } } diff --git a/chromium/chrome/browser/chrome_notification_types.h b/chromium/chrome/browser/chrome_notification_types.h index 8ca989ae344..2e6b7fc4a76 100644 --- a/chromium/chrome/browser/chrome_notification_types.h +++ b/chromium/chrome/browser/chrome_notification_types.h @@ -6,14 +6,15 @@ #define CHROME_BROWSER_CHROME_NOTIFICATION_TYPES_H_ #include "build/build_config.h" +#include "extensions/features/features.h" -#if defined(ENABLE_EXTENSIONS) +#if BUILDFLAG(ENABLE_EXTENSIONS) #include "extensions/browser/notification_types.h" #else #include "content/public/browser/notification_types.h" #endif -#if defined(ENABLE_EXTENSIONS) +#if BUILDFLAG(ENABLE_EXTENSIONS) #define PREVIOUS_END extensions::NOTIFICATION_EXTENSIONS_END #else #define PREVIOUS_END content::NOTIFICATION_CONTENT_END @@ -127,7 +128,7 @@ enum NotificationType { // Details. NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, -#if defined(ENABLE_EXTENSIONS) +#if BUILDFLAG(ENABLE_EXTENSIONS) // This notification is sent when extensions::TabHelper::SetExtensionApp is // invoked. The source is the extensions::TabHelper SetExtensionApp was // invoked on. @@ -313,7 +314,7 @@ enum NotificationType { // Cookies ----------------------------------------------------------------- -#if defined(ENABLE_EXTENSIONS) +#if BUILDFLAG(ENABLE_EXTENSIONS) // Sent when a cookie changes, for consumption by extensions. The source is a // Profile object, the details are a ChromeCookieDetails object. NOTIFICATION_COOKIE_CHANGED_FOR_EXTENSIONS, @@ -453,15 +454,6 @@ enum NotificationType { #if defined(USE_ASH) // Sent when wallpaper show animation has finished. NOTIFICATION_WALLPAPER_ANIMATION_FINISHED, - - // Sent when the Ash session has started. In its current incantation this is - // generated when the metro app has connected to the browser IPC channel. - // Used only on Windows. - NOTIFICATION_ASH_SESSION_STARTED, - - // Sent when the Ash session ended. Currently this means the metro app exited. - // Used only on Windows. - NOTIFICATION_ASH_SESSION_ENDED, #endif // Protocol Handler Registry ----------------------------------------------- diff --git a/chromium/chrome/browser/chromeos/BUILD.gn b/chromium/chrome/browser/chromeos/BUILD.gn index 67b07187dbb..15b99519803 100644 --- a/chromium/chrome/browser/chromeos/BUILD.gn +++ b/chromium/chrome/browser/chromeos/BUILD.gn @@ -4,7 +4,9 @@ import("//build/config/features.gni") import("//build/config/ui.gni") +import("//extensions/features/features.gni") import("//media/media_options.gni") +import("//printing/features/features.gni") import("//third_party/protobuf/proto_library.gni") assert(is_chromeos) @@ -39,7 +41,6 @@ source_set("chromeos") { "//ash:ash_with_content", "//ash/autoclick/mus/public/interfaces", "//ash/public/interfaces", - "//ash/public/interfaces", "//build/linux:fontconfig", "//chrome/browser/devtools", "//chrome/browser/extensions", @@ -62,6 +63,7 @@ source_set("chromeos") { "//components/feedback", "//components/flags_ui", "//components/login", + "//components/metrics/leak_detector", "//components/onc", "//components/ownership", "//components/pairing", @@ -69,8 +71,8 @@ source_set("chromeos") { "//components/proxy_config", "//components/safe_browsing_db:metadata_proto", "//components/session_manager/core", + "//components/sync_wifi", "//components/user_manager", - "//components/wifi_sync", # This depends directly on the variations target, rather than just # transitively via the common target because the proto sources need to @@ -91,7 +93,7 @@ source_set("chromeos") { "//mojo/common", "//net", "//ppapi/proxy:ipc", # For PpapiMsg_LoadPlugin - "//services/shell/public/cpp", + "//services/service_manager/public/cpp", # TODO: care about enable_basic_printing and enable_print_preview. "//components/sync", @@ -163,6 +165,14 @@ source_set("chromeos") { "app_mode/app_launch_utils.h", "app_mode/app_session.cc", "app_mode/app_session.h", + "app_mode/arc/arc_kiosk_app_launcher.cc", + "app_mode/arc/arc_kiosk_app_launcher.h", + "app_mode/arc/arc_kiosk_app_manager.cc", + "app_mode/arc/arc_kiosk_app_manager.h", + "app_mode/arc/arc_kiosk_app_service.cc", + "app_mode/arc/arc_kiosk_app_service.h", + "app_mode/arc/arc_kiosk_app_service_factory.cc", + "app_mode/arc/arc_kiosk_app_service_factory.h", "app_mode/certificate_manager_dialog.cc", "app_mode/certificate_manager_dialog.h", "app_mode/kiosk_app_data.cc", @@ -194,53 +204,70 @@ source_set("chromeos") { "app_mode/kiosk_session_plugin_handler_delegate.h", "app_mode/startup_app_launcher.cc", "app_mode/startup_app_launcher.h", - "arc/arc_android_management_checker.cc", - "arc/arc_android_management_checker.h", - "arc/arc_android_management_checker_delegate.h", "arc/arc_auth_code_fetcher.cc", "arc/arc_auth_code_fetcher.h", - "arc/arc_auth_code_fetcher_delegate.h", "arc/arc_auth_context.cc", "arc/arc_auth_context.h", - "arc/arc_auth_context_delegate.h", "arc/arc_auth_notification.cc", "arc/arc_auth_notification.h", "arc/arc_auth_service.cc", "arc/arc_auth_service.h", - "arc/arc_boot_error_notification.cc", - "arc/arc_boot_error_notification.h", - "arc/arc_downloads_watcher_service.cc", - "arc/arc_downloads_watcher_service.h", - "arc/arc_enterprise_reporting_service.cc", - "arc/arc_enterprise_reporting_service.h", - "arc/arc_external_protocol_dialog.cc", - "arc/arc_external_protocol_dialog.h", - "arc/arc_navigation_throttle.cc", - "arc/arc_navigation_throttle.h", "arc/arc_optin_uma.cc", "arc/arc_optin_uma.h", - "arc/arc_policy_bridge.cc", - "arc/arc_policy_bridge.h", - "arc/arc_print_service.cc", - "arc/arc_print_service.h", - "arc/arc_process.cc", - "arc/arc_process.h", - "arc/arc_process_service.cc", - "arc/arc_process_service.h", "arc/arc_service_launcher.cc", "arc/arc_service_launcher.h", - "arc/arc_settings_service.cc", - "arc/arc_settings_service.h", "arc/arc_support_host.cc", "arc/arc_support_host.h", - "arc/arc_tts_service.cc", - "arc/arc_tts_service.h", - "arc/arc_wallpaper_service.cc", - "arc/arc_wallpaper_service.h", - "arc/gpu_arc_video_service_host.cc", - "arc/gpu_arc_video_service_host.h", - "arc/page_transition_util.cc", - "arc/page_transition_util.h", + "arc/auth/arc_robot_auth.cc", + "arc/auth/arc_robot_auth.h", + "arc/downloads_watcher/arc_downloads_watcher_service.cc", + "arc/downloads_watcher/arc_downloads_watcher_service.h", + "arc/enterprise/arc_enterprise_reporting_service.cc", + "arc/enterprise/arc_enterprise_reporting_service.h", + "arc/extensions/arc_support_message_host.cc", + "arc/extensions/arc_support_message_host.h", + "arc/fileapi/arc_content_file_system_async_file_util.cc", + "arc/fileapi/arc_content_file_system_async_file_util.h", + "arc/fileapi/arc_content_file_system_backend_delegate.cc", + "arc/fileapi/arc_content_file_system_backend_delegate.h", + "arc/fileapi/arc_content_file_system_file_stream_reader.cc", + "arc/fileapi/arc_content_file_system_file_stream_reader.h", + "arc/fileapi/arc_content_file_system_service.cc", + "arc/fileapi/arc_content_file_system_service.h", + "arc/fileapi/arc_content_file_system_url_util.cc", + "arc/fileapi/arc_content_file_system_url_util.h", + "arc/fileapi/intent_helper_util.cc", + "arc/fileapi/intent_helper_util.h", + "arc/intent_helper/arc_external_protocol_dialog.cc", + "arc/intent_helper/arc_external_protocol_dialog.h", + "arc/intent_helper/arc_navigation_throttle.cc", + "arc/intent_helper/arc_navigation_throttle.h", + "arc/intent_helper/arc_settings_service.cc", + "arc/intent_helper/arc_settings_service.h", + "arc/notification/arc_boot_error_notification.cc", + "arc/notification/arc_boot_error_notification.h", + "arc/optin/arc_optin_preference_handler.cc", + "arc/optin/arc_optin_preference_handler.h", + "arc/optin/arc_optin_preference_handler_delegate.h", + "arc/policy/arc_android_management_checker.cc", + "arc/policy/arc_android_management_checker.h", + "arc/policy/arc_android_management_checker_delegate.h", + "arc/policy/arc_policy_bridge.cc", + "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/process/arc_process.cc", + "arc/process/arc_process.h", + "arc/process/arc_process_service.cc", + "arc/process/arc_process_service.h", + "arc/tts/arc_tts_service.cc", + "arc/tts/arc_tts_service.h", + "arc/video/gpu_arc_video_service_host.cc", + "arc/video/gpu_arc_video_service_host.h", + "arc/wallpaper/arc_wallpaper_service.cc", + "arc/wallpaper/arc_wallpaper_service.h", "attestation/attestation_ca_client.cc", "attestation/attestation_ca_client.h", "attestation/attestation_policy_observer.cc", @@ -357,6 +384,8 @@ source_set("chromeos") { "extensions/dictionary_event_router.h", "extensions/extension_system_event_observer.cc", "extensions/extension_system_event_observer.h", + "extensions/extension_volume_observer.cc", + "extensions/extension_volume_observer.h", "extensions/external_cache.cc", "extensions/external_cache.h", "extensions/gfx_utils.cc", @@ -540,6 +569,8 @@ source_set("chromeos") { "genius_app/app_id.h", "hats/hats_dialog.cc", "hats/hats_dialog.h", + "hats/hats_finch_helper.cc", + "hats/hats_finch_helper.h", "hats/hats_notification_controller.cc", "hats/hats_notification_controller.h", "idle_detector.cc", @@ -656,8 +687,6 @@ source_set("chromeos") { "login/language_list.h", "login/lock/screen_locker.cc", "login/lock/screen_locker.h", - "login/lock/screen_locker_delegate.cc", - "login/lock/screen_locker_delegate.h", "login/lock/webui_screen_locker.cc", "login/lock/webui_screen_locker.h", "login/login_wizard.h", @@ -680,6 +709,9 @@ source_set("chromeos") { "login/saml/saml_offline_signin_limiter_factory.h", "login/screen_manager.cc", "login/screen_manager.h", + "login/screens/arc_terms_of_service_screen.cc", + "login/screens/arc_terms_of_service_screen.h", + "login/screens/arc_terms_of_service_screen_actor.h", "login/screens/base_screen.cc", "login/screens/base_screen.h", "login/screens/base_screen_delegate.h", @@ -757,14 +789,6 @@ source_set("chromeos") { "login/screens/wrong_hwid_screen_actor.h", "login/session/chrome_session_manager.cc", "login/session/chrome_session_manager.h", - "login/session/kiosk_auto_launcher_session_manager_delegate.cc", - "login/session/kiosk_auto_launcher_session_manager_delegate.h", - "login/session/login_oobe_session_manager_delegate.cc", - "login/session/login_oobe_session_manager_delegate.h", - "login/session/restore_after_crash_session_manager_delegate.cc", - "login/session/restore_after_crash_session_manager_delegate.h", - "login/session/stub_login_session_manager_delegate.cc", - "login/session/stub_login_session_manager_delegate.h", "login/session/user_session_manager.cc", "login/session/user_session_manager.h", "login/signin/auth_sync_observer.cc", @@ -827,8 +851,6 @@ source_set("chromeos") { "login/ui/keyboard_driven_oobe_key_handler.h", "login/ui/lock_window.cc", "login/ui/lock_window.h", - "login/ui/lock_window_aura.cc", - "login/ui/lock_window_aura.h", "login/ui/login_display.cc", "login/ui/login_display.h", "login/ui/login_display_host.cc", @@ -902,6 +924,8 @@ source_set("chromeos") { "net/client_cert_store_chromeos.h", "net/delay_network_call.cc", "net/delay_network_call.h", + "net/network_connect_delegate_chromeos.cc", + "net/network_connect_delegate_chromeos.h", "net/network_portal_detector_impl.cc", "net/network_portal_detector_impl.h", "net/network_portal_detector_test_impl.cc", @@ -910,10 +934,14 @@ source_set("chromeos") { "net/network_portal_notification_controller.h", "net/network_portal_web_dialog.cc", "net/network_portal_web_dialog.h", - "net/onc_utils.cc", - "net/onc_utils.h", - "net/proxy_config_handler.cc", - "net/proxy_config_handler.h", + "net/network_pref_state_observer.cc", + "net/network_pref_state_observer.h", + "net/network_state_notifier.cc", + "net/network_state_notifier.h", + "net/network_throttling_observer.cc", + "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", @@ -1089,14 +1117,24 @@ source_set("chromeos") { "power/power_prefs.h", "power/renderer_freezer.cc", "power/renderer_freezer.h", - "power/session_state_controller_delegate_chromeos.cc", - "power/session_state_controller_delegate_chromeos.h", "preferences.cc", "preferences.h", "printer_detector/printer_detector.cc", "printer_detector/printer_detector.h", "printer_detector/printer_detector_factory.cc", "printer_detector/printer_detector_factory.h", + "printing/cups_print_job.cc", + "printing/cups_print_job.h", + "printing/cups_print_job_manager.cc", + "printing/cups_print_job_manager.h", + "printing/cups_print_job_manager_factory.cc", + "printing/cups_print_job_manager_factory.h", + "printing/cups_print_job_notification.cc", + "printing/cups_print_job_notification.h", + "printing/cups_print_job_notification_manager.cc", + "printing/cups_print_job_notification_manager.h", + "printing/fake_cups_print_job_manager.cc", + "printing/fake_cups_print_job_manager.h", "printing/printer_pref_manager.cc", "printing/printer_pref_manager.h", "printing/printer_pref_manager_factory.cc", @@ -1114,8 +1152,6 @@ source_set("chromeos") { "profiles/profile_list_chromeos.h", "profiles/profile_util.cc", "profiles/profile_util.h", - "proxy_config_service_impl.cc", - "proxy_config_service_impl.h", "proxy_cros_settings_parser.cc", "proxy_cros_settings_parser.h", "reset/metrics.h", @@ -1147,6 +1183,8 @@ source_set("chromeos") { "settings/owner_flags_storage.h", "settings/session_manager_operation.cc", "settings/session_manager_operation.h", + "settings/shutdown_policy_forwarder.cc", + "settings/shutdown_policy_forwarder.h", "settings/shutdown_policy_handler.cc", "settings/shutdown_policy_handler.h", "settings/stub_cros_settings_provider.cc", @@ -1228,10 +1266,6 @@ source_set("chromeos") { "ui/mobile_config_ui.h", "ui/screen_capture_notification_ui_chromeos.cc", "ui/screen_capture_notification_ui_chromeos.h", - "ui_proxy_config.cc", - "ui_proxy_config.h", - "ui_proxy_config_service.cc", - "ui_proxy_config_service.h", "upgrade_detector_chromeos.cc", "upgrade_detector_chromeos.h", @@ -1352,10 +1386,13 @@ source_set("unit_tests") { "accessibility/magnification_manager_unittest.cc", "accessibility/spoken_feedback_event_rewriter_unittest.cc", "arc/arc_auth_service_unittest.cc", - "arc/arc_downloads_watcher_service_unittest.cc", - "arc/arc_navigation_throttle_unittest.cc", - "arc/arc_policy_bridge_unittest.cc", - "arc/page_transition_util_unittest.cc", + "arc/downloads_watcher/arc_downloads_watcher_service_unittest.cc", + "arc/fileapi/arc_content_file_system_async_file_util_unittest.cc", + "arc/fileapi/arc_content_file_system_file_stream_reader_unittest.cc", + "arc/fileapi/arc_content_file_system_url_util_unittest.cc", + "arc/intent_helper/arc_external_protocol_dialog_unittest.cc", + "arc/intent_helper/arc_navigation_throttle_unittest.cc", + "arc/policy/arc_policy_bridge_unittest.cc", "attestation/attestation_ca_client_unittest.cc", "attestation/attestation_policy_observer_unittest.cc", "attestation/fake_certificate.cc", @@ -1432,6 +1469,7 @@ source_set("unit_tests") { "fileapi/external_file_url_util_unittest.cc", "fileapi/file_access_permissions_unittest.cc", "fileapi/file_system_backend_unittest.cc", + "hats/hats_finch_helper_unittest.cc", "hats/hats_notification_controller_unittest.cc", "input_method/browser_state_monitor_unittest.cc", "input_method/input_method_configuration_unittest.cc", @@ -1461,6 +1499,9 @@ source_set("unit_tests") { "net/client_cert_store_chromeos_unittest.cc", "net/network_portal_detector_impl_unittest.cc", "net/network_portal_notification_controller_unittest.cc", + "net/network_pref_state_observer_unittest.cc", + "net/network_state_notifier_unittest.cc", + "net/network_throttling_observer_unittest.cc", "net/wake_on_wifi_manager_unittest.cc", "options/network_property_ui_data_unittest.cc", "ownership/fake_owner_settings_service.cc", diff --git a/chromium/chrome/browser/devtools/BUILD.gn b/chromium/chrome/browser/devtools/BUILD.gn index ed12e5f62da..88bf81a5404 100644 --- a/chromium/chrome/browser/devtools/BUILD.gn +++ b/chromium/chrome/browser/devtools/BUILD.gn @@ -4,6 +4,7 @@ if (!is_android) { import("//build/config/features.gni") + import("//chrome/common/features.gni") import("//tools/grit/grit_rule.gni") } @@ -54,7 +55,6 @@ static_library("devtools") { "//build/config/compiler:no_size_t_to_int_warning", "//build/config/compiler:wexit_time_destructors", "//build/config:precompiled_headers", - "//third_party/WebKit/public:debug_devtools", ] deps = [ @@ -62,6 +62,7 @@ static_library("devtools") { "//base", "//content/public/browser", "//net", + "//third_party/WebKit/public:features", "//ui/events:dom_keycode_converter", ] @@ -71,6 +72,7 @@ static_library("devtools") { "//chrome:resources", "//chrome:strings", "//chrome/app/theme:theme_resources", + "//chrome/common", "//chrome/common/extensions/api", "//net:http_server", "//skia", @@ -90,6 +92,8 @@ static_library("devtools") { "device/android_web_socket.cc", "device/devtools_android_bridge.cc", "device/devtools_android_bridge.h", + "device/devtools_device_discovery.cc", + "device/devtools_device_discovery.h", "device/port_forwarding_controller.cc", "device/port_forwarding_controller.h", "device/tcp_device_provider.cc", @@ -126,6 +130,8 @@ static_library("devtools") { "global_confirm_info_bar.h", "remote_debugging_server.cc", "remote_debugging_server.h", + "url_constants.cc", + "url_constants.h", ] if (enable_service_discovery) { sources += [ diff --git a/chromium/chrome/browser/extensions/BUILD.gn b/chromium/chrome/browser/extensions/BUILD.gn index 2e050759cac..965847ac5e0 100644 --- a/chromium/chrome/browser/extensions/BUILD.gn +++ b/chromium/chrome/browser/extensions/BUILD.gn @@ -5,6 +5,7 @@ import("//build/config/features.gni") import("//build/config/ui.gni") import("//chrome/common/features.gni") +import("//extensions/features/features.gni") assert(enable_extensions) @@ -291,8 +292,6 @@ static_library("extensions") { "api/messaging/native_messaging_policy_handler.h", "api/metrics_private/chrome_metrics_private_delegate.cc", "api/metrics_private/chrome_metrics_private_delegate.h", - "api/metrics_private/metrics_private_api.cc", - "api/metrics_private/metrics_private_api.h", "api/module/module.cc", "api/module/module.h", "api/music_manager_private/device_id.cc", @@ -837,6 +836,7 @@ static_library("extensions") { "//components/crx_file", "//components/data_reduction_proxy/core/browser", "//components/dom_distiller/core", + "//components/drive", "//components/favicon/content", "//components/feedback", "//components/gcm_driver", @@ -861,6 +861,7 @@ static_library("extensions") { "//components/rappor", "//components/resources", "//components/safe_browsing_db:database_manager", + "//components/safe_browsing_db:safe_browsing_prefs", "//components/safe_json", "//components/search_engines", "//components/sessions", @@ -869,8 +870,8 @@ static_library("extensions") { "//components/storage_monitor", "//components/strings", "//components/sync", + "//components/sync_preferences", "//components/sync_sessions", - "//components/syncable_prefs", "//components/translate/core/browser", "//components/undo", "//components/update_client", @@ -885,10 +886,12 @@ static_library("extensions") { "//device/hid", "//extensions:extensions_resources", "//extensions/browser", + "//extensions/browser/api:api_registration", "//extensions/common/api", - "//extensions/common/api:api_registration", + "//extensions/features", "//extensions/strings", "//net", + "//printing/features", "//skia", "//sql", "//storage/browser", @@ -919,8 +922,6 @@ static_library("extensions") { if (is_chromeos) { sources += [ - "api/cast_devices_private/cast_devices_private_api.cc", - "api/cast_devices_private/cast_devices_private_api.h", "api/certificate_provider/certificate_provider_api.cc", "api/certificate_provider/certificate_provider_api.h", "api/enterprise_device_attributes/enterprise_device_attributes_api.cc", @@ -1059,6 +1060,16 @@ static_library("extensions") { deps += [ "//components/wifi" ] } + if (is_win || is_mac || is_chromeos) { + sources += [ + "api/networking_private/networking_private_crypto.cc", + "api/networking_private/networking_private_crypto.h", + ] + + # networking_private_crypto.cc depends on boringssl. + public_deps += [ "//third_party/boringssl" ] + } + if (is_win) { deps += [ "//third_party/iaccessible2", diff --git a/chromium/chrome/browser/extensions/api/activity_log_private/OWNERS b/chromium/chrome/browser/extensions/api/activity_log_private/OWNERS index 9091c448fc6..e3ff774e42d 100644 --- a/chromium/chrome/browser/extensions/api/activity_log_private/OWNERS +++ b/chromium/chrome/browser/extensions/api/activity_log_private/OWNERS @@ -1,4 +1,4 @@ # If you are editing this file, please also update # chrome/browser/extensions/activity_log/OWNERS rdevlin.cronin@chromium.org -felt@chromium.org +asargent@chromium.org 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 478e75f53b5..fe00902f063 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 @@ -30,7 +30,6 @@ class ActivityLogApiTest : public ExtensionApiTest { ActivityLogApiTest() : saved_cmdline_(base::CommandLine::NO_PROGRAM) {} ~ActivityLogApiTest() override { - ExtensionApiTest::SetUpCommandLine(&saved_cmdline_); *base::CommandLine::ForCurrentProcess() = saved_cmdline_; } 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 2b95e0ec180..82a29234514 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 @@ -45,22 +45,12 @@ class AutofillPrivateApiTest : public ExtensionApiTest { // TODO(hcarmona): Investigate converting these tests to unittests. // TODO(crbug.com/643097) Disabled for flakiness. -#if defined(OS_WIN) -#define MAYBE_SaveAddress DISABLED_SaveAddress -#else -#define MAYBE_SaveAddress SaveAddress -#endif // defined(OS_WIN) -IN_PROC_BROWSER_TEST_F(AutofillPrivateApiTest, MAYBE_SaveAddress) { +IN_PROC_BROWSER_TEST_F(AutofillPrivateApiTest, DISABLED_SaveAddress) { EXPECT_TRUE(RunAutofillSubtest("saveAddress")) << message_; } // TODO(crbug.com/643097) Disabled for flakiness. -#if defined(OS_WIN) -#define MAYBE_GetCountryList DISABLED_GetCountryList -#else -#define MAYBE_GetCountryList GetCountryList -#endif // defined(OS_WIN) -IN_PROC_BROWSER_TEST_F(AutofillPrivateApiTest, MAYBE_GetCountryList) { +IN_PROC_BROWSER_TEST_F(AutofillPrivateApiTest, DISABLED_GetCountryList) { EXPECT_TRUE(RunAutofillSubtest("getCountryList")) << message_; } @@ -69,22 +59,12 @@ IN_PROC_BROWSER_TEST_F(AutofillPrivateApiTest, GetAddressComponents) { } // TODO(crbug.com/643097) Disabled for flakiness. -#if defined(OS_WIN) -#define MAYBE_SaveCreditCard DISABLED_SaveCreditCard -#else -#define MAYBE_SaveCreditCard SaveCreditCard -#endif // defined(OS_WIN) -IN_PROC_BROWSER_TEST_F(AutofillPrivateApiTest, MAYBE_SaveCreditCard) { +IN_PROC_BROWSER_TEST_F(AutofillPrivateApiTest, DISABLED_SaveCreditCard) { EXPECT_TRUE(RunAutofillSubtest("saveCreditCard")) << message_; } // TODO(crbug.com/643097) Disabled for flakiness. -#if defined(OS_WIN) -#define MAYBE_RemoveEntry DISABLED_RemoveEntry -#else -#define MAYBE_RemoveEntry RemoveEntry -#endif // defined(OS_WIN) -IN_PROC_BROWSER_TEST_F(AutofillPrivateApiTest, MAYBE_RemoveEntry) { +IN_PROC_BROWSER_TEST_F(AutofillPrivateApiTest, DISABLED_RemoveEntry) { EXPECT_TRUE(RunAutofillSubtest("removeEntry")) << message_; } diff --git a/chromium/chrome/browser/extensions/api/autofill_private/autofill_util.cc b/chromium/chrome/browser/extensions/api/autofill_private/autofill_util.cc index 6f6d7f976ff..dc02e1981e5 100644 --- a/chromium/chrome/browser/extensions/api/autofill_private/autofill_util.cc +++ b/chromium/chrome/browser/extensions/api/autofill_private/autofill_util.cc @@ -191,12 +191,13 @@ CountryEntryList GenerateCountryList( const autofill::PersonalDataManager& personal_data) { autofill::CountryComboboxModel model; model.SetCountries(personal_data, base::Callback()); - const std::vector& countries = model.countries(); + const std::vector>& countries = + model.countries(); CountryEntryList list; - for (size_t i = 0; i < countries.size(); ++i) - list.push_back(CountryToCountryEntry(countries[i])); + for (const auto& country : countries) + list.push_back(CountryToCountryEntry(country.get())); return list; } diff --git a/chromium/chrome/browser/extensions/api/automation_internal/automation_action_adapter.h b/chromium/chrome/browser/extensions/api/automation_internal/automation_action_adapter.h index f6206983629..a5323cd990b 100644 --- a/chromium/chrome/browser/extensions/api/automation_internal/automation_action_adapter.h +++ b/chromium/chrome/browser/extensions/api/automation_internal/automation_action_adapter.h @@ -7,32 +7,20 @@ #include +#include "ui/accessibility/ax_enums.h" #include "ui/gfx/geometry/point.h" +namespace ui { +struct AXActionData; +} + namespace extensions { // Adapts an object to receive actions from the Automation extension API. class AutomationActionAdapter { public: - // Performs a default action (e.g. click, check) on the target node. - virtual void DoDefault(int32_t id) = 0; - - // Performs a focus action on the target node. - virtual void Focus(int32_t id) = 0; - - // Makes the node visible by scrolling; does not change nodes from hidden to - // shown. - virtual void MakeVisible(int32_t id) = 0; - - // Sets selection for anchor and focus node/offset pairs. Also used to set - // selection in text fields. - virtual void SetSelection(int32_t anchor_id, - int32_t anchor_offset, - int32_t focus_id, - int32_t focus_offset) = 0; - - // Shows the context menu resulting from a right click. - virtual void ShowContextMenu(int32_t id) = 0; + // Performs an action on the target node. + virtual void PerformAction(const ui::AXActionData& data) = 0; }; } // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/automation_internal/automation_internal_api.cc b/chromium/chrome/browser/extensions/api/automation_internal/automation_internal_api.cc index 6ada5f161f5..f1ff4d860a4 100644 --- a/chromium/chrome/browser/extensions/api/automation_internal/automation_internal_api.cc +++ b/chromium/chrome/browser/extensions/api/automation_internal/automation_internal_api.cc @@ -37,6 +37,7 @@ #include "content/public/browser/web_contents_user_data.h" #include "extensions/common/extension_messages.h" #include "extensions/common/permissions/permissions_data.h" +#include "ui/accessibility/ax_action_data.h" #if defined(USE_AURA) #include "chrome/browser/ui/aura/accessibility/automation_manager_aura.h" @@ -162,26 +163,8 @@ class RenderFrameHostActionAdapter : public AutomationActionAdapter { virtual ~RenderFrameHostActionAdapter() {} // AutomationActionAdapter implementation. - void DoDefault(int32_t id) override { - rfh_->AccessibilityDoDefaultAction(id); - } - - void Focus(int32_t id) override { rfh_->AccessibilitySetFocus(id); } - - void MakeVisible(int32_t id) override { - rfh_->AccessibilityScrollToMakeVisible(id, gfx::Rect()); - } - - void SetSelection(int32_t anchor_id, - int32_t anchor_offset, - int32_t focus_id, - int32_t focus_offset) override { - rfh_->AccessibilitySetSelection(anchor_id, anchor_offset, focus_id, - focus_offset); - } - - void ShowContextMenu(int32_t id) override { - rfh_->AccessibilityShowContextMenu(id); + void PerformAction(const ui::AXActionData& data) override { + rfh_->AccessibilityPerformAction(data); } private: @@ -366,29 +349,49 @@ ExtensionFunction::ResponseAction AutomationInternalPerformActionFunction::RouteActionToAdapter( api::automation_internal::PerformAction::Params* params, AutomationActionAdapter* adapter) { - int32_t automation_id = params->args.automation_node_id; + ui::AXActionData action; + action.target_node_id = params->args.automation_node_id; switch (params->args.action_type) { case api::automation_internal::ACTION_TYPE_DODEFAULT: - adapter->DoDefault(automation_id); + action.action = ui::AX_ACTION_DO_DEFAULT; + adapter->PerformAction(action); break; case api::automation_internal::ACTION_TYPE_FOCUS: - adapter->Focus(automation_id); + action.action = ui::AX_ACTION_SET_FOCUS; + adapter->PerformAction(action); break; case api::automation_internal::ACTION_TYPE_MAKEVISIBLE: - adapter->MakeVisible(automation_id); + action.action = ui::AX_ACTION_SCROLL_TO_MAKE_VISIBLE; + adapter->PerformAction(action); break; case api::automation_internal::ACTION_TYPE_SETSELECTION: { api::automation_internal::SetSelectionParams selection_params; EXTENSION_FUNCTION_VALIDATE( api::automation_internal::SetSelectionParams::Populate( params->opt_args.additional_properties, &selection_params)); - adapter->SetSelection(automation_id, selection_params.anchor_offset, - selection_params.focus_node_id, - selection_params.focus_offset); + action.anchor_node_id = params->args.automation_node_id; + action.anchor_offset = selection_params.anchor_offset; + action.focus_node_id = selection_params.focus_node_id; + action.focus_offset = selection_params.focus_offset; + action.action = ui::AX_ACTION_SET_SELECTION; + adapter->PerformAction(action); break; } case api::automation_internal::ACTION_TYPE_SHOWCONTEXTMENU: { - adapter->ShowContextMenu(automation_id); + action.action = ui::AX_ACTION_SHOW_CONTEXT_MENU; + adapter->PerformAction(action); + break; + } + case api::automation_internal::ACTION_TYPE_SETACCESSIBILITYFOCUS: { + action.action = ui::AX_ACTION_SET_ACCESSIBILITY_FOCUS; + adapter->PerformAction(action); + break; + } + case api::automation_internal:: + ACTION_TYPE_SETSEQUENTIALFOCUSNAVIGATIONSTARTINGPOINT: { + action.action = + ui::AX_ACTION_SET_SEQUENTIAL_FOCUS_NAVIGATION_STARTING_POINT; + adapter->PerformAction(action); break; } default: diff --git a/chromium/chrome/browser/extensions/api/autotest_private/autotest_private_api.cc b/chromium/chrome/browser/extensions/api/autotest_private/autotest_private_api.cc index d8aee6b8404..3583b207472 100644 --- a/chromium/chrome/browser/extensions/api/autotest_private/autotest_private_api.cc +++ b/chromium/chrome/browser/extensions/api/autotest_private/autotest_private_api.cc @@ -119,8 +119,8 @@ ExtensionFunction::ResponseAction AutotestPrivateLoginStatusFunction::Run() { result->SetBoolean("isGuest", user_manager->IsLoggedInAsGuest()); result->SetBoolean("isKiosk", user_manager->IsLoggedInAsKioskApp()); - const user_manager::User* user = user_manager->GetLoggedInUser(); - result->SetString("email", user->email()); + const user_manager::User* user = user_manager->GetActiveUser(); + result->SetString("email", user->GetAccountId().GetUserEmail()); result->SetString("displayEmail", user->display_email()); std::string user_image; 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 bfe4f352c37..fbf447cb498 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 @@ -21,11 +21,11 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/extensions/api/bookmarks/bookmark_api_constants.h" #include "chrome/browser/extensions/api/bookmarks/bookmark_api_helpers.h" -#include "chrome/browser/extensions/extension_web_ui.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/bookmarks/bookmark_drag_drop.h" #include "chrome/browser/undo/bookmark_undo_service_factory.h" #include "chrome/common/extensions/api/bookmark_manager_private.h" +#include "chrome/common/extensions/extension_constants.h" #include "chrome/grit/generated_resources.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/browser/bookmark_node_data.h" @@ -41,6 +41,7 @@ #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" #include "extensions/browser/extension_function_dispatcher.h" +#include "extensions/browser/extension_registry.h" #include "extensions/browser/view_type_utils.h" #include "ui/base/dragdrop/drag_drop_types.h" #include "ui/base/l10n/l10n_util.h" @@ -51,6 +52,9 @@ using bookmarks::BookmarkNode; using bookmarks::BookmarkNodeData; using content::WebContents; +DEFINE_WEB_CONTENTS_USER_DATA_KEY( + extensions::BookmarkManagerPrivateDragEventRouter); + namespace extensions { namespace bookmark_keys = bookmark_api_constants; @@ -283,9 +287,12 @@ void BookmarkManagerPrivateAPI::OnListenerAdded( } BookmarkManagerPrivateDragEventRouter::BookmarkManagerPrivateDragEventRouter( - Profile* profile, content::WebContents* web_contents) - : profile_(profile), web_contents_(web_contents) { + : web_contents_(web_contents), + profile_( + Profile::FromBrowserContext(web_contents_->GetBrowserContext())) { + // We need to guarantee the BookmarkTabHelper is created. + BookmarkTabHelper::CreateForWebContents(web_contents_); BookmarkTabHelper* bookmark_tab_helper = BookmarkTabHelper::FromWebContents(web_contents_); bookmark_tab_helper->set_bookmark_drag_delegate(this); @@ -293,10 +300,8 @@ BookmarkManagerPrivateDragEventRouter::BookmarkManagerPrivateDragEventRouter( BookmarkManagerPrivateDragEventRouter:: ~BookmarkManagerPrivateDragEventRouter() { - BookmarkTabHelper* bookmark_tab_helper = - BookmarkTabHelper::FromWebContents(web_contents_); - if (bookmark_tab_helper->bookmark_drag_delegate() == this) - bookmark_tab_helper->set_bookmark_drag_delegate(NULL); + // No need to remove ourselves as the BookmarkTabHelper's delegate, since they + // are both WebContentsUserData and will be deleted at the same time. } void BookmarkManagerPrivateDragEventRouter::DispatchEvent( @@ -600,11 +605,8 @@ bool BookmarkManagerPrivateDropFunction::RunOnReady() { WebContents* web_contents = GetAssociatedWebContents(); CHECK(web_contents); - ExtensionWebUI* web_ui = - static_cast(web_contents->GetWebUI()->GetController()); - CHECK(web_ui); BookmarkManagerPrivateDragEventRouter* router = - web_ui->bookmark_manager_private_drag_event_router(); + BookmarkManagerPrivateDragEventRouter::FromWebContents(web_contents); DCHECK(router); const BookmarkNodeData* drag_data = router->GetBookmarkNodeData(); 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 932a1b82220..c67a854e198 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 @@ -16,6 +16,7 @@ #include "components/bookmarks/browser/base_bookmark_model_observer.h" #include "components/bookmarks/browser/bookmark_node_data.h" #include "components/undo/bookmark_undo_service.h" +#include "content/public/browser/web_contents_user_data.h" #include "extensions/browser/browser_context_keyed_api_factory.h" #include "extensions/browser/event_router.h" @@ -93,10 +94,12 @@ class BookmarkManagerPrivateAPI : public BrowserContextKeyedAPI, // Class that handles the drag and drop related chrome.bookmarkManagerPrivate // events. This class has one instance per bookmark manager tab. class BookmarkManagerPrivateDragEventRouter - : public BookmarkTabHelper::BookmarkDrag { + : public BookmarkTabHelper::BookmarkDrag, + public content::WebContentsUserData< + BookmarkManagerPrivateDragEventRouter> { public: - BookmarkManagerPrivateDragEventRouter(Profile* profile, - content::WebContents* web_contents); + explicit BookmarkManagerPrivateDragEventRouter( + content::WebContents* web_contents); ~BookmarkManagerPrivateDragEventRouter() override; // BookmarkTabHelper::BookmarkDrag interface @@ -118,8 +121,8 @@ class BookmarkManagerPrivateDragEventRouter const std::string& event_name, std::unique_ptr args); - Profile* profile_; content::WebContents* web_contents_; + Profile* profile_; bookmarks::BookmarkNodeData bookmark_drag_data_; DISALLOW_COPY_AND_ASSIGN(BookmarkManagerPrivateDragEventRouter); diff --git a/chromium/chrome/browser/extensions/api/braille_display_private/braille_controller.h b/chromium/chrome/browser/extensions/api/braille_display_private/braille_controller.h index 73ec3e6b5fa..5b575d2a32e 100644 --- a/chromium/chrome/browser/extensions/api/braille_display_private/braille_controller.h +++ b/chromium/chrome/browser/extensions/api/braille_display_private/braille_controller.h @@ -24,7 +24,9 @@ class BrailleController { static BrailleController* GetInstance(); virtual std::unique_ptr GetDisplayState() = 0; - virtual void WriteDots(const std::vector& cells) = 0; + virtual void WriteDots(const std::vector& cells, + unsigned int cols, + unsigned int rows) = 0; virtual void AddObserver(BrailleObserver* observer) = 0; virtual void RemoveObserver(BrailleObserver* observer) = 0; 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 78e84507d67..5a406e35074 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 @@ -87,29 +87,41 @@ std::unique_ptr BrailleControllerImpl::GetDisplayState() { StartConnecting(); std::unique_ptr display_state(new DisplayState); if (connection_.get() && connection_->Connected()) { - size_t size; - if (!connection_->GetDisplaySize(&size)) { + unsigned int columns = 0; + unsigned int rows = 0; + if (!connection_->GetDisplaySize(&columns, &rows)) { Disconnect(); - } else if (size > 0) { // size == 0 means no display present. + } else if (rows * columns > 0) { + // rows * columns == 0 means no display present. display_state->available = true; - display_state->text_cell_count.reset(new int(size)); + display_state->text_column_count.reset(new int(columns)); + display_state->text_row_count.reset(new int(rows)); } } return display_state; } -void BrailleControllerImpl::WriteDots(const std::vector& cells) { +void BrailleControllerImpl::WriteDots(const std::vector& cells, + unsigned int cells_cols, + unsigned int cells_rows) { DCHECK_CURRENTLY_ON(BrowserThread::IO); if (connection_ && connection_->Connected()) { - size_t size; - if (!connection_->GetDisplaySize(&size)) { + // Row count and column count of current display. + unsigned int columns = 0; + unsigned int rows = 0; + if (!connection_->GetDisplaySize(&columns, &rows)) { Disconnect(); } - std::vector sizedCells(size); - std::memcpy(&sizedCells[0], cells.data(), std::min(cells.size(), size)); - if (size > cells.size()) - std::fill(sizedCells.begin() + cells.size(), sizedCells.end(), 0); - if (!connection_->WriteDots(&sizedCells[0])) + std::vector sized_cells(rows * columns, 0); + unsigned int row_limit = std::min(rows, cells_rows); + unsigned int col_limit = std::min(columns, cells_cols); + for (unsigned int row = 0; row < row_limit; row++) { + for (unsigned int col = 0; col < col_limit; col++) { + sized_cells[row * columns + col] = cells[row * cells_cols + col]; + } + } + + if (!connection_->WriteDots(sized_cells)) Disconnect(); } } @@ -303,7 +315,8 @@ void BrailleControllerImpl::DispatchKeyEvent(std::unique_ptr event) { return; } VLOG(1) << "Dispatching key event: " << *event->ToValue(); - FOR_EACH_OBSERVER(BrailleObserver, observers_, OnBrailleKeyEvent(*event)); + for (auto& observer : observers_) + observer.OnBrailleKeyEvent(*event); } void BrailleControllerImpl::DispatchOnDisplayStateChanged( @@ -318,8 +331,8 @@ void BrailleControllerImpl::DispatchOnDisplayStateChanged( } return; } - FOR_EACH_OBSERVER(BrailleObserver, observers_, - OnBrailleDisplayStateChanged(*new_state)); + for (auto& observer : observers_) + observer.OnBrailleDisplayStateChanged(*new_state); } } // namespace braille_display_private diff --git a/chromium/chrome/browser/extensions/api/braille_display_private/braille_controller_brlapi.h b/chromium/chrome/browser/extensions/api/braille_display_private/braille_controller_brlapi.h index aafa57d7b46..63962e844f5 100644 --- a/chromium/chrome/browser/extensions/api/braille_display_private/braille_controller_brlapi.h +++ b/chromium/chrome/browser/extensions/api/braille_display_private/braille_controller_brlapi.h @@ -25,7 +25,9 @@ class BrailleControllerImpl : public BrailleController { public: static BrailleControllerImpl* GetInstance(); std::unique_ptr GetDisplayState() override; - void WriteDots(const std::vector& cells) override; + void WriteDots(const std::vector& cells, + unsigned int cols, + unsigned int rows) override; void AddObserver(BrailleObserver* observer) override; void RemoveObserver(BrailleObserver* observer) override; diff --git a/chromium/chrome/browser/extensions/api/braille_display_private/braille_display_private_api.cc b/chromium/chrome/browser/extensions/api/braille_display_private/braille_display_private_api.cc index 73d1bdbf342..efa0629297f 100644 --- a/chromium/chrome/browser/extensions/api/braille_display_private/braille_display_private_api.cc +++ b/chromium/chrome/browser/extensions/api/braille_display_private/braille_display_private_api.cc @@ -169,11 +169,15 @@ BrailleDisplayPrivateWriteDotsFunction:: bool BrailleDisplayPrivateWriteDotsFunction::Prepare() { params_ = WriteDots::Params::Create(*args_); EXTENSION_FUNCTION_VALIDATE(params_); + EXTENSION_FUNCTION_VALIDATE( + params_->cells.size() >= + static_cast(params_->columns * params_->rows)); return true; } void BrailleDisplayPrivateWriteDotsFunction::Work() { - BrailleController::GetInstance()->WriteDots(params_->cells); + BrailleController::GetInstance()->WriteDots(params_->cells, params_->columns, + params_->rows); } bool BrailleDisplayPrivateWriteDotsFunction::Respond() { 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 c69dc92cc27..97a4424dcd0 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 @@ -2,10 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef USE_BRLAPI -#error This test requires brlapi. -#endif - #include #include @@ -24,7 +20,7 @@ #include "chrome/browser/profiles/profile_manager.h" #include "chrome/test/base/testing_profile.h" #include "chromeos/chromeos_switches.h" -#include "components/user_manager/user_manager.h" +#include "components/session_manager/core/session_manager.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/notification_service.h" #include "content/public/test/test_utils.h" @@ -54,7 +50,8 @@ brlapi_keyCode_t kErrorKeyCode = BRLAPI_KEY_MAX; // itself. struct MockBrlapiConnectionData { bool connected; - size_t display_size; + size_t display_columns; + size_t display_rows; brlapi_error_t error; std::vector written_content; // List of brlapi key codes. A negative number makes the connection mock @@ -84,7 +81,7 @@ class MockBrlapiConnection : public BrlapiConnection { void Disconnect() override { data_->connected = false; if (data_->reappear_on_disconnect) { - data_->display_size *= 2; + data_->display_columns *= 2; BrowserThread::PostTask( BrowserThread::IO, FROM_HERE, base::Bind(&BrailleControllerImpl::PokeSocketDirForTesting, @@ -100,14 +97,16 @@ class MockBrlapiConnection : public BrlapiConnection { return data_->error.brlerrno != BRLAPI_ERROR_SUCCESS ? "Error" : "Success"; } - bool GetDisplaySize(size_t* size) override { - *size = data_->display_size; + bool GetDisplaySize(unsigned int* columns, unsigned int* rows) override { + *columns = data_->display_columns; + *rows = data_->display_rows; return true; } - bool WriteDots(const unsigned char* cells) override { - std::string written(reinterpret_cast(cells), - data_->display_size); + bool WriteDots(const std::vector& cells) override { + std::string written( + cells.begin(), + cells.begin() + data_->display_rows * data_->display_columns); data_->written_content.push_back(written); return true; } @@ -147,7 +146,8 @@ class BrailleDisplayPrivateApiTest : public ExtensionApiTest { void SetUpInProcessBrowserTestFixture() override { ExtensionApiTest::SetUpInProcessBrowserTestFixture(); connection_data_.connected = false; - connection_data_.display_size = 0; + connection_data_.display_rows = 0; + connection_data_.display_columns = 0; connection_data_.error.brlerrno = BRLAPI_ERROR_SUCCESS; connection_data_.reappear_on_disconnect = false; BrailleControllerImpl::GetInstance()->SetCreateBrlapiConnectionForTesting( @@ -178,22 +178,25 @@ class BrailleDisplayPrivateApiTest : public ExtensionApiTest { }; IN_PROC_BROWSER_TEST_F(BrailleDisplayPrivateApiTest, WriteDots) { - connection_data_.display_size = 11; + connection_data_.display_columns = 11; + connection_data_.display_rows = 1; ASSERT_TRUE(RunComponentExtensionTest("braille_display_private/write_dots")) << message_; ASSERT_EQ(3U, connection_data_.written_content.size()); - const std::string expected_content(connection_data_.display_size, '\0'); + const std::string expected_content( + connection_data_.display_columns * connection_data_.display_rows, '\0'); for (size_t i = 0; i < connection_data_.written_content.size(); ++i) { - ASSERT_EQ(std::string( - connection_data_.display_size, - static_cast(i)), - connection_data_.written_content[i]) + ASSERT_EQ(std::string(connection_data_.display_columns * + connection_data_.display_rows, + static_cast(i)), + connection_data_.written_content[i]) << "String " << i << " doesn't match"; } } IN_PROC_BROWSER_TEST_F(BrailleDisplayPrivateApiTest, KeyEvents) { - connection_data_.display_size = 11; + connection_data_.display_columns = 11; + connection_data_.display_rows = 1; // Braille navigation commands. connection_data_.pending_keys.push_back(BRLAPI_KEY_TYPE_CMD | @@ -256,7 +259,8 @@ IN_PROC_BROWSER_TEST_F(BrailleDisplayPrivateApiTest, KeyEvents) { } IN_PROC_BROWSER_TEST_F(BrailleDisplayPrivateApiTest, DisplayStateChanges) { - connection_data_.display_size = 11; + connection_data_.display_columns = 11; + connection_data_.display_rows = 1; connection_data_.pending_keys.push_back(kErrorKeyCode); connection_data_.reappear_on_disconnect = true; ASSERT_TRUE(RunComponentExtensionTest( @@ -330,9 +334,9 @@ IN_PROC_BROWSER_TEST_F(BrailleDisplayPrivateAPIUserTest, MAYBE_KeyEventOnLockScreen) { std::unique_ptr tester(ScreenLocker::GetTester()); // Log in. - user_manager::UserManager::Get()->UserLoggedIn( - AccountId::FromUserEmail(kTestUserName), kTestUserName, true); - user_manager::UserManager::Get()->SessionStarted(); + session_manager::SessionManager::Get()->CreateSession( + AccountId::FromUserEmail(kTestUserName), kTestUserName); + session_manager::SessionManager::Get()->SessionStarted(); Profile* profile = ProfileManager::GetActiveUserProfile(); ASSERT_FALSE( ProfileHelper::GetSigninProfile()->IsSameProfile(profile)) diff --git a/chromium/chrome/browser/extensions/api/braille_display_private/brlapi_connection.cc b/chromium/chrome/browser/extensions/api/braille_display_private/brlapi_connection.cc index 10dd503680c..b163d73a3d4 100644 --- a/chromium/chrome/browser/extensions/api/braille_display_private/brlapi_connection.cc +++ b/chromium/chrome/browser/extensions/api/braille_display_private/brlapi_connection.cc @@ -19,7 +19,7 @@ namespace braille_display_private { namespace { // Default virtual terminal. This can be overriden by setting the // WINDOWPATH environment variable. This is only used when not running -// under Crhome OS (that is in aura for a Linux desktop). +// under Chrome OS (that is in aura for a Linux desktop). // TODO(plundblad): Find a way to detect the controlling terminal of the // X server. static const int kDefaultTtyLinux = 7; @@ -41,8 +41,8 @@ class BrlapiConnectionImpl : public BrlapiConnection { bool Connected() override { return handle_ != nullptr; } brlapi_error_t* BrlapiError() override; std::string BrlapiStrError() override; - bool GetDisplaySize(size_t* size) override; - bool WriteDots(const unsigned char* cells) override; + bool GetDisplaySize(unsigned int* rows, unsigned int* columns) override; + bool WriteDots(const std::vector& cells) override; int ReadKey(brlapi_keyCode_t* keyCode) override; private: @@ -93,9 +93,10 @@ BrlapiConnection::ConnectResult BrlapiConnectionImpl::Connect( Disconnect(); return CONNECT_ERROR_RETRY; } + unsigned int rows = 0; + unsigned int columns = 0; - size_t size; - if (!GetDisplaySize(&size)) { + if (!GetDisplaySize(&rows, &columns)) { // Error already logged. Disconnect(); return CONNECT_ERROR_RETRY; @@ -104,7 +105,7 @@ BrlapiConnection::ConnectResult BrlapiConnectionImpl::Connect( // A display size of 0 means no display connected. We can't reliably // detect when a display gets connected, so fail and let the caller // retry connecting. - if (size == 0) { + if (rows * columns == 0) { VLOG(1) << "No braille display connected"; Disconnect(); return CONNECT_ERROR_RETRY; @@ -148,24 +149,24 @@ std::string BrlapiConnectionImpl::BrlapiStrError() { return libbrlapi_loader_->brlapi_strerror(BrlapiError()); } -bool BrlapiConnectionImpl::GetDisplaySize(size_t* size) { +bool BrlapiConnectionImpl::GetDisplaySize(unsigned int* columns, + unsigned int* rows) { if (!CheckConnected()) { return false; } - unsigned int columns, rows; - if (libbrlapi_loader_->brlapi__getDisplaySize( - handle_.get(), &columns, &rows) < 0) { + if (libbrlapi_loader_->brlapi__getDisplaySize(handle_.get(), columns, rows) < + 0) { LOG(ERROR) << "Couldn't get braille display size " << BrlapiStrError(); return false; } - *size = columns * rows; return true; } -bool BrlapiConnectionImpl::WriteDots(const unsigned char* cells) { +bool BrlapiConnectionImpl::WriteDots(const std::vector& cells) { + // Cells is a 2D vector, compressed into 1D. if (!CheckConnected()) return false; - if (libbrlapi_loader_->brlapi__writeDots(handle_.get(), cells) < 0) { + if (libbrlapi_loader_->brlapi__writeDots(handle_.get(), cells.data()) < 0) { VLOG(1) << "Couldn't write to brlapi: " << BrlapiStrError(); return false; } diff --git a/chromium/chrome/browser/extensions/api/braille_display_private/brlapi_connection.h b/chromium/chrome/browser/extensions/api/braille_display_private/brlapi_connection.h index f1cba434098..0d1fddeb00a 100644 --- a/chromium/chrome/browser/extensions/api/braille_display_private/brlapi_connection.h +++ b/chromium/chrome/browser/extensions/api/braille_display_private/brlapi_connection.h @@ -8,6 +8,7 @@ #include #include +#include #include "base/callback_forward.h" #include "base/macros.h" @@ -50,14 +51,15 @@ class BrlapiConnection { // for logging. virtual std::string BrlapiStrError() = 0; - // Gets the total size of the display, which may be 0 if no display is - // present, returning true on success. Note that this is cached in the - // brlapi client so it is cheap. - virtual bool GetDisplaySize(size_t* size) = 0; + // Gets the row and column size of the display. Row x columns might be 0 + // if no display is present, returning true on success. Note that this is + // cached in the brlapi client so it is cheap. + virtual bool GetDisplaySize(unsigned int* columns, unsigned int* rows) = 0; // Sends the specified cells to the display. The array size must - // be equal to what GetDisplaySize() last returned for this connection. - virtual bool WriteDots(const unsigned char* cells) = 0; + // be equal to what GetDisplaySize() last returned for this connection, + // that is, cells must have a size of rows x columns. + virtual bool WriteDots(const std::vector& cells) = 0; // Reads the next keyboard command, returning true on success. // Returns < 0 on error, 0 if no more keys are pending and > 0 diff --git a/chromium/chrome/browser/extensions/api/braille_display_private/brlapi_keycode_map.cc b/chromium/chrome/browser/extensions/api/braille_display_private/brlapi_keycode_map.cc index 1e8a9530699..aa4e913a4fc 100644 --- a/chromium/chrome/browser/extensions/api/braille_display_private/brlapi_keycode_map.cc +++ b/chromium/chrome/browser/extensions/api/braille_display_private/brlapi_keycode_map.cc @@ -142,8 +142,14 @@ void MapCommand(brlapi_keyCode_t code, KeyEvent* event) { event->display_position.reset(new int(argument)); break; case BRLAPI_KEY_CMD_PASSDOTS: - event->command = KEY_COMMAND_DOTS; - event->braille_dots.reset(new int(argument & kAllDots)); + unsigned int dots = argument & kAllDots; + event->braille_dots.reset(new int(dots)); + + // BRLAPI_DOTC represents when the braille space key is pressed. + if (dots && (argument & BRLAPI_DOTC)) + event->command = KEY_COMMAND_CHORD; + else + event->command = KEY_COMMAND_DOTS; MapModifierFlags(code, event); break; } diff --git a/chromium/chrome/browser/extensions/api/braille_display_private/mock_braille_controller.cc b/chromium/chrome/browser/extensions/api/braille_display_private/mock_braille_controller.cc index 0bfd5f9c0dd..0e07e7aa2e6 100644 --- a/chromium/chrome/browser/extensions/api/braille_display_private/mock_braille_controller.cc +++ b/chromium/chrome/browser/extensions/api/braille_display_private/mock_braille_controller.cc @@ -14,8 +14,10 @@ MockBrailleController::MockBrailleController() std::unique_ptr MockBrailleController::GetDisplayState() { std::unique_ptr state(new DisplayState()); state->available = available_; - if (available_) - state->text_cell_count.reset(new int(18)); + if (available_) { + state->text_column_count.reset(new int(18)); + state->text_row_count.reset(new int(18)); + } return state; } diff --git a/chromium/chrome/browser/extensions/api/braille_display_private/stub_braille_controller.cc b/chromium/chrome/browser/extensions/api/braille_display_private/stub_braille_controller.cc index ac30bdd0038..5e8a8c5be24 100644 --- a/chromium/chrome/browser/extensions/api/braille_display_private/stub_braille_controller.cc +++ b/chromium/chrome/browser/extensions/api/braille_display_private/stub_braille_controller.cc @@ -15,8 +15,9 @@ std::unique_ptr StubBrailleController::GetDisplayState() { return std::unique_ptr(new DisplayState); } -void StubBrailleController::WriteDots(const std::vector& cells) { -} +void StubBrailleController::WriteDots(const std::vector& cells, + unsigned int cols, + unsigned int rows) {} void StubBrailleController::AddObserver(BrailleObserver* observer) { } diff --git a/chromium/chrome/browser/extensions/api/braille_display_private/stub_braille_controller.h b/chromium/chrome/browser/extensions/api/braille_display_private/stub_braille_controller.h index 4184d04abe7..cc159125575 100644 --- a/chromium/chrome/browser/extensions/api/braille_display_private/stub_braille_controller.h +++ b/chromium/chrome/browser/extensions/api/braille_display_private/stub_braille_controller.h @@ -17,7 +17,9 @@ class StubBrailleController : public BrailleController { public: StubBrailleController(); std::unique_ptr GetDisplayState() override; - void WriteDots(const std::vector& cells) override; + void WriteDots(const std::vector& cells, + unsigned int cols, + unsigned int rows) override; void AddObserver(BrailleObserver* observer) override; void RemoveObserver(BrailleObserver* observer) override; diff --git a/chromium/chrome/browser/extensions/api/cast_devices_private/cast_devices_private_api.cc b/chromium/chrome/browser/extensions/api/cast_devices_private/cast_devices_private_api.cc deleted file mode 100644 index 8537677e546..00000000000 --- a/chromium/chrome/browser/extensions/api/cast_devices_private/cast_devices_private_api.cc +++ /dev/null @@ -1,108 +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/extensions/api/cast_devices_private/cast_devices_private_api.h" - -#include "base/lazy_instance.h" -#include "base/strings/utf_string_conversions.h" -#include "chrome/common/extensions/api/cast_devices_private.h" - -namespace extensions { - -namespace { - -ash::CastConfigDelegate::Receiver ConvertReceiverType( - const api::cast_devices_private::Receiver& receiver) { - ash::CastConfigDelegate::Receiver result; - result.id = receiver.id; - result.name = base::UTF8ToUTF16(receiver.name); - return result; -} - -ash::CastConfigDelegate::Activity ConvertActivityType( - const api::cast_devices_private::Activity& activity) { - ash::CastConfigDelegate::Activity result; - result.id = activity.id; - result.title = base::UTF8ToUTF16(activity.title); - if (activity.tab_id) - result.tab_id = *activity.tab_id; - else - result.tab_id = ash::CastConfigDelegate::Activity::TabId::UNKNOWN; - return result; -} - -ash::CastConfigDelegate::ReceiverAndActivity ConvertReceiverAndActivityType( - const api::cast_devices_private::Receiver& receiver, - const api::cast_devices_private::Activity* activity) { - ash::CastConfigDelegate::ReceiverAndActivity result; - result.receiver = ConvertReceiverType(receiver); - if (activity) - result.activity = ConvertActivityType(*activity); - return result; -} - -} // namespace - -static base::LazyInstance< - BrowserContextKeyedAPIFactory> g_factory = - LAZY_INSTANCE_INITIALIZER; - -// static -BrowserContextKeyedAPIFactory* -CastDeviceUpdateListeners::GetFactoryInstance() { - return g_factory.Pointer(); -} - -// static -CastDeviceUpdateListeners* CastDeviceUpdateListeners::Get( - content::BrowserContext* context) { - return BrowserContextKeyedAPIFactory::Get(context); -} - -CastDeviceUpdateListeners::CastDeviceUpdateListeners( - content::BrowserContext* context) {} - -CastDeviceUpdateListeners::~CastDeviceUpdateListeners() {} - -void CastDeviceUpdateListeners::AddObserver( - ash::CastConfigDelegate::Observer* observer) { - observer_list_.AddObserver(observer); -} - -void CastDeviceUpdateListeners::RemoveObserver( - ash::CastConfigDelegate::Observer* observer) { - observer_list_.RemoveObserver(observer); -} - -void CastDeviceUpdateListeners::NotifyCallbacks( - const ReceiverAndActivityList& devices) { - FOR_EACH_OBSERVER(ash::CastConfigDelegate::Observer, observer_list_, - OnDevicesUpdated(devices)); -} - -CastDevicesPrivateUpdateDevicesFunction:: - CastDevicesPrivateUpdateDevicesFunction() {} - -CastDevicesPrivateUpdateDevicesFunction:: - ~CastDevicesPrivateUpdateDevicesFunction() {} - -ExtensionFunction::ResponseAction -CastDevicesPrivateUpdateDevicesFunction::Run() { - auto params = - api::cast_devices_private::UpdateDevices::Params::Create(*args_); - - CastDeviceUpdateListeners::ReceiverAndActivityList devices; - for (const api::cast_devices_private::ReceiverActivity& device : - params->devices) { - devices.push_back( - ConvertReceiverAndActivityType(device.receiver, device.activity.get())); - } - - auto* listeners = CastDeviceUpdateListeners::Get(browser_context()); - listeners->NotifyCallbacks(devices); - - return RespondNow(NoArguments()); -} - -} // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/cast_devices_private/cast_devices_private_api.h b/chromium/chrome/browser/extensions/api/cast_devices_private/cast_devices_private_api.h deleted file mode 100644 index 97b21ea7db3..00000000000 --- a/chromium/chrome/browser/extensions/api/cast_devices_private/cast_devices_private_api.h +++ /dev/null @@ -1,72 +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. - -#ifndef CHROME_BROWSER_EXTENSIONS_API_CAST_DEVICES_PRIVATE_CAST_DEVICES_PRIVATE_API_H_ -#define CHROME_BROWSER_EXTENSIONS_API_CAST_DEVICES_PRIVATE_CAST_DEVICES_PRIVATE_API_H_ - -#include - -#include "ash/common/cast_config_delegate.h" -#include "base/callback_list.h" -#include "base/macros.h" -#include "base/observer_list.h" -#include "extensions/browser/browser_context_keyed_api_factory.h" -#include "extensions/browser/extension_function.h" - -namespace extensions { - -class CastDeviceUpdateListeners : public BrowserContextKeyedAPI { - public: - explicit CastDeviceUpdateListeners(content::BrowserContext* context); - ~CastDeviceUpdateListeners() override; - - // Fetches an instance for the given context. - static CastDeviceUpdateListeners* Get(content::BrowserContext* context); - - // Adds an observer that will be invoked when new device data is available. - void AddObserver(ash::CastConfigDelegate::Observer* observer); - void RemoveObserver(ash::CastConfigDelegate::Observer* observer); - - // BrowserContextKeyedAPI implementation: - static BrowserContextKeyedAPIFactory* - GetFactoryInstance(); - static const bool kServiceIsCreatedWithBrowserContext = false; - - private: - using ReceiverAndActivityList = - std::vector; - - friend class CastDevicesPrivateUpdateDevicesFunction; // For NotifyCallbacks. - void NotifyCallbacks(const ReceiverAndActivityList& devices); - - base::ObserverList observer_list_; - - friend class BrowserContextKeyedAPIFactory; - - // BrowserContextKeyedAPI implementation: - static const char* service_name() { return "CastDeviceUpdateListeners"; } - - DISALLOW_COPY_AND_ASSIGN(CastDeviceUpdateListeners); -}; - -// static void updateDeviceState(ReceiverActivity[] devices); -class CastDevicesPrivateUpdateDevicesFunction : - public UIThreadExtensionFunction { - public: - CastDevicesPrivateUpdateDevicesFunction(); - - private: - ~CastDevicesPrivateUpdateDevicesFunction() override; - - // ExtensionFunction: - ResponseAction Run() override; - - DECLARE_EXTENSION_FUNCTION("cast.devicesPrivate.updateDevices", - CASTDEVICESPRIVATE_UPDATEDEVICES); - DISALLOW_COPY_AND_ASSIGN(CastDevicesPrivateUpdateDevicesFunction); -}; - -} // namespace extensions - -#endif // CHROME_BROWSER_EXTENSIONS_API_CAST_DEVICES_PRIVATE_CAST_DEVICES_PRIVATE_API_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 848aa5cca59..df4109dae74 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 @@ -32,7 +32,7 @@ #include "net/base/net_errors.h" #include "net/base/rand_callback.h" #include "net/log/net_log_source.h" -#include "net/udp/udp_server_socket.h" +#include "net/socket/udp_server_socket.h" #include "testing/gtest/include/gtest/gtest.h" using media::cast::test::GetFreeLocalPort; 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 52697efe24c..81bf52b83ff 100644 --- a/chromium/chrome/browser/extensions/api/cast_streaming/performance_test.cc +++ b/chromium/chrome/browser/extensions/api/cast_streaming/performance_test.cc @@ -48,7 +48,7 @@ #include "net/base/net_errors.h" #include "net/base/rand_callback.h" #include "net/log/net_log_source.h" -#include "net/udp/udp_server_socket.h" +#include "net/socket/udp_server_socket.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/perf/perf_test.h" #include "ui/compositor/compositor_switches.h" 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 f4b3aa3c022..e6c94df4e2b 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 @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include -#include #include #include #include @@ -33,11 +31,12 @@ #include "content/public/test/test_navigation_observer.h" #include "content/public/test/test_utils.h" #include "crypto/rsa_private_key.h" -#include "crypto/scoped_openssl_types.h" #include "extensions/common/extension.h" #include "extensions/test/result_catcher.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/evp.h" +#include "third_party/boringssl/src/include/openssl/rsa.h" using testing::Return; using testing::_; @@ -82,7 +81,7 @@ void StoreDigest(std::vector* digest, bool RsaSign(const std::vector& digest, crypto::RSAPrivateKey* key, std::vector* signature) { - crypto::ScopedRSA rsa_key(EVP_PKEY_get1_RSA(key->key())); + RSA* rsa_key = EVP_PKEY_get0_RSA(key->key()); if (!rsa_key) return false; @@ -94,9 +93,9 @@ bool RsaSign(const std::vector& digest, return false; } size_t len = 0; - signature->resize(RSA_size(rsa_key.get())); + signature->resize(RSA_size(rsa_key)); const int rv = - RSA_sign_raw(rsa_key.get(), &len, signature->data(), signature->size(), + RSA_sign_raw(rsa_key, &len, signature->data(), signature->size(), prefixed_digest, prefixed_digest_len, RSA_PKCS1_PADDING); if (is_alloced) free(prefixed_digest); 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 0e02af7f010..d65c7b41f03 100644 --- a/chromium/chrome/browser/extensions/api/chrome_extensions_api_client.cc +++ b/chromium/chrome/browser/extensions/api/chrome_extensions_api_client.cc @@ -32,19 +32,20 @@ #include "extensions/browser/api/virtual_keyboard_private/virtual_keyboard_delegate.h" #include "extensions/browser/guest_view/web_view/web_view_guest.h" #include "extensions/browser/guest_view/web_view/web_view_permission_helper.h" +#include "printing/features/features.h" #if defined(OS_CHROMEOS) #include "chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.h" #endif -#if defined(ENABLE_PRINTING) -#if defined(ENABLE_PRINT_PREVIEW) +#if BUILDFLAG(ENABLE_PRINTING) +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) #include "chrome/browser/printing/print_preview_message_handler.h" #include "chrome/browser/printing/print_view_manager.h" #else #include "chrome/browser/printing/print_view_manager_basic.h" -#endif // defined(ENABLE_PRINT_PREVIEW) -#endif // defined(ENABLE_PRINTING) +#endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) +#endif // BUILDFLAG(ENABLE_PRINTING) namespace extensions { @@ -70,14 +71,14 @@ void ChromeExtensionsAPIClient::AddAdditionalValueStoreCaches( void ChromeExtensionsAPIClient::AttachWebContentsHelpers( content::WebContents* web_contents) const { favicon::CreateContentFaviconDriverForWebContents(web_contents); -#if defined(ENABLE_PRINTING) -#if defined(ENABLE_PRINT_PREVIEW) +#if BUILDFLAG(ENABLE_PRINTING) +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) printing::PrintViewManager::CreateForWebContents(web_contents); printing::PrintPreviewMessageHandler::CreateForWebContents(web_contents); #else printing::PrintViewManagerBasic::CreateForWebContents(web_contents); -#endif // defined(ENABLE_PRINT_PREVIEW) -#endif // defined(ENABLE_PRINTING) +#endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) +#endif // BUILDFLAG(ENABLE_PRINTING) pdf::PDFWebContentsHelper::CreateForWebContentsWithClient( web_contents, std::unique_ptr( new ChromePDFWebContentsHelperClient())); diff --git a/chromium/chrome/browser/extensions/api/cloud_print_private/cloud_print_private_api.cc b/chromium/chrome/browser/extensions/api/cloud_print_private/cloud_print_private_api.cc index 9ee429c8562..a3b40642e23 100644 --- a/chromium/chrome/browser/extensions/api/cloud_print_private/cloud_print_private_api.cc +++ b/chromium/chrome/browser/extensions/api/cloud_print_private/cloud_print_private_api.cc @@ -13,12 +13,13 @@ #include "chrome/common/extensions/api/cloud_print_private.h" #include "google_apis/google_api_keys.h" #include "net/base/network_interfaces.h" +#include "printing/features/features.h" namespace extensions { namespace { -#if defined(ENABLE_PRINT_PREVIEW) +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) const char kErrorIncognito[] = "Cannot access in incognito mode"; #endif @@ -47,7 +48,7 @@ CloudPrintPrivateSetupConnectorFunction:: } bool CloudPrintPrivateSetupConnectorFunction::RunAsync() { -#if defined(ENABLE_PRINT_PREVIEW) +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) using api::cloud_print_private::SetupConnector::Params; std::unique_ptr params(Params::Create(*args_)); if (CloudPrintTestsDelegate::Get()) { @@ -101,7 +102,7 @@ void CloudPrintPrivateGetPrintersFunction::SendResults( } bool CloudPrintPrivateGetPrintersFunction::RunAsync() { -#if defined(ENABLE_PRINT_PREVIEW) +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) if (CloudPrintTestsDelegate::Get()) { SendResults(CloudPrintTestsDelegate::Get()->GetPrinters()); } else { diff --git a/chromium/chrome/browser/extensions/api/commands/command_service.cc b/chromium/chrome/browser/extensions/api/commands/command_service.cc index 960bf41cd64..1e1c25ad08e 100644 --- a/chromium/chrome/browser/extensions/api/commands/command_service.cc +++ b/chromium/chrome/browser/extensions/api/commands/command_service.cc @@ -294,11 +294,10 @@ bool CommandService::AddKeybindingPref( std::move(suggested_key_prefs)); // Fetch the newly-updated command, and notify the observers. - FOR_EACH_OBSERVER( - Observer, - observers_, - OnExtensionCommandAdded(extension_id, - FindCommandByName(extension_id, command_name))); + 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 details = @@ -849,10 +848,8 @@ void CommandService::RemoveKeybindingPrefs(const std::string& extension_id, } for (const Command& removed_command : removed_commands) { - FOR_EACH_OBSERVER( - Observer, - observers_, - OnExtensionCommandRemoved(extension_id, removed_command)); + for (auto& observer : observers_) + observer.OnExtensionCommandRemoved(extension_id, removed_command); } } 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 ec745236e3a..3df22217d4e 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 @@ -116,10 +116,9 @@ void ContentSettingsStore::SetExtensionContentSetting( } } - // Send notification that content settings changed. - // TODO(markusheintz): Notifications should only be sent if the set content - // setting is effective and not hidden by another setting of another - // extension installed more recently. + // Send notification that content settings changed. (Note: This is responsible + // for updating the pref store, so cannot be skipped even if the setting would + // be masked by another extension.) NotifyOfContentSettingChanged(ext_id, scope != kExtensionPrefsScopeRegular); } @@ -320,7 +319,18 @@ void ContentSettingsStore::SetExtensionContentSettingFromList( dict->GetString(keys::kContentSettingsTypeKey, &content_settings_type_str); ContentSettingsType content_settings_type = helpers::StringToContentSettingsType(content_settings_type_str); - DCHECK_NE(CONTENT_SETTINGS_TYPE_DEFAULT, content_settings_type); + if (content_settings_type == CONTENT_SETTINGS_TYPE_DEFAULT) { + // We'll end up with DEFAULT here if the type string isn't recognised. + // This could be if it's a string from an old settings type that has been + // deleted. DCHECK to make sure this is the case (not some random string). + DCHECK(content_settings_type_str == "fullscreen" || + content_settings_type_str == "mouselock"); + + // In this case, we just skip over that setting, effectively deleting it + // from the in-memory model. This will implicitly delete these old + // settings from the pref store when it is written back. + continue; + } std::string resource_identifier; dict->GetString(keys::kResourceIdentifierKey, &resource_identifier); @@ -355,10 +365,8 @@ void ContentSettingsStore::RemoveObserver(Observer* observer) { void ContentSettingsStore::NotifyOfContentSettingChanged( const std::string& extension_id, bool incognito) { - FOR_EACH_OBSERVER( - ContentSettingsStore::Observer, - observers_, - OnContentSettingChanged(extension_id, incognito)); + for (auto& observer : observers_) + observer.OnContentSettingChanged(extension_id, incognito); } bool ContentSettingsStore::OnCorrectThread() { diff --git a/chromium/chrome/browser/extensions/api/content_settings/content_settings_store_unittest.cc b/chromium/chrome/browser/extensions/api/content_settings/content_settings_store_unittest.cc index 9986d4e2436..02ab848ffdf 100644 --- a/chromium/chrome/browser/extensions/api/content_settings/content_settings_store_unittest.cc +++ b/chromium/chrome/browser/extensions/api/content_settings/content_settings_store_unittest.cc @@ -8,6 +8,10 @@ #include +#include "base/memory/ptr_util.h" +#include "base/values.h" +#include "chrome/browser/extensions/api/content_settings/content_settings_api_constants.h" +#include "components/content_settings/core/browser/content_settings_registry.h" #include "components/content_settings/core/browser/content_settings_rule.h" #include "components/content_settings/core/browser/content_settings_utils.h" #include "components/content_settings/core/test/content_settings_test_utils.h" @@ -19,6 +23,8 @@ using ::testing::Mock; namespace extensions { +namespace keys = content_settings_api_constants; + namespace { void CheckRule(const content_settings::Rule& rule, @@ -255,4 +261,74 @@ TEST_F(ContentSettingsStoreTest, GetAllSettings) { ASSERT_EQ(0u, rules.size()); } +TEST_F(ContentSettingsStoreTest, SetFromList) { + // Force creation of ContentSettingsRegistry, so that the string to content + // setting type lookup can succeed. + content_settings::ContentSettingsRegistry::GetInstance(); + + ::testing::StrictMock observer; + store()->AddObserver(&observer); + + GURL url("http://www.youtube.com"); + + EXPECT_EQ(CONTENT_SETTING_DEFAULT, + GetContentSettingFromStore(store(), + url, + url, + CONTENT_SETTINGS_TYPE_COOKIES, + std::string(), + false)); + + // Register first extension + std::string ext_id("my_extension"); + RegisterExtension(ext_id); + + // Set setting via a list + ContentSettingsPattern pattern = + ContentSettingsPattern::FromURL(GURL("http://www.youtube.com")); + EXPECT_CALL(observer, OnContentSettingChanged(ext_id, false)); + + // Build a preference list in JSON format. + base::ListValue pref_list; + // {"primaryPattern": pattern, "secondaryPattern": pattern, "type": "cookies", + // "setting": "allow"} + auto dict_value = base::MakeUnique(); + dict_value->SetString(keys::kPrimaryPatternKey, pattern.ToString()); + dict_value->SetString(keys::kSecondaryPatternKey, pattern.ToString()); + dict_value->SetString(keys::kContentSettingsTypeKey, "cookies"); + dict_value->SetString(keys::kContentSettingKey, "allow"); + pref_list.Append(std::move(dict_value)); + // Test content settings types that have been removed. Should be ignored. + // {"primaryPattern": pattern, "secondaryPattern": pattern, + // "type": "fullscreen", "setting": "allow"} + dict_value = base::MakeUnique(); + dict_value->SetString(keys::kPrimaryPatternKey, pattern.ToString()); + dict_value->SetString(keys::kSecondaryPatternKey, pattern.ToString()); + dict_value->SetString(keys::kContentSettingsTypeKey, "fullscreen"); + dict_value->SetString(keys::kContentSettingKey, "allow"); + pref_list.Append(std::move(dict_value)); + // {"primaryPattern": pattern, "secondaryPattern": pattern, + // "type": "mouselock", "setting": "allow"} + dict_value = base::MakeUnique(); + dict_value->SetString(keys::kPrimaryPatternKey, pattern.ToString()); + dict_value->SetString(keys::kSecondaryPatternKey, pattern.ToString()); + dict_value->SetString(keys::kContentSettingsTypeKey, "mouselock"); + dict_value->SetString(keys::kContentSettingKey, "allow"); + pref_list.Append(std::move(dict_value)); + + store()->SetExtensionContentSettingFromList(ext_id, &pref_list, + kExtensionPrefsScopeRegular); + Mock::VerifyAndClear(&observer); + + EXPECT_EQ(CONTENT_SETTING_ALLOW, + GetContentSettingFromStore(store(), + url, + url, + CONTENT_SETTINGS_TYPE_COOKIES, + std::string(), + false)); + + store()->RemoveObserver(&observer); +} + } // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/context_menus/context_menus_api_helpers.h b/chromium/chrome/browser/extensions/api/context_menus/context_menus_api_helpers.h index 4fc44ebaa25..19b793cd2d0 100644 --- a/chromium/chrome/browser/extensions/api/context_menus/context_menus_api_helpers.h +++ b/chromium/chrome/browser/extensions/api/context_menus/context_menus_api_helpers.h @@ -148,9 +148,9 @@ bool CreateMenuItem(const PropertyWithEnumT& create_properties, MenuItem* parent = GetParent(*parent_id, menu_manager, error); if (!parent) return false; - success = menu_manager->AddChildItem(parent->id(), item.release()); + success = menu_manager->AddChildItem(parent->id(), std::move(item)); } else { - success = menu_manager->AddContextItem(extension, item.release()); + success = menu_manager->AddContextItem(extension, std::move(item)); } if (!success) 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 cc2363c7173..d4934900be0 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 @@ -749,20 +749,12 @@ class ShowPageActionWithoutPageActionTest : public DeclarativeContentApiTest { private: void SetUpCommandLine(base::CommandLine* command_line) override { DeclarativeContentApiTest::SetUpCommandLine(command_line); - // If disabling the redesign, we need to disable Media Router since having - // Media Router enabled will result in auto-enabling the redesign and - // breaking the test. - if (!enable_redesign_) { - override_media_router_.reset(new FeatureSwitch::ScopedOverride( - FeatureSwitch::media_router(), false)); - } override_toolbar_redesign_.reset(new FeatureSwitch::ScopedOverride( FeatureSwitch::extension_action_redesign(), enable_redesign_)); } bool enable_redesign_; std::unique_ptr override_toolbar_redesign_; - std::unique_ptr override_media_router_; DISALLOW_COPY_AND_ASSIGN(ShowPageActionWithoutPageActionTest); }; diff --git a/chromium/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc b/chromium/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc index 5a799942067..348d2c8462d 100644 --- a/chromium/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc +++ b/chromium/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc @@ -150,7 +150,8 @@ bool WebRequestActionWithThreadsTest::ActionWorksOnRequest( std::list deltas; scoped_refptr headers( new net::HttpResponseHeaders("")); - WebRequestData request_data(regular_request.get(), stage, headers.get()); + WebRequestData request_data(regular_request.get(), stage, nullptr, + headers.get()); std::set ignored_tags; WebRequestAction::ApplyInfo apply_info = { extension_info_map_.get(), request_data, diff --git a/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_api.cc b/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_api.cc index 3326d47532a..a2f5a65bda7 100644 --- a/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_api.cc +++ b/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_api.cc @@ -88,7 +88,7 @@ bool DesktopCaptureChooseDesktopMediaFunction::RunAsync() { DCHECK(web_contents); } else { origin = extension()->url(); - target_name = base::UTF8ToUTF16(extension()->name()); + target_name = base::UTF8ToUTF16(GetExtensionTargetName()); web_contents = GetSenderWebContents(); DCHECK(web_contents); } @@ -96,6 +96,11 @@ bool DesktopCaptureChooseDesktopMediaFunction::RunAsync() { return Execute(params->sources, web_contents, origin, target_name); } +std::string DesktopCaptureChooseDesktopMediaFunction::GetExtensionTargetName() + const { + return GetCallerDisplayName(); +} + DesktopCaptureCancelChooseDesktopMediaFunction:: DesktopCaptureCancelChooseDesktopMediaFunction() {} diff --git a/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_api.h b/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_api.h index 4a507e44344..82cc4fc3c59 100644 --- a/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_api.h +++ b/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_api.h @@ -22,6 +22,10 @@ class DesktopCaptureChooseDesktopMediaFunction // ExtensionFunction overrides. bool RunAsync() override; + + // Returns the target name to show in the picker when capture is requested for + // an extension. Currently this is the same as the application name. + std::string GetExtensionTargetName() const; }; class DesktopCaptureCancelChooseDesktopMediaFunction diff --git a/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc b/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc index 049a56b160d..da43435a1b9 100644 --- a/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc +++ b/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc @@ -17,14 +17,17 @@ #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" #include "chrome/browser/media/webrtc/native_desktop_media_list.h" #include "chrome/browser/media/webrtc/tab_desktop_media_list.h" -#include "components/version_info/version_info.h" +#include "chrome/browser/ui/browser_finder.h" +#include "chrome/browser/ui/browser_window.h" +#include "chrome/grit/chromium_strings.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/web_contents.h" +#include "extensions/common/manifest.h" #include "extensions/common/switches.h" #include "third_party/webrtc/modules/desktop_capture/desktop_capture_options.h" -#include "third_party/webrtc/modules/desktop_capture/screen_capturer.h" -#include "third_party/webrtc/modules/desktop_capture/window_capturer.h" +#include "third_party/webrtc/modules/desktop_capture/desktop_capturer.h" +#include "ui/base/l10n/l10n_util.h" namespace extensions { @@ -116,8 +119,17 @@ bool DesktopCaptureChooseDesktopMediaFunctionBase::Execute( return false; } - const gfx::NativeWindow parent_window = - web_contents->GetTopLevelNativeWindow(); + gfx::NativeWindow parent_window = web_contents->GetTopLevelNativeWindow(); + // In case of coming from background extension page, |parent_window| will + // be null. We are going to make the picker modal to the current browser + // window. + if (!parent_window) { + Browser* target_browser = chrome::FindLastActiveWithProfile( + Profile::FromBrowserContext(web_contents->GetBrowserContext())); + + if (target_browser) + parent_window = target_browser->window()->GetNativeWindow(); + } std::unique_ptr screen_list; std::unique_ptr window_list; std::unique_ptr tab_list; @@ -140,8 +152,8 @@ bool DesktopCaptureChooseDesktopMediaFunctionBase::Execute( webrtc::DesktopCaptureOptions options = webrtc::DesktopCaptureOptions::CreateDefault(); options.set_disable_effects(false); - std::unique_ptr screen_capturer( - webrtc::ScreenCapturer::Create(options)); + std::unique_ptr screen_capturer( + webrtc::DesktopCapturer::CreateScreenCapturer(options)); screen_list = base::MakeUnique( std::move(screen_capturer), nullptr); @@ -158,8 +170,8 @@ bool DesktopCaptureChooseDesktopMediaFunctionBase::Execute( webrtc::DesktopCaptureOptions options = webrtc::DesktopCaptureOptions::CreateDefault(); options.set_disable_effects(false); - std::unique_ptr window_capturer( - webrtc::WindowCapturer::Create(options)); + std::unique_ptr window_capturer( + webrtc::DesktopCapturer::CreateWindowCapturer(options)); window_list = base::MakeUnique( nullptr, std::move(window_capturer)); @@ -186,13 +198,23 @@ bool DesktopCaptureChooseDesktopMediaFunctionBase::Execute( this); picker_->Show(web_contents, parent_window, parent_window, - base::UTF8ToUTF16(extension()->name()), target_name, + base::UTF8ToUTF16(GetCallerDisplayName()), target_name, std::move(screen_list), std::move(window_list), std::move(tab_list), request_audio, callback); origin_ = origin; return true; } +std::string DesktopCaptureChooseDesktopMediaFunctionBase::GetCallerDisplayName() + const { + if (extension()->location() == Manifest::COMPONENT || + extension()->location() == Manifest::EXTERNAL_COMPONENT) { + return l10n_util::GetStringUTF8(IDS_SHORT_PRODUCT_NAME); + } else { + return extension()->name(); + } +} + void DesktopCaptureChooseDesktopMediaFunctionBase::WebContentsDestroyed() { Cancel(); } diff --git a/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.h b/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.h index 38b803d2b15..f4f03f04fd4 100644 --- a/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.h +++ b/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.h @@ -7,6 +7,7 @@ #include #include +#include #include "base/macros.h" #include "base/memory/singleton.h" @@ -36,7 +37,11 @@ class DesktopCaptureChooseDesktopMediaFunctionBase virtual std::unique_ptr CreatePicker() = 0; protected: + PickerFactory() = default; virtual ~PickerFactory() {} + + private: + DISALLOW_COPY_AND_ASSIGN(PickerFactory); }; // Used to set PickerFactory used to create mock DesktopMediaPicker instances @@ -62,6 +67,9 @@ class DesktopCaptureChooseDesktopMediaFunctionBase const GURL& origin, const base::string16 target_name); + // Returns the calling application name to show in the picker. + std::string GetCallerDisplayName() const; + int request_id_; private: diff --git a/chromium/chrome/browser/extensions/api/device_permissions_manager_unittest.cc b/chromium/chrome/browser/extensions/api/device_permissions_manager_unittest.cc index eacf06e698a..6ff4e53cc25 100644 --- a/chromium/chrome/browser/extensions/api/device_permissions_manager_unittest.cc +++ b/chromium/chrome/browser/extensions/api/device_permissions_manager_unittest.cc @@ -10,7 +10,7 @@ #include "build/build_config.h" #include "chrome/browser/extensions/test_extension_environment.h" #include "chrome/test/base/testing_profile.h" -#include "device/core/mock_device_client.h" +#include "device/base/mock_device_client.h" #include "device/hid/hid_device_info.h" #include "device/hid/mock_hid_service.h" #include "device/usb/mock_usb_device.h" diff --git a/chromium/chrome/browser/extensions/api/dial/dial_service.cc b/chromium/chrome/browser/extensions/api/dial/dial_service.cc index 06c7398d3cd..1fe6dae2af0 100644 --- a/chromium/chrome/browser/extensions/api/dial/dial_service.cc +++ b/chromium/chrome/browser/extensions/api/dial/dial_service.cc @@ -562,7 +562,8 @@ void DialServiceImpl::NotifyOnDiscoveryRequest() { } VLOG(2) << "Notifying observers of discovery request"; - FOR_EACH_OBSERVER(Observer, observer_list_, OnDiscoveryRequest(this)); + for (auto& observer : observer_list_) + observer.OnDiscoveryRequest(this); // If we need to send additional requests, schedule a timer to do so. if (num_requests_sent_ < max_requests_ && num_requests_sent_ == 1) { VLOG(2) << "Scheduling timer to send additional requests"; @@ -582,18 +583,18 @@ void DialServiceImpl::NotifyOnDeviceDiscovered( VLOG(2) << "Got response after discovery finished. Ignoring."; return; } - FOR_EACH_OBSERVER(Observer, observer_list_, - OnDeviceDiscovered(this, device_data)); + for (auto& observer : observer_list_) + observer.OnDeviceDiscovered(this, device_data); } void DialServiceImpl::NotifyOnError() { DCHECK_CURRENTLY_ON(BrowserThread::IO); // TODO(imcheng): Modify upstream so that the device list is not cleared // when it could still potentially discover devices on other sockets. - FOR_EACH_OBSERVER(Observer, observer_list_, - OnError(this, - HasOpenSockets() ? DIAL_SERVICE_SOCKET_ERROR - : DIAL_SERVICE_NO_INTERFACES)); + for (auto& observer : observer_list_) { + observer.OnError(this, HasOpenSockets() ? DIAL_SERVICE_SOCKET_ERROR + : DIAL_SERVICE_NO_INTERFACES); + } } void DialServiceImpl::FinishDiscovery() { @@ -606,7 +607,8 @@ void DialServiceImpl::FinishDiscovery() { request_timer_.Stop(); discovery_active_ = false; num_requests_sent_ = 0; - FOR_EACH_OBSERVER(Observer, observer_list_, OnDiscoveryFinished(this)); + for (auto& observer : observer_list_) + observer.OnDiscoveryFinished(this); } bool DialServiceImpl::HasOpenSockets() { diff --git a/chromium/chrome/browser/extensions/api/dial/dial_service.h b/chromium/chrome/browser/extensions/api/dial/dial_service.h index fa9809e8f6e..bbf2fdec126 100644 --- a/chromium/chrome/browser/extensions/api/dial/dial_service.h +++ b/chromium/chrome/browser/extensions/api/dial/dial_service.h @@ -16,7 +16,7 @@ #include "base/timer/timer.h" #include "net/base/ip_address.h" #include "net/log/net_log_source.h" -#include "net/udp/udp_socket.h" +#include "net/socket/udp_socket.h" namespace net { class IOBuffer; 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 5d1cfcf59e6..a8a9eca778b 100644 --- a/chromium/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc +++ b/chromium/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc @@ -15,8 +15,8 @@ #include "base/guid.h" #include "base/json/json_reader.h" #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "base/synchronization/waitable_event.h" #include "build/build_config.h" @@ -95,10 +95,9 @@ class DownloadsEventsListener : public content::NotificationObserver { registrar_.Remove(this, extensions::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT, content::NotificationService::AllSources()); - base::STLDeleteElements(&events_); } - void ClearEvents() { base::STLDeleteElements(&events_); } + void ClearEvents() { events_.clear(); } class Event { public: @@ -186,7 +185,7 @@ class DownloadsEventsListener : public content::NotificationObserver { Event* new_event = new Event( dns->profile, dns->event_name, *content::Details(details).ptr(), base::Time::Now()); - events_.push_back(new_event); + events_.push_back(base::WrapUnique(new_event)); if (waiting_ && waiting_for_.get() && new_event->Satisfies(*waiting_for_)) { @@ -204,9 +203,8 @@ class DownloadsEventsListener : public content::NotificationObserver { const std::string& event_name, const std::string& json_args) { waiting_for_.reset(new Event(profile, event_name, json_args, base::Time())); - for (std::deque::const_iterator iter = events_.begin(); - iter != events_.end(); ++iter) { - if ((*iter)->Satisfies(*waiting_for_)) { + for (const auto& event : events_) { + if (event->Satisfies(*waiting_for_)) { return true; } } @@ -217,10 +215,9 @@ class DownloadsEventsListener : public content::NotificationObserver { // Print the events that were caught since the last WaitFor() call to help // find the erroneous event. // TODO(benjhayden) Fuzzy-match and highlight the erroneous event. - for (std::deque::const_iterator iter = events_.begin(); - iter != events_.end(); ++iter) { - if ((*iter)->caught() > last_wait_) { - LOG(INFO) << "Caught " << (*iter)->Debug(); + for (const auto& event : events_) { + if (event->caught() > last_wait_) { + LOG(INFO) << "Caught " << event->Debug(); } } if (waiting_for_.get()) { @@ -238,7 +235,7 @@ class DownloadsEventsListener : public content::NotificationObserver { base::Time last_wait_; std::unique_ptr waiting_for_; content::NotificationRegistrar registrar_; - std::deque events_; + std::deque> events_; DISALLOW_COPY_AND_ASSIGN(DownloadsEventsListener); }; diff --git a/chromium/chrome/browser/extensions/api/easy_unlock_private/easy_unlock_private_api_chromeos_unittest.cc b/chromium/chrome/browser/extensions/api/easy_unlock_private/easy_unlock_private_api_chromeos_unittest.cc index bf6a85b225a..bbf17ca5113 100644 --- a/chromium/chrome/browser/extensions/api/easy_unlock_private/easy_unlock_private_api_chromeos_unittest.cc +++ b/chromium/chrome/browser/extensions/api/easy_unlock_private/easy_unlock_private_api_chromeos_unittest.cc @@ -264,8 +264,7 @@ TEST_F(EasyUnlockPrivateApiTest, CreateSecureMessage) { std::unique_ptr args(new base::ListValue); args->Append(StringToBinaryValue("PAYLOAD")); args->Append(StringToBinaryValue("KEY")); - base::DictionaryValue* options = new base::DictionaryValue(); - args->Append(options); + auto options = base::MakeUnique(); options->Set("associatedData", StringToBinaryValue("ASSOCIATED_DATA")); options->Set("publicMetadata", StringToBinaryValue("PUBLIC_METADATA")); options->Set("verificationKeyId", @@ -278,6 +277,7 @@ TEST_F(EasyUnlockPrivateApiTest, CreateSecureMessage) { options->SetString( "signType", api::ToString(api::SIGNATURE_TYPE_HMAC_SHA256)); + args->Append(std::move(options)); ASSERT_TRUE(extension_function_test_utils::RunFunction( function.get(), std::move(args), browser(), @@ -338,8 +338,7 @@ TEST_F(EasyUnlockPrivateApiTest, CreateSecureMessage_AsymmetricSign) { std::unique_ptr args(new base::ListValue); args->Append(StringToBinaryValue("PAYLOAD")); args->Append(StringToBinaryValue("KEY")); - base::DictionaryValue* options = new base::DictionaryValue(); - args->Append(options); + auto options = base::MakeUnique(); options->Set("associatedData", StringToBinaryValue("ASSOCIATED_DATA")); options->Set("verificationKeyId", @@ -347,6 +346,7 @@ TEST_F(EasyUnlockPrivateApiTest, CreateSecureMessage_AsymmetricSign) { options->SetString( "signType", api::ToString(api::SIGNATURE_TYPE_ECDSA_P256_SHA256)); + args->Append(std::move(options)); ASSERT_TRUE(extension_function_test_utils::RunFunction( function.get(), std::move(args), browser(), @@ -376,8 +376,7 @@ TEST_F(EasyUnlockPrivateApiTest, UnwrapSecureMessage) { std::unique_ptr args(new base::ListValue); args->Append(StringToBinaryValue("MESSAGE")); args->Append(StringToBinaryValue("KEY")); - base::DictionaryValue* options = new base::DictionaryValue(); - args->Append(options); + auto options = base::MakeUnique(); options->Set("associatedData", StringToBinaryValue("ASSOCIATED_DATA")); options->SetString( "encryptType", @@ -385,6 +384,7 @@ TEST_F(EasyUnlockPrivateApiTest, UnwrapSecureMessage) { options->SetString( "signType", api::ToString(api::SIGNATURE_TYPE_HMAC_SHA256)); + args->Append(std::move(options)); ASSERT_TRUE(extension_function_test_utils::RunFunction( function.get(), std::move(args), browser(), @@ -444,13 +444,13 @@ TEST_F(EasyUnlockPrivateApiTest, UnwrapSecureMessage_AsymmetricSign) { std::unique_ptr args(new base::ListValue); args->Append(StringToBinaryValue("MESSAGE")); args->Append(StringToBinaryValue("KEY")); - base::DictionaryValue* options = new base::DictionaryValue(); - args->Append(options); + auto options = base::MakeUnique(); options->Set("associatedData", StringToBinaryValue("ASSOCIATED_DATA")); options->SetString( "signType", api::ToString(api::SIGNATURE_TYPE_ECDSA_P256_SHA256)); + args->Append(std::move(options)); ASSERT_TRUE(extension_function_test_utils::RunFunction( function.get(), std::move(args), browser(), 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 329d1cccfee..8a40a6bcab6 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 @@ -13,7 +13,6 @@ #include "chrome/browser/net/url_request_mock_util.h" #include "chrome/test/base/ui_test_utils.h" #include "chromeos/dbus/fake_session_manager_client.h" -#include "chromeos/login/user_names.h" #include "components/policy/core/common/cloud/device_management_service.h" #include "components/policy/core/common/mock_configuration_policy_provider.h" #include "components/policy/policy_constants.h" @@ -100,7 +99,7 @@ class EnterpriseDeviceAttributesTest : std::unique_ptr attributes = base::MakeUnique(); - attributes->SetRegistrationUser(affiliated_account_id_.GetUserEmail()); + attributes->SetEnterprise("fake-domain", "fake-id"); policy::BrowserPolicyConnectorChromeOS::SetInstallAttributesForTesting( attributes.release()); diff --git a/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_unittest.cc b/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_unittest.cc index 01e847957bb..4a71583f67a 100644 --- a/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_unittest.cc +++ b/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_unittest.cc @@ -161,11 +161,7 @@ class EPKChallengeKeyTestBase : public BrowserWithTestWindowTest { ON_CALL(mock_attestation_flow_, GetCertificate(_, _, _, _, _)) .WillByDefault(Invoke(GetCertificateCallbackTrue)); - // Set the Enterprise install attributes. - stub_install_attributes_.SetDomain("google.com"); - stub_install_attributes_.SetRegistrationUser(kUserEmail); - stub_install_attributes_.SetDeviceId("device_id"); - stub_install_attributes_.SetMode(policy::DEVICE_MODE_ENTERPRISE); + stub_install_attributes_.SetEnterprise("google.com", "device_id"); settings_helper_.ReplaceProvider(chromeos::kDeviceAttestationEnabled); settings_helper_.SetBoolean(chromeos::kDeviceAttestationEnabled, true); @@ -277,7 +273,7 @@ class EPKChallengeMachineKeyTest : public EPKChallengeKeyTestBase { }; TEST_F(EPKChallengeMachineKeyTest, NonEnterpriseDevice) { - stub_install_attributes_.SetRegistrationUser(""); + stub_install_attributes_.SetConsumer(); EXPECT_EQ(EPKPChallengeMachineKey::kNonEnterpriseDeviceError, RunFunctionAndReturnError(func_.get(), CreateArgs(), browser())); @@ -496,7 +492,7 @@ TEST_F(EPKChallengeUserKeyTest, KeyNotRegistered) { } TEST_F(EPKChallengeUserKeyTest, PersonalDevice) { - stub_install_attributes_.SetRegistrationUser(""); + stub_install_attributes_.SetConsumer(); // Currently personal devices are not supported. EXPECT_EQ(GetCertificateError(kUserRejected), 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 3adc4ec10df..436584a9f4e 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 @@ -25,7 +25,6 @@ #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/fake_session_manager_client.h" #include "chromeos/dbus/session_manager_client.h" -#include "chromeos/login/user_names.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/policy_map.h" diff --git a/chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api_unittest.cc b/chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api_unittest.cc index b3c78fbe3ca..6d9e2699010 100644 --- a/chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api_unittest.cc +++ b/chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api_unittest.cc @@ -170,11 +170,7 @@ class EPKPChallengeKeyTestBase : public BrowserWithTestWindowTest { ON_CALL(mock_attestation_flow_, GetCertificate(_, _, _, _, _)) .WillByDefault(Invoke(GetCertificateCallbackTrue)); - // Set the Enterprise install attributes. - stub_install_attributes_.SetDomain("google.com"); - stub_install_attributes_.SetRegistrationUser(kUserEmail); - stub_install_attributes_.SetDeviceId("device_id"); - stub_install_attributes_.SetMode(policy::DEVICE_MODE_ENTERPRISE); + stub_install_attributes_.SetEnterprise("google.com", "device_id"); settings_helper_.ReplaceProvider(chromeos::kDeviceAttestationEnabled); settings_helper_.SetBoolean(chromeos::kDeviceAttestationEnabled, true); @@ -262,7 +258,7 @@ TEST_F(EPKPChallengeMachineKeyTest, ChallengeBadBase64) { } TEST_F(EPKPChallengeMachineKeyTest, NonEnterpriseDevice) { - stub_install_attributes_.SetRegistrationUser(""); + stub_install_attributes_.SetConsumer(); EXPECT_EQ(EPKPChallengeMachineKey::kNonEnterpriseDeviceError, utils::RunFunctionAndReturnError(func_.get(), kArgs, browser())); @@ -477,7 +473,7 @@ TEST_F(EPKPChallengeUserKeyTest, KeyNotRegistered) { } TEST_F(EPKPChallengeUserKeyTest, PersonalDevice) { - stub_install_attributes_.SetRegistrationUser(""); + stub_install_attributes_.SetConsumer(); // Currently personal devices are not supported. EXPECT_EQ(GetCertificateError(kUserRejected), 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 7b2e7dd11dd..876abcc72a4 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 @@ -4,6 +4,9 @@ #include +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/files/scoped_temp_dir.h" #include "base/macros.h" #include "build/build_config.h" #include "chrome/browser/extensions/api/extension_action/extension_action_api.h" @@ -23,8 +26,10 @@ #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/common/extensions/extension_process_policy.h" +#include "chrome/common/pref_names.h" #include "chrome/common/url_constants.h" #include "chrome/test/base/ui_test_utils.h" +#include "components/prefs/pref_service.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/render_frame_host.h" @@ -64,6 +69,18 @@ void ExecuteExtensionAction(Browser* browser, const Extension* extension) { ->RunAction(extension, true); } +std::unique_ptr CreateAndSetDownloadsDirectory( + PrefService* pref_service) { + std::unique_ptr dir(new base::ScopedTempDir); + + if (!dir->CreateUniqueTempDir()) + return nullptr; + + pref_service->SetFilePath(prefs::kDownloadDefaultDirectory, dir->GetPath()); + pref_service->SetFilePath(prefs::kSaveFileDefaultDirectory, dir->GetPath()); + return dir; +} + // An ImageSkia source that will do nothing (i.e., have a blank skia). We need // this because we need a blank canvas at a certain size, and that can't be done // by just using a null ImageSkia. @@ -992,6 +1009,14 @@ IN_PROC_BROWSER_TEST_F(NavigatingExtensionPopupBrowserTest, // TODO(lukasza): https://crbug.com/650694: Add a "Get" flavour of the test once // the download works both for GET and POST requests. IN_PROC_BROWSER_TEST_F(NavigatingExtensionPopupBrowserTest, DownloadViaPost) { + // Override the default downloads directory, so that the test can cleanup + // after itself. This section is based on CreateAndSetDownloadsDirectory + // method defined in a few other source files with tests. + std::unique_ptr downloads_directory = + CreateAndSetDownloadsDirectory(browser()->profile()->GetPrefs()); + ASSERT_TRUE(downloads_directory); + + // Setup monitoring of the downloads. content::DownloadTestObserverTerminal downloads_observer( content::BrowserContext::GetDownloadManager(browser()->profile()), 1, // == wait_count (only waiting for "download-test3.gif"). @@ -1009,6 +1034,8 @@ IN_PROC_BROWSER_TEST_F(NavigatingExtensionPopupBrowserTest, DownloadViaPost) { EXPECT_EQ(0u, downloads_observer.NumDangerousDownloadsSeen()); EXPECT_EQ(1u, downloads_observer.NumDownloadsSeenInState( content::DownloadItem::COMPLETE)); + EXPECT_TRUE(base::PathExists(downloads_directory->GetPath().AppendASCII( + "download-test3-attachment.gif"))); // The test verification below is applicable only to scenarios where the // download shelf is supported - on ChromeOS, instead of the download shelf, 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 35b9de583a7..1c0ffcdd78f 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 @@ -19,8 +19,10 @@ #include "chrome/test/base/interactive_test_utils.h" #include "chrome/test/base/ui_test_utils.h" #include "content/public/browser/notification_service.h" +#include "content/public/browser/notification_types.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_system.h" +#include "extensions/browser/notification_types.h" #include "extensions/common/extension.h" #include "extensions/common/extension_set.h" #include "extensions/common/permissions/permissions_data.h" 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 754d1542518..91555cbfd61 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 @@ -167,8 +167,8 @@ void ExtensionActionAPI::SetBrowserActionVisibility( GetExtensionPrefs()->UpdateExtensionPref(extension_id, kBrowserActionVisible, new base::FundamentalValue(visible)); - FOR_EACH_OBSERVER(Observer, observers_, OnExtensionActionVisibilityChanged( - extension_id, visible)); + for (auto& observer : observers_) + observer.OnExtensionActionVisibilityChanged(extension_id, visible); } bool ExtensionActionAPI::ShowExtensionActionPopup( @@ -205,10 +205,8 @@ bool ExtensionActionAPI::ShowExtensionActionPopup( void ExtensionActionAPI::NotifyChange(ExtensionAction* extension_action, content::WebContents* web_contents, content::BrowserContext* context) { - FOR_EACH_OBSERVER( - Observer, - observers_, - OnExtensionActionUpdated(extension_action, web_contents, context)); + for (auto& observer : observers_) + observer.OnExtensionActionUpdated(extension_action, web_contents, context); if (extension_action->action_type() == ActionInfo::TYPE_PAGE) NotifyPageActionsChanged(web_contents); @@ -302,11 +300,13 @@ void ExtensionActionAPI::NotifyPageActionsChanged( return; location_bar->UpdatePageActions(); - FOR_EACH_OBSERVER(Observer, observers_, OnPageActionsUpdated(web_contents)); + for (auto& observer : observers_) + observer.OnPageActionsUpdated(web_contents); } void ExtensionActionAPI::Shutdown() { - FOR_EACH_OBSERVER(Observer, observers_, OnExtensionActionAPIShuttingDown()); + for (auto& observer : observers_) + observer.OnExtensionActionAPIShuttingDown(); } // @@ -323,8 +323,9 @@ ExtensionActionFunction::ExtensionActionFunction() ExtensionActionFunction::~ExtensionActionFunction() { } -bool ExtensionActionFunction::RunSync() { - ExtensionActionManager* manager = ExtensionActionManager::Get(GetProfile()); +ExtensionFunction::ResponseAction ExtensionActionFunction::Run() { + ExtensionActionManager* manager = + ExtensionActionManager::Get(browser_context()); if (base::StartsWith(name(), "systemIndicator.", base::CompareCase::INSENSITIVE_ASCII)) { extension_action_ = manager->GetSystemIndicator(*extension()); @@ -338,8 +339,7 @@ bool ExtensionActionFunction::RunSync() { // TODO(kalman): ideally the browserAction/pageAction APIs wouldn't event // exist for extensions that don't have one declared. This should come as // part of the Feature system. - error_ = kNoExtensionActionError; - return false; + return RespondNow(Error(kNoExtensionActionError)); } // Populates the tab_id_ and details_ members. @@ -347,18 +347,11 @@ bool ExtensionActionFunction::RunSync() { // Find the WebContents that contains this tab id if one is required. if (tab_id_ != ExtensionAction::kDefaultTabId) { - ExtensionTabUtil::GetTabById(tab_id_, - GetProfile(), - include_incognito(), - NULL, - NULL, - &contents_, - NULL); - if (!contents_) { - error_ = ErrorUtils::FormatErrorMessage( - kNoTabError, base::IntToString(tab_id_)); - return false; - } + ExtensionTabUtil::GetTabById(tab_id_, browser_context(), + include_incognito(), nullptr, nullptr, + &contents_, nullptr); + if (!contents_) + return RespondNow(Error(kNoTabError, base::IntToString(tab_id_))); } else { // Only browser actions and system indicators have a default tabId. ActionInfo::Type action_type = extension_action_->action_type(); @@ -417,27 +410,31 @@ bool ExtensionActionFunction::ExtractDataFromArguments() { } void ExtensionActionFunction::NotifyChange() { - ExtensionActionAPI::Get(GetProfile())->NotifyChange( - extension_action_, contents_, GetProfile()); + ExtensionActionAPI::Get(browser_context()) + ->NotifyChange(extension_action_, contents_, browser_context()); } -bool ExtensionActionFunction::SetVisible(bool visible) { +void ExtensionActionFunction::SetVisible(bool visible) { if (extension_action_->GetIsVisible(tab_id_) == visible) - return true; + return; extension_action_->SetIsVisible(tab_id_, visible); NotifyChange(); - return true; } -bool ExtensionActionShowFunction::RunExtensionAction() { - return SetVisible(true); +ExtensionFunction::ResponseAction +ExtensionActionShowFunction::RunExtensionAction() { + SetVisible(true); + return RespondNow(NoArguments()); } -bool ExtensionActionHideFunction::RunExtensionAction() { - return SetVisible(false); +ExtensionFunction::ResponseAction +ExtensionActionHideFunction::RunExtensionAction() { + SetVisible(false); + return RespondNow(NoArguments()); } -bool ExtensionActionSetIconFunction::RunExtensionAction() { +ExtensionFunction::ResponseAction +ExtensionActionSetIconFunction::RunExtensionAction() { EXTENSION_FUNCTION_VALIDATE(details_); // setIcon can take a variant argument: either a dictionary of canvas @@ -450,32 +447,32 @@ bool ExtensionActionSetIconFunction::RunExtensionAction() { EXTENSION_FUNCTION_VALIDATE( ExtensionAction::ParseIconFromCanvasDictionary(*canvas_set, &icon)); - if (icon.isNull()) { - error_ = "Icon invalid."; - return false; - } + if (icon.isNull()) + return RespondNow(Error("Icon invalid.")); extension_action_->SetIcon(tab_id_, gfx::Image(icon)); } else if (details_->GetInteger("iconIndex", &icon_index)) { // Obsolete argument: ignore it. - return true; + return RespondNow(NoArguments()); } else { EXTENSION_FUNCTION_VALIDATE(false); } NotifyChange(); - return true; + return RespondNow(NoArguments()); } -bool ExtensionActionSetTitleFunction::RunExtensionAction() { +ExtensionFunction::ResponseAction +ExtensionActionSetTitleFunction::RunExtensionAction() { EXTENSION_FUNCTION_VALIDATE(details_); std::string title; EXTENSION_FUNCTION_VALIDATE(details_->GetString("title", &title)); extension_action_->SetTitle(tab_id_, title); NotifyChange(); - return true; + return RespondNow(NoArguments()); } -bool ExtensionActionSetPopupFunction::RunExtensionAction() { +ExtensionFunction::ResponseAction +ExtensionActionSetPopupFunction::RunExtensionAction() { EXTENSION_FUNCTION_VALIDATE(details_); std::string popup_string; EXTENSION_FUNCTION_VALIDATE(details_->GetString("popup", &popup_string)); @@ -486,19 +483,21 @@ bool ExtensionActionSetPopupFunction::RunExtensionAction() { extension_action_->SetPopupUrl(tab_id_, popup_url); NotifyChange(); - return true; + return RespondNow(NoArguments()); } -bool ExtensionActionSetBadgeTextFunction::RunExtensionAction() { +ExtensionFunction::ResponseAction +ExtensionActionSetBadgeTextFunction::RunExtensionAction() { EXTENSION_FUNCTION_VALIDATE(details_); std::string badge_text; EXTENSION_FUNCTION_VALIDATE(details_->GetString("text", &badge_text)); extension_action_->SetBadgeText(tab_id_, badge_text); NotifyChange(); - return true; + return RespondNow(NoArguments()); } -bool ExtensionActionSetBadgeBackgroundColorFunction::RunExtensionAction() { +ExtensionFunction::ResponseAction +ExtensionActionSetBadgeBackgroundColorFunction::RunExtensionAction() { EXTENSION_FUNCTION_VALIDATE(details_); base::Value* color_value = NULL; EXTENSION_FUNCTION_VALIDATE(details_->Get("color", &color_value)); @@ -518,44 +517,42 @@ bool ExtensionActionSetBadgeBackgroundColorFunction::RunExtensionAction() { } else if (color_value->IsType(base::Value::TYPE_STRING)) { std::string color_string; EXTENSION_FUNCTION_VALIDATE(details_->GetString("color", &color_string)); - if (!image_util::ParseCssColorString(color_string, &color)) { - error_ = kInvalidColorError; - return false; - } + if (!image_util::ParseCssColorString(color_string, &color)) + return RespondNow(Error(kInvalidColorError)); } extension_action_->SetBadgeBackgroundColor(tab_id_, color); NotifyChange(); - return true; + return RespondNow(NoArguments()); } -bool ExtensionActionGetTitleFunction::RunExtensionAction() { - SetResult(base::MakeUnique( - extension_action_->GetTitle(tab_id_))); - return true; +ExtensionFunction::ResponseAction +ExtensionActionGetTitleFunction::RunExtensionAction() { + return RespondNow(OneArgument(base::MakeUnique( + extension_action_->GetTitle(tab_id_)))); } -bool ExtensionActionGetPopupFunction::RunExtensionAction() { - SetResult(base::MakeUnique( - extension_action_->GetPopupUrl(tab_id_).spec())); - return true; +ExtensionFunction::ResponseAction +ExtensionActionGetPopupFunction::RunExtensionAction() { + return RespondNow(OneArgument(base::MakeUnique( + extension_action_->GetPopupUrl(tab_id_).spec()))); } -bool ExtensionActionGetBadgeTextFunction::RunExtensionAction() { - SetResult(base::MakeUnique( - extension_action_->GetBadgeText(tab_id_))); - return true; +ExtensionFunction::ResponseAction +ExtensionActionGetBadgeTextFunction::RunExtensionAction() { + return RespondNow(OneArgument(base::MakeUnique( + extension_action_->GetBadgeText(tab_id_)))); } -bool ExtensionActionGetBadgeBackgroundColorFunction::RunExtensionAction() { +ExtensionFunction::ResponseAction +ExtensionActionGetBadgeBackgroundColorFunction::RunExtensionAction() { std::unique_ptr list(new base::ListValue()); SkColor color = extension_action_->GetBadgeBackgroundColor(tab_id_); list->AppendInteger(static_cast(SkColorGetR(color))); list->AppendInteger(static_cast(SkColorGetG(color))); list->AppendInteger(static_cast(SkColorGetB(color))); list->AppendInteger(static_cast(SkColorGetA(color))); - SetResult(std::move(list)); - return true; + return RespondNow(OneArgument(std::move(list))); } BrowserActionOpenPopupFunction::BrowserActionOpenPopupFunction() 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 070b6686b80..b1ad1fc0fc7 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 @@ -140,7 +140,7 @@ class ExtensionActionAPI : public BrowserContextKeyedAPI { // tabIds while browserAction's are optional, they have different internal // browser notification requirements, and not all functions are defined for all // APIs). -class ExtensionActionFunction : public ChromeSyncExtensionFunction { +class ExtensionActionFunction : public UIThreadExtensionFunction { public: static bool ParseCSSColorString(const std::string& color_string, SkColor* result); @@ -148,12 +148,13 @@ class ExtensionActionFunction : public ChromeSyncExtensionFunction { protected: ExtensionActionFunction(); ~ExtensionActionFunction() override; - bool RunSync() override; - virtual bool RunExtensionAction() = 0; + ResponseAction Run() override; + + virtual ResponseAction RunExtensionAction() = 0; bool ExtractDataFromArguments(); void NotifyChange(); - bool SetVisible(bool visible); + void SetVisible(bool visible); // All the extension action APIs take a single argument called details that // is a dictionary. @@ -181,42 +182,42 @@ class ExtensionActionFunction : public ChromeSyncExtensionFunction { class ExtensionActionShowFunction : public ExtensionActionFunction { protected: ~ExtensionActionShowFunction() override {} - bool RunExtensionAction() override; + ResponseAction RunExtensionAction() override; }; // hide class ExtensionActionHideFunction : public ExtensionActionFunction { protected: ~ExtensionActionHideFunction() override {} - bool RunExtensionAction() override; + ResponseAction RunExtensionAction() override; }; // setIcon class ExtensionActionSetIconFunction : public ExtensionActionFunction { protected: ~ExtensionActionSetIconFunction() override {} - bool RunExtensionAction() override; + ResponseAction RunExtensionAction() override; }; // setTitle class ExtensionActionSetTitleFunction : public ExtensionActionFunction { protected: ~ExtensionActionSetTitleFunction() override {} - bool RunExtensionAction() override; + ResponseAction RunExtensionAction() override; }; // setPopup class ExtensionActionSetPopupFunction : public ExtensionActionFunction { protected: ~ExtensionActionSetPopupFunction() override {} - bool RunExtensionAction() override; + ResponseAction RunExtensionAction() override; }; // setBadgeText class ExtensionActionSetBadgeTextFunction : public ExtensionActionFunction { protected: ~ExtensionActionSetBadgeTextFunction() override {} - bool RunExtensionAction() override; + ResponseAction RunExtensionAction() override; }; // setBadgeBackgroundColor @@ -224,28 +225,28 @@ class ExtensionActionSetBadgeBackgroundColorFunction : public ExtensionActionFunction { protected: ~ExtensionActionSetBadgeBackgroundColorFunction() override {} - bool RunExtensionAction() override; + ResponseAction RunExtensionAction() override; }; // getTitle class ExtensionActionGetTitleFunction : public ExtensionActionFunction { protected: ~ExtensionActionGetTitleFunction() override {} - bool RunExtensionAction() override; + ResponseAction RunExtensionAction() override; }; // getPopup class ExtensionActionGetPopupFunction : public ExtensionActionFunction { protected: ~ExtensionActionGetPopupFunction() override {} - bool RunExtensionAction() override; + ResponseAction RunExtensionAction() override; }; // getBadgeText class ExtensionActionGetBadgeTextFunction : public ExtensionActionFunction { protected: ~ExtensionActionGetBadgeTextFunction() override {} - bool RunExtensionAction() override; + ResponseAction RunExtensionAction() override; }; // getBadgeBackgroundColor @@ -253,7 +254,7 @@ class ExtensionActionGetBadgeBackgroundColorFunction : public ExtensionActionFunction { protected: ~ExtensionActionGetBadgeBackgroundColorFunction() override {} - bool RunExtensionAction() override; + ResponseAction RunExtensionAction() override; }; // diff --git a/chromium/chrome/browser/extensions/api/font_settings/font_settings_api.cc b/chromium/chrome/browser/extensions/api/font_settings/font_settings_api.cc index 9d60a6ce23c..1d3420a8276 100644 --- a/chromium/chrome/browser/extensions/api/font_settings/font_settings_api.cc +++ b/chromium/chrome/browser/extensions/api/font_settings/font_settings_api.cc @@ -26,6 +26,7 @@ #include "chrome/browser/extensions/api/preference/preference_helpers.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/webui/options/font_settings_utils.h" #include "chrome/common/extensions/api/font_settings.h" #include "chrome/common/pref_names.h" #include "chrome/common/pref_names_util.h" @@ -36,14 +37,10 @@ #include "extensions/browser/extension_system.h" #include "extensions/common/error_utils.h" -#if defined(OS_WIN) -#include "ui/gfx/font.h" -#include "ui/gfx/platform_font_win.h" -#endif - namespace extensions { namespace fonts = api::font_settings; +using options::FontSettingsUtilities; namespace { @@ -73,20 +70,6 @@ std::string GetFontNamePrefPath(fonts::GenericFamily generic_family_enum, script.c_str()); } -// Returns the localized name of a font so that it can be matched within the -// list of system fonts. On Windows, the list of system fonts has names only -// for the system locale, but the pref value may be in the English name. -std::string MaybeGetLocalizedFontName(const std::string& font_name) { -#if defined(OS_WIN) - if (!font_name.empty()) { - gfx::Font font(font_name, 12); // dummy font size - return static_cast(font.platform_font())-> - GetLocalizedFontName(); - } -#endif - return font_name; -} - // Registers |obs| to observe per-script font prefs under the path |map_name|. void RegisterFontFamilyMapObserver( PrefChangeRegistrar* registrar, @@ -177,7 +160,7 @@ void FontSettingsEventRouter::OnFontNamePrefChanged( NOTREACHED(); return; } - font_name = MaybeGetLocalizedFontName(font_name); + font_name = FontSettingsUtilities::MaybeGetLocalizedFontName(font_name); base::ListValue args; std::unique_ptr dict(new base::DictionaryValue()); @@ -263,7 +246,7 @@ ExtensionFunction::ResponseAction FontSettingsGetFontFunction::Run() { std::string font_name; EXTENSION_FUNCTION_VALIDATE( pref && pref->GetValue()->GetAsString(&font_name)); - font_name = MaybeGetLocalizedFontName(font_name); + font_name = FontSettingsUtilities::MaybeGetLocalizedFontName(font_name); // We don't support incognito-specific font prefs, so don't consider them when // getting level of control. diff --git a/chromium/chrome/browser/extensions/api/gcd_private/gcd_private_api.cc b/chromium/chrome/browser/extensions/api/gcd_private/gcd_private_api.cc index 9541d0efa5c..d21dc8f19f6 100644 --- a/chromium/chrome/browser/extensions/api/gcd_private/gcd_private_api.cc +++ b/chromium/chrome/browser/extensions/api/gcd_private/gcd_private_api.cc @@ -4,9 +4,10 @@ #include "chrome/browser/extensions/api/gcd_private/gcd_private_api.h" +#include + #include "base/lazy_instance.h" #include "base/macros.h" -#include "base/memory/linked_ptr.h" #include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/extensions/api/gcd_private/privet_v3_context_getter.h" #include "chrome/browser/extensions/api/gcd_private/privet_v3_session.h" @@ -93,8 +94,8 @@ class GcdPrivateAPIImpl { service_discovery_client_; struct SessionInfo { - linked_ptr session; - linked_ptr resolver; + std::unique_ptr session; + std::unique_ptr resolver; }; std::map sessions_; diff --git a/chromium/chrome/browser/extensions/api/hotword_private/hotword_private_apitest.cc b/chromium/chrome/browser/extensions/api/hotword_private/hotword_private_apitest.cc index 3c89ec4410a..fd8a8ae3281 100644 --- a/chromium/chrome/browser/extensions/api/hotword_private/hotword_private_apitest.cc +++ b/chromium/chrome/browser/extensions/api/hotword_private/hotword_private_apitest.cc @@ -379,7 +379,12 @@ IN_PROC_BROWSER_TEST_F(HotwordPrivateApiTest, OnHotwordTriggered) { EXPECT_TRUE(listenerNotification.WaitUntilSatisfied()); } -IN_PROC_BROWSER_TEST_F(HotwordPrivateApiTest, OnDeleteSpeakerModel) { +#if defined(OS_LINUX) +#define MAYBE_OnDeleteSpeakerModel DISABLED_OnDeleteSpeakerModel +#else +#define MAYBE_OnDeleteSpeakerModel OnDeleteSpeakerModel +#endif +IN_PROC_BROWSER_TEST_F(HotwordPrivateApiTest, MAYBE_OnDeleteSpeakerModel) { MockWebHistoryService* web_history = new MockWebHistoryService(profile()); MockAudioHistoryHandler* handler = new MockAudioHistoryHandler(profile(), web_history); diff --git a/chromium/chrome/browser/extensions/api/identity/identity_api.cc b/chromium/chrome/browser/extensions/api/identity/identity_api.cc index e4c15c1f896..f76f95d3f30 100644 --- a/chromium/chrome/browser/extensions/api/identity/identity_api.cc +++ b/chromium/chrome/browser/extensions/api/identity/identity_api.cc @@ -225,7 +225,8 @@ std::string IdentityAPI::FindAccountKeyByGaiaId(const std::string& gaia_id) { } void IdentityAPI::Shutdown() { - FOR_EACH_OBSERVER(ShutdownObserver, shutdown_observer_list_, OnShutdown()); + for (auto& observer : shutdown_observer_list_) + observer.OnShutdown(); account_tracker_.RemoveObserver(this); account_tracker_.Shutdown(); } diff --git a/chromium/chrome/browser/extensions/api/identity/identity_apitest.cc b/chromium/chrome/browser/extensions/api/identity/identity_apitest.cc index 06d8037fab1..22f056d2618 100644 --- a/chromium/chrome/browser/extensions/api/identity/identity_apitest.cc +++ b/chromium/chrome/browser/extensions/api/identity/identity_apitest.cc @@ -1597,8 +1597,7 @@ class GetAuthTokenFunctionPublicSessionTest : public GetAuthTokenFunctionTest { // enterprise-managed. std::unique_ptr attributes = base::MakeUnique(); - attributes->SetDomain("example.com"); - attributes->SetRegistrationUser("user@example.com"); + attributes->SetEnterprise("example.com", "fake-id"); policy::BrowserPolicyConnectorChromeOS::SetInstallAttributesForTesting( attributes.release()); } 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 0f61451cbc6..1264bdca993 100644 --- a/chromium/chrome/browser/extensions/api/identity/web_auth_flow.h +++ b/chromium/chrome/browser/extensions/api/identity/web_auth_flow.h @@ -21,8 +21,6 @@ class WebAuthFlowTest; namespace content { class NotificationDetails; class NotificationSource; -class RenderViewHost; -class WebContents; } namespace extensions { diff --git a/chromium/chrome/browser/extensions/api/image_writer_private/operation.h b/chromium/chrome/browser/extensions/api/image_writer_private/operation.h index 6710298ca94..98412b700a7 100644 --- a/chromium/chrome/browser/extensions/api/image_writer_private/operation.h +++ b/chromium/chrome/browser/extensions/api/image_writer_private/operation.h @@ -19,7 +19,7 @@ #include "build/build_config.h" #include "chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.h" #include "chrome/common/extensions/api/image_writer_private.h" - +#include "extensions/common/extension_id.h" namespace image_writer_api = extensions::api::image_writer_private; @@ -59,7 +59,6 @@ class Operation : public base::RefCountedThreadSafe { public: typedef base::Callback StartWriteCallback; typedef base::Callback CancelWriteCallback; - typedef std::string ExtensionId; Operation(base::WeakPtr manager, const ExtensionId& extension_id, diff --git a/chromium/chrome/browser/extensions/api/image_writer_private/operation_manager.h b/chromium/chrome/browser/extensions/api/image_writer_private/operation_manager.h index 60d25a6760f..993019bdc67 100644 --- a/chromium/chrome/browser/extensions/api/image_writer_private/operation_manager.h +++ b/chromium/chrome/browser/extensions/api/image_writer_private/operation_manager.h @@ -19,6 +19,7 @@ #include "content/public/browser/notification_registrar.h" #include "extensions/browser/browser_context_keyed_api_factory.h" #include "extensions/browser/extension_registry_observer.h" +#include "extensions/common/extension_id.h" #include "url/gurl.h" namespace image_writer_api = extensions::api::image_writer_private; @@ -43,8 +44,6 @@ class OperationManager : public BrowserContextKeyedAPI, public extensions::ExtensionRegistryObserver, public base::SupportsWeakPtr { public: - typedef std::string ExtensionId; - explicit OperationManager(content::BrowserContext* context); ~OperationManager() override; 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 6069e113960..4f1d60f8d60 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 @@ -180,7 +180,7 @@ class ImeObserverChromeOS : public ui::ImeObserver { // first composition character, so for backward compatibility, add it here. base::Value* first_value = NULL; if (bounds_list->Get(0, &first_value)) - args->Append(first_value->DeepCopy()); + args->Append(first_value->CreateDeepCopy()); args->Append(std::move(bounds_list)); DispatchEventToExtension( diff --git a/chromium/chrome/browser/extensions/api/log_private/log_private_api_chromeos.cc b/chromium/chrome/browser/extensions/api/log_private/log_private_api_chromeos.cc index 227a38e0db1..4d6598d9a6a 100644 --- a/chromium/chrome/browser/extensions/api/log_private/log_private_api_chromeos.cc +++ b/chromium/chrome/browser/extensions/api/log_private/log_private_api_chromeos.cc @@ -244,16 +244,15 @@ void LogPrivateAPI::PostPendingEntries() { void LogPrivateAPI::AddEntriesOnUI(std::unique_ptr value) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - for (std::set::iterator ix = net_internal_watches_.begin(); - ix != net_internal_watches_.end(); ++ix) { + for (const std::string& extension_id : net_internal_watches_) { // Create the event's arguments value. std::unique_ptr event_args(new base::ListValue()); - event_args->Append(value->DeepCopy()); + event_args->Append(value->CreateDeepCopy()); std::unique_ptr event( new Event(::extensions::events::LOG_PRIVATE_ON_CAPTURED_EVENTS, ::events::kOnCapturedEvents, std::move(event_args))); EventRouter::Get(browser_context_) - ->DispatchEventToExtension(*ix, std::move(event)); + ->DispatchEventToExtension(extension_id, std::move(event)); } } diff --git a/chromium/chrome/browser/extensions/api/mdns/dns_sd_registry.cc b/chromium/chrome/browser/extensions/api/mdns/dns_sd_registry.cc index 76496987eea..6664d2a026c 100644 --- a/chromium/chrome/browser/extensions/api/mdns/dns_sd_registry.cc +++ b/chromium/chrome/browser/extensions/api/mdns/dns_sd_registry.cc @@ -6,9 +6,11 @@ #include +#include "base/memory/ptr_util.h" #include "base/stl_util.h" #include "chrome/browser/extensions/api/mdns/dns_sd_device_lister.h" #include "chrome/browser/local_discovery/service_discovery_shared_client.h" +#include "chrome/common/features.h" using local_discovery::ServiceDiscoveryClient; using local_discovery::ServiceDiscoverySharedClient; @@ -107,7 +109,7 @@ DnsSdRegistry::ServiceTypeData::GetServiceList() { } DnsSdRegistry::DnsSdRegistry() { -#if defined(ENABLE_SERVICE_DISCOVERY) +#if BUILDFLAG(ENABLE_SERVICE_DISCOVERY) service_discovery_client_ = ServiceDiscoverySharedClient::GetInstance(); #endif } @@ -159,16 +161,14 @@ void DnsSdRegistry::RegisterDnsSdListener(const std::string& service_type) { CreateDnsSdDeviceLister(this, service_type, service_discovery_client_.get())); dns_sd_device_lister->Discover(false); - linked_ptr service_type_data( - new ServiceTypeData(std::move(dns_sd_device_lister))); - service_data_map_[service_type] = service_type_data; + service_data_map_[service_type] = + base::MakeUnique(std::move(dns_sd_device_lister)); DispatchApiEvent(service_type); } void DnsSdRegistry::UnregisterDnsSdListener(const std::string& service_type) { VLOG(1) << "UnregisterDnsSdListener: " << service_type; - DnsSdRegistry::DnsSdServiceTypeDataMap::iterator it = - service_data_map_.find(service_type); + auto it = service_data_map_.find(service_type); if (it == service_data_map_.end()) return; @@ -229,8 +229,10 @@ void DnsSdRegistry::ServicesFlushed(const std::string& service_type) { void DnsSdRegistry::DispatchApiEvent(const std::string& service_type) { VLOG(1) << "DispatchApiEvent: service_type: " << service_type; - FOR_EACH_OBSERVER(DnsSdObserver, observers_, OnDnsSdEvent( - service_type, service_data_map_[service_type]->GetServiceList())); + for (auto& observer : observers_) { + observer.OnDnsSdEvent(service_type, + service_data_map_[service_type]->GetServiceList()); + } } bool DnsSdRegistry::IsRegistered(const std::string& service_type) { diff --git a/chromium/chrome/browser/extensions/api/mdns/dns_sd_registry.h b/chromium/chrome/browser/extensions/api/mdns/dns_sd_registry.h index d85f297fdc5..4f342684288 100644 --- a/chromium/chrome/browser/extensions/api/mdns/dns_sd_registry.h +++ b/chromium/chrome/browser/extensions/api/mdns/dns_sd_registry.h @@ -12,7 +12,6 @@ #include #include "base/macros.h" -#include "base/memory/linked_ptr.h" #include "base/observer_list.h" #include "chrome/browser/extensions/api/mdns/dns_sd_delegate.h" @@ -94,10 +93,6 @@ class DnsSdRegistry : public DnsSdDelegate { DISALLOW_COPY_AND_ASSIGN(ServiceTypeData); }; - // Maps service types to associated data such as listers and service lists. - typedef std::map > - DnsSdServiceTypeDataMap; - virtual DnsSdDeviceLister* CreateDnsSdDeviceLister( DnsSdDelegate* delegate, const std::string& service_type, @@ -111,7 +106,7 @@ class DnsSdRegistry : public DnsSdDelegate { const std::string& service_name) override; void ServicesFlushed(const std::string& service_type) override; - DnsSdServiceTypeDataMap service_data_map_; + std::map> service_data_map_; private: void DispatchApiEvent(const std::string& service_type); diff --git a/chromium/chrome/browser/extensions/api/media_galleries/media_galleries_apitest.cc b/chromium/chrome/browser/extensions/api/media_galleries/media_galleries_apitest.cc index 8d52332152d..9a0409a0c76 100644 --- a/chromium/chrome/browser/extensions/api/media_galleries/media_galleries_apitest.cc +++ b/chromium/chrome/browser/extensions/api/media_galleries/media_galleries_apitest.cc @@ -13,6 +13,7 @@ #include "base/path_service.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" +#include "base/test/test_timeouts.h" #include "base/values.h" #include "build/build_config.h" #include "chrome/browser/apps/app_browsertest_util.h" @@ -29,6 +30,7 @@ #include "content/public/browser/web_contents.h" #include "content/public/test/test_utils.h" #include "extensions/browser/extension_system.h" +#include "extensions/browser/process_manager.h" #include "extensions/common/constants.h" #include "extensions/common/extension.h" #include "extensions/test/result_catcher.h" @@ -78,6 +80,11 @@ class MediaGalleriesPlatformAppBrowserTest : public PlatformAppBrowserTest { void SetUpOnMainThread() override { PlatformAppBrowserTest::SetUpOnMainThread(); ensure_media_directories_exists_.reset(new EnsureMediaDirectoriesExists); + // Prevent the ProcessManager from suspending the chrome-test app. Needed + // because the writer.onerror and writer.onwriteend events do not qualify as + // pending callbacks, so the app looks dormant. + extensions::ProcessManager::SetEventPageIdleTimeForTesting( + TestTimeouts::action_max_timeout().InMilliseconds()); int64_t file_size; ASSERT_TRUE(base::GetFileSize(GetCommonDataDir().AppendASCII("test.jpg"), diff --git a/chromium/chrome/browser/extensions/api/messaging/message_service.h b/chromium/chrome/browser/extensions/api/messaging/message_service.h index 2c6b52d0b24..667594eb6cf 100644 --- a/chromium/chrome/browser/extensions/api/messaging/message_service.h +++ b/chromium/chrome/browser/extensions/api/messaging/message_service.h @@ -19,6 +19,7 @@ #include "extensions/browser/api/messaging/native_message_host.h" #include "extensions/browser/browser_context_keyed_api_factory.h" #include "extensions/common/api/messaging/message.h" +#include "extensions/common/extension_id.h" class GURL; class Profile; @@ -195,9 +196,8 @@ class MessageService : public BrowserContextKeyedAPI { // A map of channel ID to information about the extension that is waiting // for that channel to open. Used for lazy background pages. - using ExtensionID = std::string; using PendingLazyBackgroundPageChannel = - std::pair; + std::pair; using PendingLazyBackgroundPageChannelMap = std::map; diff --git a/chromium/chrome/browser/extensions/api/messaging/native_message_host_chromeos.cc b/chromium/chrome/browser/extensions/api/messaging/native_message_host_chromeos.cc index 031aa73aec5..9d2da8fdc07 100644 --- a/chromium/chrome/browser/extensions/api/messaging/native_message_host_chromeos.cc +++ b/chromium/chrome/browser/extensions/api/messaging/native_message_host_chromeos.cc @@ -17,7 +17,7 @@ #include "base/threading/thread_task_runner_handle.h" #include "base/values.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/chromeos/arc/arc_support_host.h" +#include "chrome/browser/chromeos/arc/extensions/arc_support_message_host.h" #include "components/policy/core/common/policy_service.h" #include "content/public/browser/browser_thread.h" #include "extensions/common/constants.h" @@ -129,18 +129,13 @@ const char* const kRemotingIt2MeOrigins[] = { "chrome-extension://hpodccmdligbeohchckkeajbfohibipg/"}; static const BuiltInHost kBuiltInHost[] = { - {"com.google.chrome.test.echo", // ScopedTestNativeMessagingHost::kHostName - kEchoHostOrigins, - arraysize(kEchoHostOrigins), - &EchoHost::Create}, - {"com.google.chrome.remote_assistance", - kRemotingIt2MeOrigins, - arraysize(kRemotingIt2MeOrigins), - &CreateIt2MeHost}, - {ArcSupportHost::kHostName, - ArcSupportHost::kHostOrigin, - 1, - &ArcSupportHost::Create}, + {"com.google.chrome.test.echo", // ScopedTestNativeMessagingHost::kHostName + kEchoHostOrigins, arraysize(kEchoHostOrigins), &EchoHost::Create}, + {"com.google.chrome.remote_assistance", kRemotingIt2MeOrigins, + arraysize(kRemotingIt2MeOrigins), &CreateIt2MeHost}, + {arc::ArcSupportMessageHost::kHostName, + arc::ArcSupportMessageHost::kHostOrigin, 1, + &arc::ArcSupportMessageHost::Create}, }; bool MatchesSecurityOrigin(const BuiltInHost& host, diff --git a/chromium/chrome/browser/extensions/api/metrics_private/metrics_private_api.cc b/chromium/chrome/browser/extensions/api/metrics_private/metrics_private_api.cc deleted file mode 100644 index f761f5a9fc3..00000000000 --- a/chromium/chrome/browser/extensions/api/metrics_private/metrics_private_api.cc +++ /dev/null @@ -1,215 +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/extensions/api/metrics_private/metrics_private_api.h" - -#include - -#include - -#include "base/memory/ptr_util.h" -#include "base/metrics/field_trial.h" -#include "base/metrics/histogram_macros.h" -#include "base/metrics/sparse_histogram.h" -#include "chrome/common/extensions/api/metrics_private.h" -#include "components/variations/variations_associated_data.h" -#include "content/public/browser/user_metrics.h" -#include "extensions/browser/api/extensions_api_client.h" -#include "extensions/browser/api/metrics_private/metrics_private_delegate.h" -#include "extensions/common/extension.h" - -namespace extensions { - -namespace GetVariationParams = api::metrics_private::GetVariationParams; -namespace RecordUserAction = api::metrics_private::RecordUserAction; -namespace RecordValue = api::metrics_private::RecordValue; -namespace RecordSparseValue = api::metrics_private::RecordSparseValue; -namespace RecordPercentage = api::metrics_private::RecordPercentage; -namespace RecordCount = api::metrics_private::RecordCount; -namespace RecordSmallCount = api::metrics_private::RecordSmallCount; -namespace RecordMediumCount = api::metrics_private::RecordMediumCount; -namespace RecordTime = api::metrics_private::RecordTime; -namespace RecordMediumTime = api::metrics_private::RecordMediumTime; -namespace RecordLongTime = api::metrics_private::RecordLongTime; - -namespace { - -const size_t kMaxBuckets = 10000; // We don't ever want more than these many - // buckets; there is no real need for them - // and would cause crazy memory usage -} // namespace - -ExtensionFunction::ResponseAction -MetricsPrivateGetIsCrashReportingEnabledFunction::Run() { - MetricsPrivateDelegate* delegate = - ExtensionsAPIClient::Get()->GetMetricsPrivateDelegate(); - return RespondNow(OneArgument(base::MakeUnique( - delegate && delegate->IsCrashReportingEnabled()))); -} - -ExtensionFunction::ResponseAction MetricsPrivateGetFieldTrialFunction::Run() { - std::string name; - EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &name)); - - return RespondNow(OneArgument(base::MakeUnique( - base::FieldTrialList::FindFullName(name)))); -} - -ExtensionFunction::ResponseAction -MetricsPrivateGetVariationParamsFunction::Run() { - std::unique_ptr params( - GetVariationParams::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get()); - - GetVariationParams::Results::Params result; - std::unique_ptr dict; - if (variations::GetVariationParams(params->name, - &result.additional_properties)) { - dict = result.ToValue(); - } - return RespondNow(dict ? OneArgument(std::move(dict)) : NoArguments()); -} - -ExtensionFunction::ResponseAction -MetricsPrivateRecordUserActionFunction::Run() { - std::unique_ptr params( - RecordUserAction::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get()); - - content::RecordComputedAction(params->name); - return RespondNow(NoArguments()); -} - -void MetricsHistogramHelperFunction::RecordValue(const std::string& name, - base::HistogramType type, - int min, - int max, - size_t buckets, - int sample) { - // Make sure toxic values don't get to internal code. - // Fix for maximums - min = std::min(min, INT_MAX - 3); - max = std::min(max, INT_MAX - 3); - buckets = std::min(buckets, kMaxBuckets); - // Fix for minimums. - min = std::max(min, 1); - max = std::max(max, min + 1); - buckets = std::max(buckets, static_cast(3)); - // Trim buckets down to a maximum of the given range + over/underflow buckets - if (buckets > static_cast(max - min + 2)) - buckets = max - min + 2; - - base::HistogramBase* counter; - if (type == base::LINEAR_HISTOGRAM) { - counter = base::LinearHistogram::FactoryGet( - name, min, max, buckets, - base::HistogramBase::kUmaTargetedHistogramFlag); - } else { - counter = base::Histogram::FactoryGet( - name, min, max, buckets, - base::HistogramBase::kUmaTargetedHistogramFlag); - } - - // The histogram can be NULL if it is constructed with bad arguments. Ignore - // that data for this API. An error message will be logged. - if (counter) - counter->Add(sample); -} - -ExtensionFunction::ResponseAction MetricsPrivateRecordValueFunction::Run() { - std::unique_ptr params( - RecordValue::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get()); - - // Get the histogram parameters from the metric type object. - std::string type = api::metrics_private::ToString(params->metric.type); - - base::HistogramType histogram_type(type == "histogram-linear" ? - base::LINEAR_HISTOGRAM : base::HISTOGRAM); - RecordValue(params->metric.metric_name, histogram_type, params->metric.min, - params->metric.max, params->metric.buckets, params->value); - return RespondNow(NoArguments()); -} - -ExtensionFunction::ResponseAction -MetricsPrivateRecordSparseValueFunction::Run() { - std::unique_ptr params( - RecordSparseValue::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get()); - // This particular UMA_HISTOGRAM_ macro is okay for - // non-runtime-constant strings. - UMA_HISTOGRAM_SPARSE_SLOWLY(params->metric_name, params->value); - return RespondNow(NoArguments()); -} - -ExtensionFunction::ResponseAction -MetricsPrivateRecordPercentageFunction::Run() { - std::unique_ptr params( - RecordPercentage::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get()); - RecordValue(params->metric_name, base::LINEAR_HISTOGRAM, 1, 101, 102, - params->value); - return RespondNow(NoArguments()); -} - -ExtensionFunction::ResponseAction MetricsPrivateRecordCountFunction::Run() { - std::unique_ptr params( - RecordCount::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get()); - RecordValue(params->metric_name, base::HISTOGRAM, 1, 1000000, 50, - params->value); - return RespondNow(NoArguments()); -} - -ExtensionFunction::ResponseAction -MetricsPrivateRecordSmallCountFunction::Run() { - std::unique_ptr params( - RecordSmallCount::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get()); - RecordValue(params->metric_name, base::HISTOGRAM, 1, 100, 50, params->value); - return RespondNow(NoArguments()); -} - -ExtensionFunction::ResponseAction -MetricsPrivateRecordMediumCountFunction::Run() { - std::unique_ptr params( - RecordMediumCount::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get()); - RecordValue(params->metric_name, base::HISTOGRAM, 1, 10000, 50, - params->value); - return RespondNow(NoArguments()); -} - -ExtensionFunction::ResponseAction MetricsPrivateRecordTimeFunction::Run() { - std::unique_ptr params( - RecordTime::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get()); - static const int kTenSecMs = 10 * 1000; - RecordValue(params->metric_name, base::HISTOGRAM, 1, kTenSecMs, 50, - params->value); - return RespondNow(NoArguments()); -} - -ExtensionFunction::ResponseAction -MetricsPrivateRecordMediumTimeFunction::Run() { - std::unique_ptr params( - RecordMediumTime::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get()); - static const int kThreeMinMs = 3 * 60 * 1000; - RecordValue(params->metric_name, base::HISTOGRAM, 1, kThreeMinMs, 50, - params->value); - return RespondNow(NoArguments()); -} - -ExtensionFunction::ResponseAction MetricsPrivateRecordLongTimeFunction::Run() { - std::unique_ptr params( - RecordLongTime::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get()); - static const int kOneHourMs = 60 * 60 * 1000; - RecordValue(params->metric_name, base::HISTOGRAM, 1, kOneHourMs, 50, - params->value); - return RespondNow(NoArguments()); -} - -} // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/metrics_private/metrics_private_api.h b/chromium/chrome/browser/extensions/api/metrics_private/metrics_private_api.h deleted file mode 100644 index 21e1e7ba7fb..00000000000 --- a/chromium/chrome/browser/extensions/api/metrics_private/metrics_private_api.h +++ /dev/null @@ -1,197 +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_EXTENSIONS_API_METRICS_PRIVATE_METRICS_PRIVATE_API_H_ -#define CHROME_BROWSER_EXTENSIONS_API_METRICS_PRIVATE_METRICS_PRIVATE_API_H_ - -#include - -#include - -#include "base/metrics/histogram.h" -#include "extensions/browser/extension_function.h" - -namespace extensions { - -class MetricsPrivateGetIsCrashReportingEnabledFunction - : public UIThreadExtensionFunction { - public: - DECLARE_EXTENSION_FUNCTION("metricsPrivate.getIsCrashReportingEnabled", - METRICSPRIVATE_GETISCRASHRECORDINGENABLED) - - protected: - ~MetricsPrivateGetIsCrashReportingEnabledFunction() override {} - - // ExtensionFunction: - ResponseAction Run() override; -}; - -class MetricsPrivateGetFieldTrialFunction : public UIThreadExtensionFunction { - public: - DECLARE_EXTENSION_FUNCTION("metricsPrivate.getFieldTrial", - METRICSPRIVATE_GETFIELDTRIAL) - - protected: - ~MetricsPrivateGetFieldTrialFunction() override {} - - // ExtensionFunction: - ResponseAction Run() override; -}; - -class MetricsPrivateGetVariationParamsFunction - : public UIThreadExtensionFunction { - public: - DECLARE_EXTENSION_FUNCTION("metricsPrivate.getVariationParams", - METRICSPRIVATE_GETVARIATIONPARAMS) - - protected: - ~MetricsPrivateGetVariationParamsFunction() override {} - - // ExtensionFunction: - ResponseAction Run() override; -}; - -class MetricsPrivateRecordUserActionFunction - : public UIThreadExtensionFunction { - public: - DECLARE_EXTENSION_FUNCTION("metricsPrivate.recordUserAction", - METRICSPRIVATE_RECORDUSERACTION) - - protected: - ~MetricsPrivateRecordUserActionFunction() override {} - - // ExtensionFunction: - ResponseAction Run() override; -}; - -class MetricsHistogramHelperFunction : public UIThreadExtensionFunction { - protected: - ~MetricsHistogramHelperFunction() override {} - void RecordValue(const std::string& name, - base::HistogramType type, - int min, - int max, - size_t buckets, - int sample); -}; - -class MetricsPrivateRecordValueFunction - : public MetricsHistogramHelperFunction { - public: - DECLARE_EXTENSION_FUNCTION("metricsPrivate.recordValue", - METRICSPRIVATE_RECORDVALUE) - - protected: - ~MetricsPrivateRecordValueFunction() override {} - - // ExtensionFunction: - ResponseAction Run() override; -}; - -class MetricsPrivateRecordSparseValueFunction - : public MetricsHistogramHelperFunction { - public: - DECLARE_EXTENSION_FUNCTION("metricsPrivate.recordSparseValue", - METRICSPRIVATE_RECORDSPARSEVALUE) - - protected: - ~MetricsPrivateRecordSparseValueFunction() override {} - - // ExtensionFunction: - ResponseAction Run() override; -}; - -class MetricsPrivateRecordPercentageFunction - : public MetricsHistogramHelperFunction { - public: - DECLARE_EXTENSION_FUNCTION("metricsPrivate.recordPercentage", - METRICSPRIVATE_RECORDPERCENTAGE) - - protected: - ~MetricsPrivateRecordPercentageFunction() override {} - - // ExtensionFunction: - ResponseAction Run() override; -}; - -class MetricsPrivateRecordCountFunction - : public MetricsHistogramHelperFunction { - public: - DECLARE_EXTENSION_FUNCTION("metricsPrivate.recordCount", - METRICSPRIVATE_RECORDCOUNT) - - protected: - ~MetricsPrivateRecordCountFunction() override {} - - // ExtensionFunction: - ResponseAction Run() override; -}; - -class MetricsPrivateRecordSmallCountFunction - : public MetricsHistogramHelperFunction { - public: - DECLARE_EXTENSION_FUNCTION("metricsPrivate.recordSmallCount", - METRICSPRIVATE_RECORDSMALLCOUNT) - - protected: - ~MetricsPrivateRecordSmallCountFunction() override {} - - // ExtensionFunction: - ResponseAction Run() override; -}; - -class MetricsPrivateRecordMediumCountFunction - : public MetricsHistogramHelperFunction { - public: - DECLARE_EXTENSION_FUNCTION("metricsPrivate.recordMediumCount", - METRICSPRIVATE_RECORDMEDIUMCOUNT) - - protected: - ~MetricsPrivateRecordMediumCountFunction() override {} - - // ExtensionFunction: - ResponseAction Run() override; -}; - -class MetricsPrivateRecordTimeFunction : public MetricsHistogramHelperFunction { - public: - DECLARE_EXTENSION_FUNCTION("metricsPrivate.recordTime", - METRICSPRIVATE_RECORDTIME) - - protected: - ~MetricsPrivateRecordTimeFunction() override {} - - // ExtensionFunction: - ResponseAction Run() override; -}; - -class MetricsPrivateRecordMediumTimeFunction - : public MetricsHistogramHelperFunction { - public: - DECLARE_EXTENSION_FUNCTION("metricsPrivate.recordMediumTime", - METRICSPRIVATE_RECORDMEDIUMTIME) - - protected: - ~MetricsPrivateRecordMediumTimeFunction() override {} - - // ExtensionFunction: - ResponseAction Run() override; -}; - -class MetricsPrivateRecordLongTimeFunction - : public MetricsHistogramHelperFunction { - public: - DECLARE_EXTENSION_FUNCTION("metricsPrivate.recordLongTime", - METRICSPRIVATE_RECORDLONGTIME) - - protected: - ~MetricsPrivateRecordLongTimeFunction() override {} - - // ExtensionFunction: - ResponseAction Run() override; -}; - -} // namespace extensions - -#endif // CHROME_BROWSER_EXTENSIONS_API_METRICS_PRIVATE_METRICS_PRIVATE_API_H_ diff --git a/chromium/chrome/browser/extensions/api/networking_private/crypto_verify_impl.cc b/chromium/chrome/browser/extensions/api/networking_private/crypto_verify_impl.cc index c3654438472..1fc8b48d1b7 100644 --- a/chromium/chrome/browser/extensions/api/networking_private/crypto_verify_impl.cc +++ b/chromium/chrome/browser/extensions/api/networking_private/crypto_verify_impl.cc @@ -15,7 +15,7 @@ #include "base/threading/sequenced_worker_pool.h" #include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/extensions/api/networking_private/networking_private_credentials_getter.h" -#include "chrome/common/extensions/api/networking_private/networking_private_crypto.h" +#include "chrome/browser/extensions/api/networking_private/networking_private_crypto.h" #include "content/public/browser/browser_thread.h" #include "extensions/browser/api/networking_private/networking_private_api.h" #include "extensions/browser/api/networking_private/networking_private_service_client.h" 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 740406b8872..6d22232e525 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 @@ -24,7 +24,6 @@ #include "chromeos/dbus/shill_manager_client.h" #include "chromeos/dbus/shill_profile_client.h" #include "chromeos/dbus/shill_service_client.h" -#include "chromeos/login/user_names.h" #include "chromeos/network/network_handler.h" #include "chromeos/network/network_state_handler.h" #include "chromeos/network/onc/onc_utils.h" @@ -38,6 +37,7 @@ #include "components/policy/policy_constants.h" #include "components/user_manager/user.h" #include "components/user_manager/user_manager.h" +#include "components/user_manager/user_names.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" #include "content/public/browser/notification_service.h" @@ -199,9 +199,8 @@ class NetworkingPrivateChromeOSApiTest : public ExtensionApiTest { // uses the ProfileHelper to obtain the userhash crbug/238623. const cryptohome::Identification login_user = cryptohome::Identification::FromString( - chromeos::login::CanonicalizeUserID( - command_line->GetSwitchValueNative( - chromeos::switches::kLoginUser))); + user_manager::CanonicalizeUserID(command_line->GetSwitchValueNative( + chromeos::switches::kLoginUser))); const std::string sanitized_user = CryptohomeClient::GetStubSanitizedUsername(login_user); command_line->AppendSwitchASCII(chromeos::switches::kLoginProfile, diff --git a/chromium/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_mac.cc b/chromium/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_mac.cc index 15176cc7320..76629767a53 100644 --- a/chromium/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_mac.cc +++ b/chromium/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_mac.cc @@ -12,7 +12,7 @@ #include "base/base64.h" #include "base/bind.h" #include "base/macros.h" -#include "chrome/common/extensions/api/networking_private/networking_private_crypto.h" +#include "chrome/browser/extensions/api/networking_private/networking_private_crypto.h" #include "components/wifi/wifi_service.h" #include "content/public/browser/browser_thread.h" diff --git a/chromium/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_win.cc b/chromium/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_win.cc index 1157ba146e0..b5a047d769f 100644 --- a/chromium/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_win.cc +++ b/chromium/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_win.cc @@ -13,7 +13,7 @@ #include "base/strings/stringprintf.h" #include "base/threading/sequenced_worker_pool.h" #include "base/threading/thread_task_runner_handle.h" -#include "chrome/common/extensions/api/networking_private/networking_private_crypto.h" +#include "chrome/browser/extensions/api/networking_private/networking_private_crypto.h" #include "chrome/common/extensions/chrome_utility_extensions_messages.h" #include "chrome/grit/generated_resources.h" #include "content/public/browser/browser_thread.h" diff --git a/chromium/chrome/browser/extensions/api/networking_private/networking_private_crypto.cc b/chromium/chrome/browser/extensions/api/networking_private/networking_private_crypto.cc new file mode 100644 index 00000000000..bf05b1d6312 --- /dev/null +++ b/chromium/chrome/browser/extensions/api/networking_private/networking_private_crypto.cc @@ -0,0 +1,187 @@ +// 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. + +#include "chrome/browser/extensions/api/networking_private/networking_private_crypto.h" + +#include + +#include + +#include "base/logging.h" +#include "base/strings/string_util.h" +#include "components/cast_certificate/cast_cert_validator.h" +#include "crypto/openssl_util.h" +#include "crypto/rsa_private_key.h" +#include "net/cert/pem_tokenizer.h" +#include "third_party/boringssl/src/include/openssl/digest.h" +#include "third_party/boringssl/src/include/openssl/evp.h" +#include "third_party/boringssl/src/include/openssl/rsa.h" +#include "third_party/boringssl/src/include/openssl/x509.h" + +namespace { + +namespace cast_crypto = ::cast_certificate; + +// Parses |pem_data| for a PEM block of |pem_type|. +// Returns true if a |pem_type| block is found, storing the decoded result in +// |der_output|. +bool GetDERFromPEM(const std::string& pem_data, + const std::string& pem_type, + std::vector* der_output) { + std::vector headers; + headers.push_back(pem_type); + net::PEMTokenizer pem_tokenizer(pem_data, headers); + if (!pem_tokenizer.GetNext()) { + return false; + } + + der_output->assign(pem_tokenizer.data().begin(), pem_tokenizer.data().end()); + return true; +} + +} // namespace + +namespace networking_private_crypto { + +bool VerifyCredentials( + const std::string& certificate, + const std::vector& intermediate_certificates, + const std::string& signature, + const std::string& data, + const std::string& connected_mac) { + base::Time now = base::Time::Now(); + return VerifyCredentialsAtTime(certificate, intermediate_certificates, + signature, data, connected_mac, now); +} + +bool VerifyCredentialsAtTime( + const std::string& certificate, + const std::vector& intermediate_certificates, + const std::string& signature, + const std::string& data, + const std::string& connected_mac, + const base::Time& time) { + static const char kErrorPrefix[] = "Device verification failed. "; + + std::vector headers; + headers.push_back("CERTIFICATE"); + + // Convert certificate from PEM to raw DER + net::PEMTokenizer pem_tokenizer(certificate, headers); + if (!pem_tokenizer.GetNext()) { + LOG(ERROR) << kErrorPrefix << "Failed to parse device certificate."; + return false; + } + + // |certs| is a vector with the DER for all the certificates. + std::vector certs; + certs.push_back(pem_tokenizer.data()); + + // Convert intermediate certificates from PEM to raw DER + for (size_t idx = 0; idx < intermediate_certificates.size(); ++idx) { + net::PEMTokenizer ica_pem_tokenizer(intermediate_certificates[idx], + headers); + if (ica_pem_tokenizer.GetNext()) { + certs.push_back(ica_pem_tokenizer.data()); + } else { + LOG(WARNING) << "Failed to parse intermediate certificates."; + } + } + + // Note that the device certificate's policy is not enforced here. The goal + // is simply to verify that the device belongs to the Cast ecosystem. + cast_crypto::CastDeviceCertPolicy unused_policy; + + std::unique_ptr verification_context; + if (!cast_crypto::VerifyDeviceCert(certs, time, &verification_context, + &unused_policy, nullptr, + cast_crypto::CRLPolicy::CRL_OPTIONAL)) { + LOG(ERROR) << kErrorPrefix << "Failed verifying cast device cert"; + return false; + } + + // Check that the device listed in the certificate is correct. + // Something like evt_e161 001a11ffacdf + std::string common_name = verification_context->GetCommonName(); + std::string translated_mac; + base::RemoveChars(connected_mac, ":", &translated_mac); + if (!base::EndsWith(common_name, translated_mac, + base::CompareCase::INSENSITIVE_ASCII)) { + LOG(ERROR) << kErrorPrefix << "MAC addresses don't match."; + return false; + } + + // Use the public key from verified certificate to verify |signature| over + // |data|. + if (!verification_context->VerifySignatureOverData(signature, data)) { + LOG(ERROR) << kErrorPrefix + << "Failed verifying signature using cast device cert"; + return false; + } + return true; +} + +bool EncryptByteString(const std::vector& pub_key_der, + const std::string& data, + std::vector* encrypted_output) { + crypto::EnsureOpenSSLInit(); + crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); + + bssl::UniquePtr rsa( + RSA_public_key_from_bytes(pub_key_der.data(), pub_key_der.size())); + if (!rsa || RSA_size(rsa.get()) == 0) { + LOG(ERROR) << "Failed to parse public key"; + return false; + } + + encrypted_output->resize(RSA_size(rsa.get())); + int encrypted_length = RSA_public_encrypt( + data.size(), reinterpret_cast(data.data()), + encrypted_output->data(), rsa.get(), RSA_PKCS1_PADDING); + if (encrypted_length < 0) { + LOG(ERROR) << "Error during decryption"; + return false; + } + encrypted_output->resize(encrypted_length); + return true; +} + +bool DecryptByteString(const std::string& private_key_pem, + const std::vector& encrypted_data, + std::string* decrypted_output) { + crypto::EnsureOpenSSLInit(); + crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); + + std::vector private_key_data; + if (!GetDERFromPEM(private_key_pem, "PRIVATE KEY", &private_key_data)) { + LOG(ERROR) << "Failed to parse private key PEM."; + return false; + } + std::unique_ptr private_key( + crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(private_key_data)); + if (!private_key || !private_key->key()) { + LOG(ERROR) << "Failed to parse private key DER."; + return false; + } + + RSA* rsa = EVP_PKEY_get0_RSA(private_key->key()); + if (!rsa || RSA_size(rsa) == 0) { + LOG(ERROR) << "Failed to get RSA key."; + return false; + } + + uint8_t* output = reinterpret_cast( + base::WriteInto(decrypted_output, RSA_size(rsa) + 1)); + int output_length = + RSA_private_decrypt(encrypted_data.size(), &encrypted_data[0], output, + rsa, RSA_PKCS1_PADDING); + if (output_length < 0) { + LOG(ERROR) << "Error during decryption."; + return false; + } + decrypted_output->resize(output_length); + return true; +} + +} // namespace networking_private_crypto diff --git a/chromium/chrome/browser/extensions/api/networking_private/networking_private_crypto.h b/chromium/chrome/browser/extensions/api/networking_private/networking_private_crypto.h new file mode 100644 index 00000000000..ede765a7d87 --- /dev/null +++ b/chromium/chrome/browser/extensions/api/networking_private/networking_private_crypto.h @@ -0,0 +1,61 @@ +// 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. + +#ifndef CHROME_BROWSER_EXTENSIONS_API_NETWORKING_PRIVATE_NETWORKING_PRIVATE_CRYPTO_H_ +#define CHROME_BROWSER_EXTENSIONS_API_NETWORKING_PRIVATE_NETWORKING_PRIVATE_CRYPTO_H_ + +#include + +#include +#include + +#include "base/time/time.h" + +namespace networking_private_crypto { + +// Verify that the credentials described by |certificate| and |signed_data| +// are valid as follows: +// 1) The MAC address listed in the certificate matches |connected_mac|. +// 2) The certificate is a valid PEM encoded certificate signed by trusted CA. +// 3) |signature| is a valid signature for |data|, using the public key in +// |certificate| +bool VerifyCredentials( + const std::string& certificate, + const std::vector& intermediate_certificates, + const std::string& signature, + const std::string& data, + const std::string& connected_mac); + +// The same as VerifyCredentials() above, but uses time |time| rather than the +// current time for checking validity. +bool VerifyCredentialsAtTime( + const std::string& certificate, + const std::vector& intermediate_certificates, + const std::string& signature, + const std::string& data, + const std::string& connected_mac, + const base::Time& time); + +// Encrypt |data| with |public_key|. |public_key| is a DER-encoded +// RSAPublicKey. |data| is some string of bytes that is smaller than the +// maximum length permissible for PKCS#1 v1.5 with a key of |public_key| size. +// +// Returns true on success, storing the encrypted result in +// |encrypted_output|. +bool EncryptByteString(const std::vector& public_key, + const std::string& data, + std::vector* encrypted_output); + +// Decrypt |encrypted_data| with |private_key_pem|. |private_key_pem| is the +// PKCS8 PEM-encoded private key. |encrypted_data| is data encrypted with +// EncryptByteString. Used in NetworkingPrivateCryptoTest::EncryptString test. +// Returns true on success, storing the decrypted result in +// |decrypted_output|. +bool DecryptByteString(const std::string& private_key_pem, + const std::vector& encrypted_data, + std::string* decrypted_output); + +} // namespace networking_private_crypto + +#endif // CHROME_BROWSER_EXTENSIONS_API_NETWORKING_PRIVATE_NETWORKING_PRIVATE_CRYPTO_H_ 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 new file mode 100644 index 00000000000..79c790efdde --- /dev/null +++ b/chromium/chrome/browser/extensions/api/networking_private/networking_private_crypto_unittest.cc @@ -0,0 +1,231 @@ +// 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. +#include "chrome/browser/extensions/api/networking_private/networking_private_crypto.h" + +#include + +#include "base/base64.h" +#include "base/logging.h" +#include "base/strings/stringprintf.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +} // namespace + +// Tests of networking_private_crypto support for Networking Private API. +class NetworkingPrivateCryptoTest : public testing::Test { + protected: + // Verify that decryption of |encrypted| data using |private_key_pem| matches + // |plain| data. + bool VerifyByteString(const std::string& private_key_pem, + const std::string& plain, + const std::vector& encrypted) { + std::string decrypted; + if (networking_private_crypto::DecryptByteString( + private_key_pem, encrypted, &decrypted)) + return decrypted == plain; + return false; + } +}; + +// Test that networking_private_crypto::VerifyCredentials behaves as expected. +TEST_F(NetworkingPrivateCryptoTest, VerifyCredentials) { + // This certificate chain and signature are duplicated from: + // + // components/test/data/cast_certificate/certificates/chromecast_gen1.pem + // components/test/data/cast_certificate/signeddata/2ZZBG9_FA8FCA3EF91A.pem + // + // TODO(eroman): Avoid duplicating the data. + static const char kCertData[] = + "-----BEGIN CERTIFICATE-----" + "MIIDrDCCApSgAwIBAgIEU8xPLDANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJV" + "UzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzET" + "MBEGA1UECgwKR29vZ2xlIEluYzESMBAGA1UECwwJR29vZ2xlIFRWMRgwFgYDVQQD" + "DA9FdXJla2EgR2VuMSBJQ0EwHhcNMTQwNzIwMjMyMjIwWhcNMzQwNzE1MjMyMjIw" + "WjCBgTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEzARBgNVBAoT" + "Ckdvb2dsZSBJbmMxFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxEjAQBgNVBAsTCUdv" + "b2dsZSBUVjEcMBoGA1UEAxMTMlpaQkc5IEZBOEZDQTNFRjkxQTCCASIwDQYJKoZI" + "hvcNAQEBBQADggEPADCCAQoCggEBAKV56Srec2ePlqDP6cqFPuwU4MOs7MOcGDrv" + "da6qy6tWC7BmsqipMA/hn77iUiBZsw3TbUQnVfmM4ZQ2RENzcrAJ68cmc+lPxmRr" + "8x1Xu5FzZ+kcyU8glLLqdiXYEKRboFhC7BM05O1XOLvzCls4zuZuMrGNFBW+YoBm" + "FiXFYWBhapZC3RhhlSEZFuQWbb/MUSDzwr/CRbn4tKHMv4Fkw5HAnhLa+yXfgCGw" + "qOd9GejqUKsO/aajAHkM7lIHmvkthI4MVk0Koc+Ih487pgsOt18LqubZVEkbjCqp" + "Rpx1CGbErWnw2ptPvMCEC6e7mrYHcYgmuzQ7m+eUlhthEUiTYC0CAwEAAaMvMC0w" + "CQYDVR0TBAIwADALBgNVHQ8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwIwDQYJ" + "KoZIhvcNAQEFBQADggEBAGuKgGXHJXQ1M7P4uXB8wPPuT2h6g29YJ62rUvZ7BrlW" + "TknJT0Owaw68zepLhFQ4ydIzbVV3hA2InCmP3U24ZMxMJcA/9qNPAqPrtE1ZIQNI" + "Qh6slAdZa0qM6Us30/5fpUL6lgAfD1RIJxA4RWYZKP78SjJz1Lybx3Zbt0Jist9G" + "tvaJGZjZrdPncnJKayGaIln8gzHd6MVEGZp7aIQZ2h4NDlnrwyhMFTjg1WvnmQJ6" + "3bEvjSyjMGhY0JOUaDp/UMxnExn+1+cYAW9LrosZXtRDNJTl1zX4auAnNMHkt8uC" + "F8Jhy80X2wU0fj85oYbRsm+jBMtRayznY1TR0WoPBAo=" + "-----END CERTIFICATE-----"; + + static const char kICAData[] = + "-----BEGIN CERTIFICATE-----" + "MIIDhzCCAm+gAwIBAgIBATANBgkqhkiG9w0BAQUFADB8MQswCQYDVQQGEwJVUzET" + "MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzETMBEG" + "A1UECgwKR29vZ2xlIEluYzESMBAGA1UECwwJR29vZ2xlIFRWMRcwFQYDVQQDDA5F" + "dXJla2EgUm9vdCBDQTAeFw0xMjEyMTkwMDQ3MTJaFw0zMjEyMTQwMDQ3MTJaMH0x" + "CzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1Nb3Vu" + "dGFpbiBWaWV3MRMwEQYDVQQKDApHb29nbGUgSW5jMRIwEAYDVQQLDAlHb29nbGUg" + "VFYxGDAWBgNVBAMMD0V1cmVrYSBHZW4xIElDQTCCASIwDQYJKoZIhvcNAQEBBQAD" + "ggEPADCCAQoCggEBALwigL2A9johADuudl41fz3DZFxVlIY0LwWHKM33aYwXs1Cn" + "uIL638dDLdZ+q6BvtxNygKRHFcEgmVDN7BRiCVukmM3SQbY2Tv/oLjIwSoGoQqNs" + "mzNuyrL1U2bgJ1OGGoUepzk/SneO+1RmZvtYVMBeOcf1UAYL4IrUzuFqVR+LFwDm" + "aaMn5gglaTwSnY0FLNYuojHetFJQ1iBJ3nGg+a0gQBLx3SXr1ea4NvTWj3/KQ9zX" + "EFvmP1GKhbPz//YDLcsjT5ytGOeTBYysUpr3TOmZer5ufk0K48YcqZP6OqWRXRy9" + "ZuvMYNyGdMrP+JIcmH1X+mFHnquAt+RIgCqSxRsCAwEAAaMTMBEwDwYDVR0TBAgw" + "BgEB/wIBATANBgkqhkiG9w0BAQUFAAOCAQEAi9Shsc9dzXtsSEpBH1MvGC0yRf+e" + "q9NzPh8i1+r6AeZzAw8rxiW7pe7F9UXLJBIqrcJdBfR69cKbEBZa0QpzxRY5oBDK" + "0WiFnvueJoOOWPN3oE7l25e+LQBf9ZTbsZ1la/3w0QRR38ySppktcfVN1SP+Mxyp" + "tKvFvxq40YDvicniH5xMSDui+gIK3IQBiocC+1nup0wEfXSZh2olRK0WquxONRt8" + "e4TJsT/hgnDlDefZbfqVtsXkHugRm9iy86T9E/ODT/cHFCC7IqWmj9a126l0eOKT" + "DeUjLwUX4LKXZzRND5x2Q3umIUpWBfYqfPJ/EpSCJikH8AtsbHkUsHTVbA==" + "-----END CERTIFICATE-----"; + + unsigned char kData[] = {0x53, 0x54, 0x52, 0x49, 0x4e, 0x47}; + + unsigned char kSignature[] = { + 0x0a, 0xda, 0xb5, 0x40, 0x5c, 0x8e, 0x53, 0x89, 0xda, 0x67, 0x47, 0x28, + 0xab, 0x64, 0x0d, 0xec, 0xb8, 0x1f, 0xd6, 0x75, 0x28, 0x97, 0x5f, 0xe0, + 0x11, 0x51, 0x35, 0x2a, 0x70, 0xd8, 0xf6, 0x4d, 0xe8, 0xd0, 0x2e, 0xe0, + 0x79, 0x75, 0x3a, 0x25, 0xbf, 0x40, 0x0f, 0x6d, 0xd1, 0x20, 0xe3, 0x82, + 0xbd, 0x05, 0x87, 0x57, 0x01, 0x1e, 0x76, 0xb7, 0xf4, 0xd7, 0xb3, 0x10, + 0x4a, 0x6c, 0x8a, 0xf9, 0x3d, 0xe7, 0xeb, 0x62, 0xe9, 0x5f, 0x73, 0xab, + 0x6e, 0x22, 0xf5, 0x59, 0x4d, 0xc4, 0xa3, 0x95, 0xc3, 0xbe, 0x7b, 0x04, + 0x5a, 0x36, 0x67, 0xee, 0x71, 0xb2, 0xe8, 0x60, 0xbe, 0xaa, 0x2c, 0x90, + 0x36, 0xd7, 0xf0, 0x42, 0x28, 0xd4, 0x29, 0x9f, 0x30, 0xaa, 0x10, 0x4f, + 0x2a, 0xe1, 0x72, 0x67, 0xcc, 0xb5, 0x44, 0x7b, 0x7f, 0x89, 0x45, 0x9f, + 0xc3, 0x9d, 0x6a, 0xf0, 0x78, 0x77, 0x6d, 0x9f, 0x13, 0x58, 0x35, 0x09, + 0x8c, 0x71, 0xaf, 0x34, 0x4b, 0x18, 0xc7, 0x07, 0xd2, 0xf2, 0x03, 0x48, + 0xe2, 0x40, 0x75, 0x3b, 0xeb, 0x33, 0x74, 0x8d, 0x33, 0xb4, 0x45, 0xe2, + 0x59, 0x56, 0x8b, 0xc7, 0x4e, 0x60, 0xc7, 0xec, 0xc8, 0xd3, 0x32, 0x16, + 0x20, 0xb0, 0xc7, 0x0d, 0x14, 0x4b, 0x68, 0xbf, 0x79, 0xad, 0x7e, 0x47, + 0x5d, 0x5d, 0xb5, 0x8c, 0xb6, 0xc3, 0x27, 0xb9, 0xd8, 0x25, 0x70, 0xc0, + 0x8d, 0x12, 0x26, 0x51, 0xe8, 0xad, 0xde, 0xf8, 0xe8, 0x3e, 0x47, 0xd0, + 0xdf, 0x11, 0x7d, 0x34, 0x50, 0xa8, 0x89, 0x89, 0x59, 0x93, 0x8a, 0x3d, + 0x88, 0xaf, 0xd5, 0x1e, 0xe8, 0x34, 0x2e, 0x98, 0x62, 0x39, 0xc1, 0x22, + 0x06, 0xf7, 0x3e, 0x98, 0xfd, 0x6f, 0x3a, 0x45, 0xd0, 0xb7, 0x3a, 0xe5, + 0xaa, 0x38, 0x35, 0x2c, 0xe9, 0x78, 0x71, 0xe2, 0xf0, 0x6f, 0x60, 0x95, + 0xc0, 0x60, 0x5f, 0xc3, + }; + + static const char kHotspotBssid[] = "FA:8F:CA:3E:F9:1A"; + + static const char kBadCertData[] = "not a certificate"; + static const char kBadHotspotBssid[] = "bad bssid"; + + // April 1, 2016 + base::Time::Exploded time_exploded = {0}; + time_exploded.year = 2016; + time_exploded.month = 4; + time_exploded.day_of_month = 1; + base::Time time; + ASSERT_TRUE(base::Time::FromUTCExploded(time_exploded, &time)); + + // September 1, 2035 + base::Time::Exploded expired_time_exploded = {0}; + expired_time_exploded.year = 2035; + expired_time_exploded.month = 9; + expired_time_exploded.day_of_month = 1; + base::Time expired_time; + ASSERT_TRUE( + base::Time::FromUTCExploded(expired_time_exploded, &expired_time)); + + std::string unsigned_data = std::string(std::begin(kData), std::end(kData)); + std::string signed_data = + std::string(std::begin(kSignature), std::end(kSignature)); + + // Check that verification fails when the intermediaries are not provided. + EXPECT_FALSE(networking_private_crypto::VerifyCredentialsAtTime( + kCertData, std::vector(), signed_data, unsigned_data, + kHotspotBssid, time)); + + // Checking basic verification operation. + std::vector icas; + icas.push_back(kICAData); + + EXPECT_TRUE(networking_private_crypto::VerifyCredentialsAtTime( + kCertData, icas, signed_data, unsigned_data, kHotspotBssid, time)); + + // Checking that verification fails when the certificate is expired. + EXPECT_FALSE(networking_private_crypto::VerifyCredentialsAtTime( + kCertData, icas, signed_data, unsigned_data, kHotspotBssid, + expired_time)); + + // Checking that verification fails when certificate has invalid format. + EXPECT_FALSE(networking_private_crypto::VerifyCredentialsAtTime( + kBadCertData, icas, signed_data, unsigned_data, kHotspotBssid, time)); + + // Checking that verification fails if we supply a bad ICA. + std::vector bad_icas; + bad_icas.push_back(kCertData); + EXPECT_FALSE(networking_private_crypto::VerifyCredentialsAtTime( + kCertData, bad_icas, signed_data, unsigned_data, kHotspotBssid, time)); + + // Checking that verification fails when Hotspot Bssid does not match the + // certificate's common name. + EXPECT_FALSE(networking_private_crypto::VerifyCredentialsAtTime( + kCertData, icas, signed_data, unsigned_data, kBadHotspotBssid, time)); + + // Checking that verification fails when the signature is wrong. + unsigned_data = "bad data"; + EXPECT_FALSE(networking_private_crypto::VerifyCredentialsAtTime( + kCertData, icas, signed_data, unsigned_data, kHotspotBssid, time)); +} + +// Test that networking_private_crypto::EncryptByteString behaves as expected. +TEST_F(NetworkingPrivateCryptoTest, EncryptByteString) { + static const char kPublicKey[] = + "MIGJAoGBANTjeoILNkSKHVkd3my/rSwNi+9t473vPJU0lkM8nn9C7+gmaPvEWg4ZNkMd12aI" + "XDXVHrjgjcS80bPE0ykhN9J7EYkJ+43oulJMrEnyDy5KQo7U3MKBdjaKFTS+OPyohHpI8GqH" + "KM8UMkLPVtAKu1BXgGTSDvEaBAuoVT2PM4XNAgMBAAE="; + static const char kPrivateKey[] = + "-----BEGIN PRIVATE KEY-----" + "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANTjeoILNkSKHVkd" + "3my/rSwNi+9t473vPJU0lkM8nn9C7+gmaPvEWg4ZNkMd12aIXDXVHrjgjcS80bPE" + "0ykhN9J7EYkJ+43oulJMrEnyDy5KQo7U3MKBdjaKFTS+OPyohHpI8GqHKM8UMkLP" + "VtAKu1BXgGTSDvEaBAuoVT2PM4XNAgMBAAECgYEAt91H/2zjj8qhkkhDxDS/wd5p" + "T37fRTmMX2ktpiCC23LadOxHm7p39Nk9jjYFxV5cFXpdsFrw1kwl6VdC8LDp3eGu" + "Ku1GCqj5H2fpnkmL2goD01HRkPR3ro4uBHPtTXDbCIz0qp+NGlGG4gPUysMXxHSb" + "E5FIWeUx6gcPvidwrpkCQQD40FXY46KDJT8JVYJMqY6nFQZvptFl+9BGWfheVVSF" + "KBlTQBx/QA+XcC/W9Q/I+NEhdGcxLlkEMUpihSpYffKbAkEA2wmFfccdheTtoOuY" + "8oTurbnFHsS7gLtcR2IbRJKXw80CJxTQA/LMWz0YuFOAYJNl/9ILMfp6MQiI4L9F" + "l6pbtwJAJqkAXcXo72WvKL0flNfXsYBj0p9h8+2vi+7Y15d8nYAAh13zz5XdllM5" + "K7ZCMKDwpbkXe53O+QbLnwk/7iYLtwJAERT6AygfJk0HNzCIeglh78x4EgE3uj9i" + "X/LHu55PFacMTu3xlw09YLQwFFf2wBFeuAeyddBZ7S8ENbrU+5H+mwJBAO2E6gwG" + "e5ZqY4RmsQmv6K0rn5k+UT4qlPeVp1e6LnvO/PcKWOaUvDK59qFZoX4vN+iFUAbk" + "IuvhmL9u/uPWWck=" + "-----END PRIVATE KEY-----"; + static const std::vector kBadKeyData(5, 111); + static const char kTestData[] = "disco boy"; + static const char kEmptyData[] = ""; + + std::string public_key_string; + base::Base64Decode(kPublicKey, &public_key_string); + std::vector public_key(public_key_string.begin(), + public_key_string.end()); + std::string plain; + std::vector encrypted_output; + + // Checking basic encryption operation. + plain = kTestData; + EXPECT_TRUE(networking_private_crypto::EncryptByteString( + public_key, plain, &encrypted_output)); + EXPECT_TRUE(VerifyByteString(kPrivateKey, plain, encrypted_output)); + + // Checking that we can encrypt the empty string. + plain = kEmptyData; + EXPECT_TRUE(networking_private_crypto::EncryptByteString( + public_key, plain, &encrypted_output)); + + // Checking graceful fail for too much data to encrypt. + EXPECT_FALSE(networking_private_crypto::EncryptByteString( + public_key, std::string(500, 'x'), &encrypted_output)); + + // Checking graceful fail for a bad key format. + EXPECT_FALSE(networking_private_crypto::EncryptByteString( + kBadKeyData, kTestData, &encrypted_output)); +} diff --git a/chromium/chrome/browser/extensions/api/networking_private/networking_private_ui_delegate_chromeos.cc b/chromium/chrome/browser/extensions/api/networking_private/networking_private_ui_delegate_chromeos.cc index ff32e2b258c..fbdbf5de19f 100644 --- a/chromium/chrome/browser/extensions/api/networking_private/networking_private_ui_delegate_chromeos.cc +++ b/chromium/chrome/browser/extensions/api/networking_private/networking_private_ui_delegate_chromeos.cc @@ -4,9 +4,9 @@ #include "chrome/browser/extensions/api/networking_private/networking_private_ui_delegate_chromeos.h" +#include "chromeos/network/network_connect.h" #include "chromeos/network/network_state.h" #include "chromeos/network/network_state_handler.h" -#include "ui/chromeos/network/network_connect.h" namespace chromeos { namespace extensions { @@ -17,24 +17,13 @@ NetworkingPrivateUIDelegateChromeOS::~NetworkingPrivateUIDelegateChromeOS() {} void NetworkingPrivateUIDelegateChromeOS::ShowAccountDetails( const std::string& guid) const { - const NetworkState* network = - NetworkHandler::Get()->network_state_handler()->GetNetworkStateFromGuid( - guid); - if (!network || network->path().empty()) - return; - ui::NetworkConnect::Get()->ShowMobileSetup(network->path()); + chromeos::NetworkConnect::Get()->ShowMobileSetup(guid); } bool NetworkingPrivateUIDelegateChromeOS::HandleConnectFailed( const std::string& guid, const std::string error) const { - const NetworkState* network = - NetworkHandler::Get()->network_state_handler()->GetNetworkStateFromGuid( - guid); - if (!network || network->path().empty()) - return false; - return ui::NetworkConnect::Get()->MaybeShowConfigureUI(network->path(), - error); + return chromeos::NetworkConnect::Get()->MaybeShowConfigureUI(guid, error); } } // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc index 796b497b6bf..9fcaabfbfc9 100644 --- a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc +++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc @@ -4,6 +4,10 @@ #include "chrome/browser/extensions/api/passwords_private/passwords_private_api.h" +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/location.h" +#include "base/threading/thread_task_runner_handle.h" #include "base/values.h" #include "chrome/browser/extensions/api/passwords_private/passwords_private_delegate_factory.h" #include "chrome/common/extensions/api/passwords_private.h" @@ -93,12 +97,26 @@ PasswordsPrivateGetSavedPasswordListFunction:: ExtensionFunction::ResponseAction PasswordsPrivateGetSavedPasswordListFunction::Run() { + // GetList() can immediately call GotList() (which would Respond() before + // RespondLater()). So we post a task to preserve order. + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::Bind(&PasswordsPrivateGetSavedPasswordListFunction::GetList, this)); + return RespondLater(); +} + +void PasswordsPrivateGetSavedPasswordListFunction::GetList() { PasswordsPrivateDelegate* delegate = PasswordsPrivateDelegateFactory::GetForBrowserContext(browser_context(), true /* create */); - return RespondNow(ArgumentList( - api::passwords_private::GetSavedPasswordList::Results::Create( - *(delegate->GetSavedPasswordsList())))); + delegate->GetSavedPasswordsList( + base::Bind(&PasswordsPrivateGetSavedPasswordListFunction::GotList, this)); +} + +void PasswordsPrivateGetSavedPasswordListFunction::GotList( + const PasswordsPrivateDelegate::UiEntries& list) { + Respond(ArgumentList( + api::passwords_private::GetSavedPasswordList::Results::Create(list))); } //////////////////////////////////////////////////////////////////////////////// @@ -109,12 +127,27 @@ PasswordsPrivateGetPasswordExceptionListFunction:: ExtensionFunction::ResponseAction PasswordsPrivateGetPasswordExceptionListFunction::Run() { + // GetList() can immediately call GotList() (which would Respond() before + // RespondLater()). So we post a task to preserve order. + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::Bind(&PasswordsPrivateGetPasswordExceptionListFunction::GetList, + this)); + return RespondLater(); +} + +void PasswordsPrivateGetPasswordExceptionListFunction::GetList() { PasswordsPrivateDelegate* delegate = PasswordsPrivateDelegateFactory::GetForBrowserContext(browser_context(), true /* create */); - return RespondNow(ArgumentList( - api::passwords_private::GetPasswordExceptionList::Results::Create( - *(delegate->GetPasswordExceptionsList())))); + delegate->GetPasswordExceptionsList(base::Bind( + &PasswordsPrivateGetPasswordExceptionListFunction::GotList, this)); +} + +void PasswordsPrivateGetPasswordExceptionListFunction::GotList( + const PasswordsPrivateDelegate::ExceptionPairs& list) { + Respond(ArgumentList( + api::passwords_private::GetPasswordExceptionList::Results::Create(list))); } } // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.h b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.h index b8789f5aca4..6296e8bbe2b 100644 --- a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.h +++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.h @@ -79,6 +79,9 @@ class PasswordsPrivateGetSavedPasswordListFunction ResponseAction Run() override; private: + void GetList(); + void GotList(const PasswordsPrivateDelegate::UiEntries& entries); + DISALLOW_COPY_AND_ASSIGN(PasswordsPrivateGetSavedPasswordListFunction); }; @@ -96,6 +99,9 @@ class PasswordsPrivateGetPasswordExceptionListFunction ResponseAction Run() override; private: + void GetList(); + void GotList(const PasswordsPrivateDelegate::ExceptionPairs& pairs); + DISALLOW_COPY_AND_ASSIGN(PasswordsPrivateGetPasswordExceptionListFunction); }; 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 7ec270b1d33..6ab38ffe123 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 @@ -77,9 +77,8 @@ class TestDelegate : public PasswordsPrivateDelegate { router->OnSavedPasswordsListChanged(current_entries_); } - const std::vector* - GetSavedPasswordsList() const override { - return ¤t_entries_; + void GetSavedPasswordsList(const UiEntriesCallback& callback) override { + callback.Run(current_entries_); } void SendPasswordExceptionsList() override { @@ -89,9 +88,9 @@ class TestDelegate : public PasswordsPrivateDelegate { router->OnPasswordExceptionsListChanged(current_exceptions_); } - const std::vector* - GetPasswordExceptionsList() const override { - return ¤t_exceptions_; + void GetPasswordExceptionsList( + const ExceptionPairsCallback& callback) override { + callback.Run(current_exceptions_); } void RemoveSavedPassword( diff --git a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h index 7d5d230abff..7faeddd4f7a 100644 --- a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h +++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h @@ -42,15 +42,18 @@ class PasswordsPrivateDelegate : public KeyedService { virtual void SendSavedPasswordsList() = 0; // Gets the saved passwords list. - virtual const std::vector* - GetSavedPasswordsList() const = 0; + using UiEntries = std::vector; + using UiEntriesCallback = base::Callback; + virtual void GetSavedPasswordsList(const UiEntriesCallback& callback) = 0; // Sends the password exceptions list to the event router. virtual void SendPasswordExceptionsList() = 0; // Gets the password exceptions list. - virtual const std::vector* - GetPasswordExceptionsList() const = 0; + using ExceptionPairs = std::vector; + using ExceptionPairsCallback = base::Callback; + virtual void GetPasswordExceptionsList( + const ExceptionPairsCallback& callback) = 0; // Removes the saved password entry corresponding to |origin_url| and // |username|. 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 f332e3ef2d7..ee744580d82 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 @@ -32,8 +32,8 @@ namespace extensions { PasswordsPrivateDelegateImpl::PasswordsPrivateDelegateImpl(Profile* profile) : profile_(profile), password_manager_presenter_(new PasswordManagerPresenter(this)), - set_password_list_called_(false), - set_password_exception_list_called_(false), + current_entries_initialized_(false), + current_exceptions_initialized_(false), is_initialized_(false), web_contents_(nullptr) { password_manager_presenter_->Initialize(); @@ -49,9 +49,12 @@ void PasswordsPrivateDelegateImpl::SendSavedPasswordsList() { router->OnSavedPasswordsListChanged(current_entries_); } -const std::vector* -PasswordsPrivateDelegateImpl::GetSavedPasswordsList() const { - return ¤t_entries_; +void PasswordsPrivateDelegateImpl::GetSavedPasswordsList( + const UiEntriesCallback& callback) { + if (current_entries_initialized_) + callback.Run(current_entries_); + else + get_saved_passwords_list_callbacks_.push_back(callback); } void PasswordsPrivateDelegateImpl::SendPasswordExceptionsList() { @@ -61,9 +64,12 @@ void PasswordsPrivateDelegateImpl::SendPasswordExceptionsList() { router->OnPasswordExceptionsListChanged(current_exceptions_); } -const std::vector* -PasswordsPrivateDelegateImpl::GetPasswordExceptionsList() const { - return ¤t_exceptions_; +void PasswordsPrivateDelegateImpl::GetPasswordExceptionsList( + const ExceptionPairsCallback& callback) { + if (current_exceptions_initialized_) + callback.Run(current_exceptions_); + else + get_password_exception_list_callbacks_.push_back(callback); } void PasswordsPrivateDelegateImpl::RemoveSavedPassword( @@ -189,8 +195,15 @@ void PasswordsPrivateDelegateImpl::SetPasswordList( SendSavedPasswordsList(); - set_password_list_called_ = true; + DCHECK(!current_entries_initialized_ || + get_saved_passwords_list_callbacks_.empty()); + + current_entries_initialized_ = true; InitializeIfNecessary(); + + for (const auto& callback : get_saved_passwords_list_callbacks_) + callback.Run(current_entries_); + get_saved_passwords_list_callbacks_.clear(); } void PasswordsPrivateDelegateImpl::SetPasswordExceptionList( @@ -216,8 +229,15 @@ void PasswordsPrivateDelegateImpl::SetPasswordExceptionList( SendPasswordExceptionsList(); - set_password_exception_list_called_ = true; + DCHECK(!current_entries_initialized_ || + get_saved_passwords_list_callbacks_.empty()); + + current_exceptions_initialized_ = true; InitializeIfNecessary(); + + for (const auto& callback : get_password_exception_list_callbacks_) + callback.Run(current_exceptions_); + get_password_exception_list_callbacks_.clear(); } #if !defined(OS_ANDROID) @@ -232,7 +252,7 @@ void PasswordsPrivateDelegateImpl::Shutdown() { } void PasswordsPrivateDelegateImpl::ExecuteFunction( - const base::Callback& callback) { + const base::Closure& callback) { if (is_initialized_) { callback.Run(); return; @@ -242,16 +262,15 @@ void PasswordsPrivateDelegateImpl::ExecuteFunction( } void PasswordsPrivateDelegateImpl::InitializeIfNecessary() { - if (is_initialized_ || - !set_password_list_called_ || - !set_password_exception_list_called_) + if (is_initialized_ || !current_entries_initialized_ || + !current_exceptions_initialized_) return; is_initialized_ = true; - for (const base::Callback& callback : pre_initialization_callbacks_) { + for (const base::Closure& callback : pre_initialization_callbacks_) callback.Run(); - } + pre_initialization_callbacks_.clear(); } } // namespace extensions 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 55b87f518b9..830e8ba9a98 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 @@ -40,11 +40,10 @@ class PasswordsPrivateDelegateImpl : public PasswordsPrivateDelegate, // PasswordsPrivateDelegate implementation. void SendSavedPasswordsList() override; - const std::vector* - GetSavedPasswordsList() const override; + void GetSavedPasswordsList(const UiEntriesCallback& callback) override; void SendPasswordExceptionsList() override; - const std::vector* - GetPasswordExceptionsList() const override; + void GetPasswordExceptionsList( + const ExceptionPairsCallback& callback) override; void RemoveSavedPassword( const std::string& origin_url, const std::string& username) override; void RemovePasswordException(const std::string& exception_url) override; @@ -80,7 +79,7 @@ class PasswordsPrivateDelegateImpl : public PasswordsPrivateDelegate, // Executes a given callback by either invoking it immediately if the class // has been initialized or by deferring it until initialization has completed. - void ExecuteFunction(const base::Callback& callback); + void ExecuteFunction(const base::Closure& callback); void RemoveSavedPasswordInternal( const std::string& origin_url, const std::string& username); @@ -98,20 +97,22 @@ class PasswordsPrivateDelegateImpl : public PasswordsPrivateDelegate, // The current list of entries/exceptions. Cached here so that when new // observers are added, this delegate can send the current lists without // having to request them from |password_manager_presenter_| again. - std::vector current_entries_; - std::vector current_exceptions_; + UiEntries current_entries_; + ExceptionPairs current_exceptions_; // Whether SetPasswordList and SetPasswordExceptionList have been called, and // whether this class has been initialized, meaning both have been called. - bool set_password_list_called_; - bool set_password_exception_list_called_; + bool current_entries_initialized_; + bool current_exceptions_initialized_; bool is_initialized_; // Vector of callbacks which are queued up before the password store has been // initialized. Once both SetPasswordList() and SetPasswordExceptionList() // have been called, this class is considered initialized and can these // callbacks are invoked. - std::vector> pre_initialization_callbacks_; + std::vector pre_initialization_callbacks_; + std::vector get_saved_passwords_list_callbacks_; + std::vector get_password_exception_list_callbacks_; // The WebContents used when invoking this API. Used to fetch the // NativeWindow for the window where the API was called. 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 new file mode 100644 index 00000000000..87e1a39c2ca --- /dev/null +++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc @@ -0,0 +1,84 @@ +// 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 + +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/macros.h" +#include "base/memory/ptr_util.h" +#include "chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h" +#include "chrome/test/base/testing_profile.h" +#include "components/autofill/core/common/password_form.h" +#include "content/public/test/test_browser_thread_bundle.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace extensions { + +template +class CallbackTracker { + public: + CallbackTracker() : callback_( + base::Bind(&CallbackTracker::Callback, base::Unretained(this))) {} + + using TypedCallback = base::Callback; + + const TypedCallback& callback() const { return callback_; } + + size_t call_count() const { return call_count_; } + + private: + void Callback(const T& args) { + EXPECT_FALSE(args.empty()); + ++call_count_; + } + + size_t call_count_ = 0; + + TypedCallback callback_; + + DISALLOW_COPY_AND_ASSIGN(CallbackTracker); +}; + +using PasswordFormList = std::vector>; + +TEST(PasswordsPrivateDelegateImplTest, GetSavedPasswordsList) { + CallbackTracker tracker; + + content::TestBrowserThreadBundle thread_bundle; + TestingProfile profile; + PasswordsPrivateDelegateImpl delegate(&profile); + + delegate.GetSavedPasswordsList(tracker.callback()); + EXPECT_EQ(0u, tracker.call_count()); + + PasswordFormList list; + list.push_back(base::MakeUnique()); + delegate.SetPasswordList(list); + EXPECT_EQ(1u, tracker.call_count()); + + delegate.GetSavedPasswordsList(tracker.callback()); + EXPECT_EQ(2u, tracker.call_count()); +} + +TEST(PasswordsPrivateDelegateImplTest, GetPasswordExceptionsList) { + CallbackTracker tracker; + + content::TestBrowserThreadBundle thread_bundle; + TestingProfile profile; + PasswordsPrivateDelegateImpl delegate(&profile); + + delegate.GetPasswordExceptionsList(tracker.callback()); + EXPECT_EQ(0u, tracker.call_count()); + + PasswordFormList list; + list.push_back(base::MakeUnique()); + delegate.SetPasswordExceptionList(list); + EXPECT_EQ(1u, tracker.call_count()); + + delegate.GetPasswordExceptionsList(tracker.callback()); + EXPECT_EQ(2u, tracker.call_count()); +} + +} // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/permissions/permissions_api.cc b/chromium/chrome/browser/extensions/api/permissions/permissions_api.cc index 0a8222f08af..3b52c7334c2 100644 --- a/chromium/chrome/browser/extensions/api/permissions/permissions_api.cc +++ b/chromium/chrome/browser/extensions/api/permissions/permissions_api.cc @@ -54,53 +54,50 @@ bool ignore_user_gesture_for_tests = false; } // namespace -bool PermissionsContainsFunction::RunSync() { +ExtensionFunction::ResponseAction PermissionsContainsFunction::Run() { std::unique_ptr params(Contains::Params::Create(*args_)); EXTENSION_FUNCTION_VALIDATE(params); // NOTE: |permissions| is not used to make any security decisions. Therefore, // it is entirely fine to set |allow_file_access| to true below. This will // avoid throwing error when extension() doesn't have access to file://. + std::string error; std::unique_ptr permissions = helpers::UnpackPermissionSet(params->permissions, - true /* allow_file_access */, &error_); + true /* allow_file_access */, &error); if (!permissions.get()) - return false; + return RespondNow(Error(error)); - results_ = Contains::Results::Create( + return RespondNow(ArgumentList(Contains::Results::Create( extension()->permissions_data()->active_permissions().Contains( - *permissions)); - return true; + *permissions)))); } -bool PermissionsGetAllFunction::RunSync() { +ExtensionFunction::ResponseAction PermissionsGetAllFunction::Run() { std::unique_ptr permissions = helpers::PackPermissionSet( extension()->permissions_data()->active_permissions()); - results_ = GetAll::Results::Create(*permissions); - return true; + return RespondNow(ArgumentList(GetAll::Results::Create(*permissions))); } -bool PermissionsRemoveFunction::RunSync() { +ExtensionFunction::ResponseAction PermissionsRemoveFunction::Run() { std::unique_ptr params(Remove::Params::Create(*args_)); EXTENSION_FUNCTION_VALIDATE(params); + std::string error; std::unique_ptr permissions = - helpers::UnpackPermissionSet( - params->permissions, - ExtensionPrefs::Get(GetProfile())->AllowFileAccess(extension_->id()), - &error_); + helpers::UnpackPermissionSet(params->permissions, + ExtensionPrefs::Get(browser_context()) + ->AllowFileAccess(extension_->id()), + &error); + if (!permissions.get()) - return false; + return RespondNow(Error(error)); // Make sure they're only trying to remove permissions supported by this API. APIPermissionSet apis = permissions->apis(); - for (APIPermissionSet::const_iterator i = apis.begin(); - i != apis.end(); ++i) { - if (!i->info()->supports_optional()) { - error_ = ErrorUtils::FormatErrorMessage( - kNotWhitelistedError, i->name()); - return false; - } + for (const APIPermission* permission : apis) { + if (!permission->info()->supports_optional()) + return RespondNow(Error(kNotWhitelistedError, permission->name())); } // Make sure we only remove optional permissions, and not required @@ -116,8 +113,7 @@ bool PermissionsRemoveFunction::RunSync() { !std::unique_ptr( PermissionSet::CreateIntersection(*permissions, required)) ->IsEmpty()) { - error_ = kCantRemoveRequiredPermissionsError; - return false; + return RespondNow(Error(kCantRemoveRequiredPermissionsError)); } // Only try and remove those permissions that are active on the extension. @@ -126,11 +122,10 @@ bool PermissionsRemoveFunction::RunSync() { permissions = PermissionSet::CreateIntersection( *permissions, extension()->permissions_data()->active_permissions()); - PermissionsUpdater(GetProfile()) + PermissionsUpdater(browser_context()) .RemovePermissions(extension(), *permissions, PermissionsUpdater::REMOVE_SOFT); - results_ = Remove::Results::Create(true); - return true; + return RespondNow(ArgumentList(Remove::Results::Create(true))); } // static diff --git a/chromium/chrome/browser/extensions/api/permissions/permissions_api.h b/chromium/chrome/browser/extensions/api/permissions/permissions_api.h index e29074b531d..e780a45199d 100644 --- a/chromium/chrome/browser/extensions/api/permissions/permissions_api.h +++ b/chromium/chrome/browser/extensions/api/permissions/permissions_api.h @@ -16,7 +16,7 @@ namespace extensions { // chrome.permissions.contains -class PermissionsContainsFunction : public ChromeSyncExtensionFunction { +class PermissionsContainsFunction : public UIThreadExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("permissions.contains", PERMISSIONS_CONTAINS) @@ -24,11 +24,11 @@ class PermissionsContainsFunction : public ChromeSyncExtensionFunction { ~PermissionsContainsFunction() override {} // ExtensionFunction: - bool RunSync() override; + ResponseAction Run() override; }; // chrome.permissions.getAll -class PermissionsGetAllFunction : public ChromeSyncExtensionFunction { +class PermissionsGetAllFunction : public UIThreadExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("permissions.getAll", PERMISSIONS_GETALL) @@ -36,11 +36,11 @@ class PermissionsGetAllFunction : public ChromeSyncExtensionFunction { ~PermissionsGetAllFunction() override {} // ExtensionFunction: - bool RunSync() override; + ResponseAction Run() override; }; // chrome.permissions.remove -class PermissionsRemoveFunction : public ChromeSyncExtensionFunction { +class PermissionsRemoveFunction : public UIThreadExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("permissions.remove", PERMISSIONS_REMOVE) @@ -48,7 +48,7 @@ class PermissionsRemoveFunction : public ChromeSyncExtensionFunction { ~PermissionsRemoveFunction() override {} // ExtensionFunction: - bool RunSync() override; + ResponseAction Run() override; }; // chrome.permissions.request 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 6b79c87a04d..2a8a5a44605 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 @@ -20,9 +20,9 @@ #include "chrome/browser/policy/profile_policy_connector_factory.h" #include "chrome/browser/profiles/profile.h" #include "chromeos/chromeos_switches.h" -#include "chromeos/login/user_names.h" #include "components/policy/policy_constants.h" #include "components/signin/core/account_id/account_id.h" +#include "components/user_manager/user_names.h" #include "content/public/browser/notification_service.h" #include "content/public/test/test_utils.h" #include "crypto/nss_util_internal.h" @@ -65,7 +65,7 @@ class PlatformKeysTest : public ExtensionApiTest { command_line->AppendSwitchASCII( chromeos::switches::kLoginUser, - chromeos::login::StubAccountId().GetUserEmail()); + user_manager::StubAccountId().GetUserEmail()); } void SetUpInProcessBrowserTestFixture() override { @@ -74,7 +74,7 @@ class PlatformKeysTest : public ExtensionApiTest { if (device_status_ == DEVICE_STATUS_ENROLLED) { device_policy_test_helper_.device_policy()->policy_data().set_username( user_status_ == USER_STATUS_MANAGED_AFFILIATED_DOMAIN - ? chromeos::login::StubAccountId().GetUserEmail() + ? user_manager::StubAccountId().GetUserEmail() : "someuser@anydomain.com"); device_policy_test_helper_.device_policy()->Build(); @@ -181,7 +181,7 @@ class PlatformKeysTest : public ExtensionApiTest { private: void SetupInitialEmptyPolicy() { policy_helper_.reset(new policy::UserPolicyTestHelper( - chromeos::login::StubAccountId().GetUserEmail())); + user_manager::StubAccountId().GetUserEmail())); policy_helper_->Init( base::DictionaryValue() /* empty mandatory policy */, base::DictionaryValue() /* empty recommended policy */); diff --git a/chromium/chrome/browser/extensions/api/platform_keys/verify_trust_api.cc b/chromium/chrome/browser/extensions/api/platform_keys/verify_trust_api.cc index 42e21020c3d..4bdc91ea91c 100644 --- a/chromium/chrome/browser/extensions/api/platform_keys/verify_trust_api.cc +++ b/chromium/chrome/browser/extensions/api/platform_keys/verify_trust_api.cc @@ -5,10 +5,10 @@ #include "chrome/browser/extensions/api/platform_keys/verify_trust_api.h" #include +#include #include "base/lazy_instance.h" #include "base/macros.h" -#include "base/memory/linked_ptr.h" #include "base/memory/ref_counted.h" #include "chrome/browser/extensions/api/platform_keys/platform_keys_api.h" #include "chrome/common/extensions/api/platform_keys_internal.h" @@ -71,7 +71,8 @@ class VerifyTrustAPI::IOPart { // One CertVerifier per extension to verify trust. Each verifier is created on // first usage and deleted when this IOPart is destructed or the respective // extension is unloaded. - std::map> extension_to_verifier_; + std::map> + extension_to_verifier_; }; // static @@ -177,8 +178,7 @@ void VerifyTrustAPI::IOPart::Verify(std::unique_ptr params, } if (!base::ContainsKey(extension_to_verifier_, extension_id)) { - extension_to_verifier_[extension_id] = - make_linked_ptr(net::CertVerifier::CreateDefault().release()); + extension_to_verifier_[extension_id] = net::CertVerifier::CreateDefault(); } net::CertVerifier* verifier = extension_to_verifier_[extension_id].get(); diff --git a/chromium/chrome/browser/extensions/api/preference/preference_api.cc b/chromium/chrome/browser/extensions/api/preference/preference_api.cc index 89d11d66c0d..025bf3a80c9 100644 --- a/chromium/chrome/browser/extensions/api/preference/preference_api.cc +++ b/chromium/chrome/browser/extensions/api/preference/preference_api.cc @@ -32,6 +32,7 @@ #include "components/password_manager/core/common/password_manager_pref_names.h" #include "components/prefs/pref_service.h" #include "components/proxy_config/proxy_config_pref_names.h" +#include "components/safe_browsing_db/safe_browsing_prefs.h" #include "components/spellcheck/browser/pref_names.h" #include "components/translate/core/common/translate_pref_names.h" #include "content/public/browser/notification_details.h" @@ -80,8 +81,7 @@ const char kConversionErrorMessage[] = "properly."; PrefMappingEntry kPrefMapping[] = { - {"spdy_proxy.enabled", - prefs::kDataSaverEnabled, + {"spdy_proxy.enabled", prefs::kDataSaverEnabled, APIPermission::kDataReductionProxy, APIPermission::kDataReductionProxy}, {"data_reduction.daily_original_length", data_reduction_proxy::prefs::kDailyHttpOriginalContentLength, @@ -587,32 +587,9 @@ BrowserContextKeyedAPIFactory::DeclareFactoryDependencies() { PreferenceFunction::~PreferenceFunction() { } -bool PreferenceFunction::ValidateBrowserPref( - const std::string& extension_pref_key, - PreferenceFunction::PermissionType permission_type, - std::string* browser_pref_key) { - APIPermission::ID read_permission = APIPermission::kInvalid; - APIPermission::ID write_permission = APIPermission::kInvalid; - EXTENSION_FUNCTION_VALIDATE( - PrefMapping::GetInstance()->FindBrowserPrefForExtensionPref( - extension_pref_key, - browser_pref_key, - &read_permission, - &write_permission)); - APIPermission::ID permission = permission_type == PERMISSION_TYPE_READ - ? read_permission - : write_permission; - if (!extension()->permissions_data()->HasAPIPermission(permission)) { - error_ = ErrorUtils::FormatErrorMessage( - keys::kPermissionErrorMessage, extension_pref_key); - return false; - } - return true; -} - GetPreferenceFunction::~GetPreferenceFunction() { } -bool GetPreferenceFunction::RunSync() { +ExtensionFunction::ResponseAction GetPreferenceFunction::Run() { std::string pref_key; EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &pref_key)); base::DictionaryValue* details = NULL; @@ -624,19 +601,22 @@ bool GetPreferenceFunction::RunSync() { &incognito)); // Check incognito access. - if (incognito && !include_incognito()) { - error_ = keys::kIncognitoErrorMessage; - return false; - } + if (incognito && !include_incognito()) + return RespondNow(Error(keys::kIncognitoErrorMessage)); // Obtain pref. std::string browser_pref; - if (!ValidateBrowserPref( - pref_key, PreferenceFunction::PERMISSION_TYPE_READ, &browser_pref)) { - return false; - } - PrefService* prefs = incognito ? GetProfile()->GetOffTheRecordPrefs() - : GetProfile()->GetPrefs(); + APIPermission::ID read_permission = APIPermission::kInvalid; + APIPermission::ID write_permission = APIPermission::kInvalid; + EXTENSION_FUNCTION_VALIDATE( + PrefMapping::GetInstance()->FindBrowserPrefForExtensionPref( + pref_key, &browser_pref, &read_permission, &write_permission)); + if (!extension()->permissions_data()->HasAPIPermission(read_permission)) + return RespondNow(Error(keys::kPermissionErrorMessage, pref_key)); + + Profile* profile = Profile::FromBrowserContext(browser_context()); + PrefService* prefs = + incognito ? profile->GetOffTheRecordPrefs() : profile->GetPrefs(); const PrefService::Preference* pref = prefs->FindPreference(browser_pref.c_str()); CHECK(pref); @@ -645,7 +625,7 @@ bool GetPreferenceFunction::RunSync() { // Retrieve level of control. std::string level_of_control = helpers::GetLevelOfControl( - GetProfile(), extension_id(), browser_pref, incognito); + profile, extension_id(), browser_pref, incognito); result->SetString(keys::kLevelOfControl, level_of_control); // Retrieve pref value. @@ -654,27 +634,28 @@ bool GetPreferenceFunction::RunSync() { base::Value* transformed_value = transformer->BrowserToExtensionPref(pref->GetValue()); if (!transformed_value) { + // TODO(devlin): Can this happen? When? Should it be an error, or a bad + // message? LOG(ERROR) << ErrorUtils::FormatErrorMessage(kConversionErrorMessage, pref->name()); - return false; + return RespondNow(Error(kUnknownErrorDoNotUse)); } result->Set(keys::kValue, transformed_value); // Retrieve incognito status. if (incognito) { - ExtensionPrefs* ep = ExtensionPrefs::Get(GetProfile()); + ExtensionPrefs* ep = ExtensionPrefs::Get(browser_context()); result->SetBoolean(keys::kIncognitoSpecific, ep->HasIncognitoPrefValue(browser_pref)); } - SetResult(std::move(result)); - return true; + return RespondNow(OneArgument(std::move(result))); } SetPreferenceFunction::~SetPreferenceFunction() { } -bool SetPreferenceFunction::RunSync() { +ExtensionFunction::ResponseAction SetPreferenceFunction::Run() { std::string pref_key; EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &pref_key)); base::DictionaryValue* details = NULL; @@ -698,32 +679,32 @@ bool SetPreferenceFunction::RunSync() { scope == kExtensionPrefsScopeIncognitoSessionOnly); if (incognito) { // Regular profiles can't access incognito unless include_incognito is true. - if (!GetProfile()->IsOffTheRecord() && !include_incognito()) { - error_ = keys::kIncognitoErrorMessage; - return false; - } - } else { + if (!browser_context()->IsOffTheRecord() && !include_incognito()) + return RespondNow(Error(keys::kIncognitoErrorMessage)); + } else if (browser_context()->IsOffTheRecord()) { // Incognito profiles can't access regular mode ever, they only exist in // split mode. - if (GetProfile()->IsOffTheRecord()) { - error_ = "Can't modify regular settings from an incognito context."; - return false; - } + return RespondNow( + Error("Can't modify regular settings from an incognito context.")); } + Profile* profile = Profile::FromBrowserContext(browser_context()); if (scope == kExtensionPrefsScopeIncognitoSessionOnly && - !GetProfile()->HasOffTheRecordProfile()) { - error_ = keys::kIncognitoSessionOnlyErrorMessage; - return false; + !profile->HasOffTheRecordProfile()) { + return RespondNow(Error(keys::kIncognitoSessionOnlyErrorMessage)); } // Obtain pref. std::string browser_pref; - if (!ValidateBrowserPref( - pref_key, PreferenceFunction::PERMISSION_TYPE_WRITE, &browser_pref)) { - return false; - } - ExtensionPrefs* prefs = ExtensionPrefs::Get(GetProfile()); + APIPermission::ID read_permission = APIPermission::kInvalid; + APIPermission::ID write_permission = APIPermission::kInvalid; + EXTENSION_FUNCTION_VALIDATE( + PrefMapping::GetInstance()->FindBrowserPrefForExtensionPref( + pref_key, &browser_pref, &read_permission, &write_permission)); + if (!extension()->permissions_data()->HasAPIPermission(write_permission)) + return RespondNow(Error(keys::kPermissionErrorMessage, pref_key)); + + ExtensionPrefs* prefs = ExtensionPrefs::Get(browser_context()); const PrefService::Preference* pref = prefs->pref_service()->FindPreference(browser_pref.c_str()); CHECK(pref); @@ -736,31 +717,26 @@ bool SetPreferenceFunction::RunSync() { std::unique_ptr browser_pref_value( transformer->ExtensionToBrowserPref(value, &error, &bad_message)); if (!browser_pref_value) { - error_ = error; - set_bad_message(bad_message); - return false; + EXTENSION_FUNCTION_VALIDATE(!bad_message); + return RespondNow(Error(error)); } EXTENSION_FUNCTION_VALIDATE(browser_pref_value->GetType() == pref->GetType()); // Validate also that the stored value can be converted back by the // transformer. - std::unique_ptr extensionPrefValue( + std::unique_ptr extension_pref_value( transformer->BrowserToExtensionPref(browser_pref_value.get())); - if (!extensionPrefValue) { - error_ = ErrorUtils::FormatErrorMessage(kConversionErrorMessage, - pref->name()); - set_bad_message(true); - return false; - } + EXTENSION_FUNCTION_VALIDATE(extension_pref_value); - PreferenceAPI::Get(GetProfile())->SetExtensionControlledPref( - extension_id(), browser_pref, scope, browser_pref_value.release()); - return true; + PreferenceAPI::Get(browser_context()) + ->SetExtensionControlledPref(extension_id(), browser_pref, scope, + browser_pref_value.release()); + return RespondNow(NoArguments()); } ClearPreferenceFunction::~ClearPreferenceFunction() { } -bool ClearPreferenceFunction::RunSync() { +ExtensionFunction::ResponseAction ClearPreferenceFunction::Run() { std::string pref_key; EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &pref_key)); base::DictionaryValue* details = NULL; @@ -782,24 +758,25 @@ bool ClearPreferenceFunction::RunSync() { if (incognito) { // We don't check incognito permissions here, as an extension should be // always allowed to clear its own settings. - } else { + } else if (browser_context()->IsOffTheRecord()) { // Incognito profiles can't access regular mode ever, they only exist in // split mode. - if (GetProfile()->IsOffTheRecord()) { - error_ = "Can't modify regular settings from an incognito context."; - return false; - } + return RespondNow( + Error("Can't modify regular settings from an incognito context.")); } std::string browser_pref; - if (!ValidateBrowserPref( - pref_key, PreferenceFunction::PERMISSION_TYPE_WRITE, &browser_pref)) { - return false; - } + APIPermission::ID read_permission = APIPermission::kInvalid; + APIPermission::ID write_permission = APIPermission::kInvalid; + EXTENSION_FUNCTION_VALIDATE( + PrefMapping::GetInstance()->FindBrowserPrefForExtensionPref( + pref_key, &browser_pref, &read_permission, &write_permission)); + if (!extension()->permissions_data()->HasAPIPermission(write_permission)) + return RespondNow(Error(keys::kPermissionErrorMessage, pref_key)); - PreferenceAPI::Get(GetProfile()) + PreferenceAPI::Get(browser_context()) ->RemoveExtensionControlledPref(extension_id(), browser_pref, scope); - return true; + return RespondNow(NoArguments()); } } // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/preference/preference_api.h b/chromium/chrome/browser/extensions/api/preference/preference_api.h index f82bb8eba1a..47d68b4a576 100644 --- a/chromium/chrome/browser/extensions/api/preference/preference_api.h +++ b/chromium/chrome/browser/extensions/api/preference/preference_api.h @@ -166,20 +166,11 @@ class PrefTransformerInterface { // A base class to provide functionality common to the other *PreferenceFunction // classes. -class PreferenceFunction : public ChromeSyncExtensionFunction { +class PreferenceFunction : public UIThreadExtensionFunction { protected: enum PermissionType { PERMISSION_TYPE_READ, PERMISSION_TYPE_WRITE }; ~PreferenceFunction() override; - - // Given an |extension_pref_key|, provides its |browser_pref_key| from the - // static map in preference_api.cc. Returns true if the corresponding - // browser pref exists and the extension has the API permission needed to - // modify that pref. Sets |error_| if the extension doesn't have the needed - // permission. - bool ValidateBrowserPref(const std::string& extension_pref_key, - PermissionType permission_type, - std::string* browser_pref_key); }; class GetPreferenceFunction : public PreferenceFunction { @@ -190,7 +181,7 @@ class GetPreferenceFunction : public PreferenceFunction { ~GetPreferenceFunction() override; // ExtensionFunction: - bool RunSync() override; + ResponseAction Run() override; }; class SetPreferenceFunction : public PreferenceFunction { @@ -201,7 +192,7 @@ class SetPreferenceFunction : public PreferenceFunction { ~SetPreferenceFunction() override; // ExtensionFunction: - bool RunSync() override; + ResponseAction Run() override; }; class ClearPreferenceFunction : public PreferenceFunction { @@ -213,7 +204,7 @@ class ClearPreferenceFunction : public PreferenceFunction { ~ClearPreferenceFunction() override; // ExtensionFunction: - bool RunSync() override; + ResponseAction Run() override; }; } // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/screenlock_private/screenlock_private_api.cc b/chromium/chrome/browser/extensions/api/screenlock_private/screenlock_private_api.cc index 4504d3c9240..02e97473912 100644 --- a/chromium/chrome/browser/extensions/api/screenlock_private/screenlock_private_api.cc +++ b/chromium/chrome/browser/extensions/api/screenlock_private/screenlock_private_api.cc @@ -96,7 +96,8 @@ ScreenlockPrivateAcceptAuthAttemptFunction:: ScreenlockPrivateAcceptAuthAttemptFunction:: ~ScreenlockPrivateAcceptAuthAttemptFunction() {} -bool ScreenlockPrivateAcceptAuthAttemptFunction::RunSync() { +ExtensionFunction::ResponseAction +ScreenlockPrivateAcceptAuthAttemptFunction::Run() { std::unique_ptr params( screenlock::AcceptAuthAttempt::Params::Create(*args_)); EXTENSION_FUNCTION_VALIDATE(params.get()); @@ -105,7 +106,7 @@ bool ScreenlockPrivateAcceptAuthAttemptFunction::RunSync() { EasyUnlockService* service = EasyUnlockService::Get(profile); if (service) service->FinalizeUnlock(params->accept); - return true; + return RespondNow(NoArguments()); } ScreenlockPrivateEventRouter::ScreenlockPrivateEventRouter( diff --git a/chromium/chrome/browser/extensions/api/screenlock_private/screenlock_private_api.h b/chromium/chrome/browser/extensions/api/screenlock_private/screenlock_private_api.h index b08d043a087..8be74e50597 100644 --- a/chromium/chrome/browser/extensions/api/screenlock_private/screenlock_private_api.h +++ b/chromium/chrome/browser/extensions/api/screenlock_private/screenlock_private_api.h @@ -41,12 +41,12 @@ class ScreenlockPrivateSetLockedFunction : public ChromeAsyncExtensionFunction { }; class ScreenlockPrivateAcceptAuthAttemptFunction - : public ChromeSyncExtensionFunction { + : public UIThreadExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("screenlockPrivate.acceptAuthAttempt", SCREENLOCKPRIVATE_ACCEPTAUTHATTEMPT) ScreenlockPrivateAcceptAuthAttemptFunction(); - bool RunSync() override; + ResponseAction Run() override; private: ~ScreenlockPrivateAcceptAuthAttemptFunction() override; diff --git a/chromium/chrome/browser/extensions/api/sessions/sessions_api.cc b/chromium/chrome/browser/extensions/api/sessions/sessions_api.cc index b568021ab66..6ac96677064 100644 --- a/chromium/chrome/browser/extensions/api/sessions/sessions_api.cc +++ b/chromium/chrome/browser/extensions/api/sessions/sessions_api.cc @@ -76,7 +76,6 @@ bool SortTabsByRecency(const sessions::SessionTab* t1, } tabs::Tab CreateTabModelHelper( - Profile* profile, const sessions::SerializedNavigationEntry& current_navigation, const std::string& session_id, int index, @@ -146,8 +145,7 @@ bool is_window_entry(const sessions::TabRestoreService::Entry& entry) { tabs::Tab SessionsGetRecentlyClosedFunction::CreateTabModel( const sessions::TabRestoreService::Tab& tab, bool active) { - return CreateTabModelHelper(GetProfile(), - tab.navigations[tab.current_navigation_index], + return CreateTabModelHelper(tab.navigations[tab.current_navigation_index], base::IntToString(tab.id), tab.tabstrip_index, tab.pinned, active, extension()); } @@ -188,7 +186,7 @@ SessionsGetRecentlyClosedFunction::CreateSessionModel( std::move(window)); } -bool SessionsGetRecentlyClosedFunction::RunSync() { +ExtensionFunction::ResponseAction SessionsGetRecentlyClosedFunction::Run() { std::unique_ptr params( GetRecentlyClosed::Params::Create(*args_)); EXTENSION_FUNCTION_VALIDATE(params); @@ -200,15 +198,15 @@ bool SessionsGetRecentlyClosedFunction::RunSync() { std::vector result; sessions::TabRestoreService* tab_restore_service = - TabRestoreServiceFactory::GetForProfile(GetProfile()); + TabRestoreServiceFactory::GetForProfile( + Profile::FromBrowserContext(browser_context())); // TabRestoreServiceFactory::GetForProfile() can return NULL (i.e., when in // incognito mode) if (!tab_restore_service) { - DCHECK_NE(GetProfile(), GetProfile()->GetOriginalProfile()) + DCHECK(browser_context()->IsOffTheRecord()) << "sessions::TabRestoreService expected for normal profiles"; - results_ = GetRecentlyClosed::Results::Create(result); - return true; + return RespondNow(ArgumentList(GetRecentlyClosed::Results::Create(result))); } // List of entries. They are ordered from most to least recent. @@ -218,8 +216,7 @@ bool SessionsGetRecentlyClosedFunction::RunSync() { result.push_back(std::move(*CreateSessionModel(*entry))); } - results_ = GetRecentlyClosed::Results::Create(result); - return true; + return RespondNow(ArgumentList(GetRecentlyClosed::Results::Create(result))); } tabs::Tab SessionsGetDevicesFunction::CreateTabModel( @@ -229,8 +226,8 @@ tabs::Tab SessionsGetDevicesFunction::CreateTabModel( bool active) { std::string session_id = SessionId(session_tag, tab.tab_id.id()).ToString(); return CreateTabModelHelper( - GetProfile(), tab.navigations[tab.normalized_navigation_index()], - session_id, tab_index, tab.pinned, active, extension()); + tab.navigations[tab.normalized_navigation_index()], session_id, tab_index, + tab.pinned, active, extension()); } std::unique_ptr SessionsGetDevicesFunction::CreateWindowModel( @@ -247,7 +244,8 @@ std::unique_ptr SessionsGetDevicesFunction::CreateWindowModel( continue; const sessions::SerializedNavigationEntry& current_navigation = tab->navigations.at(tab->normalized_navigation_index()); - if (search::IsNTPURL(current_navigation.virtual_url(), GetProfile())) { + if (search::IsNTPURL(current_navigation.virtual_url(), + Profile::FromBrowserContext(browser_context()))) { continue; } tabs_in_window.push_back(tab); @@ -347,23 +345,22 @@ api::sessions::Device SessionsGetDevicesFunction::CreateDeviceModel( return device_struct; } -bool SessionsGetDevicesFunction::RunSync() { +ExtensionFunction::ResponseAction SessionsGetDevicesFunction::Run() { browser_sync::ProfileSyncService* service = - ProfileSyncServiceFactory::GetInstance()->GetForProfile(GetProfile()); + ProfileSyncServiceFactory::GetInstance()->GetForProfile( + Profile::FromBrowserContext(browser_context())); if (!(service && service->GetPreferredDataTypes().Has(syncer::SESSIONS))) { // Sync not enabled. - results_ = - GetDevices::Results::Create(std::vector()); - return true; + return RespondNow(ArgumentList( + GetDevices::Results::Create(std::vector()))); } sync_sessions::OpenTabsUIDelegate* open_tabs = service->GetOpenTabsUIDelegate(); std::vector sessions; if (!(open_tabs && open_tabs->GetAllForeignSessions(&sessions))) { - results_ = - GetDevices::Results::Create(std::vector()); - return true; + return RespondNow(ArgumentList( + GetDevices::Results::Create(std::vector()))); } std::unique_ptr params( @@ -380,51 +377,46 @@ bool SessionsGetDevicesFunction::RunSync() { for (size_t i = 0; i < sessions.size(); ++i) result.push_back(CreateDeviceModel(sessions[i])); - results_ = GetDevices::Results::Create(result); - return true; + return RespondNow(ArgumentList(GetDevices::Results::Create(result))); } -void SessionsRestoreFunction::SetInvalidIdError(const std::string& invalid_id) { - SetError(ErrorUtils::FormatErrorMessage(kInvalidSessionIdError, invalid_id)); -} - - -void SessionsRestoreFunction::SetResultRestoredTab( +ExtensionFunction::ResponseValue SessionsRestoreFunction::GetRestoredTabResult( content::WebContents* contents) { std::unique_ptr tab( ExtensionTabUtil::CreateTabObject(contents, extension())); std::unique_ptr restored_session( CreateSessionModelHelper(base::Time::Now().ToTimeT(), std::move(tab), std::unique_ptr())); - results_ = Restore::Results::Create(*restored_session); + return ArgumentList(Restore::Results::Create(*restored_session)); } -bool SessionsRestoreFunction::SetResultRestoredWindow(int window_id) { +ExtensionFunction::ResponseValue +SessionsRestoreFunction::GetRestoredWindowResult(int window_id) { WindowController* controller = NULL; + std::string error; if (!windows_util::GetWindowFromWindowID(this, window_id, 0, &controller, - &error_)) { - return false; + &error)) { + return Error(error); } std::unique_ptr window_value( controller->CreateWindowValueWithTabs(extension())); std::unique_ptr window( windows::Window::FromValue(*window_value)); - results_ = Restore::Results::Create(*CreateSessionModelHelper( + return ArgumentList(Restore::Results::Create(*CreateSessionModelHelper( base::Time::Now().ToTimeT(), std::unique_ptr(), - std::move(window))); - return true; + std::move(window)))); } -bool SessionsRestoreFunction::RestoreMostRecentlyClosed(Browser* browser) { +ExtensionFunction::ResponseValue +SessionsRestoreFunction::RestoreMostRecentlyClosed(Browser* browser) { sessions::TabRestoreService* tab_restore_service = - TabRestoreServiceFactory::GetForProfile(GetProfile()); + TabRestoreServiceFactory::GetForProfile( + Profile::FromBrowserContext(browser_context())); const sessions::TabRestoreService::Entries& entries = tab_restore_service->entries(); - if (entries.empty()) { - SetError(kNoRecentlyClosedSessionsError); - return false; - } + if (entries.empty()) + return Error(kNoRecentlyClosedSessionsError); bool is_window = is_window_entry(*entries.front()); sessions::LiveTabContext* context = @@ -437,25 +429,24 @@ bool SessionsRestoreFunction::RestoreMostRecentlyClosed(Browser* browser) { sessions::ContentLiveTab* first_tab = static_cast(restored_tabs[0]); if (is_window) { - return SetResultRestoredWindow( + return GetRestoredWindowResult( ExtensionTabUtil::GetWindowIdOfTab(first_tab->web_contents())); } - SetResultRestoredTab(first_tab->web_contents()); - return true; + return GetRestoredTabResult(first_tab->web_contents()); } -bool SessionsRestoreFunction::RestoreLocalSession(const SessionId& session_id, - Browser* browser) { +ExtensionFunction::ResponseValue SessionsRestoreFunction::RestoreLocalSession( + const SessionId& session_id, + Browser* browser) { sessions::TabRestoreService* tab_restore_service = - TabRestoreServiceFactory::GetForProfile(GetProfile()); + TabRestoreServiceFactory::GetForProfile( + Profile::FromBrowserContext(browser_context())); const sessions::TabRestoreService::Entries& entries = tab_restore_service->entries(); - if (entries.empty()) { - SetInvalidIdError(session_id.ToString()); - return false; - } + if (entries.empty()) + return Error(kInvalidSessionIdError, session_id.ToString()); // Check if the recently closed list contains an entry with the provided id. bool is_window = false; @@ -475,38 +466,33 @@ bool SessionsRestoreFunction::RestoreLocalSession(const SessionId& session_id, tab_restore_service->RestoreEntryById(context, session_id.id(), WindowOpenDisposition::UNKNOWN); // If the ID is invalid, restored_tabs will be empty. - if (restored_tabs.empty()) { - SetInvalidIdError(session_id.ToString()); - return false; - } + if (restored_tabs.empty()) + return Error(kInvalidSessionIdError, session_id.ToString()); sessions::ContentLiveTab* first_tab = static_cast(restored_tabs[0]); // Retrieve the window through any of the tabs in restored_tabs. if (is_window) { - return SetResultRestoredWindow( + return GetRestoredWindowResult( ExtensionTabUtil::GetWindowIdOfTab(first_tab->web_contents())); } - SetResultRestoredTab(first_tab->web_contents()); - return true; + return GetRestoredTabResult(first_tab->web_contents()); } -bool SessionsRestoreFunction::RestoreForeignSession(const SessionId& session_id, - Browser* browser) { +ExtensionFunction::ResponseValue SessionsRestoreFunction::RestoreForeignSession( + const SessionId& session_id, + Browser* browser) { + Profile* profile = Profile::FromBrowserContext(browser_context()); browser_sync::ProfileSyncService* service = - ProfileSyncServiceFactory::GetInstance()->GetForProfile(GetProfile()); - if (!(service && service->GetPreferredDataTypes().Has(syncer::SESSIONS))) { - SetError(kSessionSyncError); - return false; - } + ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile); + if (!(service && service->GetPreferredDataTypes().Has(syncer::SESSIONS))) + return Error(kSessionSyncError); sync_sessions::OpenTabsUIDelegate* open_tabs = service->GetOpenTabsUIDelegate(); - if (!open_tabs) { - SetError(kSessionSyncError); - return false; - } + if (!open_tabs) + return Error(kSessionSyncError); const sessions::SessionTab* tab = NULL; if (open_tabs->GetForeignTab(session_id.session_tag(), @@ -518,16 +504,13 @@ bool SessionsRestoreFunction::RestoreForeignSession(const SessionId& session_id, content::WebContents* tab_contents = SessionRestore::RestoreForeignSessionTab( contents, *tab, WindowOpenDisposition::NEW_FOREGROUND_TAB); - SetResultRestoredTab(tab_contents); - return true; + return GetRestoredTabResult(tab_contents); } // Restoring a full window. std::vector windows; - if (!open_tabs->GetForeignSession(session_id.session_tag(), &windows)) { - SetInvalidIdError(session_id.ToString()); - return false; - } + if (!open_tabs->GetForeignSession(session_id.session_tag(), &windows)) + return Error(kInvalidSessionIdError, session_id.ToString()); std::vector::const_iterator window = windows.begin(); @@ -535,46 +518,39 @@ bool SessionsRestoreFunction::RestoreForeignSession(const SessionId& session_id, && (*window)->window_id.id() != session_id.id()) { ++window; } - if (window == windows.end()) { - SetInvalidIdError(session_id.ToString()); - return false; - } + if (window == windows.end()) + return Error(kInvalidSessionIdError, session_id.ToString()); // Only restore one window at a time. - std::vector browsers = SessionRestore::RestoreForeignSessionWindows( - GetProfile(), window, window + 1); + std::vector browsers = + SessionRestore::RestoreForeignSessionWindows(profile, window, window + 1); // Will always create one browser because we only restore one window per call. DCHECK_EQ(1u, browsers.size()); - return SetResultRestoredWindow(ExtensionTabUtil::GetWindowId(browsers[0])); + return GetRestoredWindowResult(ExtensionTabUtil::GetWindowId(browsers[0])); } -bool SessionsRestoreFunction::RunSync() { +ExtensionFunction::ResponseAction SessionsRestoreFunction::Run() { std::unique_ptr params(Restore::Params::Create(*args_)); EXTENSION_FUNCTION_VALIDATE(params); - Browser* browser = chrome::FindBrowserWithProfile(GetProfile()); - if (!browser) { - SetError(kNoBrowserToRestoreSession); - return false; - } + Profile* profile = Profile::FromBrowserContext(browser_context()); + Browser* browser = chrome::FindBrowserWithProfile(profile); + if (!browser) + return RespondNow(Error(kNoBrowserToRestoreSession)); - if (GetProfile() != GetProfile()->GetOriginalProfile()) { - SetError(kRestoreInIncognitoError); - return false; - } + if (profile != profile->GetOriginalProfile()) + return RespondNow(Error(kRestoreInIncognitoError)); if (!params->session_id) - return RestoreMostRecentlyClosed(browser); + return RespondNow(RestoreMostRecentlyClosed(browser)); std::unique_ptr session_id(SessionId::Parse(*params->session_id)); - if (!session_id) { - SetInvalidIdError(*params->session_id); - return false; - } + if (!session_id) + return RespondNow(Error(kInvalidSessionIdError, *params->session_id)); - return session_id->IsForeign() ? - RestoreForeignSession(*session_id, browser) - : RestoreLocalSession(*session_id, browser); + return RespondNow(session_id->IsForeign() + ? RestoreForeignSession(*session_id, browser) + : RestoreLocalSession(*session_id, browser)); } SessionsEventRouter::SessionsEventRouter(Profile* profile) diff --git a/chromium/chrome/browser/extensions/api/sessions/sessions_api.h b/chromium/chrome/browser/extensions/api/sessions/sessions_api.h index 6f8480581b6..d859f6434bb 100644 --- a/chromium/chrome/browser/extensions/api/sessions/sessions_api.h +++ b/chromium/chrome/browser/extensions/api/sessions/sessions_api.h @@ -27,10 +27,10 @@ namespace extensions { class SessionId; -class SessionsGetRecentlyClosedFunction : public ChromeSyncExtensionFunction { +class SessionsGetRecentlyClosedFunction : public UIThreadExtensionFunction { protected: ~SessionsGetRecentlyClosedFunction() override {} - bool RunSync() override; + ResponseAction Run() override; DECLARE_EXTENSION_FUNCTION("sessions.getRecentlyClosed", SESSIONS_GETRECENTLYCLOSED) @@ -43,10 +43,10 @@ class SessionsGetRecentlyClosedFunction : public ChromeSyncExtensionFunction { const sessions::TabRestoreService::Entry& entry); }; -class SessionsGetDevicesFunction : public ChromeSyncExtensionFunction { +class SessionsGetDevicesFunction : public UIThreadExtensionFunction { protected: ~SessionsGetDevicesFunction() override {} - bool RunSync() override; + ResponseAction Run() override; DECLARE_EXTENSION_FUNCTION("sessions.getDevices", SESSIONS_GETDEVICES) private: @@ -64,20 +64,20 @@ class SessionsGetDevicesFunction : public ChromeSyncExtensionFunction { const sync_sessions::SyncedSession* session); }; -class SessionsRestoreFunction : public ChromeSyncExtensionFunction { +class SessionsRestoreFunction : public UIThreadExtensionFunction { protected: ~SessionsRestoreFunction() override {} - bool RunSync() override; + ResponseAction Run() override; DECLARE_EXTENSION_FUNCTION("sessions.restore", SESSIONS_RESTORE) private: - void SetInvalidIdError(const std::string& invalid_id); - void SetResultRestoredTab(content::WebContents* contents); - bool SetResultRestoredWindow(int window_id); - bool RestoreMostRecentlyClosed(Browser* browser); - bool RestoreLocalSession(const SessionId& session_id, Browser* browser); - bool RestoreForeignSession(const SessionId& session_id, - Browser* browser); + ResponseValue GetRestoredTabResult(content::WebContents* contents); + ResponseValue GetRestoredWindowResult(int window_id); + ResponseValue RestoreMostRecentlyClosed(Browser* browser); + ResponseValue RestoreLocalSession(const SessionId& session_id, + Browser* browser); + ResponseValue RestoreForeignSession(const SessionId& session_id, + Browser* browser); }; class SessionsEventRouter : public sessions::TabRestoreServiceObserver { diff --git a/chromium/chrome/browser/extensions/api/sessions/sessions_apitest.cc b/chromium/chrome/browser/extensions/api/sessions/sessions_apitest.cc index b510b29b875..9abe2efa2d9 100644 --- a/chromium/chrome/browser/extensions/api/sessions/sessions_apitest.cc +++ b/chromium/chrome/browser/extensions/api/sessions/sessions_apitest.cc @@ -27,12 +27,12 @@ #include "chrome/test/base/testing_browser_process.h" #include "components/browser_sync/profile_sync_service.h" #include "components/browser_sync/profile_sync_service_mock.h" -#include "components/sync/api/attachments/attachment_id.h" -#include "components/sync/api/fake_sync_change_processor.h" -#include "components/sync/api/sync_error_factory_mock.h" -#include "components/sync/core/attachments/attachment_service_proxy_for_test.h" #include "components/sync/device_info/local_device_info_provider_mock.h" #include "components/sync/driver/sync_api_component_factory_mock.h" +#include "components/sync/model/attachments/attachment_id.h" +#include "components/sync/model/attachments/attachment_service_proxy_for_test.h" +#include "components/sync/model/fake_sync_change_processor.h" +#include "components/sync/model/sync_error_factory_mock.h" #include "components/sync_sessions/sessions_sync_manager.h" #include "extensions/browser/api_test_utils.h" @@ -217,11 +217,12 @@ void ExtensionSessionsTest::CreateTestProfileSyncService() { ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse( profile, &ExtensionSessionsTest::BuildProfileSyncService)); - syncer::ModelTypeSet preferred_types; - preferred_types.Put(syncer::SESSIONS); + syncer::ModelTypeSet preferred_types(syncer::SESSIONS, syncer::PROXY_TABS); GoogleServiceAuthError no_error(GoogleServiceAuthError::NONE); ON_CALL(*service, IsDataTypeControllerRunning(syncer::SESSIONS)) .WillByDefault(testing::Return(true)); + ON_CALL(*service, IsDataTypeControllerRunning(syncer::PROXY_TABS)) + .WillByDefault(testing::Return(true)); ON_CALL(*service, GetRegisteredDataTypes()) .WillByDefault(testing::Return(syncer::UserTypes())); ON_CALL(*service, GetPreferredDataTypes()).WillByDefault( diff --git a/chromium/chrome/browser/extensions/api/settings_private/OWNERS b/chromium/chrome/browser/extensions/api/settings_private/OWNERS index 057813143a1..e07a545d3ee 100644 --- a/chromium/chrome/browser/extensions/api/settings_private/OWNERS +++ b/chromium/chrome/browser/extensions/api/settings_private/OWNERS @@ -1,2 +1,3 @@ michaelpg@chromium.org stevenjb@chromium.org +dbeam@chromium.org 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 e64b8ece704..e2f86c70b4a 100644 --- a/chromium/chrome/browser/extensions/api/settings_private/prefs_util.cc +++ b/chromium/chrome/browser/extensions/api/settings_private/prefs_util.cc @@ -7,14 +7,29 @@ #include "build/build_config.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/extensions/chrome_extension_function.h" +#include "chrome/browser/extensions/settings_api_helpers.h" +#include "chrome/browser/prefs/session_startup_pref.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/pref_names.h" +#include "components/autofill/core/common/autofill_pref_names.h" +#include "components/bookmarks/common/bookmark_pref_names.h" +#include "components/browsing_data/core/pref_names.h" +#include "components/content_settings/core/common/pref_names.h" +#include "components/drive/drive_pref_names.h" +#include "components/password_manager/core/common/password_manager_pref_names.h" #include "components/prefs/pref_service.h" #include "components/proxy_config/proxy_config_pref_names.h" +#include "components/safe_browsing_db/safe_browsing_prefs.h" +#include "components/search_engines/search_engines_pref_names.h" +#include "components/spellcheck/browser/pref_names.h" +#include "components/translate/core/browser/translate_prefs.h" +#include "components/translate/core/common/translate_pref_names.h" #include "components/url_formatter/url_fixer.h" #include "extensions/browser/extension_pref_value_map.h" #include "extensions/browser/extension_pref_value_map_factory.h" #include "extensions/browser/extension_registry.h" +#include "extensions/browser/extension_system.h" +#include "extensions/browser/management_policy.h" #include "extensions/common/extension.h" #if defined(OS_CHROMEOS) @@ -59,260 +74,267 @@ const PrefsUtil::TypedPrefMap& PrefsUtil::GetWhitelistedKeys() { static PrefsUtil::TypedPrefMap* s_whitelist = nullptr; if (s_whitelist) return *s_whitelist; - // TODO(dbeam): why aren't we using kPrefName from pref_names.h? s_whitelist = new PrefsUtil::TypedPrefMap(); - (*s_whitelist)["alternate_error_pages.enabled"] = + + // Miscellaneous + (*s_whitelist)[::prefs::kAlternateErrorPagesEnabled] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["autofill.enabled"] = + (*s_whitelist)[autofill::prefs::kAutofillEnabled] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["bookmark_bar.show_on_all_tabs"] = + (*s_whitelist)[bookmarks::prefs::kShowBookmarkBar] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["browser.custom_chrome_frame"] = +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) + (*s_whitelist)[::prefs::kUseCustomChromeFrame] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["browser.show_home_button"] = +#endif + (*s_whitelist)[::prefs::kShowHomeButton] = settings_private::PrefType::PREF_TYPE_BOOLEAN; // Appearance settings. - (*s_whitelist)["extensions.theme.id"] = + (*s_whitelist)[::prefs::kCurrentThemeID] = settings_private::PrefType::PREF_TYPE_STRING; - (*s_whitelist)["webkit.webprefs.default_fixed_font_size"] = +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) + (*s_whitelist)[::prefs::kUsesSystemTheme] = + settings_private::PrefType::PREF_TYPE_BOOLEAN; +#endif + (*s_whitelist)[::prefs::kHomePage] = + settings_private::PrefType::PREF_TYPE_URL; + (*s_whitelist)[::prefs::kHomePageIsNewTabPage] = + settings_private::PrefType::PREF_TYPE_BOOLEAN; + (*s_whitelist)[::prefs::kWebKitDefaultFixedFontSize] = settings_private::PrefType::PREF_TYPE_NUMBER; - (*s_whitelist)["webkit.webprefs.default_font_size"] = + (*s_whitelist)[::prefs::kWebKitDefaultFontSize] = settings_private::PrefType::PREF_TYPE_NUMBER; - (*s_whitelist)["webkit.webprefs.minimum_font_size"] = + (*s_whitelist)[::prefs::kWebKitMinimumFontSize] = settings_private::PrefType::PREF_TYPE_NUMBER; - (*s_whitelist)["webkit.webprefs.fonts.fixed.Zyyy"] = + (*s_whitelist)[::prefs::kWebKitFixedFontFamily] = settings_private::PrefType::PREF_TYPE_STRING; - (*s_whitelist)["webkit.webprefs.fonts.sansserif.Zyyy"] = + (*s_whitelist)[::prefs::kWebKitSansSerifFontFamily] = settings_private::PrefType::PREF_TYPE_STRING; - (*s_whitelist)["webkit.webprefs.fonts.serif.Zyyy"] = + (*s_whitelist)[::prefs::kWebKitSerifFontFamily] = settings_private::PrefType::PREF_TYPE_STRING; - (*s_whitelist)["webkit.webprefs.fonts.standard.Zyyy"] = + (*s_whitelist)[::prefs::kWebKitStandardFontFamily] = settings_private::PrefType::PREF_TYPE_STRING; - (*s_whitelist)["intl.charset_default"] = + (*s_whitelist)[::prefs::kDefaultCharset] = settings_private::PrefType::PREF_TYPE_STRING; + // On startup. + (*s_whitelist)[::prefs::kRestoreOnStartup] = + settings_private::PrefType::PREF_TYPE_NUMBER; + (*s_whitelist)[::prefs::kURLsToRestoreOnStartup] = + settings_private::PrefType::PREF_TYPE_LIST; + // Downloads settings. - (*s_whitelist)["download.default_directory"] = + (*s_whitelist)[::prefs::kDownloadDefaultDirectory] = settings_private::PrefType::PREF_TYPE_STRING; - (*s_whitelist)["download.prompt_for_download"] = + (*s_whitelist)[::prefs::kPromptForDownload] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["gdata.disabled"] = + (*s_whitelist)[drive::prefs::kDisableDrive] = settings_private::PrefType::PREF_TYPE_BOOLEAN; // Printing settings. - (*s_whitelist)["local_discovery.notifications_enabled"] = + (*s_whitelist)[::prefs::kLocalDiscoveryNotificationsEnabled] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["enable_do_not_track"] = - settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["homepage"] = settings_private::PrefType::PREF_TYPE_URL; - (*s_whitelist)["homepage_is_newtabpage"] = + // Miscellaneous. TODO(stevenjb): categorize. + (*s_whitelist)[::prefs::kEnableDoNotTrack] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["intl.app_locale"] = + (*s_whitelist)[::prefs::kApplicationLocale] = settings_private::PrefType::PREF_TYPE_STRING; - (*s_whitelist)["net.network_prediction_options"] = + (*s_whitelist)[::prefs::kNetworkPredictionOptions] = settings_private::PrefType::PREF_TYPE_NUMBER; - (*s_whitelist)["profile.password_manager_enabled"] = + (*s_whitelist)[password_manager::prefs::kPasswordManagerSavingEnabled] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["credentials_enable_autosignin"] = + (*s_whitelist)[password_manager::prefs::kCredentialsEnableAutosignin] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["safebrowsing.enabled"] = + (*s_whitelist)[::prefs::kSafeBrowsingEnabled] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["safebrowsing.extended_reporting_enabled"] = + (*s_whitelist)[::prefs::kSafeBrowsingExtendedReportingEnabled] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["search.suggest_enabled"] = + (*s_whitelist)[::prefs::kSearchSuggestEnabled] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["session.restore_on_startup"] = - settings_private::PrefType::PREF_TYPE_NUMBER; - (*s_whitelist)["session.startup_urls"] = + (*s_whitelist)[spellcheck::prefs::kSpellCheckDictionaries] = settings_private::PrefType::PREF_TYPE_LIST; - (*s_whitelist)["spellcheck.dictionaries"] = - settings_private::PrefType::PREF_TYPE_LIST; - (*s_whitelist)["spellcheck.use_spelling_service"] = + (*s_whitelist)[spellcheck::prefs::kSpellCheckUseSpellingService] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["translate.enabled"] = + (*s_whitelist)[::prefs::kEnableTranslate] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["translate_blocked_languages"] = + (*s_whitelist)[translate::TranslatePrefs::kPrefTranslateBlockedLanguages] = settings_private::PrefType::PREF_TYPE_LIST; // Site Settings prefs. - (*s_whitelist)["profile.block_third_party_cookies"] = + (*s_whitelist)[::prefs::kBlockThirdPartyCookies] = + settings_private::PrefType::PREF_TYPE_BOOLEAN; + (*s_whitelist)[::prefs::kPluginsAlwaysOpenPdfExternally] = settings_private::PrefType::PREF_TYPE_BOOLEAN; // Clear browsing data settings. - (*s_whitelist)["browser.clear_data.browsing_history"] = + (*s_whitelist)[browsing_data::prefs::kDeleteBrowsingHistory] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["browser.clear_data.download_history"] = + (*s_whitelist)[browsing_data::prefs::kDeleteDownloadHistory] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["browser.clear_data.cache"] = + (*s_whitelist)[browsing_data::prefs::kDeleteCache] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["browser.clear_data.cookies"] = + (*s_whitelist)[browsing_data::prefs::kDeleteCookies] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["browser.clear_data.passwords"] = + (*s_whitelist)[browsing_data::prefs::kDeletePasswords] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["browser.clear_data.form_data"] = + (*s_whitelist)[browsing_data::prefs::kDeleteFormData] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["browser.clear_data.hosted_apps_data"] = + (*s_whitelist)[browsing_data::prefs::kDeleteHostedAppsData] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["browser.clear_data.media_licenses"] = + (*s_whitelist)[browsing_data::prefs::kDeleteMediaLicenses] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["browser.clear_data.time_period"] = - settings_private::PrefType::PREF_TYPE_NUMBER; - (*s_whitelist)["profile.default_content_setting_values.cookies"] = + (*s_whitelist)[browsing_data::prefs::kDeleteTimePeriod] = settings_private::PrefType::PREF_TYPE_NUMBER; - (*s_whitelist)["profile.default_content_setting_values.fullscreen"] = - settings_private::PrefType::PREF_TYPE_NUMBER; - (*s_whitelist)["profile.default_content_setting_values.geolocation"] = - settings_private::PrefType::PREF_TYPE_NUMBER; - (*s_whitelist)["profile.default_content_setting_values.images"] = - settings_private::PrefType::PREF_TYPE_NUMBER; - (*s_whitelist)["profile.default_content_setting_values.javascript"] = - settings_private::PrefType::PREF_TYPE_NUMBER; - (*s_whitelist)["profile.default_content_setting_values.media_stream_camera"] = - settings_private::PrefType::PREF_TYPE_NUMBER; - (*s_whitelist)["profile.default_content_setting_values.media_stream_mic"] = - settings_private::PrefType::PREF_TYPE_NUMBER; - (*s_whitelist)["profile.default_content_setting_values.notifications"] = - settings_private::PrefType::PREF_TYPE_NUMBER; - (*s_whitelist)["profile.default_content_setting_values.popups"] = - settings_private::PrefType::PREF_TYPE_NUMBER; - (*s_whitelist)["profile.content_settings.exceptions.cookies"] = - settings_private::PrefType::PREF_TYPE_DICTIONARY; - (*s_whitelist)["profile.content_settings.exceptions.fullscreen"] = - settings_private::PrefType::PREF_TYPE_DICTIONARY; - (*s_whitelist)["profile.content_settings.exceptions.geolocation"] = - settings_private::PrefType::PREF_TYPE_DICTIONARY; - (*s_whitelist)["profile.content_settings.exceptions.images"] = - settings_private::PrefType::PREF_TYPE_DICTIONARY; - (*s_whitelist)["profile.content_settings.exceptions.javascript"] = - settings_private::PrefType::PREF_TYPE_DICTIONARY; - (*s_whitelist)["profile.content_settings.exceptions.media_stream_camera"] = - settings_private::PrefType::PREF_TYPE_DICTIONARY; - (*s_whitelist)["profile.content_settings.exceptions.media_stream_mic"] = - settings_private::PrefType::PREF_TYPE_DICTIONARY; - (*s_whitelist)["profile.content_settings.exceptions.notifications"] = - settings_private::PrefType::PREF_TYPE_DICTIONARY; - (*s_whitelist)["profile.content_settings.exceptions.popups"] = - settings_private::PrefType::PREF_TYPE_DICTIONARY; #if defined(OS_CHROMEOS) - (*s_whitelist)["cros.accounts.allowBWSI"] = + // Accounts / Users / People. + (*s_whitelist)[chromeos::kAccountsPrefAllowGuest] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["cros.accounts.supervisedUsersEnabled"] = + (*s_whitelist)[chromeos::kAccountsPrefSupervisedUsersEnabled] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["cros.accounts.showUserNamesOnSignIn"] = + (*s_whitelist)[chromeos::kAccountsPrefShowUserNamesOnSignIn] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["cros.accounts.allowGuest"] = + (*s_whitelist)[chromeos::kAccountsPrefAllowNewUser] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["cros.accounts.users"] = + (*s_whitelist)[chromeos::kAccountsPrefUsers] = settings_private::PrefType::PREF_TYPE_LIST; - (*s_whitelist)["settings.accessibility"] = + (*s_whitelist)[::prefs::kEnableAutoScreenLock] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["settings.a11y.autoclick"] = + + // Accessibility. + (*s_whitelist)[::prefs::kAccessibilitySpokenFeedbackEnabled] = + settings_private::PrefType::PREF_TYPE_BOOLEAN; + (*s_whitelist)[::prefs::kAccessibilityAutoclickEnabled] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["settings.a11y.autoclick_delay_ms"] = + (*s_whitelist)[::prefs::kAccessibilityAutoclickDelayMs] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["settings.a11y.caret_highlight"] = + (*s_whitelist)[::prefs::kAccessibilityCaretHighlightEnabled] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["settings.a11y.cursor_highlight"] = + (*s_whitelist)[::prefs::kAccessibilityCursorHighlightEnabled] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["settings.a11y.enable_menu"] = + (*s_whitelist)[::prefs::kShouldAlwaysShowAccessibilityMenu] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["settings.a11y.focus_highlight"] = + (*s_whitelist)[::prefs::kAccessibilityFocusHighlightEnabled] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["settings.a11y.high_contrast_enabled"] = + (*s_whitelist)[::prefs::kAccessibilityHighContrastEnabled] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["settings.a11y.large_cursor_enabled"] = + (*s_whitelist)[::prefs::kAccessibilityLargeCursorEnabled] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["settings.a11y.screen_magnifier"] = + (*s_whitelist)[::prefs::kAccessibilityScreenMagnifierEnabled] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["settings.a11y.select_to_speak"] = + (*s_whitelist)[::prefs::kAccessibilitySelectToSpeakEnabled] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["settings.a11y.sticky_keys_enabled"] = + (*s_whitelist)[::prefs::kAccessibilityStickyKeysEnabled] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["settings.a11y.switch_access"] = + (*s_whitelist)[::prefs::kAccessibilitySwitchAccessEnabled] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["settings.a11y.virtual_keyboard"] = + (*s_whitelist)[::prefs::kAccessibilityVirtualKeyboardEnabled] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["settings.a11y.mono_audio"] = + (*s_whitelist)[::prefs::kAccessibilityMonoAudioEnabled] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["settings.clock.use_24hour_clock"] = + + // Misc. + (*s_whitelist)[::prefs::kUse24HourClock] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["settings.language.preferred_languages"] = + (*s_whitelist)[::prefs::kLanguagePreferredLanguages] = settings_private::PrefType::PREF_TYPE_STRING; - (*s_whitelist)["settings.touchpad.enable_tap_dragging"] = + (*s_whitelist)[::prefs::kTapDraggingEnabled] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["cros.metrics.reportingEnabled"] = + (*s_whitelist)[chromeos::kStatsReportingPref] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["cros.device.allow_bluetooth"] = + (*s_whitelist)[chromeos::kAttestationForContentProtectionEnabled] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["cros.device.attestation_for_content_protection_enabled"] = + + // Bluetooth & Internet settings. + (*s_whitelist)[chromeos::kAllowBluetooth] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["settings.internet.wake_on_wifi_darkconnect"] = + (*s_whitelist)[proxy_config::prefs::kUseSharedProxies] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["settings.enable_screen_lock"] = + (*s_whitelist)[::prefs::kWakeOnWifiDarkConnect] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - // Time zone settings. - (*s_whitelist)["settings.resolve_timezone_by_geolocation"] = + // Timezone settings. + (*s_whitelist)[chromeos::kSystemTimezone] = + settings_private::PrefType::PREF_TYPE_BOOLEAN; + (*s_whitelist)[::prefs::kResolveTimezoneByGeolocation] = settings_private::PrefType::PREF_TYPE_BOOLEAN; // Ash settings. - (*s_whitelist)["settings.enable_stylus_tools"] = + (*s_whitelist)[::prefs::kEnableStylusTools] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["settings.launch_palette_on_eject_event"] = + (*s_whitelist)[::prefs::kLaunchPaletteOnEjectEvent] = settings_private::PrefType::PREF_TYPE_BOOLEAN; // Input method settings. - (*s_whitelist)["settings.language.preload_engines"] = + (*s_whitelist)[::prefs::kLanguagePreloadEngines] = settings_private::PrefType::PREF_TYPE_STRING; - (*s_whitelist)["settings.language.enabled_extension_imes"] = + (*s_whitelist)[::prefs::kLanguageEnabledExtensionImes] = settings_private::PrefType::PREF_TYPE_STRING; // Device settings. - (*s_whitelist)["settings.touchpad.enable_tap_to_click"] = + (*s_whitelist)[::prefs::kTapToClickEnabled] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["settings.touchpad.natural_scroll"] = + (*s_whitelist)[::prefs::kNaturalScroll] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["settings.touchpad.sensitivity2"] = + (*s_whitelist)[::prefs::kTouchpadSensitivity] = settings_private::PrefType::PREF_TYPE_NUMBER; - (*s_whitelist)["settings.mouse.primary_right"] = + (*s_whitelist)[::prefs::kPrimaryMouseButtonRight] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["settings.mouse.sensitivity2"] = + (*s_whitelist)[::prefs::kMouseSensitivity] = + settings_private::PrefType::PREF_TYPE_NUMBER; + (*s_whitelist)[::prefs::kLanguageRemapSearchKeyTo] = settings_private::PrefType::PREF_TYPE_NUMBER; - (*s_whitelist)["settings.language.xkb_remap_search_key_to"] = + (*s_whitelist)[::prefs::kLanguageRemapControlKeyTo] = settings_private::PrefType::PREF_TYPE_NUMBER; - (*s_whitelist)["settings.language.xkb_remap_control_key_to"] = + (*s_whitelist)[::prefs::kLanguageRemapAltKeyTo] = settings_private::PrefType::PREF_TYPE_NUMBER; - (*s_whitelist)["settings.language.xkb_remap_alt_key_to"] = + (*s_whitelist)[::prefs::kLanguageRemapCapsLockKeyTo] = settings_private::PrefType::PREF_TYPE_NUMBER; - (*s_whitelist)["settings.language.remap_caps_lock_key_to"] = + (*s_whitelist)[::prefs::kLanguageRemapBackspaceKeyTo] = settings_private::PrefType::PREF_TYPE_NUMBER; - (*s_whitelist)["settings.language.remap_diamond_key_to"] = + (*s_whitelist)[::prefs::kLanguageRemapEscapeKeyTo] = settings_private::PrefType::PREF_TYPE_NUMBER; - (*s_whitelist)["settings.language.send_function_keys"] = + (*s_whitelist)[::prefs::kLanguageRemapDiamondKeyTo] = + settings_private::PrefType::PREF_TYPE_NUMBER; + (*s_whitelist)[::prefs::kLanguageSendFunctionKeys] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["settings.language.xkb_auto_repeat_enabled_r2"] = + (*s_whitelist)[::prefs::kLanguageXkbAutoRepeatEnabled] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["settings.language.xkb_auto_repeat_delay_r2"] = + (*s_whitelist)[::prefs::kLanguageXkbAutoRepeatDelay] = settings_private::PrefType::PREF_TYPE_NUMBER; - (*s_whitelist)["settings.language.xkb_auto_repeat_interval_r2"] = + (*s_whitelist)[::prefs::kLanguageXkbAutoRepeatInterval] = settings_private::PrefType::PREF_TYPE_NUMBER; #else - (*s_whitelist)["intl.accept_languages"] = + (*s_whitelist)[::prefs::kAcceptLanguages] = settings_private::PrefType::PREF_TYPE_STRING; // System settings. - (*s_whitelist)["background_mode.enabled"] = + (*s_whitelist)[::prefs::kBackgroundModeEnabled] = + settings_private::PrefType::PREF_TYPE_BOOLEAN; + (*s_whitelist)[::prefs::kHardwareAccelerationModeEnabled] = + settings_private::PrefType::PREF_TYPE_BOOLEAN; + + // Import data + (*s_whitelist)[::prefs::kImportAutofillFormData] = + settings_private::PrefType::PREF_TYPE_BOOLEAN; + (*s_whitelist)[::prefs::kImportBookmarks] = + settings_private::PrefType::PREF_TYPE_BOOLEAN; + (*s_whitelist)[::prefs::kImportHistory] = + settings_private::PrefType::PREF_TYPE_BOOLEAN; + (*s_whitelist)[::prefs::kImportSavedPasswords] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["hardware_acceleration_mode.enabled"] = + (*s_whitelist)[::prefs::kImportSearchEngine] = settings_private::PrefType::PREF_TYPE_BOOLEAN; - (*s_whitelist)["proxy"] = settings_private::PrefType::PREF_TYPE_DICTIONARY; #endif + // Proxy settings. + (*s_whitelist)[proxy_config::prefs::kProxy] = + settings_private::PrefType::PREF_TYPE_DICTIONARY; + #if defined(GOOGLE_CHROME_BUILD) - (*s_whitelist)["media_router.cloudservices.enabled"] = + (*s_whitelist)[::prefs::kMediaRouterEnableCloudServices] = settings_private::PrefType::PREF_TYPE_BOOLEAN; #endif // defined(GOOGLE_CHROME_BUILD) @@ -374,37 +396,42 @@ std::unique_ptr PrefsUtil::GetPref( #if defined(OS_CHROMEOS) if (IsPrefPrimaryUserControlled(name)) { - pref_object->policy_source = - settings_private::PolicySource::POLICY_SOURCE_PRIMARY_USER; - pref_object->policy_enforcement = - settings_private::PolicyEnforcement::POLICY_ENFORCEMENT_ENFORCED; - pref_object->policy_source_name.reset(new std::string( - user_manager::UserManager::Get()->GetPrimaryUser()->email())); + pref_object->controlled_by = + settings_private::ControlledBy::CONTROLLED_BY_PRIMARY_USER; + pref_object->enforcement = + settings_private::Enforcement::ENFORCEMENT_ENFORCED; + pref_object->controlled_by_name.reset( + new std::string(user_manager::UserManager::Get() + ->GetPrimaryUser() + ->GetAccountId() + .GetUserEmail())); return pref_object; } + if (IsPrefEnterpriseManaged(name)) { // Enterprise managed prefs are treated the same as device policy restricted // prefs in the UI. - pref_object->policy_source = - settings_private::PolicySource::POLICY_SOURCE_DEVICE_POLICY; - pref_object->policy_enforcement = - settings_private::PolicyEnforcement::POLICY_ENFORCEMENT_ENFORCED; + pref_object->controlled_by = + settings_private::ControlledBy::CONTROLLED_BY_DEVICE_POLICY; + pref_object->enforcement = + settings_private::Enforcement::ENFORCEMENT_ENFORCED; return pref_object; } #endif if (pref && pref->IsManaged()) { - pref_object->policy_source = - settings_private::PolicySource::POLICY_SOURCE_USER_POLICY; - pref_object->policy_enforcement = - settings_private::PolicyEnforcement::POLICY_ENFORCEMENT_ENFORCED; + pref_object->controlled_by = + settings_private::ControlledBy::CONTROLLED_BY_USER_POLICY; + pref_object->enforcement = + settings_private::Enforcement::ENFORCEMENT_ENFORCED; return pref_object; } + if (pref && pref->IsRecommended()) { - pref_object->policy_source = - settings_private::PolicySource::POLICY_SOURCE_USER_POLICY; - pref_object->policy_enforcement = - settings_private::PolicyEnforcement::POLICY_ENFORCEMENT_RECOMMENDED; + pref_object->controlled_by = + settings_private::ControlledBy::CONTROLLED_BY_USER_POLICY; + pref_object->enforcement = + settings_private::Enforcement::ENFORCEMENT_RECOMMENDED; pref_object->recommended_value.reset( pref->GetRecommendedValue()->DeepCopy()); return pref_object; @@ -416,38 +443,32 @@ std::unique_ptr PrefsUtil::GetPref( // device policy there is no "owner". (In the unlikely case that both // situations apply, either badge is potentially relevant, so the order // is somewhat arbitrary). - pref_object->policy_source = - settings_private::PolicySource::POLICY_SOURCE_OWNER; - pref_object->policy_enforcement = - settings_private::PolicyEnforcement::POLICY_ENFORCEMENT_ENFORCED; - pref_object->policy_source_name.reset(new std::string( + pref_object->controlled_by = + settings_private::ControlledBy::CONTROLLED_BY_OWNER; + pref_object->enforcement = + settings_private::Enforcement::ENFORCEMENT_ENFORCED; + pref_object->controlled_by_name.reset(new std::string( user_manager::UserManager::Get()->GetOwnerAccountId().GetUserEmail())); return pref_object; } #endif - if (pref && pref->IsExtensionControlled()) { - std::string extension_id = - ExtensionPrefValueMapFactory::GetForBrowserContext(profile_) - ->GetExtensionControllingPref(pref->name()); - const Extension* extension = ExtensionRegistry::Get(profile_)-> - GetExtensionById(extension_id, ExtensionRegistry::ENABLED); - if (extension) { - pref_object->policy_source = - settings_private::PolicySource::POLICY_SOURCE_EXTENSION; - pref_object->policy_enforcement = - settings_private::PolicyEnforcement::POLICY_ENFORCEMENT_ENFORCED; - pref_object->extension_id.reset(new std::string(extension_id)); - pref_object->policy_source_name.reset(new std::string(extension->name())); - return pref_object; - } - } - if (pref && (!pref->IsUserModifiable() || IsPrefSupervisorControlled(name))) { - // TODO(stevenjb): Investigate whether either of these should be badged. - pref_object->read_only.reset(new bool(true)); + const Extension* extension = GetExtensionControllingPref(*pref_object); + if (extension) { + pref_object->controlled_by = + settings_private::ControlledBy::CONTROLLED_BY_EXTENSION; + pref_object->enforcement = + settings_private::Enforcement::ENFORCEMENT_ENFORCED; + pref_object->extension_id.reset(new std::string(extension->id())); + pref_object->controlled_by_name.reset(new std::string(extension->name())); + bool can_be_disabled = !ExtensionSystem::Get(profile_)->management_policy() + ->MustRemainEnabled(extension, nullptr); + pref_object->extension_can_be_disabled.reset(new bool(can_be_disabled)); return pref_object; } + // TODO(dbeam): surface !IsUserModifiable or IsPrefSupervisorControlled? + return pref_object; } @@ -603,7 +624,8 @@ bool PrefsUtil::IsPrefPrimaryUserControlled(const std::string& pref_name) { user_manager::UserManager* user_manager = user_manager::UserManager::Get(); const user_manager::User* user = chromeos::ProfileHelper::Get()->GetUserByProfile(profile_); - if (user && user->email() != user_manager->GetPrimaryUser()->email()) + if (user && + user->GetAccountId() != user_manager->GetPrimaryUser()->GetAccountId()) return true; } return false; @@ -668,4 +690,19 @@ bool PrefsUtil::IsCrosSetting(const std::string& pref_name) { #endif } +const Extension* PrefsUtil::GetExtensionControllingPref( + const settings_private::PrefObject& pref_object) { + // Look for specific prefs that might be extension controlled. This generally + // corresponds with some indiciator that should be shown in the settings UI. + if (pref_object.key == ::prefs::kHomePage) + return GetExtensionOverridingHomepage(profile_); + if (pref_object.key == ::prefs::kURLsToRestoreOnStartup) + return GetExtensionOverridingStartupPages(profile_); + if (pref_object.key == ::prefs::kDefaultSearchProviderEnabled) + return GetExtensionOverridingSearchEngine(profile_); + if (pref_object.key == proxy_config::prefs::kProxy) + return GetExtensionOverridingProxy(profile_); + return nullptr; +} + } // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/settings_private/prefs_util.h b/chromium/chrome/browser/extensions/api/settings_private/prefs_util.h index 321a5c9e88f..a2f229e0862 100644 --- a/chromium/chrome/browser/extensions/api/settings_private/prefs_util.h +++ b/chromium/chrome/browser/extensions/api/settings_private/prefs_util.h @@ -17,6 +17,7 @@ class PrefService; class Profile; namespace extensions { +class Extension; class PrefsUtil { @@ -102,6 +103,10 @@ class PrefsUtil { SetPrefResult SetCrosSettingsPref(const std::string& name, const base::Value* value); + private: + const Extension* GetExtensionControllingPref( + const api::settings_private::PrefObject& pref_object); + Profile* profile_; // weak }; diff --git a/chromium/chrome/browser/extensions/api/settings_private/settings_private_api.cc b/chromium/chrome/browser/extensions/api/settings_private/settings_private_api.cc index e2b23743721..a73f78f8d83 100644 --- a/chromium/chrome/browser/extensions/api/settings_private/settings_private_api.cc +++ b/chromium/chrome/browser/extensions/api/settings_private/settings_private_api.cc @@ -106,37 +106,36 @@ ExtensionFunction::ResponseAction SettingsPrivateGetPrefFunction::Run() { } //////////////////////////////////////////////////////////////////////////////// -// SettingsPrivateGetDefaultZoomPercentFunction +// SettingsPrivateGetDefaultZoomFunction //////////////////////////////////////////////////////////////////////////////// -SettingsPrivateGetDefaultZoomPercentFunction:: - ~SettingsPrivateGetDefaultZoomPercentFunction() { +SettingsPrivateGetDefaultZoomFunction:: + ~SettingsPrivateGetDefaultZoomFunction() { } ExtensionFunction::ResponseAction - SettingsPrivateGetDefaultZoomPercentFunction::Run() { + SettingsPrivateGetDefaultZoomFunction::Run() { SettingsPrivateDelegate* delegate = SettingsPrivateDelegateFactory::GetForBrowserContext(browser_context()); if (delegate == nullptr) return RespondNow(Error(kDelegateIsNull)); else - return RespondNow(OneArgument(delegate->GetDefaultZoomPercent())); + return RespondNow(OneArgument(delegate->GetDefaultZoom())); } //////////////////////////////////////////////////////////////////////////////// -// SettingsPrivateSetDefaultZoomPercentFunction +// SettingsPrivateSetDefaultZoomFunction //////////////////////////////////////////////////////////////////////////////// -SettingsPrivateSetDefaultZoomPercentFunction:: - ~SettingsPrivateSetDefaultZoomPercentFunction() { +SettingsPrivateSetDefaultZoomFunction:: + ~SettingsPrivateSetDefaultZoomFunction() { } ExtensionFunction::ResponseAction - SettingsPrivateSetDefaultZoomPercentFunction::Run() { - std::unique_ptr - parameters = - api::settings_private::SetDefaultZoomPercent::Params::Create(*args_); + SettingsPrivateSetDefaultZoomFunction::Run() { + std::unique_ptr parameters = + api::settings_private::SetDefaultZoom::Params::Create(*args_); EXTENSION_FUNCTION_VALIDATE(parameters.get()); SettingsPrivateDelegate* delegate = @@ -144,7 +143,7 @@ ExtensionFunction::ResponseAction if (delegate == nullptr) return RespondNow(Error(kDelegateIsNull)); - delegate->SetDefaultZoomPercent(parameters->percent); + delegate->SetDefaultZoom(parameters->zoom); return RespondNow( OneArgument(base::MakeUnique(true))); } diff --git a/chromium/chrome/browser/extensions/api/settings_private/settings_private_api.h b/chromium/chrome/browser/extensions/api/settings_private/settings_private_api.h index 07a03ece7f6..e61e09a458a 100644 --- a/chromium/chrome/browser/extensions/api/settings_private/settings_private_api.h +++ b/chromium/chrome/browser/extensions/api/settings_private/settings_private_api.h @@ -60,38 +60,38 @@ class SettingsPrivateGetPrefFunction : public UIThreadExtensionFunction { DISALLOW_COPY_AND_ASSIGN(SettingsPrivateGetPrefFunction); }; -// Implements the chrome.settingsPrivate.getDefaultZoomPercent method. -class SettingsPrivateGetDefaultZoomPercentFunction +// Implements the chrome.settingsPrivate.getDefaultZoom method. +class SettingsPrivateGetDefaultZoomFunction : public UIThreadExtensionFunction { public: - SettingsPrivateGetDefaultZoomPercentFunction() {} - DECLARE_EXTENSION_FUNCTION("settingsPrivate.getDefaultZoomPercent", - SETTINGSPRIVATE_GETDEFAULTZOOMPERCENTFUNCTION); + SettingsPrivateGetDefaultZoomFunction() {} + DECLARE_EXTENSION_FUNCTION("settingsPrivate.getDefaultZoom", + SETTINGSPRIVATE_GETDEFAULTZOOMFUNCTION); protected: - ~SettingsPrivateGetDefaultZoomPercentFunction() override; + ~SettingsPrivateGetDefaultZoomFunction() override; // AsyncExtensionFunction overrides. ResponseAction Run() override; - DISALLOW_COPY_AND_ASSIGN(SettingsPrivateGetDefaultZoomPercentFunction); + DISALLOW_COPY_AND_ASSIGN(SettingsPrivateGetDefaultZoomFunction); }; -// Implements the chrome.settingsPrivate.setDefaultZoomPercent method. -class SettingsPrivateSetDefaultZoomPercentFunction +// Implements the chrome.settingsPrivate.setDefaultZoom method. +class SettingsPrivateSetDefaultZoomFunction : public UIThreadExtensionFunction { public: - SettingsPrivateSetDefaultZoomPercentFunction() {} - DECLARE_EXTENSION_FUNCTION("settingsPrivate.setDefaultZoomPercent", - SETTINGSPRIVATE_SETDEFAULTZOOMPERCENTFUNCTION); + SettingsPrivateSetDefaultZoomFunction() {} + DECLARE_EXTENSION_FUNCTION("settingsPrivate.setDefaultZoom", + SETTINGSPRIVATE_SETDEFAULTZOOMFUNCTION); protected: - ~SettingsPrivateSetDefaultZoomPercentFunction() override; + ~SettingsPrivateSetDefaultZoomFunction() override; // AsyncExtensionFunction overrides. ResponseAction Run() override; - DISALLOW_COPY_AND_ASSIGN(SettingsPrivateSetDefaultZoomPercentFunction); + DISALLOW_COPY_AND_ASSIGN(SettingsPrivateSetDefaultZoomFunction); }; } // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc b/chromium/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc index 1b5f72ea522..13ed8a8ddbe 100644 --- a/chromium/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc +++ b/chromium/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc @@ -58,16 +58,16 @@ PrefsUtil::SetPrefResult SettingsPrivateDelegate::SetPref( return prefs_util_->SetPref(pref_name, value); } -std::unique_ptr SettingsPrivateDelegate::GetDefaultZoomPercent() { +std::unique_ptr SettingsPrivateDelegate::GetDefaultZoom() { double zoom = content::ZoomLevelToZoomFactor( - profile_->GetZoomLevelPrefs()->GetDefaultZoomLevelPref()) * 100; + profile_->GetZoomLevelPrefs()->GetDefaultZoomLevelPref()); std::unique_ptr value(new base::FundamentalValue(zoom)); return value; } -PrefsUtil::SetPrefResult SettingsPrivateDelegate::SetDefaultZoomPercent( - int percent) { - double zoom_factor = content::ZoomFactorToZoomLevel(percent * 0.01); +PrefsUtil::SetPrefResult SettingsPrivateDelegate::SetDefaultZoom( + double zoom) { + double zoom_factor = content::ZoomFactorToZoomLevel(zoom); profile_->GetZoomLevelPrefs()->SetDefaultZoomLevelPref(zoom_factor); return PrefsUtil::SetPrefResult::SUCCESS; } diff --git a/chromium/chrome/browser/extensions/api/settings_private/settings_private_delegate.h b/chromium/chrome/browser/extensions/api/settings_private/settings_private_delegate.h index 66c71532ebd..752c2f005e1 100644 --- a/chromium/chrome/browser/extensions/api/settings_private/settings_private_delegate.h +++ b/chromium/chrome/browser/extensions/api/settings_private/settings_private_delegate.h @@ -45,10 +45,10 @@ class SettingsPrivateDelegate : public KeyedService { virtual std::unique_ptr GetAllPrefs(); // Gets the value. - virtual std::unique_ptr GetDefaultZoomPercent(); + virtual std::unique_ptr GetDefaultZoom(); // Sets the pref. - virtual PrefsUtil::SetPrefResult SetDefaultZoomPercent(int percent); + virtual PrefsUtil::SetPrefResult SetDefaultZoom(double zoom); protected: Profile* profile_; // weak; not owned by us diff --git a/chromium/chrome/browser/extensions/api/settings_private/settings_private_delegate_factory.cc b/chromium/chrome/browser/extensions/api/settings_private/settings_private_delegate_factory.cc index fc56bc34f9f..e855cac044a 100644 --- a/chromium/chrome/browser/extensions/api/settings_private/settings_private_delegate_factory.cc +++ b/chromium/chrome/browser/extensions/api/settings_private/settings_private_delegate_factory.cc @@ -6,6 +6,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/extensions/api/settings_private/settings_private_delegate.h" +#include "chrome/browser/profiles/incognito_helpers.h" #include "chrome/browser/profiles/profile.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" #include "extensions/browser/extension_system_provider.h" @@ -35,6 +36,14 @@ SettingsPrivateDelegateFactory::SettingsPrivateDelegateFactory() SettingsPrivateDelegateFactory::~SettingsPrivateDelegateFactory() { } +content::BrowserContext* SettingsPrivateDelegateFactory::GetBrowserContextToUse( + content::BrowserContext* context) const { + // Use the incognito profile when in Guest mode. + if (context->IsOffTheRecord()) + return chrome::GetBrowserContextRedirectedInIncognito(context); + return context; +} + KeyedService* SettingsPrivateDelegateFactory::BuildServiceInstanceFor( content::BrowserContext* profile) const { return new SettingsPrivateDelegate(static_cast(profile)); diff --git a/chromium/chrome/browser/extensions/api/settings_private/settings_private_delegate_factory.h b/chromium/chrome/browser/extensions/api/settings_private/settings_private_delegate_factory.h index 3564810082c..a69bf7f7c18 100644 --- a/chromium/chrome/browser/extensions/api/settings_private/settings_private_delegate_factory.h +++ b/chromium/chrome/browser/extensions/api/settings_private/settings_private_delegate_factory.h @@ -34,6 +34,8 @@ class SettingsPrivateDelegateFactory // BrowserContextKeyedBaseFactory implementation. KeyedService* BuildServiceInstanceFor( content::BrowserContext* profile) const override; + content::BrowserContext* GetBrowserContextToUse( + content::BrowserContext* context) const override; DISALLOW_COPY_AND_ASSIGN(SettingsPrivateDelegateFactory); }; diff --git a/chromium/chrome/browser/extensions/api/settings_private/settings_private_event_router.cc b/chromium/chrome/browser/extensions/api/settings_private/settings_private_event_router.cc index 4b0db6660fe..f42e2ef98f9 100644 --- a/chromium/chrome/browser/extensions/api/settings_private/settings_private_event_router.cc +++ b/chromium/chrome/browser/extensions/api/settings_private/settings_private_event_router.cc @@ -94,15 +94,13 @@ void SettingsPrivateEventRouter::StartOrStopListeningForPrefsChanges() { std::string pref_name = it.first; if (prefs_util_->IsCrosSetting(pref_name)) { #if defined(OS_CHROMEOS) - std::unique_ptr observer = - chromeos::CrosSettings::Get()->AddSettingsObserver( + std::unique_ptr + subscription = chromeos::CrosSettings::Get()->AddSettingsObserver( pref_name.c_str(), base::Bind(&SettingsPrivateEventRouter::OnPreferenceChanged, base::Unretained(this), pref_name)); - linked_ptr subscription( - observer.release()); cros_settings_subscription_map_.insert( - make_pair(pref_name, subscription)); + make_pair(pref_name, std::move(subscription))); #endif } else { FindRegistrarForPref(it.first) diff --git a/chromium/chrome/browser/extensions/api/settings_private/settings_private_event_router.h b/chromium/chrome/browser/extensions/api/settings_private/settings_private_event_router.h index 7738b978a72..06477b50893 100644 --- a/chromium/chrome/browser/extensions/api/settings_private/settings_private_event_router.h +++ b/chromium/chrome/browser/extensions/api/settings_private/settings_private_event_router.h @@ -5,6 +5,8 @@ #ifndef CHROME_BROWSER_EXTENSIONS_API_SETTINGS_PRIVATE_SETTINGS_PRIVATE_EVENT_ROUTER_H_ #define CHROME_BROWSER_EXTENSIONS_API_SETTINGS_PRIVATE_SETTINGS_PRIVATE_EVENT_ROUTER_H_ +#include + #include "base/macros.h" #include "chrome/browser/chromeos/settings/cros_settings.h" #include "chrome/browser/extensions/api/settings_private/prefs_util.h" @@ -57,9 +59,9 @@ class SettingsPrivateEventRouter : public KeyedService, PrefChangeRegistrar* FindRegistrarForPref(const std::string& pref_name); - typedef std::map> - SubscriptionMap; + using SubscriptionMap = + std::map>; SubscriptionMap cros_settings_subscription_map_; content::BrowserContext* context_; diff --git a/chromium/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api.cc b/chromium/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api.cc index c1023b80edf..096316a5caa 100644 --- a/chromium/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api.cc +++ b/chromium/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api.cc @@ -113,34 +113,33 @@ std::unique_ptr GetLocalDeviceInfo(const std::string& extension_id, return device; } -bool SignedInDevicesGetFunction::RunSync() { +ExtensionFunction::ResponseAction SignedInDevicesGetFunction::Run() { std::unique_ptr params( api::signed_in_devices::Get::Params::Create(*args_)); EXTENSION_FUNCTION_VALIDATE(params.get()); bool is_local = params->is_local.get() ? *params->is_local : false; + Profile* profile = Profile::FromBrowserContext(browser_context()); if (is_local) { std::unique_ptr device = - GetLocalDeviceInfo(extension_id(), GetProfile()); + GetLocalDeviceInfo(extension_id(), profile); std::unique_ptr result(new base::ListValue()); if (device.get()) { result->Append(device->ToValue()); } - SetResult(std::move(result)); - return true; + return RespondNow(OneArgument(std::move(result))); } std::vector> devices = - GetAllSignedInDevices(extension_id(), GetProfile()); + GetAllSignedInDevices(extension_id(), profile); std::unique_ptr result(new base::ListValue()); for (const std::unique_ptr& device : devices) result->Append(device->ToValue()); - SetResult(std::move(result)); - return true; + return RespondNow(OneArgument(std::move(result))); } } // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api.h b/chromium/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api.h index 264600c4b9c..b24066be1e8 100644 --- a/chromium/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api.h +++ b/chromium/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api.h @@ -37,12 +37,12 @@ std::vector> GetAllSignedInDevices( syncer::DeviceInfoTracker* device_tracker, ExtensionPrefs* extension_prefs); -class SignedInDevicesGetFunction : public ChromeSyncExtensionFunction { +class SignedInDevicesGetFunction : public UIThreadExtensionFunction { protected: ~SignedInDevicesGetFunction() override {} // ExtensionFunction: - bool RunSync() override; + ResponseAction Run() override; DECLARE_EXTENSION_FUNCTION("signedInDevices.get", SIGNED_IN_DEVICES_GET) }; diff --git a/chromium/chrome/browser/extensions/api/socket/combined_socket_unittest.cc b/chromium/chrome/browser/extensions/api/socket/combined_socket_unittest.cc index e6d2595d487..14de64940ae 100644 --- a/chromium/chrome/browser/extensions/api/socket/combined_socket_unittest.cc +++ b/chromium/chrome/browser/extensions/api/socket/combined_socket_unittest.cc @@ -107,7 +107,9 @@ class CombinedSocketTest : public testing::Test { EXPECT_EQ(buffer, io_buffer_); } - void OnRead(int count, scoped_refptr io_buffer) { + void OnRead(int count, + scoped_refptr io_buffer, + bool socket_destroying) { count_ = count; io_buffer_ = io_buffer.get(); } diff --git a/chromium/chrome/browser/extensions/api/socket/tcp_socket_unittest.cc b/chromium/chrome/browser/extensions/api/socket/tcp_socket_unittest.cc index dd435b25afb..ac8a6fda363 100644 --- a/chromium/chrome/browser/extensions/api/socket/tcp_socket_unittest.cc +++ b/chromium/chrome/browser/extensions/api/socket/tcp_socket_unittest.cc @@ -58,8 +58,10 @@ class CompleteHandler { public: CompleteHandler() {} MOCK_METHOD1(OnComplete, void(int result_code)); - MOCK_METHOD2(OnReadComplete, void(int result_code, - scoped_refptr io_buffer)); + MOCK_METHOD3(OnReadComplete, + void(int result_code, + scoped_refptr io_buffer, + bool socket_destroying)); // MOCK_METHOD cannot mock a scoped_ptr argument. MOCK_METHOD2(OnAcceptMock, void(int, net::TCPClientSocket*)); @@ -81,8 +83,7 @@ TEST(SocketTest, TestTCPSocketRead) { EXPECT_CALL(*tcp_client_socket, Read(_, _, _)) .Times(1); - EXPECT_CALL(handler, OnReadComplete(_, _)) - .Times(1); + EXPECT_CALL(handler, OnReadComplete(_, _, _)).Times(1); std::unique_ptr socket(TCPSocket::CreateSocketForTesting( std::move(tcp_client_socket), FAKE_ID, true)); diff --git a/chromium/chrome/browser/extensions/api/socket/tls_socket_unittest.cc b/chromium/chrome/browser/extensions/api/socket/tls_socket_unittest.cc index 1b5663a653c..2e19965cbba 100644 --- a/chromium/chrome/browser/extensions/api/socket/tls_socket_unittest.cc +++ b/chromium/chrome/browser/extensions/api/socket/tls_socket_unittest.cc @@ -112,8 +112,10 @@ class CompleteHandler { public: CompleteHandler() {} MOCK_METHOD1(OnComplete, void(int result_code)); - MOCK_METHOD2(OnReadComplete, - void(int result_code, scoped_refptr io_buffer)); + MOCK_METHOD3(OnReadComplete, + void(int result_code, + scoped_refptr io_buffer, + bool socket_destroying)); MOCK_METHOD2(OnAccept, void(int, net::TCPClientSocket*)); private: @@ -150,7 +152,7 @@ TEST_F(TLSSocketTest, TestTLSSocketRead) { CompleteHandler handler; EXPECT_CALL(*ssl_socket_, Read(_, _, _)).Times(1); - EXPECT_CALL(handler, OnReadComplete(_, _)).Times(1); + EXPECT_CALL(handler, OnReadComplete(_, _, _)).Times(1); const int count = 512; socket_->Read( diff --git a/chromium/chrome/browser/extensions/api/socket/udp_socket_unittest.cc b/chromium/chrome/browser/extensions/api/socket/udp_socket_unittest.cc index 9c4e5213872..915d6766d6b 100644 --- a/chromium/chrome/browser/extensions/api/socket/udp_socket_unittest.cc +++ b/chromium/chrome/browser/extensions/api/socket/udp_socket_unittest.cc @@ -33,6 +33,7 @@ static void OnConnected(int result) { static void OnCompleted(int bytes_read, scoped_refptr io_buffer, + bool socket_destroying, const std::string& address, uint16_t port) { // Do nothing; don't care. @@ -114,7 +115,8 @@ static void SendMulticastPacket(const base::Closure& quit_run_loop, static void OnMulticastReadCompleted(const base::Closure& quit_run_loop, bool* packet_received, int count, - scoped_refptr io_buffer) { + scoped_refptr io_buffer, + bool socket_destroying) { EXPECT_EQ(test_message_length, count); EXPECT_EQ(0, strncmp(io_buffer->data(), test_message, test_message_length)); *packet_received = true; 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 46e3228024b..2864c75d6bf 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 @@ -21,7 +21,6 @@ #include "chrome/browser/policy/schema_registry_service_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/extensions/api/storage/storage_schema_manifest_handler.h" -#include "components/policy/core/common/policy_namespace.h" #include "components/policy/core/common/schema.h" #include "components/policy/core/common/schema_map.h" #include "components/policy/core/common/schema_registry.h" @@ -40,6 +39,10 @@ #include "extensions/common/manifest_constants.h" #include "extensions/common/one_shot_event.h" +#if defined(OS_CHROMEOS) +#include "chrome/browser/chromeos/profiles/profile_helper.h" +#endif + using content::BrowserContext; using content::BrowserThread; @@ -67,7 +70,7 @@ const ValueStoreFactory::ModelType kManagedModelType = class ManagedValueStoreCache::ExtensionTracker : public ExtensionRegistryObserver { public: - explicit ExtensionTracker(Profile* profile); + ExtensionTracker(Profile* profile, policy::PolicyDomain policy_domain); ~ExtensionTracker() override {} private: @@ -96,6 +99,7 @@ class ManagedValueStoreCache::ExtensionTracker void Register(const policy::ComponentMap* components); Profile* profile_; + policy::PolicyDomain policy_domain_; ScopedObserver extension_registry_observer_; policy::SchemaRegistry* schema_registry_; @@ -104,11 +108,15 @@ class ManagedValueStoreCache::ExtensionTracker DISALLOW_COPY_AND_ASSIGN(ExtensionTracker); }; -ManagedValueStoreCache::ExtensionTracker::ExtensionTracker(Profile* profile) +ManagedValueStoreCache::ExtensionTracker::ExtensionTracker( + Profile* profile, + policy::PolicyDomain policy_domain) : profile_(profile), + policy_domain_(policy_domain), extension_registry_observer_(this), - schema_registry_(policy::SchemaRegistryServiceFactory::GetForContext( - profile)->registry()), + schema_registry_( + policy::SchemaRegistryServiceFactory::GetForContext(profile) + ->registry()), weak_factory_(this) { extension_registry_observer_.Add(ExtensionRegistry::Get(profile_)); // Load schemas when the extension system is ready. It might be ready now. @@ -141,8 +149,8 @@ void ManagedValueStoreCache::ExtensionTracker::OnExtensionUninstalled( if (!ExtensionSystem::Get(profile_)->ready().is_signaled()) return; if (extension && UsesManagedStorage(extension)) { - schema_registry_->UnregisterComponent(policy::PolicyNamespace( - policy::POLICY_DOMAIN_EXTENSIONS, extension->id())); + schema_registry_->UnregisterComponent( + policy::PolicyNamespace(policy_domain_, extension->id())); } } @@ -214,16 +222,19 @@ void ManagedValueStoreCache::ExtensionTracker::LoadSchemasOnBlockingPool( void ManagedValueStoreCache::ExtensionTracker::Register( const policy::ComponentMap* components) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - schema_registry_->RegisterComponents(policy::POLICY_DOMAIN_EXTENSIONS, - *components); - - // The first SetReady() call is performed after the ExtensionSystem is ready, - // even if there are no managed extensions. It will trigger a loading of the - // initial policy for any managed extensions, and eventually the PolicyService - // will become ready for POLICY_DOMAIN_EXTENSIONS, and - // OnPolicyServiceInitialized() will be invoked. - // Subsequent calls to SetReady() are ignored. - schema_registry_->SetReady(policy::POLICY_DOMAIN_EXTENSIONS); + schema_registry_->RegisterComponents(policy_domain_, *components); + + // The first SetExtensionsDomainsReady() call is performed after the + // ExtensionSystem is ready, even if there are no managed extensions. It will + // trigger a loading of the initial policy for any managed extensions, and + // eventually the PolicyService will become ready for policy for extensions, + // and OnPolicyServiceInitialized() will be invoked. + // Subsequent calls to SetExtensionsDomainsReady() are ignored. + // + // Note that there is only ever one |ManagedValueStoreCache| instance for each + // profile, regardless of its type, therefore all extensions policy domains + // are marked as ready here. + schema_registry_->SetExtensionsDomainsReady(); } ManagedValueStoreCache::ManagedValueStoreCache( @@ -231,6 +242,7 @@ ManagedValueStoreCache::ManagedValueStoreCache( const scoped_refptr& factory, const scoped_refptr& observers) : profile_(Profile::FromBrowserContext(context)), + policy_domain_(GetPolicyDomain(profile_)), policy_service_( policy::ProfilePolicyConnectorFactory::GetForBrowserContext(context) ->policy_service()), @@ -238,14 +250,12 @@ ManagedValueStoreCache::ManagedValueStoreCache( observers_(observers) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - policy_service_->AddObserver(policy::POLICY_DOMAIN_EXTENSIONS, this); + policy_service_->AddObserver(policy_domain_, this); - extension_tracker_.reset(new ExtensionTracker(profile_)); + extension_tracker_.reset(new ExtensionTracker(profile_, policy_domain_)); - if (policy_service_->IsInitializationComplete( - policy::POLICY_DOMAIN_EXTENSIONS)) { - OnPolicyServiceInitialized(policy::POLICY_DOMAIN_EXTENSIONS); - } + if (policy_service_->IsInitializationComplete(policy_domain_)) + OnPolicyServiceInitialized(policy_domain_); } ManagedValueStoreCache::~ManagedValueStoreCache() { @@ -256,7 +266,7 @@ ManagedValueStoreCache::~ManagedValueStoreCache() { void ManagedValueStoreCache::ShutdownOnUI() { DCHECK_CURRENTLY_ON(BrowserThread::UI); - policy_service_->RemoveObserver(policy::POLICY_DOMAIN_EXTENSIONS, this); + policy_service_->RemoveObserver(policy_domain_, this); extension_tracker_.reset(); } @@ -283,23 +293,22 @@ void ManagedValueStoreCache::OnPolicyServiceInitialized( policy::PolicyDomain domain) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - if (domain != policy::POLICY_DOMAIN_EXTENSIONS) + if (domain != policy_domain_) return; // The PolicyService now has all the initial policies ready. Send policy // for all the managed extensions to their backing stores now. policy::SchemaRegistry* registry = policy::SchemaRegistryServiceFactory::GetForContext(profile_)->registry(); - const policy::ComponentMap* map = registry->schema_map()->GetComponents( - policy::POLICY_DOMAIN_EXTENSIONS); + const policy::ComponentMap* map = + registry->schema_map()->GetComponents(policy_domain_); if (!map) return; const policy::PolicyMap empty_map; for (policy::ComponentMap::const_iterator it = map->begin(); it != map->end(); ++it) { - const policy::PolicyNamespace ns(policy::POLICY_DOMAIN_EXTENSIONS, - it->first); + const policy::PolicyNamespace ns(policy_domain_, it->first); // If there is no policy for |ns| then this will clear the previous store, // if there is one. OnPolicyUpdated(ns, empty_map, policy_service_->GetPolicies(ns)); @@ -311,8 +320,7 @@ void ManagedValueStoreCache::OnPolicyUpdated(const policy::PolicyNamespace& ns, const policy::PolicyMap& current) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - if (!policy_service_->IsInitializationComplete( - policy::POLICY_DOMAIN_EXTENSIONS)) { + if (!policy_service_->IsInitializationComplete(policy_domain_)) { // OnPolicyUpdated is called whenever a policy changes, but it doesn't // mean that all the policy providers are ready; wait until we get the // final policy values before passing them to the store. @@ -327,6 +335,17 @@ void ManagedValueStoreCache::OnPolicyUpdated(const policy::PolicyNamespace& ns, base::Passed(current.DeepCopy()))); } +// static +policy::PolicyDomain ManagedValueStoreCache::GetPolicyDomain(Profile* profile) { +#if defined(OS_CHROMEOS) + return chromeos::ProfileHelper::IsSigninProfile(profile) + ? policy::POLICY_DOMAIN_SIGNIN_EXTENSIONS + : policy::POLICY_DOMAIN_EXTENSIONS; +#else + return policy::POLICY_DOMAIN_EXTENSIONS; +#endif +} + void ManagedValueStoreCache::UpdatePolicyOnFILE( const std::string& extension_id, std::unique_ptr current_policy) { @@ -346,19 +365,20 @@ PolicyValueStore* ManagedValueStoreCache::GetStoreFor( const std::string& extension_id) { DCHECK_CURRENTLY_ON(BrowserThread::FILE); - PolicyValueStoreMap::iterator it = store_map_.find(extension_id); + auto it = store_map_.find(extension_id); if (it != store_map_.end()) return it->second.get(); // Create the store now, and serve the cached policy until the PolicyService // sends updated values. - PolicyValueStore* store = new PolicyValueStore( + std::unique_ptr store(new PolicyValueStore( extension_id, observers_, storage_factory_->CreateSettingsStore(settings_namespace::MANAGED, - kManagedModelType, extension_id)); - store_map_[extension_id] = make_linked_ptr(store); + kManagedModelType, extension_id))); + PolicyValueStore* raw_store = store.get(); + store_map_[extension_id] = std::move(store); - return store; + return raw_store; } bool ManagedValueStoreCache::HasStore(const std::string& extension_id) const { diff --git a/chromium/chrome/browser/extensions/api/storage/managed_value_store_cache.h b/chromium/chrome/browser/extensions/api/storage/managed_value_store_cache.h index f0d5beffa23..72fd865906f 100644 --- a/chromium/chrome/browser/extensions/api/storage/managed_value_store_cache.h +++ b/chromium/chrome/browser/extensions/api/storage/managed_value_store_cache.h @@ -12,8 +12,8 @@ #include "base/compiler_specific.h" #include "base/files/file_path.h" #include "base/macros.h" -#include "base/memory/linked_ptr.h" #include "base/memory/ref_counted.h" +#include "components/policy/core/common/policy_namespace.h" #include "components/policy/core/common/policy_service.h" #include "extensions/browser/api/storage/settings_observer.h" #include "extensions/browser/api/storage/value_store_cache.h" @@ -51,10 +51,6 @@ class ManagedValueStoreCache : public ValueStoreCache, private: class ExtensionTracker; - // Maps an extension ID to its PolicyValueStoreMap. - typedef std::map > - PolicyValueStoreMap; - // ValueStoreCache implementation: void ShutdownOnUI() override; void RunWithValueStoreForExtension( @@ -68,6 +64,9 @@ class ManagedValueStoreCache : public ValueStoreCache, const policy::PolicyMap& previous, const policy::PolicyMap& current) override; + // Returns the policy domain that should be used for the specified profile. + static policy::PolicyDomain GetPolicyDomain(Profile* profile); + // Posted by OnPolicyUpdated() to update a PolicyValueStore on the FILE // thread. void UpdatePolicyOnFILE(const std::string& extension_id, @@ -83,6 +82,10 @@ class ManagedValueStoreCache : public ValueStoreCache, // get the PolicyService, the EventRouter and the ExtensionService. Profile* profile_; + // The policy domain. This is used for both updating the schema registry with + // the list of extensions and for observing the policy updates. + policy::PolicyDomain policy_domain_; + // The |profile_|'s PolicyService. policy::PolicyService* policy_service_; @@ -96,7 +99,7 @@ class ManagedValueStoreCache : public ValueStoreCache, // All the PolicyValueStores live on the FILE thread, and |store_map_| can be // accessed only on the FILE thread as well. - PolicyValueStoreMap store_map_; + std::map> store_map_; DISALLOW_COPY_AND_ASSIGN(ManagedValueStoreCache); }; diff --git a/chromium/chrome/browser/extensions/api/storage/setting_sync_data.cc b/chromium/chrome/browser/extensions/api/storage/setting_sync_data.cc index 6819f6fbe16..a704db7603d 100644 --- a/chromium/chrome/browser/extensions/api/storage/setting_sync_data.cc +++ b/chromium/chrome/browser/extensions/api/storage/setting_sync_data.cc @@ -8,7 +8,7 @@ #include "base/json/json_reader.h" #include "base/json/json_writer.h" -#include "components/sync/api/sync_data.h" +#include "components/sync/model/sync_data.h" #include "components/sync/protocol/app_setting_specifics.pb.h" #include "components/sync/protocol/extension_setting_specifics.pb.h" #include "components/sync/protocol/sync.pb.h" diff --git a/chromium/chrome/browser/extensions/api/storage/setting_sync_data.h b/chromium/chrome/browser/extensions/api/storage/setting_sync_data.h index fd843fbdab2..c98db37b9c2 100644 --- a/chromium/chrome/browser/extensions/api/storage/setting_sync_data.h +++ b/chromium/chrome/browser/extensions/api/storage/setting_sync_data.h @@ -10,7 +10,7 @@ #include "base/macros.h" #include "base/values.h" -#include "components/sync/api/sync_change.h" +#include "components/sync/model/sync_change.h" namespace syncer { class SyncData; diff --git a/chromium/chrome/browser/extensions/api/storage/settings_apitest.cc b/chromium/chrome/browser/extensions/api/storage/settings_apitest.cc index 3eb1437be2e..b934a9b55e0 100644 --- a/chromium/chrome/browser/extensions/api/storage/settings_apitest.cc +++ b/chromium/chrome/browser/extensions/api/storage/settings_apitest.cc @@ -25,13 +25,13 @@ #include "components/policy/core/common/schema.h" #include "components/policy/core/common/schema_map.h" #include "components/policy/core/common/schema_registry.h" -#include "components/sync/api/fake_sync_change_processor.h" -#include "components/sync/api/sync_change.h" -#include "components/sync/api/sync_change_processor.h" -#include "components/sync/api/sync_change_processor_wrapper_for_test.h" -#include "components/sync/api/sync_error_factory.h" -#include "components/sync/api/sync_error_factory_mock.h" -#include "components/sync/api/syncable_service.h" +#include "components/sync/model/fake_sync_change_processor.h" +#include "components/sync/model/sync_change.h" +#include "components/sync/model/sync_change_processor.h" +#include "components/sync/model/sync_change_processor_wrapper_for_test.h" +#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 "extensions/browser/api/storage/settings_namespace.h" #include "extensions/browser/api/storage/storage_frontend.h" #include "extensions/browser/extension_system.h" 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 62bb164c0f5..02f3f6f9266 100644 --- a/chromium/chrome/browser/extensions/api/storage/settings_sync_processor.cc +++ b/chromium/chrome/browser/extensions/api/storage/settings_sync_processor.cc @@ -4,8 +4,8 @@ #include "chrome/browser/extensions/api/storage/settings_sync_processor.h" #include "chrome/browser/extensions/api/storage/settings_sync_util.h" -#include "components/sync/api/sync_change_processor.h" -#include "components/sync/api/sync_data.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" #include "content/public/browser/browser_thread.h" #include "extensions/browser/api/storage/settings_namespace.h" 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 93e6349f0f3..bec11ef1267 100644 --- a/chromium/chrome/browser/extensions/api/storage/settings_sync_processor.h +++ b/chromium/chrome/browser/extensions/api/storage/settings_sync_processor.h @@ -9,7 +9,7 @@ #include #include "base/macros.h" -#include "components/sync/api/sync_error.h" +#include "components/sync/model/sync_error.h" #include "extensions/browser/value_store/value_store_change.h" namespace syncer { 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 2bd06676574..1f68049384b 100644 --- a/chromium/chrome/browser/extensions/api/storage/settings_sync_unittest.cc +++ b/chromium/chrome/browser/extensions/api/storage/settings_sync_unittest.cc @@ -20,10 +20,10 @@ #include "chrome/browser/extensions/api/storage/sync_value_store_cache.h" #include "chrome/browser/extensions/api/storage/syncable_settings_storage.h" #include "chrome/test/base/testing_profile.h" -#include "components/sync/api/sync_change_processor.h" -#include "components/sync/api/sync_change_processor_wrapper_for_test.h" -#include "components/sync/api/sync_error_factory.h" -#include "components/sync/api/sync_error_factory_mock.h" +#include "components/sync/model/sync_change_processor.h" +#include "components/sync/model/sync_change_processor_wrapper_for_test.h" +#include "components/sync/model/sync_error_factory.h" +#include "components/sync/model/sync_error_factory_mock.h" #include "content/public/test/test_browser_thread.h" #include "extensions/browser/api/storage/settings_test_util.h" #include "extensions/browser/api/storage/storage_frontend.h" diff --git a/chromium/chrome/browser/extensions/api/storage/settings_sync_util.h b/chromium/chrome/browser/extensions/api/storage/settings_sync_util.h index ef702581162..4e23bae0619 100644 --- a/chromium/chrome/browser/extensions/api/storage/settings_sync_util.h +++ b/chromium/chrome/browser/extensions/api/storage/settings_sync_util.h @@ -5,8 +5,8 @@ #ifndef CHROME_BROWSER_EXTENSIONS_API_STORAGE_SETTINGS_SYNC_UTIL_H_ #define CHROME_BROWSER_EXTENSIONS_API_STORAGE_SETTINGS_SYNC_UTIL_H_ -#include "components/sync/api/sync_change.h" -#include "components/sync/api/sync_data.h" +#include "components/sync/model/sync_change.h" +#include "components/sync/model/sync_data.h" namespace base { class Value; 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 21f9747ab56..18d50350578 100644 --- a/chromium/chrome/browser/extensions/api/storage/sync_storage_backend.cc +++ b/chromium/chrome/browser/extensions/api/storage/sync_storage_backend.cc @@ -11,7 +11,7 @@ #include "chrome/browser/extensions/api/storage/settings_sync_processor.h" #include "chrome/browser/extensions/api/storage/settings_sync_util.h" #include "chrome/browser/extensions/api/storage/syncable_settings_storage.h" -#include "components/sync/api/sync_error_factory.h" +#include "components/sync/model/sync_error_factory.h" #include "content/public/browser/browser_thread.h" using content::BrowserThread; @@ -81,7 +81,7 @@ SyncableSettingsStorage* SyncStorageBackend::GetOrCreateStorageWithSyncData( return maybe_storage->second.get(); } - std::unique_ptr storage( + std::unique_ptr settings_storage( new SettingsStorageQuotaEnforcer( quota_, storage_factory_->CreateSettingsStore( settings_namespace::SYNC, ToFactoryModelType(sync_type_), @@ -89,18 +89,20 @@ SyncableSettingsStorage* SyncStorageBackend::GetOrCreateStorageWithSyncData( // It's fine to create the quota enforcer underneath the sync layer, since // sync will only go ahead if each underlying storage operation succeeds. - linked_ptr syncable_storage( - new SyncableSettingsStorage( - observers_, extension_id, storage.release(), sync_type_, flare_)); - storage_objs_[extension_id] = syncable_storage; + std::unique_ptr syncable_storage( + new SyncableSettingsStorage(observers_, extension_id, + settings_storage.release(), sync_type_, + flare_)); + SyncableSettingsStorage* raw_syncable_storage = syncable_storage.get(); + storage_objs_[extension_id] = std::move(syncable_storage); if (sync_processor_.get()) { - syncer::SyncError error = syncable_storage->StartSyncing( + syncer::SyncError error = raw_syncable_storage->StartSyncing( std::move(sync_data), CreateSettingsSyncProcessor(extension_id)); if (error.IsSet()) - syncable_storage->StopSyncing(); + raw_syncable_storage->StopSyncing(); } - return syncable_storage.get(); + return raw_syncable_storage; } void SyncStorageBackend::DeleteStorage(const std::string& extension_id) { 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 9a854d9c14a..e3b61ed4fdd 100644 --- a/chromium/chrome/browser/extensions/api/storage/sync_storage_backend.h +++ b/chromium/chrome/browser/extensions/api/storage/sync_storage_backend.h @@ -13,9 +13,8 @@ #include "base/compiler_specific.h" #include "base/files/file_path.h" #include "base/macros.h" -#include "base/memory/linked_ptr.h" #include "base/memory/ref_counted.h" -#include "components/sync/api/syncable_service.h" +#include "components/sync/model/syncable_service.h" #include "extensions/browser/api/storage/settings_observer.h" #include "extensions/browser/api/storage/settings_storage_quota_enforcer.h" #include "extensions/browser/value_store/value_store_factory.h" @@ -87,8 +86,8 @@ class SyncStorageBackend : public syncer::SyncableService { // A cache of ValueStore objects that have already been created. // Ensure that there is only ever one created per extension. - typedef std::map > - StorageObjMap; + using StorageObjMap = + std::map>; mutable StorageObjMap storage_objs_; // Current sync model type. Either EXTENSION_SETTINGS or APP_SETTINGS. diff --git a/chromium/chrome/browser/extensions/api/storage/sync_value_store_cache.h b/chromium/chrome/browser/extensions/api/storage/sync_value_store_cache.h index 94f53b27a9b..62805823865 100644 --- a/chromium/chrome/browser/extensions/api/storage/sync_value_store_cache.h +++ b/chromium/chrome/browser/extensions/api/storage/sync_value_store_cache.h @@ -10,7 +10,7 @@ #include "base/compiler_specific.h" #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "components/sync/api/syncable_service.h" +#include "components/sync/model/syncable_service.h" #include "extensions/browser/api/storage/settings_observer.h" #include "extensions/browser/api/storage/value_store_cache.h" 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 102e2b343cc..e6668ec8294 100644 --- a/chromium/chrome/browser/extensions/api/storage/syncable_settings_storage.cc +++ b/chromium/chrome/browser/extensions/api/storage/syncable_settings_storage.cc @@ -10,7 +10,7 @@ #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/api/sync_data.h" +#include "components/sync/model/sync_data.h" #include "components/sync/protocol/extension_setting_specifics.pb.h" #include "content/public/browser/browser_thread.h" #include "extensions/browser/api/storage/settings_namespace.h" 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 c903f23b4fa..f382dd13490 100644 --- a/chromium/chrome/browser/extensions/api/storage/syncable_settings_storage.h +++ b/chromium/chrome/browser/extensions/api/storage/syncable_settings_storage.h @@ -17,8 +17,8 @@ #include "base/observer_list_threadsafe.h" #include "base/values.h" #include "chrome/browser/extensions/api/storage/setting_sync_data.h" -#include "components/sync/api/sync_change.h" -#include "components/sync/api/syncable_service.h" +#include "components/sync/model/sync_change.h" +#include "components/sync/model/syncable_service.h" #include "extensions/browser/api/storage/settings_observer.h" #include "extensions/browser/value_store/value_store.h" diff --git a/chromium/chrome/browser/extensions/api/streams_private/streams_private_api.cc b/chromium/chrome/browser/extensions/api/streams_private/streams_private_api.cc index 199a16323ef..dc12dac808f 100644 --- a/chromium/chrome/browser/extensions/api/streams_private/streams_private_api.cc +++ b/chromium/chrome/browser/extensions/api/streams_private/streams_private_api.cc @@ -135,7 +135,7 @@ void StreamsPrivateAPI::ExecuteMimeTypeHandler( ->DispatchEventToExtension(extension_id, std::move(event)); GURL url = stream->handle->GetURL(); - streams_[extension_id][url] = make_linked_ptr(stream->handle.release()); + streams_[extension_id][url] = std::move(stream->handle); } void StreamsPrivateAPI::AbortStream(const std::string& extension_id, diff --git a/chromium/chrome/browser/extensions/api/streams_private/streams_private_api.h b/chromium/chrome/browser/extensions/api/streams_private/streams_private_api.h index e2e2ab84aa3..3d987d480d8 100644 --- a/chromium/chrome/browser/extensions/api/streams_private/streams_private_api.h +++ b/chromium/chrome/browser/extensions/api/streams_private/streams_private_api.h @@ -62,9 +62,6 @@ class StreamsPrivateAPI : public BrowserContextKeyedAPI, private: friend class BrowserContextKeyedAPIFactory; - typedef std::map > > StreamMap; // ExtensionRegistryObserver implementation. void OnExtensionUnloaded(content::BrowserContext* browser_context, @@ -79,6 +76,9 @@ class StreamsPrivateAPI : public BrowserContextKeyedAPI, static const bool kServiceRedirectedInIncognito = true; content::BrowserContext* const browser_context_; + using StreamMap = + std::map>>; StreamMap streams_; // Listen to extension unloaded notifications. diff --git a/chromium/chrome/browser/extensions/api/sync_file_system/sync_file_system_api.cc b/chromium/chrome/browser/extensions/api/sync_file_system/sync_file_system_api.cc index c89dad722b3..f8dd6452639 100644 --- a/chromium/chrome/browser/extensions/api/sync_file_system/sync_file_system_api.cc +++ b/chromium/chrome/browser/extensions/api/sync_file_system/sync_file_system_api.cc @@ -46,7 +46,8 @@ const char kUnsupportedConflictResolutionPolicy[] = "Policy %s is not supported."; sync_file_system::SyncFileSystemService* GetSyncFileSystemService( - Profile* profile) { + content::BrowserContext* browser_context) { + Profile* profile = Profile::FromBrowserContext(browser_context); sync_file_system::SyncFileSystemService* service = SyncFileSystemServiceFactory::GetForProfile(profile); if (!service) @@ -355,33 +356,35 @@ void SyncFileSystemGetUsageAndQuotaFunction::DidGetUsageAndQuota( SendResponse(true); } -bool SyncFileSystemSetConflictResolutionPolicyFunction::RunSync() { +ExtensionFunction::ResponseAction +SyncFileSystemSetConflictResolutionPolicyFunction::Run() { std::string policy_string; EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &policy_string)); ConflictResolutionPolicy policy = ExtensionEnumToConflictResolutionPolicy( api::sync_file_system::ParseConflictResolutionPolicy(policy_string)); if (policy != sync_file_system::CONFLICT_RESOLUTION_POLICY_LAST_WRITE_WIN) { - SetError(base::StringPrintf(kUnsupportedConflictResolutionPolicy, - policy_string.c_str())); - return false; + return RespondNow(Error(base::StringPrintf( + kUnsupportedConflictResolutionPolicy, policy_string.c_str()))); } - return true; + return RespondNow(NoArguments()); } -bool SyncFileSystemGetConflictResolutionPolicyFunction::RunSync() { - SetResult(base::MakeUnique(api::sync_file_system::ToString( - api::sync_file_system::CONFLICT_RESOLUTION_POLICY_LAST_WRITE_WIN))); - return true; +ExtensionFunction::ResponseAction +SyncFileSystemGetConflictResolutionPolicyFunction::Run() { + return RespondNow(OneArgument( + base::MakeUnique(api::sync_file_system::ToString( + api::sync_file_system::CONFLICT_RESOLUTION_POLICY_LAST_WRITE_WIN)))); } -bool SyncFileSystemGetServiceStatusFunction::RunSync() { +ExtensionFunction::ResponseAction +SyncFileSystemGetServiceStatusFunction::Run() { sync_file_system::SyncFileSystemService* service = - GetSyncFileSystemService(GetProfile()); + GetSyncFileSystemService(browser_context()); if (!service) - return false; - results_ = api::sync_file_system::GetServiceStatus::Results::Create( - SyncServiceStateToExtensionEnum(service->GetSyncServiceState())); - return true; + return RespondNow(Error(kUnknownErrorDoNotUse)); + return RespondNow( + ArgumentList(api::sync_file_system::GetServiceStatus::Results::Create( + SyncServiceStateToExtensionEnum(service->GetSyncServiceState())))); } } // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/sync_file_system/sync_file_system_api.h b/chromium/chrome/browser/extensions/api/sync_file_system/sync_file_system_api.h index 38dc817049d..9863c8f95a7 100644 --- a/chromium/chrome/browser/extensions/api/sync_file_system/sync_file_system_api.h +++ b/chromium/chrome/browser/extensions/api/sync_file_system/sync_file_system_api.h @@ -120,36 +120,36 @@ class SyncFileSystemRequestFileSystemFunction }; class SyncFileSystemSetConflictResolutionPolicyFunction - : public ChromeSyncExtensionFunction { + : public UIThreadExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("syncFileSystem.setConflictResolutionPolicy", SYNCFILESYSTEM_SETCONFLICTRESOLUTIONPOLICY) protected: ~SyncFileSystemSetConflictResolutionPolicyFunction() override {} - bool RunSync() override; + ResponseAction Run() override; }; class SyncFileSystemGetConflictResolutionPolicyFunction - : public ChromeSyncExtensionFunction { + : public UIThreadExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("syncFileSystem.getConflictResolutionPolicy", SYNCFILESYSTEM_GETCONFLICTRESOLUTIONPOLICY) protected: ~SyncFileSystemGetConflictResolutionPolicyFunction() override {} - bool RunSync() override; + ResponseAction Run() override; }; class SyncFileSystemGetServiceStatusFunction - : public ChromeSyncExtensionFunction { + : public UIThreadExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("syncFileSystem.getServiceStatus", SYNCFILESYSTEM_GETSERVICESTATUS) protected: ~SyncFileSystemGetServiceStatusFunction() override {} - bool RunSync() override; + ResponseAction Run() override; }; } // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_api.cc b/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_api.cc index 1afbe59eb3e..17987c1481d 100644 --- a/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_api.cc +++ b/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_api.cc @@ -199,25 +199,21 @@ const char* const kMediaRouterExtensionIds[] = { "ekpaaapppgpmolpcldedioblbkmijaca", // Beta }; -bool TabCaptureCaptureFunction::RunSync() { +ExtensionFunction::ResponseAction TabCaptureCaptureFunction::Run() { std::unique_ptr params = TabCapture::Capture::Params::Create(*args_); EXTENSION_FUNCTION_VALIDATE(params); // Figure out the active WebContents and retrieve the needed ids. - Browser* target_browser = - chrome::FindAnyBrowser(GetProfile(), include_incognito()); - if (!target_browser) { - error_ = kFindingTabError; - return false; - } + Browser* target_browser = chrome::FindAnyBrowser( + Profile::FromBrowserContext(browser_context()), include_incognito()); + if (!target_browser) + return RespondNow(Error(kFindingTabError)); content::WebContents* target_contents = target_browser->tab_strip_model()->GetActiveWebContents(); - if (!target_contents) { - error_ = kFindingTabError; - return false; - } + if (!target_contents) + return RespondNow(Error(kFindingTabError)); const std::string& extension_id = extension()->id(); @@ -232,21 +228,17 @@ bool TabCaptureCaptureFunction::RunSync() { arraysize(kChromecastExtensionIds)) && !SimpleFeature::IsIdInArray(extension_id, kMediaRouterExtensionIds, arraysize(kMediaRouterExtensionIds))) { - error_ = kGrantError; - return false; + return RespondNow(Error(kGrantError)); } - if (!OptionsSpecifyAudioOrVideo(params->options)) { - error_ = kNoAudioOrVideo; - return false; - } + if (!OptionsSpecifyAudioOrVideo(params->options)) + return RespondNow(Error(kNoAudioOrVideo)); - TabCaptureRegistry* registry = TabCaptureRegistry::Get(GetProfile()); + TabCaptureRegistry* registry = TabCaptureRegistry::Get(browser_context()); if (!registry->AddRequest(target_contents, extension_id, false)) { // TODO(miu): Allow multiple consumers of single tab capture. // http://crbug.com/535336 - error_ = kCapturingSameTab; - return false; + return RespondNow(Error(kCapturingSameTab)); } FilterDeprecatedGoogConstraints(¶ms->options); AddMediaStreamSourceConstraints(target_contents, ¶ms->options); @@ -261,17 +253,15 @@ bool TabCaptureCaptureFunction::RunSync() { // chrome/renderer/resources/extensions/tab_capture_custom_bindings.js std::unique_ptr result(new base::DictionaryValue()); result->MergeDictionary(params->options.ToValue().get()); - SetResult(std::move(result)); - return true; + return RespondNow(OneArgument(std::move(result))); } -bool TabCaptureGetCapturedTabsFunction::RunSync() { - TabCaptureRegistry* registry = TabCaptureRegistry::Get(GetProfile()); +ExtensionFunction::ResponseAction TabCaptureGetCapturedTabsFunction::Run() { + TabCaptureRegistry* registry = TabCaptureRegistry::Get(browser_context()); std::unique_ptr list(new base::ListValue()); if (registry) registry->GetCapturedTabs(extension()->id(), list.get()); - SetResult(std::move(list)); - return true; + return RespondNow(OneArgument(std::move(list))); } ExtensionFunction::ResponseAction TabCaptureCaptureOffscreenTabFunction::Run() { diff --git a/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_api.h b/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_api.h index 8e9675f1c61..b035882611a 100644 --- a/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_api.h +++ b/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_api.h @@ -22,7 +22,7 @@ extern const char* const kStableChromecastExtensionId; // Extension ids for the chromecast. extern const char* const kChromecastExtensionIds[6]; -class TabCaptureCaptureFunction : public ChromeSyncExtensionFunction { +class TabCaptureCaptureFunction : public UIThreadExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("tabCapture.capture", TABCAPTURE_CAPTURE) @@ -30,10 +30,10 @@ class TabCaptureCaptureFunction : public ChromeSyncExtensionFunction { ~TabCaptureCaptureFunction() final {} // ExtensionFunction: - bool RunSync() final; + ResponseAction Run() final; }; -class TabCaptureGetCapturedTabsFunction : public ChromeSyncExtensionFunction { +class TabCaptureGetCapturedTabsFunction : public UIThreadExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("tabCapture.getCapturedTabs", TABCAPTURE_GETCAPTUREDTABS) @@ -42,7 +42,7 @@ class TabCaptureGetCapturedTabsFunction : public ChromeSyncExtensionFunction { ~TabCaptureGetCapturedTabsFunction() final {} // ExtensionFunction: - bool RunSync() final; + ResponseAction Run() final; }; class TabCaptureCaptureOffscreenTabFunction : public UIThreadExtensionFunction { diff --git a/chromium/chrome/browser/extensions/api/tabs/ash_panel_contents.h b/chromium/chrome/browser/extensions/api/tabs/ash_panel_contents.h index 442051dc784..78299ec947c 100644 --- a/chromium/chrome/browser/extensions/api/tabs/ash_panel_contents.h +++ b/chromium/chrome/browser/extensions/api/tabs/ash_panel_contents.h @@ -16,14 +16,6 @@ class GURL; -namespace content { -class RenderViewHost; -} - -namespace extensions { -struct DraggableRegion; -} - // extensions::AppWindowContents class specific to panel windows created by v1 // extenstions. This class maintains a WebContents instance and observes it for // the purpose of passing messages to the extensions system. It also creates diff --git a/chromium/chrome/browser/extensions/api/tabs/tabs_api.cc b/chromium/chrome/browser/extensions/api/tabs/tabs_api.cc index 28d77b098a3..f882148ceb7 100644 --- a/chromium/chrome/browser/extensions/api/tabs/tabs_api.cc +++ b/chromium/chrome/browser/extensions/api/tabs/tabs_api.cc @@ -225,9 +225,7 @@ bool IsValidStateForWindowsCreateFunction( bool has_bound = create_data->left || create_data->top || create_data->width || create_data->height; - bool is_panel = - create_data->type == windows::CreateType::CREATE_TYPE_PANEL || - create_data->type == windows::CreateType::CREATE_TYPE_DETACHED_PANEL; + bool is_panel = create_data->type == windows::CreateType::CREATE_TYPE_PANEL; switch (create_data->state) { case windows::WINDOW_STATE_MINIMIZED: @@ -500,8 +498,7 @@ ExtensionFunction::ResponseAction WindowsCreateFunction::Run() { extension_id = extension()->id(); break; - case windows::CREATE_TYPE_PANEL: - case windows::CREATE_TYPE_DETACHED_PANEL: { + case windows::CREATE_TYPE_PANEL: { extension_id = extension()->id(); #if defined(USE_ASH) // Only ChromeOS' version of chrome.windows.create would create a panel diff --git a/chromium/chrome/browser/extensions/api/tabs/tabs_constants.cc b/chromium/chrome/browser/extensions/api/tabs/tabs_constants.cc index 8d4392b3f7a..8df23c8d14f 100644 --- a/chromium/chrome/browser/extensions/api/tabs/tabs_constants.cc +++ b/chromium/chrome/browser/extensions/api/tabs/tabs_constants.cc @@ -67,7 +67,6 @@ const char kStatusValueLoading[] = "loading"; const char kWindowTypeValueNormal[] = "normal"; const char kWindowTypeValuePopup[] = "popup"; const char kWindowTypeValuePanel[] = "panel"; -const char kWindowTypeValueDetachedPanel[] = "detached_panel"; const char kWindowTypeValueApp[] = "app"; const char kWindowTypeValueDevTools[] = "devtools"; diff --git a/chromium/chrome/browser/extensions/api/tabs/tabs_constants.h b/chromium/chrome/browser/extensions/api/tabs/tabs_constants.h index f9b633b326a..92f66619bc4 100644 --- a/chromium/chrome/browser/extensions/api/tabs/tabs_constants.h +++ b/chromium/chrome/browser/extensions/api/tabs/tabs_constants.h @@ -73,7 +73,6 @@ extern const char kStatusValueLoading[]; extern const char kWindowTypeValueNormal[]; extern const char kWindowTypeValuePopup[]; extern const char kWindowTypeValuePanel[]; -extern const char kWindowTypeValueDetachedPanel[]; extern const char kWindowTypeValueApp[]; extern const char kWindowTypeValueDevTools[]; 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 879acfef8de..f27be745923 100644 --- a/chromium/chrome/browser/extensions/api/tabs/tabs_interactive_test.cc +++ b/chromium/chrome/browser/extensions/api/tabs/tabs_interactive_test.cc @@ -12,18 +12,17 @@ #include "chrome/browser/extensions/extension_function_test_utils.h" #include "chrome/browser/extensions/extension_tab_util.h" #include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/browser_window.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 "extensions/browser/api_test_utils.h" #include "extensions/common/test_util.h" -namespace api_test_utils = extensions::api_test_utils; -namespace keys = extensions::tabs_constants; +namespace extensions { + +namespace keys = tabs_constants; namespace utils = extension_function_test_utils; -typedef InProcessBrowserTest ExtensionTabsTest; +using ExtensionTabsTest = InProcessBrowserTest; // http://crbug.com/154081 for Aura specific // http://crbug.com/179063 for other general failures on try bots. @@ -37,6 +36,11 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, MAYBE_GetLastFocusedWindow) { // Create a new window which making it the "last focused" window. // Note that "last focused" means the "top" most window. Browser* new_browser = CreateBrowser(browser()->profile()); + ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(new_browser)); + + GURL url("about:blank"); + AddTabAtIndexToBrowser(new_browser, 0, url, ui::PAGE_TRANSITION_LINK, true); + int focused_window_id = extensions::ExtensionTabUtil::GetWindowId(new_browser); @@ -69,24 +73,15 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, MAYBE_GetLastFocusedWindow) { EXPECT_TRUE(result.get()->GetList(keys::kTabsKey, &tabs)); } -// Flaky: http://crbug.com/136562 -IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DISABLED_QueryLastFocusedWindowTabs) { +IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, QueryLastFocusedWindowTabs) { const size_t kExtraWindows = 2; for (size_t i = 0; i < kExtraWindows; ++i) CreateBrowser(browser()->profile()); Browser* focused_window = CreateBrowser(browser()->profile()); -#if defined(OS_MACOSX) - // See BrowserWindowCocoa::Show. In tests, Browser::window()->IsActive won't - // work unless we fake the browser being launched by the user. - ASSERT_TRUE(ui_test_utils::ShowAndFocusNativeWindow( - focused_window->window()->GetNativeWindow())); -#endif - - // Needed on Mac and Linux so that the BrowserWindow::IsActive calls work. - content::RunAllPendingInMessageLoop(); + ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(focused_window)); - GURL url; + GURL url("about:blank"); AddTabAtIndexToBrowser(focused_window, 0, url, ui::PAGE_TRANSITION_LINK, true); int focused_window_id = @@ -95,6 +90,9 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DISABLED_QueryLastFocusedWindowTabs) { // Get tabs in the 'last focused' window called from non-focused browser. scoped_refptr function = new extensions::TabsQueryFunction(); + scoped_refptr extension( + extensions::test_util::CreateEmptyExtension()); + function->set_extension(extension.get()); std::unique_ptr result( utils::ToList(utils::RunFunctionAndReturnSingleResult( function.get(), "[{\"lastFocusedWindow\":true}]", browser()))); @@ -111,6 +109,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DISABLED_QueryLastFocusedWindowTabs) { // Get tabs NOT in the 'last focused' window called from the focused browser. function = new extensions::TabsQueryFunction(); + function->set_extension(extension.get()); result.reset(utils::ToList( utils::RunFunctionAndReturnSingleResult(function.get(), "[{\"lastFocusedWindow\":false}]", @@ -135,3 +134,5 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DISABLED_QueryLastFocusedWindowTabs) { IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_TabCurrentWindow) { ASSERT_TRUE(RunExtensionTest("tabs/current_window")) << message_; } + +} // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/tabs/tabs_test.cc b/chromium/chrome/browser/extensions/api/tabs/tabs_test.cc index 1ca713ac39a..9e33edf72d9 100644 --- a/chromium/chrome/browser/extensions/api/tabs/tabs_test.cc +++ b/chromium/chrome/browser/extensions/api/tabs/tabs_test.cc @@ -1059,6 +1059,8 @@ IN_PROC_BROWSER_TEST_F(ExtensionWindowLastFocusedTest, IN_PROC_BROWSER_TEST_F(ExtensionWindowCreateTest, AcceptState) { #if defined(OS_MACOSX) + if (base::mac::IsOS10_10()) + return; // Fails when swarmed. http://crbug.com/660582 ui::test::ScopedFakeNSWindowFullscreen fake_fullscreen; #endif @@ -2116,4 +2118,33 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsZoomTest, CannotZoomInvalidTab) { base::MatchPattern(error, manifest_errors::kCannotAccessChromeUrl)); } +// Regression test for crbug.com/660498. +IN_PROC_BROWSER_TEST_F(ExtensionApiTest, Foo) { + ASSERT_TRUE(StartEmbeddedTestServer()); + content::WebContents* first_web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + ASSERT_TRUE(first_web_contents); + chrome::NewTab(browser()); + content::WebContents* second_web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + ASSERT_NE(first_web_contents, second_web_contents); + GURL url = embedded_test_server()->GetURL( + "/extensions/api_test/tabs/pdf_extension_test.html"); + content::TestNavigationManager navigation_manager( + second_web_contents, GURL("http://www.facebook.com:83")); + ui_test_utils::NavigateToURLWithDisposition( + browser(), url, WindowOpenDisposition::CURRENT_TAB, + ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); + EXPECT_TRUE(navigation_manager.WaitForRequestStart()); + + browser()->tab_strip_model()->ActivateTabAt(0, true); + EXPECT_EQ(first_web_contents, + browser()->tab_strip_model()->GetActiveWebContents()); + browser()->tab_strip_model()->ActivateTabAt(1, true); + EXPECT_EQ(second_web_contents, + browser()->tab_strip_model()->GetActiveWebContents()); + + EXPECT_EQ(url, second_web_contents->GetVisibleURL()); +} + } // namespace extensions 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 a04ffa1a176..fe50acfe062 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 @@ -77,7 +77,7 @@ void FrameNavigationState::StartTrackingDocumentLoad( frame_state.error_occurred = is_error_page; frame_state.url = url; frame_state.is_iframe_srcdoc = is_iframe_srcdoc; - DCHECK(!is_iframe_srcdoc || url == GURL(url::kAboutBlankURL)); + DCHECK(!is_iframe_srcdoc || url == url::kAboutBlankURL); if (!is_same_page) { frame_state.is_loading = true; frame_state.is_parsing = true; diff --git a/chromium/chrome/browser/extensions/api/web_navigation/frame_navigation_state.h b/chromium/chrome/browser/extensions/api/web_navigation/frame_navigation_state.h index aa9347b7699..1647dad0db4 100644 --- a/chromium/chrome/browser/extensions/api/web_navigation/frame_navigation_state.h +++ b/chromium/chrome/browser/extensions/api/web_navigation/frame_navigation_state.h @@ -14,7 +14,6 @@ namespace content { class RenderFrameHost; -class RenderViewHost; } namespace extensions { diff --git a/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc b/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc index 165da220b19..6d45ec58562 100644 --- a/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc +++ b/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc @@ -30,8 +30,6 @@ #include "extensions/browser/view_type_utils.h" #include "net/base/net_errors.h" -using content::ResourceType; - namespace GetFrame = extensions::api::web_navigation::GetFrame; namespace GetAllFrames = extensions::api::web_navigation::GetAllFrames; @@ -268,7 +266,7 @@ void WebNavigationTabObserver::RenderFrameHostChanged( void WebNavigationTabObserver::DidStartNavigation( content::NavigationHandle* navigation_handle) { - if (navigation_handle->IsSynchronousNavigation() || + if (navigation_handle->IsSamePage() || !FrameNavigationState::IsValidUrl(navigation_handle->GetURL())) { return; } @@ -325,8 +323,8 @@ void WebNavigationTabObserver::DidFinishLoad( // srcdoc iframes will report a url of about:blank, still let it through. if (navigation_state_.GetUrl(render_frame_host) != validated_url && (navigation_state_.GetUrl(render_frame_host) != - GURL(content::kAboutSrcDocURL) || - validated_url != GURL(url::kAboutBlankURL))) { + content::kAboutSrcDocURL || + validated_url != url::kAboutBlankURL)) { return; } @@ -446,24 +444,18 @@ bool WebNavigationTabObserver::IsReferenceFragmentNavigation( url.ReplaceComponents(replacements); } -bool WebNavigationGetFrameFunction::RunSync() { +ExtensionFunction::ResponseAction WebNavigationGetFrameFunction::Run() { std::unique_ptr params(GetFrame::Params::Create(*args_)); EXTENSION_FUNCTION_VALIDATE(params.get()); int tab_id = params->details.tab_id; int frame_id = params->details.frame_id; - SetResult(base::Value::CreateNullValue()); - content::WebContents* web_contents; - if (!ExtensionTabUtil::GetTabById(tab_id, - GetProfile(), - include_incognito(), - NULL, - NULL, - &web_contents, - NULL) || + if (!ExtensionTabUtil::GetTabById(tab_id, browser_context(), + include_incognito(), nullptr, nullptr, + &web_contents, nullptr) || !web_contents) { - return true; + return RespondNow(OneArgument(base::Value::CreateNullValue())); } WebNavigationTabObserver* observer = @@ -477,11 +469,11 @@ bool WebNavigationGetFrameFunction::RunSync() { ExtensionApiFrameIdMap::Get()->GetRenderFrameHostById(web_contents, frame_id); if (!frame_navigation_state.IsValidFrame(render_frame_host)) - return true; + return RespondNow(OneArgument(base::Value::CreateNullValue())); GURL frame_url = frame_navigation_state.GetUrl(render_frame_host); if (!frame_navigation_state.IsValidUrl(frame_url)) - return true; + return RespondNow(OneArgument(base::Value::CreateNullValue())); GetFrame::Results::Details frame_details; frame_details.url = frame_url.spec(); @@ -489,28 +481,21 @@ bool WebNavigationGetFrameFunction::RunSync() { frame_navigation_state.GetErrorOccurredInFrame(render_frame_host); frame_details.parent_frame_id = ExtensionApiFrameIdMap::GetFrameId(render_frame_host->GetParent()); - results_ = GetFrame::Results::Create(frame_details); - return true; + return RespondNow(ArgumentList(GetFrame::Results::Create(frame_details))); } -bool WebNavigationGetAllFramesFunction::RunSync() { +ExtensionFunction::ResponseAction WebNavigationGetAllFramesFunction::Run() { std::unique_ptr params( GetAllFrames::Params::Create(*args_)); EXTENSION_FUNCTION_VALIDATE(params.get()); int tab_id = params->details.tab_id; - SetResult(base::Value::CreateNullValue()); - content::WebContents* web_contents; - if (!ExtensionTabUtil::GetTabById(tab_id, - GetProfile(), - include_incognito(), - NULL, - NULL, - &web_contents, - NULL) || + if (!ExtensionTabUtil::GetTabById(tab_id, browser_context(), + include_incognito(), nullptr, nullptr, + &web_contents, nullptr) || !web_contents) { - return true; + return RespondNow(OneArgument(base::Value::CreateNullValue())); } WebNavigationTabObserver* observer = @@ -535,8 +520,7 @@ bool WebNavigationGetAllFramesFunction::RunSync() { frame.error_occurred = navigation_state.GetErrorOccurredInFrame(*it); result_list.push_back(std::move(frame)); } - results_ = GetAllFrames::Results::Create(result_list); - return true; + return RespondNow(ArgumentList(GetAllFrames::Results::Create(result_list))); } WebNavigationAPI::WebNavigationAPI(content::BrowserContext* context) diff --git a/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_api.h b/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_api.h index e583c357f5c..47a2915470d 100644 --- a/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_api.h +++ b/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_api.h @@ -169,16 +169,16 @@ class WebNavigationEventRouter : public TabStripModelObserver, }; // API function that returns the state of a given frame. -class WebNavigationGetFrameFunction : public ChromeSyncExtensionFunction { +class WebNavigationGetFrameFunction : public UIThreadExtensionFunction { ~WebNavigationGetFrameFunction() override {} - bool RunSync() override; + ResponseAction Run() override; DECLARE_EXTENSION_FUNCTION("webNavigation.getFrame", WEBNAVIGATION_GETFRAME) }; // API function that returns the states of all frames in a given tab. -class WebNavigationGetAllFramesFunction : public ChromeSyncExtensionFunction { +class WebNavigationGetAllFramesFunction : public UIThreadExtensionFunction { ~WebNavigationGetAllFramesFunction() override {} - bool RunSync() override; + ResponseAction Run() override; DECLARE_EXTENSION_FUNCTION("webNavigation.getAllFrames", WEBNAVIGATION_GETALLFRAMES) }; 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 c542d111c49..0031c798f90 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 @@ -41,6 +41,7 @@ #include "content/public/browser/resource_dispatcher_host.h" #include "content/public/browser/resource_throttle.h" #include "content/public/browser/web_contents.h" +#include "content/public/common/browser_side_navigation_policy.h" #include "content/public/common/context_menu_params.h" #include "content/public/common/resource_type.h" #include "content/public/common/url_constants.h" @@ -53,8 +54,8 @@ #include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/embedded_test_server/http_request.h" #include "net/test/embedded_test_server/http_response.h" +#include "third_party/WebKit/public/platform/WebInputEvent.h" #include "third_party/WebKit/public/web/WebContextMenuData.h" -#include "third_party/WebKit/public/web/WebInputEvent.h" using content::ResourceType; using content::WebContents; @@ -120,8 +121,7 @@ class TestNavigationListener // // Needs to be invoked on the IO thread. content::ResourceThrottle* CreateResourceThrottle( - const GURL& url, - ResourceType resource_type) { + const GURL& url) { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); if (urls_to_delay_.find(url) == urls_to_delay_.end()) return NULL; @@ -320,8 +320,7 @@ class TestResourceDispatcherHostDelegate resource_type, throttles); content::ResourceThrottle* throttle = - test_navigation_listener_->CreateResourceThrottle(request->url(), - resource_type); + test_navigation_listener_->CreateResourceThrottle(request->url()); if (throttle) throttles->push_back(throttle); } @@ -405,7 +404,12 @@ IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, ClientRedirect) { << message_; } -IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, ServerRedirect) { +#if defined(OS_LINUX) // http://crbug.com/660288 +#define MAYBE_ServerRedirect DISABLED_ServerRedirect +#else +#define MAYBE_ServerRedirect ServerRedirect +#endif +IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, MAYBE_ServerRedirect) { ASSERT_TRUE(StartEmbeddedTestServer()); ASSERT_TRUE(RunExtensionTest("webnavigation/serverRedirect")) << message_; @@ -504,7 +508,13 @@ IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, FilteredTest) { ASSERT_TRUE(RunExtensionTest("webnavigation/filtered")) << message_; } -IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, UserAction) { +// 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) { content::IsolateAllSitesForTesting(base::CommandLine::ForCurrentProcess()); ASSERT_TRUE(StartEmbeddedTestServer()); @@ -681,6 +691,11 @@ IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, CrossProcess) { // resumes all URL requests. Instead, the test explicitly delays each URL // and resumes manually at the required time. IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, CrossProcessAbort) { + // This test does not make sense in PlzNavigate mode, as simultanious + // navigations that make network requests are not supported. + if (content::IsBrowserSideNavigationEnabled()) + return; + ASSERT_TRUE(StartEmbeddedTestServer()); // Add the cross-site URL delay early on, as loading the extension will diff --git a/chromium/chrome/browser/extensions/api/web_request/chrome_extension_web_request_event_router_delegate.cc b/chromium/chrome/browser/extensions/api/web_request/chrome_extension_web_request_event_router_delegate.cc index 96f2a1c76d7..e473d02dd0f 100644 --- a/chromium/chrome/browser/extensions/api/web_request/chrome_extension_web_request_event_router_delegate.cc +++ b/chromium/chrome/browser/extensions/api/web_request/chrome_extension_web_request_event_router_delegate.cc @@ -22,6 +22,11 @@ void NotifyWebRequestWithheldOnUI(int render_process_id, content::RenderFrameHost::FromID(render_process_id, render_frame_id); if (!rfh) return; + // We don't count subframe blocked actions as yet, since there's no way to + // surface this to the user. Ignore these (which is also what we do for + // content scripts). + if (rfh->GetParent()) + return; content::WebContents* web_contents = content::WebContents::FromRenderFrameHost(rfh); if (!web_contents) 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 c007c13476e..004116e4948 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 @@ -29,6 +29,7 @@ #include "base/time/time.h" #include "chrome/browser/content_settings/cookie_settings_factory.h" #include "chrome/browser/extensions/event_router_forwarder.h" +#include "chrome/browser/net/chrome_extensions_network_delegate.h" #include "chrome/browser/net/chrome_network_delegate.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" @@ -36,7 +37,7 @@ #include "components/about_handler/about_protocol_handler.h" #include "components/content_settings/core/browser/cookie_settings.h" #include "components/prefs/pref_member.h" -#include "components/syncable_prefs/testing_pref_service_syncable.h" +#include "components/sync_preferences/testing_pref_service_syncable.h" #include "content/public/common/url_constants.h" #include "content/public/test/test_browser_thread_bundle.h" #include "extensions/browser/api/web_request/upload_data_presenter.h" @@ -125,19 +126,15 @@ bool HasWarning(const WarningSet& warnings, } // Parses the JSON data attached to the |message| and tries to return it. -// |param| must outlive |out|. Returns NULL on failure. +// |param| must outlive |out|. void GetPartOfMessageArguments(IPC::Message* message, const base::DictionaryValue** out, - ExtensionMsg_MessageInvoke::Param* param) { - ASSERT_EQ(ExtensionMsg_MessageInvoke::ID, message->type()); - ASSERT_TRUE(ExtensionMsg_MessageInvoke::Read(message, param)); - ASSERT_GE(std::get<3>(*param).GetSize(), 2u); - const base::Value* value = NULL; - ASSERT_TRUE(std::get<3>(*param).Get(1, &value)); - const base::ListValue* list = NULL; - ASSERT_TRUE(value->GetAsList(&list)); - ASSERT_EQ(1u, list->GetSize()); - ASSERT_TRUE(list->GetDictionary(0, out)); + ExtensionMsg_DispatchEvent::Param* param) { + ASSERT_EQ(ExtensionMsg_DispatchEvent::ID, message->type()); + ASSERT_TRUE(ExtensionMsg_DispatchEvent::Read(message, param)); + const base::ListValue& list = std::get<1>(*param); + ASSERT_EQ(1u, list.GetSize()); + ASSERT_TRUE(list.GetDictionary(0, out)); } } // namespace @@ -167,7 +164,7 @@ class TestIPCSender : public IPC::Sender { private: // IPC::Sender bool Send(IPC::Message* message) override { - EXPECT_EQ(ExtensionMsg_MessageInvoke::ID, message->type()); + EXPECT_EQ(ExtensionMsg_DispatchEvent::ID, message->type()); EXPECT_FALSE(task_queue_.empty()); base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, @@ -196,8 +193,7 @@ class ExtensionWebRequestTest : public testing::Test { &enable_referrers_, nullptr, nullptr, nullptr, nullptr, profile_.GetTestingPrefService()); network_delegate_.reset( - new ChromeNetworkDelegate(event_router_.get(), &enable_referrers_, - metrics::UpdateUsagePrefCallbackType())); + new ChromeNetworkDelegate(event_router_.get(), &enable_referrers_)); network_delegate_->set_profile(&profile_); network_delegate_->set_cookie_settings( CookieSettingsFactory::GetForProfile(&profile_).get()); @@ -299,8 +295,7 @@ TEST_F(ExtensionWebRequestTest, BlockingEventPrecedenceRedirect) { base::RunLoop().Run(); EXPECT_TRUE(!request->is_pending()); - EXPECT_EQ(net::URLRequestStatus::SUCCESS, request->status().status()); - EXPECT_EQ(0, request->status().error()); + EXPECT_EQ(net::OK, delegate_.request_status()); EXPECT_EQ(redirect_url, request->url()); EXPECT_EQ(2U, request->url_chain().size()); EXPECT_EQ(0U, ipc_sender_.GetNumTasks()); @@ -350,8 +345,7 @@ TEST_F(ExtensionWebRequestTest, BlockingEventPrecedenceRedirect) { base::RunLoop().Run(); EXPECT_TRUE(!request2->is_pending()); - EXPECT_EQ(net::URLRequestStatus::SUCCESS, request2->status().status()); - EXPECT_EQ(0, request2->status().error()); + EXPECT_EQ(net::OK, delegate_.request_status()); EXPECT_EQ(redirect_url, request2->url()); EXPECT_EQ(2U, request2->url_chain().size()); EXPECT_EQ(0U, ipc_sender_.GetNumTasks()); @@ -419,8 +413,7 @@ TEST_F(ExtensionWebRequestTest, BlockingEventPrecedenceCancel) { base::RunLoop().Run(); EXPECT_TRUE(!request->is_pending()); - EXPECT_EQ(net::URLRequestStatus::FAILED, request->status().status()); - EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, request->status().error()); + EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, delegate_.request_status()); EXPECT_EQ(request_url, request->url()); EXPECT_EQ(1U, request->url_chain().size()); EXPECT_EQ(0U, ipc_sender_.GetNumTasks()); @@ -483,12 +476,11 @@ TEST_F(ExtensionWebRequestTest, SimulateChancelWhileBlocked) { request->Start(); // request->Start() will have submitted OnBeforeRequest by the time we cancel. - request->Cancel(); + int net_error = request->Cancel(); run_loop.Run(); + EXPECT_EQ(net::ERR_ABORTED, net_error); EXPECT_TRUE(!request->is_pending()); - EXPECT_EQ(net::URLRequestStatus::CANCELED, request->status().status()); - EXPECT_EQ(net::ERR_ABORTED, request->status().error()); EXPECT_EQ(request_url, request->url()); EXPECT_EQ(1U, request->url_chain().size()); EXPECT_EQ(0U, ipc_sender_.GetNumTasks()); @@ -702,8 +694,8 @@ TEST_F(ExtensionWebRequestTest, AccessRequestBodyData) { SCOPED_TRACE(testing::Message("iteration number ") << test); EXPECT_NE(i, ipc_sender_.sent_end()); message = (i++)->get(); - const base::DictionaryValue* details; - ExtensionMsg_MessageInvoke::Param param; + const base::DictionaryValue* details = nullptr; + ExtensionMsg_DispatchEvent::Param param; GetPartOfMessageArguments(message, &details, ¶m); ASSERT_TRUE(details != NULL); const base::Value* result = NULL; @@ -794,7 +786,7 @@ TEST_F(ExtensionWebRequestTest, MinimalAccessRequestBodyData) { EXPECT_NE(i, ipc_sender_.sent_end()); IPC::Message* message = i->get(); const base::DictionaryValue* details = nullptr; - ExtensionMsg_MessageInvoke::Param param; + ExtensionMsg_DispatchEvent::Param param; GetPartOfMessageArguments(message, &details, ¶m); ASSERT_TRUE(details != nullptr); EXPECT_EQ(kExpected[test], details->HasKey(keys::kRequestBodyKey)); @@ -850,8 +842,8 @@ TEST_F(ExtensionWebRequestTest, NoAccessRequestBodyData) { SCOPED_TRACE(testing::Message("iteration number ") << test); EXPECT_NE(i, ipc_sender_.sent_end()); IPC::Message* message = i->get(); - const base::DictionaryValue* details = NULL; - ExtensionMsg_MessageInvoke::Param param; + const base::DictionaryValue* details = nullptr; + ExtensionMsg_DispatchEvent::Param param; GetPartOfMessageArguments(message, &details, ¶m); ASSERT_TRUE(details != NULL); EXPECT_FALSE(details->HasKey(keys::kRequestBodyKey)); @@ -1007,8 +999,7 @@ class ExtensionWebRequestHeaderModificationTest &enable_referrers_, nullptr, nullptr, nullptr, nullptr, profile_.GetTestingPrefService()); network_delegate_.reset( - new ChromeNetworkDelegate(event_router_.get(), &enable_referrers_, - metrics::UpdateUsagePrefCallbackType())); + new ChromeNetworkDelegate(event_router_.get(), &enable_referrers_)); network_delegate_->set_profile(&profile_); network_delegate_->set_cookie_settings( CookieSettingsFactory::GetForProfile(&profile_).get()); @@ -1121,7 +1112,7 @@ TEST_P(ExtensionWebRequestHeaderModificationTest, TestModifications) { EXPECT_TRUE(!request->is_pending()); // This cannot succeed as we send the request to a server that does not exist. - EXPECT_EQ(net::URLRequestStatus::FAILED, request->status().status()); + EXPECT_EQ(net::ERR_NAME_NOT_RESOLVED, delegate_.request_status()); EXPECT_EQ(request_url, request->url()); EXPECT_EQ(1U, request->url_chain().size()); EXPECT_EQ(0U, ipc_sender_.GetNumTasks()); @@ -1141,31 +1132,27 @@ TEST_P(ExtensionWebRequestHeaderModificationTest, TestModifications) { TestIPCSender::SentMessages::const_iterator i; for (i = ipc_sender_.sent_begin(); i != ipc_sender_.sent_end(); ++i) { IPC::Message* message = i->get(); - if (ExtensionMsg_MessageInvoke::ID != message->type()) + if (ExtensionMsg_DispatchEvent::ID != message->type()) continue; - ExtensionMsg_MessageInvoke::Param message_tuple; - ExtensionMsg_MessageInvoke::Read(message, &message_tuple); - base::ListValue& args = std::get<3>(message_tuple); + ExtensionMsg_DispatchEvent::Param message_tuple; + ExtensionMsg_DispatchEvent::Read(message, &message_tuple); + const ExtensionMsg_DispatchEvent_Params& params = + std::get<0>(message_tuple); - std::string event_name; - if (!args.GetString(0, &event_name) || - event_name != std::string(keys::kOnSendHeadersEvent) + "/3") { + if (params.event_name != std::string(keys::kOnSendHeadersEvent) + "/3") continue; - } - - base::ListValue* event_arg = NULL; - ASSERT_TRUE(args.GetList(1, &event_arg)); - base::DictionaryValue* event_arg_dict = NULL; - ASSERT_TRUE(event_arg->GetDictionary(0, &event_arg_dict)); + const base::ListValue& event_args = std::get<1>(message_tuple); + const base::DictionaryValue* event_arg_dict = nullptr; + ASSERT_TRUE(event_args.GetDictionary(0, &event_arg_dict)); - base::ListValue* request_headers = NULL; + const base::ListValue* request_headers = nullptr; ASSERT_TRUE(event_arg_dict->GetList(keys::kRequestHeadersKey, &request_headers)); net::HttpRequestHeaders observed_headers; for (size_t j = 0; j < request_headers->GetSize(); ++j) { - base::DictionaryValue* header = NULL; + const base::DictionaryValue* header = nullptr; ASSERT_TRUE(request_headers->GetDictionary(j, &header)); std::string key; std::string value; 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 a0ea8893dbb..6c145daf861 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 @@ -22,8 +22,10 @@ #include "chrome/common/extensions/extension_process_policy.h" #include "chrome/test/base/search_test_utils.h" #include "chrome/test/base/ui_test_utils.h" +#include "chromeos/login/login_state.h" #include "content/public/browser/notification_registrar.h" #include "content/public/browser/notification_service.h" +#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/render_widget_host.h" #include "content/public/browser/web_contents.h" @@ -37,7 +39,7 @@ #include "extensions/test/result_catcher.h" #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" -#include "third_party/WebKit/public/web/WebInputEvent.h" +#include "third_party/WebKit/public/platform/WebInputEvent.h" using content::WebContents; @@ -83,14 +85,14 @@ const char kPerformXhrJs[] = "};\n" "xhr.send();\n"; -// Performs an XHR in the given |web_contents|, replying when complete. -void PerformXhrInPage(content::WebContents* web_contents, +// Performs an XHR in the given |frame|, replying when complete. +void PerformXhrInFrame(content::RenderFrameHost* frame, const std::string& host, int port, const std::string& page) { bool success = false; EXPECT_TRUE(ExecuteScriptAndExtractBool( - web_contents, + frame, base::StringPrintf(kPerformXhrJs, host.c_str(), port, page.c_str()), &success)); EXPECT_TRUE(success); @@ -161,6 +163,23 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebRequestTypes) { ASSERT_TRUE(RunExtensionSubtest("webrequest", "test_types.html")) << message_; } +#if defined(OS_CHROMEOS) +IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebRequestPublicSession) { + ASSERT_TRUE(StartEmbeddedTestServer()); + // Set Public Session state. + chromeos::LoginState::Get()->SetLoggedInState( + chromeos::LoginState::LOGGED_IN_ACTIVE, + chromeos::LoginState::LOGGED_IN_USER_PUBLIC_ACCOUNT); + // Disable a CHECK while doing api tests. + WebRequestPermissions::AllowAllExtensionLocationsInPublicSessionForTesting( + true); + ASSERT_TRUE(RunExtensionSubtest("webrequest_public_session", "test.html")) << + message_; + WebRequestPermissions::AllowAllExtensionLocationsInPublicSessionForTesting( + false); +} +#endif // defined(OS_CHROMEOS) + // Test that a request to an OpenSearch description document (OSDD) generates // an event with the expected details. IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebRequestTestOSDD) { @@ -529,7 +548,11 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebRequestWithWithheldPermissions) { FeatureSwitch::ScopedOverride enable_scripts_require_action( FeatureSwitch::scripts_require_action(), true); - ASSERT_TRUE(StartEmbeddedTestServer()); + + host_resolver()->AddRule("*", "127.0.0.1"); + ASSERT_TRUE(embedded_test_server()->Start()); + content::SetupCrossSiteRedirector(embedded_test_server()); + // Load an extension that registers a listener for webRequest events, and // wait 'til it's initialized. ExtensionTestMessageListener listener("ready", false); @@ -539,8 +562,9 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, EXPECT_TRUE(listener.WaitUntilSatisfied()); // Navigate the browser to a page in a new tab. - const std::string kHost = "example.com"; - GURL url = embedded_test_server()->GetURL(kHost, "/empty.html"); + GURL url = embedded_test_server()->GetURL( + "/cross-site/a.com/iframe_cross_site.html"); + const std::string kHost = "a.com"; chrome::NavigateParams params(browser(), url, ui::PAGE_TRANSITION_LINK); params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB; ui_test_utils::NavigateToURL(¶ms); @@ -558,12 +582,32 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, // The extension shouldn't have currently received any webRequest events, // since it doesn't have permission (and shouldn't receive any from an XHR). EXPECT_EQ(0, GetWebRequestCountFromBackgroundPage(extension, profile())); - PerformXhrInPage(web_contents, kHost, port, kXhrPath); + + content::RenderFrameHost* main_frame = nullptr; + content::RenderFrameHost* child_frame = nullptr; + auto get_main_and_child_frame = [](content::WebContents* web_contents, + content::RenderFrameHost** main_frame, + content::RenderFrameHost** child_frame) { + *child_frame = nullptr; + *main_frame = web_contents->GetMainFrame(); + std::vector all_frames = + web_contents->GetAllFrames(); + ASSERT_EQ(3u, all_frames.size()); + *child_frame = all_frames[0] == *main_frame ? all_frames[1] : all_frames[0]; + ASSERT_TRUE(*child_frame); + }; + + get_main_and_child_frame(web_contents, &main_frame, &child_frame); + const std::string kMainHost = main_frame->GetLastCommittedURL().host(); + const std::string kChildHost = child_frame->GetLastCommittedURL().host(); + + PerformXhrInFrame(main_frame, kHost, port, kXhrPath); + PerformXhrInFrame(child_frame, kChildHost, port, kXhrPath); EXPECT_EQ(0, GetWebRequestCountFromBackgroundPage(extension, profile())); + EXPECT_EQ(BLOCKED_ACTION_WEB_REQUEST, runner->GetBlockedActions(extension)); // Grant activeTab permission, and perform another XHR. The extension should // receive the event. - EXPECT_EQ(BLOCKED_ACTION_WEB_REQUEST, runner->GetBlockedActions(extension)); runner->set_default_bubble_close_action_for_testing( base::WrapUnique(new ToolbarActionsBarBubbleDelegate::CloseAction( ToolbarActionsBarBubbleDelegate::CLOSE_EXECUTE))); @@ -571,16 +615,27 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, base::RunLoop().RunUntilIdle(); EXPECT_TRUE(content::WaitForLoadStop(web_contents)); // The runner will have refreshed the page... + get_main_and_child_frame(web_contents, &main_frame, &child_frame); EXPECT_EQ(BLOCKED_ACTION_NONE, runner->GetBlockedActions(extension)); + int xhr_count = GetWebRequestCountFromBackgroundPage(extension, profile()); - // ... which means that we should have a non-zero xhr count. + // ... which means that we should have a non-zero xhr count... EXPECT_GT(xhr_count, 0); - // And the extension should receive future events. - PerformXhrInPage(web_contents, kHost, port, kXhrPath); + // ... and the extension should receive future events. + PerformXhrInFrame(main_frame, kHost, port, kXhrPath); ++xhr_count; EXPECT_EQ(xhr_count, GetWebRequestCountFromBackgroundPage(extension, profile())); + // However, activeTab only grants access to the main frame, not to child + // frames. As such, trying to XHR in the child frame should still fail. + PerformXhrInFrame(child_frame, kChildHost, port, kXhrPath); + EXPECT_EQ(xhr_count, + GetWebRequestCountFromBackgroundPage(extension, profile())); + // But since there's no way for the user to currently grant access to child + // frames, this shouldn't show up as a blocked action. + EXPECT_EQ(BLOCKED_ACTION_NONE, runner->GetBlockedActions(extension)); + // If we revoke the extension's tab permissions, it should no longer receive // webRequest events. ActiveTabPermissionGranter* granter = @@ -588,7 +643,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, ASSERT_TRUE(granter); granter->RevokeForTesting(); base::RunLoop().RunUntilIdle(); - PerformXhrInPage(web_contents, kHost, port, kXhrPath); + PerformXhrInFrame(main_frame, kHost, port, kXhrPath); EXPECT_EQ(xhr_count, GetWebRequestCountFromBackgroundPage(extension, profile())); EXPECT_EQ(BLOCKED_ACTION_WEB_REQUEST, runner->GetBlockedActions(extension)); diff --git a/chromium/chrome/browser/extensions/api/web_request/web_request_event_details_unittest.cc b/chromium/chrome/browser/extensions/api/web_request/web_request_event_details_unittest.cc new file mode 100644 index 00000000000..4501c524845 --- /dev/null +++ b/chromium/chrome/browser/extensions/api/web_request/web_request_event_details_unittest.cc @@ -0,0 +1,67 @@ +// 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 "extensions/browser/api/web_request/web_request_event_details.h" + +#include "testing/gtest/include/gtest/gtest.h" + +namespace extensions { + +TEST(WebRequestEventDetailsTest, WhitelistedCopyForPublicSession) { + // Create original and copy, and populate them with some values. + std::unique_ptr orig(new WebRequestEventDetails); + std::unique_ptr copy(new WebRequestEventDetails); + + const char* const safe_attributes[] = { + "method", "requestId", "timeStamp", "type", "tabId", "frameId", + "parentFrameId", "fromCache", "error", "ip", "statusLine", "statusCode" + }; + + for (WebRequestEventDetails* ptr : {orig.get(), copy.get()}) { + ptr->render_process_id_ = 1; + ptr->render_frame_id_ = 2; + ptr->extra_info_spec_ = 3; + + ptr->request_body_.reset(new base::DictionaryValue); + ptr->request_headers_.reset(new base::ListValue); + ptr->response_headers_.reset(new base::ListValue); + + for (const char* safe_attr : safe_attributes) { + ptr->dict_.SetString(safe_attr, safe_attr); + } + + ptr->dict_.SetString("url", "http://www.foo.bar/baz"); + + // Add some extra dict_ values that should be filtered out. + ptr->dict_.SetString("requestBody", "request body value"); + ptr->dict_.SetString("requestHeaders", "request headers value"); + } + + // Filter the copy out then check that filtering really works. + copy->FilterForPublicSession(); + + EXPECT_EQ(orig->render_process_id_, copy->render_process_id_); + EXPECT_EQ(orig->render_frame_id_, copy->render_frame_id_); + EXPECT_EQ(0, copy->extra_info_spec_); + + EXPECT_EQ(nullptr, copy->request_body_); + EXPECT_EQ(nullptr, copy->request_headers_); + EXPECT_EQ(nullptr, copy->response_headers_); + + for (const char* safe_attr : safe_attributes) { + std::string copy_str; + copy->dict_.GetString(safe_attr, ©_str); + EXPECT_EQ(safe_attr, copy_str); + } + + // URL is stripped down to origin. + std::string url; + copy->dict_.GetString("url", &url); + EXPECT_EQ("http://www.foo.bar/", url); + + // Extras are filtered out (+1 for url). + EXPECT_EQ(arraysize(safe_attributes) + 1, copy->dict_.size()); +} + +} // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc b/chromium/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc index 6addaada357..af28138ea03 100644 --- a/chromium/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc +++ b/chromium/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc @@ -9,6 +9,7 @@ #include "base/macros.h" #include "base/message_loop/message_loop.h" #include "chrome/common/extensions/extension_test_util.h" +#include "chromeos/login/login_state.h" #include "content/public/browser/resource_request_info.h" #include "content/public/test/test_browser_thread_bundle.h" #include "extensions/browser/api/web_request/web_request_permissions.h" @@ -22,7 +23,6 @@ #include "testing/gtest/include/gtest/gtest.h" using content::ResourceRequestInfo; -using content::ResourceType; using extensions::Extension; using extensions::Manifest; using extensions::PermissionsData; @@ -46,6 +46,9 @@ class ExtensionWebRequestHelpersTestWithThreadsTest : public testing::Test { scoped_refptr permissionless_extension_; // This extension has Web Request permissions, and *.com a host permission. scoped_refptr com_extension_; + // This extension is the same as com_extension, except it's installed from + // Manifest::EXTERNAL_POLICY_DOWNLOAD. + scoped_refptr com_policy_extension_; scoped_refptr extension_info_map_; }; @@ -68,16 +71,29 @@ void ExtensionWebRequestHelpersTestWithThreadsTest::SetUp() { "ext_id_2", &error); ASSERT_TRUE(com_extension_.get()) << error; + com_policy_extension_ = + LoadManifestUnchecked("permissions", + "web_request_com_host_permissions.json", + Manifest::EXTERNAL_POLICY_DOWNLOAD, + Extension::NO_FLAGS, + "ext_id_3", + &error); + ASSERT_TRUE(com_policy_extension_.get()) << error; extension_info_map_ = new extensions::InfoMap; extension_info_map_->AddExtension(permissionless_extension_.get(), base::Time::Now(), - false /*incognito_enabled*/, - false /*notifications_disabled*/); + false, // incognito_enabled + false); // notifications_disabled extension_info_map_->AddExtension( com_extension_.get(), base::Time::Now(), - false /*incognito_enabled*/, - false /*notifications_disabled*/); + false, // incognito_enabled + false); // notifications_disabled + extension_info_map_->AddExtension( + com_policy_extension_.get(), + base::Time::Now(), + false, // incognito_enabled + false); // notifications_disabled } TEST_F(ExtensionWebRequestHelpersTestWithThreadsTest, TestHideRequestForURL) { @@ -107,7 +123,8 @@ TEST_F(ExtensionWebRequestHelpersTestWithThreadsTest, TestHideRequestForURL) { std::unique_ptr request( context.CreateRequest(sensitive_url, net::DEFAULT_PRIORITY, NULL)); EXPECT_TRUE(WebRequestPermissions::HideRequest( - extension_info_map_.get(), request.get())) << sensitive_urls[i]; + extension_info_map_.get(), request.get(), nullptr)) << + sensitive_urls[i]; } // Check that requests are accepted if they don't touch sensitive urls. for (size_t i = 0; i < arraysize(non_sensitive_urls); ++i) { @@ -115,7 +132,8 @@ TEST_F(ExtensionWebRequestHelpersTestWithThreadsTest, TestHideRequestForURL) { std::unique_ptr request( context.CreateRequest(non_sensitive_url, net::DEFAULT_PRIORITY, NULL)); EXPECT_FALSE(WebRequestPermissions::HideRequest( - extension_info_map_.get(), request.get())) << non_sensitive_urls[i]; + extension_info_map_.get(), request.get(), nullptr)) << + non_sensitive_urls[i]; } // Check protection of requests originating from the frame showing the Chrome @@ -125,7 +143,7 @@ TEST_F(ExtensionWebRequestHelpersTestWithThreadsTest, TestHideRequestForURL) { std::unique_ptr non_sensitive_request( context.CreateRequest(non_sensitive_url, net::DEFAULT_PRIORITY, NULL)); EXPECT_FALSE(WebRequestPermissions::HideRequest( - extension_info_map_.get(), non_sensitive_request.get())); + extension_info_map_.get(), non_sensitive_request.get(), nullptr)); // If the origin is labeled by the WebStoreAppId, it becomes protected. { int process_id = 42; @@ -147,7 +165,7 @@ TEST_F(ExtensionWebRequestHelpersTestWithThreadsTest, TestHideRequestForURL) { extension_info_map_->RegisterExtensionProcess( extensions::kWebStoreAppId, process_id, site_instance_id); EXPECT_TRUE(WebRequestPermissions::HideRequest( - extension_info_map_.get(), sensitive_request.get())); + extension_info_map_.get(), sensitive_request.get(), nullptr)); } } @@ -161,25 +179,76 @@ TEST_F(ExtensionWebRequestHelpersTestWithThreadsTest, extension_info_map_.get(), permissionless_extension_->id(), request->url(), -1, // No tab id. - false /*crosses_incognito*/, + false, // crosses_incognito WebRequestPermissions::DO_NOT_CHECK_HOST)); EXPECT_EQ(PermissionsData::ACCESS_DENIED, WebRequestPermissions::CanExtensionAccessURL( extension_info_map_.get(), permissionless_extension_->id(), request->url(), -1, // No tab id. - false /*crosses_incognito*/, + false, // crosses_incognito WebRequestPermissions::REQUIRE_HOST_PERMISSION)); EXPECT_EQ(PermissionsData::ACCESS_ALLOWED, WebRequestPermissions::CanExtensionAccessURL( extension_info_map_.get(), com_extension_->id(), request->url(), -1, // No tab id. - false /*crosses_incognito*/, + false, // crosses_incognito WebRequestPermissions::REQUIRE_HOST_PERMISSION)); EXPECT_EQ(PermissionsData::ACCESS_DENIED, WebRequestPermissions::CanExtensionAccessURL( extension_info_map_.get(), com_extension_->id(), request->url(), -1, // No tab id. - false /*crosses_incognito*/, + false, // crosses_incognito WebRequestPermissions::REQUIRE_ALL_URLS)); + + // Public Sessions tests. +#if defined(OS_CHROMEOS) + std::unique_ptr org_request(context.CreateRequest( + GURL("http://example.org"), net::DEFAULT_PRIORITY, nullptr)); + + // com_extension_ doesn't have host permission for .org URLs. + EXPECT_EQ(PermissionsData::ACCESS_DENIED, + WebRequestPermissions::CanExtensionAccessURL( + extension_info_map_.get(), com_policy_extension_->id(), + org_request->url(), + -1, // No tab id. + false, // crosses_incognito + WebRequestPermissions::REQUIRE_HOST_PERMISSION)); + + // Set Public Session state. + chromeos::LoginState::Initialize(); + chromeos::LoginState::Get()->SetLoggedInState( + chromeos::LoginState::LOGGED_IN_ACTIVE, + chromeos::LoginState::LOGGED_IN_USER_PUBLIC_ACCOUNT); + + // Host permission checks are disabled in Public Sessions, instead all URLs + // are whitelisted. + EXPECT_EQ(PermissionsData::ACCESS_ALLOWED, + WebRequestPermissions::CanExtensionAccessURL( + extension_info_map_.get(), com_policy_extension_->id(), + org_request->url(), + -1, // No tab id. + false, // crosses_incognito + WebRequestPermissions::REQUIRE_HOST_PERMISSION)); + + EXPECT_EQ(PermissionsData::ACCESS_ALLOWED, + WebRequestPermissions::CanExtensionAccessURL( + extension_info_map_.get(), com_policy_extension_->id(), + org_request->url(), + -1, // No tab id. + false, // crosses_incognito + WebRequestPermissions::REQUIRE_ALL_URLS)); + + // Make sure that chrome:// URLs cannot be accessed. + std::unique_ptr chrome_request(context.CreateRequest( + GURL("chrome://version/"), net::DEFAULT_PRIORITY, nullptr)); + + EXPECT_EQ(PermissionsData::ACCESS_DENIED, + WebRequestPermissions::CanExtensionAccessURL( + extension_info_map_.get(), com_policy_extension_->id(), + chrome_request->url(), + -1, // No tab id. + false, // crosses_incognito + WebRequestPermissions::REQUIRE_HOST_PERMISSION)); +#endif } 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 8c3c475fc65..2463eb8f6e8 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 @@ -26,6 +26,7 @@ #include "chrome/browser/media/webrtc/webrtc_log_uploader.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/common/features.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" #include "content/public/browser/browser_thread.h" @@ -399,7 +400,7 @@ class HangoutServicesBrowserTest : public AudioWaitingExtensionTest { } }; -#if defined(GOOGLE_CHROME_BUILD) || defined(ENABLE_HANGOUT_SERVICES_EXTENSION) +#if BUILDFLAG(ENABLE_HANGOUT_SERVICES_EXTENSION) IN_PROC_BROWSER_TEST_F(HangoutServicesBrowserTest, RunComponentExtensionTest) { // This runs the end-to-end JavaScript test for the Hangout Services @@ -436,6 +437,6 @@ IN_PROC_BROWSER_TEST_F(HangoutServicesBrowserTest, g_browser_process->webrtc_log_uploader()->OverrideUploadWithBufferForTesting( NULL); } -#endif // defined(GOOGLE_CHROME_BUILD) || defined(ENABLE_HANGOUT_SERVICES_EXTENSION) +#endif // BUILDFLAG(ENABLE_HANGOUT_SERVICES_EXTENSION) } // namespace extensions 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 49ea727195a..b000d228473 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 @@ -469,29 +469,25 @@ bool WebrtcLoggingPrivateStartWebRtcEventLoggingFunction::RunAsync() { std::unique_ptr params( StartWebRtcEventLogging::Params::Create(*args_)); EXTENSION_FUNCTION_VALIDATE(params.get()); - if (params->seconds < 0) { FireErrorCallback("seconds must be greater than or equal to 0"); return true; } - content::RenderProcessHost* host = - RphFromRequest(params->request, params->security_origin); - if (!host) + scoped_refptr webrtc_logging_handler_host( + LoggingHandlerFromRequest(params->request, params->security_origin)); + if (!webrtc_logging_handler_host.get()) return false; - scoped_refptr webrtc_event_log_handler( - base::UserDataAdapter::Get( - host, WebRtcEventLogHandler::kWebRtcEventLogHandlerKey)); - - webrtc_event_log_handler->StartWebRtcEventLogging( - host, base::TimeDelta::FromSeconds(params->seconds), + webrtc_logging_handler_host->StartWebRtcEventLogging( + base::TimeDelta::FromSeconds(params->seconds), base::Bind( - &WebrtcLoggingPrivateStartWebRtcEventLoggingFunction::FireCallback, - this), - base::Bind( - &WebrtcLoggingPrivateStartWebRtcEventLoggingFunction::FireErrorCallback, - this)); + &WebrtcLoggingPrivateStartWebRtcEventLoggingFunction::FireCallback, + this), + base::Bind(&WebrtcLoggingPrivateStartWebRtcEventLoggingFunction:: + FireErrorCallback, + this)); + return true; } @@ -505,23 +501,19 @@ bool WebrtcLoggingPrivateStopWebRtcEventLoggingFunction::RunAsync() { StopWebRtcEventLogging::Params::Create(*args_)); EXTENSION_FUNCTION_VALIDATE(params.get()); - content::RenderProcessHost* host = - RphFromRequest(params->request, params->security_origin); - if (!host) + scoped_refptr webrtc_logging_handler_host( + LoggingHandlerFromRequest(params->request, params->security_origin)); + if (!webrtc_logging_handler_host.get()) return false; - scoped_refptr webrtc_event_log_handler( - base::UserDataAdapter::Get( - host, WebRtcEventLogHandler::kWebRtcEventLogHandlerKey)); - - webrtc_event_log_handler->StopWebRtcEventLogging( - host, - base::Bind( - &WebrtcLoggingPrivateStopWebRtcEventLoggingFunction::FireCallback, - this), + webrtc_logging_handler_host->StopWebRtcEventLogging( base::Bind( - &WebrtcLoggingPrivateStopWebRtcEventLoggingFunction::FireErrorCallback, - this)); + &WebrtcLoggingPrivateStopWebRtcEventLoggingFunction::FireCallback, + this), + base::Bind(&WebrtcLoggingPrivateStopWebRtcEventLoggingFunction:: + FireErrorCallback, + this)); + return true; } 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 e037c2ed376..8f394423414 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 @@ -41,6 +41,11 @@ #include "net/url_request/url_request.h" #include "url/gurl.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 + namespace extensions { namespace BeginInstallWithManifest3 = @@ -263,13 +268,32 @@ void WebstorePrivateBeginInstallWithManifest3Function::OnWebstoreParseSuccess( return; } - // Check the management policy before the installation process begins + // Check the management policy before the installation process begins. + Profile* profile = chrome_details_.GetProfile(); base::string16 policy_error; - bool allow = ExtensionSystem::Get(chrome_details_.GetProfile())-> + bool allow = ExtensionSystem::Get(profile)-> management_policy()->UserMayLoad(dummy_extension_.get(), &policy_error); if (!allow) { - Respond(BuildResponse(api::webstore_private::RESULT_BLOCKED_BY_POLICY, - base::UTF16ToUTF8(policy_error))); + 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) + api::webstore_private::Result code = + blocked_for_child + ? api::webstore_private::RESULT_BLOCKED_FOR_CHILD_ACCOUNT + : api::webstore_private::RESULT_BLOCKED_BY_POLICY; + Respond(BuildResponse(code, base::UTF16ToUTF8(policy_error))); // Matches the AddRef in Run(). Release(); return; 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 44c766682bd..0bdcebc704a 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 @@ -21,6 +21,7 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/common/chrome_switches.h" +#include "chrome/common/features.h" #include "chrome/test/base/ui_test_utils.h" #include "content/public/browser/gpu_data_manager.h" #include "content/public/browser/notification_observer.h" @@ -36,6 +37,10 @@ #include "net/test/embedded_test_server/embedded_test_server.h" #include "ui/gl/gl_switches.h" +#if BUILDFLAG(ENABLE_SUPERVISED_USERS) +#include "chrome/browser/supervised_user/supervised_user_constants.h" +#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS) + using gpu::GpuFeatureType; namespace utils = extension_function_test_utils; @@ -345,6 +350,44 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, EmptyCrx) { ASSERT_TRUE(RunInstallTest("empty.html", "empty.crx")); } +#if BUILDFLAG(ENABLE_SUPERVISED_USERS) + +class ExtensionWebstorePrivateApiTestSupervised + : public ExtensionWebstorePrivateApiTest { + public: + void SetUpCommandLine(base::CommandLine* command_line) override { + ExtensionWebstorePrivateApiTest::SetUpCommandLine(command_line); + command_line->AppendSwitchASCII(switches::kSupervisedUserId, "not_empty"); + } +}; + +// Tests that extension installation is blocked for supervised users. +// Note: This will have to be updated if we enable SU-initiated installs. +IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTestSupervised, + InstallBlocked) { + ASSERT_TRUE( + RunInstallTest("begin_install_fail_supervised.html", "extension.crx")); +} + +class ExtensionWebstorePrivateApiTestChild + : public ExtensionWebstorePrivateApiTest { + public: + void SetUpCommandLine(base::CommandLine* command_line) override { + ExtensionWebstorePrivateApiTest::SetUpCommandLine(command_line); + command_line->AppendSwitchASCII(switches::kSupervisedUserId, + supervised_users::kChildAccountSUID); + } +}; + +// Tests that extension installation is blocked for child accounts, and +// attempting to do so produces a special error code. +// Note: This will have to be updated when we enable child-initiated installs. +IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTestChild, InstallBlocked) { + ASSERT_TRUE(RunInstallTest("begin_install_fail_child.html", "extension.crx")); +} + +#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS) + class ExtensionWebstoreGetWebGLStatusTest : public InProcessBrowserTest { protected: void RunTest(bool webgl_allowed) { diff --git a/chromium/chrome/browser/media/router/mojo/media_router.mojom b/chromium/chrome/browser/media/router/mojo/media_router.mojom index 0971cb5b24f..e68a1e09f02 100644 --- a/chromium/chrome/browser/media/router/mojo/media_router.mojom +++ b/chromium/chrome/browser/media/router/mojo/media_router.mojom @@ -49,7 +49,7 @@ struct MediaRoute { // Set to true if this route should be displayed for |media_sink_id| in UI. bool for_display; // Set to true if this route was created by an incognito profile. - bool incognito; + bool is_incognito; }; // Notifications or an actionable events to be shown to the user. diff --git a/chromium/chrome/browser/ntp_snippets/BUILD.gn b/chromium/chrome/browser/ntp_snippets/BUILD.gn new file mode 100644 index 00000000000..474a6f8fb15 --- /dev/null +++ b/chromium/chrome/browser/ntp_snippets/BUILD.gn @@ -0,0 +1,13 @@ +# 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. + +source_set("test_support") { + testonly = true + sources = [ + "fake_download_item.cc", + "fake_download_item.h", + ] + + deps = [] +} diff --git a/chromium/chrome/browser/printing/background_printing_manager.cc b/chromium/chrome/browser/printing/background_printing_manager.cc index cc7adae4c60..af8ed4cd2cc 100644 --- a/chromium/chrome/browser/printing/background_printing_manager.cc +++ b/chromium/chrome/browser/printing/background_printing_manager.cc @@ -5,6 +5,7 @@ #include "chrome/browser/printing/background_printing_manager.h" #include "base/location.h" +#include "base/memory/ptr_util.h" #include "base/single_thread_task_runner.h" #include "base/stl_util.h" #include "base/threading/thread_task_runner_handle.h" @@ -61,7 +62,6 @@ BackgroundPrintingManager::~BackgroundPrintingManager() { // preview WebContents trying to print). In such a case it will fail to print, // but we should at least clean up the observers. // TODO(thestig): Handle this case better. - base::STLDeleteValues(&printing_contents_map_); } void BackgroundPrintingManager::OwnPrintPreviewDialog( @@ -70,7 +70,8 @@ void BackgroundPrintingManager::OwnPrintPreviewDialog( DCHECK(PrintPreviewDialogController::IsPrintPreviewDialog(preview_dialog)); CHECK(!HasPrintPreviewDialog(preview_dialog)); - printing_contents_map_[preview_dialog] = new Observer(this, preview_dialog); + printing_contents_map_[preview_dialog] = + base::MakeUnique(this, preview_dialog); // Watch for print jobs finishing. Everything else is watched for by the // Observer. TODO(avi, cait): finish the job of removing this last @@ -99,8 +100,7 @@ void BackgroundPrintingManager::Observe( void BackgroundPrintingManager::DeletePreviewContents( WebContents* preview_contents) { - WebContentsObserverMap::iterator i = - printing_contents_map_.find(preview_contents); + auto i = printing_contents_map_.find(preview_contents); if (i == printing_contents_map_.end()) { // Everyone is racing to be the first to delete the |preview_contents|. If // this case is hit, someone else won the race, so there is no need to @@ -111,9 +111,7 @@ void BackgroundPrintingManager::DeletePreviewContents( // Stop all observation ... registrar_.Remove(this, chrome::NOTIFICATION_PRINT_JOB_RELEASED, content::Source(preview_contents)); - Observer* observer = i->second; printing_contents_map_.erase(i); - delete observer; // ... and mortally wound the contents. (Deletion immediately is not a good // idea in case this was called from RenderViewGone.) @@ -122,10 +120,9 @@ void BackgroundPrintingManager::DeletePreviewContents( std::set BackgroundPrintingManager::CurrentContentSet() { std::set result; - for (WebContentsObserverMap::iterator i = printing_contents_map_.begin(); - i != printing_contents_map_.end(); ++i) { - result.insert(i->first); - } + for (const auto& entry : printing_contents_map_) + result.insert(entry.first); + return result; } diff --git a/chromium/chrome/browser/printing/background_printing_manager.h b/chromium/chrome/browser/printing/background_printing_manager.h index 0747603b591..c304be0156b 100644 --- a/chromium/chrome/browser/printing/background_printing_manager.h +++ b/chromium/chrome/browser/printing/background_printing_manager.h @@ -6,6 +6,7 @@ #define CHROME_BROWSER_PRINTING_BACKGROUND_PRINTING_MANAGER_H_ #include +#include #include #include "base/compiler_specific.h" @@ -29,7 +30,6 @@ class BackgroundPrintingManager : public base::NonThreadSafe, public content::NotificationObserver { public: class Observer; - typedef std::map WebContentsObserverMap; BackgroundPrintingManager(); ~BackgroundPrintingManager() override; @@ -56,7 +56,8 @@ class BackgroundPrintingManager : public base::NonThreadSafe, // A map from print preview WebContentses (managed by // BackgroundPrintingManager) to the Observers that observe them. - WebContentsObserverMap printing_contents_map_; + std::map> + printing_contents_map_; content::NotificationRegistrar registrar_; diff --git a/chromium/chrome/browser/printing/cloud_print/cloud_print_proxy_service_unittest.cc b/chromium/chrome/browser/printing/cloud_print/cloud_print_proxy_service_unittest.cc index fb3d430bae3..f8d1c524d62 100644 --- a/chromium/chrome/browser/printing/cloud_print/cloud_print_proxy_service_unittest.cc +++ b/chromium/chrome/browser/printing/cloud_print/cloud_print_proxy_service_unittest.cc @@ -26,7 +26,7 @@ #include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile_manager.h" #include "components/prefs/testing_pref_service.h" -#include "components/syncable_prefs/testing_pref_service_syncable.h" +#include "components/sync_preferences/testing_pref_service_syncable.h" #include "content/public/browser/browser_thread.h" #include "content/public/test/test_browser_thread.h" #include "testing/gmock/include/gmock/gmock.h" @@ -242,7 +242,7 @@ TEST_F(CloudPrintProxyPolicyTest, StartWithNoPolicyProxyDisabled) { service.GetMockServiceProcessControl()->SetConnectSuccessMockExpectations( MockServiceProcessControl::kServiceStateDisabled, false); - syncable_prefs::TestingPrefServiceSyncable* prefs = + sync_preferences::TestingPrefServiceSyncable* prefs = profile_.GetTestingPrefService(); prefs->SetUserPref( prefs::kCloudPrintEmail, @@ -259,7 +259,7 @@ TEST_F(CloudPrintProxyPolicyTest, StartWithNoPolicyProxyEnabled) { service.GetMockServiceProcessControl()->SetConnectSuccessMockExpectations( MockServiceProcessControl::kServiceStateEnabled, false); - syncable_prefs::TestingPrefServiceSyncable* prefs = + sync_preferences::TestingPrefServiceSyncable* prefs = profile_.GetTestingPrefService(); prefs->SetUserPref(prefs::kCloudPrintEmail, new base::StringValue(std::string())); @@ -277,7 +277,7 @@ TEST_F(CloudPrintProxyPolicyTest, StartWithPolicySetProxyDisabled) { service.GetMockServiceProcessControl()->SetConnectSuccessMockExpectations( MockServiceProcessControl::kServiceStateDisabled, false); - syncable_prefs::TestingPrefServiceSyncable* prefs = + sync_preferences::TestingPrefServiceSyncable* prefs = profile_.GetTestingPrefService(); prefs->SetUserPref(prefs::kCloudPrintEmail, new base::StringValue(std::string())); @@ -296,7 +296,7 @@ TEST_F(CloudPrintProxyPolicyTest, StartWithPolicySetProxyEnabled) { MockServiceProcessControl::kServiceStateEnabled, false); service.GetMockServiceProcessControl()->SetWillBeDisabledExpectations(); - syncable_prefs::TestingPrefServiceSyncable* prefs = + sync_preferences::TestingPrefServiceSyncable* prefs = profile_.GetTestingPrefService(); prefs->SetUserPref(prefs::kCloudPrintEmail, new base::StringValue(std::string())); @@ -314,7 +314,7 @@ TEST_F(CloudPrintProxyPolicyTest, StartWithNoPolicyProxyDisabledThenSetPolicy) { service.GetMockServiceProcessControl()->SetConnectSuccessMockExpectations( MockServiceProcessControl::kServiceStateDisabled, false); - syncable_prefs::TestingPrefServiceSyncable* prefs = + sync_preferences::TestingPrefServiceSyncable* prefs = profile_.GetTestingPrefService(); prefs->SetUserPref( prefs::kCloudPrintEmail, @@ -336,7 +336,7 @@ TEST_F(CloudPrintProxyPolicyTest, StartWithNoPolicyProxyEnabledThenSetPolicy) { service.GetMockServiceProcessControl()->SetConnectSuccessMockExpectations( MockServiceProcessControl::kServiceStateEnabled, false); - syncable_prefs::TestingPrefServiceSyncable* prefs = + sync_preferences::TestingPrefServiceSyncable* prefs = profile_.GetTestingPrefService(); prefs->SetUserPref(prefs::kCloudPrintEmail, new base::StringValue(std::string())); @@ -361,7 +361,7 @@ TEST_F(CloudPrintProxyPolicyTest, service.GetMockServiceProcessControl()->SetConnectSuccessMockExpectations( MockServiceProcessControl::kServiceStateDisabled, false); - syncable_prefs::TestingPrefServiceSyncable* prefs = + sync_preferences::TestingPrefServiceSyncable* prefs = profile_.GetTestingPrefService(); prefs->SetUserPref(prefs::kCloudPrintEmail, new base::StringValue(std::string())); @@ -383,7 +383,7 @@ TEST_F(CloudPrintProxyPolicyTest, MockServiceProcessControl::kServiceStateEnabled, false); service.GetMockServiceProcessControl()->SetWillBeDisabledExpectations(); - syncable_prefs::TestingPrefServiceSyncable* prefs = + sync_preferences::TestingPrefServiceSyncable* prefs = profile_.GetTestingPrefService(); prefs->SetUserPref(prefs::kCloudPrintEmail, new base::StringValue(std::string())); @@ -403,7 +403,7 @@ TEST_F(CloudPrintProxyPolicyTest, StartWithNoPolicyProxyDisabledThenEnable) { service.GetMockServiceProcessControl()->SetConnectSuccessMockExpectations( MockServiceProcessControl::kServiceStateDisabled, false); - syncable_prefs::TestingPrefServiceSyncable* prefs = + sync_preferences::TestingPrefServiceSyncable* prefs = profile_.GetTestingPrefService(); prefs->SetUserPref( prefs::kCloudPrintEmail, @@ -427,7 +427,7 @@ TEST_F(CloudPrintProxyPolicyTest, MockServiceProcessControl::kServiceStateEnabled, false); service.GetMockServiceProcessControl()->SetWillBeDisabledExpectations(); - syncable_prefs::TestingPrefServiceSyncable* prefs = + sync_preferences::TestingPrefServiceSyncable* prefs = profile_.GetTestingPrefService(); prefs->SetUserPref(prefs::kCloudPrintEmail, new base::StringValue(std::string())); diff --git a/chromium/chrome/browser/printing/cloud_print/gcd_api_flow_impl.cc b/chromium/chrome/browser/printing/cloud_print/gcd_api_flow_impl.cc index b7e83620e61..039a0edccfc 100644 --- a/chromium/chrome/browser/printing/cloud_print/gcd_api_flow_impl.cc +++ b/chromium/chrome/browser/printing/cloud_print/gcd_api_flow_impl.cc @@ -16,6 +16,7 @@ #include "chrome/browser/printing/cloud_print/gcd_constants.h" #include "chrome/common/cloud_print/cloud_print_constants.h" #include "components/cloud_devices/common/cloud_devices_urls.h" +#include "components/data_use_measurement/core/data_use_user_data.h" #include "google_apis/gaia/google_service_auth_error.h" #include "net/base/load_flags.h" #include "net/base/url_util.h" @@ -77,6 +78,8 @@ void GCDApiFlowImpl::CreateRequest(const GURL& url) { url_fetcher_->SetUploadData(upload_type, upload_data); } + data_use_measurement::DataUseUserData::AttachToFetcher( + url_fetcher_.get(), data_use_measurement::DataUseUserData::CLOUD_PRINT); url_fetcher_->SetRequestContext(request_context_.get()); std::vector extra_headers = request_->GetExtraRequestHeaders(); diff --git a/chromium/chrome/browser/printing/cloud_print/privet_http.h b/chromium/chrome/browser/printing/cloud_print/privet_http.h index 2eeb98007fb..b59743b1a5d 100644 --- a/chromium/chrome/browser/printing/cloud_print/privet_http.h +++ b/chromium/chrome/browser/printing/cloud_print/privet_http.h @@ -21,7 +21,6 @@ class Size; } namespace printing { -class PdfRenderSettings; class PWGRasterConverter; } diff --git a/chromium/chrome/browser/printing/cloud_print/privet_http_impl.cc b/chromium/chrome/browser/printing/cloud_print/privet_http_impl.cc index f62e66d4e02..7ac2cc63d22 100644 --- a/chromium/chrome/browser/printing/cloud_print/privet_http_impl.cc +++ b/chromium/chrome/browser/printing/cloud_print/privet_http_impl.cc @@ -24,9 +24,10 @@ #include "chrome/common/chrome_switches.h" #include "chrome/common/cloud_print/cloud_print_constants.h" #include "net/base/url_util.h" +#include "printing/features/features.h" #include "url/gurl.h" -#if defined(ENABLE_PRINT_PREVIEW) +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) #include "chrome/browser/printing/pwg_raster_converter.h" #include "components/cloud_devices/common/printer_description.h" #include "printing/pdf_render_settings.h" @@ -44,7 +45,7 @@ const char kPrivetRegisterUserArgName[] = "user"; const int kPrivetCancelationTimeoutSeconds = 3; -#if defined(ENABLE_PRINT_PREVIEW) +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) const char kPrivetURLKeyUserName[] = "user_name"; const char kPrivetURLKeyClientName[] = "client_name"; const char kPrivetURLKeyJobname[] = "job_name"; @@ -394,7 +395,7 @@ void PrivetJSONOperationImpl::OnNeedPrivetToken( privet_client_->RefreshPrivetToken(callback); } -#if defined(ENABLE_PRINT_PREVIEW) +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) PrivetLocalPrintOperationImpl::PrivetLocalPrintOperationImpl( PrivetHTTPClient* privet_client, PrivetLocalPrintOperation::Delegate* delegate) @@ -797,7 +798,7 @@ PrivetV1HTTPClientImpl::CreateCapabilitiesOperation( std::unique_ptr PrivetV1HTTPClientImpl::CreateLocalPrintOperation( PrivetLocalPrintOperation::Delegate* delegate) { -#if defined(ENABLE_PRINT_PREVIEW) +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) return std::unique_ptr( new PrivetLocalPrintOperationImpl(info_client(), delegate)); #else diff --git a/chromium/chrome/browser/printing/cloud_print/privet_http_impl.h b/chromium/chrome/browser/printing/cloud_print/privet_http_impl.h index 3b367262d57..d1051c6b89f 100644 --- a/chromium/chrome/browser/printing/cloud_print/privet_http_impl.h +++ b/chromium/chrome/browser/printing/cloud_print/privet_http_impl.h @@ -16,6 +16,7 @@ #include "base/memory/weak_ptr.h" #include "chrome/browser/printing/cloud_print/privet_http.h" #include "components/cloud_devices/common/cloud_device_description.h" +#include "printing/features/features.h" #include "ui/gfx/geometry/size.h" namespace cloud_print { @@ -148,7 +149,7 @@ class PrivetJSONOperationImpl : public PrivetJSONOperation, std::unique_ptr url_fetcher_; }; -#if defined(ENABLE_PRINT_PREVIEW) +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) class PrivetLocalPrintOperationImpl : public PrivetLocalPrintOperation, public PrivetURLFetcher::Delegate { 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 843553b7b0f..97119ad7a81 100644 --- a/chromium/chrome/browser/printing/cloud_print/privet_http_unittest.cc +++ b/chromium/chrome/browser/printing/cloud_print/privet_http_unittest.cc @@ -20,10 +20,11 @@ #include "net/test/embedded_test_server/embedded_test_server.h" #include "net/url_request/test_url_fetcher_factory.h" #include "net/url_request/url_request_test_util.h" +#include "printing/features/features.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -#if defined(ENABLE_PRINT_PREVIEW) +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) #include "chrome/browser/printing/pwg_raster_converter.h" #include "printing/pwg_raster_settings.h" #endif // ENABLE_PRINT_PREVIEW @@ -138,7 +139,7 @@ const char kSampleCapabilitiesResponse[] = "{" "}" "}"; -#if defined(ENABLE_PRINT_PREVIEW) +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) const char kSampleInfoResponseWithCreatejob[] = "{" " \"version\": \"1.0\"," " \"name\": \"Common printer\"," @@ -733,7 +734,7 @@ TEST_P(PrivetCapabilitiesTest, BadToken) { kSampleCapabilitiesResponse)); } -#if defined(ENABLE_PRINT_PREVIEW) +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) // A note on PWG raster conversion: The PWG raster converter used simply // converts strings to file paths based on them by appending "test.pdf", since // it's easier to test that way. Instead of using a mock, we simply check if the diff --git a/chromium/chrome/browser/printing/cloud_print/privet_notifications.cc b/chromium/chrome/browser/printing/cloud_print/privet_notifications.cc index d7eb4e9c691..acd14d025a5 100644 --- a/chromium/chrome/browser/printing/cloud_print/privet_notifications.cc +++ b/chromium/chrome/browser/printing/cloud_print/privet_notifications.cc @@ -39,12 +39,13 @@ #include "content/public/browser/navigation_controller.h" #include "content/public/browser/storage_partition.h" #include "content/public/browser/web_contents.h" +#include "net/net_features.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/page_transition_types.h" #include "ui/base/resource/resource_bundle.h" #include "ui/message_center/notifier_settings.h" -#if defined(ENABLE_MDNS) +#if BUILDFLAG(ENABLE_MDNS) #include "chrome/browser/printing/cloud_print/privet_traffic_detector.h" #endif @@ -255,6 +256,7 @@ void PrivetNotificationService::PrivetNotify(int devices_active, base::string16 product_name = l10n_util::GetStringUTF16(IDS_LOCAL_DISCOVERY_SERVICE_NAME_PRINTER); + Profile* profile = Profile::FromBrowserContext(profile_); Notification notification( message_center::NOTIFICATION_TYPE_SIMPLE, title, body, ui::ResourceBundle::GetSharedInstance().GetImageNamed( @@ -262,10 +264,9 @@ void PrivetNotificationService::PrivetNotify(int devices_active, message_center::NotifierId(message_center::NotifierId::SYSTEM_COMPONENT, kPrivetNotificationID), product_name, GURL(kPrivetNotificationOriginUrl), kPrivetNotificationID, - rich_notification_data, new PrivetNotificationDelegate(profile_)); + rich_notification_data, CreateNotificationDelegate(profile)); auto* notification_ui_manager = g_browser_process->notification_ui_manager(); - Profile* profile = Profile::FromBrowserContext(profile_); bool updated = notification_ui_manager->Update(notification, profile); if (!updated && added && !local_discovery::LocalDiscoveryUIHandler::GetHasVisible()) { @@ -349,11 +350,14 @@ void PrivetNotificationService::StartLister() { new PrivetNotificationsListener(std::move(http_factory), this)); } -PrivetNotificationDelegate::PrivetNotificationDelegate( - content::BrowserContext* profile) - : profile_(profile) { +PrivetNotificationDelegate* +PrivetNotificationService::CreateNotificationDelegate(Profile* profile) { + return new PrivetNotificationDelegate(profile); } +PrivetNotificationDelegate::PrivetNotificationDelegate(Profile* profile) + : profile_(profile) {} + PrivetNotificationDelegate::~PrivetNotificationDelegate() { } @@ -365,26 +369,29 @@ void PrivetNotificationDelegate::ButtonClick(int button_index) { if (button_index == 0) { ReportPrivetUmaEvent(PRIVET_NOTIFICATION_CLICKED); OpenTab(GURL(kPrivetNotificationOriginUrl)); - return; + } else { + DCHECK_EQ(1, button_index); + ReportPrivetUmaEvent(PRIVET_DISABLE_NOTIFICATIONS_CLICKED); + DisableNotifications(); } - - DCHECK_EQ(1, button_index); - ReportPrivetUmaEvent(PRIVET_DISABLE_NOTIFICATIONS_CLICKED); - DisableNotifications(); + CloseNotification(); } void PrivetNotificationDelegate::OpenTab(const GURL& url) { - Profile* profile = Profile::FromBrowserContext(profile_); - chrome::NavigateParams params(profile, url, + chrome::NavigateParams params(profile_, url, ui::PAGE_TRANSITION_AUTO_TOPLEVEL); params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB; chrome::Navigate(¶ms); } void PrivetNotificationDelegate::DisableNotifications() { - Profile* profile = Profile::FromBrowserContext(profile_); - profile->GetPrefs()->SetBoolean(prefs::kLocalDiscoveryNotificationsEnabled, - false); + profile_->GetPrefs()->SetBoolean(prefs::kLocalDiscoveryNotificationsEnabled, + false); +} + +void PrivetNotificationDelegate::CloseNotification() { + g_browser_process->notification_ui_manager()->CancelById( + id(), NotificationUIManager::GetProfileID(profile_)); } } // namespace cloud_print diff --git a/chromium/chrome/browser/printing/cloud_print/privet_notifications.h b/chromium/chrome/browser/printing/cloud_print/privet_notifications.h index 2e9df8d1f2e..823a1a36ae3 100644 --- a/chromium/chrome/browser/printing/cloud_print/privet_notifications.h +++ b/chromium/chrome/browser/printing/cloud_print/privet_notifications.h @@ -14,8 +14,10 @@ #include "chrome/browser/printing/cloud_print/privet_http.h" #include "components/keyed_service/core/keyed_service.h" #include "components/prefs/pref_member.h" +#include "net/net_features.h" class NotificationUIManager; +class Profile; namespace content { class BrowserContext; @@ -30,9 +32,10 @@ namespace cloud_print { class PrivetDeviceLister; class PrivetHTTPAsynchronousFactory; class PrivetHTTPResolution; +class PrivetNotificationDelegate; struct DeviceDescription; -#if defined(ENABLE_MDNS) +#if BUILDFLAG(ENABLE_MDNS) class PrivetTrafficDetector; #endif // ENABLE_MDNS @@ -119,6 +122,10 @@ class PrivetNotificationService void OnNotificationsEnabledChanged(); void StartLister(); + // Virtual for testing. The returned delegate is refcounted. + virtual PrivetNotificationDelegate* CreateNotificationDelegate( + Profile* profile); + content::BrowserContext* const profile_; std::unique_ptr device_lister_; scoped_refptr @@ -126,27 +133,31 @@ class PrivetNotificationService std::unique_ptr privet_notifications_listener_; BooleanPrefMember enable_privet_notification_member_; -#if defined(ENABLE_MDNS) +#if BUILDFLAG(ENABLE_MDNS) scoped_refptr traffic_detector_; #endif // ENABLE_MDNS }; class PrivetNotificationDelegate : public NotificationDelegate { public: - explicit PrivetNotificationDelegate(content::BrowserContext* profile); + explicit PrivetNotificationDelegate(Profile* profile); // NotificationDelegate implementation. std::string id() const override; void ButtonClick(int button_index) override; - private: + protected: // Refcounted. ~PrivetNotificationDelegate() override; - void OpenTab(const GURL& url); - void DisableNotifications(); + private: + // ButtonClick() response handlers. Virtual for testing. + virtual void OpenTab(const GURL& url); + virtual void DisableNotifications(); - content::BrowserContext* const profile_; + void CloseNotification(); + + Profile* const profile_; }; } // namespace cloud_print diff --git a/chromium/chrome/browser/printing/cloud_print/privet_notifications_unittest.cc b/chromium/chrome/browser/printing/cloud_print/privet_notifications_unittest.cc index 9a8a2aa2817..18249f8ef7d 100644 --- a/chromium/chrome/browser/printing/cloud_print/privet_notifications_unittest.cc +++ b/chromium/chrome/browser/printing/cloud_print/privet_notifications_unittest.cc @@ -7,10 +7,14 @@ #include #include "base/memory/ptr_util.h" -#include "base/message_loop/message_loop.h" #include "base/threading/thread_task_runner_handle.h" +#include "chrome/browser/notifications/notification_test_util.h" #include "chrome/browser/printing/cloud_print/privet_http_asynchronous_factory.h" #include "chrome/browser/printing/cloud_print/privet_http_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 "content/public/test/test_browser_thread_bundle.h" #include "net/url_request/test_url_fetcher_factory.h" #include "net/url_request/url_request_test_util.h" #include "testing/gmock/include/gmock/gmock.h" @@ -81,7 +85,7 @@ class MockPrivetHttpFactory : public PrivetHTTPAsynchronousFactory { scoped_refptr request_context_; }; -class PrivetNotificationsListenerTest : public ::testing::Test { +class PrivetNotificationsListenerTest : public testing::Test { public: PrivetNotificationsListenerTest() : request_context_(new net::TestURLRequestContextGetter( @@ -99,7 +103,7 @@ class PrivetNotificationsListenerTest : public ::testing::Test { bool SuccessfulResponseToInfo(const std::string& response) { net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); - if (!fetcher || GURL(kDeviceInfoURL) != fetcher->GetOriginalURL()) + if (!fetcher || fetcher->GetOriginalURL() != kDeviceInfoURL) return false; fetcher->SetResponseString(response); @@ -180,6 +184,136 @@ TEST_F(PrivetNotificationsListenerTest, DictionaryErrorTest) { SuccessfulResponseToInfo(kInfoResponseNoUptime); } +class TestPrivetNotificationService; + +class TestPrivetNotificationDelegate : public PrivetNotificationDelegate { + public: + TestPrivetNotificationDelegate(TestPrivetNotificationService* service, + Profile* profile) + : PrivetNotificationDelegate(profile), service_(service) {} + + private: + // Refcounted. + ~TestPrivetNotificationDelegate() override {} + + // PrivetNotificationDelegate: + void OpenTab(const GURL& url) override; + void DisableNotifications() override; + + TestPrivetNotificationService* const service_; + + DISALLOW_COPY_AND_ASSIGN(TestPrivetNotificationDelegate); +}; + +class TestPrivetNotificationService : public PrivetNotificationService { + public: + explicit TestPrivetNotificationService(Profile* profile) + : PrivetNotificationService(profile) {} + ~TestPrivetNotificationService() override {} + + const GURL& open_tab_url() const { return open_tab_url_; } + size_t open_tab_count() const { return open_tab_count_; } + size_t disable_notifications_count() const { + return disable_notifications_count_; + } + + void OpenTab(const GURL& url) { + open_tab_url_ = url; + ++open_tab_count_; + } + + void DisableNotifications() { ++disable_notifications_count_; } + + private: + // PrivetNotificationService: + PrivetNotificationDelegate* CreateNotificationDelegate( + Profile* profile) override { + return new TestPrivetNotificationDelegate(this, profile); + } + + GURL open_tab_url_; + size_t open_tab_count_ = 0; + size_t disable_notifications_count_ = 0; + + DISALLOW_COPY_AND_ASSIGN(TestPrivetNotificationService); +}; + +void TestPrivetNotificationDelegate::OpenTab(const GURL& url) { + service_->OpenTab(url); +} + +void TestPrivetNotificationDelegate::DisableNotifications() { + service_->DisableNotifications(); +} + +class PrivetNotificationsNotificationTest : public testing::Test { + public: + PrivetNotificationsNotificationTest() {} + ~PrivetNotificationsNotificationTest() override {} + + void SetUp() override { + testing::Test::SetUp(); + + profile_manager_ = base::MakeUnique( + TestingBrowserProcess::GetGlobal()); + ASSERT_TRUE(profile_manager_->SetUp()); + profile_ = profile_manager_->CreateTestingProfile("test-user"); + + TestingBrowserProcess::GetGlobal()->SetNotificationUIManager( + base::MakeUnique()); + } + + void TearDown() override { + profile_manager_.reset(); + testing::Test::TearDown(); + } + + protected: + StubNotificationUIManager* ui_manager() const { + return static_cast( + TestingBrowserProcess::GetGlobal()->notification_ui_manager()); + } + + Profile* profile() { return profile_; } + + private: + // The thread bundle must be first so it is destroyed last. + content::TestBrowserThreadBundle thread_bundle_; + + std::unique_ptr profile_manager_; + Profile* profile_; + + DISALLOW_COPY_AND_ASSIGN(PrivetNotificationsNotificationTest); +}; + +TEST_F(PrivetNotificationsNotificationTest, AddToCloudPrint) { + TestPrivetNotificationService service(profile()); + service.PrivetNotify(1 /* devices_active */, true /* added */); + + ASSERT_EQ(1U, ui_manager()->GetNotificationCount()); + const auto& notification = ui_manager()->GetNotificationAt(0); + notification.ButtonClick(0 /* add */); + + EXPECT_EQ("chrome://devices/", service.open_tab_url().spec()); + EXPECT_EQ(1U, service.open_tab_count()); + EXPECT_EQ(0U, service.disable_notifications_count()); + EXPECT_EQ(0U, ui_manager()->GetNotificationCount()); +} + +TEST_F(PrivetNotificationsNotificationTest, DontShowAgain) { + TestPrivetNotificationService service(profile()); + service.PrivetNotify(1 /* devices_active */, true /* added */); + + ASSERT_EQ(1U, ui_manager()->GetNotificationCount()); + const auto& notification = ui_manager()->GetNotificationAt(0); + notification.ButtonClick(1 /* don't show again */); + + EXPECT_EQ("", service.open_tab_url().spec()); + EXPECT_EQ(0U, service.open_tab_count()); + EXPECT_EQ(1U, service.disable_notifications_count()); + EXPECT_EQ(0U, ui_manager()->GetNotificationCount()); +} + } // namespace } // namespace cloud_print diff --git a/chromium/chrome/browser/printing/cloud_print/privet_traffic_detector.cc b/chromium/chrome/browser/printing/cloud_print/privet_traffic_detector.cc index a72e5639317..633a74a0ee7 100644 --- a/chromium/chrome/browser/printing/cloud_print/privet_traffic_detector.cc +++ b/chromium/chrome/browser/printing/cloud_print/privet_traffic_detector.cc @@ -19,8 +19,8 @@ #include "net/dns/dns_response.h" #include "net/dns/mdns_client.h" #include "net/log/net_log_source.h" -#include "net/udp/datagram_server_socket.h" -#include "net/udp/udp_server_socket.h" +#include "net/socket/datagram_server_socket.h" +#include "net/socket/udp_server_socket.h" namespace { diff --git a/chromium/chrome/browser/printing/cloud_print/privet_url_fetcher.cc b/chromium/chrome/browser/printing/cloud_print/privet_url_fetcher.cc index 1fdccbdae73..1135e216133 100644 --- a/chromium/chrome/browser/printing/cloud_print/privet_url_fetcher.cc +++ b/chromium/chrome/browser/printing/cloud_print/privet_url_fetcher.cc @@ -21,6 +21,7 @@ #include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/printing/cloud_print/privet_constants.h" +#include "components/data_use_measurement/core/data_use_user_data.h" #include "content/public/browser/browser_thread.h" #include "net/base/load_flags.h" #include "net/http/http_status_code.h" @@ -150,6 +151,9 @@ void PrivetURLFetcher::Try() { if (tries_ <= max_retries_) { DVLOG(1) << "Attempt: " << tries_; url_fetcher_ = net::URLFetcher::Create(url_, request_type_, this); + data_use_measurement::DataUseUserData::AttachToFetcher( + url_fetcher_.get(), data_use_measurement::DataUseUserData::CLOUD_PRINT); + // Privet requests are relevant to hosts on local network only. url_fetcher_->SetLoadFlags( url_fetcher_->GetLoadFlags() | net::LOAD_BYPASS_PROXY | diff --git a/chromium/chrome/browser/printing/pdf_to_emf_converter.h b/chromium/chrome/browser/printing/pdf_to_emf_converter.h index f2c0102e266..1f527152740 100644 --- a/chromium/chrome/browser/printing/pdf_to_emf_converter.h +++ b/chromium/chrome/browser/printing/pdf_to_emf_converter.h @@ -10,14 +10,10 @@ #include "base/callback.h" #include "base/memory/ref_counted_memory.h" -namespace base { -class FilePath; -} - namespace printing { class MetafilePlayer; -class PdfRenderSettings; +struct PdfRenderSettings; class PdfToEmfConverter { public: diff --git a/chromium/chrome/browser/printing/print_job_manager.cc b/chromium/chrome/browser/printing/print_job_manager.cc index c47cdb09a32..9074df688ac 100644 --- a/chromium/chrome/browser/printing/print_job_manager.cc +++ b/chromium/chrome/browser/printing/print_job_manager.cc @@ -46,10 +46,9 @@ scoped_refptr PrintQueriesQueue::PopPrinterQuery( scoped_refptr PrintQueriesQueue::CreatePrinterQuery( int render_process_id, - int render_view_id) { - scoped_refptr job = - new printing::PrinterQuery(render_process_id, render_view_id); - return job; + int render_frame_id) { + return make_scoped_refptr( + new PrinterQuery(render_process_id, render_frame_id)); } void PrintQueriesQueue::Shutdown() { diff --git a/chromium/chrome/browser/printing/print_job_manager.h b/chromium/chrome/browser/printing/print_job_manager.h index 3fc7e574965..e4970d41d32 100644 --- a/chromium/chrome/browser/printing/print_job_manager.h +++ b/chromium/chrome/browser/printing/print_job_manager.h @@ -38,7 +38,7 @@ class PrintQueriesQueue : public base::RefCountedThreadSafe { // Creates new query. scoped_refptr CreatePrinterQuery(int render_process_id, - int render_view_id); + int render_frame_id); void Shutdown(); diff --git a/chromium/chrome/browser/printing/print_job_worker.cc b/chromium/chrome/browser/printing/print_job_worker.cc index 0e931183de2..ee4ecf6a9aa 100644 --- a/chromium/chrome/browser/printing/print_job_worker.cc +++ b/chromium/chrome/browser/printing/print_job_worker.cc @@ -24,7 +24,7 @@ #include "chrome/grit/generated_resources.h" #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/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" #include "printing/print_job_constants.h" #include "printing/printed_document.h" @@ -43,14 +43,14 @@ namespace printing { namespace { // Helper function to ensure |owner| is valid until at least |callback| returns. -void HoldRefCallback(const scoped_refptr& owner, +void HoldRefCallback(const scoped_refptr& owner, const base::Closure& callback) { callback.Run(); } class PrintingContextDelegate : public PrintingContext::Delegate { public: - PrintingContextDelegate(int render_process_id, int render_view_id); + PrintingContextDelegate(int render_process_id, int render_frame_id); ~PrintingContextDelegate() override; gfx::NativeView GetParentView() override; @@ -60,15 +60,14 @@ class PrintingContextDelegate : public PrintingContext::Delegate { content::WebContents* GetWebContents(); private: - int render_process_id_; - int render_view_id_; + const int render_process_id_; + const int render_frame_id_; }; PrintingContextDelegate::PrintingContextDelegate(int render_process_id, - int render_view_id) + int render_frame_id) : render_process_id_(render_process_id), - render_view_id_(render_view_id) { -} + render_frame_id_(render_frame_id) {} PrintingContextDelegate::~PrintingContextDelegate() { } @@ -80,9 +79,9 @@ gfx::NativeView PrintingContextDelegate::GetParentView() { content::WebContents* PrintingContextDelegate::GetWebContents() { DCHECK_CURRENTLY_ON(BrowserThread::UI); - content::RenderViewHost* view = - content::RenderViewHost::FromID(render_process_id_, render_view_id_); - return view ? content::WebContents::FromRenderViewHost(view) : nullptr; + auto* rfh = + content::RenderFrameHost::FromID(render_process_id_, render_frame_id_); + return rfh ? content::WebContents::FromRenderFrameHost(rfh) : nullptr; } std::string PrintingContextDelegate::GetAppLocale() { @@ -111,14 +110,14 @@ void PostOnOwnerThread(const scoped_refptr& owner, } // namespace PrintJobWorker::PrintJobWorker(int render_process_id, - int render_view_id, + int render_frame_id, PrintJobWorkerOwner* owner) : owner_(owner), thread_("Printing_Worker"), weak_factory_(this) { // The object is created in the IO thread. DCHECK(owner_->RunsTasksOnCurrentThread()); printing_context_delegate_ = base::MakeUnique( - render_process_id, render_view_id); + render_process_id, render_frame_id); printing_context_ = PrintingContext::Create(printing_context_delegate_.get()); } diff --git a/chromium/chrome/browser/printing/print_job_worker.h b/chromium/chrome/browser/printing/print_job_worker.h index 6ed8885a5ac..e001a86b840 100644 --- a/chromium/chrome/browser/printing/print_job_worker.h +++ b/chromium/chrome/browser/printing/print_job_worker.h @@ -36,14 +36,14 @@ class PrintedPage; class PrintJobWorker { public: PrintJobWorker(int render_process_id, - int render_view_id, + int render_frame_id, PrintJobWorkerOwner* owner); virtual ~PrintJobWorker(); void SetNewOwner(PrintJobWorkerOwner* new_owner); // Initializes the print settings. If |ask_user_for_settings| is true, a - // Print... dialog box will be shown to ask the user his preference. + // Print... dialog box will be shown to ask the user their preference. // |is_scripted| should be true for calls coming straight from window.print(). // |is_modifiable| implies HTML and not other formats like PDF. void GetSettings(bool ask_user_for_settings, 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 e7dd7eab8b8..598a121a912 100644 --- a/chromium/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc +++ b/chromium/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc @@ -58,7 +58,8 @@ class RequestPrintPreviewObserver : public WebContentsObserver { private: // content::WebContentsObserver implementation. - bool OnMessageReceived(const IPC::Message& message) override { + bool OnMessageReceived(const IPC::Message& message, + content::RenderFrameHost* render_frame_host) override { IPC_BEGIN_MESSAGE_MAP(RequestPrintPreviewObserver, message) IPC_MESSAGE_HANDLER(PrintHostMsg_RequestPrintPreview, OnRequestPrintPreview) 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 4bb9631f34e..3fd3180c16c 100644 --- a/chromium/chrome/browser/printing/print_preview_dialog_controller_unittest.cc +++ b/chromium/chrome/browser/printing/print_preview_dialog_controller_unittest.cc @@ -70,7 +70,8 @@ TEST_F(PrintPreviewDialogControllerUnitTest, GetOrCreatePreviewDialog) { ASSERT_TRUE(dialog_controller); // Get the preview dialog for initiator. - PrintViewManager::FromWebContents(initiator)->PrintPreviewNow(false); + PrintViewManager::FromWebContents(initiator)->PrintPreviewNow( + initiator->GetMainFrame(), false); WebContents* preview_dialog = dialog_controller->GetOrCreatePreviewDialog(initiator); @@ -116,7 +117,8 @@ TEST_F(PrintPreviewDialogControllerUnitTest, MultiplePreviewDialogs) { ASSERT_TRUE(dialog_controller); // Create preview dialog for |web_contents_1| - PrintViewManager::FromWebContents(web_contents_1)->PrintPreviewNow(false); + PrintViewManager::FromWebContents(web_contents_1) + ->PrintPreviewNow(web_contents_1->GetMainFrame(), false); WebContents* preview_dialog_1 = dialog_controller->GetOrCreatePreviewDialog(web_contents_1); @@ -124,7 +126,8 @@ TEST_F(PrintPreviewDialogControllerUnitTest, MultiplePreviewDialogs) { EXPECT_EQ(2, tab_strip_model->count()); // Create preview dialog for |web_contents_2| - PrintViewManager::FromWebContents(web_contents_2)->PrintPreviewNow(false); + PrintViewManager::FromWebContents(web_contents_2) + ->PrintPreviewNow(web_contents_2->GetMainFrame(), false); WebContents* preview_dialog_2 = dialog_controller->GetOrCreatePreviewDialog(web_contents_2); @@ -172,7 +175,8 @@ TEST_F(PrintPreviewDialogControllerUnitTest, ClearInitiatorDetails) { ASSERT_TRUE(dialog_controller); // Get the preview dialog for the initiator. - PrintViewManager::FromWebContents(initiator)->PrintPreviewNow(false); + PrintViewManager::FromWebContents(initiator)->PrintPreviewNow( + initiator->GetMainFrame(), false); WebContents* preview_dialog = dialog_controller->GetOrCreatePreviewDialog(initiator); @@ -228,7 +232,7 @@ TEST_F(PrintPreviewDialogControllerUnitTest, CloseDialogOnNavigation) { WebContents* tiger_preview_dialog = dialog_controller->GetOrCreatePreviewDialog(web_contents); PrintViewManager* manager = PrintViewManager::FromWebContents(web_contents); - manager->PrintPreviewNow(false); + manager->PrintPreviewNow(web_contents->GetMainFrame(), false); // New print preview dialog is a constrained window, so the number of tabs is // still 1. @@ -247,7 +251,7 @@ TEST_F(PrintPreviewDialogControllerUnitTest, CloseDialogOnNavigation) { // Print preview now should return true as the navigation should have closed // |tiger_preview_dialog| and the previous dialog should have closed. - EXPECT_TRUE(manager->PrintPreviewNow(false)); + EXPECT_TRUE(manager->PrintPreviewNow(web_contents->GetMainFrame(), false)); WebContents* tiger_barb_preview_dialog = dialog_controller->GetOrCreatePreviewDialog(web_contents); ASSERT_TRUE(tiger_barb_preview_dialog); @@ -261,13 +265,13 @@ TEST_F(PrintPreviewDialogControllerUnitTest, CloseDialogOnNavigation) { tiger_barb_preview_dialog); // Now this returns false as |tiger_barb_preview_dialog| is open. - EXPECT_FALSE(manager->PrintPreviewNow(false)); + EXPECT_FALSE(manager->PrintPreviewNow(web_contents->GetMainFrame(), false)); // Navigate with back button or ALT+LEFT ARROW to a similar page. nav_controller.GoBack(); CommitPendingLoad(&nav_controller); EXPECT_EQ(tiger, web_contents->GetLastCommittedURL()); - EXPECT_TRUE(manager->PrintPreviewNow(false)); + EXPECT_TRUE(manager->PrintPreviewNow(web_contents->GetMainFrame(), false)); // Get new dialog WebContents* tiger_preview_dialog_2 = @@ -296,7 +300,7 @@ TEST_F(PrintPreviewDialogControllerUnitTest, CloseDialogOnNavigation) { // preview now should return false, dialog is still alive, and the dialog // returned by GetOrCreatePreviewDialog should be the same as the earlier // dialog. - EXPECT_FALSE(manager->PrintPreviewNow(false)); + EXPECT_FALSE(manager->PrintPreviewNow(web_contents->GetMainFrame(), false)); EXPECT_FALSE(tiger_2_destroyed.dialog_destroyed()); WebContents* tiger_preview_dialog_2b = dialog_controller->GetOrCreatePreviewDialog(web_contents); @@ -326,7 +330,8 @@ TEST_F(PrintPreviewDialogControllerUnitTest, MultiplePreviewDialogsClose) { ASSERT_TRUE(dialog_controller); // Create preview dialog for |web_contents_1|. Should not create a new tab. - PrintViewManager::FromWebContents(web_contents_1)->PrintPreviewNow(false); + PrintViewManager::FromWebContents(web_contents_1) + ->PrintPreviewNow(web_contents_1->GetMainFrame(), false); WebContents* preview_dialog_1 = dialog_controller->GetOrCreatePreviewDialog(web_contents_1); EXPECT_NE(web_contents_1, preview_dialog_1); @@ -339,7 +344,8 @@ TEST_F(PrintPreviewDialogControllerUnitTest, MultiplePreviewDialogsClose) { EXPECT_EQ(2, tab_strip_model->count()); // Create preview dialog for |web_contents_2| - PrintViewManager::FromWebContents(web_contents_2)->PrintPreviewNow(false); + PrintViewManager::FromWebContents(web_contents_2) + ->PrintPreviewNow(web_contents_2->GetMainFrame(), false); WebContents* preview_dialog_2 = dialog_controller->GetOrCreatePreviewDialog(web_contents_2); EXPECT_NE(web_contents_2, preview_dialog_2); diff --git a/chromium/chrome/browser/printing/print_preview_message_handler.cc b/chromium/chrome/browser/printing/print_preview_message_handler.cc index 518f9327e60..c51e72f7338 100644 --- a/chromium/chrome/browser/printing/print_preview_message_handler.cc +++ b/chromium/chrome/browser/printing/print_preview_message_handler.cc @@ -92,9 +92,12 @@ PrintPreviewUI* PrintPreviewMessageHandler::GetPrintPreviewUI() { } void PrintPreviewMessageHandler::OnRequestPrintPreview( + content::RenderFrameHost* render_frame_host, const PrintHostMsg_RequestPrintPreview_Params& params) { - if (params.webnode_only) - PrintViewManager::FromWebContents(web_contents())->PrintPreviewForWebNode(); + if (params.webnode_only) { + PrintViewManager::FromWebContents(web_contents())->PrintPreviewForWebNode( + render_frame_host); + } PrintPreviewDialogController::PrintPreview(web_contents()); PrintPreviewUI::SetInitialParams(GetPrintPreviewDialog(), params); } @@ -206,11 +209,19 @@ void PrintPreviewMessageHandler::OnSetOptionsFromDocument( } bool PrintPreviewMessageHandler::OnMessageReceived( - const IPC::Message& message) { + const IPC::Message& message, + content::RenderFrameHost* render_frame_host) { bool handled = true; - IPC_BEGIN_MESSAGE_MAP(PrintPreviewMessageHandler, message) + IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(PrintPreviewMessageHandler, message, + render_frame_host) IPC_MESSAGE_HANDLER(PrintHostMsg_RequestPrintPreview, OnRequestPrintPreview) + IPC_MESSAGE_UNHANDLED(handled = false) + IPC_END_MESSAGE_MAP() + if (handled) + return true; + + IPC_BEGIN_MESSAGE_MAP(PrintPreviewMessageHandler, message) IPC_MESSAGE_HANDLER(PrintHostMsg_DidGetPreviewPageCount, OnDidGetPreviewPageCount) IPC_MESSAGE_HANDLER(PrintHostMsg_DidPreviewPage, diff --git a/chromium/chrome/browser/printing/print_preview_message_handler.h b/chromium/chrome/browser/printing/print_preview_message_handler.h index 25abc6ad60a..ba7102008ba 100644 --- a/chromium/chrome/browser/printing/print_preview_message_handler.h +++ b/chromium/chrome/browser/printing/print_preview_message_handler.h @@ -18,6 +18,7 @@ struct PrintHostMsg_RequestPrintPreview_Params; struct PrintHostMsg_SetOptionsFromDocument_Params; namespace content { +class RenderFrameHost; class WebContents; } @@ -37,7 +38,8 @@ class PrintPreviewMessageHandler ~PrintPreviewMessageHandler() override; // content::WebContentsObserver implementation. - bool OnMessageReceived(const IPC::Message& message) override; + bool OnMessageReceived(const IPC::Message& message, + content::RenderFrameHost* render_frame_host) override; private: explicit PrintPreviewMessageHandler(content::WebContents* web_contents); @@ -52,6 +54,7 @@ class PrintPreviewMessageHandler // Message handlers. void OnRequestPrintPreview( + content::RenderFrameHost* render_frame_host, const PrintHostMsg_RequestPrintPreview_Params& params); void OnDidGetDefaultPageLayout(const PageSizeMargins& page_layout_in_points, const gfx::Rect& printable_area_in_points, 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 8d3f3b15d2c..3260bb9c2a8 100644 --- a/chromium/chrome/browser/printing/print_preview_pdf_generated_browsertest.cc +++ b/chromium/chrome/browser/printing/print_preview_pdf_generated_browsertest.cc @@ -342,10 +342,8 @@ class PrintPreviewPdfGeneratedBrowserTest : public InProcessBrowserTest { std::string pdf_data; ASSERT_TRUE(base::ReadFileToString(pdf_file_save_path_, &pdf_data)); - ASSERT_TRUE(chrome_pdf::GetPDFDocInfo(pdf_data.data(), - pdf_data.size(), - &num_pages, - &max_width_in_points)); + ASSERT_TRUE(chrome_pdf::GetPDFDocInfo(pdf_data.data(), pdf_data.size(), + &num_pages, &max_width_in_points)); ASSERT_GT(num_pages, 0); double max_width_in_pixels = @@ -353,11 +351,9 @@ class PrintPreviewPdfGeneratedBrowserTest : public InProcessBrowserTest { for (int i = 0; i < num_pages; ++i) { double width_in_points, height_in_points; - ASSERT_TRUE(chrome_pdf::GetPDFPageSizeByIndex(pdf_data.data(), - pdf_data.size(), - i, - &width_in_points, - &height_in_points)); + ASSERT_TRUE(chrome_pdf::GetPDFPageSizeByIndex( + pdf_data.data(), pdf_data.size(), i, &width_in_points, + &height_in_points)); double width_in_pixels = ConvertUnitDouble( width_in_points, kPointsPerInch, kDpi); @@ -377,29 +373,22 @@ class PrintPreviewPdfGeneratedBrowserTest : public InProcessBrowserTest { PdfRenderSettings settings(rect, kDpi, true); int int_max = std::numeric_limits::max(); - if (settings.area().width() > int_max / kColorChannels || - settings.area().height() > int_max / (kColorChannels * - settings.area().width())) { + if (settings.area.width() > int_max / kColorChannels || + settings.area.height() > + int_max / (kColorChannels * settings.area.width())) { FAIL() << "The dimensions of the image are too large." << "Decrease the DPI or the dimensions of the image."; } - std::vector page_bitmap_data( - kColorChannels * settings.area().size().GetArea()); + std::vector page_bitmap_data(kColorChannels * + settings.area.size().GetArea()); ASSERT_TRUE(chrome_pdf::RenderPDFPageToBitmap( - pdf_data.data(), - pdf_data.size(), - i, - page_bitmap_data.data(), - settings.area().size().width(), - settings.area().size().height(), - settings.dpi(), - true)); - FillPng(&page_bitmap_data, - width_in_pixels, - max_width_in_pixels, - settings.area().size().height()); + pdf_data.data(), pdf_data.size(), i, page_bitmap_data.data(), + settings.area.size().width(), settings.area.size().height(), + settings.dpi, settings.autorotate)); + FillPng(&page_bitmap_data, width_in_pixels, max_width_in_pixels, + settings.area.size().height()); bitmap_data.insert(bitmap_data.end(), page_bitmap_data.begin(), page_bitmap_data.end()); diff --git a/chromium/chrome/browser/printing/print_view_manager.cc b/chromium/chrome/browser/printing/print_view_manager.cc index c09c632b060..ea49f9b888e 100644 --- a/chromium/chrome/browser/printing/print_view_manager.cc +++ b/chromium/chrome/browser/printing/print_view_manager.cc @@ -5,9 +5,11 @@ #include "chrome/browser/printing/print_view_manager.h" #include +#include #include "base/bind.h" #include "base/lazy_instance.h" +#include "base/memory/ptr_util.h" #include "chrome/browser/plugins/chrome_plugin_service_filter.h" #include "chrome/browser/printing/print_preview_dialog_controller.h" #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h" @@ -19,6 +21,7 @@ #include "content/public/browser/render_process_host.h" #include "content/public/browser/web_contents.h" #include "content/public/common/webplugininfo.h" +#include "printing/features/features.h" using content::BrowserThread; @@ -54,6 +57,7 @@ namespace printing { PrintViewManager::PrintViewManager(content::WebContents* web_contents) : PrintViewManagerBase(web_contents), print_preview_state_(NOT_PREVIEWING), + print_preview_rfh_(nullptr), scripted_print_preview_rph_(nullptr) { if (PrintPreviewDialogController::IsPrintPreviewDialog(web_contents)) { EnableInternalPDFPluginForContents( @@ -66,16 +70,20 @@ PrintViewManager::~PrintViewManager() { DCHECK_EQ(NOT_PREVIEWING, print_preview_state_); } -#if defined(ENABLE_BASIC_PRINTING) +#if BUILDFLAG(ENABLE_BASIC_PRINTING) bool PrintViewManager::PrintForSystemDialogNow( const base::Closure& dialog_shown_callback) { DCHECK(!dialog_shown_callback.is_null()); DCHECK(on_print_dialog_shown_callback_.is_null()); on_print_dialog_shown_callback_ = dialog_shown_callback; - return PrintNowInternal(new PrintMsg_PrintForSystemDialog(routing_id())); + + SetPrintingRFH(print_preview_rfh_); + int32_t id = print_preview_rfh_->GetRoutingID(); + return PrintNowInternal(print_preview_rfh_, + base::MakeUnique(id)); } -bool PrintViewManager::BasicPrint() { +bool PrintViewManager::BasicPrint(content::RenderFrameHost* rfh) { PrintPreviewDialogController* dialog_controller = PrintPreviewDialogController::GetInstance(); if (!dialog_controller) @@ -84,7 +92,7 @@ bool PrintViewManager::BasicPrint() { content::WebContents* print_preview_dialog = dialog_controller->GetPrintPreviewForContents(web_contents()); if (!print_preview_dialog) - return PrintNow(); + return PrintNow(rfh); if (!print_preview_dialog->GetWebUI()) return false; @@ -94,27 +102,34 @@ bool PrintViewManager::BasicPrint() { print_preview_ui->OnShowSystemDialog(); return true; } -#endif // defined(ENABLE_BASIC_PRINTING) +#endif // BUILDFLAG(ENABLE_BASIC_PRINTING) -bool PrintViewManager::PrintPreviewNow(bool selection_only) { +bool PrintViewManager::PrintPreviewNow(content::RenderFrameHost* rfh, + bool has_selection) { // Users can send print commands all they want and it is beyond // PrintViewManager's control. Just ignore the extra commands. // See http://crbug.com/136842 for example. if (print_preview_state_ != NOT_PREVIEWING) return false; - if (!PrintNowInternal(new PrintMsg_InitiatePrintPreview(routing_id(), - selection_only))) { + auto message = base::MakeUnique( + rfh->GetRoutingID(), has_selection); + if (!PrintNowInternal(rfh, std::move(message))) return false; - } + DCHECK(!print_preview_rfh_); + print_preview_rfh_ = rfh; print_preview_state_ = USER_INITIATED_PREVIEW; return true; } -void PrintViewManager::PrintPreviewForWebNode() { +void PrintViewManager::PrintPreviewForWebNode(content::RenderFrameHost* rfh) { if (print_preview_state_ != NOT_PREVIEWING) return; + + DCHECK(rfh); + DCHECK(!print_preview_rfh_); + print_preview_rfh_ = rfh; print_preview_state_ = USER_INITIATED_PREVIEW; } @@ -131,6 +146,7 @@ void PrintViewManager::PrintPreviewDone() { scripted_print_preview_rph_ = nullptr; } print_preview_state_ = NOT_PREVIEWING; + print_preview_rfh_ = nullptr; } void PrintViewManager::RenderFrameCreated( @@ -141,50 +157,67 @@ void PrintViewManager::RenderFrameCreated( } } -void PrintViewManager::RenderProcessGone(base::TerminationStatus status) { - print_preview_state_ = NOT_PREVIEWING; - PrintViewManagerBase::RenderProcessGone(status); +void PrintViewManager::RenderFrameDeleted( + content::RenderFrameHost* render_frame_host) { + if (render_frame_host == print_preview_rfh_) + print_preview_state_ = NOT_PREVIEWING; + PrintViewManagerBase::RenderFrameDeleted(render_frame_host); } -void PrintViewManager::OnDidShowPrintDialog() { - if (!on_print_dialog_shown_callback_.is_null()) - on_print_dialog_shown_callback_.Run(); +void PrintViewManager::OnDidShowPrintDialog(content::RenderFrameHost* rfh) { + if (rfh != print_preview_rfh_) + return; + + if (on_print_dialog_shown_callback_.is_null()) + return; + + on_print_dialog_shown_callback_.Run(); on_print_dialog_shown_callback_.Reset(); } -void PrintViewManager::OnSetupScriptedPrintPreview(IPC::Message* reply_msg) { +void PrintViewManager::OnSetupScriptedPrintPreview( + content::RenderFrameHost* rfh, + IPC::Message* reply_msg) { DCHECK_CURRENTLY_ON(BrowserThread::UI); auto& map = g_scripted_print_preview_closure_map.Get(); - content::RenderProcessHost* rph = web_contents()->GetRenderProcessHost(); + content::RenderProcessHost* rph = rfh->GetProcess(); if (base::ContainsKey(map, rph)) { - // Renderer already handling window.print() in another View. - Send(reply_msg); + // Renderer already handling window.print(). Abort this attempt to prevent + // the renderer from having multiple nested loops. If multiple nested loops + // existed, then they have to exit in the right order and that is messy. + rfh->Send(reply_msg); return; } if (print_preview_state_ != NOT_PREVIEWING) { - // If a user initiated print dialog is already open, ignore the scripted - // print message. - DCHECK_EQ(USER_INITIATED_PREVIEW, print_preview_state_); - Send(reply_msg); + // If a print dialog is already open for this tab, ignore the scripted print + // message. + rfh->Send(reply_msg); return; } PrintPreviewDialogController* dialog_controller = PrintPreviewDialogController::GetInstance(); if (!dialog_controller) { - Send(reply_msg); + rfh->Send(reply_msg); return; } + DCHECK(!print_preview_rfh_); + print_preview_rfh_ = rfh; print_preview_state_ = SCRIPTED_PREVIEW; map[rph] = base::Bind(&PrintViewManager::OnScriptedPrintPreviewReply, base::Unretained(this), reply_msg); scripted_print_preview_rph_ = rph; } -void PrintViewManager::OnShowScriptedPrintPreview(bool source_is_modifiable) { +void PrintViewManager::OnShowScriptedPrintPreview(content::RenderFrameHost* rfh, + bool source_is_modifiable) { + DCHECK(print_preview_rfh_); + if (rfh != print_preview_rfh_) + return; + PrintPreviewDialogController* dialog_controller = PrintPreviewDialogController::GetInstance(); if (!dialog_controller) { @@ -201,21 +234,24 @@ void PrintViewManager::OnShowScriptedPrintPreview(bool source_is_modifiable) { void PrintViewManager::OnScriptedPrintPreviewReply(IPC::Message* reply_msg) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - Send(reply_msg); + print_preview_rfh_->Send(reply_msg); } -bool PrintViewManager::OnMessageReceived(const IPC::Message& message) { +bool PrintViewManager::OnMessageReceived( + const IPC::Message& message, + content::RenderFrameHost* render_frame_host) { bool handled = true; - IPC_BEGIN_MESSAGE_MAP(PrintViewManager, message) + IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(PrintViewManager, message, render_frame_host) IPC_MESSAGE_HANDLER(PrintHostMsg_DidShowPrintDialog, OnDidShowPrintDialog) - IPC_MESSAGE_HANDLER_DELAY_REPLY(PrintHostMsg_SetupScriptedPrintPreview, - OnSetupScriptedPrintPreview) + IPC_MESSAGE_HANDLER_WITH_PARAM_DELAY_REPLY( + PrintHostMsg_SetupScriptedPrintPreview, OnSetupScriptedPrintPreview) IPC_MESSAGE_HANDLER(PrintHostMsg_ShowScriptedPrintPreview, OnShowScriptedPrintPreview) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() - return handled || PrintViewManagerBase::OnMessageReceived(message); + return handled || + PrintViewManagerBase::OnMessageReceived(message, render_frame_host); } } // namespace printing diff --git a/chromium/chrome/browser/printing/print_view_manager.h b/chromium/chrome/browser/printing/print_view_manager.h index b86c0b6474e..f3572c43e6b 100644 --- a/chromium/chrome/browser/printing/print_view_manager.h +++ b/chromium/chrome/browser/printing/print_view_manager.h @@ -8,8 +8,10 @@ #include "base/macros.h" #include "chrome/browser/printing/print_view_manager_base.h" #include "content/public/browser/web_contents_user_data.h" +#include "printing/features/features.h" namespace content { +class RenderFrameHost; class RenderProcessHost; } @@ -21,7 +23,7 @@ class PrintViewManager : public PrintViewManagerBase, public: ~PrintViewManager() override; -#if defined(ENABLE_BASIC_PRINTING) +#if BUILDFLAG(ENABLE_BASIC_PRINTING) // Same as PrintNow(), but for the case where a user prints with the system // dialog from print preview. // |dialog_shown_callback| is called when the print dialog is shown. @@ -30,32 +32,30 @@ class PrintViewManager : public PrintViewManagerBase, // Same as PrintNow(), but for the case where a user press "ctrl+shift+p" to // show the native system dialog. This can happen from both initiator and // preview dialog. - bool BasicPrint(); + bool BasicPrint(content::RenderFrameHost* rfh); #endif // ENABLE_BASIC_PRINTING // Initiate print preview of the current document by first notifying the // renderer. Since this happens asynchronous, the print preview dialog // creation will not be completed on the return of this function. Returns // false if print preview is impossible at the moment. - bool PrintPreviewNow(bool selection_only); + bool PrintPreviewNow(content::RenderFrameHost* rfh, bool has_selection); // Notify PrintViewManager that print preview is starting in the renderer for // a particular WebNode. - void PrintPreviewForWebNode(); + void PrintPreviewForWebNode(content::RenderFrameHost* rfh); // Notify PrintViewManager that print preview has finished. Unfreeze the // renderer in the case of scripted print preview. void PrintPreviewDone(); - // content::WebContentsObserver implementation. - bool OnMessageReceived(const IPC::Message& message) override; - // content::WebContentsObserver implementation. void RenderFrameCreated(content::RenderFrameHost* render_frame_host) override; + void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override; + bool OnMessageReceived(const IPC::Message& message, + content::RenderFrameHost* render_frame_host) override; - // content::WebContentsObserver implementation. - // Terminates or cancels the print job if one was pending. - void RenderProcessGone(base::TerminationStatus status) override; + content::RenderFrameHost* print_preview_rfh() { return print_preview_rfh_; } private: explicit PrintViewManager(content::WebContents* web_contents); @@ -68,9 +68,11 @@ class PrintViewManager : public PrintViewManagerBase, }; // IPC Message handlers. - void OnDidShowPrintDialog(); - void OnSetupScriptedPrintPreview(IPC::Message* reply_msg); - void OnShowScriptedPrintPreview(bool source_is_modifiable); + void OnDidShowPrintDialog(content::RenderFrameHost* rfh); + void OnSetupScriptedPrintPreview(content::RenderFrameHost* rfh, + IPC::Message* reply_msg); + void OnShowScriptedPrintPreview(content::RenderFrameHost* rfh, + bool source_is_modifiable); void OnScriptedPrintPreviewReply(IPC::Message* reply_msg); base::Closure on_print_dialog_shown_callback_; @@ -78,6 +80,10 @@ class PrintViewManager : public PrintViewManagerBase, // Current state of print preview for this view. PrintPreviewState print_preview_state_; + // The current RFH that is print previewing. It should be a nullptr when + // |print_preview_state_| is NOT_PREVIEWING. + content::RenderFrameHost* print_preview_rfh_; + // Keeps track of the pending callback during scripted print preview. content::RenderProcessHost* scripted_print_preview_rph_; diff --git a/chromium/chrome/browser/printing/print_view_manager_base.cc b/chromium/chrome/browser/printing/print_view_manager_base.cc index 7bc9f77ba3f..33ada8ce7b3 100644 --- a/chromium/chrome/browser/printing/print_view_manager_base.cc +++ b/chromium/chrome/browser/printing/print_view_manager_base.cc @@ -32,13 +32,15 @@ #include "content/public/browser/notification_details.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/notification_source.h" +#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/web_contents.h" +#include "printing/features/features.h" #include "printing/pdf_metafile_skia.h" #include "printing/printed_document.h" #include "ui/base/l10n/l10n_util.h" -#if defined(ENABLE_PRINT_PREVIEW) +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) #include "chrome/browser/printing/print_error_dialog.h" #endif @@ -69,6 +71,7 @@ void ShowWarningMessageBox(const base::string16& message) { PrintViewManagerBase::PrintViewManagerBase(content::WebContents* web_contents) : PrintManager(web_contents), + printing_rfh_(nullptr), printing_succeeded_(false), inside_inner_message_loop_(false), #if !defined(OS_MACOSX) @@ -79,9 +82,8 @@ PrintViewManagerBase::PrintViewManagerBase(content::WebContents* web_contents) Profile* profile = Profile::FromBrowserContext(web_contents->GetBrowserContext()); printing_enabled_.Init( - prefs::kPrintingEnabled, - profile->GetPrefs(), - base::Bind(&PrintViewManagerBase::UpdateScriptedPrintingBlocked, + prefs::kPrintingEnabled, profile->GetPrefs(), + base::Bind(&PrintViewManagerBase::UpdatePrintingEnabled, base::Unretained(this))); } @@ -90,16 +92,20 @@ PrintViewManagerBase::~PrintViewManagerBase() { DisconnectFromCurrentPrintJob(); } -#if defined(ENABLE_BASIC_PRINTING) -bool PrintViewManagerBase::PrintNow() { - return PrintNowInternal(new PrintMsg_PrintPages(routing_id())); +#if BUILDFLAG(ENABLE_BASIC_PRINTING) +bool PrintViewManagerBase::PrintNow(content::RenderFrameHost* rfh) { + DisconnectFromCurrentPrintJob(); + + SetPrintingRFH(rfh); + int32_t id = rfh->GetRoutingID(); + return PrintNowInternal(rfh, base::MakeUnique(id)); } #endif -void PrintViewManagerBase::UpdateScriptedPrintingBlocked() { - Send(new PrintMsg_SetScriptedPrintingBlocked( - routing_id(), - !printing_enabled_.GetValue())); +void PrintViewManagerBase::UpdatePrintingEnabled() { + web_contents()->ForEachFrame( + base::Bind(&PrintViewManagerBase::SendPrintingEnabled, + base::Unretained(this), printing_enabled_.GetValue())); } void PrintViewManagerBase::NavigationStopped() { @@ -107,22 +113,6 @@ void PrintViewManagerBase::NavigationStopped() { TerminatePrintJob(true); } -void PrintViewManagerBase::RenderProcessGone(base::TerminationStatus status) { - PrintManager::RenderProcessGone(status); - ReleasePrinterQuery(); - - if (!print_job_.get()) - return; - - scoped_refptr document(print_job_->document()); - if (document.get()) { - // If IsComplete() returns false, the document isn't completely rendered. - // Since our renderer is gone, there's nothing to do, cancel it. Otherwise, - // the print job may finish without problem. - TerminatePrintJob(!document->IsComplete()); - } -} - base::string16 PrintViewManagerBase::RenderSourceName() { base::string16 name(web_contents()->GetTitle()); if (name.empty()) @@ -192,16 +182,20 @@ void PrintViewManagerBase::OnDidPrintPage( #if defined(OS_WIN) print_job_->AppendPrintedPage(params.page_number); if (metafile_must_be_valid) { + // TODO(thestig): Figure out why rendering text with GDI results in random + // missing characters for some users. https://crbug.com/658606 + bool print_text_with_gdi = + document->settings().print_text_with_gdi() && + !document->settings().printer_is_xps() && + switches::GDITextPrintingEnabled(); scoped_refptr bytes = new base::RefCountedBytes( reinterpret_cast(shared_buf->memory()), params.data_size); document->DebugDumpData(bytes.get(), FILE_PATH_LITERAL(".pdf")); - // TODO(thestig): Figure out why rendering text with GDI results in random - // missing characters for some users. https://crbug.com/658606 print_job_->StartPdfToEmfConversion( bytes, params.page_size, params.content_area, - false /* print_text_with_gdi? */); + print_text_with_gdi); } #else // Update the rendered document. It will send notifications to the listener. @@ -215,7 +209,7 @@ void PrintViewManagerBase::OnDidPrintPage( void PrintViewManagerBase::OnPrintingFailed(int cookie) { PrintManager::OnPrintingFailed(cookie); -#if defined(ENABLE_PRINT_PREVIEW) +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) chrome::ShowPrintErrorDialog(); #endif @@ -235,10 +229,35 @@ void PrintViewManagerBase::OnShowInvalidPrinterSettingsError() { } void PrintViewManagerBase::DidStartLoading() { - UpdateScriptedPrintingBlocked(); + UpdatePrintingEnabled(); +} + +void PrintViewManagerBase::RenderFrameDeleted( + content::RenderFrameHost* render_frame_host) { + // Terminates or cancels the print job if one was pending. + if (render_frame_host != printing_rfh_) + return; + + printing_rfh_ = nullptr; + + PrintManager::PrintingRenderFrameDeleted(); + ReleasePrinterQuery(); + + if (!print_job_.get()) + return; + + scoped_refptr document(print_job_->document()); + if (document.get()) { + // If IsComplete() returns false, the document isn't completely rendered. + // Since our renderer is gone, there's nothing to do, cancel it. Otherwise, + // the print job may finish without problem. + TerminatePrintJob(!document->IsComplete()); + } } -bool PrintViewManagerBase::OnMessageReceived(const IPC::Message& message) { +bool PrintViewManagerBase::OnMessageReceived( + const IPC::Message& message, + content::RenderFrameHost* render_frame_host) { bool handled = true; IPC_BEGIN_MESSAGE_MAP(PrintViewManagerBase, message) IPC_MESSAGE_HANDLER(PrintHostMsg_DidPrintPage, OnDidPrintPage) @@ -246,7 +265,7 @@ bool PrintViewManagerBase::OnMessageReceived(const IPC::Message& message) { OnShowInvalidPrinterSettingsError) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() - return handled || PrintManager::OnMessageReceived(message); + return handled || PrintManager::OnMessageReceived(message, render_frame_host); } void PrintViewManagerBase::Observe( @@ -358,7 +377,7 @@ void PrintViewManagerBase::ShouldQuitFromInnerMessageLoop() { bool PrintViewManagerBase::CreateNewPrintJob(PrintJobWorkerOwner* job) { DCHECK(!inside_inner_message_loop_); - // Disconnect the current print_job_. + // Disconnect the current |print_job_|. DisconnectFromCurrentPrintJob(); // We can't print if there is no renderer. @@ -403,12 +422,6 @@ void PrintViewManagerBase::DisconnectFromCurrentPrintJob() { #endif } -void PrintViewManagerBase::PrintingDone(bool success) { - if (!print_job_.get()) - return; - Send(new PrintMsg_PrintingDone(routing_id(), success)); -} - void PrintViewManagerBase::TerminatePrintJob(bool cancel) { if (!print_job_.get()) return; @@ -430,16 +443,23 @@ void PrintViewManagerBase::TerminatePrintJob(bool cancel) { } void PrintViewManagerBase::ReleasePrintJob() { + content::RenderFrameHost* rfh = printing_rfh_; + printing_rfh_ = nullptr; + if (!print_job_.get()) return; - PrintingDone(printing_succeeded_); + if (rfh) { + auto msg = base::MakeUnique(rfh->GetRoutingID(), + printing_succeeded_); + rfh->Send(msg.release()); + } registrar_.Remove(this, chrome::NOTIFICATION_PRINT_JOB_EVENT, content::Source(print_job_.get())); print_job_->DisconnectSource(); // Don't close the worker thread. - print_job_ = NULL; + print_job_ = nullptr; } bool PrintViewManagerBase::RunInnerMessageLoop() { @@ -508,14 +528,18 @@ bool PrintViewManagerBase::OpportunisticallyCreatePrintJob(int cookie) { return true; } -bool PrintViewManagerBase::PrintNowInternal(IPC::Message* message) { +bool PrintViewManagerBase::PrintNowInternal( + content::RenderFrameHost* rfh, + std::unique_ptr message) { // Don't print / print preview interstitials or crashed tabs. - if (web_contents()->ShowingInterstitialPage() || - web_contents()->IsCrashed()) { - delete message; + if (web_contents()->ShowingInterstitialPage() || web_contents()->IsCrashed()) return false; - } - return Send(message); + return rfh->Send(message.release()); +} + +void PrintViewManagerBase::SetPrintingRFH(content::RenderFrameHost* rfh) { + DCHECK(!printing_rfh_); + printing_rfh_ = rfh; } void PrintViewManagerBase::ReleasePrinterQuery() { @@ -539,4 +563,9 @@ void PrintViewManagerBase::ReleasePrinterQuery() { base::Bind(&PrinterQuery::StopWorker, printer_query)); } +void PrintViewManagerBase::SendPrintingEnabled(bool enabled, + content::RenderFrameHost* rfh) { + rfh->Send(new PrintMsg_SetPrintingEnabled(rfh->GetRoutingID(), enabled)); +} + } // namespace printing diff --git a/chromium/chrome/browser/printing/print_view_manager_base.h b/chromium/chrome/browser/printing/print_view_manager_base.h index 089f9202381..6dac9ddfa3d 100644 --- a/chromium/chrome/browser/printing/print_view_manager_base.h +++ b/chromium/chrome/browser/printing/print_view_manager_base.h @@ -5,6 +5,8 @@ #ifndef CHROME_BROWSER_PRINTING_PRINT_VIEW_MANAGER_BASE_H_ #define CHROME_BROWSER_PRINTING_PRINT_VIEW_MANAGER_BASE_H_ +#include + #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/strings/string16.h" @@ -13,12 +15,13 @@ #include "components/printing/browser/print_manager.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" +#include "printing/features/features.h" #include "printing/printed_pages_source.h" struct PrintHostMsg_DidPrintPage_Params; namespace content { -class RenderViewHost; +class RenderFrameHost; } namespace printing { @@ -36,15 +39,15 @@ class PrintViewManagerBase : public content::NotificationObserver, public: ~PrintViewManagerBase() override; -#if defined(ENABLE_BASIC_PRINTING) +#if BUILDFLAG(ENABLE_BASIC_PRINTING) // Prints the current document immediately. Since the rendering is // asynchronous, the actual printing will not be completed on the return of // this function. Returns false if printing is impossible at the moment. - virtual bool PrintNow(); + virtual bool PrintNow(content::RenderFrameHost* rfh); #endif // ENABLE_BASIC_PRINTING - // Whether to block scripted printing for our tab or not. - void UpdateScriptedPrintingBlocked(); + // Whether printing is enabled or not. + void UpdatePrintingEnabled(); // PrintedPagesSource implementation. base::string16 RenderSourceName() override; @@ -53,13 +56,15 @@ class PrintViewManagerBase : public content::NotificationObserver, explicit PrintViewManagerBase(content::WebContents* web_contents); // Helper method for Print*Now(). - bool PrintNowInternal(IPC::Message* message); + bool PrintNowInternal(content::RenderFrameHost* rfh, + std::unique_ptr message); - // Terminates or cancels the print job if one was pending. - void RenderProcessGone(base::TerminationStatus status) override; + void SetPrintingRFH(content::RenderFrameHost* rfh); // content::WebContentsObserver implementation. - bool OnMessageReceived(const IPC::Message& message) override; + void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override; + bool OnMessageReceived(const IPC::Message& message, + content::RenderFrameHost* render_frame_host) override; private: // content::NotificationObserver implementation. @@ -104,9 +109,6 @@ class PrintViewManagerBase : public content::NotificationObserver, // disconnect from it. void DisconnectFromCurrentPrintJob(); - // Notify that the printing is done. - void PrintingDone(bool success); - // Terminates the print job. No-op if no print job has been created. If // |cancel| is true, cancel it instead of waiting for the job to finish. Will // call ReleasePrintJob(). @@ -130,8 +132,14 @@ class PrintViewManagerBase : public content::NotificationObserver, // Release the PrinterQuery associated with our |cookie_|. void ReleasePrinterQuery(); + // Helper method for UpdatePrintingEnabled(). + void SendPrintingEnabled(bool enabled, content::RenderFrameHost* rfh); + content::NotificationRegistrar registrar_; + // The current RFH that is printing with a system printing dialog. + content::RenderFrameHost* printing_rfh_; + // Manages the low-level talk to the printer. scoped_refptr print_job_; diff --git a/chromium/chrome/browser/printing/print_view_manager_common.cc b/chromium/chrome/browser/printing/print_view_manager_common.cc index 097220415f1..1832389b903 100644 --- a/chromium/chrome/browser/printing/print_view_manager_common.cc +++ b/chromium/chrome/browser/printing/print_view_manager_common.cc @@ -4,20 +4,25 @@ #include "chrome/browser/printing/print_view_manager_common.h" -#if defined(ENABLE_EXTENSIONS) +#include "content/public/browser/render_frame_host.h" +#include "extensions/features/features.h" +#include "printing/features/features.h" + +#if BUILDFLAG(ENABLE_EXTENSIONS) #include "components/guest_view/browser/guest_view_manager.h" #include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h" -#endif // defined(ENABLE_EXTENSIONS) +#endif // BUILDFLAG(ENABLE_EXTENSIONS) -#if defined(ENABLE_PRINT_PREVIEW) +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) #include "chrome/browser/printing/print_view_manager.h" #else #include "chrome/browser/printing/print_view_manager_basic.h" -#endif // defined(ENABLE_PRINT_PREVIEW) +#endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) namespace printing { + namespace { -#if defined(ENABLE_EXTENSIONS) +#if BUILDFLAG(ENABLE_EXTENSIONS) // Stores |guest_contents| in |result| and returns true if |guest_contents| is a // full page MimeHandlerViewGuest plugin. Otherwise, returns false. bool StoreFullPagePlugin(content::WebContents** result, @@ -30,12 +35,12 @@ bool StoreFullPagePlugin(content::WebContents** result, } return false; } -#endif // defined(ENABLE_EXTENSIONS) +#endif // BUILDFLAG(ENABLE_EXTENSIONS) // If we have a single full-page embedded mime handler view guest, print the // guest's WebContents instead. content::WebContents* GetWebContentsToUse(content::WebContents* contents) { -#if defined(ENABLE_EXTENSIONS) +#if BUILDFLAG(ENABLE_EXTENSIONS) guest_view::GuestViewManager* guest_view_manager = guest_view::GuestViewManager::FromBrowserContext( contents->GetBrowserContext()); @@ -44,47 +49,77 @@ content::WebContents* GetWebContentsToUse(content::WebContents* contents) { contents, base::Bind(&StoreFullPagePlugin, &contents)); } -#endif // defined(ENABLE_EXTENSIONS) +#endif // BUILDFLAG(ENABLE_EXTENSIONS) return contents; } +// Pick the right RenderFrameHost based on the WebContentses. +content::RenderFrameHost* GetRenderFrameHostToUse( + content::WebContents* original_contents, + content::WebContents* contents_to_use) { + if (original_contents != contents_to_use) + return contents_to_use->GetMainFrame(); + return GetFrameToPrint(contents_to_use); +} + } // namespace void StartPrint(content::WebContents* contents, bool print_preview_disabled, - bool selection_only) { -#if defined(ENABLE_PRINT_PREVIEW) + bool has_selection) { +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) using PrintViewManagerImpl = PrintViewManager; #else using PrintViewManagerImpl = PrintViewManagerBasic; -#endif // defined(ENABLE_PRINT_PREVIEW) +#endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) + content::WebContents* contents_to_use = GetWebContentsToUse(contents); auto* print_view_manager = - PrintViewManagerImpl::FromWebContents(GetWebContentsToUse(contents)); + PrintViewManagerImpl::FromWebContents(contents_to_use); if (!print_view_manager) return; -#if defined(ENABLE_PRINT_PREVIEW) + + content::RenderFrameHost* rfh_to_use = + GetRenderFrameHostToUse(contents, contents_to_use); + if (!rfh_to_use) + return; + +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) if (!print_preview_disabled) { - print_view_manager->PrintPreviewNow(selection_only); + print_view_manager->PrintPreviewNow(rfh_to_use, has_selection); return; } #endif // ENABLE_PRINT_PREVIEW -#if defined(ENABLE_BASIC_PRINTING) - print_view_manager->PrintNow(); +#if BUILDFLAG(ENABLE_BASIC_PRINTING) + print_view_manager->PrintNow(rfh_to_use); #endif // ENABLE_BASIC_PRINTING } -#if defined(ENABLE_BASIC_PRINTING) +#if BUILDFLAG(ENABLE_BASIC_PRINTING) void StartBasicPrint(content::WebContents* contents) { -#if defined(ENABLE_PRINT_PREVIEW) +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) + content::WebContents* contents_to_use = GetWebContentsToUse(contents); PrintViewManager* print_view_manager = - PrintViewManager::FromWebContents(GetWebContentsToUse(contents)); + PrintViewManager::FromWebContents(contents_to_use); if (!print_view_manager) return; - print_view_manager->BasicPrint(); + + content::RenderFrameHost* rfh_to_use = + GetRenderFrameHostToUse(contents, contents_to_use); + if (!rfh_to_use) + return; + + print_view_manager->BasicPrint(rfh_to_use); #endif // ENABLE_PRINT_PREVIEW } #endif // ENABLE_BASIC_PRINTING +content::RenderFrameHost* GetFrameToPrint(content::WebContents* contents) { + auto* focused_frame = contents->GetFocusedFrame(); + return (focused_frame && focused_frame->HasSelection()) + ? focused_frame + : contents->GetMainFrame(); +} + } // namespace printing diff --git a/chromium/chrome/browser/printing/print_view_manager_common.h b/chromium/chrome/browser/printing/print_view_manager_common.h index 6e106404273..da97bc7503d 100644 --- a/chromium/chrome/browser/printing/print_view_manager_common.h +++ b/chromium/chrome/browser/printing/print_view_manager_common.h @@ -5,7 +5,10 @@ #ifndef CHROME_BROWSER_PRINTING_PRINT_VIEW_MANAGER_COMMON_H_ #define CHROME_BROWSER_PRINTING_PRINT_VIEW_MANAGER_COMMON_H_ +#include "printing/features/features.h" + namespace content { +class RenderFrameHost; class WebContents; } @@ -14,13 +17,17 @@ namespace printing { // Start printing using the appropriate PrintViewManagerBase subclass. void StartPrint(content::WebContents* web_contents, bool print_preview_disabled, - bool selection_only); + bool has_selection); -#if defined(ENABLE_BASIC_PRINTING) +#if BUILDFLAG(ENABLE_BASIC_PRINTING) // Start printing using the system print dialog. void StartBasicPrint(content::WebContents* contents); #endif +// If the user has selected text in the currently focused frame, print only that +// frame (this makes print selection work for multiple frames). +content::RenderFrameHost* GetFrameToPrint(content::WebContents* contents); + } // namespace printing #endif // CHROME_BROWSER_PRINTING_PRINT_VIEW_MANAGER_COMMON_H_ diff --git a/chromium/chrome/browser/printing/printer_query.cc b/chromium/chrome/browser/printing/printer_query.cc index 1a097193205..bfaeb574db3 100644 --- a/chromium/chrome/browser/printing/printer_query.cc +++ b/chromium/chrome/browser/printing/printer_query.cc @@ -16,8 +16,8 @@ namespace printing { -PrinterQuery::PrinterQuery(int render_process_id, int render_view_id) - : worker_(new PrintJobWorker(render_process_id, render_view_id, this)), +PrinterQuery::PrinterQuery(int render_process_id, int render_frame_id) + : worker_(new PrintJobWorker(render_process_id, render_frame_id, this)), is_print_dialog_box_shown_(false), cookie_(PrintSettings::NewCookie()), last_status_(PrintingContext::FAILED) { diff --git a/chromium/chrome/browser/printing/printer_query.h b/chromium/chrome/browser/printing/printer_query.h index 13baf17e0d4..9008e19de81 100644 --- a/chromium/chrome/browser/printing/printer_query.h +++ b/chromium/chrome/browser/printing/printer_query.h @@ -31,7 +31,7 @@ class PrinterQuery : public PrintJobWorkerOwner { ASK_USER, }; - PrinterQuery(int render_process_id, int render_view_id); + PrinterQuery(int render_process_id, int render_frame_id); // PrintJobWorkerOwner implementation. void GetSettingsDone(const PrintSettings& new_settings, diff --git a/chromium/chrome/browser/printing/printing_message_filter.cc b/chromium/chrome/browser/printing/printing_message_filter.cc index 6c416b40a0f..a4f25977790 100644 --- a/chromium/chrome/browser/printing/printing_message_filter.cc +++ b/chromium/chrome/browser/printing/printing_message_filter.cc @@ -18,15 +18,17 @@ #include "components/printing/browser/print_manager_utils.h" #include "components/printing/common/print_messages.h" #include "content/public/browser/browser_thread.h" -#include "content/public/browser/render_view_host.h" +#include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" #include "content/public/common/child_process_host.h" +#include "printing/features/features.h" -#if defined(ENABLE_PRINT_PREVIEW) +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h" #endif #if defined(OS_ANDROID) +#include "base/file_descriptor_posix.h" #include "base/strings/string_number_conversions.h" #include "chrome/browser/printing/print_view_manager_basic.h" #endif @@ -38,19 +40,19 @@ namespace printing { namespace { #if defined(OS_ANDROID) -content::WebContents* GetWebContentsForRenderView(int render_process_id, - int render_view_id) { +content::WebContents* GetWebContentsForRenderFrame(int render_process_id, + int render_frame_id) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - content::RenderViewHost* view = content::RenderViewHost::FromID( - render_process_id, render_view_id); - return view ? content::WebContents::FromRenderViewHost(view) : nullptr; + content::RenderFrameHost* frame = + content::RenderFrameHost::FromID(render_process_id, render_frame_id); + return frame ? content::WebContents::FromRenderFrameHost(frame) : nullptr; } PrintViewManagerBasic* GetPrintManager(int render_process_id, - int render_view_id) { + int render_frame_id) { DCHECK_CURRENTLY_ON(BrowserThread::UI); content::WebContents* web_contents = - GetWebContentsForRenderView(render_process_id, render_view_id); + GetWebContentsForRenderFrame(render_process_id, render_frame_id); return web_contents ? PrintViewManagerBasic::FromWebContents(web_contents) : nullptr; } @@ -92,13 +94,12 @@ bool PrintingMessageFilter::OnMessageReceived(const IPC::Message& message) { IPC_MESSAGE_HANDLER(PrintHostMsg_TempFileForPrintingWritten, OnTempFileForPrintingWritten) #endif - IPC_MESSAGE_HANDLER(PrintHostMsg_IsPrintingEnabled, OnIsPrintingEnabled) IPC_MESSAGE_HANDLER_DELAY_REPLY(PrintHostMsg_GetDefaultPrintSettings, OnGetDefaultPrintSettings) IPC_MESSAGE_HANDLER_DELAY_REPLY(PrintHostMsg_ScriptedPrint, OnScriptedPrint) IPC_MESSAGE_HANDLER_DELAY_REPLY(PrintHostMsg_UpdatePrintSettings, OnUpdatePrintSettings) -#if defined(ENABLE_PRINT_PREVIEW) +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) IPC_MESSAGE_HANDLER(PrintHostMsg_CheckForCancel, OnCheckForCancel) #endif IPC_MESSAGE_UNHANDLED(handled = false) @@ -108,35 +109,31 @@ bool PrintingMessageFilter::OnMessageReceived(const IPC::Message& message) { #if defined(OS_ANDROID) void PrintingMessageFilter::OnAllocateTempFileForPrinting( - int render_view_id, + int render_frame_id, base::FileDescriptor* temp_file_fd, int* sequence_number) { DCHECK_CURRENTLY_ON(BrowserThread::UI); PrintViewManagerBasic* print_view_manager = - GetPrintManager(render_process_id_, render_view_id); + GetPrintManager(render_process_id_, render_frame_id); if (!print_view_manager) return; + // The file descriptor is originally created in & passed from the Android // side, and it will handle the closing. temp_file_fd->fd = print_view_manager->file_descriptor().fd; temp_file_fd->auto_close = false; } -void PrintingMessageFilter::OnTempFileForPrintingWritten(int render_view_id, +void PrintingMessageFilter::OnTempFileForPrintingWritten(int render_frame_id, int sequence_number) { DCHECK_CURRENTLY_ON(BrowserThread::UI); PrintViewManagerBasic* print_view_manager = - GetPrintManager(render_process_id_, render_view_id); + GetPrintManager(render_process_id_, render_frame_id); if (print_view_manager) print_view_manager->PdfWritingDone(true); } #endif // defined(OS_ANDROID) -void PrintingMessageFilter::OnIsPrintingEnabled(bool* is_enabled) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); - *is_enabled = is_printing_enabled_->GetValue(); -} - void PrintingMessageFilter::OnGetDefaultPrintSettings(IPC::Message* reply_msg) { DCHECK_CURRENTLY_ON(BrowserThread::IO); scoped_refptr printer_query; @@ -238,10 +235,10 @@ void PrintingMessageFilter::OnScriptedPrintReply( } #if defined(OS_ANDROID) -void PrintingMessageFilter::UpdateFileDescriptor(int render_view_id, int fd) { +void PrintingMessageFilter::UpdateFileDescriptor(int render_frame_id, int fd) { DCHECK_CURRENTLY_ON(BrowserThread::UI); PrintViewManagerBasic* print_view_manager = - GetPrintManager(render_process_id_, render_view_id); + GetPrintManager(render_process_id_, render_frame_id); if (print_view_manager) print_view_manager->set_file_descriptor(base::FileDescriptor(fd, false)); } @@ -260,14 +257,12 @@ void PrintingMessageFilter::OnUpdatePrintSettings( } printer_query = queue_->PopPrinterQuery(document_cookie); if (!printer_query.get()) { - int host_id = render_process_id_; - int routing_id = reply_msg->routing_id(); - if (!new_settings->GetInteger(printing::kPreviewInitiatorHostId, - &host_id) || - !new_settings->GetInteger(printing::kPreviewInitiatorRoutingId, - &routing_id)) { + int host_id; + int routing_id; + if (!new_settings->GetInteger(kPreviewInitiatorHostId, &host_id) || + !new_settings->GetInteger(kPreviewInitiatorRoutingId, &routing_id)) { host_id = content::ChildProcessHost::kInvalidUniqueID; - routing_id = content::ChildProcessHost::kInvalidUniqueID; + routing_id = MSG_ROUTING_NONE; } printer_query = queue_->CreatePrinterQuery(host_id, routing_id); } @@ -289,11 +284,10 @@ void PrintingMessageFilter::OnUpdatePrintSettingsReply( params.params.document_cookie = printer_query->cookie(); params.pages = PageRange::GetPages(printer_query->settings().ranges()); } - PrintHostMsg_UpdatePrintSettings::WriteReplyParams( - reply_msg, - params, - printer_query.get() && - (printer_query->last_status() == printing::PrintingContext::CANCEL)); + bool canceled = printer_query.get() && + (printer_query->last_status() == PrintingContext::CANCEL); + PrintHostMsg_UpdatePrintSettings::WriteReplyParams(reply_msg, params, + canceled); Send(reply_msg); // If user hasn't cancelled. if (printer_query.get()) { @@ -305,7 +299,7 @@ void PrintingMessageFilter::OnUpdatePrintSettingsReply( } } -#if defined(ENABLE_PRINT_PREVIEW) +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) void PrintingMessageFilter::OnCheckForCancel(int32_t preview_ui_id, int preview_request_id, bool* cancel) { diff --git a/chromium/chrome/browser/printing/printing_message_filter.h b/chromium/chrome/browser/printing/printing_message_filter.h index 127f27207b7..86651d47f34 100644 --- a/chromium/chrome/browser/printing/printing_message_filter.h +++ b/chromium/chrome/browser/printing/printing_message_filter.h @@ -10,32 +10,24 @@ #include #include -#include "base/compiler_specific.h" #include "base/macros.h" #include "build/build_config.h" #include "components/prefs/pref_member.h" #include "content/public/browser/browser_message_filter.h" - -#if defined(OS_WIN) -#include "base/memory/shared_memory.h" -#endif +#include "printing/features/features.h" struct PrintHostMsg_ScriptedPrint_Params; class Profile; -class ProfileIOData; namespace base { class DictionaryValue; -class FilePath; -} - -namespace content { -class WebContents; +#if defined(OS_ANDROID) +struct FileDescriptor; +#endif } namespace printing { -class PrintJobManager; class PrintQueriesQueue; class PrinterQuery; @@ -53,30 +45,19 @@ class PrintingMessageFilter : public content::BrowserMessageFilter { private: ~PrintingMessageFilter() override; -#if defined(OS_CHROMEOS) || defined(OS_ANDROID) +#if defined(OS_ANDROID) // Used to ask the browser allocate a temporary file for the renderer // to fill in resulting PDF in renderer. - void OnAllocateTempFileForPrinting(int render_view_id, + void OnAllocateTempFileForPrinting(int render_frame_id, base::FileDescriptor* temp_file_fd, int* sequence_number); - void OnTempFileForPrintingWritten(int render_view_id, int sequence_number); -#endif + void OnTempFileForPrintingWritten(int render_frame_id, int sequence_number); -#if defined(OS_ANDROID) // Updates the file descriptor for the PrintViewManagerBasic of a given - // render_view_id. - void UpdateFileDescriptor(int render_view_id, int fd); + // |render_frame_id|. + void UpdateFileDescriptor(int render_frame_id, int fd); #endif - // GetPrintSettingsForRenderView must be called via PostTask and - // base::Bind. Collapse the settings-specific params into a - // struct to avoid running into issues with too many params - // to base::Bind. - struct GetPrintSettingsForRenderViewParams; - - // Checks if printing is enabled. - void OnIsPrintingEnabled(bool* is_enabled); - // Get the default print setting. void OnGetDefaultPrintSettings(IPC::Message* reply_msg); void OnGetDefaultPrintSettingsReply(scoped_refptr printer_query, @@ -99,7 +80,7 @@ class PrintingMessageFilter : public content::BrowserMessageFilter { void OnUpdatePrintSettingsReply(scoped_refptr printer_query, IPC::Message* reply_msg); -#if defined(ENABLE_PRINT_PREVIEW) +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) // Check to see if print preview has been cancelled. void OnCheckForCancel(int32_t preview_ui_id, int preview_request_id, diff --git a/chromium/chrome/browser/printing/pwg_raster_converter.cc b/chromium/chrome/browser/printing/pwg_raster_converter.cc index 62b4ac82e91..1a7200fd986 100644 --- a/chromium/chrome/browser/printing/pwg_raster_converter.cc +++ b/chromium/chrome/browser/printing/pwg_raster_converter.cc @@ -16,6 +16,7 @@ #include "base/location.h" #include "base/logging.h" #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "base/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" #include "chrome/common/chrome_utility_messages.h" @@ -77,14 +78,15 @@ class FileHandlers { base::ScopedTempDir temp_dir_; base::File pdf_file_; base::File pwg_file_; + + DISALLOW_COPY_AND_ASSIGN(FileHandlers); }; void FileHandlers::Init(base::RefCountedMemory* data) { DCHECK_CURRENTLY_ON(BrowserThread::FILE); - if (!temp_dir_.CreateUniqueTempDir()) { + if (!temp_dir_.CreateUniqueTempDir()) return; - } if (static_cast(data->size()) != base::WriteFile(GetPdfPath(), data->front_as(), data->size())) { @@ -150,8 +152,8 @@ class PwgUtilityProcessHostClient : public content::UtilityProcessHostClient { }; PwgUtilityProcessHostClient::PwgUtilityProcessHostClient( - const printing::PdfRenderSettings& settings, - const printing::PwgRasterSettings& bitmap_settings) + const PdfRenderSettings& settings, + const PwgRasterSettings& bitmap_settings) : settings_(settings), bitmap_settings_(bitmap_settings) {} PwgUtilityProcessHostClient::~PwgUtilityProcessHostClient() { @@ -161,9 +163,11 @@ void PwgUtilityProcessHostClient::Convert( base::RefCountedMemory* data, const PWGRasterConverter::ResultCallback& callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); + callback_ = callback; CHECK(!files_); files_.reset(new FileHandlers()); + BrowserThread::PostTaskAndReply( BrowserThread::FILE, FROM_HERE, base::Bind(&FileHandlers::Init, base::Unretained(files_.get()), @@ -200,6 +204,7 @@ void PwgUtilityProcessHostClient::OnFailed() { void PwgUtilityProcessHostClient::OnFilesReadyOnUIThread() { DCHECK_CURRENTLY_ON(BrowserThread::UI); + if (!files_->IsValid()) { RunCallbackOnUIThread(false); return; @@ -211,6 +216,7 @@ void PwgUtilityProcessHostClient::OnFilesReadyOnUIThread() { void PwgUtilityProcessHostClient::StartProcessOnIOThread() { DCHECK_CURRENTLY_ON(BrowserThread::IO); + content::UtilityProcessHost* utility_process_host = content::UtilityProcessHost::Create(this, base::ThreadTaskRunnerHandle::Get()); @@ -230,23 +236,22 @@ void PwgUtilityProcessHostClient::RunCallback(bool success) { void PwgUtilityProcessHostClient::RunCallbackOnUIThread(bool success) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - if (!callback_.is_null()) { - BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, - base::Bind(callback_, success, - files_->GetPwgPath())); - callback_.Reset(); - } + if (callback_.is_null()) + return; + + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, + base::Bind(callback_, success, files_->GetPwgPath())); + callback_.Reset(); } class PWGRasterConverterImpl : public PWGRasterConverter { public: PWGRasterConverterImpl(); - ~PWGRasterConverterImpl() override; void Start(base::RefCountedMemory* data, - const printing::PdfRenderSettings& conversion_settings, - const printing::PwgRasterSettings& bitmap_settings, + const PdfRenderSettings& conversion_settings, + const PwgRasterSettings& bitmap_settings, const ResultCallback& callback) override; private: @@ -262,11 +267,10 @@ PWGRasterConverterImpl::PWGRasterConverterImpl() { PWGRasterConverterImpl::~PWGRasterConverterImpl() { } -void PWGRasterConverterImpl::Start( - base::RefCountedMemory* data, - const printing::PdfRenderSettings& conversion_settings, - const printing::PwgRasterSettings& bitmap_settings, - const ResultCallback& callback) { +void PWGRasterConverterImpl::Start(base::RefCountedMemory* data, + const PdfRenderSettings& conversion_settings, + const PwgRasterSettings& bitmap_settings, + const ResultCallback& callback) { // Rebind cancelable callback to avoid calling callback if // PWGRasterConverterImpl is destroyed. callback_.Reset(callback); @@ -279,71 +283,64 @@ void PWGRasterConverterImpl::Start( // static std::unique_ptr PWGRasterConverter::CreateDefault() { - return std::unique_ptr(new PWGRasterConverterImpl()); + return base::MakeUnique(); } // static -printing::PdfRenderSettings PWGRasterConverter::GetConversionSettings( +PdfRenderSettings PWGRasterConverter::GetConversionSettings( const cloud_devices::CloudDeviceDescription& printer_capabilities, const gfx::Size& page_size) { - int dpi = printing::kDefaultPdfDpi; + int dpi = kDefaultPdfDpi; cloud_devices::printer::DpiCapability dpis; if (dpis.LoadFrom(printer_capabilities)) dpi = std::max(dpis.GetDefault().horizontal, dpis.GetDefault().vertical); - double scale = dpi; - scale /= printing::kPointsPerInch; + const double scale = static_cast(dpi) / kPointsPerInch; // Make vertical rectangle to optimize streaming to printer. Fix orientation // by autorotate. gfx::Rect area(std::min(page_size.width(), page_size.height()) * scale, std::max(page_size.width(), page_size.height()) * scale); - return printing::PdfRenderSettings(area, dpi, true /* autorotate */); + return PdfRenderSettings(area, dpi, true /* autorotate */); } // static -printing::PwgRasterSettings PWGRasterConverter::GetBitmapSettings( +PwgRasterSettings PWGRasterConverter::GetBitmapSettings( const cloud_devices::CloudDeviceDescription& printer_capabilities, const cloud_devices::CloudDeviceDescription& ticket) { - printing::PwgRasterSettings result; - cloud_devices::printer::PwgRasterConfigCapability raster_capability; - // If the raster capability fails to load, raster_capability will contain - // the default value. - raster_capability.LoadFrom(printer_capabilities); - cloud_devices::printer::DuplexTicketItem duplex_item; cloud_devices::printer::DuplexType duplex_value = cloud_devices::printer::NO_DUPLEX; + if (duplex_item.LoadFrom(ticket)) + duplex_value = duplex_item.value(); + cloud_devices::printer::PwgRasterConfigCapability raster_capability; + // If the raster capability fails to load, |raster_capability| will contain + // the default value. + raster_capability.LoadFrom(printer_capabilities); cloud_devices::printer::DocumentSheetBack document_sheet_back = raster_capability.value().document_sheet_back; - if (duplex_item.LoadFrom(ticket)) { - duplex_value = duplex_item.value(); - } - - result.odd_page_transform = printing::TRANSFORM_NORMAL; + PwgRasterSettings result; + result.odd_page_transform = TRANSFORM_NORMAL; switch (duplex_value) { case cloud_devices::printer::NO_DUPLEX: - result.odd_page_transform = printing::TRANSFORM_NORMAL; break; case cloud_devices::printer::LONG_EDGE: - if (document_sheet_back == cloud_devices::printer::ROTATED) { - result.odd_page_transform = printing::TRANSFORM_ROTATE_180; - } else if (document_sheet_back == cloud_devices::printer::FLIPPED) { - result.odd_page_transform = printing::TRANSFORM_FLIP_VERTICAL; - } + if (document_sheet_back == cloud_devices::printer::ROTATED) + result.odd_page_transform = TRANSFORM_ROTATE_180; + else if (document_sheet_back == cloud_devices::printer::FLIPPED) + result.odd_page_transform = TRANSFORM_FLIP_VERTICAL; break; case cloud_devices::printer::SHORT_EDGE: - if (document_sheet_back == cloud_devices::printer::MANUAL_TUMBLE) { - result.odd_page_transform = printing::TRANSFORM_ROTATE_180; - } else if (document_sheet_back == cloud_devices::printer::FLIPPED) { - result.odd_page_transform = printing::TRANSFORM_FLIP_HORIZONTAL; - } + if (document_sheet_back == cloud_devices::printer::MANUAL_TUMBLE) + result.odd_page_transform = TRANSFORM_ROTATE_180; + else if (document_sheet_back == cloud_devices::printer::FLIPPED) + result.odd_page_transform = TRANSFORM_FLIP_HORIZONTAL; + break; } result.rotate_all_pages = raster_capability.value().rotate_all_pages; - result.reverse_page_order = raster_capability.value().reverse_order_streaming; return result; } diff --git a/chromium/chrome/browser/printing/pwg_raster_converter.h b/chromium/chrome/browser/printing/pwg_raster_converter.h index 18d16524327..c7d6998e077 100644 --- a/chromium/chrome/browser/printing/pwg_raster_converter.h +++ b/chromium/chrome/browser/printing/pwg_raster_converter.h @@ -24,7 +24,7 @@ class Size; namespace printing { -class PdfRenderSettings; +struct PdfRenderSettings; struct PwgRasterSettings; class PWGRasterConverter { @@ -33,9 +33,10 @@ class PWGRasterConverter { // |success| denotes whether the conversion succeeded. // |temp_file| is the path to the temp file (owned by the converter) that // contains the PWG raster data. - typedef base::Callback - ResultCallback; + using ResultCallback = + base::Callback; + virtual ~PWGRasterConverter() {} static std::unique_ptr CreateDefault(); diff --git a/chromium/chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.cc b/chromium/chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.cc index 2b42f45645c..0da4a534c0a 100644 --- a/chromium/chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.cc +++ b/chromium/chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.cc @@ -51,7 +51,6 @@ ChromeBrowserPepperHostFactory::CreateResourceHost( return std::unique_ptr(new MessageFilterHost( host_->GetPpapiHost(), instance, resource, broker_filter)); } -#if defined(OS_CHROMEOS) case PpapiHostMsg_PlatformVerification_Create::ID: { scoped_refptr pv_filter( new chrome::PepperPlatformVerificationMessageFilter(host_, @@ -59,7 +58,6 @@ ChromeBrowserPepperHostFactory::CreateResourceHost( return std::unique_ptr(new MessageFilterHost( host_->GetPpapiHost(), instance, resource, pv_filter)); } -#endif case PpapiHostMsg_OutputProtection_Create::ID: { scoped_refptr output_protection_filter( new chrome::PepperOutputProtectionMessageFilter(host_, instance)); diff --git a/chromium/chrome/browser/renderer_host/pepper/pepper_flash_browser_host.cc b/chromium/chrome/browser/renderer_host/pepper/pepper_flash_browser_host.cc index 5ce66503605..ef35bdaf4e6 100644 --- a/chromium/chrome/browser/renderer_host/pepper/pepper_flash_browser_host.cc +++ b/chromium/chrome/browser/renderer_host/pepper/pepper_flash_browser_host.cc @@ -13,6 +13,7 @@ #include "content/public/browser/browser_ppapi_host.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/render_process_host.h" +#include "device/power_save_blocker/power_save_blocker.h" #include "ipc/ipc_message_macros.h" #include "ppapi/c/pp_errors.h" #include "ppapi/c/private/ppb_flash.h" @@ -57,6 +58,8 @@ PepperFlashBrowserHost::PepperFlashBrowserHost(BrowserPpapiHost* host, PP_Resource resource) : ResourceHost(host->GetPpapiHost(), instance, resource), host_(host), + delay_timer_(FROM_HERE, base::TimeDelta::FromSeconds(45), this, + &PepperFlashBrowserHost::OnDelayTimerFired), weak_factory_(this) { int unused; host->GetRenderFrameIDsForInstance(instance, &render_process_id_, &unused); @@ -78,21 +81,24 @@ int32_t PepperFlashBrowserHost::OnResourceMessageReceived( return PP_ERROR_FAILED; } +void PepperFlashBrowserHost::OnDelayTimerFired() { + power_save_blocker_.reset(); +} + int32_t PepperFlashBrowserHost::OnUpdateActivity( ppapi::host::HostMessageContext* host_context) { -#if defined(OS_WIN) - // Reading then writing back the same value to the screensaver timeout system - // setting resets the countdown which prevents the screensaver from turning - // on "for a while". As long as the plugin pings us with this message faster - // than the screensaver timeout, it won't go on. - int value = 0; - if (SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT, 0, &value, 0)) - SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT, value, NULL, 0); -#elif defined(OS_MACOSX) - UpdateSystemActivity(OverallAct); -#else -// TODO(brettw) implement this for other platforms. -#endif + if (!power_save_blocker_) { + power_save_blocker_.reset(new device::PowerSaveBlocker( + device::PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep, + device::PowerSaveBlocker::kReasonOther, "Requested By PepperFlash", + BrowserThread::GetTaskRunnerForThread(BrowserThread::UI), + BrowserThread::GetTaskRunnerForThread(BrowserThread::FILE))); + } + // There is no specification for how long OnUpdateActivity should prevent the + // screen from going to sleep. Empirically, twitch.tv calls this method every + // 10 seconds. Be conservative and allow 45 seconds (set in |delay_timer_|'s + // ctor) before deleting the block. + delay_timer_.Reset(); return PP_OK; } diff --git a/chromium/chrome/browser/renderer_host/pepper/pepper_flash_browser_host.h b/chromium/chrome/browser/renderer_host/pepper/pepper_flash_browser_host.h index 50308a2b618..65f0a61afc9 100644 --- a/chromium/chrome/browser/renderer_host/pepper/pepper_flash_browser_host.h +++ b/chromium/chrome/browser/renderer_host/pepper/pepper_flash_browser_host.h @@ -10,6 +10,7 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" +#include "base/timer/timer.h" #include "ppapi/host/host_message_context.h" #include "ppapi/host/resource_host.h" @@ -26,6 +27,10 @@ namespace content_settings { class CookieSettings; } +namespace device { +class PowerSaveBlocker; +} + class GURL; namespace chrome { @@ -43,6 +48,7 @@ class PepperFlashBrowserHost : public ppapi::host::ResourceHost { ppapi::host::HostMessageContext* context) override; private: + void OnDelayTimerFired(); int32_t OnUpdateActivity(ppapi::host::HostMessageContext* host_context); int32_t OnGetLocalTimeZoneOffset( ppapi::host::HostMessageContext* host_context, @@ -57,6 +63,12 @@ class PepperFlashBrowserHost : public ppapi::host::ResourceHost { content::BrowserPpapiHost* host_; int render_process_id_; + + // A power save blocker to prevent going to sleep, and a timer to destroy it + // after a certain amount of time has elapsed without an UpdateActivity. + std::unique_ptr power_save_blocker_; + base::DelayTimer delay_timer_; + // For fetching the Flash LSO settings. scoped_refptr cookie_settings_; base::WeakPtrFactory weak_factory_; diff --git a/chromium/chrome/browser/renderer_host/pepper/pepper_isolated_file_system_message_filter.cc b/chromium/chrome/browser/renderer_host/pepper/pepper_isolated_file_system_message_filter.cc index 09d7c0b9d61..30a58414fec 100644 --- a/chromium/chrome/browser/renderer_host/pepper/pepper_isolated_file_system_message_filter.cc +++ b/chromium/chrome/browser/renderer_host/pepper/pepper_isolated_file_system_message_filter.cc @@ -16,12 +16,7 @@ #include "content/public/browser/browser_thread.h" #include "content/public/browser/child_process_security_policy.h" #include "content/public/browser/render_view_host.h" -#if defined(ENABLE_EXTENSIONS) -#include "extensions/browser/extension_registry.h" -#include "extensions/common/constants.h" -#include "extensions/common/extension.h" -#include "extensions/common/extension_set.h" -#endif +#include "extensions/features/features.h" #include "ppapi/c/pp_errors.h" #include "ppapi/host/dispatch_host_message.h" #include "ppapi/host/host_message_context.h" @@ -30,6 +25,13 @@ #include "ppapi/shared_impl/file_system_util.h" #include "storage/browser/fileapi/isolated_context.h" +#if BUILDFLAG(ENABLE_EXTENSIONS) +#include "extensions/browser/extension_registry.h" +#include "extensions/common/constants.h" +#include "extensions/common/extension.h" +#include "extensions/common/extension_set.h" +#endif + namespace chrome { namespace { @@ -102,7 +104,7 @@ Profile* PepperIsolatedFileSystemMessageFilter::GetProfile() { std::string PepperIsolatedFileSystemMessageFilter::CreateCrxFileSystem( Profile* profile) { -#if defined(ENABLE_EXTENSIONS) +#if BUILDFLAG(ENABLE_EXTENSIONS) const extensions::Extension* extension = extensions::ExtensionRegistry::Get(profile)->enabled_extensions().GetByID( document_url_.host()); @@ -140,7 +142,7 @@ int32_t PepperIsolatedFileSystemMessageFilter::OnOpenFileSystem( int32_t PepperIsolatedFileSystemMessageFilter::OpenCrxFileSystem( ppapi::host::HostMessageContext* context) { -#if defined(ENABLE_EXTENSIONS) +#if BUILDFLAG(ENABLE_EXTENSIONS) Profile* profile = GetProfile(); const extensions::ExtensionSet* extension_set = NULL; if (profile) { diff --git a/chromium/chrome/browser/renderer_host/pepper/pepper_platform_verification_message_filter.cc b/chromium/chrome/browser/renderer_host/pepper/pepper_platform_verification_message_filter.cc index 14f1e00cc5c..7bab5693c36 100644 --- a/chromium/chrome/browser/renderer_host/pepper/pepper_platform_verification_message_filter.cc +++ b/chromium/chrome/browser/renderer_host/pepper/pepper_platform_verification_message_filter.cc @@ -15,14 +15,13 @@ #include "ppapi/host/ppapi_host.h" #include "ppapi/proxy/ppapi_messages.h" -using chromeos::attestation::PlatformVerificationFlow; - namespace chrome { PepperPlatformVerificationMessageFilter:: PepperPlatformVerificationMessageFilter(content::BrowserPpapiHost* host, PP_Instance instance) : render_process_id_(0), render_frame_id_(0) { + DCHECK_CURRENTLY_ON(content::BrowserThread::IO); host->GetRenderFrameIDsForInstance( instance, &render_process_id_, &render_frame_id_); } @@ -57,35 +56,35 @@ int32_t PepperPlatformVerificationMessageFilter::OnChallengePlatform( const std::vector& challenge) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - // Ensure the RenderFrameHost is still alive. +#if defined(OS_CHROMEOS) content::RenderFrameHost* rfh = content::RenderFrameHost::FromID(render_process_id_, render_frame_id_); - if (!rfh) { - ppapi::host::ReplyMessageContext reply_context = - context->MakeReplyMessageContext(); - reply_context.params.set_result(PP_ERROR_FAILED); - SendReply( - reply_context, - PpapiHostMsg_PlatformVerification_ChallengePlatformReply( - std::vector(), std::vector(), std::string())); + if (rfh) { + if (!pv_) + pv_ = new chromeos::attestation::PlatformVerificationFlow(); + + pv_->ChallengePlatformKey( + content::WebContents::FromRenderFrameHost(rfh), service_id, + std::string(challenge.begin(), challenge.end()), + base::Bind( + &PepperPlatformVerificationMessageFilter::ChallengePlatformCallback, + this, context->MakeReplyMessageContext())); return PP_OK_COMPLETIONPENDING; } +#else + NOTREACHED() << "Challenging platform is only supported on ChromeOS."; +#endif - if (!pv_.get()) - pv_ = new PlatformVerificationFlow(); - - pv_->ChallengePlatformKey( - content::WebContents::FromRenderFrameHost(rfh), - service_id, - std::string(challenge.begin(), challenge.end()), - base::Bind( - &PepperPlatformVerificationMessageFilter::ChallengePlatformCallback, - this, - context->MakeReplyMessageContext())); - + ppapi::host::ReplyMessageContext reply_context = + context->MakeReplyMessageContext(); + reply_context.params.set_result(PP_ERROR_FAILED); + SendReply(reply_context, + PpapiHostMsg_PlatformVerification_ChallengePlatformReply( + std::vector(), std::vector(), std::string())); return PP_OK_COMPLETIONPENDING; } +#if defined(OS_CHROMEOS) void PepperPlatformVerificationMessageFilter::ChallengePlatformCallback( ppapi::host::ReplyMessageContext reply_context, chromeos::attestation::PlatformVerificationFlow::Result challenge_result, @@ -94,7 +93,8 @@ void PepperPlatformVerificationMessageFilter::ChallengePlatformCallback( const std::string& platform_key_certificate) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - if (challenge_result == PlatformVerificationFlow::SUCCESS) { + if (challenge_result == + chromeos::attestation::PlatformVerificationFlow::SUCCESS) { reply_context.params.set_result(PP_OK); } else { reply_context.params.set_result(PP_ERROR_FAILED); @@ -109,5 +109,6 @@ void PepperPlatformVerificationMessageFilter::ChallengePlatformCallback( std::vector(signature.begin(), signature.end()), platform_key_certificate)); } +#endif } // namespace chrome diff --git a/chromium/chrome/browser/renderer_host/pepper/pepper_platform_verification_message_filter.h b/chromium/chrome/browser/renderer_host/pepper/pepper_platform_verification_message_filter.h index 87644f0eecc..3833f3853d7 100644 --- a/chromium/chrome/browser/renderer_host/pepper/pepper_platform_verification_message_filter.h +++ b/chromium/chrome/browser/renderer_host/pepper/pepper_platform_verification_message_filter.h @@ -8,10 +8,13 @@ #include #include "base/macros.h" -#include "chrome/browser/chromeos/attestation/platform_verification_flow.h" #include "ppapi/c/pp_instance.h" #include "ppapi/host/resource_message_filter.h" +#if defined(OS_CHROMEOS) +#include "chrome/browser/chromeos/attestation/platform_verification_flow.h" +#endif + namespace content { class BrowserPpapiHost; } // namespace content @@ -44,7 +47,7 @@ class PepperPlatformVerificationMessageFilter int32_t OnChallengePlatform(ppapi::host::HostMessageContext* context, const std::string& service_id, const std::vector& challenge); - +#if defined(OS_CHROMEOS) // PlatformVerificationFlow callbacks. void ChallengePlatformCallback( ppapi::host::ReplyMessageContext reply_context, @@ -52,13 +55,16 @@ class PepperPlatformVerificationMessageFilter const std::string& signed_data, const std::string& signature, const std::string& platform_key_certificate); +#endif // Used to lookup the WebContents associated with this PP_Instance. int render_process_id_; int render_frame_id_; +#if defined(OS_CHROMEOS) // Must only be accessed on the UI thread. scoped_refptr pv_; +#endif DISALLOW_COPY_AND_ASSIGN(PepperPlatformVerificationMessageFilter); }; diff --git a/chromium/chrome/browser/resources/BUILD.gn b/chromium/chrome/browser/resources/BUILD.gn index 2d727e7b74e..49a50a3b067 100644 --- a/chromium/chrome/browser/resources/BUILD.gn +++ b/chromium/chrome/browser/resources/BUILD.gn @@ -40,6 +40,7 @@ grit("password_manager_internals_resources") { grit("policy_resources") { source = "md_policy/policy_resources.grd" + defines = chrome_grit_defines # TODO(thestig): use_qualified_include = true outputs = [ @@ -88,6 +89,10 @@ if (!is_ios) { # TODO(thestig): use_qualified_include = true defines = chrome_grit_defines + if (enable_hangout_services_extension) { + defines += [ "enable_hangout_services_extension" ] + } + outputs = [ "grit/component_extension_resources.h", "grit/component_extension_resources_map.cc", diff --git a/chromium/chrome/browser/resources/bluetooth_internals/adapter_broker.js b/chromium/chrome/browser/resources/bluetooth_internals/adapter_broker.js new file mode 100644 index 00000000000..ae9bfaae28d --- /dev/null +++ b/chromium/chrome/browser/resources/bluetooth_internals/adapter_broker.js @@ -0,0 +1,147 @@ +// 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. + +/** + * Javascript for AdapterBroker, served from + * chrome://bluetooth-internals/. + */ +cr.define('adapter_broker', function() { + /** + * The proxy class of an adapter and router of adapter events. + * Exposes an EventTarget interface that allows other object to subscribe to + * to specific AdapterClient events. + * Provides proxy access to Adapter functions. Converts parameters to Mojo + * handles and back when necessary. + * @constructor + * @extends {cr.EventTarget} + * @param {!interfaces.BluetoothAdapter.Adapter.proxyClass} adapter + */ + var AdapterBroker = function(adapter) { + this.adapter_ = adapter; + this.adapterClient_ = new AdapterClient(this); + this.setClient(this.adapterClient_); + }; + + AdapterBroker.prototype = { + __proto__: cr.EventTarget.prototype, + + /** + * Sets client of Adapter service. + * @param {!interfaces.BluetoothAdapter.AdapterClient} adapterClient + */ + setClient: function(adapterClient) { + this.adapter_.setClient(interfaces.Connection.bindStubDerivedImpl( + adapterClient)); + }, + + /** + * Gets an array of currently detectable devices from the Adapter service. + * @return {!Array} + */ + getDevices: function() { + return this.adapter_.getDevices(); + }, + + /** + * Gets the current state of the Adapter. + * @return {!interfaces.BluetoothAdapter.AdapterInfo} + */ + getInfo: function() { + return this.adapter_.getInfo(); + } + }; + + /** + * The implementation of AdapterClient in + * device/bluetooth/public/interfaces/adapter.mojom. Dispatches events + * through AdapterBroker to notify client objects of changes to the Adapter + * service. + * @constructor + * @param {!AdapterBroker} adapterBroker Broker to dispatch events through. + */ + var AdapterClient = function(adapterBroker) { + this.adapterBroker_ = adapterBroker; + }; + + AdapterClient.prototype = { + /** + * Fires deviceadded event. + * @param {!interfaces.BluetoothDevice.DeviceInfo} deviceInfo + */ + deviceAdded: function(deviceInfo) { + var event = new CustomEvent('deviceadded', { + detail: { + deviceInfo: deviceInfo + } + }); + this.adapterBroker_.dispatchEvent(event); + }, + + /** + * Fires deviceremoved event. + * @param {!interfaces.BluetoothDevice.DeviceInfo} deviceInfo + */ + deviceRemoved: function(deviceInfo) { + var event = new CustomEvent('deviceremoved', { + detail: { + deviceInfo: deviceInfo + } + }); + this.adapterBroker_.dispatchEvent(event); + }, + + /** + * Fires devicechanged event. + * @param {!interfaces.BluetoothDevice.DeviceInfo} deviceInfo + */ + deviceChanged: function(deviceInfo) { + var event = new CustomEvent('devicechanged', { + detail: { + deviceInfo: deviceInfo + } + }); + this.adapterBroker_.dispatchEvent(event); + } + }; + + var adapterBroker = null; + + /** + * Initializes an AdapterBroker if one doesn't exist. + * @return {!Promise} resolves with AdapterBroker, + * rejects if Bluetooth is not supported. + */ + function getAdapterBroker() { + if (adapterBroker) return Promise.resolve(adapterBroker); + + return interfaces.setupInterfaces().then(function(adapter) { + // Hook up the instance properties. + AdapterClient.prototype.__proto__ = + interfaces.BluetoothAdapter.AdapterClient.stubClass.prototype; + + var adapterFactory = interfaces.Connection.bindHandleToProxy( + interfaces.FrameInterfaces.getInterface( + interfaces.BluetoothAdapter.AdapterFactory.name), + interfaces.BluetoothAdapter.AdapterFactory); + + // Get an Adapter service. + return adapterFactory.getAdapter(); + }).then(function(response) { + if (!response.adapter) { + throw new Error('Bluetooth Not Supported on this platform.'); + } + + var adapter = interfaces.Connection.bindHandleToProxy( + response.adapter, + interfaces.BluetoothAdapter.Adapter); + + adapterBroker = new AdapterBroker(adapter); + return adapterBroker; + }); + } + + return { + getAdapterBroker: getAdapterBroker, + }; +}); diff --git a/chromium/chrome/browser/resources/bluetooth_internals/bluetooth_internals.css b/chromium/chrome/browser/resources/bluetooth_internals/bluetooth_internals.css index 1cd2375dae5..0f4812e4303 100644 --- a/chromium/chrome/browser/resources/bluetooth_internals/bluetooth_internals.css +++ b/chromium/chrome/browser/resources/bluetooth_internals/bluetooth_internals.css @@ -13,11 +13,83 @@ body { padding: 0; } + +/* Header bar */ + header { - background-color: blue; - padding: 2px; + align-items: center; + background-color: rgb(33, 150, 243); + display: flex; + flex-direction: row; + font-size: 20pt; + height: 56px; + justify-content: flex-start; + padding: 0 16px; } -header * { +.title { color: white; + display: inline-block; + margin-left: 8px; +} + + +/* Device table */ + +table { + border: 1px solid #ccc; + border-collapse: collapse; + margin: 0; + padding: 0; + width: 100%; +} + +table tr { + border: 1px solid #ddd; + padding: 5px; +} + +table th, +table td { + padding: 10px; + text-align: center; +} + +table th { + font-size: 14px; + letter-spacing: 1px; + text-transform: uppercase; +} + +@media screen and (max-width: 600px) { + table { + border: 0; + } + table thead { + display: none; + } + table tr { + border-bottom: 2px solid #ddd; + display: block; + } + table td { + border-bottom: 1px dotted #ccc; + display: block; + font-size: 13px; + text-align: right; + } + table td:last-child { + border-bottom: 0; + } + table td::before { + content: attr(data-label); + float: left; + font-weight: bold; + text-transform: uppercase; + } +} + +/* Device Row */ +table .removed { + background-color: #BDBDBD; } \ No newline at end of file diff --git a/chromium/chrome/browser/resources/bluetooth_internals/bluetooth_internals.html b/chromium/chrome/browser/resources/bluetooth_internals/bluetooth_internals.html index 785afb347cd..8502623ec3e 100644 --- a/chromium/chrome/browser/resources/bluetooth_internals/bluetooth_internals.html +++ b/chromium/chrome/browser/resources/bluetooth_internals/bluetooth_internals.html @@ -1,17 +1,45 @@ + + Bluetooth Internals + + + + + + + + + +
-

Bluetooth Internals

+
+ Bluetooth Internals +
+ + \ No newline at end of file diff --git a/chromium/chrome/browser/resources/bluetooth_internals/bluetooth_internals.js b/chromium/chrome/browser/resources/bluetooth_internals/bluetooth_internals.js index 0e48aa25c64..4057293273b 100644 --- a/chromium/chrome/browser/resources/bluetooth_internals/bluetooth_internals.js +++ b/chromium/chrome/browser/resources/bluetooth_internals/bluetooth_internals.js @@ -7,90 +7,42 @@ * chrome://bluetooth-internals/. */ -/** - * The implementation of AdapterClient in - * device/bluetooth/public/interfaces/adapter.mojom. - */ -var AdapterClient = function() {}; -AdapterClient.prototype = { - /** - * Prints added device to console. - * @param {!Object} device the device that was added - */ - deviceAdded: function(device) { - console.log('Device added'); - console.log(device); - }, - - /** - * Prints removed device to console. - * @param {!Object} device the device that was removed - */ - deviceRemoved: function(device) { - console.log('Device removed'); - console.log(device); - } -}; - -(function() { - var adapter, adapterClient; - - /** - * TODO: Move to shared location. See crbug.com/652361. - * Helper to convert callback-based define() API to a promise-based API. - * @param {!Array} moduleNames - * @return {!Promise} - */ - function importModules(moduleNames) { - return new Promise(function(resolve, reject) { - define(moduleNames, function(var_args) { - resolve(Array.prototype.slice.call(arguments, 0)); - }); - }); +cr.define('bluetooth_internals', function() { + function initializeViews() { + var adapterBroker = null; + adapter_broker.getAdapterBroker() + .then(function(broker) { adapterBroker = broker; }) + .then(function() { return adapterBroker.getInfo(); }) + .then(function(response) { console.log('adapter', response.info); }) + .then(function() { return adapterBroker.getDevices(); }) + .then(function(response) { + // Hook up device collection events. + var devices = new device_collection.DeviceCollection([]); + adapterBroker.addEventListener('deviceadded', function(event) { + devices.addOrUpdate(event.detail.deviceInfo); + }); + adapterBroker.addEventListener('devicechanged', function(event) { + devices.addOrUpdate(event.detail.deviceInfo); + }); + adapterBroker.addEventListener('deviceremoved', function(event) { + devices.remove(event.detail.deviceInfo); + }); + + response.devices.forEach(devices.addOrUpdate, + devices /* this */); + + var deviceTable = new device_table.DeviceTable(); + deviceTable.setDevices(devices); + document.body.appendChild(deviceTable); + }) + .catch(function(error) { console.error(error); }); } - /** - * Initializes Mojo proxies for page and Bluetooth services. - * @return {!Promise} resolves if adapter is acquired, rejects if Bluetooth - * is not supported. - */ - function initializeProxies() { - return importModules([ - 'content/public/renderer/frame_interfaces', - 'device/bluetooth/public/interfaces/adapter.mojom', - 'mojo/public/js/connection', - ]).then(function([frameInterfaces, bluetoothAdapter, connection]) { - console.log('Loaded modules'); + return { + initializeViews: initializeViews + }; - // Hook up the instance properties. - AdapterClient.prototype.__proto__ = - bluetoothAdapter.AdapterClient.stubClass.prototype; +}); - var adapterFactory = connection.bindHandleToProxy( - frameInterfaces.getInterface(bluetoothAdapter.AdapterFactory.name), - bluetoothAdapter.AdapterFactory); - - // Get an Adapter service. - return adapterFactory.getAdapter().then(function(response) { - if (!response.adapter) { - throw new Error('Bluetooth Not Supported on this platform.'); - } - - adapter = connection.bindHandleToProxy(response.adapter, - bluetoothAdapter.Adapter); - - // Create a message pipe and bind one end to client - // implementation and the other to the Adapter service. - adapterClient = new AdapterClient(); - adapter.setClient(connection.bindStubDerivedImpl(adapterClient)); - }); - }); - } - - document.addEventListener('DOMContentLoaded', function() { - initializeProxies() - .then(function() { return adapter.getDevices(); }) - .then(function(response) { console.log(response.devices); }) - .catch(function(error) { console.error(error); }); - }); -})(); +document.addEventListener( + 'DOMContentLoaded', bluetooth_internals.initializeViews); diff --git a/chromium/chrome/browser/resources/bluetooth_internals/device_collection.js b/chromium/chrome/browser/resources/bluetooth_internals/device_collection.js new file mode 100644 index 00000000000..4d86d99c79d --- /dev/null +++ b/chromium/chrome/browser/resources/bluetooth_internals/device_collection.js @@ -0,0 +1,85 @@ +// 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. + +/** + * Javascript for DeviceCollection, served from + * chrome://bluetooth-internals/. + */ + +cr.define('device_collection', function() { + /* + * Collection of devices. Extends ArrayDataModel which provides a set of + * functions and events that notifies observers when the collection changes. + * @constructor + * @param {!Array} array The starting collection of + * devices. + * @extends {cr.ui.ArrayDataModel} + */ + var DeviceCollection = function(array) { + cr.ui.ArrayDataModel.call(this, array); + }; + DeviceCollection.prototype = { + __proto__: cr.ui.ArrayDataModel.prototype, + + /** + * Finds the Device in the collection with the matching address. + * @param {string} address + */ + getByAddress: function(address) { + for (var i = 0; i < this.length; i++) { + var device = this.item(i); + if (address == device.info.address) + return device; + } + return null; + }, + + /** + * Adds or updates a Device with new DeviceInfo. + * @param {!interfaces.BluetoothDevice.DeviceInfo} deviceInfo + */ + addOrUpdate: function(deviceInfo) { + var oldDevice = this.getByAddress(deviceInfo.address); + if (oldDevice) { + // Update rssi if it's valid + var rssi = (deviceInfo.rssi && deviceInfo.rssi.value) || + (oldDevice.info.rssi && oldDevice.info.rssi.value); + + oldDevice.info = deviceInfo; + oldDevice.info.rssi = { value: rssi }; + oldDevice.removed = false; + + this.updateIndex(this.indexOf(oldDevice)); + } else { + this.push(new Device(deviceInfo)); + } + }, + + /** + * Marks the Device as removed. + * @param {!interfaces.bluetoothDevice.DeviceInfo} deviceInfo + */ + remove: function(deviceInfo) { + var device = this.getByAddress(deviceInfo.address); + assert(device, 'Device does not exist.'); + device.removed = true; + this.updateIndex(this.indexOf(device)); + } + }; + + /* + * Data model for a cached device. + * @constructor + * @param {!interfaces.BluetoothDevice.DeviceInfo} info + */ + var Device = function(info) { + this.info = info; + this.removed = false; + }; + + return { + Device: Device, + DeviceCollection: DeviceCollection, + }; +}); diff --git a/chromium/chrome/browser/resources/bluetooth_internals/device_table.js b/chromium/chrome/browser/resources/bluetooth_internals/device_table.js new file mode 100644 index 00000000000..443c590ff8f --- /dev/null +++ b/chromium/chrome/browser/resources/bluetooth_internals/device_table.js @@ -0,0 +1,143 @@ +// 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. + +/** + * Javascript for DeviceTable UI, served from chrome://bluetooth-internals/. + */ + +cr.define('device_table', function() { + /** + * A table that lists the devices and responds to changes in the given + * DeviceCollection. + * @constructor + * @extends {HTMLTableElement} + */ + var DeviceTable = cr.ui.define(function() { + /** @private {?Array} */ + this.devices_ = null; + + return document.importNode($('table-template').content.children[0], + true /* deep */); + }); + + DeviceTable.prototype = { + __proto__: HTMLTableElement.prototype, + + /** + * Decorates an element as a UI element class. Caches references to the + * table body and headers. + */ + decorate: function() { + /** @private */ + this.body_ = this.tBodies[0]; + /** @private */ + this.headers_ = this.tHead.rows[0].cells; + }, + + /** + * Sets the tables device collection. + * @param {!device_collection.DeviceCollection} deviceCollection + */ + setDevices: function(deviceCollection) { + assert(!this.devices_, 'Devices can only be set once.'); + + this.devices_ = deviceCollection; + this.devices_.addEventListener('sorted', this.redraw_.bind(this)); + this.devices_.addEventListener('change', this.handleChange_.bind(this)); + this.devices_.addEventListener('splice', this.handleSplice_.bind(this)); + + this.redraw_(); + }, + + /** + * Updates table row on change event of the device collection. + * @private + * @param {!CustomEvent} event + */ + handleChange_: function(event) { + this.updateRow_(this.devices_.item(event.index), event.index); + }, + + /** + * Updates table row on splice event of the device collection. + * @private + * @param {!CustomEvent} event + */ + handleSplice_: function(event) { + event.removed.forEach(function() { + this.body_.deleteRow(event.index); + }, this); + + event.added.forEach(function(device, index) { + this.insertRow_(device, event.index + index); + }, this); + }, + + /** + * Inserts a new row at |index| and updates it with info from |device|. + * @private + * @param {!device_collection.Device} device + * @param {?number} index + */ + insertRow_: function(device, index) { + var row = this.body_.insertRow(index); + row.id = device.info.address; + + for (var i = 0; i < this.headers_.length; i++) { + row.insertCell(); + } + + this.updateRow_(device, row.sectionRowIndex); + }, + + /** + * Deletes and recreates the table using the cached |devices_|. + * @private + */ + redraw_: function() { + this.removeChild(this.body_); + this.appendChild(document.createElement('tbody')); + this.body_ = this.tBodies[0]; + this.body_.classList.add('table-body'); + + for (var i = 0; i < this.devices_.length; i++) { + this.insertRow_(this.devices_.item(i)); + } + }, + + /** + * Updates the row at |index| with the info from |device|. + * @private + * @param {!device_collection.Device} device + * @param {number} index + */ + updateRow_: function(device, index) { + assert(this.body_.rows[index], 'Row ' + index + ' is not in the table.'); + var row = this.body_.rows[index]; + + row.classList.toggle('removed', device.removed); + + // Update the properties based on the header field path. + for (var i = 0; i < this.headers_.length; i++) { + var header = this.headers_[i]; + var propName = header.dataset.field; + + var parts = propName.split('.'); + var obj = device.info; + while (obj != null && parts.length > 0) { + var part = parts.shift(); + obj = obj[part]; + } + + var cell = row.cells[i]; + cell.textContent = obj || 'Unknown'; + cell.dataset.label = header.textContent; + } + }, + }; + + return { + DeviceTable: DeviceTable, + }; +}); diff --git a/chromium/chrome/browser/resources/bluetooth_internals/interfaces.js b/chromium/chrome/browser/resources/bluetooth_internals/interfaces.js new file mode 100644 index 00000000000..a48eb81f631 --- /dev/null +++ b/chromium/chrome/browser/resources/bluetooth_internals/interfaces.js @@ -0,0 +1,33 @@ +// 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. + +/** + * Javascript for Mojo interface helpers, served from + * chrome://bluetooth-internals/. + */ + +cr.define('interfaces', function() { + /** + * Sets up Mojo interfaces and adds them to window.interfaces. + * @return {Promise} + */ + function setupInterfaces() { + return importModules([ + 'content/public/renderer/frame_interfaces', + 'device/bluetooth/public/interfaces/adapter.mojom', + 'device/bluetooth/public/interfaces/device.mojom', + 'mojo/public/js/connection', + ]).then(function([frameInterfaces, bluetoothAdapter, bluetoothDevice, + connection]) { + interfaces.BluetoothAdapter = bluetoothAdapter; + interfaces.BluetoothDevice = bluetoothDevice; + interfaces.Connection = connection; + interfaces.FrameInterfaces = frameInterfaces; + }); + } + + return { + setupInterfaces: setupInterfaces, + }; +}); diff --git a/chromium/chrome/browser/resources/bookmark_manager/js/bmm/bookmark_list.js b/chromium/chrome/browser/resources/bookmark_manager/js/bmm/bookmark_list.js index 4914b68e8c2..089b77a7044 100644 --- a/chromium/chrome/browser/resources/bookmark_manager/js/bmm/bookmark_list.js +++ b/chromium/chrome/browser/resources/bookmark_manager/js/bmm/bookmark_list.js @@ -149,6 +149,15 @@ cr.define('bmm', function() { this.fixWidth_(); cr.dispatchSimpleEvent(this, 'load'); + + // Use the same histogram configuration as UMA_HISTOGRAM_COUNTS_1000(). + chrome.metricsPrivate.recordValue({ + 'metricName': 'Bookmarks.BookmarksInFolder', + 'type': chrome.metricsPrivate.MetricTypeType.HISTOGRAM_LOG, + 'min': 1, + 'max': 1000, + 'buckets': 50 + }, this.dataModel.length); }, /** diff --git a/chromium/chrome/browser/resources/chromeos/chromevox/BUILD.gn b/chromium/chrome/browser/resources/chromeos/chromevox/BUILD.gn index fc37ab8dee1..f2efd1da529 100644 --- a/chromium/chrome/browser/resources/chromeos/chromevox/BUILD.gn +++ b/chromium/chrome/browser/resources/chromeos/chromevox/BUILD.gn @@ -3,6 +3,7 @@ # found in the LICENSE file. import("//build/config/features.gni") +import("//chrome/common/features.gni") import("//testing/test.gni") import("//chrome/test/base/js2gtest.gni") import("run_jsbundler.gni") @@ -124,6 +125,7 @@ chromevox_modules = [ "cvox2/background/automation_util.js", "cvox2/background/background.js", "cvox2/background/base_automation_handler.js", + "cvox2/background/braille_command_handler.js", "cvox2/background/chromevox_state.js", "cvox2/background/command_handler.js", "cvox2/background/constants.js", @@ -542,8 +544,7 @@ test("chromevox_tests") { "//chrome/test:test_support", "//chrome/test:test_support_ui", "//content/test:test_support", - "//services/shell/background:lib", - "//services/shell/background/tests:test_support", + "//services/service_manager/background:lib", "//testing/gmock", "//testing/gtest", "//ui/keyboard:resources", diff --git a/chromium/chrome/browser/resources/chromeos/chromevox/chromevox/background/keymaps/next_keymap.json b/chromium/chrome/browser/resources/chromeos/chromevox/chromevox/background/keymaps/next_keymap.json index 08dfdb499a2..15a60483b55 100644 --- a/chromium/chrome/browser/resources/chromeos/chromevox/chromevox/background/keymaps/next_keymap.json +++ b/chromium/chrome/browser/resources/chromeos/chromevox/chromevox/background/keymaps/next_keymap.json @@ -173,6 +173,25 @@ } } }, + { + "command": "previousGraphic", + "sequence": { + "cvoxModifier": true, + "keys": { + "keyCode": [71], + "shiftKey": [true] + } + } + }, + { + "command": "nextGraphic", + "sequence": { + "cvoxModifier": true, + "keys": { + "keyCode": [71] + } + } + }, { "command": "nextHeading", "sequence": { @@ -439,15 +458,6 @@ } } }, - { - "command": "toggleChromeVox", - "sequence": { - "cvoxModifier": true, - "keys": { - "keyCode": [65, 65] - } - } - }, { "command": "toggleStickyMode", "sequence": { @@ -585,6 +595,15 @@ } } }, + { + "command": "help", + "sequence": { + "cvoxModifier": true, + "keys": { + "keyCode": [79, 84] + } + } + }, { "command": "showNextUpdatePage", "sequence": { diff --git a/chromium/chrome/browser/resources/chromeos/chromevox/run_jsbundler.gni b/chromium/chrome/browser/resources/chromeos/chromevox/run_jsbundler.gni index 1dc28258e33..e13d343881f 100644 --- a/chromium/chrome/browser/resources/chromeos/chromevox/run_jsbundler.gni +++ b/chromium/chrome/browser/resources/chromeos/chromevox/run_jsbundler.gni @@ -15,7 +15,7 @@ jsbundler_modules = rebase_path([ ".", "$closure_library_dir/../bin/build") jsbundler_modules += - [ "//third_party/WebKit/Source/devtools/scripts/rjsmin.py" ] + [ "//third_party/WebKit/Source/devtools/scripts/build/rjsmin.py" ] template("run_jsbundler") { assert(defined(invoker.mode)) diff --git a/chromium/chrome/browser/resources/chromeos/chromevox/strings/BUILD.gn b/chromium/chrome/browser/resources/chromeos/chromevox/strings/BUILD.gn index 1fe755c2c28..5ff0a39e72a 100644 --- a/chromium/chrome/browser/resources/chromeos/chromevox/strings/BUILD.gn +++ b/chromium/chrome/browser/resources/chromeos/chromevox/strings/BUILD.gn @@ -2,12 +2,14 @@ # 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("//tools/grit/grit_rule.gni") chromevox_out_dir = "$root_out_dir/resources/chromeos/chromevox" grit("chromevox_strings") { source = "chromevox_strings.grd" + defines = chrome_grit_defines use_qualified_include = true outputs = [ "_locales/am/messages.json", diff --git a/chromium/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd b/chromium/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd index 646f7d40f99..42f2f286f23 100644 --- a/chromium/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd +++ b/chromium/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd @@ -193,13 +193,13 @@ Open ChromeVox tutorial - Toggle search widget + ChromeVox find in page Open options page - - Open keyboard explorer + + Open learn mode Decrease rate of speech @@ -438,6 +438,27 @@ ChromeVox Options + + Virtual Braille Display + + + Rows: + + + Columns: + + + Current display style is interleave. + + + Current display style is side by side. + + + Change display style to interleave. + + + Change display style to side by side. + Use the options below to customize ChromeVox. Changes take effect immediately. @@ -507,11 +528,11 @@ ChromeVox modifier key - - ChromeOS Keyboard Explorer + + ChromeVox Learn Mode - - Press any key to learn its name. Ctrl+W will close the keyboard explorer. + + Press any key to learn its name. Ctrl+W will close learn mode. tab created @@ -543,6 +564,12 @@ not checked + + $1, switch on + + + $1, switch off + $1, radio button selected @@ -2272,7 +2299,7 @@ {COUNT, plural, =1 {bullet}other {# bullets}} - Click the item under a routing key + Click the item under routing key $1 Pan backward @@ -2292,6 +2319,15 @@ Move braille display to bottom of page + + dot $1 + + + dots $1 + + + $1 chord + has access key, $1 @@ -2442,6 +2478,9 @@ No items. + + Report an issue + ChromeVox Updated @@ -2515,11 +2554,17 @@ Use jump commands to skip to specific types of elements. To jump forward between headings, press Search + H, or to jump backward, press Search + Shift + H. + + This is the second heading. Keep going; either press Search+H or Search+Shift+H + + + This is the last heading. Press Search+H to wrap to the first heading, or Search+Shift+H to go to the second heading on this page. + Command Menus - To explore all ChromeVox commands and shortcuts, press Search + Period, then use the Arrow keys to navigate the menus, and Enter to activate a command. + To explore all ChromeVox commands and shortcuts, press Search + Period, then use the Arrow keys to navigate the menus, and Enter to activate a command. Return here by pressing Search+o then t. Helpful Chrome Shortcuts @@ -2543,6 +2588,24 @@ To open the Chrome browser menu, press Alt+F. Congratulations! You’ve learned the essentials to use ChromeVox Next (beta) successfully. Remember that you can open the ChromeVox command menu at any time by pressing Search+Period. To learn even more about ChromeVox and Chrome OS, visit the following articles. If you're done with the tutorial, use ChromeVox to navigate to the Close button and click it. + + You've been updated to a major new release of ChromeVox! + + + We've been hard at work on a new and improved ChromeVox experience; here's what's new + + + New key bindings. We've made Search the ChromeVox modifier and dramatically simplified the key combinations. + + + New earcons. We've refreshed the set of audio icons you hear to make browsing more responsive. + + + Under the hood upgrades. We've revamped how ChromeVox works from the bottom up. Expect better performance, stability, and web support/compliance. + + + We're excited to hear from you on this new experience. Send us feedback directly by pressing Search+a, then i. Press the next button to continue onto the tutorial to learn everything you need to get started. + ChromeVox Next Command Reference @@ -2552,6 +2615,63 @@ If you're done with the tutorial, use ChromeVox to navigate to the Close button Use Chromebook touch screen accessibility features + + busy + + + busy + + + default + + + default + + + Sounds + + + ChromeVox uses sounds to give you essential and additional information. You can use these sounds to navigate more quickly by learning what each sound means. Once you get more comfortable, you can turn off verbose descriptions in speech and rely on them for essential information about the page. Here's a complete list of sounds and what they mean. + + + A modal alert + + + A non modal alert + + + A button + + + An unchecked checkbox + + + A checked checkbox + + + An editable text field + + + An invalid key press + + + A link + + + A listbox or combo box + + + A page load in progress + + + A pop up button + + + A slider + + + Wrap from beginning to end or end to beginning inside of a page, dialog, or other container + diff --git a/chromium/chrome/browser/resources/chromeos/login/compiled_resources2.gyp b/chromium/chrome/browser/resources/chromeos/login/compiled_resources2.gyp new file mode 100644 index 00000000000..506018a2cb8 --- /dev/null +++ b/chromium/chrome/browser/resources/chromeos/login/compiled_resources2.gyp @@ -0,0 +1,14 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'offline_ad_login', + 'dependencies': [ + '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:load_time_data', + ], + 'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'], + }, + ], +} diff --git a/chromium/chrome/browser/resources/component_extension_resources.grd b/chromium/chrome/browser/resources/component_extension_resources.grd index 7cc87b7edf7..2cec82f0a5e 100644 --- a/chromium/chrome/browser/resources/component_extension_resources.grd +++ b/chromium/chrome/browser/resources/component_extension_resources.grd @@ -39,6 +39,8 @@ + + @@ -168,6 +170,7 @@ + @@ -183,7 +186,7 @@ - + diff --git a/chromium/chrome/browser/resources/cryptotoken/appid.js b/chromium/chrome/browser/resources/cryptotoken/appid.js index dddf08377f0..5e2cb7d0fb3 100644 --- a/chromium/chrome/browser/resources/cryptotoken/appid.js +++ b/chromium/chrome/browser/resources/cryptotoken/appid.js @@ -16,25 +16,20 @@ function getOriginsFromJson(text) { try { var urls, i; var appIdData = JSON.parse(text); - if (Array.isArray(appIdData)) { - // Older format where it is a simple list of facets - urls = appIdData; - } else { - var trustedFacets = appIdData['trustedFacets']; - if (trustedFacets) { - var versionBlock; - for (i = 0; versionBlock = trustedFacets[i]; i++) { - if (versionBlock['version'] && - versionBlock['version']['major'] == 1 && - versionBlock['version']['minor'] == 0) { - urls = versionBlock['ids']; - break; - } + var trustedFacets = appIdData['trustedFacets']; + if (trustedFacets) { + var versionBlock; + for (i = 0; versionBlock = trustedFacets[i]; i++) { + if (versionBlock['version'] && + versionBlock['version']['major'] == 1 && + versionBlock['version']['minor'] == 0) { + urls = versionBlock['ids']; + break; } } - if (typeof urls == 'undefined') { - throw Error('Could not find trustedFacets for version 1.0'); - } + } + if (typeof urls == 'undefined') { + throw Error('Could not find trustedFacets for version 1.0'); } var origins = {}; var url; @@ -207,7 +202,7 @@ XhrAppIdChecker.prototype.fetchAllowedOriginsForAppId_ = function(appId) { return Promise.resolve([]); } - if (appId.startsWith('http://') && !this.allowHttp_) { + if (appId.indexOf('http://') == 0 && !this.allowHttp_) { console.log(UTIL_fmt('http app ids disallowed, ' + appId + ' requested')); return Promise.resolve([]); } diff --git a/chromium/chrome/browser/resources/cryptotoken/devicestatuscodes.js b/chromium/chrome/browser/resources/cryptotoken/devicestatuscodes.js index a7bb72c1756..165102abde9 100644 --- a/chromium/chrome/browser/resources/cryptotoken/devicestatuscodes.js +++ b/chromium/chrome/browser/resources/cryptotoken/devicestatuscodes.js @@ -1,4 +1,4 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. +// 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. diff --git a/chromium/chrome/browser/resources/cryptotoken/enroller.js b/chromium/chrome/browser/resources/cryptotoken/enroller.js index 623337373d1..42b7c205deb 100644 --- a/chromium/chrome/browser/resources/cryptotoken/enroller.js +++ b/chromium/chrome/browser/resources/cryptotoken/enroller.js @@ -49,7 +49,7 @@ function handleU2fEnrollRequest(messageSender, request, sendResponse) { sendErrorResponse({errorCode: ErrorCodes.BAD_REQUEST}); return null; } - if (sender.origin.startsWith('http://') && !HTTP_ORIGINS_ALLOWED) { + if (sender.origin.indexOf('http://') == 0 && !HTTP_ORIGINS_ALLOWED) { sendErrorResponse({errorCode: ErrorCodes.BAD_REQUEST}); return null; } @@ -261,7 +261,7 @@ function Enroller(timer, sender, errorCb, successCb, opt_logMsgUrl) { // what they get.) /** @private {boolean} */ this.allowHttp_ = - this.sender_.origin ? this.sender_.origin.startsWith('http://') : false; + this.sender_.origin ? this.sender_.origin.indexOf('http://') == 0 : false; /** @private {Closeable} */ this.handler_ = null; } @@ -310,6 +310,9 @@ Enroller.prototype.approveOrigin_ = function() { if (!result) { // Origin not approved: rather than give an explicit indication to // the web page, let a timeout occur. + // NOTE: if you are looking at this in a debugger, this line will + // always be false since the origin of the debugger is different + // than origin of requesting page if (self.timer_.expired()) { self.notifyTimeout_(); return; diff --git a/chromium/chrome/browser/resources/cryptotoken/gnubbies.js b/chromium/chrome/browser/resources/cryptotoken/gnubbies.js index 86eb6e6a716..8424b393a8a 100644 --- a/chromium/chrome/browser/resources/cryptotoken/gnubbies.js +++ b/chromium/chrome/browser/resources/cryptotoken/gnubbies.js @@ -7,9 +7,19 @@ */ 'use strict'; +/** + * @typedef {{ + * vendorId: (number|undefined), + * productId: (number|undefined), + * usagePage: (number|undefined) + * }} + */ +var GnubbyEnumerationFilter; + /** * @typedef {{ * namespace: string, + * enumeratedBy: (GnubbyEnumerationFilter|undefined), * device: number * }} */ diff --git a/chromium/chrome/browser/resources/cryptotoken/gnubby.js b/chromium/chrome/browser/resources/cryptotoken/gnubby.js index 197f9fb33d8..b0493cba0c4 100644 --- a/chromium/chrome/browser/resources/cryptotoken/gnubby.js +++ b/chromium/chrome/browser/resources/cryptotoken/gnubby.js @@ -111,6 +111,9 @@ Gnubby.prototype.open = function(which, opt_type, opt_cb, opt_caller) { return; } self.dev = device; + if (self.closeHook_) { + self.dev.setDestroyHook(self.closeHook_); + } cb(rc); }); } @@ -119,7 +122,12 @@ Gnubby.prototype.open = function(which, opt_type, opt_cb, opt_caller) { setCid(which); self.which = which; Gnubby.gnubbies_.addClient(which, self, function(rc, device) { - self.dev = device; + if (!rc) { + self.dev = device; + if (self.closeHook_) { + self.dev.setDestroyHook(self.closeHook_); + } + } cb(rc); }); } else { @@ -185,6 +193,15 @@ Gnubby.prototype.closeWhenIdle = function(cb) { if (cb) this.notifyOnClose.push(cb); }; +/** + * Sets a callback that will get called when this gnubby is closed. + * @param {function() : ?Promise} cb Called back when closed. Callback + * may yield a promise that resolves when the close hook completes. + */ +Gnubby.prototype.setCloseHook = function(cb) { + this.closeHook_ = cb; +}; + /** * Close and notify every caller that it is now closed. * @private @@ -235,6 +252,13 @@ Gnubby.prototype.receivedFrame = function(frame) { return true; }; +/** + * @return {number|undefined} The last read error seen by this device. + */ +Gnubby.prototype.getLastReadError = function() { + return this.lastReadError_; +}; + /** * @return {ArrayBuffer|Uint8Array} oldest received frame. Throw if none. * @private @@ -276,6 +300,7 @@ Gnubby.prototype.read_ = function(cmd, timeout, cb) { window.clearTimeout(tid); tid = null; } + self.lastReadError_ = /** @private {number|undefined} */ (a); var c = callback; if (c) { callback = null; diff --git a/chromium/chrome/browser/resources/cryptotoken/gnubbydevice.js b/chromium/chrome/browser/resources/cryptotoken/gnubbydevice.js index 3030a375ab2..fffa19ceb99 100644 --- a/chromium/chrome/browser/resources/cryptotoken/gnubbydevice.js +++ b/chromium/chrome/browser/resources/cryptotoken/gnubbydevice.js @@ -30,6 +30,8 @@ GnubbyDevice.CMD_INIT = 0x86; GnubbyDevice.CMD_PROMPT = 0x87; /** Send device identification wink */ GnubbyDevice.CMD_WINK = 0x88; +/** BLE UID read/set */ +GnubbyDevice.CMD_BLE_UID = 0xb5; /** USB test */ GnubbyDevice.CMD_USB_TEST = 0xb9; /** Device Firmware Upgrade */ @@ -84,6 +86,13 @@ GnubbyDevice.NOPERMISSION = 666; /** Destroys this low-level device instance. */ GnubbyDevice.prototype.destroy = function() {}; +/** + * Sets a callback that will get called when this device instance is destroyed. + * @param {function() : ?Promise} cb Called back when closed. Callback may + * yield a promise that resolves when the close hook completes. + */ +GnubbyDevice.prototype.setDestroyHook = function(cb) {}; + /** * Register a client for this gnubby. * @param {*} who The client. diff --git a/chromium/chrome/browser/resources/cryptotoken/hidgnubbydevice.js b/chromium/chrome/browser/resources/cryptotoken/hidgnubbydevice.js index 80c40c00b16..ecd83df1637 100644 --- a/chromium/chrome/browser/resources/cryptotoken/hidgnubbydevice.js +++ b/chromium/chrome/browser/resources/cryptotoken/hidgnubbydevice.js @@ -40,6 +40,18 @@ HidGnubbyDevice.NAMESPACE = 'hid'; HidGnubbyDevice.prototype.destroy = function() { if (!this.dev) return; // Already dead. + function closeLowLevelDevice(dev) { + chrome.hid.disconnect(dev.connectionId, function() { + if (chrome.runtime.lastError) { + console.warn(UTIL_fmt('Device ' + dev.connectionId + + ' couldn\'t be disconnected:')); + console.warn(UTIL_fmt(chrome.runtime.lastError.message)); + return; + } + console.log(UTIL_fmt('Device ' + dev.connectionId + ' closed')); + }); + } + this.gnubbies_.removeOpenDevice( {namespace: HidGnubbyDevice.NAMESPACE, device: this.id}); this.closing = true; @@ -69,16 +81,29 @@ HidGnubbyDevice.prototype.destroy = function() { var dev = this.dev; this.dev = null; + var reallyCloseDevice = closeLowLevelDevice.bind(null, dev); - chrome.hid.disconnect(dev.connectionId, function() { - if (chrome.runtime.lastError) { - console.warn(UTIL_fmt('Device ' + dev.connectionId + - ' couldn\'t be disconnected:')); - console.warn(UTIL_fmt(chrome.runtime.lastError.message)); + if (this.destroyHook_) { + var p = this.destroyHook_(); + if (!p) { + reallyCloseDevice(); return; } - console.log(UTIL_fmt('Device ' + dev.connectionId + ' closed')); - }); + // When this method returns, a device reference may still be held, until the + // promise completes. + p.then(reallyCloseDevice); + } else { + reallyCloseDevice(); + } +}; + +/** + * Sets a callback that will get called when this device instance is destroyed. + * @param {function() : ?Promise} cb Called back when closed. Callback may + * yield a promise that resolves when the close hook completes. + */ +HidGnubbyDevice.prototype.setDestroyHook = function(cb) { + this.destroyHook_ = cb; }; /** @@ -411,7 +436,7 @@ HidGnubbyDevice.prototype.writePump_ = function() { * @const */ HidGnubbyDevice.HID_VID_PIDS = [ - {'vendorId': 4176, 'productId': 512} // Google-specific Yubico HID + {'vendorId': 4176, 'productId': 512} // Google-specific Yubico HID ]; /** @@ -427,20 +452,20 @@ HidGnubbyDevice.enumerate = function(cb, opt_type) { var numEnumerated = 0; var allDevs = []; - function enumerated(f1d0Enumerated, devs) { + function enumerated(filter, devs) { // Don't double-add a device; it'll just confuse things. // We assume the various calls to getDevices() return from the same // deviceId pool. for (var i = 0; i < devs.length; i++) { var dev = devs[i]; - dev.f1d0Only = f1d0Enumerated; + dev.enumeratedBy = filter; // Unfortunately indexOf is not usable, since the two calls produce // different objects. Compare their deviceIds instead. var found = false; for (var j = 0; j < allDevs.length; j++) { if (allDevs[j].deviceId == dev.deviceId) { found = true; - allDevs[j].f1d0Only &= f1d0Enumerated; + allDevs[j].enumeratedBy = filter; break; } } @@ -456,11 +481,12 @@ HidGnubbyDevice.enumerate = function(cb, opt_type) { // Pass 1: usagePage-based enumeration, for FIDO U2F devices. If non-FIDO // devices are asked for, "implement" this pass by providing it the empty // list. (enumerated requires that it's called once per pass.) + var f1d0Filter = {usagePage: 0xf1d0}; if (opt_type == GnubbyEnumerationTypes.VID_PID) { - enumerated(true, []); + enumerated(f1d0Filter, []); } else { - chrome.hid.getDevices({filters: [{usagePage: 0xf1d0}]}, - enumerated.bind(null, true)); + chrome.hid.getDevices({filters: [f1d0Filter]}, + enumerated.bind(null, f1d0Filter)); } // Pass 2: vid/pid-based enumeration, for legacy devices. If FIDO devices // are asked for, "implement" this pass by providing it the empty list. @@ -468,8 +494,8 @@ HidGnubbyDevice.enumerate = function(cb, opt_type) { enumerated(false, []); } else { for (var i = 0; i < HidGnubbyDevice.HID_VID_PIDS.length; i++) { - var dev = HidGnubbyDevice.HID_VID_PIDS[i]; - chrome.hid.getDevices({filters: [dev]}, enumerated.bind(null, false)); + var vidPid = HidGnubbyDevice.HID_VID_PIDS[i]; + chrome.hid.getDevices({filters: [vidPid]}, enumerated.bind(null, vidPid)); } } }; @@ -507,6 +533,7 @@ HidGnubbyDevice.deviceToDeviceId = function(dev) { var hidDev = /** @type {!chrome.hid.HidDeviceInfo} */ (dev); var deviceId = { namespace: HidGnubbyDevice.NAMESPACE, + enumeratedBy: hidDev.enumeratedBy, device: hidDev.deviceId }; return deviceId; diff --git a/chromium/chrome/browser/resources/cryptotoken/manifest.json b/chromium/chrome/browser/resources/cryptotoken/manifest.json index 6e4c46df243..b0dbce64b39 100644 --- a/chromium/chrome/browser/resources/cryptotoken/manifest.json +++ b/chromium/chrome/browser/resources/cryptotoken/manifest.json @@ -1,7 +1,7 @@ { "name": "CryptoTokenExtension", "description": "CryptoToken Component Extension", - "version": "0.9.38", + "version": "0.9.46", "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq7zRobvA+AVlvNqkHSSVhh1sEWsHSqz4oR/XptkDe/Cz3+gW9ZGumZ20NCHjaac8j1iiesdigp8B1LJsd/2WWv2Dbnto4f8GrQ5MVphKyQ9WJHwejEHN2K4vzrTcwaXqv5BSTXwxlxS/mXCmXskTfryKTLuYrcHEWK8fCHb+0gvr8b/kvsi75A1aMmb6nUnFJvETmCkOCPNX5CHTdy634Ts/x0fLhRuPlahk63rdf7agxQv5viVjQFk+tbgv6aa9kdSd11Js/RZ9yZjrFgHOBWgP4jTBqud4+HUglrzu8qynFipyNRLCZsaxhm+NItTyNgesxLdxZcwOz56KD1Q4IQIDAQAB", "manifest_version": 2, "permissions": [ diff --git a/chromium/chrome/browser/resources/cryptotoken/signer.js b/chromium/chrome/browser/resources/cryptotoken/signer.js index 3605454208f..6a0fe53c09b 100644 --- a/chromium/chrome/browser/resources/cryptotoken/signer.js +++ b/chromium/chrome/browser/resources/cryptotoken/signer.js @@ -47,7 +47,7 @@ function handleU2fSignRequest(messageSender, request, sendResponse) { sendErrorResponse({errorCode: ErrorCodes.BAD_REQUEST}); return null; } - if (sender.origin.startsWith('http://') && !HTTP_ORIGINS_ALLOWED) { + if (sender.origin.indexOf('http://') == 0 && !HTTP_ORIGINS_ALLOWED) { sendErrorResponse({errorCode: ErrorCodes.BAD_REQUEST}); return null; } @@ -319,7 +319,7 @@ function Signer(timer, sender, errorCb, successCb, opt_logMsgUrl) { // what they get.) /** @private {boolean} */ this.allowHttp_ = this.sender_.origin ? - this.sender_.origin.startsWith('http://') : false; + this.sender_.origin.indexOf('http://') == 0 : false; /** @private {Closeable} */ this.handler_ = null; } diff --git a/chromium/chrome/browser/resources/cryptotoken/singlesigner.js b/chromium/chrome/browser/resources/cryptotoken/singlesigner.js index b76cc991fc2..9d535058620 100644 --- a/chromium/chrome/browser/resources/cryptotoken/singlesigner.js +++ b/chromium/chrome/browser/resources/cryptotoken/singlesigner.js @@ -463,12 +463,13 @@ SingleGnubbySigner.prototype.goToError_ = function(code, opt_warn) { var logFn = opt_warn ? console.warn.bind(console) : console.log.bind(console); logFn(UTIL_fmt('failed (' + code.toString(16) + ')')); var result = { code: code }; - if (!this.forEnroll_ && code == DeviceStatusCodes.WRONG_DATA_STATUS) { - // When a device yields WRONG_DATA to all sign challenges, and this is a - // sign request, we don't want to yield to the web page that it's not - // enrolled just yet: we want the user to tap the device first. We'll - // report the gnubby to the caller and let it close it instead of closing - // it here. + if (!this.forEnroll_ && + SingleGnubbySigner.signErrorIndicatesInvalidKeyHandle(code)) { + // When a device yields an idempotent bad key handle error to all sign + // challenges, and this is a sign request, we don't want to yield to the + // web page that it's not enrolled just yet: we want the user to tap the + // device first. We'll report the gnubby to the caller and let it close it + // instead of closing it here. result.gnubby = this.gnubby_; } else { // Since this gnubby can no longer produce a useful result, go ahead and diff --git a/chromium/chrome/browser/resources/cryptotoken/usbgnubbydevice.js b/chromium/chrome/browser/resources/cryptotoken/usbgnubbydevice.js index e37f9b31e10..595d3736033 100644 --- a/chromium/chrome/browser/resources/cryptotoken/usbgnubbydevice.js +++ b/chromium/chrome/browser/resources/cryptotoken/usbgnubbydevice.js @@ -44,6 +44,27 @@ UsbGnubbyDevice.NAMESPACE = 'usb'; /** Destroys this low-level device instance. */ UsbGnubbyDevice.prototype.destroy = function() { + function closeLowLevelDevice(dev) { + chrome.usb.releaseInterface(dev, 0, function() { + if (chrome.runtime.lastError) { + console.warn(UTIL_fmt('Device ' + dev.handle + + ' couldn\'t be released:')); + console.warn(UTIL_fmt(chrome.runtime.lastError.message)); + return; + } + console.log(UTIL_fmt('Device ' + dev.handle + ' released')); + chrome.usb.closeDevice(dev, function() { + if (chrome.runtime.lastError) { + console.warn(UTIL_fmt('Device ' + dev.handle + + ' couldn\'t be closed:')); + console.warn(UTIL_fmt(chrome.runtime.lastError.message)); + return; + } + console.log(UTIL_fmt('Device ' + dev.handle + ' closed')); + }); + }); + } + if (!this.dev) return; // Already dead. this.gnubbies_.removeOpenDevice( @@ -75,25 +96,27 @@ UsbGnubbyDevice.prototype.destroy = function() { var dev = this.dev; this.dev = null; + var reallyCloseDevice = closeLowLevelDevice.bind(null, dev); - chrome.usb.releaseInterface(dev, 0, function() { - if (chrome.runtime.lastError) { - console.warn(UTIL_fmt('Device ' + dev.handle + - ' couldn\'t be released:')); - console.warn(UTIL_fmt(chrome.runtime.lastError.message)); + if (this.destroyHook_) { + var p = this.destroyHook_(); + if (!p) { + reallyCloseDevice(); return; } - console.log(UTIL_fmt('Device ' + dev.handle + ' released')); - chrome.usb.closeDevice(dev, function() { - if (chrome.runtime.lastError) { - console.warn(UTIL_fmt('Device ' + dev.handle + - ' couldn\'t be closed:')); - console.warn(UTIL_fmt(chrome.runtime.lastError.message)); - return; - } - console.log(UTIL_fmt('Device ' + dev.handle + ' closed')); - }); - }); + p.then(reallyCloseDevice); + } else { + reallyCloseDevice(); + } +}; + +/** + * Sets a callback that will get called when this device instance is destroyed. + * @param {function() : ?Promise} cb Called back when closed. Callback may + * yield a promise that resolves when the close hook completes. + */ +UsbGnubbyDevice.prototype.setDestroyHook = function(cb) { + this.destroyHook_ = cb; }; /** @@ -391,7 +414,7 @@ UsbGnubbyDevice.prototype.queueCommand = function(cid, cmd, data) { * @const */ UsbGnubbyDevice.WINUSB_VID_PIDS = [ - {'vendorId': 4176, 'productId': 529} // Yubico WinUSB + {'vendorId': 4176, 'productId': 529} // Yubico WinUSB ]; /** @@ -409,15 +432,21 @@ UsbGnubbyDevice.enumerate = function(cb, opt_type) { var numEnumerated = 0; var allDevs = []; - function enumerated(devs) { - allDevs = allDevs.concat(devs); + function enumerated(vidPid, devs) { + if (devs) { + for (var i = 0; i < devs.length; i++) { + devs[i].enumeratedBy = vidPid; + } + allDevs = allDevs.concat(devs); + } if (++numEnumerated == UsbGnubbyDevice.WINUSB_VID_PIDS.length) { cb(allDevs); } } for (var i = 0; i < UsbGnubbyDevice.WINUSB_VID_PIDS.length; i++) { - chrome.usb.getDevices(UsbGnubbyDevice.WINUSB_VID_PIDS[i], enumerated); + var vidPid = UsbGnubbyDevice.WINUSB_VID_PIDS[i]; + chrome.usb.getDevices(vidPid, enumerated.bind(null, vidPid)); } }; @@ -505,6 +534,10 @@ UsbGnubbyDevice.open = function(gnubbies, which, dev, cb) { cb(-GnubbyDevice.BUSY); return; } + // Restore the enumeratedBy value, if we had it. + if (enumeratedBy) { + dev.enumeratedBy = enumeratedBy; + } var gnubby = new UsbGnubbyDevice(gnubbies, nonNullHandle, which, inEndpoint, outEndpoint); cb(-GnubbyDevice.OK, gnubby); @@ -512,10 +545,15 @@ UsbGnubbyDevice.open = function(gnubbies, which, dev, cb) { }); } + var enumeratedBy = dev.enumeratedBy; + if (UsbGnubbyDevice.runningOnCrOS === undefined) { UsbGnubbyDevice.runningOnCrOS = (window.navigator.appVersion.indexOf('; CrOS ') != -1); } + // dev contains an enumeratedBy value, which we need to strip prior to + // calling Chrome APIs with it. + delete dev.enumeratedBy; if (UsbGnubbyDevice.runningOnCrOS) { chrome.usb.requestAccess(dev, 0, function(success) { // Even though the argument to requestAccess is a chrome.usb.Device, the @@ -539,6 +577,7 @@ UsbGnubbyDevice.deviceToDeviceId = function(dev) { var usbDev = /** @type {!chrome.usb.Device} */ (dev); var deviceId = { namespace: UsbGnubbyDevice.NAMESPACE, + enumeratedBy: dev.enumeratedBy, device: usbDev.device }; return deviceId; diff --git a/chromium/chrome/browser/resources/cryptotoken/usbsignhandler.js b/chromium/chrome/browser/resources/cryptotoken/usbsignhandler.js index d06b529708e..57d23583043 100644 --- a/chromium/chrome/browser/resources/cryptotoken/usbsignhandler.js +++ b/chromium/chrome/browser/resources/cryptotoken/usbsignhandler.js @@ -96,7 +96,8 @@ UsbSignHandler.prototype.signerFoundGnubby_ = var challenge = signResult['challenge']; var info = new Uint8Array(signResult['info']); this.notifySuccess_(gnubby, challenge, info); - } else if (signResult.code == DeviceStatusCodes.WRONG_DATA_STATUS) { + } else if (SingleGnubbySigner.signErrorIndicatesInvalidKeyHandle( + signResult.code)) { var gnubby = signResult['gnubby']; this.notEnrolledGnubbies_.push(gnubby); this.sendBogusEnroll_(gnubby); diff --git a/chromium/chrome/browser/resources/cryptotoken/webrequestsender.js b/chromium/chrome/browser/resources/cryptotoken/webrequestsender.js index 0b5817cf2bc..329a6ab4074 100644 --- a/chromium/chrome/browser/resources/cryptotoken/webrequestsender.js +++ b/chromium/chrome/browser/resources/cryptotoken/webrequestsender.js @@ -88,7 +88,7 @@ function getTabIdWhenPossible(sender) { resolve(true); }, function() { // Didn't match? Check if the debugger is open. - if (!tab.url.startsWith('chrome-devtools://')) { + if (tab.url.indexOf('chrome-devtools://') != 0) { reject(false); return; } diff --git a/chromium/chrome/browser/resources/gaia_auth_host/gaia_auth_host.js b/chromium/chrome/browser/resources/gaia_auth_host/gaia_auth_host.js index d6ab087e5e3..1c3aaa504b0 100644 --- a/chromium/chrome/browser/resources/gaia_auth_host/gaia_auth_host.js +++ b/chromium/chrome/browser/resources/gaia_auth_host/gaia_auth_host.js @@ -8,7 +8,7 @@ * authentication flow. There are two events would be raised after this point: * a 'ready' event when the authentication UI is ready to use and a 'completed' * event when the authentication is completed successfully. If caller is - * interested in the user credentials, he may supply a success callback with + * interested in the user credentials, they may supply a success callback with * {@code load} call. The callback will be invoked when the authentication is * completed successfully and with the available credential data. */ @@ -143,9 +143,9 @@ cr.define('cr.login', function() { successCallback_: null, /** - * Invoked when the auth flow needs a user to confirm his/her passwords. - * This could happen when there are more than one passwords scraped during - * SAML flow. The embedder of GaiaAuthHost should show an UI to collect a + * Invoked when the auth flow needs a user to confirm their passwords. This + * could happen when there are more than one passwords scraped during SAML + * flow. The embedder of GaiaAuthHost should show an UI to collect a * password from user then call GaiaAuthHost.verifyConfirmedPassword to * verify. If the password is good, the auth flow continues with success * path. Otherwise, confirmPasswordCallback_ is invoked again. diff --git a/chromium/chrome/browser/resources/hangout_services/manifest.json b/chromium/chrome/browser/resources/hangout_services/manifest.json index 39261430ab8..ee976903196 100644 --- a/chromium/chrome/browser/resources/hangout_services/manifest.json +++ b/chromium/chrome/browser/resources/hangout_services/manifest.json @@ -5,7 +5,7 @@ "name": "Google Hangouts", // Note: Always update the version number when this file is updated. Chrome // triggers extension preferences update on the version increase. - "version": "1.3.1", + "version": "1.3.2", "manifest_version": 2, "externally_connectable": { "matches": [ diff --git a/chromium/chrome/browser/resources/hangout_services/thunk.js b/chromium/chrome/browser/resources/hangout_services/thunk.js index 309e246586b..68c28bf7dc5 100644 --- a/chromium/chrome/browser/resources/hangout_services/thunk.js +++ b/chromium/chrome/browser/resources/hangout_services/thunk.js @@ -33,7 +33,16 @@ chrome.runtime.onMessageExternal.addListener( try { var requestInfo = {}; - if (sender.tab) { + + // Set the tab ID. If it's passed in the message, use that. + // Otherwise use the sender information. + if (message['tabId']) { + requestInfo['tabId'] = +message['tabId']; + if (isNaN(requestInfo['tabId'])) { + throw new Error('Cannot convert tab ID string to integer: ' + + message['tabId']); + } + } else if (sender.tab) { requestInfo['tabId'] = sender.tab.id; } @@ -42,7 +51,16 @@ chrome.runtime.onMessageExternal.addListener( } var method = message['method']; - var origin = getHost(sender.url); + + // Set the origin. If a URL is passed in the message, use that. + // Otherwise use the sender information. + var origin; + if (message['winUrl']) { + origin = getHost(message['winUrl']); + } else { + origin = getHost(sender.url); + } + if (method == 'cpu.getInfo') { chrome.system.cpu.getInfo(doSendResponse); return true; diff --git a/chromium/chrome/browser/resources/history/other_devices.js b/chromium/chrome/browser/resources/history/other_devices.js index 62d817f6a88..2ba6f76f246 100644 --- a/chromium/chrome/browser/resources/history/other_devices.js +++ b/chromium/chrome/browser/resources/history/other_devices.js @@ -585,8 +585,6 @@ function load() { $('search-field').addEventListener('search', doSearch); $('search-button').addEventListener('click', doSearch); - cr.addWebUIListener('sign-in-state-updated', updateSignInState); - chrome.send('otherDevicesInitialized'); } diff --git a/chromium/chrome/browser/resources/inline_login/inline_login.js b/chromium/chrome/browser/resources/inline_login/inline_login.js index 7e67cbc0728..17f1c433863 100644 --- a/chromium/chrome/browser/resources/inline_login/inline_login.js +++ b/chromium/chrome/browser/resources/inline_login/inline_login.js @@ -20,6 +20,11 @@ cr.define('inline.login', function() { */ var authReadyFired; + /** + * Whether the login UI is loaded for signing in primary account. + */ + var isLoginPrimaryAccount; + function onResize(e) { chrome.send('switchToFullTab', [e.detail]); } @@ -27,7 +32,8 @@ cr.define('inline.login', function() { function onAuthReady(e) { $('contents').classList.toggle('loading', false); authReadyFired = true; - chrome.send('metricsHandler:recordAction', ['Signin_SigninPage_Shown']); + if (isLoginPrimaryAccount) + chrome.send('metricsHandler:recordAction', ['Signin_SigninPage_Shown']); } function onDropLink(e) { @@ -74,6 +80,7 @@ cr.define('inline.login', function() { $('contents').classList.toggle('loading', data.authMode != cr.login.GaiaAuthHost.AuthMode.DESKTOP || data.constrained == '1'); + isLoginPrimaryAccount = data.isLoginPrimaryAccount; } /** diff --git a/chromium/chrome/browser/resources/inspect/OWNERS b/chromium/chrome/browser/resources/inspect/OWNERS index 2abc7be24fc..fe38b0fad49 100644 --- a/chromium/chrome/browser/resources/inspect/OWNERS +++ b/chromium/chrome/browser/resources/inspect/OWNERS @@ -1 +1,2 @@ +dgozman@chromium.org pfeldman@chromium.org diff --git a/chromium/chrome/browser/resources/inspect/inspect.css b/chromium/chrome/browser/resources/inspect/inspect.css index 8bef844390f..f8075c27d6f 100644 --- a/chromium/chrome/browser/resources/inspect/inspect.css +++ b/chromium/chrome/browser/resources/inspect/inspect.css @@ -430,11 +430,11 @@ dialog.target-discovery .port-forwarding { } @media (min-width: 47em) { #container { - height: 100vh; + max-height: 100vh; } #navigation, #content { - height: 100vh; + max-height: 100vh; overflow: auto; } } diff --git a/chromium/chrome/browser/resources/local_ntp/most_visited_single.js b/chromium/chrome/browser/resources/local_ntp/most_visited_single.js index 535c3fe624a..f08b0cec42c 100644 --- a/chromium/chrome/browser/resources/local_ntp/most_visited_single.js +++ b/chromium/chrome/browser/resources/local_ntp/most_visited_single.js @@ -16,13 +16,6 @@ * @const */ var LOG_TYPE = { - // The suggestion is coming from the server. - NTP_SERVER_SIDE_SUGGESTION: 0, - // The suggestion is coming from the client. - NTP_CLIENT_SIDE_SUGGESTION: 1, - // Indicates a tile was rendered, no matter if it's a thumbnail, a gray tile - // or an external tile. - NTP_TILE: 2, // All NTP Tiles have finished loading (successfully or failing). NTP_ALL_TILES_LOADED: 11, }; @@ -313,7 +306,6 @@ var addTile = function(args) { data.faviconUrl = 'chrome-search://favicon/size/16@' + window.devicePixelRatio + 'x/' + data.renderViewId + '/' + data.tid; } - logEvent(LOG_TYPE.NTP_CLIENT_SIDE_SUGGESTION); tiles.appendChild(renderTile(data)); } else if (args.url) { // If a URL is passed: a server-side suggestion. @@ -322,7 +314,6 @@ var addTile = function(args) { if (/^javascript:/i.test(args.url) || /^javascript:/i.test(args.thumbnailUrl)) return; - logEvent(LOG_TYPE.NTP_SERVER_SIDE_SUGGESTION); tiles.appendChild(renderTile(args)); } else { // an empty tile tiles.appendChild(renderTile(null)); @@ -371,7 +362,6 @@ var renderTile = function(data) { return tile; } - logEvent(LOG_TYPE.NTP_TILE); // The tile will be appended to tiles. var position = tiles.children.length; logMostVisitedImpression(position, data.tileSource); diff --git a/chromium/chrome/browser/resources/local_ntp/most_visited_thumbnail.js b/chromium/chrome/browser/resources/local_ntp/most_visited_thumbnail.js index 4c83e8a2694..5742d6578dd 100644 --- a/chromium/chrome/browser/resources/local_ntp/most_visited_thumbnail.js +++ b/chromium/chrome/browser/resources/local_ntp/most_visited_thumbnail.js @@ -11,21 +11,13 @@ window.addEventListener('DOMContentLoaded', function() { 'use strict'; fillMostVisited(document.location, function(params, data) { - function logEvent(eventName) { - chrome.embeddedSearch.newTabPage.logEvent(eventName); - } - function logMostVisitedImpression(tileIndex, tileSource) { - chrome.embeddedSearch.newTabPage.logMostVisitedImpression(tileIndex, - tileSource); - } function displayLink(link) { document.body.appendChild(link); window.parent.postMessage('linkDisplayed', '{{ORIGIN}}'); } function showDomainElement() { var link = createMostVisitedLink( - params, data.url, data.title, undefined, data.direction, - data.tileSource); + params, data.url, data.title, undefined, data.direction); var domain = document.createElement('div'); domain.textContent = data.domain; link.appendChild(domain); @@ -35,8 +27,7 @@ window.addEventListener('DOMContentLoaded', function() { // externally by the page itself. function showEmptyTile() { displayLink(createMostVisitedLink( - params, data.url, data.title, undefined, data.direction, - data.tileSource)); + params, data.url, data.title, undefined, data.direction)); } // Creates and adds an image. function createThumbnail(src, imageClass) { @@ -46,15 +37,13 @@ window.addEventListener('DOMContentLoaded', function() { } image.onload = function() { var link = createMostVisitedLink( - params, data.url, data.title, undefined, data.direction, - data.tileSource); + params, data.url, data.title, undefined, data.direction); // Use blocker to prevent context menu from showing image-related items. var blocker = document.createElement('span'); blocker.className = 'blocker'; link.appendChild(blocker); link.appendChild(image); displayLink(link); - logEvent(NTP_LOGGING_EVENT_TYPE.NTP_TILE_LOADED); }; image.onerror = function() { // If no external thumbnail fallback (etfb), and have domain. @@ -63,7 +52,6 @@ window.addEventListener('DOMContentLoaded', function() { } else { showEmptyTile(); } - logEvent(NTP_LOGGING_EVENT_TYPE.NTP_TILE_LOADED); }; image.src = src; } @@ -73,7 +61,6 @@ window.addEventListener('DOMContentLoaded', function() { showEmptyTile(); } else if (useIcons && data.largeIconUrl) { createThumbnail(data.largeIconUrl, 'large-icon'); - // TODO(huangs): Log event for large icons. } else if (!useIcons && data.thumbnailUrls && data.thumbnailUrls.length) { createThumbnail(data.thumbnailUrls[0], 'thumbnail'); } else if (data.domain) { @@ -81,11 +68,5 @@ window.addEventListener('DOMContentLoaded', function() { } else { showEmptyTile(); } - logEvent(NTP_LOGGING_EVENT_TYPE.NTP_TILE); - - // Log an impression if we know the position of the tile. - if (isFinite(params.pos)) { - logMostVisitedImpression(parseInt(params.pos, 10), data.tileSource); - } }); }); diff --git a/chromium/chrome/browser/resources/local_ntp/most_visited_title.js b/chromium/chrome/browser/resources/local_ntp/most_visited_title.js index 87f302c9bf4..7729c1cd04e 100644 --- a/chromium/chrome/browser/resources/local_ntp/most_visited_title.js +++ b/chromium/chrome/browser/resources/local_ntp/most_visited_title.js @@ -13,12 +13,6 @@ window.addEventListener('DOMContentLoaded', function() { fillMostVisited(window.location, function(params, data) { document.body.appendChild( createMostVisitedLink( - params, data.url, data.title, data.title, data.direction, - data.tileSource)); + params, data.url, data.title, data.title, data.direction)); }); }); - -window.addEventListener('load', function() { - chrome.embeddedSearch.newTabPage.logEvent( - NTP_LOGGING_EVENT_TYPE.NTP_TILE_LOADED); -}); diff --git a/chromium/chrome/browser/resources/local_ntp/most_visited_util.js b/chromium/chrome/browser/resources/local_ntp/most_visited_util.js index ded836eb780..ef0099cab5b 100644 --- a/chromium/chrome/browser/resources/local_ntp/most_visited_util.js +++ b/chromium/chrome/browser/resources/local_ntp/most_visited_util.js @@ -10,41 +10,6 @@ -// TODO(treib): A number of things from this file (e.g. the "enums" below) are -// duplicated in most_visited_single.js. Pull those out into a shared file. - - -/** - * The different types of events that are logged from the NTP. This enum is - * used to transfer information from the NTP javascript to the renderer and is - * not used as a UMA enum histogram's logged value. - * Note: Keep in sync with common/ntp_logging_events.h - * @enum {number} - * @const - */ -var NTP_LOGGING_EVENT_TYPE = { - // The suggestion is coming from the server. - NTP_SERVER_SIDE_SUGGESTION: 0, - // The suggestion is coming from the client. - NTP_CLIENT_SIDE_SUGGESTION: 1, - // Indicates a tile was rendered, no matter if it's a thumbnail, a gray tile - // or an external tile. - NTP_TILE: 2, - // A NTP Tile has finished loading (successfully or failing). - NTP_TILE_LOADED: 10, -}; - -/** - * The different sources that an NTP tile can have. - * Note: Keep in sync with common/ntp_logging_events.h - * @enum {number} - * @const - */ -var NTPLoggingTileSource = { - CLIENT: 0, - SERVER: 1, -}; - /** * The origin of this request. * @const {string} @@ -83,11 +48,9 @@ function parseQueryParams(location) { * @param {string} title The title for the link. * @param {string|undefined} text The text for the link or none. * @param {string|undefined} direction The text direction. - * @param {number} tileSource The source from NTPLoggingTileSource. * @return {HTMLAnchorElement} A new link element. */ -function createMostVisitedLink( - params, href, title, text, direction, tileSource) { +function createMostVisitedLink(params, href, title, text, direction) { var styles = getMostVisitedStyles(params, !!text); var link = document.createElement('a'); link.style.color = styles.color; @@ -135,12 +98,6 @@ function createMostVisitedLink( generatePing(DOMAIN_ORIGIN + params.ping); } - var ntpApiHandle = chrome.embeddedSearch.newTabPage; - if ('pos' in params && isFinite(params.pos)) { - ntpApiHandle.logMostVisitedNavigation(parseInt(params.pos, 10), - tileSource); - } - // Follow normally, so transition type will be LINK. }; @@ -243,10 +200,6 @@ function fillMostVisited(location, fill) { params.rid = parseInt(params.rid, 10); if (!isFinite(params.rid) && !params.url) return; - // Log whether the suggestion was obtained from the server or the client. - chrome.embeddedSearch.newTabPage.logEvent(params.url ? - NTP_LOGGING_EVENT_TYPE.NTP_SERVER_SIDE_SUGGESTION : - NTP_LOGGING_EVENT_TYPE.NTP_CLIENT_SIDE_SUGGESTION); var data; if (params.url) { // Means that the suggestion data comes from the server. Create data object. @@ -256,15 +209,13 @@ function fillMostVisited(location, fill) { thumbnailUrl: params.tu || '', title: params.ti || '', direction: params.di || '', - domain: params.dom || '', - tileSource: NTPLoggingTileSource.SERVER + domain: params.dom || '' }; } else { var apiHandle = chrome.embeddedSearch.searchBox; data = apiHandle.getMostVisitedItemData(params.rid); if (!data) return; - data.tileSource = NTPLoggingTileSource.CLIENT; } if (isFinite(params.dummy) && parseInt(params.dummy, 10)) { diff --git a/chromium/chrome/browser/resources/md_bookmarks/OWNERS b/chromium/chrome/browser/resources/md_bookmarks/OWNERS new file mode 100644 index 00000000000..793f7b9dc7a --- /dev/null +++ b/chromium/chrome/browser/resources/md_bookmarks/OWNERS @@ -0,0 +1,3 @@ +calamity@chromium.org +dbeam@chromium.org +tsergeant@chromium.org diff --git a/chromium/chrome/browser/resources/md_bookmarks/bookmarks.html b/chromium/chrome/browser/resources/md_bookmarks/bookmarks.html new file mode 100644 index 00000000000..0176d893e17 --- /dev/null +++ b/chromium/chrome/browser/resources/md_bookmarks/bookmarks.html @@ -0,0 +1,13 @@ + + + + + $i18n{title} + + + + + + + + diff --git a/chromium/chrome/browser/resources/md_downloads/compiled_resources2.gyp b/chromium/chrome/browser/resources/md_downloads/compiled_resources2.gyp index 7482bce2c9e..be6ef517193 100644 --- a/chromium/chrome/browser/resources/md_downloads/compiled_resources2.gyp +++ b/chromium/chrome/browser/resources/md_downloads/compiled_resources2.gyp @@ -34,6 +34,7 @@ 'dependencies': [ '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr', '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:load_time_data', + '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:util', '<(DEPTH)/third_party/polymer/v1_0/components-chromium/paper-behaviors/compiled_resources2.gyp:paper-inky-focus-behavior-extracted', 'constants', 'action_service', diff --git a/chromium/chrome/browser/resources/md_downloads/crisper.js b/chromium/chrome/browser/resources/md_downloads/crisper.js index 049d55cf13f..b910f1824ad 100644 --- a/chromium/chrome/browser/resources/md_downloads/crisper.js +++ b/chromium/chrome/browser/resources/md_downloads/crisper.js @@ -25,9 +25,9 @@ function $(id){var el=document.getElementById(id);return el?assertInstanceof(el, // if(!("key"in KeyboardEvent.prototype)){Object.defineProperty(KeyboardEvent.prototype,"key",{get:function(){if(this.keyCode>=48&&this.keyCode<=57)return String.fromCharCode(this.keyCode);if(this.keyCode>=65&&this.keyCode<=90){var result=String.fromCharCode(this.keyCode).toLowerCase();if(this.shiftKey)result=result.toUpperCase();return result}switch(this.keyCode){case 8:return"Backspace";case 9:return"Tab";case 13:return"Enter";case 16:return"Shift";case 17:return"Control";case 18:return"Alt";case 27:return"Escape";case 32:return" ";case 33:return"PageUp";case 34:return"PageDown";case 35:return"End";case 36:return"Home";case 37:return"ArrowLeft";case 38:return"ArrowUp";case 39:return"ArrowRight";case 40:return"ArrowDown";case 45:return"Insert";case 46:return"Delete";case 91:return"Meta";case 112:return"F1";case 113:return"F2";case 114:return"F3";case 115:return"F4";case 116:return"F5";case 117:return"F6";case 118:return"F7";case 119:return"F8";case 120:return"F9";case 121:return"F10";case 122:return"F11";case 123:return"F12";case 187:return"=";case 189:return"-";case 219:return"[";case 221:return"]"}return"Unidentified"}})}else{window.console.log("KeyboardEvent.Key polyfill not required")} // /* is_ios */ -Polymer.IronResizableBehavior={properties:{_parentResizable:{type:Object,observer:"_parentResizableChanged"},_notifyingDescendant:{type:Boolean,value:false}},listeners:{"iron-request-resize-notifications":"_onIronRequestResizeNotifications"},created:function(){this._interestedResizables=[];this._boundNotifyResize=this.notifyResize.bind(this)},attached:function(){this.fire("iron-request-resize-notifications",null,{node:this,bubbles:true,cancelable:true});if(!this._parentResizable){window.addEventListener("resize",this._boundNotifyResize);this.notifyResize()}},detached:function(){if(this._parentResizable){this._parentResizable.stopResizeNotificationsFor(this)}else{window.removeEventListener("resize",this._boundNotifyResize)}this._parentResizable=null},notifyResize:function(){if(!this.isAttached){return}this._interestedResizables.forEach(function(resizable){if(this.resizerShouldNotify(resizable)){this._notifyDescendant(resizable)}},this);this._fireResize()},assignParentResizable:function(parentResizable){this._parentResizable=parentResizable},stopResizeNotificationsFor:function(target){var index=this._interestedResizables.indexOf(target);if(index>-1){this._interestedResizables.splice(index,1);this.unlisten(target,"iron-resize","_onDescendantIronResize")}},resizerShouldNotify:function(element){return true},_onDescendantIronResize:function(event){if(this._notifyingDescendant){event.stopPropagation();return}if(!Polymer.Settings.useShadow){this._fireResize()}},_fireResize:function(){this.fire("iron-resize",null,{node:this,bubbles:false})},_onIronRequestResizeNotifications:function(event){var target=event.path?event.path[0]:event.target;if(target===this){return}if(this._interestedResizables.indexOf(target)===-1){this._interestedResizables.push(target);this.listen(target,"iron-resize","_onDescendantIronResize")}target.assignParentResizable(this);this._notifyDescendant(target);event.stopPropagation()},_parentResizableChanged:function(parentResizable){if(parentResizable){window.removeEventListener("resize",this._boundNotifyResize)}},_notifyDescendant:function(descendant){if(!this.isAttached){return}this._notifyingDescendant=true;descendant.notifyResize();this._notifyingDescendant=false}};(function(){"use strict";var KEY_IDENTIFIER={"U+0008":"backspace","U+0009":"tab","U+001B":"esc","U+0020":"space","U+007F":"del"};var KEY_CODE={8:"backspace",9:"tab",13:"enter",27:"esc",33:"pageup",34:"pagedown",35:"end",36:"home",32:"space",37:"left",38:"up",39:"right",40:"down",46:"del",106:"*"};var MODIFIER_KEYS={shift:"shiftKey",ctrl:"ctrlKey",alt:"altKey",meta:"metaKey"};var KEY_CHAR=/[a-z0-9*]/;var IDENT_CHAR=/U\+/;var ARROW_KEY=/^arrow/;var SPACE_KEY=/^space(bar)?/;var ESC_KEY=/^escape$/;function transformKey(key,noSpecialChars){var validKey="";if(key){var lKey=key.toLowerCase();if(lKey===" "||SPACE_KEY.test(lKey)){validKey="space"}else if(ESC_KEY.test(lKey)){validKey="esc"}else if(lKey.length==1){if(!noSpecialChars||KEY_CHAR.test(lKey)){validKey=lKey}}else if(ARROW_KEY.test(lKey)){validKey=lKey.replace("arrow","")}else if(lKey=="multiply"){validKey="*"}else{validKey=lKey}}return validKey}function transformKeyIdentifier(keyIdent){var validKey="";if(keyIdent){if(keyIdent in KEY_IDENTIFIER){validKey=KEY_IDENTIFIER[keyIdent]}else if(IDENT_CHAR.test(keyIdent)){keyIdent=parseInt(keyIdent.replace("U+","0x"),16);validKey=String.fromCharCode(keyIdent).toLowerCase()}else{validKey=keyIdent.toLowerCase()}}return validKey}function transformKeyCode(keyCode){var validKey="";if(Number(keyCode)){if(keyCode>=65&&keyCode<=90){validKey=String.fromCharCode(32+keyCode)}else if(keyCode>=112&&keyCode<=123){validKey="f"+(keyCode-112)}else if(keyCode>=48&&keyCode<=57){validKey=String(keyCode-48)}else if(keyCode>=96&&keyCode<=105){validKey=String(keyCode-96)}else{validKey=KEY_CODE[keyCode]}}return validKey}function normalizedKeyForEvent(keyEvent,noSpecialChars){if(keyEvent.key){return transformKey(keyEvent.key,noSpecialChars)}if(keyEvent.detail&&keyEvent.detail.key){return transformKey(keyEvent.detail.key,noSpecialChars)}return transformKeyIdentifier(keyEvent.keyIdentifier)||transformKeyCode(keyEvent.keyCode)||""}function keyComboMatchesEvent(keyCombo,event){var keyEvent=normalizedKeyForEvent(event,keyCombo.hasModifiers);return keyEvent===keyCombo.key&&(!keyCombo.hasModifiers||!!event.shiftKey===!!keyCombo.shiftKey&&!!event.ctrlKey===!!keyCombo.ctrlKey&&!!event.altKey===!!keyCombo.altKey&&!!event.metaKey===!!keyCombo.metaKey)}function parseKeyComboString(keyComboString){if(keyComboString.length===1){return{combo:keyComboString,key:keyComboString,event:"keydown"}}return keyComboString.split("+").reduce(function(parsedKeyCombo,keyComboPart){var eventParts=keyComboPart.split(":");var keyName=eventParts[0];var event=eventParts[1];if(keyName in MODIFIER_KEYS){parsedKeyCombo[MODIFIER_KEYS[keyName]]=true;parsedKeyCombo.hasModifiers=true}else{parsedKeyCombo.key=keyName;parsedKeyCombo.event=event||"keydown"}return parsedKeyCombo},{combo:keyComboString.split(":").shift()})}function parseEventString(eventString){return eventString.trim().split(" ").map(function(keyComboString){return parseKeyComboString(keyComboString)})}Polymer.IronA11yKeysBehavior={properties:{keyEventTarget:{type:Object,value:function(){return this}},stopKeyboardEventPropagation:{type:Boolean,value:false},_boundKeyHandlers:{type:Array,value:function(){return[]}},_imperativeKeyBindings:{type:Object,value:function(){return{}}}},observers:["_resetKeyEventListeners(keyEventTarget, _boundKeyHandlers)"],keyBindings:{},registered:function(){this._prepKeyBindings()},attached:function(){this._listenKeyEventListeners()},detached:function(){this._unlistenKeyEventListeners()},addOwnKeyBinding:function(eventString,handlerName){this._imperativeKeyBindings[eventString]=handlerName;this._prepKeyBindings();this._resetKeyEventListeners()},removeOwnKeyBindings:function(){this._imperativeKeyBindings={};this._prepKeyBindings();this._resetKeyEventListeners()},keyboardEventMatchesKeys:function(event,eventString){var keyCombos=parseEventString(eventString);for(var i=0;i=8;var DEFAULT_PHYSICAL_COUNT=3;var HIDDEN_Y="-10000px";var ITEM_WIDTH=0;var ITEM_HEIGHT=1;var SECRET_TABINDEX=-100;Polymer({is:"iron-list",properties:{items:{type:Array},maxPhysicalCount:{type:Number,value:500},as:{type:String,value:"item"},indexAs:{type:String,value:"index"},selectedAs:{type:String,value:"selected"},grid:{type:Boolean,value:false,reflectToAttribute:true},selectionEnabled:{type:Boolean,value:false},selectedItem:{type:Object,notify:true},selectedItems:{type:Object,notify:true},multiSelection:{type:Boolean,value:false}},observers:["_itemsChanged(items.*)","_selectionEnabledChanged(selectionEnabled)","_multiSelectionChanged(multiSelection)","_setOverflow(scrollTarget)"],behaviors:[Polymer.Templatizer,Polymer.IronResizableBehavior,Polymer.IronA11yKeysBehavior,Polymer.IronScrollTargetBehavior],keyBindings:{up:"_didMoveUp",down:"_didMoveDown",enter:"_didEnter"},_ratio:.5,_scrollerPaddingTop:0,_scrollPosition:0,_physicalSize:0,_physicalAverage:0,_physicalAverageCount:0,_physicalTop:0,_virtualCount:0,_physicalIndexForKey:null,_estScrollHeight:0,_scrollHeight:0,_viewportHeight:0,_viewportWidth:0,_physicalItems:null,_physicalSizes:null,_firstVisibleIndexVal:null,_lastVisibleIndexVal:null,_collection:null,_maxPages:2,_focusedItem:null,_focusedIndex:-1,_offscreenFocusedItem:null,_focusBackfillItem:null,_itemsPerRow:1,_itemWidth:0,_rowHeight:0,_templateCost:0,get _physicalBottom(){return this._physicalTop+this._physicalSize},get _scrollBottom(){return this._scrollPosition+this._viewportHeight},get _virtualEnd(){return this._virtualStart+this._physicalCount-1},get _hiddenContentSize(){var size=this.grid?this._physicalRows*this._rowHeight:this._physicalSize;return size-this._viewportHeight},get _maxScrollTop(){return this._estScrollHeight-this._viewportHeight+this._scrollerPaddingTop},_minVirtualStart:0,get _maxVirtualStart(){return Math.max(0,this._virtualCount-this._physicalCount)},_virtualStartVal:0,set _virtualStart(val){this._virtualStartVal=Math.min(this._maxVirtualStart,Math.max(this._minVirtualStart,val))},get _virtualStart(){return this._virtualStartVal||0},_physicalStartVal:0,set _physicalStart(val){this._physicalStartVal=val%this._physicalCount;if(this._physicalStartVal<0){this._physicalStartVal=this._physicalCount+this._physicalStartVal}this._physicalEnd=(this._physicalStart+this._physicalCount-1)%this._physicalCount},get _physicalStart(){return this._physicalStartVal||0},_physicalCountVal:0,set _physicalCount(val){this._physicalCountVal=val;this._physicalEnd=(this._physicalStart+this._physicalCount-1)%this._physicalCount},get _physicalCount(){return this._physicalCountVal},_physicalEnd:0,get _optPhysicalSize(){if(this.grid){return this._estRowsInView*this._rowHeight*this._maxPages}return this._viewportHeight*this._maxPages},get _isVisible(){return Boolean(this.offsetWidth||this.offsetHeight)},get firstVisibleIndex(){if(this._firstVisibleIndexVal===null){var physicalOffset=Math.floor(this._physicalTop+this._scrollerPaddingTop);this._firstVisibleIndexVal=this._iterateItems(function(pidx,vidx){physicalOffset+=this._getPhysicalSizeIncrement(pidx);if(physicalOffset>this._scrollPosition){return this.grid?vidx-vidx%this._itemsPerRow:vidx}if(this.grid&&this._virtualCount-1===vidx){return vidx-vidx%this._itemsPerRow}})||0}return this._firstVisibleIndexVal},get lastVisibleIndex(){if(this._lastVisibleIndexVal===null){if(this.grid){var lastIndex=this.firstVisibleIndex+this._estRowsInView*this._itemsPerRow-1;this._lastVisibleIndexVal=Math.min(this._virtualCount,lastIndex)}else{var physicalOffset=this._physicalTop;this._iterateItems(function(pidx,vidx){if(physicalOffset=0;this._scrollPosition=scrollTop;this._firstVisibleIndexVal=null;this._lastVisibleIndexVal=null;if(Math.abs(delta)>this._physicalSize){var idxAdjustment=Math.round(delta/this._physicalAverage)*this._itemsPerRow;this._physicalTop=this._physicalTop+delta;this._virtualStart=this._virtualStart+idxAdjustment;this._physicalStart=this._physicalStart+idxAdjustment;this._update()}else{var reusables=this._getReusables(isScrollingDown);if(isScrollingDown){this._physicalTop=reusables.physicalTop;this._virtualStart=this._virtualStart+reusables.indexes.length;this._physicalStart=this._physicalStart+reusables.indexes.length}else{this._virtualStart=this._virtualStart-reusables.indexes.length;this._physicalStart=this._physicalStart-reusables.indexes.length}if(reusables.indexes.length===0){this._increasePoolIfNeeded()}else{this._update(reusables.indexes,isScrollingDown?null:reusables.indexes)}}},_getReusables:function(fromTop){var ith,lastIth,offsetContent,physicalItemHeight;var idxs=[];var protectedOffsetContent=this._hiddenContentSize*this._ratio;var virtualStart=this._virtualStart;var virtualEnd=this._virtualEnd;var physicalCount=this._physicalCount;var physicalTop=this._physicalTop;var scrollTop=this._scrollTop;var scrollBottom=this._scrollBottom;if(fromTop){ith=this._physicalStart;lastIth=this._physicalEnd;offsetContent=scrollTop-physicalTop}else{ith=this._physicalEnd;lastIth=this._physicalStart;offsetContent=this._physicalBottom-scrollBottom}while(true){physicalItemHeight=this._getPhysicalSizeIncrement(ith);offsetContent=offsetContent-physicalItemHeight;if(idxs.length>=physicalCount||offsetContent<=protectedOffsetContent){break}if(fromTop){if(virtualEnd+idxs.length+1>=this._virtualCount){break}if(physicalTop+physicalItemHeight>=scrollTop){break}idxs.push(ith);physicalTop=physicalTop+physicalItemHeight;ith=(ith+1)%physicalCount}else{if(virtualStart-idxs.length<=0){break}if(physicalTop+this._physicalSize-physicalItemHeight<=scrollBottom){break}idxs.push(ith);physicalTop=physicalTop-physicalItemHeight;ith=ith===0?physicalCount-1:ith-1}}return{indexes:idxs,physicalTop:physicalTop}},_update:function(itemSet,movingUp){if(itemSet&&itemSet.length===0){return}this._manageFocus();this._assignModels(itemSet);this._updateMetrics(itemSet);if(movingUp){while(movingUp.length){var idx=movingUp.pop();this._physicalTop-=this._getPhysicalSizeIncrement(idx)}}this._positionItems();this._updateScrollerSize();this._increasePoolIfNeeded()},_createPool:function(size){var physicalItems=new Array(size);this._ensureTemplatized();for(var i=0;i=this._scrollBottom&&this._physicalTop<=this._scrollPosition;if(this._physicalSize>=this._optPhysicalSize&&isClientFull){return false}var maxPoolSize=Math.round(this._physicalCount*.5);if(!isClientFull){this._debounceTemplate(this._increasePool.bind(this,maxPoolSize));return true}this._yield(function(){self._increasePool(Math.min(maxPoolSize,Math.max(1,Math.round(50/self._templateCost))))});return true},_yield:function(cb){var g=window;var handle=g.requestIdleCallback?g.requestIdleCallback(cb):g.setTimeout(cb,16);Polymer.dom.addDebouncer({complete:function(){g.cancelIdleCallback?g.cancelIdleCallback(handle):g.clearTimeout(handle);cb()}})},_increasePool:function(missingItems){var nextPhysicalCount=Math.min(this._physicalCount+missingItems,this._virtualCount-this._virtualStart,Math.max(this.maxPhysicalCount,DEFAULT_PHYSICAL_COUNT));var prevPhysicalCount=this._physicalCount;var delta=nextPhysicalCount-prevPhysicalCount;var ts=window.performance.now();if(delta<=0){return}[].push.apply(this._physicalItems,this._createPool(delta));[].push.apply(this._physicalSizes,new Array(delta));this._physicalCount=prevPhysicalCount+delta;if(this._physicalStart>this._physicalEnd&&this._isIndexRendered(this._focusedIndex)&&this._getPhysicalIndex(this._focusedIndex)=0){path=this.as+"."+path.substring(dot+1);el._templateInstance.notifyPath(path,value,true)}else{var currentItem=el._templateInstance[this.as];if(Array.isArray(this.selectedItems)){for(var i=0;i=0){this._focusedIndex=this._focusedIndex+delta}}},this)},_removeItem:function(item){this.$.selector.deselect(item);if(this._focusedItem&&this._focusedItem._templateInstance[this.as]===item){this._removeFocusedItem()}},_iterateItems:function(fn,itemSet){var pidx,vidx,rtn,i;if(arguments.length===2&&itemSet){for(i=0;i=this._physicalStart){return this._virtualStart+(pidx-this._physicalStart)}return this._virtualStart+(this._physicalCount-this._physicalStart)+pidx},_assignModels:function(itemSet){this._iterateItems(function(pidx,vidx){var el=this._physicalItems[pidx];var inst=el._templateInstance;var item=this.items&&this.items[vidx];if(item!=null){inst[this.as]=item;inst.__key__=this._collection.getKey(item);inst[this.selectedAs]=this.$.selector.isSelected(item);inst[this.indexAs]=vidx;inst.tabIndex=this._focusedIndex===vidx?0:-1;this._physicalIndexForKey[inst.__key__]=pidx;el.removeAttribute("hidden")}else{inst.__key__=null;el.setAttribute("hidden","")}},itemSet)},_updateMetrics:function(itemSet){Polymer.dom.flush();var newPhysicalSize=0;var oldPhysicalSize=0;var prevAvgCount=this._physicalAverageCount;var prevPhysicalAvg=this._physicalAverage;this._iterateItems(function(pidx,vidx){oldPhysicalSize+=this._physicalSizes[pidx]||0;this._physicalSizes[pidx]=this._physicalItems[pidx].offsetHeight;newPhysicalSize+=this._physicalSizes[pidx];this._physicalAverageCount+=this._physicalSizes[pidx]?1:0},itemSet);if(this.grid){this._updateGridMetrics();this._physicalSize=Math.ceil(this._physicalCount/this._itemsPerRow)*this._rowHeight}else{this._physicalSize=this._physicalSize+newPhysicalSize-oldPhysicalSize}if(this._physicalAverageCount!==prevAvgCount){this._physicalAverage=Math.round((prevPhysicalAvg*prevAvgCount+newPhysicalSize)/this._physicalAverageCount)}},_updateGridMetrics:function(){this._itemWidth=this._physicalCount>0?this._physicalItems[0].getBoundingClientRect().width:200;this._rowHeight=this._physicalCount>0?this._physicalItems[0].offsetHeight:200;this._itemsPerRow=this._itemWidth?Math.floor(this._viewportWidth/this._itemWidth):this._itemsPerRow},_positionItems:function(){this._adjustScrollPosition();var y=this._physicalTop;if(this.grid){var totalItemWidth=this._itemsPerRow*this._itemWidth;var rowOffset=(this._viewportWidth-totalItemWidth)/2;this._iterateItems(function(pidx,vidx){var modulus=vidx%this._itemsPerRow;var x=Math.floor(modulus*this._itemWidth+rowOffset);this.translate3d(x+"px",y+"px",0,this._physicalItems[pidx]);if(this._shouldRenderNextRow(vidx)){y+=this._rowHeight}})}else{this._iterateItems(function(pidx,vidx){this.translate3d(0,y+"px",0,this._physicalItems[pidx]);y+=this._physicalSizes[pidx]})}},_getPhysicalSizeIncrement:function(pidx){if(!this.grid){return this._physicalSizes[pidx]}if(this._computeVidx(pidx)%this._itemsPerRow!==this._itemsPerRow-1){return 0}return this._rowHeight},_shouldRenderNextRow:function(vidx){return vidx%this._itemsPerRow===this._itemsPerRow-1},_adjustScrollPosition:function(){var deltaHeight=this._virtualStart===0?this._physicalTop:Math.min(this._scrollPosition+this._physicalTop,0);if(deltaHeight){this._physicalTop=this._physicalTop-deltaHeight;if(!IOS_TOUCH_SCROLLING&&this._physicalTop!==0){this._resetScrollPosition(this._scrollTop-deltaHeight)}}},_resetScrollPosition:function(pos){if(this.scrollTarget){this._scrollTop=pos;this._scrollPosition=this._scrollTop}},_updateScrollerSize:function(forceUpdate){if(this.grid){this._estScrollHeight=this._virtualRowCount*this._rowHeight}else{this._estScrollHeight=this._physicalBottom+Math.max(this._virtualCount-this._physicalCount-this._virtualStart,0)*this._physicalAverage}forceUpdate=forceUpdate||this._scrollHeight===0;forceUpdate=forceUpdate||this._scrollPosition>=this._estScrollHeight-this._physicalSize;forceUpdate=forceUpdate||this.grid&&this.$.items.style.height=this._optPhysicalSize){this.$.items.style.height=this._estScrollHeight+"px";this._scrollHeight=this._estScrollHeight}},scrollToItem:function(item){return this.scrollToIndex(this.items.indexOf(item))},scrollToIndex:function(idx){if(typeof idx!=="number"||idx<0||idx>this.items.length-1){return}Polymer.dom.flush();if(this._physicalCount===0){return}idx=Math.min(Math.max(idx,0),this._virtualCount-1);if(!this._isIndexRendered(idx)||idx>=this._maxVirtualStart){this._virtualStart=this.grid?idx-this._itemsPerRow*2:idx-1}this._manageFocus();this._assignModels();this._updateMetrics();this._physicalTop=Math.floor(this._virtualStart/this._itemsPerRow)*this._physicalAverage;var currentTopItem=this._physicalStart;var currentVirtualItem=this._virtualStart;var targetOffsetTop=0;var hiddenContentSize=this._hiddenContentSize;while(currentVirtualItem0){this._resetAverage();this.scrollToIndex(this.firstVisibleIndex)}}else{this.toggleScrollListener(false)}}.bind(this),1))},_getModelFromItem:function(item){var key=this._collection.getKey(item);var pidx=this._physicalIndexForKey[key];if(pidx!=null){return this._physicalItems[pidx]._templateInstance}return null},_getNormalizedItem:function(item){if(this._collection.getKey(item)===undefined){if(typeof item==="number"){item=this.items[item];if(!item){throw new RangeError(" not found")}return item}throw new TypeError(" should be a valid item")}return item},selectItem:function(item){item=this._getNormalizedItem(item);var model=this._getModelFromItem(item);if(!this.multiSelection&&this.selectedItem){this.deselectItem(this.selectedItem)}if(model){model[this.selectedAs]=true}this.$.selector.select(item);this.updateSizeForItem(item)},deselectItem:function(item){item=this._getNormalizedItem(item);var model=this._getModelFromItem(item);if(model){model[this.selectedAs]=false}this.$.selector.deselect(item);this.updateSizeForItem(item)},toggleSelectionForItem:function(item){item=this._getNormalizedItem(item);if(this.$.selector.isSelected(item)){this.deselectItem(item)}else{this.selectItem(item)}},clearSelection:function(){function unselect(item){var model=this._getModelFromItem(item);if(model){model[this.selectedAs]=false}}if(Array.isArray(this.selectedItems)){this.selectedItems.forEach(unselect,this)}else if(this.selectedItem){unselect.call(this,this.selectedItem)}this.$.selector.clearSelection()},_selectionEnabledChanged:function(selectionEnabled){var handler=selectionEnabled?this.listen:this.unlisten;handler.call(this,this,"tap","_selectionHandler")},_selectionHandler:function(e){var model=this.modelForElement(e.target);if(!model){return}var modelTabIndex,activeElTabIndex;var target=Polymer.dom(e).path[0];var activeEl=Polymer.dom(this.domHost?this.domHost.root:document).activeElement;var physicalItem=this._physicalItems[this._getPhysicalIndex(model[this.indexAs])];if(target.localName==="input"||target.localName==="button"||target.localName==="select"){return}modelTabIndex=model.tabIndex;model.tabIndex=SECRET_TABINDEX; +function importModules(moduleNames){return new Promise(function(resolve){define(moduleNames,function(){resolve(Array.from(arguments))})})}Polymer.IronResizableBehavior={properties:{_parentResizable:{type:Object,observer:"_parentResizableChanged"},_notifyingDescendant:{type:Boolean,value:false}},listeners:{"iron-request-resize-notifications":"_onIronRequestResizeNotifications"},created:function(){this._interestedResizables=[];this._boundNotifyResize=this.notifyResize.bind(this)},attached:function(){this.fire("iron-request-resize-notifications",null,{node:this,bubbles:true,cancelable:true});if(!this._parentResizable){window.addEventListener("resize",this._boundNotifyResize);this.notifyResize()}},detached:function(){if(this._parentResizable){this._parentResizable.stopResizeNotificationsFor(this)}else{window.removeEventListener("resize",this._boundNotifyResize)}this._parentResizable=null},notifyResize:function(){if(!this.isAttached){return}this._interestedResizables.forEach(function(resizable){if(this.resizerShouldNotify(resizable)){this._notifyDescendant(resizable)}},this);this._fireResize()},assignParentResizable:function(parentResizable){this._parentResizable=parentResizable},stopResizeNotificationsFor:function(target){var index=this._interestedResizables.indexOf(target);if(index>-1){this._interestedResizables.splice(index,1);this.unlisten(target,"iron-resize","_onDescendantIronResize")}},resizerShouldNotify:function(element){return true},_onDescendantIronResize:function(event){if(this._notifyingDescendant){event.stopPropagation();return}if(!Polymer.Settings.useShadow){this._fireResize()}},_fireResize:function(){this.fire("iron-resize",null,{node:this,bubbles:false})},_onIronRequestResizeNotifications:function(event){var target=event.path?event.path[0]:event.target;if(target===this){return}if(this._interestedResizables.indexOf(target)===-1){this._interestedResizables.push(target);this.listen(target,"iron-resize","_onDescendantIronResize")}target.assignParentResizable(this);this._notifyDescendant(target);event.stopPropagation()},_parentResizableChanged:function(parentResizable){if(parentResizable){window.removeEventListener("resize",this._boundNotifyResize)}},_notifyDescendant:function(descendant){if(!this.isAttached){return}this._notifyingDescendant=true;descendant.notifyResize();this._notifyingDescendant=false}};(function(){"use strict";var KEY_IDENTIFIER={"U+0008":"backspace","U+0009":"tab","U+001B":"esc","U+0020":"space","U+007F":"del"};var KEY_CODE={8:"backspace",9:"tab",13:"enter",27:"esc",33:"pageup",34:"pagedown",35:"end",36:"home",32:"space",37:"left",38:"up",39:"right",40:"down",46:"del",106:"*"};var MODIFIER_KEYS={shift:"shiftKey",ctrl:"ctrlKey",alt:"altKey",meta:"metaKey"};var KEY_CHAR=/[a-z0-9*]/;var IDENT_CHAR=/U\+/;var ARROW_KEY=/^arrow/;var SPACE_KEY=/^space(bar)?/;var ESC_KEY=/^escape$/;function transformKey(key,noSpecialChars){var validKey="";if(key){var lKey=key.toLowerCase();if(lKey===" "||SPACE_KEY.test(lKey)){validKey="space"}else if(ESC_KEY.test(lKey)){validKey="esc"}else if(lKey.length==1){if(!noSpecialChars||KEY_CHAR.test(lKey)){validKey=lKey}}else if(ARROW_KEY.test(lKey)){validKey=lKey.replace("arrow","")}else if(lKey=="multiply"){validKey="*"}else{validKey=lKey}}return validKey}function transformKeyIdentifier(keyIdent){var validKey="";if(keyIdent){if(keyIdent in KEY_IDENTIFIER){validKey=KEY_IDENTIFIER[keyIdent]}else if(IDENT_CHAR.test(keyIdent)){keyIdent=parseInt(keyIdent.replace("U+","0x"),16);validKey=String.fromCharCode(keyIdent).toLowerCase()}else{validKey=keyIdent.toLowerCase()}}return validKey}function transformKeyCode(keyCode){var validKey="";if(Number(keyCode)){if(keyCode>=65&&keyCode<=90){validKey=String.fromCharCode(32+keyCode)}else if(keyCode>=112&&keyCode<=123){validKey="f"+(keyCode-112)}else if(keyCode>=48&&keyCode<=57){validKey=String(keyCode-48)}else if(keyCode>=96&&keyCode<=105){validKey=String(keyCode-96)}else{validKey=KEY_CODE[keyCode]}}return validKey}function normalizedKeyForEvent(keyEvent,noSpecialChars){if(keyEvent.key){return transformKey(keyEvent.key,noSpecialChars)}if(keyEvent.detail&&keyEvent.detail.key){return transformKey(keyEvent.detail.key,noSpecialChars)}return transformKeyIdentifier(keyEvent.keyIdentifier)||transformKeyCode(keyEvent.keyCode)||""}function keyComboMatchesEvent(keyCombo,event){var keyEvent=normalizedKeyForEvent(event,keyCombo.hasModifiers);return keyEvent===keyCombo.key&&(!keyCombo.hasModifiers||!!event.shiftKey===!!keyCombo.shiftKey&&!!event.ctrlKey===!!keyCombo.ctrlKey&&!!event.altKey===!!keyCombo.altKey&&!!event.metaKey===!!keyCombo.metaKey)}function parseKeyComboString(keyComboString){if(keyComboString.length===1){return{combo:keyComboString,key:keyComboString,event:"keydown"}}return keyComboString.split("+").reduce(function(parsedKeyCombo,keyComboPart){var eventParts=keyComboPart.split(":");var keyName=eventParts[0];var event=eventParts[1];if(keyName in MODIFIER_KEYS){parsedKeyCombo[MODIFIER_KEYS[keyName]]=true;parsedKeyCombo.hasModifiers=true}else{parsedKeyCombo.key=keyName;parsedKeyCombo.event=event||"keydown"}return parsedKeyCombo},{combo:keyComboString.split(":").shift()})}function parseEventString(eventString){return eventString.trim().split(" ").map(function(keyComboString){return parseKeyComboString(keyComboString)})}Polymer.IronA11yKeysBehavior={properties:{keyEventTarget:{type:Object,value:function(){return this}},stopKeyboardEventPropagation:{type:Boolean,value:false},_boundKeyHandlers:{type:Array,value:function(){return[]}},_imperativeKeyBindings:{type:Object,value:function(){return{}}}},observers:["_resetKeyEventListeners(keyEventTarget, _boundKeyHandlers)"],keyBindings:{},registered:function(){this._prepKeyBindings()},attached:function(){this._listenKeyEventListeners()},detached:function(){this._unlistenKeyEventListeners()},addOwnKeyBinding:function(eventString,handlerName){this._imperativeKeyBindings[eventString]=handlerName;this._prepKeyBindings();this._resetKeyEventListeners()},removeOwnKeyBindings:function(){this._imperativeKeyBindings={};this._prepKeyBindings();this._resetKeyEventListeners()},keyboardEventMatchesKeys:function(event,eventString){var keyCombos=parseEventString(eventString);for(var i=0;i=8;var DEFAULT_PHYSICAL_COUNT=3;var HIDDEN_Y="-10000px";var ITEM_WIDTH=0;var ITEM_HEIGHT=1;var SECRET_TABINDEX=-100;Polymer({is:"iron-list",properties:{items:{type:Array},maxPhysicalCount:{type:Number,value:500},as:{type:String,value:"item"},indexAs:{type:String,value:"index"},selectedAs:{type:String,value:"selected"},grid:{type:Boolean,value:false,reflectToAttribute:true},selectionEnabled:{type:Boolean,value:false},selectedItem:{type:Object,notify:true},selectedItems:{type:Object,notify:true},multiSelection:{type:Boolean,value:false}},observers:["_itemsChanged(items.*)","_selectionEnabledChanged(selectionEnabled)","_multiSelectionChanged(multiSelection)","_setOverflow(scrollTarget)"],behaviors:[Polymer.Templatizer,Polymer.IronResizableBehavior,Polymer.IronA11yKeysBehavior,Polymer.IronScrollTargetBehavior],keyBindings:{up:"_didMoveUp",down:"_didMoveDown",enter:"_didEnter"},_ratio:.5,_scrollerPaddingTop:0,_scrollPosition:0,_physicalSize:0,_physicalAverage:0,_physicalAverageCount:0,_physicalTop:0,_virtualCount:0,_physicalIndexForKey:null,_estScrollHeight:0,_scrollHeight:0,_viewportHeight:0,_viewportWidth:0,_physicalItems:null,_physicalSizes:null,_firstVisibleIndexVal:null,_lastVisibleIndexVal:null,_collection:null,_maxPages:2,_focusedItem:null,_focusedIndex:-1,_offscreenFocusedItem:null,_focusBackfillItem:null,_itemsPerRow:1,_itemWidth:0,_rowHeight:0,_templateCost:0,get _physicalBottom(){return this._physicalTop+this._physicalSize},get _scrollBottom(){return this._scrollPosition+this._viewportHeight},get _virtualEnd(){return this._virtualStart+this._physicalCount-1},get _hiddenContentSize(){var size=this.grid?this._physicalRows*this._rowHeight:this._physicalSize;return size-this._viewportHeight},get _maxScrollTop(){return this._estScrollHeight-this._viewportHeight+this._scrollerPaddingTop},_minVirtualStart:0,get _maxVirtualStart(){return Math.max(0,this._virtualCount-this._physicalCount)},_virtualStartVal:0,set _virtualStart(val){this._virtualStartVal=Math.min(this._maxVirtualStart,Math.max(this._minVirtualStart,val))},get _virtualStart(){return this._virtualStartVal||0},_physicalStartVal:0,set _physicalStart(val){this._physicalStartVal=val%this._physicalCount;if(this._physicalStartVal<0){this._physicalStartVal=this._physicalCount+this._physicalStartVal}this._physicalEnd=(this._physicalStart+this._physicalCount-1)%this._physicalCount},get _physicalStart(){return this._physicalStartVal||0},_physicalCountVal:0,set _physicalCount(val){this._physicalCountVal=val;this._physicalEnd=(this._physicalStart+this._physicalCount-1)%this._physicalCount},get _physicalCount(){return this._physicalCountVal},_physicalEnd:0,get _optPhysicalSize(){if(this.grid){return this._estRowsInView*this._rowHeight*this._maxPages}return this._viewportHeight*this._maxPages},get _isVisible(){return Boolean(this.offsetWidth||this.offsetHeight)},get firstVisibleIndex(){if(this._firstVisibleIndexVal===null){var physicalOffset=Math.floor(this._physicalTop+this._scrollerPaddingTop);this._firstVisibleIndexVal=this._iterateItems(function(pidx,vidx){physicalOffset+=this._getPhysicalSizeIncrement(pidx);if(physicalOffset>this._scrollPosition){return this.grid?vidx-vidx%this._itemsPerRow:vidx}if(this.grid&&this._virtualCount-1===vidx){return vidx-vidx%this._itemsPerRow}})||0}return this._firstVisibleIndexVal},get lastVisibleIndex(){if(this._lastVisibleIndexVal===null){if(this.grid){var lastIndex=this.firstVisibleIndex+this._estRowsInView*this._itemsPerRow-1;this._lastVisibleIndexVal=Math.min(this._virtualCount,lastIndex)}else{var physicalOffset=this._physicalTop;this._iterateItems(function(pidx,vidx){if(physicalOffset=0;this._scrollPosition=scrollTop;this._firstVisibleIndexVal=null;this._lastVisibleIndexVal=null;if(Math.abs(delta)>this._physicalSize){var idxAdjustment=Math.round(delta/this._physicalAverage)*this._itemsPerRow;this._physicalTop=this._physicalTop+delta;this._virtualStart=this._virtualStart+idxAdjustment;this._physicalStart=this._physicalStart+idxAdjustment;this._update()}else{var reusables=this._getReusables(isScrollingDown);if(isScrollingDown){this._physicalTop=reusables.physicalTop;this._virtualStart=this._virtualStart+reusables.indexes.length;this._physicalStart=this._physicalStart+reusables.indexes.length}else{this._virtualStart=this._virtualStart-reusables.indexes.length;this._physicalStart=this._physicalStart-reusables.indexes.length}if(reusables.indexes.length===0){this._increasePoolIfNeeded()}else{this._update(reusables.indexes,isScrollingDown?null:reusables.indexes)}}},_getReusables:function(fromTop){var ith,lastIth,offsetContent,physicalItemHeight;var idxs=[];var protectedOffsetContent=this._hiddenContentSize*this._ratio;var virtualStart=this._virtualStart;var virtualEnd=this._virtualEnd;var physicalCount=this._physicalCount;var physicalTop=this._physicalTop+this._scrollerPaddingTop;var scrollTop=this._scrollTop;var scrollBottom=this._scrollBottom;if(fromTop){ith=this._physicalStart;lastIth=this._physicalEnd;offsetContent=scrollTop-physicalTop}else{ith=this._physicalEnd;lastIth=this._physicalStart;offsetContent=this._physicalBottom-scrollBottom}while(true){physicalItemHeight=this._getPhysicalSizeIncrement(ith);offsetContent=offsetContent-physicalItemHeight;if(idxs.length>=physicalCount||offsetContent<=protectedOffsetContent){break}if(fromTop){if(virtualEnd+idxs.length+1>=this._virtualCount){break}if(physicalTop+physicalItemHeight>=scrollTop){break}idxs.push(ith);physicalTop=physicalTop+physicalItemHeight;ith=(ith+1)%physicalCount}else{if(virtualStart-idxs.length<=0){break}if(physicalTop+this._physicalSize-physicalItemHeight<=scrollBottom){break}idxs.push(ith);physicalTop=physicalTop-physicalItemHeight;ith=ith===0?physicalCount-1:ith-1}}return{indexes:idxs,physicalTop:physicalTop-this._scrollerPaddingTop}},_update:function(itemSet,movingUp){if(itemSet&&itemSet.length===0){return}this._manageFocus();this._assignModels(itemSet);this._updateMetrics(itemSet);if(movingUp){while(movingUp.length){var idx=movingUp.pop();this._physicalTop-=this._getPhysicalSizeIncrement(idx)}}this._positionItems();this._updateScrollerSize();this._increasePoolIfNeeded()},_createPool:function(size){var physicalItems=new Array(size);this._ensureTemplatized();for(var i=0;i=this._scrollBottom&&this._physicalTop<=this._scrollPosition;if(this._physicalSize>=this._optPhysicalSize&&isClientFull){return false}var maxPoolSize=Math.round(this._physicalCount*.5);if(!isClientFull){this._debounceTemplate(this._increasePool.bind(this,maxPoolSize));return true}this._yield(function(){self._increasePool(Math.min(maxPoolSize,Math.max(1,Math.round(50/self._templateCost))))});return true},_yield:function(cb){var g=window;var handle=g.requestIdleCallback?g.requestIdleCallback(cb):g.setTimeout(cb,16);Polymer.dom.addDebouncer({complete:function(){g.cancelIdleCallback?g.cancelIdleCallback(handle):g.clearTimeout(handle);cb()}})},_increasePool:function(missingItems){var nextPhysicalCount=Math.min(this._physicalCount+missingItems,this._virtualCount-this._virtualStart,Math.max(this.maxPhysicalCount,DEFAULT_PHYSICAL_COUNT));var prevPhysicalCount=this._physicalCount;var delta=nextPhysicalCount-prevPhysicalCount;var ts=window.performance.now();if(delta<=0){return}[].push.apply(this._physicalItems,this._createPool(delta));[].push.apply(this._physicalSizes,new Array(delta));this._physicalCount=prevPhysicalCount+delta;if(this._physicalStart>this._physicalEnd&&this._isIndexRendered(this._focusedIndex)&&this._getPhysicalIndex(this._focusedIndex)=0){path=this.as+"."+path.substring(dot+1);el._templateInstance.notifyPath(path,value,true)}else{var currentItem=el._templateInstance[this.as];if(Array.isArray(this.selectedItems)){for(var i=0;i=0){this._focusedIndex=this._focusedIndex+delta}}},this)},_removeItem:function(item){this.$.selector.deselect(item);if(this._focusedItem&&this._focusedItem._templateInstance[this.as]===item){this._removeFocusedItem()}},_iterateItems:function(fn,itemSet){var pidx,vidx,rtn,i;if(arguments.length===2&&itemSet){for(i=0;i=this._physicalStart){return this._virtualStart+(pidx-this._physicalStart)}return this._virtualStart+(this._physicalCount-this._physicalStart)+pidx},_assignModels:function(itemSet){this._iterateItems(function(pidx,vidx){var el=this._physicalItems[pidx];var inst=el._templateInstance;var item=this.items&&this.items[vidx];if(item!=null){inst[this.as]=item;inst.__key__=this._collection.getKey(item);inst[this.selectedAs]=this.$.selector.isSelected(item);inst[this.indexAs]=vidx;inst.tabIndex=this._focusedIndex===vidx?0:-1;this._physicalIndexForKey[inst.__key__]=pidx;el.removeAttribute("hidden")}else{inst.__key__=null;el.setAttribute("hidden","")}},itemSet)},_updateMetrics:function(itemSet){Polymer.dom.flush();var newPhysicalSize=0;var oldPhysicalSize=0;var prevAvgCount=this._physicalAverageCount;var prevPhysicalAvg=this._physicalAverage;this._iterateItems(function(pidx,vidx){oldPhysicalSize+=this._physicalSizes[pidx]||0;this._physicalSizes[pidx]=this._physicalItems[pidx].offsetHeight;newPhysicalSize+=this._physicalSizes[pidx];this._physicalAverageCount+=this._physicalSizes[pidx]?1:0},itemSet);if(this.grid){this._updateGridMetrics();this._physicalSize=Math.ceil(this._physicalCount/this._itemsPerRow)*this._rowHeight}else{this._physicalSize=this._physicalSize+newPhysicalSize-oldPhysicalSize}if(this._physicalAverageCount!==prevAvgCount){this._physicalAverage=Math.round((prevPhysicalAvg*prevAvgCount+newPhysicalSize)/this._physicalAverageCount)}},_updateGridMetrics:function(){this._itemWidth=this._physicalCount>0?this._physicalItems[0].getBoundingClientRect().width:200;this._rowHeight=this._physicalCount>0?this._physicalItems[0].offsetHeight:200;this._itemsPerRow=this._itemWidth?Math.floor(this._viewportWidth/this._itemWidth):this._itemsPerRow},_positionItems:function(){this._adjustScrollPosition();var y=this._physicalTop;if(this.grid){var totalItemWidth=this._itemsPerRow*this._itemWidth;var rowOffset=(this._viewportWidth-totalItemWidth)/2;this._iterateItems(function(pidx,vidx){var modulus=vidx%this._itemsPerRow;var x=Math.floor(modulus*this._itemWidth+rowOffset);this.translate3d(x+"px",y+"px",0,this._physicalItems[pidx]);if(this._shouldRenderNextRow(vidx)){y+=this._rowHeight}})}else{this._iterateItems(function(pidx,vidx){this.translate3d(0,y+"px",0,this._physicalItems[pidx]);y+=this._physicalSizes[pidx]})}},_getPhysicalSizeIncrement:function(pidx){if(!this.grid){return this._physicalSizes[pidx]}if(this._computeVidx(pidx)%this._itemsPerRow!==this._itemsPerRow-1){return 0}return this._rowHeight},_shouldRenderNextRow:function(vidx){return vidx%this._itemsPerRow===this._itemsPerRow-1},_adjustScrollPosition:function(){var deltaHeight=this._virtualStart===0?this._physicalTop:Math.min(this._scrollPosition+this._physicalTop,0);if(deltaHeight){this._physicalTop=this._physicalTop-deltaHeight;if(!IOS_TOUCH_SCROLLING&&this._physicalTop!==0){this._resetScrollPosition(this._scrollTop-deltaHeight)}}},_resetScrollPosition:function(pos){if(this.scrollTarget){this._scrollTop=pos;this._scrollPosition=this._scrollTop}},_updateScrollerSize:function(forceUpdate){if(this.grid){this._estScrollHeight=this._virtualRowCount*this._rowHeight}else{this._estScrollHeight=this._physicalBottom+Math.max(this._virtualCount-this._physicalCount-this._virtualStart,0)*this._physicalAverage}forceUpdate=forceUpdate||this._scrollHeight===0;forceUpdate=forceUpdate||this._scrollPosition>=this._estScrollHeight-this._physicalSize;forceUpdate=forceUpdate||this.grid&&this.$.items.style.height=this._optPhysicalSize){this.$.items.style.height=this._estScrollHeight+"px";this._scrollHeight=this._estScrollHeight}},scrollToItem:function(item){return this.scrollToIndex(this.items.indexOf(item))},scrollToIndex:function(idx){if(typeof idx!=="number"||idx<0||idx>this.items.length-1){return}Polymer.dom.flush();if(this._physicalCount===0){return}idx=Math.min(Math.max(idx,0),this._virtualCount-1);if(!this._isIndexRendered(idx)||idx>=this._maxVirtualStart){this._virtualStart=this.grid?idx-this._itemsPerRow*2:idx-1}this._manageFocus();this._assignModels();this._updateMetrics();this._physicalTop=Math.floor(this._virtualStart/this._itemsPerRow)*this._physicalAverage;var currentTopItem=this._physicalStart;var currentVirtualItem=this._virtualStart;var targetOffsetTop=0;var hiddenContentSize=this._hiddenContentSize;while(currentVirtualItem0&&delta<100){return}Polymer.dom.addDebouncer(this.debounce("_debounceTemplate",function(){this.updateViewportBoundaries();this._render();if(this._isVisible){this.toggleScrollListener(true);if(this._physicalCount>0){this._resetAverage();this.scrollToIndex(this.firstVisibleIndex)}}else{this.toggleScrollListener(false)}}.bind(this),1))},_getModelFromItem:function(item){var key=this._collection.getKey(item);var pidx=this._physicalIndexForKey[key];if(pidx!=null){return this._physicalItems[pidx]._templateInstance}return null},_getNormalizedItem:function(item){if(this._collection.getKey(item)===undefined){if(typeof item==="number"){item=this.items[item];if(!item){throw new RangeError(" not found")}return item}throw new TypeError(" should be a valid item")}return item},selectItem:function(item){item=this._getNormalizedItem(item);var model=this._getModelFromItem(item);if(!this.multiSelection&&this.selectedItem){this.deselectItem(this.selectedItem)}if(model){model[this.selectedAs]=true}this.$.selector.select(item);this.updateSizeForItem(item)},deselectItem:function(item){item=this._getNormalizedItem(item);var model=this._getModelFromItem(item);if(model){model[this.selectedAs]=false}this.$.selector.deselect(item);this.updateSizeForItem(item)},toggleSelectionForItem:function(item){item=this._getNormalizedItem(item);if(this.$.selector.isSelected(item)){this.deselectItem(item)}else{this.selectItem(item)}},clearSelection:function(){function unselect(item){var model=this._getModelFromItem(item);if(model){model[this.selectedAs]=false}}if(Array.isArray(this.selectedItems)){this.selectedItems.forEach(unselect,this)}else if(this.selectedItem){unselect.call(this,this.selectedItem)}this.$.selector.clearSelection()},_selectionEnabledChanged:function(selectionEnabled){var handler=selectionEnabled?this.listen:this.unlisten;handler.call(this,this,"tap","_selectionHandler")},_selectionHandler:function(e){var model=this.modelForElement(e.target);if(!model){return}var modelTabIndex,activeElTabIndex;var target=Polymer.dom(e).path[0];var activeEl=Polymer.dom(this.domHost?this.domHost.root:document).activeElement;var physicalItem=this._physicalItems[this._getPhysicalIndex(model[this.indexAs])]; -activeElTabIndex=activeEl?activeEl.tabIndex:-1;model.tabIndex=modelTabIndex;if(activeEl&&physicalItem!==activeEl&&physicalItem.contains(activeEl)&&activeElTabIndex!==SECRET_TABINDEX){return}this.toggleSelectionForItem(model[this.as])},_multiSelectionChanged:function(multiSelection){this.clearSelection();this.$.selector.multi=multiSelection},updateSizeForItem:function(item){item=this._getNormalizedItem(item);var key=this._collection.getKey(item);var pidx=this._physicalIndexForKey[key];if(pidx!=null){this._updateMetrics([pidx]);this._positionItems()}},_manageFocus:function(){var fidx=this._focusedIndex;if(fidx>=0&&fidx0&&this._physicalCount>0){this._focusedIndex=this._virtualStart;this._focusedItem=this._physicalItems[this._physicalStart]}},_isIndexRendered:function(idx){return idx>=this._virtualStart&&idx<=this._virtualEnd},_isIndexVisible:function(idx){return idx>=this.firstVisibleIndex&&idx<=this.lastVisibleIndex},_getPhysicalIndex:function(idx){return this._physicalIndexForKey[this._collection.getKey(this._getNormalizedItem(idx))]},_focusPhysicalItem:function(idx){if(idx<0||idx>=this._virtualCount){return}this._restoreFocusedItem();if(!this._isIndexRendered(idx)){this.scrollToIndex(idx)}var physicalItem=this._physicalItems[this._getPhysicalIndex(idx)];var model=physicalItem._templateInstance;var focusable;model.tabIndex=SECRET_TABINDEX;if(physicalItem.tabIndex===SECRET_TABINDEX){focusable=physicalItem}if(!focusable){focusable=Polymer.dom(physicalItem).querySelector('[tabindex="'+SECRET_TABINDEX+'"]')}model.tabIndex=0;this._focusedIndex=idx;focusable&&focusable.focus()},_removeFocusedItem:function(){if(this._offscreenFocusedItem){Polymer.dom(this).removeChild(this._offscreenFocusedItem)}this._offscreenFocusedItem=null;this._focusBackfillItem=null;this._focusedItem=null;this._focusedIndex=-1},_createFocusBackfillItem:function(){var pidx,fidx=this._focusedIndex;if(this._offscreenFocusedItem||fidx<0){return}if(!this._focusBackfillItem){var stampedTemplate=this.stamp(null);this._focusBackfillItem=stampedTemplate.root.querySelector("*");Polymer.dom(this).appendChild(stampedTemplate.root)}pidx=this._getPhysicalIndex(fidx);if(pidx!=null){this._offscreenFocusedItem=this._physicalItems[pidx];this._physicalItems[pidx]=this._focusBackfillItem;this.translate3d(0,HIDDEN_Y,0,this._offscreenFocusedItem)}},_restoreFocusedItem:function(){var pidx,fidx=this._focusedIndex;if(!this._offscreenFocusedItem||this._focusedIndex<0){return}this._assignModels();pidx=this._getPhysicalIndex(fidx);if(pidx!=null){this._focusBackfillItem=this._physicalItems[pidx];this._physicalItems[pidx]=this._offscreenFocusedItem;this._offscreenFocusedItem=null;this.translate3d(0,HIDDEN_Y,0,this._focusBackfillItem)}},_didFocus:function(e){var targetModel=this.modelForElement(e.target);var focusedModel=this._focusedItem?this._focusedItem._templateInstance:null;var hasOffscreenFocusedItem=this._offscreenFocusedItem!==null;var fidx=this._focusedIndex;if(!targetModel||!focusedModel){return}if(focusedModel===targetModel){if(!this._isIndexVisible(fidx)){this.scrollToIndex(fidx)}}else{this._restoreFocusedItem();focusedModel.tabIndex=-1;targetModel.tabIndex=0;fidx=targetModel[this.indexAs];this._focusedIndex=fidx;this._focusedItem=this._physicalItems[this._getPhysicalIndex(fidx)];if(hasOffscreenFocusedItem&&!this._offscreenFocusedItem){this._update()}}},_didMoveUp:function(){this._focusPhysicalItem(this._focusedIndex-1)},_didMoveDown:function(e){e.detail.keyboardEvent.preventDefault();this._focusPhysicalItem(this._focusedIndex+1)},_didEnter:function(e){this._focusPhysicalItem(this._focusedIndex);this._selectionHandler(e.detail.keyboardEvent)}})})(); +if(target.localName==="input"||target.localName==="button"||target.localName==="select"){return}modelTabIndex=model.tabIndex;model.tabIndex=SECRET_TABINDEX;activeElTabIndex=activeEl?activeEl.tabIndex:-1;model.tabIndex=modelTabIndex;if(activeEl&&physicalItem!==activeEl&&physicalItem.contains(activeEl)&&activeElTabIndex!==SECRET_TABINDEX){return}this.toggleSelectionForItem(model[this.as])},_multiSelectionChanged:function(multiSelection){this.clearSelection();this.$.selector.multi=multiSelection},updateSizeForItem:function(item){item=this._getNormalizedItem(item);var key=this._collection.getKey(item);var pidx=this._physicalIndexForKey[key];if(pidx!=null){this._updateMetrics([pidx]);this._positionItems()}},_manageFocus:function(){var fidx=this._focusedIndex;if(fidx>=0&&fidx0&&this._physicalCount>0){this._focusedIndex=this._virtualStart;this._focusedItem=this._physicalItems[this._physicalStart]}},_isIndexRendered:function(idx){return idx>=this._virtualStart&&idx<=this._virtualEnd},_isIndexVisible:function(idx){return idx>=this.firstVisibleIndex&&idx<=this.lastVisibleIndex},_getPhysicalIndex:function(idx){return this._physicalIndexForKey[this._collection.getKey(this._getNormalizedItem(idx))]},_focusPhysicalItem:function(idx){if(idx<0||idx>=this._virtualCount){return}this._restoreFocusedItem();if(!this._isIndexRendered(idx)){this.scrollToIndex(idx)}var physicalItem=this._physicalItems[this._getPhysicalIndex(idx)];var model=physicalItem._templateInstance;var focusable;model.tabIndex=SECRET_TABINDEX;if(physicalItem.tabIndex===SECRET_TABINDEX){focusable=physicalItem}if(!focusable){focusable=Polymer.dom(physicalItem).querySelector('[tabindex="'+SECRET_TABINDEX+'"]')}model.tabIndex=0;this._focusedIndex=idx;focusable&&focusable.focus()},_removeFocusedItem:function(){if(this._offscreenFocusedItem){Polymer.dom(this).removeChild(this._offscreenFocusedItem)}this._offscreenFocusedItem=null;this._focusBackfillItem=null;this._focusedItem=null;this._focusedIndex=-1},_createFocusBackfillItem:function(){var fidx=this._focusedIndex;var pidx=this._getPhysicalIndex(fidx);if(this._offscreenFocusedItem||pidx==null||fidx<0){return}if(!this._focusBackfillItem){var stampedTemplate=this.stamp(null);this._focusBackfillItem=stampedTemplate.root.querySelector("*");Polymer.dom(this).appendChild(stampedTemplate.root)}this._offscreenFocusedItem=this._physicalItems[pidx];this._offscreenFocusedItem._templateInstance.tabIndex=0;this._physicalItems[pidx]=this._focusBackfillItem;this.translate3d(0,HIDDEN_Y,0,this._offscreenFocusedItem)},_restoreFocusedItem:function(){var pidx,fidx=this._focusedIndex;if(!this._offscreenFocusedItem||this._focusedIndex<0){return}this._assignModels();pidx=this._getPhysicalIndex(fidx);if(pidx!=null){this._focusBackfillItem=this._physicalItems[pidx];this._focusBackfillItem._templateInstance.tabIndex=-1;this._physicalItems[pidx]=this._offscreenFocusedItem;this._offscreenFocusedItem=null;this.translate3d(0,HIDDEN_Y,0,this._focusBackfillItem)}},_didFocus:function(e){var targetModel=this.modelForElement(e.target);var focusedModel=this._focusedItem?this._focusedItem._templateInstance:null;var hasOffscreenFocusedItem=this._offscreenFocusedItem!==null;var fidx=this._focusedIndex;if(!targetModel||!focusedModel){return}if(focusedModel===targetModel){if(!this._isIndexVisible(fidx)){this.scrollToIndex(fidx)}}else{this._restoreFocusedItem();focusedModel.tabIndex=-1;targetModel.tabIndex=0;fidx=targetModel[this.indexAs];this._focusedIndex=fidx;this._focusedItem=this._physicalItems[this._getPhysicalIndex(fidx)];if(hasOffscreenFocusedItem&&!this._offscreenFocusedItem){this._update()}}},_didMoveUp:function(){this._focusPhysicalItem(this._focusedIndex-1)},_didMoveDown:function(e){e.detail.keyboardEvent.preventDefault();this._focusPhysicalItem(this._focusedIndex+1)},_didEnter:function(e){this._focusPhysicalItem(this._focusedIndex);this._selectionHandler(e.detail.keyboardEvent)}})})(); // 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. @@ -39,25 +39,24 @@ cr.define("downloads",function(){var DangerType={NOT_DANGEROUS:"NOT_DANGEROUS",D // 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. -var ActionLink=document.registerElement("action-link",{prototype:{__proto__:HTMLAnchorElement.prototype,createdCallback:function(){this.tabIndex=this.disabled?-1:0;if(!this.hasAttribute("role"))this.setAttribute("role","link");this.addEventListener("keydown",function(e){if(!this.disabled&&e.key=="Enter"&&!this.href){window.setTimeout(this.click.bind(this),0)}});function preventDefault(e){e.preventDefault()}function removePreventDefault(){document.removeEventListener("selectstart",preventDefault);document.removeEventListener("mouseup",removePreventDefault)}this.addEventListener("mousedown",function(){document.addEventListener("selectstart",preventDefault);document.addEventListener("mouseup",removePreventDefault);if(document.activeElement!=this)this.classList.add("no-outline")});this.addEventListener("blur",function(){this.classList.remove("no-outline")})},set disabled(disabled){if(disabled)HTMLAnchorElement.prototype.setAttribute.call(this,"disabled","");else HTMLAnchorElement.prototype.removeAttribute.call(this,"disabled");this.tabIndex=disabled?-1:0},get disabled(){return this.hasAttribute("disabled")},setAttribute:function(attr,val){if(attr.toLowerCase()=="disabled")this.disabled=true;else HTMLAnchorElement.prototype.setAttribute.apply(this,arguments)},removeAttribute:function(attr){if(attr.toLowerCase()=="disabled")this.disabled=false;else HTMLAnchorElement.prototype.removeAttribute.apply(this,arguments)}},"extends":"a"});(function(){var metaDatas={};var metaArrays={};var singleton=null;Polymer.IronMeta=Polymer({is:"iron-meta",properties:{type:{type:String,value:"default",observer:"_typeChanged"},key:{type:String,observer:"_keyChanged"},value:{type:Object,notify:true,observer:"_valueChanged"},self:{type:Boolean,observer:"_selfChanged"},list:{type:Array,notify:true}},hostAttributes:{hidden:true},factoryImpl:function(config){if(config){for(var n in config){switch(n){case"type":case"key":case"value":this[n]=config[n];break}}}},created:function(){this._metaDatas=metaDatas;this._metaArrays=metaArrays},_keyChanged:function(key,old){this._resetRegistration(old)},_valueChanged:function(value){this._resetRegistration(this.key)},_selfChanged:function(self){if(self){this.value=this}},_typeChanged:function(type){this._unregisterKey(this.key);if(!metaDatas[type]){metaDatas[type]={}}this._metaData=metaDatas[type];if(!metaArrays[type]){metaArrays[type]=[]}this.list=metaArrays[type];this._registerKeyValue(this.key,this.value)},byKey:function(key){return this._metaData&&this._metaData[key]},_resetRegistration:function(oldKey){this._unregisterKey(oldKey);this._registerKeyValue(this.key,this.value)},_unregisterKey:function(key){this._unregister(key,this._metaData,this.list)},_registerKeyValue:function(key,value){this._register(key,value,this._metaData,this.list)},_register:function(key,value,data,list){if(key&&data&&value!==undefined){data[key]=value;list.push(value)}},_unregister:function(key,data,list){if(key&&data){if(key in data){var value=data[key];delete data[key];this.arrayDelete(list,value)}}}});Polymer.IronMeta.getIronMeta=function getIronMeta(){if(singleton===null){singleton=new Polymer.IronMeta}return singleton};Polymer.IronMetaQuery=Polymer({is:"iron-meta-query",properties:{type:{type:String,value:"default",observer:"_typeChanged"},key:{type:String,observer:"_keyChanged"},value:{type:Object,notify:true,readOnly:true},list:{type:Array,notify:true}},factoryImpl:function(config){if(config){for(var n in config){switch(n){case"type":case"key":this[n]=config[n];break}}}},created:function(){this._metaDatas=metaDatas;this._metaArrays=metaArrays},_keyChanged:function(key){this._setValue(this._metaData&&this._metaData[key])},_typeChanged:function(type){this._metaData=metaDatas[type];this.list=metaArrays[type];if(this.key){this._keyChanged(this.key)}},byKey:function(key){return this._metaData&&this._metaData[key]}})})();Polymer({is:"iron-icon",properties:{icon:{type:String,observer:"_iconChanged"},theme:{type:String,observer:"_updateIcon"},src:{type:String,observer:"_srcChanged"},_meta:{value:Polymer.Base.create("iron-meta",{type:"iconset"}),observer:"_updateIcon"}},_DEFAULT_ICONSET:"icons",_iconChanged:function(icon){var parts=(icon||"").split(":");this._iconName=parts.pop();this._iconsetName=parts.pop()||this._DEFAULT_ICONSET;this._updateIcon()},_srcChanged:function(src){this._updateIcon()},_usesIconset:function(){return this.icon||!this.src},_updateIcon:function(){if(this._usesIconset()){if(this._img&&this._img.parentNode){Polymer.dom(this.root).removeChild(this._img)}if(this._iconName===""){if(this._iconset){this._iconset.removeIcon(this)}}else if(this._iconsetName&&this._meta){this._iconset=this._meta.byKey(this._iconsetName);if(this._iconset){this._iconset.applyIcon(this,this._iconName,this.theme);this.unlisten(window,"iron-iconset-added","_updateIcon")}else{this.listen(window,"iron-iconset-added","_updateIcon")}}}else{if(this._iconset){this._iconset.removeIcon(this)}if(!this._img){this._img=document.createElement("img");this._img.style.width="100%";this._img.style.height="100%";this._img.draggable=false}this._img.src=this.src;Polymer.dom(this.root).appendChild(this._img)}}});Polymer.IronControlState={properties:{focused:{type:Boolean,value:false,notify:true,readOnly:true,reflectToAttribute:true},disabled:{type:Boolean,value:false,notify:true,observer:"_disabledChanged",reflectToAttribute:true},_oldTabIndex:{type:Number},_boundFocusBlurHandler:{type:Function,value:function(){return this._focusBlurHandler.bind(this)}}},observers:["_changedControlState(focused, disabled)"],ready:function(){this.addEventListener("focus",this._boundFocusBlurHandler,true);this.addEventListener("blur",this._boundFocusBlurHandler,true)},_focusBlurHandler:function(event){if(event.target===this){this._setFocused(event.type==="focus")}else if(!this.shadowRoot){var target=Polymer.dom(event).localTarget;if(!this.isLightDescendant(target)){this.fire(event.type,{sourceEvent:event},{node:this,bubbles:event.bubbles,cancelable:event.cancelable})}}},_disabledChanged:function(disabled,old){this.setAttribute("aria-disabled",disabled?"true":"false");this.style.pointerEvents=disabled?"none":"";if(disabled){this._oldTabIndex=this.tabIndex;this._setFocused(false);this.tabIndex=-1;this.blur()}else if(this._oldTabIndex!==undefined){this.tabIndex=this._oldTabIndex}},_changedControlState:function(){if(this._controlStateChanged){this._controlStateChanged()}}};Polymer.IronButtonStateImpl={properties:{pressed:{type:Boolean,readOnly:true,value:false,reflectToAttribute:true,observer:"_pressedChanged"},toggles:{type:Boolean,value:false,reflectToAttribute:true},active:{type:Boolean,value:false,notify:true,reflectToAttribute:true},pointerDown:{type:Boolean,readOnly:true,value:false},receivedFocusFromKeyboard:{type:Boolean,readOnly:true},ariaActiveAttribute:{type:String,value:"aria-pressed",observer:"_ariaActiveAttributeChanged"}},listeners:{down:"_downHandler",up:"_upHandler",tap:"_tapHandler"},observers:["_detectKeyboardFocus(focused)","_activeChanged(active, ariaActiveAttribute)"],keyBindings:{"enter:keydown":"_asyncClick","space:keydown":"_spaceKeyDownHandler","space:keyup":"_spaceKeyUpHandler"},_mouseEventRe:/^mouse/,_tapHandler:function(){if(this.toggles){this._userActivate(!this.active)}else{this.active=false}},_detectKeyboardFocus:function(focused){this._setReceivedFocusFromKeyboard(!this.pointerDown&&focused)},_userActivate:function(active){if(this.active!==active){this.active=active;this.fire("change")}},_downHandler:function(event){this._setPointerDown(true);this._setPressed(true);this._setReceivedFocusFromKeyboard(false)},_upHandler:function(){this._setPointerDown(false);this._setPressed(false)},_spaceKeyDownHandler:function(event){var keyboardEvent=event.detail.keyboardEvent;var target=Polymer.dom(keyboardEvent).localTarget;if(this.isLightDescendant(target))return;keyboardEvent.preventDefault();keyboardEvent.stopImmediatePropagation();this._setPressed(true)},_spaceKeyUpHandler:function(event){var keyboardEvent=event.detail.keyboardEvent;var target=Polymer.dom(keyboardEvent).localTarget;if(this.isLightDescendant(target))return;if(this.pressed){this._asyncClick()}this._setPressed(false)},_asyncClick:function(){this.async(function(){this.click()},1)},_pressedChanged:function(pressed){this._changedButtonState()},_ariaActiveAttributeChanged:function(value,oldValue){if(oldValue&&oldValue!=value&&this.hasAttribute(oldValue)){this.removeAttribute(oldValue)}},_activeChanged:function(active,ariaActiveAttribute){if(this.toggles){this.setAttribute(this.ariaActiveAttribute,active?"true":"false")}else{this.removeAttribute(this.ariaActiveAttribute)}this._changedButtonState()},_controlStateChanged:function(){if(this.disabled){this._setPressed(false)}else{this._changedButtonState()}},_changedButtonState:function(){if(this._buttonStateChanged){this._buttonStateChanged()}}};Polymer.IronButtonState=[Polymer.IronA11yKeysBehavior,Polymer.IronButtonStateImpl];(function(){var Utility={distance:function(x1,y1,x2,y2){var xDelta=x1-x2;var yDelta=y1-y2;return Math.sqrt(xDelta*xDelta+yDelta*yDelta)},now:window.performance&&window.performance.now?window.performance.now.bind(window.performance):Date.now};function ElementMetrics(element){this.element=element;this.width=this.boundingRect.width;this.height=this.boundingRect.height;this.size=Math.max(this.width,this.height)}ElementMetrics.prototype={get boundingRect(){return this.element.getBoundingClientRect()},furthestCornerDistanceFrom:function(x,y){var topLeft=Utility.distance(x,y,0,0);var topRight=Utility.distance(x,y,this.width,0);var bottomLeft=Utility.distance(x,y,0,this.height);var bottomRight=Utility.distance(x,y,this.width,this.height);return Math.max(topLeft,topRight,bottomLeft,bottomRight)}};function Ripple(element){this.element=element;this.color=window.getComputedStyle(element).color;this.wave=document.createElement("div");this.waveContainer=document.createElement("div");this.wave.style.backgroundColor=this.color;this.wave.classList.add("wave");this.waveContainer.classList.add("wave-container");Polymer.dom(this.waveContainer).appendChild(this.wave);this.resetInteractionState()}Ripple.MAX_RADIUS=300;Ripple.prototype={get recenters(){return this.element.recenters},get center(){return this.element.center},get mouseDownElapsed(){var elapsed;if(!this.mouseDownStart){return 0}elapsed=Utility.now()-this.mouseDownStart;if(this.mouseUpStart){elapsed-=this.mouseUpElapsed}return elapsed},get mouseUpElapsed(){return this.mouseUpStart?Utility.now()-this.mouseUpStart:0},get mouseDownElapsedSeconds(){return this.mouseDownElapsed/1e3},get mouseUpElapsedSeconds(){return this.mouseUpElapsed/1e3},get mouseInteractionSeconds(){return this.mouseDownElapsedSeconds+this.mouseUpElapsedSeconds},get initialOpacity(){return this.element.initialOpacity},get opacityDecayVelocity(){return this.element.opacityDecayVelocity},get radius(){var width2=this.containerMetrics.width*this.containerMetrics.width;var height2=this.containerMetrics.height*this.containerMetrics.height;var waveRadius=Math.min(Math.sqrt(width2+height2),Ripple.MAX_RADIUS)*1.1+5;var duration=1.1-.2*(waveRadius/Ripple.MAX_RADIUS);var timeNow=this.mouseInteractionSeconds/duration;var size=waveRadius*(1-Math.pow(80,-timeNow));return Math.abs(size)},get opacity(){if(!this.mouseUpStart){return this.initialOpacity}return Math.max(0,this.initialOpacity-this.mouseUpElapsedSeconds*this.opacityDecayVelocity)},get outerOpacity(){var outerOpacity=this.mouseUpElapsedSeconds*.3;var waveOpacity=this.opacity;return Math.max(0,Math.min(outerOpacity,waveOpacity))},get isOpacityFullyDecayed(){return this.opacity<.01&&this.radius>=Math.min(this.maxRadius,Ripple.MAX_RADIUS)},get isRestingAtMaxRadius(){return this.opacity>=this.initialOpacity&&this.radius>=Math.min(this.maxRadius,Ripple.MAX_RADIUS)},get isAnimationComplete(){return this.mouseUpStart?this.isOpacityFullyDecayed:this.isRestingAtMaxRadius},get translationFraction(){return Math.min(1,this.radius/this.containerMetrics.size*2/Math.sqrt(2))},get xNow(){if(this.xEnd){return this.xStart+this.translationFraction*(this.xEnd-this.xStart)}return this.xStart},get yNow(){if(this.yEnd){return this.yStart+this.translationFraction*(this.yEnd-this.yStart)}return this.yStart},get isMouseDown(){return this.mouseDownStart&&!this.mouseUpStart},resetInteractionState:function(){this.maxRadius=0;this.mouseDownStart=0;this.mouseUpStart=0;this.xStart=0;this.yStart=0;this.xEnd=0;this.yEnd=0;this.slideDistance=0;this.containerMetrics=new ElementMetrics(this.element)},draw:function(){var scale;var translateString;var dx;var dy;this.wave.style.opacity=this.opacity;scale=this.radius/(this.containerMetrics.size/2);dx=this.xNow-this.containerMetrics.width/2;dy=this.yNow-this.containerMetrics.height/2;this.waveContainer.style.webkitTransform="translate("+dx+"px, "+dy+"px)";this.waveContainer.style.transform="translate3d("+dx+"px, "+dy+"px, 0)";this.wave.style.webkitTransform="scale("+scale+","+scale+")";this.wave.style.transform="scale3d("+scale+","+scale+",1)"},downAction:function(event){var xCenter=this.containerMetrics.width/2;var yCenter=this.containerMetrics.height/2;this.resetInteractionState();this.mouseDownStart=Utility.now();if(this.center){this.xStart=xCenter;this.yStart=yCenter;this.slideDistance=Utility.distance(this.xStart,this.yStart,this.xEnd,this.yEnd)}else{this.xStart=event?event.detail.x-this.containerMetrics.boundingRect.left:this.containerMetrics.width/2;this.yStart=event?event.detail.y-this.containerMetrics.boundingRect.top:this.containerMetrics.height/2}if(this.recenters){this.xEnd=xCenter;this.yEnd=yCenter;this.slideDistance=Utility.distance(this.xStart,this.yStart,this.xEnd,this.yEnd)}this.maxRadius=this.containerMetrics.furthestCornerDistanceFrom(this.xStart,this.yStart);this.waveContainer.style.top=(this.containerMetrics.height-this.containerMetrics.size)/2+"px";this.waveContainer.style.left=(this.containerMetrics.width-this.containerMetrics.size)/2+"px";this.waveContainer.style.width=this.containerMetrics.size+"px";this.waveContainer.style.height=this.containerMetrics.size+"px"},upAction:function(event){if(!this.isMouseDown){return}this.mouseUpStart=Utility.now()},remove:function(){Polymer.dom(this.waveContainer.parentNode).removeChild(this.waveContainer)}};Polymer({is:"paper-ripple",behaviors:[Polymer.IronA11yKeysBehavior],properties:{initialOpacity:{type:Number,value:.25},opacityDecayVelocity:{type:Number,value:.8},recenters:{type:Boolean,value:false},center:{type:Boolean,value:false},ripples:{type:Array,value:function(){return[]}},animating:{type:Boolean,readOnly:true,reflectToAttribute:true,value:false},holdDown:{type:Boolean,value:false,observer:"_holdDownChanged"},noink:{type:Boolean,value:false},_animating:{type:Boolean},_boundAnimate:{type:Function,value:function(){return this.animate.bind(this)}}},get target(){return this.keyEventTarget},keyBindings:{"enter:keydown":"_onEnterKeydown","space:keydown":"_onSpaceKeydown","space:keyup":"_onSpaceKeyup"},attached:function(){if(this.parentNode.nodeType==11){this.keyEventTarget=Polymer.dom(this).getOwnerRoot().host}else{this.keyEventTarget=this.parentNode}var keyEventTarget=this.keyEventTarget;this.listen(keyEventTarget,"up","uiUpAction");this.listen(keyEventTarget,"down","uiDownAction")},detached:function(){this.unlisten(this.keyEventTarget,"up","uiUpAction");this.unlisten(this.keyEventTarget,"down","uiDownAction");this.keyEventTarget=null},get shouldKeepAnimating(){for(var index=0;index0){return}var ripple=this.addRipple();ripple.downAction(event);if(!this._animating){this._animating=true;this.animate()}},uiUpAction:function(event){if(!this.noink){this.upAction(event)}},upAction:function(event){if(this.holdDown){return}this.ripples.forEach(function(ripple){ripple.upAction(event)});this._animating=true;this.animate()},onAnimationComplete:function(){this._animating=false;this.$.background.style.backgroundColor=null;this.fire("transitionend")},addRipple:function(){var ripple=new Ripple(this);Polymer.dom(this.$.waves).appendChild(ripple.waveContainer);this.$.background.style.backgroundColor=ripple.color;this.ripples.push(ripple);this._setAnimating(true);return ripple},removeRipple:function(ripple){var rippleIndex=this.ripples.indexOf(ripple);if(rippleIndex<0){return}this.ripples.splice(rippleIndex,1);ripple.remove();if(!this.ripples.length){this._setAnimating(false)}},animate:function(){if(!this._animating){return}var index;var ripple;for(index=0;index=Math.min(this.maxRadius,Ripple.MAX_RADIUS)},get isRestingAtMaxRadius(){return this.opacity>=this.initialOpacity&&this.radius>=Math.min(this.maxRadius,Ripple.MAX_RADIUS)},get isAnimationComplete(){return this.mouseUpStart?this.isOpacityFullyDecayed:this.isRestingAtMaxRadius},get translationFraction(){return Math.min(1,this.radius/this.containerMetrics.size*2/Math.sqrt(2))},get xNow(){if(this.xEnd){return this.xStart+this.translationFraction*(this.xEnd-this.xStart)}return this.xStart},get yNow(){if(this.yEnd){return this.yStart+this.translationFraction*(this.yEnd-this.yStart)}return this.yStart},get isMouseDown(){return this.mouseDownStart&&!this.mouseUpStart},resetInteractionState:function(){this.maxRadius=0;this.mouseDownStart=0;this.mouseUpStart=0;this.xStart=0;this.yStart=0;this.xEnd=0;this.yEnd=0;this.slideDistance=0;this.containerMetrics=new ElementMetrics(this.element)},draw:function(){var scale;var translateString;var dx;var dy;this.wave.style.opacity=this.opacity;scale=this.radius/(this.containerMetrics.size/2);dx=this.xNow-this.containerMetrics.width/2;dy=this.yNow-this.containerMetrics.height/2;this.waveContainer.style.webkitTransform="translate("+dx+"px, "+dy+"px)";this.waveContainer.style.transform="translate3d("+dx+"px, "+dy+"px, 0)";this.wave.style.webkitTransform="scale("+scale+","+scale+")";this.wave.style.transform="scale3d("+scale+","+scale+",1)"},downAction:function(event){var xCenter=this.containerMetrics.width/2;var yCenter=this.containerMetrics.height/2;this.resetInteractionState();this.mouseDownStart=Utility.now();if(this.center){this.xStart=xCenter;this.yStart=yCenter;this.slideDistance=Utility.distance(this.xStart,this.yStart,this.xEnd,this.yEnd)}else{this.xStart=event?event.detail.x-this.containerMetrics.boundingRect.left:this.containerMetrics.width/2;this.yStart=event?event.detail.y-this.containerMetrics.boundingRect.top:this.containerMetrics.height/2}if(this.recenters){this.xEnd=xCenter;this.yEnd=yCenter;this.slideDistance=Utility.distance(this.xStart,this.yStart,this.xEnd,this.yEnd)}this.maxRadius=this.containerMetrics.furthestCornerDistanceFrom(this.xStart,this.yStart);this.waveContainer.style.top=(this.containerMetrics.height-this.containerMetrics.size)/2+"px";this.waveContainer.style.left=(this.containerMetrics.width-this.containerMetrics.size)/2+"px";this.waveContainer.style.width=this.containerMetrics.size+"px";this.waveContainer.style.height=this.containerMetrics.size+"px"},upAction:function(event){if(!this.isMouseDown){return}this.mouseUpStart=Utility.now()},remove:function(){Polymer.dom(this.waveContainer.parentNode).removeChild(this.waveContainer)}};Polymer({is:"paper-ripple",behaviors:[Polymer.IronA11yKeysBehavior],properties:{initialOpacity:{type:Number,value:.25},opacityDecayVelocity:{type:Number,value:.8},recenters:{type:Boolean,value:false},center:{type:Boolean,value:false},ripples:{type:Array,value:function(){return[]}},animating:{type:Boolean,readOnly:true,reflectToAttribute:true,value:false},holdDown:{type:Boolean,value:false,observer:"_holdDownChanged"},noink:{type:Boolean,value:false},_animating:{type:Boolean},_boundAnimate:{type:Function,value:function(){return this.animate.bind(this)}}},get target(){return this.keyEventTarget},keyBindings:{"enter:keydown":"_onEnterKeydown","space:keydown":"_onSpaceKeydown","space:keyup":"_onSpaceKeyup"},attached:function(){if(this.parentNode.nodeType==11){this.keyEventTarget=Polymer.dom(this).getOwnerRoot().host}else{this.keyEventTarget=this.parentNode}var keyEventTarget=this.keyEventTarget;this.listen(keyEventTarget,"up","uiUpAction");this.listen(keyEventTarget,"down","uiDownAction")},detached:function(){this.unlisten(this.keyEventTarget,"up","uiUpAction");this.unlisten(this.keyEventTarget,"down","uiDownAction");this.keyEventTarget=null},get shouldKeepAnimating(){for(var index=0;index0){return}var ripple=this.addRipple();ripple.downAction(event);if(!this._animating){this._animating=true;this.animate()}},uiUpAction:function(event){if(!this.noink){this.upAction(event)}},upAction:function(event){if(this.holdDown){return}this.ripples.forEach(function(ripple){ripple.upAction(event)});this._animating=true;this.animate()},onAnimationComplete:function(){this._animating=false;this.$.background.style.backgroundColor=null;this.fire("transitionend")},addRipple:function(){var ripple=new Ripple(this);Polymer.dom(this.$.waves).appendChild(ripple.waveContainer);this.$.background.style.backgroundColor=ripple.color;this.ripples.push(ripple);this._setAnimating(true);return ripple},removeRipple:function(ripple){var rippleIndex=this.ripples.indexOf(ripple);if(rippleIndex<0){return}this.ripples.splice(rippleIndex,1);ripple.remove();if(!this.ripples.length){this._setAnimating(false)}},animate:function(){if(!this._animating){return}var index;var ripple;for(index=0;index=-1},computeTag_:function(){switch(this.data.state){case downloads.States.CANCELLED:return loadTimeData.getString("statusCancelled");case downloads.States.INTERRUPTED:return this.data.last_reason_text;case downloads.States.COMPLETE:return this.data.file_externally_removed?loadTimeData.getString("statusRemoved"):""}return""},isIndeterminate_:function(){return this.data.percent==-1},observeControlledBy_:function(){this.$["controlled-by"].innerHTML=this.controlledBy_},observeIsDangerous_:function(){if(!this.data)return;if(this.isDangerous_){this.$.url.removeAttribute("href")}else{this.$.url.href=assert(this.data.url);var filePath=encodeURIComponent(this.data.file_path);var scaleFactor="?scale="+window.devicePixelRatio+"x";this.$["file-icon"].src="chrome://fileicon/"+filePath+scaleFactor}},onCancelTap_:function(){downloads.ActionService.getInstance().cancel(this.data.id)},onDiscardDangerousTap_:function(){downloads.ActionService.getInstance().discardDangerous(this.data.id)},onDragStart_:function(e){e.preventDefault();downloads.ActionService.getInstance().drag(this.data.id)},onFileLinkTap_:function(e){e.preventDefault();downloads.ActionService.getInstance().openFile(this.data.id)},onPauseOrResumeTap_:function(){if(this.isInProgress_)downloads.ActionService.getInstance().pause(this.data.id);else downloads.ActionService.getInstance().resume(this.data.id)},onRemoveTap_:function(){downloads.ActionService.getInstance().remove(this.data.id)},onRetryTap_:function(){downloads.ActionService.getInstance().download(this.data.url)},onSaveDangerousTap_:function(){downloads.ActionService.getInstance().saveDangerous(this.data.id)},onShowTap_:function(){downloads.ActionService.getInstance().show(this.data.id)}});return{Item:Item}});Polymer.PaperItemBehaviorImpl={hostAttributes:{role:"option",tabindex:"0"}};Polymer.PaperItemBehavior=[Polymer.IronButtonState,Polymer.IronControlState,Polymer.PaperItemBehaviorImpl];Polymer({is:"paper-item",behaviors:[Polymer.PaperItemBehavior]});Polymer.IronSelection=function(selectCallback){this.selection=[];this.selectCallback=selectCallback};Polymer.IronSelection.prototype={get:function(){return this.multi?this.selection.slice():this.selection[0]},clear:function(excludes){this.selection.slice().forEach(function(item){if(!excludes||excludes.indexOf(item)<0){this.setItemSelected(item,false)}},this)},isSelected:function(item){return this.selection.indexOf(item)>=0},setItemSelected:function(item,isSelected){if(item!=null){if(isSelected!==this.isSelected(item)){if(isSelected){this.selection.push(item)}else{var i=this.selection.indexOf(item);if(i>=0){this.selection.splice(i,1)}}if(this.selectCallback){this.selectCallback(item,isSelected)}}}},select:function(item){if(this.multi){this.toggle(item)}else if(this.get()!==item){this.setItemSelected(this.get(),false);this.setItemSelected(item,true)}},toggle:function(item){this.setItemSelected(item,!this.isSelected(item))}};Polymer.IronSelectableBehavior={properties:{attrForSelected:{type:String,value:null},selected:{type:String,notify:true},selectedItem:{type:Object,readOnly:true,notify:true},activateEvent:{type:String,value:"tap",observer:"_activateEventChanged"},selectable:String,selectedClass:{type:String,value:"iron-selected"},selectedAttribute:{type:String,value:null},fallbackSelection:{type:String,value:null},items:{type:Array,readOnly:true,notify:true,value:function(){return[]}},_excludedLocalNames:{type:Object,value:function(){return{template:1}}}},observers:["_updateAttrForSelected(attrForSelected)","_updateSelected(selected)","_checkFallback(fallbackSelection)"],created:function(){this._bindFilterItem=this._filterItem.bind(this);this._selection=new Polymer.IronSelection(this._applySelection.bind(this))},attached:function(){this._observer=this._observeItems(this);this._updateItems();if(!this._shouldUpdateSelection){this._updateSelected()}this._addListener(this.activateEvent)},detached:function(){if(this._observer){Polymer.dom(this).unobserveNodes(this._observer)}this._removeListener(this.activateEvent)},indexOf:function(item){return this.items.indexOf(item)},select:function(value){this.selected=value},selectPrevious:function(){var length=this.items.length;var index=(Number(this._valueToIndex(this.selected))-1+length)%length;this.selected=this._indexToValue(index)},selectNext:function(){var index=(Number(this._valueToIndex(this.selected))+1)%this.items.length;this.selected=this._indexToValue(index)},selectIndex:function(index){this.select(this._indexToValue(index))},forceSynchronousItemUpdate:function(){this._updateItems()},get _shouldUpdateSelection(){return this.selected!=null},_checkFallback:function(){if(this._shouldUpdateSelection){this._updateSelected()}},_addListener:function(eventName){this.listen(this,eventName,"_activateHandler")},_removeListener:function(eventName){this.unlisten(this,eventName,"_activateHandler")},_activateEventChanged:function(eventName,old){this._removeListener(old);this._addListener(eventName)},_updateItems:function(){var nodes=Polymer.dom(this).queryDistributedElements(this.selectable||"*");nodes=Array.prototype.filter.call(nodes,this._bindFilterItem);this._setItems(nodes)},_updateAttrForSelected:function(){if(this._shouldUpdateSelection){this.selected=this._indexToValue(this.indexOf(this.selectedItem))}},_updateSelected:function(){this._selectSelected(this.selected)},_selectSelected:function(selected){this._selection.select(this._valueToItem(this.selected));if(this.fallbackSelection&&this.items.length&&this._selection.get()===undefined){this.selected=this.fallbackSelection}},_filterItem:function(node){return!this._excludedLocalNames[node.localName]},_valueToItem:function(value){return value==null?null:this.items[this._valueToIndex(value)]},_valueToIndex:function(value){if(this.attrForSelected){for(var i=0,item;item=this.items[i];i++){if(this._valueForItem(item)==value){return i}}}else{return Number(value)}},_indexToValue:function(index){if(this.attrForSelected){var item=this.items[index];if(item){return this._valueForItem(item)}}else{return index}},_valueForItem:function(item){var propValue=item[Polymer.CaseMap.dashToCamelCase(this.attrForSelected)];return propValue!=undefined?propValue:item.getAttribute(this.attrForSelected)},_applySelection:function(item,isSelected){if(this.selectedClass){this.toggleClass(this.selectedClass,isSelected,item)}if(this.selectedAttribute){this.toggleAttribute(this.selectedAttribute,isSelected,item)}this._selectionChange();this.fire("iron-"+(isSelected?"select":"deselect"),{item:item})},_selectionChange:function(){this._setSelectedItem(this._selection.get())},_observeItems:function(node){return Polymer.dom(node).observeNodes(function(mutation){this._updateItems();if(this._shouldUpdateSelection){this._updateSelected()}this.fire("iron-items-changed",mutation,{bubbles:false,cancelable:false})})},_activateHandler:function(e){var t=e.target;var items=this.items;while(t&&t!=this){var i=items.indexOf(t);if(i>=0){var value=this._indexToValue(i);this._itemActivate(value,t);return}t=t.parentNode}},_itemActivate:function(value,item){if(!this.fire("iron-activate",{selected:value,item:item},{cancelable:true}).defaultPrevented){this.select(value)}}};Polymer.IronMultiSelectableBehaviorImpl={properties:{multi:{type:Boolean,value:false,observer:"multiChanged"},selectedValues:{type:Array,notify:true},selectedItems:{type:Array,readOnly:true,notify:true}},observers:["_updateSelected(selectedValues.splices)"],select:function(value){if(this.multi){if(this.selectedValues){this._toggleSelected(value)}else{this.selectedValues=[value]}}else{this.selected=value}},multiChanged:function(multi){this._selection.multi=multi},get _shouldUpdateSelection(){return this.selected!=null||this.selectedValues!=null&&this.selectedValues.length},_updateAttrForSelected:function(){if(!this.multi){Polymer.IronSelectableBehavior._updateAttrForSelected.apply(this)}else if(this._shouldUpdateSelection){this.selectedValues=this.selectedItems.map(function(selectedItem){return this._indexToValue(this.indexOf(selectedItem))},this).filter(function(unfilteredValue){return unfilteredValue!=null},this)}},_updateSelected:function(){if(this.multi){this._selectMulti(this.selectedValues)}else{this._selectSelected(this.selected)}},_selectMulti:function(values){if(values){var selectedItems=this._valuesToItems(values);this._selection.clear(selectedItems);for(var i=0;i=lastI){return}var minimumZ=Math.max(this.currentOverlayZ(),this._minimumZ);if(this._getZ(overlay)<=minimumZ){this._applyOverlayZ(overlay,minimumZ)}while(i=0){this._bringOverlayAtIndexToFront(i);this.trackBackdrop();return}var insertionIndex=this._overlays.length;var currentOverlay=this._overlays[insertionIndex-1];var minimumZ=Math.max(this._getZ(currentOverlay),this._minimumZ);var newZ=this._getZ(overlay);if(currentOverlay&&this._shouldBeBehindOverlay(overlay,currentOverlay)){this._applyOverlayZ(currentOverlay,minimumZ);insertionIndex--;var previousOverlay=this._overlays[insertionIndex-1];minimumZ=Math.max(this._getZ(previousOverlay),this._minimumZ)}if(newZ<=minimumZ){this._applyOverlayZ(overlay,minimumZ)}this._overlays.splice(insertionIndex,0,overlay);this.trackBackdrop()},removeOverlay:function(overlay){var i=this._overlays.indexOf(overlay);if(i===-1){return}this._overlays.splice(i,1);this.trackBackdrop()},currentOverlay:function(){var i=this._overlays.length-1;return this._overlays[i]},currentOverlayZ:function(){return this._getZ(this.currentOverlay())},ensureMinimumZ:function(minimumZ){this._minimumZ=Math.max(this._minimumZ,minimumZ)},focusOverlay:function(){var current=this.currentOverlay();if(current){current._applyFocus()}},trackBackdrop:function(){var overlay=this._overlayWithBackdrop();if(!overlay&&!this._backdropElement){return}this.backdropElement.style.zIndex=this._getZ(overlay)-1;this.backdropElement.opened=!!overlay},getBackdrops:function(){var backdrops=[];for(var i=0;i=0){focusables.splice(0,0,this)}return focusables.sort(function(a,b){if(a.tabIndex===b.tabIndex){return 0}if(a.tabIndex===0||a.tabIndex>b.tabIndex){return 1}return-1})},ready:function(){this.__isAnimating=false;this.__shouldRemoveTabIndex=false;this.__firstFocusableNode=this.__lastFocusableNode=null;this.__raf=null;this.__restoreFocusNode=null;this._ensureSetup()},attached:function(){if(this.opened){this._openedChanged(this.opened)}this._observer=Polymer.dom(this).observeNodes(this._onNodesChange)},detached:function(){Polymer.dom(this).unobserveNodes(this._observer);this._observer=null;if(this.__raf){window.cancelAnimationFrame(this.__raf);this.__raf=null}this._manager.removeOverlay(this)},toggle:function(){this._setCanceled(false);this.opened=!this.opened},open:function(){this._setCanceled(false);this.opened=true},close:function(){this._setCanceled(false);this.opened=false},cancel:function(event){var cancelEvent=this.fire("iron-overlay-canceled",event,{cancelable:true});if(cancelEvent.defaultPrevented){return}this._setCanceled(true);this.opened=false},_ensureSetup:function(){if(this._overlaySetup){return}this._overlaySetup=true;this.style.outline="none";this.style.display="none"},_openedChanged:function(opened){if(opened){this.removeAttribute("aria-hidden")}else{this.setAttribute("aria-hidden","true")}if(!this.isAttached){return}this.__isAnimating=true;this.__onNextAnimationFrame(this.__openedChanged)},_canceledChanged:function(){this.closingReason=this.closingReason||{};this.closingReason.canceled=this.canceled},_withBackdropChanged:function(){if(this.withBackdrop&&!this.hasAttribute("tabindex")){this.setAttribute("tabindex","-1");this.__shouldRemoveTabIndex=true}else if(this.__shouldRemoveTabIndex){this.removeAttribute("tabindex");this.__shouldRemoveTabIndex=false}if(this.opened&&this.isAttached){this._manager.trackBackdrop()}},_prepareRenderOpened:function(){this.__restoreFocusNode=this._manager.deepActiveElement;this._preparePositioning();this.refit();this._finishPositioning();if(this.noAutoFocus&&document.activeElement===this._focusNode){this._focusNode.blur();this.__restoreFocusNode.focus()}},_renderOpened:function(){this._finishRenderOpened()},_renderClosed:function(){this._finishRenderClosed()},_finishRenderOpened:function(){this.notifyResize();this.__isAnimating=false;var focusableNodes=this._focusableNodes;this.__firstFocusableNode=focusableNodes[0];this.__lastFocusableNode=focusableNodes[focusableNodes.length-1];this.fire("iron-overlay-opened")},_finishRenderClosed:function(){this.style.display="none";this.style.zIndex="";this.notifyResize();this.__isAnimating=false;this.fire("iron-overlay-closed",this.closingReason)},_preparePositioning:function(){this.style.transition=this.style.webkitTransition="none";this.style.transform=this.style.webkitTransform="none";this.style.display=""},_finishPositioning:function(){this.style.display="none";this.scrollTop=this.scrollTop;this.style.transition=this.style.webkitTransition="";this.style.transform=this.style.webkitTransform="";this.style.display="";this.scrollTop=this.scrollTop},_applyFocus:function(){if(this.opened){if(!this.noAutoFocus){this._focusNode.focus()}}else{this._focusNode.blur();this._focusedChild=null;if(this.restoreFocusOnClose&&this.__restoreFocusNode){this.__restoreFocusNode.focus()}this.__restoreFocusNode=null;var currentOverlay=this._manager.currentOverlay();if(currentOverlay&&this!==currentOverlay){currentOverlay._applyFocus()}}},_onCaptureClick:function(event){if(!this.noCancelOnOutsideClick){this.cancel(event)}},_onCaptureFocus:function(event){if(!this.withBackdrop){return}var path=Polymer.dom(event).path;if(path.indexOf(this)===-1){event.stopPropagation();this._applyFocus()}else{this._focusedChild=path[0]}},_onCaptureEsc:function(event){if(!this.noCancelOnEscKey){this.cancel(event)}},_onCaptureTab:function(event){if(!this.withBackdrop){return}var shift=event.shiftKey;var nodeToCheck=shift?this.__firstFocusableNode:this.__lastFocusableNode;var nodeToSet=shift?this.__lastFocusableNode:this.__firstFocusableNode;var shouldWrap=false;if(nodeToCheck===nodeToSet){shouldWrap=true}else{var focusedNode=this._manager.deepActiveElement;shouldWrap=focusedNode===nodeToCheck||focusedNode===this}if(shouldWrap){event.preventDefault();this._focusedChild=nodeToSet;this._applyFocus()}},_onIronResize:function(){if(this.opened&&!this.__isAnimating){this.__onNextAnimationFrame(this.refit)}},_onNodesChange:function(){if(this.opened&&!this.__isAnimating){this.notifyResize()}},__openedChanged:function(){if(this.opened){this._prepareRenderOpened();this._manager.addOverlay(this);this._applyFocus();this._renderOpened()}else{this._manager.removeOverlay(this);this._applyFocus();this._renderClosed()}},__onNextAnimationFrame:function(callback){if(this.__raf){window.cancelAnimationFrame(this.__raf)}var self=this;this.__raf=window.requestAnimationFrame(function nextAnimationFrame(){self.__raf=null;callback.call(self)})}};Polymer.IronOverlayBehavior=[Polymer.IronFitBehavior,Polymer.IronResizableBehavior,Polymer.IronOverlayBehaviorImpl]})();Polymer.NeonAnimatableBehavior={properties:{animationConfig:{type:Object},entryAnimation:{observer:"_entryAnimationChanged",type:String},exitAnimation:{observer:"_exitAnimationChanged",type:String}},_entryAnimationChanged:function(){this.animationConfig=this.animationConfig||{};this.animationConfig["entry"]=[{name:this.entryAnimation,node:this}]},_exitAnimationChanged:function(){this.animationConfig=this.animationConfig||{};this.animationConfig["exit"]=[{name:this.exitAnimation,node:this}]},_copyProperties:function(config1,config2){for(var property in config2){config1[property]=config2[property]}},_cloneConfig:function(config){var clone={isClone:true};this._copyProperties(clone,config);return clone},_getAnimationConfigRecursive:function(type,map,allConfigs){if(!this.animationConfig){return}if(this.animationConfig.value&&typeof this.animationConfig.value==="function"){this._warn(this._logf("playAnimation","Please put 'animationConfig' inside of your components 'properties' object instead of outside of it."));return}var thisConfig;if(type){thisConfig=this.animationConfig[type]}else{thisConfig=this.animationConfig}if(!Array.isArray(thisConfig)){thisConfig=[thisConfig]}if(thisConfig){for(var config,index=0;config=thisConfig[index];index++){if(config.animatable){config.animatable._getAnimationConfigRecursive(config.type||type,map,allConfigs)}else{if(config.id){var cachedConfig=map[config.id];if(cachedConfig){if(!cachedConfig.isClone){map[config.id]=this._cloneConfig(cachedConfig);cachedConfig=map[config.id]}this._copyProperties(cachedConfig,config)}else{map[config.id]=config}}else{allConfigs.push(config)}}}}},getAnimationConfig:function(type){var map={};var allConfigs=[];this._getAnimationConfigRecursive(type,map,allConfigs);for(var key in map){allConfigs.push(map[key])}return allConfigs}};Polymer.NeonAnimationRunnerBehaviorImpl={_configureAnimations:function(configs){var results=[];if(configs.length>0){for(var config,index=0;config=configs[index];index++){var neonAnimation=document.createElement(config.name);if(neonAnimation.isNeonAnimation){var result=null;try{result=neonAnimation.configure(config);if(typeof result.cancel!="function"){result=document.timeline.play(result)}}catch(e){result=null;console.warn("Couldnt play","(",config.name,").",e)}if(result){results.push({neonAnimation:neonAnimation,config:config,animation:result})}}else{console.warn(this.is+":",config.name,"not found!")}}}return results},_shouldComplete:function(activeEntries){var finished=true;for(var i=0;i=0){return}if(this._lockingElements.length===0){this._lockScrollInteractions()}this._lockingElements.push(element);this._lockedElementCache=[];this._unlockedElementCache=[]},removeScrollLock:function(element){var index=this._lockingElements.indexOf(element);if(index===-1){return}this._lockingElements.splice(index,1);this._lockedElementCache=[];this._unlockedElementCache=[];if(this._lockingElements.length===0){this._unlockScrollInteractions()}},_lockingElements:[],_lockedElementCache:null,_unlockedElementCache:null,_hasCachedLockedElement:function(element){return this._lockedElementCache.indexOf(element)>-1},_hasCachedUnlockedElement:function(element){return this._unlockedElementCache.indexOf(element)>-1},_composedTreeContains:function(element,child){var contentElements;var distributedNodes;var contentIndex;var nodeIndex;if(element.contains(child)){return true}contentElements=Polymer.dom(element).querySelectorAll("content");for(contentIndex=0;contentIndex=Math.abs(deltaX);for(var i=0;i0:node.scrollTop0:node.scrollLeft-1){event.preventDefault()}}});Object.keys(config).forEach(function(key){PaperMenuButton[key]=config[key]});Polymer.PaperMenuButton=PaperMenuButton})();Polymer.PaperInkyFocusBehaviorImpl={observers:["_focusedChanged(receivedFocusFromKeyboard)"],_focusedChanged:function(receivedFocusFromKeyboard){if(receivedFocusFromKeyboard){this.ensureRipple()}if(this.hasRipple()){this._ripple.holdDown=receivedFocusFromKeyboard}},_createRipple:function(){var ripple=Polymer.PaperRippleBehavior._createRipple();ripple.id="ink";ripple.setAttribute("center","");ripple.classList.add("circle");return ripple}};Polymer.PaperInkyFocusBehavior=[Polymer.IronButtonState,Polymer.IronControlState,Polymer.PaperRippleBehavior,Polymer.PaperInkyFocusBehaviorImpl];Polymer({is:"paper-icon-button",hostAttributes:{role:"button",tabindex:"0"},behaviors:[Polymer.PaperInkyFocusBehavior],properties:{src:{type:String},icon:{type:String},alt:{type:String,observer:"_altChanged"}},_altChanged:function(newValue,oldValue){var label=this.getAttribute("aria-label");if(!label||oldValue==label){this.setAttribute("aria-label",newValue)}}});Polymer({is:"iron-media-query",properties:{queryMatches:{type:Boolean,value:false,readOnly:true,notify:true},query:{type:String,observer:"queryChanged"},full:{type:Boolean,value:false},_boundMQHandler:{value:function(){return this.queryHandler.bind(this)}},_mq:{value:null}},attached:function(){this.style.display="none";this.queryChanged()},detached:function(){this._remove()},_add:function(){if(this._mq){this._mq.addListener(this._boundMQHandler)}},_remove:function(){if(this._mq){this._mq.removeListener(this._boundMQHandler)}this._mq=null},queryChanged:function(){this._remove();var query=this.query;if(!query){return}if(!this.full&&query[0]!=="("){query="("+query+")"}this._mq=window.matchMedia(query);this._add();this.queryHandler(this._mq)},queryHandler:function(mq){this._setQueryMatches(mq.matches)}});(function(){"use strict";Polymer.IronA11yAnnouncer=Polymer({is:"iron-a11y-announcer",properties:{mode:{type:String,value:"polite"},_text:{type:String,value:""}},created:function(){if(!Polymer.IronA11yAnnouncer.instance){Polymer.IronA11yAnnouncer.instance=this}document.body.addEventListener("iron-announce",this._onIronAnnounce.bind(this))},announce:function(text){this._text="";this.async(function(){this._text=text},100)},_onIronAnnounce:function(event){if(event.detail&&event.detail.text){this.announce(event.detail.text)}}});Polymer.IronA11yAnnouncer.instance=null;Polymer.IronA11yAnnouncer.requestAvailability=function(){if(!Polymer.IronA11yAnnouncer.instance){Polymer.IronA11yAnnouncer.instance=document.createElement("iron-a11y-announcer")}document.body.appendChild(Polymer.IronA11yAnnouncer.instance)}})();Polymer.IronValidatableBehaviorMeta=null;Polymer.IronValidatableBehavior={properties:{validator:{type:String},invalid:{notify:true,reflectToAttribute:true,type:Boolean,value:false},_validatorMeta:{type:Object},validatorType:{type:String,value:"validator"},_validator:{type:Object,computed:"__computeValidator(validator)"}},observers:["_invalidChanged(invalid)"],registered:function(){Polymer.IronValidatableBehaviorMeta=new Polymer.IronMeta({type:"validator"})},_invalidChanged:function(){if(this.invalid){this.setAttribute("aria-invalid","true")}else{this.removeAttribute("aria-invalid")}},hasValidator:function(){return this._validator!=null},validate:function(value){this.invalid=!this._getValidity(value);return!this.invalid},_getValidity:function(value){if(this.hasValidator()){return this._validator.validate(value)}return true},__computeValidator:function(){return Polymer.IronValidatableBehaviorMeta&&Polymer.IronValidatableBehaviorMeta.byKey(this.validator)}};Polymer({is:"iron-input","extends":"input",behaviors:[Polymer.IronValidatableBehavior],properties:{bindValue:{observer:"_bindValueChanged",type:String},preventInvalidInput:{type:Boolean},allowedPattern:{type:String,observer:"_allowedPatternChanged"},_previousValidInput:{type:String,value:""},_patternAlreadyChecked:{type:Boolean,value:false}},listeners:{input:"_onInput",keypress:"_onKeypress"},registered:function(){if(!this._canDispatchEventOnDisabled()){this._origDispatchEvent=this.dispatchEvent;this.dispatchEvent=this._dispatchEventFirefoxIE}},created:function(){Polymer.IronA11yAnnouncer.requestAvailability()},_canDispatchEventOnDisabled:function(){var input=document.createElement("input");var canDispatch=false;input.disabled=true;input.addEventListener("feature-check-dispatch-event",function(){canDispatch=true});try{input.dispatchEvent(new Event("feature-check-dispatch-event"))}catch(e){}return canDispatch},_dispatchEventFirefoxIE:function(){var disabled=this.disabled;this.disabled=false;this._origDispatchEvent.apply(this,arguments);this.disabled=disabled},get _patternRegExp(){var pattern;if(this.allowedPattern){pattern=new RegExp(this.allowedPattern)}else{switch(this.type){case"number":pattern=/[0-9.,e-]/;break}}return pattern},ready:function(){this.bindValue=this.value},_bindValueChanged:function(){if(this.value!==this.bindValue){this.value=!(this.bindValue||this.bindValue===0||this.bindValue===false)?"":this.bindValue}this.fire("bind-value-changed",{value:this.bindValue})},_allowedPatternChanged:function(){this.preventInvalidInput=this.allowedPattern?true:false},_onInput:function(){if(this.preventInvalidInput&&!this._patternAlreadyChecked){var valid=this._checkPatternValidity();if(!valid){this._announceInvalidCharacter("Invalid string of characters not entered.");this.value=this._previousValidInput}}this.bindValue=this.value;this._previousValidInput=this.value;this._patternAlreadyChecked=false},_isPrintable:function(event){var anyNonPrintable=event.keyCode==8||event.keyCode==9||event.keyCode==13||event.keyCode==27;var mozNonPrintable=event.keyCode==19||event.keyCode==20||event.keyCode==45||event.keyCode==46||event.keyCode==144||event.keyCode==145||event.keyCode>32&&event.keyCode<41||event.keyCode>111&&event.keyCode<124;return!anyNonPrintable&&!(event.charCode==0&&mozNonPrintable)},_onKeypress:function(event){if(!this.preventInvalidInput&&this.type!=="number"){return}var regexp=this._patternRegExp;if(!regexp){return}if(event.metaKey||event.ctrlKey||event.altKey)return;this._patternAlreadyChecked=true;var thisChar=String.fromCharCode(event.charCode);if(this._isPrintable(event)&&!regexp.test(thisChar)){event.preventDefault();this._announceInvalidCharacter("Invalid character "+thisChar+" not entered.")}},_checkPatternValidity:function(){var regexp=this._patternRegExp;if(!regexp){return true}for(var i=0;i=-1},computeTag_:function(){switch(this.data.state){case downloads.States.CANCELLED:return loadTimeData.getString("statusCancelled");case downloads.States.INTERRUPTED:return this.data.last_reason_text;case downloads.States.COMPLETE:return this.data.file_externally_removed?loadTimeData.getString("statusRemoved"):""}return""},isIndeterminate_:function(){return this.data.percent==-1},observeControlledBy_:function(){this.$["controlled-by"].innerHTML=this.controlledBy_},observeIsDangerous_:function(){if(!this.data)return;if(this.isDangerous_){this.$.url.removeAttribute("href")}else{this.$.url.href=assert(this.data.url);var filePath=encodeURIComponent(this.data.file_path);var scaleFactor="?scale="+window.devicePixelRatio+"x";this.$["file-icon"].src="chrome://fileicon/"+filePath+scaleFactor}},onCancelTap_:function(){downloads.ActionService.getInstance().cancel(this.data.id)},onDiscardDangerousTap_:function(){downloads.ActionService.getInstance().discardDangerous(this.data.id)},onDragStart_:function(e){e.preventDefault();downloads.ActionService.getInstance().drag(this.data.id)},onFileLinkTap_:function(e){e.preventDefault();downloads.ActionService.getInstance().openFile(this.data.id)},onPauseOrResumeTap_:function(){if(this.isInProgress_)downloads.ActionService.getInstance().pause(this.data.id);else downloads.ActionService.getInstance().resume(this.data.id)},onRemoveTap_:function(){downloads.ActionService.getInstance().remove(this.data.id)},onRetryTap_:function(){downloads.ActionService.getInstance().download(this.data.url)},onSaveDangerousTap_:function(){downloads.ActionService.getInstance().saveDangerous(this.data.id)},onShowTap_:function(){downloads.ActionService.getInstance().show(this.data.id)}});return{Item:Item}});Polymer.PaperItemBehaviorImpl={hostAttributes:{role:"option",tabindex:"0"}};Polymer.PaperItemBehavior=[Polymer.IronButtonState,Polymer.IronControlState,Polymer.PaperItemBehaviorImpl];Polymer({is:"paper-item",behaviors:[Polymer.PaperItemBehavior]});Polymer.IronSelection=function(selectCallback){this.selection=[];this.selectCallback=selectCallback};Polymer.IronSelection.prototype={get:function(){return this.multi?this.selection.slice():this.selection[0]},clear:function(excludes){this.selection.slice().forEach(function(item){if(!excludes||excludes.indexOf(item)<0){this.setItemSelected(item,false)}},this)},isSelected:function(item){return this.selection.indexOf(item)>=0},setItemSelected:function(item,isSelected){if(item!=null){if(isSelected!==this.isSelected(item)){if(isSelected){this.selection.push(item)}else{var i=this.selection.indexOf(item);if(i>=0){this.selection.splice(i,1)}}if(this.selectCallback){this.selectCallback(item,isSelected)}}}},select:function(item){if(this.multi){this.toggle(item)}else if(this.get()!==item){this.setItemSelected(this.get(),false);this.setItemSelected(item,true)}},toggle:function(item){this.setItemSelected(item,!this.isSelected(item))}};Polymer.IronSelectableBehavior={properties:{attrForSelected:{type:String,value:null},selected:{type:String,notify:true},selectedItem:{type:Object,readOnly:true,notify:true},activateEvent:{type:String,value:"tap",observer:"_activateEventChanged"},selectable:String,selectedClass:{type:String,value:"iron-selected"},selectedAttribute:{type:String,value:null},fallbackSelection:{type:String,value:null},items:{type:Array,readOnly:true,notify:true,value:function(){return[]}},_excludedLocalNames:{type:Object,value:function(){return{template:1}}}},observers:["_updateAttrForSelected(attrForSelected)","_updateSelected(selected)","_checkFallback(fallbackSelection)"],created:function(){this._bindFilterItem=this._filterItem.bind(this);this._selection=new Polymer.IronSelection(this._applySelection.bind(this))},attached:function(){this._observer=this._observeItems(this);this._updateItems();if(!this._shouldUpdateSelection){this._updateSelected()}this._addListener(this.activateEvent)},detached:function(){if(this._observer){Polymer.dom(this).unobserveNodes(this._observer)}this._removeListener(this.activateEvent)},indexOf:function(item){return this.items.indexOf(item)},select:function(value){this.selected=value},selectPrevious:function(){var length=this.items.length;var index=(Number(this._valueToIndex(this.selected))-1+length)%length;this.selected=this._indexToValue(index)},selectNext:function(){var index=(Number(this._valueToIndex(this.selected))+1)%this.items.length;this.selected=this._indexToValue(index)},selectIndex:function(index){this.select(this._indexToValue(index))},forceSynchronousItemUpdate:function(){this._updateItems()},get _shouldUpdateSelection(){return this.selected!=null},_checkFallback:function(){if(this._shouldUpdateSelection){this._updateSelected()}},_addListener:function(eventName){this.listen(this,eventName,"_activateHandler")},_removeListener:function(eventName){this.unlisten(this,eventName,"_activateHandler")},_activateEventChanged:function(eventName,old){this._removeListener(old);this._addListener(eventName)},_updateItems:function(){var nodes=Polymer.dom(this).queryDistributedElements(this.selectable||"*");nodes=Array.prototype.filter.call(nodes,this._bindFilterItem);this._setItems(nodes)},_updateAttrForSelected:function(){if(this._shouldUpdateSelection){this.selected=this._indexToValue(this.indexOf(this.selectedItem))}},_updateSelected:function(){this._selectSelected(this.selected)},_selectSelected:function(selected){this._selection.select(this._valueToItem(this.selected));if(this.fallbackSelection&&this.items.length&&this._selection.get()===undefined){this.selected=this.fallbackSelection}},_filterItem:function(node){return!this._excludedLocalNames[node.localName]},_valueToItem:function(value){return value==null?null:this.items[this._valueToIndex(value)]},_valueToIndex:function(value){if(this.attrForSelected){for(var i=0,item;item=this.items[i];i++){if(this._valueForItem(item)==value){return i}}}else{return Number(value)}},_indexToValue:function(index){if(this.attrForSelected){var item=this.items[index];if(item){return this._valueForItem(item)}}else{return index}},_valueForItem:function(item){var propValue=item[Polymer.CaseMap.dashToCamelCase(this.attrForSelected)];return propValue!=undefined?propValue:item.getAttribute(this.attrForSelected)},_applySelection:function(item,isSelected){if(this.selectedClass){this.toggleClass(this.selectedClass,isSelected,item)}if(this.selectedAttribute){this.toggleAttribute(this.selectedAttribute,isSelected,item)}this._selectionChange();this.fire("iron-"+(isSelected?"select":"deselect"),{item:item})},_selectionChange:function(){this._setSelectedItem(this._selection.get())},_observeItems:function(node){return Polymer.dom(node).observeNodes(function(mutation){this._updateItems();if(this._shouldUpdateSelection){this._updateSelected()}this.fire("iron-items-changed",mutation,{bubbles:false,cancelable:false})})},_activateHandler:function(e){var t=e.target;var items=this.items;while(t&&t!=this){var i=items.indexOf(t);if(i>=0){var value=this._indexToValue(i);this._itemActivate(value,t);return}t=t.parentNode}},_itemActivate:function(value,item){if(!this.fire("iron-activate",{selected:value,item:item},{cancelable:true}).defaultPrevented){this.select(value)}}};Polymer.IronMultiSelectableBehaviorImpl={properties:{multi:{type:Boolean,value:false,observer:"multiChanged"},selectedValues:{type:Array,notify:true},selectedItems:{type:Array,readOnly:true,notify:true}},observers:["_updateSelected(selectedValues.splices)"],select:function(value){if(this.multi){if(this.selectedValues){this._toggleSelected(value)}else{this.selectedValues=[value]}}else{this.selected=value}},multiChanged:function(multi){this._selection.multi=multi},get _shouldUpdateSelection(){return this.selected!=null||this.selectedValues!=null&&this.selectedValues.length},_updateAttrForSelected:function(){if(!this.multi){Polymer.IronSelectableBehavior._updateAttrForSelected.apply(this)}else if(this._shouldUpdateSelection){this.selectedValues=this.selectedItems.map(function(selectedItem){return this._indexToValue(this.indexOf(selectedItem))},this).filter(function(unfilteredValue){return unfilteredValue!=null},this)}},_updateSelected:function(){if(this.multi){this._selectMulti(this.selectedValues)}else{this._selectSelected(this.selected)}},_selectMulti:function(values){if(values){var selectedItems=this._valuesToItems(values);this._selection.clear(selectedItems);for(var i=0;i=lastI){return}var minimumZ=Math.max(this.currentOverlayZ(),this._minimumZ);if(this._getZ(overlay)<=minimumZ){this._applyOverlayZ(overlay,minimumZ)}while(i=0){this._bringOverlayAtIndexToFront(i);this.trackBackdrop();return}var insertionIndex=this._overlays.length;var currentOverlay=this._overlays[insertionIndex-1];var minimumZ=Math.max(this._getZ(currentOverlay),this._minimumZ);var newZ=this._getZ(overlay);if(currentOverlay&&this._shouldBeBehindOverlay(overlay,currentOverlay)){this._applyOverlayZ(currentOverlay,minimumZ);insertionIndex--;var previousOverlay=this._overlays[insertionIndex-1];minimumZ=Math.max(this._getZ(previousOverlay),this._minimumZ)}if(newZ<=minimumZ){this._applyOverlayZ(overlay,minimumZ)}this._overlays.splice(insertionIndex,0,overlay);this.trackBackdrop()},removeOverlay:function(overlay){var i=this._overlays.indexOf(overlay);if(i===-1){return}this._overlays.splice(i,1);this.trackBackdrop()},currentOverlay:function(){var i=this._overlays.length-1;return this._overlays[i]},currentOverlayZ:function(){return this._getZ(this.currentOverlay())},ensureMinimumZ:function(minimumZ){this._minimumZ=Math.max(this._minimumZ,minimumZ)},focusOverlay:function(){var current=this.currentOverlay();if(current){current._applyFocus()}},trackBackdrop:function(){var overlay=this._overlayWithBackdrop();if(!overlay&&!this._backdropElement){return}this.backdropElement.style.zIndex=this._getZ(overlay)-1;this.backdropElement.opened=!!overlay},getBackdrops:function(){var backdrops=[];for(var i=0;i=0){focusables.splice(0,0,this)}return focusables.sort(function(a,b){if(a.tabIndex===b.tabIndex){return 0}if(a.tabIndex===0||a.tabIndex>b.tabIndex){return 1}return-1})},ready:function(){this.__isAnimating=false;this.__shouldRemoveTabIndex=false;this.__firstFocusableNode=this.__lastFocusableNode=null;this.__raf=null;this.__restoreFocusNode=null;this._ensureSetup()},attached:function(){if(this.opened){this._openedChanged(this.opened)}this._observer=Polymer.dom(this).observeNodes(this._onNodesChange)},detached:function(){Polymer.dom(this).unobserveNodes(this._observer);this._observer=null;if(this.__raf){window.cancelAnimationFrame(this.__raf);this.__raf=null}this._manager.removeOverlay(this)},toggle:function(){this._setCanceled(false);this.opened=!this.opened},open:function(){this._setCanceled(false);this.opened=true},close:function(){this._setCanceled(false);this.opened=false},cancel:function(event){var cancelEvent=this.fire("iron-overlay-canceled",event,{cancelable:true});if(cancelEvent.defaultPrevented){return}this._setCanceled(true);this.opened=false},_ensureSetup:function(){if(this._overlaySetup){return}this._overlaySetup=true;this.style.outline="none";this.style.display="none"},_openedChanged:function(opened){if(opened){this.removeAttribute("aria-hidden")}else{this.setAttribute("aria-hidden","true")}if(!this.isAttached){return}this.__isAnimating=true;this.__onNextAnimationFrame(this.__openedChanged)},_canceledChanged:function(){this.closingReason=this.closingReason||{};this.closingReason.canceled=this.canceled},_withBackdropChanged:function(){if(this.withBackdrop&&!this.hasAttribute("tabindex")){this.setAttribute("tabindex","-1");this.__shouldRemoveTabIndex=true}else if(this.__shouldRemoveTabIndex){this.removeAttribute("tabindex");this.__shouldRemoveTabIndex=false}if(this.opened&&this.isAttached){this._manager.trackBackdrop()}},_prepareRenderOpened:function(){this.__restoreFocusNode=this._manager.deepActiveElement;this._preparePositioning();this.refit();this._finishPositioning();if(this.noAutoFocus&&document.activeElement===this._focusNode){this._focusNode.blur();this.__restoreFocusNode.focus()}},_renderOpened:function(){this._finishRenderOpened()},_renderClosed:function(){this._finishRenderClosed()},_finishRenderOpened:function(){this.notifyResize();this.__isAnimating=false;var focusableNodes=this._focusableNodes;this.__firstFocusableNode=focusableNodes[0];this.__lastFocusableNode=focusableNodes[focusableNodes.length-1];this.fire("iron-overlay-opened")},_finishRenderClosed:function(){this.style.display="none";this.style.zIndex="";this.notifyResize();this.__isAnimating=false;this.fire("iron-overlay-closed",this.closingReason)},_preparePositioning:function(){this.style.transition=this.style.webkitTransition="none";this.style.transform=this.style.webkitTransform="none";this.style.display=""},_finishPositioning:function(){this.style.display="none";this.scrollTop=this.scrollTop;this.style.transition=this.style.webkitTransition="";this.style.transform=this.style.webkitTransform="";this.style.display="";this.scrollTop=this.scrollTop},_applyFocus:function(){if(this.opened){if(!this.noAutoFocus){this._focusNode.focus()}}else{this._focusNode.blur();this._focusedChild=null;if(this.restoreFocusOnClose&&this.__restoreFocusNode){this.__restoreFocusNode.focus()}this.__restoreFocusNode=null;var currentOverlay=this._manager.currentOverlay();if(currentOverlay&&this!==currentOverlay){currentOverlay._applyFocus()}}},_onCaptureClick:function(event){if(!this.noCancelOnOutsideClick){this.cancel(event)}},_onCaptureFocus:function(event){if(!this.withBackdrop){return}var path=Polymer.dom(event).path;if(path.indexOf(this)===-1){event.stopPropagation();this._applyFocus()}else{this._focusedChild=path[0]}},_onCaptureEsc:function(event){if(!this.noCancelOnEscKey){this.cancel(event)}},_onCaptureTab:function(event){if(!this.withBackdrop){return}var shift=event.shiftKey;var nodeToCheck=shift?this.__firstFocusableNode:this.__lastFocusableNode;var nodeToSet=shift?this.__lastFocusableNode:this.__firstFocusableNode;var shouldWrap=false;if(nodeToCheck===nodeToSet){shouldWrap=true}else{var focusedNode=this._manager.deepActiveElement;shouldWrap=focusedNode===nodeToCheck||focusedNode===this}if(shouldWrap){event.preventDefault();this._focusedChild=nodeToSet;this._applyFocus()}},_onIronResize:function(){if(this.opened&&!this.__isAnimating){this.__onNextAnimationFrame(this.refit)}},_onNodesChange:function(){if(this.opened&&!this.__isAnimating){this.notifyResize()}},__openedChanged:function(){if(this.opened){this._prepareRenderOpened();this._manager.addOverlay(this);this._applyFocus();this._renderOpened()}else{this._manager.removeOverlay(this);this._applyFocus();this._renderClosed()}},__onNextAnimationFrame:function(callback){if(this.__raf){window.cancelAnimationFrame(this.__raf)}var self=this;this.__raf=window.requestAnimationFrame(function nextAnimationFrame(){self.__raf=null;callback.call(self)})}};Polymer.IronOverlayBehavior=[Polymer.IronFitBehavior,Polymer.IronResizableBehavior,Polymer.IronOverlayBehaviorImpl]})();Polymer.NeonAnimatableBehavior={properties:{animationConfig:{type:Object},entryAnimation:{observer:"_entryAnimationChanged",type:String},exitAnimation:{observer:"_exitAnimationChanged",type:String}},_entryAnimationChanged:function(){this.animationConfig=this.animationConfig||{};this.animationConfig["entry"]=[{name:this.entryAnimation,node:this}]},_exitAnimationChanged:function(){this.animationConfig=this.animationConfig||{};this.animationConfig["exit"]=[{name:this.exitAnimation,node:this}]},_copyProperties:function(config1,config2){for(var property in config2){config1[property]=config2[property]}},_cloneConfig:function(config){var clone={isClone:true};this._copyProperties(clone,config);return clone},_getAnimationConfigRecursive:function(type,map,allConfigs){if(!this.animationConfig){return}if(this.animationConfig.value&&typeof this.animationConfig.value==="function"){this._warn(this._logf("playAnimation","Please put 'animationConfig' inside of your components 'properties' object instead of outside of it."));return}var thisConfig;if(type){thisConfig=this.animationConfig[type]}else{thisConfig=this.animationConfig}if(!Array.isArray(thisConfig)){thisConfig=[thisConfig]}if(thisConfig){for(var config,index=0;config=thisConfig[index];index++){if(config.animatable){config.animatable._getAnimationConfigRecursive(config.type||type,map,allConfigs)}else{if(config.id){var cachedConfig=map[config.id];if(cachedConfig){if(!cachedConfig.isClone){map[config.id]=this._cloneConfig(cachedConfig);cachedConfig=map[config.id]}this._copyProperties(cachedConfig,config)}else{map[config.id]=config}}else{allConfigs.push(config)}}}}},getAnimationConfig:function(type){var map={};var allConfigs=[];this._getAnimationConfigRecursive(type,map,allConfigs);for(var key in map){allConfigs.push(map[key])}return allConfigs}};Polymer.NeonAnimationRunnerBehaviorImpl={_configureAnimations:function(configs){var results=[];if(configs.length>0){for(var config,index=0;config=configs[index];index++){var neonAnimation=document.createElement(config.name);if(neonAnimation.isNeonAnimation){var result=null;try{result=neonAnimation.configure(config);if(typeof result.cancel!="function"){result=document.timeline.play(result)}}catch(e){result=null;console.warn("Couldnt play","(",config.name,").",e)}if(result){results.push({neonAnimation:neonAnimation,config:config,animation:result})}}else{console.warn(this.is+":",config.name,"not found!")}}}return results},_shouldComplete:function(activeEntries){var finished=true;for(var i=0;i=0){return}if(this._lockingElements.length===0){this._lockScrollInteractions()}this._lockingElements.push(element);this._lockedElementCache=[];this._unlockedElementCache=[]},removeScrollLock:function(element){var index=this._lockingElements.indexOf(element);if(index===-1){return}this._lockingElements.splice(index,1);this._lockedElementCache=[];this._unlockedElementCache=[];if(this._lockingElements.length===0){this._unlockScrollInteractions()}},_lockingElements:[],_lockedElementCache:null,_unlockedElementCache:null,_hasCachedLockedElement:function(element){return this._lockedElementCache.indexOf(element)>-1},_hasCachedUnlockedElement:function(element){return this._unlockedElementCache.indexOf(element)>-1},_composedTreeContains:function(element,child){var contentElements;var distributedNodes;var contentIndex;var nodeIndex;if(element.contains(child)){return true}contentElements=Polymer.dom(element).querySelectorAll("content");for(contentIndex=0;contentIndex=Math.abs(deltaX);for(var i=0;i0:node.scrollTop0:node.scrollLeft-1){event.preventDefault()}}});Object.keys(config).forEach(function(key){PaperMenuButton[key]=config[key]});Polymer.PaperMenuButton=PaperMenuButton})();Polymer.PaperInkyFocusBehaviorImpl={observers:["_focusedChanged(receivedFocusFromKeyboard)"],_focusedChanged:function(receivedFocusFromKeyboard){if(receivedFocusFromKeyboard){this.ensureRipple()}if(this.hasRipple()){this._ripple.holdDown=receivedFocusFromKeyboard}},_createRipple:function(){var ripple=Polymer.PaperRippleBehavior._createRipple();ripple.id="ink";ripple.setAttribute("center","");ripple.classList.add("circle");return ripple}};Polymer.PaperInkyFocusBehavior=[Polymer.IronButtonState,Polymer.IronControlState,Polymer.PaperRippleBehavior,Polymer.PaperInkyFocusBehaviorImpl];Polymer({is:"paper-icon-button",hostAttributes:{role:"button",tabindex:"0"},behaviors:[Polymer.PaperInkyFocusBehavior],properties:{src:{type:String},icon:{type:String},alt:{type:String,observer:"_altChanged"}},_altChanged:function(newValue,oldValue){var label=this.getAttribute("aria-label");if(!label||oldValue==label){this.setAttribute("aria-label",newValue)}}});Polymer({is:"iron-media-query",properties:{queryMatches:{type:Boolean,value:false,readOnly:true,notify:true},query:{type:String,observer:"queryChanged"},full:{type:Boolean,value:false},_boundMQHandler:{value:function(){return this.queryHandler.bind(this)}},_mq:{value:null}},attached:function(){this.style.display="none";this.queryChanged()},detached:function(){this._remove()},_add:function(){if(this._mq){this._mq.addListener(this._boundMQHandler)}},_remove:function(){if(this._mq){this._mq.removeListener(this._boundMQHandler)}this._mq=null},queryChanged:function(){this._remove();var query=this.query;if(!query){return}if(!this.full&&query[0]!=="("){query="("+query+")"}this._mq=window.matchMedia(query);this._add();this.queryHandler(this._mq)},queryHandler:function(mq){this._setQueryMatches(mq.matches)}});Polymer.PaperSpinnerBehavior={listeners:{animationend:"__reset",webkitAnimationEnd:"__reset"},properties:{active:{type:Boolean,value:false,reflectToAttribute:true,observer:"__activeChanged"},alt:{type:String,value:"loading",observer:"__altChanged"},__coolingDown:{type:Boolean,value:false}},__computeContainerClasses:function(active,coolingDown){return[active||coolingDown?"active":"",coolingDown?"cooldown":""].join(" ")},__activeChanged:function(active,old){this.__setAriaHidden(!active);this.__coolingDown=!active&&old},__altChanged:function(alt){if(alt===this.getPropertyInfo("alt").value){this.alt=this.getAttribute("aria-label")||alt}else{this.__setAriaHidden(alt==="");this.setAttribute("aria-label",alt)}},__setAriaHidden:function(hidden){var attr="aria-hidden";if(hidden){this.setAttribute(attr,"true")}else{this.removeAttribute(attr)}},__reset:function(){this.active=false;this.__coolingDown=false}};Polymer({is:"paper-spinner-lite",behaviors:[Polymer.PaperSpinnerBehavior]}); // 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. -var CrSearchFieldBehavior={properties:{label:{type:String,value:""},clearLabel:{type:String,value:""},showingSearch:{type:Boolean,value:false,notify:true,observer:"showingSearchChanged_",reflectToAttribute:true},lastValue_:{type:String,value:""}},getSearchInput:function(){},getValue:function(){return this.getSearchInput().value},setValue:function(value){this.getSearchInput().bindValue=value;this.onValueChanged_(value)},showAndFocus:function(){this.showingSearch=true;this.focus_()},focus_:function(){this.getSearchInput().focus()},onSearchTermSearch:function(){this.onValueChanged_(this.getValue())},onValueChanged_:function(newValue){if(newValue==this.lastValue_)return;this.fire("search-changed",newValue);this.lastValue_=newValue},onSearchTermKeydown:function(e){if(e.key=="Escape")this.showingSearch=false},showingSearchChanged_:function(){if(this.showingSearch){this.focus_();return}this.setValue("");this.getSearchInput().blur()}}; +var CrSearchFieldBehavior={properties:{label:{type:String,value:""},clearLabel:{type:String,value:""},showingSearch:{type:Boolean,value:false,notify:true,observer:"showingSearchChanged_",reflectToAttribute:true},lastValue_:{type:String,value:""}},getSearchInput:function(){},getValue:function(){return this.getSearchInput().value},setValue:function(value,opt_noEvent){var searchInput=this.getSearchInput();searchInput.value=value;if(searchInput.bindValue!=undefined)searchInput.bindValue=value;this.onValueChanged_(value,!!opt_noEvent)},showAndFocus:function(){this.showingSearch=true;this.focus_()},focus_:function(){this.getSearchInput().focus()},onSearchTermSearch:function(){this.onValueChanged_(this.getValue(),false)},onValueChanged_:function(newValue,noEvent){if(newValue==this.lastValue_)return;this.lastValue_=newValue;if(!noEvent)this.fire("search-changed",newValue)},onSearchTermKeydown:function(e){if(e.key=="Escape")this.showingSearch=false},showingSearchChanged_:function(current,previous){if(previous==undefined)return;if(this.showingSearch){this.focus_();return}this.setValue("");this.getSearchInput().blur()}}; // 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. -Polymer({is:"cr-toolbar-search-field",behaviors:[CrSearchFieldBehavior],properties:{narrow:{type:Boolean,reflectToAttribute:true},label:String,clearLabel:String,spinnerActive:{type:Boolean,reflectToAttribute:true},hasSearchText_:Boolean,isSpinnerShown_:{type:Boolean,computed:"computeIsSpinnerShown_(spinnerActive, showingSearch)"}},listeners:{tap:"showSearch_","searchInput.bind-value-changed":"onBindValueChanged_"},getSearchInput:function(){return this.$.searchInput},isSearchFocused:function(){return this.$.searchTerm.focused},computeIconTabIndex_:function(narrow){return narrow?0:-1},computeIsSpinnerShown_:function(){return this.spinnerActive&&this.showingSearch},onInputBlur_:function(){if(!this.hasSearchText_)this.showingSearch=false},onBindValueChanged_:function(){var newValue=this.$.searchInput.bindValue;this.hasSearchText_=newValue!="";if(newValue!="")this.showingSearch=true},showSearch_:function(e){if(e.target!=this.$.clearSearch)this.showingSearch=true},hideSearch_:function(e){this.showingSearch=false;e.stopPropagation()}}); +Polymer({is:"cr-toolbar-search-field",behaviors:[CrSearchFieldBehavior],properties:{narrow:{type:Boolean,reflectToAttribute:true},label:String,clearLabel:String,spinnerActive:{type:Boolean,reflectToAttribute:true},hasSearchText_:{type:Boolean,reflectToAttribute:true},isSpinnerShown_:{type:Boolean,computed:"computeIsSpinnerShown_(spinnerActive, showingSearch)"},searchFocused_:{type:Boolean,value:false}},listeners:{click:"showSearch_"},getSearchInput:function(){return this.$.searchInput},setValue:function(value,opt_noEvent){CrSearchFieldBehavior.setValue.call(this,value,opt_noEvent);this.onSearchInput_()},isSearchFocused:function(){return this.searchFocused_},computeIconTabIndex_:function(narrow){return narrow?0:-1},computeIsSpinnerShown_:function(){return this.spinnerActive&&this.showingSearch},onInputFocus_:function(){this.searchFocused_=true},onInputBlur_:function(){this.searchFocused_=false;if(!this.hasSearchText_)this.showingSearch=false},onSearchInput_:function(){var newValue=this.$.searchInput.value;this.hasSearchText_=newValue!="";if(newValue!="")this.showingSearch=true},showSearch_:function(e){if(e.target!=this.$.clearSearch)this.showingSearch=true},clearSearch_:function(e){this.setValue("");this.getSearchInput().focus()}}); // 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. -Polymer({is:"cr-toolbar",properties:{pageName:String,searchPrompt:String,clearLabel:String,menuLabel:String,menuPromo:String,spinnerActive:Boolean,showMenu:{type:Boolean,value:false},showMenuPromo:{type:Boolean,value:false},closeMenuPromo:String,narrow_:{type:Boolean,reflectToAttribute:true},showingSearch_:{type:Boolean,reflectToAttribute:true}},observers:["possiblyShowMenuPromo_(showMenu, showMenuPromo, showingSearch_)"],getSearchField:function(){return this.$.search},onClosePromoTap_:function(){this.showMenuPromo=false},onMenuTap_:function(){this.fire("cr-menu-tap");this.onClosePromoTap_()},possiblyShowMenuPromo_:function(){Polymer.RenderStatus.afterNextRender(this,function(){if(this.showMenu&&this.showMenuPromo&&!this.showingSearch_){this.$$("#menuPromo").animate({opacity:[0,.9]},{duration:500,fill:"forwards"});this.fire("cr-menu-promo-shown")}}.bind(this))},titleIfNotShowMenuPromo_:function(title,showMenuPromo){return showMenuPromo?"":title}}); +Polymer({is:"cr-toolbar",properties:{pageName:String,searchPrompt:String,clearLabel:String,menuLabel:String,menuPromo:String,spinnerActive:Boolean,showMenu:{type:Boolean,value:false},showMenuPromo:{type:Boolean,value:false},closeMenuPromo:String,narrow_:{type:Boolean,reflectToAttribute:true},showingSearch_:{type:Boolean,reflectToAttribute:true}},observers:["possiblyShowMenuPromo_(showMenu, showMenuPromo, showingSearch_)"],getSearchField:function(){return this.$.search},onClosePromoTap_:function(){this.fire("cr-toolbar-menu-promo-close")},onMenuTap_:function(){this.fire("cr-toolbar-menu-tap")},possiblyShowMenuPromo_:function(){Polymer.RenderStatus.afterNextRender(this,function(){if(this.showMenu&&this.showMenuPromo&&!this.showingSearch_){this.$$("#menuPromo").animate({opacity:[0,.9]},{duration:500,fill:"forwards"});this.fire("cr-toolbar-menu-promo-shown")}}.bind(this))},titleIfNotShowMenuPromo_:function(title,showMenuPromo){return showMenuPromo?"":title}}); // 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. @@ -65,7 +64,7 @@ cr.define("downloads",function(){var Toolbar=Polymer({is:"downloads-toolbar",pro // 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. -cr.define("downloads",function(){var Manager=Polymer({is:"downloads-manager",properties:{hasDownloads_:{observer:"hasDownloadsChanged_",type:Boolean},hasShadow_:{type:Boolean,value:false,reflectToAttribute:true},items_:{type:Array,value:function(){return[]}},spinnerActive_:{type:Boolean,notify:true}},hostAttributes:{loading:true},listeners:{"downloads-list.scroll":"onListScroll_"},observers:["itemsChanged_(items_.*)"],clearAll_:function(){this.set("items_",[])},hasDownloadsChanged_:function(){if(loadTimeData.getBoolean("allowDeletingHistory"))this.$.toolbar.downloadsShowing=this.hasDownloads_;if(this.hasDownloads_){this.$["downloads-list"].fire("iron-resize")}else{var isSearching=downloads.ActionService.getInstance().isSearching();var messageToShow=isSearching?"noSearchResults":"noDownloads";this.$["no-downloads"].querySelector("span").textContent=loadTimeData.getString(messageToShow)}},insertItems_:function(index,list){this.splice.apply(this,["items_",index,0].concat(list));this.updateHideDates_(index,index+list.length);this.removeAttribute("loading");this.spinnerActive_=false},itemsChanged_:function(){this.hasDownloads_=this.items_.length>0},onCanExecute_:function(e){e=e;switch(e.command.id){case"undo-command":e.canExecute=this.$.toolbar.canUndo();break;case"clear-all-command":e.canExecute=this.$.toolbar.canClearAll();break;case"find-command":e.canExecute=true;break}},onCommand_:function(e){if(e.command.id=="clear-all-command")downloads.ActionService.getInstance().clearAll();else if(e.command.id=="undo-command")downloads.ActionService.getInstance().undo();else if(e.command.id=="find-command")this.$.toolbar.onFindCommand()},onListScroll_:function(){var list=this.$["downloads-list"];if(list.scrollHeight-list.scrollTop-list.offsetHeight<=100){downloads.ActionService.getInstance().loadMore()}this.hasShadow_=list.scrollTop>0},onLoad_:function(){cr.ui.decorate("command",cr.ui.Command);document.addEventListener("canExecute",this.onCanExecute_.bind(this));document.addEventListener("command",this.onCommand_.bind(this));downloads.ActionService.getInstance().loadMore()},removeItem_:function(index){this.splice("items_",index,1);this.updateHideDates_(index,index);this.onListScroll_()},updateHideDates_:function(start,end){for(var i=start;i<=end;++i){var current=this.items_[i];if(!current)continue;var prev=this.items_[i-1];current.hideDate=!!prev&&prev.date_string==current.date_string}},updateItem_:function(index,data){this.set("items_."+index,data);this.updateHideDates_(index,index);var list=this.$["downloads-list"];list.updateSizeForItem(index)}});Manager.clearAll=function(){Manager.get().clearAll_()};Manager.get=function(){return queryRequiredElement("downloads-manager")};Manager.insertItems=function(index,list){Manager.get().insertItems_(index,list)};Manager.onLoad=function(){Manager.get().onLoad_()};Manager.removeItem=function(index){Manager.get().removeItem_(index)};Manager.updateItem=function(index,data){Manager.get().updateItem_(index,data)};return{Manager:Manager}}); +cr.define("downloads",function(){var Manager=Polymer({is:"downloads-manager",properties:{hasDownloads_:{observer:"hasDownloadsChanged_",type:Boolean},hasShadow_:{type:Boolean,value:false,reflectToAttribute:true},inSearchMode_:{type:Boolean,value:false},items_:{type:Array,value:function(){return[]}},spinnerActive_:{type:Boolean,notify:true}},hostAttributes:{loading:true},listeners:{"downloads-list.scroll":"onListScroll_","toolbar.search-changed":"onSearchChanged_"},observers:["itemsChanged_(items_.*)"],clearAll_:function(){this.set("items_",[])},hasDownloadsChanged_:function(){if(loadTimeData.getBoolean("allowDeletingHistory"))this.$.toolbar.downloadsShowing=this.hasDownloads_;if(this.hasDownloads_)this.$["downloads-list"].fire("iron-resize")},insertItems_:function(index,list){this.splice.apply(this,["items_",index,0].concat(list));this.updateHideDates_(index,index+list.length);this.removeAttribute("loading");this.spinnerActive_=false},itemsChanged_:function(){this.hasDownloads_=this.items_.length>0},noDownloadsText_:function(){return loadTimeData.getString(this.inSearchMode_?"noSearchResults":"noDownloads")},onCanExecute_:function(e){e=e;switch(e.command.id){case"undo-command":e.canExecute=this.$.toolbar.canUndo();break;case"clear-all-command":e.canExecute=this.$.toolbar.canClearAll();break;case"find-command":e.canExecute=true;break}},onCommand_:function(e){if(e.command.id=="clear-all-command")downloads.ActionService.getInstance().clearAll();else if(e.command.id=="undo-command")downloads.ActionService.getInstance().undo();else if(e.command.id=="find-command")this.$.toolbar.onFindCommand()},onListScroll_:function(){var list=this.$["downloads-list"];if(list.scrollHeight-list.scrollTop-list.offsetHeight<=100){downloads.ActionService.getInstance().loadMore()}this.hasShadow_=list.scrollTop>0},onLoad_:function(){cr.ui.decorate("command",cr.ui.Command);document.addEventListener("canExecute",this.onCanExecute_.bind(this));document.addEventListener("command",this.onCommand_.bind(this));downloads.ActionService.getInstance().loadMore()},onSearchChanged_:function(){this.inSearchMode_=downloads.ActionService.getInstance().isSearching()},removeItem_:function(index){this.splice("items_",index,1);this.updateHideDates_(index,index);this.onListScroll_()},updateHideDates_:function(start,end){for(var i=start;i<=end;++i){var current=this.items_[i];if(!current)continue;var prev=this.items_[i-1];var hideDate=!!prev&&prev.date_string==current.date_string;this.set("items_."+i+".hideDate",hideDate)}},updateItem_:function(index,data){this.set("items_."+index,data);this.updateHideDates_(index,index);var list=this.$["downloads-list"];list.updateSizeForItem(index)}});Manager.clearAll=function(){Manager.get().clearAll_()};Manager.get=function(){return queryRequiredElement("downloads-manager")};Manager.insertItems=function(index,list){Manager.get().insertItems_(index,list)};Manager.onLoad=function(){Manager.get().onLoad_()};Manager.removeItem=function(index){Manager.get().removeItem_(index)};Manager.updateItem=function(index,data){Manager.get().updateItem_(index,data)};return{Manager:Manager}}); // 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. diff --git a/chromium/chrome/browser/resources/md_downloads/item.html b/chromium/chrome/browser/resources/md_downloads/item.html index 3f0ff3d0115..ca33797dc18 100644 --- a/chromium/chrome/browser/resources/md_downloads/item.html +++ b/chromium/chrome/browser/resources/md_downloads/item.html @@ -112,12 +112,9 @@ width: 32px; } - #danger-icon[icon='cr:warning'] { - color: rgb(255, 193, 7); - } - - #danger-icon[icon='downloads:remove-circle'] { - color: rgb(244, 67, 54); + #danger-icon[icon='cr:warning'], + .dangerous #description { + color: var(--google-red-700); } #name, @@ -170,10 +167,6 @@ color: #616161; } - .dangerous #description { - color: rgb(239, 108, 0); - } - #progress { --paper-progress-active-color: rgb(54, 126, 237); --paper-progress-container-color: rgb(223, 222, 223); @@ -258,7 +251,7 @@ [[computeTag_(data.state, data.last_reason_text, data.file_externally_removed)]] - [[data.url]] + [[chopUrl_(data.url)]]
[[computeDescription_(data.state, data.danger_type, data.file_name, data.progress_status_text)]]
diff --git a/chromium/chrome/browser/resources/md_downloads/item.js b/chromium/chrome/browser/resources/md_downloads/item.js index 3bc1ef68599..00a3716f6a3 100644 --- a/chromium/chrome/browser/resources/md_downloads/item.js +++ b/chromium/chrome/browser/resources/md_downloads/item.js @@ -78,6 +78,15 @@ cr.define('downloads', function() { this.content = this.$.content; }, + /** + * @param {string} url + * @return {string} A reasonably long URL. + * @private + */ + chopUrl_: function(url) { + return url.slice(0, 300); + }, + /** @private */ computeClass_: function() { var classes = []; @@ -107,24 +116,12 @@ cr.define('downloads', function() { var url = 'chrome://extensions#' + this.data.by_ext_id; var name = this.data.by_ext_name; - return loadTimeData.getStringF('controlledByUrl', url, name); + return loadTimeData.getStringF('controlledByUrl', url, HTMLEscape(name)); }, /** @private */ computeDangerIcon_: function() { - if (!this.isDangerous_) - return ''; - - switch (this.data.danger_type) { - case downloads.DangerType.DANGEROUS_CONTENT: - case downloads.DangerType.DANGEROUS_HOST: - case downloads.DangerType.DANGEROUS_URL: - case downloads.DangerType.POTENTIALLY_UNWANTED: - case downloads.DangerType.UNCOMMON_CONTENT: - return 'downloads:remove-circle'; - default: - return 'cr:warning'; - } + return this.isDangerous_ ? 'cr:warning' : ''; }, /** @private */ diff --git a/chromium/chrome/browser/resources/md_downloads/manager.html b/chromium/chrome/browser/resources/md_downloads/manager.html index 65d9ec17331..07e3c5925ce 100644 --- a/chromium/chrome/browser/resources/md_downloads/manager.html +++ b/chromium/chrome/browser/resources/md_downloads/manager.html @@ -98,14 +98,13 @@ diff --git a/chromium/chrome/browser/resources/md_downloads/manager.js b/chromium/chrome/browser/resources/md_downloads/manager.js index e66c813a37a..62b6b349236 100644 --- a/chromium/chrome/browser/resources/md_downloads/manager.js +++ b/chromium/chrome/browser/resources/md_downloads/manager.js @@ -7,22 +7,32 @@ cr.define('downloads', function() { is: 'downloads-manager', properties: { + /** @private */ hasDownloads_: { observer: 'hasDownloadsChanged_', type: Boolean, }, + /** @private */ hasShadow_: { type: Boolean, value: false, reflectToAttribute: true, }, + /** @private */ + inSearchMode_: { + type: Boolean, + value: false, + }, + + /** @private {!Array} */ items_: { type: Array, value: function() { return []; }, }, + /** @private */ spinnerActive_: { type: Boolean, notify: true, @@ -35,6 +45,7 @@ cr.define('downloads', function() { listeners: { 'downloads-list.scroll': 'onListScroll_', + 'toolbar.search-changed': 'onSearchChanged_', }, observers: [ @@ -51,14 +62,8 @@ cr.define('downloads', function() { if (loadTimeData.getBoolean('allowDeletingHistory')) this.$.toolbar.downloadsShowing = this.hasDownloads_; - if (this.hasDownloads_) { + if (this.hasDownloads_) this.$['downloads-list'].fire('iron-resize'); - } else { - var isSearching = downloads.ActionService.getInstance().isSearching(); - var messageToShow = isSearching ? 'noSearchResults' : 'noDownloads'; - this.$['no-downloads'].querySelector('span').textContent = - loadTimeData.getString(messageToShow); - } }, /** @@ -78,6 +83,15 @@ cr.define('downloads', function() { this.hasDownloads_ = this.items_.length > 0; }, + /** + * @return {string} The text to show when no download items are showing. + * @private + */ + noDownloadsText_: function() { + return loadTimeData.getString( + this.inSearchMode_ ? 'noSearchResults' : 'noDownloads'); + }, + /** * @param {Event} e * @private @@ -129,6 +143,11 @@ cr.define('downloads', function() { downloads.ActionService.getInstance().loadMore(); }, + /** @private */ + onSearchChanged_: function() { + this.inSearchMode_ = downloads.ActionService.getInstance().isSearching(); + }, + /** * @param {number} index * @private @@ -150,7 +169,8 @@ cr.define('downloads', function() { if (!current) continue; var prev = this.items_[i - 1]; - current.hideDate = !!prev && prev.date_string == current.date_string; + var hideDate = !!prev && prev.date_string == current.date_string; + this.set('items_.' + i + '.hideDate', hideDate); } }, diff --git a/chromium/chrome/browser/resources/md_downloads/toolbar.html b/chromium/chrome/browser/resources/md_downloads/toolbar.html index 19fdbdea1a4..d974e9ed292 100644 --- a/chromium/chrome/browser/resources/md_downloads/toolbar.html +++ b/chromium/chrome/browser/resources/md_downloads/toolbar.html @@ -33,7 +33,7 @@ -webkit-margin-end: 16px; /* Only matters around 900px in Russian. */ }; --cr-toolbar-left-content-wide: { - -webkit-margin-start: 0; + -webkit-padding-start: 0; flex: 1 0 1px; max-width: none; position: static; diff --git a/chromium/chrome/browser/resources/md_downloads/vulcanized.html b/chromium/chrome/browser/resources/md_downloads/vulcanized.html index 1013b028b49..386c969be17 100644 --- a/chromium/chrome/browser/resources/md_downloads/vulcanized.html +++ b/chromium/chrome/browser/resources/md_downloads/vulcanized.html @@ -1135,12 +1135,8 @@ paper-button { width: 32px; } -#danger-icon[icon='cr:warning'] { - color: rgb(255, 193, 7); -} - -#danger-icon[icon='downloads:remove-circle'] { - color: rgb(244, 67, 54); +#danger-icon[icon='cr:warning'], .dangerous #description { + color: var(--google-red-700); } #name, #file-link, #url { @@ -1187,10 +1183,6 @@ paper-button { color: #616161; } -.dangerous #description { - color: rgb(239, 108, 0); -} - #progress { --paper-progress-active-color: rgb(54, 126, 237); --paper-progress-container-color: rgb(223, 222, 223); @@ -1262,7 +1254,7 @@ paper-button { [[computeTag_(data.state, data.last_reason_text, data.file_externally_removed)]] - [[data.url]] + [[chopUrl_(data.url)]]
[[computeDescription_(data.state, data.danger_type, data.file_name, data.progress_status_text)]]
@@ -1365,7 +1357,7 @@ paper-button { * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ - + @font-face { font-family: 'Roboto'; font-style: normal; @@ -1819,244 +1811,6 @@ iron-icon { - - - - - - - - + + diff --git a/chromium/chrome/browser/resources/md_extensions/code_section.js b/chromium/chrome/browser/resources/md_extensions/code_section.js new file mode 100644 index 00000000000..d0a93e2aac2 --- /dev/null +++ b/chromium/chrome/browser/resources/md_extensions/code_section.js @@ -0,0 +1,60 @@ +// 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. + +cr.define('extensions', function() { + 'use strict'; + + var CodeSection = Polymer({ + is: 'extensions-code-section', + + properties: { + /** + * The code this object is displaying. + * @type {?chrome.developerPrivate.RequestFileSourceResponse} + */ + code: { + type: Object, + // We initialize to null so that Polymer sees it as defined and calls + // isMainHidden_(). + value: null, + }, + + /** + * The string to display if no code is set. + * @type {string} + */ + noCodeError: String, + }, + + /** + * Computes the content of the line numbers span, which basically just + * contains 1\n2\n3\n... for the number of lines. + * @return {string} + * @private + */ + computeLineNumbersContent_: function() { + if (!this.code) + return ''; + + var lines = [this.code.beforeHighlight, + this.code.highlight, + this.code.afterHighlight].join('').match(/\n/g); + var lineCount = lines ? lines.length : 0; + var textContent = ''; + for (var i = 1; i <= lineCount; ++i) + textContent += i + '\n'; + return textContent; + }, + + /** + * @return {boolean} + * @private + */ + isMainHidden_: function() { + return !this.code; + }, + }); + + return {CodeSection: CodeSection}; +}); diff --git a/chromium/chrome/browser/resources/md_extensions/compiled_resources2.gyp b/chromium/chrome/browser/resources/md_extensions/compiled_resources2.gyp index f51788dc67a..67e67a298cf 100644 --- a/chromium/chrome/browser/resources/md_extensions/compiled_resources2.gyp +++ b/chromium/chrome/browser/resources/md_extensions/compiled_resources2.gyp @@ -11,6 +11,14 @@ ], 'includes': ['../../../../third_party/closure_compiler/compile_js2.gypi'], }, + { + 'target_name': 'code_section', + 'dependencies': [ + '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr', + '<(EXTERNS_GYP):developer_private', + ], + 'includes': ['../../../../third_party/closure_compiler/compile_js2.gypi'], + }, { 'target_name': 'detail_view', 'dependencies': [ @@ -36,6 +44,17 @@ ], 'includes': ['../../../../third_party/closure_compiler/compile_js2.gypi'], }, + { + 'target_name': 'error_page', + 'dependencies': [ + '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr', + '<(DEPTH)/third_party/polymer/v1_0/components-chromium/neon-animation/compiled_resources2.gyp:neon-animatable-behavior-extracted', + '<(EXTERNS_GYP):developer_private', + 'animation_helper', + 'code_section', + ], + 'includes': ['../../../../third_party/closure_compiler/compile_js2.gypi'], + }, { 'target_name': 'extensions', 'dependencies': [ @@ -132,6 +151,7 @@ '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr', '<(EXTERNS_GYP):developer_private', '<(EXTERNS_GYP):management', + 'error_page', 'item', 'manager', 'pack_dialog', diff --git a/chromium/chrome/browser/resources/md_extensions/error_page.html b/chromium/chrome/browser/resources/md_extensions/error_page.html new file mode 100644 index 00000000000..801a3df5df4 --- /dev/null +++ b/chromium/chrome/browser/resources/md_extensions/error_page.html @@ -0,0 +1,87 @@ + + + + + + + + + + + + + diff --git a/chromium/chrome/browser/resources/md_extensions/error_page.js b/chromium/chrome/browser/resources/md_extensions/error_page.js new file mode 100644 index 00000000000..1203a997cf3 --- /dev/null +++ b/chromium/chrome/browser/resources/md_extensions/error_page.js @@ -0,0 +1,145 @@ +// 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. + +/** @typedef {chrome.developerPrivate.ManifestError} */ +var ManifestError; +/** @typedef {chrome.developerPrivate.RuntimeError} */ +var RuntimeError; + +cr.define('extensions', function() { + 'use strict'; + + /** @interface */ + var ErrorPageDelegate = function() {}; + + ErrorPageDelegate.prototype = { + /** + * @param {string} extensionId + * @param {!Array=} opt_errorIds + * @param {chrome.developerPrivate.ErrorType=} opt_type + */ + deleteErrors: assertNotReached, + + /** + * @param {chrome.developerPrivate.RequestFileSourceProperties} args + * @return {!Promise} + */ + requestFileSource: assertNotReached, + }; + + var ErrorPage = Polymer({ + is: 'extensions-error-page', + + behaviors: [Polymer.NeonAnimatableBehavior], + + properties: { + /** @type {!chrome.developerPrivate.ExtensionInfo|undefined} */ + data: Object, + + /** @type {!extensions.ErrorPageDelegate|undefined} */ + delegate: Object, + }, + + observers: [ + 'observeDataChanges_(data)', + ], + + ready: function() { + /** @type {!extensions.AnimationHelper} */ + this.animationHelper = new extensions.AnimationHelper(this, this.$.main); + this.animationHelper.setEntryAnimation(extensions.Animation.FADE_IN); + this.animationHelper.setExitAnimation(extensions.Animation.SCALE_DOWN); + this.sharedElements = {hero: this.$.main}; + }, + + /** + * Watches for changes to |data| in order to fetch the corresponding + * file source. + * @private + */ + observeDataChanges_: function() { + assert(this.data); + var e = this.data.manifestErrors[0] || this.data.runtimeErrors[0]; + if (e) + this.fetchCodeSource_(e); + }, + + /** + * @return {!Array} + * @private + */ + calculateShownItems_: function() { + return this.data.manifestErrors.concat(this.data.runtimeErrors); + }, + + /** @private */ + onCloseButtonTap_: function() { + this.fire('close'); + }, + + /** + * @param {!ManifestError|!RuntimeError} error + * @return {string} + * @private + */ + computeErrorIconClass_: function(error) { + if (error.type == chrome.developerPrivate.ErrorType.RUNTIME) { + switch (error.severity) { + case chrome.developerPrivate.ErrorLevel.LOG: + return 'icon-severity-info'; + case chrome.developerPrivate.ErrorLevel.WARN: + return 'icon-severity-warning'; + case chrome.developerPrivate.ErrorLevel.ERROR: + return 'icon-severity-fatal'; + } + assertNotReached(); + } + assert(error.type == chrome.developerPrivate.ErrorType.MANIFEST); + return 'icon-severity-warning'; + }, + + /** + * @param {!Event} event + * @private + */ + onDeleteErrorTap_: function(event) { + // TODO(devlin): It would be cleaner if we could cast this to a + // PolymerDomRepeatEvent-type thing, but that doesn't exist yet. + var e = /** @type {!{model:Object}} */(event); + this.delegate.deleteErrors(this.data.id, [e.model.item.id]); + }, + + /** + * Fetches the source for the given |error| and populates the code section. + * @param {!ManifestError|!RuntimeError} error + */ + fetchCodeSource_: function(error) { + var args = { + extensionId: error.extensionId, + message: error.message, + }; + switch (error.type) { + case chrome.developerPrivate.ErrorType.MANIFEST: + args.pathSuffix = error.source; + args.manifestKey = error.manifestKey; + args.manifestSpecific = error.manifestSpecific; + break; + case chrome.developerPrivate.ErrorType.RUNTIME: + // slice(1) because pathname starts with a /. + args.pathSuffix = new URL(error.source).pathname.slice(1); + args.lineNumber = error.stackTrace && error.stackTrace[0] ? + error.stackTrace[0].lineNumber : 0; + break; + } + this.delegate.requestFileSource(args).then(function(code) { + this.$['code-section'].code = code; + }.bind(this)); + }, + }); + + return { + ErrorPage: ErrorPage, + ErrorPageDelegate: ErrorPageDelegate, + }; +}); diff --git a/chromium/chrome/browser/resources/md_extensions/error_severity_fatal.png b/chromium/chrome/browser/resources/md_extensions/error_severity_fatal.png new file mode 100644 index 00000000000..b53dc2cf74b Binary files /dev/null and b/chromium/chrome/browser/resources/md_extensions/error_severity_fatal.png differ diff --git a/chromium/chrome/browser/resources/md_extensions/error_severity_info.png b/chromium/chrome/browser/resources/md_extensions/error_severity_info.png new file mode 100644 index 00000000000..1c32c6eb83f Binary files /dev/null and b/chromium/chrome/browser/resources/md_extensions/error_severity_info.png differ diff --git a/chromium/chrome/browser/resources/md_extensions/error_severity_warning.png b/chromium/chrome/browser/resources/md_extensions/error_severity_warning.png new file mode 100644 index 00000000000..d2e3434a595 Binary files /dev/null and b/chromium/chrome/browser/resources/md_extensions/error_severity_warning.png differ diff --git a/chromium/chrome/browser/resources/md_extensions/item.html b/chromium/chrome/browser/resources/md_extensions/item.html index 9e9a8ef5a28..845f3186c8d 100644 --- a/chromium/chrome/browser/resources/md_extensions/item.html +++ b/chromium/chrome/browser/resources/md_extensions/item.html @@ -216,6 +216,10 @@ $i18n{itemDetails} + + $i18n{itemErrors} + $i18n{itemRemove} diff --git a/chromium/chrome/browser/resources/md_extensions/item.js b/chromium/chrome/browser/resources/md_extensions/item.js index 70929a12eca..ae9df0a7c51 100644 --- a/chromium/chrome/browser/resources/md_extensions/item.js +++ b/chromium/chrome/browser/resources/md_extensions/item.js @@ -100,6 +100,15 @@ cr.define('extensions', function() { this.fire('extension-item-size-changed', {item: this.data}); }, + /** + * @return {boolean} + * @private + */ + computeErrorsHidden_: function() { + return !this.data.manifestErrors.length && + !this.data.runtimeErrors.length; + }, + /** @private */ onRemoveTap_: function() { this.delegate.deleteItem(this.data.id); @@ -111,9 +120,14 @@ cr.define('extensions', function() { this.$['enable-toggle'].checked); }, + /** @private */ + onErrorsTap_: function() { + this.fire('extension-item-show-errors', {data: this.data}); + }, + /** @private */ onDetailsTap_: function() { - this.fire('extension-item-show-details', {element: this}); + this.fire('extension-item-show-details', {data: this.data}); }, /** diff --git a/chromium/chrome/browser/resources/md_extensions/item_list.js b/chromium/chrome/browser/resources/md_extensions/item_list.js index 909b97b952a..74d9faa0b79 100644 --- a/chromium/chrome/browser/resources/md_extensions/item_list.js +++ b/chromium/chrome/browser/resources/md_extensions/item_list.js @@ -38,10 +38,10 @@ cr.define('extensions', function() { }, /** - * Called when the details for a given item are about to be shown. + * Called when a subpage for a given item is about to be shown. * @param {string} id */ - willShowItemDetails: function(id) { + willShowItemSubpage: function(id) { this.sharedElements = {hero: this.$$('#' + id)}; }, diff --git a/chromium/chrome/browser/resources/md_extensions/manager.html b/chromium/chrome/browser/resources/md_extensions/manager.html index c1f3df435dd..9625639fe40 100644 --- a/chromium/chrome/browser/resources/md_extensions/manager.html +++ b/chromium/chrome/browser/resources/md_extensions/manager.html @@ -8,6 +8,7 @@ + @@ -85,6 +86,8 @@ + + diff --git a/chromium/chrome/browser/resources/md_extensions/manager.js b/chromium/chrome/browser/resources/md_extensions/manager.js index 15f92ae4137..640c092e35a 100644 --- a/chromium/chrome/browser/resources/md_extensions/manager.js +++ b/chromium/chrome/browser/resources/md_extensions/manager.js @@ -11,6 +11,7 @@ var Page = { ITEM_LIST: '0', DETAIL_VIEW: '1', KEYBOARD_SHORTCUTS: '2', + ERROR_PAGE: '3', }; cr.define('extensions', function() { @@ -77,6 +78,7 @@ cr.define('extensions', function() { listeners: { 'items-list.extension-item-show-details': 'onShouldShowItemDetails_', + 'items-list.extension-item-show-errors': 'onShouldShowItemErrors_', }, created: function() { @@ -104,12 +106,16 @@ cr.define('extensions', function() { return this.$['options-dialog']; }, + get errorPage() { + return this.$['error-page']; + }, + /** * Shows the details view for a given item. * @param {!chrome.developerPrivate.ExtensionInfo} data */ showItemDetails: function(data) { - this.$['items-list'].willShowItemDetails(data.id); + this.$['items-list'].willShowItemSubpage(data.id); this.$['details-view'].data = data; this.changePage(Page.DETAIL_VIEW); }, @@ -226,6 +232,8 @@ cr.define('extensions', function() { return this.$['details-view']; case Page.KEYBOARD_SHORTCUTS: return this.$['keyboard-shortcuts']; + case Page.ERROR_PAGE: + return this.$['error-page']; } assertNotReached(); }, @@ -240,7 +248,8 @@ cr.define('extensions', function() { return; var entry; var exit; - if (fromPage == Page.ITEM_LIST && toPage == Page.DETAIL_VIEW) { + if (fromPage == Page.ITEM_LIST && (toPage == Page.DETAIL_VIEW || + toPage == Page.ERROR_PAGE)) { entry = extensions.Animation.HERO; exit = extensions.Animation.HERO; } else if (toPage == Page.ITEM_LIST) { @@ -263,12 +272,29 @@ cr.define('extensions', function() { * @private */ onShouldShowItemDetails_: function(e) { - this.showItemDetails(e.detail.element.data); + this.showItemDetails(e.detail.data); + }, + + /** + * Handles the event for the user clicking on the errors button. + * @param {!CustomEvent} e + * @private + */ + onShouldShowItemErrors_: function(e) { + var data = e.detail.data; + this.$['items-list'].willShowItemSubpage(data.id); + this.$['error-page'].data = data; + this.changePage(Page.ERROR_PAGE); }, /** @private */ onDetailsViewClose_: function() { this.changePage(Page.ITEM_LIST); + }, + + /** @private */ + onErrorPageClose_: function() { + this.changePage(Page.ITEM_LIST); } }); diff --git a/chromium/chrome/browser/resources/md_extensions/service.js b/chromium/chrome/browser/resources/md_extensions/service.js index 9ef7d8d7209..08abe7d66e8 100644 --- a/chromium/chrome/browser/resources/md_extensions/service.js +++ b/chromium/chrome/browser/resources/md_extensions/service.js @@ -10,6 +10,7 @@ cr.define('extensions', function() { * @implements {extensions.ItemDelegate} * @implements {extensions.SidebarDelegate} * @implements {extensions.PackDialogDelegate} + * @implements {extensions.ErrorPageDelegate} */ function Service() {} @@ -24,6 +25,7 @@ cr.define('extensions', function() { this.manager_.sidebar.setDelegate(this); this.manager_.set('itemDelegate', this); this.manager_.packDialog.set('delegate', this); + this.manager_.errorPage.delegate = this; var keyboardShortcuts = this.manager_.keyboardShortcuts; keyboardShortcuts.addEventListener( 'shortcut-updated', @@ -270,6 +272,24 @@ cr.define('extensions', function() { updateAllExtensions: function() { chrome.developerPrivate.autoUpdate(); }, + + /** @override */ + deleteErrors: function(extensionId, errorIds, type) { + chrome.developerPrivate.deleteExtensionErrors({ + extensionId: extensionId, + errorIds: errorIds, + type: type, + }); + }, + + /** @override */ + requestFileSource: function(args) { + return new Promise(function(resolve, reject) { + chrome.developerPrivate.requestFileSource(args, function(code) { + resolve(code); + }); + }); + }, }; cr.addSingletonGetter(Service); diff --git a/chromium/chrome/browser/resources/md_feedback/compiled_resources2.gyp b/chromium/chrome/browser/resources/md_feedback/compiled_resources2.gyp new file mode 100644 index 00000000000..a3b6ac3db1f --- /dev/null +++ b/chromium/chrome/browser/resources/md_feedback/compiled_resources2.gyp @@ -0,0 +1,22 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'feedback', + 'dependencies': [ + '<(EXTERNS_GYP):chrome_send', + '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:util', + ], + 'includes': ['../../../../third_party/closure_compiler/compile_js2.gypi'], + }, + { + 'target_name': 'feedback_container', + 'dependencies': [ + '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:load_time_data', + ], + 'includes': ['../../../../third_party/closure_compiler/compile_js2.gypi'], + }, + ], +} diff --git a/chromium/chrome/browser/resources/md_feedback/feedback.js b/chromium/chrome/browser/resources/md_feedback/feedback.js index d36aab512e7..61695ad98a3 100644 --- a/chromium/chrome/browser/resources/md_feedback/feedback.js +++ b/chromium/chrome/browser/resources/md_feedback/feedback.js @@ -13,8 +13,8 @@ Feedback.UI = class { /** * Populates the feedback form with data. * - * @param {{email: string|undefined, - * url: string|undefined}} data + * @param {{email: (string|undefined), + * url: (string|undefined)}} data * Parameters in data: * email - user's email, if available. * url - url of the tab the user was on before triggering feedback. diff --git a/chromium/chrome/browser/resources/md_feedback/feedback_container.html b/chromium/chrome/browser/resources/md_feedback/feedback_container.html index 3c6b72f9612..6c0047102f3 100644 --- a/chromium/chrome/browser/resources/md_feedback/feedback_container.html +++ b/chromium/chrome/browser/resources/md_feedback/feedback_container.html @@ -55,8 +55,8 @@
$i18n{additionalInfoLabel} - - + +
$i18n{includeScreenshotLabel}
diff --git a/chromium/chrome/browser/resources/md_history/app.crisper.js b/chromium/chrome/browser/resources/md_history/app.crisper.js index 00420efa015..b87c842797a 100644 --- a/chromium/chrome/browser/resources/md_history/app.crisper.js +++ b/chromium/chrome/browser/resources/md_history/app.crisper.js @@ -13,28 +13,25 @@ cr.define("cr.ui",function(){function decorate(source,constr){var elements;if(ty // 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. -cr.define("cr.ui",function(){function KeyboardShortcut(shortcut){var mods={};var ident="";shortcut.split("|").forEach(function(part){var partLc=part.toLowerCase();switch(partLc){case"alt":case"ctrl":case"meta":case"shift":mods[partLc+"Key"]=true;break;default:if(ident)throw Error("Invalid shortcut");ident=part}});this.ident_=ident;this.mods_=mods}KeyboardShortcut.prototype={matchesEvent:function(e){if(e.key==this.ident_){var mods=this.mods_;return["altKey","ctrlKey","metaKey","shiftKey"].every(function(k){return e[k]==!!mods[k]})}return false}};var Command=cr.ui.define("command");Command.prototype={__proto__:HTMLElement.prototype,decorate:function(){CommandManager.init(assert(this.ownerDocument));if(this.hasAttribute("shortcut"))this.shortcut=this.getAttribute("shortcut")},execute:function(opt_element){if(this.disabled)return;var doc=this.ownerDocument;if(doc.activeElement){var e=new Event("command",{bubbles:true});e.command=this;(opt_element||doc.activeElement).dispatchEvent(e)}},canExecuteChange:function(opt_node){dispatchCanExecuteEvent(this,opt_node||this.ownerDocument.activeElement)},shortcut_:"",get shortcut(){return this.shortcut_},set shortcut(shortcut){var oldShortcut=this.shortcut_;if(shortcut!==oldShortcut){this.keyboardShortcuts_=shortcut.split(/\s+/).map(function(shortcut){return new KeyboardShortcut(shortcut)});this.shortcut_=shortcut;cr.dispatchPropertyChange(this,"shortcut",this.shortcut_,oldShortcut)}},matchesEvent:function(e){if(!this.keyboardShortcuts_)return false;return this.keyboardShortcuts_.some(function(keyboardShortcut){return keyboardShortcut.matchesEvent(e)})}};cr.defineProperty(Command,"label",cr.PropertyKind.ATTR);cr.defineProperty(Command,"disabled",cr.PropertyKind.BOOL_ATTR);cr.defineProperty(Command,"hidden",cr.PropertyKind.BOOL_ATTR);cr.defineProperty(Command,"checked",cr.PropertyKind.BOOL_ATTR);cr.defineProperty(Command,"hideShortcutText",cr.PropertyKind.BOOL_ATTR);function dispatchCanExecuteEvent(command,target){var e=new CanExecuteEvent(command);target.dispatchEvent(e);command.disabled=!e.canExecute}var commandManagers={};function CommandManager(doc){doc.addEventListener("focus",this.handleFocus_.bind(this),true);doc.addEventListener("keydown",this.handleKeyDown_.bind(this),false)}CommandManager.init=function(doc){var uid=cr.getUid(doc);if(!(uid in commandManagers)){commandManagers[uid]=new CommandManager(doc)}};CommandManager.prototype={handleFocus_:function(e){var target=e.target;if(target.menu||target.command)return;var commands=Array.prototype.slice.call(target.ownerDocument.querySelectorAll("command"));commands.forEach(function(command){dispatchCanExecuteEvent(command,target)})},handleKeyDown_:function(e){var target=e.target;var commands=Array.prototype.slice.call(target.ownerDocument.querySelectorAll("command"));for(var i=0,command;command=commands[i];i++){if(command.matchesEvent(e)){command.canExecuteChange();if(!command.disabled){e.preventDefault();e.stopPropagation();command.execute();return}}}}};function CanExecuteEvent(command){var e=new Event("canExecute",{bubbles:true,cancelable:true});e.__proto__=CanExecuteEvent.prototype;e.command=command;return e}CanExecuteEvent.prototype={__proto__:Event.prototype,command:null,canExecute_:false,get canExecute(){return this.canExecute_},set canExecute(canExecute){this.canExecute_=!!canExecute;this.stopPropagation();this.preventDefault()}};return{Command:Command,CanExecuteEvent:CanExecuteEvent}}); +cr.define("cr.ui",function(){function KeyboardShortcut(shortcut){var mods={};var ident="";shortcut.split("|").forEach(function(part){var partLc=part.toLowerCase();switch(partLc){case"alt":case"ctrl":case"meta":case"shift":mods[partLc+"Key"]=true;break;default:if(ident)throw Error("Invalid shortcut");ident=part}});this.ident_=ident;this.mods_=mods}KeyboardShortcut.prototype={matchesEvent:function(e){if(e.key==this.ident_){var mods=this.mods_;return["altKey","ctrlKey","metaKey","shiftKey"].every(function(k){return e[k]==!!mods[k]})}return false}};var Command=cr.ui.define("command");Command.prototype={__proto__:HTMLElement.prototype,decorate:function(){CommandManager.init(assert(this.ownerDocument));if(this.hasAttribute("shortcut"))this.shortcut=this.getAttribute("shortcut")},execute:function(opt_element){if(this.disabled)return;var doc=this.ownerDocument;if(doc.activeElement){var e=new Event("command",{bubbles:true});e.command=this;(opt_element||doc.activeElement).dispatchEvent(e)}},canExecuteChange:function(opt_node){dispatchCanExecuteEvent(this,opt_node||this.ownerDocument.activeElement)},shortcut_:"",get shortcut(){return this.shortcut_},set shortcut(shortcut){var oldShortcut=this.shortcut_;if(shortcut!==oldShortcut){this.keyboardShortcuts_=shortcut.split(/\s+/).map(function(shortcut){return new KeyboardShortcut(shortcut)});this.shortcut_=shortcut;cr.dispatchPropertyChange(this,"shortcut",this.shortcut_,oldShortcut)}},matchesEvent:function(e){if(!this.keyboardShortcuts_)return false;return this.keyboardShortcuts_.some(function(keyboardShortcut){return keyboardShortcut.matchesEvent(e)})}};cr.defineProperty(Command,"label",cr.PropertyKind.ATTR);cr.defineProperty(Command,"disabled",cr.PropertyKind.BOOL_ATTR);cr.defineProperty(Command,"hidden",cr.PropertyKind.BOOL_ATTR);cr.defineProperty(Command,"checked",cr.PropertyKind.BOOL_ATTR);cr.defineProperty(Command,"hideShortcutText",cr.PropertyKind.BOOL_ATTR);function dispatchCanExecuteEvent(command,target){var e=new CanExecuteEvent(command);target.dispatchEvent(e);command.disabled=!e.canExecute}var commandManagers={};function CommandManager(doc){doc.addEventListener("focus",this.handleFocus_.bind(this),true);doc.addEventListener("keydown",this.handleKeyDown_.bind(this),false)}CommandManager.init=function(doc){var uid=cr.getUid(doc);if(!(uid in commandManagers)){commandManagers[uid]=new CommandManager(doc)}};CommandManager.prototype={handleFocus_:function(e){var target=e.target;if(target.menu||target.command)return;var commands=Array.prototype.slice.call(target.ownerDocument.querySelectorAll("command"));commands.forEach(function(command){dispatchCanExecuteEvent(command,target)})},handleKeyDown_:function(e){var target=e.target;var commands=Array.prototype.slice.call(target.ownerDocument.querySelectorAll("command"));for(var i=0,command;command=commands[i];i++){if(command.matchesEvent(e)){command.canExecuteChange();if(!command.disabled){e.preventDefault();e.stopPropagation();command.execute();return}}}}};function CanExecuteEvent(command){var e=new Event("canExecute",{bubbles:true,cancelable:true});e.__proto__=CanExecuteEvent.prototype;e.command=command;return e}CanExecuteEvent.prototype={__proto__:Event.prototype,command:null,canExecute_:false,get canExecute(){return this.canExecute_},set canExecute(canExecute){this.canExecute_=!!canExecute;this.stopPropagation();this.preventDefault()}};return{Command:Command,CanExecuteEvent:CanExecuteEvent}});Polymer({is:"iron-media-query",properties:{queryMatches:{type:Boolean,value:false,readOnly:true,notify:true},query:{type:String,observer:"queryChanged"},full:{type:Boolean,value:false},_boundMQHandler:{value:function(){return this.queryHandler.bind(this)}},_mq:{value:null}},attached:function(){this.style.display="none";this.queryChanged()},detached:function(){this._remove()},_add:function(){if(this._mq){this._mq.addListener(this._boundMQHandler)}},_remove:function(){if(this._mq){this._mq.removeListener(this._boundMQHandler)}this._mq=null},queryChanged:function(){this._remove();var query=this.query;if(!query){return}if(!this.full&&query[0]!=="("){query="("+query+")"}this._mq=window.matchMedia(query);this._add();this.queryHandler(this._mq)},queryHandler:function(mq){this._setQueryMatches(mq.matches)}});Polymer.IronResizableBehavior={properties:{_parentResizable:{type:Object,observer:"_parentResizableChanged"},_notifyingDescendant:{type:Boolean,value:false}},listeners:{"iron-request-resize-notifications":"_onIronRequestResizeNotifications"},created:function(){this._interestedResizables=[];this._boundNotifyResize=this.notifyResize.bind(this)},attached:function(){this.fire("iron-request-resize-notifications",null,{node:this,bubbles:true,cancelable:true});if(!this._parentResizable){window.addEventListener("resize",this._boundNotifyResize);this.notifyResize()}},detached:function(){if(this._parentResizable){this._parentResizable.stopResizeNotificationsFor(this)}else{window.removeEventListener("resize",this._boundNotifyResize)}this._parentResizable=null},notifyResize:function(){if(!this.isAttached){return}this._interestedResizables.forEach(function(resizable){if(this.resizerShouldNotify(resizable)){this._notifyDescendant(resizable)}},this);this._fireResize()},assignParentResizable:function(parentResizable){this._parentResizable=parentResizable},stopResizeNotificationsFor:function(target){var index=this._interestedResizables.indexOf(target);if(index>-1){this._interestedResizables.splice(index,1);this.unlisten(target,"iron-resize","_onDescendantIronResize")}},resizerShouldNotify:function(element){return true},_onDescendantIronResize:function(event){if(this._notifyingDescendant){event.stopPropagation();return}if(!Polymer.Settings.useShadow){this._fireResize()}},_fireResize:function(){this.fire("iron-resize",null,{node:this,bubbles:false})},_onIronRequestResizeNotifications:function(event){var target=event.path?event.path[0]:event.target;if(target===this){return}if(this._interestedResizables.indexOf(target)===-1){this._interestedResizables.push(target);this.listen(target,"iron-resize","_onDescendantIronResize")}target.assignParentResizable(this);this._notifyDescendant(target);event.stopPropagation()},_parentResizableChanged:function(parentResizable){if(parentResizable){window.removeEventListener("resize",this._boundNotifyResize)}},_notifyDescendant:function(descendant){if(!this.isAttached){return}this._notifyingDescendant=true;descendant.notifyResize();this._notifyingDescendant=false}};Polymer.IronSelection=function(selectCallback){this.selection=[];this.selectCallback=selectCallback};Polymer.IronSelection.prototype={get:function(){return this.multi?this.selection.slice():this.selection[0]},clear:function(excludes){this.selection.slice().forEach(function(item){if(!excludes||excludes.indexOf(item)<0){this.setItemSelected(item,false)}},this)},isSelected:function(item){return this.selection.indexOf(item)>=0},setItemSelected:function(item,isSelected){if(item!=null){if(isSelected!==this.isSelected(item)){if(isSelected){this.selection.push(item)}else{var i=this.selection.indexOf(item);if(i>=0){this.selection.splice(i,1)}}if(this.selectCallback){this.selectCallback(item,isSelected)}}}},select:function(item){if(this.multi){this.toggle(item)}else if(this.get()!==item){this.setItemSelected(this.get(),false);this.setItemSelected(item,true)}},toggle:function(item){this.setItemSelected(item,!this.isSelected(item))}};Polymer.IronSelectableBehavior={properties:{attrForSelected:{type:String,value:null},selected:{type:String,notify:true},selectedItem:{type:Object,readOnly:true,notify:true},activateEvent:{type:String,value:"tap",observer:"_activateEventChanged"},selectable:String,selectedClass:{type:String,value:"iron-selected"},selectedAttribute:{type:String,value:null},fallbackSelection:{type:String,value:null},items:{type:Array,readOnly:true,notify:true,value:function(){return[]}},_excludedLocalNames:{type:Object,value:function(){return{template:1}}}},observers:["_updateAttrForSelected(attrForSelected)","_updateSelected(selected)","_checkFallback(fallbackSelection)"],created:function(){this._bindFilterItem=this._filterItem.bind(this);this._selection=new Polymer.IronSelection(this._applySelection.bind(this))},attached:function(){this._observer=this._observeItems(this);this._updateItems();if(!this._shouldUpdateSelection){this._updateSelected()}this._addListener(this.activateEvent)},detached:function(){if(this._observer){Polymer.dom(this).unobserveNodes(this._observer)}this._removeListener(this.activateEvent)},indexOf:function(item){return this.items.indexOf(item)},select:function(value){this.selected=value},selectPrevious:function(){var length=this.items.length;var index=(Number(this._valueToIndex(this.selected))-1+length)%length;this.selected=this._indexToValue(index)},selectNext:function(){var index=(Number(this._valueToIndex(this.selected))+1)%this.items.length;this.selected=this._indexToValue(index)},selectIndex:function(index){this.select(this._indexToValue(index))},forceSynchronousItemUpdate:function(){this._updateItems()},get _shouldUpdateSelection(){return this.selected!=null},_checkFallback:function(){if(this._shouldUpdateSelection){this._updateSelected()}},_addListener:function(eventName){this.listen(this,eventName,"_activateHandler")},_removeListener:function(eventName){this.unlisten(this,eventName,"_activateHandler")},_activateEventChanged:function(eventName,old){this._removeListener(old);this._addListener(eventName)},_updateItems:function(){var nodes=Polymer.dom(this).queryDistributedElements(this.selectable||"*");nodes=Array.prototype.filter.call(nodes,this._bindFilterItem);this._setItems(nodes)},_updateAttrForSelected:function(){if(this._shouldUpdateSelection){this.selected=this._indexToValue(this.indexOf(this.selectedItem))}},_updateSelected:function(){this._selectSelected(this.selected)},_selectSelected:function(selected){this._selection.select(this._valueToItem(this.selected));if(this.fallbackSelection&&this.items.length&&this._selection.get()===undefined){this.selected=this.fallbackSelection}},_filterItem:function(node){return!this._excludedLocalNames[node.localName]},_valueToItem:function(value){return value==null?null:this.items[this._valueToIndex(value)]},_valueToIndex:function(value){if(this.attrForSelected){for(var i=0,item;item=this.items[i];i++){if(this._valueForItem(item)==value){return i}}}else{return Number(value)}},_indexToValue:function(index){if(this.attrForSelected){var item=this.items[index];if(item){return this._valueForItem(item)}}else{return index}},_valueForItem:function(item){var propValue=item[Polymer.CaseMap.dashToCamelCase(this.attrForSelected)];return propValue!=undefined?propValue:item.getAttribute(this.attrForSelected)},_applySelection:function(item,isSelected){if(this.selectedClass){this.toggleClass(this.selectedClass,isSelected,item)}if(this.selectedAttribute){this.toggleAttribute(this.selectedAttribute,isSelected,item)}this._selectionChange();this.fire("iron-"+(isSelected?"select":"deselect"),{item:item})},_selectionChange:function(){this._setSelectedItem(this._selection.get())},_observeItems:function(node){return Polymer.dom(node).observeNodes(function(mutation){this._updateItems();if(this._shouldUpdateSelection){this._updateSelected()}this.fire("iron-items-changed",mutation,{bubbles:false,cancelable:false})})},_activateHandler:function(e){var t=e.target;var items=this.items;while(t&&t!=this){var i=items.indexOf(t);if(i>=0){var value=this._indexToValue(i);this._itemActivate(value,t);return}t=t.parentNode}},_itemActivate:function(value,item){if(!this.fire("iron-activate",{selected:value,item:item},{cancelable:true}).defaultPrevented){this.select(value)}}};Polymer({is:"iron-pages",behaviors:[Polymer.IronResizableBehavior,Polymer.IronSelectableBehavior],properties:{activateEvent:{type:String,value:null}},observers:["_selectedPageChanged(selected)"],_selectedPageChanged:function(selected,old){this.async(this.notifyResize)}});Polymer.IronScrollTargetBehavior={properties:{scrollTarget:{type:HTMLElement,value:function(){return this._defaultScrollTarget}}},observers:["_scrollTargetChanged(scrollTarget, isAttached)"],_shouldHaveListener:true,_scrollTargetChanged:function(scrollTarget,isAttached){var eventTarget;if(this._oldScrollTarget){this._toggleScrollListener(false,this._oldScrollTarget);this._oldScrollTarget=null}if(!isAttached){return}if(scrollTarget==="document"){this.scrollTarget=this._doc}else if(typeof scrollTarget==="string"){this.scrollTarget=this.domHost?this.domHost.$[scrollTarget]:Polymer.dom(this.ownerDocument).querySelector("#"+scrollTarget)}else if(this._isValidScrollTarget()){this._boundScrollHandler=this._boundScrollHandler||this._scrollHandler.bind(this);this._oldScrollTarget=scrollTarget;this._toggleScrollListener(this._shouldHaveListener,scrollTarget)}},_scrollHandler:function scrollHandler(){},get _defaultScrollTarget(){return this._doc},get _doc(){return this.ownerDocument.documentElement},get _scrollTop(){if(this._isValidScrollTarget()){return this.scrollTarget===this._doc?window.pageYOffset:this.scrollTarget.scrollTop}return 0},get _scrollLeft(){if(this._isValidScrollTarget()){return this.scrollTarget===this._doc?window.pageXOffset:this.scrollTarget.scrollLeft}return 0},set _scrollTop(top){if(this.scrollTarget===this._doc){window.scrollTo(window.pageXOffset,top)}else if(this._isValidScrollTarget()){this.scrollTarget.scrollTop=top}},set _scrollLeft(left){if(this.scrollTarget===this._doc){window.scrollTo(left,window.pageYOffset)}else if(this._isValidScrollTarget()){this.scrollTarget.scrollLeft=left}},scroll:function(left,top){if(this.scrollTarget===this._doc){window.scrollTo(left,top)}else if(this._isValidScrollTarget()){this.scrollTarget.scrollLeft=left;this.scrollTarget.scrollTop=top}},get _scrollTargetWidth(){if(this._isValidScrollTarget()){return this.scrollTarget===this._doc?window.innerWidth:this.scrollTarget.offsetWidth}return 0},get _scrollTargetHeight(){if(this._isValidScrollTarget()){return this.scrollTarget===this._doc?window.innerHeight:this.scrollTarget.offsetHeight}return 0},_isValidScrollTarget:function(){return this.scrollTarget instanceof HTMLElement},_toggleScrollListener:function(yes,scrollTarget){if(!this._boundScrollHandler){return}var eventTarget=scrollTarget===this._doc?window:scrollTarget;if(yes){eventTarget.addEventListener("scroll",this._boundScrollHandler)}else{eventTarget.removeEventListener("scroll",this._boundScrollHandler)}},toggleScrollListener:function(yes){this._shouldHaveListener=yes;this._toggleScrollListener(yes,this.scrollTarget)}};(function(){var metaDatas={};var metaArrays={};var singleton=null;Polymer.IronMeta=Polymer({is:"iron-meta",properties:{type:{type:String,value:"default",observer:"_typeChanged"},key:{type:String,observer:"_keyChanged"},value:{type:Object,notify:true,observer:"_valueChanged"},self:{type:Boolean,observer:"_selfChanged"},list:{type:Array,notify:true}},hostAttributes:{hidden:true},factoryImpl:function(config){if(config){for(var n in config){switch(n){case"type":case"key":case"value":this[n]=config[n];break}}}},created:function(){this._metaDatas=metaDatas;this._metaArrays=metaArrays},_keyChanged:function(key,old){this._resetRegistration(old)},_valueChanged:function(value){this._resetRegistration(this.key)},_selfChanged:function(self){if(self){this.value=this}},_typeChanged:function(type){this._unregisterKey(this.key);if(!metaDatas[type]){metaDatas[type]={}}this._metaData=metaDatas[type];if(!metaArrays[type]){metaArrays[type]=[]}this.list=metaArrays[type];this._registerKeyValue(this.key,this.value)},byKey:function(key){return this._metaData&&this._metaData[key]},_resetRegistration:function(oldKey){this._unregisterKey(oldKey);this._registerKeyValue(this.key,this.value)},_unregisterKey:function(key){this._unregister(key,this._metaData,this.list)},_registerKeyValue:function(key,value){this._register(key,value,this._metaData,this.list)},_register:function(key,value,data,list){if(key&&data&&value!==undefined){data[key]=value;list.push(value)}},_unregister:function(key,data,list){if(key&&data){if(key in data){var value=data[key];delete data[key];this.arrayDelete(list,value)}}}});Polymer.IronMeta.getIronMeta=function getIronMeta(){if(singleton===null){singleton=new Polymer.IronMeta}return singleton};Polymer.IronMetaQuery=Polymer({is:"iron-meta-query",properties:{type:{type:String,value:"default",observer:"_typeChanged"},key:{type:String,observer:"_keyChanged"},value:{type:Object,notify:true,readOnly:true},list:{type:Array,notify:true}},factoryImpl:function(config){if(config){for(var n in config){switch(n){case"type":case"key":this[n]=config[n];break}}}},created:function(){this._metaDatas=metaDatas;this._metaArrays=metaArrays},_keyChanged:function(key){this._setValue(this._metaData&&this._metaData[key])},_typeChanged:function(type){this._metaData=metaDatas[type];this.list=metaArrays[type];if(this.key){this._keyChanged(this.key)}},byKey:function(key){return this._metaData&&this._metaData[key]}})})();Polymer({is:"iron-icon",properties:{icon:{type:String,observer:"_iconChanged"},theme:{type:String,observer:"_updateIcon"},src:{type:String,observer:"_srcChanged"},_meta:{value:Polymer.Base.create("iron-meta",{type:"iconset"}),observer:"_updateIcon"}},_DEFAULT_ICONSET:"icons",_iconChanged:function(icon){var parts=(icon||"").split(":");this._iconName=parts.pop();this._iconsetName=parts.pop()||this._DEFAULT_ICONSET;this._updateIcon()},_srcChanged:function(src){this._updateIcon()},_usesIconset:function(){return this.icon||!this.src},_updateIcon:function(){if(this._usesIconset()){if(this._img&&this._img.parentNode){Polymer.dom(this.root).removeChild(this._img)}if(this._iconName===""){if(this._iconset){this._iconset.removeIcon(this)}}else if(this._iconsetName&&this._meta){this._iconset=this._meta.byKey(this._iconsetName);if(this._iconset){this._iconset.applyIcon(this,this._iconName,this.theme);this.unlisten(window,"iron-iconset-added","_updateIcon")}else{this.listen(window,"iron-iconset-added","_updateIcon")}}}else{if(this._iconset){this._iconset.removeIcon(this)}if(!this._img){this._img=document.createElement("img");this._img.style.width="100%";this._img.style.height="100%";this._img.draggable=false}this._img.src=this.src;Polymer.dom(this.root).appendChild(this._img)}}});(function(){"use strict";var KEY_IDENTIFIER={"U+0008":"backspace","U+0009":"tab","U+001B":"esc","U+0020":"space","U+007F":"del"};var KEY_CODE={8:"backspace",9:"tab",13:"enter",27:"esc",33:"pageup",34:"pagedown",35:"end",36:"home",32:"space",37:"left",38:"up",39:"right",40:"down",46:"del",106:"*"};var MODIFIER_KEYS={shift:"shiftKey",ctrl:"ctrlKey",alt:"altKey",meta:"metaKey"};var KEY_CHAR=/[a-z0-9*]/;var IDENT_CHAR=/U\+/;var ARROW_KEY=/^arrow/;var SPACE_KEY=/^space(bar)?/;var ESC_KEY=/^escape$/;function transformKey(key,noSpecialChars){var validKey="";if(key){var lKey=key.toLowerCase();if(lKey===" "||SPACE_KEY.test(lKey)){validKey="space"}else if(ESC_KEY.test(lKey)){validKey="esc"}else if(lKey.length==1){if(!noSpecialChars||KEY_CHAR.test(lKey)){validKey=lKey}}else if(ARROW_KEY.test(lKey)){validKey=lKey.replace("arrow","")}else if(lKey=="multiply"){validKey="*"}else{validKey=lKey}}return validKey}function transformKeyIdentifier(keyIdent){var validKey="";if(keyIdent){if(keyIdent in KEY_IDENTIFIER){validKey=KEY_IDENTIFIER[keyIdent]}else if(IDENT_CHAR.test(keyIdent)){keyIdent=parseInt(keyIdent.replace("U+","0x"),16);validKey=String.fromCharCode(keyIdent).toLowerCase()}else{validKey=keyIdent.toLowerCase()}}return validKey}function transformKeyCode(keyCode){var validKey="";if(Number(keyCode)){if(keyCode>=65&&keyCode<=90){validKey=String.fromCharCode(32+keyCode)}else if(keyCode>=112&&keyCode<=123){validKey="f"+(keyCode-112)}else if(keyCode>=48&&keyCode<=57){validKey=String(keyCode-48)}else if(keyCode>=96&&keyCode<=105){validKey=String(keyCode-96)}else{validKey=KEY_CODE[keyCode]}}return validKey}function normalizedKeyForEvent(keyEvent,noSpecialChars){if(keyEvent.key){return transformKey(keyEvent.key,noSpecialChars)}if(keyEvent.detail&&keyEvent.detail.key){return transformKey(keyEvent.detail.key,noSpecialChars)}return transformKeyIdentifier(keyEvent.keyIdentifier)||transformKeyCode(keyEvent.keyCode)||""}function keyComboMatchesEvent(keyCombo,event){var keyEvent=normalizedKeyForEvent(event,keyCombo.hasModifiers);return keyEvent===keyCombo.key&&(!keyCombo.hasModifiers||!!event.shiftKey===!!keyCombo.shiftKey&&!!event.ctrlKey===!!keyCombo.ctrlKey&&!!event.altKey===!!keyCombo.altKey&&!!event.metaKey===!!keyCombo.metaKey)}function parseKeyComboString(keyComboString){if(keyComboString.length===1){return{combo:keyComboString,key:keyComboString,event:"keydown"}}return keyComboString.split("+").reduce(function(parsedKeyCombo,keyComboPart){var eventParts=keyComboPart.split(":");var keyName=eventParts[0];var event=eventParts[1];if(keyName in MODIFIER_KEYS){parsedKeyCombo[MODIFIER_KEYS[keyName]]=true;parsedKeyCombo.hasModifiers=true}else{parsedKeyCombo.key=keyName;parsedKeyCombo.event=event||"keydown"}return parsedKeyCombo},{combo:keyComboString.split(":").shift()})}function parseEventString(eventString){return eventString.trim().split(" ").map(function(keyComboString){return parseKeyComboString(keyComboString)})}Polymer.IronA11yKeysBehavior={properties:{keyEventTarget:{type:Object,value:function(){return this}},stopKeyboardEventPropagation:{type:Boolean,value:false},_boundKeyHandlers:{type:Array,value:function(){return[]}},_imperativeKeyBindings:{type:Object,value:function(){return{}}}},observers:["_resetKeyEventListeners(keyEventTarget, _boundKeyHandlers)"],keyBindings:{},registered:function(){this._prepKeyBindings()},attached:function(){this._listenKeyEventListeners()},detached:function(){this._unlistenKeyEventListeners()},addOwnKeyBinding:function(eventString,handlerName){this._imperativeKeyBindings[eventString]=handlerName;this._prepKeyBindings();this._resetKeyEventListeners()},removeOwnKeyBindings:function(){this._imperativeKeyBindings={};this._prepKeyBindings();this._resetKeyEventListeners()},keyboardEventMatchesKeys:function(event,eventString){var keyCombos=parseEventString(eventString);for(var i=0;i=Math.min(this.maxRadius,Ripple.MAX_RADIUS)},get isRestingAtMaxRadius(){return this.opacity>=this.initialOpacity&&this.radius>=Math.min(this.maxRadius,Ripple.MAX_RADIUS)},get isAnimationComplete(){return this.mouseUpStart?this.isOpacityFullyDecayed:this.isRestingAtMaxRadius},get translationFraction(){return Math.min(1,this.radius/this.containerMetrics.size*2/Math.sqrt(2))},get xNow(){if(this.xEnd){return this.xStart+this.translationFraction*(this.xEnd-this.xStart)}return this.xStart},get yNow(){if(this.yEnd){return this.yStart+this.translationFraction*(this.yEnd-this.yStart)}return this.yStart},get isMouseDown(){return this.mouseDownStart&&!this.mouseUpStart},resetInteractionState:function(){this.maxRadius=0;this.mouseDownStart=0;this.mouseUpStart=0;this.xStart=0; + +this.yStart=0;this.xEnd=0;this.yEnd=0;this.slideDistance=0;this.containerMetrics=new ElementMetrics(this.element)},draw:function(){var scale;var translateString;var dx;var dy;this.wave.style.opacity=this.opacity;scale=this.radius/(this.containerMetrics.size/2);dx=this.xNow-this.containerMetrics.width/2;dy=this.yNow-this.containerMetrics.height/2;this.waveContainer.style.webkitTransform="translate("+dx+"px, "+dy+"px)";this.waveContainer.style.transform="translate3d("+dx+"px, "+dy+"px, 0)";this.wave.style.webkitTransform="scale("+scale+","+scale+")";this.wave.style.transform="scale3d("+scale+","+scale+",1)"},downAction:function(event){var xCenter=this.containerMetrics.width/2;var yCenter=this.containerMetrics.height/2;this.resetInteractionState();this.mouseDownStart=Utility.now();if(this.center){this.xStart=xCenter;this.yStart=yCenter;this.slideDistance=Utility.distance(this.xStart,this.yStart,this.xEnd,this.yEnd)}else{this.xStart=event?event.detail.x-this.containerMetrics.boundingRect.left:this.containerMetrics.width/2;this.yStart=event?event.detail.y-this.containerMetrics.boundingRect.top:this.containerMetrics.height/2}if(this.recenters){this.xEnd=xCenter;this.yEnd=yCenter;this.slideDistance=Utility.distance(this.xStart,this.yStart,this.xEnd,this.yEnd)}this.maxRadius=this.containerMetrics.furthestCornerDistanceFrom(this.xStart,this.yStart);this.waveContainer.style.top=(this.containerMetrics.height-this.containerMetrics.size)/2+"px";this.waveContainer.style.left=(this.containerMetrics.width-this.containerMetrics.size)/2+"px";this.waveContainer.style.width=this.containerMetrics.size+"px";this.waveContainer.style.height=this.containerMetrics.size+"px"},upAction:function(event){if(!this.isMouseDown){return}this.mouseUpStart=Utility.now()},remove:function(){Polymer.dom(this.waveContainer.parentNode).removeChild(this.waveContainer)}};Polymer({is:"paper-ripple",behaviors:[Polymer.IronA11yKeysBehavior],properties:{initialOpacity:{type:Number,value:.25},opacityDecayVelocity:{type:Number,value:.8},recenters:{type:Boolean,value:false},center:{type:Boolean,value:false},ripples:{type:Array,value:function(){return[]}},animating:{type:Boolean,readOnly:true,reflectToAttribute:true,value:false},holdDown:{type:Boolean,value:false,observer:"_holdDownChanged"},noink:{type:Boolean,value:false},_animating:{type:Boolean},_boundAnimate:{type:Function,value:function(){return this.animate.bind(this)}}},get target(){return this.keyEventTarget},keyBindings:{"enter:keydown":"_onEnterKeydown","space:keydown":"_onSpaceKeydown","space:keyup":"_onSpaceKeyup"},attached:function(){if(this.parentNode.nodeType==11){this.keyEventTarget=Polymer.dom(this).getOwnerRoot().host}else{this.keyEventTarget=this.parentNode}var keyEventTarget=this.keyEventTarget;this.listen(keyEventTarget,"up","uiUpAction");this.listen(keyEventTarget,"down","uiDownAction")},detached:function(){this.unlisten(this.keyEventTarget,"up","uiUpAction");this.unlisten(this.keyEventTarget,"down","uiDownAction");this.keyEventTarget=null},get shouldKeepAnimating(){for(var index=0;index0){return}var ripple=this.addRipple();ripple.downAction(event);if(!this._animating){this._animating=true;this.animate()}},uiUpAction:function(event){if(!this.noink){this.upAction(event)}},upAction:function(event){if(this.holdDown){return}this.ripples.forEach(function(ripple){ripple.upAction(event)});this._animating=true;this.animate()},onAnimationComplete:function(){this._animating=false;this.$.background.style.backgroundColor=null;this.fire("transitionend")},addRipple:function(){var ripple=new Ripple(this);Polymer.dom(this.$.waves).appendChild(ripple.waveContainer);this.$.background.style.backgroundColor=ripple.color;this.ripples.push(ripple);this._setAnimating(true);return ripple},removeRipple:function(ripple){var rippleIndex=this.ripples.indexOf(ripple);if(rippleIndex<0){return}this.ripples.splice(rippleIndex,1);ripple.remove();if(!this.ripples.length){this._setAnimating(false)}},animate:function(){if(!this._animating){return}var index;var ripple;for(index=0;index0){cr.removeWebUIListener(this.webUIListeners_.pop())}}};Polymer({is:"iron-media-query",properties:{queryMatches:{type:Boolean,value:false,readOnly:true,notify:true},query:{type:String,observer:"queryChanged"},full:{type:Boolean,value:false},_boundMQHandler:{value:function(){return this.queryHandler.bind(this)}},_mq:{value:null}},attached:function(){this.style.display="none";this.queryChanged()},detached:function(){this._remove()},_add:function(){if(this._mq){this._mq.addListener(this._boundMQHandler)}},_remove:function(){if(this._mq){this._mq.removeListener(this._boundMQHandler)}this._mq=null},queryChanged:function(){this._remove();var query=this.query;if(!query){return}if(!this.full&&query[0]!=="("){query="("+query+")"}this._mq=window.matchMedia(query);this._add();this.queryHandler(this._mq)},queryHandler:function(mq){this._setQueryMatches(mq.matches)}});Polymer.IronResizableBehavior={properties:{_parentResizable:{type:Object,observer:"_parentResizableChanged"},_notifyingDescendant:{type:Boolean,value:false}},listeners:{"iron-request-resize-notifications":"_onIronRequestResizeNotifications"},created:function(){this._interestedResizables=[];this._boundNotifyResize=this.notifyResize.bind(this)},attached:function(){this.fire("iron-request-resize-notifications",null,{node:this,bubbles:true,cancelable:true});if(!this._parentResizable){window.addEventListener("resize",this._boundNotifyResize);this.notifyResize()}},detached:function(){if(this._parentResizable){this._parentResizable.stopResizeNotificationsFor(this)}else{window.removeEventListener("resize",this._boundNotifyResize)}this._parentResizable=null},notifyResize:function(){if(!this.isAttached){return}this._interestedResizables.forEach(function(resizable){if(this.resizerShouldNotify(resizable)){this._notifyDescendant(resizable)}},this);this._fireResize()},assignParentResizable:function(parentResizable){this._parentResizable=parentResizable},stopResizeNotificationsFor:function(target){var index=this._interestedResizables.indexOf(target);if(index>-1){this._interestedResizables.splice(index,1);this.unlisten(target,"iron-resize","_onDescendantIronResize")}},resizerShouldNotify:function(element){return true},_onDescendantIronResize:function(event){if(this._notifyingDescendant){event.stopPropagation();return}if(!Polymer.Settings.useShadow){this._fireResize()}},_fireResize:function(){this.fire("iron-resize",null,{node:this,bubbles:false})},_onIronRequestResizeNotifications:function(event){var target=event.path?event.path[0]:event.target;if(target===this){return}if(this._interestedResizables.indexOf(target)===-1){this._interestedResizables.push(target);this.listen(target,"iron-resize","_onDescendantIronResize")}target.assignParentResizable(this);this._notifyDescendant(target);event.stopPropagation()},_parentResizableChanged:function(parentResizable){if(parentResizable){window.removeEventListener("resize",this._boundNotifyResize)}},_notifyDescendant:function(descendant){if(!this.isAttached){return}this._notifyingDescendant=true;descendant.notifyResize();this._notifyingDescendant=false}};Polymer.IronSelection=function(selectCallback){this.selection=[];this.selectCallback=selectCallback};Polymer.IronSelection.prototype={get:function(){return this.multi?this.selection.slice():this.selection[0]},clear:function(excludes){this.selection.slice().forEach(function(item){if(!excludes||excludes.indexOf(item)<0){this.setItemSelected(item,false)}},this)},isSelected:function(item){return this.selection.indexOf(item)>=0},setItemSelected:function(item,isSelected){if(item!=null){if(isSelected!==this.isSelected(item)){if(isSelected){this.selection.push(item)}else{var i=this.selection.indexOf(item);if(i>=0){this.selection.splice(i,1)}}if(this.selectCallback){this.selectCallback(item,isSelected)}}}},select:function(item){if(this.multi){this.toggle(item)}else if(this.get()!==item){this.setItemSelected(this.get(),false);this.setItemSelected(item,true)}},toggle:function(item){this.setItemSelected(item,!this.isSelected(item))}};Polymer.IronSelectableBehavior={properties:{attrForSelected:{type:String,value:null},selected:{type:String,notify:true},selectedItem:{type:Object,readOnly:true,notify:true},activateEvent:{type:String,value:"tap",observer:"_activateEventChanged"},selectable:String,selectedClass:{type:String,value:"iron-selected"},selectedAttribute:{type:String,value:null},fallbackSelection:{type:String,value:null},items:{type:Array,readOnly:true,notify:true,value:function(){return[]}},_excludedLocalNames:{type:Object,value:function(){return{template:1}}}},observers:["_updateAttrForSelected(attrForSelected)","_updateSelected(selected)","_checkFallback(fallbackSelection)"],created:function(){this._bindFilterItem=this._filterItem.bind(this);this._selection=new Polymer.IronSelection(this._applySelection.bind(this))},attached:function(){this._observer=this._observeItems(this);this._updateItems();if(!this._shouldUpdateSelection){this._updateSelected()}this._addListener(this.activateEvent)},detached:function(){if(this._observer){Polymer.dom(this).unobserveNodes(this._observer)}this._removeListener(this.activateEvent)},indexOf:function(item){return this.items.indexOf(item)},select:function(value){this.selected=value},selectPrevious:function(){var length=this.items.length;var index=(Number(this._valueToIndex(this.selected))-1+length)%length;this.selected=this._indexToValue(index)},selectNext:function(){var index=(Number(this._valueToIndex(this.selected))+1)%this.items.length;this.selected=this._indexToValue(index)},selectIndex:function(index){this.select(this._indexToValue(index))},forceSynchronousItemUpdate:function(){this._updateItems()},get _shouldUpdateSelection(){return this.selected!=null},_checkFallback:function(){if(this._shouldUpdateSelection){this._updateSelected()}},_addListener:function(eventName){this.listen(this,eventName,"_activateHandler")},_removeListener:function(eventName){this.unlisten(this,eventName,"_activateHandler")},_activateEventChanged:function(eventName,old){this._removeListener(old);this._addListener(eventName)},_updateItems:function(){var nodes=Polymer.dom(this).queryDistributedElements(this.selectable||"*");nodes=Array.prototype.filter.call(nodes,this._bindFilterItem);this._setItems(nodes)},_updateAttrForSelected:function(){if(this._shouldUpdateSelection){this.selected=this._indexToValue(this.indexOf(this.selectedItem))}},_updateSelected:function(){this._selectSelected(this.selected)},_selectSelected:function(selected){this._selection.select(this._valueToItem(this.selected));if(this.fallbackSelection&&this.items.length&&this._selection.get()===undefined){this.selected=this.fallbackSelection}},_filterItem:function(node){return!this._excludedLocalNames[node.localName]},_valueToItem:function(value){return value==null?null:this.items[this._valueToIndex(value)]},_valueToIndex:function(value){if(this.attrForSelected){for(var i=0,item;item=this.items[i];i++){if(this._valueForItem(item)==value){return i}}}else{return Number(value)}},_indexToValue:function(index){if(this.attrForSelected){var item=this.items[index];if(item){return this._valueForItem(item)}}else{return index}},_valueForItem:function(item){var propValue=item[Polymer.CaseMap.dashToCamelCase(this.attrForSelected)];return propValue!=undefined?propValue:item.getAttribute(this.attrForSelected)},_applySelection:function(item,isSelected){if(this.selectedClass){this.toggleClass(this.selectedClass,isSelected,item)}if(this.selectedAttribute){this.toggleAttribute(this.selectedAttribute,isSelected,item)}this._selectionChange();this.fire("iron-"+(isSelected?"select":"deselect"),{item:item})},_selectionChange:function(){this._setSelectedItem(this._selection.get())},_observeItems:function(node){return Polymer.dom(node).observeNodes(function(mutation){this._updateItems();if(this._shouldUpdateSelection){this._updateSelected()}this.fire("iron-items-changed",mutation,{bubbles:false,cancelable:false})})},_activateHandler:function(e){var t=e.target;var items=this.items;while(t&&t!=this){var i=items.indexOf(t);if(i>=0){var value=this._indexToValue(i);this._itemActivate(value,t);return}t=t.parentNode}},_itemActivate:function(value,item){if(!this.fire("iron-activate",{selected:value,item:item},{cancelable:true}).defaultPrevented){this.select(value)}}};Polymer({is:"iron-pages",behaviors:[Polymer.IronResizableBehavior,Polymer.IronSelectableBehavior],properties:{activateEvent:{type:String,value:null}},observers:["_selectedPageChanged(selected)"],_selectedPageChanged:function(selected,old){this.async(this.notifyResize)}});Polymer.IronScrollTargetBehavior={properties:{scrollTarget:{type:HTMLElement,value:function(){return this._defaultScrollTarget}}},observers:["_scrollTargetChanged(scrollTarget, isAttached)"],_shouldHaveListener:true,_scrollTargetChanged:function(scrollTarget,isAttached){var eventTarget;if(this._oldScrollTarget){this._toggleScrollListener(false,this._oldScrollTarget);this._oldScrollTarget=null}if(!isAttached){return}if(scrollTarget==="document"){this.scrollTarget=this._doc}else if(typeof scrollTarget==="string"){this.scrollTarget=this.domHost?this.domHost.$[scrollTarget]:Polymer.dom(this.ownerDocument).querySelector("#"+scrollTarget)}else if(this._isValidScrollTarget()){this._boundScrollHandler=this._boundScrollHandler||this._scrollHandler.bind(this);this._oldScrollTarget=scrollTarget;this._toggleScrollListener(this._shouldHaveListener,scrollTarget)}},_scrollHandler:function scrollHandler(){},get _defaultScrollTarget(){return this._doc},get _doc(){return this.ownerDocument.documentElement},get _scrollTop(){if(this._isValidScrollTarget()){return this.scrollTarget===this._doc?window.pageYOffset:this.scrollTarget.scrollTop}return 0},get _scrollLeft(){if(this._isValidScrollTarget()){return this.scrollTarget===this._doc?window.pageXOffset:this.scrollTarget.scrollLeft}return 0},set _scrollTop(top){if(this.scrollTarget===this._doc){window.scrollTo(window.pageXOffset,top)}else if(this._isValidScrollTarget()){this.scrollTarget.scrollTop=top}},set _scrollLeft(left){if(this.scrollTarget===this._doc){window.scrollTo(left,window.pageYOffset)}else if(this._isValidScrollTarget()){this.scrollTarget.scrollLeft=left}},scroll:function(left,top){if(this.scrollTarget===this._doc){window.scrollTo(left,top)}else if(this._isValidScrollTarget()){this.scrollTarget.scrollLeft=left;this.scrollTarget.scrollTop=top}},get _scrollTargetWidth(){if(this._isValidScrollTarget()){return this.scrollTarget===this._doc?window.innerWidth:this.scrollTarget.offsetWidth}return 0},get _scrollTargetHeight(){if(this._isValidScrollTarget()){return this.scrollTarget===this._doc?window.innerHeight:this.scrollTarget.offsetHeight}return 0},_isValidScrollTarget:function(){return this.scrollTarget instanceof HTMLElement},_toggleScrollListener:function(yes,scrollTarget){if(!this._boundScrollHandler){return}var eventTarget=scrollTarget===this._doc?window:scrollTarget;if(yes){eventTarget.addEventListener("scroll",this._boundScrollHandler)}else{eventTarget.removeEventListener("scroll",this._boundScrollHandler)}},toggleScrollListener:function(yes){this._shouldHaveListener=yes;this._toggleScrollListener(yes,this.scrollTarget)}};(function(){var metaDatas={};var metaArrays={};var singleton=null;Polymer.IronMeta=Polymer({is:"iron-meta",properties:{type:{type:String,value:"default",observer:"_typeChanged"},key:{type:String,observer:"_keyChanged"},value:{type:Object,notify:true,observer:"_valueChanged"},self:{type:Boolean,observer:"_selfChanged"},list:{type:Array,notify:true}},hostAttributes:{hidden:true},factoryImpl:function(config){if(config){for(var n in config){switch(n){case"type":case"key":case"value":this[n]=config[n];break}}}},created:function(){this._metaDatas=metaDatas;this._metaArrays=metaArrays},_keyChanged:function(key,old){this._resetRegistration(old)},_valueChanged:function(value){this._resetRegistration(this.key)},_selfChanged:function(self){if(self){this.value=this}},_typeChanged:function(type){this._unregisterKey(this.key);if(!metaDatas[type]){metaDatas[type]={}}this._metaData=metaDatas[type];if(!metaArrays[type]){metaArrays[type]=[]}this.list=metaArrays[type];this._registerKeyValue(this.key,this.value)},byKey:function(key){return this._metaData&&this._metaData[key]},_resetRegistration:function(oldKey){this._unregisterKey(oldKey);this._registerKeyValue(this.key,this.value)},_unregisterKey:function(key){this._unregister(key,this._metaData,this.list)},_registerKeyValue:function(key,value){this._register(key,value,this._metaData,this.list)},_register:function(key,value,data,list){if(key&&data&&value!==undefined){data[key]=value;list.push(value)}},_unregister:function(key,data,list){if(key&&data){if(key in data){var value=data[key];delete data[key];this.arrayDelete(list,value)}}}});Polymer.IronMeta.getIronMeta=function getIronMeta(){if(singleton===null){singleton=new Polymer.IronMeta}return singleton};Polymer.IronMetaQuery=Polymer({is:"iron-meta-query",properties:{type:{type:String,value:"default",observer:"_typeChanged"},key:{type:String,observer:"_keyChanged"},value:{type:Object,notify:true,readOnly:true},list:{type:Array,notify:true}},factoryImpl:function(config){if(config){for(var n in config){switch(n){case"type":case"key":this[n]=config[n];break}}}},created:function(){this._metaDatas=metaDatas;this._metaArrays=metaArrays},_keyChanged:function(key){this._setValue(this._metaData&&this._metaData[key])},_typeChanged:function(type){this._metaData=metaDatas[type];this.list=metaArrays[type];if(this.key){this._keyChanged(this.key)}},byKey:function(key){return this._metaData&&this._metaData[key]}})})();Polymer({is:"iron-icon",properties:{icon:{type:String,observer:"_iconChanged"},theme:{type:String,observer:"_updateIcon"},src:{type:String,observer:"_srcChanged"},_meta:{value:Polymer.Base.create("iron-meta",{type:"iconset"}),observer:"_updateIcon"}},_DEFAULT_ICONSET:"icons",_iconChanged:function(icon){var parts=(icon||"").split(":");this._iconName=parts.pop();this._iconsetName=parts.pop()||this._DEFAULT_ICONSET;this._updateIcon()},_srcChanged:function(src){this._updateIcon()},_usesIconset:function(){return this.icon||!this.src},_updateIcon:function(){if(this._usesIconset()){if(this._img&&this._img.parentNode){Polymer.dom(this.root).removeChild(this._img)}if(this._iconName===""){if(this._iconset){this._iconset.removeIcon(this)}}else if(this._iconsetName&&this._meta){this._iconset=this._meta.byKey(this._iconsetName);if(this._iconset){this._iconset.applyIcon(this,this._iconName,this.theme);this.unlisten(window,"iron-iconset-added","_updateIcon")}else{this.listen(window,"iron-iconset-added","_updateIcon")}}}else{if(this._iconset){this._iconset.removeIcon(this)}if(!this._img){this._img=document.createElement("img");this._img.style.width="100%";this._img.style.height="100%";this._img.draggable=false}this._img.src=this.src;Polymer.dom(this.root).appendChild(this._img)}}});(function(){"use strict";var KEY_IDENTIFIER={"U+0008":"backspace","U+0009":"tab","U+001B":"esc","U+0020":"space","U+007F":"del"};var KEY_CODE={8:"backspace",9:"tab",13:"enter",27:"esc",33:"pageup",34:"pagedown",35:"end",36:"home",32:"space",37:"left",38:"up",39:"right",40:"down",46:"del",106:"*"};var MODIFIER_KEYS={shift:"shiftKey",ctrl:"ctrlKey",alt:"altKey",meta:"metaKey"};var KEY_CHAR=/[a-z0-9*]/;var IDENT_CHAR=/U\+/;var ARROW_KEY=/^arrow/;var SPACE_KEY=/^space(bar)?/;var ESC_KEY=/^escape$/;function transformKey(key,noSpecialChars){var validKey="";if(key){var lKey=key.toLowerCase();if(lKey===" "||SPACE_KEY.test(lKey)){validKey="space"}else if(ESC_KEY.test(lKey)){validKey="esc"}else if(lKey.length==1){if(!noSpecialChars||KEY_CHAR.test(lKey)){validKey=lKey}}else if(ARROW_KEY.test(lKey)){validKey=lKey.replace("arrow","")}else if(lKey=="multiply"){validKey="*"}else{validKey=lKey}}return validKey}function transformKeyIdentifier(keyIdent){var validKey="";if(keyIdent){if(keyIdent in KEY_IDENTIFIER){validKey=KEY_IDENTIFIER[keyIdent]}else if(IDENT_CHAR.test(keyIdent)){keyIdent=parseInt(keyIdent.replace("U+","0x"),16);validKey=String.fromCharCode(keyIdent).toLowerCase()}else{validKey=keyIdent.toLowerCase()}}return validKey}function transformKeyCode(keyCode){var validKey="";if(Number(keyCode)){if(keyCode>=65&&keyCode<=90){validKey=String.fromCharCode(32+keyCode)}else if(keyCode>=112&&keyCode<=123){validKey="f"+(keyCode-112)}else if(keyCode>=48&&keyCode<=57){validKey=String(keyCode-48)}else if(keyCode>=96&&keyCode<=105){validKey=String(keyCode-96)}else{validKey=KEY_CODE[keyCode]}}return validKey}function normalizedKeyForEvent(keyEvent,noSpecialChars){if(keyEvent.key){return transformKey(keyEvent.key,noSpecialChars)}if(keyEvent.detail&&keyEvent.detail.key){return transformKey(keyEvent.detail.key,noSpecialChars)}return transformKeyIdentifier(keyEvent.keyIdentifier)||transformKeyCode(keyEvent.keyCode)||""}function keyComboMatchesEvent(keyCombo,event){var keyEvent=normalizedKeyForEvent(event,keyCombo.hasModifiers);return keyEvent===keyCombo.key&&(!keyCombo.hasModifiers||!!event.shiftKey===!!keyCombo.shiftKey&&!!event.ctrlKey===!!keyCombo.ctrlKey&&!!event.altKey===!!keyCombo.altKey&&!!event.metaKey===!!keyCombo.metaKey)}function parseKeyComboString(keyComboString){if(keyComboString.length===1){return{combo:keyComboString,key:keyComboString,event:"keydown"}}return keyComboString.split("+").reduce(function(parsedKeyCombo,keyComboPart){var eventParts=keyComboPart.split(":");var keyName=eventParts[0];var event=eventParts[1];if(keyName in MODIFIER_KEYS){parsedKeyCombo[MODIFIER_KEYS[keyName]]=true;parsedKeyCombo.hasModifiers=true}else{parsedKeyCombo.key=keyName;parsedKeyCombo.event=event||"keydown"}return parsedKeyCombo},{combo:keyComboString.split(":").shift()})}function parseEventString(eventString){return eventString.trim().split(" ").map(function(keyComboString){return parseKeyComboString(keyComboString)})}Polymer.IronA11yKeysBehavior={properties:{keyEventTarget:{type:Object,value:function(){return this}},stopKeyboardEventPropagation:{type:Boolean,value:false},_boundKeyHandlers:{type:Array,value:function(){return[]}},_imperativeKeyBindings:{type:Object,value:function(){return{}}}},observers:["_resetKeyEventListeners(keyEventTarget, _boundKeyHandlers)"],keyBindings:{},registered:function(){this._prepKeyBindings()},attached:function(){this._listenKeyEventListeners()},detached:function(){this._unlistenKeyEventListeners()},addOwnKeyBinding:function(eventString,handlerName){this._imperativeKeyBindings[eventString]=handlerName;this._prepKeyBindings();this._resetKeyEventListeners()},removeOwnKeyBindings:function(){this._imperativeKeyBindings={};this._prepKeyBindings();this._resetKeyEventListeners()},keyboardEventMatchesKeys:function(event,eventString){var keyCombos=parseEventString(eventString);for(var i=0;i=Math.min(this.maxRadius,Ripple.MAX_RADIUS)},get isRestingAtMaxRadius(){return this.opacity>=this.initialOpacity&&this.radius>=Math.min(this.maxRadius,Ripple.MAX_RADIUS)},get isAnimationComplete(){return this.mouseUpStart?this.isOpacityFullyDecayed:this.isRestingAtMaxRadius},get translationFraction(){return Math.min(1,this.radius/this.containerMetrics.size*2/Math.sqrt(2))},get xNow(){if(this.xEnd){return this.xStart+this.translationFraction*(this.xEnd-this.xStart)}return this.xStart},get yNow(){if(this.yEnd){return this.yStart+this.translationFraction*(this.yEnd-this.yStart)}return this.yStart},get isMouseDown(){return this.mouseDownStart&&!this.mouseUpStart},resetInteractionState:function(){this.maxRadius=0;this.mouseDownStart=0;this.mouseUpStart=0;this.xStart=0;this.yStart=0;this.xEnd=0;this.yEnd=0;this.slideDistance=0;this.containerMetrics=new ElementMetrics(this.element)},draw:function(){var scale;var translateString;var dx;var dy;this.wave.style.opacity=this.opacity;scale=this.radius/(this.containerMetrics.size/2);dx=this.xNow-this.containerMetrics.width/2;dy=this.yNow-this.containerMetrics.height/2;this.waveContainer.style.webkitTransform="translate("+dx+"px, "+dy+"px)";this.waveContainer.style.transform="translate3d("+dx+"px, "+dy+"px, 0)";this.wave.style.webkitTransform="scale("+scale+","+scale+")";this.wave.style.transform="scale3d("+scale+","+scale+",1)"},downAction:function(event){var xCenter=this.containerMetrics.width/2;var yCenter=this.containerMetrics.height/2;this.resetInteractionState();this.mouseDownStart=Utility.now();if(this.center){this.xStart=xCenter;this.yStart=yCenter;this.slideDistance=Utility.distance(this.xStart,this.yStart,this.xEnd,this.yEnd)}else{this.xStart=event?event.detail.x-this.containerMetrics.boundingRect.left:this.containerMetrics.width/2;this.yStart=event?event.detail.y-this.containerMetrics.boundingRect.top:this.containerMetrics.height/2}if(this.recenters){this.xEnd=xCenter;this.yEnd=yCenter;this.slideDistance=Utility.distance(this.xStart,this.yStart,this.xEnd,this.yEnd)}this.maxRadius=this.containerMetrics.furthestCornerDistanceFrom(this.xStart,this.yStart);this.waveContainer.style.top=(this.containerMetrics.height-this.containerMetrics.size)/2+"px";this.waveContainer.style.left=(this.containerMetrics.width-this.containerMetrics.size)/2+"px";this.waveContainer.style.width=this.containerMetrics.size+"px";this.waveContainer.style.height=this.containerMetrics.size+"px"},upAction:function(event){if(!this.isMouseDown){return}this.mouseUpStart=Utility.now()},remove:function(){Polymer.dom(this.waveContainer.parentNode).removeChild(this.waveContainer)}};Polymer({is:"paper-ripple",behaviors:[Polymer.IronA11yKeysBehavior],properties:{initialOpacity:{type:Number,value:.25},opacityDecayVelocity:{type:Number,value:.8},recenters:{type:Boolean,value:false},center:{type:Boolean,value:false},ripples:{type:Array,value:function(){return[]}},animating:{type:Boolean,readOnly:true,reflectToAttribute:true,value:false},holdDown:{type:Boolean,value:false,observer:"_holdDownChanged"},noink:{type:Boolean,value:false},_animating:{type:Boolean},_boundAnimate:{type:Function,value:function(){return this.animate.bind(this)}}},get target(){return this.keyEventTarget},keyBindings:{"enter:keydown":"_onEnterKeydown","space:keydown":"_onSpaceKeydown","space:keyup":"_onSpaceKeyup"},attached:function(){if(this.parentNode.nodeType==11){this.keyEventTarget=Polymer.dom(this).getOwnerRoot().host}else{this.keyEventTarget=this.parentNode}var keyEventTarget=this.keyEventTarget;this.listen(keyEventTarget,"up","uiUpAction");this.listen(keyEventTarget,"down","uiDownAction")},detached:function(){this.unlisten(this.keyEventTarget,"up","uiUpAction");this.unlisten(this.keyEventTarget,"down","uiDownAction");this.keyEventTarget=null},get shouldKeepAnimating(){for(var index=0;index0){return}var ripple=this.addRipple();ripple.downAction(event);if(!this._animating){this._animating=true;this.animate()}},uiUpAction:function(event){if(!this.noink){this.upAction(event)}},upAction:function(event){if(this.holdDown){return}this.ripples.forEach(function(ripple){ripple.upAction(event)});this._animating=true;this.animate()},onAnimationComplete:function(){this._animating=false;this.$.background.style.backgroundColor=null;this.fire("transitionend")},addRipple:function(){var ripple=new Ripple(this);Polymer.dom(this.$.waves).appendChild(ripple.waveContainer);this.$.background.style.backgroundColor=ripple.color;this.ripples.push(ripple);this._setAnimating(true);return ripple},removeRipple:function(ripple){var rippleIndex=this.ripples.indexOf(ripple);if(rippleIndex<0){return}this.ripples.splice(rippleIndex,1);ripple.remove();if(!this.ripples.length){this._setAnimating(false)}},animate:function(){if(!this._animating){return}var index;var ripple;for(index=0;index32&&event.keyCode<41||event.keyCode>111&&event.keyCode<124;return!anyNonPrintable&&!(event.charCode==0&&mozNonPrintable)},_onKeypress:function(event){if(!this.preventInvalidInput&&this.type!=="number"){return}var regexp=this._patternRegExp;if(!regexp){return}if(event.metaKey||event.ctrlKey||event.altKey)return;this._patternAlreadyChecked=true;var thisChar=String.fromCharCode(event.charCode);if(this._isPrintable(event)&&!regexp.test(thisChar)){event.preventDefault();this._announceInvalidCharacter("Invalid character "+thisChar+" not entered.")}},_checkPatternValidity:function(){var regexp=this._patternRegExp;if(!regexp){return true}for(var i=0;i0},searchTermChanged_:function(){if(this.searchField.getValue()!=this.searchTerm){this.searchField.showAndFocus();this.searchField.setValue(this.searchTerm)}},onMenuPromoShown_:function(){md_history.BrowserService.getInstance().menuPromoShown()},onSearchChanged_:function(event){this.searchTerm=event.detail},onInfoButtonTap_:function(){var dropdown=this.$.syncNotice.get();dropdown.positionTarget=this.$$("#info-button-icon");if(dropdown.style.display=="none")dropdown.open()},onClearSelectionTap_:function(){this.fire("unselect-all")},onDeleteTap_:function(){this.fire("delete-selected")},deletingAllowed_:function(){return loadTimeData.getBoolean("allowDeletingHistory")},numberOfItemsSelected_:function(count){return count>0?loadTimeData.getStringF("itemsSelected",count):""},getHistoryInterval_:function(queryStartTime,queryEndTime){return loadTimeData.getStringF("historyInterval",queryStartTime,queryEndTime)},hasDrawerChanged_:function(){this.updateStyles()}});(function(){var IOS=navigator.userAgent.match(/iP(?:hone|ad;(?: U;)? CPU) OS (\d+)/);var IOS_TOUCH_SCROLLING=IOS&&IOS[1]>=8;var DEFAULT_PHYSICAL_COUNT=3;var HIDDEN_Y="-10000px";var ITEM_WIDTH=0;var ITEM_HEIGHT=1;var SECRET_TABINDEX=-100;Polymer({is:"iron-list",properties:{items:{type:Array},maxPhysicalCount:{type:Number,value:500},as:{type:String,value:"item"},indexAs:{type:String,value:"index"},selectedAs:{type:String,value:"selected"},grid:{type:Boolean,value:false,reflectToAttribute:true},selectionEnabled:{type:Boolean,value:false},selectedItem:{type:Object,notify:true},selectedItems:{type:Object,notify:true},multiSelection:{type:Boolean,value:false}},observers:["_itemsChanged(items.*)","_selectionEnabledChanged(selectionEnabled)","_multiSelectionChanged(multiSelection)","_setOverflow(scrollTarget)"],behaviors:[Polymer.Templatizer,Polymer.IronResizableBehavior,Polymer.IronA11yKeysBehavior,Polymer.IronScrollTargetBehavior],keyBindings:{up:"_didMoveUp",down:"_didMoveDown",enter:"_didEnter"},_ratio:.5,_scrollerPaddingTop:0,_scrollPosition:0,_physicalSize:0,_physicalAverage:0,_physicalAverageCount:0,_physicalTop:0,_virtualCount:0,_physicalIndexForKey:null,_estScrollHeight:0,_scrollHeight:0,_viewportHeight:0,_viewportWidth:0,_physicalItems:null,_physicalSizes:null,_firstVisibleIndexVal:null,_lastVisibleIndexVal:null,_collection:null,_maxPages:2,_focusedItem:null,_focusedIndex:-1,_offscreenFocusedItem:null,_focusBackfillItem:null,_itemsPerRow:1,_itemWidth:0,_rowHeight:0,_templateCost:0,get _physicalBottom(){return this._physicalTop+this._physicalSize},get _scrollBottom(){return this._scrollPosition+this._viewportHeight},get _virtualEnd(){return this._virtualStart+this._physicalCount-1},get _hiddenContentSize(){var size=this.grid?this._physicalRows*this._rowHeight:this._physicalSize;return size-this._viewportHeight},get _maxScrollTop(){return this._estScrollHeight-this._viewportHeight+this._scrollerPaddingTop},_minVirtualStart:0,get _maxVirtualStart(){return Math.max(0,this._virtualCount-this._physicalCount)},_virtualStartVal:0,set _virtualStart(val){this._virtualStartVal=Math.min(this._maxVirtualStart,Math.max(this._minVirtualStart,val))},get _virtualStart(){return this._virtualStartVal||0},_physicalStartVal:0,set _physicalStart(val){this._physicalStartVal=val%this._physicalCount;if(this._physicalStartVal<0){this._physicalStartVal=this._physicalCount+this._physicalStartVal}this._physicalEnd=(this._physicalStart+this._physicalCount-1)%this._physicalCount},get _physicalStart(){return this._physicalStartVal||0},_physicalCountVal:0,set _physicalCount(val){this._physicalCountVal=val;this._physicalEnd=(this._physicalStart+this._physicalCount-1)%this._physicalCount},get _physicalCount(){return this._physicalCountVal},_physicalEnd:0,get _optPhysicalSize(){if(this.grid){return this._estRowsInView*this._rowHeight*this._maxPages}return this._viewportHeight*this._maxPages},get _isVisible(){return Boolean(this.offsetWidth||this.offsetHeight)},get firstVisibleIndex(){if(this._firstVisibleIndexVal===null){var physicalOffset=Math.floor(this._physicalTop+this._scrollerPaddingTop);this._firstVisibleIndexVal=this._iterateItems(function(pidx,vidx){physicalOffset+=this._getPhysicalSizeIncrement(pidx);if(physicalOffset>this._scrollPosition){return this.grid?vidx-vidx%this._itemsPerRow:vidx}if(this.grid&&this._virtualCount-1===vidx){return vidx-vidx%this._itemsPerRow}})||0}return this._firstVisibleIndexVal},get lastVisibleIndex(){if(this._lastVisibleIndexVal===null){if(this.grid){var lastIndex=this.firstVisibleIndex+this._estRowsInView*this._itemsPerRow-1;this._lastVisibleIndexVal=Math.min(this._virtualCount,lastIndex)}else{var physicalOffset=this._physicalTop;this._iterateItems(function(pidx,vidx){if(physicalOffset=0;this._scrollPosition=scrollTop;this._firstVisibleIndexVal=null;this._lastVisibleIndexVal=null;if(Math.abs(delta)>this._physicalSize){var idxAdjustment=Math.round(delta/this._physicalAverage)*this._itemsPerRow;this._physicalTop=this._physicalTop+delta;this._virtualStart=this._virtualStart+idxAdjustment;this._physicalStart=this._physicalStart+idxAdjustment;this._update()}else{var reusables=this._getReusables(isScrollingDown);if(isScrollingDown){this._physicalTop=reusables.physicalTop;this._virtualStart=this._virtualStart+reusables.indexes.length;this._physicalStart=this._physicalStart+reusables.indexes.length}else{this._virtualStart=this._virtualStart-reusables.indexes.length;this._physicalStart=this._physicalStart-reusables.indexes.length}if(reusables.indexes.length===0){this._increasePoolIfNeeded()}else{this._update(reusables.indexes,isScrollingDown?null:reusables.indexes)}}},_getReusables:function(fromTop){var ith,lastIth,offsetContent,physicalItemHeight;var idxs=[];var protectedOffsetContent=this._hiddenContentSize*this._ratio;var virtualStart=this._virtualStart;var virtualEnd=this._virtualEnd;var physicalCount=this._physicalCount;var physicalTop=this._physicalTop;var scrollTop=this._scrollTop;var scrollBottom=this._scrollBottom;if(fromTop){ith=this._physicalStart;lastIth=this._physicalEnd;offsetContent=scrollTop-physicalTop}else{ith=this._physicalEnd;lastIth=this._physicalStart;offsetContent=this._physicalBottom-scrollBottom}while(true){physicalItemHeight=this._getPhysicalSizeIncrement(ith);offsetContent=offsetContent-physicalItemHeight;if(idxs.length>=physicalCount||offsetContent<=protectedOffsetContent){break}if(fromTop){if(virtualEnd+idxs.length+1>=this._virtualCount){break}if(physicalTop+physicalItemHeight>=scrollTop){break}idxs.push(ith);physicalTop=physicalTop+physicalItemHeight;ith=(ith+1)%physicalCount}else{if(virtualStart-idxs.length<=0){break}if(physicalTop+this._physicalSize-physicalItemHeight<=scrollBottom){break}idxs.push(ith);physicalTop=physicalTop-physicalItemHeight;ith=ith===0?physicalCount-1:ith-1}}return{indexes:idxs,physicalTop:physicalTop}},_update:function(itemSet,movingUp){if(itemSet&&itemSet.length===0){return}this._manageFocus();this._assignModels(itemSet);this._updateMetrics(itemSet);if(movingUp){while(movingUp.length){var idx=movingUp.pop();this._physicalTop-=this._getPhysicalSizeIncrement(idx)}}this._positionItems();this._updateScrollerSize();this._increasePoolIfNeeded()},_createPool:function(size){var physicalItems=new Array(size);this._ensureTemplatized();for(var i=0;i=this._scrollBottom&&this._physicalTop<=this._scrollPosition;if(this._physicalSize>=this._optPhysicalSize&&isClientFull){return false}var maxPoolSize=Math.round(this._physicalCount*.5);if(!isClientFull){this._debounceTemplate(this._increasePool.bind(this,maxPoolSize));return true}this._yield(function(){self._increasePool(Math.min(maxPoolSize,Math.max(1,Math.round(50/self._templateCost))))});return true},_yield:function(cb){var g=window;var handle=g.requestIdleCallback?g.requestIdleCallback(cb):g.setTimeout(cb,16);Polymer.dom.addDebouncer({complete:function(){g.cancelIdleCallback?g.cancelIdleCallback(handle):g.clearTimeout(handle);cb()}})},_increasePool:function(missingItems){var nextPhysicalCount=Math.min(this._physicalCount+missingItems,this._virtualCount-this._virtualStart,Math.max(this.maxPhysicalCount,DEFAULT_PHYSICAL_COUNT));var prevPhysicalCount=this._physicalCount;var delta=nextPhysicalCount-prevPhysicalCount;var ts=window.performance.now();if(delta<=0){return}[].push.apply(this._physicalItems,this._createPool(delta));[].push.apply(this._physicalSizes,new Array(delta));this._physicalCount=prevPhysicalCount+delta;if(this._physicalStart>this._physicalEnd&&this._isIndexRendered(this._focusedIndex)&&this._getPhysicalIndex(this._focusedIndex)=0){path=this.as+"."+path.substring(dot+1);el._templateInstance.notifyPath(path,value,true)}else{var currentItem=el._templateInstance[this.as];if(Array.isArray(this.selectedItems)){for(var i=0;i=0){this._focusedIndex=this._focusedIndex+delta}}},this)},_removeItem:function(item){this.$.selector.deselect(item);if(this._focusedItem&&this._focusedItem._templateInstance[this.as]===item){this._removeFocusedItem()}},_iterateItems:function(fn,itemSet){var pidx,vidx,rtn,i;if(arguments.length===2&&itemSet){for(i=0;i=this._physicalStart){return this._virtualStart+(pidx-this._physicalStart)}return this._virtualStart+(this._physicalCount-this._physicalStart)+pidx},_assignModels:function(itemSet){this._iterateItems(function(pidx,vidx){var el=this._physicalItems[pidx];var inst=el._templateInstance;var item=this.items&&this.items[vidx];if(item!=null){inst[this.as]=item;inst.__key__=this._collection.getKey(item);inst[this.selectedAs]=this.$.selector.isSelected(item);inst[this.indexAs]=vidx;inst.tabIndex=this._focusedIndex===vidx?0:-1;this._physicalIndexForKey[inst.__key__]=pidx;el.removeAttribute("hidden")}else{inst.__key__=null;el.setAttribute("hidden","")}},itemSet)},_updateMetrics:function(itemSet){Polymer.dom.flush();var newPhysicalSize=0;var oldPhysicalSize=0;var prevAvgCount=this._physicalAverageCount;var prevPhysicalAvg=this._physicalAverage;this._iterateItems(function(pidx,vidx){oldPhysicalSize+=this._physicalSizes[pidx]||0;this._physicalSizes[pidx]=this._physicalItems[pidx].offsetHeight;newPhysicalSize+=this._physicalSizes[pidx];this._physicalAverageCount+=this._physicalSizes[pidx]?1:0},itemSet);if(this.grid){this._updateGridMetrics();this._physicalSize=Math.ceil(this._physicalCount/this._itemsPerRow)*this._rowHeight}else{this._physicalSize=this._physicalSize+newPhysicalSize-oldPhysicalSize}if(this._physicalAverageCount!==prevAvgCount){this._physicalAverage=Math.round((prevPhysicalAvg*prevAvgCount+newPhysicalSize)/this._physicalAverageCount)}},_updateGridMetrics:function(){this._itemWidth=this._physicalCount>0?this._physicalItems[0].getBoundingClientRect().width:200;this._rowHeight=this._physicalCount>0?this._physicalItems[0].offsetHeight:200;this._itemsPerRow=this._itemWidth?Math.floor(this._viewportWidth/this._itemWidth):this._itemsPerRow},_positionItems:function(){this._adjustScrollPosition();var y=this._physicalTop;if(this.grid){var totalItemWidth=this._itemsPerRow*this._itemWidth;var rowOffset=(this._viewportWidth-totalItemWidth)/2;this._iterateItems(function(pidx,vidx){var modulus=vidx%this._itemsPerRow;var x=Math.floor(modulus*this._itemWidth+rowOffset);this.translate3d(x+"px",y+"px",0,this._physicalItems[pidx]);if(this._shouldRenderNextRow(vidx)){y+=this._rowHeight}})}else{this._iterateItems(function(pidx,vidx){this.translate3d(0,y+"px",0,this._physicalItems[pidx]);y+=this._physicalSizes[pidx]})}},_getPhysicalSizeIncrement:function(pidx){if(!this.grid){return this._physicalSizes[pidx]}if(this._computeVidx(pidx)%this._itemsPerRow!==this._itemsPerRow-1){return 0}return this._rowHeight},_shouldRenderNextRow:function(vidx){return vidx%this._itemsPerRow===this._itemsPerRow-1},_adjustScrollPosition:function(){var deltaHeight=this._virtualStart===0?this._physicalTop:Math.min(this._scrollPosition+this._physicalTop,0);if(deltaHeight){this._physicalTop=this._physicalTop-deltaHeight;if(!IOS_TOUCH_SCROLLING&&this._physicalTop!==0){this._resetScrollPosition(this._scrollTop-deltaHeight)}}},_resetScrollPosition:function(pos){if(this.scrollTarget){this._scrollTop=pos;this._scrollPosition=this._scrollTop}},_updateScrollerSize:function(forceUpdate){if(this.grid){this._estScrollHeight=this._virtualRowCount*this._rowHeight}else{this._estScrollHeight=this._physicalBottom+Math.max(this._virtualCount-this._physicalCount-this._virtualStart,0)*this._physicalAverage}forceUpdate=forceUpdate||this._scrollHeight===0;forceUpdate=forceUpdate||this._scrollPosition>=this._estScrollHeight-this._physicalSize;forceUpdate=forceUpdate||this.grid&&this.$.items.style.height=this._optPhysicalSize){this.$.items.style.height=this._estScrollHeight+"px";this._scrollHeight=this._estScrollHeight}},scrollToItem:function(item){return this.scrollToIndex(this.items.indexOf(item))},scrollToIndex:function(idx){if(typeof idx!=="number"||idx<0||idx>this.items.length-1){return}Polymer.dom.flush();if(this._physicalCount===0){return}idx=Math.min(Math.max(idx,0),this._virtualCount-1);if(!this._isIndexRendered(idx)||idx>=this._maxVirtualStart){this._virtualStart=this.grid?idx-this._itemsPerRow*2:idx-1}this._manageFocus();this._assignModels();this._updateMetrics();this._physicalTop=Math.floor(this._virtualStart/this._itemsPerRow)*this._physicalAverage;var currentTopItem=this._physicalStart;var currentVirtualItem=this._virtualStart;var targetOffsetTop=0;var hiddenContentSize=this._hiddenContentSize;while(currentVirtualItem0){this._resetAverage();this.scrollToIndex(this.firstVisibleIndex)}}else{this.toggleScrollListener(false)}}.bind(this),1))},_getModelFromItem:function(item){var key=this._collection.getKey(item);var pidx=this._physicalIndexForKey[key];if(pidx!=null){return this._physicalItems[pidx]._templateInstance}return null},_getNormalizedItem:function(item){if(this._collection.getKey(item)===undefined){if(typeof item==="number"){item=this.items[item];if(!item){throw new RangeError(" not found")}return item}throw new TypeError(" should be a valid item")}return item},selectItem:function(item){item=this._getNormalizedItem(item);var model=this._getModelFromItem(item);if(!this.multiSelection&&this.selectedItem){this.deselectItem(this.selectedItem)}if(model){model[this.selectedAs]=true}this.$.selector.select(item);this.updateSizeForItem(item)},deselectItem:function(item){item=this._getNormalizedItem(item);var model=this._getModelFromItem(item);if(model){model[this.selectedAs]=false}this.$.selector.deselect(item);this.updateSizeForItem(item)},toggleSelectionForItem:function(item){item=this._getNormalizedItem(item);if(this.$.selector.isSelected(item)){this.deselectItem(item)}else{this.selectItem(item)}},clearSelection:function(){function unselect(item){var model=this._getModelFromItem(item);if(model){model[this.selectedAs]=false}}if(Array.isArray(this.selectedItems)){this.selectedItems.forEach(unselect,this)}else if(this.selectedItem){unselect.call(this,this.selectedItem)}this.$.selector.clearSelection()},_selectionEnabledChanged:function(selectionEnabled){var handler=selectionEnabled?this.listen:this.unlisten;handler.call(this,this,"tap","_selectionHandler")},_selectionHandler:function(e){var model=this.modelForElement(e.target);if(!model){return}var modelTabIndex,activeElTabIndex;var target=Polymer.dom(e).path[0];var activeEl=Polymer.dom(this.domHost?this.domHost.root:document).activeElement;var physicalItem=this._physicalItems[this._getPhysicalIndex(model[this.indexAs])];if(target.localName==="input"||target.localName==="button"||target.localName==="select"){return}modelTabIndex=model.tabIndex;model.tabIndex=SECRET_TABINDEX;activeElTabIndex=activeEl?activeEl.tabIndex:-1;model.tabIndex=modelTabIndex;if(activeEl&&physicalItem!==activeEl&&physicalItem.contains(activeEl)&&activeElTabIndex!==SECRET_TABINDEX){return}this.toggleSelectionForItem(model[this.as])},_multiSelectionChanged:function(multiSelection){this.clearSelection();this.$.selector.multi=multiSelection},updateSizeForItem:function(item){item=this._getNormalizedItem(item);var key=this._collection.getKey(item);var pidx=this._physicalIndexForKey[key];if(pidx!=null){this._updateMetrics([pidx]);this._positionItems()}},_manageFocus:function(){var fidx=this._focusedIndex;if(fidx>=0&&fidx0&&this._physicalCount>0){this._focusedIndex=this._virtualStart;this._focusedItem=this._physicalItems[this._physicalStart]}},_isIndexRendered:function(idx){return idx>=this._virtualStart&&idx<=this._virtualEnd},_isIndexVisible:function(idx){return idx>=this.firstVisibleIndex&&idx<=this.lastVisibleIndex},_getPhysicalIndex:function(idx){return this._physicalIndexForKey[this._collection.getKey(this._getNormalizedItem(idx))]},_focusPhysicalItem:function(idx){if(idx<0||idx>=this._virtualCount){return}this._restoreFocusedItem();if(!this._isIndexRendered(idx)){this.scrollToIndex(idx)}var physicalItem=this._physicalItems[this._getPhysicalIndex(idx)];var model=physicalItem._templateInstance;var focusable;model.tabIndex=SECRET_TABINDEX;if(physicalItem.tabIndex===SECRET_TABINDEX){focusable=physicalItem}if(!focusable){focusable=Polymer.dom(physicalItem).querySelector('[tabindex="'+SECRET_TABINDEX+'"]')}model.tabIndex=0;this._focusedIndex=idx;focusable&&focusable.focus()},_removeFocusedItem:function(){if(this._offscreenFocusedItem){Polymer.dom(this).removeChild(this._offscreenFocusedItem)}this._offscreenFocusedItem=null;this._focusBackfillItem=null;this._focusedItem=null;this._focusedIndex=-1},_createFocusBackfillItem:function(){var pidx,fidx=this._focusedIndex;if(this._offscreenFocusedItem||fidx<0){return}if(!this._focusBackfillItem){var stampedTemplate=this.stamp(null);this._focusBackfillItem=stampedTemplate.root.querySelector("*");Polymer.dom(this).appendChild(stampedTemplate.root)}pidx=this._getPhysicalIndex(fidx);if(pidx!=null){this._offscreenFocusedItem=this._physicalItems[pidx];this._physicalItems[pidx]=this._focusBackfillItem;this.translate3d(0,HIDDEN_Y,0,this._offscreenFocusedItem)}},_restoreFocusedItem:function(){var pidx,fidx=this._focusedIndex;if(!this._offscreenFocusedItem||this._focusedIndex<0){return}this._assignModels();pidx=this._getPhysicalIndex(fidx);if(pidx!=null){this._focusBackfillItem=this._physicalItems[pidx];this._physicalItems[pidx]=this._offscreenFocusedItem;this._offscreenFocusedItem=null;this.translate3d(0,HIDDEN_Y,0,this._focusBackfillItem)}},_didFocus:function(e){var targetModel=this.modelForElement(e.target);var focusedModel=this._focusedItem?this._focusedItem._templateInstance:null;var hasOffscreenFocusedItem=this._offscreenFocusedItem!==null;var fidx=this._focusedIndex;if(!targetModel||!focusedModel){return}if(focusedModel===targetModel){if(!this._isIndexVisible(fidx)){this.scrollToIndex(fidx)}}else{this._restoreFocusedItem();focusedModel.tabIndex=-1;targetModel.tabIndex=0;fidx=targetModel[this.indexAs];this._focusedIndex=fidx;this._focusedItem=this._physicalItems[this._getPhysicalIndex(fidx)];if(hasOffscreenFocusedItem&&!this._offscreenFocusedItem){this._update()}}},_didMoveUp:function(){this._focusPhysicalItem(this._focusedIndex-1)},_didMoveDown:function(e){e.detail.keyboardEvent.preventDefault();this._focusPhysicalItem(this._focusedIndex+1)},_didEnter:function(e){this._focusPhysicalItem(this._focusedIndex);this._selectionHandler(e.detail.keyboardEvent)}})})();Polymer({is:"iron-scroll-threshold",properties:{upperThreshold:{type:Number,value:100},lowerThreshold:{type:Number,value:100},upperTriggered:{type:Boolean,value:false,notify:true,readOnly:true},lowerTriggered:{type:Boolean,value:false,notify:true,readOnly:true},horizontal:{type:Boolean,value:false}},behaviors:[Polymer.IronScrollTargetBehavior],observers:["_setOverflow(scrollTarget)","_initCheck(horizontal, isAttached)"],get _defaultScrollTarget(){return this},_setOverflow:function(scrollTarget){this.style.overflow=scrollTarget===this?"auto":""},_scrollHandler:function(){var THROTTLE_THRESHOLD=200;if(!this.isDebouncerActive("_checkTheshold")){this.debounce("_checkTheshold",function(){this.checkScrollThesholds()},THROTTLE_THRESHOLD)}},_initCheck:function(horizontal,isAttached){if(isAttached){this.debounce("_init",function(){this.clearTriggers();this.checkScrollThesholds()})}},checkScrollThesholds:function(){if(!this.scrollTarget||this.lowerTriggered&&this.upperTriggered){return}var upperScrollValue=this.horizontal?this._scrollLeft:this._scrollTop;var lowerScrollValue=this.horizontal?this.scrollTarget.scrollWidth-this._scrollTargetWidth-this._scrollLeft:this.scrollTarget.scrollHeight-this._scrollTargetHeight-this._scrollTop;if(upperScrollValue<=this.upperThreshold&&!this.upperTriggered){this._setUpperTriggered(true);this.fire("upper-threshold")}if(lowerScrollValue<=this.lowerThreshold&&!this.lowerTriggered){this._setLowerTriggered(true);this.fire("lower-threshold")}},clearTriggers:function(){this._setUpperTriggered(false);this._setLowerTriggered(false)}}); +Polymer({is:"history-toolbar",properties:{count:{type:Number,value:0,observer:"changeToolbarView_"},itemsSelected_:{type:Boolean,value:false,reflectToAttribute:true},searchTerm:{type:String,observer:"searchTermChanged_",notify:true},spinnerActive:{type:Boolean,value:false},hasDrawer:{type:Boolean,observer:"hasDrawerChanged_",reflectToAttribute:true},showSyncNotice:Boolean,isGroupedMode:{type:Boolean,reflectToAttribute:true},groupedRange:{type:Number,value:0,reflectToAttribute:true,notify:true},queryStartTime:String,queryEndTime:String,showMenuPromo:Boolean},get searchField(){return this.$["main-toolbar"].getSearchField()},showSearchField:function(){this.searchField.showAndFocus()},changeToolbarView_:function(){this.itemsSelected_=this.count>0},searchTermChanged_:function(){if(this.searchField.getValue()!=this.searchTerm){this.searchField.showAndFocus();this.searchField.setValue(this.searchTerm)}},onSearchChanged_:function(event){this.searchTerm=event.detail},onInfoButtonTap_:function(){var dropdown=this.$.syncNotice.get();dropdown.positionTarget=this.$$("#info-button-icon");if(dropdown.style.display=="none")dropdown.open()},onClearSelectionTap_:function(){this.fire("unselect-all")},onDeleteTap_:function(){this.fire("delete-selected")},deletingAllowed_:function(){return loadTimeData.getBoolean("allowDeletingHistory")},numberOfItemsSelected_:function(count){return count>0?loadTimeData.getStringF("itemsSelected",count):""},getHistoryInterval_:function(queryStartTime,queryEndTime){return loadTimeData.getStringF("historyInterval",queryStartTime,queryEndTime)},hasDrawerChanged_:function(){this.updateStyles()}});(function(){"use strict";Polymer.IronA11yAnnouncer=Polymer({is:"iron-a11y-announcer",properties:{mode:{type:String,value:"polite"},_text:{type:String,value:""}},created:function(){if(!Polymer.IronA11yAnnouncer.instance){Polymer.IronA11yAnnouncer.instance=this}document.body.addEventListener("iron-announce",this._onIronAnnounce.bind(this))},announce:function(text){this._text="";this.async(function(){this._text=text},100)},_onIronAnnounce:function(event){if(event.detail&&event.detail.text){this.announce(event.detail.text)}}});Polymer.IronA11yAnnouncer.instance=null;Polymer.IronA11yAnnouncer.requestAvailability=function(){if(!Polymer.IronA11yAnnouncer.instance){Polymer.IronA11yAnnouncer.instance=document.createElement("iron-a11y-announcer")}document.body.appendChild(Polymer.IronA11yAnnouncer.instance)}})();(function(){var IOS=navigator.userAgent.match(/iP(?:hone|ad;(?: U;)? CPU) OS (\d+)/);var IOS_TOUCH_SCROLLING=IOS&&IOS[1]>=8;var DEFAULT_PHYSICAL_COUNT=3;var HIDDEN_Y="-10000px";var ITEM_WIDTH=0;var ITEM_HEIGHT=1;var SECRET_TABINDEX=-100;Polymer({is:"iron-list",properties:{items:{type:Array},maxPhysicalCount:{type:Number,value:500},as:{type:String,value:"item"},indexAs:{type:String,value:"index"},selectedAs:{type:String,value:"selected"},grid:{type:Boolean,value:false,reflectToAttribute:true},selectionEnabled:{type:Boolean,value:false},selectedItem:{type:Object,notify:true},selectedItems:{type:Object,notify:true},multiSelection:{type:Boolean,value:false}},observers:["_itemsChanged(items.*)","_selectionEnabledChanged(selectionEnabled)","_multiSelectionChanged(multiSelection)","_setOverflow(scrollTarget)"],behaviors:[Polymer.Templatizer,Polymer.IronResizableBehavior,Polymer.IronA11yKeysBehavior,Polymer.IronScrollTargetBehavior],keyBindings:{up:"_didMoveUp",down:"_didMoveDown",enter:"_didEnter"},_ratio:.5,_scrollerPaddingTop:0,_scrollPosition:0,_physicalSize:0,_physicalAverage:0,_physicalAverageCount:0,_physicalTop:0,_virtualCount:0,_physicalIndexForKey:null,_estScrollHeight:0,_scrollHeight:0,_viewportHeight:0,_viewportWidth:0,_physicalItems:null,_physicalSizes:null,_firstVisibleIndexVal:null,_lastVisibleIndexVal:null,_collection:null,_maxPages:2,_focusedItem:null,_focusedIndex:-1,_offscreenFocusedItem:null,_focusBackfillItem:null,_itemsPerRow:1,_itemWidth:0,_rowHeight:0,_templateCost:0,get _physicalBottom(){return this._physicalTop+this._physicalSize},get _scrollBottom(){return this._scrollPosition+this._viewportHeight},get _virtualEnd(){return this._virtualStart+this._physicalCount-1},get _hiddenContentSize(){var size=this.grid?this._physicalRows*this._rowHeight:this._physicalSize;return size-this._viewportHeight},get _maxScrollTop(){return this._estScrollHeight-this._viewportHeight+this._scrollerPaddingTop},_minVirtualStart:0,get _maxVirtualStart(){return Math.max(0,this._virtualCount-this._physicalCount)},_virtualStartVal:0,set _virtualStart(val){this._virtualStartVal=Math.min(this._maxVirtualStart,Math.max(this._minVirtualStart,val))},get _virtualStart(){return this._virtualStartVal||0},_physicalStartVal:0,set _physicalStart(val){this._physicalStartVal=val%this._physicalCount;if(this._physicalStartVal<0){this._physicalStartVal=this._physicalCount+this._physicalStartVal}this._physicalEnd=(this._physicalStart+this._physicalCount-1)%this._physicalCount},get _physicalStart(){return this._physicalStartVal||0},_physicalCountVal:0,set _physicalCount(val){this._physicalCountVal=val;this._physicalEnd=(this._physicalStart+this._physicalCount-1)%this._physicalCount},get _physicalCount(){return this._physicalCountVal},_physicalEnd:0,get _optPhysicalSize(){if(this.grid){return this._estRowsInView*this._rowHeight*this._maxPages}return this._viewportHeight*this._maxPages},get _isVisible(){return Boolean(this.offsetWidth||this.offsetHeight)},get firstVisibleIndex(){if(this._firstVisibleIndexVal===null){var physicalOffset=Math.floor(this._physicalTop+this._scrollerPaddingTop);this._firstVisibleIndexVal=this._iterateItems(function(pidx,vidx){physicalOffset+=this._getPhysicalSizeIncrement(pidx);if(physicalOffset>this._scrollPosition){return this.grid?vidx-vidx%this._itemsPerRow:vidx}if(this.grid&&this._virtualCount-1===vidx){return vidx-vidx%this._itemsPerRow}})||0}return this._firstVisibleIndexVal},get lastVisibleIndex(){if(this._lastVisibleIndexVal===null){if(this.grid){var lastIndex=this.firstVisibleIndex+this._estRowsInView*this._itemsPerRow-1;this._lastVisibleIndexVal=Math.min(this._virtualCount,lastIndex)}else{var physicalOffset=this._physicalTop;this._iterateItems(function(pidx,vidx){if(physicalOffset=0;this._scrollPosition=scrollTop;this._firstVisibleIndexVal=null;this._lastVisibleIndexVal=null;if(Math.abs(delta)>this._physicalSize){var idxAdjustment=Math.round(delta/this._physicalAverage)*this._itemsPerRow;this._physicalTop=this._physicalTop+delta;this._virtualStart=this._virtualStart+idxAdjustment;this._physicalStart=this._physicalStart+idxAdjustment;this._update()}else{var reusables=this._getReusables(isScrollingDown);if(isScrollingDown){this._physicalTop=reusables.physicalTop;this._virtualStart=this._virtualStart+reusables.indexes.length;this._physicalStart=this._physicalStart+reusables.indexes.length}else{this._virtualStart=this._virtualStart-reusables.indexes.length;this._physicalStart=this._physicalStart-reusables.indexes.length}if(reusables.indexes.length===0){this._increasePoolIfNeeded()}else{this._update(reusables.indexes,isScrollingDown?null:reusables.indexes)}}},_getReusables:function(fromTop){var ith,lastIth,offsetContent,physicalItemHeight;var idxs=[];var protectedOffsetContent=this._hiddenContentSize*this._ratio;var virtualStart=this._virtualStart;var virtualEnd=this._virtualEnd;var physicalCount=this._physicalCount;var physicalTop=this._physicalTop+this._scrollerPaddingTop;var scrollTop=this._scrollTop;var scrollBottom=this._scrollBottom;if(fromTop){ith=this._physicalStart;lastIth=this._physicalEnd;offsetContent=scrollTop-physicalTop}else{ith=this._physicalEnd;lastIth=this._physicalStart;offsetContent=this._physicalBottom-scrollBottom}while(true){physicalItemHeight=this._getPhysicalSizeIncrement(ith);offsetContent=offsetContent-physicalItemHeight;if(idxs.length>=physicalCount||offsetContent<=protectedOffsetContent){break}if(fromTop){if(virtualEnd+idxs.length+1>=this._virtualCount){break}if(physicalTop+physicalItemHeight>=scrollTop){break}idxs.push(ith);physicalTop=physicalTop+physicalItemHeight;ith=(ith+1)%physicalCount}else{if(virtualStart-idxs.length<=0){break}if(physicalTop+this._physicalSize-physicalItemHeight<=scrollBottom){break}idxs.push(ith);physicalTop=physicalTop-physicalItemHeight;ith=ith===0?physicalCount-1:ith-1}}return{indexes:idxs,physicalTop:physicalTop-this._scrollerPaddingTop}},_update:function(itemSet,movingUp){if(itemSet&&itemSet.length===0){return}this._manageFocus();this._assignModels(itemSet);this._updateMetrics(itemSet);if(movingUp){while(movingUp.length){var idx=movingUp.pop();this._physicalTop-=this._getPhysicalSizeIncrement(idx)}}this._positionItems();this._updateScrollerSize();this._increasePoolIfNeeded()},_createPool:function(size){var physicalItems=new Array(size);this._ensureTemplatized();for(var i=0;i=this._scrollBottom&&this._physicalTop<=this._scrollPosition;if(this._physicalSize>=this._optPhysicalSize&&isClientFull){return false}var maxPoolSize=Math.round(this._physicalCount*.5);if(!isClientFull){this._debounceTemplate(this._increasePool.bind(this,maxPoolSize));return true}this._yield(function(){self._increasePool(Math.min(maxPoolSize,Math.max(1,Math.round(50/self._templateCost))))});return true},_yield:function(cb){var g=window;var handle=g.requestIdleCallback?g.requestIdleCallback(cb):g.setTimeout(cb,16);Polymer.dom.addDebouncer({complete:function(){g.cancelIdleCallback?g.cancelIdleCallback(handle):g.clearTimeout(handle);cb()}})},_increasePool:function(missingItems){var nextPhysicalCount=Math.min(this._physicalCount+missingItems,this._virtualCount-this._virtualStart,Math.max(this.maxPhysicalCount,DEFAULT_PHYSICAL_COUNT));var prevPhysicalCount=this._physicalCount;var delta=nextPhysicalCount-prevPhysicalCount;var ts=window.performance.now();if(delta<=0){return}[].push.apply(this._physicalItems,this._createPool(delta));[].push.apply(this._physicalSizes,new Array(delta));this._physicalCount=prevPhysicalCount+delta;if(this._physicalStart>this._physicalEnd&&this._isIndexRendered(this._focusedIndex)&&this._getPhysicalIndex(this._focusedIndex)=0){path=this.as+"."+path.substring(dot+1);el._templateInstance.notifyPath(path,value,true)}else{var currentItem=el._templateInstance[this.as];if(Array.isArray(this.selectedItems)){for(var i=0;i=0){this._focusedIndex=this._focusedIndex+delta}}},this)},_removeItem:function(item){this.$.selector.deselect(item);if(this._focusedItem&&this._focusedItem._templateInstance[this.as]===item){this._removeFocusedItem()}},_iterateItems:function(fn,itemSet){var pidx,vidx,rtn,i;if(arguments.length===2&&itemSet){for(i=0;i=this._physicalStart){return this._virtualStart+(pidx-this._physicalStart)}return this._virtualStart+(this._physicalCount-this._physicalStart)+pidx},_assignModels:function(itemSet){this._iterateItems(function(pidx,vidx){var el=this._physicalItems[pidx];var inst=el._templateInstance;var item=this.items&&this.items[vidx];if(item!=null){inst[this.as]=item;inst.__key__=this._collection.getKey(item);inst[this.selectedAs]=this.$.selector.isSelected(item);inst[this.indexAs]=vidx;inst.tabIndex=this._focusedIndex===vidx?0:-1;this._physicalIndexForKey[inst.__key__]=pidx;el.removeAttribute("hidden")}else{inst.__key__=null;el.setAttribute("hidden","")}},itemSet)},_updateMetrics:function(itemSet){Polymer.dom.flush();var newPhysicalSize=0;var oldPhysicalSize=0;var prevAvgCount=this._physicalAverageCount;var prevPhysicalAvg=this._physicalAverage;this._iterateItems(function(pidx,vidx){oldPhysicalSize+=this._physicalSizes[pidx]||0;this._physicalSizes[pidx]=this._physicalItems[pidx].offsetHeight;newPhysicalSize+=this._physicalSizes[pidx];this._physicalAverageCount+=this._physicalSizes[pidx]?1:0},itemSet);if(this.grid){this._updateGridMetrics();this._physicalSize=Math.ceil(this._physicalCount/this._itemsPerRow)*this._rowHeight}else{this._physicalSize=this._physicalSize+newPhysicalSize-oldPhysicalSize}if(this._physicalAverageCount!==prevAvgCount){this._physicalAverage=Math.round((prevPhysicalAvg*prevAvgCount+newPhysicalSize)/this._physicalAverageCount)}},_updateGridMetrics:function(){this._itemWidth=this._physicalCount>0?this._physicalItems[0].getBoundingClientRect().width:200;this._rowHeight=this._physicalCount>0?this._physicalItems[0].offsetHeight:200;this._itemsPerRow=this._itemWidth?Math.floor(this._viewportWidth/this._itemWidth):this._itemsPerRow},_positionItems:function(){this._adjustScrollPosition();var y=this._physicalTop;if(this.grid){var totalItemWidth=this._itemsPerRow*this._itemWidth;var rowOffset=(this._viewportWidth-totalItemWidth)/2;this._iterateItems(function(pidx,vidx){var modulus=vidx%this._itemsPerRow;var x=Math.floor(modulus*this._itemWidth+rowOffset);this.translate3d(x+"px",y+"px",0,this._physicalItems[pidx]);if(this._shouldRenderNextRow(vidx)){y+=this._rowHeight}})}else{this._iterateItems(function(pidx,vidx){this.translate3d(0,y+"px",0,this._physicalItems[pidx]);y+=this._physicalSizes[pidx]})}},_getPhysicalSizeIncrement:function(pidx){if(!this.grid){return this._physicalSizes[pidx]}if(this._computeVidx(pidx)%this._itemsPerRow!==this._itemsPerRow-1){return 0}return this._rowHeight},_shouldRenderNextRow:function(vidx){return vidx%this._itemsPerRow===this._itemsPerRow-1},_adjustScrollPosition:function(){var deltaHeight=this._virtualStart===0?this._physicalTop:Math.min(this._scrollPosition+this._physicalTop,0);if(deltaHeight){this._physicalTop=this._physicalTop-deltaHeight;if(!IOS_TOUCH_SCROLLING&&this._physicalTop!==0){this._resetScrollPosition(this._scrollTop-deltaHeight)}}},_resetScrollPosition:function(pos){if(this.scrollTarget){this._scrollTop=pos;this._scrollPosition=this._scrollTop}},_updateScrollerSize:function(forceUpdate){if(this.grid){this._estScrollHeight=this._virtualRowCount*this._rowHeight}else{this._estScrollHeight=this._physicalBottom+Math.max(this._virtualCount-this._physicalCount-this._virtualStart,0)*this._physicalAverage}forceUpdate=forceUpdate||this._scrollHeight===0;forceUpdate=forceUpdate||this._scrollPosition>=this._estScrollHeight-this._physicalSize;forceUpdate=forceUpdate||this.grid&&this.$.items.style.height=this._optPhysicalSize){this.$.items.style.height=this._estScrollHeight+"px";this._scrollHeight=this._estScrollHeight}},scrollToItem:function(item){return this.scrollToIndex(this.items.indexOf(item))},scrollToIndex:function(idx){if(typeof idx!=="number"||idx<0||idx>this.items.length-1){return}Polymer.dom.flush();if(this._physicalCount===0){return}idx=Math.min(Math.max(idx,0),this._virtualCount-1);if(!this._isIndexRendered(idx)||idx>=this._maxVirtualStart){this._virtualStart=this.grid?idx-this._itemsPerRow*2:idx-1}this._manageFocus();this._assignModels();this._updateMetrics();this._physicalTop=Math.floor(this._virtualStart/this._itemsPerRow)*this._physicalAverage;var currentTopItem=this._physicalStart;var currentVirtualItem=this._virtualStart;var targetOffsetTop=0;var hiddenContentSize=this._hiddenContentSize;while(currentVirtualItem0&&delta<100){return}Polymer.dom.addDebouncer(this.debounce("_debounceTemplate",function(){this.updateViewportBoundaries();this._render();if(this._isVisible){this.toggleScrollListener(true);if(this._physicalCount>0){this._resetAverage();this.scrollToIndex(this.firstVisibleIndex)}}else{this.toggleScrollListener(false)}}.bind(this),1))},_getModelFromItem:function(item){var key=this._collection.getKey(item);var pidx=this._physicalIndexForKey[key];if(pidx!=null){return this._physicalItems[pidx]._templateInstance}return null},_getNormalizedItem:function(item){if(this._collection.getKey(item)===undefined){if(typeof item==="number"){item=this.items[item];if(!item){throw new RangeError(" not found")}return item}throw new TypeError(" should be a valid item")}return item},selectItem:function(item){item=this._getNormalizedItem(item);var model=this._getModelFromItem(item);if(!this.multiSelection&&this.selectedItem){this.deselectItem(this.selectedItem)}if(model){model[this.selectedAs]=true}this.$.selector.select(item);this.updateSizeForItem(item)},deselectItem:function(item){item=this._getNormalizedItem(item);var model=this._getModelFromItem(item);if(model){model[this.selectedAs]=false}this.$.selector.deselect(item);this.updateSizeForItem(item)},toggleSelectionForItem:function(item){item=this._getNormalizedItem(item);if(this.$.selector.isSelected(item)){this.deselectItem(item)}else{this.selectItem(item)}},clearSelection:function(){function unselect(item){var model=this._getModelFromItem(item);if(model){model[this.selectedAs]=false}}if(Array.isArray(this.selectedItems)){this.selectedItems.forEach(unselect,this)}else if(this.selectedItem){unselect.call(this,this.selectedItem)}this.$.selector.clearSelection()},_selectionEnabledChanged:function(selectionEnabled){var handler=selectionEnabled?this.listen:this.unlisten;handler.call(this,this,"tap","_selectionHandler")},_selectionHandler:function(e){var model=this.modelForElement(e.target);if(!model){return}var modelTabIndex,activeElTabIndex;var target=Polymer.dom(e).path[0];var activeEl=Polymer.dom(this.domHost?this.domHost.root:document).activeElement;var physicalItem=this._physicalItems[this._getPhysicalIndex(model[this.indexAs])];if(target.localName==="input"||target.localName==="button"||target.localName==="select"){return}modelTabIndex=model.tabIndex;model.tabIndex=SECRET_TABINDEX;activeElTabIndex=activeEl?activeEl.tabIndex:-1;model.tabIndex=modelTabIndex;if(activeEl&&physicalItem!==activeEl&&physicalItem.contains(activeEl)&&activeElTabIndex!==SECRET_TABINDEX){return}this.toggleSelectionForItem(model[this.as])},_multiSelectionChanged:function(multiSelection){this.clearSelection();this.$.selector.multi=multiSelection},updateSizeForItem:function(item){item=this._getNormalizedItem(item);var key=this._collection.getKey(item);var pidx=this._physicalIndexForKey[key];if(pidx!=null){this._updateMetrics([pidx]);this._positionItems()}},_manageFocus:function(){var fidx=this._focusedIndex;if(fidx>=0&&fidx0&&this._physicalCount>0){this._focusedIndex=this._virtualStart;this._focusedItem=this._physicalItems[this._physicalStart]}},_isIndexRendered:function(idx){return idx>=this._virtualStart&&idx<=this._virtualEnd},_isIndexVisible:function(idx){return idx>=this.firstVisibleIndex&&idx<=this.lastVisibleIndex},_getPhysicalIndex:function(idx){return this._physicalIndexForKey[this._collection.getKey(this._getNormalizedItem(idx))]},_focusPhysicalItem:function(idx){if(idx<0||idx>=this._virtualCount){return}this._restoreFocusedItem();if(!this._isIndexRendered(idx)){this.scrollToIndex(idx)}var physicalItem=this._physicalItems[this._getPhysicalIndex(idx)];var model=physicalItem._templateInstance;var focusable;model.tabIndex=SECRET_TABINDEX;if(physicalItem.tabIndex===SECRET_TABINDEX){focusable=physicalItem}if(!focusable){focusable=Polymer.dom(physicalItem).querySelector('[tabindex="'+SECRET_TABINDEX+'"]')}model.tabIndex=0;this._focusedIndex=idx;focusable&&focusable.focus()},_removeFocusedItem:function(){if(this._offscreenFocusedItem){Polymer.dom(this).removeChild(this._offscreenFocusedItem)}this._offscreenFocusedItem=null;this._focusBackfillItem=null;this._focusedItem=null;this._focusedIndex=-1},_createFocusBackfillItem:function(){var fidx=this._focusedIndex;var pidx=this._getPhysicalIndex(fidx);if(this._offscreenFocusedItem||pidx==null||fidx<0){return}if(!this._focusBackfillItem){var stampedTemplate=this.stamp(null);this._focusBackfillItem=stampedTemplate.root.querySelector("*");Polymer.dom(this).appendChild(stampedTemplate.root)}this._offscreenFocusedItem=this._physicalItems[pidx];this._offscreenFocusedItem._templateInstance.tabIndex=0;this._physicalItems[pidx]=this._focusBackfillItem;this.translate3d(0,HIDDEN_Y,0,this._offscreenFocusedItem)},_restoreFocusedItem:function(){var pidx,fidx=this._focusedIndex;if(!this._offscreenFocusedItem||this._focusedIndex<0){return}this._assignModels();pidx=this._getPhysicalIndex(fidx);if(pidx!=null){this._focusBackfillItem=this._physicalItems[pidx];this._focusBackfillItem._templateInstance.tabIndex=-1;this._physicalItems[pidx]=this._offscreenFocusedItem;this._offscreenFocusedItem=null;this.translate3d(0,HIDDEN_Y,0,this._focusBackfillItem)}},_didFocus:function(e){var targetModel=this.modelForElement(e.target);var focusedModel=this._focusedItem?this._focusedItem._templateInstance:null;var hasOffscreenFocusedItem=this._offscreenFocusedItem!==null;var fidx=this._focusedIndex;if(!targetModel||!focusedModel){return}if(focusedModel===targetModel){if(!this._isIndexVisible(fidx)){this.scrollToIndex(fidx)}}else{this._restoreFocusedItem();focusedModel.tabIndex=-1;targetModel.tabIndex=0;fidx=targetModel[this.indexAs];this._focusedIndex=fidx;this._focusedItem=this._physicalItems[this._getPhysicalIndex(fidx)];if(hasOffscreenFocusedItem&&!this._offscreenFocusedItem){this._update()}}},_didMoveUp:function(){this._focusPhysicalItem(this._focusedIndex-1)},_didMoveDown:function(e){e.detail.keyboardEvent.preventDefault();this._focusPhysicalItem(this._focusedIndex+1)},_didEnter:function(e){this._focusPhysicalItem(this._focusedIndex);this._selectionHandler(e.detail.keyboardEvent)}})})();Polymer({is:"iron-scroll-threshold",properties:{upperThreshold:{type:Number,value:100},lowerThreshold:{type:Number,value:100},upperTriggered:{type:Boolean,value:false,notify:true,readOnly:true},lowerTriggered:{type:Boolean,value:false,notify:true,readOnly:true},horizontal:{type:Boolean,value:false}},behaviors:[Polymer.IronScrollTargetBehavior],observers:["_setOverflow(scrollTarget)","_initCheck(horizontal, isAttached)"],get _defaultScrollTarget(){return this},_setOverflow:function(scrollTarget){this.style.overflow=scrollTarget===this?"auto":""},_scrollHandler:function(){var THROTTLE_THRESHOLD=200;if(!this.isDebouncerActive("_checkTheshold")){this.debounce("_checkTheshold",function(){this.checkScrollThesholds()},THROTTLE_THRESHOLD)}},_initCheck:function(horizontal,isAttached){if(isAttached){this.debounce("_init",function(){this.clearTriggers();this.checkScrollThesholds()})}},checkScrollThesholds:function(){if(!this.scrollTarget||this.lowerTriggered&&this.upperTriggered){return}var upperScrollValue=this.horizontal?this._scrollLeft:this._scrollTop;var lowerScrollValue=this.horizontal?this.scrollTarget.scrollWidth-this._scrollTargetWidth-this._scrollLeft:this.scrollTarget.scrollHeight-this._scrollTargetHeight-this._scrollTop;if(upperScrollValue<=this.upperThreshold&&!this.upperTriggered){this._setUpperTriggered(true);this.fire("upper-threshold")}if(lowerScrollValue<=this.lowerThreshold&&!this.lowerTriggered){this._setLowerTriggered(true);this.fire("lower-threshold")}},clearTriggers:function(){this._setUpperTriggered(false);this._setLowerTriggered(false)}}); // Copyright (c) 2011 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. @@ -62,7 +59,7 @@ Polymer({is:"history-searched-label",properties:{title:String,searchTerm:String} // 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. -function HistoryFocusRow(root,boundary,delegate){cr.ui.FocusRow.call(this,root,boundary,delegate);this.addItems()}HistoryFocusRow.prototype={__proto__:cr.ui.FocusRow.prototype,getCustomEquivalent:function(sampleElement){var equivalent;if(this.getTypeForElement(sampleElement)=="star")equivalent=this.getFirstFocusable("title");return equivalent||cr.ui.FocusRow.prototype.getCustomEquivalent.call(this,sampleElement)},addItems:function(){this.destroy();assert(this.addItem("checkbox","#checkbox"));assert(this.addItem("title","#title"));assert(this.addItem("menu-button","#menu-button"));this.addItem("star","#bookmark-star")}};cr.define("md_history",function(){function FocusRowDelegate(historyItemElement){this.historyItemElement=historyItemElement}FocusRowDelegate.prototype={onFocus:function(row,e){this.historyItemElement.lastFocused=e.path[0]},onKeydown:function(row,e){if(e.key=="Enter")e.stopPropagation();return false}};var HistoryItem=Polymer({is:"history-item",properties:{item:{type:Object,observer:"showIcon_"},searchTerm:{type:String},selected:{type:Boolean,reflectToAttribute:true},isCardStart:{type:Boolean,reflectToAttribute:true},isCardEnd:{type:Boolean,reflectToAttribute:true},embedded:{type:Boolean,reflectToAttribute:true},hasTimeGap:{type:Boolean},numberOfItems:{type:Number},path:String,index:Number,lastFocused:{type:Object,notify:true},ironListTabIndex:{type:Number,observer:"ironListTabIndexChanged_"}},row_:null,attached:function(){Polymer.RenderStatus.afterNextRender(this,function(){this.row_=new HistoryFocusRow(this.$["main-container"],null,new FocusRowDelegate(this));this.row_.makeActive(this.ironListTabIndex==0);this.listen(this,"focus","onFocus_");this.listen(this,"dom-change","onDomChange_")})},detached:function(){this.unlisten(this,"focus","onFocus_");this.unlisten(this,"dom-change","onDomChange_");if(this.row_)this.row_.destroy()},onFocus_:function(){if(this.lastFocused)this.row_.getEquivalentElement(this.lastFocused).focus();else this.row_.getFirstFocusable().focus();this.tabIndex=-1},ironListTabIndexChanged_:function(){if(this.row_)this.row_.makeActive(this.ironListTabIndex==0)},onDomChange_:function(){if(this.row_)this.row_.addItems()},onCheckboxSelected_:function(e){this.fire("history-checkbox-select",{element:this,shiftKey:e.shiftKey});e.preventDefault()},onCheckboxMousedown_:function(e){if(e.shiftKey)e.preventDefault()},getEntrySummary_:function(){var item=this.item;return loadTimeData.getStringF("entrySummary",item.dateTimeOfDay,item.starred?loadTimeData.getString("bookmarked"):"",item.title,item.domain)},getAriaChecked_:function(selected){return selected?"true":"false"},onRemoveBookmarkTap_:function(){if(!this.item.starred)return;if(this.$$("#bookmark-star")==this.root.activeElement)this.$["menu-button"].focus();var browserService=md_history.BrowserService.getInstance();browserService.removeBookmark(this.item.url);browserService.recordAction("BookmarkStarClicked");this.fire("remove-bookmark-stars",this.item.url)},onMenuButtonTap_:function(e){this.fire("toggle-menu",{target:Polymer.dom(e).localTarget,index:this.index,item:this.item,path:this.path});e.stopPropagation()},onLinkClick_:function(){var browserService=md_history.BrowserService.getInstance();browserService.recordAction("EntryLinkClick");if(this.searchTerm)browserService.recordAction("SearchResultClick");if(this.index==undefined)return;browserService.recordHistogram("HistoryPage.ClickPosition",this.index,UMA_MAX_BUCKET_VALUE);if(this.index<=UMA_MAX_SUBSET_BUCKET_VALUE){browserService.recordHistogram("HistoryPage.ClickPositionSubset",this.index,UMA_MAX_SUBSET_BUCKET_VALUE)}},onLinkRightClick_:function(){md_history.BrowserService.getInstance().recordAction("EntryLinkRightClick")},showIcon_:function(){this.$.icon.style.backgroundImage=cr.icon.getFavicon(this.item.url)},selectionNotAllowed_:function(){return!loadTimeData.getBoolean("allowDeletingHistory")},cardTitle_:function(numberOfItems,historyDate,search){if(!search)return this.item.dateRelativeDay;return HistoryItem.searchResultsTitle(numberOfItems,search)}});HistoryItem.needsTimeGap=function(visits,currentIndex,searchedTerm){if(currentIndex>=visits.length-1||visits.length==0)return false;var currentItem=visits[currentIndex];var nextItem=visits[currentIndex+1];if(searchedTerm)return currentItem.dateShort!=nextItem.dateShort;return currentItem.time-nextItem.time>BROWSING_GAP_TIME&¤tItem.dateRelativeDay==nextItem.dateRelativeDay};HistoryItem.searchResultsTitle=function(numberOfResults,searchTerm){var resultId=numberOfResults==1?"searchResult":"searchResults";return loadTimeData.getStringF("foundSearchResults",numberOfResults,loadTimeData.getString(resultId),searchTerm)};return{HistoryItem:HistoryItem}}); +function HistoryFocusRow(root,boundary,delegate){cr.ui.FocusRow.call(this,root,boundary,delegate);this.addItems()}HistoryFocusRow.prototype={__proto__:cr.ui.FocusRow.prototype,getCustomEquivalent:function(sampleElement){var equivalent;if(this.getTypeForElement(sampleElement)=="star")equivalent=this.getFirstFocusable("title");return equivalent||cr.ui.FocusRow.prototype.getCustomEquivalent.call(this,sampleElement)},addItems:function(){this.destroy();assert(this.addItem("checkbox","#checkbox"));assert(this.addItem("title","#title"));assert(this.addItem("menu-button","#menu-button"));this.addItem("star","#bookmark-star")}};cr.define("md_history",function(){function FocusRowDelegate(historyItemElement){this.historyItemElement=historyItemElement}FocusRowDelegate.prototype={onFocus:function(row,e){this.historyItemElement.lastFocused=e.path[0]},onKeydown:function(row,e){if(e.key=="Enter")e.stopPropagation();return false}};var HistoryItem=Polymer({is:"history-item",properties:{item:{type:Object,observer:"showIcon_"},searchTerm:{type:String},selected:{type:Boolean,reflectToAttribute:true},isCardStart:{type:Boolean,reflectToAttribute:true},isCardEnd:{type:Boolean,reflectToAttribute:true},embedded:{type:Boolean,reflectToAttribute:true},hasTimeGap:{type:Boolean},numberOfItems:{type:Number},path:String,index:Number,lastFocused:{type:Object,notify:true},ironListTabIndex:{type:Number,observer:"ironListTabIndexChanged_"}},row_:null,attached:function(){Polymer.RenderStatus.afterNextRender(this,function(){this.row_=new HistoryFocusRow(this.$["main-container"],null,new FocusRowDelegate(this));this.row_.makeActive(this.ironListTabIndex==0);this.listen(this,"focus","onFocus_");this.listen(this,"dom-change","onDomChange_")})},detached:function(){this.unlisten(this,"focus","onFocus_");this.unlisten(this,"dom-change","onDomChange_");if(this.row_)this.row_.destroy()},onFocus_:function(){if(this.lastFocused)this.row_.getEquivalentElement(this.lastFocused).focus();else this.row_.getFirstFocusable().focus();this.tabIndex=-1},ironListTabIndexChanged_:function(){if(this.row_)this.row_.makeActive(this.ironListTabIndex==0)},onDomChange_:function(){if(this.row_)this.row_.addItems()},onItemClick_:function(e){for(var i=0;i=visits.length-1||visits.length==0)return false;var currentItem=visits[currentIndex];var nextItem=visits[currentIndex+1];if(searchedTerm)return currentItem.dateShort!=nextItem.dateShort;return currentItem.time-nextItem.time>BROWSING_GAP_TIME&¤tItem.dateRelativeDay==nextItem.dateRelativeDay};HistoryItem.searchResultsTitle=function(numberOfResults,searchTerm){var resultId=numberOfResults==1?"searchResult":"searchResults";return loadTimeData.getStringF("foundSearchResults",numberOfResults,loadTimeData.getString(resultId),searchTerm)};return{HistoryItem:HistoryItem}}); // 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. @@ -74,7 +71,7 @@ Polymer({is:"history-list",behaviors:[HistoryListBehavior],properties:{searchedT // 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. -Polymer({is:"history-list-container",properties:{selectedPage_:String,grouped:Boolean,groupedRange:{type:Number,observer:"groupedRangeChanged_"},queryState:Object,queryResult:Object},observers:["searchTermChanged_(queryState.searchTerm)"],listeners:{"history-list-scrolled":"closeMenu_","load-more-history":"loadMoreHistory_","toggle-menu":"toggleMenu_"},historyResult:function(info,results){this.initializeResults_(info,results);this.closeMenu_();if(info.term&&!this.queryState.incremental){Polymer.IronA11yAnnouncer.requestAvailability();this.fire("iron-announce",{text:md_history.HistoryItem.searchResultsTitle(results.length,info.term)})}if(this.selectedPage_=="grouped-list"){this.$$("#grouped-list").historyData=results;return}var list=this.$["infinite-list"];list.addNewResults(results,this.queryState.incremental);if(info.finished)list.disableResultLoading()},queryHistory:function(incremental){var queryState=this.queryState;var noResults=!this.queryResult||this.queryResult.results==null;if(queryState.queryingDisabled||!this.queryState.searchTerm&&noResults){return}var dialog=this.$.dialog.getIfExists();if(!incremental&&dialog&&dialog.open)dialog.close();this.set("queryState.querying",true);this.set("queryState.incremental",incremental);var lastVisitTime=0;if(incremental){var lastVisit=this.queryResult.results.slice(-1)[0];lastVisitTime=lastVisit?Math.floor(lastVisit.time):0}var maxResults=this.groupedRange==HistoryRange.ALL_TIME?RESULTS_PER_PAGE:0;chrome.send("queryHistory",[queryState.searchTerm,queryState.groupedOffset,queryState.range,lastVisitTime,maxResults])},historyDeleted:function(){if(this.getSelectedItemCount()>0)return;this.queryHistory(false)},getContentScrollTarget:function(){return this.getSelectedList_()},getSelectedItemCount:function(){return this.getSelectedList_().selectedPaths.size},unselectAllItems:function(count){var selectedList=this.getSelectedList_();if(selectedList)selectedList.unselectAllItems(count)},deleteSelectedWithPrompt:function(){if(!loadTimeData.getBoolean("allowDeletingHistory"))return;var browserService=md_history.BrowserService.getInstance();browserService.recordAction("RemoveSelected");if(this.queryState.searchTerm!="")browserService.recordAction("SearchResultRemove");this.$.dialog.get().showModal();this.$$(".action-button").focus()},groupedRangeChanged_:function(range,oldRange){this.selectedPage_=range==HistoryRange.ALL_TIME?"infinite-list":"grouped-list";if(oldRange==undefined)return;this.queryHistory(false);this.fire("history-view-changed")},searchTermChanged_:function(){this.queryHistory(false);if(this.queryState.searchTerm)md_history.BrowserService.getInstance().recordAction("Search")},loadMoreHistory_:function(){this.queryHistory(true)},initializeResults_:function(info,results){if(results.length==0)return;var currentDate=results[0].dateRelativeDay;for(var i=0;inow;this._lastChangedAt=now;if(shouldReplace){window.history.replaceState({},"",fullNewUrl)}else{window.history.pushState({},"",fullNewUrl)}this.fire("location-changed",{},{node:window})},_globalOnClick:function(event){if(event.defaultPrevented){return}var href=this._getSameOriginLinkHref(event);if(!href){return}event.preventDefault();if(href===window.location.href){return}window.history.pushState({},"",href);this.fire("location-changed",{},{node:window})},_getSameOriginLinkHref:function(event){if(event.button!==0){return null}if(event.metaKey||event.ctrlKey){return null}var eventPath=Polymer.dom(event).path;var anchor=null;for(var i=0;i0)return;this.queryHistory(false)},getContentScrollTarget:function(){return this.getSelectedList_()},getSelectedItemCount:function(){return this.getSelectedList_().selectedPaths.size},unselectAllItems:function(count){var selectedList=this.getSelectedList_();if(selectedList)selectedList.unselectAllItems(count)},deleteSelectedWithPrompt:function(){if(!loadTimeData.getBoolean("allowDeletingHistory"))return;var browserService=md_history.BrowserService.getInstance();browserService.recordAction("RemoveSelected");if(this.queryState.searchTerm!="")browserService.recordAction("SearchResultRemove");this.$.dialog.get().showModal();this.$$(".action-button").focus()},groupedRangeChanged_:function(range,oldRange){this.selectedPage_=range==HistoryRange.ALL_TIME?"infinite-list":"grouped-list";if(oldRange==undefined)return;this.queryHistory(false);this.fire("history-view-changed")},searchTermChanged_:function(){this.queryHistory(false);if(this.queryState.searchTerm)md_history.BrowserService.getInstance().recordAction("Search")},loadMoreHistory_:function(){this.queryHistory(true)},initializeResults_:function(info,results){if(results.length==0)return;var currentDate=results[0].dateRelativeDay;for(var i=0;inow;this._lastChangedAt=now;if(shouldReplace){window.history.replaceState({},"",fullNewUrl)}else{window.history.pushState({},"",fullNewUrl)}this.fire("location-changed",{},{node:window})},_globalOnClick:function(event){if(event.defaultPrevented){return}var href=this._getSameOriginLinkHref(event);if(!href){return}event.preventDefault();if(href===window.location.href){return}window.history.pushState({},"",href);this.fire("location-changed",{},{node:window})},_getSameOriginLinkHref:function(event){if(event.button!==0){return null}if(event.metaKey||event.ctrlKey){return null}var eventPath=Polymer.dom(event).path;var anchor=null;for(var i=0;i0;break}},onCommand_:function(e){if(e.command.id=="find-command"||e.command.id=="slash-command")this.focusToolbarSearchField();if(e.command.id=="delete-command")this.deleteSelected()},setForeignSessions:function(sessionList,isTabSyncEnabled){if(!isTabSyncEnabled){var syncedDeviceManagerElem=this.$$("history-synced-device-manager");if(syncedDeviceManagerElem)syncedDeviceManagerElem.tabSyncDisabled();return}this.set("queryResult_.sessionList",sessionList)},historyDeleted:function(){this.$.history.historyDeleted()},updateSignInState:function(isUserSignedIn){this.isUserSignedIn_=isUserSignedIn},syncedTabsSelected_:function(selectedPage){return selectedPage=="syncedTabs"},shouldShowSpinner_:function(querying,incremental,searchTerm){return querying&&!incremental&&searchTerm!=""},showSyncNotice_:function(hasSyncedResults,selectedPage){return hasSyncedResults&&selectedPage!="syncedTabs"},selectedPageChanged_:function(){this.unselectAll();this.historyViewChanged_()},historyViewChanged_:function(){requestAnimationFrame(function(){if(!this.$.content.selectedItem)return;this.scrollTarget=this.$.content.selectedItem.getContentScrollTarget();this._scrollHandler()}.bind(this));this.recordHistoryPageView_()},getSelectedPage_:function(selectedPage,items){return selectedPage},closeDrawer_:function(){var drawer=this.$$("#drawer");if(drawer)drawer.close()},recordHistoryPageView_:function(){var histogramValue=HistoryPageViewHistogram.END;switch(this.selectedPage_){case"syncedTabs":histogramValue=this.isUserSignedIn_?HistoryPageViewHistogram.SYNCED_TABS:HistoryPageViewHistogram.SIGNIN_PROMO;break;default:switch(this.queryState_.range){case HistoryRange.ALL_TIME:histogramValue=HistoryPageViewHistogram.HISTORY;break;case HistoryRange.WEEK:histogramValue=HistoryPageViewHistogram.GROUPED_WEEK;break;case HistoryRange.MONTH:histogramValue=HistoryPageViewHistogram.GROUPED_MONTH;break}break}md_history.BrowserService.getInstance().recordHistogram("History.HistoryPageView",histogramValue,HistoryPageViewHistogram.END)}}); \ No newline at end of file +cr.define("md_history",function(){var lazyLoadPromise=null;function ensureLazyLoaded(){if(!lazyLoadPromise){lazyLoadPromise=new Promise(function(resolve,reject){Polymer.Base.importHref("chrome://history/lazy_load.html",resolve,reject,true)})}return lazyLoadPromise}return{ensureLazyLoaded:ensureLazyLoaded}});Polymer({is:"history-app",behaviors:[Polymer.IronScrollTargetBehavior],properties:{showSidebarFooter:Boolean,hasSyncedResults:Boolean,selectedPage_:{type:String,observer:"selectedPageChanged_"},grouped_:{type:Boolean,reflectToAttribute:true},queryState_:{type:Object,value:function(){return{incremental:false,querying:true,queryingDisabled:false,_range:HistoryRange.ALL_TIME,searchTerm:"",groupedOffset:0,set range(val){this._range=Number(val)},get range(){return this._range}}}},queryResult_:{type:Object,value:function(){return{info:null,results:null,sessionList:null}}},hasDrawer_:Boolean,isUserSignedIn_:{type:Boolean,value:loadTimeData.getBoolean("isUserSignedIn")},toolbarShadow_:{type:Boolean,reflectToAttribute:true,notify:true},showMenuPromo_:{type:Boolean,value:function(){return loadTimeData.getBoolean("showMenuPromo")}}},listeners:{"cr-toolbar-menu-promo-close":"onCrToolbarMenuPromoClose_","cr-toolbar-menu-promo-shown":"onCrToolbarMenuPromoShown_","cr-toolbar-menu-tap":"onCrToolbarMenuTap_","delete-selected":"deleteSelected","history-checkbox-select":"checkboxSelected","history-close-drawer":"closeDrawer_","history-view-changed":"historyViewChanged_","opened-changed":"onOpenedChanged_","unselect-all":"unselectAll"},boundOnCanExecute_:null,boundOnCommand_:null,attached:function(){this.grouped_=loadTimeData.getBoolean("groupByDomain");cr.ui.decorate("command",cr.ui.Command);this.boundOnCanExecute_=this.onCanExecute_.bind(this);this.boundOnCommand_=this.onCommand_.bind(this);document.addEventListener("canExecute",this.boundOnCanExecute_);document.addEventListener("command",this.boundOnCommand_)},detached:function(){document.removeEventListener("canExecute",this.boundOnCanExecute_);document.removeEventListener("command",this.boundOnCommand_)},onFirstRender:function(){setTimeout(function(){chrome.send("metricsHandler:recordTime",["History.ResultsRenderedTime",window.performance.now()])});var searchField=this.$.toolbar.searchField;if(!searchField.narrow){searchField.getSearchInput().focus()}md_history.ensureLazyLoaded().then(function(){window.requestIdleCallback(function(){document.fonts.load("bold 12px Roboto")})})},_scrollHandler:function(){if(this.scrollTarget)this.toolbarShadow_=this.scrollTarget.scrollTop!=0},onCrToolbarMenuPromoClose_:function(){this.showMenuPromo_=false},onCrToolbarMenuPromoShown_:function(){md_history.BrowserService.getInstance().menuPromoShown()},onCrToolbarMenuTap_:function(){var drawer=this.$$("#drawer");if(drawer)drawer.toggle()},onOpenedChanged_:function(e){if(e.detail.value)this.showMenuPromo_=false},checkboxSelected:function(e){var toolbar=this.$.toolbar;toolbar.count=this.$.history.getSelectedItemCount()},unselectAll:function(){var listContainer=this.$.history;var toolbar=this.$.toolbar;listContainer.unselectAllItems(toolbar.count);toolbar.count=0},deleteSelected:function(){this.$.history.deleteSelectedWithPrompt()},historyResult:function(info,results){this.set("queryState_.querying",false);this.set("queryResult_.info",info);this.set("queryResult_.results",results);var listContainer=this.$["history"];listContainer.historyResult(info,results)},focusToolbarSearchField:function(){this.$.toolbar.showSearchField()},onCanExecute_:function(e){e=e;switch(e.command.id){case"find-command":e.canExecute=true;break;case"slash-command":e.canExecute=!this.$.toolbar.searchField.isSearchFocused();break;case"delete-command":e.canExecute=this.$.toolbar.count>0;break}},onCommand_:function(e){if(e.command.id=="find-command"||e.command.id=="slash-command")this.focusToolbarSearchField();if(e.command.id=="delete-command")this.deleteSelected()},setForeignSessions:function(sessionList,isTabSyncEnabled){if(!isTabSyncEnabled){var syncedDeviceManagerElem=this.$$("history-synced-device-manager");if(syncedDeviceManagerElem){md_history.ensureLazyLoaded().then(function(){syncedDeviceManagerElem.tabSyncDisabled()})}return}this.set("queryResult_.sessionList",sessionList)},historyDeleted:function(){this.$.history.historyDeleted()},updateSignInState:function(isUserSignedIn){this.isUserSignedIn_=isUserSignedIn},syncedTabsSelected_:function(selectedPage){return selectedPage=="syncedTabs"},shouldShowSpinner_:function(querying,incremental,searchTerm){return querying&&!incremental&&searchTerm!=""},showSyncNotice_:function(hasSyncedResults,selectedPage){return hasSyncedResults&&selectedPage!="syncedTabs"},selectedPageChanged_:function(){this.unselectAll();this.historyViewChanged_()},historyViewChanged_:function(){requestAnimationFrame(function(){md_history.ensureLazyLoaded().then(function(){if(!this.$.content.selectedItem)return;this.scrollTarget=this.$.content.selectedItem.getContentScrollTarget();this._scrollHandler()}.bind(this))}.bind(this));this.recordHistoryPageView_()},getSelectedPage_:function(selectedPage,items){return selectedPage},closeDrawer_:function(){var drawer=this.$$("#drawer");if(drawer)drawer.close()},recordHistoryPageView_:function(){var histogramValue=HistoryPageViewHistogram.END;switch(this.selectedPage_){case"syncedTabs":histogramValue=this.isUserSignedIn_?HistoryPageViewHistogram.SYNCED_TABS:HistoryPageViewHistogram.SIGNIN_PROMO;break;default:switch(this.queryState_.range){case HistoryRange.ALL_TIME:histogramValue=HistoryPageViewHistogram.HISTORY;break;case HistoryRange.WEEK:histogramValue=HistoryPageViewHistogram.GROUPED_WEEK;break;case HistoryRange.MONTH:histogramValue=HistoryPageViewHistogram.GROUPED_MONTH;break}break}md_history.BrowserService.getInstance().recordHistogram("History.HistoryPageView",histogramValue,HistoryPageViewHistogram.END)}}); \ No newline at end of file diff --git a/chromium/chrome/browser/resources/md_history/app.html b/chromium/chrome/browser/resources/md_history/app.html index 574706423a3..6d1dc11988f 100644 --- a/chromium/chrome/browser/resources/md_history/app.html +++ b/chromium/chrome/browser/resources/md_history/app.html @@ -1,7 +1,6 @@ - @@ -21,10 +20,12 @@ display: block; height: 100%; overflow: hidden; + z-index: 0; } history-toolbar { background: var(--md-toolbar-color); + z-index: 2; } /* Sizing this with flex causes slow load performance, see @@ -32,6 +33,7 @@ #main-container { height: calc(100% - var(--toolbar-height)); position: relative; + z-index: 1; } :host([grouped_]) #main-container { @@ -55,12 +57,16 @@ display: none; } + #drawer { + z-index: 3; + } + #drawer-header { align-items: center; border-bottom: 1px solid rgba(0, 0, 0, 0.08); + box-sizing: border-box; display: flex; height: var(--toolbar-height); - margin-bottom: 5px; } h1 { @@ -99,7 +105,8 @@ query-start-time="[[queryResult_.info.queryStartTime]]" query-end-time="[[queryResult_.info.queryEndTime]]" has-drawer="[[hasDrawer_]]" - show-sync-notice="[[showSyncNotice_(hasSyncedResults, selectedPage_)]]"> + show-sync-notice="[[showSyncNotice_(hasSyncedResults, selectedPage_)]]" + show-menu-promo="[[showMenuPromo_]]">
diff --git a/chromium/chrome/browser/resources/md_history/app.js b/chromium/chrome/browser/resources/md_history/app.js index 730ff7e0f8d..7f36d58d6d4 100644 --- a/chromium/chrome/browser/resources/md_history/app.js +++ b/chromium/chrome/browser/resources/md_history/app.js @@ -24,7 +24,6 @@ Polymer({ behaviors: [ Polymer.IronScrollTargetBehavior, - WebUIListenerBehavior, ], properties: { @@ -86,32 +85,50 @@ Polymer({ type: Boolean, reflectToAttribute: true, notify: true, - } + }, + + showMenuPromo_: { + type: Boolean, + value: function() { + return loadTimeData.getBoolean('showMenuPromo'); + }, + }, }, - // TODO(calamity): Replace these event listeners with data bound properties. listeners: { - 'cr-menu-tap': 'onMenuTap_', - 'history-checkbox-select': 'checkboxSelected', - 'unselect-all': 'unselectAll', + 'cr-toolbar-menu-promo-close': 'onCrToolbarMenuPromoClose_', + 'cr-toolbar-menu-promo-shown': 'onCrToolbarMenuPromoShown_', + 'cr-toolbar-menu-tap': 'onCrToolbarMenuTap_', 'delete-selected': 'deleteSelected', + 'history-checkbox-select': 'checkboxSelected', 'history-close-drawer': 'closeDrawer_', 'history-view-changed': 'historyViewChanged_', + 'opened-changed': 'onOpenedChanged_', + 'unselect-all': 'unselectAll', }, + /** @private {?function(!Event)} */ + boundOnCanExecute_: null, + + /** @private {?function(!Event)} */ + boundOnCommand_: null, + /** @override */ - ready: function() { + attached: function() { this.grouped_ = loadTimeData.getBoolean('groupByDomain'); cr.ui.decorate('command', cr.ui.Command); - document.addEventListener('canExecute', this.onCanExecute_.bind(this)); - document.addEventListener('command', this.onCommand_.bind(this)); + this.boundOnCanExecute_ = this.onCanExecute_.bind(this); + this.boundOnCommand_ = this.onCommand_.bind(this); + + document.addEventListener('canExecute', this.boundOnCanExecute_); + document.addEventListener('command', this.boundOnCommand_); }, /** @override */ - attached: function() { - this.addWebUIListener('sign-in-state-updated', - this.updateSignInState.bind(this)); + detached: function() { + document.removeEventListener('canExecute', this.boundOnCanExecute_); + document.removeEventListener('command', this.boundOnCommand_); }, onFirstRender: function() { @@ -130,7 +147,11 @@ Polymer({ } // Lazily load the remainder of the UI. - md_history.ensureLazyLoaded(); + md_history.ensureLazyLoaded().then(function() { + window.requestIdleCallback(function() { + document.fonts.load('bold 12px Roboto'); + }); + }); }, /** Overridden from IronScrollTargetBehavior */ @@ -140,12 +161,31 @@ Polymer({ }, /** @private */ - onMenuTap_: function() { + onCrToolbarMenuPromoClose_: function() { + this.showMenuPromo_ = false; + }, + + /** @private */ + onCrToolbarMenuPromoShown_: function() { + md_history.BrowserService.getInstance().menuPromoShown(); + }, + + /** @private */ + onCrToolbarMenuTap_: function() { var drawer = this.$$('#drawer'); if (drawer) drawer.toggle(); }, + /** + * @param {!CustomEvent} e + * @private + */ + onOpenedChanged_: function(e) { + if (e.detail.value) + this.showMenuPromo_ = false; + }, + /** * Listens for history-item being selected or deselected (through checkbox) * and changes the view of the top toolbar. @@ -231,8 +271,11 @@ Polymer({ var syncedDeviceManagerElem = /** @type {HistorySyncedDeviceManagerElement} */this .$$('history-synced-device-manager'); - if (syncedDeviceManagerElem) - syncedDeviceManagerElem.tabSyncDisabled(); + if (syncedDeviceManagerElem) { + md_history.ensureLazyLoaded().then(function() { + syncedDeviceManagerElem.tabSyncDisabled(); + }); + } return; } @@ -298,13 +341,15 @@ Polymer({ // This allows the synced-device-manager to render so that it can be set as // the scroll target. requestAnimationFrame(function() { - // can occasionally end up with no item selected during - // tests. - if (!this.$.content.selectedItem) - return; - this.scrollTarget = - this.$.content.selectedItem.getContentScrollTarget(); - this._scrollHandler(); + md_history.ensureLazyLoaded().then(function() { + // can occasionally end up with no item selected during + // tests. + if (!this.$.content.selectedItem) + return; + this.scrollTarget = + this.$.content.selectedItem.getContentScrollTarget(); + this._scrollHandler(); + }.bind(this)); }.bind(this)); this.recordHistoryPageView_(); }, diff --git a/chromium/chrome/browser/resources/md_history/app.vulcanized.html b/chromium/chrome/browser/resources/md_history/app.vulcanized.html index 7024d681ce3..3839d6d49ed 100644 --- a/chromium/chrome/browser/resources/md_history/app.vulcanized.html +++ b/chromium/chrome/browser/resources/md_history/app.vulcanized.html @@ -712,319 +712,6 @@ iron-icon { - - - - - - - - - - - -